Author: [log in to unmask] Date: Thu Sep 17 11:30:12 2015 New Revision: 3630 Log: Make svt header info a permanent part of the converter with a more compact format. Modified: java/trunk/evio/src/main/java/org/hps/evio/AbstractSvtEvioReader.java java/trunk/evio/src/main/java/org/hps/evio/EnhancedSvtEvioReader.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 Thu Sep 17 11:30:12 2015 @@ -7,36 +7,37 @@ import java.util.logging.Level; import java.util.logging.Logger; +import org.hps.readout.svt.SvtHeaderDataInfo; +import org.hps.util.Pair; +import org.jlab.coda.jevio.BaseStructure; import org.jlab.coda.jevio.DataType; import org.jlab.coda.jevio.EvioEvent; import org.jlab.coda.jevio.IEvioFilter; import org.jlab.coda.jevio.IEvioStructure; 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; /** * Abstract SVT EVIO reader used to convert SVT bank sample blocks to * {@link RawTrackerHit}s. * * @author Omar Moreno <[log in to unmask]> + * @author Per Hansson Adrian <[log in to unmask]> * @date November 20, 2014 * */ public abstract class AbstractSvtEvioReader extends EvioReader { + public static final String SVT_HEADER_COLLECTION_NAME = "SvtHeaders"; + // Initialize the logger protected static Logger logger = LogUtil.create(AbstractSvtEvioReader.class.getName(), @@ -57,8 +58,7 @@ // 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>(); + List<SvtHeaderDataInfo> headers = new ArrayList<SvtHeaderDataInfo>(); // Constants private static final String SUBDETECTOR_NAME = "Tracker"; @@ -185,9 +185,6 @@ // Clear the list of raw tracker hits rawHits.clear(); - // Clear the list of error bits - errorBits.clear(); - // Clear the list of headers headers.clear(); @@ -232,32 +229,36 @@ } // 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); - } - + SvtHeaderDataInfo headerData = this.extractSvtHeader(dataBank.getHeader().getNumber(), data); + + // Check that the multisample count is consistent + if( sampleCount != SvtEvioUtils.getSvtTailMultisampleCount(headerData.getTail())*4) + throw new RuntimeException("multisample count is not consistent with bank size."); + + // Add header to list + headers.add(headerData); + + + // create array for the apv headers of known length + int multisampleHeaders[] = new int[sampleCount/4]; + // 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); - } + // Extract multisample header + if( SvtEvioUtils.isApvHeader(samples) ) + multisampleHeaders[samplesN/4] = SvtEvioUtils.getApvHeaderWord(samples); // If a set of samples is associated with an APV header or tail, skip it if (!this.isValidSampleSet(samples)) continue; rawHits.add(this.makeHit(samples)); } + + // add multisample headers to header data object + headerData.setMultisampleHeaders(multisampleHeaders); } } @@ -268,50 +269,29 @@ // 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. + + /** + * Extract the header information and store it in a {@link SvtHeaderDataInfo} 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); - + * @return the {@link SvtHeaderDataInfo}. + */ + protected abstract SvtHeaderDataInfo extractSvtHeader(int num, int[] data); + + + protected void addSvtHeadersToEvents(List<SvtHeaderDataInfo> 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, SvtHeaderDataInfo.class, flag); + + } /** * Make a {@link RawTrackerHit} from a set of samples. Modified: java/trunk/evio/src/main/java/org/hps/evio/EnhancedSvtEvioReader.java ============================================================================= --- java/trunk/evio/src/main/java/org/hps/evio/EnhancedSvtEvioReader.java (original) +++ java/trunk/evio/src/main/java/org/hps/evio/EnhancedSvtEvioReader.java Thu Sep 17 11:30:12 2015 @@ -3,12 +3,6 @@ */ 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; /** * @@ -19,65 +13,13 @@ */ 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 Thu Sep 17 11:30:12 2015 @@ -68,7 +68,7 @@ ecalReader.setTopBankTag(0x25); ecalReader.setBotBankTag(0x27); ecalReader.setRfBankTag(0x2e); - svtReader = new EnhancedSvtEvioReader(); + svtReader = new SvtEvioReader(); sspCrateBankTag = 0x2E; // A.C. modification after Sergey's confirmation sspBankTag = 0xe10c; intBanks = new ArrayList<IntBankDefinition>(); 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 Thu Sep 17 11:30:12 2015 @@ -2,15 +2,14 @@ import java.util.List; +import org.hps.readout.svt.SvtHeaderDataInfo; +import org.hps.util.Pair; 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; /** * SVT EVIO reader used to convert SVT bank integer data to LCIO objects. @@ -208,24 +207,13 @@ } @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 - } + protected SvtHeaderDataInfo extractSvtHeader(int num, int[] data) { + // Extract the header information + int svtHeader = SvtEvioUtils.getSvtHeader(data); + // Extract the tail information + int svtTail = SvtEvioUtils.getSvtTail(data); + return new SvtHeaderDataInfo(num, svtHeader, svtTail); + } + + } 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 Thu Sep 17 11:30:12 2015 @@ -1,4 +1,6 @@ package org.hps.evio; + +import org.apache.commons.math3.analysis.function.Rint; /** * A set of static utility methods used to decode SVT data. @@ -146,6 +148,18 @@ if (((data[ENG_RUN_SAMPLE_HEADER_INDEX] >>> 30) & ENG_RUN_APV_HEADER_MASK) == 1) return true; return false; } + + /** + * Get the multisample header word. + * @param multisample + * @return the header word + */ + public static int getApvHeaderWord(int[] multisample) { + if( !isApvHeader(multisample) ) + throw new RuntimeException("Need ApvHeader multisample in order to extract the header word."); + return multisample[ENG_RUN_SAMPLE_HEADER_INDEX]; + } + /** * Check if the samples are APV tails 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 Thu Sep 17 11:30:12 2015 @@ -4,6 +4,7 @@ import org.hps.readout.svt.SvtErrorBitData; import org.hps.readout.svt.SvtHeaderData; +import org.hps.readout.svt.SvtHeaderDataInfo; import org.hps.util.Pair; import org.jlab.coda.jevio.BaseStructure; import org.lcsim.detector.tracker.silicon.HpsSiSensor; @@ -167,30 +168,12 @@ } @Override - protected SvtErrorBitData extractErrorBit(int[] multisample) { + protected SvtHeaderDataInfo extractSvtHeader(int num, int[] data) { // 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 - - } + }