Author: [log in to unmask]
Date: Fri Jan 23 18:43:22 2015
New Revision: 1986
Log:
Add data rate monitoring to run panel. HPSJAVA-332
Modified:
java/trunk/monitoring-app/src/main/java/org/hps/monitoring/gui/RunPanel.java
java/trunk/monitoring-app/src/main/java/org/hps/monitoring/gui/model/RunModel.java
Modified: java/trunk/monitoring-app/src/main/java/org/hps/monitoring/gui/RunPanel.java
=============================================================================
--- java/trunk/monitoring-app/src/main/java/org/hps/monitoring/gui/RunPanel.java (original)
+++ java/trunk/monitoring-app/src/main/java/org/hps/monitoring/gui/RunPanel.java Fri Jan 23 18:43:22 2015
@@ -1,14 +1,6 @@
package org.hps.monitoring.gui;
-import static org.hps.monitoring.gui.model.RunModel.DATA_RECEIVED_PROPERTY;
-import static org.hps.monitoring.gui.model.RunModel.ELAPSED_TIME_PROPERTY;
-import static org.hps.monitoring.gui.model.RunModel.END_DATE_PROPERTY;
-import static org.hps.monitoring.gui.model.RunModel.EVENTS_RECEIVED_PROPERTY;
-import static org.hps.monitoring.gui.model.RunModel.EVENT_NUMBER_PROPERTY;
-import static org.hps.monitoring.gui.model.RunModel.RUN_LENGTH_PROPERTY;
-import static org.hps.monitoring.gui.model.RunModel.RUN_NUMBER_PROPERTY;
-import static org.hps.monitoring.gui.model.RunModel.START_DATE_PROPERTY;
-import static org.hps.monitoring.gui.model.RunModel.TOTAL_EVENTS_PROPERTY;
+import static org.hps.monitoring.gui.model.RunModel.*;
import java.awt.Dimension;
import java.awt.FlowLayout;
@@ -49,6 +41,7 @@
FieldPanel eventsReceivedField = new FieldPanel("Events Received", "", 14, false);
FieldPanel dataReceivedField = new FieldPanel("Data Received [bytes]", "", 14, false);
FieldPanel eventNumberField = new FieldPanel("Event Number", "", 14, false);
+ FieldPanel dataRateField = new FieldPanel("Data Rate [mb/s]", "", 12, false);
Timer timer;
long jobStartMillis;
@@ -73,8 +66,9 @@
add(eventsReceivedField);
add(dataReceivedField);
add(eventNumberField);
-
- this.setMinimumSize(new Dimension(0, 190));
+ add(dataRateField);
+
+ this.setMinimumSize(new Dimension(0, 240));
}
void startJobTimer() {
@@ -91,7 +85,6 @@
void stopRunTimer() {
timer.cancel();
- timer.purge();
}
class RunModelUpdater extends CompositeRecordProcessor {
@@ -104,6 +97,8 @@
@Override
public void process(CompositeRecord event) {
+ // FIXME: This should not update every event. It overloads the EDT.
+ // Listeners can be enabled/disabled based on an event interval.
model.incrementEventsReceived();
EvioEvent evioEvent = event.getEvioEvent();
if (event.getEtEvent() != null && event.getEvioEvent() == null) {
@@ -153,6 +148,49 @@
@Override
public void endJob() {
RunPanel.this.stopRunTimer();
+ }
+ }
+
+ /**
+ * Update the data rate field at about once per second based on how
+ * many bytes were received by the processor in that interval.
+ * The actual number of milliseconds between updates is not computed,
+ * so this might be slightly inaccurate.
+ */
+ class DataRateUpdater extends CompositeRecordProcessor {
+
+ double bytesReceived = 0;
+ Timer dataRateTimer;
+
+ @Override
+ public void startJob() {
+ // Start the timer to execute data rate calculation about once per second.
+ dataRateTimer = new Timer("DataRateTimer");
+ TimerTask dataRateTask = new TimerTask() {
+ public void run() {
+ double megaBytesReceived = bytesReceived / 1000000;
+ model.setDataRate(megaBytesReceived);
+ bytesReceived = 0;
+ }
+ };
+ dataRateTimer.scheduleAtFixedRate(dataRateTask, 0, 1000);
+ }
+
+ @Override
+ public void process(CompositeRecord event) {
+ if (event.getEtEvent() != null && event.getEvioEvent() == null) {
+ // Use ET events for length.
+ bytesReceived += event.getEtEvent().getData().length;
+ } else if (event.getEvioEvent() != null) {
+ // Use EVIO events for length.
+ bytesReceived += event.getEvioEvent().getTotalBytes();
+ }
+ // FIXME: If there is an LCIO source only, it is not easy to get the data length in bytes!
+ }
+
+ public void endJob() {
+ // Kill the timer.
+ dataRateTimer.cancel();
}
}
@@ -186,6 +224,8 @@
this.dataReceivedField.setValue((Long) value);
} else if (EVENT_NUMBER_PROPERTY.equals(evt.getPropertyName())) {
this.eventNumberField.setValue((Integer) value);
+ } else if (DATA_RATE_PROPERTY.equals(evt.getPropertyName())) {
+ this.dataRateField.setValue((Double) value);
}
}
}
Modified: java/trunk/monitoring-app/src/main/java/org/hps/monitoring/gui/model/RunModel.java
=============================================================================
--- java/trunk/monitoring-app/src/main/java/org/hps/monitoring/gui/model/RunModel.java (original)
+++ java/trunk/monitoring-app/src/main/java/org/hps/monitoring/gui/model/RunModel.java Fri Jan 23 18:43:22 2015
@@ -12,15 +12,23 @@
public final static String END_DATE_PROPERTY = "EndDate";
public final static String RUN_LENGTH_PROPERTY = "RunLength"; // set at end, in seconds
public final static String TOTAL_EVENTS_PROPERTY = "TotalEvents"; // only set at end
- public final static String EVENTS_RECEIVED_PROPERTY = "EventsReceived"; // events received so
- // far
- public final static String ELAPSED_TIME_PROPERTY = "ElapsedTime"; // updated on the fly, in
- // seconds
- public final static String DATA_RECEIVED_PROPERTY = "DataReceived"; // updated on the fly, in
- // bytes
+ public final static String EVENTS_RECEIVED_PROPERTY = "EventsReceived"; // events received so far
+ public final static String ELAPSED_TIME_PROPERTY = "ElapsedTime"; // updated on the fly, in seconds
+ public final static String DATA_RECEIVED_PROPERTY = "DataReceived"; // updated on the fly, in bytes
public final static String EVENT_NUMBER_PROPERTY = "EventNumber"; // current event number
+ public final static String DATA_RATE_PROPERTY = "DataRate"; // data rate in megabytes per second
- static final String[] properties = new String[] { RUN_NUMBER_PROPERTY, START_DATE_PROPERTY, END_DATE_PROPERTY, RUN_LENGTH_PROPERTY, TOTAL_EVENTS_PROPERTY, ELAPSED_TIME_PROPERTY, DATA_RECEIVED_PROPERTY, EVENT_NUMBER_PROPERTY };
+ static final String[] properties = new String[] {
+ RUN_NUMBER_PROPERTY,
+ START_DATE_PROPERTY,
+ END_DATE_PROPERTY,
+ RUN_LENGTH_PROPERTY,
+ TOTAL_EVENTS_PROPERTY,
+ ELAPSED_TIME_PROPERTY,
+ DATA_RECEIVED_PROPERTY,
+ EVENT_NUMBER_PROPERTY,
+ DATA_RATE_PROPERTY
+ };
int runNumber;
Date startDate;
@@ -31,6 +39,7 @@
int elapsedTime;
long dataReceived;
int eventNumber;
+ double dataRate;
public String[] getPropertyNames() {
return properties;
@@ -137,6 +146,16 @@
this.eventNumber = eventNumber;
this.firePropertyChange(EVENT_NUMBER_PROPERTY, oldValue, this.eventNumber);
}
+
+ public void setDataRate(double dataRate) {
+ double oldValue = this.dataRate;
+ this.dataRate = dataRate;
+ this.firePropertyChange(DATA_RATE_PROPERTY, oldValue, this.dataRate);
+ }
+
+ public double getDataRate() {
+ return dataRate;
+ }
public void reset() {
setDataReceived(0);
|