hps-java/src/main/java/org/lcsim/hps/evio
diff -u -r1.15 -r1.16
--- EvioFileProducer.java 5 May 2012 19:17:16 -0000 1.15
+++ EvioFileProducer.java 30 May 2012 00:56:23 -0000 1.16
@@ -1,8 +1,11 @@
package org.lcsim.hps.evio;
+import java.io.File;
import java.net.InetAddress;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
+import java.util.ArrayList;
+import java.util.List;
import org.jlab.coda.et.EtAttachment;
import org.jlab.coda.et.EtConstants;
@@ -15,20 +18,24 @@
import org.jlab.coda.jevio.EvioEvent;
import org.jlab.coda.jevio.EvioReader;
+/**
+ *
+ * @author jeremym
+ *
+ */
// This is copied and modified from Carl Timmer's EvioProducer class in et 12 org.jlab.coda.et.apps package.
// TODO Add option to set number of events in put array.
-// TODO Add option for multiple EVIO input files.
public class EvioFileProducer {
- EvioReader reader;
- ByteBuffer byteBuffer;
- String evioFileName;
- String etName, host;
- int port = EtConstants.serverPort;
- int group = 1;
- int size = 10000; // Default event size.
- int delay = 0;
- boolean debug = true;
+ private List<File> evioFiles = new ArrayList<File>();
+ private EvioReader reader;
+ private ByteBuffer byteBuffer;
+ private String etName, host;
+ private int port = EtConstants.serverPort;
+ private int group = 1;
+ private int size = 10000; // Default event size.
+ private int delay = 0;
+ private static final boolean debug = false;
EvioFileProducer() {
}
@@ -58,7 +65,8 @@
try {
for (int i = 0; i < args.length; i++) {
if (args[i].equalsIgnoreCase("-e")) {
- evioFileName = new String(args[++i]);
+ //evioFileName = new String(args[++i]);
+ evioFiles.add(new File(args[++i]));
} else if (args[i].equalsIgnoreCase("-f")) {
etName = args[++i];
} else if (args[i].equalsIgnoreCase("-host")) {
@@ -128,18 +136,27 @@
// ET name is required.
if (etName == null) {
- System.out.println("EVIO file argument is required.");
+ System.out.println("EVIO file name argument is required");
usage();
return;
}
-
- // EVIO file name is required.
- if (evioFileName == null) {
- System.out.println("EVIO file argument is required.");
+
+ if (this.evioFiles.size() == 0) {
+ System.out.println("At least one input EVIO file is required.");
usage();
return;
}
+ // Check existence of EVIO files.
+ System.out.println("EVIO input files ...");
+ for (File evioFile : evioFiles) {
+ System.out.println(evioFile.getPath());
+ if (!evioFile.exists()) {
+ System.err.println("EVIO file does not exist: " + evioFile.getPath());
+ throw new RuntimeException("EVIO input file does not exist.");
+ }
+ }
+
// Setup ET system with the command line config.
EtSystemOpenConfig config = new EtSystemOpenConfig(etName, host, port);
EtSystem sys = new EtSystem(config, EtConstants.debugInfo);
@@ -149,88 +166,99 @@
// array of events
EtEvent[] mevs;
+
+ // Loop over input EVIO file list.
+ for (File evioFile : evioFiles) {
+
+ // Open EVIO reader.
+ System.out.println("Opening next EVIO file: " + evioFile.getPath());
+ reader = new EvioReader(evioFile.getPath());
- // Open EVIO reader.
- reader = new EvioReader(evioFileName);
-
- // Print number of events.
- if (debug) {
- System.out.println("EVIO file opened");
- }
+ // Print number of events.
+ if (debug) {
+ System.out.println("EVIO file opened with " + reader.getEventCount() + " events.");
+ }
- // Event sequence number; starts with 1.
- int eventCount = 1;
+ // Ref to current EVIO event.
+ EvioEvent event;
- // Ref to current EVIO event.
- EvioEvent event;
+ // Event sequence number; starts with 1.
+ int eventCount = 0;
+
+ // Loop until event source is exhausted.
+ while (true) {
- // Loop until event source is exhausted.
- fileLoop:
- while (true) {
+ // Get next event.
+ event = reader.nextEvent();
+ ++eventCount;
+ if (event == null) {
+ break;
+ }
+
+ // Try to parse the next event.
+ try {
+ reader.parseEvent(event);
+ } catch (Exception e) {
+ e.printStackTrace();
+ System.out.println("Error making EVIO event with sequence number <" + eventCount + "> in file <" + evioFile.getPath() + ">.");
+ // Attempt to recover from errors by skipping to next event if there are exceptions.
+ continue;
+ }
- // Get next event.
- event = reader.nextEvent();
- if (event == null) {
- break fileLoop;
- }
- try {
- reader.parseEvent(event);
- } catch (Exception e) {
- e.printStackTrace();
- System.out.println("Error making EVIO event with sequence number <" + eventCount + ">.");
- continue;
- }
+ if (debug) {
+ System.out.println("new events - size=" + size + "; group=" + group);
+ }
- if (debug) {
- System.out.println("new events - size=" + size + "; group=" + group);
- }
+ // Create a new array of ET events. This always has one event.
+ mevs = sys.newEvents(
+ att, // attachment
+ Mode.SLEEP, // wait mode
+ false, // create a buffer
+ 0, // delay
+ 1, // number of events
+ size, // size of event but overwritten later
+ group); // group number; default value is arbitrary
+
+ // Delay for X millis if applicable.
+ if (delay > 0) {
+ Thread.sleep(delay);
+ }
- mevs = sys.newEvents(
- att, // attachment
- Mode.SLEEP, // wait mode
- false, // create a buffer
- 0, // delay
- 1, // number of events
- size, // size of event but overwritten later
- group); // group number; default value is arbitrary
+ // Write the next EVIO event to the EtEvent's buffer.
+ ByteBuffer buf = mevs[0].getDataBuffer();
+ buf.order(ByteOrder.nativeOrder());
+ EventWriter writer = new EventWriter(buf, 100000, 100, null, null);
+ writer.writeEvent(event);
+ try {
+ writer.close();
+ } catch (Exception e) {
+ System.out.println("Caught exception while closing writer.");
+ e.printStackTrace();
+ }
+ mevs[0].setLength(buf.position());
+ mevs[0].setByteOrder(ByteOrder.nativeOrder());
+ if (debug) {
+ for (EtEvent mev : mevs) {
+ System.out.println("event length = " + mev.getLength() + ", remaining bytes: " + mev.getDataBuffer().remaining());
+ }
+ }
- if (delay > 0) {
- Thread.sleep(delay);
- }
+ // Put events onto the ET ring.
+ sys.putEvents(att, mevs);
- // Write EVIO event to EtEvent's buffer.
- ByteBuffer buf = mevs[0].getDataBuffer();
- buf.order(ByteOrder.nativeOrder());
-
- EventWriter writer = new EventWriter(buf, 100000, 100, null, null);
- writer.writeEvent(event);
- try {
- writer.close();
- } catch (Exception e) {
- System.out.println("Caught exception while closing writer.");
- e.printStackTrace();
- }
- mevs[0].setLength(buf.position());
- mevs[0].setByteOrder(ByteOrder.nativeOrder());
- if (debug) {
- for (EtEvent mev : mevs) {
- System.out.println("event length = " + mev.getLength() + ", remaining bytes: " + mev.getDataBuffer().remaining());
+ if (debug) {
+ System.out.println("Wrote event #" + eventCount + " to ET");
+ System.out.println("-------------------------------");
+ ++eventCount;
}
}
- // Put events onto ET ring.
- sys.putEvents(att, mevs);
-
- if (debug) {
- System.out.println("Wrote event #" + eventCount + " to ET");
- System.out.println("-------------------------------");
- ++eventCount;
- }
+ reader.close();
}
// Cleanup.
- sys.close();
- reader.close();
+ sys.close();
+
} catch (Exception e) {
throw new RuntimeException(e);
}