Print

Print


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