Author: [log in to unmask]
Date: Thu Aug 4 15:06:51 2016
New Revision: 4443
Log:
[HPSJAVA-693][HPSJAVA-692][HPSJAVA-694] Enable event marker printing; add skip event parameter; remove log level setting from command switch.
Modified:
java/trunk/evio/src/main/java/org/hps/evio/EvioToLcio.java
Modified: java/trunk/evio/src/main/java/org/hps/evio/EvioToLcio.java
=============================================================================
--- java/trunk/evio/src/main/java/org/hps/evio/EvioToLcio.java (original)
+++ java/trunk/evio/src/main/java/org/hps/evio/EvioToLcio.java Thu Aug 4 15:06:51 2016
@@ -25,11 +25,11 @@
import org.freehep.record.source.NoSuchRecordException;
import org.hps.conditions.database.DatabaseConditionsManager;
import org.hps.job.JobManager;
+import org.hps.rundb.RunManager;
import org.hps.logging.config.DefaultLoggingConfig;
import org.hps.record.LCSimEventBuilder;
import org.hps.record.evio.EvioEventQueue;
import org.hps.record.evio.EvioEventUtilities;
-import org.hps.rundb.RunManager;
import org.jlab.coda.jevio.BaseStructure;
import org.jlab.coda.jevio.EvioEvent;
import org.jlab.coda.jevio.EvioException;
@@ -57,14 +57,14 @@
* the correct event builder. It will not handle jobs correctly with files from both the Test and Engineering Run, so
* don't do this!
* <p>
- * The conditions system can be initialized in one of three ways.<br/>
+ * The run number in the conditions system can be initialized in one of three ways.<br/>
* <ol>
* <li>user specified run number in which case the conditions system is frozen for the rest of the job</li>
- * <li>run number from an EVIO pre start event</li>
- * <li>run number from a header bank in an event</li>
+ * <li>run number from an EVIO PRESTART event</li>
+ * <li>run number from a header bank in a physics event</li>
* </ol>
* <p>
- * In the case where a file has no pre start event and there are header banks present, the "-m" command line option can
+ * In the case where a file has no PRESTART event and there are header banks present, the "-m" command line option can
* be used to buffer a number of EVIO events. If there is a head bank found while adding these events to queue, the
* conditions system will be initialized from it.
*
@@ -117,7 +117,6 @@
OPTIONS.addOption(new Option("d", true, "detector name (required)"));
OPTIONS.getOption("d").setRequired(true);
OPTIONS.addOption(new Option("f", true, "text file containing a list of EVIO files"));
- OPTIONS.addOption(new Option("L", true, "log level (INFO, FINE, etc.)"));
OPTIONS.addOption(new Option("x", true, "LCSim steeering file for processing the LCIO events"));
OPTIONS.addOption(new Option("r", false, "interpret steering from -x argument as a resource instead of a file"));
OPTIONS.addOption(new Option("D", true, "define a steering file variable with format -Dname=value"));
@@ -129,16 +128,19 @@
OPTIONS.addOption(new Option("m", true, "set the max event buffer size"));
OPTIONS.addOption(new Option("t", true, "specify a conditions tag to use"));
OPTIONS.addOption(new Option("M", false, "use memory mapping instead of sequential reading"));
+ OPTIONS.addOption(new Option("s", true, "skip a number of events in each EVIO input file before starting"));
+ OPTIONS.addOption(new Option("e", true, "event printing interval"));
}
/**
* The run number for conditions.
- */
- private Integer runNumber = null;
-
+ */
+ private int nEvents = 0;
private int maxEvents = -1;
- private int nEvents = 0;
+ private int skipEvents = 0;
private int maxBufferSize = 40;
+ private Long eventPrintInterval;
+ private Integer runNumber = null;
private List<String> evioFileList = null;
private boolean printXml = false;
private boolean useMemoryMapping = false;
@@ -146,6 +148,7 @@
private String lcioFileName = null;
private LCIOWriter writer = null;
private InputStream steeringStream = null;
+
/**
* The default constructor, which defines command line arguments and sets the default log level.
@@ -267,19 +270,6 @@
if (cl.hasOption("h")) {
this.printUsage();
- }
-
- // Set the log level.
- // TODO: Remove this argument; use java logging prop instead.
- if (cl.hasOption("L")) {
- final Level level = Level.parse(cl.getOptionValue("L").toUpperCase());
-
- // Set log level on this class.
- LOGGER.config("setting log level to " + level);
- LOGGER.setLevel(level);
-
- // Set log level on conditions manager.
- Logger.getLogger(DatabaseConditionsManager.class.getPackage().getName()).setLevel(level);
}
// Add all extra arguments to the EVIO file list.
@@ -381,6 +371,20 @@
// Enable dry run because events will be processed individually.
jobManager.setDryRun(true);
+ // Event marker printing from command line arg.
+ if (cl.hasOption("e")) {
+ eventPrintInterval = Long.parseLong(cl.getOptionValue("e"));
+ jobManager.setEventPrintInterval(eventPrintInterval);
+ LOGGER.config("Set event print interval to " + this.eventPrintInterval);
+ }
+
+ // Enable headless mode so no plots are shown.
+ if (cl.hasOption("b")) {
+ LOGGER.config("Headless mode is enabled. No plots will be shown.");
+ jobManager.enableHeadlessMode();
+ }
+
+ // Set a steering variable and value using "key=value" format.
if (cl.hasOption("D")) {
final String[] steeringOptions = cl.getOptionValues("D");
for (final String def : steeringOptions) {
@@ -397,12 +401,6 @@
}
}
- // Enable headless mode so no plots are shown.
- if (cl.hasOption("b")) {
- LOGGER.config("Headless mode is enabled. No plots will be shown.");
- jobManager.enableHeadlessMode();
- }
-
// Configure the LCSim job manager.
jobManager.setup(steeringStream);
jobManager.configure();
@@ -453,10 +451,17 @@
LOGGER.config("max event buffer size set to " + maxBufferSize);
}
+ // memory mapping
if (cl.hasOption("M")) {
useMemoryMapping = true;
LOGGER.config("EVIO reader memory mapping is enabled.");
}
+
+ // skip events
+ if (cl.hasOption("s")) {
+ skipEvents = Integer.parseInt(cl.getOptionValue("s"));
+ LOGGER.config("Skip events set to " + skipEvents);
+ }
}
/**
@@ -492,10 +497,28 @@
boolean firstEvent = true;
long eventTime = 0; // in ms
+
+ // Skip some events in each file first if requested.
+ if (skipEvents > 0) {
+ LOGGER.info("Skipping " + skipEvents + " events ...");
+ for (int i = 0; i < skipEvents; i++) {
+ try {
+ EvioEvent event = reader.nextEvent();
+ if (event == null) {
+ LOGGER.log(Level.WARNING, "Got null event object when skipping event num " + i);
+ //throw new RuntimeException("Got null event object when skipping events.");
+ }
+ } catch (EvioException | IOException e) { /* error when skipping events */
+ LOGGER.log(Level.SEVERE, e.getMessage(), e);
+ throw new RuntimeException(e); // Stop the job.
+ }
+ }
+ LOGGER.info("Done skipping events.");
+ }
// Loop over events.
final EvioEventQueue eventQueue = new EvioEventQueue(-1L, maxBufferSize);
- eventLoop: for (;;) {
+ eventLoop: for (;;) {
// Buffer the EVIO events into the queue.
this.bufferEvents(reader, eventQueue, maxBufferSize);
@@ -539,7 +562,7 @@
LOGGER.info(evioEvent.toXML());
}
- // Is this a pre start event?
+ // Is this a PRESTART event?
if (EvioEventUtilities.isPreStartEvent(evioEvent)) {
LOGGER.info("got PRESTART event");
@@ -549,14 +572,14 @@
if (data == null) {
// This should never happen but just ignore it.
- LOGGER.severe("Pre start event is missing a data bank.");
+ LOGGER.severe("PRESTART event is missing a data bank.");
} else {
// Check if conditions system needs to be updated from the pre start data.
this.checkConditions(data[1], false);
}
}
- // Is this an end event?
+ // Is this an END event?
if (EvioEventUtilities.isEndEvent(evioEvent)) {
LOGGER.info("got END event");
@@ -564,11 +587,11 @@
final int[] data = EvioEventUtilities.getControlEventData(evioEvent);
if (data == null) {
// This should never happen but just ignore it.
- LOGGER.severe("The end event is missing a data bank.");
+ LOGGER.severe("The END event is missing a data bank.");
} else {
final int seconds = data[0];
final int totalEvents = data[2];
- LOGGER.info("EVIO end event with " + totalEvents + " events and " + seconds + " seconds");
+ LOGGER.info("EVIO END event with " + totalEvents + " events and " + seconds + " seconds");
}
}
@@ -583,7 +606,7 @@
// Print physics event number, which is actually a sequence number from
// the reader, not the actual event number from the data.
- LOGGER.finer("got physics event " + evioEvent.getEventNumber());
+ LOGGER.finer("got physics event number " + evioEvent.getEventNumber());
// Is the event builder initialized?
if (eventBuilder == null) {
|