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