Commit in hps-java/sandbox on MAIN | |||
MonitoringPlotsDriver.java | +255 | added 1.1 |
move old monitoring plots to sandbox for now
diff -N MonitoringPlotsDriver.java --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ MonitoringPlotsDriver.java 29 Apr 2012 23:20:24 -0000 1.1 @@ -0,0 +1,255 @@
+package org.lcsim.hps.monitoring; + +import hep.aida.IAnalysisFactory; +import hep.aida.IBaseHistogram; +import hep.aida.ICloud1D; +import hep.aida.IHistogram1D; +import hep.aida.IManagedObject; +import hep.aida.IPlotter; +import hep.aida.IPlotterStyle; +import hep.aida.ITree; + +import java.util.ArrayList; +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.RawCalorimeterHit; +import org.lcsim.event.RawTrackerHit; +import org.lcsim.event.Track; +import org.lcsim.event.TrackerHit; +import org.lcsim.geometry.Detector; +import org.lcsim.util.Driver; +import org.lcsim.util.aida.AIDA; + +// TODO Add Histogram2D of ECal cells. Can plot as color map. +public class MonitoringPlotsDriver extends Driver implements Resettable { + + private Map<SiSensor,int[]> occupancyMap; + private IPlotter occuPlot; + private List<IPlotter> plotters = new ArrayList<IPlotter>(); + private AIDA aida = AIDA.defaultInstance(); + private String rawTrackerHitCollectionName = "RawTrackerHitMaker_RawTrackerHits"; + private String rawCalorimeterHitCollectionName = "EcalRawHits"; + private String trackerHitCollectionName = "StripClusterer_SiTrackerHitStrip1D"; + private String trackerName = "Tracker"; + private int eventCount; + private Detector detector = null; + + private IHistogram1D adcValuePlot; + private IHistogram1D rawHitCountPlot; + private IHistogram1D tkrHitCountPlot; + private IHistogram1D tkrCountPlot; + private ICloud1D hitsPerTrackPlot; + private IHistogram1D tkrMomXPlot; + private IHistogram1D tkrMomYPlot; + private IHistogram1D tkrMomZPlot; + private IHistogram1D tkrMomPlot; + private ICloud1D timePlot; + private ICloud1D ecalTimePlot; + private ICloud1D ecalAmplitudePlot; + private ICloud1D ecalHitsPlot; + + protected void detectorChanged(Detector detector) { + + this.detector = detector; + + aida.tree().cd("/"); + adcValuePlot = aida.histogram1D("ADC Value", 500, 0, 500); + rawHitCountPlot = aida.histogram1D("Number of RawTrackerHits in Event", 100, 0, 100); + tkrHitCountPlot = aida.histogram1D("Number of TrackerHits in Event", 50, 0, 50); + tkrCountPlot = aida.histogram1D("Number of Tracks in Event", 20, 0, 20); + hitsPerTrackPlot = aida.cloud1D("Number of Hits per Track"); + tkrMomXPlot = aida.histogram1D("Track Px", 200, 0, 2.0); + tkrMomYPlot = aida.histogram1D("Track Py", 160, -0.2, 0.2); + tkrMomZPlot = aida.histogram1D("Track Pz", 160, -0.2, 0.2); + tkrMomPlot = aida.histogram1D("Track P", 200, 0, 4.0); + timePlot = aida.cloud1D("Time [ns]"); + + IAnalysisFactory fac = aida.analysisFactory(); + IPlotter plotter = fac.createPlotterFactory().create("HPS SVT Plots"); + plotters.add(plotter); + plotter.style().dataStyle().errorBarStyle().setVisible(false); + plotter.createRegions(4,4); + plotter.region(0).plot(adcValuePlot); + plotter.region(1).plot(rawHitCountPlot); + plotter.region(2).plot(tkrHitCountPlot); + plotter.region(3).plot(tkrCountPlot); + plotter.region(4).plot(hitsPerTrackPlot); + plotter.region(5).plot(tkrMomXPlot); + plotter.region(6).plot(tkrMomYPlot); + plotter.region(7).plot(tkrMomZPlot); + plotter.region(8).plot(tkrMomPlot); + plotter.region(9).plot(timePlot); + plotter.show(); + + // Make a list of sensors in the SVT. + List<SiSensor> sensors = detector.getSubdetector(trackerName).getDetectorElement().findDescendants(SiSensor.class); + + // Setup occupancy plots. + IPlotter plotter2 = fac.createPlotterFactory().create("HPS SVT Sensor Occupancy Plots"); + plotters.add(plotter2); + IPlotterStyle style = plotter2.style(); + style.dataStyle().fillStyle().setColor("yellow"); + style.dataStyle().errorBarStyle().setVisible(false); + plotter2.createRegions(5, 4); + int ns = sensors.size(); + for (int i=0; i<ns; i++) { + IHistogram1D occupancyPlot = aida.histogram1D(sensors.get(i).getName(), 640, 0, 639); + plotter2.region(i).plot(occupancyPlot); + } + plotter2.show(); + + // Data structure for occupancy calculations by sensor. + occupancyMap = new HashMap<SiSensor,int[]>(); + for (SiSensor sensor : sensors) { + occupancyMap.put(sensor, new int[640]); + } + + // Normalized occupancy plots are only setup the first time. + if (occuPlot == null) { + IPlotter plotter3 = fac.createPlotterFactory().create("HPS SVT Normalized Sensor Occupancy Plots"); + occuPlot = plotter3; + IPlotterStyle style3 = plotter3.style(); + style3.dataStyle().fillStyle().setColor("green"); + style3.dataStyle().markerStyle().setColor("green"); + style3.dataStyle().errorBarStyle().setVisible(false); + style3.statisticsBoxStyle().setVisible(false); + plotter3.createRegions(5, 4); + for (int i=0; i<ns; i++) { + IHistogram1D occupancyPlot = aida.histogram1D(sensors.get(i).getName() + " Normalized", 640, 0, 639); + plotter3.region(i).plot(occupancyPlot); + } + plotter3.show(); + } + + // Ecal plots. + IPlotter plotter4 = fac.createPlotterFactory().create("HPS ECAL Plots"); + plotters.add(plotter4); + ecalTimePlot = aida.cloud1D("Timestamp"); + ecalAmplitudePlot = aida.cloud1D("Amplitude"); + ecalHitsPlot = aida.cloud1D("Number of Hits"); + plotter4.createRegions(2, 2); + plotter4.region(0).plot(ecalTimePlot); + plotter4.region(1).plot(ecalAmplitudePlot); + plotter4.region(2).plot(ecalHitsPlot); + plotter4.show(); + } + + public MonitoringPlotsDriver() + {} + + public void setRawTrackerHitCollectionName(String rawTrackerHitCollectionName) { + this.rawTrackerHitCollectionName = rawTrackerHitCollectionName; + } + + public void setRawCalorimeterHitCollectionName(String rawCalorimeterHitCollectionName) { + this.rawCalorimeterHitCollectionName = rawCalorimeterHitCollectionName; + } + + public void setTrackerHitCollectionName(String trackerHitCollectionName) { + this.trackerHitCollectionName = trackerHitCollectionName; + } + + // Call this to reset if "reset" button is pressed on monitoring GUI. + public void reset() { + for (IPlotter plotter : plotters) { + plotter.hide(); + plotter.clearRegions(); + } + plotters.clear(); + clearAidaTree(); + detectorChanged(detector); + eventCount = 0; + } + + private void clearAidaTree() { + ITree tree = AIDA.defaultInstance().tree(); + String names[] = tree.listObjectNames("/", true); + for (String name : names) { + IManagedObject o = tree.find(name); + if (o instanceof IBaseHistogram) { + ((IBaseHistogram) o).reset(); + } + } + } + + public void process(EventHeader event) { + + ++eventCount; + + // Get collections from event. + List<RawTrackerHit> rawTrackerHits = event.get(RawTrackerHit.class, rawTrackerHitCollectionName); + List<RawCalorimeterHit> rawCalorimeterHits = event.get(RawCalorimeterHit.class, rawCalorimeterHitCollectionName); + + // Make ECal plots. + fillEcalPlots(aida, rawCalorimeterHits); + + // Fill RawTrackerHit count. + rawHitCountPlot.fill(rawTrackerHits.size()); + + // Loop over RawTrackerHit collection. + for (RawTrackerHit hit : rawTrackerHits) { + + // Fill ADC value plot. + adcValuePlot.fill(hit.getADCValues()[0]); + + // Fill time plot. + timePlot.fill(hit.getTime()); + + // Fill basic (non-normalized) occupancy plot. + aida.histogram1D(hit.getDetectorElement().getName()).fill(hit.getIdentifierFieldValue("strip")); + + // Increment hit counts for occupancy calculations. + int[] strips = occupancyMap.get((SiSensor) hit.getDetectorElement()); + strips[hit.getIdentifierFieldValue("strip")] += 1; + } + + // Normalized occupancy plots. + occuPlot.clearRegions(); + int si = 0; + for (SiSensor sensor : occupancyMap.keySet()) { + int[] strips = occupancyMap.get(sensor); + aida.histogram1D(sensor.getName() + " Normalized").reset(); + for (int i = 0; i < strips.length; i++) { + double stripOccupancy = (double) strips[i] / (double) (eventCount + 1); + if (stripOccupancy != 0) { + aida.histogram1D(sensor.getName() + " Normalized").fill(i, stripOccupancy); + } + } + occuPlot.region(si).plot(aida.histogram1D(sensor.getName() + " Normalized")); + ++si; + } + occuPlot.show(); + + // Get Track list from event. This breaks if > 1 Track collections are generated by LCSim. + List<Track> tracks = event.get(Track.class).get(0); + + // Plot number of Tracks. + tkrCountPlot.fill(tracks.size()); + + // Track plots. + for (Track track : tracks) { + aida.cloud1D("Number of Hits per Track").fill(track.getTrackerHits().size()); + tkrMomXPlot.fill(track.getPX()); + tkrMomYPlot.fill(track.getPY()); + tkrMomZPlot.fill(track.getPZ()); + double[] p = track.getMomentum(); + tkrMomPlot.fill(Math.sqrt(p[0] * p[0] + p[1] * p[1] + p[2] * p[2])); + } + + // Number of TrackerHits. + List<TrackerHit> trackerHits = event.get(TrackerHit.class, trackerHitCollectionName); + tkrHitCountPlot.fill(trackerHits.size()); + } + + private void fillEcalPlots(AIDA aida, List<RawCalorimeterHit> hits) { + ecalHitsPlot.fill(hits.size()); + for (RawCalorimeterHit hit : hits) { + ecalTimePlot.fill(hit.getTimeStamp()); + ecalAmplitudePlot.fill(hit.getAmplitude()); + } + } +}
\ No newline at end of file
Use REPLY-ALL to reply to list
To unsubscribe from the LCD-CVS list, click the following link:
https://listserv.slac.stanford.edu/cgi-bin/wa?SUBED1=LCD-CVS&A=1