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;