hps-java/src/main/java/org/lcsim/hps/monitoring
diff -N SensorOccupancyPlotsDriver.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ SensorOccupancyPlotsDriver.java 23 Mar 2012 22:50:14 -0000 1.1
@@ -0,0 +1,105 @@
+package org.lcsim.hps.monitoring;
+
+import hep.aida.IAnalysisFactory;
+import hep.aida.IHistogram1D;
+import hep.aida.IPlotter;
+import hep.aida.IPlotterStyle;
+
+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.RawTrackerHit;
+import org.lcsim.geometry.Detector;
+import org.lcsim.util.Driver;
+import org.lcsim.util.aida.AIDA;
+
+public class SensorOccupancyPlotsDriver extends Driver implements Resettable {
+
+ private AIDA aida = AIDA.defaultInstance();
+ private IPlotter occuPlotter;
+ private Map<SiSensor,int[]> occupancyMap;
+ private String rawTrackerHitCollectionName = "RawTrackerHitMaker_RawTrackerHits";
+ private String trackerName = "Tracker";
+ private int eventCount;
+
+ public SensorOccupancyPlotsDriver()
+ {}
+
+ public void setRawTrackerHitCollectionName(String rawTrackerHitCollectionName) {
+ this.rawTrackerHitCollectionName = rawTrackerHitCollectionName;
+ }
+
+ protected void detectorChanged(Detector detector) {
+
+ if (occuPlotter != null)
+ occuPlotter.hide();
+
+ // Setup plotter.
+ IAnalysisFactory fac = aida.analysisFactory();
+ occuPlotter = fac.createPlotterFactory().create(detector.getDetectorName() + " : HPS SVT Sensor Occupancy Plots");
+ IPlotterStyle pstyle = occuPlotter.style();
+ pstyle.dataStyle().fillStyle().setColor("green");
+ pstyle.dataStyle().markerStyle().setColor("green");
+ pstyle.dataStyle().errorBarStyle().setVisible(false);
+ pstyle.statisticsBoxStyle().setVisible(false);
+ occuPlotter.createRegions(5, 4); // FIXME Hard-coded to 20 sensors.
+
+ // Make a list of sensors in the SVT.
+ List<SiSensor> sensors = detector.getSubdetector(trackerName).getDetectorElement().findDescendants(SiSensor.class);
+ int ns = sensors.size();
+
+ // Data structure for occupancy calculations by sensor.
+ occupancyMap = new HashMap<SiSensor,int[]>();
+ for (SiSensor sensor : sensors) {
+ occupancyMap.put(sensor, new int[640]);
+ }
+
+ aida.tree().cd("/");
+ for (int i = 0; i < ns; i++)
+ {
+ IHistogram1D occupancyPlot = aida.histogram1D(sensors.get(i).getName(), 640, 0, 639);
+ occuPlotter.region(i).plot(occupancyPlot);
+ }
+ occuPlotter.show();
+ }
+
+ public void process(EventHeader event) {
+
+ // Increment event counter.
+ ++eventCount;
+
+ // Get collections from event.
+ List<RawTrackerHit> rawTrackerHits = event.get(RawTrackerHit.class, rawTrackerHitCollectionName);
+
+ // Loop over RawTrackerHit collection.
+ for (RawTrackerHit hit : rawTrackerHits) {
+ // Increment hit counts for occupancy calculations.
+ int[] strips = occupancyMap.get((SiSensor) hit.getDetectorElement());
+ strips[hit.getIdentifierFieldValue("strip")] += 1;
+ }
+
+ // Occupancy plots are redrawn every event.
+ occuPlotter.clearRegions();
+ int si = 0;
+ for (SiSensor sensor : occupancyMap.keySet()) {
+ int[] strips = occupancyMap.get(sensor);
+ aida.histogram1D(sensor.getName()).reset();
+ for (int i = 0; i < strips.length; i++) {
+ double stripOccupancy = (double) strips[i] / (double) (eventCount);
+ if (stripOccupancy != 0) {
+ aida.histogram1D(sensor.getName()).fill(i, stripOccupancy);
+ }
+ }
+ occuPlotter.region(si).plot(aida.histogram1D(sensor.getName()));
+ ++si;
+ }
+ occuPlotter.show();
+ }
+
+ public void reset() {
+ eventCount = 0;
+ }
+}
\ No newline at end of file