Print

Print


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