Commit in hps-java/src/main/java/org/lcsim/hps/evio on MAIN | |||
EvioConsumer.java | +256 | -32 | 1.6 -> 1.7 |
add mini gui for controlling ET plots
diff -u -r1.6 -r1.7 --- EvioConsumer.java 16 Mar 2012 21:34:18 -0000 1.6 +++ EvioConsumer.java 17 Mar 2012 02:16:24 -0000 1.7 @@ -1,11 +1,18 @@
package org.lcsim.hps.evio; import hep.aida.IAnalysisFactory;
+import hep.aida.IBaseHistogram;
import hep.aida.ICloud1D; import hep.aida.IHistogram1D;
+import hep.aida.IManagedObject;
import hep.aida.IPlotter; import hep.aida.IPlotterStyle;
+import hep.aida.ITree;
+import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.io.File; +import java.io.IOException;
import java.io.InputStream; import java.nio.ByteBuffer; import java.util.ArrayList;
@@ -13,6 +20,11 @@
import java.util.List; import java.util.Map;
+import javax.swing.JButton; +import javax.swing.JFileChooser; +import javax.swing.JFrame; +import javax.swing.JPanel; +
import org.freehep.record.loop.event.RecordSuppliedEvent; import org.jlab.coda.et.EtAttachment; import org.jlab.coda.et.EtConstants;
@@ -60,11 +72,16 @@
private static final String trackCollectionName = "MatchedTracks"; private static final String trackerHitCollectionName = "StripClusterer_SiTrackerHitStrip1D"; private static final String lcsimXml = "/org/lcsim/hps/steering/EtTest.lcsim";
+ private static final boolean debug = false; + private static Detector detector; + static Map<SiSensor,int[]> occupancyMap; + static IPlotter occuPlot; + + private static List<IPlotter> plotters = new ArrayList<IPlotter>();
public EvioConsumer() { }
-
private static void usage() { System.out.println("\nUsage: java Consumer -f <et name> -host <ET host> -s <station name> [-h] [-v] [-nb]\n" + " [-p <ET server port>] [-c <chunk size>] [-q <queue size>]\n" +
@@ -83,9 +100,95 @@
" This consumer works by making a direct connection\n" + " to the ET system's tcp server port.\n"); }
- - - private static final boolean debug = false;
+ + static void clearAidaTree() { + ITree tree = AIDA.defaultInstance().tree(); + String names[] = tree.listObjectNames("/", true); + for (String name : names) { + IManagedObject o = tree.find(name); + if (o instanceof IBaseHistogram) { + ((IBaseHistogram) o).reset(); + } + } + } + + static void setupPlots() { + + AIDA aida = AIDA.defaultInstance(); + aida.tree().cd("/"); + IHistogram1D adcValuePlot = aida.histogram1D("ADC Value", 500, 0, 500); + ICloud1D eventRatePlot = aida.cloud1D("Event Rate [Hz]"); + IHistogram1D rawHitCountPlot = aida.histogram1D("Number of RawTrackerHits in Event", 100, 0, 100); + IHistogram1D tkrHitCountPlot = aida.histogram1D("Number of TrackerHits in Event", 50, 0, 50); + IHistogram1D tkrCountPlot = aida.histogram1D("Number of Tracks in Event", 20, 0, 20); + ICloud1D hitsPerTrackPlot = aida.cloud1D("Number of Hits per Track"); + IHistogram1D tkrMomXPlot = aida.histogram1D("Track Px", 200, 0, 2.0); + IHistogram1D tkrMomYPlot = aida.histogram1D("Track Py", 160, -0.2, 0.2); + IHistogram1D tkrMomZPlot = aida.histogram1D("Track Pz", 160, -0.2, 0.2); + IHistogram1D tkrMomPlot = aida.histogram1D("Track P", 200, 0, 4.0); + ICloud1D timePlot = aida.cloud1D("Time [ns]"); + ICloud1D badEventPlot = aida.cloud1D("Bad Event Count"); + + IAnalysisFactory fac = aida.analysisFactory(); + IPlotter plotter = fac.createPlotterFactory().create("HPS SVT Plots"); + plotters.add(plotter); + plotter.style().dataStyle().errorBarStyle().setVisible(false); + plotter.createRegions(4,4); + plotter.region(0).plot(adcValuePlot); + plotter.region(1).plot(eventRatePlot); + plotter.region(2).plot(rawHitCountPlot); + plotter.region(3).plot(tkrHitCountPlot); + plotter.region(4).plot(tkrCountPlot); + plotter.region(5).plot(hitsPerTrackPlot); + plotter.region(6).plot(tkrMomXPlot); + plotter.region(7).plot(tkrMomYPlot); + plotter.region(8).plot(tkrMomZPlot); + plotter.region(9).plot(tkrMomPlot); + plotter.region(10).plot(timePlot); + plotter.region(11).plot(badEventPlot); + plotter.show(); + + // Make a list of sensors in the SVT. + List<SiSensor> sensors = detector.getSubdetector("Tracker").getDetectorElement().findDescendants(SiSensor.class); + + // Setup occupancy plots. + IPlotter plotter2 = fac.createPlotterFactory().create("HPS SVT Sensor Occupancy Plots"); + plotters.add(plotter2); + IPlotterStyle style = plotter2.style(); + style.dataStyle().fillStyle().setColor("yellow"); + style.dataStyle().errorBarStyle().setVisible(false); + plotter2.createRegions(5, 4); + int ns = sensors.size(); + for (int i=0; i<ns; i++) { + IHistogram1D occupancyPlot = aida.histogram1D(sensors.get(i).getName(), 640, 0, 639); + plotter2.region(i).plot(occupancyPlot); + } + plotter2.show(); + + // Data structure for occupancy calculations by sensor. + occupancyMap = new HashMap<SiSensor,int[]>(); + for (SiSensor sensor : sensors) { + occupancyMap.put(sensor, new int[640]); + } + + // Normalized occupancy plots are only setup the first time, not after a call to "reset" from the GUI. + if (occuPlot == null) { + IPlotter plotter3 = fac.createPlotterFactory().create("HPS SVT Normalized Sensor Occupancy Plots"); + occuPlot = plotter3; + IPlotterStyle style3 = plotter3.style(); + style3.dataStyle().fillStyle().setColor("green"); + style3.dataStyle().markerStyle().setColor("green"); + style3.dataStyle().errorBarStyle().setVisible(false); + style3.statisticsBoxStyle().setVisible(false); + plotter3.createRegions(5, 4); + for (int i=0; i<ns; i++) { + IHistogram1D occupancyPlot = aida.histogram1D(sensors.get(i).getName() + " Normalized", 640, 0, 639); + plotter3.region(i).plot(occupancyPlot); + } + plotter3.show(); + } + } +
public static void main(String[] args) { int position = 1, pposition = 0, qSize = 0, chunk = 1; boolean blocking = true, verbose = false;
@@ -249,12 +352,19 @@
// Create a dummy event in order to get Detector conditions. BaseLCSimEvent dummyEvent = new BaseLCSimEvent(0, 0, detectorName); Detector detector = dummyEvent.getDetector();
+ EvioConsumer.detector = detector; + + // Setup all the plots for the job. + setupPlots();
+ // The default AIDA instance. + AIDA aida = AIDA.defaultInstance(); +
// Data plots.
+ /*
AIDA aida = AIDA.defaultInstance();
- //
aida.tree().cd("/");
- IHistogram1D adcValuePlot = aida.histogram1D("ADC Value", 500, 0, 1000);
+ IHistogram1D adcValuePlot = aida.histogram1D("ADC Value", 500, 0, 500);
ICloud1D eventRatePlot = aida.cloud1D("Event Rate [Hz]"); IHistogram1D rawHitCountPlot = aida.histogram1D("Number of RawTrackerHits in Event", 100, 0, 100); IHistogram1D tkrHitCountPlot = aida.histogram1D("Number of TrackerHits in Event", 50, 0, 50);
@@ -263,12 +373,12 @@
IHistogram1D tkrMomXPlot = aida.histogram1D("Track Px", 200, 0, 2.0); IHistogram1D tkrMomYPlot = aida.histogram1D("Track Py", 160, -0.2, 0.2); IHistogram1D tkrMomZPlot = aida.histogram1D("Track Pz", 160, -0.2, 0.2);
- IHistogram1D tkrMomPlot = aida.histogram1D("Track P", 200, 0, 10.0);
+ IHistogram1D tkrMomPlot = aida.histogram1D("Track P", 200, 0, 4.0);
ICloud1D timePlot = aida.cloud1D("Time [ns]"); ICloud1D badEventPlot = aida.cloud1D("Bad Event Count");
- IAnalysisFactory fac = aida.analysisFactory();
IPlotter plotter = fac.createPlotterFactory().create("HPS SVT Plots");
+ plotters.add(plotter);
plotter.style().dataStyle().errorBarStyle().setVisible(false); plotter.createRegions(4,4); plotter.region(0).plot(adcValuePlot);
@@ -291,6 +401,7 @@
// Setup occupancy plots. IPlotter plotter2 = fac.createPlotterFactory().create("HPS SVT Sensor Occupancy Plots");
+ plotters.add(plotter2);
IPlotterStyle style = plotter2.style(); style.dataStyle().fillStyle().setColor("yellow"); style.dataStyle().errorBarStyle().setVisible(false);
@@ -300,16 +411,23 @@
IHistogram1D occupancyPlot = aida.histogram1D(sensors.get(i).getName(), 640, 0, 639); plotter2.region(i).plot(occupancyPlot); }
- plotter2.show();
+ plotter2.show();
+ */
+
+ // Make a list of sensors in the SVT.
+ //List<SiSensor> sensors = detector.getSubdetector("Tracker").getDetectorElement().findDescendants(SiSensor.class);
+ //int ns = sensors.size();
// Data structure for occupancy calculations by sensor.
- Map<SiSensor,int[]> occupancyMap = new HashMap<SiSensor,int[]>(); - for (SiSensor sensor : sensors) { - occupancyMap.put(sensor, new int[640]); - }
+ //Map<SiSensor,int[]> occupancyMap = new HashMap<SiSensor,int[]>(); + //for (SiSensor sensor : sensors) { + // occupancyMap.put(sensor, new int[640]); + //}
// Setup normalized occupancy plots.
+ /*
IPlotter plotter3 = fac.createPlotterFactory().create("HPS SVT Normalized Sensor Occupancy Plots");
+ //plotters.add(plotter3);
IPlotterStyle style3 = plotter3.style(); style3.dataStyle().fillStyle().setColor("green"); style3.dataStyle().markerStyle().setColor("green");
@@ -321,6 +439,10 @@
plotter3.region(i).plot(occupancyPlot); } plotter3.show();
+ */ + + // Show GUI. + EvioConsumerGui.main(new String[]{});
// Number of current event from 0. int eventCount = 0;
@@ -351,7 +473,12 @@
driverAdapter.finish(null); // Save AIDA plots.
- AIDA.defaultInstance().saveAs("EtTestPlots.aida");
+ try { + aida.saveAs("EtTestPlots.aida"); + } catch (java.lang.NoClassDefFoundError e) { + System.out.println("AIDA doesn't appear to be setup correctly to save output files!"); + e.printStackTrace(); + }
// Exit after user pressed enter. System.out.println("Press ENTER to exit ...");
@@ -380,8 +507,8 @@
} // Something bad happened and event was not built. Just skip it. if (evioEvent == null) {
- System.out.println("Failed to build EVIO event. Skipping this EtEvent!"); - badEventPlot.fill(0);
+ System.out.println("Failed to build EVIO event <" + eventCount + ">. Skipping this EtEvent!"); + aida.cloud1D("Bad Event Count").fill(0);
continue; }
@@ -402,16 +529,17 @@
driverAdapter.recordSupplied(loopEvent); // Fill RawTrackerHit count.
- rawHitCountPlot.fill(hits.size());
+ aida.histogram1D("Number of RawTrackerHits in Event").fill(hits.size());
// Loop over RawTrackerHit collection. for (RawTrackerHit hit : hits) { // Fill ADC value plot.
- adcValuePlot.fill(hit.getADCValues()[0]);
+ //adcValuePlot.fill(hit.getADCValues()[0]);
+ aida.histogram1D("ADC Value").fill(hit.getADCValues()[0]);
// Fill time plot.
- timePlot.fill(hit.getTime());
+ aida.cloud1D("Time [ns]").fill(hit.getTime());
// Fill basic (non-normalized) occupancy plot. aida.histogram1D(hit.getDetectorElement().getName()).fill(hit.getIdentifierFieldValue("strip"));
@@ -422,7 +550,7 @@
} // Normalized occupancy plots.
- plotter3.clearRegions();
+ occuPlot.clearRegions();
int si = 0; for (SiSensor sensor : occupancyMap.keySet()) { int[] strips = occupancyMap.get(sensor);
@@ -433,28 +561,30 @@
aida.histogram1D(sensor.getName() + " Normalized").fill(i, stripOccupancy); } }
- plotter3.region(si).plot(aida.histogram1D(sensor.getName() + " Normalized"));
+ occuPlot.region(si).plot(aida.histogram1D(sensor.getName() + " Normalized"));
++si; }
- plotter3.show();
+ occuPlot.show();
- // Number of Tracks.
+ // Get Tracks from event.
List<Track> tracks = lcsimEvent.get(Track.class, trackCollectionName);
- tkrCountPlot.fill(tracks.size());
+ + // Plot number of Tracks. + aida.histogram1D("Number of Tracks in Event").fill(tracks.size());
// Track plots. for (Track track : tracks) {
- hitsPerTrackPlot.fill(track.getTrackerHits().size()); - tkrMomXPlot.fill(track.getPX()); - tkrMomYPlot.fill(track.getPY()); - tkrMomZPlot.fill(track.getPZ());
+ aida.cloud1D("Number of Hits per Track").fill(track.getTrackerHits().size()); + aida.histogram1D("Track Px").fill(track.getPX()); + aida.histogram1D("Track Py").fill(track.getPY()); + aida.histogram1D("Track Pz").fill(track.getPZ());
double[] p = track.getMomentum();
- tkrMomPlot.fill(Math.sqrt(p[0]*p[0]+p[1]*p[1]+p[2]*p[2]));
+ aida.histogram1D("Track P").fill(Math.sqrt(p[0]*p[0]+p[1]*p[1]+p[2]*p[2]));
} // Number of TrackerHits. List<TrackerHit> trackerHits = lcsimEvent.get(TrackerHit.class, trackerHitCollectionName);
- tkrHitCountPlot.fill(trackerHits.size());
+ aida.histogram1D("Number of TrackerHits in Event").fill(trackerHits.size());
// put events back into ET system // FIXME Is this even necessary when running in read-only mode?
@@ -470,11 +600,11 @@
//System.out.println("instantaneous event rate = " + eventRate + " hz"); // Fill event rate plot.
- eventRatePlot.fill(eventRate);
+ aida.cloud1D("Event Rate [Hz]").fill(eventRate);
// Increment event count. ++eventCount;
-
+
if (debug) System.out.println("----------------------"); }
@@ -545,4 +675,98 @@
} return hits; }
+ + public static class EvioConsumerGui extends JPanel implements ActionListener { + + JButton resetButton; + JButton saveButton; + JButton quitButton; + + EvioConsumerGui() { + + resetButton = new JButton("Reset"); + resetButton.setActionCommand("reset"); + resetButton.addActionListener(this); + resetButton.setToolTipText("Reset the plots."); + add(resetButton); + + saveButton = new JButton("Save Plots"); + saveButton.setActionCommand("save"); + saveButton.addActionListener(this); + saveButton.setToolTipText("Save the plots to an AIDA file."); + add(saveButton); + + quitButton = new JButton("Quit"); + quitButton.setActionCommand("quit"); + quitButton.addActionListener(this); + quitButton.setToolTipText("Quit the job."); + add(quitButton); + } + + public static void createAndShow() { + JFrame frame = new JFrame("Consumer GUI"); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + + EvioConsumerGui gui = new EvioConsumerGui(); + gui.setOpaque(true); + frame.setContentPane(gui); + + frame.pack(); + frame.setVisible(true); + } + + public void actionPerformed(ActionEvent e) { + String cmd = e.getActionCommand(); + if ("reset".equals(cmd)) { + reset(); + } + else if ("save".equals(cmd)) { + save(); + } + else if ("quit".equals(cmd)) { + quit(); + } + } + + private void reset() { + + for (IPlotter plotter : plotters) { + plotter.hide(); + plotter.clearRegions(); + } + plotters.clear(); + + clearAidaTree(); + setupPlots(); + } + + private void save() { + JFileChooser fc = new JFileChooser(); + int r = fc.showSaveDialog(EvioConsumerGui.this); + if (r == JFileChooser.APPROVE_OPTION) { + File fileName = fc.getSelectedFile(); + try { + AIDA.defaultInstance().saveAs(fileName); + } + catch (IOException e) { + e.printStackTrace(); + } + } + else { + System.out.println("Save operation was cancelled."); + } + } + + private void quit() { + System.exit(0); + } + + public static void main(String[] args) { + javax.swing.SwingUtilities.invokeLater(new Runnable() { + public void run() { + createAndShow(); + } + }); + } + }
}
\ No newline at end of file
Use REPLY-ALL to reply to list
To unsubscribe from the LCD-CVS list, click the following link:
https://listserv.slac.stanford.edu/cgi-bin/wa?SUBED1=LCD-CVS&A=1