Print

Print


Author: [log in to unmask]
Date: Wed Feb 25 12:25:26 2015
New Revision: 2204

Log:
Update so it can be used with the engineering run detector.  For now, the driver is not compatible with any test run geometry.

Modified:
    java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/svt/SensorOccupancyPlotsDriver.java

Modified: java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/svt/SensorOccupancyPlotsDriver.java
 =============================================================================
--- java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/svt/SensorOccupancyPlotsDriver.java	(original)
+++ java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/svt/SensorOccupancyPlotsDriver.java	Wed Feb 25 12:25:26 2015
@@ -2,8 +2,9 @@
 
 import hep.aida.IAnalysisFactory;
 import hep.aida.IHistogram1D;
+import hep.aida.IHistogramFactory;
 import hep.aida.IPlotter;
-import hep.aida.IPlotterStyle;
+import hep.aida.IPlotterFactory;
 
 import java.util.HashMap;
 import java.util.List;
@@ -11,40 +12,39 @@
 
 import org.lcsim.detector.identifier.IIdentifier;
 import org.lcsim.detector.identifier.IIdentifierHelper;
-import org.lcsim.detector.tracker.silicon.SiSensor;
+import org.lcsim.detector.tracker.silicon.HpsSiSensor;
 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;
 
 /**
- * This Driver makes plots of sensor occupancies across a run. It is intended to
- * be used with the monitoring system. It will currently only run on a test run
- * detector, as the number of sensors, and hence plotter regions, is hardcoded
- * to 20.
+ *	This Driver makes plots of sensor occupancies across a run. It is intended to
+ * 	be used with the monitoring system.
  *
- * @author Jeremy McCormick <[log in to unmask]>
- * @version $Id: SensorOccupancyPlotsDriver.java,v 1.8 2013/11/06 19:19:55 jeremy Exp $
- *
+ *  @author Jeremy McCormick <[log in to unmask]>
+ *	@author Omar Moreno <[log in to unmask]>
  */
 public class SensorOccupancyPlotsDriver extends Driver {
 
+    // TODO: Add documentation
+    // TODO: Set plot styles
+	
+	static IHistogramFactory histogramFactory = IAnalysisFactory.create().createHistogramFactory(null);
+	IPlotterFactory plotterFactory = IAnalysisFactory.create().createPlotterFactory();
+	
+	protected Map<String, IPlotter> plotters = new HashMap<String, IPlotter>(); 
+	protected Map<HpsSiSensor, IHistogram1D> occupancyPlots = new HashMap<HpsSiSensor, IHistogram1D>(); 
+	protected Map<HpsSiSensor, int[]> occupancyMap = new HashMap<HpsSiSensor, int[]>(); 
+    private List<HpsSiSensor> sensors;
+	
+    private static final String SUBDETECTOR_NAME = "Tracker";
     private String rawTrackerHitCollectionName = "SVTRawTrackerHits";
-    private String trackerName = "Tracker";
-    private AIDA aida = AIDA.defaultInstance();
-    private IPlotter plotter;
-    private Detector detector;
-    private List<SiSensor> sensors;
-    private Map<String, int[]> occupancyMap;
-    private Map<String, Integer> sensorRegionMap;
+
     private int eventCount = 0;
-    private int eventRefreshRate = 1000;
-    private static final String nameStrip = "Tracker_TestRunModule_";
-    private static final int maxChannels = 640;
+    private int eventRefreshRate = 1;
 
-    public SensorOccupancyPlotsDriver() {
-    }
+    public SensorOccupancyPlotsDriver() {}
 
     public void setRawTrackerHitCollectionName(String rawTrackerHitCollectionName) {
         this.rawTrackerHitCollectionName = rawTrackerHitCollectionName;
@@ -54,131 +54,85 @@
         this.eventRefreshRate = eventRefreshRate;
     }
 
-    private int computePlotterRegion(SiSensor sensor) {
+    private int computePlotterRegion(HpsSiSensor sensor) {
 
-        IIdentifierHelper helper = sensor.getIdentifierHelper();
-        IIdentifier id = sensor.getIdentifier();
-
-        int layer = helper.getValue(id, "layer"); // 1-10; axial layers are odd layers; stereo layers are even
-        int module = helper.getValue(id, "module"); // 0-1; module number is top or bottom
-
-        // Compute the sensor's x and y grid coordinates and then translate to region number.
-        int ix = (layer - 1) / 2;
-        int iy = 0;
-        if (module > 0) {
-            iy += 2;
-        }
-        if (layer % 2 == 0) {
-            iy += 1;
-        }
-        int region = ix * 4 + iy;
-        //System.out.println(sensor.getName() + "; lyr=" + layer + "; mod=" + module + " -> xy[" + ix + "][" + iy + "] -> reg="+region);
-        return region;
+		if (sensor.getLayerNumber() < 7) {
+			if (sensor.isTopLayer()) {
+				return 6*(sensor.getLayerNumber() - 1); 
+			} else { 
+				return 6*(sensor.getLayerNumber() - 1) + 1;
+			} 
+		} else { 
+		
+			if (sensor.isTopLayer()) {
+				if (sensor.getSide() == HpsSiSensor.POSITRON_SIDE) {
+					return 6*(sensor.getLayerNumber() - 7) + 2;
+				} else { 
+					return 6*(sensor.getLayerNumber() - 7) + 3;
+				}
+			} else if (sensor.isBottomLayer()) {
+				if (sensor.getSide() == HpsSiSensor.POSITRON_SIDE) {
+					return 6*(sensor.getLayerNumber() - 7) + 4;
+				} else {
+					return 6*(sensor.getLayerNumber() - 7) + 5;
+				}
+			}
+		}
+		
+		return -1; 
     }
 
     protected void detectorChanged(Detector detector) {
-
-        // Setup the plotter.
-        IAnalysisFactory fac = aida.analysisFactory();
-        plotter = fac.createPlotterFactory("SVT").create("Sensor Occupancy Plots");
-        IPlotterStyle pstyle = plotter.style();
-        pstyle.dataStyle().fillStyle().setColor("green");
-        //pstyle.dataStyle().markerStyle().setColor("green");
-        pstyle.dataStyle().markerStyle().setVisible(false);
-        pstyle.dataStyle().outlineStyle().setVisible(false);
-        pstyle.dataStyle().errorBarStyle().setVisible(false);
-        pstyle.statisticsBoxStyle().setVisible(false);
-
-        // Create regions.
-        plotter.createRegions(5, 4);
-
-        // Cache Detector object.
-        this.detector = detector;
-
-        // Make a list of SiSensors in the SVT.
-        sensors = this.detector.getSubdetector(trackerName).getDetectorElement().findDescendants(SiSensor.class);
-
-        // Reset the data structure that keeps track of strip occupancies.
-        resetOccupancyMap();
-
-        // For now throw an error if there are "too many" sensors.
-        if (sensors.size() > 20) {
-            throw new RuntimeException("Can't handle > 20 sensors at a time.");
-        }
-        
+    	
+		sensors 
+			= detector.getSubdetector(SUBDETECTOR_NAME).getDetectorElement().findDescendants(HpsSiSensor.class);
+   
         if (sensors.size() == 0) {
             throw new RuntimeException("No sensors were found in this detector.");
         }
 
-        // Map a map of sensors to their region numbers in the plotter.
-        sensorRegionMap = new HashMap<String, Integer>();
-        for (SiSensor sensor : sensors) {
-            int region = computePlotterRegion(sensor);
-            sensorRegionMap.put(sensor.getName(), region);
-        }
-
-        // Setup the occupancy plots.
-        aida.tree().cd("/");
-        for (SiSensor sensor : sensors) {
-            IHistogram1D occupancyPlot = createSensorPlot(sensor);
-            occupancyPlot.reset();
-            int region = sensorRegionMap.get(sensor.getName());
-            plotter.region(region).plot(occupancyPlot);
-        }
-        
-        plotter.show();
+        plotters.put("Occupancy", plotterFactory.create("Occupancy"));
+		plotters.get("Occupancy").createRegions(6,6);
+		
+		for (HpsSiSensor sensor : sensors) {
+			occupancyPlots.put(sensor, histogramFactory.createHistogram1D(sensor.getName() + " - Occupancy", 640, 0, 640)); 
+			plotters.get("Occupancy").region(this.computePlotterRegion(sensor))
+									 .plot(occupancyPlots.get(sensor));
+            occupancyMap.put(sensor, new int[640]);
+		}
+		
+		for (IPlotter plotter : plotters.values()) { 
+			plotter.show();
+		}
     }
 
     public void process(EventHeader event) {
-        if (event.hasCollection(RawTrackerHit.class, rawTrackerHitCollectionName)) {
+        
+    	if (!event.hasCollection(RawTrackerHit.class, rawTrackerHitCollectionName))
+    		return;
 
-            // Get RawTrackerHit collection from event.
-            List<RawTrackerHit> rawTrackerHits = event.get(RawTrackerHit.class, rawTrackerHitCollectionName);
+    	eventCount++;
+    	
+        // Get RawTrackerHit collection from event.
+        List<RawTrackerHit> rawHits = event.get(RawTrackerHit.class, rawTrackerHitCollectionName);
 
-            // Increment strip hit count.
-            for (RawTrackerHit hit : rawTrackerHits) {
-                int[] strips = occupancyMap.get(hit.getDetectorElement().getName());
-                strips[hit.getIdentifierFieldValue("strip")] += 1;
-            }
+         // Increment strip hit count.
+         for (RawTrackerHit rawHit : rawHits) {
+        	 int[] strips = occupancyMap.get((HpsSiSensor) rawHit.getDetectorElement());
+             strips[rawHit.getIdentifierFieldValue("strip")] += 1;
+         }
 
-            // Plot strip occupancies.
-            if (eventCount % eventRefreshRate == 0) {
-                for (SiSensor sensor : sensors) {
-                	//IHistogram1D sensorHist = aida.histogram1D(sensor.getName());
-                    IHistogram1D sensorHist = getSensorPlot(sensor);
-                    sensorHist.reset();
-                    int[] strips = occupancyMap.get(sensor.getName());
-                    for (int i = 0; i < strips.length; i++) {
-                        double stripOccupancy = (double) strips[i] / (double) (eventCount);
-                        if (stripOccupancy != 0) {
-                            sensorHist.fill(i, stripOccupancy);
-                        }
-                    }
-                }
-            }
-
-            // Increment event counter.
-            ++eventCount;
-        }
-    }
-    
-    private IHistogram1D getSensorPlot(SiSensor sensor) {
-    	return aida.histogram1D(sensor.getName());
-    }
-    
-    private IHistogram1D createSensorPlot(SiSensor sensor) {
-    	IHistogram1D hist = aida.histogram1D(sensor.getName(), maxChannels, 0, maxChannels-1);
-    	hist.setTitle(sensor.getName().replaceAll(nameStrip, "")
-                .replace("module", "mod")
-                .replace("layer", "lyr")
-                .replace("sensor", "sens"));
-    	return hist;
-    }
-
-    private void resetOccupancyMap() {
-        occupancyMap = new HashMap<String, int[]>();
-        for (SiSensor sensor : sensors) {
-            occupancyMap.put(sensor.getName(), new int[640]);
-        }
+         // Plot strip occupancies.
+         if (eventCount % eventRefreshRate == 0) {
+        	 for (HpsSiSensor sensor : sensors) {
+                 int[] strips = occupancyMap.get(sensor);
+                 for (int i = 0; i < strips.length; i++) {
+                     double stripOccupancy = (double) strips[i] / (double) eventCount;
+                     if (stripOccupancy != 0) {
+                     	occupancyPlots.get(sensor).fill(i, stripOccupancy);
+                     }
+                 }
+             }
+         }
     }
 }