hps-java/src/main/java/org/lcsim/hps/monitoring
diff -N MonitoringPlotsDriver.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ MonitoringPlotsDriver.java 22 Mar 2012 07:11:02 -0000 1.1
@@ -0,0 +1,255 @@
+package org.lcsim.hps.monitoring;
+
+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.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.lcsim.detector.tracker.silicon.SiSensor;
+import org.lcsim.event.EventHeader;
+import org.lcsim.event.RawCalorimeterHit;
+import org.lcsim.event.RawTrackerHit;
+import org.lcsim.event.Track;
+import org.lcsim.event.TrackerHit;
+import org.lcsim.geometry.Detector;
+import org.lcsim.util.Driver;
+import org.lcsim.util.aida.AIDA;
+
+// TODO Add Histogram2D of ECal cells. Can plot as color map.
+public class MonitoringPlotsDriver extends Driver {
+
+ private Map<SiSensor,int[]> occupancyMap;
+ private IPlotter occuPlot;
+ private List<IPlotter> plotters = new ArrayList<IPlotter>();
+ private AIDA aida = AIDA.defaultInstance();
+ private String rawTrackerHitCollectionName = "RawTrackerHitMaker_RawTrackerHits";
+ private String rawCalorimeterHitCollectionName = "EcalRawHits";
+ private String trackerHitCollectionName = "StripClusterer_SiTrackerHitStrip1D";
+ private String trackerName = "Tracker";
+ private int eventCount;
+ private Detector detector = null;
+
+ IHistogram1D adcValuePlot;
+ IHistogram1D rawHitCountPlot;
+ IHistogram1D tkrHitCountPlot;
+ IHistogram1D tkrCountPlot;
+ ICloud1D hitsPerTrackPlot;
+ IHistogram1D tkrMomXPlot;
+ IHistogram1D tkrMomYPlot;
+ IHistogram1D tkrMomZPlot;
+ IHistogram1D tkrMomPlot;
+ ICloud1D timePlot;
+ ICloud1D ecalTimePlot;
+ ICloud1D ecalAmplitudePlot;
+ ICloud1D ecalHitsPlot;
+
+ protected void detectorChanged(Detector detector) {
+
+ this.detector = detector;
+
+ aida.tree().cd("/");
+ adcValuePlot = aida.histogram1D("ADC Value", 500, 0, 500);
+ rawHitCountPlot = aida.histogram1D("Number of RawTrackerHits in Event", 100, 0, 100);
+ tkrHitCountPlot = aida.histogram1D("Number of TrackerHits in Event", 50, 0, 50);
+ tkrCountPlot = aida.histogram1D("Number of Tracks in Event", 20, 0, 20);
+ hitsPerTrackPlot = aida.cloud1D("Number of Hits per Track");
+ tkrMomXPlot = aida.histogram1D("Track Px", 200, 0, 2.0);
+ tkrMomYPlot = aida.histogram1D("Track Py", 160, -0.2, 0.2);
+ tkrMomZPlot = aida.histogram1D("Track Pz", 160, -0.2, 0.2);
+ tkrMomPlot = aida.histogram1D("Track P", 200, 0, 4.0);
+ timePlot = aida.cloud1D("Time [ns]");
+
+ 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(rawHitCountPlot);
+ plotter.region(2).plot(tkrHitCountPlot);
+ plotter.region(3).plot(tkrCountPlot);
+ plotter.region(4).plot(hitsPerTrackPlot);
+ plotter.region(5).plot(tkrMomXPlot);
+ plotter.region(6).plot(tkrMomYPlot);
+ plotter.region(7).plot(tkrMomZPlot);
+ plotter.region(8).plot(tkrMomPlot);
+ plotter.region(9).plot(timePlot);
+ plotter.show();
+
+ // Make a list of sensors in the SVT.
+ List<SiSensor> sensors = detector.getSubdetector(trackerName).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.
+ 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();
+ }
+
+ // Ecal plots.
+ IPlotter plotter4 = fac.createPlotterFactory().create("HPS ECAL Plots");
+ plotters.add(plotter4);
+ ecalTimePlot = aida.cloud1D("Timestamp");
+ ecalAmplitudePlot = aida.cloud1D("Amplitude");
+ ecalHitsPlot = aida.cloud1D("Number of Hits");
+ plotter4.createRegions(2, 2);
+ plotter4.region(0).plot(ecalTimePlot);
+ plotter4.region(1).plot(ecalAmplitudePlot);
+ plotter4.region(2).plot(ecalHitsPlot);
+ plotter4.show();
+ }
+
+ public MonitoringPlotsDriver()
+ {}
+
+ public void setRawTrackerHitCollectionName(String rawTrackerHitCollectionName) {
+ this.rawTrackerHitCollectionName = rawTrackerHitCollectionName;
+ }
+
+ public void setRawCalorimeterHitCollectionName(String rawCalorimeterHitCollectionName) {
+ this.rawCalorimeterHitCollectionName = rawCalorimeterHitCollectionName;
+ }
+
+ public void setTrackerHitCollectionName(String trackerHitCollectionName) {
+ this.trackerHitCollectionName = trackerHitCollectionName;
+ }
+
+ // Call this to reset if "reset" button is pressed on monitoring GUI.
+ public void reset() {
+ for (IPlotter plotter : plotters) {
+ plotter.hide();
+ plotter.clearRegions();
+ }
+ plotters.clear();
+ clearAidaTree();
+ detectorChanged(detector);
+ eventCount = 0;
+ }
+
+ private 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();
+ }
+ }
+ }
+
+ public void process(EventHeader event) {
+
+ ++eventCount;
+
+ // Get collections from event.
+ List<RawTrackerHit> rawTrackerHits = event.get(RawTrackerHit.class, rawTrackerHitCollectionName);
+ List<RawCalorimeterHit> rawCalorimeterHits = event.get(RawCalorimeterHit.class, rawCalorimeterHitCollectionName);
+
+ // Make ECal plots.
+ fillEcalPlots(aida, rawCalorimeterHits);
+
+ // Fill RawTrackerHit count.
+ rawHitCountPlot.fill(rawTrackerHits.size());
+
+ // Loop over RawTrackerHit collection.
+ for (RawTrackerHit hit : rawTrackerHits) {
+
+ // Fill ADC value plot.
+ adcValuePlot.fill(hit.getADCValues()[0]);
+
+ // Fill time plot.
+ timePlot.fill(hit.getTime());
+
+ // Fill basic (non-normalized) occupancy plot.
+ aida.histogram1D(hit.getDetectorElement().getName()).fill(hit.getIdentifierFieldValue("strip"));
+
+ // Increment hit counts for occupancy calculations.
+ int[] strips = occupancyMap.get((SiSensor) hit.getDetectorElement());
+ strips[hit.getIdentifierFieldValue("strip")] += 1;
+ }
+
+ // Normalized occupancy plots.
+ occuPlot.clearRegions();
+ int si = 0;
+ for (SiSensor sensor : occupancyMap.keySet()) {
+ int[] strips = occupancyMap.get(sensor);
+ aida.histogram1D(sensor.getName() + " Normalized").reset();
+ for (int i = 0; i < strips.length; i++) {
+ double stripOccupancy = (double) strips[i] / (double) (eventCount + 1);
+ if (stripOccupancy != 0) {
+ aida.histogram1D(sensor.getName() + " Normalized").fill(i, stripOccupancy);
+ }
+ }
+ occuPlot.region(si).plot(aida.histogram1D(sensor.getName() + " Normalized"));
+ ++si;
+ }
+ occuPlot.show();
+
+ // Get Track list from event. This breaks if > 1 Track collections are generated by LCSim.
+ List<Track> tracks = event.get(Track.class).get(0);
+
+ // Plot number of Tracks.
+ tkrCountPlot.fill(tracks.size());
+
+ // Track plots.
+ for (Track track : tracks) {
+ aida.cloud1D("Number of Hits per Track").fill(track.getTrackerHits().size());
+ tkrMomXPlot.fill(track.getPX());
+ tkrMomYPlot.fill(track.getPY());
+ tkrMomZPlot.fill(track.getPZ());
+ double[] p = track.getMomentum();
+ tkrMomPlot.fill(Math.sqrt(p[0] * p[0] + p[1] * p[1] + p[2] * p[2]));
+ }
+
+ // Number of TrackerHits.
+ List<TrackerHit> trackerHits = event.get(TrackerHit.class, trackerHitCollectionName);
+ tkrHitCountPlot.fill(trackerHits.size());
+ }
+
+ private void fillEcalPlots(AIDA aida, List<RawCalorimeterHit> hits) {
+ ecalHitsPlot.fill(hits.size());
+ for (RawCalorimeterHit hit : hits) {
+ ecalTimePlot.fill(hit.getTimeStamp());
+ ecalAmplitudePlot.fill(hit.getAmplitude());
+ }
+ }
+}
\ No newline at end of file