Author: [log in to unmask] Date: Mon Apr 27 14:09:04 2015 New Revision: 2825 Log: Reset plots between runs. 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 Mon Apr 27 14:09:04 2015 @@ -16,7 +16,6 @@ import hep.aida.ref.rootwriter.RootFileStore; import hep.aida.jfree.plotter.Plotter; import hep.aida.jfree.plotter.PlotterRegion; - import hep.physics.vec.Hep3Vector; import org.lcsim.detector.tracker.silicon.HpsSiSensor; @@ -30,7 +29,6 @@ /** * This Driver makes plots of SVT sensor occupancies across a run. - * * * @author Omar Moreno <[log in to unmask]> */ @@ -40,15 +38,19 @@ static { hep.aida.jfree.AnalysisFactory.register(); } - - ITree tree; - IHistogramFactory histogramFactory; - 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, IHistogram1D> occupancyVPositionPlots = new HashMap<HpsSiSensor, IHistogram1D>(); - protected Map<HpsSiSensor, int[]> occupancyMap = new HashMap<HpsSiSensor, int[]>(); + + // Plotting + private static ITree tree = null; + private IAnalysisFactory analysisFactory = IAnalysisFactory.create(); + private IPlotterFactory plotterFactory = analysisFactory.createPlotterFactory(); + private IHistogramFactory histogramFactory; + + // Histogram maps + static protected Map<String, IPlotter> plotters = new HashMap<String, IPlotter>(); + static protected Map<String, IHistogram1D> occupancyPlots = new HashMap<String, IHistogram1D>(); + static protected Map<String, IHistogram1D> positionPlots = new HashMap<String, IHistogram1D>(); + static protected Map<String, int[]> occupancyMap = new HashMap<String, int[]>(); + private List<HpsSiSensor> sensors; private Map<HpsSiSensor, Map<Integer, Hep3Vector>> stripPositions = new HashMap<HpsSiSensor, Map<Integer, Hep3Vector>>(); @@ -115,17 +117,26 @@ return -1; } - - protected void detectorChanged(Detector detector) { - - sensors = detector.getSubdetector(SUBDETECTOR_NAME).getDetectorElement().findDescendants(HpsSiSensor.class); - - if (sensors.size() == 0) { - throw new RuntimeException("There are no sensors associated with this detector"); - } - - // Create a Map from sensor to bad channels and from bad channels to - // strip position + + /** + * Get the global strip position of a physical channel number for a given + * sensor. + * + * @param sensor : HpsSiSensor + * @param physicalChannel : physical channel number + * @return The strip position (mm) in the global coordinate system + */ + private Hep3Vector getStripPosition(HpsSiSensor sensor, int physicalChannel){ + return stripPositions.get(sensor).get(physicalChannel); + } + + /** + * For each sensor, create a mapping between a physical channel number and + * it's global strip position. + */ + // TODO: Move this to a utility class + private void createStripPositionMap() { + for(ChargeCarrier carrier : ChargeCarrier.values()){ for(HpsSiSensor sensor : sensors){ if(sensor.hasElectrodesOnSide(carrier)){ @@ -142,10 +153,106 @@ } } } - - tree = IAnalysisFactory.create().createTreeFactory().create(); - histogramFactory = IAnalysisFactory.create().createHistogramFactory(tree); - + } + + /** + * Create a plotter style. + * + * @param xAxisTitle : Title of the x axis + * @param sensor : HpsSiSensor associated with the plot. This is used to + * set certain attributes based on the position of the + * sensor. + * @return plotter style + */ + // TODO: Move this to a utilities class + IPlotterStyle createOccupancyPlotStyle(String xAxisTitle, HpsSiSensor sensor) { + // Create a default style + IPlotterStyle style = this.plotterFactory.createPlotterStyle(); + + // Set the style of the X axis + style.xAxisStyle().setLabel(xAxisTitle); + style.xAxisStyle().labelStyle().setFontSize(14); + style.xAxisStyle().setVisible(true); + + // Set the style of the Y axis + style.yAxisStyle().setLabel("Occupancy"); + style.yAxisStyle().labelStyle().setFontSize(14); + style.yAxisStyle().setVisible(true); + + // Turn off the histogram grid + style.gridStyle().setVisible(false); + + // Set the style of the data + style.dataStyle().lineStyle().setVisible(false); + style.dataStyle().outlineStyle().setVisible(true); + style.dataStyle().outlineStyle().setThickness(3); + style.dataStyle().fillStyle().setVisible(true); + style.dataStyle().fillStyle().setOpacity(.10); + if (sensor.isTopLayer()) { + style.dataStyle().fillStyle().setColor("31, 137, 229, 1"); + style.dataStyle().outlineStyle().setColor("31, 137, 229, 1"); + } else { + style.dataStyle().fillStyle().setColor("93, 228, 47, 1"); + style.dataStyle().outlineStyle().setColor("93, 228, 47, 1"); + } + style.dataStyle().errorBarStyle().setVisible(false); + + // Turn off the legend + style.legendBoxStyle().setVisible(false); + + style.regionBoxStyle().backgroundStyle().setOpacity(.10); + if (sensor.isAxial()) style.regionBoxStyle().backgroundStyle().setColor("229, 114, 31, 1"); + + return style; + } + + /** + * Clear all histograms of it's current data. + */ + private void resetPlots() { + + // Clear the hit counter map of all previously stored data. + occupancyMap.clear(); + + // Since all plots are mapped to the name of a sensor, loop + // through the sensors, get the corresponding plots and clear them. + for (HpsSiSensor sensor : sensors) { + + // Clear the occupancy plots. + occupancyPlots.get(sensor.getName()).reset(); + positionPlots.get(sensor.getName()).reset(); + + // Reset the hit counters. + occupancyMap.put(sensor.getName(), new int[640]); + } + } + + protected void detectorChanged(Detector detector) { + + // Get the HpsSiSensor objects from the geometry + sensors = detector.getSubdetector(SUBDETECTOR_NAME).getDetectorElement().findDescendants(HpsSiSensor.class); + + // If there were no sensors found, throw an exception + if (sensors.size() == 0) { + throw new RuntimeException("There are no sensors associated with this detector"); + } + + // For each sensor, create a mapping between a physical channel number + // and the global strip position + this.createStripPositionMap(); + + // If the tree already exist, clear all existing plots of any old data + // they might contain. + if (tree != null) { + this.resetPlots(); + return; + } + + tree = analysisFactory.createTreeFactory().create(); + histogramFactory = analysisFactory.createHistogramFactory(tree); + + // Create the plotter and regions. A region is created for each + // sensor for a total of 36. plotters.put("Occupancy", plotterFactory.create("Occupancy")); plotters.get("Occupancy").createRegions(6, 6); @@ -155,30 +262,32 @@ } for (HpsSiSensor sensor : sensors) { - occupancyPlots.put(sensor, histogramFactory.createHistogram1D(sensor.getName() + " - Occupancy", 640, 0, 640)); + occupancyPlots.put(sensor.getName(), histogramFactory.createHistogram1D(sensor.getName() + " - Occupancy", 640, 0, 640)); plotters.get("Occupancy").region(this.computePlotterRegion(sensor)) - .plot(occupancyPlots.get(sensor), this.createOccupancyPlotStyle("Physical Channel", sensor)); + .plot(occupancyPlots.get(sensor.getName()), this.createOccupancyPlotStyle("Physical Channel", sensor)); if (enablePositionPlots) { if (sensor.isTopLayer()) { - occupancyVPositionPlots.put(sensor, + positionPlots.put(sensor.getName(), histogramFactory.createHistogram1D(sensor.getName() + " - Occupancy vs Position", 1000, 0, 60)); } else { - occupancyVPositionPlots.put(sensor, + positionPlots.put(sensor.getName(), histogramFactory.createHistogram1D(sensor.getName() + " - Occupancy vs Position", 1000, -60, 0)); } plotters.get("Occupancy vs Position").region(this.computePlotterRegion(sensor)) - .plot(occupancyVPositionPlots.get(sensor), this.createOccupancyPlotStyle("Distance from Beam [mm]", sensor)); - } - occupancyMap.put(sensor, new int[640]); - } + .plot(positionPlots.get(sensor.getName()), this.createOccupancyPlotStyle("Distance from Beam [mm]", sensor)); + } + occupancyMap.put(sensor.getName(), new int[640]); + } + + System.out.println("Size of occupancyPlots map: " + occupancyPlots.size()); for (IPlotter plotter : plotters.values()) { - for (int regionN = 0; regionN < 36; regionN++) { + /*for (int regionN = 0; regionN < 36; regionN++) { PlotterRegion region = ((PlotterRegion) ((Plotter) plotter).region(regionN)); region.getPanel().addMouseListener(new PopupPlotterListener(region)); - } + }*/ plotter.show(); } } @@ -215,24 +324,24 @@ } if (maxSamplePosition == -1 || maxSamplePosition == maxSamplePositionFound) { - occupancyMap.get((HpsSiSensor) rawHit.getDetectorElement())[rawHit.getIdentifierFieldValue("strip")]++; + occupancyMap.get(((HpsSiSensor) rawHit.getDetectorElement()).getName())[rawHit.getIdentifierFieldValue("strip")]++; } } // Plot strip occupancies. if (eventCount % eventRefreshRate == 0) { for (HpsSiSensor sensor : sensors) { - int[] strips = occupancyMap.get(sensor); - occupancyPlots.get(sensor).reset(); - if (enablePositionPlots) occupancyVPositionPlots.get(sensor).reset(); + int[] strips = occupancyMap.get(sensor.getName()); + occupancyPlots.get(sensor.getName()).reset(); + if (enablePositionPlots) positionPlots.get(sensor.getName()).reset(); for (int channel = 0; channel < strips.length; channel++) { double stripOccupancy = (double) strips[channel] / (double) eventCount; stripOccupancy /= this.timeWindowWeight; - occupancyPlots.get(sensor).fill(channel, stripOccupancy); + occupancyPlots.get(sensor.getName()).fill(channel, stripOccupancy); if (enablePositionPlots) { double stripPosition = this.getStripPosition(sensor, channel).y(); - occupancyVPositionPlots.get(sensor).fill(stripPosition, stripOccupancy); + positionPlots.get(sensor.getName()).fill(stripPosition, stripOccupancy); } } } @@ -251,52 +360,4 @@ e.printStackTrace(); } } - - /** - * . - */ - private Hep3Vector getStripPosition(HpsSiSensor sensor, int physicalChannel){ - return stripPositions.get(sensor).get(physicalChannel); - } - - IPlotterStyle createOccupancyPlotStyle(String xAxisTitle, HpsSiSensor sensor) { - // Create a default style - IPlotterStyle style = this.plotterFactory.createPlotterStyle(); - - // Set the style of the X axis - style.xAxisStyle().setLabel(xAxisTitle); - style.xAxisStyle().labelStyle().setFontSize(14); - style.xAxisStyle().setVisible(true); - - // Set the style of the Y axis - style.yAxisStyle().setLabel("Occupancy"); - style.yAxisStyle().labelStyle().setFontSize(14); - style.yAxisStyle().setVisible(true); - - // Turn off the histogram grid - style.gridStyle().setVisible(false); - - // Set the style of the data - style.dataStyle().lineStyle().setVisible(false); - style.dataStyle().outlineStyle().setVisible(true); - style.dataStyle().outlineStyle().setThickness(3); - style.dataStyle().fillStyle().setVisible(true); - style.dataStyle().fillStyle().setOpacity(.10); - if (sensor.isTopLayer()) { - style.dataStyle().fillStyle().setColor("31, 137, 229, 1"); - style.dataStyle().outlineStyle().setColor("31, 137, 229, 1"); - } else { - style.dataStyle().fillStyle().setColor("93, 228, 47, 1"); - style.dataStyle().outlineStyle().setColor("93, 228, 47, 1"); - } - style.dataStyle().errorBarStyle().setVisible(false); - - // Turn off the legend - style.legendBoxStyle().setVisible(false); - - style.regionBoxStyle().backgroundStyle().setOpacity(.10); - if (sensor.isAxial()) style.regionBoxStyle().backgroundStyle().setColor("229, 114, 31, 1"); - - return style; - } }