Print

Print


Author: [log in to unmask]
Date: Fri Aug 28 15:25:34 2015
New Revision: 3449

Log:
Add timestamp to scaler data interface; other minor changes.  HPSJAVA-593

Modified:
    java/trunk/record-util/src/main/java/org/hps/record/scalers/ScalerData.java
    java/trunk/record-util/src/main/java/org/hps/record/scalers/ScalerUtilities.java
    java/trunk/record-util/src/main/java/org/hps/record/scalers/ScalersEvioProcessor.java
    java/trunk/record-util/src/main/java/org/hps/record/scalers/ScalersGenericObject.java
    java/trunk/record-util/src/main/java/org/hps/record/scalers/package-info.java

Modified: java/trunk/record-util/src/main/java/org/hps/record/scalers/ScalerData.java
 =============================================================================
--- java/trunk/record-util/src/main/java/org/hps/record/scalers/ScalerData.java	(original)
+++ java/trunk/record-util/src/main/java/org/hps/record/scalers/ScalerData.java	Fri Aug 28 15:25:34 2015
@@ -1,16 +1,19 @@
 package org.hps.record.scalers;
 
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 import org.lcsim.event.EventHeader;
+import org.lcsim.event.EventHeader.LCMetaData;
 import org.lcsim.event.GenericObject;
 
 /**
  * This class encapsulates EVIO scaler data which is simply an array of integer values. The exact meaning of each of
  * these integer words is defined externally to this class.
  *
- * @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a>
+ * @author Jeremy McCormick, SLAC
  */
 public final class ScalerData {
 
@@ -23,6 +26,21 @@
      * Default name of scaler data collection in LCSim events.
      */
     private static final String DEFAULT_COLLECTION_NAME = "ScalerData";
+
+    /**
+     * Dummy float parameters to make LCIO persistency work.
+     */
+    private static final Map<String, float[]> DUMMY_FLOAT_MAP = new HashMap<String, float[]>();
+
+    /**
+     * Dummy int parameters to make LCIO persistency work.
+     */
+    private static final Map<String, String[]> DUMMY_STRING_MAP = new HashMap<String, String[]>();
+
+    /**
+     * Name of timestamp field in collection parameters.
+     */
+    private static final String TIMESTAMP = "TIMESTAMP";
 
     /**
      * Create a new <code>ScalerData</code> object from an LCIO event, using the default collection name.
@@ -43,11 +61,22 @@
     public static ScalerData read(final EventHeader event, final String collectionName) {
         ScalerData data = null;
         if (event.hasCollection(GenericObject.class, collectionName)) {
-            // System.out.println("ScalerData - found collection");
+
+            // Read from generic object.
             final List<GenericObject> objects = event.get(GenericObject.class, collectionName);
             data = new ScalerData();
             data.fromGenericObject(objects.get(0));
-            data.setEventId(event.getEventNumber());
+
+            // Set event ID.
+            data.eventId = event.getEventNumber();
+
+            // Read timestamp.
+            final LCMetaData metadata = event.getMetaData(objects);
+            try {
+                data.timestamp = metadata.getIntegerParameters().get(TIMESTAMP)[0];
+            } catch (final Exception e) {
+                throw new RuntimeException("Scaler data is missing timestamp parameter.", e);
+            }
         }
         return data;
     }
@@ -63,6 +92,11 @@
     private Integer eventId;
 
     /**
+     * The timestamp of the scaler event.
+     */
+    private Integer timestamp;
+
+    /**
      * This is the no argument constructor which is for package internal use only.
      */
     ScalerData() {
@@ -73,10 +107,11 @@
      *
      * @param data the scaler data
      */
-    public ScalerData(final int[] data, final int eventId) {
+    public ScalerData(final int[] data, final int eventId, final int timestamp) {
         this.data = new int[data.length];
         System.arraycopy(data, 0, this.data, 0, data.length);
         this.eventId = eventId;
+        this.timestamp = timestamp;
     }
 
     /**
@@ -101,6 +136,15 @@
     public Integer getEventId() {
         // Null value will be returned here to indicate not set.
         return this.eventId;
+    }
+
+    /**
+     * Get the scaler data's Unix timestamp.
+     *
+     * @return the scaler data's Unix timestamp
+     */
+    public int getTimestamp() {
+        return this.timestamp;
     }
 
     /**
@@ -184,8 +228,17 @@
      * @param collectionName the name of the output collection
      */
     private void write(final EventHeader event, final String collectionName) {
+
+        // Create generic object collection.
         final List<GenericObject> collection = new ArrayList<GenericObject>();
         collection.add(this.toGenericObject());
-        event.put(collectionName, collection, GenericObject.class, 0);
-    }    
+
+        // Add collection parameter with timestamp.
+        final Map<String, int[]> timestampParameter = new HashMap<String, int[]>();
+        timestampParameter.put(TIMESTAMP, new int[] {timestamp});
+
+        // Put collection into event.
+        event.put(collectionName, collection, GenericObject.class, 0, timestampParameter, DUMMY_FLOAT_MAP,
+                DUMMY_STRING_MAP);
+    }
 }

Modified: java/trunk/record-util/src/main/java/org/hps/record/scalers/ScalerUtilities.java
 =============================================================================
--- java/trunk/record-util/src/main/java/org/hps/record/scalers/ScalerUtilities.java	(original)
+++ java/trunk/record-util/src/main/java/org/hps/record/scalers/ScalerUtilities.java	Fri Aug 28 15:25:34 2015
@@ -5,7 +5,7 @@
  * <p>
  * Currently this is used only for computing live time measurements from standard scaler data.
  *
- * @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a>
+ * @author Jeremy McCormick, SLAC
  */
 public final class ScalerUtilities {
 

Modified: java/trunk/record-util/src/main/java/org/hps/record/scalers/ScalersEvioProcessor.java
 =============================================================================
--- java/trunk/record-util/src/main/java/org/hps/record/scalers/ScalersEvioProcessor.java	(original)
+++ java/trunk/record-util/src/main/java/org/hps/record/scalers/ScalersEvioProcessor.java	Fri Aug 28 15:25:34 2015
@@ -18,7 +18,7 @@
 /**
  * This is an EVIO event processor for creating a {@link ScalerData} object from scaler bank data.
  *
- * @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a>
+ * @author Jeremy McCormick, SLAC
  */
 public class ScalersEvioProcessor extends EvioEventProcessor {
 
@@ -29,16 +29,29 @@
      * Currently cached ScalerData object which was created by the process method.
      */
     private ScalerData currentScalerData;
+
+    /**
+     * Set to <code>true</code> if cached data object should be reset between every event even if scaler data is not
+     * present.
+     */
     private boolean resetEveryEvent = true;
 
+    /**
+     * The complete set of scaler data found in the job.
+     */
     private Set<ScalerData> scalerDataSet = new LinkedHashSet<ScalerData>();
 
+    /**
+     * Get the current cached scaler data object.
+     *
+     * @return the current scaler data object
+     */
     public ScalerData getCurrentScalerData() {
         return this.currentScalerData;
     }
 
     /**
-     * Get the current scaler data or null if there was none in the last event processed.
+     * Get the list of scaler data found in the job.
      *
      * @return the current scaler data or <code>null</code> if none exists
      */
@@ -46,6 +59,12 @@
         return new ArrayList<ScalerData>(this.scalerDataSet);
     }
 
+    /**
+     * Get scaler data from the EVIO event.
+     *
+     * @param evioEvent the EVIO event
+     * @return the scaler data or <code>null</code> if none exists
+     */
     private ScalerData getScalerData(final EvioEvent evioEvent) {
         ScalerData scalerData = null;
         // Proceed if sync bit checking is not enabled or sync bit is on.
@@ -60,9 +79,14 @@
                             LOGGER.fine("found scaler data in bank " + subBank.getHeader().getTag()
                                     + " and EVIO event " + evioEvent.getEventNumber());
 
-                            // Scaler data exists in event so create object and stop processing.
-                            scalerData = new ScalerData(subBank.getIntData(),
-                                    EvioEventUtilities.getEventIdData(evioEvent)[0]);
+                            // Get event ID.
+                            final int eventId = EvioEventUtilities.getEventIdData(evioEvent)[0];
+
+                            // Get event's timestamp.
+                            final int timestamp = EvioEventUtilities.getHeadBankData(evioEvent)[3];
+
+                            // Create scaler data.
+                            scalerData = new ScalerData(subBank.getIntData(), eventId, timestamp);
 
                             break outerBankLoop;
                         }
@@ -93,10 +117,18 @@
         }
     }
 
+    /**
+     * Set to <code>true</code> to reset scaler data object between every EVIO event.
+     *
+     * @param resetEveryEvent <code>true</code> to reset scaler data between every EVIO event
+     */
     public void setResetEveryEvent(final boolean resetEveryEvent) {
         this.resetEveryEvent = resetEveryEvent;
     }
 
+    /**
+     * Start of job hook which resets collecton of cached scaler data.
+     */
     @Override
     public void startJob() {
         this.scalerDataSet = new LinkedHashSet<ScalerData>();

Modified: java/trunk/record-util/src/main/java/org/hps/record/scalers/ScalersGenericObject.java
 =============================================================================
--- java/trunk/record-util/src/main/java/org/hps/record/scalers/ScalersGenericObject.java	(original)
+++ java/trunk/record-util/src/main/java/org/hps/record/scalers/ScalersGenericObject.java	Fri Aug 28 15:25:34 2015
@@ -6,7 +6,7 @@
  * This is the LCIO {@link org.lcsim.event.GenericObject} binding for EVIO scaler data. This should not be used
  * directly. Rather the {@link ScalerData} class should be used for loading data from LCIO events.
  *
- * @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a>
+ * @author Jeremy McCormick, SLAC
  */
 final class ScalersGenericObject implements GenericObject {
 

Modified: java/trunk/record-util/src/main/java/org/hps/record/scalers/package-info.java
 =============================================================================
--- java/trunk/record-util/src/main/java/org/hps/record/scalers/package-info.java	(original)
+++ java/trunk/record-util/src/main/java/org/hps/record/scalers/package-info.java	Fri Aug 28 15:25:34 2015
@@ -1,6 +1,6 @@
 /**
  * Classes for converting scaler data from EVIO to LCSim.
  *
- * @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a>
+ * @author Jeremy McCormick, SLAC
  */
 package org.hps.record.scalers;