Print

Print


Author: [log in to unmask]
Date: Thu Mar 12 15:57:13 2015
New Revision: 2420

Log:
Monitoring driver used to provide information about the number of SVT hits per event.

Added:
    java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/svt/SvtHitPlots.java   (with props)

Added: java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/svt/SvtHitPlots.java
 =============================================================================
--- java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/svt/SvtHitPlots.java	(added)
+++ java/trunk/monitoring-drivers/src/main/java/org/hps/monitoring/drivers/svt/SvtHitPlots.java	Thu Mar 12 15:57:13 2015
@@ -0,0 +1,154 @@
+package org.hps.monitoring.drivers.svt;
+
+import hep.aida.IAnalysisFactory;
+import hep.aida.IHistogram1D;
+import hep.aida.IHistogramFactory;
+import hep.aida.IPlotter;
+import hep.aida.IPlotterFactory;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.lcsim.detector.tracker.silicon.HpsSiSensor;
+import org.lcsim.util.Driver; 
+import org.lcsim.geometry.Detector;
+import org.lcsim.event.EventHeader;
+import org.lcsim.event.RawTrackerHit;
+
+/**
+ *  Monitoring driver that provides information about the number
+ *  of SVT hits per event.
+ *   
+ *  @author Omar Moreno <[log in to unmask]>
+ */
+public class SvtHitPlots extends Driver {
+
+    // TODO: Add documentation
+    // TODO: Set plot styles
+	
+    static {
+        hep.aida.jfree.AnalysisFactory.register();
+    } 
+
+    static IHistogramFactory histogramFactory = IAnalysisFactory.create().createHistogramFactory(null);
+	IPlotterFactory plotterFactory = IAnalysisFactory.create().createPlotterFactory();
+	
+	protected Map<String, IPlotter> plotters = new HashMap<String, IPlotter>(); 
+    private List<HpsSiSensor> sensors;
+    protected Map<HpsSiSensor, IHistogram1D> hitsPerSensorPlots 
+        = new HashMap<HpsSiSensor, IHistogram1D>();
+    protected Map<HpsSiSensor, int[]> hitsPerSensor 
+        = new HashMap<HpsSiSensor, int[]>();
+    protected Map<String, IHistogram1D> layersHitPlots = new HashMap<String, IHistogram1D>();
+	
+    private static final String SUBDETECTOR_NAME = "Tracker";
+    private String rawTrackerHitCollectionName = "SVTRawTrackerHits";
+
+    private int computePlotterRegion(HpsSiSensor sensor) {
+
+		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) {
+
+        sensors 
+			= detector.getSubdetector(SUBDETECTOR_NAME).getDetectorElement().findDescendants(HpsSiSensor.class);
+   
+        if (sensors.size() == 0) {
+            throw new RuntimeException("No sensors were found in this detector.");
+        }
+        
+        plotters.put("Raw hits per sensor", plotterFactory.create("Raw hits per sensor")); 
+		plotters.get("Raw hits per sensor").createRegions(6,6);
+        
+		for (HpsSiSensor sensor : sensors) {
+		   hitsPerSensorPlots.put(sensor, 
+		           histogramFactory.createHistogram1D(sensor.getName() + " - Raw Hits", 10, 0, 10)); 
+		   plotters.get("Raw hits per sensor").region(this.computePlotterRegion(sensor))
+		                                      .plot(hitsPerSensorPlots.get(sensor));
+		   hitsPerSensor.put(sensor, new int[1]);
+		}
+
+		plotters.put("Number of layers hit", plotterFactory.create("Number of layers hit"));
+		plotters.get("Number of layers hit").createRegions(1,2);
+
+		layersHitPlots.put("Top",
+		        histogramFactory.createHistogram1D("Top Layers Hit", 12, 0, 12));
+		plotters.get("Number of layers hit").region(0).plot(layersHitPlots.get("Top"));
+		layersHitPlots.put("Bottom",
+		        histogramFactory.createHistogram1D("Bottom Layers Hit", 12, 0, 12));
+		plotters.get("Number of layers hit").region(1).plot(layersHitPlots.get("Bottom"));
+	
+		
+		for (IPlotter plotter : plotters.values()) { 
+			plotter.show();
+		}
+    }
+    
+    public void process(EventHeader event) {
+        
+    	if (!event.hasCollection(RawTrackerHit.class, rawTrackerHitCollectionName))
+    		return;
+    	
+        // Get RawTrackerHit collection from event.
+        List<RawTrackerHit> rawHits = event.get(RawTrackerHit.class, rawTrackerHitCollectionName);
+   
+        this.clearHitMaps();
+        for (RawTrackerHit rawHit : rawHits) { 
+            HpsSiSensor sensor = (HpsSiSensor) rawHit.getDetectorElement();
+            hitsPerSensor.get(sensor)[0]++;
+        }
+        
+        int[] topLayersHit = new int[12];
+        int[] botLayersHit = new int[12]; 
+        for (HpsSiSensor sensor : sensors) { 
+            hitsPerSensorPlots.get(sensor).fill(hitsPerSensor.get(sensor)[0]);
+            
+            if (hitsPerSensor.get(sensor)[0] > 0) { 
+                if (sensor.isTopLayer()) topLayersHit[sensor.getLayerNumber() - 1]++;
+                else botLayersHit[sensor.getLayerNumber() - 1]++; 
+            }
+        }
+       
+        int totalTopLayersHit = 0; 
+        int totalBotLayersHit = 0; 
+        for(int layerN = 0; layerN < 12; layerN++) { 
+            if (topLayersHit[layerN] > 0) totalTopLayersHit++;
+            if (botLayersHit[layerN] > 0) totalBotLayersHit++;
+        }
+        
+        layersHitPlots.get("Top").fill(totalTopLayersHit);
+        layersHitPlots.get("Bottom").fill(totalBotLayersHit);
+        
+    }
+    
+    private void clearHitMaps() { 
+        for (HpsSiSensor sensor : sensors) {
+            hitsPerSensor.get(sensor)[0] = 0; 
+        }
+    }
+}