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
|