Print

Print


Author: [log in to unmask]
Date: Fri Mar 13 14:45:30 2015
New Revision: 2434

Log:
Various updates on monitoring dev branch.

Added:
    java/branches/monitoring-app-dev/src/main/java/org/hps/monitoring/application/util/EtEventFilter.java
    java/branches/monitoring-app-dev/src/main/java/org/hps/monitoring/application/util/PhysicsSyncEventStation.java
      - copied, changed from r2425, java/branches/monitoring-app-dev/src/main/java/org/hps/monitoring/application/util/EvioDAQConfigStation.java
    java/branches/monitoring-app-dev/src/main/java/org/hps/monitoring/application/util/PreStartEtStation.java
    java/branches/monitoring-app-dev/src/main/java/org/hps/monitoring/application/util/RunnableEtStation.java
Removed:
    java/branches/monitoring-app-dev/src/main/java/org/hps/monitoring/application/ConditionsCollectionTable.java
    java/branches/monitoring-app-dev/src/main/java/org/hps/monitoring/application/util/EvioDAQConfigStation.java
Modified:
    java/branches/monitoring-app-dev/pom.xml
    java/branches/monitoring-app-dev/src/main/java/org/hps/monitoring/application/ConditionsCollectionTableModel.java
    java/branches/monitoring-app-dev/src/main/java/org/hps/monitoring/application/ConditionsPanel.java
    java/branches/monitoring-app-dev/src/main/java/org/hps/monitoring/application/EventProcessing.java
    java/branches/monitoring-app-dev/src/main/java/org/hps/monitoring/application/MonitoringApplicationFrame.java
    java/branches/monitoring-app-dev/src/main/java/org/hps/monitoring/application/RunPanel.java
    java/branches/monitoring-app-dev/src/main/java/org/hps/monitoring/application/util/MonitoringApplicationEventBuilder.java
    java/branches/monitoring-app-dev/src/main/resources/org/hps/monitoring/config/default_config.prop

Modified: java/branches/monitoring-app-dev/pom.xml
 =============================================================================
--- java/branches/monitoring-app-dev/pom.xml	(original)
+++ java/branches/monitoring-app-dev/pom.xml	Fri Mar 13 14:45:30 2015
@@ -111,6 +111,10 @@
         </dependency>
         <dependency>
             <groupId>org.hps</groupId>
+            <artifactId>hps-ecal-recon</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.hps</groupId>
             <artifactId>hps-monitoring-drivers</artifactId>
         </dependency>       
         <dependency>
@@ -134,6 +138,16 @@
             <groupId>org.freehep</groupId>
             <artifactId>freehep-jaida-remote</artifactId>
             <version>3.4.11</version>
+            <exclusions>
+                <exclusion>
+                    <groupId>org.jdom</groupId>
+                    <artifactId>jdom</artifactId>
+                </exclusion>
+                <exclusion>
+                    <groupId>commons-math</groupId>
+                    <artifactId>commons-math</artifactId>
+                </exclusion>
+            </exclusions>
         </dependency>
     </dependencies>
-</project>
+</project>

Modified: java/branches/monitoring-app-dev/src/main/java/org/hps/monitoring/application/ConditionsCollectionTableModel.java
 =============================================================================
--- java/branches/monitoring-app-dev/src/main/java/org/hps/monitoring/application/ConditionsCollectionTableModel.java	(original)
+++ java/branches/monitoring-app-dev/src/main/java/org/hps/monitoring/application/ConditionsCollectionTableModel.java	Fri Mar 13 14:45:30 2015
@@ -1,6 +1,7 @@
 package org.hps.monitoring.application;
 
 import javax.swing.table.AbstractTableModel;
+import javax.swing.table.TableRowSorter;
 
 import org.hps.conditions.api.ConditionsObject;
 import org.hps.conditions.api.ConditionsObjectCollection;
@@ -18,7 +19,27 @@
     int columnCount;
     int rowCount;
     String[] columnNames;
+    Class<?>[] columnTypes;
     DatabaseConditionsManager manager;
+    
+    /*
+    static class ConditionsCollectionTableRowSorter extends TableRowSorter<ConditionsCollectionTableModel> {
+        
+        ConditionsCollectionTableModel model;
+        
+        ConditionsCollectionTableRowSorter(ConditionsCollectionTableModel model) {
+            this.model = model;
+        }
+        
+        protected boolean useToString(int column) {
+            if (model.getColumnClass(column).equals(String.class)) {
+                return true;
+            } else {
+                return false;
+            }
+        }       
+     }
+     */
 
     ConditionsCollectionTableModel(DatabaseConditionsManager manager, ConditionsObjectCollection<?> collection) {
         
@@ -30,20 +51,27 @@
         TableMetaData tableInfo = manager.findTableMetaData(tableName);
 
         // Set column names and count from table meta data.
-        setupColumns(tableInfo);
+        setupColumns(tableInfo);        
     }
 
     private void setupColumns(TableMetaData tableInfo) {
+
         int fieldNameCount = tableInfo.getFieldNames().length;
         columnCount = fieldNameCount + 1;
+        
+        columnTypes = new Class<?>[columnCount];                
         columnNames = new String[columnCount];
+        
         columnNames[0] = "id";
+        columnTypes[0] = int.class;
+        
         for (int i = 0; i < fieldNameCount; i++) {
-            columnNames[i + 1] = tableInfo.getFieldNames()[i];
-            System.out.println("column " + (i + 1) + " = " + tableInfo.getFieldNames()[i]);
+            String fieldName = tableInfo.getFieldNames()[i];
+            columnNames[i + 1] = fieldName;
+            columnTypes[i + 1] = tableInfo.getFieldType(fieldName);
+            System.out.println("column " + (i + 1) + " = " + tableInfo.getFieldNames()[i] + " with type " + columnTypes[i + 1]);
         }
-
-        System.out.println("column count set to " + columnCount);
+        System.out.println("column count set to " + columnCount);        
     }
 
     @Override
@@ -60,6 +88,20 @@
     public String getColumnName(int columnIndex) {
         return columnNames[columnIndex];
     }
+    
+    @Override
+    public Class<?> getColumnClass(int columnIndex) {
+        Class<?> columnClass = columnTypes[columnIndex];
+        if (columnClass.equals(int.class)) {
+            return Integer.class;
+        } else if (columnClass.equals(float.class)) {
+            return Float.class;
+        } else if (columnClass.equals(double.class)) {
+            return Double.class;
+        } else {
+            return columnClass;
+        }
+    }
 
     @Override
     public Object getValueAt(int rowIndex, int columnIndex) {

Modified: java/branches/monitoring-app-dev/src/main/java/org/hps/monitoring/application/ConditionsPanel.java
 =============================================================================
--- java/branches/monitoring-app-dev/src/main/java/org/hps/monitoring/application/ConditionsPanel.java	(original)
+++ java/branches/monitoring-app-dev/src/main/java/org/hps/monitoring/application/ConditionsPanel.java	Fri Mar 13 14:45:30 2015
@@ -4,7 +4,6 @@
 package org.hps.monitoring.application;
 
 import java.awt.BorderLayout;
-import java.awt.Dimension;
 import java.util.LinkedHashMap;
 import java.util.LinkedHashSet;
 import java.util.Map;
@@ -13,11 +12,14 @@
 import javax.swing.JList;
 import javax.swing.JPanel;
 import javax.swing.JScrollPane;
+import javax.swing.JSplitPane;
 import javax.swing.JTable;
 import javax.swing.ListSelectionModel;
 import javax.swing.event.ListSelectionEvent;
 import javax.swing.event.ListSelectionListener;
 import javax.swing.table.DefaultTableModel;
+import javax.swing.table.TableModel;
+import javax.swing.table.TableRowSorter;
 
 import org.hps.conditions.api.ConditionsObjectCollection;
 import org.hps.conditions.api.ConditionsRecord;
@@ -33,7 +35,7 @@
 public class ConditionsPanel extends JPanel {
     
     JList<String> conditionsList = new JList<String>();
-    JTable conditionsTable = new ConditionsCollectionTable();
+    JTable conditionsTable = new JTable();
     Map<String, ConditionsCollectionTableModel> tableModels;
     
     ConditionsPanel() {
@@ -44,19 +46,20 @@
             @Override
             public void valueChanged(ListSelectionEvent e) {
                 String tableName = (String) conditionsList.getSelectedValue();
-                conditionsTable.setModel(tableModels.get(tableName));
+                TableModel model = tableModels.get(tableName);
+                conditionsTable.setModel(model);
+                conditionsTable.setRowSorter(new TableRowSorter(model));
                 conditionsTable.revalidate();
             }            
         });
         
-        //conditionsList.setPreferredSize(new Dimension(150, 400));                
-        JScrollPane pane = new JScrollPane(conditionsTable);
+        //conditionsTable.setAutoCreateRowSorter(true);
         conditionsTable.setModel(new DefaultTableModel());
-        //conditionsTable.setPreferredSize(new Dimension(400, 400));
-        //pane.setPreferredSize(new Dimension(300, 400));
+               
+        JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, conditionsList, new JScrollPane(conditionsTable));
+        splitPane.setResizeWeight(0.6);
         
-        add(conditionsList, BorderLayout.WEST);
-        add(pane, BorderLayout.EAST);
+        add(splitPane);
     }
     
     class ConditionsPanelListener implements ConditionsListener {

Modified: java/branches/monitoring-app-dev/src/main/java/org/hps/monitoring/application/EventProcessing.java
 =============================================================================
--- java/branches/monitoring-app-dev/src/main/java/org/hps/monitoring/application/EventProcessing.java	(original)
+++ java/branches/monitoring-app-dev/src/main/java/org/hps/monitoring/application/EventProcessing.java	Fri Mar 13 14:45:30 2015
@@ -14,7 +14,8 @@
 import org.hps.monitoring.application.model.ConnectionStatus;
 import org.hps.monitoring.application.model.SteeringType;
 import org.hps.monitoring.application.util.EtSystemUtil;
-import org.hps.monitoring.application.util.EvioDAQConfigStation;
+import org.hps.monitoring.application.util.PhysicsSyncEventStation;
+import org.hps.monitoring.application.util.PreStartEtStation;
 import org.hps.monitoring.subsys.et.EtSystemMonitor;
 import org.hps.monitoring.subsys.et.EtSystemStripCharts;
 import org.hps.record.LCSimEventBuilder;
@@ -25,6 +26,7 @@
 import org.hps.record.enums.DataSourceType;
 import org.hps.record.et.EtConnection;
 import org.hps.record.evio.EvioDetectorConditionsProcessor;
+import org.jlab.coda.et.EtSystem;
 import org.jlab.coda.et.exception.EtClosedException;
 import org.jlab.coda.et.exception.EtException;
 import org.lcsim.conditions.ConditionsListener;
@@ -46,6 +48,7 @@
     List<CompositeRecordProcessor> processors;
     List<Driver> drivers;
     List<ConditionsListener> conditionsListeners;
+    int stationPosition;
 
     /**
      * This class is used to organize the objects for an event processing session.
@@ -56,6 +59,8 @@
         CompositeLoop loop;
         EventProcessingThread processingThread;
         Thread sessionWatchdogThread;
+        Thread configThread;
+        Thread preStartThread;
         EtConnection connection;
     }
 
@@ -65,13 +70,23 @@
      * @param application The current monitoring application.
      * @param processors A list of processors to add after configuration is performed.
      */
-    EventProcessing(MonitoringApplication application, List<CompositeRecordProcessor> processors, List<Driver> drivers, List<ConditionsListener> conditionsListeners) {
+    EventProcessing(
+            MonitoringApplication application, 
+            List<CompositeRecordProcessor> processors, 
+            List<Driver> drivers, 
+            List<ConditionsListener> conditionsListeners) {
         this.application = application;
         this.sessionState = new SessionState();
         this.logger = MonitoringApplication.logger;
         this.processors = processors;
         this.drivers = drivers;
         this.conditionsListeners = conditionsListeners;
+        this.stationPosition = application.configurationModel.getStationPosition();
+    }
+    
+    int getNextStationPosition() {
+        this.stationPosition += 1;
+        return this.stationPosition;        
     }
 
     /**
@@ -419,8 +434,12 @@
                 // Create the main ET system connection.
                 createEtConnection();
 
-                // Add an attachment that listens for DAQ configuration changes.
-                createEvioDAQConfigStation();
+                // Add an attachment that listens for DAQ configuration changes via physics SYNC events.
+                createPhysicsSyncStation();
+                
+                // Add ann attachment that listens for PRESTART events.
+                createPreStartStation();
+                
             } catch (Exception e) {
                 throw new IOException(e);
             }
@@ -459,13 +478,35 @@
     /**
      * Create the ET that listens for DAQ configuration change via SYNC events.
      */
-    void createEvioDAQConfigStation() {
-        logger.fine("starting EVIO DAQ config station ...");
-        EvioDAQConfigStation configStation = new EvioDAQConfigStation(this.sessionState.connection);
-        configStation.setup();
-        Thread configThread = new Thread(configStation);
-        configThread.start();
-        logger.fine("EVIO DAQ config station started");
+    void createPhysicsSyncStation() {
+        logger.fine("creating physics SYNC station ...");       
+        PhysicsSyncEventStation configStation = new PhysicsSyncEventStation(
+                this.sessionState.connection.getEtSystem(),
+                this.sessionState.connection.getEtStation().getName() + "_PhysicsSyncStation",
+                getNextStationPosition());
+        sessionState.configThread = new Thread(configStation);
+        sessionState.configThread.start();
+        logger.fine("physics SYNC station created");
+    }
+    
+    /**
+     * Create the ET station that listens for GO events in order to initialize the conditions system.
+     */
+    void createPreStartStation() {
+        logger.fine("creating PRESTART station ...");
+        String detectorName = this.application.configurationModel.getDetectorName();
+        EtSystem system = this.sessionState.connection.getEtSystem();
+        String stationName = this.sessionState.connection.getEtStation().getName() + "_GoStation";
+        int order = getNextStationPosition();
+        PreStartEtStation preStartStation = new PreStartEtStation(
+                detectorName, 
+                system, 
+                stationName, 
+                order);
+
+        sessionState.preStartThread = new Thread(preStartStation);
+        sessionState.preStartThread.start();
+        logger.fine("PRESTART station created");
     }
 
     /**
@@ -474,15 +515,27 @@
      */
     synchronized void disconnect() {
 
-        logger.fine("disconnecting");
-
+        logger.fine("disconnecting ET system ...");
+        
+        if (sessionState.configThread != null) {
+            if (sessionState.configThread.isAlive()) {
+                sessionState.configThread.interrupt();
+            }
+        }
+        
+        if (sessionState.preStartThread != null) {
+            if (sessionState.preStartThread.isAlive()) {
+                sessionState.preStartThread.interrupt();
+            }
+        }
+        
         // Cleanup the ET connection.
         closeEtConnection();
 
         // Change application state to disconnected.
         application.connectionModel.setConnectionStatus(ConnectionStatus.DISCONNECTED);
 
-        logger.fine("disconnected");
+        logger.fine("ET system disconnected successfully");
     }
 
     /**

Modified: java/branches/monitoring-app-dev/src/main/java/org/hps/monitoring/application/MonitoringApplicationFrame.java
 =============================================================================
--- java/branches/monitoring-app-dev/src/main/java/org/hps/monitoring/application/MonitoringApplicationFrame.java	(original)
+++ java/branches/monitoring-app-dev/src/main/java/org/hps/monitoring/application/MonitoringApplicationFrame.java	Fri Mar 13 14:45:30 2015
@@ -3,11 +3,9 @@
 import java.awt.BorderLayout;
 import java.awt.Dimension;
 import java.awt.FlowLayout;
-import java.awt.GraphicsConfiguration;
+import java.awt.GraphicsEnvironment;
 import java.awt.Rectangle;
 
-import javax.swing.BoxLayout;
-import javax.swing.JComponent;
 import javax.swing.JFrame;
 import javax.swing.JPanel;
 import javax.swing.JScrollPane;
@@ -40,14 +38,10 @@
     DataSourceComboBox dataSourceComboBox;
     
     SettingsDialog settingsDialog;
-    
-    // Proportional layout parameters relative to the screen size.
-    static final double FULL_SIZE = 1.0;
-    static final double TOP_PANEL_HEIGHT = 0.05;
-    static final double BOTTOM_PANEL_HEIGHT = FULL_SIZE - TOP_PANEL_HEIGHT;
-    static final double LEFT_PANEL_WIDTH = 0.3;
-    static final double RIGHT_PANEL_WIDTH = FULL_SIZE - LEFT_PANEL_WIDTH;
-    static final double PLOT_PANEL_HEIGHT = 0.8;
+       
+    static Rectangle bounds = GraphicsEnvironment.getLocalGraphicsEnvironment().getMaximumWindowBounds();
+    static int pixWidthMax = (int) bounds.getWidth();
+    static int pixHeightMax = (int) bounds.getHeight();
     
     /**
      * 
@@ -62,16 +56,15 @@
         // Create the content panel.
         JPanel contentPanel = new JPanel();
         setContentPane(contentPanel);
-        contentPanel.setLayout(new BoxLayout(contentPanel, BoxLayout.Y_AXIS));
+        contentPanel.setLayout(new BorderLayout());
         contentPanel.setOpaque(true);
-        setProportionalSize(contentPanel, FULL_SIZE, FULL_SIZE);
-        
+        contentPanel.setPreferredSize(new Dimension(pixWidthMax, pixHeightMax));
+                
         // Create the top panel.
         JPanel topPanel = new JPanel();
         topPanel.setLayout(new FlowLayout(FlowLayout.LEFT, 20, 0));
-        setProportionalSize(topPanel, FULL_SIZE, TOP_PANEL_HEIGHT);
-        contentPanel.add(topPanel);
-        
+        contentPanel.add(topPanel, BorderLayout.NORTH);
+                
         // Create the connection status panel.
         JPanel connectionPanel = new ConnectionStatusPanel(application.connectionModel);
         topPanel.add(connectionPanel);
@@ -87,7 +80,6 @@
         
         // Add vertical separator.
         sep = new JSeparator(SwingConstants.VERTICAL);
-        sep.setPreferredSize(new Dimension(5, topPanel.getPreferredSize().height));
         topPanel.add(sep);
         
         // Add the data source combo box.
@@ -97,14 +89,12 @@
         // Create the bottom panel.
         JPanel bottomPanel = new JPanel();
         bottomPanel.setLayout(new BorderLayout());
-        setProportionalSize(bottomPanel, FULL_SIZE, BOTTOM_PANEL_HEIGHT);
-        contentPanel.add(bottomPanel);
-                                
+        contentPanel.add(bottomPanel, BorderLayout.CENTER);
+                                        
         // Create the left panel.
         JPanel leftPanel = new JPanel();
         leftPanel.setLayout(new BorderLayout());
-        setProportionalSize(leftPanel, LEFT_PANEL_WIDTH, FULL_SIZE);
-                        
+                            
         // Create the run dashboard.
         runPanel = new RunPanel(application.runModel);
 
@@ -129,7 +119,7 @@
         
         // Vertical split pane in left panel.
         leftSplitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT, runPanel, tableTabbedPane);
-        leftSplitPane.setResizeWeight(0.5);
+        leftSplitPane.setResizeWeight(1.0);
         leftPanel.add(leftSplitPane, BorderLayout.CENTER);
                                 
         // Create the right panel.
@@ -141,55 +131,31 @@
                 
         // Create the plot panel.
         plotPanel = new PlotPanel();
-        plotPanel.setVisible(true); // DEBUG
-        setProportionalSize(plotPanel, RIGHT_PANEL_WIDTH, PLOT_PANEL_HEIGHT);
         
         // 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.8);
+        rightSplitPane.setResizeWeight(0.7);
         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);
+        mainSplitPane.setResizeWeight(0.2);
         bottomPanel.add(mainSplitPane, BorderLayout.CENTER);
         
         // Create the menu bar.
         menu = new MenuBar(application.configurationModel, application.connectionModel, application);
         setJMenuBar(menu);
         dataSourceComboBox.addActionListener(menu);
-                        
+        
+        // Setup the settings dialog box (invisible until activated).
+        settingsDialog = new SettingsDialog(application.configurationModel, application);
+        
         // Setup the frame now that all components have been added.        
         pack();
         setExtendedState(JFrame.MAXIMIZED_BOTH);
-        setVisible(true);
-        
-        // Setup the settings dialog box.
-        settingsDialog = new SettingsDialog(application.configurationModel, application);
+        setVisible(true); 
     }
-    
-    /**
-     * Set the size of a Swing component using proportions of the current screen bounds.
-     * @param component The component to resize.
-     * @param scaleX The X scaling (must be between 0 and 1).
-     * @param scaleY The Y scaling (must be between 0 and 1).
-     * @param setSize Call the setSize method as well as setPreferredSize (which is the default).
-     * @return
-     */
-    void setProportionalSize(JComponent component, double scaleX, double scaleY) {                    
-        GraphicsConfiguration graphics = this.getGraphicsConfiguration();        
-        Rectangle bounds = graphics.getBounds();        
-        if (scaleX < 0 || scaleX > 1) {
-            throw new IllegalArgumentException("scaleX must be > 0 and <= 1.");
-        }
-        if (scaleY < 0 || scaleY > 1) {
-            throw new IllegalArgumentException("scaleY must be > 0 and <= 1.");
-        }
-        Dimension scaledDimension = new Dimension((int)(bounds.getWidth() * scaleX), (int)(bounds.getHeight() * scaleY));
-        component.setPreferredSize(scaledDimension);
-    }           
-    
+             
     /**
      * Restore default window settings.
      */

Modified: java/branches/monitoring-app-dev/src/main/java/org/hps/monitoring/application/RunPanel.java
 =============================================================================
--- java/branches/monitoring-app-dev/src/main/java/org/hps/monitoring/application/RunPanel.java	(original)
+++ java/branches/monitoring-app-dev/src/main/java/org/hps/monitoring/application/RunPanel.java	Fri Mar 13 14:45:30 2015
@@ -1,8 +1,6 @@
 package org.hps.monitoring.application;
 
-import java.awt.Dimension;
-import java.awt.GridBagConstraints;
-import java.awt.GridBagLayout;
+import java.awt.FlowLayout;
 import java.beans.PropertyChangeEvent;
 import java.beans.PropertyChangeListener;
 import java.text.DecimalFormat;
@@ -11,10 +9,7 @@
 import java.util.Timer;
 import java.util.TimerTask;
 
-import javax.swing.BorderFactory;
 import javax.swing.JPanel;
-import javax.swing.border.EtchedBorder;
-import javax.swing.border.TitledBorder;
 
 import org.hps.monitoring.application.model.RunModel;
 import org.hps.record.composite.CompositeRecord;
@@ -58,31 +53,20 @@
     
     private void build() {
         
-        setLayout(new GridBagLayout());
-
-        TitledBorder titledBorder = BorderFactory.createTitledBorder(
-                BorderFactory.createEtchedBorder(EtchedBorder.LOWERED), "Run Summary");
-        setBorder(titledBorder);
-
-        GridBagConstraints c = new GridBagConstraints();
-        c.anchor = GridBagConstraints.WEST;
-        c.gridx = 0;                
-        add(runNumberField, c);
-        add(startDateField, c);
-        add(endDateField, c);
-        add(lengthField, c);
-        add(totalEventsField, c);
-        
-        c = new GridBagConstraints();
-        c.gridx = 1;
-        add(elapsedTimeField, c);
-        add(eventsReceivedField, c);
-        add(dataReceivedField, c);
-        add(eventNumberField, c);
-        add(dataRateField, c);
-        add(eventRateField, c);
-
-        setMinimumSize(new Dimension(400, 240));
+        setLayout(new FlowLayout(FlowLayout.LEADING));
+
+        add(runNumberField);
+        add(startDateField);
+        add(endDateField);
+        add(lengthField);
+        add(totalEventsField);
+        
+        add(elapsedTimeField);
+        add(eventsReceivedField);
+        add(dataReceivedField);
+        add(eventNumberField);
+        add(dataRateField);
+        add(eventRateField);
     }
     
     public void setModel(RunModel runModel) {

Added: java/branches/monitoring-app-dev/src/main/java/org/hps/monitoring/application/util/EtEventFilter.java
 =============================================================================
--- java/branches/monitoring-app-dev/src/main/java/org/hps/monitoring/application/util/EtEventFilter.java	(added)
+++ java/branches/monitoring-app-dev/src/main/java/org/hps/monitoring/application/util/EtEventFilter.java	Fri Mar 13 14:45:30 2015
@@ -0,0 +1,27 @@
+package org.hps.monitoring.application.util;
+
+interface EventTagFilter {
+
+    boolean accept(int eventTag);
+    
+    public static final class AcceptAllFilter implements EventTagFilter {
+        public boolean accept(int eventTag) {
+            // Accept any event type.
+            return true;
+        }
+    }
+    
+    public static final class SyncTagFilter implements EventTagFilter {
+        public boolean accept(int eventTag) {
+            // Physics event with sync information (DAQ config) has bit 6 set.
+            return (((eventTag >> 6) & 1) == 1);
+        }
+    }
+    
+    public static final class PhysicsTagFilter implements EventTagFilter {
+        public boolean accept(int eventTag) {
+            // Physics event always has bit 7 set.
+            return (((eventTag >> 7) & 1) == 1);
+        }
+    }
+}

Modified: java/branches/monitoring-app-dev/src/main/java/org/hps/monitoring/application/util/MonitoringApplicationEventBuilder.java
 =============================================================================
--- java/branches/monitoring-app-dev/src/main/java/org/hps/monitoring/application/util/MonitoringApplicationEventBuilder.java	(original)
+++ java/branches/monitoring-app-dev/src/main/java/org/hps/monitoring/application/util/MonitoringApplicationEventBuilder.java	Fri Mar 13 14:45:30 2015
@@ -12,7 +12,6 @@
 /**
  * Build LCSim events from EVIO data.
  *
- * @author Sho Uemura <[log in to unmask]>
  * @author Jeremy McCormick <[log in to unmask]>
  */
 public class MonitoringApplicationEventBuilder extends LCSimEngRunEventBuilder {

Copied: java/branches/monitoring-app-dev/src/main/java/org/hps/monitoring/application/util/PhysicsSyncEventStation.java (from r2425, java/branches/monitoring-app-dev/src/main/java/org/hps/monitoring/application/util/EvioDAQConfigStation.java)
 =============================================================================
--- java/branches/monitoring-app-dev/src/main/java/org/hps/monitoring/application/util/EvioDAQConfigStation.java	(original)
+++ java/branches/monitoring-app-dev/src/main/java/org/hps/monitoring/application/util/PhysicsSyncEventStation.java	Fri Mar 13 14:45:30 2015
@@ -3,21 +3,19 @@
  */
 package org.hps.monitoring.application.util;
 
+import java.io.IOException;
 import java.util.List;
 
 import org.hps.evio.TriggerConfigEvioReader;
-import org.hps.readout.ecal.daqconfig.ConfigurationManager;
-import org.hps.readout.ecal.daqconfig.EvioDAQParser;
-import org.hps.record.et.EtConnection;
-import org.jlab.coda.et.EtAttachment;
-import org.jlab.coda.et.EtConstants;
+import org.hps.monitoring.application.util.EventTagFilter.SyncTagFilter;
+import org.hps.monitoring.application.util.RunnableEtStation.RunnableEtStationConfiguration;
+import org.hps.recon.ecal.daqconfig.ConfigurationManager;
+import org.hps.recon.ecal.daqconfig.EvioDAQParser;
+import org.hps.record.evio.EvioEventConstants;
 import org.jlab.coda.et.EtEvent;
-import org.jlab.coda.et.EtStation;
-import org.jlab.coda.et.EtStationConfig;
-import org.jlab.coda.et.enums.Mode;
-import org.jlab.coda.et.enums.Modify;
-import org.jlab.coda.jevio.BaseStructure;
+import org.jlab.coda.et.EtSystem;
 import org.jlab.coda.jevio.EvioEvent;
+import org.jlab.coda.jevio.EvioException;
 import org.jlab.coda.jevio.EvioReader;
 import org.lcsim.event.base.BaseLCSimEvent;
 
@@ -28,107 +26,53 @@
  * 
  * @author Jeremy McCormick <[log in to unmask]>
  */
-public class EvioDAQConfigStation implements Runnable {
-    
-    private static final String TRIGGER_CONFIG = "TriggerConfig";
-    EtConnection connection;
-    EtAttachment attachment;
+public class PhysicsSyncEventStation extends RunnableEtStation {
+           
+    private static final String TRIGGER_CONFIG = "TriggerConfig";    
     TriggerConfigEvioReader configReader = new TriggerConfigEvioReader();
-    EventTagFilter filter = new PhysicsTagFilter();
+            
+    public PhysicsSyncEventStation(EtSystem system, String name, int order) {   
+        config = new RunnableEtStationConfiguration();
+        config.order = order;
+        config.name = name;
+        config.prescale = 1;
+        config.readEvents = 100;
+        config.system = system;
+        config.validate();
         
-    public EvioDAQConfigStation(EtConnection connection) {
-        this.connection = connection;
+        filter = new SyncTagFilter();
     }
-    
-    public EvioDAQConfigStation(EtConnection connection, EventTagFilter filter) {
-        this.connection = connection;
-        this.filter = filter;
-    }
-    
-    public void setup() {
-        EtStationConfig stationConfig = new EtStationConfig();
+        
+    public void processEvent(EtEvent event) {
+        int eventTag = event.getControl()[0];
+        System.out.println(this.config.name + " accepted event tag: " + eventTag);
+        EvioEvent evioEvent = null;
         try {
-            stationConfig.setFlowMode(EtConstants.stationSerial);
-            stationConfig.setBlockMode(EtConstants.stationNonBlocking);
-            stationConfig.setPrescale(1);
-      
-            EtStation station = connection.getEtSystem().createStation(
-                stationConfig,
-                connection.getEtStation().getName() + "_EvioDAQConfigStation",
-                connection.getEtSystem().getStationPosition(connection.getEtStation()) + 1);
-            
-            attachment = connection.getEtSystem().attach(station);
-            
-        } catch (Exception e) {
+            System.out.println("parsing EVIO event ...");
+            evioEvent = new EvioReader(event.getDataBuffer()).parseNextEvent();
+        } catch (IOException | EvioException e) {
             throw new RuntimeException(e);
         }
-    }
-    
-    public void run() {
-        for(;;) {
-            try {
-                EtEvent[] events = 
-                    connection.getEtSystem().getEvents(attachment, Mode.SLEEP, Modify.NOTHING, 0, 100);
-                for (EtEvent event : events) {
-                    int eventTag = event.getControl()[0];
-                    if (filter.accept(eventTag)) {
-                        EvioEvent evioEvent = new EvioReader(event.getDataBuffer()).parseNextEvent();     
-                        BaseLCSimEvent lcsimEvent = new BaseLCSimEvent(9999, 9999, "dummy", 0, false);
-                        configReader.getDAQConfig(evioEvent, lcsimEvent);
-                        if (lcsimEvent.hasCollection(EvioDAQParser.class, TRIGGER_CONFIG)) {
-                            List<EvioDAQParser> configList = lcsimEvent.get(EvioDAQParser.class, TRIGGER_CONFIG);
-                            if (!configList.isEmpty()) {
-                                ConfigurationManager.updateConfiguration(configList.get(0));
-                            }
-                            break;
-                        }
-                     }
-                }
-            } catch (Exception e) {
-                e.printStackTrace();
-                break;
-            }
-        }
-        if (connection.getEtSystem().alive()) {
-            disconnect();
-        }
-    }
-    
-    static interface EventTagFilter {
-        boolean accept(int eventTag);
-    }
-    
-    static class SyncTagFilter implements EventTagFilter {
-        public boolean accept(int eventTag) {
-            return (((eventTag >> 6) & 1) == 1);
-        }
-    }
-    
-    static class PhysicsTagFilter implements EventTagFilter {
-        public boolean accept(int eventTag) {
-            return (((eventTag >> 7) & 1) == 1);
-        }
-    }
-    
-    static boolean hasConfigBank(EvioEvent evioEvent) {
-        for (BaseStructure bank : evioEvent.getChildrenList()) {
-            if (bank.getChildCount() <= 0)
-                continue;
-            for (BaseStructure subBank : bank.getChildrenList()) {
-                if (subBank.getHeader().getTag() == EvioDAQParser.BANK_TAG) {
-                    return true;
+        System.out.println("dumping EVIO event ...");
+        System.out.println(evioEvent.toXML());
+        try {
+            System.out.println("done dumping EVIO event");
+            BaseLCSimEvent lcsimEvent = new BaseLCSimEvent(9999, 9999, "dummy", 0, false);
+            System.out.println("reading DAQ config ...");
+            configReader.getDAQConfig(evioEvent, lcsimEvent);
+            System.out.println("DAQ config read okay!");
+            if (lcsimEvent.hasCollection(EvioDAQParser.class, TRIGGER_CONFIG)) {
+                System.out.println("found config in dummy lcsim event");
+                List<EvioDAQParser> configList = lcsimEvent.get(EvioDAQParser.class, TRIGGER_CONFIG);
+                if (!configList.isEmpty()) {
+                    System.out.println("updating config in ConfigurationManager ...");
+                    ConfigurationManager.updateConfiguration(configList.get(0));
+                    System.out.println("config updated in manager!");
                 }
             }
-        }
-        return false;
-    }
-    
-    public void disconnect() {        
-        try {
-            connection.getEtSystem().wakeUpAttachment(attachment);
-            connection.getEtSystem().detach(attachment);
         } catch (Exception e) {
+            System.err.println("Failed to load DAQ config from sync event ...");
             e.printStackTrace();
         }
-    }        
+    }       
 }

Added: java/branches/monitoring-app-dev/src/main/java/org/hps/monitoring/application/util/PreStartEtStation.java
 =============================================================================
--- java/branches/monitoring-app-dev/src/main/java/org/hps/monitoring/application/util/PreStartEtStation.java	(added)
+++ java/branches/monitoring-app-dev/src/main/java/org/hps/monitoring/application/util/PreStartEtStation.java	Fri Mar 13 14:45:30 2015
@@ -0,0 +1,47 @@
+package org.hps.monitoring.application.util;
+
+import java.io.IOException;
+
+import org.hps.record.evio.EvioDetectorConditionsProcessor;
+import org.hps.record.evio.EvioEventConstants;
+import org.jlab.coda.et.EtEvent;
+import org.jlab.coda.et.EtSystem;
+import org.jlab.coda.jevio.EvioEvent;
+import org.jlab.coda.jevio.EvioException;
+import org.jlab.coda.jevio.EvioReader;
+
+/**
+ * @author Jeremy McCormick <[log in to unmask]>
+ */
+public class PreStartEtStation extends RunnableEtStation {
+
+    EvioDetectorConditionsProcessor processor;
+
+    public PreStartEtStation(String detectorName, EtSystem system, String name, int order) {
+
+        if (detectorName == null) {
+            throw new IllegalArgumentException("detectorName is null");
+        }
+
+        config = new RunnableEtStationConfiguration();
+        config.eventType = EvioEventConstants.GO_EVENT_TAG;
+        config.order = order;
+        config.name = name;
+        config.prescale = 1;
+        config.readEvents = 1;
+        config.system = system;
+        config.validate();
+
+        processor = new EvioDetectorConditionsProcessor(detectorName);
+    }
+
+    public void processEvent(EtEvent event) {
+        EvioEvent evioEvent = null;
+        try {
+            evioEvent = new EvioReader(event.getDataBuffer()).parseNextEvent();
+            processor.startRun(evioEvent);
+        } catch (IOException | EvioException e) {
+            throw new RuntimeException(e);
+        }
+    }
+}

Added: java/branches/monitoring-app-dev/src/main/java/org/hps/monitoring/application/util/RunnableEtStation.java
 =============================================================================
--- java/branches/monitoring-app-dev/src/main/java/org/hps/monitoring/application/util/RunnableEtStation.java	(added)
+++ java/branches/monitoring-app-dev/src/main/java/org/hps/monitoring/application/util/RunnableEtStation.java	Fri Mar 13 14:45:30 2015
@@ -0,0 +1,147 @@
+/**
+ * 
+ */
+package org.hps.monitoring.application.util;
+
+import java.io.IOException;
+import java.util.Arrays;
+
+import org.hps.monitoring.application.util.EventTagFilter.AcceptAllFilter;
+import org.jlab.coda.et.EtAttachment;
+import org.jlab.coda.et.EtConstants;
+import org.jlab.coda.et.EtEvent;
+import org.jlab.coda.et.EtStation;
+import org.jlab.coda.et.EtStationConfig;
+import org.jlab.coda.et.EtSystem;
+import org.jlab.coda.et.enums.Mode;
+import org.jlab.coda.et.enums.Modify;
+import org.jlab.coda.et.exception.EtClosedException;
+import org.jlab.coda.et.exception.EtDeadException;
+import org.jlab.coda.et.exception.EtException;
+
+/**
+ * This is an implementation of Runnable that wraps an ET station.
+ * It should be run on its own thread.
+ * @author Jeremy McCormick <[log in to unmask]
+ */
+public abstract class RunnableEtStation implements Runnable {
+    
+    protected EtSystem system;
+    protected EtStation station;
+    protected EtAttachment attachment;
+    protected boolean disconnect = false;    
+    protected RunnableEtStationConfiguration config;
+    protected EventTagFilter filter = new AcceptAllFilter();
+    
+    public static final class RunnableEtStationConfiguration {
+        
+        public EtSystem system;
+        public String name;
+        public int order = 1;
+        public int prescale = 1;
+        public int readEvents = 100;
+        public Integer eventType;
+        
+        void validate() {
+            if (system == null) {
+                throw new IllegalArgumentException("system is null");
+            }
+            if (name == null) {
+                throw new IllegalArgumentException("name is null");
+            }
+            if (order <= 0) {
+                throw new IllegalArgumentException("order must be > 0");
+            }
+            if (prescale <= 0) {
+                throw new IllegalArgumentException("prescale must be > 0");
+            }
+        }
+    }
+
+    protected RunnableEtStation() {
+    }
+
+    public RunnableEtStation(RunnableEtStationConfiguration config) {
+        if (config == null) {
+            throw new IllegalArgumentException("config is null");
+        }
+        config.validate();
+        this.config = config;
+    }
+
+    public void run() {
+        
+        setup();
+        
+        try {
+            for (;;) {
+                // Get the next array of events from the server.
+                EtEvent[] events = system.getEvents(
+                        attachment, Mode.SLEEP, Modify.NOTHING, 0, config.readEvents);
+                
+                // Process the events.
+                for (EtEvent event : events) {
+                    // Process an event if it passes the filter (by default accepts all).
+                    if (filter.accept(event.getControl()[0])) {
+                        processEvent(event);
+                    }
+                }
+                
+                // Disconnect if flag is set (by sub-class changing disconnect value).
+                if (disconnect) {
+                    break;
+                }
+            }
+        } catch (Exception e) {
+            System.err.println("Error running " + this.config.name + " ...");
+            e.printStackTrace();
+        } finally {
+            if (system.alive()) {
+                System.out.println(this.config.name + " is disconnecting ...");
+                disconnect();
+                System.out.println("disconnected " + this.config.name);
+            }
+        }
+    }
+
+    public abstract void processEvent(EtEvent event); 
+        
+    protected void setup() {
+        try {
+            // Create the basic station config.
+            EtStationConfig stationConfig = new EtStationConfig();
+            stationConfig.setFlowMode(EtConstants.stationSerial);
+            stationConfig.setBlockMode(EtConstants.stationNonBlocking);
+            stationConfig.setPrescale(config.prescale);
+
+            // Setup event selection.
+            if (config.eventType != null) {
+                int[] select = new int[EtConstants.stationSelectInts];
+                Arrays.fill(select, -1);
+                select[0] = config.eventType;
+                stationConfig.setSelect(select);
+            }
+
+            // Create station and attach to the ET system.
+            EtStation station = system.createStation(stationConfig, config.name, config.order);
+            attachment = system.attach(station);
+
+        } catch (Exception e) {
+            // Any errors during setup are rethrown.
+            throw new RuntimeException(e);
+        }
+    }
+
+    public synchronized void disconnect() {
+        if (system.alive()) {
+            if (attachment.isUsable()) {
+                try {
+                    system.wakeUpAll(station);
+                    system.detach(attachment);
+                } catch (IOException | EtException | EtClosedException | EtDeadException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+    }
+}

Modified: java/branches/monitoring-app-dev/src/main/resources/org/hps/monitoring/config/default_config.prop
 =============================================================================
--- java/branches/monitoring-app-dev/src/main/resources/org/hps/monitoring/config/default_config.prop	(original)
+++ java/branches/monitoring-app-dev/src/main/resources/org/hps/monitoring/config/default_config.prop	Fri Mar 13 14:45:30 2015
@@ -29,8 +29,7 @@
 Host=localhost
 Port=11111
 StationPosition=1
-# Prescale was 1
-Prescale=0
+Prescale=1
 QueueSize=0
 StationName=MY_STATION
 Verbose=false