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
+
+ }
+
+
}
|