hps-java/src/main/java/org/lcsim/hps/evio
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