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); }