Author: [log in to unmask]
Date: Thu Nov 13 21:56:10 2014
New Revision: 1518
Log:
Rewrite EVIO to LCIO frontend so that it tries to configure itself properly from event numbers. Also remove a bunch of extraneous command line arguments.
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 Nov 13 21:56:10 2014
@@ -16,310 +16,385 @@
import org.apache.commons.cli.Options;
import org.apache.commons.cli.ParseException;
import org.apache.commons.cli.PosixParser;
-import org.hps.conditions.DatabaseConditionsManager;
import org.jlab.coda.jevio.EvioEvent;
import org.jlab.coda.jevio.EvioReader;
import org.lcsim.conditions.ConditionsManager;
-import org.lcsim.conditions.ConditionsManager.ConditionsNotFoundException;
import org.lcsim.event.EventHeader;
import org.lcsim.job.JobControlManager;
import org.lcsim.lcio.LCIOWriter;
+import org.lcsim.util.log.LogUtil;
/**
- * This class is for converting Test Run EVIO to LCIO events and performing an
- * LCSim job in the same session. The processed events are then written to disk
- * using an LCIOWriter.
- *
- * To run this class from command line:
- *
- * TestRunEvioToLcio [evioFile] -l [lcioFile] -d [detectorName] -x
- * [lcsimXmlFile]
+ * <p>
+ * This class converts EVIO to LCIO, performing an LCSim job in the same
+ * session. The processed events are then (optionally) written to disk using an
+ * LCIOWriter.
+ * <p>
+ * To run this class from the command line:<br>
+ * java -cp hps-distribution-bin.jar EvioToLcio [options] [evioFiles]
+ * <p>
+ * The available arguments can be printed using:<br>
+ * java -cp hps-distribution-bin.jar EvioToLcio -h
+ * <p>
+ * Extra arguments are treated as paths to EVIO files.
+ * <p>
+ * This class attempts to automatically configure itself for Test Run or Engineering Run
+ * based on the run numbers in the EVIO file. It will use an appropriate default detector
+ * unless one is given on the command line, and it will also use the correct event builder.
+ * However, it will NOT correctly handle a mixed list of EVIO files from both runs, so don't
+ * do this!
*
* @author Jeremy McCormick <[log in to unmask]>
*/
public class EvioToLcio {
- private static final String defaultDetectorName = "";
- private static final String defaultSteeringFile = "/org/hps/steering/monitoring/DummyMonitoring.lcsim";
-
- /**
- * Defines command line options for this program.
- *
- * @return The command line options.
- */
- private static Options createCommandLineOptions() {
- Options options = new Options();
- options.addOption(new Option("l", true, "The name of the output LCIO file"));
- options.addOption(new Option("d", true, "The name of the detector to use for LCSim conditions"));
- options.addOption(new Option("x", true, "The LCSim XML file to process the LCIO events"));
- options.addOption(new Option("s", true, "Sleep duration between events (in ms)"));
- options.addOption(new Option("n", true, "Stop after N events"));
- options.addOption(new Option("w", false, "Wait after end of data"));
- options.addOption(new Option("D", true, "Pass a variable to the steering file"));
- options.addOption(new Option("r", false, "Interpret -x argument as a steering resource instead of a file path"));
- options.addOption(new Option("R", true, "The run number"));
- options.addOption(new Option("t", false, "Read test run data"));
- return options;
- }
-
- /**
- * This method will execute the EVIO to LCIO conversion and perform an
- * intermediate LCSim job. Then the resultant LCIO events will be written to
- * disk.
- * @param args The command line arguments.
- */
- public static void main(String[] args) {
- int maxEvents = 0;
- int nEvents = 0;
-
- // Set up command line parsing.
- Options options = createCommandLineOptions();
- if (args.length == 0) {
- System.out.println("TestRunEvioToLcio [options] [evioFiles]");
- HelpFormatter help = new HelpFormatter();
- help.printHelp(" ", options);
- System.exit(1);
- }
- CommandLineParser parser = new PosixParser();
-
- // Parse command line arguments.
- CommandLine cl = null;
- try {
- cl = parser.parse(options, args);
- } catch (ParseException e) {
- throw new RuntimeException("Problem parsing command line options.", e);
- }
-
- String lcioFileName = null;
- LCIOWriter writer = null;
- String detectorName = defaultDetectorName;
- InputStream steeringStream = null;
- int sleepTime = -1;
-
- // LCIO output file.
- if (cl.hasOption("l")) {
- lcioFileName = cl.getOptionValue("l");
- }
-
- // Name of detector.
- if (cl.hasOption("d")) {
- detectorName = cl.getOptionValue("d");
- }
-
- if ("".equals(detectorName)) {
- throw new RuntimeException("You need to specify a valid detector name as input, use the -d option");
- }
-
- // LCSim XML file to execute inline.
- if (cl.hasOption("x")) {
- String lcsimXmlName = cl.getOptionValue("x");
- if (cl.hasOption("r")) {
- steeringStream = TestRunEvioToLcio.class.getResourceAsStream(lcsimXmlName);
- if (steeringStream == null) {
- throw new RuntimeException("resource " + lcsimXmlName + " not found");
- }
- } else {
- try {
- steeringStream = new FileInputStream(lcsimXmlName);
- } catch (FileNotFoundException e) {
- throw new RuntimeException(e);
- }
- }
- }
-
- if (steeringStream == null) {
- steeringStream = TestRunEvioToLcio.class.getResourceAsStream(defaultSteeringFile);
- }
-
- // Sleep time.
- if (cl.hasOption("s")) {
- sleepTime = Integer.valueOf(cl.getOptionValue("s"));
- }
-
- // Sleep time.
- if (cl.hasOption("n")) {
- maxEvents = Integer.valueOf(cl.getOptionValue("n"));
- }
-
- // LCIO writer.
- if (lcioFileName != null) {
- try {
- writer = new LCIOWriter(new File(lcioFileName));
- } catch (IOException e) {
- throw new RuntimeException(e);
- }
- }
-
- // LCSim job manager.
- JobControlManager jobManager = new JobControlManager();
-
- if (cl.hasOption("D")) {
- String[] steeringOptions = cl.getOptionValues("D");
- for (String def : steeringOptions) {
- String[] s = def.split("=");
- if (s.length != 2) {
- throw new RuntimeException("Bad variable format: " + def);
- }
- String key = s[0];
- String value = s[1];
- jobManager.addVariableDefinition(key, value);
- }
- }
-
- int runNumber = 0;
- if (cl.hasOption("R")) {
- runNumber = Integer.valueOf(cl.getOptionValue("R"));
- }
-
- jobManager.setup(steeringStream);
- jobManager.configure();
-
- // LCSim event builder.
- LCSimEventBuilder eventBuilder = null;
-
- DatabaseConditionsManager manager = DatabaseConditionsManager.getInstance();
-
- if (cl.hasOption("t")) {
- manager.configure("/org/hps/conditions/config/conditions_database_testrun_2012.xml");
- eventBuilder = new LCSimTestRunEventBuilder();
- } else {
- eventBuilder = new LCSimEngRunEventBuilder();
- }
-
- try {
- manager.setDetector(detectorName, runNumber);
- } catch (ConditionsNotFoundException e) {
- throw new RuntimeException(e);
- }
-
- eventBuilder.setDetectorName(detectorName);
- ConditionsManager.defaultInstance().addConditionsListener(eventBuilder);
-
- for (String evioFileName : cl.getArgs()) {
- // EVIO input file.
- File evioFile = new File(evioFileName);
- System.out.println("Opening file " + evioFileName);
- // EVIO reader.
- EvioReader reader = null;
- try {
- reader = new EvioReader(evioFile);
- } catch (Exception e) {
- throw new RuntimeException(e);
- }
-
- boolean firstEvent = true;
- long time = 0; // in ms
-
- // Loop over EVIO events, build LCSim events, process them, and then
- // write events to disk.
- fileLoop: while (maxEvents == 0 || nEvents < maxEvents) {
- EvioEvent evioEvent = null;
- try {
- eventLoop: while (evioEvent == null) {
- evioEvent = reader.nextEvent();
- if (evioEvent == null) {
- break fileLoop;
- }
- try {
- reader.parseEvent(evioEvent);
- } catch (Exception e) {
- Logger.getLogger(TestRunEvioToLcio.class.getName()).log(Level.SEVERE, "Error reading EVIO event", e);
- continue eventLoop;
- }
- }
- // let event builder check for run information
- eventBuilder.readEvioEvent(evioEvent);
- // Handlers for different event types.
- if (EventConstants.isPreStartEvent(evioEvent)) {
- int[] data = evioEvent.getIntData();
- //int seconds = data[0];
- runNumber = data[1];
- // calibListener.prestart(seconds, runNumber);
- } else if (EventConstants.isEndEvent(evioEvent)) {
- int[] data = evioEvent.getIntData();
- //int seconds = data[0];
- //int nevents = data[2];
- // calibListener.endRun(seconds, nevents);
- } else if (eventBuilder.isPhysicsEvent(evioEvent)) {
- EventHeader lcioEvent = eventBuilder.makeLCSimEvent(evioEvent);
-
- time = (lcioEvent.getTimeStamp() / 1000000);
-
- if (firstEvent) {
- System.out.println("First physics event time: " + time / 1000 + " - " + new Date(time));
- firstEvent = false;
- }
- // if
- // (lcioEvent.hasCollection(BaseRawCalorimeterHit.class,
- // "EcalReadoutHits") &&
- // !lcioEvent.get(BaseRawCalorimeterHit.class,
- // "EcalReadoutHits").isEmpty()) {
- // continue;
- // }
- // if (lcioEvent.hasCollection(TriggerData.class,
- // "TriggerBank")) {
- // List<TriggerData> triggerList =
- // lcioEvent.get(TriggerData.class, "TriggerBank");
- // if (!triggerList.isEmpty()) {
- // TriggerData triggerData = triggerList.get(0);
- //
- // int orTrig = triggerData.getOrTrig();
- // int topTrig = triggerData.getTopTrig();
- // int botTrig = triggerData.getBotTrig();
- // int pairTrig = triggerData.getPairTrig();
- // if (topTrig != 0 && botTrig != 0) {
- // System.out.format("%x\t%x\t%x\t%x\n", orTrig,
- // topTrig, botTrig, pairTrig);
- // } else {
- // continue;
- // }
- // }
- // }
- jobManager.processEvent(lcioEvent);
- if (writer != null) {
- writer.write(lcioEvent);
- writer.flush();
- }
-
- }
- } catch (Exception e) {
- // Catch all event processing errors and continue.
- Logger.getLogger(TestRunEvioToLcio.class.getName()).log(Level.SEVERE, "Error in event processing", e);
- continue;
- } finally {
- if (sleepTime > 0) {
- try {
- Thread.sleep(sleepTime);
- } catch (InterruptedException e) {
- throw new RuntimeException(e);
- }
- }
- }
- nEvents++;
- }
- System.out.println("Last physics event time: " + time / 1000 + " - " + new Date(time));
- try {
- reader.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- System.out.println("No more data");
-
- if (!cl.hasOption("w")) {
- System.out.println("Exiting");
- jobManager.finish();
- System.out.println("jobManager finished");
- }
-
- if (writer != null) {
- System.out.println("close writer");
- try {
- writer.close();
- } catch (IOException e) {
- throw new RuntimeException(e);
- }
- System.out.println("closed writer");
- }
- }
+ // Events with run numbers greater than this will use the new LCSimEngRunEventBuilder.
+ private static final int TEST_RUN_END_RUN = 1365;
+
+ // The default Test Run detector.
+ private static final String DEFAULT_TEST_RUN_DETECTOR = "HPS-TestRun-v8-5";
+
+ // The default Engineering Run detector.
+ private static final String DEFAULT_ENG_RUN_DETECTOR = "HPS-Proposal2014-v8-6pt6";
+
+ // The default steering resource, which basically does nothing except
+ // initialize the conditions system.
+ private static final String DEFAULT_STEERING_RESOURCE = "/org/hps/steering/monitoring/DummyMonitoring.lcsim";
+
+ // The command line options which will be defined in the constructor.
+ Options options = null;
+
+ // The class's logger.
+ Logger logger = LogUtil.create(EvioToLcio.class);
+
+ /**
+ * The default constructor, which defines command line arguments and sets the log level.
+ */
+ protected EvioToLcio() {
+ logger.config("initializing");
+ options = new Options();
+ options.addOption(new Option("l", true, "The name of the output LCIO file"));
+ options.addOption(new Option("d", true, "The name of the detector to use for LCSim conditions"));
+ options.addOption(new Option("x", true, "The XML steeering file to process the LCIO events"));
+ options.addOption(new Option("n", true, "Maximum number of events to process"));
+ options.addOption(new Option("D", true, "Pass a variable to the steering file with format -Dname=value"));
+ options.addOption(new Option("r", false, "Interpret steering from -x argument as a resource instead of a file"));
+ options.addOption(new Option("e", false, "Continue if errors occur during event processing"));
+ options.addOption(new Option("L", true, "Set the log level"));
+ logger.setLevel(Level.FINE);
+ }
+
+ /**
+ * Run the EVIO to LCIO converter from the command line.
+ * @param args The command line arguments.
+ */
+ public static void main(String[] args) {
+ EvioToLcio evioToLcio = new EvioToLcio();
+ evioToLcio.run(args);
+ }
+
+ /**
+ * This method will execute the EVIO to LCIO conversion and perform an
+ * intermediate LCSim job. Then the resultant LCIO events will be written to
+ * disk.
+ * @param args The command line arguments.
+ */
+ public void run(String[] args) {
+
+ int maxEvents = 0;
+ int nEvents = 0;
+
+ // Set up command line parsing.
+ if (args.length == 0) {
+ printUsage();
+ }
+ CommandLineParser parser = new PosixParser();
+
+ // Parse command line arguments.
+ CommandLine cl = null;
+ try {
+ cl = parser.parse(options, args);
+ } catch (ParseException e) {
+ throw new RuntimeException("Problem parsing command line options.",
+ e);
+ }
+
+ // Is the extra argument list empty?
+ if (cl.getArgs().length == 0) {
+ // User didn't supply any EVIO files so exit.
+ printUsage();
+ }
+
+ // Set log level.
+ if (cl.hasOption("L")) {
+ Level level = Level.parse(cl.getOptionValue("L").toUpperCase());
+ logger.config("setting log level to " + level);
+ logger.setLevel(level);
+ }
+
+ String lcioFileName = null;
+ LCIOWriter writer = null;
+ InputStream steeringStream = null;
+
+ // LCIO output file.
+ if (cl.hasOption("l")) {
+ logger.config("set LCIO file to " + lcioFileName);
+ lcioFileName = cl.getOptionValue("l");
+ }
+
+ // LCSim XML file to execute on each event created by the builder.
+ if (cl.hasOption("x")) {
+ String lcsimXmlName = cl.getOptionValue("x");
+ if (cl.hasOption("r")) {
+ steeringStream = EvioToLcio.class.getResourceAsStream(lcsimXmlName);
+ if (steeringStream == null) {
+ logger.severe("Resource " + lcsimXmlName + " was not found.");
+ throw new IllegalArgumentException("Resource was not found.");
+ }
+ logger.config("using steering resource " + lcsimXmlName);
+ } else {
+ try {
+ steeringStream = new FileInputStream(lcsimXmlName);
+ logger.config("using steering file " + lcsimXmlName);
+ } catch (FileNotFoundException e) {
+ logger.severe("The steering file " + lcsimXmlName + " does not exist.");
+ throw new IllegalArgumentException("Steering file does not exist.", e);
+ }
+ }
+ }
+
+ if (steeringStream == null) {
+ steeringStream = EvioToLcio.class.getResourceAsStream(DEFAULT_STEERING_RESOURCE);
+ logger.config("using default steering resource " + DEFAULT_STEERING_RESOURCE);
+ }
+
+ // Max number of events.
+ if (cl.hasOption("n")) {
+ maxEvents = Integer.valueOf(cl.getOptionValue("n"));
+ logger.config("set max events to " + maxEvents);
+ }
+
+ // Whether to continue on errors or stop.
+ boolean continueOnErrors = false;
+ if (cl.hasOption("e")) {
+ continueOnErrors = true;
+ logger.config("continue on errors enabled");
+ }
+
+ // LCIO writer.
+ if (lcioFileName != null) {
+ try {
+ writer = new LCIOWriter(new File(lcioFileName));
+ logger.config("initialized LCIO writer with file " + lcioFileName);
+ } catch (IOException e) {
+ logger.severe("Problem initializing the LCIO writer.");
+ throw new RuntimeException(e);
+ }
+ }
+
+ // LCSim job manager.
+ JobControlManager jobManager = new JobControlManager();
+ if (cl.hasOption("D")) {
+ String[] steeringOptions = cl.getOptionValues("D");
+ for (String def : steeringOptions) {
+ String[] s = def.split("=");
+ if (s.length != 2) {
+ logger.severe("bad variable format: " + def);
+ throw new IllegalArgumentException("Bad variable format: " + def);
+ }
+ String key = s[0];
+ String value = s[1];
+ jobManager.addVariableDefinition(key, value);
+ logger.config("set steering variable: " + key + "=" + value);
+ }
+ }
+ jobManager.setup(steeringStream);
+ jobManager.configure();
+ logger.config("LCSim job manager was successfully configured.");
+
+ // Name of detector.
+ String detectorName = null;
+ if (cl.hasOption("d")) {
+ detectorName = cl.getOptionValue("d");
+ logger.config("user set detector to " + detectorName);
+ }
+
+ // LCSim event builder which will be initialized within the loop based on the run number.
+ LCSimEventBuilder eventBuilder = null;
+
+ for (String evioFileName : cl.getArgs()) {
+ // EVIO input file.
+ File evioFile = new File(evioFileName);
+ if (!evioFile.exists()) {
+ throw new RuntimeException("EVIO file " + evioFile.getPath() + " does not exist.");
+ }
+ logger.info("Opening EVIO file " + evioFileName);
+
+ // EVIO reader.
+ EvioReader reader = null;
+ try {
+ reader = new EvioReader(evioFile);
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+
+ boolean firstEvent = true;
+ long time = 0; // in ms
+
+ // Loop over EVIO events, build LCSim events, process them, and then
+ // write events to disk.
+ fileLoop: while (maxEvents == 0 || nEvents < maxEvents) {
+ EvioEvent evioEvent = null;
+ try {
+ eventLoop: while (evioEvent == null) {
+ evioEvent = reader.nextEvent();
+ if (evioEvent == null) {
+ break fileLoop;
+ }
+ try {
+ reader.parseEvent(evioEvent);
+ } catch (Exception e) {
+ Logger.getLogger(EvioToLcio.class.getName()).log(Level.SEVERE, "Error reading EVIO event.", e);
+ if (!continueOnErrors) {
+ throw new RuntimeException(e);
+ } else {
+ continue eventLoop;
+ }
+ }
+ }
+
+ // Handlers for different event types.
+ if (EventConstants.isPreStartEvent(evioEvent)) {
+
+ int[] data = evioEvent.getIntData();
+ // int seconds = data[0];
+ int runNumber = data[1];
+
+ logger.info("got EVIO pre start event with run #" + runNumber);
+
+ // Has the event builder been initialized?
+ if (eventBuilder == null) {
+ // Initialize the event builder.
+ eventBuilder = setupEventBuilder(detectorName, runNumber);
+ }
+ }
+
+ // Setup state in the LCSimEventBuilder based on the EVIO event.
+ eventBuilder.readEvioEvent(evioEvent);
+
+ if (EventConstants.isEndEvent(evioEvent)) {
+ logger.info("got EVIO end event");
+ // int[] data = evioEvent.getIntData();
+ // int seconds = data[0];
+ // int nevents = data[2];
+ // calibListener.endRun(seconds, nevents);
+ } else if (EventConstants.isPhysicsEvent(evioEvent)) {
+
+ logger.finest("got EVIO physics event #" + evioEvent.getEventNumber());
+
+ // Is the event builder initialized?
+ if (eventBuilder == null) {
+ // This can happen if there are no pre-start events in the EVIO file.
+ throw new RuntimeException( "The LCSimEventBuilder was never setup.");
+ }
+
+ EventHeader lcioEvent = eventBuilder.makeLCSimEvent(evioEvent);
+ logger.finest("created LCIO event #" + lcioEvent.getEventNumber());
+
+ time = (lcioEvent.getTimeStamp() / 1000000);
+
+ if (firstEvent) {
+ logger.info("First physics event time: " + time / 1000 + " - " + new Date(time));
+ firstEvent = false;
+ }
+
+ logger.finest("processing LCIO event in LCSim");
+ jobManager.processEvent(lcioEvent);
+ logger.finest("done processing LCIO event in LCSim");
+ if (writer != null) {
+ writer.write(lcioEvent);
+ writer.flush();
+ logger.finest("wrote LCIO event #" + lcioEvent.getEventNumber());
+ }
+ }
+
+ } catch (Exception e) {
+ logger.log(Level.SEVERE, "Error in LCIO event processing.", e);
+ if (!continueOnErrors) {
+ throw new RuntimeException(e);
+ } else {
+ continue;
+ }
+ }
+ nEvents++;
+ }
+ logger.info("Last physics event time: " + time / 1000 + " - " + new Date(time));
+ try {
+ logger.fine("closing reader");
+ reader.close();
+ logger.fine("reader closed");
+ } catch (IOException e) {
+ logger.log(Level.SEVERE, "An IO error occurred.", e);
+ if (!continueOnErrors) {
+ throw new RuntimeException(e);
+ }
+ }
+ }
+ logger.info("no more data");
+
+ logger.info("executing jobManager.finish");
+ jobManager.finish();
+ logger.info("jobManager is done");
+
+ if (writer != null) {
+ logger.info("closing LCIO writer");
+ try {
+ writer.close();
+ } catch (IOException e) {
+ throw new RuntimeException(e);
+ }
+ logger.info("closed LCIO writer");
+ }
+
+ logger.info("job finished successfully");
+ }
+
+ /**
+ * Print the CLI usage and exit.
+ */
+ private void printUsage() {
+ System.out.println("EvioToLcio [options] [evioFiles]");
+ HelpFormatter help = new HelpFormatter();
+ help.printHelp(" ", options);
+ System.exit(1);
+ }
+
+ /**
+ * Setup and return the LCSimEventBuilder.
+ * @param detectorName The detector name to be assigned to the event builder.
+ * @param runNumber The run number which determines which event builder to use.
+ * @return The LCSimEventBuilder for the Test Run or Engineering Run.
+ */
+ private LCSimEventBuilder setupEventBuilder(String detectorName, int runNumber) {
+ LCSimEventBuilder eventBuilder = null;
+ // Is this run number not part of the Test Run?
+ if (runNumber > EvioToLcio.TEST_RUN_END_RUN) {
+ logger.info("using LCSimEngRunEventBuilder");
+ eventBuilder = new LCSimEngRunEventBuilder();
+ if (detectorName == null) {
+ detectorName = DEFAULT_ENG_RUN_DETECTOR;
+ }
+ } else {
+ // This looks like a Test Run file.
+ logger.info("using LCSimTestRunEventBuilder");
+ eventBuilder = new LCSimTestRunEventBuilder();
+ if (detectorName == null) {
+ detectorName = DEFAULT_TEST_RUN_DETECTOR;
+ }
+ }
+ eventBuilder.setDetectorName(detectorName);
+ ConditionsManager.defaultInstance().addConditionsListener(eventBuilder);
+ logger.config("initialized " + eventBuilder.getClass().getCanonicalName() + " with detector " + detectorName + " and run number " + runNumber);
+ return eventBuilder;
+ }
}
|