Author: [log in to unmask]
Date: Thu Jun 11 15:46:51 2015
New Revision: 3141
Log:
Plots, Plots, Plots, Plots Beer
Modified:
java/trunk/users/src/main/java/org/hps/users/omoreno/SvtTrackAnalysis.java
Modified: java/trunk/users/src/main/java/org/hps/users/omoreno/SvtTrackAnalysis.java
=============================================================================
--- java/trunk/users/src/main/java/org/hps/users/omoreno/SvtTrackAnalysis.java (original)
+++ java/trunk/users/src/main/java/org/hps/users/omoreno/SvtTrackAnalysis.java Thu Jun 11 15:46:51 2015
@@ -1,8 +1,10 @@
package org.hps.users.omoreno;
+import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
+import java.util.Set;
import hep.aida.IAnalysisFactory;
import hep.aida.IHistogramFactory;
@@ -10,12 +12,20 @@
import hep.aida.IPlotter;
import hep.aida.IHistogram1D;
import hep.aida.ITree;
-
+import hep.aida.ref.rootwriter.RootFileStore;
+
+import org.lcsim.detector.tracker.silicon.HpsSiSensor;
import org.lcsim.event.EventHeader;
+import org.lcsim.event.LCRelation;
+import org.lcsim.event.RawTrackerHit;
+import org.lcsim.event.RelationalTable;
import org.lcsim.event.Track;
+import org.lcsim.event.TrackerHit;
+import org.lcsim.event.base.BaseRelationalTable;
import org.lcsim.geometry.Detector;
import org.lcsim.util.Driver;
+import org.hps.recon.tracking.FittedRawTrackerHit;
import org.hps.recon.tracking.TrackUtils;
/**
@@ -35,11 +45,25 @@
IHistogramFactory histogramFactory;
IPlotterFactory plotterFactory = IAnalysisFactory.create().createPlotterFactory();
protected Map<String, IPlotter> plotters = new HashMap<String, IPlotter>();
-
- private Map<String, IHistogram1D> trackParameterPlots = new HashMap<String, IHistogram1D>();
-
+ private Map<String, IHistogram1D> trackPlots = new HashMap<String, IHistogram1D>();
+ private Map<String, IHistogram1D> clusterChargePlots = new HashMap<String, IHistogram1D>();
+ private Map<String, IHistogram1D> clusterSizePlots = new HashMap<String, IHistogram1D>();
+
+ private List<HpsSiSensor> sensors;
+ private Map<RawTrackerHit, LCRelation> fittedRawTrackerHitMap
+ = new HashMap<RawTrackerHit, LCRelation>();
+
+ // Detector name
+ private static final String SUBDETECTOR_NAME = "Tracker";
+
+ // Collections
private String trackCollectionName = "MatchedTracks";
-
+ private String stereoHitRelationsColName = "HelicalTrackHitRelations";
+ private String fittedHitsCollectionName = "SVTFittedRawTrackerHits";
+ private String rotatedHthRelationsColName = "RotatedHelicalTrackHitRelations";
+
+ private int runNumber = -1;
+
int npositive = 0;
int nnegative = 0;
double ntracks = 0;
@@ -47,40 +71,129 @@
double ntracksBottom = 0;
double nTwoTracks = 0;
double nevents = 0;
-
-
+
+ double d0Cut = -9999;
+
+ // Flags
+ boolean electronCut = false;
+ boolean positronCut = false;
+
/**
* Default Constructor
*/
public SvtTrackAnalysis(){
}
-
+
+ public void setEnableElectronCut(boolean electronCut) {
+ this.electronCut = electronCut;
+ }
+
+ public void setEnablePositronCut(boolean positronCut) {
+ this.positronCut = positronCut;
+ }
+
+ public void setD0Cut(double d0Cut) {
+ this.d0Cut = d0Cut;
+ }
+
+ private int computePlotterRegion(HpsSiSensor sensor) {
+
+ 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){
tree = IAnalysisFactory.create().createTreeFactory().create();
histogramFactory = IAnalysisFactory.create().createHistogramFactory(tree);
+
+ // Get the HpsSiSensor objects from the tracker detector element
+ sensors = detector.getSubdetector(SUBDETECTOR_NAME)
+ .getDetectorElement().findDescendants(HpsSiSensor.class);
+
+ // If the detector element had no sensors associated with it, throw
+ // an exception
+ if (sensors.size() == 0) {
+ throw new RuntimeException("No sensors were found in this detector.");
+ }
+
+ plotters.put("Event Information", plotterFactory.create("Event information"));
+ plotters.get("Event Information").createRegions(2, 3);
+
+ trackPlots.put("Number of tracks", histogramFactory.createHistogram1D("Number of tracks", 10, 0, 10));
+ plotters.get("Event Information").region(0).plot(trackPlots.get("Number of tracks"));
+
+ trackPlots.put("Track charge", histogramFactory.createHistogram1D("Track charge", 3, -1, 2));
+ plotters.get("Event Information").region(1).plot(trackPlots.get("Track charge"));
+
+ trackPlots.put("chi2", histogramFactory.createHistogram1D("chi2", 40, 0, 40));
+ plotters.get("Event Information").region(2).plot(trackPlots.get("chi2"));
plotters.put("Track Parameters", plotterFactory.create("Track Parameters"));
- plotters.get("Track Parameters").createRegions(2, 3);
-
- trackParameterPlots.put("DOCA", histogramFactory.createHistogram1D("DOCA", 80, -80, 80));
- plotters.get("Track Parameters").region(0).plot(trackParameterPlots.get("DOCA"));
+ plotters.get("Track Parameters").createRegions(3, 3);
+
+ trackPlots.put("doca", histogramFactory.createHistogram1D("doca", 80, -10, 10));
+ plotters.get("Track Parameters").region(0).plot(trackPlots.get("doca"));
- trackParameterPlots.put("Z0", histogramFactory.createHistogram1D("Z0", 30, -30, 30));
- plotters.get("Track Parameters").region(1).plot(trackParameterPlots.get("Z0"));
-
- trackParameterPlots.put("phi0", histogramFactory.createHistogram1D("phi0", 50, -0.5, 0.5));
- plotters.get("Track Parameters").region(2).plot(trackParameterPlots.get("phi0"));
+ trackPlots.put("z0", histogramFactory.createHistogram1D("z0", 80, -2, 2));
+ plotters.get("Track Parameters").region(1).plot(trackPlots.get("z0"));
+
+ trackPlots.put("sin(phi0)", histogramFactory.createHistogram1D("sin(phi0)", 40, -0.2, 0.2));
+ plotters.get("Track Parameters").region(2).plot(trackPlots.get("sin(phi0)"));
- trackParameterPlots.put("Curvature", histogramFactory.createHistogram1D("Curvature", 200, -1, 1));
- plotters.get("Track Parameters").region(3).plot(trackParameterPlots.get("Curvature"));
-
- trackParameterPlots.put("Tan(Lambda)", histogramFactory.createHistogram1D("Tan(Lambda)", 100, -1, 1));
- plotters.get("Track Parameters").region(4).plot(trackParameterPlots.get("Tan(Lambda)"));
-
- trackParameterPlots.put("Chi2", histogramFactory.createHistogram1D("Chi2", 100, 0, 100));
- plotters.get("Track Parameters").region(5).plot(trackParameterPlots.get("Chi2"));
-
+ trackPlots.put("curvature", histogramFactory.createHistogram1D("curvature", 50, -0.001, 0.001));
+ plotters.get("Track Parameters").region(3).plot(trackPlots.get("curvature"));
+
+ trackPlots.put("tan_lambda", histogramFactory.createHistogram1D("tan_lambda", 100, -0.1, 0.1));
+ plotters.get("Track Parameters").region(4).plot(trackPlots.get("tan_lambda"));
+
+ trackPlots.put("cos(theta)", histogramFactory.createHistogram1D("cos(theta)", 40, -0.1, 0.1));
+ plotters.get("Track Parameters").region(5).plot(trackPlots.get("cos(theta)"));
+
+ trackPlots.put("cluster time dt", histogramFactory.createHistogram1D("cluster time dt", 100, -20, 20));
+ plotters.get("Track Parameters").region(6).plot(trackPlots.get("cluster time dt"));
+
+ plotters.put("Cluster Amplitude", plotterFactory.create("Cluster Amplitude"));
+ plotters.get("Cluster Amplitude").createRegions(6, 6);
+
+ plotters.put("Cluster Size", plotterFactory.create("Cluster Size"));
+ plotters.get("Cluster Size").createRegions(6, 6);
+
+
+ for (HpsSiSensor sensor : sensors) {
+
+ clusterChargePlots.put(sensor.getName(),
+ histogramFactory.createHistogram1D(sensor.getName() + " - Cluster Charge", 100, 0, 5000));
+ plotters.get("Cluster Amplitude").region(this.computePlotterRegion(sensor))
+ .plot(clusterChargePlots.get(sensor.getName()));
+
+ clusterSizePlots.put(sensor.getName(),
+ histogramFactory.createHistogram1D(sensor.getName() + " - Cluster Size", 10, 0, 10));
+ plotters.get("Cluster Size").region(this.computePlotterRegion(sensor))
+ .plot(clusterSizePlots.get(sensor.getName()));
+
+ }
//--- Track Extrapolation ---//
//---------------------------//
@@ -99,29 +212,29 @@
plotters.get(nPlotters).style().statisticsBoxStyle().setVisible(false);
nPlotters++;
- plotters.add(aida.analysisFactory().createPlotterFactory().create("Track Position at Ecal: Curvature < 0"));
- plotters.get(nPlotters).region(0).plot(aida.histogram2D("Track Position at Ecal: Curvature < 0",200, -350, 350, 200, -100, 100));
- plotters.get(nPlotters).region(0).style().setParameter("hist2DStyle", "colorMap");
- plotters.get(nPlotters).region(0).style().dataStyle().fillStyle().setParameter("colorMapScheme", "rainbow");
- plotters.get(nPlotters).style().statisticsBoxStyle().setVisible(false);
- nPlotters++;
-
- plotters.add(aida.analysisFactory().createPlotterFactory().create("Track Position at Harp: Curvature < 0"));
- plotters.get(nPlotters).region(0).plot(aida.histogram2D("Track Position at Harp: Curvature < 0", 200, -200, 200, 100, -50, 50));
- plotters.get(nPlotters).region(0).style().setParameter("hist2DStyle", "colorMap");
- plotters.get(nPlotters).region(0).style().dataStyle().fillStyle().setParameter("colorMapScheme", "rainbow");
- plotters.get(nPlotters).style().statisticsBoxStyle().setVisible(false);
- nPlotters++;
-
- plotters.add(aida.analysisFactory().createPlotterFactory().create("Track Position at Ecal: Curvature > 0"));
- plotters.get(nPlotters).region(0).plot(aida.histogram2D("Track Position at Ecal: Curvature > 0", 200, -350, 350, 200, -100, 100));
- plotters.get(nPlotters).region(0).style().setParameter("hist2DStyle", "colorMap");
- plotters.get(nPlotters).region(0).style().dataStyle().fillStyle().setParameter("colorMapScheme", "rainbow");
- plotters.get(nPlotters).style().statisticsBoxStyle().setVisible(false);
- nPlotters++;
-
- plotters.add(aida.analysisFactory().createPlotterFactory().create("Track Position at Harp: Curvature > 0"));
- plotters.get(nPlotters).region(0).plot(aida.histogram2D("Track Position at Harp: Curvature > 0", 200, -200, 200, 100, -50, 50));
+ plotters.add(aida.analysisFactory().createPlotterFactory().create("Track Position at Ecal: curvature < 0"));
+ plotters.get(nPlotters).region(0).plot(aida.histogram2D("Track Position at Ecal: curvature < 0",200, -350, 350, 200, -100, 100));
+ plotters.get(nPlotters).region(0).style().setParameter("hist2DStyle", "colorMap");
+ plotters.get(nPlotters).region(0).style().dataStyle().fillStyle().setParameter("colorMapScheme", "rainbow");
+ plotters.get(nPlotters).style().statisticsBoxStyle().setVisible(false);
+ nPlotters++;
+
+ plotters.add(aida.analysisFactory().createPlotterFactory().create("Track Position at Harp: curvature < 0"));
+ plotters.get(nPlotters).region(0).plot(aida.histogram2D("Track Position at Harp: curvature < 0", 200, -200, 200, 100, -50, 50));
+ plotters.get(nPlotters).region(0).style().setParameter("hist2DStyle", "colorMap");
+ plotters.get(nPlotters).region(0).style().dataStyle().fillStyle().setParameter("colorMapScheme", "rainbow");
+ plotters.get(nPlotters).style().statisticsBoxStyle().setVisible(false);
+ nPlotters++;
+
+ plotters.add(aida.analysisFactory().createPlotterFactory().create("Track Position at Ecal: curvature > 0"));
+ plotters.get(nPlotters).region(0).plot(aida.histogram2D("Track Position at Ecal: curvature > 0", 200, -350, 350, 200, -100, 100));
+ plotters.get(nPlotters).region(0).style().setParameter("hist2DStyle", "colorMap");
+ plotters.get(nPlotters).region(0).style().dataStyle().fillStyle().setParameter("colorMapScheme", "rainbow");
+ plotters.get(nPlotters).style().statisticsBoxStyle().setVisible(false);
+ nPlotters++;
+
+ plotters.add(aida.analysisFactory().createPlotterFactory().create("Track Position at Harp: curvature > 0"));
+ plotters.get(nPlotters).region(0).plot(aida.histogram2D("Track Position at Harp: curvature > 0", 200, -200, 200, 100, -50, 50));
plotters.get(nPlotters).region(0).style().setParameter("hist2DStyle", "colorMap");
plotters.get(nPlotters).region(0).style().dataStyle().fillStyle().setParameter("colorMapScheme", "rainbow");
plotters.get(nPlotters).style().statisticsBoxStyle().setVisible(false);
@@ -232,48 +345,147 @@
}
}
- public void process(EventHeader event){
+ @SuppressWarnings({ "unchecked", "rawtypes" })
+ public void process(EventHeader event){
nevents++;
-
- /*
- if(event.hasCollection(SiTrackerHitStrip1D.class, stripHitCollectionName)){
-
- System.out.println("Found Strip Hits!");
- List<SiTrackerHitStrip1D> stripHits = event.get(SiTrackerHitStrip1D.class, stripHitCollectionName);
- short[] samples = new short[6];
- for(SiTrackerHitStrip1D stripHit : stripHits){
- for(RawTrackerHit rawHit : stripHit.getRawHits()){
- for(int index = 0; index < samples.length; index++){
- samples[index] += rawHit.getADCValues()[index];
- }
- }
- }
- }*/
+
+ // Get the run number from the event
+ if (runNumber == -1) runNumber = event.getRunNumber();
// If the event doesn't have any tracks, skip it
if(!event.hasCollection(Track.class, trackCollectionName)) return;
// Get the collection of tracks from the event
List<Track> tracks = event.get(Track.class, trackCollectionName);
+
+ // Get the collection of LCRelations between a stereo hit and the strips making it up
+ List<LCRelation> stereoHitRelations = event.get(LCRelation.class, stereoHitRelationsColName);
+ BaseRelationalTable stereoHitToClusters = new BaseRelationalTable(RelationalTable.Mode.MANY_TO_MANY, RelationalTable.Weighting.UNWEIGHTED);
+ for (LCRelation relation : stereoHitRelations) {
+ if (relation != null && relation.getFrom() != null && relation.getTo() != null) {
+ stereoHitToClusters.add(relation.getFrom(), relation.getTo());
+ }
+ }
+
+ // Get the collection of LCRelations relating RotatedHelicalTrackHits to
+ // HelicalTrackHits
+ List<LCRelation> rotatedHthToHthRelations = event.get(LCRelation.class, rotatedHthRelationsColName);
+ BaseRelationalTable hthToRotatedHth = new BaseRelationalTable(RelationalTable.Mode.ONE_TO_ONE, RelationalTable.Weighting.UNWEIGHTED);
+ for (LCRelation relation : rotatedHthToHthRelations) {
+ if (relation != null && relation.getFrom() != null && relation.getTo() != null) {
+ hthToRotatedHth.add(relation.getFrom(), relation.getTo());
+ }
+ }
+
+ // Get the list of fitted hits from the event
+ List<LCRelation> fittedHits = event.get(LCRelation.class, fittedHitsCollectionName);
+
+ // Map the fitted hits to their corresponding raw hits
+ this.mapFittedRawHits(fittedHits);
+
+ trackPlots.get("Number of tracks").fill(tracks.size());
+
+ // Loop over all of the tracks in the event
+ for(Track track : tracks){
+
+ if (TrackUtils.getR(track) < 0 && electronCut) continue;
+
+ if (TrackUtils.getR(track) > 0 && positronCut) continue;
+
+ if (d0Cut != -9999 && Math.abs(TrackUtils.getDoca(track)) < d0Cut) continue;
+
+ trackPlots.get("Track charge").fill(TrackUtils.getR(track), 1);
- /*
- Map<Hep3Vector,Track> trackToEcalPosition = new HashMap<Hep3Vector, Track>();
- Map<Track, Cluster> trackToCluster = new HashMap<Track, Cluster>();
- List<Hep3Vector> ecalPos = new ArrayList<Hep3Vector>();
- */
-
- for(Track track : tracks){
-
- trackParameterPlots.get("DOCA").fill(TrackUtils.getDoca(track));
- trackParameterPlots.get("Z0").fill(TrackUtils.getZ0(track));
- trackParameterPlots.get("phi0").fill(TrackUtils.getPhi0(track));
- trackParameterPlots.get("Curvature").fill(TrackUtils.getR(track));
- trackParameterPlots.get("Tan(Lambda)").fill(TrackUtils.getTanLambda(track));
- trackParameterPlots.get("Chi2").fill(track.getChi2());
-
- }
+ // Fill the track parameter plots
+ trackPlots.get("doca").fill(TrackUtils.getDoca(track));
+ trackPlots.get("z0").fill(TrackUtils.getZ0(track));
+ trackPlots.get("sin(phi0)").fill(TrackUtils.getPhi0(track));
+ trackPlots.get("curvature").fill(TrackUtils.getR(track));
+ trackPlots.get("tan_lambda").fill(TrackUtils.getTanLambda(track));
+ trackPlots.get("cos(theta)").fill(TrackUtils.getCosTheta(track));
+ trackPlots.get("chi2").fill(track.getChi2());
+
+ for (TrackerHit rotatedStereoHit : track.getTrackerHits()) {
+
+ // Get the HelicalTrackHit corresponding to the RotatedHelicalTrackHit
+ // associated with a track
+ Set<TrackerHit> clusters = stereoHitToClusters.allFrom(hthToRotatedHth.from(rotatedStereoHit));
+
+ int clusterIndex = 0;
+ double clusterTimeDt = 0;
+ for (TrackerHit cluster : clusters) {
+
+ if (clusterIndex == 0) {
+ clusterTimeDt += cluster.getTime();
+ clusterIndex++;
+ } else {
+ clusterTimeDt -= cluster.getTime();
+ }
+
+ double amplitude = 0;
+ HpsSiSensor sensor = null;
+ for (Object rawHitObject : cluster.getRawHits()) {
+ RawTrackerHit rawHit = (RawTrackerHit) rawHitObject;
+
+ sensor = (HpsSiSensor) rawHit.getDetectorElement();
+
+ // Get the channel of the raw hit
+ //int channel = rawHit.getIdentifierFieldValue("strip");
+
+ // Add the amplitude of that channel to the total amplitude
+ amplitude += FittedRawTrackerHit.getAmp(this.getFittedHit(rawHit));
+ }
+
+ clusterChargePlots.get(sensor.getName()).fill(amplitude);
+ clusterSizePlots.get(sensor.getName()).fill(cluster.getRawHits().size());
+ }
+
+ trackPlots.get("cluster time dt").fill(clusterTimeDt);
+ }
+ }
+ }
+
+ public void endOfData() {
+
+ String rootFile = "run" + runNumber + "_track_analysis.root";
+ RootFileStore store = new RootFileStore(rootFile);
+ try {
+ store.open();
+ store.add(tree);
+ store.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ /**
+ * Method that creates a map between a fitted raw hit and it's corresponding raw fit
+ *
+ * @param fittedHits : List of fitted hits to map
+ */
+ private void mapFittedRawHits(List<LCRelation> fittedHits) {
+
+ // Clear the fitted raw hit map of old values
+ fittedRawTrackerHitMap.clear();
+
+ // Loop through all fitted hits and map them to their corresponding raw hits
+ for (LCRelation fittedHit : fittedHits) {
+ fittedRawTrackerHitMap.put(FittedRawTrackerHit.getRawTrackerHit(fittedHit), fittedHit);
+ }
+ }
+
+ /**
+ *
+ * @param rawHit
+ * @return
+ */
+ private LCRelation getFittedHit(RawTrackerHit rawHit) {
+ return fittedRawTrackerHitMap.get(rawHit);
}
}
+
+
+
/*
ntracks++;
@@ -296,15 +508,15 @@
aida.histogram1D("ChiSquared").fill(track.getChi2());
if(Math.signum(TrackUtils.getR(track)) < 0){
- aida.histogram2D("Track Position at Ecal: Curvature < 0").fill(positionEcal.y(), positionEcal.z());
- aida.histogram2D("Track Position at Harp: Curvature < 0").fill(positionConverter.y(), positionConverter.z());
+ aida.histogram2D("Track Position at Ecal: curvature < 0").fill(positionEcal.y(), positionEcal.z());
+ aida.histogram2D("Track Position at Harp: curvature < 0").fill(positionConverter.y(), positionConverter.z());
aida.histogram1D("Px: C < 0").fill(track.getTrackStates().get(0).getMomentum()[0]);
aida.histogram1D("Py: C < 0").fill(track.getTrackStates().get(0).getMomentum()[1]);
aida.histogram1D("Pz: C < 0").fill(track.getTrackStates().get(0).getMomentum()[2]);
nnegative++;
} else if(Math.signum(TrackUtils.getR(track)) > 0){
- aida.histogram2D("Track Position at Ecal: Curvature > 0").fill(positionEcal.y(), positionEcal.z());
- aida.histogram2D("Track Position at Harp: Curvature > 0").fill(positionConverter.y(), positionConverter.z());
+ aida.histogram2D("Track Position at Ecal: curvature > 0").fill(positionEcal.y(), positionEcal.z());
+ aida.histogram2D("Track Position at Harp: curvature > 0").fill(positionConverter.y(), positionConverter.z());
aida.histogram1D("Px: C > 0").fill(track.getTrackStates().get(0).getMomentum()[0]);
aida.histogram1D("Px: C > 0").fill(track.getTrackStates().get(0).getMomentum()[1]);
aida.histogram1D("Px: C > 0").fill(track.getTrackStates().get(0).getMomentum()[2]);
@@ -373,3 +585,5 @@
System.out.println("Number of bottom tracks per event: " + tracksBottomRatio);
System.out.println("Number of two track events: " + twoTrackRatio);
}*/
+
+
|