Print

Print


Author: [log in to unmask]
Date: Tue Oct  6 14:16:03 2015
New Revision: 3776

Log:
Minor reorganization and add a few utility methods

Modified:
    java/trunk/record-util/src/main/java/org/hps/record/epics/EpicsData.java
    java/trunk/record-util/src/main/java/org/hps/record/epics/EpicsRunProcessor.java
    java/trunk/record-util/src/main/java/org/hps/record/evio/EvioEventUtilities.java
    java/trunk/record-util/src/main/java/org/hps/record/evio/EvioFileMetadataProcessor.java
    java/trunk/record-util/src/main/java/org/hps/record/evio/EvioFileSource.java
    java/trunk/record-util/src/main/java/org/hps/record/scalers/ScalerData.java
    java/trunk/record-util/src/main/java/org/hps/record/scalers/ScalersEvioProcessor.java

Modified: java/trunk/record-util/src/main/java/org/hps/record/epics/EpicsData.java
 =============================================================================
--- java/trunk/record-util/src/main/java/org/hps/record/epics/EpicsData.java	(original)
+++ java/trunk/record-util/src/main/java/org/hps/record/epics/EpicsData.java	Tue Oct  6 14:16:03 2015
@@ -8,6 +8,10 @@
 import java.util.Map.Entry;
 import java.util.Set;
 
+import org.hps.record.evio.EventTagConstant;
+import org.hps.record.evio.EvioBankTag;
+import org.jlab.coda.jevio.BaseStructure;
+import org.jlab.coda.jevio.EvioEvent;
 import org.lcsim.event.EventHeader;
 import org.lcsim.event.GenericObject;
 
@@ -265,4 +269,45 @@
         stringMap.put(EPICS_VARIABLE_NAMES, object.getKeys());
         event.put(collectionName, collection, GenericObject.class, 0, DUMMY_INT_MAP, DUMMY_FLOAT_MAP, stringMap);
     }
+    
+    /**
+     * Get EPICS data from an EVIO event.
+     * 
+     * @param evioEvent the EVIO event
+     * @return the EPICS data or <code>null</code> if it is not present in the event
+     */
+    public static EpicsData getEpicsData(EvioEvent evioEvent) {
+        
+        EpicsData epicsData = null;
+        
+        // Is this an EPICS event?
+        if (EventTagConstant.EPICS.equals(evioEvent)) {
+
+            // Find the bank with the EPICS data string.
+            final BaseStructure epicsBank = EvioBankTag.EPICS_STRING.findBank(evioEvent);
+
+            // Was EPICS data found in the event?
+            if (epicsBank != null) {
+
+                // Create EpicsData object from bank's string data.
+                epicsData = new EpicsData(epicsBank.getStringData()[0]);
+
+                // Find the header information in the event.
+                final BaseStructure headerBank = EvioBankTag.EPICS_HEADER.findBank(evioEvent);
+
+                if (headerBank != null) {
+                    // Set the header object.
+                    epicsData.setEpicsHeader(EpicsHeader.fromEvio(headerBank.getIntData()));
+                } else {
+                    throw new RuntimeException("EPICS data is missing header.");
+                }
+
+            } else {
+                // This is an error because the string data bank should always be present in EPICS events.
+                throw new RuntimeException("No data bank found in EPICS event.");
+            }
+        }
+        return epicsData;
+    }
+    
 }

Modified: java/trunk/record-util/src/main/java/org/hps/record/epics/EpicsRunProcessor.java
 =============================================================================
--- java/trunk/record-util/src/main/java/org/hps/record/epics/EpicsRunProcessor.java	(original)
+++ java/trunk/record-util/src/main/java/org/hps/record/epics/EpicsRunProcessor.java	Tue Oct  6 14:16:03 2015
@@ -4,9 +4,13 @@
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
+import java.util.logging.Level;
+import java.util.logging.Logger;
 
 import org.hps.record.evio.EvioEventProcessor;
 import org.jlab.coda.jevio.EvioEvent;
+import org.lcsim.util.log.DefaultLogFormatter;
+import org.lcsim.util.log.LogUtil;
 
 /**
  * Creates a list of EPICS data found in EVIO events across an entire job.
@@ -15,6 +19,11 @@
  */
 public final class EpicsRunProcessor extends EvioEventProcessor {
 
+    /**
+     * Setup class logger.
+     */
+    private static final Logger LOGGER = LogUtil.create(EpicsRunProcessor.class, new DefaultLogFormatter(), Level.INFO);
+    
     /**
      * The current EPICS data block from the EVIO events (last one that was found).
      */
@@ -54,11 +63,15 @@
     public void process(final EvioEvent evioEvent) {
 
         // Call the processor that will load EPICS data if it exists in the event.
+        this.processor.reset();
         this.processor.process(evioEvent);
         this.currentEpicsData = this.processor.getEpicsData();
 
         // Add EPICS data to the collection.
         if (this.currentEpicsData != null) {
+            LOGGER.info("adding EPICS data for run " + this.currentEpicsData.getEpicsHeader().getRun() + " and timestamp " 
+                    + this.currentEpicsData.getEpicsHeader().getTimestamp() + " with seq " 
+                    + this.currentEpicsData.getEpicsHeader().getSequence());
             this.epicsDataSet.add(this.currentEpicsData);
         }
     }

Modified: java/trunk/record-util/src/main/java/org/hps/record/evio/EvioEventUtilities.java
 =============================================================================
--- java/trunk/record-util/src/main/java/org/hps/record/evio/EvioEventUtilities.java	(original)
+++ java/trunk/record-util/src/main/java/org/hps/record/evio/EvioEventUtilities.java	Tue Oct  6 14:16:03 2015
@@ -8,8 +8,17 @@
 import static org.hps.record.evio.EvioEventConstants.PRESTART_EVENT_TAG;
 import static org.hps.record.evio.EvioEventConstants.SYNC_EVENT_TAG;
 
+import java.util.ArrayList;
+import java.util.List;
+
+import org.hps.conditions.database.DatabaseConditionsManager;
+import org.hps.record.daqconfig.EvioDAQParser;
+import org.hps.record.epics.EpicsData;
+import org.hps.record.epics.EpicsHeader;
+import org.hps.record.scalers.ScalerData;
 import org.jlab.coda.jevio.BaseStructure;
 import org.jlab.coda.jevio.EvioEvent;
+import org.lcsim.conditions.ConditionsManager.ConditionsNotFoundException;
 
 /**
  * This is a set of basic static utility methods for <code>EvioEvent</code> objects.
@@ -18,6 +27,13 @@
  */
 public final class EvioEventUtilities {
 
+    /**
+     * Class should not be instantiated.
+     */
+    private EvioEventUtilities() {
+        throw new UnsupportedOperationException("Do not instantiate this class.");
+    }
+    
     /**
      * Extract the CODA run data stored in a control event.
      *
@@ -235,11 +251,49 @@
         }
         return eventId;
     }
-    
-    /**
-     * Class should not be instantiated.
-     */
-    private EvioEventUtilities() {
-        throw new UnsupportedOperationException("Do not instantiate this class.");
+                  
+    static EvioDAQParser createDAQConfig(EvioEvent evioEvent, int crate, BaseStructure subBank) {
+        
+        EvioDAQParser parser = new EvioDAQParser();
+        
+        // Get run number from EVIO event.
+        int runNumber = EvioEventUtilities.getRunNumber(evioEvent);
+        
+        // Initialize the conditions system if necessary as the DAQ config parsing classes use it.
+        DatabaseConditionsManager conditionsManager = DatabaseConditionsManager.getInstance();
+        if (!conditionsManager.isInitialized() || conditionsManager.getRun() != runNumber) {
+            try {
+                conditionsManager.setXmlConfig("/org/hps/conditions/config/conditions_database_no_svt.xml");
+                DatabaseConditionsManager.getInstance().setDetector("HPS-dummy-detector", runNumber);
+            } catch (ConditionsNotFoundException e) {
+                throw new RuntimeException(e);
+            }
+        }
+        
+        // Create the trigger config from the EVIO data.
+        parser.parse(
+                crate, 
+                runNumber, 
+                subBank.getStringData());
+        
+        return parser;
+    }
+    
+    public static List<EvioDAQParser> getDAQConfig(EvioEvent evioEvent) {
+        List<EvioDAQParser> triggerConfig = new ArrayList<EvioDAQParser>();
+        outerLoop: for (BaseStructure bank : evioEvent.getChildrenList()) {
+            if (bank.getChildCount() <= 0)
+                continue;
+            int crate = bank.getHeader().getTag();
+            for (BaseStructure subBank : bank.getChildrenList()) {
+                if (EvioBankTag.TRIGGER_CONFIG.equals(subBank)) {
+                    if (subBank.getStringData() == null) {                        
+                        throw new RuntimeException("Trigger config bank is missing string data.");
+                    }
+                    triggerConfig.add(createDAQConfig(evioEvent, crate, subBank));
+                }
+            }
+        }
+        return triggerConfig;
     }
 }

Modified: java/trunk/record-util/src/main/java/org/hps/record/evio/EvioFileMetadataProcessor.java
 =============================================================================
--- java/trunk/record-util/src/main/java/org/hps/record/evio/EvioFileMetadataProcessor.java	(original)
+++ java/trunk/record-util/src/main/java/org/hps/record/evio/EvioFileMetadataProcessor.java	Tue Oct  6 14:16:03 2015
@@ -9,7 +9,7 @@
 import org.lcsim.util.log.DefaultLogFormatter;
 import org.lcsim.util.log.LogUtil;
 
-
+// TODO: add doc
 public class EvioFileMetadataProcessor extends EvioEventProcessor {
     
     private static Logger LOGGER = LogUtil.create(EvioFileMetadataProcessor.class, new DefaultLogFormatter(), Level.ALL);

Modified: java/trunk/record-util/src/main/java/org/hps/record/evio/EvioFileSource.java
 =============================================================================
--- java/trunk/record-util/src/main/java/org/hps/record/evio/EvioFileSource.java	(original)
+++ java/trunk/record-util/src/main/java/org/hps/record/evio/EvioFileSource.java	Tue Oct  6 14:16:03 2015
@@ -160,6 +160,7 @@
     private void openReader() {
         try {
             System.out.println("Opening reader for file " + this.files.get(this.fileIndex) + " ...");
+            // FIXME: this should use the reader directly and cached paths should be managed externally
             this.reader = EvioFileUtilities.open(this.files.get(this.fileIndex), true);
             System.out.println("Done opening file.");
         } catch (EvioException | IOException e) {

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	Tue Oct  6 14:16:03 2015
@@ -5,6 +5,10 @@
 import java.util.List;
 import java.util.Map;
 
+import org.hps.record.evio.EvioEventConstants;
+import org.hps.record.evio.EvioEventUtilities;
+import org.jlab.coda.jevio.BaseStructure;
+import org.jlab.coda.jevio.EvioEvent;
 import org.lcsim.event.EventHeader;
 import org.lcsim.event.EventHeader.LCMetaData;
 import org.lcsim.event.GenericObject;
@@ -241,4 +245,39 @@
         event.put(collectionName, collection, GenericObject.class, 0, timestampParameter, DUMMY_FLOAT_MAP,
                 DUMMY_STRING_MAP);
     }
+    
+    /**
+     * Get scaler data from an EVIO event.
+     * 
+     * @param evioEvent the EVIO event
+     * @return the scaler data or <code>null</code> if it does not exist in the event
+     */
+    public static ScalerData getScalerData(final EvioEvent evioEvent) {
+        ScalerData scalerData = null;
+        outerBankLoop: for (final BaseStructure bank : evioEvent.getChildrenList()) {
+            // Does the crate tag match?
+            if (bank.getHeader().getTag() == EvioEventConstants.SCALERS_CRATE_TAG) {
+                if (bank.getChildrenList() != null) {
+                    for (final BaseStructure subBank : bank.getChildrenList()) {
+                        // Does the bank tag match?
+                        if (subBank.getHeader().getTag() == EvioEventConstants.SCALERS_BANK_TAG) {
+
+                            // 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;
+                        }
+                    }
+                }
+            }
+        }
+        return scalerData;
+    }
+    
 }

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	Tue Oct  6 14:16:03 2015
@@ -7,10 +7,8 @@
 import java.util.logging.Level;
 import java.util.logging.Logger;
 
-import org.hps.record.evio.EvioEventConstants;
 import org.hps.record.evio.EvioEventProcessor;
 import org.hps.record.evio.EvioEventUtilities;
-import org.jlab.coda.jevio.BaseStructure;
 import org.jlab.coda.jevio.EvioEvent;
 import org.lcsim.util.log.DefaultLogFormatter;
 import org.lcsim.util.log.LogUtil;
@@ -60,44 +58,6 @@
     }
 
     /**
-     * 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.
-        outerBankLoop: for (final BaseStructure bank : evioEvent.getChildrenList()) {
-            // Does the crate tag match?
-            if (bank.getHeader().getTag() == EvioEventConstants.SCALERS_CRATE_TAG) {
-                if (bank.getChildrenList() != null) {
-                    for (final BaseStructure subBank : bank.getChildrenList()) {
-                        // Does the bank tag match?
-                        if (subBank.getHeader().getTag() == EvioEventConstants.SCALERS_BANK_TAG) {
-
-                            LOGGER.fine("found scaler data in bank " + subBank.getHeader().getTag()
-                                    + " and EVIO event " + evioEvent.getEventNumber());
-
-                            // 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;
-                        }
-                    }
-                }
-            }
-        }
-        return scalerData;
-    }
-
-    /**
      * This method will create a <code>ScalerData</code> object and cache it. The current object is first reset to
      * <code>null</code> every time this method is called.
      *
@@ -109,9 +69,9 @@
             // Reset the cached data object.
             this.currentScalerData = null;
         }
-
-        final ScalerData scalerData = this.getScalerData(evioEvent);
+        final ScalerData scalerData = ScalerData.getScalerData(evioEvent);
         if (scalerData != null) {
+            LOGGER.info("got scaler data from EVIO event " + evioEvent.getEventNumber());
             this.currentScalerData = scalerData;
             this.scalerDataSet.add(this.currentScalerData);
         }