Print

Print


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