Commit in hps-java/src/main/java/org/lcsim/hps/evio on MAIN
EvioConsumer.java+256-321.6 -> 1.7
add mini gui for controlling ET plots

hps-java/src/main/java/org/lcsim/hps/evio
EvioConsumer.java 1.6 -> 1.7
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
CVSspam 0.2.12


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