Author: [log in to unmask] Date: Wed Mar 25 15:03:42 2015 New Revision: 2556 Log: Merge in changes to trunk from monitoring app dev branch. Removed: java/trunk/monitoring-app/src/main/java/org/hps/monitoring/application/util/EventTagFilter.java java/trunk/monitoring-app/src/main/java/org/hps/monitoring/application/util/MonitoringApplicationEventBuilder.java java/trunk/monitoring-app/src/main/java/org/hps/monitoring/application/util/PhysicsSyncEventStation.java java/trunk/monitoring-app/src/main/java/org/hps/monitoring/application/util/PreStartEtStation.java java/trunk/monitoring-app/src/main/java/org/hps/monitoring/application/util/RunnableEtStation.java java/trunk/monitoring-app/src/main/resources/lib/ java/trunk/monitoring-app/src/main/scripts/ldpath.sh Modified: java/trunk/monitoring-app/ (props changed) java/trunk/monitoring-app/src/main/java/org/hps/monitoring/application/EventProcessing.java java/trunk/monitoring-app/src/main/java/org/hps/monitoring/application/MonitoringApplication.java java/trunk/monitoring-app/src/main/java/org/hps/monitoring/application/MonitoringApplicationFrame.java java/trunk/monitoring-app/src/main/java/org/hps/monitoring/application/util/EtSystemUtil.java java/trunk/monitoring-app/src/main/scripts/evio_file_producer.sh java/trunk/monitoring-app/src/main/scripts/start_et_ring.sh java/trunk/monitoring-app/src/main/scripts/start_monitoring_application.sh Modified: java/trunk/monitoring-app/src/main/java/org/hps/monitoring/application/EventProcessing.java ============================================================================= --- java/trunk/monitoring-app/src/main/java/org/hps/monitoring/application/EventProcessing.java (original) +++ java/trunk/monitoring-app/src/main/java/org/hps/monitoring/application/EventProcessing.java Wed Mar 25 15:03:42 2015 @@ -5,6 +5,7 @@ import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import java.util.logging.Logger; @@ -13,11 +14,10 @@ import org.hps.job.JobManager; import org.hps.monitoring.application.model.ConfigurationModel; import org.hps.monitoring.application.model.ConnectionStatus; +import org.hps.monitoring.application.model.ConnectionStatusModel; import org.hps.monitoring.application.model.SteeringType; +import org.hps.monitoring.application.util.ErrorHandler; import org.hps.monitoring.application.util.EtSystemUtil; -import org.hps.monitoring.application.util.PhysicsSyncEventStation; -import org.hps.monitoring.application.util.PreStartEtStation; -import org.hps.monitoring.application.util.RunnableEtStation; import org.hps.monitoring.subsys.et.EtSystemMonitor; import org.hps.monitoring.subsys.et.EtSystemStripCharts; import org.hps.record.LCSimEventBuilder; @@ -26,9 +26,15 @@ import org.hps.record.composite.CompositeRecordProcessor; import org.hps.record.composite.EventProcessingThread; import org.hps.record.enums.DataSourceType; +import org.hps.record.epics.EpicsEtProcessor; import org.hps.record.et.EtConnection; +import org.hps.record.et.EtEventProcessor; +import org.hps.record.et.EtStationThread; +import org.hps.record.et.PreStartProcessor; +import org.hps.record.et.SyncEventProcessor; import org.hps.record.evio.EvioDetectorConditionsProcessor; -import org.jlab.coda.et.EtSystem; +import org.hps.record.evio.EvioEventConstants; +import org.jlab.coda.et.EtConstants; import org.jlab.coda.et.exception.EtClosedException; import org.jlab.coda.et.exception.EtException; import org.lcsim.conditions.ConditionsListener; @@ -44,26 +50,33 @@ */ class EventProcessing { + SessionState sessionState; MonitoringApplication application; + ConfigurationModel configurationModel; + ConnectionStatusModel connectionModel; + ErrorHandler errorHandler; Logger logger; - SessionState sessionState; - List<CompositeRecordProcessor> processors; - List<Driver> drivers; - List<ConditionsListener> conditionsListeners; - int stationPosition; - + /** * This class is used to organize the objects for an event processing session. */ class SessionState { + + List<CompositeRecordProcessor> processors; + List<Driver> drivers; + List<ConditionsListener> conditionsListeners; + JobManager jobManager; LCSimEventBuilder eventBuilder; CompositeLoop loop; + + boolean usingEtServer; + EventProcessingThread processingThread; Thread sessionWatchdogThread; ThreadGroup stationThreadGroup = new ThreadGroup("Station Threads"); - List<RunnableEtStation> stations = new ArrayList<RunnableEtStation>(); - EtConnection connection; + List<EtStationThread> stations = new ArrayList<EtStationThread>(); + EtConnection connection; } /** @@ -77,20 +90,20 @@ List<CompositeRecordProcessor> processors, List<Driver> drivers, List<ConditionsListener> conditionsListeners) { + this.application = application; - this.sessionState = new SessionState(); - this.logger = MonitoringApplication.logger; - this.processors = processors; - this.drivers = drivers; - this.conditionsListeners = conditionsListeners; - this.stationPosition = application.configurationModel.getStationPosition(); + logger = MonitoringApplication.logger; + configurationModel = application.configurationModel; + connectionModel = application.connectionModel; + errorHandler = application.errorHandler; + + sessionState = new SessionState(); + sessionState.processors = processors; + sessionState.drivers = drivers; + sessionState.conditionsListeners = conditionsListeners; + sessionState.usingEtServer = application.configurationModel.getDataSourceType().equals(DataSourceType.ET_SERVER); } - int getNextStationPosition() { - this.stationPosition += 1; - return this.stationPosition; - } - /** * Setup this class from the global configuration. * @param configurationModel The global configuration. @@ -107,7 +120,7 @@ /** * @param configurationModel */ - private void setupLcsim(ConfigurationModel configurationModel) { + void setupLcsim(ConfigurationModel configurationModel) { MonitoringApplication.logger.info("setting up lcsim"); // Get steering resource or file as a String parameter. @@ -129,7 +142,7 @@ // Add conditions listeners after new database conditions manager is initialized from // job manager. DatabaseConditionsManager conditionsManager = DatabaseConditionsManager.getInstance(); - for (ConditionsListener conditionsListener : conditionsListeners) { + for (ConditionsListener conditionsListener : sessionState.conditionsListeners) { logger.config("adding conditions listener " + conditionsListener.getClass().getName()); conditionsManager.addConditionsListener(conditionsListener); } @@ -179,15 +192,14 @@ logger.info("lcsim setup was successful"); } catch (Throwable t) { - // Catch all errors and re-throw them as RuntimeExceptions. - application.errorHandler.setError(t).setMessage("Error setting up LCSim.").printStackTrace().raiseException(); + throw new RuntimeException("Error setting up LCSim.", t); } } /** * Create the event builder for converting EVIO events to LCSim. */ - private void createEventBuilder(ConfigurationModel configurationModel) { + void createEventBuilder(ConfigurationModel configurationModel) { // Get the class for the event builder. String eventBuilderClassName = configurationModel.getEventBuilderClassName(); @@ -207,7 +219,7 @@ * Setup the loop from the global configuration. * @param configurationModel The global configuration. */ - private void setupLoop(ConfigurationModel configurationModel) { + void setupLoop(ConfigurationModel configurationModel) { CompositeLoopConfiguration loopConfig = new CompositeLoopConfiguration() .setStopOnEndRun(configurationModel.getDisconnectOnEndRun()) @@ -244,13 +256,13 @@ } // Add extra CompositeRecordProcessors to the loop config. - for (CompositeRecordProcessor processor : processors) { + for (CompositeRecordProcessor processor : sessionState.processors) { loopConfig.add(processor); logger.config("added extra processor " + processor.getClass().getSimpleName() + " to job"); } // Add extra Drivers to the loop config. - for (Driver driver : drivers) { + for (Driver driver : sessionState.drivers) { loopConfig.add(driver); logger.config("added extra Driver " + driver.getName() + " to job"); } @@ -267,7 +279,7 @@ * Setup a steering file on disk. * @param steering The steering file. */ - private void setupSteeringFile(String steering) { + void setupSteeringFile(String steering) { sessionState.jobManager.setup(new File(steering)); } @@ -276,7 +288,7 @@ * @param steering The steering resource. * @throws IOException if there is a problem setting up or accessing the resource. */ - private void setupSteeringResource(String steering) throws IOException { + void setupSteeringResource(String steering) throws IOException { InputStream is = this.getClass().getClassLoader().getResourceAsStream(steering); if (is == null) throw new IOException("Steering resource is not accessible or does not exist."); @@ -290,18 +302,8 @@ killWatchdogThread(); // Wake up all ET stations to unblock the system and make sure secondary stations are detached. - //wakeUpEtStations() - // Wake up the primary ET station doing the event processing. - logger.finest("waking up event processing station ..."); - try { - if (sessionState.connection != null) { - if (sessionState.connection.getEtSystem() != null) { - sessionState.connection.getEtSystem().wakeUpAll(sessionState.connection.getEtStation()); - logger.finest("event processing station woken up"); - } - } - } catch (IOException | EtException | EtClosedException e) { - e.printStackTrace(); + if (usingEtServer()) { + wakeUpEtStations(); } // Stop the event processing now that ET system is unblocked. @@ -321,7 +323,7 @@ // Notify of last error that occurred in event processing. if (sessionState.loop.getLastError() != null) { // Log the error. - application.errorHandler.setError(sessionState.loop.getLastError()).log(); + errorHandler.setError(sessionState.loop.getLastError()).log(); } // Invalidate the loop. @@ -337,22 +339,18 @@ /** * Wake up all ET stations associated with event processing. */ - private void wakeUpEtStations() { + void wakeUpEtStations() { if (sessionState.connection != null) { logger.fine("waking up ET stations ..."); // Wake up secondary ET stations. - for (RunnableEtStation station : sessionState.stations) { - if (station.getEtStation().isUsable()) { - // Wake up the station which will automatically trigger a detach. - try { - logger.finest("waking up " + station.getEtStation().getName() + " ..."); - sessionState.connection.getEtSystem().wakeUpAll(station.getEtStation()); - logger.finest(station.getEtStation().getName() + " woken up"); - } catch (IOException | EtException | EtClosedException e) { - e.printStackTrace(); - } - } + for (EtStationThread station : sessionState.stations) { + + // First unblock if in ET call. + station.wakeUp(); + + // Next interrupt so that it will definitely stop. + station.interrupt(); } // Wait for station threads to die after being woken up. @@ -367,23 +365,23 @@ } } } - - logger.finest("destroying station thread group"); + sessionState.stationThreadGroup.destroy(); - logger.finest("station thread group destroyed"); + + logger.finest("station threads destroyed"); // Wake up the primary ET station doing the event processing. logger.finest("waking up event processing station ..."); try { sessionState.connection.getEtSystem().wakeUpAll(sessionState.connection.getEtStation()); - logger.finest("event processing station woken up"); + logger.finest("event processing station was woken up"); } catch (IOException | EtException | EtClosedException e) { e.printStackTrace(); } - logger.finest("ET stations woken up"); - } - } + logger.finest("ET stations all woken up"); + } + } /** * Start event processing on the event processing thread and start the watchdog thread. @@ -396,7 +394,7 @@ sessionState.processingThread = new EventProcessingThread(sessionState.loop); sessionState.processingThread.start(); - // Start the watchdog thread which will auto-disconnect when event processing is done. + // Start the watch dog thread which will auto-disconnect when event processing is done. sessionState.sessionWatchdogThread = new SessionWatchdogThread(sessionState.processingThread); sessionState.sessionWatchdogThread.start(); @@ -408,9 +406,9 @@ */ synchronized void pause() { logger.finest("pausing"); - if (!application.connectionModel.getPaused()) { + if (!connectionModel.getPaused()) { sessionState.loop.pause(); - application.connectionModel.setPaused(true); + connectionModel.setPaused(true); } logger.finest("paused"); } @@ -420,10 +418,10 @@ */ synchronized void next() { logger.finest("getting next event"); - if (application.connectionModel.getPaused()) { - application.connectionModel.setPaused(false); + if (connectionModel.getPaused()) { + connectionModel.setPaused(false); sessionState.loop.execute(Command.GO_N, 1L, true); - application.connectionModel.setPaused(true); + connectionModel.setPaused(true); } logger.finest("got next event"); } @@ -433,10 +431,10 @@ */ synchronized void resume() { logger.finest("resuming"); - if (application.connectionModel.getPaused()) { + if (connectionModel.getPaused()) { // Notify event processor to continue. sessionState.loop.resume(); - application.connectionModel.setPaused(false); + connectionModel.setPaused(false); } logger.finest("resumed"); } @@ -483,7 +481,7 @@ } /** - * True if the processing thread is active. + * True if the processing thread is valid and active. * @return True if processing thread is active. */ boolean isActive() { @@ -504,10 +502,13 @@ createEtConnection(); // Add an attachment that listens for DAQ configuration changes via physics SYNC events. - //createPhysicsSyncStation(); + createSyncStation(); + + // Add an attachment which listens for EPICs events with scalar data. + //createEpicsStation(); // Add an attachment that listens for PRESTART events. - //createPreStartStation(); + createPreStartStation(); } catch (Exception e) { throw new IOException(e); @@ -516,7 +517,7 @@ logger.fine("ET system is connected"); } else { // This is when a direct file source is used and ET is not needed. - application.connectionModel.setConnectionStatus(ConnectionStatus.CONNECTED); + connectionModel.setConnectionStatus(ConnectionStatus.CONNECTED); } } @@ -526,7 +527,7 @@ * @return True if using an ET server. */ boolean usingEtServer() { - return application.configurationModel.getDataSourceType().equals(DataSourceType.ET_SERVER); + return sessionState.usingEtServer; } /** @@ -534,47 +535,101 @@ */ synchronized void createEtConnection() { // Setup connection to ET system. - sessionState.connection = EtSystemUtil.createEtConnection(application.configurationModel); + sessionState.connection = EtSystemUtil.createEtConnection(configurationModel); if (sessionState.connection != null) { // Set status to connected as there is now a live ET connection. - application.connectionModel.setConnectionStatus(ConnectionStatus.CONNECTED); + connectionModel.setConnectionStatus(ConnectionStatus.CONNECTED); } else { - application.errorHandler.setError(new RuntimeException("Failed to create ET connection.")).log().printStackTrace().raiseException(); - } - } - - /** - * Create the ET that listens for DAQ configuration change via SYNC events. - */ - private void createPhysicsSyncStation() { - logger.fine("creating physics SYNC station ..."); - PhysicsSyncEventStation configStation = new PhysicsSyncEventStation( - this.sessionState.connection.getEtSystem(), - this.sessionState.connection.getEtStation().getName() + "_PhysicsSync", - getNextStationPosition()); - sessionState.stations.add(configStation); - new Thread(sessionState.stationThreadGroup, configStation).start(); - logger.fine("physics SYNC station created"); - } + errorHandler.setError(new RuntimeException("Failed to create ET connection.")).log().printStackTrace().raiseException(); + } + } /** - * Create the ET station that listens for GO events in order to initialize the conditions system. - */ - private void createPreStartStation() { - logger.fine("creating PRESTART station ..."); - String detectorName = this.application.configurationModel.getDetectorName(); - EtSystem system = this.sessionState.connection.getEtSystem(); - String stationName = this.sessionState.connection.getEtStation().getName() + "_PreStart"; - int order = getNextStationPosition(); - PreStartEtStation preStartStation = new PreStartEtStation( - detectorName, - system, - stationName, - order); - sessionState.stations.add(preStartStation); - new Thread(sessionState.stationThreadGroup, preStartStation).start(); - logger.fine("PRESTART station created"); + * Create the select array from event selection in ET stations. + * @return The select array. + */ + static int[] createSelectArray() { + int select[] = new int[EtConstants.stationSelectInts]; + Arrays.fill(select, -1); + return select; + } + + /** + * Create a station that listens for physics sync events + * containing DAQ configuration. + */ + void createSyncStation() { + + // Sync events have bits 6 and 7 set. + int syncEventType = 0; + syncEventType = syncEventType ^ (1 << 6); + syncEventType = syncEventType ^ (1 << 7); + int select[] = createSelectArray(); + select[1] = syncEventType; + + createStationThread( + new SyncEventProcessor(), + "SYNC", + 1, + select); + } + + /** + * Create a station that listens for PRESTART events + * to initialize the conditions system. + */ + void createPreStartStation() { + + // Select only PRESTART events. + int[] select = createSelectArray(); + select[0] = EvioEventConstants.PRESTART_EVENT_TAG; + + createStationThread( + new PreStartProcessor(configurationModel.getDetectorName()), + "PRESTART", + 1, + select); + } + + /** + * Create a station that listens for EPICS control events (currently not activated). + */ + void createEpicsStation() { + + // Select only EPICS events. + int[] select = createSelectArray(); + select[0] = EvioEventConstants.EPICS_EVENT_TAG; + + createStationThread( + new EpicsEtProcessor(), + "EPICS", + 1, + select); + } + + /** + * Create an ET station thread. + * @param processor The event processor to run on the thread. + * @param nameAppend The string to append for naming this station. + * @param stationPosition The position of the station. + * @param select The event selection data array. + */ + void createStationThread(EtEventProcessor processor, String nameAppend, int stationPosition, int[] select) { + EtStationThread stationThread = new EtStationThread( + processor, + sessionState.connection.getEtSystem(), + sessionState.connection.getEtStation().getName() + "_" + nameAppend, + stationPosition, + select); + new Thread(sessionState.stationThreadGroup, stationThread).start(); + sessionState.stations.add(stationThread); + logger.config("started ET station " + nameAppend); + StringBuffer sb = new StringBuffer(); + for (int word : select) { + sb.append(word + " "); + } + logger.config("station has select array: " + sb.toString()); } /** @@ -584,10 +639,12 @@ synchronized void disconnect() { // Cleanup the ET connection. - closeEtConnection(); + if (usingEtServer()) { + closeEtConnection(); + } // Change application state to disconnected. - application.connectionModel.setConnectionStatus(ConnectionStatus.DISCONNECTED); + connectionModel.setConnectionStatus(ConnectionStatus.DISCONNECTED); } /** @@ -617,22 +674,29 @@ } } + /** + * Invalidate all + */ void invalidate() { - this.application = null; - this.conditionsListeners = null; - this.drivers = null; - this.logger = null; - this.processors = null; - - this.sessionState.jobManager = null; - this.sessionState.eventBuilder = null; - this.sessionState.loop = null; - this.sessionState.processingThread = null; - this.sessionState.sessionWatchdogThread = null; - this.sessionState.stationThreadGroup = null; - this.sessionState.stations = null; - this.sessionState.connection = null; - this.sessionState = null; + application = null; + logger = null; + configurationModel = null; + connectionModel = null; + errorHandler = null; + + sessionState.conditionsListeners = null; + sessionState.drivers = null; + sessionState.processors = null; + sessionState.jobManager = null; + sessionState.eventBuilder = null; + sessionState.loop = null; + sessionState.processingThread = null; + sessionState.sessionWatchdogThread = null; + sessionState.stationThreadGroup = null; + sessionState.stations = null; + sessionState.connection = null; + + sessionState = null; } } Modified: java/trunk/monitoring-app/src/main/java/org/hps/monitoring/application/MonitoringApplication.java ============================================================================= --- java/trunk/monitoring-app/src/main/java/org/hps/monitoring/application/MonitoringApplication.java (original) +++ java/trunk/monitoring-app/src/main/java/org/hps/monitoring/application/MonitoringApplication.java Wed Mar 25 15:03:42 2015 @@ -205,18 +205,16 @@ // Setup AIDA plotting and connect it to the GUI. setupAida(); - // Set the configuration. + // Always load the default configuration first. + loadConfiguration(new Configuration(DEFAULT_CONFIGURATION)); + + // Overlay the user configuration if one was specified. if (configuration != null) { - // There was a user specified configuration. this.configuration = configuration; - } else { - // Use the default configuration. - this.configuration = new Configuration(DEFAULT_CONFIGURATION); + loadConfiguration(this.configuration); } - - // Load the configuration. - loadConfiguration(this.configuration); - + + // Enable the GUI now that initialization is complete. frame.setEnabled(true); logger.info("application initialized successfully"); @@ -826,7 +824,7 @@ } /** - * + * Run the disconnection on a separate thread. */ void runDisconnectThread() { new Thread() { Modified: java/trunk/monitoring-app/src/main/java/org/hps/monitoring/application/MonitoringApplicationFrame.java ============================================================================= --- java/trunk/monitoring-app/src/main/java/org/hps/monitoring/application/MonitoringApplicationFrame.java (original) +++ java/trunk/monitoring-app/src/main/java/org/hps/monitoring/application/MonitoringApplicationFrame.java Wed Mar 25 15:03:42 2015 @@ -140,7 +140,7 @@ // Create the main horizontal split pane for dividing the left and right panels. mainSplitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, leftPanel, rightPanel); - mainSplitPane.setDividerLocation(PIXEL_WIDTH_MAX / 2); + mainSplitPane.setDividerLocation((int) (PIXEL_WIDTH_MAX * 0.4)); bottomPanel.add(mainSplitPane, BorderLayout.CENTER); // Create the menu bar. Modified: java/trunk/monitoring-app/src/main/java/org/hps/monitoring/application/util/EtSystemUtil.java ============================================================================= --- java/trunk/monitoring-app/src/main/java/org/hps/monitoring/application/util/EtSystemUtil.java (original) +++ java/trunk/monitoring-app/src/main/java/org/hps/monitoring/application/util/EtSystemUtil.java Wed Mar 25 15:03:42 2015 @@ -1,7 +1,10 @@ package org.hps.monitoring.application.util; + +import java.util.Arrays; import org.hps.monitoring.application.model.ConfigurationModel; import org.hps.record.et.EtConnection; +import org.jlab.coda.et.EtConstants; public final class EtSystemUtil { @@ -20,5 +23,11 @@ config.getWaitMode(), config.getWaitTime(), config.getChunkSize()); + } + + public static int[] createSelectArray() { + int select[] = new int[EtConstants.stationSelectInts]; + Arrays.fill(select, -1); + return select; } } Modified: java/trunk/monitoring-app/src/main/scripts/evio_file_producer.sh ============================================================================= --- java/trunk/monitoring-app/src/main/scripts/evio_file_producer.sh (original) +++ java/trunk/monitoring-app/src/main/scripts/evio_file_producer.sh Wed Mar 25 15:03:42 2015 @@ -1,7 +1,4 @@ #!/bin/sh - -# Set the load library path. -. ${project.build.directory}/scripts/ldpath.sh # First argument, with no command switch, is name of EVIO file. eviofile=$1 Modified: java/trunk/monitoring-app/src/main/scripts/start_et_ring.sh ============================================================================= --- java/trunk/monitoring-app/src/main/scripts/start_et_ring.sh (original) +++ java/trunk/monitoring-app/src/main/scripts/start_et_ring.sh Wed Mar 25 15:03:42 2015 @@ -1,7 +1,4 @@ #!/bin/sh - -# Set the load library path. -. ${project.build.directory}/scripts/ldpath.sh # Setup the classpath. classpath=${project.build.directory}/${project.artifactId}-${project.version}-bin.jar Modified: java/trunk/monitoring-app/src/main/scripts/start_monitoring_application.sh ============================================================================= --- java/trunk/monitoring-app/src/main/scripts/start_monitoring_application.sh (original) +++ java/trunk/monitoring-app/src/main/scripts/start_monitoring_application.sh Wed Mar 25 15:03:42 2015 @@ -1,7 +1,4 @@ #!/bin/sh - -# Set the load library path. -. ${project.build.directory}/scripts/ldpath.sh # The bin jar to run. jarfile=${project.build.directory}/${project.artifactId}-${project.version}-bin.jar