java/trunk/analysis/src/main/java/org/hps/analysis/dataquality
--- java/trunk/analysis/src/main/java/org/hps/analysis/dataquality/SVTHitMCEfficiency.java 2014-08-28 23:26:58 UTC (rev 924)
+++ java/trunk/analysis/src/main/java/org/hps/analysis/dataquality/SVTHitMCEfficiency.java 2014-08-29 01:29:26 UTC (rev 925)
@@ -1,5 +1,6 @@
package org.hps.analysis.dataquality;
+import hep.aida.IHistogram2D;
import hep.aida.IHistogramFactory;
import hep.aida.IProfile1D;
import java.util.HashMap;
@@ -19,9 +20,9 @@
import org.lcsim.recon.tracking.digitization.sisim.SiTrackerHitStrip1D;
/**
- * DQM driver for the monte carlo SVT hit efficiency
- * April 29 -- first pass, makes the SimTrackerHits-->SiClusters efficiency vs
- * position (with a settable t0 cut)
+ * DQM driver for the monte carlo SVT hit efficiency April 29 -- first pass,
+ * makes the SimTrackerHits-->SiClusters efficiency vs position (with a settable
+ * t0 cut)
*
* @author mgraham on April 29, 2014
*/
@@ -29,19 +30,19 @@
// TODO: Add some quantities for DQM monitoring: e.g. <efficiency>, probably within first 1 cm or so.
public class SVTHitMCEfficiency extends DataQualityMonitor {
- private String rawTrackerHitCollectionName = "SVTRawTrackerHits";
+ private final String rawTrackerHitCollectionName = "SVTRawTrackerHits";
private String helicalTrackHitCollectionName = "HelicalTrackHits";
- private String rotatedTrackHitCollectionName = "RotatedHelicalTrackHits";
- private String fittedTrackerHitCollectionName = "SVTFittedRawTrackerHits";
- private String trackerHitCollectionName = "TrackerHits";
- private String siClusterCollectionName = "StripClusterer_SiTrackerHitStrip1D";
- private String svtTrueHitRelationName = "SVTTrueHitRelations";
- private String trackerName = "Tracker";
+ private final String rotatedTrackHitCollectionName = "RotatedHelicalTrackHits";
+ private final String fittedTrackerHitCollectionName = "SVTFittedRawTrackerHits";
+ private final String trackerHitCollectionName = "TrackerHits";
+ private final String siClusterCollectionName = "StripClusterer_SiTrackerHitStrip1D";
+ private final String svtTrueHitRelationName = "SVTTrueHitRelations";
+ private final String trackerName = "Tracker";
private Detector detector = null;
private double t0Cut = 16.0;
private static final String nameStrip = "Tracker_TestRunModule_";
private List<SiSensor> sensors;
- private String plotDir = "SvtHitMCEfficiency/";
+ private final String plotDir = "SvtHitMCEfficiency/";
private Map<String, Double> avgClusterEffMap;
private Map<String, String> avgClusterEffNames;
@@ -57,7 +58,6 @@
protected void detectorChanged(Detector detector) {
this.detector = detector;
aida.tree().cd("/");
- IHistogramFactory hf = aida.histogramFactory();
// Make a list of SiSensors in the SVT.
sensors = this.detector.getSubdetector(trackerName).getDetectorElement().findDescendants(SiSensor.class);
@@ -66,7 +66,12 @@
//currently, just the Si cluster efficiency
aida.tree().cd("/");
for (int kk = 1; kk < 13; kk++) {
- IProfile1D clEffic = createLayerPlot(plotDir+"clusterEfficiency", kk, 50, 0, 25.);
+ createLayerPlot(plotDir + "clusterEfficiency", kk, 50, -40, 40.);
+ createLayerPlot(plotDir + "readoutEfficiency", kk, 50, -40, 40.);
+ createLayerPlot(plotDir + "rthToClusterEfficiency", kk, 50, -40, 40.);
+ createLayerPlot2D(plotDir + "toogoodFits", kk, 100, -100, 100, 50, 0, 10000);
+ createLayerPlot2D(plotDir + "goodFits", kk, 100, -100, 100, 50, 0, 10000);
+ createLayerPlot2D(plotDir + "badFits", kk, 100, -100, 100, 50, 0, 10000);
}
resetEfficiencyMap();
}
@@ -77,68 +82,110 @@
aida.tree().cd("/");
//make sure the required collections exist
- if (!event.hasCollection(RawTrackerHit.class, rawTrackerHitCollectionName))
+ if (!event.hasCollection(RawTrackerHit.class, rawTrackerHitCollectionName)) {
return;
- if (!event.hasCollection(FittedRawTrackerHit.class, fittedTrackerHitCollectionName))
+ }
+ if (!event.hasCollection(FittedRawTrackerHit.class, fittedTrackerHitCollectionName)) {
return;
+ }
- if (!event.hasCollection(SiTrackerHitStrip1D.class, siClusterCollectionName))
+ if (!event.hasCollection(SiTrackerHitStrip1D.class, siClusterCollectionName)) {
return;
+ }
- if (!event.hasCollection(SimTrackerHit.class, trackerHitCollectionName))
+ if (!event.hasCollection(SimTrackerHit.class, trackerHitCollectionName)) {
return;
+ }
- if (!event.hasCollection(LCRelation.class, svtTrueHitRelationName))
+ if (!event.hasCollection(LCRelation.class, svtTrueHitRelationName)) {
return;
+ }
- RelationalTable mcHittomcP = new BaseRelationalTable(RelationalTable.Mode.MANY_TO_MANY, RelationalTable.Weighting.UNWEIGHTED);
+ RelationalTable mcHittomcP = new BaseRelationalTable(RelationalTable.Mode.MANY_TO_ONE, RelationalTable.Weighting.UNWEIGHTED);
// Get the collections of SimTrackerHits
List<List<SimTrackerHit>> simcols = event.get(SimTrackerHit.class);
// Loop over the SimTrackerHits and fill in the relational table
- for (List<SimTrackerHit> simlist : simcols)
- for (SimTrackerHit simhit : simlist)
- if (simhit.getMCParticle() != null)
+ for (List<SimTrackerHit> simlist : simcols) {
+ for (SimTrackerHit simhit : simlist) {
+ if (simhit.getMCParticle() != null) {
mcHittomcP.add(simhit, simhit.getMCParticle());
+ }
+ }
+ }
+
RelationalTable rawtomc = new BaseRelationalTable(RelationalTable.Mode.MANY_TO_MANY, RelationalTable.Weighting.UNWEIGHTED);
- if (event.hasCollection(LCRelation.class, svtTrueHitRelationName)) {
- List<LCRelation> trueHitRelations = event.get(LCRelation.class, svtTrueHitRelationName);
- for (LCRelation relation : trueHitRelations)
- if (relation != null && relation.getFrom() != null && relation.getTo() != null)
- rawtomc.add(relation.getFrom(), relation.getTo());
+ List<LCRelation> trueHitRelations = event.get(LCRelation.class, svtTrueHitRelationName);
+ for (LCRelation relation : trueHitRelations) {
+ if (relation.getFrom() != null && relation.getTo() != null) {
+ rawtomc.add(relation.getFrom(), relation.getTo());
+ }
}
+
List<SimTrackerHit> simHits = event.get(SimTrackerHit.class, trackerHitCollectionName);
// make relational table for strip clusters to mc particle
List<SiTrackerHitStrip1D> siClusters = event.get(SiTrackerHitStrip1D.class, siClusterCollectionName);
RelationalTable clustertosimhit = new BaseRelationalTable(RelationalTable.Mode.MANY_TO_MANY, RelationalTable.Weighting.UNWEIGHTED);
for (SiTrackerHit cluster : siClusters) {
- List<RawTrackerHit> rawHits = cluster.getRawHits();
- for (RawTrackerHit rth : rawHits) {
+ for (RawTrackerHit rth : cluster.getRawHits()) {
Set<SimTrackerHit> simTrackerHits = rawtomc.allFrom(rth);
- if (simTrackerHits != null)
- for (SimTrackerHit simhit : simTrackerHits)
- clustertosimhit.add(cluster, simhit);
+ if (simTrackerHits != null) {
+ for (SimTrackerHit simhit : simTrackerHits) {
+ if (simhit != null) {
+ clustertosimhit.add(cluster, simhit);
+ }
+ }
+ }
}
}
-//relational tables from mc particle to raw and fitted tracker hits
+
+ //relational tables from raw and fitted tracker hits to sim hit
RelationalTable fittomc = new BaseRelationalTable(RelationalTable.Mode.MANY_TO_MANY, RelationalTable.Weighting.UNWEIGHTED);
List<FittedRawTrackerHit> fittedTrackerHits = event.get(FittedRawTrackerHit.class, fittedTrackerHitCollectionName);
for (FittedRawTrackerHit hit : fittedTrackerHits) {
- RawTrackerHit rth = hit.getRawTrackerHit();
- Set<SimTrackerHit> simTrackerHits = rawtomc.allFrom(rth);
- if (simTrackerHits != null)
- for (SimTrackerHit simhit : simTrackerHits)
- if (simhit.getMCParticle() != null)
- fittomc.add(hit, simhit.getMCParticle());
+ Set<SimTrackerHit> simTrackerHits = rawtomc.allFrom(hit.getRawTrackerHit());
+ for (SimTrackerHit simhit : simTrackerHits) {
+ fittomc.add(hit, simhit);
+ }
}
for (SimTrackerHit simhit : simHits) {
- double wgt = 0.0;
+ Set<FittedRawTrackerHit> fittedRTH = fittomc.allTo(simhit);
+ FittedRawTrackerHit signalHit = null;
+ for (FittedRawTrackerHit frth : fittedRTH) {
+ if (signalHit == null || Math.abs(frth.getT0()) < Math.abs(signalHit.getT0())) {
+ signalHit = frth;
+ }
+ }
+ if (signalHit != null) {
+// System.out.format("chiprob %f, t0 %f, A %f\n", signalHit.getShapeFitParameters().getChiProb(), signalHit.getT0(), signalHit.getAmp());
+ if (signalHit.getShapeFitParameters().getChiProb() > 0.95) {
+ getLayerPlot2D(plotDir + "toogoodFits", simhit.getLayer()).fill(signalHit.getT0(), signalHit.getAmp());
+ } else if (signalHit.getShapeFitParameters().getChiProb() < 0.05) {
+ getLayerPlot2D(plotDir + "badFits", simhit.getLayer()).fill(signalHit.getT0(), signalHit.getAmp());
+ } else {
+ getLayerPlot2D(plotDir + "goodFits", simhit.getLayer()).fill(signalHit.getT0(), signalHit.getAmp());
+ }
+ }
+
+ int gotCluster = 0;
Set<SiTrackerHitStrip1D> clusters = clustertosimhit.allTo(simhit);
- if (clusters != null)
- for (SiTrackerHitStrip1D clust : clusters)
- if (Math.abs(clust.getTime()) < t0Cut)
- wgt = 1.0;
- getLayerPlot(plotDir+"clusterEfficiency", simhit.getLayer()).fill(Math.abs(simhit.getPoint()[1]), wgt);
+ if (clusters != null) {
+ for (SiTrackerHitStrip1D clust : clusters) {
+
+ if (Math.abs(clust.getTime()) < t0Cut) {
+ gotCluster = 1;
+ }
+ }
+ }
+ Set<RawTrackerHit> rawhits = rawtomc.allTo(simhit);
+ int gotRawHit = !rawhits.isEmpty() ? 1 : 0;
+
+ double y = simhit.getDetectorElement().getGeometry().getGlobalToLocal().transformed(simhit.getPositionVec()).x() + 20.0 * Math.signum(simhit.getPoint()[1]) * (simhit.getLayer() % 2 == 0 ? -1 : 1);
+ getLayerPlot(plotDir + "clusterEfficiency", simhit.getLayer()).fill(y, gotCluster);
+ getLayerPlot(plotDir + "readoutEfficiency", simhit.getLayer()).fill(y, gotRawHit);
+ if (gotRawHit == 1) {
+ getLayerPlot(plotDir + "rthToClusterEfficiency", simhit.getLayer()).fill(y, gotCluster);
+ }
}
}
@@ -151,8 +198,8 @@
}
private void resetEfficiencyMap() {
- avgClusterEffMap = new HashMap<>();
- avgClusterEffNames = new HashMap<>();
+ avgClusterEffMap = new HashMap<String, Double>();
+ avgClusterEffNames = new HashMap<String, String>();
for (SiSensor sensor : sensors) {
String effName = "avgClusterEff_" + getNiceSensorName(sensor);
avgClusterEffNames.put(sensor.getName(), effName);
@@ -171,20 +218,29 @@
}
private IProfile1D createLayerPlot(String prefix, int layer, int nchan, double min, double max) {
- IProfile1D hist = aida.profile1D(prefix + "_layer" + layer, nchan, min, max);
- return hist;
+ return aida.profile1D(prefix + "_layer" + layer, nchan, min, max);
}
+ private IHistogram2D getLayerPlot2D(String prefix, int layer) {
+ return aida.histogram2D(prefix + "_layer" + layer);
+ }
+
+ private IHistogram2D createLayerPlot2D(String prefix, int layer, int nx, double minX, double maxX, int ny, double minY, double maxY) {
+ return aida.histogram2D(prefix + "_layer" + layer, nx, minX, maxX, ny, minY, maxY);
+ }
+
@Override
public void printDQMData() {
- for (SiSensor sensor : sensors)
+ for (SiSensor sensor : sensors) {
System.out.println(avgClusterEffNames.get(sensor.getName()) + ": " + avgClusterEffMap.get(sensor.getName()));
+ }
}
@Override
public void printDQMStrings() {
- for (SiSensor sensor : sensors)
- System.out.println("ALTER TABLE dqm ADD "+avgClusterEffNames.get(sensor.getName())+" double;");
+ for (SiSensor sensor : sensors) {
+ System.out.println("ALTER TABLE dqm ADD " + avgClusterEffNames.get(sensor.getName()) + " double;");
+ }
}
}
java/trunk/analysis/src/main/java/org/hps/analysis/dataquality
--- java/trunk/analysis/src/main/java/org/hps/analysis/dataquality/SvtMonitoring.java 2014-08-28 23:26:58 UTC (rev 924)
+++ java/trunk/analysis/src/main/java/org/hps/analysis/dataquality/SvtMonitoring.java 2014-08-29 01:29:26 UTC (rev 925)
@@ -39,7 +39,7 @@
private String trackerHitCollectionName = "StripClusterer_SiTrackerHitStrip1D";
private Detector detector = null;
private IPlotter plotter;
- private String trackerName = "Tracker";
+ private final String trackerName = "Tracker";
private List<SiSensor> sensors;
private Map<String, int[]> occupancyMap;
private Map<String, Double> avgOccupancyMap;
@@ -53,7 +53,7 @@
private int eventCountCluster = 0;
private static final String nameStrip = "Tracker_TestRunModule_";
private static final int maxChannels = 640;
- private String plotDir = "SvtMonitoring/";
+ private final String plotDir = "SvtMonitoring/";
public void setRawTrackerHitCollectionName(String inputCollection) {
this.rawTrackerHitCollectionName = inputCollection;
@@ -67,6 +67,7 @@
this.trackerHitCollectionName = inputCollection;
}
+ @Override
protected void detectorChanged(Detector detector) {
System.out.println("SvtMonitoring::detectorChanged Setting up the plotter");
this.detector = detector;
@@ -99,7 +100,7 @@
public void process(EventHeader event) {
/* increment the strip occupancy arrays */
if (event.hasCollection(RawTrackerHit.class, rawTrackerHitCollectionName)) {
- System.out.println("Found a raw hit collection");
+// System.out.println("Found a raw hit collection");
List<RawTrackerHit> rawTrackerHits = event.get(RawTrackerHit.class, rawTrackerHitCollectionName);
for (RawTrackerHit hit : rawTrackerHits) {
int[] strips = occupancyMap.get(hit.getDetectorElement().getName());
@@ -115,10 +116,9 @@
GenericObject pars = (GenericObject) hit.getTo();
String sensorName = getNiceSensorName((SiSensor) rth.getDetectorElement());
//this is a clever way to get the parameters we want from the generic object
- ShapeFitParameters sfp = new ShapeFitParameters();
- double t0 = sfp.getT0(pars);
- double amp = sfp.getAmp(pars);
- double chiProb = sfp.getChiProb(pars);
+ double t0 = ShapeFitParameters.getT0(pars);
+ double amp = ShapeFitParameters.getAmp(pars);
+ double chiProb = ShapeFitParameters.getChiProb(pars);
getSensorPlot(plotDir + "t0Hit_", sensorName).fill(t0);
getSensorPlot(plotDir + "amplitude_", sensorName).fill(amp);
getSensorPlot(plotDir + "chiProb_", sensorName).fill(chiProb);
@@ -127,7 +127,7 @@
}
if (event.hasItem(trackerHitCollectionName)) {
- System.out.println("Found a Si cluster collection");
+// System.out.println("Found a Si cluster collection");
List<TrackerHit> siClusters = (List<TrackerHit>) event.get(trackerHitCollectionName);
for (TrackerHit cluster : siClusters) {
String sensorName = getNiceSensorName((SiSensor) ((RawTrackerHit) cluster.getRawHits().get(0)).getDetectorElement());
@@ -161,13 +161,13 @@
}
private void resetOccupancyMap() {
- occupancyMap = new HashMap<>();
- avgOccupancyMap = new HashMap<>();
- avgOccupancyNames = new HashMap<>();
- avgt0Names = new HashMap<>();
- sigt0Names = new HashMap<>();
- avgt0Map = new HashMap<>();
- sigt0Map = new HashMap<>();
+ occupancyMap = new HashMap<String, int[]>();
+ avgOccupancyMap = new HashMap<String, Double>();
+ avgOccupancyNames = new HashMap<String, String>();
+ avgt0Names = new HashMap<String, String>();
+ sigt0Names = new HashMap<String, String>();
+ avgt0Map = new HashMap<String, Double>();
+ sigt0Map = new HashMap<String, Double>();
for (SiSensor sensor : sensors) {
occupancyMap.put(sensor.getName(), new int[640]);
avgOccupancyMap.put(sensor.getName(), -999.);