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);
+ }
+ }
+ }
+ }
}
}
|