Print

Print


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

Log:
Work in progress on adding trigger diagnostics to monitoring app.

Added:
    java/branches/monitoring-app-HPSJAVA-332/src/main/java/org/hps/monitoring/application/TriggerDiagnosticsPanel.java
    java/branches/monitoring-app-HPSJAVA-332/src/main/java/org/hps/monitoring/application/model/ConfigurationListener.java
Modified:
    java/branches/monitoring-app-HPSJAVA-332/pom.xml
    java/branches/monitoring-app-HPSJAVA-332/src/main/java/org/hps/monitoring/application/Commands.java
    java/branches/monitoring-app-HPSJAVA-332/src/main/java/org/hps/monitoring/application/DataSourceComboBox.java
    java/branches/monitoring-app-HPSJAVA-332/src/main/java/org/hps/monitoring/application/EventProcessing.java
    java/branches/monitoring-app-HPSJAVA-332/src/main/java/org/hps/monitoring/application/JobSettingsPanel.java
    java/branches/monitoring-app-HPSJAVA-332/src/main/java/org/hps/monitoring/application/LogTable.java
    java/branches/monitoring-app-HPSJAVA-332/src/main/java/org/hps/monitoring/application/MonitoringApplication.java
    java/branches/monitoring-app-HPSJAVA-332/src/main/java/org/hps/monitoring/application/MonitoringApplicationFrame.java
    java/branches/monitoring-app-HPSJAVA-332/src/main/java/org/hps/monitoring/application/model/ConfigurationModel.java
    java/branches/monitoring-app-HPSJAVA-332/src/main/resources/org/hps/monitoring/config/default_config.prop

Modified: java/branches/monitoring-app-HPSJAVA-332/pom.xml
 =============================================================================
--- java/branches/monitoring-app-HPSJAVA-332/pom.xml	(original)
+++ java/branches/monitoring-app-HPSJAVA-332/pom.xml	Fri Mar  6 19:58:22 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>
@@ -127,4 +131,4 @@
             <version>1.0</version>
         </dependency>
     </dependencies>
-</project>
+</project>

Modified: java/branches/monitoring-app-HPSJAVA-332/src/main/java/org/hps/monitoring/application/Commands.java
 =============================================================================
--- java/branches/monitoring-app-HPSJAVA-332/src/main/java/org/hps/monitoring/application/Commands.java	(original)
+++ java/branches/monitoring-app-HPSJAVA-332/src/main/java/org/hps/monitoring/application/Commands.java	Fri Mar  6 19:58:22 2015
@@ -42,7 +42,10 @@
     
     static final String LOG_LEVEL_FILTER_CHANGED = "logLevelFilterChanged";
         
-    ////////////////////////////////////////////    
+    ////////////////////////////////////////////
+    
+    static final String LOG_LEVEL_CHANGED = "logLevelChanged";
+    
     static final String BLOCKING_CHANGED = "blockingChanged";
     static final String CHOOSE_COMPACT_FILE = "chooseCompactFile";
     static final String CHOOSE_LOG_FILE = "chooseLogFile";
@@ -57,12 +60,7 @@
     static final String DISCONNECT_ON_END_RUN_CHANGED = "disconnectOnEndRunChanged";
     static final String EVENT_BUILDER_CHANGED = "eventBuilderChanged";
     static final String FREEZE_CONDITIONS_CHANGED = "freezeConditionsChanged";
-    
-    static final String LOG_LEVEL_CHANGED = "logLevelChanged";
-    static final String LOG_TO_FILE = "logToFile";
-    static final String LOG_TO_FILE_CHANGED = "logToFileChanged";
-    static final String LOG_TO_TERMINAL = "logToTerminal";
-
+        
     static final String PROCESSING_STAGE_CHANGED = "processingStageChanged";    
     static final String SAVE_LOG_TABLE = "saveLogTable";            
     static final String SELECT_LOG_FILE = "logToFile";

Modified: java/branches/monitoring-app-HPSJAVA-332/src/main/java/org/hps/monitoring/application/DataSourceComboBox.java
 =============================================================================
--- java/branches/monitoring-app-HPSJAVA-332/src/main/java/org/hps/monitoring/application/DataSourceComboBox.java	(original)
+++ java/branches/monitoring-app-HPSJAVA-332/src/main/java/org/hps/monitoring/application/DataSourceComboBox.java	Fri Mar  6 19:58:22 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/monitoring-app-HPSJAVA-332/src/main/java/org/hps/monitoring/application/EventProcessing.java
 =============================================================================
--- java/branches/monitoring-app-HPSJAVA-332/src/main/java/org/hps/monitoring/application/EventProcessing.java	(original)
+++ java/branches/monitoring-app-HPSJAVA-332/src/main/java/org/hps/monitoring/application/EventProcessing.java	Fri Mar  6 19:58:22 2015
@@ -36,10 +36,11 @@
  */
 class EventProcessing {
     
+    SessionState sessionState = new SessionState();
     MonitoringApplication application;
-    Logger logger;
-    SessionState sessionState;
+    Logger logger;    
     List<CompositeRecordProcessor> processors;
+    List<Driver> drivers;
     
     /**
      * This class is used to organize the objects for an event processing session.
@@ -62,11 +63,12 @@
      */
     EventProcessing(
             MonitoringApplication application, 
-            List<CompositeRecordProcessor> processors) {
+            List<CompositeRecordProcessor> processors,
+            List<Driver> drivers) {
         this.application = application;
-        this.sessionState = new SessionState();
+        this.logger = MonitoringApplication.logger;
         this.processors = processors;
-        this.logger = MonitoringApplication.logger;
+        this.drivers = drivers;
     }
     
     /**
@@ -157,7 +159,8 @@
         }
 
         // Add the builder as a listener so it is notified when conditions change.
-        ConditionsManager.defaultInstance().addConditionsListener(sessionState.eventBuilder);
+        logger.config("adding " + sessionState.eventBuilder.getClass().getSimpleName() + " as conditions listener");
+        DatabaseConditionsManager.getInstance().addConditionsListener(sessionState.eventBuilder);
     }
     
     /**
@@ -165,7 +168,7 @@
      * @param configurationModel The global configuration.
      */
     void setupLoop(ConfigurationModel configurationModel) {
-
+       
         CompositeLoopConfiguration loopConfig = new CompositeLoopConfiguration()
             .setStopOnEndRun(configurationModel.getDisconnectOnEndRun())
             .setStopOnErrors(configurationModel.getDisconnectOnError())
@@ -179,36 +182,47 @@
         if (configurationModel.hasValidProperty(ConfigurationModel.MAX_EVENTS_PROPERTY)) {
             long maxEvents = configurationModel.getMaxEvents();
             if (maxEvents > 0L) {
-                //logger.config("processing will stop after max events: " + maxEvents);
                 loopConfig.setMaxRecords(maxEvents);
-            }
-        }
-        
-        // Add all Drivers from the JobManager.
+                logger.config("set max events to " + maxEvents);
+            }
+        }
+        
+        // Add all Drivers from the JobManager.        
         for (Driver driver : sessionState.jobManager.getDriverExecList()) {
-            loopConfig.add(driver);
-        }
+            logger.config("added Driver " + driver.getName());
+        }        
 
         // Using ET server?
         if (configurationModel.getDataSourceType().equals(DataSourceType.ET_SERVER)) {
 
-            // ET system monitor.
+            // ET system monitor.            
             loopConfig.add(new EtSystemMonitor());
+            logger.config("added EtSystemMonitor");
 
             // ET system strip charts.
             loopConfig.add(new EtSystemStripCharts());
-        }
-
-        // Add extra CompositeRecordProcessors to the loop config.
+            logger.config("added EtSystemStripCharts");
+        }
+
+        // Add extra CompositeRecordProcessors to the loop configuration.
         for (CompositeRecordProcessor processor : processors) {
+            logger.config("added extra processor " + processor.getClass().getName());
             loopConfig.add(processor);   
         }
-                
+        
+        // Add extra Drivers to the loop configuration.
+        for (Driver driver : drivers) {
+            logger.config("added extra Driver " + driver.getName());
+            loopConfig.add(driver);
+        }
+
         // Enable conditions system activation from EVIO event information.
+        logger.config("adding EvioDetectorConditionsProcessor");
         loopConfig.add(new EvioDetectorConditionsProcessor(configurationModel.getDetectorName()));
 
         // Create the CompositeLoop with the configuration.
-        sessionState.loop = new CompositeLoop(loopConfig);        
+        sessionState.loop = new CompositeLoop(loopConfig); 
+        logger.fine("record loop setup complete");
     }    
     
     /**
@@ -240,6 +254,8 @@
      */
     synchronized void stop() {
 
+        logger.fine("event processing is stopping");
+        
         // Is the event processing thread not null?
         if (sessionState.processingThread != null) {
 
@@ -269,6 +285,8 @@
 
         // Set the loop to null as a new one will be created for next session.
         sessionState.loop = null;
+        
+        logger.fine("event processing stopped");
     }    
            
     /**
@@ -276,6 +294,8 @@
      * and start the watchdog thread.
      */
     synchronized void start() {
+        
+        logger.fine("event processing starting");
         
         // Start the event processing thread.
         sessionState.processingThread = new EventProcessingThread(sessionState.loop);
@@ -283,45 +303,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("event processing started");
     }
     
     /**
      * Notify the event processor to pause processing.
      */
     synchronized void pause() {
+        logger.finest("event processing pausing");
         if (!application.connectionModel.getPaused()) {
             sessionState.loop.pause();
             application.connectionModel.setPaused(true);
         }
+        logger.finest("event processing paused");
     }
     
     /**
      * Get next event if in pause mode.
      */
     synchronized void next() {
+        logger.finest("event processing 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("event processing got next event");
     }
     
     /**
      * Resume processing events from pause mode.
      */
     synchronized void resume() {
+        logger.finest("event processing resuming");
         if (application.connectionModel.getPaused()) {
             // Notify event processor to continue.
             sessionState.loop.resume();        
             application.connectionModel.setPaused(false);
         }
+        logger.finest("event processing resumed");
     }
     
     /**
      * Interrupt and join to the processing watchdog thread.
      */
     synchronized void killWatchdogThread() {
+        logger.finest("session watchdog thread being killed");
         // Is the session watchdog thread not null?
         if (sessionState.sessionWatchdogThread != null) {
             // Is the thread still alive?
@@ -339,18 +368,21 @@
             // Set the thread object to null.
             sessionState.sessionWatchdogThread = null;
         }
+        logger.finest("session watchdog thread is killed");
     }
     
     /**
      * Cleanup the ET connection.
      */
     synchronized void closeEtConnection() {
+        logger.finest("closing ET connection");
         if (sessionState.connection != null) {
             if (sessionState.connection.getEtSystem().alive()) {
                 sessionState.connection.cleanup();
             }
             sessionState.connection = null;
         }        
+        logger.finest("ET connection closed");
     }
     
     /**
@@ -365,19 +397,21 @@
      * Connect to the ET system using the current connection settings.
      */
     void connect() throws IOException {
-
+                
         // Setup the network connection if using an ET server.
         if (usingEtServer()) {
+            logger.finest("connecting to ET system");
             // Create a connection to the ET server.
             try {
                 createEtConnection();
+                logger.finest("connected to ET system");
             } catch (Exception e) {
                 throw new IOException(e);
             }
         } else {
             // This is when a direct file source is used and ET is not needed.
             application.connectionModel.setConnectionStatus(ConnectionStatus.CONNECTED);
-        }
+        }        
     }
     
     /**
@@ -411,6 +445,8 @@
      */
     void disconnect() {
         
+        logger.finest("disconnecting from session");
+        
         // Kill the session watch dog thread.
         killWatchdogThread();
 
@@ -419,6 +455,8 @@
 
         // Change application state to disconnected.
         application.connectionModel.setConnectionStatus(ConnectionStatus.DISCONNECTED);
+        
+        logger.finest("disconnected from session");
     }    
                
     /**

Modified: java/branches/monitoring-app-HPSJAVA-332/src/main/java/org/hps/monitoring/application/JobSettingsPanel.java
 =============================================================================
--- java/branches/monitoring-app-HPSJAVA-332/src/main/java/org/hps/monitoring/application/JobSettingsPanel.java	(original)
+++ java/branches/monitoring-app-HPSJAVA-332/src/main/java/org/hps/monitoring/application/JobSettingsPanel.java	Fri Mar  6 19:58:22 2015
@@ -45,9 +45,7 @@
     private JTextField maxEventsField;
     private JCheckBox disconnectOnErrorCheckBox;
     private JCheckBox disconnectOnEndRunCheckBox;
-    private JTextField logFileNameField;
     private JComboBox<?> logLevelComboBox;
-    private JCheckBox logToFileCheckbox;
            
     // The package where steering resources must be located.
     static final String STEERING_PACKAGE = "org/hps/steering/monitoring/";
@@ -132,15 +130,7 @@
 
         logLevelComboBox = addComboBox("Log Level", LOG_LEVELS);
         logLevelComboBox.setActionCommand(Commands.LOG_LEVEL_CHANGED);
-        logLevelComboBox.addActionListener(this);
-                                            
-        logToFileCheckbox = addCheckBox("Log to File", false, false);
-        logToFileCheckbox.setEnabled(false);
-        logToFileCheckbox.setActionCommand(LOG_TO_FILE_CHANGED);
-        logToFileCheckbox.addActionListener(this);
-
-        logFileNameField = addField("Log File", "", "Full path to log file.", 30, false);
-        logFileNameField.addPropertyChangeListener("value", this);
+        logLevelComboBox.addActionListener(this);                                            
     }
 
     @Override
@@ -152,8 +142,6 @@
      * Attaches the ActionListener from the main app to specific GUI components in this class.
      */
     public void addActionListener(ActionListener listener) {
-        logFileNameField.addActionListener(listener);
-        logToFileCheckbox.addActionListener(listener);
         steeringResourcesComboBox.addActionListener(listener);
         freezeConditionsCheckBox.addActionListener(listener);
     }
@@ -252,8 +240,6 @@
                 configurationModel.setSteeringType(SteeringType.valueOf((String) steeringTypeComboBox.getSelectedItem()));
             } else if (STEERING_RESOURCE_CHANGED.equals(event.getActionCommand())) {
                 configurationModel.setSteeringResource((String) steeringResourcesComboBox.getSelectedItem());
-            } else if (LOG_TO_FILE_CHANGED.equals(event.getActionCommand())) {
-                configurationModel.setLogToFile(logToFileCheckbox.isSelected());
             } else if (LOG_LEVEL_CHANGED.equals(event.getActionCommand())) {
                 configurationModel.setLogLevel(Level.parse((String) logLevelComboBox.getSelectedItem()));
             } else if (EVENT_BUILDER_CHANGED.equals(event.getActionCommand())) {
@@ -289,8 +275,6 @@
             Object source = evt.getSource();            
             if (source == steeringFileField) {
                 configurationModel.setSteeringFile(steeringFileField.getText());
-            } else if (source == logFileNameField) {
-                configurationModel.setLogFileName(logFileNameField.getText());
             } else if (source == userRunNumberField) {
                 // Is run number being reset to null or empty?
                 if (userRunNumberField.getText() == null || userRunNumberField.getText().isEmpty()) {
@@ -348,12 +332,8 @@
                         disconnectOnEndRunCheckBox.setSelected((Boolean) value);
                     } else if (evt.getPropertyName().equals(EVENT_BUILDER_PROPERTY)) {
                         eventBuilderComboBox.setSelectedItem((String) value);
-                    } else if (evt.getPropertyName().equals(LOG_FILE_NAME_PROPERTY)) {
-                        logFileNameField.setText((String) value);
                     } else if (evt.getPropertyName().equals(LOG_LEVEL_PROPERTY)) {
                         logLevelComboBox.setSelectedItem(value.toString());
-                    } else if (evt.getPropertyName().equals(LOG_TO_FILE_PROPERTY)) {
-                        logToFileCheckbox.setSelected((Boolean) value);
                     } else if (evt.getPropertyName().equals(STEERING_TYPE_PROPERTY)) {
                         steeringTypeComboBox.setSelectedIndex(((SteeringType) value).ordinal());
                     } else if (evt.getPropertyName().equals(STEERING_FILE_PROPERTY)) {

Modified: java/branches/monitoring-app-HPSJAVA-332/src/main/java/org/hps/monitoring/application/LogTable.java
 =============================================================================
--- java/branches/monitoring-app-HPSJAVA-332/src/main/java/org/hps/monitoring/application/LogTable.java	(original)
+++ java/branches/monitoring-app-HPSJAVA-332/src/main/java/org/hps/monitoring/application/LogTable.java	Fri Mar  6 19:58:22 2015
@@ -105,7 +105,7 @@
             case 0:
                 return Date.class;
             case 1:
-                return String.class;
+                return Level.class;
             case 2:
                 return String.class;
             default:

Modified: java/branches/monitoring-app-HPSJAVA-332/src/main/java/org/hps/monitoring/application/MonitoringApplication.java
 =============================================================================
--- java/branches/monitoring-app-HPSJAVA-332/src/main/java/org/hps/monitoring/application/MonitoringApplication.java	(original)
+++ java/branches/monitoring-app-HPSJAVA-332/src/main/java/org/hps/monitoring/application/MonitoringApplication.java	Fri Mar  6 19:58:22 2015
@@ -50,6 +50,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;
 
@@ -157,9 +158,9 @@
         // Load the configuration.
         loadConfiguration(this.configuration);
         
-        // Setup the data source combo box.
-        frame.dataSourceComboBox.initialize();
-        
+        // We want to know when a new data source is selected to log it.
+        frame.dataSourceComboBox.addActionListener(this);
+                
         logger.info("application initialized successfully");
     }
     
@@ -187,6 +188,8 @@
      */
     public void actionPerformed(ActionEvent e) {
 
+        logger.finer("action performed - " + e.getActionCommand());
+        
         String cmd = e.getActionCommand();
         if (Commands.CONNECT.equals(cmd)) {
             // Run the start session method on a separate thread.
@@ -240,7 +243,10 @@
             saveLogTable();
         } else if (Commands.CLEAR_LOG_TABLE.equals(cmd)) {
             getLogRecordModel().clear();
-        }        
+        } else if (Commands.DATA_SOURCE_CHANGED.equals(cmd)) {
+            DataSourceItem currentItem = (DataSourceItem) frame.dataSourceComboBox.getSelectedItem();
+            logger.config("data source changed to " + currentItem.name + " " + currentItem.type);
+        }
     }    
     
     /**
@@ -381,14 +387,18 @@
             List<CompositeRecordProcessor> processors = new ArrayList<CompositeRecordProcessor>();
             processors.add(frame.runPanel.new RunPanelUpdater());
             
+            // List of extra Drivers.
+            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();
             
             // Configure event processing from the global application settings, including setup of record loop.
-            logger.info("setting up event processing on source " + configurationModel.getDataSourcePath() 
+            logger.info("setting up event processing on " + configurationModel.getDataSourcePath() 
                     + " with type " + configurationModel.getDataSourceType());
             processing.setup(configurationModel);
                                   

Modified: java/branches/monitoring-app-HPSJAVA-332/src/main/java/org/hps/monitoring/application/MonitoringApplicationFrame.java
 =============================================================================
--- java/branches/monitoring-app-HPSJAVA-332/src/main/java/org/hps/monitoring/application/MonitoringApplicationFrame.java	(original)
+++ java/branches/monitoring-app-HPSJAVA-332/src/main/java/org/hps/monitoring/application/MonitoringApplicationFrame.java	Fri Mar  6 19:58:22 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);
@@ -137,6 +142,7 @@
                        
         // 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.

Added: java/branches/monitoring-app-HPSJAVA-332/src/main/java/org/hps/monitoring/application/TriggerDiagnosticsPanel.java
 =============================================================================
--- java/branches/monitoring-app-HPSJAVA-332/src/main/java/org/hps/monitoring/application/TriggerDiagnosticsPanel.java	(added)
+++ java/branches/monitoring-app-HPSJAVA-332/src/main/java/org/hps/monitoring/application/TriggerDiagnosticsPanel.java	Fri Mar  6 19:58:22 2015
@@ -0,0 +1,82 @@
+package org.hps.monitoring.application;
+
+import java.awt.BorderLayout;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.swing.JPanel;
+import javax.swing.JTabbedPane;
+
+import org.hps.analysis.trigger.DiagSnapshot;
+import org.hps.monitoring.trigger.ClusterTablePanel;
+import org.hps.monitoring.trigger.DiagnosticUpdatable;
+import org.hps.monitoring.trigger.EfficiencyTablePanel;
+import org.hps.monitoring.trigger.PairTablePanel;
+import org.hps.monitoring.trigger.SinglesTablePanel;
+import org.lcsim.event.EventHeader;
+import org.lcsim.util.Driver;
+
+/**
+ * This is a panel containing the trigger diagnostics tables.
+ * 
+ * @author Jeremy McCormick <[log in to unmask]>
+ */
+public class TriggerDiagnosticsPanel extends JPanel {
+
+    JTabbedPane tabs = new JTabbedPane();
+    ClusterTablePanel clusterPanel = new ClusterTablePanel();
+    SinglesTablePanel singlesPanel = new SinglesTablePanel();
+    PairTablePanel pairsPanel = new PairTablePanel();
+    EfficiencyTablePanel efficiencyPanel = new EfficiencyTablePanel();
+    
+    List<DiagnosticUpdatable> updateList = new ArrayList<DiagnosticUpdatable>();
+    
+    TriggerDiagnosticsPanel() {
+        setLayout(new BorderLayout());
+                       
+        tabs.addTab("Clusters", clusterPanel);
+        tabs.addTab("Singles", singlesPanel);
+        tabs.addTab("Pairs", pairsPanel);
+        tabs.addTab("Efficiency", efficiencyPanel);
+        
+        updateList.add(clusterPanel);
+        updateList.add(singlesPanel);
+        updateList.add(pairsPanel);
+        updateList.add(efficiencyPanel);
+        
+        add(tabs, BorderLayout.CENTER);
+    }
+        
+    /**
+     * Driver for updating the tables.
+     */
+    class TriggerDiagnosticGUIDriver extends Driver {
+
+        // FIXME: Hard-coded collection name.
+        private String diagnosticCollectionName = "DiagnosticSnapshot";
+        
+        @Override
+        public void process(EventHeader event) {
+            // Updates are only performed if a diagnostic snapshot object
+            // exists. Otherwise, do nothing.
+            if(event.hasCollection(DiagSnapshot.class, diagnosticCollectionName)) {
+                // Get the snapshot collection.
+                List<DiagSnapshot> snapshotList = event.get(DiagSnapshot.class, diagnosticCollectionName);
+                
+                // Get the snapshot. There will only ever be one.
+                DiagSnapshot snapshot = snapshotList.get(0);
+                
+                // Update the GUI panels.
+                for (DiagnosticUpdatable update : updateList) {
+                    update.updatePanel(snapshot);
+                }
+            } else {
+                getLogger().finest("no trigger diagnostics in event");
+            }
+        }
+        
+        void setDiagnosticCollectionName(String name) {
+            diagnosticCollectionName = name;
+        }
+    }  
+}

Added: java/branches/monitoring-app-HPSJAVA-332/src/main/java/org/hps/monitoring/application/model/ConfigurationListener.java
 =============================================================================
--- java/branches/monitoring-app-HPSJAVA-332/src/main/java/org/hps/monitoring/application/model/ConfigurationListener.java	(added)
+++ java/branches/monitoring-app-HPSJAVA-332/src/main/java/org/hps/monitoring/application/model/ConfigurationListener.java	Fri Mar  6 19:58:22 2015
@@ -0,0 +1,6 @@
+package org.hps.monitoring.application.model;
+
+public interface ConfigurationListener {
+    
+    public void configurationChanged(ConfigurationModel model);
+}

Modified: java/branches/monitoring-app-HPSJAVA-332/src/main/java/org/hps/monitoring/application/model/ConfigurationModel.java
 =============================================================================
--- java/branches/monitoring-app-HPSJAVA-332/src/main/java/org/hps/monitoring/application/model/ConfigurationModel.java	(original)
+++ java/branches/monitoring-app-HPSJAVA-332/src/main/java/org/hps/monitoring/application/model/ConfigurationModel.java	Fri Mar  6 19:58:22 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/monitoring-app-HPSJAVA-332/src/main/resources/org/hps/monitoring/config/default_config.prop
 =============================================================================
--- java/branches/monitoring-app-HPSJAVA-332/src/main/resources/org/hps/monitoring/config/default_config.prop	(original)
+++ java/branches/monitoring-app-HPSJAVA-332/src/main/resources/org/hps/monitoring/config/default_config.prop	Fri Mar  6 19:58:22 2015
@@ -9,7 +9,6 @@
 #LogFileName=
 LogLevel=ALL
 LogLevelFilter=ALL
-LogToFile=false
 MaxEvents=-1
 #SteeringFile=
 SteeringResource=org/hps/steering/monitoring/DummyMonitoring.lcsim
@@ -33,6 +32,4 @@
 StationName=MY_STATION
 Verbose=false
 WaitMode=TIMED
-WaitTime=1000000000
-
-SaveLayout=false;
+WaitTime=1000000000