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