Print

Print


Author: [log in to unmask]
Date: Fri Mar  6 22:52:58 2015
New Revision: 2331

Log:
Merge r2312 through r2330 into prod branch.

Added:
    java/branches/prod/monitoring-app/src/main/java/org/hps/monitoring/application/TriggerDiagnosticsPanel.java
      - copied unchanged from r2330, java/trunk/monitoring-app/src/main/java/org/hps/monitoring/application/TriggerDiagnosticsPanel.java
    java/branches/prod/monitoring-app/src/main/java/org/hps/monitoring/application/model/ConfigurationListener.java
      - copied unchanged from r2330, java/trunk/monitoring-app/src/main/java/org/hps/monitoring/application/model/ConfigurationListener.java
    java/branches/prod/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/ecal/
      - copied from r2330, java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/ecal/
    java/branches/prod/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/trackrecon/SVTOpeningAlignment.java
      - copied unchanged from r2330, java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/trackrecon/SVTOpeningAlignment.java
    java/branches/prod/steering-files/src/main/resources/org/hps/steering/monitoring/TriggerDiagnosticsMonitoring.lcsim
      - copied unchanged from r2330, java/trunk/steering-files/src/main/resources/org/hps/steering/monitoring/TriggerDiagnosticsMonitoring.lcsim
    java/branches/prod/steering-files/src/main/resources/org/hps/steering/monitoring/ecal/
      - copied from r2330, java/trunk/steering-files/src/main/resources/org/hps/steering/monitoring/ecal/
    java/branches/prod/steering-files/src/main/resources/org/hps/steering/users/mgraham/AlignmentMonitorTest.lcsim
      - copied unchanged from r2330, java/trunk/steering-files/src/main/resources/org/hps/steering/users/mgraham/AlignmentMonitorTest.lcsim
    java/branches/prod/tracking/src/main/resources/org/hps/recon/tracking/strategies/HPS-Full-3Hit.xml
      - copied unchanged from r2330, java/trunk/tracking/src/main/resources/org/hps/recon/tracking/strategies/HPS-Full-3Hit.xml
Modified:
    java/branches/prod/   (props changed)
    java/branches/prod/conditions/src/main/java/org/hps/conditions/ConditionsDriver.java
    java/branches/prod/conditions/src/main/java/org/hps/conditions/ecal/EcalCrystalChannelMap.java
    java/branches/prod/detector-data/detectors/HPS-ECalCommissioning-v2/compact.xml
    java/branches/prod/evio/src/main/java/org/hps/evio/LCSimTestRunEventBuilder.java
    java/branches/prod/monitoring-app/   (props changed)
    java/branches/prod/monitoring-app/pom.xml
    java/branches/prod/monitoring-app/src/main/java/org/hps/monitoring/application/DataSourceComboBox.java
    java/branches/prod/monitoring-app/src/main/java/org/hps/monitoring/application/EventProcessing.java
    java/branches/prod/monitoring-app/src/main/java/org/hps/monitoring/application/MonitoringApplication.java
    java/branches/prod/monitoring-app/src/main/java/org/hps/monitoring/application/MonitoringApplicationFrame.java
    java/branches/prod/monitoring-app/src/main/java/org/hps/monitoring/application/model/ConfigurationModel.java
    java/branches/prod/record-util/src/main/java/org/hps/record/composite/CompositeLoop.java
    java/branches/prod/record-util/src/main/java/org/hps/record/evio/EvioEventConstants.java
    java/branches/prod/steering-files/src/main/resources/org/hps/steering/readout/CommRun2014LoosePairs.lcsim

Modified: java/branches/prod/conditions/src/main/java/org/hps/conditions/ConditionsDriver.java
 =============================================================================
--- java/branches/prod/conditions/src/main/java/org/hps/conditions/ConditionsDriver.java	(original)
+++ java/branches/prod/conditions/src/main/java/org/hps/conditions/ConditionsDriver.java	Fri Mar  6 22:52:58 2015
@@ -39,7 +39,6 @@
  */
 public class ConditionsDriver extends Driver {
 
-    DatabaseConditionsManager conditionsManager;
     String detectorName = null;
     String tag = null;
     String xmlConfigResource = null;
@@ -50,7 +49,6 @@
      * Default constructor.
      */
     public ConditionsDriver() {
-        conditionsManager = new DatabaseConditionsManager();
     }
     
     /**
@@ -107,6 +105,9 @@
      * @throws RuntimeException If there is a problem setting up the conditions system.
      */
     public void initialize() {
+        
+        DatabaseConditionsManager conditionsManager = DatabaseConditionsManager.getInstance();
+        
         if (xmlConfigResource != null) {
             // Set a custom XML configuration resource.
             conditionsManager.setXmlConfig(xmlConfigResource);

Modified: java/branches/prod/conditions/src/main/java/org/hps/conditions/ecal/EcalCrystalChannelMap.java
 =============================================================================
--- java/branches/prod/conditions/src/main/java/org/hps/conditions/ecal/EcalCrystalChannelMap.java	(original)
+++ java/branches/prod/conditions/src/main/java/org/hps/conditions/ecal/EcalCrystalChannelMap.java	Fri Mar  6 22:52:58 2015
@@ -10,13 +10,14 @@
 
 /**
  * This is a convenience utility for associating the geometric crystal
- * objects with the conditions system channel information.  
+ * objects with the conditions system channel information and vice versa.  
  * 
  * @author Jeremy McCormick <[log in to unmask]>
  */
 final class EcalCrystalChannelMap {
     
     Map<EcalCrystal, EcalChannel> crystalMap = new HashMap<EcalCrystal, EcalChannel>();
+    Map<EcalChannel, EcalCrystal> channelMap = new HashMap<EcalChannel, EcalCrystal>();
     
     /**
      * Creates the map between crystals and channels.
@@ -24,13 +25,23 @@
      * @param channels The list of channels.
      */
     EcalCrystalChannelMap(HPSEcalAPI api, EcalChannelCollection channels) {
-        List<EcalCrystal> crystals = api.getCrystals();        
-        for (EcalCrystal crystal : crystals) {
+                        
+        // Map crystals to channels.
+        for (EcalCrystal crystal : api.getCrystals()) {
             EcalChannel channel = channels.findGeometric(crystal.getIdentifier().getValue());
             if (channel == null) {
                 throw new RuntimeException("ECAL channel was not found for ID: " + crystal.getExpandedIdentifier());
             }
             crystalMap.put(crystal, channel);
+        }
+        
+        // Map channels to crystals.
+        for (EcalChannel channel : channels) {
+            EcalCrystal crystal = api.getCrystal(channel.getX(), channel.getY());
+            if (crystal == null) {
+                throw new RuntimeException("ECAl crystal was not found for channel X Y: " + channel.getX() + " " + channel.getY());
+            }
+            channelMap.put(channel, crystal);
         }
     }
     
@@ -42,4 +53,13 @@
     EcalChannel getEcalChannel(EcalCrystal crystal) {
         return crystalMap.get(crystal);
     }    
+    
+    /**
+     * Get a channel from a crystal.
+     * @param crystal The geometry object.
+     * @return The channel information or null if does not exist.
+     */
+    EcalCrystal getEcalCrystal(EcalChannel channel) {
+        return channelMap.get(channel);
+    } 
 }

Modified: java/branches/prod/detector-data/detectors/HPS-ECalCommissioning-v2/compact.xml
 =============================================================================
--- java/branches/prod/detector-data/detectors/HPS-ECalCommissioning-v2/compact.xml	(original)
+++ java/branches/prod/detector-data/detectors/HPS-ECalCommissioning-v2/compact.xml	Fri Mar  6 22:52:58 2015
@@ -2,7 +2,7 @@
        xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"
        xs:noNamespaceSchemaLocation="http://www.lcsim.org/schemas/compact/1.0/compact.xsd">
     
-    <info name="HPS-ECalCommissioning-v3">
+    <info name="HPS-ECalCommissioning-v2">
         <comment>HPS ECal commissioning for pass2 with no SVT, By=-0.3309  </comment>
     </info>
 

Modified: java/branches/prod/evio/src/main/java/org/hps/evio/LCSimTestRunEventBuilder.java
 =============================================================================
--- java/branches/prod/evio/src/main/java/org/hps/evio/LCSimTestRunEventBuilder.java	(original)
+++ java/branches/prod/evio/src/main/java/org/hps/evio/LCSimTestRunEventBuilder.java	Fri Mar  6 22:52:58 2015
@@ -127,9 +127,10 @@
             eventID = new int[3];
         } else {
             logger.finest("Read EVIO event number " + eventID[0]);
-            if (eventID[1] != 1) {
-                logger.warning("Trigger code is usually 1; got " + eventID[1]);
-            }
+            // Stop hardcoding event tags.
+            //if (eventID[1] != 1) {
+            //    logger.warning("Trigger code is usually 1; got " + eventID[1]);
+            //}
             if (eventID[2] != 0) {
                 logger.warning("Readout status is usually 0; got " + eventID[2]);
             }

Modified: java/branches/prod/monitoring-app/pom.xml
 =============================================================================
--- java/branches/prod/monitoring-app/pom.xml	(original)
+++ java/branches/prod/monitoring-app/pom.xml	Fri Mar  6 22:52:58 2015
@@ -115,6 +115,10 @@
         </dependency>       
         <dependency>
             <groupId>org.hps</groupId>
+            <artifactId>hps-monitoring-util</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.hps</groupId>
             <artifactId>hps-steering-files</artifactId>
         </dependency>
         <dependency>

Modified: java/branches/prod/monitoring-app/src/main/java/org/hps/monitoring/application/DataSourceComboBox.java
 =============================================================================
--- java/branches/prod/monitoring-app/src/main/java/org/hps/monitoring/application/DataSourceComboBox.java	(original)
+++ java/branches/prod/monitoring-app/src/main/java/org/hps/monitoring/application/DataSourceComboBox.java	Fri Mar  6 22:52:58 2015
@@ -11,6 +11,7 @@
 import javax.swing.JComboBox;
 
 import org.hps.monitoring.application.DataSourceComboBox.DataSourceItem;
+import org.hps.monitoring.application.model.ConfigurationListener;
 import org.hps.monitoring.application.model.ConfigurationModel;
 import org.hps.monitoring.application.model.ConnectionStatus;
 import org.hps.monitoring.application.model.ConnectionStatusModel;
@@ -27,7 +28,7 @@
  * 
  * @author Jeremy McCormick <[log in to unmask]>
  */
-class DataSourceComboBox extends JComboBox<DataSourceItem> implements PropertyChangeListener, ActionListener {
+class DataSourceComboBox extends JComboBox<DataSourceItem> implements PropertyChangeListener, ActionListener, ConfigurationListener {
 
     ConnectionStatusModel connectionModel;
     ConfigurationModel configurationModel;
@@ -62,29 +63,13 @@
         setActionCommand(Commands.DATA_SOURCE_CHANGED);
         setPreferredSize(new Dimension(400, this.getPreferredSize().height));
         setEditable(false);
-        connectionModel.addPropertyChangeListener(this);        
         this.configurationModel = configurationModel;
-    }
-    
-    void initialize() {
-        
-        // Add the default ET item.
-        addItem(new DataSourceItem(configurationModel.getEtPath(), DataSourceType.ET_SERVER));
-        
-        // Add a file source if one has been provided.
-        if (configurationModel.getDataSourcePath() != null) {
-            addItem(new DataSourceItem(configurationModel.getDataSourcePath(), getDataSourceType(configurationModel.getDataSourcePath())));
-        }
-        
-        // Set the initially selected item.
-        setSelectedItem();
-        
-        // Don't add as the property listener until after initialization.
-        configurationModel.addPropertyChangeListener(this);
-    }
-    
+        connectionModel.addPropertyChangeListener(this);                
+        configurationModel.addConfigurationListener(this);
+    }
+            
     void setSelectedItem() {
-        DataSourceItem item = findItem(configurationModel.getDataSourcePath(), configurationModel.getDataSourceType());
+        DataSourceItem item = findItem(configurationModel.getDataSourcePath(), getDataSourceType(configurationModel.getDataSourcePath()));
         if (item != null) {
             setSelectedItem(item);
         }
@@ -96,26 +81,31 @@
 
     @Override
     public void propertyChange(PropertyChangeEvent evt) {
-        if (evt.getPropertyName().equals(ConnectionStatusModel.CONNECTION_STATUS_PROPERTY)) {
-            ConnectionStatus status = (ConnectionStatus) evt.getNewValue();
-            if (status.equals(ConnectionStatus.DISCONNECTED)) {
-                setEnabled(true);
-            } else {
-                setEnabled(false);
-            }
-        } else if (evt.getPropertyName().equals(ConfigurationModel.DATA_SOURCE_PATH_PROPERTY)) {
-            String path = configurationModel.getDataSourcePath();
-            DataSourceType type = getDataSourceType(path);
-            addDataSourceItem(path, type);
-            setSelectedItem();
-        } else if (evt.getPropertyName().equals(ConfigurationModel.DATA_SOURCE_TYPE_PROPERTY)) {
-            setSelectedItem();
-        } else if (evt.getPropertyName().equals(ConfigurationModel.HOST_PROPERTY)) {
-            updateEtItem();
-        } else if (evt.getPropertyName().equals(ConfigurationModel.ET_NAME_PROPERTY)) {
-            updateEtItem();
-        } else if (evt.getPropertyName().equals(ConfigurationModel.PORT_PROPERTY)) {
-            updateEtItem();
+        configurationModel.removePropertyChangeListener(this);
+        try {
+            if (evt.getPropertyName().equals(ConnectionStatusModel.CONNECTION_STATUS_PROPERTY)) {
+                ConnectionStatus status = (ConnectionStatus) evt.getNewValue();
+                if (status.equals(ConnectionStatus.DISCONNECTED)) {
+                    setEnabled(true);
+                } else {
+                    setEnabled(false);
+                }
+            } else if (evt.getPropertyName().equals(ConfigurationModel.DATA_SOURCE_PATH_PROPERTY)) {
+                String path = configurationModel.getDataSourcePath();
+                DataSourceType type = getDataSourceType(path);
+                addDataSourceItem(path, type);
+                setSelectedItem();
+            } else if (evt.getPropertyName().equals(ConfigurationModel.DATA_SOURCE_TYPE_PROPERTY)) {
+                setSelectedItem();
+            } else if (evt.getPropertyName().equals(ConfigurationModel.HOST_PROPERTY)) {
+                updateEtItem();
+            } else if (evt.getPropertyName().equals(ConfigurationModel.ET_NAME_PROPERTY)) {
+                updateEtItem();
+            } else if (evt.getPropertyName().equals(ConfigurationModel.PORT_PROPERTY)) {
+                updateEtItem();
+            }
+        } finally {
+            configurationModel.addPropertyChangeListener(this);
         }
     }
     
@@ -142,7 +132,37 @@
             } finally {
                 configurationModel.addPropertyChangeListener(this);
             }
-        }
+        } 
+    }
+    
+    public void configurationChanged(ConfigurationModel configurationModel) {
+               
+        // Clear the data source list.
+        removeAllItems();
+        
+        // Add the default ET item.
+        this.removeActionListener(this);
+        try {
+            addItem(new DataSourceItem(configurationModel.getEtPath(), DataSourceType.ET_SERVER));
+                
+            // Add a file source if one has been provided.
+            if (configurationModel.getDataSourcePath() != null) {
+                // Add an item for this data source.
+                DataSourceItem newItem = new DataSourceItem(configurationModel.getDataSourcePath(), configurationModel.getDataSourceType());
+                //System.out.println("adding new item " + newItem.name + " " + newItem.type);
+                addItem(newItem);            
+                if (configurationModel.getDataSourceType().isFile()) {
+                    //System.out.println("setting selected");
+                    setSelectedItem(newItem);
+                }
+            }
+        } finally {
+            this.addActionListener(this);    
+        }
+        
+        // Don't add as property change listener until after configuration has been initialized.
+        configurationModel.removePropertyChangeListener(this);
+        configurationModel.addPropertyChangeListener(this);
     }
 
     public void addItem(DataSourceItem item) {

Modified: java/branches/prod/monitoring-app/src/main/java/org/hps/monitoring/application/EventProcessing.java
 =============================================================================
--- java/branches/prod/monitoring-app/src/main/java/org/hps/monitoring/application/EventProcessing.java	(original)
+++ java/branches/prod/monitoring-app/src/main/java/org/hps/monitoring/application/EventProcessing.java	Fri Mar  6 22:52:58 2015
@@ -40,6 +40,7 @@
     Logger logger;
     SessionState sessionState;
     List<CompositeRecordProcessor> processors;
+    List<Driver> drivers;
     
     /**
      * This class is used to organize the objects for an event processing session.
@@ -62,11 +63,13 @@
      */
     EventProcessing(
             MonitoringApplication application, 
-            List<CompositeRecordProcessor> processors) {
+            List<CompositeRecordProcessor> processors,
+            List<Driver> drivers) {
         this.application = application;
-        this.sessionState = new SessionState();
+        this.sessionState = new SessionState();        
+        this.logger = MonitoringApplication.logger;
         this.processors = processors;
-        this.logger = MonitoringApplication.logger;
+        this.drivers = drivers;
     }
     
     /**
@@ -173,8 +176,7 @@
             .setProcessingStage(configurationModel.getProcessingStage())
             .setEtConnection(sessionState.connection)
             .setFilePath(configurationModel.getDataSourcePath())
-            .setLCSimEventBuilder(sessionState.eventBuilder)
-            .setDetectorName(configurationModel.getDetectorName());
+            .setLCSimEventBuilder(sessionState.eventBuilder);
 
         if (configurationModel.hasValidProperty(ConfigurationModel.MAX_EVENTS_PROPERTY)) {
             long maxEvents = configurationModel.getMaxEvents();
@@ -185,26 +187,37 @@
         }
         
         // Add all Drivers from the JobManager.
-        for (Driver driver : sessionState.jobManager.getDriverExecList()) {
+        for (Driver driver : sessionState.jobManager.getDriverExecList()) {            
             loopConfig.add(driver);
+            logger.config("added Driver " + driver.getName() + " to job");
         }
 
         // Using ET server?
         if (configurationModel.getDataSourceType().equals(DataSourceType.ET_SERVER)) {
 
             // ET system monitor.
+            logger.config("added EtSystemMonitor to job");
             loopConfig.add(new EtSystemMonitor());
 
             // ET system strip charts.
+            logger.config("added EtSystemStripCharts to job");
             loopConfig.add(new EtSystemStripCharts());
         }
 
         // Add extra CompositeRecordProcessors to the loop config.
-        for (CompositeRecordProcessor processor : processors) {
+        for (CompositeRecordProcessor processor : 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) {            
+            loopConfig.add(driver);
+            logger.config("added extra Driver " + driver.getName() + " to job");
         }
                 
         // Enable conditions system activation from EVIO event information.
+        logger.config("added EvioDetectorConditionsProcessor to job with detector " + configurationModel.getDetectorName());
         loopConfig.add(new EvioDetectorConditionsProcessor(configurationModel.getDetectorName()));
 
         // Create the CompositeLoop with the configuration.
@@ -240,6 +253,11 @@
      */
     synchronized void stop() {
 
+        logger.info("event processing is stopping");
+        
+        // Disconnect from ET system.
+        disconnect();
+        
         // Is the event processing thread not null?
         if (sessionState.processingThread != null) {
 
@@ -250,8 +268,10 @@
                 sessionState.loop.execute(Command.STOP);
 
                 try {
+                    logger.info("waiting for event processing thread to finish");
                     // This should always work, because the ET system is disconnected before this.
                     sessionState.processingThread.join();
+                    logger.info("event processing thread finished");
                 } catch (InterruptedException e) {
                     // Don't know when this would ever happen.
                     e.printStackTrace();
@@ -269,6 +289,8 @@
 
         // Set the loop to null as a new one will be created for next session.
         sessionState.loop = null;
+        
+        logger.info("event processing stopped");
     }    
            
     /**
@@ -276,6 +298,8 @@
      * and start the watchdog thread.
      */
     synchronized void start() {
+        
+        logger.fine("event processing threads are starting");
         
         // Start the event processing thread.
         sessionState.processingThread = new EventProcessingThread(sessionState.loop);
@@ -283,45 +307,54 @@
         
         // Start the watchdog thread which will auto-disconnect when event processing is done.
         sessionState.sessionWatchdogThread = new SessionWatchdogThread(sessionState.processingThread);
-        sessionState.sessionWatchdogThread.start();        
+        sessionState.sessionWatchdogThread.start();
+        
+        logger.fine("started event processing threads");
     }
     
     /**
      * Notify the event processor to pause processing.
      */
     synchronized void pause() {
+        logger.finest("pausing");
         if (!application.connectionModel.getPaused()) {
             sessionState.loop.pause();
             application.connectionModel.setPaused(true);
         }
+        logger.finest("paused");
     }
     
     /**
      * Get next event if in pause mode.
      */
     synchronized void next() {
+        logger.finest("getting next event");
         if (application.connectionModel.getPaused()) {
             application.connectionModel.setPaused(false);
             sessionState.loop.execute(Command.GO_N, 1L, true);
             application.connectionModel.setPaused(true);
         }
+        logger.finest("got next event");
     }
     
     /**
      * Resume processing events from pause mode.
      */
     synchronized void resume() {
+        logger.finest("resuming");
         if (application.connectionModel.getPaused()) {
             // Notify event processor to continue.
             sessionState.loop.resume();        
             application.connectionModel.setPaused(false);
         }
+        logger.finest("resumed");
     }
     
     /**
      * Interrupt and join to the processing watchdog thread.
      */
     synchronized void killWatchdogThread() {
+        logger.fine("killing watchdog thread");
         // Is the session watchdog thread not null?
         if (sessionState.sessionWatchdogThread != null) {
             // Is the thread still alive?
@@ -339,18 +372,21 @@
             // Set the thread object to null.
             sessionState.sessionWatchdogThread = null;
         }
+        logger.fine("watchdog thread killed");
     }
     
     /**
      * Cleanup the ET connection.
      */
     synchronized void closeEtConnection() {
+        logger.fine("closing ET connection");
         if (sessionState.connection != null) {
             if (sessionState.connection.getEtSystem().alive()) {
                 sessionState.connection.cleanup();
             }
             sessionState.connection = null;
-        }        
+        }
+        logger.fine("ET connection closed");
     }
     
     /**
@@ -364,8 +400,8 @@
     /**
      * Connect to the ET system using the current connection settings.
      */
-    void connect() throws IOException {
-
+    synchronized void connect() throws IOException {
+        logger.fine("connecting to ET system");
         // Setup the network connection if using an ET server.
         if (usingEtServer()) {
             // Create a connection to the ET server.
@@ -378,6 +414,7 @@
             // This is when a direct file source is used and ET is not needed.
             application.connectionModel.setConnectionStatus(ConnectionStatus.CONNECTED);
         }
+        logger.fine("ET system is connected");
     }
     
     /**
@@ -409,16 +446,20 @@
      * Disconnect from the current ET session with a particular status.
      * @param status The connection status.
      */
-    void disconnect() {
+    synchronized void disconnect() {
+        
+        logger.fine("disconnecting");
         
         // Kill the session watch dog thread.
         killWatchdogThread();
 
         // Cleanup the ET connection.
         closeEtConnection();
-
+                              
         // Change application state to disconnected.
         application.connectionModel.setConnectionStatus(ConnectionStatus.DISCONNECTED);
+        
+        logger.fine("disconnected");
     }    
                
     /**
@@ -446,4 +487,4 @@
             }            
         }
     }
-}
+}

Modified: java/branches/prod/monitoring-app/src/main/java/org/hps/monitoring/application/MonitoringApplication.java
 =============================================================================
--- java/branches/prod/monitoring-app/src/main/java/org/hps/monitoring/application/MonitoringApplication.java	(original)
+++ java/branches/prod/monitoring-app/src/main/java/org/hps/monitoring/application/MonitoringApplication.java	Fri Mar  6 22:52:58 2015
@@ -32,6 +32,7 @@
 import javax.swing.filechooser.FileFilter;
 import javax.swing.filechooser.FileNameExtensionFilter;
 
+import org.hps.conditions.database.DatabaseConditionsManager;
 import org.hps.monitoring.application.DataSourceComboBox.DataSourceItem;
 import org.hps.monitoring.application.LogTable.LogRecordModel;
 import org.hps.monitoring.application.model.Configuration;
@@ -50,6 +51,7 @@
 import org.hps.monitoring.subsys.SystemStatusRegistry;
 import org.hps.record.composite.CompositeRecordProcessor;
 import org.hps.record.enums.DataSourceType;
+import org.lcsim.util.Driver;
 import org.lcsim.util.aida.AIDA;
 import org.lcsim.util.log.DefaultLogFormatter;
 
@@ -156,10 +158,7 @@
                                       
         // Load the configuration.
         loadConfiguration(this.configuration);
-        
-        // Setup the data source combo box.
-        frame.dataSourceComboBox.initialize();
-        
+                
         logger.info("application initialized successfully");
     }
     
@@ -189,19 +188,9 @@
 
         String cmd = e.getActionCommand();
         if (Commands.CONNECT.equals(cmd)) {
-            // Run the start session method on a separate thread.
-            new Thread() {
-                public void run() {
-                    startSession();
-                }
-            }.start();
+            startSession();
         } else if (Commands.DISCONNECT.equals(cmd)) {
-            // Run the stop session method on a separate thread.
-            new Thread() {
-                public void run() {
-                    stopSession();
-                }
-            }.start();
+            processing.stop();
         } else if (Commands.SAVE_PLOTS.equals(cmd)) {
             savePlots();
         } else if (Commands.EXIT.equals(cmd)) {
@@ -357,18 +346,14 @@
     }
     
     /**
-     * <p>
      * Start a new monitoring session.
-     * <p> 
-     * This method is executed in a separate thread from the EDT within {@link #actionPerformed(ActionEvent)} 
-     * so that GUI updates are not blocked while the session is being setup.
-     */
-    void startSession() {
+     */
+    synchronized void startSession() {
         
         logger.info("starting new session");
 
         try {
-            
+                        
             // Reset the plot panel and global AIDA state.
             resetPlots();
 
@@ -381,8 +366,11 @@
             List<CompositeRecordProcessor> processors = new ArrayList<CompositeRecordProcessor>();
             processors.add(frame.runPanel.new RunPanelUpdater());
             
+            List<Driver> drivers = new ArrayList<Driver>();
+            drivers.add(frame.triggerPanel.new TriggerDiagnosticGUIDriver());
+            
             // Initialize event processing with the list of processors and reference to the application.
-            processing = new EventProcessing(this, processors);
+            processing = new EventProcessing(this, processors, drivers);
             
             // Connect to the ET system, if applicable.
             processing.connect();
@@ -412,31 +400,13 @@
             logger.severe("failed to start new session");
         }
     }
-    
-    /**
-     * Stop the session by disconnecting from the ET system and stopping the event processing.
-     */
-    void stopSession() {
-        
-        logger.info("stopping the session");
-        
-        // Disconnect from ET system, if using the ET server, and set the proper disconnected GUI state.
-        processing.disconnect();
-
-        // Stop the event processing, which is called after the ET system goes down to avoid hanging in calls to ET system.
-        processing.stop(); 
-        
-        logger.info("session was stopped");
-    }
-    
+           
     /**
      * Exit from the application.
      */
     void exit() {        
-        // Cleanup ET system if necessary.
         if (processing != null && processing.isActive()) {
-            logger.info("killing active ET connection");
-            processing.closeEtConnection();
+            processing.stop();
         }
         frame.setVisible(false);
         logger.info("exiting the application");

Modified: java/branches/prod/monitoring-app/src/main/java/org/hps/monitoring/application/MonitoringApplicationFrame.java
 =============================================================================
--- java/branches/prod/monitoring-app/src/main/java/org/hps/monitoring/application/MonitoringApplicationFrame.java	(original)
+++ java/branches/prod/monitoring-app/src/main/java/org/hps/monitoring/application/MonitoringApplicationFrame.java	Fri Mar  6 22:52:58 2015
@@ -29,6 +29,7 @@
     LogPanel logPanel;
     SystemStatusTable systemStatusTable;
     JPanel buttonsPanel;
+    TriggerDiagnosticsPanel triggerPanel;
     
     JSplitPane mainSplitPane;
     JSplitPane rightSplitPane;
@@ -113,6 +114,10 @@
         systemStatusTable = new SystemStatusTable();
         tableTabbedPane.addTab("System Status Monitor", new JScrollPane(systemStatusTable));
         
+        // Add the trigger diagnostics tables.
+        triggerPanel = new TriggerDiagnosticsPanel();
+        tableTabbedPane.addTab("Trigger Diagnostics", triggerPanel);
+        
         // Vertical split pane in left panel.
         leftSplitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, runPanel, tableTabbedPane);
         leftPanel.add(leftSplitPane, BorderLayout.CENTER);
@@ -132,11 +137,12 @@
         // Create the right panel vertical split pane for displaying plots and their information and statistics.
         rightSplitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, plotPanel, plotInfoPanel);
         setProportionalSize(rightSplitPane, RIGHT_PANEL_WIDTH, FULL_SIZE);
-        rightSplitPane.setResizeWeight(0.9);
+        rightSplitPane.setResizeWeight(0.8);
         rightPanel.add(rightSplitPane, BorderLayout.CENTER);
                        
         // Create the main horizontal split pane for dividing the left and right panels.
         mainSplitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, leftPanel, rightPanel);
+        mainSplitPane.setResizeWeight(0.15);
         bottomPanel.add(mainSplitPane, BorderLayout.CENTER);
         
         // Create the menu bar.
@@ -174,9 +180,13 @@
         component.setPreferredSize(scaledDimension);
     }           
     
+    /**
+     * Restore default window settings.
+     */
     void restoreDefaults() {
+        setExtendedState(JFrame.MAXIMIZED_BOTH);
         mainSplitPane.resetToPreferredSizes();
         leftSplitPane.resetToPreferredSizes();
-        rightSplitPane.resetToPreferredSizes();
+        rightSplitPane.resetToPreferredSizes();        
     }    
 }

Modified: java/branches/prod/monitoring-app/src/main/java/org/hps/monitoring/application/model/ConfigurationModel.java
 =============================================================================
--- java/branches/prod/monitoring-app/src/main/java/org/hps/monitoring/application/model/ConfigurationModel.java	(original)
+++ java/branches/prod/monitoring-app/src/main/java/org/hps/monitoring/application/model/ConfigurationModel.java	Fri Mar  6 22:52:58 2015
@@ -1,6 +1,5 @@
 package org.hps.monitoring.application.model;
 
-import java.awt.event.ActionListener;
 import java.io.File;
 import java.util.ArrayList;
 import java.util.List;
@@ -17,6 +16,8 @@
 public final class ConfigurationModel extends AbstractModel {
 
     Configuration configuration;    
+    
+    List<ConfigurationListener> listeners = new ArrayList<ConfigurationListener>();
     
     // Job setting properties.
     public static final String DETECTOR_NAME_PROPERTY = "DetectorName";
@@ -53,6 +54,9 @@
     public static final String WAIT_MODE_PROPERTY = "WaitMode";
     public static final String WAIT_TIME_PROPERTY = "WaitTime";
     public static final String PRESCALE_PROPERTY = "Prescale";
+    
+    // Action command to get notified after configuration change is performed.
+    public static final String CONFIGURATION_CHANGED = "configurationChanged";
 
     static final String[] CONFIG_PROPERTIES = AbstractModel.getPropertyNames(ConfigurationModel.class);
 
@@ -64,10 +68,21 @@
         this.configuration = configuration;
         fireModelChanged();
     }
+    
+    public void addConfigurationListener(ConfigurationListener listener) {
+        listeners.add(listener);
+    }
 
     public void setConfiguration(Configuration configuration) {
         this.configuration = configuration;
         fireModelChanged();
+        fireConfigurationChanged();
+    }
+    
+    void fireConfigurationChanged() {        
+        for (ConfigurationListener listener : listeners) {
+            listener.configurationChanged(this);
+        }
     }
     
     public Configuration getConfiguration() {

Modified: java/branches/prod/record-util/src/main/java/org/hps/record/composite/CompositeLoop.java
 =============================================================================
--- java/branches/prod/record-util/src/main/java/org/hps/record/composite/CompositeLoop.java	(original)
+++ java/branches/prod/record-util/src/main/java/org/hps/record/composite/CompositeLoop.java	Fri Mar  6 22:52:58 2015
@@ -18,10 +18,8 @@
 import org.hps.record.et.EtEventSource.EtSourceException;
 import org.hps.record.evio.EvioEventProcessor;
 import org.hps.record.evio.EvioFileSource;
-import org.lcsim.conditions.ConditionsManager;
 import org.lcsim.util.Driver;
 import org.lcsim.util.loop.LCIOEventSource;
-import org.lcsim.util.loop.LCSimConditionsManagerImplementation;
 
 /**
  * Implementation of a composite record loop for processing
@@ -265,7 +263,6 @@
         
         // Configure ET system.
         if (config.sourceType == DataSourceType.ET_SERVER) {
-            //System.out.println("compositeLoop.addAdapter(etAdapter)");
             addAdapter(etAdapter);
         }
         
@@ -274,28 +271,17 @@
             if (config.sourceType.ordinal() <= DataSourceType.EVIO_FILE.ordinal()) {
                 if (evioAdapter == null)
                     evioAdapter = new EvioEventAdapter();
-                //System.out.println("compositeLoop.addAdapter(evioAdapter)");
                 addAdapter(evioAdapter);
             }
         }
         
         // Configure LCIO processing.
         if (config.processingStage.ordinal() >= ProcessingStage.LCIO.ordinal()) {
-            if (lcioAdapter == null)
+            if (lcioAdapter == null) {
                 lcioAdapter = new LcioEventAdapter();
-            //System.out.println("compositeLoop.addAdapter(lcioAdapter)");
+            }
             addAdapter(lcioAdapter);
             if (config.eventBuilder != null) {
-                if (config.detectorName != null) {
-                    // Is LCSim ConditionsManager installed yet?
-                    if (!ConditionsManager.isSetup()) {
-                        // Setup default LCSim conditions system if not already.
-                        LCSimConditionsManagerImplementation.register();
-                    }
-                    //config.eventBuilder.setDetectorName(config.detectorName);
-                } else {
-                    throw new IllegalArgumentException("Missing detectorName in configuration.");
-                }
                 lcioAdapter.setLCSimEventBuilder(config.eventBuilder);
             } else {
                 throw new IllegalArgumentException("Missing an LCSimEventBuilder in configuration.");

Modified: java/branches/prod/record-util/src/main/java/org/hps/record/evio/EvioEventConstants.java
 =============================================================================
--- java/branches/prod/record-util/src/main/java/org/hps/record/evio/EvioEventConstants.java	(original)
+++ java/branches/prod/record-util/src/main/java/org/hps/record/evio/EvioEventConstants.java	Fri Mar  6 22:52:58 2015
@@ -12,4 +12,9 @@
     public static final int EVENTID_BANK_TAG = 0xC000;
     
     public static final int HEAD_BANK_TAG = 0xe10F;
+  
+    public static final int EPICS_EVENT_TAG = 31;
+    public static final int EPICS_BANK_TAG_2s = -1;
+    public static final int EPICS_BANK_TAG_20s = -1;
+    
 }

Modified: java/branches/prod/steering-files/src/main/resources/org/hps/steering/readout/CommRun2014LoosePairs.lcsim
 =============================================================================
--- java/branches/prod/steering-files/src/main/resources/org/hps/steering/readout/CommRun2014LoosePairs.lcsim	(original)
+++ java/branches/prod/steering-files/src/main/resources/org/hps/steering/readout/CommRun2014LoosePairs.lcsim	Fri Mar  6 22:52:58 2015
@@ -47,16 +47,18 @@
             <inputHitCollectionName>EcalCorrectedHits</inputHitCollectionName>
             <clusterWindow>1</clusterWindow>
         </driver>
-        <driver name="PairTrigger0" type="org.hps.readout.ecal.FADCPrimaryTriggerDriver">
+        <driver name="PairTrigger1" type="org.hps.readout.ecal.FADCPrimaryTriggerDriver">
             <clusterCollectionName>EcalClusters</clusterCollectionName>
             <deadTime>10</deadTime>
             <pairCoincidence>4</pairCoincidence>
-            <minHitCount>2</minHitCount>
+            <minHitCount>3</minHitCount>
             <energySumHigh>2.0</energySumHigh>
-            <energySumLow>0.0</energySumLow>
+            <energySumLow>1.0</energySumLow>
             <energyDifferenceHigh>1.2</energyDifferenceHigh>
-            <coplanarityHigh>90</coplanarityHigh>
+            <coplanarityHigh>40</coplanarityHigh>
             <seedEnergyLow>0.1</seedEnergyLow>
+            <energySlopeParamF>0.005500</energySlopeParamF>
+            <energySlopeLow>0.4</energySlopeLow>
             <outputFileName>${outputFile}.triggers</outputFileName>
         </driver>	      
         <driver name="AidaSaveDriver"