Author: [log in to unmask] Date: Mon Mar 16 13:03:30 2015 New Revision: 2465 Log: Add support for multiple series in strip charts and other updates. Not in its final form yet. Added: java/trunk/monitoring-util/src/main/java/org/hps/monitoring/plotting/ValueProvider.java Modified: java/trunk/monitoring-util/src/main/java/org/hps/monitoring/plotting/MonitoringPlotFactory.java java/trunk/monitoring-util/src/main/java/org/hps/monitoring/plotting/StripChartBuilder.java java/trunk/monitoring-util/src/main/java/org/hps/monitoring/plotting/StripChartUpdater.java java/trunk/monitoring-util/src/main/java/org/hps/monitoring/subsys/SystemStatistics.java java/trunk/monitoring-util/src/main/java/org/hps/monitoring/subsys/SystemStatisticsImpl.java java/trunk/monitoring-util/src/main/java/org/hps/monitoring/subsys/ecal/EcalStripChartTestDriver.java java/trunk/monitoring-util/src/main/java/org/hps/monitoring/subsys/et/EtSystemStripCharts.java Modified: java/trunk/monitoring-util/src/main/java/org/hps/monitoring/plotting/MonitoringPlotFactory.java ============================================================================= --- java/trunk/monitoring-util/src/main/java/org/hps/monitoring/plotting/MonitoringPlotFactory.java (original) +++ java/trunk/monitoring-util/src/main/java/org/hps/monitoring/plotting/MonitoringPlotFactory.java Mon Mar 16 13:03:30 2015 @@ -13,6 +13,7 @@ import org.jfree.chart.ChartPanel; import org.jfree.chart.JFreeChart; +import org.jfree.data.time.RegularTimePeriod; /** * This class implements an AIDA <code>IPlotterFactory</code> for the monitoring application. It @@ -23,6 +24,7 @@ */ public class MonitoringPlotFactory extends PlotterFactory { + // Global plotter registry. static PlotterRegistry plotters = new PlotterRegistry(); // The name of the factory which will be used in naming tabs in the monitoring app. @@ -34,16 +36,22 @@ // Root pane where this factory's top-level tab will be inserted. private static JTabbedPane rootPane = null; + // The region listener for handling mouse clicks in a region. private static PlotterRegionListener regionListener; + // The current tab index. int tabIndex; + /** + * Set the plot region listener. + * @param regionListener The plot region listener. + */ public static void setPlotterRegionListener(PlotterRegionListener regionListener) { MonitoringPlotFactory.regionListener = regionListener; } /** - * Class constructor. + * Class constructor for unnamed factory. */ MonitoringPlotFactory() { super(); @@ -54,7 +62,7 @@ } /** - * Class constructor. + * Class constructor for named factory. * @param name The name of the factory. */ MonitoringPlotFactory(String name) { @@ -66,6 +74,10 @@ addPlotterRegionListener(regionListener); } + /** + * Setup the root GUI pane of this factory for display of plots in tabs. + * @param name The tab's label. + */ private void setupRootPane(String name) { // FIXME: Hack to disregard call from an AIDA related class. if (!(new RuntimeException()).getStackTrace()[2].getClassName().equals("hep.aida.ref.plotter.style.registry.StyleStoreXMLReader")) { @@ -102,6 +114,11 @@ MonitoringPlotFactory.rootPane = rootPane; } + /** + * Setup a plotter tab. + * @param plotterName The name of the plotter. + * @param plotter The IPlotter which will plot into the tab. + */ private void setupPlotterTab(String plotterName, IPlotter plotter) { // Setup the plotter's GUI pane and tab. @@ -115,29 +132,72 @@ plotters.register(plotter, tabIndex, plotterIndex); } + /** + * Add a <code>JFreeChart</code> to one of the tabs. + * @param chart The JFreeChart object to add. + */ private void addChart(JFreeChart chart) { ChartPanel panel = new ChartPanel(chart); tabs.addTab(chart.getTitle().getText(), panel); tabs.setTabComponentAt(tabs.getTabCount() - 1, new JLabel(chart.getTitle().getText())); } - - /** - * Create a strip chart using a JFreeChart implementation. It will be automatically updated from - * a {@link StripChartUpdater}. Similar to AIDA plots, the chart will be given a sub-tab in the - * tab of this factory. - * - * @param title The title of the chart. - * @param yAxisLabel The y axis label. - * @param size The buffer size of the series which determines how much data displays. - * @param updater The updater which will update the chart in real time. - * @return The modified <tt>StripChartUpdater</tt> which points to the new chart. - */ - public StripChartUpdater createStripChart(String title, String yAxisLabel, int size, StripChartUpdater updater) { - JFreeChart stripChart = StripChartBuilder.createDynamicTimeSeriesChart(title, yAxisLabel, size); - stripChart.getLegend().setVisible(false); /* Legend turned off for now. */ - addChart(stripChart); - updater.setChart(stripChart); + + /** + * This creates a strip chart with full parameter settings, which will automatically + * update at a certain time interval. + * @param name The title of the chart. + * @param rangeLabel The range axis label text. + * @param seriesCount The number of series in the data set. + * @param seriesNames The names of the series (if non-null the length must match seriesCount). + * @param itemCount The maximum number of items in the series. + * @param timeBase The time unit for updates. + * @param valueProvider The interface for providing the series values. + * @param rangeView The view in the domain axis around the current data point (applied to plus and minus). + * @return The StripChartUpdater for the chart. + */ + public StripChartUpdater createStripChart( + String name, + String rangeLabel, + int seriesCount, + String[] seriesNames, + int itemCount, + RegularTimePeriod timeBase, + ValueProvider valueProvider, + long rangeView) { + StripChartUpdater updater = StripChartBuilder.createStripChart( + name, + rangeLabel, + seriesCount, + seriesNames, + itemCount, + timeBase, + valueProvider, + rangeView); + addChart(updater.getChart()); return updater; + } + + /** + * Create a strip chart with simple parameter settings. + * @param name The title of the strip chart. + * @param seriesCount The number of series in the data set. + * @param timeBase The time interval for updating. + * @param valueProvider The interface for providing values. + * @return The StripChartUpdater for the chart. + */ + public StripChartUpdater createStripChart( + String name, + int seriesCount, + RegularTimePeriod timeBase, + ValueProvider valueProvider) { + return createStripChart( + name, "Values", + seriesCount, + null, + 9999, + timeBase, + valueProvider, + 10000L); } /** @@ -157,8 +217,8 @@ } /** - * - * @return + * Get the global registry of plotters. + * @return The global plotter registry. */ public static PlotterRegistry getPlotterRegistry() { return plotters; Modified: java/trunk/monitoring-util/src/main/java/org/hps/monitoring/plotting/StripChartBuilder.java ============================================================================= --- java/trunk/monitoring-util/src/main/java/org/hps/monitoring/plotting/StripChartBuilder.java (original) +++ java/trunk/monitoring-util/src/main/java/org/hps/monitoring/plotting/StripChartBuilder.java Mon Mar 16 13:03:30 2015 @@ -1,45 +1,91 @@ package org.hps.monitoring.plotting; - -import java.util.Date; import org.jfree.chart.ChartFactory; import org.jfree.chart.JFreeChart; import org.jfree.chart.axis.NumberAxis; import org.jfree.chart.plot.XYPlot; import org.jfree.data.time.DynamicTimeSeriesCollection; +import org.jfree.data.time.RegularTimePeriod; import org.jfree.data.time.Second; import org.jfree.data.time.TimeSeries; import org.jfree.data.time.TimeSeriesCollection; /** - * Utility methods for building strip charts using JFreeChart backend. + * Utility methods for building strip charts using JFreeChart back end. */ public final class StripChartBuilder { private StripChartBuilder() { } + + /** + * Create a strip chart with simple parameter settings. + * @param name The title of the strip chart. + * @param seriesCount The number of series in the data set. + * @param timeBase The time interval for updating. + * @param valueProvider The interface for providing values. + * @return The StripChartUpdater for the chart. + */ + static StripChartUpdater createStripChart( + String name, + int seriesCount, + RegularTimePeriod timeBase, + ValueProvider valueProvider) { + return createStripChart(name, "Values", seriesCount, null, 9999, timeBase, valueProvider, 10000L); + } + + /** + * This creates a strip chart with full parameter settings, which will automatically + * update at a certain time interval. + * @param name The title of the chart. + * @param rangeLabel The range axis label text. + * @param seriesCount The number of series in the data set. + * @param seriesNames The names of the series (if non-null the length must match seriesCount). + * @param itemCount The maximum number of items in the series. + * @param timeBase The time unit for updates. + * @param valueProvider The interface for providing the series values. + * @param rangeView The view in the domain axis around the current data point (milliseconds). + * @return The StripChartUpdater for the chart. + */ + static StripChartUpdater createStripChart( + String name, + String rangeLabel, + int seriesCount, + String[] seriesNames, + int itemCount, + RegularTimePeriod timeBase, + ValueProvider valueProvider, + long rangeView) { + + if (seriesNames != null && seriesCount != seriesNames.length) { + throw new IllegalArgumentException("seriesNames is wrong length"); + } + final DynamicTimeSeriesCollection dataset = new DynamicTimeSeriesCollection(seriesCount, itemCount, timeBase); + dataset.setTimeBase(timeBase); + for (int series = 0; series < seriesCount; series++) { + String seriesName = name + " " + series; + if (seriesNames != null) { + seriesName = seriesNames[series]; + } + dataset.addSeries(new float[] {}, series, seriesName); + } + + final JFreeChart chart = ChartFactory.createTimeSeriesChart(name, "hh:mm:ss", rangeLabel, dataset, false, false, false); + + chart.getXYPlot().getRangeAxis().setAutoRange(true); - /** - * This creates a strip chart that will be updated at fixed intervals from a timer. - * @param title - * @param yAxisLabel - * @param size - * @return - */ - public static JFreeChart createDynamicTimeSeriesChart(String title, String yAxisLabel, int size) { - final DynamicTimeSeriesCollection dataset = new DynamicTimeSeriesCollection(1, size, new Second()); - dataset.setTimeBase(new Second(new Date())); - dataset.addSeries(new float[] {}, 0, "Default Dataset"); - - final JFreeChart result = ChartFactory.createTimeSeriesChart(title, "hh:mm:ss", yAxisLabel, dataset, true, true, false); - final XYPlot plot = result.getXYPlot(); - plot.getDomainAxis().setAutoRange(true); - NumberAxis rangeAxis = (NumberAxis) plot.getRangeAxis(); - rangeAxis.setAutoRange(true); - rangeAxis.setAutoRangeIncludesZero(true); - return result; + StripChartUpdater updater = new StripChartUpdater( + chart, + valueProvider, + rangeView, + timeBase + ); + + updater.start(); + + return updater; } - + /** * This should be used when the time period for updating is variable. * @@ -47,13 +93,18 @@ * * <code>sensorSeries.add(new Minute(new Date()), newData);</code> * - * @param title - * @param yAxisLabel - * @param maxAge - * @param maxCount - * @return + * @param title The title of the chart. + * @param yAxisLabel The range axis label. + * @param maxAge The maximum age of an item. + * @param maxCount The maximum count of items in the single data set series. + * @return The chart that was created. */ - public static JFreeChart createTimeSeriesChart(String title, String yAxisLabel, int maxAge, int maxCount, int rangeSize) { + public static JFreeChart createTimeSeriesChart( + String title, + String yAxisLabel, + int maxAge, + int maxCount, + int rangeSize) { TimeSeriesCollection dataset = new TimeSeriesCollection(); TimeSeries timeSeries = new TimeSeries("Default Dataset"); @@ -61,7 +112,14 @@ timeSeries.setMaximumItemCount(maxCount); dataset.addSeries(timeSeries); - final JFreeChart result = ChartFactory.createTimeSeriesChart(title, "hh:mm:ss", yAxisLabel, dataset, true, true, false); + final JFreeChart result = ChartFactory.createTimeSeriesChart( + title, + "hh:mm:ss", + yAxisLabel, + dataset, + true, + false, + false); final XYPlot plot = result.getXYPlot(); plot.getDomainAxis().setAutoRange(true); plot.getDomainAxis().setAutoRangeMinimumSize(rangeSize); @@ -69,6 +127,63 @@ rangeAxis.setAutoRange(true); rangeAxis.setAutoRangeIncludesZero(true); return result; - } + } + + /** + * <p> + * This can be used to create a strip chart with multiple <code>TimeSeries</code> + * in the data set. + * <p> + * To update a chart of this type, use the following types of method calls: + * <pre> + * dataset.getSeries(0).add(new Second(time), value1); + * dataset.getSeries(1).add(new Second(time), value2); + * </pre> + * <p> + * It is not updated manually but will refresh will values are added to the backing dataset. + * + * @param title The title of the chart. + * @param yAxisLabel The range axis label. + * @param seriesCount The number of series in the dataset. + * @param datasetNames The names of the datasets (can be null to use defaults). + * @param rangeSize The range of values to show for auto-ranging in domain axis (in milliseconds). + * @return The chart that was created. + */ + public static JFreeChart createTimeSeriesChart( + String title, + String yAxisLabel, + int seriesCount, + String[] datasetNames, + double rangeSize) { + TimeSeriesCollection dataset = new TimeSeriesCollection(); + for (int i = 0; i < seriesCount; i++) { + String datasetName = "Dataset " + i; + if (datasetNames != null) { + datasetName = datasetNames[i]; + } + TimeSeries timeSeries = new TimeSeries(datasetName); + dataset.addSeries(timeSeries); + } + + final JFreeChart result = ChartFactory.createTimeSeriesChart( + title, + "hh:mm:ss", + yAxisLabel, + dataset, + true, + false, + false); + final XYPlot plot = result.getXYPlot(); + plot.getDomainAxis().setAutoRange(true); + + NumberAxis rangeAxis = (NumberAxis) plot.getRangeAxis(); + rangeAxis.setAutoRange(true); + rangeAxis.setAutoRangeIncludesZero(true); + + plot.getDomainAxis().setAutoRange(true); + plot.getDomainAxis().setAutoRangeMinimumSize(rangeSize); + + return result; + } } Modified: java/trunk/monitoring-util/src/main/java/org/hps/monitoring/plotting/StripChartUpdater.java ============================================================================= --- java/trunk/monitoring-util/src/main/java/org/hps/monitoring/plotting/StripChartUpdater.java (original) +++ java/trunk/monitoring-util/src/main/java/org/hps/monitoring/plotting/StripChartUpdater.java Mon Mar 16 13:03:30 2015 @@ -1,38 +1,67 @@ package org.hps.monitoring.plotting; +import java.util.Date; import java.util.Timer; import java.util.TimerTask; import org.jfree.chart.JFreeChart; +import org.jfree.chart.axis.DateAxis; import org.jfree.data.time.DynamicTimeSeriesCollection; +import org.jfree.data.time.RegularTimePeriod; /** * An abstract <tt>TimerTask</tt> to update a strip chart at a regular interval. */ -public abstract class StripChartUpdater extends TimerTask { +public class StripChartUpdater { + + final JFreeChart chart; + final DateAxis domainAxis; + final DynamicTimeSeriesCollection dataset; + final Timer timer; + final TimerTask task; + final Long rangeMillis; + final ValueProvider valueProvider; + long updateInterval; + + StripChartUpdater(JFreeChart chart, ValueProvider valueProvider, Long rangeMillis, RegularTimePeriod timeBase) { + this.chart = chart; + this.domainAxis = (DateAxis) chart.getXYPlot().getDomainAxis(); + this.dataset = (DynamicTimeSeriesCollection) chart.getXYPlot().getDataset(); + this.rangeMillis = rangeMillis; + this.updateInterval = timeBase.getLastMillisecond() - timeBase.getFirstMillisecond(); + this.valueProvider = valueProvider; + timer = new Timer(chart.getTitle().getText() + " Timer"); + task = new TimerTask() { + + @Override + public void run() { + StripChartUpdater.this.chart.setNotify(false); + + dataset.advanceTime(); + long time = dataset.getNewestTime().getEnd().getTime(); + + float values[] = StripChartUpdater.this.valueProvider.getValues(); + dataset.appendData(values); + + domainAxis.setRange( + new Date(time - StripChartUpdater.this.rangeMillis), + new Date(time + updateInterval)); - DynamicTimeSeriesCollection dataset; - long updateIntervalMillis = 1000; - - public StripChartUpdater() { + StripChartUpdater.this.chart.setNotify(true); + StripChartUpdater.this.chart.fireChartChanged(); + } + }; } - - public void setChart(JFreeChart chart) { - this.dataset = (DynamicTimeSeriesCollection) chart.getXYPlot().getDataset(); + + JFreeChart getChart() { + return chart; } - - public void setUpdateIntervalMillis(long updateIntervalMillis) { - this.updateIntervalMillis = updateIntervalMillis; + + void start() { + timer.scheduleAtFixedRate(task, 0, updateInterval); + } + + public void stop() { + timer.cancel(); } - - public void run() { - dataset.advanceTime(); - dataset.appendData(new float[] { nextValue() }); - } - - public void schedule(Timer timer) { - timer.schedule(this, 0, updateIntervalMillis); - } - - public abstract float nextValue(); } Added: java/trunk/monitoring-util/src/main/java/org/hps/monitoring/plotting/ValueProvider.java ============================================================================= --- java/trunk/monitoring-util/src/main/java/org/hps/monitoring/plotting/ValueProvider.java (added) +++ java/trunk/monitoring-util/src/main/java/org/hps/monitoring/plotting/ValueProvider.java Mon Mar 16 13:03:30 2015 @@ -0,0 +1,14 @@ +package org.hps.monitoring.plotting; + +/** + * Simple interface for providing values to charts (e.g. strip charts) by series. + * @author Jeremy McCormick <[log in to unmask]> + */ +public interface ValueProvider { + + /** + * Get an array of float values to fill in the data set series. + * @return The array of data set values, ordered by ascending series number. + */ + float[] getValues(); +} Modified: java/trunk/monitoring-util/src/main/java/org/hps/monitoring/subsys/SystemStatistics.java ============================================================================= --- java/trunk/monitoring-util/src/main/java/org/hps/monitoring/subsys/SystemStatistics.java (original) +++ java/trunk/monitoring-util/src/main/java/org/hps/monitoring/subsys/SystemStatistics.java Mon Mar 16 13:03:30 2015 @@ -1,7 +1,6 @@ package org.hps.monitoring.subsys; import java.io.PrintStream; -import java.util.TimerTask; /** * This is an interface for a set of basic statistics about an online event processing system. @@ -129,5 +128,5 @@ * Add subtask which will execute right before a new tick. * @param subtask The subtask to execute. */ - void addSubTask(TimerTask subtask); + //void addSubTask(TimerTask subtask); } Modified: java/trunk/monitoring-util/src/main/java/org/hps/monitoring/subsys/SystemStatisticsImpl.java ============================================================================= --- java/trunk/monitoring-util/src/main/java/org/hps/monitoring/subsys/SystemStatisticsImpl.java (original) +++ java/trunk/monitoring-util/src/main/java/org/hps/monitoring/subsys/SystemStatisticsImpl.java Mon Mar 16 13:03:30 2015 @@ -2,22 +2,18 @@ import java.io.PrintStream; import java.text.DecimalFormat; -import java.util.ArrayList; -import java.util.List; import java.util.Timer; import java.util.TimerTask; -import org.hps.monitoring.plotting.StripChartUpdater; +import org.hps.monitoring.plotting.ValueProvider; /** * Implementation of {@link SystemStatistics}. */ -// FIXME: Rolling averages need to happen over a greater time period like 30 seconds -// instead of 1 second, because otherwise the statistics don't look right. public class SystemStatisticsImpl implements SystemStatistics { - long tickLengthMillis = 1000; // default is one second tick - long sessionElapsedMillis; + long tickLengthMillis = 1000; // default is 1 second tick + long totalElapsedMillis; long startTimeMillis; long stopTimeMillis; long eventsSinceTick; @@ -25,14 +21,12 @@ long totalEvents; long totalBytes; long tickStartMillis; - long tickElapsedMillis; static final long Kb = 1 * 1024; static final long Mb = Kb * 1024; static final double milliToSecond = 0.001; static final DecimalFormat decimalFormat = new DecimalFormat("#.####"); Timer timer; - List<TimerTask> subtasks = new ArrayList<TimerTask>(); - + @Override public void update(int size) { addEvent(); @@ -52,7 +46,7 @@ @Override public long getTotalElapsedMillis() { - return sessionElapsedMillis; + return totalElapsedMillis; } @Override @@ -67,7 +61,7 @@ @Override public long getTickElapsedMillis() { - return tickElapsedMillis; + return System.currentTimeMillis() - tickStartMillis; } /** @@ -86,10 +80,11 @@ @Override public double getEventsPerSecond() { - if (eventsSinceTick > 0 && tickElapsedMillis > 0) - return (double) eventsSinceTick / millisToSeconds(tickElapsedMillis); - else + if (eventsSinceTick > 0 && getTickElapsedMillis() > 0) { + return (double) eventsSinceTick / millisToSeconds(getTickElapsedMillis()); + } else { return 0.; + } } @Override @@ -126,8 +121,8 @@ @Override public double getBytesPerSecond() { - if (bytesSinceTick > 0 && tickElapsedMillis > 0) - return (double) bytesSinceTick / millisToSeconds(tickElapsedMillis); + if (bytesSinceTick > 0 && getTickElapsedMillis() > 0) + return (double) bytesSinceTick / millisToSeconds(getTickElapsedMillis()); else return 0.; } @@ -135,20 +130,14 @@ @Override public void start() { - // Set time variables. + // Set session start time variables. long currentTimeMillis = System.currentTimeMillis(); startTimeMillis = currentTimeMillis; tickStartMillis = currentTimeMillis; - // Start Timer task which executes at tick length. + // Start timer task which executes at the nominal tick length to calculate statistics periodically. TimerTask task = new TimerTask() { public void run() { - - // Run sub-tasks. - for (TimerTask subtask : subtasks) { - subtask.run(); - } - nextTick(); } }; @@ -185,12 +174,7 @@ ps.println(" eventsSinceTick = " + this.getEventsReceived()); ps.println(" bytesSinceTick = " + this.getBytesReceived()); } - - @Override - public void addSubTask(TimerTask subtask) { - this.subtasks.add(subtask); - } - + void addEvent() { eventsSinceTick += 1; totalEvents += 1; @@ -202,8 +186,7 @@ } void updateElapsedTime() { - tickElapsedMillis = System.currentTimeMillis() - tickStartMillis; - sessionElapsedMillis = System.currentTimeMillis() - startTimeMillis; + totalElapsedMillis = System.currentTimeMillis() - startTimeMillis; } // Bytes to megabytes to 2 decimal places. @@ -218,82 +201,76 @@ synchronized void nextTick() { eventsSinceTick = 0; bytesSinceTick = 0; - tickElapsedMillis = 0; tickStartMillis = System.currentTimeMillis(); } - public abstract class SystemStatisticsUpdater extends StripChartUpdater { - SystemStatisticsUpdater() { - addSubTask(this); - } - } - - public class AverageEventsPerSecondUpdater extends SystemStatisticsUpdater { - - @Override - public float nextValue() { - return (float) getAverageEventsPerSecond(); - } - } - - public class EventsPerSecondUpdater extends SystemStatisticsUpdater { - - @Override - public float nextValue() { - return (float) getEventsPerSecond(); + public abstract class SystemStatisticsProvider implements ValueProvider { + } + + public class AverageEventsPerSecondProvider extends SystemStatisticsProvider { + + @Override + public float[] getValues() { + return new float[] {(float) getAverageEventsPerSecond()}; + } + } + + public class EventsPerSecondProvider extends SystemStatisticsProvider { + + @Override + public float[] getValues() { + return new float[] {(float) getEventsPerSecond()}; } } - public class EventsReceivedUpdater extends SystemStatisticsUpdater { - - @Override - public float nextValue() { - return getEventsReceived(); - } - } - - public class TotalEventsUpdater extends SystemStatisticsUpdater { - @Override - public float nextValue() { - return getTotalEvents(); - } - } - - public class BytesReceivedUpdater extends SystemStatisticsUpdater { - @Override - public float nextValue() { - return getBytesReceived(); - } - } - - public class AverageMegabytesPerSecondUpdater extends SystemStatisticsUpdater { - @Override - public float nextValue() { - return (float) getAverageMegabytesPerSecond(); - } - } - - public class TotalMegabytesUpdater extends SystemStatisticsUpdater { - @Override - public float nextValue() { - return (float) getTotalMegabytes(); - } - } - - public class BytesPerSecondUpdater extends SystemStatisticsUpdater { - - @Override - public float nextValue() { - return (float) getBytesPerSecond(); - } - } - - public class MegabytesPerSecondUpdater extends SystemStatisticsUpdater { - @Override - public float nextValue() { - return (float) getBytesPerSecond() / 1000000; - } - } - - -} + public class EventsReceivedProvider extends SystemStatisticsProvider { + + @Override + public float[] getValues() { + return new float[] {getEventsReceived()}; + } + } + + public class TotalEventsProvider extends SystemStatisticsProvider { + @Override + public float[] getValues() { + return new float[] {getTotalEvents()}; + } + } + + public class BytesReceivedProvider extends SystemStatisticsProvider { + @Override + public float[] getValues() { + return new float[]{getBytesReceived()}; + } + } + + public class AverageMegabytesPerSecondProvider extends SystemStatisticsProvider { + @Override + public float[] getValues() { + return new float[] {(float) getAverageMegabytesPerSecond()}; + } + } + + public class TotalMegabytesProvider extends SystemStatisticsProvider { + @Override + public float[] getValues() { + return new float[] {(float) getTotalMegabytes()}; + } + } + + public class BytesPerSecondProvider extends SystemStatisticsProvider { + + @Override + public float[] getValues() { + return new float[] {(float) getBytesPerSecond()}; + } + } + + public class MegabytesPerSecondProvider extends SystemStatisticsProvider { + @Override + public float[] getValues() { + return new float[] {(float) getBytesPerSecond() / 1000000}; + } + } +} Modified: java/trunk/monitoring-util/src/main/java/org/hps/monitoring/subsys/ecal/EcalStripChartTestDriver.java ============================================================================= --- java/trunk/monitoring-util/src/main/java/org/hps/monitoring/subsys/ecal/EcalStripChartTestDriver.java (original) +++ java/trunk/monitoring-util/src/main/java/org/hps/monitoring/subsys/ecal/EcalStripChartTestDriver.java Mon Mar 16 13:03:30 2015 @@ -1,13 +1,9 @@ package org.hps.monitoring.subsys.ecal; -import java.util.Date; -import java.util.TimerTask; - import org.hps.monitoring.plotting.MonitoringPlotFactory; -import org.hps.monitoring.plotting.StripChartUtil; -import org.jfree.chart.JFreeChart; -import org.jfree.data.time.Millisecond; -import org.jfree.data.time.TimeSeries; +import org.hps.monitoring.plotting.StripChartUpdater; +import org.hps.monitoring.plotting.ValueProvider; +import org.jfree.data.time.Second; import org.lcsim.event.EventHeader; import org.lcsim.event.RawCalorimeterHit; import org.lcsim.util.Driver; @@ -21,22 +17,27 @@ int eventInterval = 1000; static String collectionName = "EcalReadoutHits"; - MonitoringPlotFactory plotFactory = (MonitoringPlotFactory) AIDA.defaultInstance().analysisFactory().createPlotterFactory("ECAL System Monitoring"); - TimeSeries series; - JFreeChart stripChart; - TimerTask updateTask; + MonitoringPlotFactory plotFactory = + (MonitoringPlotFactory) AIDA.defaultInstance().analysisFactory().createPlotterFactory("ECAL System Monitoring"); + EventHeader currentEvent; int hits; + int events; - + double averageHits; + + StripChartUpdater updater; + public void startOfData() { - stripChart = plotFactory.createStripChart("Average ECAL Hits per " + eventInterval + " Events", "Hits", 99999999, /* - * max - * age - */ - 1000, /* max count */ - 100000 /* range size */); - series = StripChartUtil.getTimeSeries(stripChart); + plotFactory.createStripChart( + "Average ECAL Hits per " + eventInterval + " Events", + "Hits", + 1, + new String[] { "Date" }, + 1, + new Second(), + new AverageHitsProvider(), + 20000L); } public void process(EventHeader event) { @@ -44,10 +45,19 @@ ++events; hits += size; if (event.getEventNumber() % eventInterval == 0) { - double averageHits = (double) hits / (double) events; - series.add(new Millisecond(new Date()), averageHits); + averageHits = (double) hits / (double) events; hits = 0; events = 0; } } + + public void endOfData() { + updater.stop(); + } + + class AverageHitsProvider implements ValueProvider { + public float[] getValues() { + return new float[] {(float) averageHits}; + } + } } Modified: java/trunk/monitoring-util/src/main/java/org/hps/monitoring/subsys/et/EtSystemStripCharts.java ============================================================================= --- java/trunk/monitoring-util/src/main/java/org/hps/monitoring/subsys/et/EtSystemStripCharts.java (original) +++ java/trunk/monitoring-util/src/main/java/org/hps/monitoring/subsys/et/EtSystemStripCharts.java Mon Mar 16 13:03:30 2015 @@ -1,8 +1,13 @@ package org.hps.monitoring.subsys.et; +import java.util.ArrayList; +import java.util.List; + import org.hps.monitoring.plotting.MonitoringPlotFactory; +import org.hps.monitoring.plotting.StripChartUpdater; import org.hps.monitoring.subsys.SystemStatisticsImpl; import org.hps.record.et.EtEventProcessor; +import org.jfree.data.time.Second; import org.jlab.coda.et.EtEvent; import org.lcsim.util.aida.AIDA; @@ -13,21 +18,68 @@ SystemStatisticsImpl stats = new SystemStatisticsImpl(); MonitoringPlotFactory plotFactory = (MonitoringPlotFactory) AIDA.defaultInstance().analysisFactory().createPlotterFactory("ET System Monitoring"); - + List<StripChartUpdater> updaters = new ArrayList<StripChartUpdater>(); + public EtSystemStripCharts() { - stats.setTickLengthMillis(2000); + stats.setTickLengthMillis(1000); } /** * Setup the strip charts for ET system monitoring and start accumulating statistics. */ @Override - public void startJob() { - plotFactory.createStripChart("Data Rate", "MB / second", 100, stats.new MegabytesPerSecondUpdater()); - plotFactory.createStripChart("Total Data", "Megabytes", 100, stats.new TotalMegabytesUpdater()); - plotFactory.createStripChart("Event Rate", "Events / second", 100, stats.new EventsPerSecondUpdater()); - plotFactory.createStripChart("Total Events", "Number of Events", 100, stats.new TotalEventsUpdater()); + public void startJob() { + + // Create the ET system strip charts. + createStripCharts(); + + // Start systems statistics task. stats.start(); + } + + /** + * + */ + private void createStripCharts() { + updaters.add(plotFactory.createStripChart( + "Data Rate", + "MB / second", + 1, + new String[] { "Data" }, + 999, + new Second(), + stats.new MegabytesPerSecondProvider(), + 200000L)); + + updaters.add(plotFactory.createStripChart( + "Total Data", + "Megabytes", + 1, + new String[] { "Data" }, + 999, + new Second(), + stats.new TotalMegabytesProvider(), + 200000L)); + + updaters.add(plotFactory.createStripChart( + "Event Rate", + "Events / s", + 1, + new String[] { "Data" }, + 999, + new Second(), + stats.new EventsPerSecondProvider(), + 200000L)); + + updaters.add(plotFactory.createStripChart( + "Total Events", + "Number of Events", + 1, + new String[] { "Data" }, + 999, + new Second(), + stats.new TotalEventsProvider(), + 200000L)); } @Override @@ -35,8 +87,14 @@ stats.update(event.getLength()); } - @Override public void endJob() { + + // Stop the strip chart updaters. + for (StripChartUpdater updater : updaters) { + updater.stop(); + } + + // Stop system statistics task. stats.stop(); } }