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);