Author: [log in to unmask]
Date: Mon Apr 13 17:23:55 2015
New Revision: 2681
Log:
Code cleanup to record-util module.
Added:
java/trunk/record-util/src/main/java/org/hps/job/package-info.java
java/trunk/record-util/src/main/java/org/hps/record/composite/package-info.java
java/trunk/record-util/src/main/java/org/hps/record/enums/package-info.java
java/trunk/record-util/src/main/java/org/hps/record/epics/package-info.java
java/trunk/record-util/src/main/java/org/hps/record/et/package-info.java
java/trunk/record-util/src/main/java/org/hps/record/evio/package-info.java
java/trunk/record-util/src/main/java/org/hps/record/lcio/package-info.java
java/trunk/record-util/src/main/java/org/hps/record/scalars/package-info.java
Modified:
java/trunk/record-util/src/main/java/org/hps/job/JobManager.java
java/trunk/record-util/src/main/java/org/hps/record/AbstractRecordProcessor.java
java/trunk/record-util/src/main/java/org/hps/record/AbstractRecordQueue.java
java/trunk/record-util/src/main/java/org/hps/record/EndRunException.java
java/trunk/record-util/src/main/java/org/hps/record/LCSimEventBuilder.java
java/trunk/record-util/src/main/java/org/hps/record/MaxRecordsException.java
java/trunk/record-util/src/main/java/org/hps/record/RecordProcessingException.java
java/trunk/record-util/src/main/java/org/hps/record/RecordProcessor.java
java/trunk/record-util/src/main/java/org/hps/record/composite/CompositeLoop.java
java/trunk/record-util/src/main/java/org/hps/record/composite/CompositeLoopAdapter.java
java/trunk/record-util/src/main/java/org/hps/record/composite/CompositeLoopConfiguration.java
java/trunk/record-util/src/main/java/org/hps/record/composite/CompositeRecord.java
java/trunk/record-util/src/main/java/org/hps/record/composite/CompositeRecordProcessor.java
java/trunk/record-util/src/main/java/org/hps/record/composite/CompositeRecordSource.java
java/trunk/record-util/src/main/java/org/hps/record/composite/EtEventAdapter.java
java/trunk/record-util/src/main/java/org/hps/record/composite/EventProcessingThread.java
java/trunk/record-util/src/main/java/org/hps/record/composite/EvioEventAdapter.java
java/trunk/record-util/src/main/java/org/hps/record/composite/LcioEventAdapter.java
java/trunk/record-util/src/main/java/org/hps/record/composite/LcioEventSupplier.java
java/trunk/record-util/src/main/java/org/hps/record/composite/MaxRecordsProcessor.java
java/trunk/record-util/src/main/java/org/hps/record/composite/RecordProcessorAdapter.java
java/trunk/record-util/src/main/java/org/hps/record/enums/DataSourceType.java
java/trunk/record-util/src/main/java/org/hps/record/enums/ProcessingStage.java
java/trunk/record-util/src/main/java/org/hps/record/epics/EpicsEtProcessor.java
java/trunk/record-util/src/main/java/org/hps/record/epics/EpicsEvioProcessor.java
java/trunk/record-util/src/main/java/org/hps/record/epics/EpicsGenericObject.java
java/trunk/record-util/src/main/java/org/hps/record/epics/EpicsScalarData.java
java/trunk/record-util/src/main/java/org/hps/record/et/EtConnection.java
java/trunk/record-util/src/main/java/org/hps/record/et/EtEventProcessor.java
java/trunk/record-util/src/main/java/org/hps/record/et/EtEventQueue.java
java/trunk/record-util/src/main/java/org/hps/record/et/EtEventSource.java
java/trunk/record-util/src/main/java/org/hps/record/et/EtStationThread.java
java/trunk/record-util/src/main/java/org/hps/record/et/PreStartProcessor.java
java/trunk/record-util/src/main/java/org/hps/record/evio/EvioDetectorConditionsProcessor.java
java/trunk/record-util/src/main/java/org/hps/record/evio/EvioEventConstants.java
java/trunk/record-util/src/main/java/org/hps/record/evio/EvioEventProcessor.java
java/trunk/record-util/src/main/java/org/hps/record/evio/EvioEventQueue.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/EvioFileProducer.java
java/trunk/record-util/src/main/java/org/hps/record/evio/EvioFileSource.java
java/trunk/record-util/src/main/java/org/hps/record/lcio/LcioEventQueue.java
java/trunk/record-util/src/main/java/org/hps/record/package-info.java
java/trunk/record-util/src/main/java/org/hps/record/scalars/ScalarData.java
java/trunk/record-util/src/main/java/org/hps/record/scalars/ScalarUtilities.java
java/trunk/record-util/src/main/java/org/hps/record/scalars/ScalarsEvioProcessor.java
java/trunk/record-util/src/main/java/org/hps/record/scalars/ScalarsGenericObject.java
Modified: java/trunk/record-util/src/main/java/org/hps/job/JobManager.java
=============================================================================
--- java/trunk/record-util/src/main/java/org/hps/job/JobManager.java (original)
+++ java/trunk/record-util/src/main/java/org/hps/job/JobManager.java Mon Apr 13 17:23:55 2015
@@ -6,52 +6,59 @@
import org.lcsim.util.Driver;
/**
- * Extension of standard LCSim job manager which does some HPS-specific management
- * of the conditions system.
- *
- * @author Jeremy McCormick <[log in to unmask]>
+ * Extension of standard LCSim job manager which does some HPS-specific management of the conditions system.
+ *
+ * @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a>
*/
public class JobManager extends JobControlManager {
-
+
+ /**
+ * Run the job manager from the command line.
+ *
+ * @param args the command line arguments
+ */
+ public static void main(final String args[]) {
+ // Run the job.
+ final JobManager job = new JobManager();
+ job.run(args);
+ }
+
+ /**
+ * Class constructor.
+ */
public JobManager() {
// Always want to reset conditions system before starting the job.
DatabaseConditionsManager.resetInstance();
}
-
- public static void main(String args[]) {
- // Run the job.
- JobManager job = new JobManager();
- job.run(args);
- }
-
+
/**
- * Override the parent classes method that runs the job in order to do
- * conditions system initialization, if required.
- * @return True if job was successful.
+ * Override the parent classes method that runs the job in order to perform conditions system initialization.
+ *
+ * @return <code>true</code> if job was successful
*/
@Override
- public boolean run() {
-
+ public final boolean run() {
+
// Setup the conditions if there is a ConditionsDriver present.
setupConditions();
-
+
// Run the job.
- boolean result = super.run();
-
- // Close the conditions database connection if it is open.
+ final boolean result = super.run();
+
+ // Close the conditions database connection if it is open.
DatabaseConditionsManager.getInstance().closeConnection();
-
+
return result;
}
/**
- * This method will find the {@link org.hps.conditions.ConditionsDriver} in the
- * list of Drivers registered with the manager and execute its initialization
- * method, which can override the default behavior of the conditions system.
+ * This method will find the {@link org.hps.conditions.ConditionsDriver} in the list of Drivers registered with the
+ * manager and then execute its initialization method, which may override the default behavior of the conditions
+ * system.
*/
private void setupConditions() {
ConditionsDriver conditionsDriver = null;
- for (Driver driver : this.getDriverAdapter().getDriver().drivers()) {
+ for (final Driver driver : this.getDriverAdapter().getDriver().drivers()) {
if (driver instanceof ConditionsDriver) {
conditionsDriver = (ConditionsDriver) driver;
break;
Added: java/trunk/record-util/src/main/java/org/hps/job/package-info.java
=============================================================================
--- java/trunk/record-util/src/main/java/org/hps/job/package-info.java (added)
+++ java/trunk/record-util/src/main/java/org/hps/job/package-info.java Mon Apr 13 17:23:55 2015
@@ -0,0 +1,6 @@
+/**
+ * This package currently contains only a simple extension to the LCSim {@link org.lcsim.job.JobControlManager} class.
+ *
+ * @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a>
+ */
+package org.hps.job;
Modified: java/trunk/record-util/src/main/java/org/hps/record/AbstractRecordProcessor.java
=============================================================================
--- java/trunk/record-util/src/main/java/org/hps/record/AbstractRecordProcessor.java (original)
+++ java/trunk/record-util/src/main/java/org/hps/record/AbstractRecordProcessor.java Mon Apr 13 17:23:55 2015
@@ -1,35 +1,62 @@
package org.hps.record;
-
/**
- * An abstract implementation of {@link RecordProcessor} with "no op" method implementions.
+ * An abstract implementation of {@link RecordProcessor} with "no operation" method implementations.
+ * <p>
* Concrete implementations of <code>RecordProcessor</code> should extend this class.
*
- * @param <RecordType> The type of the record processed by this class.
+ * @param <RecordType> the type of the record processed by this class
+ * @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a>
*/
public abstract class AbstractRecordProcessor<RecordType> implements RecordProcessor<RecordType> {
+ /**
+ * End of job action.
+ */
@Override
- public void startJob() {
+ public void endJob() {
}
+ /**
+ * End of run action.
+ *
+ * @param record the current record being processed
+ */
@Override
- public void startRun(RecordType record) {
+ public void endRun(final RecordType record) {
}
+ /**
+ * Process a record.
+ *
+ * @param record the record to process
+ * @throws Exception never but sub-classes may throw
+ */
@Override
- public void process(RecordType record) throws Exception {
+ public void process(final RecordType record) throws Exception {
}
+ /**
+ * Start of job action.
+ */
@Override
- public void endRun(RecordType record) {
+ public void startJob() {
}
+ /**
+ * Start of run action.
+ *
+ * @param record the current record being processed (usually some kind of start-of-run record such as an EVIO
+ * PRESTART record)
+ */
@Override
- public void endJob() {
+ public void startRun(final RecordType record) {
}
+ /**
+ * Suspend event processing (usually this will not be implemented by a sub-class).
+ */
@Override
- public void suspend() {
+ public void suspend() {
}
}
Modified: java/trunk/record-util/src/main/java/org/hps/record/AbstractRecordQueue.java
=============================================================================
--- java/trunk/record-util/src/main/java/org/hps/record/AbstractRecordQueue.java (original)
+++ java/trunk/record-util/src/main/java/org/hps/record/AbstractRecordQueue.java Mon Apr 13 17:23:55 2015
@@ -9,93 +9,144 @@
import org.freehep.record.source.NoSuchRecordException;
/**
- * Implementation of <tt>AbstractRecordSource</tt> using a dynamic queue that
- * can receive events "on the fly" e.g. from an ET ring. Polling is used in the
- * {@link #next()} method to get the next record, which might not be immediately
- * available.
+ * Implementation of <tt>AbstractRecordSource</tt> using a dynamic queue that can receive events "on the fly", e.g. from
+ * an ET ring.
+ * <p>
+ * Polling is used in the {@link #next()} method to get the next record, which might not be immediately available.
+ *
+ * @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a>
*/
public abstract class AbstractRecordQueue<RecordType> extends AbstractRecordSource {
- // The queue, which is a linked list with blocking behavior.
- BlockingQueue<RecordType> records;
-
- // The current LCIO events.
- RecordType currentRecord;
-
- // The amount of time to wait for an LCIO event from the queue before dying.
+ /**
+ * The current record.
+ */
+ private RecordType currentRecord;
+
+ /**
+ * The record queue which is a linked list with blocking behavior.
+ */
+ private final BlockingQueue<RecordType> records;
+
+ /**
+ * The amount of time to wait for a record to be available in the queue. The default value of -1 will essentially
+ * use a zero wait time.
+ */
long timeOutMillis = -1;
-
-
+
/**
- * Constructor that takes the timeout time in seconds.
- * @param timeoutSeconds the timeout time in seconds
+ * Class constructor.
*/
- public AbstractRecordQueue(long timeoutMillis, int maxSize) {
- this.timeOutMillis = timeoutMillis;
- records = new LinkedBlockingQueue<RecordType>(maxSize);
+ public AbstractRecordQueue() {
+ // Use an unlimited queue size by default.
+ this.records = new LinkedBlockingQueue<RecordType>();
}
-
- public AbstractRecordQueue() {
- // Unlimited queue size.
- records = new LinkedBlockingQueue<RecordType>();
+
+ /**
+ * Class constructor with the timeout in seconds.
+ *
+ * @param timeoutSeconds the timeout in seconds
+ */
+ public AbstractRecordQueue(final long timeOutMillis, final int maxSize) {
+ this.timeOutMillis = timeOutMillis;
+ this.records = new LinkedBlockingQueue<RecordType>(maxSize);
}
-
+
/**
- * Add a record to the queue.
- * If the queue is full, then drain it first.
+ * Add a record to the queue if there is space.
+ *
* @param event the LCIO event to add
*/
- public void addRecord(RecordType record) {
- if (records.remainingCapacity() > 0)
- records.add(record);
- // TODO: Maybe automatically drain the queue here if at capacity???
+ // FIXME: Should drain queue if over capacity.
+ public void addRecord(final RecordType record) {
+ if (this.records.remainingCapacity() > 0) {
+ this.records.add(record);
+ }
}
-
+
+ /**
+ * Get the current record.
+ *
+ * @return the current record
+ * @throws IOException never
+ */
@Override
public Object getCurrentRecord() throws IOException {
- return currentRecord;
+ return this.currentRecord;
}
-
+
+ /**
+ * Return <code>true</code> if there is a current record.
+ *
+ * @return <code>true</code> if there is a current record
+ */
+ @Override
+ public boolean hasCurrent() {
+ return this.currentRecord != null;
+ }
+
+ /**
+ * Return <code>true</code> if there is a next record (e.g. queue is not empty).
+ *
+ * @return <code>true</code> if there is a next record
+ */
+ @Override
+ public boolean hasNext() {
+ return this.records.size() != 0;
+ }
+
+ /**
+ * Load the next record.
+ *
+ * @throws IOException never
+ * @throws NoSuchRecordException if there are no records available from the queue
+ */
+ @Override
+ public void next() throws IOException, NoSuchRecordException {
+ try {
+ if (this.timeOutMillis > 0L) {
+ // Poll the queue for the next record until timeout is exceeded.
+ this.currentRecord = this.records.poll(this.timeOutMillis, TimeUnit.MILLISECONDS);
+ } else {
+ // Poll without an explicit wait time which will immediately return
+ // null if the queue is empty.
+ this.currentRecord = this.records.poll();
+ }
+ } catch (final InterruptedException e) {
+ e.printStackTrace();
+ }
+ if (this.currentRecord == null) {
+ throw new NoSuchRecordException("No records in queue.");
+ }
+ }
+
+ /**
+ * Get the number of records in the queue.
+ *
+ * @return the number of records in the queue
+ */
+ @Override
+ public long size() {
+ return this.records.size();
+ }
+
+ /**
+ * Returns <code>true</code> to indicate current record capability is supported.
+ *
+ * @return <code>true</code> because current record capability is supported
+ */
@Override
public boolean supportsCurrent() {
return true;
}
+ /**
+ * Returns <code>true</code> to indicate next record capability is supported.
+ *
+ * @return <code>true</code> because next record capability is supported
+ */
@Override
public boolean supportsNext() {
return true;
}
-
- @Override
- public boolean hasCurrent() {
- return currentRecord != null;
- }
-
- @Override
- public boolean hasNext() {
- return records.size() != 0;
- }
-
- @Override
- public void next() throws IOException, NoSuchRecordException {
- try {
- if (timeOutMillis > 0L)
- // Poll the queue for the next record or until timeout is exceeded.
- currentRecord = records.poll(timeOutMillis, TimeUnit.MILLISECONDS);
- else
- // Poll without an explicit wait time which will immediately return
- // null if queue is empty.
- currentRecord = records.poll();
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- if (currentRecord == null) {
- throw new NoSuchRecordException("No records in queue.");
- }
- }
-
- @Override
- public long size() {
- return records.size();
- }
}
Modified: java/trunk/record-util/src/main/java/org/hps/record/EndRunException.java
=============================================================================
--- java/trunk/record-util/src/main/java/org/hps/record/EndRunException.java (original)
+++ java/trunk/record-util/src/main/java/org/hps/record/EndRunException.java Mon Apr 13 17:23:55 2015
@@ -1,23 +1,36 @@
package org.hps.record;
/**
- * An Exception thrown when an end run occurs.
+ * An <code>Exception</code> thrown when end of run occurs in event processing.
+ *
+ * @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a>
*/
-public class EndRunException extends RuntimeException {
-
- int runNumber;
-
- public EndRunException(String message, int runNumber) {
+@SuppressWarnings("serial")
+public final class EndRunException extends RuntimeException {
+
+ /**
+ * The run number.
+ */
+ private final int runNumber;
+
+ /**
+ * Class constructor.
+ *
+ * @param message the message
+ * @param runNumber the run number
+ */
+ public EndRunException(final String message, final int runNumber) {
super(message);
this.runNumber = runNumber;
}
-
+
/**
* Get the run number.
+ *
* @return The run number.
*/
public int getRunNumber() {
- return runNumber;
+ return this.runNumber;
}
-
+
}
Modified: java/trunk/record-util/src/main/java/org/hps/record/LCSimEventBuilder.java
=============================================================================
--- java/trunk/record-util/src/main/java/org/hps/record/LCSimEventBuilder.java (original)
+++ java/trunk/record-util/src/main/java/org/hps/record/LCSimEventBuilder.java Mon Apr 13 17:23:55 2015
@@ -5,24 +5,26 @@
import org.lcsim.event.EventHeader;
/**
- * This is an interface that should be implemented by classes that
- * build LCSim events from EVIO raw data.
- * @author Jeremy McCormick <[log in to unmask]>
+ * This is an interface that should be implemented by classes which build LCSim events from EVIO raw data.
+ *
+ * @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a>
*/
public interface LCSimEventBuilder extends ConditionsListener {
/**
- * Read information from an EVIO control event such as go or pre start
- * to set the event builder's state. This does not actually build an
- * LCSim event.
- * @param evioEvent The input EvioEvent.
+ * Build the LCSim event from an EVIO event.
+ *
+ * @param evioEvent the input <code>EvioEvent</code>
+ * @return the LCSim event
+ */
+ EventHeader makeLCSimEvent(EvioEvent evioEvent);
+
+ /**
+ * Read information from an EVIO control event such as a PRESTART event to set the event builder's state.
+ * <p>
+ * This does not actually build an LCSim event.
+ *
+ * @param evioEvent the input <code>EvioEvent</code>
*/
void readEvioEvent(EvioEvent evioEvent);
-
- /**
- * Build the LCSim event from EVIO data.
- * @param evioEvent The input EvioEvent.
- * @return The LCSim event.
- */
- EventHeader makeLCSimEvent(EvioEvent evioEvent);
}
Modified: java/trunk/record-util/src/main/java/org/hps/record/MaxRecordsException.java
=============================================================================
--- java/trunk/record-util/src/main/java/org/hps/record/MaxRecordsException.java (original)
+++ java/trunk/record-util/src/main/java/org/hps/record/MaxRecordsException.java Mon Apr 13 17:23:55 2015
@@ -2,22 +2,35 @@
/**
* Exception thrown when maximum number of records is reached.
+ *
+ * @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a>
*/
-// FIXME: Use loop(nevents) instead of this for controlling number of records run.
-public class MaxRecordsException extends RuntimeException {
+// FIXME: Use loop methods instead of this for controlling number of records run.
+@SuppressWarnings("serial")
+public final class MaxRecordsException extends RuntimeException {
- long maxRecords;
-
- public MaxRecordsException(String message, long maxRecords) {
+ /**
+ * The maximum number of records.
+ */
+ private final long maxRecords;
+
+ /**
+ * Class constructor.
+ *
+ * @param message the message
+ * @param maxRecords the maximum number of records
+ */
+ public MaxRecordsException(final String message, final long maxRecords) {
super(message);
this.maxRecords = maxRecords;
}
-
+
/**
* Get the maximum number of records.
- * @return The maximum number of records.
+ *
+ * @return the maximum number of records
*/
public long getMaxRecords() {
- return maxRecords;
+ return this.maxRecords;
}
}
Modified: java/trunk/record-util/src/main/java/org/hps/record/RecordProcessingException.java
=============================================================================
--- java/trunk/record-util/src/main/java/org/hps/record/RecordProcessingException.java (original)
+++ java/trunk/record-util/src/main/java/org/hps/record/RecordProcessingException.java Mon Apr 13 17:23:55 2015
@@ -1,18 +1,31 @@
package org.hps.record;
/**
- * Generic error type for exceptions that occur during event processing.
- * It extends <code>RuntimeException</code> so that methods need not
- * declare a <code>throws</code> clause in their definitions to use it.
+ * This is a generic error type for exceptions that occur during event processing. It extends
+ * <code>RuntimeException</code> so that methods need not declare a <code>throws</code> clause in order to use it.
+ *
+ * @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a>
*/
-public class RecordProcessingException extends RuntimeException {
-
- public RecordProcessingException(String message, Throwable x) {
+@SuppressWarnings("serial")
+public class RecordProcessingException extends RuntimeException {
+
+ /**
+ * Class constructor.
+ *
+ * @param message the error message
+ */
+ public RecordProcessingException(final String message) {
+ super(message);
+ }
+
+ /**
+ * Class constructor.
+ *
+ * @param message the error message
+ * @param x cause of the error
+ */
+ public RecordProcessingException(final String message, final Throwable x) {
super(message, x);
}
-
- public RecordProcessingException(String message) {
- super(message);
- }
-
+
}
Modified: java/trunk/record-util/src/main/java/org/hps/record/RecordProcessor.java
=============================================================================
--- java/trunk/record-util/src/main/java/org/hps/record/RecordProcessor.java (original)
+++ java/trunk/record-util/src/main/java/org/hps/record/RecordProcessor.java Mon Apr 13 17:23:55 2015
@@ -1,46 +1,48 @@
package org.hps.record;
/**
- * This is a generic interface for event processing which implements
- * hooks for starting the job, starting a new run, processing individual
- * records, ending a run and ending a job. This interface should not
- * be implemented directly. Instead the {@link AbstractRecordProcessor}
- * should be extended with a specific type declaration.
+ * This is a generic interface for event processing which implements hooks for starting the job, starting a new run,
+ * processing individual records, ending a run and ending a job. This interface should not be implemented directly.
+ * Instead the {@link AbstractRecordProcessor} should be extended with a specific type declaration.
*
- * @param <RecordType> The concrete type of the event record.
+ * @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a>
+ * @param <RecordType> the concrete type of the event record
*/
public interface RecordProcessor<RecordType> {
-
+
+ /**
+ * End of job action.
+ */
+ void endJob();
+
+ /**
+ * End of run action.
+ *
+ * @param record the record to process
+ */
+ void endRun(RecordType record);
+
+ /**
+ * Process a single event.
+ *
+ * @param record the record to process
+ */
+ void process(RecordType record) throws Exception;
+
/**
* Start of job action.
*/
void startJob();
-
+
/**
* Start run action.
- * @param record
+ *
+ * @param record the record to process
*/
void startRun(RecordType record);
-
- /**
- * Process a single event.
- * @param record
- */
- void process(RecordType record) throws Exception;
/**
- * End of run action.
- * @param record
- */
- void endRun(RecordType record);
-
- /**
- * End of job action.
- */
- void endJob();
-
- /**
- * Action to be taken when recording processing is suspended.
+ * Suspend processing action.
*/
void suspend();
}
Modified: java/trunk/record-util/src/main/java/org/hps/record/composite/CompositeLoop.java
=============================================================================
--- java/trunk/record-util/src/main/java/org/hps/record/composite/CompositeLoop.java (original)
+++ java/trunk/record-util/src/main/java/org/hps/record/composite/CompositeLoop.java Mon Apr 13 17:23:55 2015
@@ -28,334 +28,367 @@
import org.lcsim.util.loop.LCIOEventSource;
/**
- * Implementation of a composite record loop for processing
- * ET, EVIO and LCIO events using a single record source.
+ * Implementation of a composite record loop for processing ET, EVIO and LCIO events using a single record source.
+ *
+ * @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a>
*/
public final class CompositeLoop extends DefaultRecordLoop {
- CompositeRecordSource recordSource = new CompositeRecordSource();
- List<CompositeLoopAdapter> adapters = new ArrayList<CompositeLoopAdapter>();
-
- boolean paused = false;
- boolean stopOnErrors = true;
-
- CompositeLoopConfiguration config = null;
-
- /**
- * No argument constructor.
- * The {@link #setCompositeLoopConfiguration(CompositeLoopConfiguration)} method must be
- * called on the loop manually.
+ /**
+ * Return <code>true</code> if the Throwable is a type that can be thrown by the ET system when it is attempting to
+ * read events from the server.
+ * <p>
+ * The <code>IOException</code> type is not included here but can actually be thrown by the ET system
+ *
+ * @param e the Exception
+ * @return <code>true</code> if the object can be thrown by ET event reading
+ */
+ private static boolean isEtReadException(final Throwable e) {
+ return e instanceof EtException || e instanceof EtDeadException || e instanceof EtClosedException
+ || e instanceof EtEmptyException || e instanceof EtBusyException || e instanceof EtTimeoutException
+ || e instanceof EtWakeUpException;
+ }
+
+ /**
+ * The list of record adapters that are activated for every record being processed.
+ */
+ private final List<CompositeLoopAdapter> adapters = new ArrayList<CompositeLoopAdapter>();
+
+ /**
+ * The composite loop configuration.
+ */
+ private CompositeLoopConfiguration config = null;
+
+ /**
+ * Paused flag.
+ */
+ private boolean paused = false;
+
+ /**
+ * The record source.
+ */
+ private final CompositeRecordSource recordSource = new CompositeRecordSource();
+
+ /**
+ * Flag to stop on event processing errors.
+ */
+ private boolean stopOnErrors = true;
+
+ /**
+ * Class constructor.
+ * <p>
+ * The {@link #setCompositeLoopConfiguration(CompositeLoopConfiguration)} method must be called on the loop manually
+ * to configure it for processing.
*/
public CompositeLoop() {
- setRecordSource(recordSource);
- }
-
+ setRecordSource(this.recordSource);
+ }
+
/**
* Create the loop with the given configuration.
- * @param config The configuration parameters of the loop.
- */
- public CompositeLoop(CompositeLoopConfiguration config) {
- setRecordSource(recordSource);
+ *
+ * @param config the configuration parameters of the loop
+ */
+ public CompositeLoop(final CompositeLoopConfiguration config) {
+ setRecordSource(this.recordSource);
setCompositeLoopConfiguration(config);
}
-
- /**
- * Set to true in order to have this loop stop on all
- * event processing errors. Certain types of fatal errors
- * will never be ignored.
- * @param stopOnErrors True for this loop to stop on errors.
- */
- public void setStopOnErrors(boolean stopOnErrors) {
- this.stopOnErrors = stopOnErrors;
- }
-
- /**
- * Add a {@link CompositeLoopAdapter} which will process
- * {@link CompositeRecord} objects.
- * @param adapter The CompositeLoopAdapter object.
- */
- public void addAdapter(CompositeLoopAdapter adapter) {
+
+ /**
+ * Add a {@link CompositeLoopAdapter} which will process {@link CompositeRecord} objects.
+ *
+ * @param adapter the CompositeLoopAdapter object
+ */
+ public void addAdapter(final CompositeLoopAdapter adapter) {
addLoopListener(adapter);
- addRecordListener(adapter);
- adapters.add(adapter);
- }
-
- /**
- * Set the <code>RecordSource</code> which provides <code>CompositeRecord</code> objects.
- */
- public final void setRecordSource(RecordSource source) {
- if (!source.getRecordClass().isAssignableFrom(CompositeRecord.class)) {
- throw new IllegalArgumentException("The RecordSource has the wrong class.");
- }
- super.setRecordSource(source);
- }
-
- /**
- * Handle errors from the client such as registered adapters.
- * If the loop is setup to try and continue on errors,
- * only non-fatal record processing exceptions are ignored.
- */
- protected void handleClientError(Throwable x) {
-
+ addRecordListener(adapter);
+ this.adapters.add(adapter);
+ }
+
+ /**
+ * Get the last error that occurred.
+ *
+ * @return the last error that occurred
+ */
+ public Throwable getLastError() {
+ return this._exception;
+ }
+
+ /**
+ * Handle errors from the client including any registered adapters.
+ * <p>
+ * If the loop is setup to try and continue on errors, only non-fatal record processing exceptions are ignored.
+ *
+ * @param x the error that occurred
+ */
+ @Override
+ protected void handleClientError(final Throwable x) {
+
x.printStackTrace();
-
+
// Is the error ignorable?
if (isIgnorable(x)) {
// Ignore the error!
return;
}
-
+
// Set the exception on the super class.
this._exception = x;
-
+
// Stop the event processing.
this.execute(Command.STOP);
}
/**
* Handle errors thrown by the <code>RecordSource</code>.
- */
- protected void handleSourceError(Throwable x) {
+ *
+ * @param x the error that occurred
+ */
+ @Override
+ protected void handleSourceError(final Throwable x) {
x.printStackTrace();
-
+
// Is the error ignorable?
if (isIgnorable(x)) {
// Ignore the error!
return;
}
-
+
// Set the exception on the super class.
this._exception = x;
-
+
// Stop the event processing.
this.execute(Command.STOP);
- }
-
- /**
- * <p>
- * True if an error is ignore-able. If <code>stopOnErrors</code>
- * is true, then this method always returns false. Otherwise,
- * the error cause determines whether the loop can continue
- * processing.
- * <p>
- * The assumption here is that errors coming from event processing
- * of the composite records are caught in the adapters and then wrapped
- * in a {@link org.hps.record.RecordProcessingException}. Certain
- * errors which should never be ignored are also wrapped in a
- * similar way, so we need to check for these error types before
- * assuming that event processing can continue.
- *
- * @param x The error that occurred.
- * @return True if the error can be ignored.
- */
- private boolean isIgnorable(Throwable x) {
- if (!stopOnErrors) {
+ }
+
+ /**
+ * <p>
+ * Return <code>true</code> if an error is ignore-able.
+ * <p>
+ * If <code>stopOnErrors</code> is true, then this method always returns <code>false</code>. Otherwise, the error's
+ * cause determines whether the loop can continue processing.
+ * <p>
+ * The assumption here is that errors coming from event processing of the composite records are caught in the
+ * adapters and then wrapped in a {@link org.hps.record.RecordProcessingException}. Certain errors which should
+ * never be ignored are also wrapped in a similar way, so we need to check for these error types before assuming
+ * that event processing can continue.
+ *
+ * @param x the error that occurred
+ * @return <code>true</code> if the error is ignorable
+ */
+ private boolean isIgnorable(final Throwable x) {
+ if (!this.stopOnErrors) {
if (x instanceof RecordProcessingException) {
- Throwable cause = x.getCause();
- if (cause instanceof MaxRecordsException ||
- cause instanceof EndRunException ||
- cause instanceof NoSuchRecordException ||
- isEtReadException(cause)) {
- // These types of exceptions are never ignored.
- return false;
- } else {
- // Other types of record processing exceptions are considered non-fatal.
- return true;
- }
- }
- }
- return false;
- }
-
- /**
- * True if the Throwable is a type that can be thrown by the ET
- * system when it is attempting to read events from the server.
- * The <code>IOException</code> type is ignored but can actually
- * be thrown.
- * @param e The Exception.
- * @return True if the object can be thrown by ET event reading.
- */
- private static boolean isEtReadException(Throwable e) {
- return e instanceof EtException || e instanceof EtDeadException
- || e instanceof EtClosedException || e instanceof EtEmptyException
- || e instanceof EtBusyException || e instanceof EtTimeoutException
- || e instanceof EtWakeUpException;
- }
-
- /**
- * Get the last error that occurred.
- * @return The last error that occurred.
- */
- public Throwable getLastError() {
- return _exception;
- }
-
- /**
- * Pause the event processing.
- */
- public void pause() {
- execute(Command.PAUSE);
- paused = true;
- }
-
- /**
- * Resume event processing from pause mode.
- */
- public void resume() {
- paused = false;
- }
-
- /**
- * True if loop is paused.
- * @return True if loop is current paused.
+ final Throwable cause = x.getCause();
+ return !(cause instanceof MaxRecordsException || cause instanceof EndRunException
+ || cause instanceof NoSuchRecordException || isEtReadException(cause));
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Return <code>true</code> if the loop is paused.
+ *
+ * @return <code>true</code> if loop is paused
*/
public boolean isPaused() {
- return paused;
- }
-
+ return this.paused;
+ }
+
/**
* Loop over events from the source.
- * @param number The number of events to process or -1 for unlimited.
- * @return The number of records that were processed.
- */
- public long loop(long number) {
+ *
+ * @param number the number of events to process or -1L to process until record source is exhausted
+ * @return the number of records that were processed
+ */
+ public long loop(final long number) {
if (number < 0L) {
execute(Command.GO, true);
} else {
execute(Command.GO_N, number, true);
- execute(Command.STOP);
+ execute(Command.STOP);
}
return getSupplied();
}
-
- public void setConfiguration(Object object) {
- if (object instanceof CompositeLoopConfiguration) {
- setCompositeLoopConfiguration((CompositeLoopConfiguration)object);
- } else {
- throw new IllegalArgumentException("Wrong type of object to configure CompositeLoop: " + object.getClass().getCanonicalName());
- }
- }
-
+
+ /**
+ * Pause the event processing.
+ */
+ public void pause() {
+ execute(Command.PAUSE);
+ this.paused = true;
+ }
+
+ /**
+ * Resume event processing from pause mode.
+ */
+ public void resume() {
+ this.paused = false;
+ }
+
/**
* Configure the loop using a {@link CompositeLoopConfiguration} object.
- * @param config The CompositeLoopConfiguration object containing the loop configuration parameter values.
- */
- void setCompositeLoopConfiguration(CompositeLoopConfiguration config) {
-
+ *
+ * @param config the <code>CompositeLoopConfiguration</code> object containing the loop configuration
+ */
+ private void setCompositeLoopConfiguration(final CompositeLoopConfiguration config) {
+
if (this.config != null) {
throw new RuntimeException("CompositeLoop has already been configured.");
}
-
+
this.config = config;
-
+
EtEventAdapter etAdapter = null;
EvioEventAdapter evioAdapter = null;
LcioEventAdapter lcioAdapter = null;
- CompositeLoopAdapter compositeAdapter = new CompositeLoopAdapter();
-
+ final CompositeLoopAdapter compositeAdapter = new CompositeLoopAdapter();
+
// Was there no RecordSource provided explicitly?
- if (config.recordSource == null) {
+ if (config.getRecordSource() == null) {
// Using an ET server connection?
- if (config.sourceType.equals(DataSourceType.ET_SERVER)) {
- if (config.connection != null)
- etAdapter = new EtEventAdapter(new EtEventSource(config.connection));
- else
+ if (config.getDataSourceType().equals(DataSourceType.ET_SERVER)) {
+ if (config.getEtConnection() != null) {
+ etAdapter = new EtEventAdapter(new EtEventSource(config.getEtConnection()));
+ } else {
throw new IllegalArgumentException("Configuration is missing a valid ET connection.");
- // Using an EVIO file?
- } else if (config.sourceType.equals(DataSourceType.EVIO_FILE)) {
- if (config.filePath != null) {
- evioAdapter = new EvioEventAdapter(new EvioFileSource(new File(config.filePath)));
+ // Using an EVIO file?
+ }
+ } else if (config.getDataSourceType().equals(DataSourceType.EVIO_FILE)) {
+ if (config.getFilePath() != null) {
+ evioAdapter = new EvioEventAdapter(new EvioFileSource(new File(config.getFilePath())));
} else {
throw new IllegalArgumentException("Configuration is missing a file path.");
}
- // Using an LCIO file?
- } else if (config.sourceType.equals(DataSourceType.LCIO_FILE)) {
- if (config.filePath != null)
+ // Using an LCIO file?
+ } else if (config.getDataSourceType().equals(DataSourceType.LCIO_FILE)) {
+ if (config.getFilePath() != null) {
try {
- lcioAdapter = new LcioEventAdapter(new LCIOEventSource(new File(config.filePath)));
- } catch (IOException e) {
+ lcioAdapter = new LcioEventAdapter(new LCIOEventSource(new File(config.getFilePath())));
+ } catch (final IOException e) {
throw new RuntimeException("Error configuring LCIOEventSource.", e);
}
- else
+ } else {
throw new IllegalArgumentException("Configuration is missing a file path.");
- }
- }
-
+ }
+ }
+ }
+
// Configure ET system.
- if (config.sourceType == DataSourceType.ET_SERVER) {
+ if (config.getDataSourceType() == DataSourceType.ET_SERVER) {
addAdapter(etAdapter);
}
-
+
// Configure EVIO processing.
- if (config.processingStage.ordinal() >= ProcessingStage.EVIO.ordinal()) {
- if (config.sourceType.ordinal() <= DataSourceType.EVIO_FILE.ordinal()) {
- if (evioAdapter == null)
+ if (config.getProcessingStage().ordinal() >= ProcessingStage.EVIO.ordinal()) {
+ if (config.getDataSourceType().ordinal() <= DataSourceType.EVIO_FILE.ordinal()) {
+ if (evioAdapter == null) {
evioAdapter = new EvioEventAdapter();
+ }
addAdapter(evioAdapter);
}
}
-
+
// Configure LCIO processing.
- if (config.processingStage.ordinal() >= ProcessingStage.LCIO.ordinal()) {
+ if (config.getProcessingStage().ordinal() >= ProcessingStage.LCIO.ordinal()) {
if (lcioAdapter == null) {
lcioAdapter = new LcioEventAdapter();
}
addAdapter(lcioAdapter);
- if (config.eventBuilder != null) {
- lcioAdapter.setLCSimEventBuilder(config.eventBuilder);
+ if (config.getLCSimEventBuilder() != null) {
+ lcioAdapter.setLCSimEventBuilder(config.getLCSimEventBuilder());
} else {
throw new IllegalArgumentException("Missing an LCSimEventBuilder in configuration.");
}
}
-
+
// Set whether to stop on event processing errors.
- setStopOnErrors(config.stopOnErrors);
-
+ setStopOnErrors(config.getStopOnErrors());
+
// Set whether to stop on end run EVIO records.
- if (evioAdapter != null)
- evioAdapter.setStopOnEndRun(config.stopOnEndRun);
-
+ if (evioAdapter != null) {
+ evioAdapter.setStopOnEndRun(config.getStopOnEndRun());
+ }
+
// Add EtEventProcessors to loop.
if (etAdapter != null) {
- for (EtEventProcessor processor : config.etProcessors) {
+ for (final EtEventProcessor processor : config.getEtProcessors()) {
etAdapter.addProcessor(processor);
}
}
-
+
// Add EvioEventProcessors to loop.
if (evioAdapter != null) {
- for (EvioEventProcessor processor : config.evioProcessors) {
+ for (final EvioEventProcessor processor : config.getEvioProcessors()) {
evioAdapter.addProcessor(processor);
}
}
-
+
// Add Drivers to loop.
if (lcioAdapter != null) {
- for (Driver driver : config.drivers) {
+ for (final Driver driver : config.getDrivers()) {
lcioAdapter.addDriver(driver);
}
}
-
+
// Add CompositeLoopAdapter which should execute last.
addAdapter(compositeAdapter);
-
+
// Add CompositeRecordProcessors to loop.
- for (CompositeRecordProcessor processor : config.compositeProcessors) {
+ for (final CompositeRecordProcessor processor : config.getCompositeProcessors()) {
compositeAdapter.addProcessor(processor);
}
-
- if (config.supplyLcioEvents) {
- addAdapter(new LcioEventSupplier(config.timeout, config.maxQueueSize));
- }
-
+
+ if (config.getSupplyLcioEvents()) {
+ addAdapter(new LcioEventSupplier(config.getTimeout(), config.getMaxQueueSize()));
+ }
+
// Max records was set?
- if (config.maxRecords != -1) {
- compositeAdapter.addProcessor(new MaxRecordsProcessor(config.maxRecords));
- }
- }
-
- public List<CompositeLoopAdapter> getCompositeLoopAdapters() {
- return adapters;
- }
-}
+ if (config.getMaxRecords() != -1) {
+ compositeAdapter.addProcessor(new MaxRecordsProcessor(config.getMaxRecords()));
+ }
+ }
+
+ /**
+ * Set the configuration of the loop.
+ * <p>
+ * For this class, the <code>object</code> should have the type {@link CompositeLoopConfiguration}.
+ *
+ * @param object the configuration object
+ */
+ @Override
+ public void setConfiguration(final Object object) {
+ if (object instanceof CompositeLoopConfiguration) {
+ setCompositeLoopConfiguration((CompositeLoopConfiguration) object);
+ } else {
+ throw new IllegalArgumentException("Wrong type of object to configure CompositeLoop: "
+ + object.getClass().getCanonicalName());
+ }
+ }
+
+ /**
+ * Set the <code>RecordSource</code> which provides <code>CompositeRecord</code> objects.
+ *
+ * @param source the record source
+ */
+ @Override
+ public void setRecordSource(final RecordSource source) {
+ if (!source.getRecordClass().isAssignableFrom(CompositeRecord.class)) {
+ throw new IllegalArgumentException("The RecordSource has the wrong class.");
+ }
+ super.setRecordSource(source);
+ }
+
+ /**
+ * Set to <code>true</code> in order to have this loop stop on all event processing errors.
+ * <p>
+ * Certain types of fatal errors will never be ignored regardless of this setting.
+ *
+ * @param stopOnErrors <code>true</code> for this loop to stop on errors
+ */
+ public void setStopOnErrors(final boolean stopOnErrors) {
+ this.stopOnErrors = stopOnErrors;
+ }
+}
Modified: java/trunk/record-util/src/main/java/org/hps/record/composite/CompositeLoopAdapter.java
=============================================================================
--- java/trunk/record-util/src/main/java/org/hps/record/composite/CompositeLoopAdapter.java (original)
+++ java/trunk/record-util/src/main/java/org/hps/record/composite/CompositeLoopAdapter.java Mon Apr 13 17:23:55 2015
@@ -11,59 +11,71 @@
/**
* Adapter for listening on the {@link CompositeLoop} for records and loop events.
- * Classes that should be part of an "event processing chain" implemented by the
- * {@link CompositeLoop} should extend this API in order to receive {@link CompositeRecord}
- * objects that can be modified.
+ * <p>
+ * Classes that should be part of an event processing chain implemented by the {@link CompositeLoop} should extend this
+ * API in order to receive {@link CompositeRecord} objects that can be read or modified.
+ *
+ * @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a>
*/
public class CompositeLoopAdapter extends AbstractLoopListener implements RecordListener {
- List<CompositeRecordProcessor> processors = new ArrayList<CompositeRecordProcessor>();
+ /**
+ * The list of processors that will be activated for each record this adapter receives.
+ */
+ private final List<CompositeRecordProcessor> processors = new ArrayList<CompositeRecordProcessor>();
/**
- * Add a <tt>CompositeRecordProcessor</tt> that will listen to this loop.
- * @param processor The composite record processor to add.
+ * Add a <code>CompositeRecordProcessor</code> that will process records from the loop as they are received by the
+ * adapter.
+ *
+ * @param processor the record processor to add
*/
- public void addProcessor(CompositeRecordProcessor processor) {
- processors.add(processor);
+ public void addProcessor(final CompositeRecordProcessor processor) {
+ this.processors.add(processor);
}
-
+
/**
- * Callback for loop finish event.
- * @param loopEvent
+ * Action for loop finish event.
+ *
+ * @param loopEvent the <code>LoopEvent</code> with information about record processing session
*/
- public void finish(LoopEvent loopEvent) {
- //System.out.println(this.getClass().getCanonicalName() + ".finish");
+ @Override
+ public void finish(final LoopEvent loopEvent) {
+ // System.out.println(this.getClass().getCanonicalName() + ".finish");
// Call end job hook on all processors.
- for (CompositeRecordProcessor processor : processors) {
+ for (final CompositeRecordProcessor processor : this.processors) {
processor.endJob();
}
}
-
+
/**
- * Start event processing which will call {@link CompositeRecordProcessor#startJob()}
- * on all the registered processors.
- * @param loopEvent
- */
- public void start(LoopEvent loopEvent) {
- for (CompositeRecordProcessor processor : processors) {
- processor.startJob();
- }
- }
-
- /**
- * Process one record.
- * @param record
+ * Process one record with this adapter.
+ *
+ * @param record the record to process
*/
@Override
- public void recordSupplied(RecordEvent record) {
- for (CompositeRecordProcessor processor : processors) {
+ public void recordSupplied(final RecordEvent record) {
+ for (final CompositeRecordProcessor processor : this.processors) {
try {
// Activate the processing step on the CompositeRecord.
processor.process((CompositeRecord) record.getRecord());
- } catch (Exception e) {
+ } catch (final Exception e) {
// Throw the processing error so the loop can perform proper handling of it.
throw new RecordProcessingException("Exception occurred during record processing.", e);
}
}
- }
+ }
+
+ /**
+ * Start event processing which will call {@link CompositeRecordProcessor#startJob()} on all the registered
+ * processors.
+ *
+ * @param loopEvent the <code>LoopEvent</code> which has record processing information about the session
+ */
+ @Override
+ public void start(final LoopEvent loopEvent) {
+ for (final CompositeRecordProcessor processor : this.processors) {
+ processor.startJob();
+ }
+ }
}
Modified: java/trunk/record-util/src/main/java/org/hps/record/composite/CompositeLoopConfiguration.java
=============================================================================
--- java/trunk/record-util/src/main/java/org/hps/record/composite/CompositeLoopConfiguration.java (original)
+++ java/trunk/record-util/src/main/java/org/hps/record/composite/CompositeLoopConfiguration.java Mon Apr 13 17:23:55 2015
@@ -13,215 +13,422 @@
import org.lcsim.util.Driver;
/**
- * A configuration object for the {@link CompositeLoop}.
- *
- * The instance variables are readable within the package,
- * e.g. by {@link CompositeLoop}, but their values must be
- * set through the public set methods when the class is
- * used outside its package.
- *
- * Depending on how this object is setup, some arguments
- * may end up being ignored (e.g. setting a file path
+ * A configuration object for the {@link CompositeLoop}. The instance variables are readable within the package, e.g. by
+ * {@link CompositeLoop}, but their values must be set through the public set methods when the class is used outside its
+ * package. Depending on how this object is setup, some arguments may end up being ignored (e.g. setting a file path
* when actually using an ET server, etc.).
+ *
+ * @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a>
*/
// TODO: Add lcsim steering setting that uses JobControlManager to create Driver list.
-public class CompositeLoopConfiguration {
-
- boolean stopOnErrors = true;
- boolean stopOnEndRun = true;
-
- long maxRecords = -1;
-
- DataSourceType sourceType = DataSourceType.ET_SERVER;
- ProcessingStage processingStage = ProcessingStage.LCIO;
-
- String filePath = null;
- EtConnection connection = null;
- RecordSource recordSource = null;
- LCSimEventBuilder eventBuilder = null;
-
- // Event processors.
- List<EvioEventProcessor> evioProcessors = new ArrayList<EvioEventProcessor>();
- List<Driver> drivers = new ArrayList<Driver>();
- List<CompositeRecordProcessor> compositeProcessors = new ArrayList<CompositeRecordProcessor>();
- List<EtEventProcessor> etProcessors = new ArrayList<EtEventProcessor>();
-
- // Configuration for supplying LCIO events to JAS3 Studio.
- boolean supplyLcioEvents;
- int maxQueueSize = -1;
- long timeout = -1L;
-
- /**
- * Set the full path to a file being used as an event source.
- * This is ignored if the ET system is being used.
- * @param filePath The full path to a file.
+public final class CompositeLoopConfiguration {
+
+ /**
+ * List of composite record processors.
+ */
+ private final List<CompositeRecordProcessor> compositeProcessors = new ArrayList<CompositeRecordProcessor>();
+
+ /**
+ * The ET connection which will be null if not using an ET system.
+ */
+ private EtConnection connection = null;
+
+ /**
+ * The list of LCSim Drivers.
+ */
+ private final List<Driver> drivers = new ArrayList<Driver>();
+
+ /**
+ * The list of ET processors.
+ */
+ private final List<EtEventProcessor> etProcessors = new ArrayList<EtEventProcessor>();
+
+ /**
+ * The LCSim event builder for creating LCIO events from EVIO (can be null).
+ */
+ private LCSimEventBuilder eventBuilder = null;
+
+ /**
+ * The list of EVIO processors.
+ */
+ private final List<EvioEventProcessor> evioProcessors = new ArrayList<EvioEventProcessor>();
+
+ /**
+ * Path to a file source.
+ */
+ private String filePath = null;
+
+ /**
+ * The maximum queue size if using an LCIO record queue.
+ */
+ private int maxQueueSize = -1;
+
+ /**
+ * The maximum number of records to process (-1 for unlimited).
+ */
+ private long maxRecords = -1;
+
+ /**
+ * The processing stage to execute (all prior stages will be included).
+ */
+ private ProcessingStage processingStage = ProcessingStage.LCIO;
+
+ /**
+ * The record source for the loop.
+ */
+ private RecordSource recordSource = null;
+
+ /**
+ * The data source type which defaults to an ET system.
+ */
+ private DataSourceType sourceType = DataSourceType.ET_SERVER;
+
+ /**
+ * Flag for stopping the event processing on end of run.
+ */
+ private boolean stopOnEndRun = true;
+
+ /**
+ * Flag for stopping the event processing on errors.
+ */
+ private boolean stopOnErrors = true;
+
+ /**
+ * Flag to enable supplying events to the JAS3 record source lookup system.
+ */
+ private boolean supplyLcioEvents;
+
+ /**
+ * The timeout on the LCIO record queue in milliseconds, if applicable.
+ */
+ private long timeout = -1L;
+
+ /**
+ * Add a {@link org.hps.record.composite.CompositeRecordProcessor} to the loop.
+ *
+ * @param processor The CompositeRecordProcessor.
* @return This object.
*/
- public CompositeLoopConfiguration setFilePath(String filePath) {
- this.filePath = filePath;
- return this;
- }
-
- /**
- * Set the ET connection parameters.
- * This is ignored if using direct file streaming.
- * @param connection The ET connection parameters.
+ public CompositeLoopConfiguration add(final CompositeRecordProcessor processor) {
+ this.compositeProcessors.add(processor);
+ return this;
+ }
+
+ /**
+ * Add an org.lcsim <code>Driver</code> to the loop.
+ *
+ * @param processor The Driver.
* @return This object.
*/
- public CompositeLoopConfiguration setEtConnection(EtConnection connection) {
- this.connection = connection;
- return this;
- }
-
- /**
- * Set the data source type e.g. ET server, EVIO file or LCIO file.
- * @param sourceType The data source type.
- * @return This object.
- */
- public CompositeLoopConfiguration setDataSourceType(DataSourceType sourceType) {
- this.sourceType = sourceType;
- return this;
- }
-
- /**
- * Set the processing stage to include i.e. ET only, ET to EVIO, or EVIO to LCIO.
- * This may be ignored if the argument does not make sense given the
- * {@link org.hps.record.enums.DataSourceType} of this configuration.
- * @param processingStage The processing stage to include in the record chaining.
- * @return This object.
- */
- public CompositeLoopConfiguration setProcessingStage(ProcessingStage processingStage) {
- this.processingStage = processingStage;
- return this;
- }
-
- /**
- * Set directly the <code>RecordSource</code> that will supply records.
- * @param recordSource The <code>RecordSource</code> that will supply records.
- * @return This object.
- */
- public CompositeLoopConfiguration setRecordSource(RecordSource recordSource) {
- this.recordSource = recordSource;
- return this;
- }
-
- /**
- * Set the <code>LCSimEventBuilder</code> that will be used to translate from raw EVIO
- * events to LCIO.
- *
- * The detector name will be set on this object from within {@link CompositeLoop}.
- *
- * @param eventBuilder The LCSimEventBuilder object.
- * @return This object.
- */
- public CompositeLoopConfiguration setLCSimEventBuilder(LCSimEventBuilder eventBuilder) {
- this.eventBuilder = eventBuilder;
- return this;
- }
-
- /**
- * Set whether the loop will stop when event processing errors occur.
- * Certain types of errors are considered fatal or are used to control
- * the loop and will never be ignored (e.g. ET system errors, etc.).
- * @param stopOnErrors True to stop the loop when errors occur.
- * @return This object.
- */
- public CompositeLoopConfiguration setStopOnErrors(boolean stopOnErrors) {
- this.stopOnErrors = stopOnErrors;
- return this;
- }
-
- /**
- * Set whether loop will stop when an end of run record is encountered
- * e.g. from an EvioEvent.
- * @param stopOnEndRun True to stop on end of run.
- * @return This object.
- */
- public CompositeLoopConfiguration setStopOnEndRun(boolean stopOnEndRun) {
- this.stopOnEndRun = stopOnEndRun;
- return this;
- }
-
- /**
- * Set the maximum number of records to run.
- * @param maxRecords
- * @return
- */
- public CompositeLoopConfiguration setMaxRecords(long maxRecords) {
- if (maxRecords < 1)
- throw new IllegalArgumentException("Invalid maxRecords value: " + maxRecords);
- this.maxRecords = maxRecords;
- return this;
- }
-
- /**
- * Set whether to supply LCIO events to a DataSource that will automatically
- * register itself to JAS3 in order to drive Wired, the LCSim Event Browser, etc.
- * @param supplyLcioEvents True to supply LCIO events to JAS3.
- * @return This object.
- */
- public CompositeLoopConfiguration setSupplyLcioEvents(boolean supplyLcioEvents) {
- this.supplyLcioEvents = supplyLcioEvents;
- return this;
- }
-
- /**
- * Set the max queue size for the LCIO DataSource that hooks into JAS3.
- * @param maxQueueSize The maximum queue size or -1 for unlimited.
- * @return This object.
- */
- public CompositeLoopConfiguration setMaxQueueSize(int maxQueueSize) {
- this.maxQueueSize = maxQueueSize;
- return this;
- }
-
- /**
- * Set the timeout for calling <code>next</code> on the LCIO record queue.
- * @param timeout The timeout in milliseconds.
- * @return This object.
- */
- public CompositeLoopConfiguration setTimeout(long timeout) {
- this.timeout = timeout;
- return this;
- }
-
+ public CompositeLoopConfiguration add(final Driver processor) {
+ this.drivers.add(processor);
+ return this;
+ }
+
/**
* Add an {@link org.hps.record.et.EtEventProcessor} to the loop.
+ *
* @param processor The EtEventProcessor.
* @return This object.
*/
- public CompositeLoopConfiguration add(EtEventProcessor processor) {
- etProcessors.add(processor);
- return this;
- }
-
+ public CompositeLoopConfiguration add(final EtEventProcessor processor) {
+ this.etProcessors.add(processor);
+ return this;
+ }
+
/**
* Add an {@link org.hps.record.evio.EvioEventProcessor} to the loop.
+ *
* @param processor The EvioEventProcessor.
* @return This object.
*/
- public CompositeLoopConfiguration add(EvioEventProcessor processor) {
- evioProcessors.add(processor);
- return this;
- }
-
- /**
- * Add an org.lcsim <code>Driver</code> to the loop.
- * @param processor The Driver.
- * @return This object.
- */
- public CompositeLoopConfiguration add(Driver processor) {
- drivers.add(processor);
- return this;
- }
-
- /**
- * Add a {@link org.hps.record.composite.CompositeRecordProcessor} to the loop.
- * @param processor The CompositeRecordProcessor.
- * @return This object.
- */
- public CompositeLoopConfiguration add(CompositeRecordProcessor processor) {
- compositeProcessors.add(processor);
+ public CompositeLoopConfiguration add(final EvioEventProcessor processor) {
+ this.evioProcessors.add(processor);
+ return this;
+ }
+
+ /**
+ * Get the list of composite record processors.
+ *
+ * @return the list of composite record processors
+ */
+ List<CompositeRecordProcessor> getCompositeProcessors() {
+ return this.compositeProcessors;
+ }
+
+ /**
+ * Get the data source type (EVIO, LCIO or ET).
+ *
+ * @return the data source type
+ */
+ DataSourceType getDataSourceType() {
+ return this.sourceType;
+ }
+
+ /**
+ * Get the list of Drivers to add to the loop.
+ *
+ * @return the list of Drivers
+ */
+ List<Driver> getDrivers() {
+ return this.drivers;
+ }
+
+ /**
+ * Get the ET connection (can be <code>null</code>).
+ *
+ * @return the ET connection
+ */
+ EtConnection getEtConnection() {
+ return this.connection;
+ }
+
+ /**
+ * Get the list of ET event processors.
+ *
+ * @return the list of ET event processors
+ */
+ List<EtEventProcessor> getEtProcessors() {
+ return this.etProcessors;
+ }
+
+ /**
+ * Get the list of EVIO event processors.
+ *
+ * @return the list of EVIO event processors
+ */
+ List<EvioEventProcessor> getEvioProcessors() {
+ return this.evioProcessors;
+ }
+
+ /**
+ * Get the file path of a data source if using a file based source (can be null).
+ *
+ * @return the file path of a data source
+ */
+ String getFilePath() {
+ return this.filePath;
+ }
+
+ /**
+ * Get the builder for creating LCIO events from EVIO.
+ *
+ * @return the event builder
+ */
+ LCSimEventBuilder getLCSimEventBuilder() {
+ return this.eventBuilder;
+ }
+
+ /**
+ * Get the maximum size of the LCIO record queue.
+ *
+ * @return the maximum size of the LCIO record queue
+ */
+ int getMaxQueueSize() {
+ return this.maxQueueSize;
+ }
+
+ /**
+ * Get the maximum number of records to process.
+ *
+ * @return the maximum number of records to process
+ */
+ long getMaxRecords() {
+ return this.maxRecords;
+ }
+
+ /**
+ * Get the processing stage to execute (all prior stages will be executed as well).
+ *
+ * @return the processing stage to execute including prior stages
+ */
+ ProcessingStage getProcessingStage() {
+ return this.processingStage;
+ }
+
+ /**
+ * Get the record source.
+ *
+ * @return the record source
+ */
+ RecordSource getRecordSource() {
+ return this.recordSource;
+ }
+
+ /**
+ * Returns <code>true</code> if stop on end run is enabled.
+ *
+ * @return <code>true</code> if stop on end run is enabled
+ */
+ boolean getStopOnEndRun() {
+ return this.stopOnEndRun;
+ }
+
+ /**
+ * Returns <code>true</code> if stop on errors is enabled.
+ *
+ * @return <code>true</code> if stop on errors is enabled
+ */
+ boolean getStopOnErrors() {
+ return this.stopOnErrors;
+ }
+
+ /**
+ * Returns <code>true</code> if supplying LCIO events to JAS3 is enabled.
+ *
+ * @return <code>true</code> if supplying LCIO events to JAS3 is enabled
+ */
+ boolean getSupplyLcioEvents() {
+ return this.supplyLcioEvents;
+ }
+
+ /**
+ * Get the LCIO event queue timeout in milliseconds.
+ *
+ * @return the LCIO event queue timeout in milliseconds
+ */
+ long getTimeout() {
+ return this.timeout;
+ }
+
+ /**
+ * Set the data source type e.g. ET server, EVIO file or LCIO file.
+ *
+ * @param sourceType the data source type
+ * @return this object
+ */
+ public CompositeLoopConfiguration setDataSourceType(final DataSourceType sourceType) {
+ this.sourceType = sourceType;
+ return this;
+ }
+
+ /**
+ * Set the ET connection parameters. This is ignored if using direct file streaming.
+ *
+ * @param connection the ET connection parameters
+ * @return this object
+ */
+ public CompositeLoopConfiguration setEtConnection(final EtConnection connection) {
+ this.connection = connection;
+ return this;
+ }
+
+ /**
+ * Set the full path to a file being used as an event source. This is ignored if the ET system is being used.
+ *
+ * @param filePath the full path to a file
+ * @return this object
+ */
+ public CompositeLoopConfiguration setFilePath(final String filePath) {
+ this.filePath = filePath;
+ return this;
+ }
+
+ /**
+ * Set the <code>LCSimEventBuilder</code> that will be used to translate from raw EVIO events to LCIO. The detector
+ * name will be set on this object from within {@link CompositeLoop}.
+ *
+ * @param eventBuilder the LCSimEventBuilder object
+ * @return this object
+ */
+ public CompositeLoopConfiguration setLCSimEventBuilder(final LCSimEventBuilder eventBuilder) {
+ this.eventBuilder = eventBuilder;
+ return this;
+ }
+
+ /**
+ * Set the max queue size for the LCIO DataSource that hooks into JAS3.
+ *
+ * @param maxQueueSize the maximum queue size or -1 for unlimited
+ * @return this object
+ */
+ public CompositeLoopConfiguration setMaxQueueSize(final int maxQueueSize) {
+ this.maxQueueSize = maxQueueSize;
+ return this;
+ }
+
+ /**
+ * Set the maximum number of records.
+ *
+ * @param maxRecords the maximum number of records
+ * @return the maximum number of records
+ */
+ public CompositeLoopConfiguration setMaxRecords(final long maxRecords) {
+ if (maxRecords < 1) {
+ throw new IllegalArgumentException("Invalid maxRecords value: " + maxRecords);
+ }
+ this.maxRecords = maxRecords;
+ return this;
+ }
+
+ /**
+ * Set the processing stage to include i.e. ET only, ET to EVIO, or all three.
+ * <p>
+ * This may be ignored if the argument does not make sense given the {@link org.hps.record.enums.DataSourceType} of
+ * this configuration.
+ *
+ * @param processingStage the processing stages to execute
+ * @return this object
+ */
+ public CompositeLoopConfiguration setProcessingStage(final ProcessingStage processingStage) {
+ this.processingStage = processingStage;
+ return this;
+ }
+
+ /**
+ * Set directly the <code>RecordSource</code> that will supply records.
+ *
+ * @param recordSource the <code>RecordSource</code> that will supply records
+ * @return this object
+ */
+ public CompositeLoopConfiguration setRecordSource(final RecordSource recordSource) {
+ this.recordSource = recordSource;
+ return this;
+ }
+
+ /**
+ * Set whether loop will stop when an end of run record is encountered e.g. from an EvioEvent.
+ *
+ * @param stopOnEndRun <code>true</code> to stop on end of run
+ * @return this object
+ */
+ public CompositeLoopConfiguration setStopOnEndRun(final boolean stopOnEndRun) {
+ this.stopOnEndRun = stopOnEndRun;
+ return this;
+ }
+
+ /**
+ * Set whether the loop will stop when event processing errors occur. Certain types of errors are considered fatal
+ * or are used to control the loop and will never be ignored (e.g. ET system errors, etc.).
+ *
+ * @param stopOnErrors <code>true</code> to stop the loop when errors occur
+ * @return this object
+ */
+ public CompositeLoopConfiguration setStopOnErrors(final boolean stopOnErrors) {
+ this.stopOnErrors = stopOnErrors;
+ return this;
+ }
+
+ /**
+ * Set whether to supply LCIO events to a DataSource that will automatically register itself to JAS3 in order to
+ * activate Wired, the LCSim Event Browser, etc.
+ *
+ * @param supplyLcioEvents <code>true</code> to supply LCIO events to JAS3
+ * @return this object
+ */
+ public CompositeLoopConfiguration setSupplyLcioEvents(final boolean supplyLcioEvents) {
+ this.supplyLcioEvents = supplyLcioEvents;
+ return this;
+ }
+
+ /**
+ * Set the timeout when calling <code>next</code> on the LCIO record queue.
+ *
+ * @param timeout the timeout in milliseconds
+ * @return this object
+ */
+ public CompositeLoopConfiguration setTimeout(final long timeout) {
+ this.timeout = timeout;
return this;
}
}
Modified: java/trunk/record-util/src/main/java/org/hps/record/composite/CompositeRecord.java
=============================================================================
--- java/trunk/record-util/src/main/java/org/hps/record/composite/CompositeRecord.java (original)
+++ java/trunk/record-util/src/main/java/org/hps/record/composite/CompositeRecord.java Mon Apr 13 17:23:55 2015
@@ -5,97 +5,126 @@
import org.lcsim.event.EventHeader;
/**
- * This class is used to group together corresponding ET, EVIO and LCIO events
- * for use by the {@link CompositeLoop}. The loop's <code>RecordListener</code>
- * objects may alter this record by setting references to event objects
- * such as an <code>EvioEvent</code>.
+ * This class is used to group together corresponding ET, EVIO and LCIO events for use by the {@link CompositeLoop}. The
+ * loop's <code>RecordListener</code> objects may alter this record by setting references to event objects such as an
+ * <code>EvioEvent</code>.
+ *
+ * @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a>
*/
public final class CompositeRecord {
-
- EtEvent etEvent;
- EvioEvent evioEvent;
- EventHeader lcioEvent;
-
- int sequenceNumber = -1;
- int eventNumber = -1;
-
+
+ /**
+ * The ET event.
+ */
+ private EtEvent etEvent;
+
+ /**
+ * The event number.
+ */
+ private int eventNumber = -1;
+
+ /**
+ * The EVIO event.
+ */
+ private EvioEvent evioEvent;
+
+ /**
+ * The LCIO/LCSim event.
+ */
+ private EventHeader lcioEvent;
+
+ /**
+ * The event's sequence number.
+ */
+ private int sequenceNumber = -1;
+
+ /**
+ * Get the <code>EtEvent</code>.
+ *
+ * @return the EtEvent
+ */
+ public EtEvent getEtEvent() {
+ return this.etEvent;
+ }
+
+ /**
+ * Get the event number.
+ *
+ * @return the event number
+ */
+ public int getEventNumber() {
+ return this.eventNumber;
+ }
+
+ /**
+ * Get the <code>EvioEvent</code>.
+ *
+ * @return the EvioEvent
+ */
+ public EvioEvent getEvioEvent() {
+ return this.evioEvent;
+ }
+
+ /**
+ * Get the org.lcsim event.
+ *
+ * @return the org.lcsim event
+ */
+ public EventHeader getLcioEvent() {
+ return this.lcioEvent;
+ }
+
+ /**
+ * Get the event sequence number.
+ *
+ * @return the event sequence number
+ */
+ public int getSequenceNumber() {
+ return this.sequenceNumber;
+ }
+
+ /**
+ * Set a reference to an <code>EtEvent</code>.
+ *
+ * @param etEvent the EtEvent
+ */
+ public void setEtEvent(final EtEvent etEvent) {
+ this.etEvent = etEvent;
+ }
+
+ /**
+ * Set the event number of this record e.g. from EVIO or LCIO.
+ *
+ * @param eventNumber the event number of this record
+ */
+ public void setEventNumber(final int eventNumber) {
+ this.eventNumber = eventNumber;
+ }
+
+ /**
+ * Set a reference to an <code>EvioEvent</code>.
+ *
+ * @param evioEvent the EvioEvent
+ */
+ public void setEvioEvent(final EvioEvent evioEvent) {
+ this.evioEvent = evioEvent;
+ }
+
+ /**
+ * Set a reference to an org.lcsim LCIO event (EventHeader).
+ *
+ * @param lcioEvent the LCIO EventHeader
+ */
+ public void setLcioEvent(final EventHeader lcioEvent) {
+ this.lcioEvent = lcioEvent;
+ }
+
/**
* Set the sequence number of this record.
- * @param sequenceNumber The sequence number.
+ *
+ * @param sequenceNumber the event sequence number
*/
- public void setSequenceNumber(int sequenceNumber) {
+ public void setSequenceNumber(final int sequenceNumber) {
this.sequenceNumber = sequenceNumber;
}
-
- /**
- * Set the event number of this record e.g. from EVIO or LCIO.
- * @param eventNumber The event number of this recrod.
- */
- public void setEventNumber(int eventNumber) {
- this.eventNumber = eventNumber;
- }
-
- /**
- * Set a reference to an <code>EtEvent</code>.
- * @param etEvent The EtEvent.
- */
- public void setEtEvent(EtEvent etEvent) {
- this.etEvent = etEvent;
- }
-
- /**
- * Set a reference to an <code>EvioEvent</code>.
- * @param evioEvent The EvioEvent.
- */
- public void setEvioEvent(EvioEvent evioEvent) {
- this.evioEvent = evioEvent;
- }
-
- /**
- * Set a reference to an org.lcsim LCIO event (EventHeader).
- * @param lcioEvent The LCIO EventHeader.
- */
- public void setLcioEvent(EventHeader lcioEvent) {
- this.lcioEvent = lcioEvent;
- }
-
- /**
- * Get the <code>EtEvent</code>.
- * @return The EtEvent.
- */
- public EtEvent getEtEvent() {
- return etEvent;
- }
-
- /**
- * Get the <code>EvioEvent</code>.
- * @return The EvioEvent.
- */
- public EvioEvent getEvioEvent() {
- return evioEvent;
- }
-
- /**
- * Get the org.lcsim event.
- * @return The org.lcsim event.
- */
- public EventHeader getLcioEvent() {
- return lcioEvent;
- }
-
- /**
- * Get the event sequence number.
- * @return The event sequence number.
- */
- public int getSequenceNumber() {
- return sequenceNumber;
- }
-
- /**
- * Get the event number.
- * @return The event number.
- */
- public int getEventNumber() {
- return eventNumber;
- }
}
Modified: java/trunk/record-util/src/main/java/org/hps/record/composite/CompositeRecordProcessor.java
=============================================================================
--- java/trunk/record-util/src/main/java/org/hps/record/composite/CompositeRecordProcessor.java (original)
+++ java/trunk/record-util/src/main/java/org/hps/record/composite/CompositeRecordProcessor.java Mon Apr 13 17:23:55 2015
@@ -3,8 +3,9 @@
import org.hps.record.AbstractRecordProcessor;
/**
- * An <code>EventProcessor</code> implementation for processing <code>CompositeRecord</code>
- * records.
+ * An <code>EventProcessor</code> implementation for processing <code>CompositeRecord</code> records.
+ *
+ * @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a>
*/
public abstract class CompositeRecordProcessor extends AbstractRecordProcessor<CompositeRecord> {
}
Modified: java/trunk/record-util/src/main/java/org/hps/record/composite/CompositeRecordSource.java
=============================================================================
--- java/trunk/record-util/src/main/java/org/hps/record/composite/CompositeRecordSource.java (original)
+++ java/trunk/record-util/src/main/java/org/hps/record/composite/CompositeRecordSource.java Mon Apr 13 17:23:55 2015
@@ -6,49 +6,61 @@
import org.freehep.record.source.NoSuchRecordException;
/**
- * A record source providing <code>CompositeRecord</code> objects
- * that can be accessed and/or modified by <code>RecordListener</code>
- * objects on the loop. This is essentially a minimal implementation
- * that does not support advanced operations like rewind or index.
+ * A record source providing <code>CompositeRecord</code> objects that can be accessed and/or modified by
+ * <code>RecordListener</code> objects on the loop. This is essentially a minimal implementation that does not support
+ * advanced operations like rewind or index.
+ *
+ * @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a>
*/
public final class CompositeRecordSource extends AbstractRecordSource {
+ /**
+ * The current record.
+ */
CompositeRecord currentRecord;
+
+ /**
+ * The sequence number.
+ */
int sequenceNumber = 1;
-
+
+ /**
+ * Get the current {@link CompositeRecord}.
+ *
+ * @return the current CompositeRecord
+ */
+ @Override
+ public Object getCurrentRecord() throws IOException {
+ return this.currentRecord;
+ }
+
+ /**
+ * Return <code>true</code> if source has a current record.
+ *
+ * @return <code>true</code> if this source has a current record
+ */
+ @Override
+ public boolean hasCurrent() {
+ return this.currentRecord != null;
+ }
+
/**
* Load the next record which is then accessible using {@link #getCurrentRecord()}.
*/
+ @Override
public void next() throws IOException, NoSuchRecordException {
- currentRecord = new CompositeRecord();
- currentRecord.setSequenceNumber(sequenceNumber);
- ++sequenceNumber;
+ this.currentRecord = new CompositeRecord();
+ this.currentRecord.setSequenceNumber(this.sequenceNumber);
+ ++this.sequenceNumber;
}
-
+
/**
- * Get the current {@link CompositeRecord}.
- * @return The current CompositeRecord.
- */
- @Override
- public Object getCurrentRecord() throws IOException {
- return currentRecord;
- }
-
- /**
- * Get whether this source supports the next command (true).
- * @return Whether this source supports the next command.
+ * Return <code>true</code> to indicate next record capability is supported.
+ *
+ * @return <code>true</code> to indicate next record capability is supported
*/
@Override
public boolean supportsNext() {
return true;
}
-
- /**
- * Get whether this source has a current record.
- * @return Whether this source has a current record.
- */
- @Override
- public boolean hasCurrent() {
- return currentRecord != null;
- }
}
Modified: java/trunk/record-util/src/main/java/org/hps/record/composite/EtEventAdapter.java
=============================================================================
--- java/trunk/record-util/src/main/java/org/hps/record/composite/EtEventAdapter.java (original)
+++ java/trunk/record-util/src/main/java/org/hps/record/composite/EtEventAdapter.java Mon Apr 13 17:23:55 2015
@@ -10,34 +10,42 @@
/**
* An adapter for directly using the CompositeLoop to supply and process EtEvents.
+ *
+ * @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a>
*/
public class EtEventAdapter extends RecordProcessorAdapter<EtEvent> {
- EtEventSource source;
-
/**
- * Constructor with an {@link org.hps.record.et.EtEventSource}
- * that supplies <code>EtEvent</code> records through a network
- * ET server.
- * @param source The event source.
+ * The ET event source.
*/
- public EtEventAdapter(EtEventSource source) {
+ private final EtEventSource source;
+
+ /**
+ * Constructor with an {@link org.hps.record.et.EtEventSource} that supplies <code>EtEvent</code> records through a
+ * network ET server.
+ *
+ * @param source the event source
+ */
+ public EtEventAdapter(final EtEventSource source) {
this.source = source;
}
-
+
/**
- * Process one record which will get the next <code>EtEvent</code>
- * from the source and set a reference to it on the {@link CompositeRecord}.
+ * Process one record which will get the next <code>EtEvent</code> from the source and set a reference to it on the
+ * {@link CompositeRecord}.
+ *
+ * @param record the current composite record
*/
- public void recordSupplied(RecordEvent record) {
- CompositeRecord compositeRecord = (CompositeRecord) record.getRecord();
+ @Override
+ public void recordSupplied(final RecordEvent record) {
+ final CompositeRecord compositeRecord = (CompositeRecord) record.getRecord();
try {
- source.next();
- if (source.getCurrentRecord() != null) {
- compositeRecord.setEtEvent((EtEvent) source.getCurrentRecord());
+ this.source.next();
+ if (this.source.getCurrentRecord() != null) {
+ compositeRecord.setEtEvent((EtEvent) this.source.getCurrentRecord());
} else {
throw new NoSuchRecordException("No current ET record available from source.");
- }
+ }
process(compositeRecord.getEtEvent());
} catch (IOException | NoSuchRecordException e) {
throw new RecordProcessingException("Error processing ET record.", e);
Modified: java/trunk/record-util/src/main/java/org/hps/record/composite/EventProcessingThread.java
=============================================================================
--- java/trunk/record-util/src/main/java/org/hps/record/composite/EventProcessingThread.java (original)
+++ java/trunk/record-util/src/main/java/org/hps/record/composite/EventProcessingThread.java Mon Apr 13 17:23:55 2015
@@ -4,49 +4,55 @@
/**
* Class for running the {@link CompositeLoop} on a separate thread.
+ *
+ * @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a>
*/
public final class EventProcessingThread extends Thread {
-
- CompositeLoop loop;
-
+
/**
- * Constructor requiring the loop object.
- * @param loop The loop object.
+ * The composite record loop.
*/
- public EventProcessingThread(CompositeLoop loop) {
+ private final CompositeLoop loop;
+
+ /**
+ * Class constructor, requiring the loop object for record processing.
+ *
+ * @param loop the loop object
+ */
+ public EventProcessingThread(final CompositeLoop loop) {
super("EventProcessingThread");
this.loop = loop;
}
-
+
/**
* Run this thread, which will process records until the loop is done.
*/
@Override
- public void run() {
-
+ public void run() {
+
// Flag that is turned on when looping starts.
boolean started = false;
-
+
// Keep looping until the event processing is done.
- while (true) {
-
+ while (true) {
+
// If the loop was started and now is in the IDLE state, it means
// that STOP was executed, so break from the processing while loop.
- if (started && loop.getState().equals(RecordLoop.State.IDLE)) {
+ if (started && this.loop.getState().equals(RecordLoop.State.IDLE)) {
// Stop record processing.
break;
}
-
- // Is the processing unpaused?
- if (!loop.isPaused()) {
-
+
+ // Is the processing not paused?
+ if (!this.loop.isPaused()) {
+
// Set a flag to indicate that looping has started.
started = true;
-
+
// Loop until done, error occurs, or pause is requested.
- // FIXME: The maximum number of records should be used here.
- loop.loop(-1);
- }
+ // FIXME: The maximum number of records should be used here instead.
+ this.loop.loop(-1);
+ }
}
}
-}
+}
Modified: java/trunk/record-util/src/main/java/org/hps/record/composite/EvioEventAdapter.java
=============================================================================
--- java/trunk/record-util/src/main/java/org/hps/record/composite/EvioEventAdapter.java (original)
+++ java/trunk/record-util/src/main/java/org/hps/record/composite/EvioEventAdapter.java Mon Apr 13 17:23:55 2015
@@ -18,40 +18,57 @@
/**
* An adapter for directly using the CompositeLoop to supply and process EvioEvents.
+ *
+ * @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a>
*/
public class EvioEventAdapter extends RecordProcessorAdapter<EvioEvent> {
-
- AbstractRecordSource source;
- boolean stopOnEndRun = true;
-
+
/**
- * Constructor that takes a record source.
- * @param source The record source.
+ * The record source.
*/
- public EvioEventAdapter(AbstractRecordSource source) {
- this.source = source;
- }
-
+ private AbstractRecordSource source;
+
/**
- * No argument constructor for when ET will be converted to EVIO.
+ * Flag to stop processing when an END event is received.
+ */
+ private boolean stopOnEndRun = true;
+
+ /**
+ * No argument constructor, for when ET events will be converted to EVIO.
*/
public EvioEventAdapter() {
}
-
+
/**
- * Set whether to stop when end run records are received.
- * @param stopOnEndRun True to stop on end run EVIO records.
+ * Constructor that takes a record source.
+ *
+ * @param source the record source
*/
- public void setStopOnEndRun(boolean stopOnEndRun) {
- this.stopOnEndRun = stopOnEndRun;
+ public EvioEventAdapter(final AbstractRecordSource source) {
+ this.source = source;
}
-
+
/**
- * Process one record which will create an <code>EvioEvent</code> or
- * get it from the source and set a reference to it on the {@link CompositeRecord}.
+ * Create an <code>EvioEvent</code> from an <code>EtEvent</code> byte buffer.
+ *
+ * @param etEvent the input <code>EtEvent</code>
+ * @return the <code>EvioEvent</code> created from the <code>EtEvent</code>
+ * @throws IOException if there is an IO problem from EVIO
+ * @throws EvioException if there is any EVIO related error when creating the event
+ * @throws BufferUnderflowException if there isn't enough data in the byte buffer
*/
- public void recordSupplied(RecordEvent record) {
- CompositeRecord compositeRecord = (CompositeRecord) record.getRecord();
+ private EvioEvent createEvioEvent(final EtEvent etEvent) throws IOException, EvioException,
+ BufferUnderflowException {
+ return new EvioReader(etEvent.getDataBuffer()).parseNextEvent();
+ }
+
+ /**
+ * Process one record which will create an <code>EvioEvent</code> or get it from the source and set a reference to
+ * it on the {@link CompositeRecord}.
+ */
+ @Override
+ public void recordSupplied(final RecordEvent record) {
+ final CompositeRecord compositeRecord = (CompositeRecord) record.getRecord();
try {
EvioEvent evioEvent;
// Using ET system?
@@ -64,10 +81,10 @@
throw new RecordProcessingException("Failed to create EvioEvent from EtEvent.", e);
}
} else {
- // Load the next record from the EVIO record source.
- if (source.hasNext()) {
- source.next();
- evioEvent = (EvioEvent)source.getCurrentRecord();
+ // Load the next record from the EVIO record source.
+ if (this.source.hasNext()) {
+ this.source.next();
+ evioEvent = (EvioEvent) this.source.getCurrentRecord();
} else {
throw new NoSuchRecordException("EVIO event source has no more records.");
}
@@ -77,65 +94,64 @@
// Throw an error because EvioEvent was not created.
throw new NoSuchRecordException("Failed to get next EVIO record.");
}
-
+
// Set event number on the EvioEvent.
setEventNumber(evioEvent);
-
+
// Is pre start event?
if (EvioEventUtilities.isPreStartEvent(evioEvent)) {
// Activate start of run hook on processors.
startRun(evioEvent);
- // Is end run event?
+ // Is end run event?
} else if (EvioEventUtilities.isEndEvent(evioEvent)) {
// Activate end of run hook on processors.
endRun(evioEvent);
-
+
// Stop on end run enabled?
- if (stopOnEndRun) {
+ if (this.stopOnEndRun) {
// Throw exception to stop processing from end run.
throw new EndRunException("EVIO end event received.", evioEvent.getIntData()[1]);
- }
- // Is physics event?
+ }
+ // Is physics event?
} else if (EvioEventUtilities.isPhysicsEvent(evioEvent)) {
// Process a single physics EvioEvent.
process(evioEvent);
}
-
+
// Set EvioEvent on CompositeRecord.
compositeRecord.setEvioEvent(evioEvent);
} catch (IOException | NoSuchRecordException e) {
throw new RecordProcessingException("No next EVIO record available from source.", e);
- }
+ }
}
-
- /**
- * Create an EvioEvent from an EtEvent byte buffer.
- * @param etEvent The input EtEvent.
- * @return The EvioEvent created from the EtEvent.
- * @throws IOException
- * @throws EvioException
- * @throws BufferUnderflowException
- */
- private EvioEvent createEvioEvent(EtEvent etEvent)
- throws IOException, EvioException, BufferUnderflowException {
- return (new EvioReader(etEvent.getDataBuffer())).parseNextEvent();
- }
-
+
/**
* Set the EVIO event number manually from the event ID bank.
- * @param evioEvent The <tt>EvioEvent</tt> on which to set the event number.
+ *
+ * @param evioEvent the <code>EvioEvent</code> on which to set the event number
*/
- private void setEventNumber(EvioEvent evioEvent) {
+ private void setEventNumber(final EvioEvent evioEvent) {
int eventNumber = -1;
- if (evioEvent.getChildren() != null) {
- for (BaseStructure bank : evioEvent.getChildren()) {
+ if (evioEvent.getChildrenList() != null) {
+ for (final BaseStructure bank : evioEvent.getChildrenList()) {
if (bank.getHeader().getTag() == EvioEventConstants.EVENTID_BANK_TAG) {
eventNumber = bank.getIntData()[0];
break;
}
}
}
- if (eventNumber != -1)
+ if (eventNumber != -1) {
evioEvent.setEventNumber(eventNumber);
- }
+ }
+ }
+
+ /**
+ * Returns <code>true</code> if processing should be stopped when end of run occurs, e.g. from an EVIO END record
+ * being received.
+ *
+ * @param stopOnEndRun <code>true</code> to stop after EVIO END records are received
+ */
+ public final void setStopOnEndRun(final boolean stopOnEndRun) {
+ this.stopOnEndRun = stopOnEndRun;
+ }
}
Modified: java/trunk/record-util/src/main/java/org/hps/record/composite/LcioEventAdapter.java
=============================================================================
--- java/trunk/record-util/src/main/java/org/hps/record/composite/LcioEventAdapter.java (original)
+++ java/trunk/record-util/src/main/java/org/hps/record/composite/LcioEventAdapter.java Mon Apr 13 17:23:55 2015
@@ -15,85 +15,106 @@
import org.lcsim.util.DriverAdapter;
/**
- * An adapter to supply and process LCSim EventHeader objects using
- * an (optional) LCSimEventBuilder and the existing DriverAdapter class.
+ * An adapter to supply and process LCSim EventHeader objects using an (optional) LCSimEventBuilder and the existing
+ * DriverAdapter class.
+ *
+ * @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a>
*/
public class LcioEventAdapter extends CompositeLoopAdapter {
- DriverAdapter drivers;
- Driver top = new Driver();
- LCSimEventBuilder builder;
- AbstractRecordSource source;
+ /**
+ * The builder for creating LCIO from EVIO.
+ */
+ private LCSimEventBuilder builder;
/**
- * Constructor taking a record source which should supply
- * LCSim LCIO events.
- * @param source
+ * A list of Drivers to execute on the LCIO events.
*/
- public LcioEventAdapter(AbstractRecordSource source) {
- this.source = source;
- drivers = new DriverAdapter(top);
+ private final DriverAdapter drivers;
+
+ /**
+ * The record source.
+ */
+ private AbstractRecordSource source;
+
+ /**
+ * A top level Driver for executing a number of other Drivers as children.
+ */
+ private final Driver top = new Driver();
+
+ /**
+ * Class Constructor with no arguments.
+ * <p>
+ * This is used when the {@link CompositeRecord} should supply <code>EvioEvent</code> objects for the builder.
+ */
+ public LcioEventAdapter() {
+ this.drivers = new DriverAdapter(this.top);
}
/**
- * No argument constructor in which case the {@link CompositeRecord}
- * should supply <code>EvioEvent</code> objects for the builder.
+ * Class constructor.
+ * <p>
+ * The provided record source should supply LCIO/LCSim events directly.
+ *
+ * @param source the record source of LCIO events
*/
- public LcioEventAdapter() {
- drivers = new DriverAdapter(top);
+ public LcioEventAdapter(final AbstractRecordSource source) {
+ this.source = source;
+ this.drivers = new DriverAdapter(this.top);
}
/**
- * Add an LCSim <code>Driver</code>
- * @param driver The Driver to add.
+ * Add an LCSim <code>Driver</code> to execute.
+ *
+ * @param driver the Driver to add
*/
- public void addDriver(Driver driver) {
- top.add(driver);
+ public void addDriver(final Driver driver) {
+ this.top.add(driver);
}
/**
- * Set the <code>LCSimEventBuilder</code> that will convert
- * from EVIO to LCIO events.
- * @param builder
+ * Activates the <code>endOfData</code> method on the registered <code>Driver</code> objects.
*/
- public void setLCSimEventBuilder(LCSimEventBuilder builder) {
- this.builder = builder;
+ @Override
+ public void finish(final LoopEvent loopEvent) {
+ this.drivers.finish(loopEvent);
}
/**
- * Process a {@link CompositeRecord} which will add an LCSim event
- * and activate registered <code>Driver</code> objects.
+ * Process a {@link CompositeRecord} which will create an LCSim event, add it to the composite record being
+ * processed, and activate registered the <code>Driver</code> chain.
*/
- public void recordSupplied(RecordEvent record) {
- CompositeRecord compositeRecord = (CompositeRecord) record.getRecord();
+ @Override
+ public void recordSupplied(final RecordEvent record) {
+ final CompositeRecord compositeRecord = (CompositeRecord) record.getRecord();
EventHeader lcioEvent = null;
try {
// Is there an EVIO event to use for the conversion to LCIO?
if (compositeRecord.getEvioEvent() != null) {
// Create the EVIO event.
- EvioEvent evioEvent = compositeRecord.getEvioEvent();
-
+ final EvioEvent evioEvent = compositeRecord.getEvioEvent();
+
// Pre-read the event in the builder to get non-physics event information.
- builder.readEvioEvent(evioEvent);
-
+ this.builder.readEvioEvent(evioEvent);
+
// Is this a physics EvioEvent?
if (EvioEventUtilities.isPhysicsEvent(evioEvent)) {
// Use the builder to create the LCIO event.
- lcioEvent = builder.makeLCSimEvent(compositeRecord.getEvioEvent());
+ lcioEvent = this.builder.makeLCSimEvent(compositeRecord.getEvioEvent());
} else {
// Non-physics events are ignored.
- return;
+ return;
}
} else {
// Try to use the event source to get the next LCIO event.
- source.next();
- lcioEvent = (EventHeader) source.getCurrentRecord();
+ this.source.next();
+ lcioEvent = (EventHeader) this.source.getCurrentRecord();
}
-
+
// Supply the EventHeader to the DriverAdapter.
- RecordEvent recordEvent = new RecordEvent(null, lcioEvent);
- drivers.recordSupplied(recordEvent);
-
+ final RecordEvent recordEvent = new RecordEvent(null, lcioEvent);
+ this.drivers.recordSupplied(recordEvent);
+
// Set the reference to the LCIO event on the CompositeRecord.
compositeRecord.setLcioEvent(lcioEvent);
} catch (IOException | NoSuchRecordException e) {
@@ -102,26 +123,31 @@
}
/**
- * Activates the <code>endOfData</code> method on the registered
- * <code>Driver</code> objects.
+ * Set the <code>LCSimEventBuilder</code> that will convert from EVIO to LCIO events.
+ *
+ * @param builder the LCSim event builder for creating LCIO events from EVIO
*/
- public void finish(LoopEvent loopEvent) {
- drivers.finish(loopEvent);
+ public void setLCSimEventBuilder(final LCSimEventBuilder builder) {
+ this.builder = builder;
}
/**
- * Activates the <code>startOfData</code> method on registered
- * <code>Driver</code> objects.
+ * Activates the <code>startOfData</code> method on registered <code>Driver</code> objects.
+ *
+ * @param loopEvent the object with loop state information
*/
- public void start(LoopEvent loopEvent) {
- drivers.start(loopEvent);
+ @Override
+ public void start(final LoopEvent loopEvent) {
+ this.drivers.start(loopEvent);
}
-
+
/**
- * Activates the <code>suspend</code> method on registered
- * <code>Driver</code> objects.
+ * Activates the <code>suspend</code> method on registered <code>Driver</code> objects.
+ *
+ * @param loopEvent the object with loop state information
*/
- public void suspend(LoopEvent loopEvent) {
- drivers.suspend(loopEvent);
+ @Override
+ public void suspend(final LoopEvent loopEvent) {
+ this.drivers.suspend(loopEvent);
}
}
Modified: java/trunk/record-util/src/main/java/org/hps/record/composite/LcioEventSupplier.java
=============================================================================
--- java/trunk/record-util/src/main/java/org/hps/record/composite/LcioEventSupplier.java (original)
+++ java/trunk/record-util/src/main/java/org/hps/record/composite/LcioEventSupplier.java Mon Apr 13 17:23:55 2015
@@ -1,37 +1,50 @@
package org.hps.record.composite;
+import org.freehep.application.Application;
import org.freehep.application.studio.Studio;
import org.freehep.record.loop.RecordEvent;
import org.hps.record.lcio.LcioEventQueue;
/**
- * This adapter can be used to supply LCIO EventHeader objects to JAS3
- * via a DataSource in order to drive Wired, etc.
- *
- * @author Jeremy McCormick <[log in to unmask]>
+ * This is an adapter that can supply LCIO <code>EventHeader</code> objects to JAS3 via a registered
+ * <code>DataSource</code> in order to activate Wired, the LCSim Event Browser, etc.
+ *
+ * @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a>
*/
public class LcioEventSupplier extends CompositeLoopAdapter {
-
- LcioEventQueue events;
-
- LcioEventSupplier(long timeoutMillis, int maxSize) {
- events = new LcioEventQueue(timeoutMillis, maxSize);
- events.setName(LcioEventSupplier.class.getName());
- Studio studio = (Studio)Studio.getApplication();
+
+ /**
+ * The LCIO event queue which supplies records.
+ */
+ private final LcioEventQueue events;
+
+ /**
+ * Class constructor.
+ *
+ * @param timeoutMillis the queue timeout in milliseconds
+ * @param maxSize the maximum size of the record queue
+ */
+ LcioEventSupplier(final long timeoutMillis, final int maxSize) {
+ this.events = new LcioEventQueue(timeoutMillis, maxSize);
+ this.events.setName(LcioEventSupplier.class.getName());
+ final Studio studio = (Studio) Application.getApplication();
if (studio != null) {
- studio.getLookup().add(events);
+ studio.getLookup().add(this.events);
}
}
-
- public void recordSupplied(RecordEvent record) {
- CompositeRecord compositeRecord = (CompositeRecord) record.getRecord();
+
+ /**
+ * Process composite records by adding their LCIO event references to the queue in order to supply them to JAS3.
+ *
+ * @param record the composite record
+ */
+ @Override
+ public void recordSupplied(final RecordEvent record) {
+ final CompositeRecord compositeRecord = (CompositeRecord) record.getRecord();
if (compositeRecord.getLcioEvent() != null) {
- System.out.println("LcioEventSupplier - adding event #" + compositeRecord.getLcioEvent().getEventNumber() + " to queue");
- events.addRecord(compositeRecord.getLcioEvent());
+ System.out.println("LcioEventSupplier - adding event #" + compositeRecord.getLcioEvent().getEventNumber()
+ + " to queue");
+ this.events.addRecord(compositeRecord.getLcioEvent());
}
}
-
- public LcioEventQueue getLcioEventQueue() {
- return events;
- }
}
Modified: java/trunk/record-util/src/main/java/org/hps/record/composite/MaxRecordsProcessor.java
=============================================================================
--- java/trunk/record-util/src/main/java/org/hps/record/composite/MaxRecordsProcessor.java (original)
+++ java/trunk/record-util/src/main/java/org/hps/record/composite/MaxRecordsProcessor.java Mon Apr 13 17:23:55 2015
@@ -4,45 +4,57 @@
import org.hps.record.evio.EvioEventUtilities;
/**
- * A @{link CompositeProcessor} for throwing an error when the
- * maximum number of records is reached or exceeded.
+ * A @{link CompositeProcessor} for throwing an error when the maximum number of records is reached or exceeded.
+ *
+ * @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a>
*/
public class MaxRecordsProcessor extends CompositeRecordProcessor {
-
- long maxRecords;
- long recordsReceived;
-
+
/**
- * Constructor with the maximum number of records.
- * @param maxRecords The maximum number of records.
+ * The maximum number of records.
*/
- public MaxRecordsProcessor(long maxRecords) {
+ private final long maxRecords;
+
+ /**
+ * The number of records received.
+ */
+ private long recordsReceived;
+
+ /**
+ * Class constructor, with the maximum number of records.
+ *
+ * @param maxRecords the maximum number of records
+ */
+ public MaxRecordsProcessor(final long maxRecords) {
this.maxRecords = maxRecords;
}
-
+
/**
* Process a record and check if max number of records was reached.
- * Only records with certain types are considered in this total,
- * which are basically "physics" events when processing LCIO
- * or EVIO files. For an ET system without any other record processing,
- * all events count towards the total.
+ * <p>
+ * Only records with certain types are considered in this total, which are basically "physics" events when
+ * processing LCIO or EVIO files. For an ET system without any other record processing attached, all events count
+ * towards the total as it is not easy to tell generically which are physics data events.
+ *
+ * @param record the composite record to process
*/
- public void process(CompositeRecord record) {
+ @Override
+ public void process(final CompositeRecord record) {
if (record.getLcioEvent() != null) {
// All LCSim events count as records.
- ++recordsReceived;
+ ++this.recordsReceived;
} else if (record.getEvioEvent() != null) {
if (EvioEventUtilities.isPhysicsEvent(record.getEvioEvent())) {
// Only EVIO physics events are counted.
- ++recordsReceived;
+ ++this.recordsReceived;
}
} else {
// Otherwise (ET only?) count all records.
- ++recordsReceived;
- }
- if (recordsReceived >= maxRecords) {
+ ++this.recordsReceived;
+ }
+ if (this.recordsReceived >= this.maxRecords) {
// Throw exception if max records was reached or exceeded.
- throw new MaxRecordsException("Maximum number of records received.", maxRecords);
+ throw new MaxRecordsException("Maximum number of records received.", this.maxRecords);
}
}
}
Modified: java/trunk/record-util/src/main/java/org/hps/record/composite/RecordProcessorAdapter.java
=============================================================================
--- java/trunk/record-util/src/main/java/org/hps/record/composite/RecordProcessorAdapter.java (original)
+++ java/trunk/record-util/src/main/java/org/hps/record/composite/RecordProcessorAdapter.java Mon Apr 13 17:23:55 2015
@@ -8,97 +8,107 @@
import org.hps.record.RecordProcessor;
/**
- * An extension of {@link CompositeLoopAdapter} that has a list of {@link org.hps.record.RecordProcessor}
- * objects that are activated in the appropriate hook methods.
+ * An extension of {@link CompositeLoopAdapter} which has a list of {@link org.hps.record.RecordProcessor} objects that
+ * are activated in the appropriate hook methods for every event.
+ *
* @param <RecordType> The concrete type of the record being processed.
+ * @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a>
*/
public abstract class RecordProcessorAdapter<RecordType> extends CompositeLoopAdapter {
- List<RecordProcessor<RecordType>> processors = new ArrayList<RecordProcessor<RecordType>>();
-
+ /**
+ * The list of composite record processors.
+ */
+ private final List<RecordProcessor<RecordType>> processors = new ArrayList<RecordProcessor<RecordType>>();
+
/**
* Add a <code>RecordProcessor</code>.
- * @param processor The RecordProcessor to add.
+ *
+ * @param processor the <code>RecordProcessor</code> to add
*/
- public void addProcessor(RecordProcessor<RecordType> processor) {
- processors.add(processor);
+ public void addProcessor(final RecordProcessor<RecordType> processor) {
+ this.processors.add(processor);
}
-
+
/**
- * Remove a <code>RecordProcessor</code>.
- * @param processor The RecordProcessor to remove.
+ * Activate the <code>endRun</code> methods of the registered processors.
+ *
+ * @param record the current record.
*/
- public void removeProcessor(RecordProcessor<RecordType> processor) {
- processors.remove(processor);
- }
-
- /**
- * Activate the <code>startRun</code> methods of the
- * registered processors.
- * @param record The current record.
- */
- public void startRun(RecordType record) {
- for (RecordProcessor<RecordType> processor : processors) {
- processor.startRun(record);
- }
- }
-
- /**
- * Activate the <code>endRun</code> methods of the
- * registered processors.
- * @param record The current record.
- */
- public void endRun(RecordType record) {
- for (RecordProcessor<RecordType> processor : processors) {
+ public void endRun(final RecordType record) {
+ for (final RecordProcessor<RecordType> processor : this.processors) {
processor.endRun(record);
}
}
-
+
/**
- * Activate the <code>process</code> methods of the
- * registered processors.
- * @param record The current record.
+ * Activate the <code>endJob</code> methods of the registered processors.
+ *
+ * @param the <code>LoopEvent</code> which activated <code>finish</code>
*/
- public void process(RecordType record) {
- for (RecordProcessor<RecordType> processor : processors) {
- try {
- processor.process(record);
- } catch (Exception e) {
- throw new RecordProcessingException("Error processing record.", e);
- }
- }
- }
-
- /**
- * Activate the <code>endJob</code> methods of the
- * registered processors.
- * @param The LoopEvent which activated finish.
- */
- public void finish(LoopEvent loopEvent) {
- for (RecordProcessor<RecordType> processor : processors) {
+ @Override
+ public void finish(final LoopEvent loopEvent) {
+ for (final RecordProcessor<RecordType> processor : this.processors) {
processor.endJob();
}
}
/**
- * Activate the <code>startJob</code> methods of the
- * registered processors.
- * @param The LoopEvent which activated the start.
+ * Activate the <code>process</code> methods of the registered processors.
+ *
+ * @param record the current record
*/
- public void start(LoopEvent loopEvent) {
- for (RecordProcessor<RecordType> processor : processors) {
+ public void process(final RecordType record) {
+ for (final RecordProcessor<RecordType> processor : this.processors) {
+ try {
+ processor.process(record);
+ } catch (final Exception e) {
+ throw new RecordProcessingException("Error processing record.", e);
+ }
+ }
+ }
+
+ /**
+ * Remove a <code>RecordProcessor</code> from the adapter.
+ *
+ * @param processor the <code>RecordProcessor</code> to remove
+ */
+ public void removeProcessor(final RecordProcessor<RecordType> processor) {
+ this.processors.remove(processor);
+ }
+
+ /**
+ * Activate the <code>startJob</code> methods of the registered processors.
+ *
+ * @param the <code>LoopEvent</code> which activated the start
+ */
+ @Override
+ public void start(final LoopEvent loopEvent) {
+ for (final RecordProcessor<RecordType> processor : this.processors) {
processor.startJob();
}
}
-
+
/**
- * Activate the <code>suspend</code> methods of the
- * registered processors.
- * @param The LoopEvent which activated the suspend.
+ * Activate the <code>startRun</code> methods of the registered processors.
+ *
+ * @param record the current record
*/
- public void suspend(LoopEvent loopEvent) {
- for (RecordProcessor<RecordType> processor : processors) {
+ public void startRun(final RecordType record) {
+ for (final RecordProcessor<RecordType> processor : this.processors) {
+ processor.startRun(record);
+ }
+ }
+
+ /**
+ * Activate the <code>suspend</code> methods of the registered processors.
+ *
+ * @param the <code>LoopEvent</code> which activated <code>suspend</code>.
+ */
+ @Override
+ public void suspend(final LoopEvent loopEvent) {
+ for (final RecordProcessor<RecordType> processor : this.processors) {
processor.suspend();
}
- }
+ }
}
Added: java/trunk/record-util/src/main/java/org/hps/record/composite/package-info.java
=============================================================================
--- java/trunk/record-util/src/main/java/org/hps/record/composite/package-info.java (added)
+++ java/trunk/record-util/src/main/java/org/hps/record/composite/package-info.java Mon Apr 13 17:23:55 2015
@@ -0,0 +1,7 @@
+/**
+ * This package implements a composite record processing system that creates and processes records which reference
+ * associated ET, EVIO and LCSim events.
+ *
+ * @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a>
+ */
+package org.hps.record.composite;
Modified: java/trunk/record-util/src/main/java/org/hps/record/enums/DataSourceType.java
=============================================================================
--- java/trunk/record-util/src/main/java/org/hps/record/enums/DataSourceType.java (original)
+++ java/trunk/record-util/src/main/java/org/hps/record/enums/DataSourceType.java Mon Apr 13 17:23:55 2015
@@ -1,61 +1,36 @@
package org.hps.record.enums;
-
-import java.io.File;
/**
* The type of data source that will supply events to the app.
+ *
+ * @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a>
*/
public enum DataSourceType {
- ET_SERVER("ET Server", null),
- EVIO_FILE("EVIO File", "evio"),
+ /**
+ * An ET server data source (hence no file extension).
+ */
+ ET_SERVER("ET Server", null),
+ /**
+ * An EVIO data source with the "evio" file extension.
+ */
+ EVIO_FILE("EVIO File", "evio"),
+ /**
+ * An LCIO data source with the "slcio" file extension.
+ */
LCIO_FILE("LCIO File", "slcio");
- String description;
- String extension;
-
- /**
- * Constructor which takes a description.
- * @param description The description of the data source type.
- */
- private DataSourceType(String description, String extension) {
- this.description = description;
- }
-
- /**
- * Get the description of the data source type.
- * @return The description of the data source type.
- */
- public String description() {
- return description;
- }
-
- /**
- * Get the extension associated with this data source type.
- * @return The file extension of the data source type.
- */
- public String getExtension() {
- return extension;
- }
-
- /**
- * True if the source is file-based
- * (e.g. not an ET server).
- * @return
- */
- public boolean isFile() {
- return this.ordinal() > ET_SERVER.ordinal();
- }
-
/**
* Figure out a reasonable data source type for the path string.
- * This defaults to an ET source ((perhaps unreasonably!) if the
- * file extension is unrecognized.
+ * <p>
+ * This defaults to an ET source ((perhaps unreasonably!) if the file extension is unrecognized.
+ *
* @param path The data source path.
* @return The data source type.
*/
- public static DataSourceType getDataSourceType(String path) {
- if (path.endsWith("." + DataSourceType.LCIO_FILE.getExtension())) {
+ // FIXME: Probably this should throw an error if the extension is unrecognized.
+ public static DataSourceType getDataSourceType(final String path) {
+ if (path.endsWith("." + DataSourceType.LCIO_FILE.getExtension())) {
return DataSourceType.LCIO_FILE;
} else if (path.contains("." + DataSourceType.EVIO_FILE.getExtension())) {
// For EVIO files, only check that the extension appears someplace in the name
@@ -65,5 +40,51 @@
return DataSourceType.ET_SERVER;
}
}
-
+
+ /**
+ * The description of the data source.
+ */
+ private String description;
+
+ /**
+ * The extension associated with the type.
+ */
+ private String extension;
+
+ /**
+ * Class constructor, which takes a description and file extension.
+ *
+ * @param description the description of the data source type
+ * @param extension the associated file extension
+ */
+ private DataSourceType(final String description, final String extension) {
+ this.description = description;
+ }
+
+ /**
+ * Get the description of the data source type.
+ *
+ * @return the description of the data source type
+ */
+ public String description() {
+ return this.description;
+ }
+
+ /**
+ * Get the extension associated with this data source type.
+ *
+ * @return the file extension of the data source type
+ */
+ public String getExtension() {
+ return this.extension;
+ }
+
+ /**
+ * Return <code>true</code> if the source is file-based (e.g. not an ET server).
+ *
+ * @return <code>true</code> if the source is file-based
+ */
+ public boolean isFile() {
+ return this.ordinal() > ET_SERVER.ordinal();
+ }
}
Modified: java/trunk/record-util/src/main/java/org/hps/record/enums/ProcessingStage.java
=============================================================================
--- java/trunk/record-util/src/main/java/org/hps/record/enums/ProcessingStage.java (original)
+++ java/trunk/record-util/src/main/java/org/hps/record/enums/ProcessingStage.java Mon Apr 13 17:23:55 2015
@@ -1,16 +1,25 @@
package org.hps.record.enums;
/**
-* When set this can be used to limit the number
-* of processing stages that are excecuted by the
-* {@link org.hps.record.composite.CompositeLoop}.
-* For example, if the <code>ProcessingStage</code>
-* is set to <code>EVIO</code> then the <code>ET</code>
-* and <code>EVIO</code> adapters will be activated
-* but LCIO events will not be created or processed.
-*/
+ * When set this can be used to limit the number of processing stages that are executed by the
+ * {@link org.hps.record.composite.CompositeLoop}.
+ * <p>
+ * For example, if the <code>ProcessingStage</code> is set to <code>EVIO</code> then the <code>ET</code> and
+ * <code>EVIO</code> adapters will be activated but LCIO events will not be created or processed.
+ *
+ * @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a>
+ */
public enum ProcessingStage {
+ /**
+ * Execute only the reading of ET events from the server.
+ */
ET,
+ /**
+ * Execute reading of ET events and conversion to EVIO.
+ */
EVIO,
+ /**
+ * Execute full processing chain of ET to EVIO to LCIO.
+ */
LCIO
}
Added: java/trunk/record-util/src/main/java/org/hps/record/enums/package-info.java
=============================================================================
--- java/trunk/record-util/src/main/java/org/hps/record/enums/package-info.java (added)
+++ java/trunk/record-util/src/main/java/org/hps/record/enums/package-info.java Mon Apr 13 17:23:55 2015
@@ -0,0 +1,6 @@
+/**
+ * Enums for the record-util module.
+ *
+ * @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a>
+ */
+package org.hps.record.enums;
Modified: java/trunk/record-util/src/main/java/org/hps/record/epics/EpicsEtProcessor.java
=============================================================================
--- java/trunk/record-util/src/main/java/org/hps/record/epics/EpicsEtProcessor.java (original)
+++ java/trunk/record-util/src/main/java/org/hps/record/epics/EpicsEtProcessor.java Mon Apr 13 17:23:55 2015
@@ -10,25 +10,34 @@
/**
* An ET event processor that builds EPICS events.
- *
- * @author Jeremy McCormick <[log in to unmask]>
+ *
+ * @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a>
*/
+// FIXME: Class is currently unused.
public class EpicsEtProcessor extends EtEventProcessor {
-
- EpicsEvioProcessor evioProcessor = new EpicsEvioProcessor();
-
- public void process(EtEvent event) {
+
+ /**
+ * The processor for creating the EPICS data class from EVIO data.
+ */
+ private final EpicsEvioProcessor evioProcessor = new EpicsEvioProcessor();
+
+ /**
+ * Process an <code>EtEvent</code> and create an EPICS data object from it.
+ *
+ * @param event the <code>EtEvent</code> to process
+ */
+ @Override
+ public void process(final EtEvent event) {
EvioEvent evio;
try {
evio = new EvioReader(event.getDataBuffer()).parseNextEvent();
} catch (IOException | EvioException e) {
throw new RuntimeException(e);
- }
- evioProcessor.process(evio);
- if (evioProcessor.getEpicsScalarData() != null) {
+ }
+ this.evioProcessor.process(evio);
+ if (this.evioProcessor.getEpicsScalarData() != null) {
System.out.println("EpicsEtProcessor created EpicsScalarData ...");
- System.out.println(evioProcessor.getEpicsScalarData());
+ System.out.println(this.evioProcessor.getEpicsScalarData());
}
}
-}
-
+}
Modified: java/trunk/record-util/src/main/java/org/hps/record/epics/EpicsEvioProcessor.java
=============================================================================
--- java/trunk/record-util/src/main/java/org/hps/record/epics/EpicsEvioProcessor.java (original)
+++ java/trunk/record-util/src/main/java/org/hps/record/epics/EpicsEvioProcessor.java Mon Apr 13 17:23:55 2015
@@ -6,17 +6,35 @@
import org.jlab.coda.jevio.EvioEvent;
/**
- * This is an EVIO event processor that will read EPICS events (event tag 31)
- * and turn them into {@link EpicsScalarData} objects.
- *
- * @author Jeremy McCormick <[log in to unmask]>
+ * This is an EVIO event processor that will read EPICS events (event tag 31) and turn them into {@link EpicsScalarData}
+ * objects.
+ *
+ * @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a>
*/
public final class EpicsEvioProcessor extends EvioEventProcessor {
- EpicsScalarData data;
-
- public void process(EvioEvent evio) {
-
+ /**
+ * The current EPICS data object.
+ */
+ private EpicsScalarData data;
+
+ /**
+ * Get the current {@link EpicsScalarData} object created from record processing.
+ *
+ * @return the {@link EpicsScalarData} object created from record processing
+ */
+ public EpicsScalarData getEpicsScalarData() {
+ return this.data;
+ }
+
+ /**
+ * Process EVIO data and create a {@link EpicsScalarData} if EPICS data bank exists in the event.
+ *
+ * @param evio the <code>EvioEvent</code> that possibly has EPICS data
+ */
+ @Override
+ public void process(final EvioEvent evio) {
+
if (evio.getHeader().getTag() != EvioEventConstants.EPICS_EVENT_TAG) {
// Just silently skip these events because otherwise too many error messages might print.
return;
@@ -24,8 +42,8 @@
// Find the bank with the EPICS information.
BaseStructure epicsBank = null;
- BaseStructure topBank = evio.getChildrenList().get(0);
- for (BaseStructure childBank : topBank.getChildrenList()) {
+ final BaseStructure topBank = evio.getChildrenList().get(0);
+ for (final BaseStructure childBank : topBank.getChildrenList()) {
if (childBank.getHeader().getTag() == EvioEventConstants.EPICS_BANK_TAG) {
epicsBank = childBank;
break;
@@ -33,16 +51,9 @@
}
if (epicsBank != null) {
- String epicsData = epicsBank.getStringData()[0];
- data = new EpicsScalarData();
- data.fromString(epicsData);
-
- //System.out.println("found EVIO data bank ...");
- //System.out.println(data.toString());
- }
- }
-
- public EpicsScalarData getEpicsScalarData() {
- return data;
+ final String epicsData = epicsBank.getStringData()[0];
+ this.data = new EpicsScalarData();
+ this.data.fromString(epicsData);
+ }
}
}
Modified: java/trunk/record-util/src/main/java/org/hps/record/epics/EpicsGenericObject.java
=============================================================================
--- java/trunk/record-util/src/main/java/org/hps/record/epics/EpicsGenericObject.java (original)
+++ java/trunk/record-util/src/main/java/org/hps/record/epics/EpicsGenericObject.java Mon Apr 13 17:23:55 2015
@@ -3,21 +3,71 @@
import org.lcsim.event.GenericObject;
/**
- * This is an implementation of GenericObject for reading and writing EPICS data.
- * There is no functionality here. Users that need this data in their <code>Driver</code>
- * classes should instead use {@link EpicsScalarData#read(org.lcsim.event.EventHeader)}
- * to create the class with the actual API.
- *
- * @author Jeremy McCormick <[log in to unmask]>
+ * This is an implementation of GenericObject for reading and writing EPICS data. There is no functionality here
+ * intended for ends users. Instead, the EPICS data should be accessed using
+ * {@link EpicsScalarData#read(org.lcsim.event.EventHeader)} to create the data object from input event data.
+ *
+ * @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a>
*/
final class EpicsGenericObject implements GenericObject {
- String[] keys;
- double[] values;
+ /**
+ * The names of the EPICS variables.
+ */
+ private String[] keys;
+
+ /**
+ * The values of the EPICS variables.
+ */
+ private double[] values;
+
+ /**
+ * Get a double value of an EPICS variable.
+ *
+ * @param index the index of the variable
+ */
+ @Override
+ public double getDoubleVal(final int index) {
+ return this.values[index];
+ }
@Override
- public int getNInt() {
+ public float getFloatVal(final int index) {
return 0;
+ }
+
+ @Override
+ public int getIntVal(final int index) {
+ return 0;
+ }
+
+ /**
+ * Get a key by index.
+ *
+ * @param index the index
+ * @return the key which is the name of an EPICS variable
+ */
+ public String getKey(final int index) {
+ return this.keys[index];
+ }
+
+ /**
+ * Get the keys which are the EPICS variable names.
+ *
+ * @return the keys
+ */
+ String[] getKeys() {
+ return this.keys;
+ }
+
+ /**
+ * Get the number of doubles which matches the number of EPICS variables.
+ *
+ * @return the number of double values
+ */
+ @Override
+ public int getNDouble() {
+ return this.values.length;
}
@Override
@@ -26,31 +76,53 @@
}
@Override
- public int getNDouble() {
- return values.length;
- }
-
- @Override
- public int getIntVal(int index) {
+ public int getNInt() {
return 0;
}
- @Override
- public float getFloatVal(int index) {
- return 0;
- }
-
- @Override
- public double getDoubleVal(int index) {
- return values[index];
- }
-
+ /**
+ * Returns <code>false</code> to indicate this object does not have a fixed size.
+ */
@Override
public boolean isFixedSize() {
return false;
}
- public String getKey(int index) {
- return keys[index];
+ /**
+ * Set a key string by index.
+ *
+ * @param index the index
+ * @param key the key string which is an EPICS variable
+ */
+ void setKey(final int index, final String key) {
+ this.keys[index] = key;
+ }
+
+ /**
+ * Set the keys.
+ *
+ * @param keys the keys array
+ */
+ void setKeys(final String[] keys) {
+ this.keys = keys;
+ }
+
+ /**
+ * Set a value by index.
+ *
+ * @param index the index
+ * @param value the value
+ */
+ void setValue(final int index, final double value) {
+ this.values[index] = value;
+ }
+
+ /**
+ * Set the values array.
+ *
+ * @param values the values array
+ */
+ void setValues(final double[] values) {
+ this.values = values;
}
}
Modified: java/trunk/record-util/src/main/java/org/hps/record/epics/EpicsScalarData.java
=============================================================================
--- java/trunk/record-util/src/main/java/org/hps/record/epics/EpicsScalarData.java (original)
+++ java/trunk/record-util/src/main/java/org/hps/record/epics/EpicsScalarData.java Mon Apr 13 17:23:55 2015
@@ -12,218 +12,242 @@
import org.lcsim.event.GenericObject;
/**
- * This is an API for reading and writing EPICS scalar data to LCIO events,
- * as well as parsing the scalar data from a CDATA section of an EVIO string
- * data bank. The {@link #read(EventHeader)} method should be used to create
- * one of these objects from an LCIO event.
- *
- * @author Jeremy McCormick <[log in to unmask]>
-*/
+ * This is an API for reading and writing EPICS scalar data to LCIO events, as well as parsing the scalar data from a
+ * CDATA section within an EVIO string data bank. The {@link #read(EventHeader)} method should be used to create one of
+ * these objects from an LCIO event.
+ *
+ * @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a>
+ */
public final class EpicsScalarData {
-
- // Used in collection parameter map as name of the key list.
+
+ /**
+ * Default collection name in the LCSim events.
+ */
+ public static final String DEFAULT_COLLECTION_NAME = "EpicsScalarData";
+
+ /**
+ * This map contains the list of EPICS key descriptions from the<br/>
+ * <a href="https://confluence.slac.stanford.edu/display/hpsg/EVIO+Data+Format">EVIO Data Format Confluence Page</a>
+ */
+ private final static Map<String, String> DESCRIPTIONS = new HashMap<String, String>();
+
+ /**
+ * Dummy float parameters to make LCIO persistency work.
+ */
+ static final Map<String, float[]> DUMMY_FLOAT_MAP = new HashMap<String, float[]>();
+
+ /**
+ * Dummy int parameters to make LCIO persistency work.
+ */
+ static final Map<String, int[]> DUMMY_INT_MAP = new HashMap<String, int[]>();
+
+ /**
+ * Collection parameter that has the EPICS variable names.
+ */
public static final String EPICS_SCALAR_NAMES = "EPICS_SCALAR_NAMES";
-
- // Default collection name in the LCIO event.
- public static final String DEFAULT_COLLECTION_NAME = "EpicsScalarData";
-
- // Dummy collection parameter maps to try and make LCIO happy.
- static final Map<String, int[]> DUMMY_INT_MAP = new HashMap<String, int[]>();
- static final Map<String, float[]> DUMMY_FLOAT_MAP = new HashMap<String, float[]>();
-
- // The map of scalar keys to values.
- private Map<String, Double> dataMap = new LinkedHashMap<String, Double>();
-
- // EPICS key descriptions from
- // https://confluence.slac.stanford.edu/display/hpsg/EVIO+Data+Format
- private final static Map<String, String> DESCRIPTIONS = new HashMap<String, String>();
+
+ /**
+ * List of descriptions.
+ */
+ // FIXME: Maybe this should not be listed here.
static {
- DESCRIPTIONS.put("MBSY2C_energy", "Beam energy according to Hall B BSY dipole string");
- DESCRIPTIONS.put("PSPECIRBCK", "Pair Spectrometer Current Readback");
- DESCRIPTIONS.put("HPS:LS450_2:FIELD", "Frascati probe field");
- DESCRIPTIONS.put("HPS:LS450_1:FIELD", "Pair Spectrometer probe field");
- DESCRIPTIONS.put("MTIRBCK", "Frascati Current Readback");
- DESCRIPTIONS.put("VCG2C21 2C21", "Vacuum gauge pressure");
- DESCRIPTIONS.put("VCG2C21A", "2C21A Vacuum gauge pressure");
- DESCRIPTIONS.put("VCG2C24A", "2C24A Vacuum gauge pressure");
- DESCRIPTIONS.put("VCG2H00A", "2H00 Vacuum gauge pressure");
- DESCRIPTIONS.put("VCG2H01A", "2H01 Vacuum gauge pressure");
- DESCRIPTIONS.put("VCG2H02A", "2H02 Vacuum gauge pressure");
- DESCRIPTIONS.put("scaler_calc1", "Faraday cup current");
- DESCRIPTIONS.put("scalerS12b", "HPS-Left beam halo count");
- DESCRIPTIONS.put("scalerS13b", "HPS-Right beam halo count");
- DESCRIPTIONS.put("scalerS14b", "HPS-Top beam halo count");
- DESCRIPTIONS.put("scalerS15b", "HPS-SC beam halo count");
+ DESCRIPTIONS.put("MBSY2C_energy", "Beam energy according to Hall B BSY dipole string");
+ DESCRIPTIONS.put("PSPECIRBCK", "Pair Spectrometer Current Readback");
+ DESCRIPTIONS.put("HPS:LS450_2:FIELD", "Frascati probe field");
+ DESCRIPTIONS.put("HPS:LS450_1:FIELD", "Pair Spectrometer probe field");
+ DESCRIPTIONS.put("MTIRBCK", "Frascati Current Readback");
+ DESCRIPTIONS.put("VCG2C21 2C21", "Vacuum gauge pressure");
+ DESCRIPTIONS.put("VCG2C21A", "2C21A Vacuum gauge pressure");
+ DESCRIPTIONS.put("VCG2C24A", "2C24A Vacuum gauge pressure");
+ DESCRIPTIONS.put("VCG2H00A", "2H00 Vacuum gauge pressure");
+ DESCRIPTIONS.put("VCG2H01A", "2H01 Vacuum gauge pressure");
+ DESCRIPTIONS.put("VCG2H02A", "2H02 Vacuum gauge pressure");
+ DESCRIPTIONS.put("scaler_calc1", "Faraday cup current");
+ DESCRIPTIONS.put("scalerS12b", "HPS-Left beam halo count");
+ DESCRIPTIONS.put("scalerS13b", "HPS-Right beam halo count");
+ DESCRIPTIONS.put("scalerS14b", "HPS-Top beam halo count");
+ DESCRIPTIONS.put("scalerS15b", "HPS-SC beam halo count");
DESCRIPTIONS.put("hallb_IPM2C21A_XPOS", "Beam position X at 2C21");
DESCRIPTIONS.put("hallb_IPM2C21A_YPOS", "Beam position Y at 2C21");
- DESCRIPTIONS.put("hallb_IPM2C21A_CUR", "Current at 2C21");
+ DESCRIPTIONS.put("hallb_IPM2C21A_CUR", "Current at 2C21");
DESCRIPTIONS.put("hallb_IPM2C24A_XPOS", "Beam position X at 2C24");
DESCRIPTIONS.put("hallb_IPM2C24A_YPOS", "Beam position Y at 2C24");
- DESCRIPTIONS.put("hallb_IPM2C24A_CUR", "Current at 2C24");
- DESCRIPTIONS.put("hallb_IPM2H00_XPOS", "Beam position X at 2H00");
- DESCRIPTIONS.put("hallb_IPM2H00_YPOS", "Beam position Y at 2H00");
- DESCRIPTIONS.put("hallb_IPM2H00_CUR", "Current at 2H00");
- DESCRIPTIONS.put("hallb_IPM2H02_YPOS", "Beam position X at 2H02");
- DESCRIPTIONS.put("hallb_IPM2H02_XPOS", "Beam position Y at 2H02");
+ DESCRIPTIONS.put("hallb_IPM2C24A_CUR", "Current at 2C24");
+ DESCRIPTIONS.put("hallb_IPM2H00_XPOS", "Beam position X at 2H00");
+ DESCRIPTIONS.put("hallb_IPM2H00_YPOS", "Beam position Y at 2H00");
+ DESCRIPTIONS.put("hallb_IPM2H00_CUR", "Current at 2H00");
+ DESCRIPTIONS.put("hallb_IPM2H02_YPOS", "Beam position X at 2H02");
+ DESCRIPTIONS.put("hallb_IPM2H02_XPOS", "Beam position Y at 2H02");
+ }
+
+ /**
+ * Get the static list of available EPICs scalar names.
+ * <p>
+ * This could be different than the variable names which were actually written into the collection header. For this,
+ * instead use the method {@link #getUsedNames()}.
+ *
+ * @return the set of default EPICS scalar names
+ */
+ public static Set<String> getDefaultNames() {
+ return DESCRIPTIONS.keySet();
};
-
- /**
- * Write this object's data into a GenericObject collection in the LCIO event using
- * the default collection name.
- * @param event The LCIO event.
- */
- public void write(EventHeader event) {
- write(event, DEFAULT_COLLECTION_NAME);
- }
-
+
+ /**
+ * Get the description of a named EPICS variable.
+ *
+ * @param name the name of the scalar
+ */
+ public static String getDescription(final String name) {
+ return DESCRIPTIONS.get(name);
+ }
+
/**
* <p>
* Read data into this object from an LCIO event using the default collection name.
* <p>
- * This is the primary method for users to read the EPICS data into their Drivers
- * in the {@link org.lcsim.util.Driver#process(EventHeader)} method.
- * @param event The LCIO event.
- * @return The EPICS data from the event.
- */
- public static EpicsScalarData read(EventHeader event) {
+ * This is the primary method for users to read the EPICS data into their Drivers in the
+ * {@link org.lcsim.util.Driver#process(EventHeader)} method.
+ *
+ * @param event the LCIO event
+ * @return the EPICS data from the event
+ */
+ public static EpicsScalarData read(final EventHeader event) {
if (event.hasCollection(GenericObject.class, EpicsScalarData.DEFAULT_COLLECTION_NAME)) {
return read(event, DEFAULT_COLLECTION_NAME);
} else {
return null;
}
}
-
- /**
- * Get a double value from the key.
- * @return The value from the key.
- */
- public Double getValue(String name) {
- return dataMap.get(name);
- }
-
- /**
- * Get the description of a named EPICS scalar.
- * @param name The name of the scalar.
- */
- public static String getDescription(String name) {
- return DESCRIPTIONS.get(name);
- }
-
- /**
- * Get the static list of default, available EPICs scalar names.
- * <p>
- * This could be different than the names which were actually
- * written into the collection header. For this, use the method
- * {@link #getUsedNames()}.
- *
- * @return The list of default EPICS scalar names.
- */
- public static Set<String> getDefaultNames() {
- return DESCRIPTIONS.keySet();
- }
-
- /**
- * Get the list of used EPICS scalars in this object.
- * <p>
- * This could potentially be different than the list of
- * default names from {@link #getDefaultNames()} but it
- * will usually be the same.
- *
- * @return The list of used EPICS scalar names.
- */
- public Set<String> getUsedNames() {
- return dataMap.keySet();
- }
-
- /**
- * Write this object into an LCIO event under the given collection name.
- * @param event The LCIO event.
- * @param collectionName The name of the collection in the event.
- */
- void write(EventHeader event, String collectionName) {
- List<GenericObject> collection = new ArrayList<GenericObject>();
- EpicsGenericObject object = toGenericObject();
- collection.add(object);
- Map<String, String[]> stringMap = new HashMap<String, String[]>();
- stringMap.put(EPICS_SCALAR_NAMES, object.keys);
- event.put(collectionName, collection, GenericObject.class, 0, DUMMY_INT_MAP, DUMMY_FLOAT_MAP, stringMap);
- }
-
- /**
- * Parse a raw data string from the EVIO data bank and
- * turn it into a list of keys and values within this object.
- * @param rawData The raw data in the form of a string.
- */
- void fromString(String rawData) {
- String lines[] = rawData.split("\\r?\\n");
- for (String line : lines) {
- String trimmed = line.trim();
+
+ /**
+ * Read data into this object from a collection in the LCIO event with the given collection name.
+ *
+ * @param event the LCIO event
+ * @param collectionName the collection name
+ * @return the EPICS data from the LCIO event
+ */
+ static EpicsScalarData read(final EventHeader event, final String collectionName) {
+ final List<GenericObject> collection = event.get(GenericObject.class, collectionName);
+ @SuppressWarnings("rawtypes")
+ final Map stringMap = event.getMetaData(collection).getStringParameters();
+ final String[] keys = (String[]) stringMap.get(EPICS_SCALAR_NAMES);
+ final EpicsScalarData data = new EpicsScalarData();
+ data.fromGenericObject(collection.get(0), keys);
+ return data;
+ }
+
+ /**
+ * The mapping of EPICS variable names to their double values.
+ */
+ private final Map<String, Double> dataMap = new LinkedHashMap<String, Double>();
+
+ /**
+ * Given a list of names, read the double values from the {@link org.lcsim.event.GenericObject} into the data map of
+ * this object.
+ *
+ * @param object the <code>GenericObject</code> with the scalar values
+ * @param names The list of names.
+ */
+ void fromGenericObject(final GenericObject object, final String[] names) {
+ for (int index = 0; index < names.length; index++) {
+ this.dataMap.put(names[index], object.getDoubleVal(index));
+ }
+ }
+
+ /**
+ * Parse a raw data string from the EVIO data bank and turn it into a list of keys and values within this object.
+ *
+ * @param rawData the raw EPICS data in the form of a string
+ */
+ void fromString(final String rawData) {
+ final String lines[] = rawData.split("\\r?\\n");
+ for (final String line : lines) {
+ final String trimmed = line.trim();
if (trimmed.length() == 0) {
continue;
}
- String[] data = trimmed.split(" ");
- Double value = Double.parseDouble(data[0]);
- String key = data[1];
- dataMap.put(key, value);
- }
- }
-
- /**
- * Convert this object into a {@link org.lcsim.event.GenericObject}
- * that can be written into an LCIO collection.
- * @return The GenericObject representing this data.
+ final String[] data = trimmed.split(" ");
+ final Double value = Double.parseDouble(data[0]);
+ final String key = data[1];
+ this.dataMap.put(key, value);
+ }
+ }
+
+ /**
+ * Get the list of used EPICS scalars in this object.
+ * <p>
+ * This could potentially be different than the list of default names from {@link #getDefaultNames()} but it will
+ * usually be the same.
+ *
+ * @return the list of used EPICS scalar names
+ */
+ public Set<String> getUsedNames() {
+ return this.dataMap.keySet();
+ }
+
+ /**
+ * Get a double value from the key which should be a valid EPICS variable name.
+ *
+ * @return the value from the key
+ */
+ public Double getValue(final String name) {
+ return this.dataMap.get(name);
+ }
+
+ /**
+ * Convert this object into a {@link org.lcsim.event.GenericObject} that can be written into an LCIO collection.
+ *
+ * @return the <code>GenericObject</code> representing this data
*/
EpicsGenericObject toGenericObject() {
- EpicsGenericObject newObject = new EpicsGenericObject();
- newObject.keys = new String[dataMap.size()];
- newObject.values = new double[dataMap.size()];
+ final EpicsGenericObject newObject = new EpicsGenericObject();
+ newObject.setKeys(new String[this.dataMap.size()]);
+ newObject.setValues(new double[this.dataMap.size()]);
int index = 0;
- for (String key : dataMap.keySet()) {
- newObject.keys[index] = key;
- newObject.values[index] = dataMap.get(key);
+ for (final String key : this.dataMap.keySet()) {
+ newObject.setKey(index, key);
+ newObject.setValue(index, this.dataMap.get(key));
index++;
}
return newObject;
}
/**
- * Given a list of names, read the double values from the
- * {@link org.lcsim.event.GenericObject} into the data map
- * of this object.
- * @param object The GenericObject with the scalar values.
- * @param names The list of names.
- */
- void fromGenericObject(GenericObject object, String[] names) {
- for (int index = 0; index < names.length; index++) {
- dataMap.put(names[index], object.getDoubleVal(index));
- }
- }
-
- /**
- * Read data into this object from a collection in the LCIO event
- * with the given collection name.
- * @param event The LCIO event.
- * @param collectionName The collection name.
- * @return The EPICS data from the LCIO event.
- */
- static EpicsScalarData read(EventHeader event, String collectionName) {
- List<GenericObject> collection = event.get(GenericObject.class, collectionName);
- @SuppressWarnings("rawtypes")
- Map stringMap = event.getMetaData(collection).getStringParameters();
- String[] keys = (String[]) stringMap.get(EPICS_SCALAR_NAMES);
- EpicsScalarData data = new EpicsScalarData();
- data.fromGenericObject(collection.get(0), keys);
- return data;
- }
-
- /**
* Convert this object to a string.
- */
+ *
+ * @return this object converted to a string
+ */
+ @Override
public String toString() {
- StringBuffer sb = new StringBuffer();
- for (Entry<String, Double> entry : dataMap.entrySet()) {
+ final StringBuffer sb = new StringBuffer();
+ for (final Entry<String, Double> entry : this.dataMap.entrySet()) {
sb.append(entry.getKey() + " " + entry.getValue() + '\n');
}
return sb.toString();
}
+
+ /**
+ * Write this object's data into a <code>GenericObject</code> collection in the LCIO event using the default
+ * collection name.
+ *
+ * @param event the LCIO event
+ */
+ public void write(final EventHeader event) {
+ write(event, DEFAULT_COLLECTION_NAME);
+ }
+
+ /**
+ * Write this object into an LCIO event with the given collection name.
+ *
+ * @param event the LCIO event
+ * @param collectionName the name of the collection in the output event
+ */
+ void write(final EventHeader event, final String collectionName) {
+ final List<GenericObject> collection = new ArrayList<GenericObject>();
+ final EpicsGenericObject object = toGenericObject();
+ collection.add(object);
+ final Map<String, String[]> stringMap = new HashMap<String, String[]>();
+ stringMap.put(EPICS_SCALAR_NAMES, object.getKeys());
+ event.put(collectionName, collection, GenericObject.class, 0, DUMMY_INT_MAP, DUMMY_FLOAT_MAP, stringMap);
+ }
}
Added: java/trunk/record-util/src/main/java/org/hps/record/epics/package-info.java
=============================================================================
--- java/trunk/record-util/src/main/java/org/hps/record/epics/package-info.java (added)
+++ java/trunk/record-util/src/main/java/org/hps/record/epics/package-info.java Mon Apr 13 17:23:55 2015
@@ -0,0 +1,6 @@
+/**
+ * Classes for reading EPICs data from EVIO and converting it to LCSim.
+ *
+ * @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a>
+ */
+package org.hps.record.epics;
Modified: java/trunk/record-util/src/main/java/org/hps/record/et/EtConnection.java
=============================================================================
--- java/trunk/record-util/src/main/java/org/hps/record/et/EtConnection.java (original)
+++ java/trunk/record-util/src/main/java/org/hps/record/et/EtConnection.java Mon Apr 13 17:23:55 2015
@@ -22,153 +22,44 @@
import org.jlab.coda.et.exception.EtWakeUpException;
/**
- * A class for encapsulating the connection information
- * for an ET client including the EtSystem and EtAttachment
+ * A class for encapsulating the connection information for an ET client including the EtSystem and EtAttachment
* objects.
+ *
+ * @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a>
*/
public final class EtConnection {
- EtSystem sys;
- EtAttachment att;
- EtStation stat;
-
- Mode waitMode;
- int waitTime;
- int chunkSize;
-
- /**
- * A class constructor for internal convenience.
- * @param param The connection parameters.
- * @param sys The ET system.
- * @param att The ET attachment.
- * @param stat The ET station.
- */
- private EtConnection(
- EtSystem sys,
- EtAttachment att,
- EtStation stat,
- Mode waitMode,
- int waitTime,
- int chunkSize) {
- this.sys = sys;
- this.att = att;
- this.stat = stat;
- this.waitMode = waitMode;
- this.waitTime = waitTime;
- this.chunkSize = chunkSize;
- }
-
- /**
- * Get the ET system.
- * @return The ET system.
- */
- public EtSystem getEtSystem() {
- return sys;
- }
-
- /**
- * Get the ET attachment.
- * @return The ET attachment.
- */
- public EtAttachment getEtAttachment() {
- return att;
- }
-
- /**
- * Get the ET station.
- * @return The ET station.
- */
- public EtStation getEtStation() {
- return stat;
- }
-
- /**
- * Cleanup the ET connection.
- */
- public void cleanup() {
+ /**
+ * Create an EtConnection with full list of configuration parameters.
+ *
+ * @param name the name of the ET system e.g. the buffer file on disk
+ * @param host the name of the network host
+ * @param port the port of the network host
+ * @param blocking <code>true</code> for blocking behavior
+ * @param queueSize the queue size
+ * @param prescale the event prescale factor or 0 for none
+ * @param stationName the name of the ET station
+ * @param stationPosition he position of the ET station
+ * @param waitMode the wait mode
+ * @param waitTime the wait time if using timed wait mode
+ * @param chunkSize the number of ET events to return at once
+ * @return the <code>EtConnection</code> created from the parameters
+ */
+ public static EtConnection createConnection(final String name, final String host, final int port,
+ final boolean blocking, final int queueSize, final int prescale, final String stationName,
+ final int stationPosition, final Mode waitMode, final int waitTime, final int chunkSize) {
try {
- if (!sys.alive()) {
- throw new RuntimeException("EtSystem is not alive!");
- }
- sys.detach(att);
- sys.removeStation(stat);
- sys.close();
- }
- catch (Exception e) {
- e.printStackTrace();
- }
- }
-
- /**
- * Read EtEvent objects from the ET server.
- *
- * Preserve all specific Exception types in the throws clause so caller
- * may implement their own error and state handling.
- *
- * @return The array of EtEvents.
- * @throws IOException
- * @throws EtException
- * @throws EtDeadException
- * @throws EtEmptyException
- * @throws EtBusyException
- * @throws EtTimeoutException
- * @throws EtWakeUpException
- * @throws EtClosedException
- */
- EtEvent[] readEtEvents()
- throws IOException, EtException, EtDeadException,
- EtEmptyException, EtBusyException, EtTimeoutException,
- EtWakeUpException, EtClosedException {
- return getEtSystem().getEvents(
- getEtAttachment(),
- waitMode,
- Modify.NOTHING,
- waitTime,
- chunkSize);
- }
-
- /**
- * Create an EtConnection with full list of configuration parameters.
- * @param name The name of the ET system e.g. the buffer file on disk.
- * @param host The name of the network host.
- * @param port The port of the network host.
- * @param blocking True for blocking behavior.
- * @param queueSize The queue size.
- * @param prescale The event prescale or 0 for none.
- * @param stationName The name of the ET station.
- * @param stationPosition The position of the ET station.
- * @param waitMode The wait mode.
- * @param waitTime The wait time if using timed wait.
- * @param chunkSize The number of ET events to return at once.
- * @return The EtConnection created from the parameters.
- */
- public static EtConnection createConnection(
- String name,
- String host,
- int port,
- boolean blocking,
- int queueSize,
- int prescale,
- String stationName,
- int stationPosition,
- Mode waitMode,
- int waitTime,
- int chunkSize) {
- try {
-
- // make a direct connection to ET system's tcp server
- EtSystemOpenConfig etConfig = new EtSystemOpenConfig(
- name,
- host,
- port);
+
+ // make a direct connection to ET system's tcp server
+ final EtSystemOpenConfig etConfig = new EtSystemOpenConfig(name, host, port);
// create ET system object with verbose debugging output
- EtSystem sys = new EtSystem(etConfig, EtConstants.debugInfo);
+ final EtSystem sys = new EtSystem(etConfig, EtConstants.debugInfo);
sys.open();
// configuration of a new station
- EtStationConfig stationConfig = new EtStationConfig();
- //statConfig.setFlowMode(cn.flowMode);
+ final EtStationConfig stationConfig = new EtStationConfig();
+ // statConfig.setFlowMode(cn.flowMode);
// FIXME: Flow mode hard-coded.
stationConfig.setFlowMode(EtConstants.stationSerial);
if (!blocking) {
@@ -179,58 +70,146 @@
}
// Set prescale.
if (prescale > 0) {
- //System.out.println("setting prescale to " + cn.prescale);
+ // System.out.println("setting prescale to " + cn.prescale);
stationConfig.setPrescale(prescale);
}
// Create the station.
- EtStation stat = sys.createStation(
- stationConfig,
- stationName,
- stationPosition);
+ final EtStation stat = sys.createStation(stationConfig, stationName, stationPosition);
// attach to new station
- EtAttachment att = sys.attach(stat);
+ final EtAttachment att = sys.attach(stat);
// Return new connection.
- EtConnection connection = new EtConnection(
- sys,
- att,
- stat,
- waitMode,
- waitTime,
- chunkSize
- );
-
+ final EtConnection connection = new EtConnection(sys, att, stat, waitMode, waitTime, chunkSize);
+
return connection;
- } catch (IOException |
- EtException |
- EtExistsException |
- EtClosedException |
- EtDeadException |
- EtTooManyException e) {
+ } catch (IOException | EtException | EtExistsException | EtClosedException | EtDeadException
+ | EtTooManyException e) {
throw new RuntimeException("Failed to create ET connection.", e);
}
}
-
- /**
- * Create an EtConnection with a set of default parameters.
- * @return An EtConnection with default parameters.
+
+ /**
+ * Create an <code>EtConnection</code> with a set of default parameters.
+ *
+ * @return an <code>EtConnection</code> with default parameters
*/
public static EtConnection createDefaultConnection() {
- return createConnection(
- "ETBuffer",
- "localhost",
- 11111,
- false,
- 0,
- 0,
- "MY_STATION",
- 1,
- Mode.TIMED,
- 5000000,
- 1);
- }
-
+ return createConnection("ETBuffer", "localhost", 11111, false, 0, 0, "MY_STATION", 1, Mode.TIMED, 5000000, 1);
+ }
+
+ /**
+ * The ET attachment.
+ */
+ private final EtAttachment att;
+
+ /**
+ * The chunk size.
+ */
+ private final int chunkSize;
+
+ /**
+ * The ET station.
+ */
+ private final EtStation stat;
+
+ /**
+ * The ET system object representing the connection to the server.
+ */
+ private final EtSystem sys;
+
+ /**
+ * The wait mode.
+ */
+ private final Mode waitMode;
+
+ /**
+ * The wait time.
+ */
+ private final int waitTime;
+
+ /**
+ * A class constructor for internal convenience.
+ *
+ * @param param The connection parameters.
+ * @param sys The ET system.
+ * @param att The ET attachment.
+ * @param stat The ET station.
+ */
+ private EtConnection(final EtSystem sys, final EtAttachment att, final EtStation stat, final Mode waitMode,
+ final int waitTime, final int chunkSize) {
+ this.sys = sys;
+ this.att = att;
+ this.stat = stat;
+ this.waitMode = waitMode;
+ this.waitTime = waitTime;
+ this.chunkSize = chunkSize;
+ }
+
+ /**
+ * Cleanup the ET connection.
+ */
+ public void cleanup() {
+ try {
+ if (!this.sys.alive()) {
+ throw new RuntimeException("EtSystem is not alive!");
+ }
+ this.sys.detach(this.att);
+ this.sys.removeStation(this.stat);
+ this.sys.close();
+ } catch (final Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ /**
+ * Get the ET attachment.
+ *
+ * @return The ET attachment.
+ */
+ public EtAttachment getEtAttachment() {
+ return this.att;
+ }
+
+ /**
+ * Get the ET station.
+ *
+ * @return The ET station.
+ */
+ public EtStation getEtStation() {
+ return this.stat;
+ }
+
+ /**
+ * Get the ET system.
+ *
+ * @return The ET system.
+ */
+ public EtSystem getEtSystem() {
+ return this.sys;
+ }
+
+ /**
+ * Read an array of <code>EtEvent</code> objects from the ET server.
+ * <p>
+ * Method signature preserves all specific exception types in the throws clause so that the caller may easily
+ * implement their own error and state handling depending on the kind of error that was thrown.
+ *
+ * @return The array of EtEvents.
+ * @throws IOException if <code>getEvents</code> throws this exception type
+ * @throws EtException if <code>getEvents</code> throws this exception type
+ * @throws EtDeadException if <code>getEvents</code> throws this exception type
+ * @throws EtEmptyException if <code>getEvents</code> throws this exception type
+ * @throws EtBusyException if <code>getEvents</code> throws this exception type
+ * @throws EtTimeoutException if <code>getEvents</code> throws this exception type
+ * @throws EtWakeUpException if <code>getEvents</code> throws this exception type
+ * @throws EtClosedException if <code>getEvents</code> throws this exception type
+ */
+ EtEvent[] readEtEvents() throws IOException, EtException, EtDeadException, EtEmptyException, EtBusyException,
+ EtTimeoutException, EtWakeUpException, EtClosedException {
+ return getEtSystem().getEvents(getEtAttachment(), this.waitMode, Modify.NOTHING, this.waitTime, this.chunkSize);
+ }
+
}
Modified: java/trunk/record-util/src/main/java/org/hps/record/et/EtEventProcessor.java
=============================================================================
--- java/trunk/record-util/src/main/java/org/hps/record/et/EtEventProcessor.java (original)
+++ java/trunk/record-util/src/main/java/org/hps/record/et/EtEventProcessor.java Mon Apr 13 17:23:55 2015
@@ -4,8 +4,9 @@
import org.jlab.coda.et.EtEvent;
/**
- * This is the basic abstract class that processors of
- * <tt>EtEvent</tt> objects should extend.
+ * This is the basic abstract class that processors of <tt>EtEvent</tt> objects should extend.
+ *
+ * @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a>
*/
public abstract class EtEventProcessor extends AbstractRecordProcessor<EtEvent> {
}
Modified: java/trunk/record-util/src/main/java/org/hps/record/et/EtEventQueue.java
=============================================================================
--- java/trunk/record-util/src/main/java/org/hps/record/et/EtEventQueue.java (original)
+++ java/trunk/record-util/src/main/java/org/hps/record/et/EtEventQueue.java Mon Apr 13 17:23:55 2015
@@ -5,15 +5,19 @@
/**
* A dynamic queue for supplying <tt>EtEvent</tt> objects to a loop.
- * This would most likely be run on a separate thread than the
- * loop to avoid undesired blocking behavior.
+ * <p>
+ * This should be run on a separate thread than the loop to avoid undesired blocking behavior.
+ *
+ * @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a>
*/
+// FIXME: This class is unused within HPS Java.
public final class EtEventQueue extends AbstractRecordQueue<EtEvent> {
- /**
- * Get the class of the record that is supplied.
- * @return The class of the supplied records.
- */
+ /**
+ * Get the class of the record that is supplied.
+ *
+ * @return the class of the supplied records
+ */
@Override
public Class<EtEvent> getRecordClass() {
return EtEvent.class;
Modified: java/trunk/record-util/src/main/java/org/hps/record/et/EtEventSource.java
=============================================================================
--- java/trunk/record-util/src/main/java/org/hps/record/et/EtEventSource.java (original)
+++ java/trunk/record-util/src/main/java/org/hps/record/et/EtEventSource.java Mon Apr 13 17:23:55 2015
@@ -10,103 +10,128 @@
import org.jlab.coda.et.EtEvent;
/**
- * Implement a loop record source supplying <tt>EtEvent</tt> objects
- * from an ET server connection.
+ * Implementation of a record source supplying <tt>EtEvent</tt> objects from an ET server connection to a record loop.
+ *
+ * @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a>
*/
public final class EtEventSource extends AbstractRecordSource {
-
- EtConnection connection;
- EtEvent currentRecord;
- Queue<EtEvent> eventQueue = new LinkedBlockingQueue<EtEvent>();
-
+
+ /**
+ * Indicates ET system error occurred.
+ */
+ @SuppressWarnings("serial")
+ public static class EtSourceException extends IOException {
+
+ /**
+ * Class constructor.
+ *
+ * @param message the error message
+ * @param cause the cause of the error
+ */
+ public EtSourceException(final String message, final Exception cause) {
+ super(message, cause);
+ }
+ }
+
+ /**
+ * The ET connection information.
+ */
+ private final EtConnection connection;
+
+ /**
+ * The current ET record.
+ */
+ private EtEvent currentRecord;
+
+ /**
+ * The ET event queue.
+ */
+ private final Queue<EtEvent> eventQueue = new LinkedBlockingQueue<EtEvent>();
+
/**
* Constructor that requires the connection parameters.
- * @param connection The EtConnection that should have a valid set of ET
- * connection parameters.
+ *
+ * @param connection the <code>EtConnection</code> which should have a valid set of ET connection parameters
*/
- public EtEventSource(EtConnection connection) {
+ public EtEventSource(final EtConnection connection) {
this.connection = connection;
}
-
+
/**
* Get the current record.
- * @return The current record.
+ *
+ * @return the current record
*/
@Override
public Object getCurrentRecord() throws IOException {
- return currentRecord;
+ return this.currentRecord;
}
-
+
/**
- * True because this source supports the <code>next</code> method.
- * @return True because this source supports next.
+ * Return <code>true</code> if the current record is not <code>null</code>
+ *
+ * @return <code>true</code> if the current record is not <code>null</code>
+ */
+ @Override
+ public boolean hasCurrent() {
+ return this.currentRecord != null;
+ }
+
+ /**
+ * Load the next <code>EtEvent</code>.
+ * <p>
+ * A cached record will be read from the queue or more records will be fetched from the ET server if the queue is
+ * empty.
+ *
+ * @throws NoSuchRecordException if the queue is empty and getting more records from the ET server fails
+ */
+ @Override
+ public void next() throws IOException, NoSuchRecordException {
+
+ // Fill the queue if there are no events cached.
+ if (this.eventQueue.size() == 0) {
+ readEtEvents();
+ }
+
+ // Poll the queue.
+ this.currentRecord = this.eventQueue.poll();
+
+ if (this.currentRecord == null) {
+ throw new NoSuchRecordException("ET record queue is empty.");
+ }
+ }
+
+ /**
+ * Read the next <code>EtEvent</code> array from the ET server.
+ *
+ * @throws IOException if reading the events fails
+ */
+ private void readEtEvents() throws IOException {
+ try {
+ final EtEvent[] mevs = this.connection.readEtEvents();
+ this.eventQueue.addAll(Arrays.asList(mevs));
+ } catch (final Exception e) {
+ throw new EtSourceException("Error while reading ET events.", e);
+ }
+ }
+
+ /**
+ * Get the number of records, which is the size of the current queue.
+ *
+ * @return the size of the queue
+ */
+ @Override
+ public long size() {
+ return this.eventQueue.size();
+ }
+
+ /**
+ * Return <code>true</code> because this source supports the <code>next</code> method
+ *
+ * @return <code>true</code> because this source supports the <code>next</code> method
*/
@Override
public boolean supportsNext() {
return true;
}
-
- /**
- * True if the current record is non-null.
- * @return True if current record is non-null.
- */
- @Override
- public boolean hasCurrent() {
- return currentRecord != null;
- }
-
- /**
- * Load the next <code>EtEvent</code> which will either read
- * a cached record from the queue or fetch more records from
- * the ET server if the queue is empty.
- * @throws NoSuchRecordException if the queue is empty and getting
- * more records from the ET server fails.
- */
- @Override
- public void next() throws IOException, NoSuchRecordException {
-
- // Fill the queue if there are no events cached.
- if (eventQueue.size() == 0) {
- readEtEvents();
- }
-
- // Poll the queue.
- currentRecord = eventQueue.poll();
-
- if (currentRecord == null) {
- throw new NoSuchRecordException("ET record queue is empty.");
- }
- }
-
- /**
- * Get the number of records which is the size of the current queue.
- * @return The size of the queue.
- */
- @Override
- public long size() {
- return this.eventQueue.size();
- }
-
- /**
- * Read the next <code>EtEvent</code> array from the ET server.
- * @throws IOException if reading events fails.
- */
- private void readEtEvents() throws IOException {
- try {
- EtEvent[] mevs = connection.readEtEvents();
- eventQueue.addAll(Arrays.asList(mevs));
- } catch (Exception e) {
- throw new EtSourceException("Error while reading ET events.", e);
- }
- }
-
- /**
- * An error that is used to indicate an error in the ET system
- * for the error handling of the loop.
- */
- public static class EtSourceException extends IOException {
- public EtSourceException(String message, Exception cause) {
- super(message, cause);
- }
- }
}
Modified: java/trunk/record-util/src/main/java/org/hps/record/et/EtStationThread.java
=============================================================================
--- java/trunk/record-util/src/main/java/org/hps/record/et/EtStationThread.java (original)
+++ java/trunk/record-util/src/main/java/org/hps/record/et/EtStationThread.java Mon Apr 13 17:23:55 2015
@@ -22,39 +22,67 @@
/**
* <p>
- * This is a class which runs ET event processing on a separate thread
- * using an ET station that is assigned to its own unique <code>EtSystem</code>.
+ * This is a class which runs ET event processing on a separate thread using an ET station that is assigned to its own
+ * unique <code>EtSystem</code>.
* <p>
* Specific processing of ET events is provided with an {@link EtEventProcessor}.
- *
- * @author Jeremy McCormick <[log in to unmask]>
+ *
+ * @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a>
*/
+// FIXME: Currently this is unused in HPS Java.
public final class EtStationThread extends Thread {
-
- EtEventProcessor processor;
- int stationPosition;
- String name;
-
- EtSystem system;
- EtStation station;
- EtAttachment attachment;
-
- int[] select;
-
+
+ /**
+ * The ET attachment.
+ */
+ private EtAttachment attachment;
+
+ /**
+ * The station name.
+ */
+ private final String name;
+
+ /**
+ * The ET event processor.
+ */
+ private final EtEventProcessor processor;
+
+ /**
+ * The station event selection array.
+ */
+ private int[] select;
+
+ /**
+ * The ET station.
+ */
+ private EtStation station;
+
+ /**
+ * The station position.
+ */
+ private final int stationPosition;
+
+ /**
+ * The <code>EtSystem</code> that represents the connection to the ET server.
+ */
+ private EtSystem system;
+
/**
* This creates an ET station that will run an ET processor on a separate thread.
- * @param processor The ET processor.
- * @param system The ET system.
- * @param name The name of the station.
- * @param stationPosition The station's position.
- * @param select The station's select array (can be null).
- */
- public EtStationThread(EtEventProcessor processor, EtSystem system, String name, int stationPosition, int[] select) {
+ *
+ * @param processor the ET processor
+ * @param system the ET system
+ * @param name the name of the station
+ * @param stationPosition the station's position
+ * @param select the station's select array (can be null)
+ */
+ public EtStationThread(final EtEventProcessor processor, final EtSystem system, final String name,
+ final int stationPosition, final int[] select) {
if (processor == null) {
throw new IllegalArgumentException("processor is null");
}
if (system == null) {
- throw new IllegalArgumentException("system is null");
+ throw new IllegalArgumentException("system is null");
}
if (name == null) {
throw new IllegalArgumentException("name is null");
@@ -68,132 +96,133 @@
}
this.select = select;
}
-
+
this.processor = processor;
this.name = name;
- this.stationPosition = stationPosition;
-
+ this.stationPosition = stationPosition;
+
// Copy parameters from the provided EtSystem.
try {
this.system = new EtSystem(new EtSystemOpenConfig(system.getConfig()));
- } catch (EtException e) {
+ } catch (final EtException e) {
throw new RuntimeException("Error setting up station.", e);
}
}
-
- /**
- * Setup this station for receiving events.
- */
- protected void setup() {
-
- if (!system.alive()) {
- try {
- system.open();
- } catch (IOException | EtException | EtTooManyException e) {
- throw new RuntimeException("Failed to open ET system.", e);
- }
- }
-
- try {
- // Create the basic station configuration.
- EtStationConfig stationConfig = new EtStationConfig();
- stationConfig.setFlowMode(EtConstants.stationSerial);
- stationConfig.setBlockMode(EtConstants.stationNonBlocking);
-
- // Setup event selection.
- if (select != null) {
- stationConfig.setSelect(select);
- stationConfig.setSelectMode(EtConstants.stationSelectMatch);
- }
-
- // Create station and attach to the ET system.
- station = system.createStation(stationConfig, name, stationPosition);
- attachment = system.attach(station);
-
- } catch (Exception e) {
- // Any errors during setup are re-thrown.
- throw new RuntimeException(e);
- }
- }
-
+
+ /**
+ * Disconnect the station.
+ * <p>
+ * This happens automatically at the end of the {@link #run()} method.
+ */
+ synchronized final void disconnect() {
+ if (this.system.alive()) {
+ if (this.attachment.isUsable()) {
+ try {
+ this.system.detach(this.attachment);
+ } catch (IOException | EtException | EtClosedException | EtDeadException e) {
+ e.printStackTrace();
+ }
+ }
+ this.system.close();
+ }
+ }
+
/**
* Run event processing on the station until woken up or interrupted.
*/
+ @Override
public final void run() {
-
- // Setup the ET system.
+
+ // Setup the ET system before processing events.
+ // FIXME: Should be called outside this method?
setup();
-
+
// Process ET events.
try {
- for (;;) {
-
+ for (;;) {
+
EtEvent[] events;
-
- try {
- events = system.getEvents(attachment, Mode.SLEEP, Modify.NOTHING, 0, 1 /* hard-coded to read 1 event for now */);
- system.putEvents(attachment, events);
- } catch (EtWakeUpException e) {
+
+ try {
+ events = this.system.getEvents(this.attachment, Mode.SLEEP, Modify.NOTHING, 0, 1);
+ this.system.putEvents(this.attachment, events);
+ } catch (final EtWakeUpException e) {
e.printStackTrace();
break;
- } catch (EtException | EtDeadException |
- EtClosedException | EtEmptyException |
- EtBusyException | EtTimeoutException |
- IOException e) {
+ } catch (EtException | EtDeadException | EtClosedException | EtEmptyException | EtBusyException
+ | EtTimeoutException | IOException e) {
e.printStackTrace();
break;
}
-
+
try {
// Process the events.
- for (EtEvent event : events) {
- processor.process(event);
+ for (final EtEvent event : events) {
+ this.processor.process(event);
}
- } catch (Exception e) {
+ } catch (final Exception e) {
// If there is an event processing error then print stack trace and continue.
e.printStackTrace();
continue;
}
-
+
// Disconnect if interrupted.
if (Thread.currentThread().isInterrupted()) {
break;
}
- }
+ }
} finally {
// Disconnect the ET system.
disconnect();
- }
- }
-
- /**
- * Disconnect the station.
- * This will happen automatically at the end of the {@link #run()} method.
- */
- synchronized final void disconnect() {
- if (system.alive()) {
- if (attachment.isUsable()) {
- try {
- system.detach(attachment);
- } catch (IOException | EtException | EtClosedException | EtDeadException e) {
- e.printStackTrace();
- }
- }
- system.close();
- }
- }
-
- /**
- * Wake up the station if it is blocked which will cause it to disconnect.
+ }
+ }
+
+ /**
+ * Setup this station for receiving events.
+ */
+ protected void setup() {
+
+ if (!this.system.alive()) {
+ try {
+ this.system.open();
+ } catch (IOException | EtException | EtTooManyException e) {
+ throw new RuntimeException("Failed to open ET system.", e);
+ }
+ }
+
+ try {
+ // Create the basic station configuration.
+ final EtStationConfig stationConfig = new EtStationConfig();
+ stationConfig.setFlowMode(EtConstants.stationSerial);
+ stationConfig.setBlockMode(EtConstants.stationNonBlocking);
+
+ // Setup event selection.
+ if (this.select != null) {
+ stationConfig.setSelect(this.select);
+ stationConfig.setSelectMode(EtConstants.stationSelectMatch);
+ }
+
+ // Create station and attach to the ET system.
+ this.station = this.system.createStation(stationConfig, this.name, this.stationPosition);
+ this.attachment = this.system.attach(this.station);
+
+ } catch (final Exception e) {
+ // Any errors during setup are re-thrown.
+ throw new RuntimeException(e);
+ }
+ }
+
+ /**
+ * Wake up the station if it is blocked, which will cause it to disconnect.
*/
public final synchronized void wakeUp() {
- if (system.alive()) {
- if (attachment.isUsable()) {
- try {
- system.wakeUpAll(station);
+ if (this.system.alive()) {
+ if (this.attachment.isUsable()) {
+ try {
+ this.system.wakeUpAll(this.station);
} catch (IOException | EtException | EtClosedException e) {
e.printStackTrace();
- }
+ }
}
}
}
Modified: java/trunk/record-util/src/main/java/org/hps/record/et/PreStartProcessor.java
=============================================================================
--- java/trunk/record-util/src/main/java/org/hps/record/et/PreStartProcessor.java (original)
+++ java/trunk/record-util/src/main/java/org/hps/record/et/PreStartProcessor.java Mon Apr 13 17:23:55 2015
@@ -9,23 +9,38 @@
import org.jlab.coda.jevio.EvioReader;
/**
- * @author Jeremy McCormick <[log in to unmask]>
+ * An ET processor that will activate the conditions system from PRESTART events.
+ *
+ * @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a>
*/
+// FIXME: This class is currently unused in HPS Java.
public class PreStartProcessor extends EtEventProcessor {
- String detectorName;
- EvioDetectorConditionsProcessor conditionsProcessor;
-
- public PreStartProcessor(String detectorName) {
- this.detectorName = detectorName;
+ /**
+ * The EVIO processor that will activate the conditions system.
+ */
+ private final EvioDetectorConditionsProcessor conditionsProcessor;
+
+ /**
+ * Class constructor.
+ *
+ * @param detectorName the name of the detector model
+ */
+ public PreStartProcessor(final String detectorName) {
this.conditionsProcessor = new EvioDetectorConditionsProcessor(detectorName);
}
-
- public void process(EtEvent event) {
+
+ /**
+ * Process an ET event and activate the conditions system if applicable.
+ *
+ * @param event the <code>EtEvent</code> to process
+ */
+ @Override
+ public void process(final EtEvent event) {
EvioEvent evioEvent = null;
try {
evioEvent = new EvioReader(event.getDataBuffer()).parseNextEvent();
- conditionsProcessor.startRun(evioEvent);
+ this.conditionsProcessor.startRun(evioEvent);
} catch (IOException | EvioException e) {
throw new RuntimeException(e);
}
Added: java/trunk/record-util/src/main/java/org/hps/record/et/package-info.java
=============================================================================
--- java/trunk/record-util/src/main/java/org/hps/record/et/package-info.java (added)
+++ java/trunk/record-util/src/main/java/org/hps/record/et/package-info.java Mon Apr 13 17:23:55 2015
@@ -0,0 +1,6 @@
+/**
+ * ET record processing utilities.
+ *
+ * @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a>
+ */
+package org.hps.record.et;
Modified: java/trunk/record-util/src/main/java/org/hps/record/evio/EvioDetectorConditionsProcessor.java
=============================================================================
--- java/trunk/record-util/src/main/java/org/hps/record/evio/EvioDetectorConditionsProcessor.java (original)
+++ java/trunk/record-util/src/main/java/org/hps/record/evio/EvioDetectorConditionsProcessor.java Mon Apr 13 17:23:55 2015
@@ -7,63 +7,78 @@
/**
* <p>
- * This is an {@link EvioEventProcessor} for initializing the conditions system
- * from EVIO events.
- * <p>
- * The {@link #startRun(EvioEvent)} method will setup conditions from the pre start
- * events.
- * <p>
- * The {@link #process(EvioEvent)} method will setup conditions from a head bank
- * if it is present in the event.
- *
- * @author Jeremy McCormick <[log in to unmask]>
+ * This is an {@link EvioEventProcessor} for initializing the conditions system from EVIO events. The
+ * {@link #startRun(EvioEvent)} method will setup conditions from PRESTART events. The {@link #process(EvioEvent)}
+ * method will setup conditions from a head bank, if it is present in the event.
+ *
+ * @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a>
*/
public class EvioDetectorConditionsProcessor extends EvioEventProcessor {
- private String detectorName;
-
- public EvioDetectorConditionsProcessor(String detectorName) {
+ /**
+ * The name of the detector model.
+ */
+ private final String detectorName;
+
+ /**
+ * Class constructor.
+ *
+ * @param detectorName the name of the detector model
+ */
+ public EvioDetectorConditionsProcessor(final String detectorName) {
if (detectorName == null) {
throw new IllegalArgumentException("The detectorName argument is null.");
}
this.detectorName = detectorName;
}
-
+
+ /**
+ * Process an <code>EvioEvent</code> and activate the conditions system if applicable.
+ *
+ * @param evioEvent the <code>EvioEvent</code> to process
+ */
@Override
- public void process(EvioEvent evioEvent) throws Exception {
+ public void process(final EvioEvent evioEvent) throws Exception {
// Get the head head bank from event.
- BaseStructure headBank = EvioEventUtilities.getHeadBank(evioEvent);
-
+ final BaseStructure headBank = EvioEventUtilities.getHeadBank(evioEvent);
+
// Is the head bank present?
- if (headBank != null) {
-
+ if (headBank != null) {
+
// Get the run number from the head bank.
- int runNumber = headBank.getIntData()[1];
+ final int runNumber = headBank.getIntData()[1];
// Initialize the conditions system from the detector name and run number.
try {
- ConditionsManager.defaultInstance().setDetector(detectorName, runNumber);
- } catch (ConditionsNotFoundException e) {
+ ConditionsManager.defaultInstance().setDetector(this.detectorName, runNumber);
+ } catch (final ConditionsNotFoundException e) {
throw new RuntimeException("Error setting up conditions from EVIO head bank.", e);
- }
- }
+ }
+ }
}
+ /**
+ * Start of run action.
+ * <p>
+ * This will only activate if the evioEvent is a PRESTART event.
+ *
+ * @param evioEvent the <code>EvioEvent</code> to process
+ */
@Override
- public void startRun(EvioEvent evioEvent) {
- //System.out.println("EvioDetectorConditionsProcessor.startRun");
+ public void startRun(final EvioEvent evioEvent) {
+ // System.out.println("EvioDetectorConditionsProcessor.startRun");
if (EvioEventUtilities.isPreStartEvent(evioEvent)) {
// Get the pre start event's data bank.
- int[] data = EvioEventUtilities.getControlEventData(evioEvent);
-
+ final int[] data = EvioEventUtilities.getControlEventData(evioEvent);
+
// Get the run number from the bank.
- int runNumber = data[1];
-
+ final int runNumber = data[1];
+
// Initialize the conditions system from the detector name and run number.
try {
- //System.out.println(" setting up conditions from pre start: " + detectorName + " #" + runNumber);
- ConditionsManager.defaultInstance().setDetector(detectorName, runNumber);
- } catch (ConditionsNotFoundException e) {
+ // System.out.println(" setting up conditions from pre start: " + detectorName + " #" + runNumber);
+ ConditionsManager.defaultInstance().setDetector(this.detectorName, runNumber);
+ } catch (final ConditionsNotFoundException e) {
throw new RuntimeException("Error setting up conditions from EVIO pre start event.", e);
}
}
Modified: java/trunk/record-util/src/main/java/org/hps/record/evio/EvioEventConstants.java
=============================================================================
--- java/trunk/record-util/src/main/java/org/hps/record/evio/EvioEventConstants.java (original)
+++ java/trunk/record-util/src/main/java/org/hps/record/evio/EvioEventConstants.java Mon Apr 13 17:23:55 2015
@@ -1,32 +1,94 @@
package org.hps.record.evio;
-public class EvioEventConstants {
-
- // This is the old tag for physics events.
+/**
+ * This is a set of static EVIO event constants.
+ *
+ * @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a>
+ */
+public final class EvioEventConstants {
+
+ /**
+ * END event tag.
+ */
+ public static final int END_EVENT_TAG = 20;
+
+ /**
+ * EPICS bank tag.
+ */
+ public static final int EPICS_BANK_TAG = 57620;
+
+ /**
+ * EPICS 20 second event tag.
+ */
+ // FIXME: This is unused and not handled in event processing.
+ public static final int EPICS_BANK_TAG_20s = -1;
+
+ /**
+ * EPICS 2 second event tag.
+ */
+ // FIXME: This is unused and not handled in event processing.
+ public static final int EPICS_BANK_TAG_2s = -1;
+
+ /**
+ * EPICS event tag.
+ */
+ public static final int EPICS_EVENT_TAG = 31;
+
+ /**
+ * Event ID bank tag.
+ */
+ public static final int EVENTID_BANK_TAG = 0xC000;
+
+ /**
+ * GO event tag.
+ */
+ public static final int GO_EVENT_TAG = 18;
+
+ /**
+ * Bank tag for header bank with run and event numbers in physics events.
+ */
+ public static final int HEAD_BANK_TAG = 0xe10F;
+
+ /**
+ * Pause event tag.
+ */
+ // FIXME: Not generally handled or used in event processing.
+ public static final int PAUSE_EVENT_TAG = 19;
+
+ /**
+ * This is the old tag for physics events.
+ */
public static final int PHYSICS_EVENT_TAG = 1;
-
- // CODA control event tags.
+
+ /**
+ * Event tags greater than or equal to this will be physics events.
+ */
+ public static final int PHYSICS_START_TAG = 32;
+
+ /**
+ * PRESTART event tag.
+ */
+ public static final int PRESTART_EVENT_TAG = 17;
+
+ /**
+ * Tag of the scalars integer bank, which is a child of the crate bank.
+ */
+ public static final int SCALARS_BANK_TAG = 57621;
+
+ /**
+ * Tag of the scalars crate bank, which is a child of the top bank.
+ */
+ public static final int SCALARS_CRATE_TAG = 39;
+
+ /**
+ * CODA SYNC event tag.
+ */
public static final int SYNC_EVENT_TAG = 16;
- public static final int PRESTART_EVENT_TAG = 17;
- public static final int GO_EVENT_TAG = 18;
- public static final int PAUSE_EVENT_TAG = 19;
- public static final int END_EVENT_TAG = 20;
-
- // Special tag for events with EPICS scalars.
- public static final int EPICS_EVENT_TAG = 31;
-
- // Event tags greater than or equal to this will be physics events.
- public static final int PHYSICS_START_TAG = 32;
-
- public static final int EVENTID_BANK_TAG = 0xC000;
-
- // Bank tag for header bank with run and event numbers in physics events.
- public static final int HEAD_BANK_TAG = 0xe10F;
-
- public static final int EPICS_BANK_TAG = 57620;
- public static final int EPICS_BANK_TAG_2s = -1;
- public static final int EPICS_BANK_TAG_20s = -1;
- //public static final int EPICS_BANK_TAG_2s = -1;
- //public static final int EPICS_BANK_TAG_20s = -1;
-
+
+ /**
+ * Disallow class instantiation.
+ */
+ private EvioEventConstants() {
+ throw new UnsupportedOperationException("Do not instantiate this class.");
+ }
}
Modified: java/trunk/record-util/src/main/java/org/hps/record/evio/EvioEventProcessor.java
=============================================================================
--- java/trunk/record-util/src/main/java/org/hps/record/evio/EvioEventProcessor.java (original)
+++ java/trunk/record-util/src/main/java/org/hps/record/evio/EvioEventProcessor.java Mon Apr 13 17:23:55 2015
@@ -4,8 +4,9 @@
import org.jlab.coda.jevio.EvioEvent;
/**
- * This is the basic abstract class that processors of
- * <tt>EvioEvent</tt> objects should extend.
+ * This is the basic abstract class that processors of <code>EvioEvent</code> objects should extend.
+ *
+ * @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a>
*/
-public abstract class EvioEventProcessor extends AbstractRecordProcessor<EvioEvent> {
+public abstract class EvioEventProcessor extends AbstractRecordProcessor<EvioEvent> {
}
Modified: java/trunk/record-util/src/main/java/org/hps/record/evio/EvioEventQueue.java
=============================================================================
--- java/trunk/record-util/src/main/java/org/hps/record/evio/EvioEventQueue.java (original)
+++ java/trunk/record-util/src/main/java/org/hps/record/evio/EvioEventQueue.java Mon Apr 13 17:23:55 2015
@@ -5,17 +5,26 @@
/**
* A dynamic queue providing <tt>EvioEvent</tt> objects to a loop.
+ *
+ * @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a>
*/
public final class EvioEventQueue extends AbstractRecordQueue<EvioEvent> {
- public EvioEventQueue(long timeoutMillis, int maxSize) {
+ /**
+ * Class constructor.
+ *
+ * @param timeoutMillis the timeout for accessing records from the queue
+ * @param maxSize the maximum queue size
+ */
+ public EvioEventQueue(final long timeoutMillis, final int maxSize) {
super(timeoutMillis, maxSize);
}
-
- /**
- * Get the class of the supplied records.
- * @return The class of the supplied records.
- */
+
+ /**
+ * Get the class of the supplied records.
+ *
+ * @return the class of the supplied records
+ */
@Override
public Class<EvioEvent> getRecordClass() {
return EvioEvent.class;
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 Mon Apr 13 17:23:55 2015
@@ -1,126 +1,33 @@
package org.hps.record.evio;
-import static org.hps.record.evio.EvioEventConstants.*;
+import static org.hps.record.evio.EvioEventConstants.END_EVENT_TAG;
+import static org.hps.record.evio.EvioEventConstants.EPICS_EVENT_TAG;
+import static org.hps.record.evio.EvioEventConstants.GO_EVENT_TAG;
+import static org.hps.record.evio.EvioEventConstants.PAUSE_EVENT_TAG;
+import static org.hps.record.evio.EvioEventConstants.PHYSICS_START_TAG;
+import static org.hps.record.evio.EvioEventConstants.PRESTART_EVENT_TAG;
+import static org.hps.record.evio.EvioEventConstants.SYNC_EVENT_TAG;
import org.jlab.coda.jevio.BaseStructure;
import org.jlab.coda.jevio.EvioEvent;
/**
- * This is a set of basic static utility methods on <code>EvioEvent</code>
- * objects.
+ * This is a set of basic static utility methods for <code>EvioEvent</code> objects.
*
- * @author Jeremy McCormick <[log in to unmask]>
+ * @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a>
*/
public final class EvioEventUtilities {
-
- private EvioEventUtilities() {
- }
-
- /**
- * Get the event tag from the header bank.
- * @param event The input EvioEvent.
- * @return The event tag from the header bank.
- */
- public static int getEventTag(EvioEvent event) {
- return event.getHeader().getTag();
- }
-
- /**
- * Check if the EVIO event is a PRE START event indicating the beginning of
- * a run.
- *
- * @param event The EvioEvent.
- * @return True if the event is a pre start event.
- */
- public static boolean isPreStartEvent(EvioEvent event) {
- return event.getHeader().getTag() == PRESTART_EVENT_TAG;
- }
-
- /**
- * Check if the EVIO event is a GO event.
- *
- * @param event The EvioEvent.
- * @return True if the event is a go event.
- */
- public static boolean isGoEvent(EvioEvent event) {
- return event.getHeader().getTag() == GO_EVENT_TAG;
- }
-
- /**
- * Check if the EVIO event is a PAUSE event.
- *
- * @param event The EvioEvent.
- * @return True if the event is a pause event.
- */
- public static boolean isPauseEvent(EvioEvent event) {
- return event.getHeader().getTag() == PAUSE_EVENT_TAG;
- }
-
- /**
- * Check if this event is an END event.
- *
- * @param event The EvioEvent.
- * @return True if this event is an end event.
- */
- public static boolean isEndEvent(EvioEvent event) {
- return event.getHeader().getTag() == END_EVENT_TAG;
- }
-
- /**
- * Check if this event has physics data.
- *
- * @param event The EvioEvent.
- * @return True if this event is a physics event.
- */
- public static boolean isPhysicsEvent(EvioEvent event) {
- return (event.getHeader().getTag() >= PHYSICS_START_TAG ||
- event.getHeader().getTag() < SYNC_EVENT_TAG);
- // return event.getHeader().getTag() == PHYSICS_EVENT_TAG;
- }
-
- /**
- * Check if this event is a SYNC event.
- *
- * @param event The EvioEvent.
- * @return True if this event is a SYNC event.
- */
- public static boolean isSyncEvent(EvioEvent event) {
- return event.getHeader().getTag() == SYNC_EVENT_TAG;
- }
-
- /**
- * Check if this event is an EPICS event containing scalar data.
- *
- * @param event The EvioEvent.
- * @return True if this event is an EPICS event.
- */
- public static boolean isEpicsEvent(EvioEvent event) {
- return event.getHeader().getTag() == EPICS_EVENT_TAG;
- }
-
- /**
- * True if <code>event</code> is an EVIO control event.
- * @return True if event is a control event.
- */
- public static boolean isControlEvent(EvioEvent event) {
- return isPreStartEvent(event) ||
- isGoEvent(event) ||
- isPauseEvent(event) ||
- isEndEvent(event) ||
- isSyncEvent(event) ||
- isEpicsEvent(event);
- }
/**
* Extract the CODA run data stored in a control event.
*
- * @param event The EvioEvent.
- * @return The int data for the control event. Null if the event is not a
- * control event, or the int bank for the control event is not found.
+ * @param event the <code>EvioEvent</code> to handle
+ * @return the <code>int</code> data array for the control event or <code>null</code> if the event is not a control
+ * event or data bank is not found
*/
- public static int[] getControlEventData(EvioEvent event) {
- int eventTag = event.getHeader().getTag();
- switch (eventTag) { //if the event's not a control event, stop
+ public static int[] getControlEventData(final EvioEvent event) {
+ final int eventTag = event.getHeader().getTag();
+ switch (eventTag) { // if the event's not a control event, stop
case PRESTART_EVENT_TAG:
case PAUSE_EVENT_TAG:
case END_EVENT_TAG:
@@ -131,30 +38,42 @@
return null;
}
- int[] data = event.getIntData();
- if (data != null) { //found the data in the top-level bank
+ final int[] data = event.getIntData();
+ if (data != null) { // found the data in the top-level bank
return data;
- } else { //data is not in event bank; look for the data bank whose tag matches the event type
- for (BaseStructure bank : event.getChildrenList()) {
+ } else { // data is not in event bank; look for the data bank whose tag matches the event type
+ for (final BaseStructure bank : event.getChildrenList()) {
if (bank.getHeader().getTag() == eventTag) {
- return bank.getIntData(); //return whatever int data this bank has
+ return bank.getIntData(); // return whatever int data this bank has
}
}
- return null; //we didn't find the bank; give up
+ return null; // we didn't find the bank; give up
}
}
-
+
+ /**
+ * Get the event tag from the header bank.
+ *
+ * @param event the input <code>EvioEvent</code>
+ * @return the event tag from the header bank
+ */
+ public static int getEventTag(final EvioEvent event) {
+ return event.getHeader().getTag();
+ }
+
/**
* Get the head bank with event header that includes run number.
+ * <p>
* This is a nested bank.
- * @param evioEvent The EVIO event.
- * @return The head bank or null if does not exist in this event.
+ *
+ * @param evioEvent the <code>EvioEvent</code> with the head bank
+ * @return the head bank or <code>null</code> if it does not exist
*/
- public static BaseStructure getHeadBank(EvioEvent evioEvent) {
+ public static BaseStructure getHeadBank(final EvioEvent evioEvent) {
if (evioEvent.getChildCount() > 0) {
- for (BaseStructure topBank : evioEvent.getChildrenList()) {
+ for (final BaseStructure topBank : evioEvent.getChildrenList()) {
if (topBank.getChildrenList() != null) {
- for (BaseStructure nestedBank : topBank.getChildrenList()) {
+ for (final BaseStructure nestedBank : topBank.getChildrenList()) {
if (nestedBank.getHeader().getTag() == EvioEventConstants.HEAD_BANK_TAG) {
return nestedBank;
}
@@ -162,20 +81,22 @@
}
}
}
- return null;
+ return null;
}
-
+
/**
* Get the run number from an EVIO event.
- * @return The run number.
+ *
+ * @return the run number
+ * @throws IllegalArgumentException if event does not have a head bank
*/
- public static int getRunNumber(EvioEvent event) {
+ public static int getRunNumber(final EvioEvent event) {
if (isControlEvent(event)) {
return getControlEventData(event)[1];
} else if (isPhysicsEvent(event)) {
- BaseStructure headBank = EvioEventUtilities.getHeadBank(event);
- if (headBank != null) {
- return headBank.getIntData()[1];
+ final BaseStructure headBank = EvioEventUtilities.getHeadBank(event);
+ if (headBank != null) {
+ return headBank.getIntData()[1];
} else {
throw new IllegalArgumentException("Head bank is missing from physics event.");
}
@@ -184,4 +105,93 @@
throw new IllegalArgumentException("Wrong event type: " + event.getHeader().getTag());
}
}
+
+ /**
+ * Return <code>true</code> if <code>event</code> is a CODA control event such as a PRESTART or GO event.
+ *
+ * @return <code>true</code> if event is a control event
+ */
+ public static boolean isControlEvent(final EvioEvent event) {
+ return isPreStartEvent(event) || isGoEvent(event) || isPauseEvent(event) || isEndEvent(event)
+ || isSyncEvent(event) || isEpicsEvent(event);
+ }
+
+ /**
+ * Check if this event is an END event.
+ *
+ * @param event the <code>EvioEvent</code> to check
+ * @return <code>true</code> if this event is an END event.
+ */
+ public static boolean isEndEvent(final EvioEvent event) {
+ return event.getHeader().getTag() == END_EVENT_TAG;
+ }
+
+ /**
+ * Check if this event is an EPICS event.
+ *
+ * @param event the <code>EvioEvent</code> to check
+ * @return <code>true</code> if this event is an EPICS event
+ */
+ public static boolean isEpicsEvent(final EvioEvent event) {
+ return event.getHeader().getTag() == EPICS_EVENT_TAG;
+ }
+
+ /**
+ * Check if the event is a GO event.
+ *
+ * @param event the <code>EvioEvent</code> to check
+ * @return <code>true</code> if the event is a GO event.
+ */
+ public static boolean isGoEvent(final EvioEvent event) {
+ return event.getHeader().getTag() == GO_EVENT_TAG;
+ }
+
+ /**
+ * Check if the EVIO event is a PAUSE event.
+ *
+ * @param event the <code>EvioEvent</code> to check
+ * @return <code>true</code> if the event is a PAUSE event.
+ */
+ public static boolean isPauseEvent(final EvioEvent event) {
+ return event.getHeader().getTag() == PAUSE_EVENT_TAG;
+ }
+
+ /**
+ * Check if this event has physics data.
+ *
+ * @param event the <code>EvioEvent</code> to check
+ * @return <code>true</code> if this event is a physics event
+ */
+ public static boolean isPhysicsEvent(final EvioEvent event) {
+ // This checks if the tag is outside the CODA control event range.
+ return event.getHeader().getTag() >= PHYSICS_START_TAG || event.getHeader().getTag() < SYNC_EVENT_TAG;
+ // return event.getHeader().getTag() == PHYSICS_EVENT_TAG;
+ }
+
+ /**
+ * Check if the EVIO event is a PRESTART event indicating the beginning of a run.
+ *
+ * @param event the <code>EvioEvent</code> to check
+ * @return <code>true</code> if the event is a PRESTART event
+ */
+ public static boolean isPreStartEvent(final EvioEvent event) {
+ return event.getHeader().getTag() == PRESTART_EVENT_TAG;
+ }
+
+ /**
+ * Check if this event is a SYNC event.
+ *
+ * @param event the <code>EvioEvent</code> to check
+ * @return <code>true</code> if this event is a SYNC event
+ */
+ public static boolean isSyncEvent(final EvioEvent event) {
+ return event.getHeader().getTag() == SYNC_EVENT_TAG;
+ }
+
+ /**
+ * Class should not be instantiated.
+ */
+ private EvioEventUtilities() {
+ throw new UnsupportedOperationException("Do not instantiate this class.");
+ }
}
Modified: java/trunk/record-util/src/main/java/org/hps/record/evio/EvioFileProducer.java
=============================================================================
--- java/trunk/record-util/src/main/java/org/hps/record/evio/EvioFileProducer.java (original)
+++ java/trunk/record-util/src/main/java/org/hps/record/evio/EvioFileProducer.java Mon Apr 13 17:23:55 2015
@@ -21,23 +21,26 @@
/**
* A utility class for streaming an EVIO file to an ET server.
- *
- * NOTE: Original version was copied from the CODA group's ET java module.
+ * <p>
+ * Original version was copied from the CODA group's ET java module.
+ *
+ * @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a>
*/
// TODO: Add option to set number of events in the put array.
public final class EvioFileProducer {
- 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;
+ /**
+ * Flag to turn on/off debug print.
+ */
private static final boolean debug = false;
- EvioFileProducer() {
+ /**
+ * The externally accessible main method.
+ *
+ * @param args The command line arguments.
+ */
+ public static void main(final String[] args) {
+ new EvioFileProducer().doMain(args); // call wrapper method
}
/**
@@ -45,8 +48,7 @@
*/
private static void usage() {
System.out.println("\nUsage: java Producer -f <et name> -e <evio file> [-p <server port>] [-host <host>]"
- + " [-d <delay in millisec>] [-g <group #>]\n\n"
- + " -f ET system's name\n"
+ + " [-d <delay in millisec>] [-g <group #>]\n\n" + " -f ET system's name\n"
+ " -s size in bytes for requested events\n"
+ " -p port number for a udp broadcast\n"
+ " -g group number of new events to get\n"
@@ -57,83 +59,129 @@
}
/**
+ * The byte buffer used to transfer data from EVIO to ET.
+ */
+ private ByteBuffer byteBuffer;
+
+ /**
+ * A delay in milliseconds between put operations.
+ */
+ private int delay = 0;
+
+ /**
+ * The ET system name which generally maps to a buffer file.
+ */
+ private String etName;
+
+ /**
+ * The list of input EVIO files.
+ */
+ private final List<File> evioFiles = new ArrayList<File>();
+
+ /**
+ * This is used for a "group" value when doing put but not sure what it actually does.
+ */
+ private int group = 1;
+
+ /**
+ * The server host name.
+ */
+ private String host;
+
+ /**
+ * The server's network port.
+ */
+ private int port = EtConstants.serverPort;
+
+ /**
+ * The EVIO reader used to read the input EVIO events.
+ */
+ private EvioReader reader;
+
+ /**
+ * The default ET event size.
+ */
+ // FIXME: Should be a lot bigger?
+ private int size = 10000; // Default event size.
+
+ /**
+ * Class constructor.
+ */
+ private EvioFileProducer() {
+ }
+
+ /**
* Copy byte buffer to an <code>EtEvent</code>.
+ *
* @param event The target EtEvent.
*/
- public void copyToEtEvent(EtEvent event) {
- event.getDataBuffer().put(byteBuffer);
- }
-
- /**
- * The externally accessible main method.
+ public void copyToEtEvent(final EtEvent event) {
+ event.getDataBuffer().put(this.byteBuffer);
+ }
+
+ /**
+ * Wrapper method called in main.
+ *
* @param args The command line arguments.
*/
- public static void main(String[] args) {
- (new EvioFileProducer()).doMain(args); // call wrapper method
- }
-
- /**
- * Wrapper method called in main.
- * @param args The command line arguments.
- */
- public void doMain(String[] args) {
+ public void doMain(final String[] args) {
try {
for (int i = 0; i < args.length; i++) {
if (args[i].equalsIgnoreCase("-e")) {
- //evioFileName = new String(args[++i]);
- evioFiles.add(new File(args[++i]));
+ // evioFileName = new String(args[++i]);
+ this.evioFiles.add(new File(args[++i]));
} else if (args[i].equalsIgnoreCase("-f")) {
- etName = args[++i];
+ this.etName = args[++i];
} else if (args[i].equalsIgnoreCase("-host")) {
- host = args[++i];
+ this.host = args[++i];
} else if (args[i].equalsIgnoreCase("-p")) {
try {
- port = Integer.parseInt(args[++i]);
- if ((port < 1024) || (port > 65535)) {
+ this.port = Integer.parseInt(args[++i]);
+ if (this.port < 1024 || this.port > 65535) {
System.out.println("Port number must be between 1024 and 65535.");
usage();
return;
}
- } catch (NumberFormatException ex) {
+ } catch (final NumberFormatException ex) {
System.out.println("Did not specify a proper port number.");
usage();
return;
}
} else if (args[i].equalsIgnoreCase("-s")) {
try {
- size = Integer.parseInt(args[++i]);
- if (size < 1) {
+ this.size = Integer.parseInt(args[++i]);
+ if (this.size < 1) {
System.out.println("Size needs to be positive int.");
usage();
return;
}
- } catch (NumberFormatException ex) {
+ } catch (final NumberFormatException ex) {
System.out.println("Did not specify a proper size.");
usage();
return;
}
} else if (args[i].equalsIgnoreCase("-g")) {
try {
- group = Integer.parseInt(args[++i]);
- if ((group < 1) || (group > 10)) {
+ this.group = Integer.parseInt(args[++i]);
+ if (this.group < 1 || this.group > 10) {
System.out.println("Group number must be between 0 and 10.");
usage();
return;
}
- } catch (NumberFormatException ex) {
+ } catch (final NumberFormatException ex) {
System.out.println("Did not specify a proper group number.");
usage();
return;
}
} else if (args[i].equalsIgnoreCase("-d")) {
try {
- delay = Integer.parseInt(args[++i]);
- if (delay < 1) {
+ this.delay = Integer.parseInt(args[++i]);
+ if (this.delay < 1) {
System.out.println("delay must be > 0.");
usage();
return;
}
- } catch (NumberFormatException ex) {
+ } catch (final NumberFormatException ex) {
System.out.println("Did not specify a proper delay.");
usage();
return;
@@ -144,18 +192,18 @@
}
}
- if (host == null) {
- //host = EtConstants.hostAnywhere;
- host = InetAddress.getLocalHost().getHostName();
+ if (this.host == null) {
+ // host = EtConstants.hostAnywhere;
+ this.host = InetAddress.getLocalHost().getHostName();
}
// ET name is required.
- if (etName == null) {
+ if (this.etName == null) {
System.out.println("EVIO file name argument is required");
usage();
return;
}
-
+
if (this.evioFiles.size() == 0) {
System.out.println("At least one input EVIO file is required.");
usage();
@@ -164,7 +212,7 @@
// Check existence of EVIO files.
System.out.println("EVIO input files ...");
- for (File evioFile : evioFiles) {
+ for (final File evioFile : this.evioFiles) {
System.out.println(evioFile.getPath());
if (!evioFile.exists()) {
System.err.println("EVIO file does not exist: " + evioFile.getPath());
@@ -173,25 +221,25 @@
}
// Setup ET system with the command line config.
- EtSystemOpenConfig config = new EtSystemOpenConfig(etName, host, port);
- EtSystem sys = new EtSystem(config, EtConstants.debugInfo);
+ final EtSystemOpenConfig config = new EtSystemOpenConfig(this.etName, this.host, this.port);
+ final EtSystem sys = new EtSystem(config, EtConstants.debugInfo);
sys.open();
- EtStation gc = sys.stationNameToObject("GRAND_CENTRAL");
- EtAttachment att = sys.attach(gc);
+ final EtStation gc = sys.stationNameToObject("GRAND_CENTRAL");
+ final EtAttachment att = sys.attach(gc);
// array of events
EtEvent[] mevs;
-
+
// Loop over input EVIO file list.
- for (File evioFile : evioFiles) {
-
+ for (final File evioFile : this.evioFiles) {
+
// Open EVIO reader.
System.out.println("Opening next EVIO file: " + evioFile.getPath());
- reader = new EvioReader(evioFile.getPath(), false);
+ this.reader = new EvioReader(evioFile.getPath(), false);
// Print number of events.
if (debug) {
- System.out.println("EVIO file opened with " + reader.getEventCount() + " events.");
+ System.out.println("EVIO file opened with " + this.reader.getEventCount() + " events.");
}
// Ref to current EVIO event.
@@ -199,12 +247,12 @@
// Event sequence number; starts with 1.
int eventCount = 0;
-
+
// Loop until event source is exhausted.
while (true) {
// Get next event.
- event = reader.nextEvent();
+ event = this.reader.nextEvent();
++eventCount;
if (eventCount % 1000 == 0) {
System.out.println("EvioFileProducer - event <" + eventCount + ">");
@@ -212,62 +260,64 @@
if (event == null) {
break;
}
-
- // Try to parse the next event.
- try {
- reader.parseEvent(event);
+
+ // Try to parse the next event.
+ try {
+ this.reader.parseEvent(event);
if (debug) {
- System.out.println("event #" + event.getEventNumber() + " is " + event.getTotalBytes() + " bytes");
- }
- } catch (Exception e) {
+ System.out.println("event #" + event.getEventNumber() + " is " + event.getTotalBytes()
+ + " bytes");
+ }
+ } catch (final Exception e) {
e.printStackTrace();
- System.out.println("Error making EVIO event with sequence number <" + eventCount + "> in file <" + evioFile.getPath() + ">.");
+ 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;
}
if (debug) {
- System.out.println("new events - size=" + size + "; group=" + group);
- }
-
- int eventTag = EvioEventUtilities.getEventTag(event);
-
- // Create a new array of ET events. This always has one event.
- mevs = sys.newEvents(
- att, // attachment
+ System.out.println("new events - size=" + this.size + "; group=" + this.group);
+ }
+
+ final int eventTag = EvioEventUtilities.getEventTag(event);
+
+ // 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
+ 0, // delay
1, // number of events
- size, // size of event but overwritten later
- group); // group number; default value is arbitrary
-
+ this.size, // size of event but overwritten later
+ this.group); // group number; default value is arbitrary
+
// Create control data array for event selection.
- int[] control = new int[EtConstants.stationSelectInts];
+ final int[] control = new int[EtConstants.stationSelectInts];
Arrays.fill(control, eventTag);
mevs[0].setControl(control);
-
+
// Delay for X millis if applicable.
- if (delay > 0) {
- Thread.sleep(delay);
+ if (this.delay > 0) {
+ Thread.sleep(this.delay);
}
// Write the next EVIO event to the EtEvent's buffer.
- ByteBuffer buf = mevs[0].getDataBuffer();
+ final ByteBuffer buf = mevs[0].getDataBuffer();
buf.order(ByteOrder.nativeOrder());
- EventWriter writer = new EventWriter(buf, 100000, 100, null, null);
+ final EventWriter writer = new EventWriter(buf, 100000, 100, null, null);
writer.writeEvent(event);
try {
writer.close();
- } catch (Exception e) {
+ } catch (final 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());
+ for (final EtEvent mev : mevs) {
+ System.out.println("event length = " + mev.getLength() + ", remaining bytes: "
+ + mev.getDataBuffer().remaining());
}
}
@@ -281,13 +331,13 @@
}
}
- reader.close();
+ this.reader.close();
}
// Cleanup.
- sys.close();
-
- } catch (Exception e) {
+ sys.close();
+
+ } catch (final Exception e) {
throw new RuntimeException(e);
}
}
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 Mon Apr 13 17:23:55 2015
@@ -12,45 +12,146 @@
import org.jlab.coda.jevio.EvioReader;
/**
- * A basic implementation of an <tt>AbstractRecordSource</tt> for supplying <tt>EvioEvent</tt>
- * objects to a loop from EVIO files.
- *
+ * A basic implementation of an <tt>AbstractRecordSource</tt> for supplying <tt>EvioEvent</tt> objects to a loop from
+ * EVIO files.
+ * <p>
* Unlike the LCIO record source, it has no rewind or indexing capabilities.
+ *
+ * @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a>
*/
public final class EvioFileSource extends AbstractRecordSource {
- EvioEvent currentEvent;
- EvioReader reader;
- List<File> files = new ArrayList<File>();
- int fileIndex = 0;
- boolean atEnd;
+ /**
+ * The current event.
+ */
+ private EvioEvent currentEvent;
+
+ /**
+ * The current file index.
+ */
+ private int fileIndex = 0;
+
+ /**
+ * The list of input data files.
+ */
+ private final List<File> files = new ArrayList<File>();
+
+ /**
+ * The reader to use for reading and parsing the EVIO data.
+ */
+ private EvioReader reader;
+
+ /**
+ * Constructor taking a single EVIO file.
+ *
+ * @param file the EVIO file
+ */
+ public EvioFileSource(final File file) {
+ this.files.add(file);
+ openReader();
+ }
/**
* Constructor taking a list of EVIO files.
- * @param files The list of EVIO files.
+ *
+ * @param files the list of EVIO files
*/
- public EvioFileSource(List<File> files) {
+ public EvioFileSource(final List<File> files) {
this.files.addAll(files);
openReader();
}
/**
- * Constructor taking a single EVIO file.
- * @param file The EVIO file.
+ * Close the current reader.
*/
- public EvioFileSource(File file) {
- this.files.add(file);
- openReader();
+ private void closeReader() {
+ try {
+ this.reader.close();
+ } catch (final IOException e) {
+ throw new RuntimeException(e);
+ }
}
/**
- * Open the EVIO reader on the current file from the list.
- * @throws RuntimeException if an EvioException or IOException occurs while opening file.
+ * Return <code>true</code> if there are no more files to open from the list.
+ *
+ * @return <code>true</code> if there are no more files in the list
+ */
+ boolean endOfFiles() {
+ return this.fileIndex > this.files.size() - 1;
+ }
+
+ /**
+ * Get the current record which is an <code>EvioEvent</code>.
+ *
+ * @return the current record
+ */
+ @Override
+ public Object getCurrentRecord() throws IOException {
+ return this.currentEvent;
+ }
+
+ /**
+ * Return <code>true</code> if there is a current record loaded.
+ *
+ * @return <code>true</code> if there is a current record loaded.
+ */
+ @Override
+ public boolean hasCurrent() {
+ return this.currentEvent != null;
+ }
+
+ /**
+ * Return <code>true</code> if there is a next record.
+ *
+ * @return <code>true</code> if there are more records to load
+ */
+ @Override
+ public boolean hasNext() {
+ try {
+ return this.reader.getNumEventsRemaining() != 0;
+ } catch (IOException | EvioException e) {
+ throw new RuntimeException("Error getting num remaining events.");
+ }
+ }
+
+ /**
+ * Load the next record.
+ *
+ * @throws NoSuchRecordException if source is exhausted
+ * @throws IOException if there is an error creating the next <code>EvioEvent</code>
+ */
+ @Override
+ public void next() throws IOException, NoSuchRecordException {
+ for (;;) {
+ try {
+ this.currentEvent = this.reader.parseNextEvent();
+ } catch (final EvioException e) {
+ throw new IOException(e);
+ }
+ if (this.currentEvent == null) {
+ closeReader();
+ this.fileIndex++;
+ if (!endOfFiles()) {
+ openReader();
+ continue;
+ } else {
+ throw new NoSuchRecordException();
+ }
+ }
+ return;
+ }
+ }
+
+ /**
+ * Open the next file in the list with the reader.
+ *
+ * @throws RuntimeException if an <code>EvioException</code> or <code>IOException</code> occurs while opening file
*/
private void openReader() {
try {
- System.out.println("Opening reader for file " + files.get(fileIndex) + " ...");
- reader = new EvioReader(files.get(fileIndex), false);
+ System.out.println("Opening reader for file " + this.files.get(this.fileIndex) + " ...");
+ this.reader = new EvioReader(this.files.get(this.fileIndex), false);
System.out.println("Done opening file.");
} catch (EvioException | IOException e) {
throw new RuntimeException(e);
@@ -58,89 +159,12 @@
}
/**
- * Close the current reader.
- */
- private void closeReader() {
- try {
- reader.close();
- } catch (IOException e) {
- throw new RuntimeException(e);
- }
- }
-
- /**
- * Get the current record which is an <code>EvioEvent</code>.
- * @return The current record.s
- */
- @Override
- public Object getCurrentRecord() throws IOException {
- return currentEvent;
- }
-
- /**
- * True if there are no more files to open in the list.
- * @return True if there are no more files in the list.
- */
- boolean endOfFiles() {
- return fileIndex > (files.size() - 1);
- }
-
- /**
- * Load the next record.
- * @throws NoSuchRecordException if source is exhausted.
- * @throws IOException if there is an error creating the next EvioEvent.
- */
- @Override
- public void next() throws IOException, NoSuchRecordException {
- for (;;) {
- try {
- currentEvent = reader.parseNextEvent();
- } catch (EvioException e) {
- throw new IOException(e);
- }
- if (currentEvent == null) {
- closeReader();
- fileIndex++;
- if (!endOfFiles()) {
- openReader();
- continue;
- } else {
- atEnd = true;
- throw new NoSuchRecordException();
- }
- }
- return;
- }
- }
-
- /**
- * True because source supports loading next record.
- * @return True because source supports loading next record.
+ * Returns <code>true</code> to indicate next record capability is supported.
+ *
+ * @return <code>true</code> to indicate next record capability is supported
*/
@Override
public boolean supportsNext() {
return true;
}
-
- /**
- * True if there is a current record loaded.
- * @return True if there is a current record loaded.
- */
- @Override
- public boolean hasCurrent() {
- return currentEvent != null;
- }
-
- /**
- * True if there are more records to load.
- * @return True if there are more records to load.
- */
- @Override
- public boolean hasNext() {
- try {
- return reader.getNumEventsRemaining() != 0;
- } catch (IOException | EvioException e) {
- throw new RuntimeException("Error getting num remaining events.");
- }
- }
}
Added: java/trunk/record-util/src/main/java/org/hps/record/evio/package-info.java
=============================================================================
--- java/trunk/record-util/src/main/java/org/hps/record/evio/package-info.java (added)
+++ java/trunk/record-util/src/main/java/org/hps/record/evio/package-info.java Mon Apr 13 17:23:55 2015
@@ -0,0 +1,6 @@
+/**
+ * EVIO record processing utilities.
+ *
+ * @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a>
+ */
+package org.hps.record.evio;
Modified: java/trunk/record-util/src/main/java/org/hps/record/lcio/LcioEventQueue.java
=============================================================================
--- java/trunk/record-util/src/main/java/org/hps/record/lcio/LcioEventQueue.java (original)
+++ java/trunk/record-util/src/main/java/org/hps/record/lcio/LcioEventQueue.java Mon Apr 13 17:23:55 2015
@@ -3,45 +3,111 @@
import org.hps.record.AbstractRecordQueue;
import org.lcsim.event.EventHeader;
-public class LcioEventQueue extends AbstractRecordQueue<EventHeader> {
-
- public LcioEventQueue(long timeoutMillis, int maxQueueSize) {
+/**
+ * A record queue for LCIO/LCSim events.
+ *
+ * @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a>
+ */
+public class LcioEventQueue extends AbstractRecordQueue<EventHeader> {
+
+ /**
+ * Class constructor.
+ *
+ * @param timeoutMillis the queue timeout in milliseconds
+ * @param maxQueueSize the maximum queue size
+ */
+ public LcioEventQueue(final long timeoutMillis, final int maxQueueSize) {
super(timeoutMillis, maxQueueSize);
}
-
+
+ /**
+ * Get the record class.
+ *
+ * @return the record class
+ */
+ @Override
public Class<?> getRecordClass() {
return EventHeader.class;
}
-
+
+ /**
+ * Return <code>true</code> if there is a current record.
+ *
+ * @return <code>true</code> if there is a current record
+ */
+ @Override
+ public boolean hasCurrent() {
+ return this.size() != 0L;
+ }
+
+ /**
+ * Return <code>true</code> to indicate there is a next record.
+ *
+ * @return <code>true</code> to indicate there is a next record
+ */
+ // FIXME: Should this actually check if the queue has more records?
+ @Override
+ public boolean hasNext() {
+ return true;
+ }
+
+ /**
+ * Return <code>true</code> to indicate current record capability is supported.
+ *
+ * @return <code>true</code> to indicate current record capability is supported
+ */
+ @Override
public boolean supportsCurrent() {
return true;
}
+ /**
+ * Return <code>false</code> to indicate indexing is not supported.
+ *
+ * @return <code>false</code> to indicate indexing is not supported.
+ */
+ @Override
+ public boolean supportsIndex() {
+ return false;
+ }
+
+ /**
+ * Return <code>true</code> to indicate next record capability is supported.
+ *
+ * @return <code>true</code> to indicate next record capability is supported
+ */
+ @Override
public boolean supportsNext() {
return true;
}
-
+
+ /**
+ * Return <code>false</code> to indicate previous record capability is not supported.
+ *
+ * @return <code>false</code> to indicate previous record capability is not supported
+ */
+ @Override
public boolean supportsPrevious() {
return false;
}
-
- public boolean supportsIndex() {
+
+ /**
+ * Return <code>false</code> to indicate rewind is not supported.
+ *
+ * @return <code>false</code> to indicate rewind is not supported
+ */
+ @Override
+ public boolean supportsRewind() {
return false;
}
-
+
+ /**
+ * Return <code>false</code> to indicate shift operation is not supported.
+ *
+ * @return <code>false</code> to indicate shift operation is not supported
+ */
+ @Override
public boolean supportsShift() {
return false;
}
-
- public boolean supportsRewind() {
- return false;
- }
-
- public boolean hasCurrent() {
- return this.size() != 0L;
- }
-
- public boolean hasNext() {
- return true;
- }
}
Added: java/trunk/record-util/src/main/java/org/hps/record/lcio/package-info.java
=============================================================================
--- java/trunk/record-util/src/main/java/org/hps/record/lcio/package-info.java (added)
+++ java/trunk/record-util/src/main/java/org/hps/record/lcio/package-info.java Mon Apr 13 17:23:55 2015
@@ -0,0 +1,6 @@
+/**
+ * LCIO record processing utilities.
+ *
+ * @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a>
+ */
+package org.hps.record.lcio;
Modified: java/trunk/record-util/src/main/java/org/hps/record/package-info.java
=============================================================================
--- java/trunk/record-util/src/main/java/org/hps/record/package-info.java (original)
+++ java/trunk/record-util/src/main/java/org/hps/record/package-info.java Mon Apr 13 17:23:55 2015
@@ -1,18 +1,14 @@
/**
- * The package <code>org.hps.record</code> and its sub-packages use the
- * <a href="http://java.freehep.org/freehep-record/">FreeHep Record</a> module
- * to implement a flexible record processing backend. Its current primary
- * usage is providing the record processing chain for the HPS Monitoring Application,
- * but it can be used stand-alone outside of that framework.
- *
- * The primary class for user interaction is the {@link org.hps.record.composite.CompositeLoop}
- * class which implements a record loop that can convert <code>EtEvent</code> objects
- * to <code>EvioEvent</code> objects and then finally build LCSim event, or <code>EventHeader</event>
- * objects from the EVIO, using a series of adapter classes on the loop. The loop implementation
- * is flexible so that it may be configured to use an ET server, an EVIO file or an LCIO file for
- * the record source. The {@link org.hps.record.composite.CompositeLoopConfiguration} class should be
- * used to configure the loop by the user.
- *
- * @author Jeremy McCormick <[log in to unmask]>
+ * The package <code>org.hps.record</code> and its sub-packages use the <a
+ * href="http://java.freehep.org/freehep-record/">FreeHep Record</a> module to implement a flexible record processing
+ * backend. Its current primary usage is providing the record processing chain for the HPS Monitoring Application, but
+ * it can be used stand-alone outside of that framework. The primary class for user interaction is the
+ * {@link org.hps.record.composite.CompositeLoop} class which implements a record loop that can convert
+ * <code>EtEvent</code> objects to <code>EvioEvent</code> objects and then finally build LCSim event, or
+ * <code>EventHeader</event> objects from the EVIO, using a series of adapter classes on the loop. The loop implementation
+ * is flexible so that it may be configured to use an ET server, an EVIO file or an LCIO file for the record source.
+ * The {@link org.hps.record.composite.CompositeLoopConfiguration} class should be used to configure the loop by the user.
+ *
+ * @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a>
*/
package org.hps.record;
Modified: java/trunk/record-util/src/main/java/org/hps/record/scalars/ScalarData.java
=============================================================================
--- java/trunk/record-util/src/main/java/org/hps/record/scalars/ScalarData.java (original)
+++ java/trunk/record-util/src/main/java/org/hps/record/scalars/ScalarData.java Mon Apr 13 17:23:55 2015
@@ -7,132 +7,142 @@
import org.lcsim.event.GenericObject;
/**
- * This class encapsulates EVIO scalar data which is simply an array
- * of integer values. The exact meaning of each of these integer
- * words is defined externally to this class.
- *
- * @author Jeremy McCormick <[log in to unmask]>
+ * This class encapsulates EVIO scalar data which is simply an array of integer values. The exact meaning of each of
+ * these integer words is defined externally to this class.
+ *
+ * @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a>
*/
-public class ScalarData {
-
- // The default name for reading and writing the LCIO event collection.
+public final class ScalarData {
+
+ /**
+ * Default name of scalar data collection in LCSim events.
+ */
static String DEFAULT_SCALAR_DATA_COLLECTION_NAME = "ScalarData";
-
- // The scalar data values.
- int[] data;
-
+
/**
- * This is the no argument constructor which is for package internal use.
+ * Create a new <code>ScalarData</code> object from an LCIO event, using the default collection name.
+ *
+ * @param event the LCIO event data
+ * @return the <code>ScalarData</code> object or <code>null</code> if there's no scalar data in the event
*/
- ScalarData() {
+ public static ScalarData read(final EventHeader event) {
+ return read(event, DEFAULT_SCALAR_DATA_COLLECTION_NAME);
}
-
- /**
- * Create from provided scalar data values.
- * @param data The scalar data.
- */
- public ScalarData(int[] data) {
- this.data = new int[data.length];
- System.arraycopy(data, 0, this.data, 0, data.length);
- }
-
- /**
- * Get the number of scalars.
- * @return The number of scalars.
- */
- public int size() {
- return data.length;
- }
-
- /**
- * Get the scalar data value at the index.
- * @param index The scalar data index.
- * @return The scalar data value.
- */
- public Integer getValue(int index) {
- return data[index];
- }
-
- /**
- * Convert this object to an lcsim {@link org.lcsim.event.GenericObject} for
- * persistency to LCIO.
- * @return The LCIO GenericObject.
- */
- GenericObject toGenericObject() {
- ScalarsGenericObject object = new ScalarsGenericObject();
- object.values = data;
- return object;
- }
-
- /**
- * Load data into this object from an {@link org.lcsim.event.GenericObject}
- * read from an LCIO event.
- * @param object The GenericObject with the scalar data.
- */
- void fromGenericObject(GenericObject object) {
- this.data = new int[object.getNInt()];
- for (int index = 0; index < object.getNInt(); index++) {
- this.data[index] = object.getIntVal(index);
- }
- }
-
- /**
- * Write this object out to an LCIO event using the default collection name.
- * @param event The output LCIO event.
- */
- public void write(EventHeader event) {
- write(event, DEFAULT_SCALAR_DATA_COLLECTION_NAME);
- }
-
- /**
- * Write this object out to an LCIO event using the given collection name.
- * @param event The output LCIO event.
- * @param collectionName The name of the collection.
- */
- public void write(EventHeader event, String collectionName) {
- List<GenericObject> collection = new ArrayList<GenericObject>();
- collection.add(toGenericObject());
- event.put(collectionName, collection, GenericObject.class, 0);
- }
-
-
+
/**
* Create a new object from the data in an LCIO event, using the default collection name.
- * @param event The LCIO event data.
- * @return The created ScalarData object or null if does not exist in event.
+ *
+ * @param event the LCIO event data
+ * @return the <code>ScalarData</code> object or <code>null</code> if does not exist in event
*/
- public static ScalarData read(EventHeader event) {
- return read(event, DEFAULT_SCALAR_DATA_COLLECTION_NAME);
- }
-
- /**
- * Create a new object from the data in an LCIO event, using the default collection name.
- * @param event The LCIO event data.
- * @return The created ScalarData object or null if does not exist in event.
- */
- public static ScalarData read(EventHeader event, String collectionName) {
+ public static ScalarData read(final EventHeader event, final String collectionName) {
ScalarData data = null;
if (event.hasCollection(GenericObject.class, collectionName)) {
- List<GenericObject> objects = event.get(GenericObject.class, collectionName);
+ final List<GenericObject> objects = event.get(GenericObject.class, collectionName);
data = new ScalarData();
data.fromGenericObject(objects.get(0));
}
return data;
}
-
-
+
/**
- * Convert this object to a readable string, which is a list of integer values
- * enclosed in braces and separated by commas.
+ * The scalar data values.
*/
+ private int[] data;
+
+ /**
+ * This is the no argument constructor which is for package internal use only.
+ */
+ ScalarData() {
+ }
+
+ /**
+ * Create from provided scalar data values.
+ *
+ * @param data the scalar data
+ */
+ public ScalarData(final int[] data) {
+ this.data = new int[data.length];
+ System.arraycopy(data, 0, this.data, 0, data.length);
+ }
+
+ /**
+ * Load data into this object from an {@link org.lcsim.event.GenericObject} read from an LCIO event.
+ *
+ * @param object the <code>GenericObject</code> with the scalar data
+ */
+ void fromGenericObject(final GenericObject object) {
+ this.data = new int[object.getNInt()];
+ for (int index = 0; index < object.getNInt(); index++) {
+ this.data[index] = object.getIntVal(index);
+ }
+ }
+
+ /**
+ * Get the scalar data value at the index.
+ *
+ * @param index the scalar data index
+ * @return the scalar data value
+ */
+ public Integer getValue(final int index) {
+ return this.data[index];
+ }
+
+ /**
+ * Get the number of scalars.
+ *
+ * @return the number of scalars
+ */
+ public int size() {
+ return this.data.length;
+ }
+
+ /**
+ * Convert this object to an LCSim {@link org.lcsim.event.GenericObject} for persistency to LCIO.
+ *
+ * @return the LCIO <code>GenericObject</code> containing scalar data
+ */
+ GenericObject toGenericObject() {
+ final ScalarsGenericObject object = new ScalarsGenericObject(this.data);
+ return object;
+ }
+
+ /**
+ * Convert this object to a readable string, which is a list of integer values enclosed in braces and separated by
+ * commas.
+ *
+ * @return this object converted to a string
+ */
+ @Override
public String toString() {
- StringBuffer sb = new StringBuffer();
+ final StringBuffer sb = new StringBuffer();
sb.append("[");
- for (int value : data) {
+ for (final int value : this.data) {
sb.append(value + ", ");
}
- sb.setLength(sb.length() - 2);
+ sb.setLength(sb.length() - 2);
sb.append("]");
return sb.toString();
- }
+ }
+
+ /**
+ * Write this object out to an LCIO event using the default collection name.
+ *
+ * @param event the output LCIO event
+ */
+ public void write(final EventHeader event) {
+ write(event, DEFAULT_SCALAR_DATA_COLLECTION_NAME);
+ }
+
+ /**
+ * Write this object out to an LCIO event using the given collection name.
+ *
+ * @param event the output LCIO event
+ * @param collectionName the name of the output collection
+ */
+ public void write(final EventHeader event, final String collectionName) {
+ final List<GenericObject> collection = new ArrayList<GenericObject>();
+ collection.add(toGenericObject());
+ event.put(collectionName, collection, GenericObject.class, 0);
+ }
}
Modified: java/trunk/record-util/src/main/java/org/hps/record/scalars/ScalarUtilities.java
=============================================================================
--- java/trunk/record-util/src/main/java/org/hps/record/scalars/ScalarUtilities.java (original)
+++ java/trunk/record-util/src/main/java/org/hps/record/scalars/ScalarUtilities.java Mon Apr 13 17:23:55 2015
@@ -3,88 +3,90 @@
/**
* Utilities methods for scalar data.
* <p>
- * Currently this is used only for computing live time measurements from standard
- * scalar data.
- *
- * @author Jeremy McCormick <[log in to unmask]>
+ * Currently this is used only for computing live time measurements from standard scalar data.
+ *
+ * @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a>
*/
-public class ScalarUtilities {
-
+public final class ScalarUtilities {
+
/**
- * This class shouldn't be instantiated.
- */
- private ScalarUtilities() {
- }
-
- /**
- * Indices for getting live time measurements.
+ * Indices for getting live time measurements.
*/
public enum LiveTimeIndex {
- FCUP_TDC, /* Faraday cup TDC */
- FCUP_TRG, /* Faraday cup TRG */
- CLOCK; /* clock */
+ CLOCK, /* Faraday cup TDC */
+ FCUP_TDC, /* Faraday cup TRG */
+ FCUP_TRG; /* clock */
}
-
+
+ /**
+ * Get a specific live time measurement by index.
+ *
+ * @param index The enum of the index type.
+ * @see LiveTimeIndex
+ */
+ public static double getLiveTime(final ScalarData data, final LiveTimeIndex index) {
+ return getLiveTimes(data)[index.ordinal()];
+ }
+
/**
* Get the live time measurements from standard scalar data.
* <p>
* This is returned as a double array of size 3 containing:</br>
+ *
* <pre>
* [0] = FCUP TDC measurement
* [1] = FCUP TRG measurement
* [2] = CLOCK measurement
* </pre>
- * This method assumes the standard scalar data structure as outlined in
- * <a href="https://jira.slac.stanford.edu/browse/HPSJAVA-470">HPSJAVA-470</a>.
- *
+ *
+ * This method assumes the standard scalar data structure as outlined in <a
+ * href="https://jira.slac.stanford.edu/browse/HPSJAVA-470">HPSJAVA-470</a>.
+ *
* @param data The scalar data.
* @return The live time measurements.
*/
- public static double[] getLiveTimes(ScalarData data) {
-
+ public static double[] getLiveTimes(final ScalarData data) {
+
// [03] - gated faraday cup with "TDC" threshold
- int word03 = data.getValue(3);
-
+ final int word03 = data.getValue(3);
+
// [19] - gated faraday cup with "TRG" threshold
- int word19 = data.getValue(19);
+ final int word19 = data.getValue(19);
// [35] - ungated faraday cup with "TDC" threshold
- int word35 = data.getValue(35);
-
+ final int word35 = data.getValue(35);
+
// [51] - ungated faraday cup with "TRG" threshold
- int word51 = data.getValue(51);
+ final int word51 = data.getValue(51);
// [67] - gated clock
- int word67 = data.getValue(67);
+ final int word67 = data.getValue(67);
// [68] - ungated clock
- int word68 = data.getValue(68);
-
+ final int word68 = data.getValue(68);
+
// [03]/[35] = FCUP TDC
- double fcupTdc = (double) word03 / (double) word35;
-
+ final double fcupTdc = (double) word03 / (double) word35;
+
// [19]/[51] = FCUP TRG
- double fcupTrg = (double) word19 / (double) word51;
-
+ final double fcupTrg = (double) word19 / (double) word51;
+
// [67]/[68] = CLOCK
- double clock = (double) word67 / (double) word68;
-
+ final double clock = (double) word67 / (double) word68;
+
// Compute the live times.
- double[] liveTimes = new double[3];
+ final double[] liveTimes = new double[3];
liveTimes[LiveTimeIndex.FCUP_TDC.ordinal()] = fcupTdc;
liveTimes[LiveTimeIndex.FCUP_TRG.ordinal()] = fcupTrg;
liveTimes[LiveTimeIndex.CLOCK.ordinal()] = clock;
-
+
return liveTimes;
}
-
+
/**
- * Get a specific live time measurement by index.
- * @param index The enum of the index type.
- *
- * @see LiveTimeIndex
+ * Disallow class instantiation.
*/
- public static double getLiveTime(ScalarData data, LiveTimeIndex index) {
- return getLiveTimes(data)[index.ordinal()];
+ private ScalarUtilities() {
+ throw new UnsupportedOperationException("Do not instantiate this class.");
}
}
Modified: java/trunk/record-util/src/main/java/org/hps/record/scalars/ScalarsEvioProcessor.java
=============================================================================
--- java/trunk/record-util/src/main/java/org/hps/record/scalars/ScalarsEvioProcessor.java (original)
+++ java/trunk/record-util/src/main/java/org/hps/record/scalars/ScalarsEvioProcessor.java Mon Apr 13 17:23:55 2015
@@ -1,42 +1,47 @@
package org.hps.record.scalars;
+import org.hps.record.evio.EvioEventConstants;
import org.hps.record.evio.EvioEventProcessor;
import org.jlab.coda.jevio.BaseStructure;
import org.jlab.coda.jevio.EvioEvent;
/**
* This is an EVIO event processor for creating a {@link ScalarData} object from scalar bank data.
- *
- * @author Jeremy McCormick <[log in to unmask]>
+ *
+ * @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a>
*/
-public class ScalarsEvioProcessor extends EvioEventProcessor {
-
- // Tag of the crate bank, which is a child of the top bank.
- static final int SCALARS_CRATE_TAG = 39;
-
- // Tag of the scalars integer bank, which is a child of the crate bank.
- static final int SCALARS_BANK_TAG = 57621;
+public final class ScalarsEvioProcessor extends EvioEventProcessor {
// Currently cached ScalarData object which was created by the process method.
- ScalarData data;
+ private ScalarData data;
/**
- * This method will create a <code>ScalarData</code> object and cache it.
- * The current object is first reset to null every time this is called.
- *
- * @param evio The EVIO event data.
+ * Get the current scalar data or null if there was none in the last event processed.
+ *
+ * @return the current scalar data or <code>null</code> if none exists
*/
- public void process(EvioEvent evio) {
- data = null;
- for (BaseStructure bank : evio.getChildrenList()) {
+ public ScalarData getScalarData() {
+ return this.data;
+ }
+
+ /**
+ * This method will create a <code>ScalarData</code> object and cache it. The current object is first reset to
+ * <code>null</code> every time this method is called.
+ *
+ * @param evio the EVIO event data
+ */
+ @Override
+ public void process(final EvioEvent evio) {
+ this.data = null;
+ for (final BaseStructure bank : evio.getChildrenList()) {
// Does the crate tag match?
- if (bank.getHeader().getTag() == SCALARS_CRATE_TAG) {
+ if (bank.getHeader().getTag() == EvioEventConstants.SCALARS_CRATE_TAG) {
if (bank.getChildrenList() != null) {
- for (BaseStructure subBank : bank.getChildrenList()) {
+ for (final BaseStructure subBank : bank.getChildrenList()) {
// Does the bank tag match?
- if (subBank.getHeader().getTag() == SCALARS_BANK_TAG) {
+ if (subBank.getHeader().getTag() == EvioEventConstants.SCALARS_BANK_TAG) {
// Scalar data exists in event so create object and stop processing.
- data = new ScalarData(subBank.getIntData());
+ this.data = new ScalarData(subBank.getIntData());
break;
}
}
@@ -44,12 +49,4 @@
}
}
}
-
- /**
- * Get the current scalar data or null if there was none in the last event processed.
- * @return The current scalar data or null if none exists.
- */
- public ScalarData getScalarData() {
- return data;
- }
}
Modified: java/trunk/record-util/src/main/java/org/hps/record/scalars/ScalarsGenericObject.java
=============================================================================
--- java/trunk/record-util/src/main/java/org/hps/record/scalars/ScalarsGenericObject.java (original)
+++ java/trunk/record-util/src/main/java/org/hps/record/scalars/ScalarsGenericObject.java Mon Apr 13 17:23:55 2015
@@ -3,25 +3,45 @@
import org.lcsim.event.GenericObject;
/**
- * This is the LCIO {@link org.lcsim.event.GenericObject} binding
- * for EVIO scalar data. This should not be used directly. Rather
- * the {@link ScalarData} class should be used for loading data
- * from LCIO events.
- *
- * @author Jeremy McCormick <[log in to unmask]>
+ * This is the LCIO {@link org.lcsim.event.GenericObject} binding for EVIO scalar data. This should not be used
+ * directly. Rather the {@link ScalarData} class should be used for loading data from LCIO events.
+ *
+ * @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a>
*/
final class ScalarsGenericObject implements GenericObject {
- int[] values;
+ /**
+ * The scalar data values.
+ */
+ private final int[] values;
- @Override
- public int getNInt() {
- return values.length;
+ /**
+ * Create a new object with the given scalar values.
+ *
+ * @param values the array of scalar values
+ */
+ ScalarsGenericObject(final int[] values) {
+ this.values = values;
}
@Override
- public int getNFloat() {
+ public double getDoubleVal(final int index) {
return 0;
+ }
+
+ @Override
+ public float getFloatVal(final int index) {
+ return 0;
+ }
+
+ /**
+ * Get the scalar value at the index.
+ *
+ * @param index the index in the data array
+ */
+ @Override
+ public int getIntVal(final int index) {
+ return this.values[index];
}
@Override
@@ -30,20 +50,25 @@
}
@Override
- public int getIntVal(int index) {
- return values[index];
- }
-
- @Override
- public float getFloatVal(int index) {
+ public int getNFloat() {
return 0;
}
+ /**
+ * Get the number of integer values in the array.
+ *
+ * @return the number of integer values in the array
+ */
@Override
- public double getDoubleVal(int index) {
- return 0;
+ public int getNInt() {
+ return this.values.length;
}
+ /**
+ * Returns <code>false</code> to indicate object is not fixed size.
+ *
+ * @return <code>false</code> to indicate object is not fixed size
+ */
@Override
public boolean isFixedSize() {
return false;
Added: java/trunk/record-util/src/main/java/org/hps/record/scalars/package-info.java
=============================================================================
--- java/trunk/record-util/src/main/java/org/hps/record/scalars/package-info.java (added)
+++ java/trunk/record-util/src/main/java/org/hps/record/scalars/package-info.java Mon Apr 13 17:23:55 2015
@@ -0,0 +1,6 @@
+/**
+ * Classes for converting scalar data from EVIO to LCSim.
+ *
+ * @author <a href="mailto:[log in to unmask]">Jeremy McCormick</a>
+ */
+package org.hps.record.scalars;
|