Author: [log in to unmask] Date: Wed Oct 21 11:54:30 2015 New Revision: 3865 Log: update to use headers Modified: java/trunk/steering-files/src/main/resources/org/hps/steering/users/phansson/EvioToLcio_LinkError.lcsim java/trunk/users/src/main/java/org/hps/users/phansson/SvtHeaderAnalysisDriver.java Modified: java/trunk/steering-files/src/main/resources/org/hps/steering/users/phansson/EvioToLcio_LinkError.lcsim ============================================================================= --- java/trunk/steering-files/src/main/resources/org/hps/steering/users/phansson/EvioToLcio_LinkError.lcsim (original) +++ java/trunk/steering-files/src/main/resources/org/hps/steering/users/phansson/EvioToLcio_LinkError.lcsim Wed Oct 21 11:54:30 2015 @@ -8,7 +8,7 @@ <driver name="EventMarkerDriver"/> <!--<driver name="SvtMetaData"/>--> <driver name="OLDLinkErrorDriver"/> - <!--<driver name="LinkErrorDriver"/>--> + <driver name="LinkErrorDriver"/> <!--<driver name="LCIOWriter"/>--> <!--<driver name="AidaSaveDriverRoot" />--> <driver name="CleanupDriver"/> @@ -20,7 +20,6 @@ <driver name="LinkErrorDriver" type="org.hps.users.phansson.SvtHeaderAnalysisDriver"> <logFileName>${outputFile}.log</logFileName> - <showPlots>False</showPlots> </driver> <driver name="OLDLinkErrorDriver" type="org.hps.users.phansson.SvtOldHeaderAnalysisDriver"> Modified: java/trunk/users/src/main/java/org/hps/users/phansson/SvtHeaderAnalysisDriver.java ============================================================================= --- java/trunk/users/src/main/java/org/hps/users/phansson/SvtHeaderAnalysisDriver.java (original) +++ java/trunk/users/src/main/java/org/hps/users/phansson/SvtHeaderAnalysisDriver.java Wed Oct 21 11:54:30 2015 @@ -3,28 +3,25 @@ */ package org.hps.users.phansson; -import hep.aida.IHistogram2D; -import hep.aida.IPlotter; - import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; import java.util.Date; -import java.util.List; +import java.util.HashMap; +import java.util.Map; import java.util.logging.FileHandler; import java.util.logging.Level; import java.util.logging.Logger; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import org.hps.analysis.trigger.util.TriggerDataUtils; -import org.hps.evio.SvtEvioReader; import org.hps.record.svt.SvtEvioUtils; -import org.hps.record.svt.SvtHeaderDataInfo; import org.hps.util.BasicLogFormatter; import org.lcsim.event.EventHeader; import org.lcsim.event.GenericObject; import org.lcsim.geometry.Detector; import org.lcsim.util.Driver; -import org.lcsim.util.aida.AIDA; /** * @author Per Hansson Adrian <[log in to unmask]> @@ -32,33 +29,23 @@ */ public class SvtHeaderAnalysisDriver extends Driver { - private final AIDA aida = AIDA.defaultInstance(); - - private final String HeaderCollectionName = "SvtHeaders"; private final Logger logger = Logger.getLogger(SvtHeaderAnalysisDriver.class.getSimpleName()); private int nEventsProcessed = 0; private Date eventDate = new Date(0); - private IHistogram2D rceSyncErrorCount; - private IHistogram2D rceOFErrorCount; - private IHistogram2D rceSkipCount; - private IHistogram2D rceMultisampleErrorCount; - //private Map< Integer, Map< String, IHistogram1D> > histError = new HashMap< Integer, Map<String, IHistogram1D >>(); private int nRceSyncErrorCountN = 0; private int nRceOFErrorCount = 0; private int nRceSkipCount = 0; private int nRceMultisampleErrorCount = 0; private int nRceSvtHeaders = 0; - IPlotter plotter; - private String logFileName = "dummy.log"; FileWriter fileWriter; PrintWriter printWriter; - - private boolean showPlots = false; private final String triggerBankCollectionName = "TriggerBank"; + private static final Pattern rocIdPattern = Pattern.compile("svt_.*_roc(\\d+)"); + /** - * + * Default constructor */ public SvtHeaderAnalysisDriver() { logger.setLevel(Level.INFO); @@ -68,146 +55,177 @@ this.logFileName = name; } - public void setShowPlots(boolean show) { - this.showPlots = show; - } @Override protected void detectorChanged(Detector detector) { - FileHandler fh; try { - fh = new FileHandler(logFileName); + FileHandler fh = new FileHandler(logFileName); + fh.setFormatter(new BasicLogFormatter()); logger.addHandler(fh); - fh.setFormatter(new BasicLogFormatter()); } catch (SecurityException | IOException e1) { e1.printStackTrace(); } - plotter = aida.analysisFactory().createPlotterFactory().create("rceSyncError"); - plotter.createRegions(2, 2); - final int n = SvtEvioReader.MAX_ROC_BANK_TAG+1 - SvtEvioReader.MIN_ROC_BANK_TAG; - rceSyncErrorCount = aida.histogram2D("rceSyncError", n, SvtEvioReader.MIN_ROC_BANK_TAG, SvtEvioReader.MAX_ROC_BANK_TAG+1, 2, 0, 1); - rceOFErrorCount = aida.histogram2D("rceOFError", n, SvtEvioReader.MIN_ROC_BANK_TAG, SvtEvioReader.MAX_ROC_BANK_TAG+1, 2, 0, 1); - rceSkipCount = aida.histogram2D("rceSkipCount", n, SvtEvioReader.MIN_ROC_BANK_TAG, SvtEvioReader.MAX_ROC_BANK_TAG+1, 2, 0, 1); - rceMultisampleErrorCount = aida.histogram2D("rceMultisampleError", n, SvtEvioReader.MIN_ROC_BANK_TAG, SvtEvioReader.MAX_ROC_BANK_TAG+1, 2, 0, 1); - - plotter.region(0).plot(rceSyncErrorCount); - plotter.region(1).plot(rceOFErrorCount); - plotter.region(2).plot(rceSkipCount); - plotter.region(3).plot(rceMultisampleErrorCount); - if(showPlots ) plotter.show(); - - +// final int n = SvtEvioReader.MAX_ROC_BANK_TAG+1 - SvtEvioReader.MIN_ROC_BANK_TAG; + + } + + + private int getRoc(String seq) { + Matcher m = rocIdPattern.matcher(seq); + if(m == null) + throw new RuntimeException("null matcher, don't think this should happen"); + if( !m.matches() ) + return -1; + else + return Integer.parseInt( m.group(1) ); } @Override protected void process(EventHeader event) { + // try to get event date + // if no trigger bank use the last date found if(event.hasCollection(GenericObject.class, triggerBankCollectionName)) { Date currentEventDate = TriggerDataUtils.getEventTimeStamp(event, triggerBankCollectionName); if( currentEventDate == null) { - logger.info("Couldn't get event date from trigger bank for processed " + nEventsProcessed); - // throw new RuntimeException("Couldn't get event date from trigger bank!"); + logger.finest("Couldn't get event date from trigger bank for processed " + nEventsProcessed); } else { eventDate = currentEventDate; } } + // log start of run if( nEventsProcessed == 0 ) logger.info("startOfRun: run " + event.getRunNumber() + " event " + event.getEventNumber() + " processed " + nEventsProcessed + " date " + eventDate.toString()); - if( !event.hasCollection(GenericObject.class, HeaderCollectionName) ) - return; - - List<GenericObject> headers = event.get(GenericObject.class, HeaderCollectionName); - - logger.info("Found " + headers.size() + " SvtHeaders in event " + event.getEventNumber() + " run " + event.getRunNumber()); - - for(GenericObject header : headers ) { - logger.info("1"); - SvtHeaderDataInfo headerInfo = (SvtHeaderDataInfo) header; - int roc = headerInfo.getNum(); - logger.info("process roc " + roc); - - int svtHeader = headerInfo.getHeader(); - int svtTail = headerInfo.getTail(); - - logger.info("svtHeader " + Integer.toHexString(svtHeader) + " svtTail " + Integer.toHexString(svtTail)); - - - // find the errors in the header - int syncError = SvtEvioUtils.getSvtTailSyncErrorBit(svtTail); - int oFError = SvtEvioUtils.getSvtTailOFErrorBit(svtTail); - int skipCount = SvtEvioUtils.getSvtTailMultisampleSkipCount(svtTail); - - // check bits - checkBitValueRange(oFError); - checkBitValueRange(syncError); - - // print header errors to log - if( syncError != 0) { - logger.info("syncError: run " + event.getRunNumber() + " event " + event.getEventNumber() + " date " + " processed " + nEventsProcessed + " date " + eventDate.toString() - + " roc " + roc); - } - if( oFError != 0) { - logger.info("oFError: run " + event.getRunNumber() + " event " + event.getEventNumber() + " date " + " processed " + nEventsProcessed + " date " + eventDate.toString() - + " roc " + roc); - } - for(int i=0; i < skipCount; ++i) { - if( oFError != 0) { - logger.info("skipCount: run " + event.getRunNumber() + " event " + event.getEventNumber() + " date " + " processed " + nEventsProcessed + " date " + eventDate.toString() - + " roc " + roc); + // find header flag + int headerFlag = -1; + if( event.getIntegerParameters().containsKey("svt_event_header_good")) { + int[] isOK = event.getIntegerParameters().get("svt_event_header_good"); + logger.fine("svt_event_header_good " +isOK[0] + " for run " + event.getRunNumber() + " event " + event.getEventNumber() + " date " + eventDate.toString() + " processed " + nEventsProcessed); + headerFlag = isOK[0]; + } + + // print warning if there is no status flag in the event header! + if( headerFlag == -1) + logger.warning("No svt_event_header_good flag found for run " + event.getRunNumber() + " event " + event.getEventNumber() + " date " + eventDate.toString() + " processed " + nEventsProcessed); + + // print if the flag is bad + if (headerFlag == 0) + logger.info("svt_event_header_good " + headerFlag + " for run " + event.getRunNumber() + " event " + event.getEventNumber() + " date " + eventDate.toString() + " processed " + nEventsProcessed); + + + Map<Integer, Integer> rceHeaderCount = new HashMap<Integer, Integer>(); + + // Get all the headers in the event + for(Map.Entry<String, int[]> entry : event.getIntegerParameters().entrySet()) { + + int roc = getRoc(entry.getKey()); + + if( roc == -1) { + logger.fine("skip this entry \"" + entry.getKey()); + continue; + } + + logger.fine("processing entry \"" + entry.getKey()+ "\"" + " for roc " + roc); + + // initialize count + if (!rceHeaderCount.containsKey(roc)) + rceHeaderCount.put(roc, 0); + rceHeaderCount.put(roc, rceHeaderCount.get(roc) + 1 ); + + + int[] value = entry.getValue(); + + // log number of errors + int syncError = 0; + int oFError = 0; + int skipCount = 0; + int multisampleErrorBits = 0; + + + // check if this is a header + if(entry.getKey().contains("svt_event_header_roc")) + logger.fine("found SVT header \"" + Integer.toHexString(value[0]) + "\" for \"" + entry.getKey()+ "\"" + " roc + " + roc); + + + // Analyze the SVT event tails + if(entry.getKey().contains("svt_event_tail_roc")) { + + logger.fine("found SVT tail \"" + Integer.toHexString(value[0]) + "\" for \"" + entry.getKey()+ "\""+ " roc + " + roc ); + + // find the SVT event error information in the header + syncError = SvtEvioUtils.getSvtTailSyncErrorBit(value[0]); + oFError = SvtEvioUtils.getSvtTailOFErrorBit(value[0]); + skipCount = SvtEvioUtils.getSvtTailMultisampleSkipCount(value[0]); + + // check bits if applicable + checkBitValueRange(oFError); + checkBitValueRange(syncError); + + // print header errors to log + if( syncError != 0) + logger.info("syncError: run " + event.getRunNumber() + " event " + event.getEventNumber() + " date " + eventDate.toString() + " processed " + nEventsProcessed + " date " + eventDate.toString() + " roc " + roc); + + if( oFError != 0) + logger.info("oFError: run " + event.getRunNumber() + " event " + event.getEventNumber() + " date " + eventDate.toString() + " processed " + nEventsProcessed + " date " + eventDate.toString() + " roc " + roc); + + for(int i=0; i < skipCount; ++i) { + if( oFError != 0) { + logger.info("skipCount: run " + event.getRunNumber() + " event " + event.getEventNumber() + " date " + eventDate.toString() + " processed " + nEventsProcessed + " date " + eventDate.toString() + " roc " + roc); + } } } - - int nMultiSamples = headerInfo.getNumberOfMultisampleHeaders(); - - logger.info("svtHeader " + Integer.toHexString(svtHeader) + " svtTail " + Integer.toHexString(svtTail) + " nMultiSamples " + nMultiSamples); - - //if(1==1) continue; - - int multisampleErrorBits = 0; - - for(int iMultisample = 0; iMultisample < nMultiSamples; ++iMultisample) { - - logger.info("iMultisample " + iMultisample); - - logger.info(headerInfo.toString()); - - int[] multisampleHeader = headerInfo.getMultisampleHeader(iMultisample); - int multisampleHeaderTail = SvtEvioUtils.getMultisampleTailWord(multisampleHeader); - logger.info("found multisample tail: " + Integer.toHexString(multisampleHeaderTail)); - int multisampleErrorBit = SvtEvioUtils.getErrorBitFromMultisampleHeader(multisampleHeaderTail); - checkBitValueRange(multisampleErrorBit); - logger.info("found multisample tail error bit: " + multisampleErrorBit); - if( multisampleErrorBit != 0) { - multisampleErrorBits++; - logger.info("multisample tail error: run " + event.getRunNumber() + " event " + event.getEventNumber() + " date " + eventDate.toString() - + " roc " + roc + " feb " + SvtEvioUtils.getFebIDFromMultisampleTail(multisampleHeaderTail) - + " hybrid " + SvtEvioUtils.getFebHybridIDFromMultisampleTail(multisampleHeaderTail) - + " apv " + SvtEvioUtils.getApvFromMultisampleTail(multisampleHeaderTail)); + + + if(entry.getKey().contains("svt_multisample_headers_roc")) { + + logger.fine("found " + value.length + " SVT multisample headers:"); + + for(int i=0; i< value.length/4; ++i) { + + // extract the headers + int[] multisampleHeader = new int[4]; + System.arraycopy(value, i*4, multisampleHeader, 0, multisampleHeader.length); + String str = "multisample header " + Integer.toString(i); + for(int j=0; j<4; ++j) str += " " + Integer.toHexString(multisampleHeader[j]); + logger.fine(str); + + // get the multisample tail word + int multisampleHeaderTail = SvtEvioUtils.getMultisampleTailWord(multisampleHeader); + logger.fine("found multisample tail: " + Integer.toHexString(multisampleHeaderTail)); + + // get the error bit + int multisampleErrorBit = SvtEvioUtils.getErrorBitFromMultisampleHeader(multisampleHeaderTail); + checkBitValueRange(multisampleErrorBit); + logger.fine("found multisample tail error bit: " + multisampleErrorBit); + + if( multisampleErrorBit != 0) { + multisampleErrorBits++; + logger.info("multisample tail error: run " + event.getRunNumber() + " event " + event.getEventNumber() + " date " + eventDate.toString() + + " roc " + roc + " feb " + SvtEvioUtils.getFebIDFromMultisampleTail(multisampleHeaderTail) + + " hybrid " + SvtEvioUtils.getFebHybridIDFromMultisampleTail(multisampleHeaderTail) + + " apv " + SvtEvioUtils.getApvFromMultisampleTail(multisampleHeaderTail)); + } } - - //if (1==1) break; - - - } - - - // keep track how many headers have errors - rceSyncErrorCount.fill(roc, syncError); - rceOFErrorCount.fill(roc, oFError); - rceSkipCount.fill(roc, skipCount); - rceMultisampleErrorCount.fill(roc, multisampleErrorBits > 0 ? 1 : 0); + } + + // keep track how many headers have errors if( syncError > 0) nRceSyncErrorCountN++; if( oFError > 0 ) nRceOFErrorCount++; if( skipCount > 0 ) nRceSkipCount++; if( multisampleErrorBits > 0 ) nRceMultisampleErrorCount++; - nRceSvtHeaders++; - - } + } + + + for(Map.Entry<Integer, Integer> entry : rceHeaderCount.entrySet()) + logger.fine("ROC " + entry.getKey() + " count " + entry.getValue()); + + // number of headers processed is just the size + nRceSvtHeaders += rceHeaderCount.size(); nEventsProcessed++; } @@ -219,7 +237,7 @@ @Override protected void endOfData() { - logger.info("endOfData: processed " + nEventsProcessed + " date " + eventDate.toString()); + logger.info("endOfData: processed " + nEventsProcessed + "events date " + eventDate.toString()); logger.info("nRceSvtHeaders " + nRceSvtHeaders); logger.info("nRceSyncErrorCountN " + nRceSyncErrorCountN); logger.info("nRceOFErrorCount " + nRceOFErrorCount);