Print

Print


Author: [log in to unmask]
Date: Tue Aug 25 19:40:38 2015
New Revision: 3402

Log:
read TI offset in crawler

Added:
    java/trunk/record-util/src/main/java/org/hps/record/triggerbank/TriggerEvioProcessor.java
Modified:
    java/trunk/evio/src/main/java/org/hps/evio/BasicEvioFileReader.java
    java/trunk/evio/src/main/java/org/hps/evio/LCSimEngRunEventBuilder.java
    java/trunk/evio/src/main/java/org/hps/evio/LCSimTestRunEventBuilder.java
    java/trunk/record-util/src/main/java/org/hps/record/evio/crawler/RunProcessor.java
    java/trunk/record-util/src/main/java/org/hps/record/run/RunSummary.java
    java/trunk/record-util/src/main/java/org/hps/record/run/TriggerConfig.java
    java/trunk/record-util/src/main/java/org/hps/record/triggerbank/AbstractIntData.java

Modified: java/trunk/evio/src/main/java/org/hps/evio/BasicEvioFileReader.java
 =============================================================================
--- java/trunk/evio/src/main/java/org/hps/evio/BasicEvioFileReader.java	(original)
+++ java/trunk/evio/src/main/java/org/hps/evio/BasicEvioFileReader.java	Tue Aug 25 19:40:38 2015
@@ -2,7 +2,6 @@
 
 import java.io.File;
 import java.util.Date;
-
 import org.apache.commons.cli.CommandLine;
 import org.apache.commons.cli.CommandLineParser;
 import org.apache.commons.cli.HelpFormatter;
@@ -10,8 +9,8 @@
 import org.apache.commons.cli.Options;
 import org.apache.commons.cli.ParseException;
 import org.apache.commons.cli.PosixParser;
-import org.hps.evio.LCSimTestRunEventBuilder.IntBankDefinition;
 import org.hps.record.evio.EvioEventUtilities;
+import org.hps.record.triggerbank.AbstractIntData.IntBankDefinition;
 import org.hps.record.triggerbank.HeadBankData;
 import org.hps.record.triggerbank.TIData;
 import org.jlab.coda.jevio.BaseStructure;
@@ -51,8 +50,8 @@
         boolean seqRead = cl.hasOption("s");
         boolean printTimestamps = cl.hasOption("t");
 
-        IntBankDefinition headBankDefinition = new LCSimTestRunEventBuilder.IntBankDefinition(HeadBankData.class, new int[]{0x2e, 0xe10f});
-        IntBankDefinition tiBankDefinition = new LCSimTestRunEventBuilder.IntBankDefinition(TIData.class, new int[]{0x2e, 0xe10a});
+        IntBankDefinition headBankDefinition = new IntBankDefinition(HeadBankData.class, new int[]{0x2e, 0xe10f});
+        IntBankDefinition tiBankDefinition = new IntBankDefinition(TIData.class, new int[]{0x2e, 0xe10a});
 
 //        String evioFileName = args[0];
         for (String evioFileName : cl.getArgs()) {

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	Tue Aug 25 19:40:38 2015
@@ -4,13 +4,13 @@
 import java.util.List;
 import java.util.logging.Level;
 import java.util.logging.Logger;
-
 import org.hps.record.epics.EpicsData;
 import org.hps.record.epics.EpicsEvioProcessor;
 import org.hps.record.evio.EvioEventUtilities;
 import org.hps.record.scalers.ScalerData;
 import org.hps.record.scalers.ScalersEvioProcessor;
 import org.hps.record.triggerbank.AbstractIntData;
+import org.hps.record.triggerbank.AbstractIntData.IntBankDefinition;
 import org.hps.record.triggerbank.HeadBankData;
 import org.hps.record.triggerbank.SSPData;
 import org.hps.record.triggerbank.TDCData;

Modified: java/trunk/evio/src/main/java/org/hps/evio/LCSimTestRunEventBuilder.java
 =============================================================================
--- java/trunk/evio/src/main/java/org/hps/evio/LCSimTestRunEventBuilder.java	(original)
+++ java/trunk/evio/src/main/java/org/hps/evio/LCSimTestRunEventBuilder.java	Tue Aug 25 19:40:38 2015
@@ -5,11 +5,11 @@
 import java.util.List;
 import java.util.logging.Level;
 import java.util.logging.Logger;
-
 import org.hps.record.LCSimEventBuilder;
 import org.hps.record.evio.EvioEventConstants;
 import org.hps.record.evio.EvioEventUtilities;
 import org.hps.record.triggerbank.AbstractIntData;
+import org.hps.record.triggerbank.AbstractIntData.IntBankDefinition;
 import org.hps.record.triggerbank.TestRunTriggerData;
 import org.jlab.coda.jevio.BaseStructure;
 import org.jlab.coda.jevio.EvioEvent;
@@ -172,13 +172,13 @@
             BaseStructure bank = def.findBank(evioEvent);
             if (bank != null) { //returns null if no banks found
                 try {
-                    AbstractIntData data = (AbstractIntData) def.dataClass.getConstructor(int[].class).newInstance(bank.getIntData());
+                    AbstractIntData data = (AbstractIntData) def.getDataClass().getConstructor(int[].class).newInstance(bank.getIntData());
                     triggerList.add(data);
                 } catch (Exception ex) {
                     LOGGER.log(Level.SEVERE, ex.getMessage(), ex);
                 }
             } else {
-                LOGGER.finest("No trigger bank found of type " + def.dataClass.getSimpleName());
+                LOGGER.finest("No trigger bank found of type " + def.getDataClass().getSimpleName());
             }
         }
         return triggerList;
@@ -193,37 +193,4 @@
     public void conditionsChanged(ConditionsEvent conditionsEvent) {
         ecalReader.initialize();
     }
-
-    protected static class IntBankDefinition {
-
-        int[] bankTags;
-        Class<? extends AbstractIntData> dataClass;
-
-        public IntBankDefinition(Class<? extends AbstractIntData> dataClass, int[] bankTags) {
-            this.bankTags = bankTags;
-            this.dataClass = dataClass;
-        }
-
-        public BaseStructure findBank(EvioEvent evioEvent) {
-            BaseStructure currentBank = evioEvent;
-            searchLoop:
-            for (int bankTag : bankTags) {
-                if (currentBank.getChildCount() > 0) {
-                    for (BaseStructure childBank : currentBank.getChildrenList()) {
-                        if (childBank.getHeader().getTag() == bankTag) { 
-                            // Found a bank with the right tag; step inside this bank and continue searching.
-                            currentBank = childBank;
-                            continue searchLoop;
-                        }
-                    }
-                    // Didn't find a bank with the right tag so stop.
-                    return null; 
-                } else { 
-                    // Bank has no children so stop.
-                    return null;
-                }
-            }
-            return currentBank; // matched every tag, so this is the bank we want
-        }
-    }
 }

Modified: java/trunk/record-util/src/main/java/org/hps/record/evio/crawler/RunProcessor.java
 =============================================================================
--- java/trunk/record-util/src/main/java/org/hps/record/evio/crawler/RunProcessor.java	(original)
+++ java/trunk/record-util/src/main/java/org/hps/record/evio/crawler/RunProcessor.java	Tue Aug 25 19:40:38 2015
@@ -3,7 +3,6 @@
 import java.io.File;
 import java.util.logging.Level;
 import java.util.logging.Logger;
-
 import org.hps.record.epics.EpicsRunProcessor;
 import org.hps.record.evio.EvioFileMetaData;
 import org.hps.record.evio.EvioFileMetaDataReader;
@@ -11,14 +10,16 @@
 import org.hps.record.evio.EvioLoop;
 import org.hps.record.run.RunSummary;
 import org.hps.record.scalers.ScalersEvioProcessor;
+import org.hps.record.triggerbank.TriggerEvioProcessor;
 import org.lcsim.util.log.DefaultLogFormatter;
 import org.lcsim.util.log.LogUtil;
 
 /**
- * Processes EVIO files from a run in order to extract various meta data information including start and end dates.
+ * Processes EVIO files from a run in order to extract various meta data
+ * information including start and end dates.
  * <p>
- * This class is a wrapper for activating different sub-tasks, including optionally caching all files from the JLAB MSS
- * to the cache disk.
+ * This class is a wrapper for activating different sub-tasks, including
+ * optionally caching all files from the JLAB MSS to the cache disk.
  * <p>
  * There is also a list of processors which is run on all events from the run.
  *
@@ -90,6 +91,11 @@
     private final ScalersEvioProcessor scalersProcessor;
 
     /**
+     * Processor for extracting trigger config.
+     */
+    private final TriggerEvioProcessor triggerProcessor;
+
+    /**
      * Set to <code>true</code> to use file caching.
      */
     private boolean useFileCache;
@@ -118,6 +124,9 @@
         scalersProcessor = new ScalersEvioProcessor();
         scalersProcessor.setResetEveryEvent(false);
         evioLoop.addEvioEventProcessor(scalersProcessor);
+        
+        triggerProcessor = new TriggerEvioProcessor();
+        evioLoop.addEvioEventProcessor(triggerProcessor);
 
         // Set whether file caching from MSS is enabled.
         this.useFileCache(config.useFileCache());
@@ -126,8 +135,9 @@
     /**
      * Cache all files and wait for the operation to complete.
      * <p>
-     * Potentially, this operation can take a very long time. This can be managed using the
-     * {@link JCacheManager#setWaitTime(long)} method to set a timeout.
+     * Potentially, this operation can take a very long time. This can be
+     * managed using the {@link JCacheManager#setWaitTime(long)} method to set a
+     * timeout.
      */
     private void cacheFiles() {
 
@@ -146,10 +156,12 @@
     }
 
     /**
-     * Process the run by executing the registered {@link org.hps.record.evio.EvioEventProcessor}s and extracting the
-     * start and end dates.
+     * Process the run by executing the registered
+     * {@link org.hps.record.evio.EvioEventProcessor}s and extracting the start
+     * and end dates.
      * <p>
-     * This method will also execute file caching from MSS, if enabled by the {@link #useFileCache} option.
+     * This method will also execute file caching from MSS, if enabled by the
+     * {@link #useFileCache} option.
      *
      * @throws Exception if there is an error processing a file
      */
@@ -184,7 +196,8 @@
     }
 
     /**
-     * Set the run end date by getting meta data from the last file and copying it to the run summary.
+     * Set the run end date by getting meta data from the last file and copying
+     * it to the run summary.
      */
     private void processLastFile() {
         final File lastEvioFile = runSummary.getEvioFileList().get(runSummary.getEvioFileList().size() - 1);
@@ -202,7 +215,8 @@
     }
 
     /**
-     * Set the run start date by getting meta data from the first file and copying it to the run summary.
+     * Set the run start date by getting meta data from the first file and
+     * copying it to the run summary.
      */
     private void processFirstFile() {
         final File firstEvioFile = runSummary.getEvioFileList().get(0);
@@ -219,7 +233,8 @@
     }
 
     /**
-     * Update the current run summary by copying data to it from the EVIO processors.
+     * Update the current run summary by copying data to it from the EVIO
+     * processors.
      */
     private void updateRunSummary() {
 
@@ -231,13 +246,17 @@
 
         // Add EPICS data from the EPICS EVIO processor.
         runSummary.setEpicsData(this.epicsLog.getEpicsData());
-    }
-
-    /**
-     * Set whether or not to use the file caching, which copies files from the JLAB MSS to the cache disk.
+        
+        // Add trigger config from the trigger EVIO processor.
+        runSummary.setTriggerConfig(this.triggerProcessor.getTriggerConfig());
+    }
+
+    /**
+     * Set whether or not to use the file caching, which copies files from the
+     * JLAB MSS to the cache disk.
      * <p>
-     * Since EVIO data files at JLAB are primarily kept on the MSS, running without this option enabled there will
-     * likely cause the job to fail.
+     * Since EVIO data files at JLAB are primarily kept on the MSS, running
+     * without this option enabled there will likely cause the job to fail.
      *
      * @param cacheFiles <code>true</code> to enabled file caching
      */

Modified: java/trunk/record-util/src/main/java/org/hps/record/run/RunSummary.java
 =============================================================================
--- java/trunk/record-util/src/main/java/org/hps/record/run/RunSummary.java	(original)
+++ java/trunk/record-util/src/main/java/org/hps/record/run/RunSummary.java	Tue Aug 25 19:40:38 2015
@@ -17,8 +17,8 @@
 import org.hps.record.scalers.ScalerData;
 
 /**
- * This class models the run summary information which is persisted as a row in the <i>run_log</i> table of the run
- * database.
+ * This class models the run summary information which is persisted as a row in
+ * the <i>run_log</i> table of the run database.
  * <p>
  * This information includes:
  * <ul>
@@ -27,12 +27,15 @@
  * <li>end time (UTC)</li>
  * <li>total number of events in the run</li>
  * <li>number of EVIO files in the run</li>
- * <li>whether the END event was found indicating that the DAQ did not crash</li>
+ * <li>whether the END event was found indicating that the DAQ did not
+ * crash</li>
  * <li>whether the run is considered good (all <code>true</code> for now)</li>
  * </ul>
  * <p>
- * It also references several complex objects including lists of {@link org.hps.record.epics.EpicsData} and
- * {@link org.hps.record.scalers.ScalerData} for the run, as well as a list of EVIO files.
+ * It also references several complex objects including lists of
+ * {@link org.hps.record.epics.EpicsData} and
+ * {@link org.hps.record.scalers.ScalerData} for the run, as well as a list of
+ * EVIO files.
  *
  * @author Jeremy McCormick, SLAC
  */
@@ -45,7 +48,8 @@
 
     static {
         /**
-         * Set default time zone for display to East Coast (JLAB) where data was taken.
+         * Set default time zone for display to East Coast (JLAB) where data was
+         * taken.
          */
         DATE_DISPLAY.setCalendar(new GregorianCalendar(TimeZone.getTimeZone("America/New_York")));
     }
@@ -101,6 +105,11 @@
     private List<ScalerData> scalerDataList;
 
     /**
+     * The trigger data for the run.
+     */
+    private TriggerConfig triggerConfig;
+
+    /**
      * Start date of run.
      */
     private Date startDate;
@@ -175,8 +184,8 @@
     }
 
     /**
-     * Get the event rate (effectively the trigger rate) which is the total events divided by the number of seconds in
-     * the run.
+     * Get the event rate (effectively the trigger rate) which is the total
+     * events divided by the number of seconds in the run.
      *
      * @return the event rate
      */
@@ -215,7 +224,8 @@
     }
 
     /**
-     * Return <code>true</code> if the run was okay (no major errors or data corruption occurred).
+     * Return <code>true</code> if the run was okay (no major errors or data
+     * corruption occurred).
      *
      * @return <code>true</code> if the run was okay
      */
@@ -233,6 +243,15 @@
     }
 
     /**
+     * Get the trigger config of this run.
+     *
+     * @return the trigger config of this run
+     */
+    public TriggerConfig getTriggerConfig() {
+        return triggerConfig;
+    }
+
+    /**
      * Get the start date.
      *
      * @return the start date
@@ -260,7 +279,8 @@
     }
 
     /**
-     * Get the number of seconds in the run which is the difference between the start and end times.
+     * Get the number of seconds in the run which is the difference between the
+     * start and end times.
      *
      * @return the total seconds in the run
      */
@@ -366,7 +386,8 @@
     }
 
     /**
-     * Set whether the run was "okay" meaning the data is usable for physics analysis.
+     * Set whether the run was "okay" meaning the data is usable for physics
+     * analysis.
      *
      * @param runOkay <code>true</code> if the run is okay
      */
@@ -381,6 +402,15 @@
      */
     public void setScalerData(final List<ScalerData> scalerDataList) {
         this.scalerDataList = scalerDataList;
+    }
+
+    /**
+     * Set the trigger config of the run.
+     *
+     * @param triggerConfig the trigger config
+     */
+    public void setTriggerConfig(final TriggerConfig triggerConfig) {
+        this.triggerConfig = triggerConfig;
     }
 
     /**

Modified: java/trunk/record-util/src/main/java/org/hps/record/run/TriggerConfig.java
 =============================================================================
--- java/trunk/record-util/src/main/java/org/hps/record/run/TriggerConfig.java	(original)
+++ java/trunk/record-util/src/main/java/org/hps/record/run/TriggerConfig.java	Tue Aug 25 19:40:38 2015
@@ -4,28 +4,28 @@
  * Trigger information available in the run database.
  * <p>
  * Currently this only has the TI time offset.
- * 
+ *
  * @author Jeremy McCormick, SLAC
  */
 public final class TriggerConfig {
-    
+
     /**
      * The TI time offset.
      */
     private long tiTimeOffset;
-    
+
     /**
      * Set the TI time offset.
-     * 
+     *
      * @param tiTimeOffset the TI time offset
      */
-    void setTiTimeOffset(long tiTimeOffset) {
+    public void setTiTimeOffset(long tiTimeOffset) {
         this.tiTimeOffset = tiTimeOffset;
     }
-    
+
     /**
      * Get the TI time offset.
-     * 
+     *
      * @return the TI time offset
      */
     public long getTiTimeOffset() {

Modified: java/trunk/record-util/src/main/java/org/hps/record/triggerbank/AbstractIntData.java
 =============================================================================
--- java/trunk/record-util/src/main/java/org/hps/record/triggerbank/AbstractIntData.java	(original)
+++ java/trunk/record-util/src/main/java/org/hps/record/triggerbank/AbstractIntData.java	Tue Aug 25 19:40:38 2015
@@ -1,16 +1,17 @@
 package org.hps.record.triggerbank;
 
 import java.util.Arrays;
+import org.jlab.coda.jevio.BaseStructure;
+import org.jlab.coda.jevio.EvioEvent;
 import org.lcsim.event.GenericObject;
 
 /**
- * Class <code>GenericObject</code> representation of an INT32/UINT32
- * bank read from EvIO. The bank header tag identifies the type of
- * data, and is stored as the first int in the <code>GenericObject</code>.
- * The contents of the bank are the remaining N-1 <code>int</code>
- * primitives. Constructors are provided from <code>int[]</code> (for
- * reading from EvIO) and from <code>GenericObject</code> (for reading
- * from LCIO).<br/>
+ * Class <code>GenericObject</code> representation of an INT32/UINT32 bank read
+ * from EvIO. The bank header tag identifies the type of data, and is stored as
+ * the first int in the <code>GenericObject</code>. The contents of the bank are
+ * the remaining N-1 <code>int</code> primitives. Constructors are provided from
+ * <code>int[]</code> (for reading from EvIO) and from
+ * <code>GenericObject</code> (for reading from LCIO).<br/>
  * <br/>
  * Subclasses must implement the two constructors and two abstract methods, plus
  * whatever methods are needed to access the parsed data.
@@ -19,49 +20,59 @@
  * @see GenericObject
  */
 public abstract class AbstractIntData implements GenericObject {
-	/** The data bank. */
+
+    /**
+     * The data bank.
+     */
     protected int[] bank;
-    
-    /**
-     * Constructs an <code>AbstractIntData</code> from a raw EvIO integer
-     * bank. It is expected that the EvIO reader will verify that the
-     * bank tag is the appropriate type before calling the constructor.
+
+    /**
+     * Constructs an <code>AbstractIntData</code> from a raw EvIO integer bank.
+     * It is expected that the EvIO reader will verify that the bank tag is the
+     * appropriate type before calling the constructor.
+     *
      * @param bank - An EvIO bank of <code>int</code> data.
      */
     protected AbstractIntData(int[] bank) {
-        if(bank == null) { this.bank = new int[0]; }
-        else { this.bank = Arrays.copyOf(bank, bank.length); }
-    }
-    
+        if (bank == null) {
+            this.bank = new int[0];
+        } else {
+            this.bank = Arrays.copyOf(bank, bank.length);
+        }
+    }
+
     /**
      * Create an <code>AbstractIntData</code> object from an LCIO
      * <code>genericObject</code>. Constructor requires that the
-     * <code>GenericObject</code> tag match the expected EvIO header
-     * tag type as defined by the implementing class.
+     * <code>GenericObject</code> tag match the expected EvIO header tag type as
+     * defined by the implementing class.
+     *
      * @param data - The source data bank.
      * @param expectedTag - The required EvIO bank header tag.
      */
     protected AbstractIntData(GenericObject data, int expectedTag) {
-    	// If the EvIO bank header tag is not the required type,
-    	// produce an exception.
-        if(getTag(data) != expectedTag) {
+        // If the EvIO bank header tag is not the required type,
+        // produce an exception.
+        if (getTag(data) != expectedTag) {
             throw new RuntimeException("expected tag " + expectedTag + ", got " + getTag(data));
         }
-        
+
         // Otherwise, store the bank.
         this.bank = getBank(data);
     }
-    
+
     /**
      * Gets the entire, unparsed integer data bank from the object.
+     *
      * @return Returns the data as an <code>int[]</code> array.
      */
     public int[] getBank() {
         return bank;
     }
-    
+
     /**
      * Return the int bank of an AbstractIntData read from LCIO.
+     *
      * @param object
      * @return
      */
@@ -73,10 +84,11 @@
         }
         return bank;
     }
-    
+
     /**
      * Return a single value from the integer bank of an
      * <code>AbstractIntData</code>.
+     *
      * @param object - The bank from which to obtain the data.
      * @param index - The index of the data in the bank.
      * @return Returns the requested entry from the integer bank.
@@ -84,44 +96,46 @@
     public static int getBankInt(GenericObject object, int index) {
         return object.getIntVal(index + 1);
     }
-    
+
     /**
      * Returns the EvIO bank header tag expected for this data.
+     *
      * @return Returns the tag as an <code>int</code> primitive.
      */
     public abstract int getTag();
-    
+
     /**
      * Returns the EVIO bank tag for a data object.
-     * @param data - A <code>GenericObject</code> representing an integer
-     * data bank.
+     *
+     * @param data - A <code>GenericObject</code> representing an integer data
+     * bank.
      * @return Returns the EvIO tag identifying the type of bank the object
      * represents.
      */
     public static int getTag(GenericObject data) {
         return data.getIntVal(0);
     }
-    
+
     /**
      * Parses the bank so the object can be used in analysis.
      */
     protected abstract void decodeData();
-    
+
     @Override
     public int getNInt() {
         return bank.length + 1;
     }
-    
+
     @Override
     public int getNFloat() {
         return 0;
     }
-    
+
     @Override
     public int getNDouble() {
         return 0;
     }
-    
+
     @Override
     public int getIntVal(int index) {
         if (index == 0) {
@@ -129,19 +143,59 @@
         }
         return bank[index - 1];
     }
-    
+
     @Override
     public float getFloatVal(int index) {
         throw new UnsupportedOperationException("No float values in " + this.getClass().getSimpleName());
     }
-    
+
     @Override
     public double getDoubleVal(int index) {
         throw new UnsupportedOperationException("No double values in " + this.getClass().getSimpleName());
     }
-    
+
     @Override
     public boolean isFixedSize() {
         return true;
     }
-}
+
+    /**
+     * Utility class used to search an EVIO event for a specified int bank.
+     */
+    public static class IntBankDefinition {
+
+        int[] bankTags;
+        Class<? extends AbstractIntData> dataClass;
+
+        public IntBankDefinition(Class<? extends AbstractIntData> dataClass, int[] bankTags) {
+            this.bankTags = bankTags;
+            this.dataClass = dataClass;
+        }
+
+        public Class<? extends AbstractIntData> getDataClass() {
+            return dataClass;
+        }
+
+        public BaseStructure findBank(EvioEvent evioEvent) {
+            BaseStructure currentBank = evioEvent;
+            searchLoop:
+            for (int bankTag : bankTags) {
+                if (currentBank.getChildCount() > 0) {
+                    for (BaseStructure childBank : currentBank.getChildrenList()) {
+                        if (childBank.getHeader().getTag() == bankTag) {
+                            // Found a bank with the right tag; step inside this bank and continue searching.
+                            currentBank = childBank;
+                            continue searchLoop;
+                        }
+                    }
+                    // Didn't find a bank with the right tag so stop.
+                    return null;
+                } else {
+                    // Bank has no children so stop.
+                    return null;
+                }
+            }
+            return currentBank; // matched every tag, so this is the bank we want
+        }
+    }
+}

Added: java/trunk/record-util/src/main/java/org/hps/record/triggerbank/TriggerEvioProcessor.java
 =============================================================================
--- java/trunk/record-util/src/main/java/org/hps/record/triggerbank/TriggerEvioProcessor.java	(added)
+++ java/trunk/record-util/src/main/java/org/hps/record/triggerbank/TriggerEvioProcessor.java	Tue Aug 25 19:40:38 2015
@@ -0,0 +1,56 @@
+package org.hps.record.triggerbank;
+
+import org.hps.record.evio.EvioEventProcessor;
+import org.hps.record.run.TriggerConfig;
+import org.hps.record.triggerbank.AbstractIntData.IntBankDefinition;
+import org.jlab.coda.jevio.BaseStructure;
+import org.jlab.coda.jevio.EvioEvent;
+
+/**
+ *
+ * @author Sho Uemura <[log in to unmask]>
+ * @version $Id: $
+ */
+public class TriggerEvioProcessor extends EvioEventProcessor {
+
+    private final IntBankDefinition headBankDefinition;
+    private final IntBankDefinition tiBankDefinition;
+    private long minOffset = 0;
+    private long maxOffset = 0;
+
+    public TriggerEvioProcessor() {
+        headBankDefinition = new IntBankDefinition(HeadBankData.class, new int[]{0x2e, 0xe10f});
+        tiBankDefinition = new IntBankDefinition(TIData.class, new int[]{0x2e, 0xe10a});
+    }
+
+    @Override
+    public void process(final EvioEvent evioEvent) {
+        BaseStructure headBank = headBankDefinition.findBank(evioEvent);
+        BaseStructure tiBank = tiBankDefinition.findBank(evioEvent);
+        if (headBank != null && tiBank != null) {
+            int[] headData = headBank.getIntData();
+            int thisTimestamp = headData[3];
+            TIData tiData = new TIData(tiBank.getIntData());
+            if (thisTimestamp != 0) {
+                long offset = thisTimestamp * 1000000000L - tiData.getTime();
+                if (minOffset == 0 || minOffset > offset) {
+                    minOffset = offset;
+                }
+                if (maxOffset == 0 || maxOffset < offset) {
+                    maxOffset = offset;
+                }
+            }
+        }
+    }
+
+    public TriggerConfig getTriggerConfig() {
+        TriggerConfig triggerConfig = new TriggerConfig();
+        long offsetRange = maxOffset - minOffset;
+        if (offsetRange > 0.99 * 1e9 && offsetRange < 1.01 * 1e9) {
+            triggerConfig.setTiTimeOffset(minOffset);
+        } else {
+            triggerConfig.setTiTimeOffset(0);
+        }
+        return triggerConfig;
+    }
+}