hps-java/src/main/java/org/lcsim/hps/monitoring/svt
diff -N SVTHitRecoCorrelations.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ SVTHitRecoCorrelations.java 10 May 2012 18:13:48 -0000 1.1
@@ -0,0 +1,292 @@
+package org.lcsim.hps.monitoring.svt;
+
+import hep.aida.*;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import org.lcsim.detector.identifier.IIdentifier;
+import org.lcsim.detector.identifier.IIdentifierHelper;
+import org.lcsim.detector.tracker.silicon.SiSensor;
+import org.lcsim.event.EventHeader;
+import org.lcsim.event.RawTrackerHit;
+import org.lcsim.geometry.Detector;
+import org.lcsim.hps.monitoring.AIDAFrame;
+import org.lcsim.hps.monitoring.Resettable;
+import org.lcsim.hps.recon.tracking.HPSFittedRawTrackerHit;
+import org.lcsim.hps.recon.tracking.HPSSVTCalibrationConstants;
+import org.lcsim.recon.tracking.digitization.sisim.SiTrackerHitStrip1D;
+import org.lcsim.util.Driver;
+import org.lcsim.util.aida.AIDA;
+
+/**
+ *
+ * @author mgraham
+ */
+public class SVTHitRecoCorrelations extends Driver implements Resettable {
+
+ private AIDAFrame plotterFrame;
+ private List<IPlotter> plotters = new ArrayList<IPlotter>();
+ private AIDA aida = AIDA.defaultInstance();
+ private String rawTrackerHitCollectionName = "SVTRawTrackerHits";
+ private String fittedTrackerHitCollectionName = "SVTFittedRawTrackerHits";
+ private String trackerHitCollectionName = "StripClusterer_SiTrackerHitStrip1D";
+ private String trackerName = "Tracker";
+ private int eventCount;
+ private List<SiSensor> sensors;
+ IPlotter plotter;
+ IPlotter plotter2;
+ IPlotter plotter3;
+ IPlotter plotter4;
+ IPlotter plotter5;
+ private Map<String, Integer> sensorRegionMap;
+ private String outputPlots = null;
+
+ protected void detectorChanged(Detector detector) {
+ plotterFrame = new AIDAFrame();
+ plotterFrame.setTitle("HPS SVT Hit Reconstruction Correlation Plots");
+
+ aida.tree().cd("/");
+
+
+ sensors = detector.getSubdetector(trackerName).getDetectorElement().findDescendants(SiSensor.class);
+
+ // 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);
+// }
+
+ IAnalysisFactory fac = aida.analysisFactory();
+ plotter = fac.createPlotterFactory().create("Axial hits");
+ plotter.setTitle("Axial hits top");
+ plotterFrame.addPlotter(plotter);
+ plotters.add(plotter);
+ IPlotterStyle style = plotter.style();
+ style.dataStyle().fillStyle().setColor("yellow");
+ style.dataStyle().errorBarStyle().setVisible(false);
+ plotter.createRegions(5, 5);
+
+ plotter2 = fac.createPlotterFactory().create("Stereo hits");
+ plotter2.setTitle("Stereo hits top");
+ plotterFrame.addPlotter(plotter2);
+ plotters.add(plotter2);
+ IPlotterStyle style2 = plotter2.style();
+ style2.dataStyle().fillStyle().setColor("yellow");
+ style2.dataStyle().errorBarStyle().setVisible(false);
+ plotter2.createRegions(5, 5);
+
+
+
+ for (SiSensor ref_sensor : sensors) {
+ int ref_l = getLayer(ref_sensor);
+ int ref_s = getSide(ref_sensor);
+ boolean ref_a = isAxial(ref_sensor);
+ ref_l = getPhysLayer(ref_l,ref_a);
+
+
+ //if (!ref_a) continue;
+ //if (ref_s == 1 ) continue; //only top for now
+
+ for (SiSensor sensor : sensors) {
+ int l = getLayer(sensor);
+ int s = getSide(sensor);
+ boolean a = isAxial(sensor);
+
+ l = getPhysLayer(l,a);
+
+
+ //correlation with same side and axial/stereo
+
+ if ( ref_a == a && ref_s == s ) {
+
+ if(s == 0 && a ) {
+ IHistogram2D corPlot = aida.histogram2D("corr_TA_layer" + ref_l + "_layer" + l, 60, 10, 60.0, 60, 10, 60.0);
+ int region = (ref_l-1) + (l-1)*5;
+ //System.out.println("ref_l " + ref_l + " l " + l + " ---> " + region);
+ plotter.region(region).plot(corPlot);
+ }
+ if(s == 0 && !a ) {
+ IHistogram2D corPlot = aida.histogram2D("corr_TS_layer" + ref_l + "_layer" + l, 60, 10, 60.0, 60, 10, 60.0);
+ int region = (ref_l-1) + (l-1)*5;
+ //System.out.println("ref_l " + ref_l + " l " + l + " ---> " + region);
+ plotter2.region(region).plot(corPlot);
+ }
+
+ }
+
+ }
+ }
+
+ plotterFrame.pack();
+ plotterFrame.setVisible(true);
+ }
+
+ public SVTHitRecoCorrelations() {
+ }
+
+ public void setOutputPlots(String output) {
+ this.outputPlots = output;
+ }
+
+ public void setRawTrackerHitCollectionName(String rawTrackerHitCollectionName) {
+ this.rawTrackerHitCollectionName = rawTrackerHitCollectionName;
+ }
+
+ public void setFittedTrackerHitCollectionName(String fittedTrackerHitCollectionName) {
+ this.fittedTrackerHitCollectionName = fittedTrackerHitCollectionName;
+ }
+
+ public void setTrackerHitCollectionName(String trackerHitCollectionName) {
+ this.trackerHitCollectionName = trackerHitCollectionName;
+ }
+
+ public void process(EventHeader event) {
+//
+// if (!event.hasCollection(RawTrackerHit.class, rawTrackerHitCollectionName)) {
+// System.out.println(rawTrackerHitCollectionName + " does not exist; skipping event");
+// int ns = sensors.size();
+// for (int i = 0; i < ns; i++) {
+// aida.histogram1D(sensors.get(i).getName() + "_raw_hits").fill(0);
+// aida.histogram1D(sensors.get(i).getName() + "_reco_hits").fill(0);
+// }
+//
+// return;
+// }
+//
+// if (!event.hasCollection(HPSFittedRawTrackerHit.class, fittedTrackerHitCollectionName)) {
+// System.out.println(fittedTrackerHitCollectionName + " does not exist; skipping event");
+// int ns = sensors.size();
+// for (int i = 0; i < ns; i++) {
+// int nraw = sensors.get(i).getReadout().getHits(RawTrackerHit.class).size();
+// aida.histogram1D(sensors.get(i).getName() + "_raw_hits").fill(nraw);
+// aida.histogram1D(sensors.get(i).getName() + "_reco_hits").fill(0);
+// }
+// return;
+// }
+//
+
+ if (!HPSSVTCalibrationConstants.calibrationLoaded()) {
+ HPSSVTCalibrationConstants.loadCalibrationConstants();
+ }
+ ++eventCount;
+// List<RawTrackerHit> rawHits = event.get(RawTrackerHit.class, rawTrackerHitCollectionName);
+// List<HPSFittedRawTrackerHit> fittedrawHits = event.get(HPSFittedRawTrackerHit.class, fittedTrackerHitCollectionName);
+ List<SiTrackerHitStrip1D> stripHits = event.get(SiTrackerHitStrip1D.class, trackerHitCollectionName);
+// for (HPSFittedRawTrackerHit hrth : fittedrawHits) {
+// double fittedAmp = hrth.getAmp();
+// double fittedT0 = hrth.getT0();
+// String sensorName = hrth.getRawTrackerHit().getDetectorElement().getName();
+// aida.histogram1D(sensorName + "_timing").fill(fittedT0);
+// aida.histogram1D(sensorName + "_amplitude").fill(fittedAmp);
+// }
+// for (SiSensor sensor : sensors) {
+// String sensorName = sensor.getName();
+// int nraw = sensor.getReadout().getHits(RawTrackerHit.class).size();
+// int nreco = sensor.getReadout().getHits(HPSFittedRawTrackerHit.class).size();
+// aida.histogram1D(sensorName + "_raw_hits").fill(nraw);
+// aida.histogram1D(sensorName + "_reco_hits").fill(nreco);
+// }
+ for (SiTrackerHitStrip1D ref_cluster : stripHits) {
+ SiSensor ref_sensor = ref_cluster.getSensor();
+ boolean ref_a = isAxial(ref_sensor);
+ int ref_side = getSide(ref_sensor);
+ int ref_l = getLayer(ref_sensor);
+ ref_l = getPhysLayer(ref_l,ref_a);
+
+ for (SiTrackerHitStrip1D cluster : stripHits) {
+ SiSensor sensor = cluster.getSensor();
+ boolean a = isAxial(sensor);
+ int side = getSide(sensor);
+ if (ref_a==a && ref_side==side) {
+ int l = getLayer(sensor);
+ l = getPhysLayer(l,a);
+
+
+ //int clusterSize = cluster.getRawHits().size();
+ //Move this to strip nr?
+ if( side == 0 && a) {
+ aida.histogram2D("corr_TA_layer" + ref_l + "_layer" + l).fill(ref_cluster.getPosition()[1],cluster.getPosition()[1]);
+ }
+ if( side == 0 && !a) {
+ aida.histogram2D("corr_TS_layer" + ref_l + "_layer" + l).fill(ref_cluster.getPosition()[1],cluster.getPosition()[1]);
+
+ }
+ }
+ }
+ }
+
+ }
+
+ public void endOfData() {
+ if (outputPlots != null)
+ try {
+ aida.saveAs(outputPlots);
+ } catch (IOException ex) {
+ Logger.getLogger(SVTHitRecoCorrelations.class.getName()).log(Level.SEVERE, null, ex);
+ }
+ plotterFrame.dispose();
+ }
+
+ @Override
+ public void reset() {
+ int ns = sensors.size();
+ for (int i = 0; i < 5; i++) {
+ for (int ii = 0; ii < 5; ii++) {
+ aida.histogram2D("corr_TA_layer" + (i+1) + "_layer" + (ii+1)).reset();
+ aida.histogram2D("corr_TS_layer" + (i+1) + "_layer" + (ii+1)).reset();
+ }
+ }
+
+ }
+
+
+ private int getPhysLayer(int l,boolean axial) {
+ if(axial) {
+ l = (l+1)/2;
+ } else {
+ l = l/2;
+ }
+ return l;
+ }
+
+ private int[] getSideAndLayer(SiSensor 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
+ int v[] = {module,layer};
+ return v;
+
+
+ }
+
+ private int getSide(SiSensor sensor) {
+ int v[] = getSideAndLayer(sensor);
+ return v[0];
+
+ }
+
+ private int getLayer(SiSensor sensor) {
+ int v[] = getSideAndLayer(sensor);
+ return v[1];
+
+ }
+
+ private boolean isAxial(SiSensor sensor) {
+ int v[] = getSideAndLayer(sensor);
+ int layer = v[1];
+ if ( layer % 2 == 0 ) return false;
+ else return true;
+ }
+
+
+
+
+
+}