Author: [log in to unmask] Date: Wed Sep 16 14:40:40 2015 New Revision: 3617 Log: Read SVT error bit information from EVIO into LCIO collections by default. Added: java/trunk/evio/src/main/java/org/hps/evio/EnhancedSvtEvioReader.java Modified: java/trunk/evio/src/main/java/org/hps/evio/AbstractSvtEvioReader.java java/trunk/evio/src/main/java/org/hps/evio/LCSimEngRunEventBuilder.java java/trunk/evio/src/main/java/org/hps/evio/SvtEvioReader.java java/trunk/evio/src/main/java/org/hps/evio/SvtEvioUtils.java java/trunk/evio/src/main/java/org/hps/evio/TestRunSvtEvioReader.java Modified: java/trunk/evio/src/main/java/org/hps/evio/AbstractSvtEvioReader.java ============================================================================= --- java/trunk/evio/src/main/java/org/hps/evio/AbstractSvtEvioReader.java (original) +++ java/trunk/evio/src/main/java/org/hps/evio/AbstractSvtEvioReader.java Wed Sep 16 14:40:40 2015 @@ -14,16 +14,17 @@ import org.jlab.coda.jevio.StructureFinder; import org.jlab.coda.jevio.BaseStructure; import org.jlab.coda.jevio.StructureType; - import org.lcsim.detector.tracker.silicon.HpsSiSensor; import org.lcsim.event.EventHeader; +import org.lcsim.event.GenericObject; import org.lcsim.event.RawTrackerHit; import org.lcsim.event.base.BaseRawTrackerHit; import org.lcsim.geometry.Subdetector; import org.lcsim.lcio.LCIOUtil; import org.lcsim.util.log.DefaultLogFormatter; import org.lcsim.util.log.LogUtil; - +import org.hps.readout.svt.SvtErrorBitData; +import org.hps.readout.svt.SvtHeaderData; import org.hps.util.Pair; /** @@ -56,6 +57,8 @@ // Collections and names private static final String SVT_HIT_COLLECTION_NAME = "SVTRawTrackerHits"; List<RawTrackerHit> rawHits = new ArrayList<RawTrackerHit>(); + List<SvtErrorBitData> errorBits = new ArrayList<SvtErrorBitData>(); + List<SvtHeaderData> headers = new ArrayList<SvtHeaderData>(); // Constants private static final String SUBDETECTOR_NAME = "Tracker"; @@ -181,6 +184,12 @@ // Clear the list of raw tracker hits rawHits.clear(); + + // Clear the list of error bits + errorBits.clear(); + + // Clear the list of headers + headers.clear(); // Loop over the SVT ROC banks and process all samples for (BaseStructure rocBank : rocBanks) { @@ -204,7 +213,7 @@ for (BaseStructure dataBank : dataBanks) { logger.fine("Processing data bank: " + dataBank.toString()); - + // Check that the bank is valid if (!this.isValidDataBank(dataBank)) continue; @@ -221,12 +230,29 @@ + this.getClass().getSimpleName() + " ]: Size of samples array is not divisible by 4"); } + + // extract header and tail information + SvtHeaderData headerData = this.extractSvtHeader(dataBank.getHeader().getNumber(), data); + if(headerData != null) { + // Check that the multisample count is consistent + if( sampleCount != headerData.getMultisampleCount()*4) + throw new RuntimeException("multisample count is not consistent with bank size."); + // Add to list + headers.add(headerData); + } // Loop through all of the samples and make hits for (int samplesN = 0; samplesN < sampleCount; samplesN += 4) { int[] samples = new int[4]; System.arraycopy(data, this.getDataHeaderLength() + samplesN, samples, 0, samples.length); + + // Extract error bit + if( SvtEvioUtils.isApvHeader(samples) ) { + SvtErrorBitData errorBitData = this.extractErrorBit( samples ); + if(errorBitData != null) + errorBits.add(errorBitData); + } // If a set of samples is associated with an APV header or tail, skip it if (!this.isValidSampleSet(samples)) continue; @@ -242,9 +268,51 @@ // Add the collection of raw hits to the LCSim event lcsimEvent.put(SVT_HIT_COLLECTION_NAME, rawHits, RawTrackerHit.class, flag, READOUT_NAME); + // Add error bits to the event + this.addErrorBitsToEvent(errorBits, lcsimEvent); + + // Add SVT header data to the event + this.addSvtHeadersToEvents(headers, lcsimEvent); + return true; } + /** + * Make a {@link GenericObject} containing the error bits from the SVT data. + * + * @param multisample : multisample from the SVT + * @param errorBits : List of {@link SvtErrorBitData} to store it. + */ + protected abstract SvtErrorBitData extractErrorBit(int[] multisample); + + + /** + * + * Add {@link SvtErrorBitData} list to the event. + * + * @param errorBits: collection to add + * @param lcsimEvent: the event to store it. + */ + protected abstract void addErrorBitsToEvent(List<SvtErrorBitData> errorBits, EventHeader lcsimEvent); + + + /** + * Extract the header information and store it in a {@link SvtHeaderData} object. + * @param num - bank num (ROC id) + * @param data - SVT data block. + * @return the {@link SvtHeaderData}. + */ + protected abstract SvtHeaderData extractSvtHeader(int num, int[] data); + + + /** + * Add {@link SvtHeaderData} list to the event. + * @param headers - list to add. + * @param lcsimEvent - event to add to. + */ + protected abstract void addSvtHeadersToEvents(List<SvtHeaderData> headers, EventHeader lcsimEvent); + + /** * Make a {@link RawTrackerHit} from a set of samples. * @@ -295,4 +363,6 @@ }; return StructureFinder.getMatchingStructures(structure, filter); } + + } Added: java/trunk/evio/src/main/java/org/hps/evio/EnhancedSvtEvioReader.java ============================================================================= --- java/trunk/evio/src/main/java/org/hps/evio/EnhancedSvtEvioReader.java (added) +++ java/trunk/evio/src/main/java/org/hps/evio/EnhancedSvtEvioReader.java Wed Sep 16 14:40:40 2015 @@ -0,0 +1,83 @@ +/** + * + */ +package org.hps.evio; + +import java.util.List; + +import org.hps.readout.svt.SvtErrorBitData; +import org.hps.readout.svt.SvtHeaderData; +import org.lcsim.event.EventHeader; +import org.lcsim.lcio.LCIOUtil; + +/** + * + * SVT EVIO reader extending {@link SvtEvioReader} and adds SVT error bit information to the event. + * + * @author Per Hansson Adrian <[log in to unmask]> + * + */ +final public class EnhancedSvtEvioReader extends SvtEvioReader { + + public static final String SVT_ERROR_BIT_COLLECTION_NAME = "SvtErrorBits"; + public static final String SVT_HEADER_COLLECTION_NAME = "SvtHeaders"; + + /** + * + */ + public EnhancedSvtEvioReader() { + super(); + } + + @Override + protected SvtErrorBitData extractErrorBit(int[] multisample) { + + if( !SvtEvioUtils.isApvHeader(multisample) ) + throw new RuntimeException("Need the APV header in order to extract the error bit."); + + int errorBit = SvtEvioUtils.getErrorBit(multisample); + int rce = SvtEvioUtils.getFpgaID(multisample); + int feb = SvtEvioUtils.getFebID(multisample); + int hybrid = SvtEvioUtils.getFebHybridID(multisample); + int apv = SvtEvioUtils.getApv(multisample); + + return new SvtErrorBitData(rce, feb, hybrid, apv, errorBit); + } + + @Override + protected void addErrorBitsToEvent(List<SvtErrorBitData> errorBits, + EventHeader lcsimEvent) { + // Turn on 64-bit cell ID. + int flag = LCIOUtil.bitSet(0, 31, true); + // Add the collection of raw hits to the LCSim event + lcsimEvent.put(SVT_ERROR_BIT_COLLECTION_NAME, errorBits, SvtErrorBitData.class, flag); + + + } + + @Override + protected SvtHeaderData extractSvtHeader(int num, int[] data) { + // Extract the header information + int svtHeader = SvtEvioUtils.getSvtHeader(data); + int svtDataType = SvtEvioUtils.getSvtDataType(svtHeader); + int eventCount = SvtEvioUtils.getSvtDataEventCounter(svtHeader); + // Extract the tail information + int svtTail = SvtEvioUtils.getSvtTail(data); + int overflowError = SvtEvioUtils.getSvtTailOFErrorBit(svtTail); + int syncError = SvtEvioUtils.getSvtTailSyncErrorBit(svtTail); + int skipCount = SvtEvioUtils.getSvtTailMultisampleSkipCount(svtTail); + int multisampleCount = SvtEvioUtils.getSvtTailMultisampleCount(svtTail); + return new SvtHeaderData(num, eventCount, overflowError, syncError, skipCount, multisampleCount); + } + + @Override + protected void addSvtHeadersToEvents(List<SvtHeaderData> headers, + EventHeader lcsimEvent) { + // Turn on 64-bit cell ID. + int flag = LCIOUtil.bitSet(0, 31, true); + // Add the collection of raw hits to the LCSim event + lcsimEvent.put(SVT_HEADER_COLLECTION_NAME, headers, SvtHeaderData.class, flag); + + } + +} Modified: java/trunk/evio/src/main/java/org/hps/evio/LCSimEngRunEventBuilder.java ============================================================================= --- java/trunk/evio/src/main/java/org/hps/evio/LCSimEngRunEventBuilder.java (original) +++ java/trunk/evio/src/main/java/org/hps/evio/LCSimEngRunEventBuilder.java Wed Sep 16 14:40:40 2015 @@ -68,7 +68,7 @@ ecalReader.setTopBankTag(0x25); ecalReader.setBotBankTag(0x27); ecalReader.setRfBankTag(0x2e); - svtReader = new SvtEvioReader(); + svtReader = new EnhancedSvtEvioReader(); sspCrateBankTag = 0x2E; // A.C. modification after Sergey's confirmation sspBankTag = 0xe10c; intBanks = new ArrayList<IntBankDefinition>(); @@ -138,7 +138,7 @@ } catch (final Exception e) { LOGGER.log(Level.SEVERE, "Error making SVT hits.", e); } - + // Write the current EPICS data into this event. this.writeEpicsData(lcsimEvent); Modified: java/trunk/evio/src/main/java/org/hps/evio/SvtEvioReader.java ============================================================================= --- java/trunk/evio/src/main/java/org/hps/evio/SvtEvioReader.java (original) +++ java/trunk/evio/src/main/java/org/hps/evio/SvtEvioReader.java Wed Sep 16 14:40:40 2015 @@ -4,12 +4,12 @@ import org.jlab.coda.jevio.BaseStructure; import org.jlab.coda.jevio.EvioEvent; - import org.lcsim.detector.tracker.silicon.HpsSiSensor; import org.lcsim.event.EventHeader; import org.lcsim.event.RawTrackerHit; import org.lcsim.geometry.Subdetector; - +import org.hps.readout.svt.SvtErrorBitData; +import org.hps.readout.svt.SvtHeaderData; import org.hps.util.Pair; /** @@ -19,7 +19,7 @@ * @data February 03, 2015 * */ -public final class SvtEvioReader extends AbstractSvtEvioReader { +public class SvtEvioReader extends AbstractSvtEvioReader { //-----------------// //--- Constants ---// @@ -206,4 +206,26 @@ //logger.fine("Channel: " + SvtEvioUtils.getPhysicalChannelNumber(data)); return makeHit(data, SvtEvioUtils.getPhysicalChannelNumber(data)); } + + @Override + protected SvtErrorBitData extractErrorBit(int[] multisample) { + return null; + } + + @Override + protected void addErrorBitsToEvent(List<SvtErrorBitData> errorBits, + EventHeader lcsimEvent) { + //do nothing here + } + + @Override + protected SvtHeaderData extractSvtHeader(int num, int[] data) { + return null; + } + + @Override + protected void addSvtHeadersToEvents(List<SvtHeaderData> headers, + EventHeader lcsimEvent) { + //do nothing here + } } Modified: java/trunk/evio/src/main/java/org/hps/evio/SvtEvioUtils.java ============================================================================= --- java/trunk/evio/src/main/java/org/hps/evio/SvtEvioUtils.java (original) +++ java/trunk/evio/src/main/java/org/hps/evio/SvtEvioUtils.java Wed Sep 16 14:40:40 2015 @@ -158,7 +158,40 @@ if (((data[ENG_RUN_SAMPLE_HEADER_INDEX] >>> 29) & ENG_RUN_APV_TAIL_MASK) == 1) return true; return false; } - + + public static int getSvtHeader(int[] data) { + return data[0]; + } + + public static int getSvtDataType(int header) { + return (header >> 24); + } + + public static int getSvtDataEventCounter(int header) { + return (header & 0xFFFFFF); + } + + public static int getSvtTail(int[] data) { + return data[data.length-1]; + } + + public static int getSvtTailOFErrorBit(int tail) { + return (tail >> 27); + } + + public static int getSvtTailSyncErrorBit(int tail) { + return (tail >> 26) & 0x1; + } + + public static int getSvtTailMultisampleCount(int tail) { + return tail & 0xFFF; + } + + public static int getSvtTailMultisampleSkipCount(int tail) { + return (tail >> 12) & 0xFFF; + } + + /** * Extract the error bit of the samples. * Modified: java/trunk/evio/src/main/java/org/hps/evio/TestRunSvtEvioReader.java ============================================================================= --- java/trunk/evio/src/main/java/org/hps/evio/TestRunSvtEvioReader.java (original) +++ java/trunk/evio/src/main/java/org/hps/evio/TestRunSvtEvioReader.java Wed Sep 16 14:40:40 2015 @@ -2,10 +2,13 @@ import java.util.List; +import org.hps.readout.svt.SvtErrorBitData; +import org.hps.readout.svt.SvtHeaderData; import org.hps.util.Pair; import org.jlab.coda.jevio.BaseStructure; import org.lcsim.detector.tracker.silicon.HpsSiSensor; import org.lcsim.detector.tracker.silicon.HpsTestRunSiSensor; +import org.lcsim.event.EventHeader; import org.lcsim.event.RawTrackerHit; import org.lcsim.geometry.Subdetector; @@ -162,4 +165,32 @@ //this.printDebug("Channel: " + SvtEvioUtils.getTestRunChannelNumber(data)); return makeHit(data, SvtEvioUtils.getTestRunChannelNumber(data)); } + + @Override + protected SvtErrorBitData extractErrorBit(int[] multisample) { + // TODO Auto-generated method stub + return null; + } + + @Override + protected void addErrorBitsToEvent(List<SvtErrorBitData> errorBits, + EventHeader lcsimEvent) { + // TODO Auto-generated method stub + + } + + @Override + protected SvtHeaderData extractSvtHeader(int num, int[] data) { + // TODO Auto-generated method stub + return null; + } + + @Override + protected void addSvtHeadersToEvents(List<SvtHeaderData> headers, + EventHeader lcsimEvent) { + // TODO Auto-generated method stub + + } + + }