Author: [log in to unmask]
Date: Wed Nov 30 11:12:55 2016
New Revision: 4586
Log:
adding analysis code for layer0.
Added:
java/branches/layer0-thin-branch/users/src/main/java/org/hps/users/mrsolt/
java/branches/layer0-thin-branch/users/src/main/java/org/hps/users/mrsolt/FindableTrackLayer0.java
java/branches/layer0-thin-branch/users/src/main/java/org/hps/users/mrsolt/Layer0Acceptance.java
java/branches/layer0-thin-branch/users/src/main/java/org/hps/users/mrsolt/Layer0Driver.java
java/branches/layer0-thin-branch/users/src/main/java/org/hps/users/mrsolt/Layer0Plots.java
java/branches/layer0-thin-branch/users/src/main/java/org/hps/users/mrsolt/Layer0ReconParticle.java
java/branches/layer0-thin-branch/users/src/main/java/org/hps/users/mrsolt/TrackingReconstructionPlots.java
Added: java/branches/layer0-thin-branch/users/src/main/java/org/hps/users/mrsolt/FindableTrackLayer0.java
=============================================================================
--- java/branches/layer0-thin-branch/users/src/main/java/org/hps/users/mrsolt/FindableTrackLayer0.java (added)
+++ java/branches/layer0-thin-branch/users/src/main/java/org/hps/users/mrsolt/FindableTrackLayer0.java Wed Nov 30 11:12:55 2016
@@ -0,0 +1,380 @@
+/*
+ * FindableTrack.java
+ *
+ * Created on October 24, 2008, 9:50 PM
+ *
+ */
+package org.hps.users.mrsolt;
+
+import hep.physics.vec.BasicHep3Vector;
+import hep.physics.vec.Hep3Vector;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.lcsim.detector.DetectorElementStore;
+import org.lcsim.detector.IDetectorElement;
+import org.lcsim.detector.IDetectorElementContainer;
+import org.lcsim.event.EventHeader;
+import org.lcsim.event.MCParticle;
+import org.lcsim.event.RelationalTable;
+import org.lcsim.event.SimTrackerHit;
+import org.lcsim.event.base.BaseRelationalTable;
+import org.lcsim.fit.helicaltrack.HelixParamCalculator;
+import org.lcsim.fit.helicaltrack.HitIdentifier;
+import org.lcsim.geometry.subdetector.BarrelEndcapFlag;
+import org.lcsim.recon.tracking.seedtracker.SeedLayer;
+import org.lcsim.recon.tracking.seedtracker.SeedLayer.SeedType;
+import org.lcsim.recon.tracking.seedtracker.SeedStrategy;
+
+/**
+ *
+ * @author Richard Partridge
+ * @version $Id: FindableTrack.java,v 1.4 2012/11/08 01:22:41 omoreno Exp $
+ */
+// FIXME: This class is used in some analyses but is not actually created by the recon.
+// Should it be put someplace else like in the analysis module? --JM
+public class FindableTrackLayer0 {
+
+ public enum Ignore {
+ NoPTCut, NoDCACut, NoZ0Cut, NoSeedCheck, NoConfirmCheck, NoMinHitCut
+ };
+
+ private double _bfield;
+ private RelationalTable<SimTrackerHit, MCParticle> _hittomc;
+ private HitIdentifier _ID;
+ private int _nlayersTot = 10;
+
+ public FindableTrackLayer0(EventHeader event, List<SimTrackerHit> simTrackerHits) {
+
+ // Get the magnetic field
+ Hep3Vector IP = new BasicHep3Vector(0., 0., 1.);
+ _bfield = event.getDetector().getFieldMap().getField(IP).y();
+
+ // Instantiate the hit identifier class
+ _ID = new HitIdentifier();
+
+ // Create a relational table that maps SimTrackerHits to MCParticles
+ _hittomc = new BaseRelationalTable<SimTrackerHit, MCParticle>(RelationalTable.Mode.MANY_TO_MANY, RelationalTable.Weighting.UNWEIGHTED);
+
+ List<List<SimTrackerHit>> simTrackerHitCollections = new ArrayList<List<SimTrackerHit>>();
+
+ // If the collection of SimTrackerHits is not specified get the collection from the event.
+ // Otherwise, add the collection to the list of collections to be processed.
+ if (simTrackerHits == null)
+ simTrackerHitCollections.addAll(event.get(SimTrackerHit.class));
+ else
+ simTrackerHitCollections.add(simTrackerHits);
+
+ // Loop over the SimTrackerHits and fill in the relational table
+ for (List<SimTrackerHit> simlist : simTrackerHitCollections) {
+ for (SimTrackerHit simhit : simlist)
+ if (simhit.getMCParticle() != null)
+ _hittomc.add(simhit, simhit.getMCParticle());
+ }
+ }
+
+ public FindableTrackLayer0(EventHeader event, List<SimTrackerHit> simTrackerHits, int nLayersTot) {
+ this(event, simTrackerHits);
+ this._nlayersTot = nLayersTot;
+ }
+
+ public FindableTrackLayer0(EventHeader event) {
+ this(event, null);
+ }
+
+ public FindableTrackLayer0(EventHeader event, int nLayersTot) {
+ this(event, null, nLayersTot);
+ }
+
+ public boolean isFindable(MCParticle mcp, List<SeedStrategy> slist, Ignore ignore) {
+ List<Ignore> ignores = new ArrayList<Ignore>();
+ ignores.add(ignore);
+ return isFindable(mcp, slist, ignores);
+ }
+
+ public boolean isFindable(MCParticle mcp, List<SeedStrategy> slist) {
+ return isFindable(mcp, slist, new ArrayList<Ignore>());
+ }
+
+ public boolean isFindable(MCParticle mcp, List<SeedStrategy> slist, List<Ignore> ignores) {
+
+ // We can't find neutral particles'
+ if (mcp.getCharge() == 0)
+ return false;
+
+ // Find the helix parameters in the L3 convention used by org.lcsim
+ HelixParamCalculator helix = new HelixParamCalculator(mcp, _bfield);
+
+ // We haven't yet determined the track is findable
+ boolean findable = false;
+
+ // Loop over strategies and check if the track is findable
+ for (SeedStrategy strat : slist) {
+
+ // Check the MC Particle's pT
+ if (!CheckPT(helix, ignores, strat))
+ continue;
+
+ // Check the MC Particle's DCA
+ if (!CheckDCA(helix, ignores, strat))
+ continue;
+
+ // Check the MC Particle's Z0
+ if (!CheckZ0(helix, ignores, strat))
+ continue;
+
+ // Check that we have hits on the seed layers
+ if (!CheckSeed(mcp, ignores, strat))
+ continue;
+
+ // Check that we have the required confirmation hits
+ if (!CheckConfirm(mcp, ignores, strat))
+ continue;
+
+ // Check for the minimum number of hits
+ if (!CheckMinHits(mcp, ignores, strat))
+ continue;
+
+ // Passed all the checks - track is findable
+ findable = true;
+ break;
+ }
+
+ return findable;
+ }
+
+ public int LayersHit(MCParticle mcp) {
+
+ // Get the list of hits associated with the MCParticle
+ Set<SimTrackerHit> hitlist = _hittomc.allTo(mcp);
+
+ // Create a set of the identifiers for the hit layers
+ Set<String> idset = new HashSet<String>();
+
+ // Create the set of identifiers
+ for (SimTrackerHit simhit : hitlist) {
+
+ String identifier_old = _ID.Identifier(getDetectorElement(simhit));
+ String identifier = _ID.Identifier(simhit);
+ if (!idset.contains(identifier))
+ idset.add(identifier);
+ }
+
+ return idset.size();
+ }
+
+ public boolean isTrackFindable(MCParticle mcParticle, int nLayers) {
+
+ if (nLayers % 2 == 1)
+ throw new RuntimeException(this.getClass().getSimpleName() + ": The required number of layers hit must be even");
+
+ // A neutral particle can't be found
+ if (mcParticle.getCharge() == 0)
+ return false;
+
+ // Get the list of SimTrackerHits associated with the MC particle
+ Set<SimTrackerHit> simHits = _hittomc.allTo(mcParticle);
+
+ // Find the layers hit
+ boolean[] layerHit = new boolean[_nlayersTot];
+ for (SimTrackerHit simHit : simHits) {
+ layerHit[simHit.getLayer() - 1] = true;
+ }
+
+ int nLayersHit = 0;
+ // Check how many pairs of layers were hit
+ for (int index = 0; index < _nlayersTot; index += 2) {
+ if (layerHit[index] && layerHit[index + 1])
+ nLayersHit += 2;
+ }
+
+ return nLayersHit >= nLayers;
+ }
+
+ public Set<SimTrackerHit> getSimTrackerHits(MCParticle mcParticle) {
+ return _hittomc.allTo(mcParticle);
+ }
+
+ public boolean InnerTrackerIsFindable(MCParticle mcp, int nlayers, boolean printout) {
+ Set<SimTrackerHit> hitlist = _hittomc.allTo(mcp);
+ boolean[] layerHit = { false, false, false, false, false, false, false, false, false, false, false, false };
+ for (SimTrackerHit simhit : hitlist) {
+ layerHit[simhit.getLayer() - 1] = true;
+ }
+ for (int i = 0; i < nlayers; i++) {
+ System.out.println(layerHit[i]);
+ if (layerHit[i] == false)
+ return false;
+ }
+ return true;
+ }
+
+ public boolean TrackIsFindable(MCParticle mcp, int nlayers) {
+ Set<SimTrackerHit> hitlist = _hittomc.allTo(mcp);
+ boolean[] layerHit = { false, false, false, false, false, false, false, false, false, false, false, false, false, false };
+ for (SimTrackerHit simhit : hitlist) {
+ layerHit[simhit.getLayer() - 1] = true;
+ }
+ for (int i = 0; i < nlayers; i++) {
+ if (layerHit[i] == false)
+ return false;
+ }
+ return true;
+ }
+
+ public boolean TrackIsFindableRequireLayer0(MCParticle mcp, int nlayers) {
+ Set<SimTrackerHit> hitlist = _hittomc.allTo(mcp);
+ boolean[] layerHit = { false, false, false, false, false, false, false, false, false, false, false, false, false, false };
+ for (SimTrackerHit simhit : hitlist) {
+ layerHit[simhit.getLayer() - 1] = true;
+ }
+ for (int i = 0; i < nlayers; i++) {
+ if (layerHit[i] == false)
+ return false;
+ }
+ return true;
+ }
+
+ public boolean TrackIsFindableExcludeLayer0(MCParticle mcp, int nlayers) {
+ Set<SimTrackerHit> hitlist = _hittomc.allTo(mcp);
+ boolean[] layerHit = { false, false, false, false, false, false, false, false, false, false, false, false };
+ for (SimTrackerHit simhit : hitlist) {
+ layerHit[simhit.getLayer() - 1] = true;
+ }
+ for (int i = 0; i < nlayers; i++) {
+ if (layerHit[i] == false)
+ return false;
+ }
+ return true;
+ }
+
+ public boolean OuterTrackerIsFindable(MCParticle mcp, int start) {
+ Set<SimTrackerHit> hitlist = _hittomc.allTo(mcp);
+ boolean[] layerHit = { false, false, false, false, false, false, false, false, false, false, false, false };
+ for (SimTrackerHit simhit : hitlist) {
+ layerHit[simhit.getLayer() - 1] = true;
+ }
+ for (int i = start; i < _nlayersTot; i++) {
+ if (layerHit[i] == false)
+ return false;
+ }
+ return true;
+ }
+
+ private boolean CheckPT(HelixParamCalculator helix, List<Ignore> ignores, SeedStrategy strat) {
+
+ // First see if we are skipping this check
+ if (ignores.contains(Ignore.NoPTCut))
+ return true;
+
+ return helix.getMCTransverseMomentum() >= strat.getMinPT();
+ }
+
+ private boolean CheckDCA(HelixParamCalculator helix, List<Ignore> ignores, SeedStrategy strat) {
+
+ // First see if we are skipping this check
+ if (ignores.contains(Ignore.NoDCACut))
+ return true;
+
+ return Math.abs(helix.getDCA()) <= strat.getMaxDCA();
+ }
+
+ private boolean CheckZ0(HelixParamCalculator helix, List<Ignore> ignores, SeedStrategy strat) {
+
+ // First see if we are skipping this check
+ if (ignores.contains(Ignore.NoZ0Cut))
+ return true;
+
+ return Math.abs(helix.getZ0()) <= strat.getMaxZ0();
+ }
+
+ private boolean CheckSeed(MCParticle mcp, List<Ignore> ignores, SeedStrategy strat) {
+
+ // First see if we are skipping this check
+ if (ignores.contains(Ignore.NoSeedCheck))
+ return true;
+
+ return HitCount(mcp, strat.getLayers(SeedType.Seed)) == 3;
+ }
+
+ private boolean CheckConfirm(MCParticle mcp, List<Ignore> ignores, SeedStrategy strat) {
+
+ // First see if we are skipping this check
+ if (ignores.contains(Ignore.NoConfirmCheck))
+ return true;
+
+ return HitCount(mcp, strat.getLayers(SeedType.Confirm)) >= strat.getMinConfirm();
+ }
+
+ private boolean CheckMinHits(MCParticle mcp, List<Ignore> ignores, SeedStrategy strat) {
+
+ // First see if we are skipping this check
+ if (ignores.contains(Ignore.NoMinHitCut))
+ return true;
+
+ return HitCount(mcp, strat.getLayerList()) >= strat.getMinHits();
+ }
+
+ private int HitCount(MCParticle mcp, List<SeedLayer> lyrlist) {
+
+ // Get the list of hits associated with the MCParticle
+ Set<SimTrackerHit> hitlist = _hittomc.allTo(mcp);
+
+ // Count the number of layers with hits in them
+ int hitcount = 0;
+ for (SeedLayer lyr : lyrlist)
+ // Loop over the hits for this MCParticle
+ for (SimTrackerHit simhit : hitlist) {
+
+ // Get the detector element for this hit
+ // IDetectorElement de = getDetectorElement(simhit);
+
+ // Check names
+ // String detname_old = _ID.getName(de);
+ String detname_new = simhit.getSubdetector().getName();
+ // if (!detname_old.equals(detname_new)) {
+ // System.out.println("Detector name mismatch - old: "+detname_old+
+ // " new: "+detname_new);
+ // }
+ // int layer_old = _ID.getLayer(de);
+ int layer_new = simhit.getLayer();
+ // if (layer_old != layer_new) {
+ // System.out.println("Layer number mismatch - old: "+layer_old+" new: "+layer_new);
+ // }
+ // BarrelEndcapFlag be_old = _ID.getBarrelEndcapFlag(de);
+ BarrelEndcapFlag be_new = simhit.getBarrelEndcapFlag();
+ // if (!be_old.equals(be_new)) {
+ // System.out.println("BarrelEndcapFlag mismatch - old: "+be_old+" new: "+be_new);
+ // }
+
+ // See if this hit is on the layer we are checking
+ // if (!lyr.getDetName().equals(_ID.getName(de))) continue;
+ // if (lyr.getLayer() != _ID.getLayer(de)) continue;
+ // if (!lyr.getBarrelEndcapFlag().equals(_ID.getBarrelEndcapFlag(de)))
+ // continue;
+ if (!lyr.getDetName().equals(detname_new))
+ continue;
+ if (lyr.getLayer() != layer_new)
+ continue;
+ if (!lyr.getBarrelEndcapFlag().equals(be_new))
+ continue;
+ hitcount++;
+ break;
+ }
+
+ return hitcount;
+ }
+
+ private IDetectorElement getDetectorElement(SimTrackerHit hit) {
+ IDetectorElementContainer cont = DetectorElementStore.getInstance().find(hit.getIdentifier());
+ IDetectorElement de;
+ if (cont.isEmpty())
+ throw new RuntimeException("Detector Container is empty!");
+ else
+ de = cont.get(0);
+ return de;
+ }
+}
Added: java/branches/layer0-thin-branch/users/src/main/java/org/hps/users/mrsolt/Layer0Acceptance.java
=============================================================================
--- java/branches/layer0-thin-branch/users/src/main/java/org/hps/users/mrsolt/Layer0Acceptance.java (added)
+++ java/branches/layer0-thin-branch/users/src/main/java/org/hps/users/mrsolt/Layer0Acceptance.java Wed Nov 30 11:12:55 2016
@@ -0,0 +1,1145 @@
+/**
+ * Analysis driver to calculate hit efficiencies in the SVT
+ */
+/**
+ * @author mrsolt
+ *
+ */
+
+package org.hps.users.mrsolt;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import hep.aida.IAnalysisFactory;
+import hep.aida.IHistogramFactory;
+import hep.aida.IPlotterFactory;
+import hep.aida.IPlotter;
+import hep.aida.IHistogram1D;
+import hep.aida.IHistogram2D;
+import hep.aida.ITree;
+import hep.physics.vec.BasicHep3Matrix;
+import hep.physics.vec.BasicHep3Vector;
+import hep.physics.vec.Hep3Vector;
+import hep.physics.vec.VecOp;
+
+import org.lcsim.detector.converter.compact.subdetector.SvtStereoLayer;
+import org.lcsim.detector.tracker.silicon.HpsSiSensor;
+import org.lcsim.event.EventHeader;
+import org.lcsim.event.MCParticle;
+import org.lcsim.event.RawTrackerHit;
+import org.lcsim.event.ReconstructedParticle;
+import org.lcsim.event.RelationalTable;
+import org.lcsim.event.SimTrackerHit;
+import org.lcsim.event.Track;
+import org.lcsim.event.TrackerHit;
+import org.lcsim.event.Vertex;
+import org.lcsim.geometry.Detector;
+import org.lcsim.recon.tracking.seedtracker.SeedTrack;
+import org.lcsim.util.Driver;
+import org.lcsim.util.aida.AIDA;
+import org.hps.recon.tracking.TrackType;
+import org.hps.recon.tracking.TrackUtils;
+import org.hps.recon.tracking.TrackerHitUtils;
+import org.hps.recon.vertexing.BilliorTrack;
+import org.hps.recon.vertexing.BilliorVertex;
+import org.hps.recon.vertexing.BilliorVertexer;
+import org.hps.users.mrsolt.FindableTrackLayer0;
+import org.lcsim.event.base.BaseRelationalTable;
+import org.lcsim.fit.helicaltrack.HelicalTrackFit;
+import org.lcsim.fit.helicaltrack.HitIdentifier;
+
+
+public class Layer0Acceptance extends Driver {
+
+
+ // Use JFreeChart as the default plotting backend
+ static {
+ hep.aida.jfree.AnalysisFactory.register();
+ }
+
+ // Plotting
+ protected AIDA aida = AIDA.defaultInstance();
+ ITree tree;
+ IHistogramFactory histogramFactory;
+ IPlotterFactory plotterFactory = IAnalysisFactory.create().createPlotterFactory();
+ protected Map<String, IPlotter> plotters = new HashMap<String, IPlotter>();
+ private Map<Integer, List<SvtStereoLayer>> topStereoLayers = new HashMap<Integer, List<SvtStereoLayer>>();
+ private Map<Integer, List<SvtStereoLayer>> bottomStereoLayers = new HashMap<Integer, List<SvtStereoLayer>>();
+ private static final String SUBDETECTOR_NAME = "Tracker";
+ RelationalTable<SimTrackerHit, MCParticle> _hittomc = null;
+ private List<HpsSiSensor> sensors = null;
+ private double _bfield;
+ private HitIdentifier _ID;
+ private int _nlayersTot = 14;
+ double eBeam = 1.05;
+ double maxFactor = 1.25;
+
+
+ /*IHistogram1D Findable4Hit;
+ IHistogram1D Findable4HitLayer0;
+ IHistogram1D Findable4HitExcludeLayer0;
+ IHistogram1D Findable5Hit;
+ IHistogram1D Findable5HitLayer0;
+ IHistogram1D Findable5HitExcludeLayer0;
+ IHistogram1D Findable6Hit;
+ IHistogram1D Findable6HitLayer0;
+ IHistogram1D Findable6HitExcludeLayer0;
+ IHistogram1D Findable7Hit;*/
+
+ int Findable4Hit = 0;
+ int Findable4HitLayer0 = 0;
+ int Findable4HitExcludeLayer0 = 0;
+ int Findable5Hit = 0;
+ int Findable5HitLayer0 = 0;
+ int Findable5HitExcludeLayer0 = 0;
+ int Findable6Hit = 0;
+ int Findable6HitLayer0 = 0;
+ int Findable6HitExcludeLayer0 = 0;
+ int Findable7Hit = 0;
+
+ int Findable4HitRecoil = 0;
+ int Findable4HitLayer0Recoil = 0;
+ int Findable4HitExcludeLayer0Recoil = 0;
+ int Findable5HitRecoil = 0;
+ int Findable5HitLayer0Recoil = 0;
+ int Findable5HitExcludeLayer0Recoil = 0;
+ int Findable6HitRecoil = 0;
+ int Findable6HitLayer0Recoil = 0;
+ int Findable6HitExcludeLayer0Recoil = 0;
+ int Findable7HitRecoil = 0;
+
+ int TridentsFindable4Hit = 0;
+ int TridentsFindable4HitLayer0 = 0;
+ int TridentsFindable4HitExcludeLayer0 = 0;
+ int TridentsFindable5Hit = 0;
+ int TridentsFindable5HitLayer0 = 0;
+ int TridentsFindable5HitExcludeLayer0 = 0;
+ int TridentsFindable6Hit = 0;
+ int TridentsFindable6HitLayer0 = 0;
+ int TridentsFindable6HitExcludeLayer0 = 0;
+ int TridentsFindable7Hit = 0;
+
+ int ThreeProngFindable4Hit = 0;
+ int ThreeProngFindable4HitLayer0 = 0;
+ int ThreeProngFindable4HitExcludeLayer0 = 0;
+ int ThreeProngFindable5Hit = 0;
+ int ThreeProngFindable5HitLayer0 = 0;
+ int ThreeProngFindable5HitExcludeLayer0 = 0;
+ int ThreeProngFindable6Hit = 0;
+ int ThreeProngFindable6HitLayer0 = 0;
+ int ThreeProngFindable6HitExcludeLayer0 = 0;
+ int ThreeProngFindable7Hit = 0;
+
+ int TracksFound4Hit = 0;
+ int TracksFound4HitLayer0 = 0;
+ int TracksFound4HitExcludeLayer0 = 0;
+ int TracksFound5Hit = 0;
+ int TracksFound5HitLayer0 = 0;
+ int TracksFound5HitExcludeLayer0 = 0;
+ int TracksFound6Hit = 0;
+ int TracksFound6HitLayer0 = 0;
+ int TracksFound6HitExcludeLayer0 = 0;
+ int TracksFound7Hit = 0;
+
+ int events = 0;
+ int goodTrident = 0;
+ int goodTridentInL0 = 0;
+ int goodTridentExL0 = 0;
+
+ IHistogram1D Findable;
+ IHistogram1D FindableLayer0;
+ IHistogram1D FindableExcludeLayer0;
+
+ IHistogram1D FindableRecoil;
+ IHistogram1D FindableLayer0Recoil;
+ IHistogram1D FindableExcludeLayer0Recoil;
+
+ IHistogram1D TridentFindable;
+ IHistogram1D TridentFindableLayer0;
+ IHistogram1D TridentFindableExcludeLayer0;
+
+ IHistogram1D ThreeProngFindable;
+ IHistogram1D ThreeProngFindableLayer0;
+ IHistogram1D ThreeProngFindableExcludeLayer0;
+
+ IHistogram1D TracksFound;
+ IHistogram1D TracksFoundLayer0;
+ IHistogram1D TracksFoundExcludeLayer0;
+
+ IHistogram1D NumberofEvents;
+
+ IHistogram2D TrackHitTopAxial;
+ IHistogram2D TrackHitBotAxial;
+ IHistogram2D TrackHitTopStereo;
+ IHistogram2D TrackHitBotStereo;
+
+ IHistogram1D TrackXHitTopAxial;
+ IHistogram1D TrackXHitBotAxial;
+ IHistogram1D TrackXHitTopStereo;
+ IHistogram1D TrackXHitBotStereo;
+
+ IHistogram2D TrackHitEleTopAxial;
+ IHistogram2D TrackHitEleBotAxial;
+ IHistogram2D TrackHitEleTopStereo;
+ IHistogram2D TrackHitEleBotStereo;
+
+ IHistogram1D TrackXHitEleTopAxial;
+ IHistogram1D TrackXHitEleBotAxial;
+ IHistogram1D TrackXHitEleTopStereo;
+ IHistogram1D TrackXHitEleBotStereo;
+
+ IHistogram2D TrackHitPosTopAxial;
+ IHistogram2D TrackHitPosBotAxial;
+ IHistogram2D TrackHitPosTopStereo;
+ IHistogram2D TrackHitPosBotStereo;
+
+ IHistogram1D TrackXHitPosTopAxial;
+ IHistogram1D TrackXHitPosBotAxial;
+ IHistogram1D TrackXHitPosTopStereo;
+ IHistogram1D TrackXHitPosBotStereo;
+
+ IHistogram1D TrackYHitTopAxial;
+ IHistogram1D TrackYHitBotAxial;
+ IHistogram1D TrackYHitTopStereo;
+ IHistogram1D TrackYHitBotStereo;
+
+ IHistogram1D TrackZHitTopAxialHole;
+ IHistogram1D TrackZHitBotAxialHole;
+ IHistogram1D TrackZHitTopStereoHole;
+ IHistogram1D TrackZHitBotStereoHole;
+ IHistogram1D TrackZHitTopAxialSlot;
+ IHistogram1D TrackZHitBotAxialSlot;
+ IHistogram1D TrackZHitTopStereoSlot;
+ IHistogram1D TrackZHitBotStereoSlot;
+
+ IHistogram1D NumberofTracks;
+ IHistogram1D NumberofHits;
+
+ IHistogram1D Chi2;
+ IHistogram1D TanLambda;
+ IHistogram1D D0;
+ IHistogram1D Z0;
+ IHistogram1D Phi;
+ IHistogram1D P;
+ IHistogram1D Px;
+ IHistogram1D Py;
+ IHistogram1D Pz;
+ IHistogram1D Pt;
+
+
+ private String stereoHitCollectionName = "HelicalTrackHits";
+ private String trackCollectionName = "MatchedTracks";
+ private String MCparticleCollectionName = "MCParticle";
+
+ int num_lay = 7;
+
+ //double ebeam = 1.056;
+ double zPosTop = 59.3105;
+ double zPosBot = 40.843;
+
+
+ public void detectorChanged(Detector detector){
+
+ aida.tree().cd("/");
+ tree = aida.tree();
+ 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.");
+ }
+
+ /*Findable4Hit = aida.histogram1D("Findable Tracks 4 Hits", num_lay, 0, num_lay);
+ Findable4HitLayer0 = aida.histogram1D("Findable Tracks 4 Hits Layer 0 Included", num_lay, 0, num_lay);
+ Findable4HitExcludeLayer0 = aida.histogram1D("Findable Tracks 4 Hits Layer 0 Excluded", num_lay, 0, num_lay);
+ Findable5Hit = aida.histogram1D("Findable Tracks 5 Hits", num_lay, 0, num_lay);
+ Findable5HitLayer0 = aida.histogram1D("Findable Tracks 5 Hits Layer 0 Included", num_lay, 0, num_lay);
+ Findable5HitExcludeLayer0 = aida.histogram1D("Findable Tracks 5 Hits Layer 0 Excluded", num_lay, 0, num_lay);
+ Findable6Hit = aida.histogram1D("Findable Tracks 6 Hits", num_lay, 0, num_lay);
+ Findable6HitLayer0 = aida.histogram1D("Findable Tracks 6 Hits Layer 0 Included", num_lay, 0, num_lay);
+ Findable6HitExcludeLayer0 = aida.histogram1D("Findable Tracks 6 Hits Layer 0 Excluded", num_lay, 0, num_lay);
+ Findable7Hit = aida.histogram1D("Findable Tracks 7 Hits", num_lay, 0, num_lay);*/
+
+ Findable = aida.histogram1D("Findable Tracks as Function of Hits", num_lay, 1, num_lay+1);
+ FindableLayer0 = aida.histogram1D("Findable Tracks as Function of Hits with Layer 0", num_lay, 1, num_lay+1);
+ FindableExcludeLayer0 = aida.histogram1D("Findable Tracks as Function of Hits Exclude Layer0", num_lay, 1, num_lay+1);
+
+ FindableRecoil = aida.histogram1D("Findable Recoils as Function of Hits", num_lay, 1, num_lay+1);
+ FindableLayer0Recoil = aida.histogram1D("Findable Recoils as Function of Hits with Layer 0", num_lay, 1, num_lay+1);
+ FindableExcludeLayer0Recoil = aida.histogram1D("Findable Recoils as Function of Hits Exclude Layer0", num_lay, 1, num_lay+1);
+
+ TridentFindable = aida.histogram1D("Findable Tridents as Function of Hits", num_lay, 1, num_lay+1);
+ TridentFindableLayer0 = aida.histogram1D("Findable Tridents as Function of Hits with Layer 0", num_lay, 1, num_lay+1);
+ TridentFindableExcludeLayer0 = aida.histogram1D("Findable Tridents as Function of Hits Exclude Layer0", num_lay, 1, num_lay+1);
+
+ ThreeProngFindable = aida.histogram1D("Findable Three Prong Events as Function of Hits", num_lay, 1, num_lay+1);
+ ThreeProngFindableLayer0 = aida.histogram1D("Findable Three Prong Events as Function of Hits with Layer 0", num_lay, 1, num_lay+1);
+ ThreeProngFindableExcludeLayer0 = aida.histogram1D("Findable Three Prong Events as Function of Hits Exclude Layer0", num_lay, 1, num_lay+1);
+
+ TracksFound = aida.histogram1D("Found Tracks as Function of Hits", num_lay, 1, num_lay+1);
+ TracksFoundLayer0 = aida.histogram1D("Found Tracks as Function of Hits with Layer 0", num_lay, 1, num_lay+1);
+ TracksFoundExcludeLayer0 = aida.histogram1D("Found Tracks as Function of Hits Exclude Layer0", num_lay, 1, num_lay+1);
+
+ NumberofEvents = aida.histogram1D("Number of Events", 2, 0, 2);
+
+ TrackHitTopAxial = aida.histogram2D("Particle Hit Layer 0 Top Axial",120,-15,15,80,0,20);
+ TrackHitBotAxial = aida.histogram2D("Particle Hit Layer 0 Bot Axial",120,-15,15,80,-20,0);
+ TrackHitTopStereo = aida.histogram2D("Particle Hit Layer 0 Top Stereo",120,-15,15,80,0,20);
+ TrackHitBotStereo = aida.histogram2D("Particle Hit Layer 0 Bot Stereo",120,-15,15,80,-20,0);
+
+ TrackXHitTopAxial = aida.histogram1D("Particle X Hit Layer 0 Top Axial",120,-15,15);
+ TrackXHitBotAxial = aida.histogram1D("Particle X Hit Layer 0 Bot Axial",120,-15,15);
+ TrackXHitTopStereo = aida.histogram1D("Particle X Hit Layer 0 Top Stereo",120,-15,15);
+ TrackXHitBotStereo = aida.histogram1D("Particle X Hit Layer 0 Bot Stereo",120,-15,15);
+
+ TrackHitEleTopAxial = aida.histogram2D("Particle Hit Layer 0 Top Axial Electrons",120,-15,15,80,0,20);
+ TrackHitEleBotAxial = aida.histogram2D("Particle Hit Layer 0 Bot Axial Electrons",120,-15,15,80,-20,0);
+ TrackHitEleTopStereo = aida.histogram2D("Particle Hit Layer 0 Top Stereo Electrons",120,-15,15,80,0,20);
+ TrackHitEleBotStereo = aida.histogram2D("Particle Hit Layer 0 Bot Stereo Electrons",120,-15,15,80,-20,0);
+
+ TrackXHitEleTopAxial = aida.histogram1D("Particle X Hit Layer 0 Top Axial Electrons",120,-15,15);
+ TrackXHitEleBotAxial = aida.histogram1D("Particle X Hit Layer 0 Bot Axial Electrons",120,-15,15);
+ TrackXHitEleTopStereo = aida.histogram1D("Particle X Hit Layer 0 Top Stereo Electrons",120,-15,15);
+ TrackXHitEleBotStereo = aida.histogram1D("Particle X Hit Layer 0 Bot Stereo Electrons",120,-15,15);
+
+ TrackHitPosTopAxial = aida.histogram2D("Particle Hit Layer 0 Top Axial Positrons",120,-15,15,80,0,20);
+ TrackHitPosBotAxial = aida.histogram2D("Particle Hit Layer 0 Bot Axial Positrons",120,-15,15,80,-20,0);
+ TrackHitPosTopStereo = aida.histogram2D("Particle Hit Layer 0 Top Stereo Positrons",120,-15,15,80,0,20);
+ TrackHitPosBotStereo = aida.histogram2D("Particle Hit Layer 0 Bot Stereo Positrons",120,-15,15,80,-20,0);
+
+ TrackXHitPosTopAxial = aida.histogram1D("Particle X Hit Layer 0 Top Axial Positrons",120,-15,15);
+ TrackXHitPosBotAxial = aida.histogram1D("Particle X Hit Layer 0 Bot Axial Positrons",120,-15,15);
+ TrackXHitPosTopStereo = aida.histogram1D("Particle X Hit Layer 0 Top Stereo Positrons",120,-15,15);
+ TrackXHitPosBotStereo = aida.histogram1D("Particle X Hit Layer 0 Bot Stereo Positrons",120,-15,15);
+
+ TrackYHitTopAxial = aida.histogram1D("Particle Y Hit Layer 0 Top Axial",80,0,20);
+ TrackYHitBotAxial = aida.histogram1D("Particle Y Hit Layer 0 Bot Axial",80,-20,0);
+ TrackYHitTopStereo = aida.histogram1D("Particle Y Hit Layer 0 Top Stereo",80,0,20);
+ TrackYHitBotStereo = aida.histogram1D("Particle Y Hit Layer 0 Bot Stereo",80,-20,0);
+
+ TrackZHitTopAxialHole = aida.histogram1D("Particle Z Hit Layer 0 Top Axial Hole",400,0,100);
+ TrackZHitBotAxialHole = aida.histogram1D("Particle Z Hit Layer 0 Bot Axial Hole",400,0,100);
+ TrackZHitTopStereoHole = aida.histogram1D("Particle Z Hit Layer 0 Top Stereo Hole",400,0,100);
+ TrackZHitBotStereoHole = aida.histogram1D("Particle Z Hit Layer 0 Bot Stereo Hole",400,0,100);
+
+ TrackZHitTopAxialSlot = aida.histogram1D("Particle Z Hit Layer 0 Top Axial Slot",400,0,100);
+ TrackZHitBotAxialSlot = aida.histogram1D("Particle Z Hit Layer 0 Bot Axial Slot",400,0,100);
+ TrackZHitTopStereoSlot = aida.histogram1D("Particle Z Hit Layer 0 Top Stereo Slot",400,0,100);
+ TrackZHitBotStereoSlot = aida.histogram1D("Particle Z Hit Layer 0 Bot Stereo Slot",400,0,100);
+
+ NumberofTracks = aida.histogram1D("Number of Tracks Per Event",10,0,10);
+ NumberofHits = aida.histogram1D("Number of Hits Per Track",20,0,20);
+
+ Chi2 = aida.histogram1D("Chi2",50,0,100);
+ TanLambda = aida.histogram1D("Tan Lambda",50,-0.1,0.1);
+ D0 = aida.histogram1D("D0",50,-4,4);
+ Z0 = aida.histogram1D("Z0",50,-4,4);
+ Phi = aida.histogram1D("Phi",50,0,2*Math.PI);
+ P = aida.histogram1D("P",50,0,1.3*eBeam);
+ Px = aida.histogram1D("Px",50,0,1.3*eBeam);
+ Py = aida.histogram1D("Py",50,0,1.3*eBeam);
+ Pz = aida.histogram1D("Pz",50,0,1.3*eBeam);
+ Pt = aida.histogram1D("Pt",50,0,1.3*eBeam);
+
+
+ for (IPlotter plotter : plotters.values()) {
+ //plotter.show();
+ }
+ }
+
+ private void mapMCtoSimTrackerHit(List<SimTrackerHit> simTrackerHits) {
+
+ // Create a relational table that maps SimTrackerHits to MCParticles
+ _hittomc = new BaseRelationalTable<SimTrackerHit, MCParticle>(RelationalTable.Mode.MANY_TO_MANY, RelationalTable.Weighting.UNWEIGHTED);
+
+ // Loop over the SimTrackerHits and fill in the relational table
+ for (SimTrackerHit simhit : simTrackerHits) {
+ if (simhit.getMCParticle() != null)
+ _hittomc.add(simhit, simhit.getMCParticle());
+ }
+ }
+
+ @Override
+ public void process(EventHeader event){
+ //System.out.println("Pass1");
+ aida.tree().cd("/");
+
+ events++;
+
+ List<SimTrackerHit> simHits = event.get(SimTrackerHit.class, "TrackerHits");
+ this.mapMCtoSimTrackerHit(simHits);
+
+ RelationalTable hitToStrips = TrackUtils.getHitToStripsTable(event);
+ RelationalTable hitToRotated = TrackUtils.getHitToRotatedTable(event);
+
+ // If the event does not have tracks, skip it
+ //if(!event.hasCollection(Track.class, trackCollectionName)) return;
+
+ List<MCParticle> MCParticlelist = event.get(MCParticle.class, MCparticleCollectionName);
+ //List<Track> tracks = event.get(Track.class, trackCollectionName);
+ List<TrackerHit> stereoHits = event.get(TrackerHit.class, stereoHitCollectionName);
+ //System.out.println("Pass2");
+
+ for(SimTrackerHit hits : simHits){
+ //if(hits.getLayer() != 1 || hits.getLayer() !=2) continue;
+ double[] hitPos = hits.getPosition();
+ if(hits.getMomentum()[1] > 0 && hits.getLayer() == 1){
+ TrackHitTopAxial.fill(hitPos[0],hitPos[1]);
+ TrackXHitTopAxial.fill(hitPos[0]);
+ if(hits.getMCParticle().getPDGID() == 11){
+ TrackHitEleTopAxial.fill(hitPos[0],hitPos[1]);
+ TrackXHitEleTopAxial.fill(hitPos[0]);
+ }
+ else if(hits.getMCParticle().getPDGID() == -11){
+ TrackHitPosTopAxial.fill(hitPos[0],hitPos[1]);
+ TrackXHitPosTopAxial.fill(hitPos[0]);
+ }
+ TrackYHitTopAxial.fill(hitPos[1]);
+ if(hitPos[0] < 0){
+ TrackZHitTopAxialHole.fill(hitPos[2]);
+ }
+ else{
+ TrackZHitTopAxialSlot.fill(hitPos[2]);
+ }
+ }
+ //System.out.println("Pass3");
+ if(hits.getMomentum()[1] < 0 && hits.getLayer() == 2){
+ TrackHitBotAxial.fill(hitPos[0],hitPos[1]);
+ TrackXHitBotAxial.fill(hitPos[0]);
+ if(hits.getMCParticle().getPDGID() == 11){
+ TrackHitEleBotAxial.fill(hitPos[0],hitPos[1]);
+ TrackXHitEleBotAxial.fill(hitPos[0]);
+ }
+ else if(hits.getMCParticle().getPDGID() == -11){
+ TrackHitPosBotAxial.fill(hitPos[0],hitPos[1]);
+ TrackXHitPosBotAxial.fill(hitPos[0]);
+ }
+ TrackYHitBotAxial.fill(hitPos[1]);
+ if(hitPos[0] < 0){
+ TrackZHitBotAxialHole.fill(hitPos[2]);
+ }
+ else{
+ TrackZHitBotAxialSlot.fill(hitPos[2]);
+ }
+ }
+ //System.out.println("Pass4");
+ if(hits.getMomentum()[1] > 0 && hits.getLayer() == 2){
+ TrackHitTopStereo.fill(hitPos[0],hitPos[1]);
+ TrackXHitTopStereo.fill(hitPos[0]);
+ if(hits.getMCParticle().getPDGID() == 11){
+ TrackHitEleTopStereo.fill(hitPos[0],hitPos[1]);
+ TrackXHitEleTopStereo.fill(hitPos[0]);
+ }
+ else if(hits.getMCParticle().getPDGID() == -11){
+ TrackHitPosTopStereo.fill(hitPos[0],hitPos[1]);
+ TrackXHitPosTopStereo.fill(hitPos[0]);
+ }
+ TrackYHitTopStereo.fill(hitPos[1]);
+ if(hitPos[0] < 0){
+ TrackZHitTopStereoHole.fill(hitPos[2]);
+ }
+ else{
+ TrackZHitTopStereoSlot.fill(hitPos[2]);
+ }
+ }
+ //System.out.println("Pass5");
+ if(hits.getMomentum()[1] < 0 && hits.getLayer() == 1){
+ TrackHitBotStereo.fill(hitPos[0],hitPos[1]);
+ TrackXHitBotStereo.fill(hitPos[0]);
+ if(hits.getMCParticle().getPDGID() == 11){
+ TrackHitEleBotStereo.fill(hitPos[0],hitPos[1]);
+ TrackXHitEleBotStereo.fill(hitPos[0]);
+ }
+ else if(hits.getMCParticle().getPDGID() == -11){
+ TrackHitPosBotStereo.fill(hitPos[0],hitPos[1]);
+ TrackXHitPosBotStereo.fill(hitPos[0]);
+ }
+ TrackYHitBotStereo.fill(hitPos[1]);
+ if(hitPos[0] < 0){
+ TrackZHitBotStereoHole.fill(hitPos[2]);
+ }
+ else{
+ TrackZHitBotStereoSlot.fill(hitPos[2]);
+ }
+ }
+
+
+ }
+ //System.out.println("Pass6");
+ boolean eleFound4Hit = false;
+ boolean posFound4Hit = false;
+ boolean eleFound5Hit = false;
+ boolean posFound5Hit = false;
+ boolean eleFound6Hit = false;
+ boolean posFound6Hit = false;
+ boolean eleFound7Hit = false;
+ boolean posFound7Hit = false;
+
+ boolean eleFound4HitExL0 = false;
+ boolean posFound4HitExL0 = false;
+ boolean eleFound5HitExL0 = false;
+ boolean posFound5HitExL0 = false;
+ boolean eleFound6HitExL0 = false;
+ boolean posFound6HitExL0 = false;
+
+ boolean eleFound4HitInL0 = false;
+ boolean posFound4HitInL0 = false;
+ boolean eleFound5HitInL0 = false;
+ boolean posFound5HitInL0 = false;
+ boolean eleFound6HitInL0 = false;
+ boolean posFound6HitInL0 = false;
+
+ boolean eleTop = false;
+ boolean eleBot = false;
+ boolean posTop = false;
+ boolean posBot = false;
+
+ boolean eleTopExL0 = false;
+ boolean eleBotExL0 = false;
+ boolean posTopExL0 = false;
+ boolean posBotExL0 = false;
+
+ boolean eleTopInL0 = false;
+ boolean eleBotInL0 = false;
+ boolean posTopInL0 = false;
+ boolean posBotInL0 = false;
+
+ boolean recoilFound4Hit = false;
+ boolean recoilFound5Hit = false;
+ boolean recoilFound6Hit = false;
+ boolean recoilFound7Hit = false;
+
+ boolean recoilFound4HitExL0 = false;
+ boolean recoilFound5HitExL0 = false;
+ boolean recoilFound6HitExL0 = false;
+
+ boolean recoilFound4HitInL0 = false;
+ boolean recoilFound5HitInL0 = false;
+ boolean recoilFound6HitInL0 = false;
+
+ for(MCParticle MCParticle : MCParticlelist){
+ List<MCParticle> Parents = MCParticle.getParents();
+ boolean trident = false;
+ boolean recoil = false;
+ for(MCParticle parent : Parents){
+ if(parent.getPDGID() == 622)
+ trident = true;
+ if(parent.getPDGID() == -623 && parent.getPDGID() != 622 && MCParticle.getPDGID() == 11)
+ recoil = true;
+ }
+ if(recoil){
+ if(TrackIsFindable(MCParticle,4)){
+ Findable4HitRecoil++;
+ recoilFound4Hit = true;
+ }
+ if(TrackIsFindable(MCParticle,5)){
+ Findable5HitRecoil++;
+ recoilFound5Hit = true;
+ }
+ if(TrackIsFindable(MCParticle,6)){
+ Findable6HitRecoil++;
+ recoilFound6Hit = true;
+ }
+ if(TrackIsFindable(MCParticle,7)){
+ Findable7HitRecoil++;
+ recoilFound7Hit = true;
+ }
+ if(TrackIsFindableRequireLayer0(MCParticle,4)){
+ Findable4HitLayer0Recoil++;
+ recoilFound4HitExL0 = true;
+ }
+ if(TrackIsFindableRequireLayer0(MCParticle,5)){
+ Findable5HitLayer0Recoil++;
+ recoilFound5HitExL0 = true;
+ }
+ if(TrackIsFindableRequireLayer0(MCParticle,6)){
+ Findable6HitLayer0Recoil++;
+ recoilFound6HitExL0 = true;
+ }
+ if(TrackIsFindableExcludeLayer0(MCParticle,4)){
+ Findable4HitExcludeLayer0Recoil++;
+ recoilFound4HitInL0 = true;
+ }
+ if(TrackIsFindableExcludeLayer0(MCParticle,5)){
+ Findable5HitExcludeLayer0Recoil++;
+ recoilFound5HitInL0 = true;
+ }
+ if(TrackIsFindableExcludeLayer0(MCParticle,6)){
+ Findable6HitExcludeLayer0Recoil++;
+ recoilFound6HitInL0 = true;
+ }
+ }
+ if(!trident) continue;
+ if(TrackIsFindable(MCParticle,4)) {
+ Findable4Hit++;
+ if(MCParticle.getPDGID() == 11){
+ eleFound4Hit = true;
+ if(MCParticle.getPY() > 0){
+ eleTop = true;
+ }
+ else{
+ eleBot = true;
+ }
+ }
+ else if(MCParticle.getPDGID() == -11) {
+ posFound4Hit = true;
+ if(MCParticle.getPY() > 0){
+ posTop = true;
+ }
+ else{
+ posBot = true;
+ }
+ }
+ }
+ if(TrackIsFindable(MCParticle,5)) {
+
+ Findable5Hit++;
+ if(MCParticle.getPDGID() == 11){
+ eleFound5Hit = true;
+ if(MCParticle.getPY() > 0){
+ eleTop = true;
+ }
+ else{
+ eleBot = true;
+ }
+ }
+ else if(MCParticle.getPDGID() == -11) {
+ posFound5Hit = true;
+ if(MCParticle.getPY() > 0){
+ posTop = true;
+ }
+ else{
+ posBot = true;
+ }
+ }
+ }
+ if(TrackIsFindable(MCParticle,6)) {
+ Findable6Hit++;
+ if(MCParticle.getPDGID() == 11){
+ eleFound6Hit = true;
+ if(MCParticle.getPY() > 0){
+ eleTop = true;
+ }
+ else{
+ eleBot = true;
+ }
+ }
+ else if(MCParticle.getPDGID() == -11) {
+ posFound6Hit = true;
+ if(MCParticle.getPY() > 0){
+ posTop = true;
+ }
+ else{
+ posBot = true;
+ }
+ }
+ }
+ if(TrackIsFindable(MCParticle,7)) {
+ Findable7Hit++;
+ if(MCParticle.getPDGID() == 11){
+ eleFound7Hit = true;
+ if(MCParticle.getPY() > 0){
+ eleTop = true;
+ }
+ else{
+ eleBot = true;
+ }
+ }
+ else if(MCParticle.getPDGID() == -11) {
+ posFound7Hit = true;
+ if(MCParticle.getPY() > 0){
+ posTop = true;
+ }
+ else{
+ posBot = true;
+ }
+ }
+ }
+ //System.out.println("Pass7");
+
+ if(TrackIsFindableRequireLayer0(MCParticle,4)) {
+ Findable4HitLayer0++;
+ if(MCParticle.getPDGID() == 11){
+ eleFound4HitInL0 = true;
+ if(MCParticle.getPY() > 0){
+ eleTopInL0 = true;
+ }
+ else{
+ eleBotInL0 = true;
+ }
+ }
+ else if(MCParticle.getPDGID() == -11) {
+ posFound4HitInL0 = true;
+ if(MCParticle.getPY() > 0){
+ posTopInL0 = true;
+ }
+ else{
+ posBotInL0 = true;
+ }
+ }
+ }
+ if(TrackIsFindableRequireLayer0(MCParticle,5)) {
+ Findable5HitLayer0++;
+ if(MCParticle.getPDGID() == 11){
+ eleFound5HitInL0 = true;
+ if(MCParticle.getPY() > 0){
+ eleTopInL0 = true;
+ }
+ else{
+ eleBotInL0 = true;
+ }
+ }
+ else if(MCParticle.getPDGID() == -11) {
+ posFound5HitInL0 = true;
+ if(MCParticle.getPY() > 0){
+ posTopInL0 = true;
+ }
+ else{
+ posBotInL0 = true;
+ }
+ }
+ }
+ if(TrackIsFindableRequireLayer0(MCParticle,6)) {
+ Findable6HitLayer0++;
+ if(MCParticle.getPDGID() == 11){
+ eleFound6HitInL0 = true;
+ if(MCParticle.getPY() > 0){
+ eleTopInL0 = true;
+ }
+ else{
+ eleBotInL0 = true;
+ }
+ }
+ else if(MCParticle.getPDGID() == -11) {
+ posFound6HitInL0 = true;
+ if(MCParticle.getPY() > 0){
+ posTopInL0 = true;
+ }
+ else{
+ posBotInL0 = true;
+ }
+ }
+ }
+ //System.out.println("Pass8");
+
+ if(TrackIsFindableExcludeLayer0(MCParticle,4)) {
+ Findable4HitExcludeLayer0++;
+ if(MCParticle.getPDGID() == 11){
+ eleFound4HitExL0 = true;
+ if(MCParticle.getPY() > 0){
+ eleTopExL0 = true;
+ }
+ else{
+ eleBotExL0 = true;
+ }
+ }
+ else if(MCParticle.getPDGID() == -11) {
+ posFound4HitExL0 = true;
+ if(MCParticle.getPY() > 0){
+ posTopExL0 = true;
+ }
+ else{
+ posBotExL0 = true;
+ }
+ }
+ }
+ if(TrackIsFindableExcludeLayer0(MCParticle,5)) {
+ Findable5HitExcludeLayer0++;
+ if(MCParticle.getPDGID() == 11){
+ eleFound5HitExL0 = true;
+ if(MCParticle.getPY() > 0){
+ eleTopExL0 = true;
+ }
+ else{
+ eleBotExL0 = true;
+ }
+ }
+ else if(MCParticle.getPDGID() == -11) {
+ posFound5HitExL0 = true;
+ if(MCParticle.getPY() > 0){
+ posTopExL0 = true;
+ }
+ else{
+ posBotExL0 = true;
+ }
+ }
+ }
+ if(TrackIsFindableExcludeLayer0(MCParticle,6)) {
+ Findable6HitExcludeLayer0++;
+ if(MCParticle.getPDGID() == 11){
+ eleFound6HitExL0 = true;
+ if(MCParticle.getPY() > 0){
+ eleTopExL0 = true;
+ }
+ else{
+ eleBotExL0 = true;
+ }
+ }
+ else if(MCParticle.getPDGID() == -11) {
+ posFound6HitExL0 = true;
+ if(MCParticle.getPY() > 0){
+ posTopExL0 = true;
+ }
+ else{
+ posBotExL0 = true;
+ }
+ }
+ }
+ //System.out.println("Pass9");
+ }
+
+ if((eleTop && posBot) || (eleBot && posTop)){
+ goodTrident++;
+ if(eleFound7Hit && posFound7Hit){
+ TridentsFindable7Hit++;
+ if(recoilFound7Hit) ThreeProngFindable7Hit++;
+ }
+ if((eleFound6Hit && posFound6Hit) || (eleFound7Hit && posFound6Hit) || (eleFound6Hit && posFound7Hit)){
+ TridentsFindable6Hit++;
+ if(recoilFound6Hit || recoilFound7Hit) ThreeProngFindable6Hit++;
+ }
+ if((eleFound5Hit && posFound5Hit) || (eleFound5Hit && posFound6Hit) || (eleFound5Hit && posFound7Hit) || (eleFound6Hit && posFound5Hit) || (eleFound7Hit && posFound5Hit)){
+ TridentsFindable5Hit++;
+ if(recoilFound5Hit || recoilFound6Hit || recoilFound7Hit) ThreeProngFindable5Hit++;
+ }
+ if((eleFound4Hit && posFound4Hit) || (eleFound4Hit && posFound5Hit) || (eleFound4Hit && posFound6Hit) || (eleFound4Hit && posFound7Hit) || (eleFound5Hit && posFound4Hit) || (eleFound6Hit && posFound4Hit) || (eleFound7Hit && posFound4Hit)){
+ TridentsFindable4Hit++;
+ if(recoilFound4Hit || recoilFound5Hit || recoilFound6Hit || recoilFound7Hit) ThreeProngFindable4Hit++;
+ }
+ }
+
+ if((eleTopInL0 && posBotInL0) || (eleBotInL0 && posTopInL0)){
+ goodTridentInL0++;
+ if((eleFound6HitInL0 && posFound6HitInL0) || (eleFound7Hit && posFound6HitInL0) || (eleFound6HitInL0 && posFound7Hit)){
+ TridentsFindable6HitLayer0++;
+ if(recoilFound6HitInL0 || recoilFound7Hit) ThreeProngFindable6HitLayer0++;
+ }
+ if((eleFound5HitInL0 && posFound5HitInL0) || (eleFound5HitInL0 && posFound6HitInL0) || (eleFound5HitInL0 && posFound7Hit) || (eleFound6HitInL0 && posFound5HitInL0) || (eleFound7Hit && posFound5HitInL0)){
+ TridentsFindable5HitLayer0++;
+ if(recoilFound5HitInL0 || recoilFound6HitInL0 || recoilFound7Hit) ThreeProngFindable5HitLayer0++;
+ }
+ if((eleFound4HitInL0 && posFound4HitInL0) || (eleFound4HitInL0 && posFound5HitInL0) || (eleFound4HitInL0 && posFound6HitInL0) || (eleFound4HitInL0 && posFound7Hit) || (eleFound5HitInL0 && posFound4HitInL0) || (eleFound6HitInL0 && posFound4HitInL0) || (eleFound7Hit && posFound4HitInL0)){
+ TridentsFindable4HitLayer0++;
+ if(recoilFound4HitInL0 || recoilFound5HitInL0 || recoilFound6HitInL0 || recoilFound7Hit) ThreeProngFindable4HitLayer0++;
+ }
+ }
+
+ if((eleTopExL0 && posBotExL0) || (eleBotExL0 && posTopExL0)){
+ goodTridentExL0++;
+ if((eleFound6HitExL0 && posFound6HitExL0)){
+ TridentsFindable6HitExcludeLayer0++;
+ if(recoilFound6HitExL0) ThreeProngFindable6HitExcludeLayer0++;
+ }
+ if((eleFound5HitExL0 && posFound5HitExL0) || (eleFound5HitExL0 && posFound6HitExL0) || (eleFound6HitExL0 && posFound5HitExL0)){
+ TridentsFindable5HitExcludeLayer0++;
+ if(recoilFound5HitExL0 || recoilFound6HitExL0) ThreeProngFindable5HitExcludeLayer0++;
+ }
+ if((eleFound4HitExL0 && posFound4HitExL0) || (eleFound4HitExL0 && posFound5HitExL0) || (eleFound4HitExL0 && posFound6HitExL0) || (eleFound5HitExL0 && posFound4HitExL0) || (eleFound6HitExL0 && posFound4HitExL0)){
+ TridentsFindable4HitExcludeLayer0++;
+ if(recoilFound4HitExL0 || recoilFound5HitExL0 || recoilFound6HitExL0) ThreeProngFindable4HitExcludeLayer0++;
+ }
+ }
+
+ /*for(MCParticle MCParticle : MCParticlelist){
+ List<MCParticle> Parents = MCParticle.getParents();
+ boolean trident = false;
+
+ for(MCParticle parent : Parents){
+ if(parent.getPDGID() == 622) trident = true;
+ }
+ if(!trident) continue;
+
+ }*/
+
+ List<List<Track>> trackCollections = event.get(Track.class);
+
+ for (List<Track> tracks : trackCollections) {
+
+ for(Track track : tracks){
+
+ HpsSiSensor trackSensor = (HpsSiSensor) ((RawTrackerHit)track.getTrackerHits().get(0).getRawHits().get(0)).getDetectorElement();
+
+ double d0 = track.getTrackStates().get(0).getD0();
+ //if(Math.abs(d0) > 10) continue;
+
+ NumberofHits.fill(track.getTrackerHits().get(0).getRawHits().size());
+ //System.out.println("Get Tracker Hits " + track.getTrackerHits());
+ //System.out.println("Get Raw Hits " + track.getTrackerHits().get(0).getRawHits());
+ //System.out.println("Get Raw Hits Get 0 " + track.getTrackerHits().get(0).getRawHits().get(0));
+ NumberofTracks.fill(tracks.size());
+ int nHits = track.getTrackerHits().size();
+ NumberofHits.fill(nHits);
+ boolean Layer0Hit =false;
+ // Calculate the momentum of the track
+ HelicalTrackFit hlc_trk_fit = TrackUtils.getHTF(track.getTrackStates().get(0));
+
+
+
+ double B_field = Math.abs(TrackUtils.getBField(event.getDetector()).y());
+
+ double p = hlc_trk_fit.p(B_field);
+ double pT = hlc_trk_fit.pT(B_field);
+ //double phi = hlc_trk_fit.phi0();
+ double tanLambda = track.getTrackStates().get(0).getTanLambda();
+ double phi = track.getTrackStates().get(0).getPhi();
+
+
+ P.fill(p);
+ Pt.fill(pT);
+ Px.fill(pT * Math.cos(phi));
+ Py.fill(pT * Math.sin(phi));
+ Pz.fill(pT * tanLambda);
+
+ Chi2.fill(track.getChi2());
+ TanLambda.fill(tanLambda);
+ D0.fill(d0);
+ Z0.fill(track.getTrackStates().get(0).getZ0());
+ Phi.fill(track.getTrackStates().get(0).getPhi());
+
+ for (TrackerHit stereoHit : stereoHits) {
+ HpsSiSensor hitSensor = (HpsSiSensor) ((RawTrackerHit) stereoHit.getRawHits().get(0)).getDetectorElement();
+
+ // Retrieve the layer number by using the sensor
+ int layer = (hitSensor.getLayerNumber() + 1)/2;
+ //nHits++;
+ if (layer == 1) Layer0Hit = true;
+ //System.out.println("Layer = " + layer + " nHits = " + nHits);
+ }
+ if(nHits >= 4) TracksFound4Hit++;
+ if(nHits >= 5) TracksFound5Hit++;
+ if(nHits >= 6) TracksFound6Hit++;
+ if(nHits >= 7) TracksFound7Hit++;
+
+ if(nHits >= 4 && Layer0Hit) TracksFound4HitLayer0++;
+ if(nHits >= 5 && Layer0Hit) TracksFound5HitLayer0++;
+ if(nHits >= 6 && Layer0Hit) TracksFound6HitLayer0++;
+
+ if(nHits >= 4 && !Layer0Hit) TracksFound4HitExcludeLayer0++;
+ if(nHits >= 5 && !Layer0Hit) TracksFound5HitExcludeLayer0++;
+ if(nHits >= 6 && !Layer0Hit) TracksFound6HitExcludeLayer0++;
+
+ NumberofHits.fill(nHits);
+ }
+ }
+ }
+ @Override
+ public void endOfData(){
+ System.out.println("Findable Tracks 4 Hits: " + Findable4Hit);
+ Findable.fill(4,Findable4Hit);
+ System.out.println("Findable Tracks 5 Hits: " + Findable5Hit);
+ Findable.fill(5,Findable5Hit);
+ System.out.println("Findable Tracks 6 Hits: " + Findable6Hit);
+ Findable.fill(6,Findable6Hit);
+ System.out.println("Findable Tracks 7 Hits: " + Findable7Hit);
+ Findable.fill(7,Findable7Hit);
+
+ System.out.println("Findable Tracks 4 Hits Require Layer0: " + Findable4HitLayer0);
+ FindableLayer0.fill(4,Findable4HitLayer0);
+ System.out.println("Findable Tracks 5 Hits Require Layer0: " + Findable5HitLayer0);
+ FindableLayer0.fill(5,Findable5HitLayer0);
+ System.out.println("Findable Tracks 6 Hits Require Layer0: " + Findable6HitLayer0);
+ FindableLayer0.fill(6,Findable6HitLayer0);
+
+ System.out.println("Findable Tracks 4 Hits Exclude Layer0: " + Findable4HitExcludeLayer0);
+ FindableExcludeLayer0.fill(4,Findable4HitExcludeLayer0);
+ System.out.println("Findable Tracks 5 Hits Exclude Layer0: " + Findable5HitExcludeLayer0);
+ FindableExcludeLayer0.fill(5,Findable5HitExcludeLayer0);
+ System.out.println("Findable Tracks 6 Hits Exclude Layer0: " + Findable6HitExcludeLayer0);
+ FindableExcludeLayer0.fill(6,Findable6HitExcludeLayer0);
+
+
+ System.out.println("Findable Tridents 4 Hits: " + TridentsFindable4Hit);
+ TridentFindable.fill(4,TridentsFindable4Hit);
+ System.out.println("Findable Tridents 5 Hits: " + TridentsFindable5Hit);
+ TridentFindable.fill(5,TridentsFindable5Hit);
+ System.out.println("Findable Tridents 6 Hits: " + TridentsFindable6Hit);
+ TridentFindable.fill(6,TridentsFindable6Hit);
+ System.out.println("Findable Tridents 7 Hits: " + TridentsFindable7Hit);
+ TridentFindable.fill(7,TridentsFindable7Hit);
+
+ System.out.println("Findable Tridents 4 Hits Require Layer0: " + TridentsFindable4HitLayer0);
+ TridentFindableLayer0.fill(4,TridentsFindable4HitLayer0);
+ System.out.println("Findable Tridents 5 Hits Require Layer0: " + TridentsFindable5HitLayer0);
+ TridentFindableLayer0.fill(5,TridentsFindable5HitLayer0);
+ System.out.println("Findable Tridents 6 Hits Require Layer0: " + TridentsFindable6HitLayer0);
+ TridentFindableLayer0.fill(6,TridentsFindable6HitLayer0);
+
+ System.out.println("Findable Tridents 4 Hits Exclude Layer0: " + TridentsFindable4HitExcludeLayer0);
+ TridentFindableExcludeLayer0.fill(4,TridentsFindable4HitExcludeLayer0);
+ System.out.println("Findable Tridents 5 Hits Exclude Layer0: " + TridentsFindable5HitExcludeLayer0);
+ TridentFindableExcludeLayer0.fill(5,TridentsFindable5HitExcludeLayer0);
+ System.out.println("Findable Tridents 6 Hits Exclude Layer0: " + TridentsFindable6HitExcludeLayer0);
+ TridentFindableExcludeLayer0.fill(6,TridentsFindable6HitExcludeLayer0);
+
+ System.out.println("Findable Recoils 4 Hits: " + Findable4HitRecoil);
+ FindableRecoil.fill(4,Findable4HitRecoil);
+ System.out.println("Findable Recoils 5 Hits: " + Findable5HitRecoil);
+ FindableRecoil.fill(5,Findable5HitRecoil);
+ System.out.println("Findable Recoils 6 Hits: " + Findable6HitRecoil);
+ FindableRecoil.fill(6,Findable6HitRecoil);
+ System.out.println("Findable Recoils 7 Hits: " + Findable7HitRecoil);
+ FindableRecoil.fill(7,Findable7HitRecoil);
+
+ System.out.println("Findable Recoils 4 Hits Require Layer0: " + Findable4HitLayer0Recoil);
+ FindableLayer0Recoil.fill(4,Findable4HitLayer0Recoil);
+ System.out.println("Findable Recoils 5 Hits Require Layer0: " + Findable5HitLayer0Recoil);
+ FindableLayer0Recoil.fill(5,Findable5HitLayer0Recoil);
+ System.out.println("Findable Recoils 6 Hits Require Layer0: " + Findable6HitLayer0Recoil);
+ FindableLayer0Recoil.fill(6,Findable6HitLayer0Recoil);
+
+ System.out.println("Findable Recoils 4 Hits Exclude Layer0: " + Findable4HitExcludeLayer0Recoil);
+ FindableExcludeLayer0Recoil.fill(4,Findable4HitExcludeLayer0Recoil);
+ System.out.println("Findable Recoils 5 Hits Exclude Layer0: " + Findable5HitExcludeLayer0Recoil);
+ FindableExcludeLayer0Recoil.fill(5,Findable5HitExcludeLayer0Recoil);
+ System.out.println("Findable Recoils 6 Hits Exclude Layer0: " + Findable6HitExcludeLayer0Recoil);
+ FindableExcludeLayer0Recoil.fill(6,Findable6HitExcludeLayer0Recoil);
+
+
+ System.out.println("Findable Three Prongs 4 Hits: " + ThreeProngFindable4Hit);
+ ThreeProngFindable.fill(4,ThreeProngFindable4Hit);
+ System.out.println("Findable Three Prongs 5 Hits: " + ThreeProngFindable5Hit);
+ ThreeProngFindable.fill(5,ThreeProngFindable5Hit);
+ System.out.println("Findable Three Prongs 6 Hits: " + ThreeProngFindable6Hit);
+ ThreeProngFindable.fill(6,ThreeProngFindable6Hit);
+ System.out.println("Findable Three Prongs 7 Hits: " + ThreeProngFindable7Hit);
+ ThreeProngFindable.fill(7,ThreeProngFindable7Hit);
+
+ System.out.println("Findable Three Prongs 4 Hits Require Layer0: " + ThreeProngFindable4HitLayer0);
+ ThreeProngFindableLayer0.fill(4,ThreeProngFindable4HitLayer0);
+ System.out.println("Findable Three Prongs 5 Hits Require Layer0: " + ThreeProngFindable5HitLayer0);
+ ThreeProngFindableLayer0.fill(5,ThreeProngFindable5HitLayer0);
+ System.out.println("Findable Three Prongs 6 Hits Require Layer0: " + ThreeProngFindable6HitLayer0);
+ ThreeProngFindableLayer0.fill(6,ThreeProngFindable6HitLayer0);
+
+ System.out.println("Findable Three Prongs 4 Hits Exclude Layer0: " + ThreeProngFindable4HitExcludeLayer0);
+ ThreeProngFindableExcludeLayer0.fill(4,ThreeProngFindable4HitExcludeLayer0);
+ System.out.println("Findable Three Prongs 5 Hits Exclude Layer0: " + ThreeProngFindable5HitExcludeLayer0);
+ ThreeProngFindableExcludeLayer0.fill(5,ThreeProngFindable5HitExcludeLayer0);
+ System.out.println("Findable Three Prongs 6 Hits Exclude Layer0: " + ThreeProngFindable6HitExcludeLayer0);
+ ThreeProngFindableExcludeLayer0.fill(6,ThreeProngFindable6HitExcludeLayer0);
+
+
+
+ System.out.println("Found Tracks 4 Hits: " + TracksFound4Hit);
+ TracksFound.fill(4,TracksFound4Hit);
+ System.out.println("Found Tracks 5 Hits: " + TracksFound5Hit);
+ TracksFound.fill(5,TracksFound5Hit);
+ System.out.println("Found Tracks 6 Hits: " + TracksFound6Hit);
+ TracksFound.fill(6,TracksFound6Hit);
+ System.out.println("Found Tracks 7 Hits: " + TracksFound7Hit);
+ TracksFound.fill(7,TracksFound7Hit);
+
+ System.out.println("Found Tracks 4 Hits Require Layer0: " + TracksFound4HitLayer0);
+ TracksFoundLayer0.fill(4,TracksFound4HitLayer0);
+ System.out.println("Found Tracks 5 Hits Require Layer0: " + TracksFound5HitLayer0);
+ TracksFoundLayer0.fill(5,TracksFound5HitLayer0);
+ System.out.println("Found Tracks 6 Hits Require Layer0: " + TracksFound6HitLayer0);
+ TracksFoundLayer0.fill(6,TracksFound6HitLayer0);
+
+ System.out.println("Found Tracks 4 Hits Exclude Layer0: " + TracksFound4HitExcludeLayer0);
+ TracksFoundExcludeLayer0.fill(4,TracksFound4HitExcludeLayer0);
+ System.out.println("Found Tracks 5 Hits Exclude Layer0: " + TracksFound5HitExcludeLayer0);
+ TracksFoundExcludeLayer0.fill(5,TracksFound5HitExcludeLayer0);
+ System.out.println("Found Tracks 6 Hits Exclude Layer0: " + TracksFound6HitExcludeLayer0);
+ TracksFoundExcludeLayer0.fill(6,TracksFound6HitExcludeLayer0);
+
+ NumberofEvents.fill(1,events);
+ System.out.println("Good Tridents = " + goodTrident);
+ System.out.println("Good Tridents Include L0 = " + goodTridentInL0);
+ System.out.println("Good Tridents Exclude L0 = " + goodTridentExL0);
+
+ System.out.println("%===================================================================%");
+ System.out.println("%====================== Layer 0 Acceptance Complete==========================%");
+ System.out.println("%===================================================================% \n%");
+ System.out.println("% \n%===================================================================%");
+ }
+
+
+ public boolean TrackIsFindable(MCParticle mcp, int nlayers) {
+ Set<SimTrackerHit> hitlist = _hittomc.allTo(mcp);
+ boolean[] sensorHit = { false, false, false, false, false, false, false, false, false, false, false, false, false, false };
+ boolean[] layerHit = { false, false, false, false, false, false, false };
+ int numHit = 0;
+ for (SimTrackerHit simhit : hitlist) {
+ sensorHit[simhit.getLayer() - 1] = true;
+ }
+ for(int i = 0; i < 7; i++){
+ if(sensorHit[2*i] == true && sensorHit[2*i+1] == true){
+ layerHit[i] = true;
+ }
+ }
+ for(int i = 0; i < 7; i++){
+ if(layerHit[i] == true){
+ numHit++;
+ }
+ }
+ if(numHit < nlayers){
+ return false;
+ }
+ else{
+ return true;
+ }
+ }
+
+ public boolean TrackIsFindableRequireLayer0(MCParticle mcp, int nlayers) {
+ Set<SimTrackerHit> hitlist = _hittomc.allTo(mcp);
+ boolean[] sensorHit = { false, false, false, false, false, false, false, false, false, false, false, false, false, false };
+ boolean[] layerHit = { false, false, false, false, false, false, false };
+ int numHit = 0;
+ for (SimTrackerHit simhit : hitlist) {
+ sensorHit[simhit.getLayer() - 1] = true;
+ }
+ for(int i = 0; i < 7; i++){
+ if(sensorHit[2*i] == true && sensorHit[2*i+1] == true){
+ layerHit[i] = true;
+ }
+ }
+ for(int i = 0; i < 7; i++){
+ if(layerHit[i] == true){
+ numHit++;
+ }
+ }
+ if(numHit < nlayers || layerHit[0] == false){
+ return false;
+ }
+ else{
+ return true;
+ }
+ }
+
+ public boolean TrackIsFindableExcludeLayer0(MCParticle mcp, int nlayers) {
+ Set<SimTrackerHit> hitlist = _hittomc.allTo(mcp);
+ boolean[] sensorHit = { false, false, false, false, false, false, false, false, false, false, false, false, false, false };
+ boolean[] layerHit = { false, false, false, false, false, false, false };
+ int numHit = 0;
+ for (SimTrackerHit simhit : hitlist) {
+ sensorHit[simhit.getLayer() - 1] = true;
+ }
+ for(int i = 0; i < 7; i++){
+ if(sensorHit[2*i] == true && sensorHit[2*i+1] == true){
+ layerHit[i] = true;
+ }
+ }
+ for(int i = 1; i < 7; i++){
+ if(layerHit[i] == true){
+ numHit++;
+ }
+ }
+ if(numHit < nlayers){
+ return false;
+ }
+ else{
+ return true;
+ }
+ }
+
+}
Added: java/branches/layer0-thin-branch/users/src/main/java/org/hps/users/mrsolt/Layer0Driver.java
=============================================================================
--- java/branches/layer0-thin-branch/users/src/main/java/org/hps/users/mrsolt/Layer0Driver.java (added)
+++ java/branches/layer0-thin-branch/users/src/main/java/org/hps/users/mrsolt/Layer0Driver.java Wed Nov 30 11:12:55 2016
@@ -0,0 +1,477 @@
+package org.hps.users.mrsolt;
+
+import hep.aida.IAnalysisFactory;
+import hep.aida.IFitFactory;
+import hep.aida.IFitResult;
+import hep.aida.IFitter;
+import hep.aida.IHistogram1D;
+import hep.aida.IHistogramFactory;
+import hep.aida.IPlotter;
+import hep.aida.IPlotterFactory;
+import hep.aida.IPlotterStyle;
+import hep.aida.ITree;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import org.hps.analysis.dataquality.SvtMonitoring;
+import org.hps.recon.tracking.gbl.GBLStripClusterData;
+import org.lcsim.event.EventHeader;
+import org.lcsim.event.GenericObject;
+import org.lcsim.geometry.Detector;
+import org.lcsim.util.Driver;
+import org.lcsim.util.aida.AIDA;
+
+
+/**
+ * DQM driver for track residuals in position and time
+ *
+ * @author mgraham on June 5, 2014
+ */
+// TODO: Add some quantities for DQM monitoring:
+public class Layer0Driver extends Driver {
+
+ static {
+ hep.aida.jfree.AnalysisFactory.register();
+ }
+
+ private static final Logger LOGGER = Logger.getLogger(Layer0Driver.class.getPackage().getName());
+
+ // Collection Names
+ String trackTimeDataCollectionName = "TrackTimeData";
+ String trackResidualsCollectionName = "TrackResiduals";
+ String gblStripClusterDataCollectionName = "GBLStripClusterData";
+
+ int nEvents = 0;
+
+ private AIDA aida = AIDA.defaultInstance();
+ ITree tree;
+ IHistogramFactory histogramFactory;
+ IPlotterFactory plotterFactory = IAnalysisFactory.create().createPlotterFactory();
+
+ private final String plotDir = "TrackResiduals/";
+ String[] trackingQuantNames = {};
+ private final int nmodules = 7;
+ private final int nsensors = 20;
+ private final String posresDir = "PostionResiduals/";
+ private final String uresDir = "UResiduals/";
+ private final String timeresDir = "TimeResiduals/";
+ private final String outputPlotDir = "ResidualsPlots/";
+ private boolean outputPlots = true;
+ private Map<String, Double> xposTopMeanResidMap;
+ private Map<String, Double> yposTopMeanResidMap;
+ private Map<String, Double> xposBotMeanResidMap;
+ private Map<String, Double> yposBotMeanResidMap;
+ private Map<String, Double> timeMeanResidMap;
+ private Map<String, Double> xposTopSigmaResidMap;
+ private Map<String, Double> yposTopSigmaResidMap;
+ private Map<String, Double> xposBotSigmaResidMap;
+ private Map<String, Double> yposBotSigmaResidMap;
+ private Map<String, Double> timeSigmaResidMap;
+ IHistogram1D[] xresidtop = new IHistogram1D[nmodules];
+ IHistogram1D[] yresidtop = new IHistogram1D[nmodules];
+ IHistogram1D[] xresidbot = new IHistogram1D[nmodules];
+ IHistogram1D[] yresidbot = new IHistogram1D[nmodules];
+ IHistogram1D[] utopresid = new IHistogram1D[nsensors];
+ IHistogram1D[] ubotresid = new IHistogram1D[nsensors];
+ IHistogram1D[] tresid = new IHistogram1D[nmodules * 2];
+ IHistogram1D xtopresidBS;
+ IHistogram1D ytopresidBS;
+ IHistogram1D xbotresidBS;
+ IHistogram1D ybotresidBS;
+
+// IHistogram2D[] utopresidVsU = new IHistogram2D[nsensors];
+// IHistogram2D[] ubotresidVsU = new IHistogram2D[nsensors];
+// IHistogram2D[] utopresidVsV = new IHistogram2D[nsensors];
+// IHistogram2D[] ubotresidVsV = new IHistogram2D[nsensors];
+ @Override
+ protected void detectorChanged(Detector detector) {
+
+ aida.tree().cd("/");
+ tree = aida.tree();
+ histogramFactory = IAnalysisFactory.create().createHistogramFactory(tree);
+ resetOccupancyMap();
+ for (int i = 1; i <= nmodules; i++) {
+ xresidtop[i - 1] = aida.histogram1D(plotDir + "/" + posresDir + "Module " + i + " Top x Residual", 50, -getRange(i, true), getRange(i, true));
+ yresidtop[i - 1] = aida.histogram1D(plotDir + "/" + posresDir + "Module " + i + " Top y Residual", 50, -getRange(i, false), getRange(i, false));
+ xresidbot[i - 1] = aida.histogram1D(plotDir + "/" + posresDir + "Module " + i + " Bot x Residual", 50, -getRange(i, true), getRange(i, true));
+ yresidbot[i - 1] = aida.histogram1D(plotDir + "/" + posresDir + "Module " + i + " Bot y Residual", 50, -getRange(i, false), getRange(i, false));
+ }
+
+ for (int i = 1; i <= nmodules * 2; i++) {
+ tresid[i - 1] = aida.histogram1D(plotDir + "/" + timeresDir + "HalfModule " + i + " t Residual", 50, -20, 20);
+ }
+ for (int i = 1; i <= nsensors; i++) {
+ utopresid[i - 1] = aida.histogram1D(plotDir + "/" + uresDir + "HalfModule " + i + " Top u Residual", 200, -Math.max(getRange((i + 1) / 2, false), 0.01), Math.max(getRange((i + 1) / 2, false), 0.01));
+ ubotresid[i - 1] = aida.histogram1D(plotDir + "/" + uresDir + "HalfModule " + i + " Bot u Residual", 200, -Math.max(getRange((i + 1) / 2, false), 0.01), Math.max(getRange((i + 1) / 2, false), 0.01));
+ }
+
+ ytopresidBS = aida.histogram1D(plotDir + "/" + uresDir + "BeamSpot Top y Residual", 200, -0.5, 0.5);
+ ybotresidBS = aida.histogram1D(plotDir + "/" + uresDir + "Beamspot Bot y Residual", 200, -0.5, 0.5);
+
+ xtopresidBS = aida.histogram1D(plotDir + "/" + uresDir + "BeamSpot Top x Residual", 200, -0.5, 0.5);
+ xbotresidBS = aida.histogram1D(plotDir + "/" + uresDir + "Beamspot Bot x Residual", 200, -0.5, 0.5);
+
+ }
+
+
+ @Override
+ public void process(EventHeader event) {
+ aida.tree().cd("/");
+ if (!event.hasCollection(GenericObject.class, trackResidualsCollectionName)) {
+ return;
+ }
+ nEvents++;
+ List<GenericObject> trdList = event.get(GenericObject.class, trackResidualsCollectionName);
+ for (GenericObject trd : trdList) {
+ int nResid = trd.getNDouble();
+ int isBot = trd.getIntVal(trd.getNInt() - 1);//last Int is the top/bottom flag
+ for (int i = 1; i <= nResid; i++) {
+ if (isBot == 1) {
+ xresidbot[i - 1].fill(trd.getDoubleVal(i - 1));//x is the double value in the generic object
+ yresidbot[i - 1].fill(trd.getFloatVal(i - 1));//y is the float value in the generic object
+ } else {
+ xresidtop[i - 1].fill(trd.getDoubleVal(i - 1));//x is the double value in the generic object
+ yresidtop[i - 1].fill(trd.getFloatVal(i - 1));//y is the float value in the generic object
+ }
+ }
+ }
+
+ if (event.hasCollection(GenericObject.class, trackTimeDataCollectionName)) {
+ List<GenericObject> ttdList = event.get(GenericObject.class, trackTimeDataCollectionName);
+ for (GenericObject ttd : ttdList) {
+ int nResid = ttd.getNDouble();
+ for (int i = 1; i <= nResid; i++) {
+ tresid[i - 1].fill(ttd.getDoubleVal(i - 1));//x is the double value in the generic object
+ }
+ }
+ }
+
+ if (!event.hasCollection(GenericObject.class, gblStripClusterDataCollectionName)) {
+ return;
+ }
+ List<GenericObject> gblSCDList = event.get(GenericObject.class, gblStripClusterDataCollectionName);
+ for (GenericObject gblSCD : gblSCDList) {
+ double umeas = gblSCD.getDoubleVal(GBLStripClusterData.GBLDOUBLE.UMEAS);//TODO: implement generic methods into GBLStripClusterData so this isn't hard coded
+ double utrk = gblSCD.getDoubleVal(GBLStripClusterData.GBLDOUBLE.TPOSU);//implement generic methods into GBLStripClusterData so this isn't hard coded
+ double vtrk = gblSCD.getDoubleVal(GBLStripClusterData.GBLDOUBLE.TPOSV);//implement generic methods into GBLStripClusterData so this isn't hard coded
+ double resid = umeas - utrk;
+ double tanlambda = gblSCD.getDoubleVal(GBLStripClusterData.GBLDOUBLE.TLAMBDA);//use the slope as a proxy for the top/bottom half of tracker
+
+ int i = gblSCD.getIntVal(GBLStripClusterData.GBLINT.ID);//implement generic methods into GBLStripClusterData so this isn't hard coded
+ if (i == 666) {
+ if (tanlambda > 0) {
+ xtopresidBS.fill(resid);
+ } else {
+ xbotresidBS.fill(resid);
+ }
+ } else if (i == 667) {
+ if (tanlambda > 0) {
+ ytopresidBS.fill(resid);
+ } else {
+ ybotresidBS.fill(resid);
+ }
+ } else if (tanlambda > 0) {
+ utopresid[i - 1].fill(resid);//x is the double value in the generic object
+ } // aida.histogram2D(plotDir + triggerType + "/"+uresDir + "HalfModule " + i + " Top u Residual vs. u").fill(utrk,resid);//x is the double value in the generic object
+ // aida.histogram2D(plotDir + triggerType + "/"+uresDir + "HalfModule " + i + " Top u Residual vs. v").fill(vtrk,resid);//x is the double value in the generic object
+ else {
+ ubotresid[i - 1].fill(resid);//x is the double value in the generic object
+ } // aida.histogram2D(plotDir + triggerType + "/"+uresDir + "HalfModule " + i + " Bot u Residual vs. u").fill(utrk,resid);//x is the double value in the generic object
+ // aida.histogram2D(plotDir + triggerType + "/"+uresDir + "HalfModule " + i + " Bot u Residual vs. v").fill(vtrk,resid);//x is the double value in the generic object
+ }
+ }
+
+ public void calculateEndOfRunQuantities() {
+ IAnalysisFactory analysisFactory = IAnalysisFactory.create();
+ IFitFactory fitFactory = analysisFactory.createFitFactory();
+ IFitter fitter = fitFactory.createFitter("chi2");
+ IPlotter plotterXTop = analysisFactory.createPlotterFactory().create("x-residual Top");
+ IPlotter plotterXBottom = analysisFactory.createPlotterFactory().create("x-residual Bottom");
+ IPlotter plotterYTop = analysisFactory.createPlotterFactory().create("y-residual Top");
+ IPlotter plotterYBottom = analysisFactory.createPlotterFactory().create("y-residual Bottom");
+
+ IPlotter plotterTime = analysisFactory.createPlotterFactory().create("Track Time");
+
+ plotterXTop.createRegions(2, 3);
+ IPlotterStyle pstyle = plotterXTop.style();
+ pstyle.legendBoxStyle().setVisible(false);
+ plotterXBottom.createRegions(2, 3);
+ IPlotterStyle pstyle2 = plotterXBottom.style();
+ pstyle2.legendBoxStyle().setVisible(false);
+
+ plotterYTop.createRegions(2, 3);
+ IPlotterStyle pstyle3 = plotterYTop.style();
+ pstyle3.legendBoxStyle().setVisible(false);
+ plotterYBottom.createRegions(2, 3);
+ IPlotterStyle pstyle4 = plotterYBottom.style();
+ pstyle4.legendBoxStyle().setVisible(false);
+
+ plotterTime.createRegions(3, 4);
+ IPlotterStyle pstyle5 = plotterTime.style();
+ pstyle5.legendBoxStyle().setVisible(false);
+
+ int irXTop = 0;
+ int irXBot = 0;
+ int irYTop = 0;
+ int irYBot = 0;
+ for (int i = 1; i <= nmodules; i++) {
+ IFitResult xresultTop = fitGaussian(xresidtop[i - 1], fitter, "range=\"(-1.0,1.0)\"");
+ IFitResult yresultTop = fitGaussian(yresidtop[i - 1], fitter, "range=\"(-0.5,0.5)\"");
+ IFitResult xresultBot = fitGaussian(xresidbot[i - 1], fitter, "range=\"(-1.0,1.0)\"");
+ IFitResult yresultBot = fitGaussian(yresidbot[i - 1], fitter, "range=\"(-8.0,8.0)\"");
+ if (xresultTop != null) {
+ double[] parsXTop = xresultTop.fittedParameters();
+ plotterXTop.region(irXTop).plot(xresidtop[i - 1]);
+ plotterXTop.region(irXTop).plot(xresultTop.fittedFunction());
+ irXTop++;
+ xposTopMeanResidMap.put(trackResidualsCollectionName + " " + getQuantityName(0, 0, 1, i) + "_x", parsXTop[1]);
+ xposTopSigmaResidMap.put(trackResidualsCollectionName + " " + getQuantityName(0, 1, 1, i) + "_x", parsXTop[2]);
+ }
+ if (yresultTop != null) {
+ double[] parsYTop = yresultTop.fittedParameters();
+
+ plotterYTop.region(irYTop).plot(yresidtop[i - 1]);
+ plotterYTop.region(irYTop).plot(yresultTop.fittedFunction());
+ irYTop++;
+ yposTopMeanResidMap.put(trackResidualsCollectionName + " " + getQuantityName(0, 0, 1, i) + "_y", parsYTop[1]);
+ yposTopSigmaResidMap.put(trackResidualsCollectionName + " " + getQuantityName(0, 1, 1, i) + "_y", parsYTop[2]);
+ }
+ if (xresultBot != null) {
+ double[] parsXBot = xresultBot.fittedParameters();
+ plotterXBottom.region(irXBot).plot(xresidbot[i - 1]);
+ plotterXBottom.region(irXBot).plot(xresultBot.fittedFunction());
+ irXBot++;
+ xposBotMeanResidMap.put(trackResidualsCollectionName + " " + getQuantityName(0, 0, 0, i) + "_x", parsXBot[1]);
+ xposBotSigmaResidMap.put(trackResidualsCollectionName + " " + getQuantityName(0, 1, 0, i) + "_x", parsXBot[2]);
+ }
+ if (yresultBot != null) {
+ double[] parsYBot = yresultBot.fittedParameters();
+ plotterYBottom.region(irYBot).plot(yresidbot[i - 1]);
+ plotterYBottom.region(irYBot).plot(yresultBot.fittedFunction());
+ irYBot++;
+ yposBotMeanResidMap.put(trackResidualsCollectionName + " " + getQuantityName(0, 0, 0, i) + "_y", parsYBot[1]);
+ yposBotSigmaResidMap.put(trackResidualsCollectionName + " " + getQuantityName(0, 1, 0, i) + "_y", parsYBot[2]);
+ }
+
+ }
+ int iTime = 0;
+ for (int i = 1; i <= nmodules * 2; i++) {
+ IFitResult tresult = fitGaussian(tresid[i - 1], fitter, "range=\"(-15.0,15.0)\"");
+ if (tresult != null) {
+ double[] parsTime = tresult.fittedParameters();
+ plotterTime.region(iTime).plot(tresid[i - 1]);
+ plotterTime.region(iTime).plot(tresult.fittedFunction());
+ iTime++;
+ timeMeanResidMap.put(trackTimeDataCollectionName + " " + getQuantityName(1, 0, 2, i) + "_dt", parsTime[1]);
+ timeSigmaResidMap.put(trackTimeDataCollectionName + " " + getQuantityName(1, 1, 2, i) + "_dt", parsTime[2]);
+ }
+
+ }
+
+ if (outputPlots) {
+ try {
+ plotterXTop.writeToFile(outputPlotDir + "X-Residuals-Top.png");
+ } catch (IOException ex) {
+ Logger.getLogger(SvtMonitoring.class.getName()).log(Level.SEVERE, null, ex);
+ }
+ try {
+ plotterYTop.writeToFile(outputPlotDir + "Y-Residuals-Top.png");
+ } catch (IOException ex) {
+ Logger.getLogger(SvtMonitoring.class.getName()).log(Level.SEVERE, null, ex);
+ }
+ try {
+ plotterXBottom.writeToFile(outputPlotDir + "X-Residuals-Bottom.png");
+ } catch (IOException ex) {
+ Logger.getLogger(SvtMonitoring.class.getName()).log(Level.SEVERE, null, ex);
+ }
+ try {
+ plotterYBottom.writeToFile(outputPlotDir + "Y-Residuals-Bottom.png");
+ } catch (IOException ex) {
+ Logger.getLogger(SvtMonitoring.class.getName()).log(Level.SEVERE, null, ex);
+ }
+ try {
+ plotterTime.writeToFile(outputPlotDir + "Time-Residuals.png");
+ } catch (IOException ex) {
+ Logger.getLogger(SvtMonitoring.class.getName()).log(Level.SEVERE, null, ex);
+ }
+ }
+ }
+
+ private String getQuantityName(int itype, int iquant, int top, int nlayer) {
+ String typeString = "position_resid";
+ String quantString = "mean_";
+ if (itype == 1) {
+ typeString = "time_resid";
+ }
+ if (iquant == 1) {
+ quantString = "sigma_";
+ }
+
+ String botString = "bot_";
+ if (top == 1) {
+ botString = "top_";
+ }
+ if (top == 2) {
+ botString = "";
+ }
+
+ String layerString = "module" + nlayer;
+ if (itype == 1) {
+ layerString = "halfmodule" + nlayer;
+ }
+
+ return typeString + quantString + botString + layerString;
+ }
+
+ public void printDQMData() {
+ LOGGER.info("TrackingResiduals::printDQMData");
+ for (Map.Entry<String, Double> entry : xposTopMeanResidMap.entrySet()) {
+ LOGGER.info(entry.getKey() + " = " + entry.getValue());
+ }
+ for (Map.Entry<String, Double> entry : xposBotMeanResidMap.entrySet()) {
+ LOGGER.info(entry.getKey() + " = " + entry.getValue());
+ }
+ for (Map.Entry<String, Double> entry : xposTopSigmaResidMap.entrySet()) {
+ LOGGER.info(entry.getKey() + " = " + entry.getValue());
+ }
+ for (Map.Entry<String, Double> entry : xposBotSigmaResidMap.entrySet()) {
+ LOGGER.info(entry.getKey() + " = " + entry.getValue());
+ }
+ for (Map.Entry<String, Double> entry : yposTopMeanResidMap.entrySet()) {
+ LOGGER.info(entry.getKey() + " = " + entry.getValue());
+ }
+ for (Map.Entry<String, Double> entry : yposBotMeanResidMap.entrySet()) {
+ LOGGER.info(entry.getKey() + " = " + entry.getValue());
+ }
+ for (Map.Entry<String, Double> entry : yposTopSigmaResidMap.entrySet()) {
+ LOGGER.info(entry.getKey() + " = " + entry.getValue());
+ }
+ for (Map.Entry<String, Double> entry : yposBotSigmaResidMap.entrySet()) {
+ LOGGER.info(entry.getKey() + " = " + entry.getValue());
+ }
+ for (Map.Entry<String, Double> entry : timeMeanResidMap.entrySet()) {
+ LOGGER.info(entry.getKey() + " = " + entry.getValue());
+ }
+ for (Map.Entry<String, Double> entry : timeSigmaResidMap.entrySet()) {
+ LOGGER.info(entry.getKey() + " = " + entry.getValue());
+ }
+ LOGGER.info("*******************************");
+ }
+
+ public void printDQMStrings() {
+ for (Map.Entry<String, Double> entry : xposTopMeanResidMap.entrySet()) {
+ LOGGER.info("ALTER TABLE dqm ADD " + entry.getKey() + " double;");
+ }
+ for (Map.Entry<String, Double> entry : xposBotMeanResidMap.entrySet()) {
+ LOGGER.info("ALTER TABLE dqm ADD " + entry.getKey() + " double;");
+ }
+ for (Map.Entry<String, Double> entry : xposTopSigmaResidMap.entrySet()) {
+ LOGGER.info("ALTER TABLE dqm ADD " + entry.getKey() + " double;");
+ }
+ for (Map.Entry<String, Double> entry : xposBotSigmaResidMap.entrySet()) {
+ LOGGER.info("ALTER TABLE dqm ADD " + entry.getKey() + " double;");
+ }
+ for (Map.Entry<String, Double> entry : yposTopMeanResidMap.entrySet()) {
+ LOGGER.info("ALTER TABLE dqm ADD " + entry.getKey() + " double;");
+ }
+ for (Map.Entry<String, Double> entry : yposBotMeanResidMap.entrySet()) {
+ LOGGER.info("ALTER TABLE dqm ADD " + entry.getKey() + " double;");
+ }
+ for (Map.Entry<String, Double> entry : yposTopSigmaResidMap.entrySet()) {
+ LOGGER.info("ALTER TABLE dqm ADD " + entry.getKey() + " double;");
+ }
+ for (Map.Entry<String, Double> entry : yposBotSigmaResidMap.entrySet()) {
+ LOGGER.info("ALTER TABLE dqm ADD " + entry.getKey() + " double;");
+ }
+ for (Map.Entry<String, Double> entry : timeMeanResidMap.entrySet()) {
+ LOGGER.info("ALTER TABLE dqm ADD " + entry.getKey() + " double;");
+ }
+ for (Map.Entry<String, Double> entry : timeSigmaResidMap.entrySet()) {
+ LOGGER.info("ALTER TABLE dqm ADD " + entry.getKey() + " double;");
+ }
+ }
+
+ private void resetOccupancyMap() {
+ xposBotMeanResidMap = new HashMap<>();
+ xposBotSigmaResidMap = new HashMap<>();
+ yposBotMeanResidMap = new HashMap<>();
+ yposBotSigmaResidMap = new HashMap<>();
+ xposTopMeanResidMap = new HashMap<>();
+ xposTopSigmaResidMap = new HashMap<>();
+ yposTopMeanResidMap = new HashMap<>();
+ yposTopSigmaResidMap = new HashMap<>();
+ timeMeanResidMap = new HashMap<>();
+ timeSigmaResidMap = new HashMap<>();
+ for (int i = 0; i < nmodules; i++) {
+ xposTopMeanResidMap.put(getQuantityName(0, 0, 1, i) + "_x", -999.);
+ yposTopMeanResidMap.put(getQuantityName(0, 0, 1, i) + "_y", -999.);
+ xposTopSigmaResidMap.put(getQuantityName(0, 1, 1, i) + "_x", -999.);
+ yposTopSigmaResidMap.put(getQuantityName(0, 1, 1, i) + "_y", -999.);
+ xposBotMeanResidMap.put(getQuantityName(0, 0, 0, i) + "_x", -999.);
+ yposBotMeanResidMap.put(getQuantityName(0, 0, 0, i) + "_y", -999.);
+ xposBotSigmaResidMap.put(getQuantityName(0, 1, 0, i) + "_x", -999.);
+ yposBotSigmaResidMap.put(getQuantityName(0, 1, 0, i) + "_y", -999.);
+ }
+ for (int i = 0; i < nmodules * 2; i++) {
+ timeMeanResidMap.put(getQuantityName(1, 0, 2, i) + "_dt", -999.);
+ timeSigmaResidMap.put(getQuantityName(1, 1, 2, i) + "_dt", -999.);
+ }
+
+ }
+
+ IFitResult fitGaussian(IHistogram1D h1d, IFitter fitter, String range) {
+ double[] init = {20.0, 0.0, 0.2};
+ IFitResult ifr = null;
+ try {
+ ifr = fitter.fit(h1d, "g", init, range);
+ } catch (RuntimeException ex) {
+ LOGGER.info(this.getClass().getSimpleName() + ": caught exception in fitGaussian");
+ }
+ return ifr;
+// double[] init = {20.0, 0.0, 1.0, 20, -1};
+// return fitter.fit(h1d, "g+p1", init, range);
+ }
+
+ private double getRange(int layer, boolean isX) {
+ double range = 2.5;
+ if (isX) {
+ switch (layer) {
+ case 1:
+ return 0.2;
+ case 2:
+ return 0.5;
+ case 3:
+ return 0.5;
+ case 4:
+ return 1.0;
+ case 5:
+ return 1.0;
+ case 6:
+ return 1.0;
+ }
+ } else {
+ switch (layer) {
+ case 1:
+ return 0.005;
+ case 2:
+ return 0.5;
+ case 3:
+ return 0.5;
+ case 4:
+ return 1.0;
+ case 5:
+ return 1.0;
+ case 6:
+ return 1.5;
+ }
+ }
+ return range;
+
+ }
+
+}
Added: java/branches/layer0-thin-branch/users/src/main/java/org/hps/users/mrsolt/Layer0Plots.java
=============================================================================
--- java/branches/layer0-thin-branch/users/src/main/java/org/hps/users/mrsolt/Layer0Plots.java (added)
+++ java/branches/layer0-thin-branch/users/src/main/java/org/hps/users/mrsolt/Layer0Plots.java Wed Nov 30 11:12:55 2016
@@ -0,0 +1,638 @@
+/**
+ * Analysis driver to calculate hit efficiencies in the SVT
+ */
+/**
+ * @author mrsolt
+ *
+ */
+package org.hps.users.mrsolt;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import hep.aida.IAnalysisFactory;
+import hep.aida.IHistogramFactory;
+import hep.aida.IPlotterFactory;
+import hep.aida.IPlotter;
+import hep.aida.IHistogram1D;
+import hep.aida.IHistogram2D;
+import hep.aida.ITree;
+import hep.physics.vec.BasicHep3Matrix;
+import hep.physics.vec.BasicHep3Vector;
+import hep.physics.vec.Hep3Vector;
+import hep.physics.vec.VecOp;
+
+import org.lcsim.detector.ITransform3D;
+import org.lcsim.detector.converter.compact.subdetector.SvtStereoLayer;
+import org.lcsim.detector.converter.compact.subdetector.HpsTracker2;
+import org.lcsim.detector.solids.Box;
+import org.lcsim.detector.solids.Point3D;
+import org.lcsim.detector.solids.Polygon3D;
+import org.lcsim.detector.tracker.silicon.ChargeCarrier;
+import org.lcsim.detector.tracker.silicon.HpsSiSensor;
+import org.lcsim.detector.tracker.silicon.SiSensor;
+import org.lcsim.detector.tracker.silicon.SiStrips;
+import org.lcsim.event.EventHeader;
+import org.lcsim.event.MCParticle;
+import org.lcsim.event.RawTrackerHit;
+import org.lcsim.event.ReconstructedParticle;
+import org.lcsim.event.SimTrackerHit;
+import org.lcsim.event.Track;
+import org.lcsim.event.TrackerHit;
+import org.lcsim.fit.helicaltrack.HelicalTrackCross;
+import org.lcsim.fit.helicaltrack.HelicalTrackFit;
+import org.lcsim.fit.helicaltrack.HelixUtils;
+import org.lcsim.geometry.Detector;
+import org.lcsim.util.Driver;
+import org.lcsim.util.aida.AIDA;
+import org.hps.recon.tracking.CoordinateTransformations;
+import org.hps.recon.tracking.TrackUtils;
+import org.hps.recon.tracking.TrackerHitUtils;
+import org.hps.users.mrsolt.FindableTrackLayer0;
+
+public class Layer0Plots extends Driver {
+
+
+ // Use JFreeChart as the default plotting backend
+ static {
+ hep.aida.jfree.AnalysisFactory.register();
+ }
+
+ // Plotting
+ protected AIDA aida = AIDA.defaultInstance();
+ ITree tree;
+ IHistogramFactory histogramFactory;
+ IPlotterFactory plotterFactory = IAnalysisFactory.create().createPlotterFactory();
+ protected Map<String, IPlotter> plotters = new HashMap<String, IPlotter>();
+ private Map<Integer, List<SvtStereoLayer>> topStereoLayers = new HashMap<Integer, List<SvtStereoLayer>>();
+ private Map<Integer, List<SvtStereoLayer>> bottomStereoLayers = new HashMap<Integer, List<SvtStereoLayer>>();
+ private static final String SUBDETECTOR_NAME = "Tracker";
+ private List<HpsSiSensor> sensors = null;
+
+ Map<Integer, IHistogram1D> UnbiasedResidualX_top = new HashMap<Integer,IHistogram1D>();
+ Map<Integer, IHistogram1D> UnbiasedResidualX_bot = new HashMap<Integer,IHistogram1D>();
+ Map<Integer, IHistogram1D> UnbiasedResidualY_top = new HashMap<Integer,IHistogram1D>();
+ Map<Integer, IHistogram1D> UnbiasedResidualY_bot = new HashMap<Integer,IHistogram1D>();
+
+ IHistogram1D UnbiasedResidualXTop;
+ IHistogram1D UnbiasedResidualYTop;
+ IHistogram1D UnbiasedResidualXBot;
+ IHistogram1D UnbiasedResidualYBot;
+ IHistogram1D trackMomentum;
+ IHistogram1D trackMomentumPlots_top;
+ IHistogram1D trackMomentumPlots_bot;
+ IHistogram1D trackChi2;
+ IHistogram1D trackChi2Top;
+ IHistogram1D trackChi2Bot;
+ IHistogram1D LayerHitTop;
+ IHistogram1D LayerHitBot;
+ IHistogram1D ExtrapTrackTopX;
+ IHistogram1D ExtrapTrackBotX;
+ IHistogram1D ExtrapTrackTopY;
+ IHistogram1D ExtrapTrackBotY;
+ IHistogram1D Hits0;
+ IHistogram1D Hits1;
+ IHistogram1D Hits2;
+ IHistogram1D Hits3;
+
+ IHistogram1D Accept0;
+ IHistogram1D Accept1;
+ IHistogram1D Accept2;
+ IHistogram1D Accept3;
+
+ IHistogram1D Findable4Hit;
+ IHistogram1D Findable4HitLayer0;
+ IHistogram1D Findable4HitExcludeLayer0;
+ IHistogram1D Findable5Hit;
+ IHistogram1D Findable5HitLayer0;
+ IHistogram1D Findable5HitExcludeLayer0;
+ IHistogram1D Findable6Hit;
+ IHistogram1D Findable6HitLayer0;
+ IHistogram1D Findable6HitExcludeLayer0;
+ IHistogram1D Findable7Hit;
+
+
+ IHistogram1D ThreeProngP;
+ IHistogram1D InvMass;
+ IHistogram1D Psum;
+
+
+ IHistogram2D ExtrapTrackTop;
+ IHistogram2D ExtrapTrackBot;
+ IHistogram2D Layer0TopNoAcceptance;
+ IHistogram2D Layer0BotNoAcceptance;
+ IHistogram2D Layer0TopAcceptance;
+ IHistogram2D Layer0BotAcceptance;
+
+ IHistogram1D ExtrapTrackTopYHighResidual;
+ IHistogram1D HitTopYHighResidual;
+ IHistogram1D ElectronPx;
+ IHistogram1D ElectronPy;
+ IHistogram1D ElectronPz;
+ IHistogram1D ElectronP;
+ IHistogram1D PositronPx;
+ IHistogram1D PositronPy;
+ IHistogram1D PositronPz;
+ IHistogram1D PositronP;
+ IHistogram1D Phi;
+
+ private String stereoHitCollectionName = "HelicalTrackHits";
+ private String trackCollectionName = "MatchedTracks";
+
+ int num_lay = 7;
+
+ double ebeam = 1.056;
+ double zPosTop = 59.3105;
+ double zPosBot = 40.843;
+ double eMass = 0.000511;
+
+ int[] countHits = new int[num_lay];
+ int[] countAccept = new int[num_lay];
+
+ public void detectorChanged(Detector detector){
+
+ aida.tree().cd("/");
+ tree = aida.tree();
+ 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.");
+ }
+
+ // Get the stereo layers from the geometry and build the stereo
+ // layer maps
+ List<SvtStereoLayer> stereoLayers
+ = ((HpsTracker2) detector.getSubdetector(SUBDETECTOR_NAME).getDetectorElement()).getStereoPairs();
+ for (SvtStereoLayer stereoLayer : stereoLayers) {
+ if (stereoLayer.getAxialSensor().isTopLayer()) {
+ //System.out.println("Adding stereo layer " + stereoLayer.getLayerNumber());
+ if (!topStereoLayers.containsKey(stereoLayer.getLayerNumber())) {
+ topStereoLayers.put(stereoLayer.getLayerNumber(), new ArrayList<SvtStereoLayer>());
+ }
+ topStereoLayers.get(stereoLayer.getLayerNumber()).add(stereoLayer);
+ } else {
+ if (!bottomStereoLayers.containsKey(stereoLayer.getLayerNumber())) {
+ bottomStereoLayers.put(stereoLayer.getLayerNumber(), new ArrayList<SvtStereoLayer>());
+ }
+ bottomStereoLayers.get(stereoLayer.getLayerNumber()).add(stereoLayer);
+ }
+ }
+
+ trackMomentum = aida.histogram1D("Track Momentum", 50, 0, ebeam*1.3);
+ trackMomentumPlots_top = aida.histogram1D("Track Momentum Top", 50, 0, ebeam*1.3);
+ trackMomentumPlots_bot = aida.histogram1D("Track Momentum Bot", 50, 0, ebeam*1.3);
+ UnbiasedResidualXTop = aida.histogram1D("Unbiased Residual X Top",100,-10,10);
+ UnbiasedResidualYTop = aida.histogram1D("Unbiased Residual Y Top",100,-10,10);
+ UnbiasedResidualXBot = aida.histogram1D("Unbiased Residual X Bot",100,-10,10);
+ UnbiasedResidualYBot = aida.histogram1D("Unbiased Residual Y Bot",100,-10,10);
+ trackChi2 = aida.histogram1D("Track Chi2",50,0,100);
+ trackChi2Top = aida.histogram1D("Track Chi2 Top",50,0,100);
+ trackChi2Bot = aida.histogram1D("Track Chi2 Bot",50,0,100);
+ LayerHitTop = aida.histogram1D("Layer Hit Top",8,0,8);
+ LayerHitBot = aida.histogram1D("Layer Hit Bot",8,0,8);
+
+ ExtrapTrackTopX = aida.histogram1D("Extrapolated Track X Top",50,-10,10);
+ ExtrapTrackBotX = aida.histogram1D("Extrapolated Track X Bot",50,-10,10);
+ ExtrapTrackTopY = aida.histogram1D("Extrapolated Track Y Top",50,-10,10);
+ ExtrapTrackBotY = aida.histogram1D("Extrapolated Track Y Bot",50,-10,10);
+
+ ExtrapTrackTop = aida.histogram2D("Extrapolated Track Position Top",50,-10,10,50,-10,10);
+ ExtrapTrackBot = aida.histogram2D("Extrapolated Track Position Bot",50,-10,10,50,-10,10);
+
+ Layer0TopNoAcceptance = aida.histogram2D("Extrapolated Track Position Top No Acceptance",50,-10,10,50,-10,10);
+ Layer0BotNoAcceptance = aida.histogram2D("Extrapolated Track Position Bot No Acceptance",50,-10,10,50,-10,10);
+ Layer0TopAcceptance = aida.histogram2D("Extrapolated Track Position Top Acceptance",50,-10,10,50,-10,10);
+ Layer0BotAcceptance = aida.histogram2D("Extrapolated Track Position Bot Acceptance",50,-10,10,50,-10,10);
+
+ Hits0 = aida.histogram1D("0 Hits",num_lay,0,num_lay);
+ Hits1 = aida.histogram1D("1 Hits",num_lay,0,num_lay);
+ Hits2 = aida.histogram1D("2 Hits",num_lay,0,num_lay);
+ Hits3 = aida.histogram1D("3 Hits",num_lay,0,num_lay);
+
+ Accept0 = aida.histogram1D("0 in Acceptance",num_lay,0,num_lay);
+ Accept1 = aida.histogram1D("1 in Acceptance",num_lay,0,num_lay);
+ Accept2 = aida.histogram1D("2 in Acceptance",num_lay,0,num_lay);
+ Accept3 = aida.histogram1D("3 in Acceptance",num_lay,0,num_lay);
+
+ ThreeProngP = aida.histogram1D("Total P of 3 Prong Event", 50, 0, ebeam*1.3);
+ Psum = aida.histogram1D("P Sum Trident Pair", 50, 0, ebeam*1.3);
+ InvMass = aida.histogram1D("Invariant Mass", 100, 0, 0.2);
+
+ ExtrapTrackTopYHighResidual = aida.histogram1D("Extrapolated Track Y Top High Residuals",50,-10,10);
+ HitTopYHighResidual = aida.histogram1D("Hit Position Y Top High Residuals",50,-10,10);
+
+ ElectronPx = aida.histogram1D("Electron Px", 50, -ebeam*0.5, ebeam*0.5);
+ ElectronPy = aida.histogram1D("Electron Py", 50, -ebeam*0.5, ebeam*0.5);
+ ElectronPz = aida.histogram1D("Electron Pz", 50, 0, ebeam*1.3);
+ ElectronP = aida.histogram1D("Electron P", 50, 0, ebeam*1.3);
+ PositronPx = aida.histogram1D("Positron Px", 50, -ebeam*0.5, ebeam*0.5);
+ PositronPy = aida.histogram1D("Positron Py", 50, -ebeam*0.5, ebeam*0.5);
+ PositronPz = aida.histogram1D("Positron Pz", 50, 0, ebeam*1.3);
+ PositronP = aida.histogram1D("Positron P", 50, 0, ebeam*1.3);
+
+ Findable4Hit = aida.histogram1D("Findable Tracks 4 Hits", num_lay, 0, num_lay);
+ Findable4HitLayer0 = aida.histogram1D("Findable Tracks 4 Hits Layer 0 Included", num_lay, 0, num_lay);
+ Findable4HitExcludeLayer0 = aida.histogram1D("Findable Tracks 4 Hits Layer 0 Excluded", num_lay, 0, num_lay);
+ Findable5Hit = aida.histogram1D("Findable Tracks 5 Hits", num_lay, 0, num_lay);
+ Findable5HitLayer0 = aida.histogram1D("Findable Tracks 5 Hits Layer 0 Included", num_lay, 0, num_lay);
+ Findable5HitExcludeLayer0 = aida.histogram1D("Findable Tracks 5 Hits Layer 0 Excluded", num_lay, 0, num_lay);
+ Findable6Hit = aida.histogram1D("Findable Tracks 6 Hits", num_lay, 0, num_lay);
+ Findable6HitLayer0 = aida.histogram1D("Findable Tracks 6 Hits Layer 0 Included", num_lay, 0, num_lay);
+ Findable6HitExcludeLayer0 = aida.histogram1D("Findable Tracks 6 Hits Layer 0 Excluded", num_lay, 0, num_lay);
+ Findable7Hit = aida.histogram1D("Findable Tracks 7 Hits", num_lay, 0, num_lay);
+
+
+ Phi = aida.histogram1D("Phi", 500, -2*Math.PI, 2*Math.PI);
+
+
+ for(int i = 0; i < num_lay; i++){
+ UnbiasedResidualX_top.put((i+1),histogramFactory.createHistogram1D("Unbiased Residual X Top Layer #" + (i+1),100,-10,10));
+ UnbiasedResidualX_bot.put((i+1),histogramFactory.createHistogram1D("Unbiased Residual X Bot Layer #" + (i+1),100,-10,10));
+ UnbiasedResidualY_top.put((i+1),histogramFactory.createHistogram1D("Unbiased Residual Y Top Layer #" + (i+1),100,-10,10));
+ UnbiasedResidualY_bot.put((i+1),histogramFactory.createHistogram1D("Unbiased Residual Y Bot Layer #" + (i+1),100,-10,10));
+ }
+
+ for (IPlotter plotter : plotters.values()) {
+ //plotter.show();
+ }
+ }
+
+
+ @Override
+ public void process(EventHeader event){
+ aida.tree().cd("/");
+
+ System.out.println("Pass1");
+
+ // If the event does not have tracks, skip it
+ //if(!event.hasCollection(Track.class, trackCollectionName)) return;
+
+ // Get the list of tracks from the event
+ List<List<Track>> trackCollections = event.get(Track.class);
+
+ List<Track> tracks = event.get(Track.class, trackCollectionName);
+
+ List<TrackerHit> stereoHits = event.get(TrackerHit.class, stereoHitCollectionName);
+
+ for(int i = 0; i<num_lay; i++){
+ countHits[i] = 0;
+ countAccept[i] = 0;
+ }
+
+ double totalPx = 0;
+ double totalPy = 0;
+ double totalPz = 0;
+ double EleP = 0;
+ double ElePx = 0;
+ double ElePy = 0;
+ double ElePz = 0;
+ double PosP = 0;
+ double PosPx = 0;
+ double PosPy = 0;
+ double PosPz = 0;
+ int electrons = 0;
+ int positrons = 0;
+
+ //for (List<Track> tracks : trackCollections) {
+
+ System.out.println("Pass2");
+
+ for(Track track : tracks){
+
+ HpsSiSensor trackSensor = (HpsSiSensor) ((RawTrackerHit)track.getTrackerHits().get(0).getRawHits().get(0)).getDetectorElement();
+
+
+ // Calculate the momentum of the track
+ HelicalTrackFit hlc_trk_fit = TrackUtils.getHTF(track.getTrackStates().get(0));
+
+ System.out.println("Pass3");
+
+ double B_field = Math.abs(TrackUtils.getBField(event.getDetector()).y());
+
+ double p = hlc_trk_fit.p(B_field);
+ double pT = hlc_trk_fit.pT(B_field);
+ double phi = hlc_trk_fit.phi0();
+ double tanLambda = track.getTrackStates().get(0).getTanLambda();
+
+ //totalPx = totalPx + pT * Math.cos(phi);
+ totalPy = totalPy + pT * Math.sin(phi);
+ //totalPz = totalPz + Math.sqrt(p*p-pT*pT);
+ totalPz = pT * tanLambda;
+ totalPx = totalPx + Math.sqrt(p*p-Math.pow(pT*Math.sin(phi), 2)-Math.pow(pT*tanLambda, 2));
+
+ System.out.println("Pass4");
+
+ if(track.getCharge() < 0){
+ EleP = p;
+ //ElePx = pT * Math.cos(phi);
+ ElePy = pT * Math.sin(phi);
+ //ElePz = Math.sqrt(p*p-pT*pT);
+ ElePz = pT * tanLambda;
+ ElePx = Math.sqrt(p*p-ElePy*ElePy-ElePz*ElePz);
+ electrons++;
+ }
+ else{
+ PosP = p;
+ //PosPx = pT * Math.cos(phi);
+ PosPy = pT * Math.sin(phi);
+ //PosPz = Math.sqrt(p*p-pT*pT);
+ PosPz = pT * tanLambda;
+ PosPx = Math.sqrt(p*p-PosPy*PosPy-PosPz*PosPz);
+ positrons++;
+ }
+
+ System.out.println("Pass5");
+
+ Phi.fill(phi);
+ trackMomentum.fill(p);
+ trackChi2.fill(track.getChi2());
+ if (trackSensor.isTopLayer()) {
+ Hep3Vector extrapTrackPos = TrackUtils.extrapolateTrack(track, zPosTop);
+ double extrapTrackX = extrapTrackPos.x();
+ double extrapTrackY = extrapTrackPos.y();
+ trackMomentumPlots_top.fill(p);
+ trackChi2Top.fill(track.getChi2());
+ ExtrapTrackTopX.fill(extrapTrackX);
+ ExtrapTrackTopY.fill(extrapTrackY);
+ ExtrapTrackTop.fill(extrapTrackX,extrapTrackY);
+ } else {
+ trackMomentumPlots_bot.fill(p);
+ Hep3Vector extrapTrackPos = TrackUtils.extrapolateTrack(track, zPosBot);
+ double extrapTrackX = extrapTrackPos.x();
+ double extrapTrackY = extrapTrackPos.y();
+ trackChi2Bot.fill(track.getChi2());
+ ExtrapTrackBotX.fill(extrapTrackX);
+ ExtrapTrackBotY.fill(extrapTrackY);
+ ExtrapTrackBot.fill(extrapTrackX,extrapTrackY);
+ }
+ System.out.println("Pass6");
+ for(int i = 0; i < num_lay; i++){
+ if(isWithinAcceptance(track, i + 1)){
+ countAccept[i]++;
+ if(i == 0){
+ if (trackSensor.isTopLayer()) {
+ Hep3Vector extrapTrackPos = TrackUtils.extrapolateTrack(track, zPosTop);
+ double extrapTrackX = extrapTrackPos.x();
+ double extrapTrackY = extrapTrackPos.y();
+ Layer0TopAcceptance.fill(extrapTrackX,extrapTrackY);
+ }
+ else{
+ Hep3Vector extrapTrackPos = TrackUtils.extrapolateTrack(track, zPosBot);
+ double extrapTrackX = extrapTrackPos.x();
+ double extrapTrackY = extrapTrackPos.y();
+ Layer0BotAcceptance.fill(extrapTrackX,extrapTrackY);
+ }
+ }
+ }
+ else{
+ if(i == 0){
+ if (trackSensor.isTopLayer()) {
+ Hep3Vector extrapTrackPos = TrackUtils.extrapolateTrack(track, zPosTop);
+ double extrapTrackX = extrapTrackPos.x();
+ double extrapTrackY = extrapTrackPos.y();
+ Layer0TopNoAcceptance.fill(extrapTrackX,extrapTrackY);
+ }
+ else{
+ Hep3Vector extrapTrackPos = TrackUtils.extrapolateTrack(track, zPosBot);
+ double extrapTrackX = extrapTrackPos.x();
+ double extrapTrackY = extrapTrackPos.y();
+ Layer0BotNoAcceptance.fill(extrapTrackX,extrapTrackY);
+ }
+ }
+ }
+ }
+ System.out.println("Pass7");
+
+ for (TrackerHit stereoHit : stereoHits) {
+ HpsSiSensor hitSensor = (HpsSiSensor) ((RawTrackerHit) stereoHit.getRawHits().get(0)).getDetectorElement();
+ System.out.println("Pass8");
+ // Retrieve the layer number by using the sensor
+ int layer = (hitSensor.getLayerNumber() + 1)/2;
+ countHits[layer-1]++;
+
+ Hep3Vector stereoHitPosition = new BasicHep3Vector(stereoHit.getPosition());
+ Hep3Vector trackPosition = TrackUtils.extrapolateTrack(track, stereoHitPosition.z());
+ double xResidual = trackPosition.x() - stereoHitPosition.x();
+ double yResidual = trackPosition.y() - stereoHitPosition.y();
+ System.out.println("Pass9");
+ if (hitSensor.isTopLayer()) {
+ UnbiasedResidualX_top.get(layer).fill(xResidual);
+ UnbiasedResidualY_top.get(layer).fill(yResidual);
+ UnbiasedResidualXTop.fill(xResidual);
+ UnbiasedResidualYTop.fill(yResidual);
+ LayerHitTop.fill(layer);
+ if(layer == 1){
+ if(yResidual<-2){
+ ExtrapTrackTopYHighResidual.fill(trackPosition.y());
+ HitTopYHighResidual.fill(stereoHitPosition.y());
+ }
+ }
+ }
+ else{
+ UnbiasedResidualX_bot.get(layer).fill(xResidual);
+ UnbiasedResidualY_bot.get(layer).fill(yResidual);
+ UnbiasedResidualXBot.fill(xResidual);
+ UnbiasedResidualYBot.fill(yResidual);
+ LayerHitBot.fill(layer);
+ }
+ }
+ System.out.println("Pass10");
+ }
+ double massSqr = EleP*EleP + PosP*PosP + 2*eMass*eMass + 2*Math.sqrt(EleP*EleP+eMass*eMass)*Math.sqrt(PosP*PosP+eMass*eMass)-(Math.pow(ElePx+PosPx,2)+Math.pow(ElePy+PosPy,2)+Math.pow(ElePz+PosPz,2));
+ //double massSqr = Math.pow(EleP+PosP,2) - (Math.pow(ElePx+PosPx,2)+Math.pow(ElePy+PosPy,2)+Math.pow(ElePz+PosPz,2));
+ //double EleE = Math.sqrt(EleP*EleP + eMass*eMass);
+ //double PosE = Math.sqrt(PosP*PosP + eMass*eMass);
+ //double BetaE =;
+ //double BetaP;
+ //double theta;
+ //double massSqr = 2*(eMass*eMass + EleE*PosE*(1 - BetaE*BetaP*Math.cos(theta)));
+ //InvMass.fill(Math.sqrt(massSqr));
+ System.out.println("Pass11");
+ for(int i = 0; i < num_lay; i++){
+ if(countHits[i] == 3){
+ Hits3.fill(i);
+ }
+ else if(countHits[i] == 2){
+ Hits2.fill(i);
+ }
+ else if(countHits[i] == 1){
+ Hits1.fill(i);
+ }
+ else if(countHits[i] == 0){
+ Hits0.fill(i);
+ }
+ }
+ System.out.println("Pass12");
+ for(int i = 0; i < num_lay; i++){
+ if(countAccept[i] == 3){
+ Accept3.fill(i);
+ if(i == 0){
+ double totalP = Math.sqrt(totalPx*totalPx + totalPy*totalPy + totalPz*totalPz);
+ ThreeProngP.fill(totalP);
+ }
+ }
+ else if(countAccept[i] == 2){
+ Accept2.fill(i);
+ }
+ else if(countAccept[i] == 1){
+ Accept1.fill(i);
+ }
+ else if(countAccept[i] == 0){
+ Accept0.fill(i);
+ }
+ }
+ System.out.println("Pass13");
+ if(electrons == 1 && positrons == 1 && massSqr > 0){
+ InvMass.fill(Math.sqrt(massSqr));
+ Psum.fill(EleP+PosP);
+ ElectronPx.fill(ElePx);
+ ElectronPy.fill(ElePy);
+ ElectronPz.fill(ElePz);
+ ElectronP.fill(EleP);
+ PositronPx.fill(PosPx);
+ PositronPy.fill(PosPy);
+ PositronPz.fill(PosPz);
+ PositronP.fill(PosP);
+ }
+ System.out.println("Pass14");
+ }
+ //}
+
+
+ @Override
+ public void endOfData(){
+ System.out.println("%===================================================================%");
+ System.out.println("%====================== Layer 0 Plots Complete==========================%");
+ System.out.println("%===================================================================% \n%");
+ System.out.println("% \n%===================================================================%");
+ }
+
+ private boolean isWithinAcceptance(Track track, int layer) {
+
+ // TODO: Move this to a utility class
+
+ //System.out.println("Retrieving sensors for layer: " + layer);
+
+ // Since TrackUtils.isTop/BottomTrack does not work when running off
+ // a recon file, get the detector volume that a track is associated
+ // with by using the sensor. This assumes that a track is always
+ // composed by stereo hits that lie within a single detector volume
+ HpsSiSensor sensor = (HpsSiSensor) ((RawTrackerHit)track.getTrackerHits().get(0).getRawHits().get(0)).getDetectorElement();
+
+ // Get the sensors associated with the layer that the track
+ // will be extrapolated to
+ List<SvtStereoLayer> stereoLayers = null;
+
+ // if (TrackUtils.isTopTrack(track, track.getTrackerHits().size())) {
+ if (sensor.isTopLayer()) {
+ //System.out.println("Top track found.");
+ stereoLayers = this.topStereoLayers.get(layer);
+ //} else if (TrackUtils.isBottomTrack(track, track.getTrackerHits().size())) {
+ } else {
+ //System.out.println("Bottom track found.");
+ stereoLayers = this.bottomStereoLayers.get(layer);
+ }
+
+ for (SvtStereoLayer stereoLayer : stereoLayers) {
+ Hep3Vector axialSensorPosition = stereoLayer.getAxialSensor().getGeometry().getPosition();
+ Hep3Vector stereoSensorPosition = stereoLayer.getStereoSensor().getGeometry().getPosition();
+
+ //System.out.println("Axial sensor position: " + axialSensorPosition.toString());
+ //System.out.println("Stereo sensor position: " + stereoSensorPosition.toString());
+
+ Hep3Vector axialTrackPos = TrackUtils.extrapolateTrack(track, axialSensorPosition.z());
+ Hep3Vector stereoTrackPos = TrackUtils.extrapolateTrack(track, stereoSensorPosition.z());
+
+ //System.out.println("Track position at axial sensor: " + axialTrackPos.toString());
+ //System.out.println("Track position at stereo sensor: " + stereoTrackPos.toString());
+
+ if(this.sensorContainsTrack(axialTrackPos, stereoLayer.getAxialSensor())
+ && this.sensorContainsTrack(stereoTrackPos, stereoLayer.getStereoSensor())){
+ //System.out.println("Track lies within layer acceptance.");
+ return true;
+ }
+ }
+
+ return false;
+
+ /*int layerNumber = (layer - 1)/2 + 1;
+ String title = "Track Position - Layer " + layerNumber + " - Tracks Within Acceptance";
+ //aida.histogram2D(title).fill(trackPos.y(), trackPos.z());
+ //aida.cloud2D(title).fill(frontTrackPos.y(), frontTrackPos.z()); */
+
+ }
+
+ public boolean sensorContainsTrack(Hep3Vector trackPosition, HpsSiSensor sensor){
+
+
+ ITransform3D localToGlobal = sensor.getGeometry().getLocalToGlobal();
+
+ Hep3Vector sensorPos = sensor.getGeometry().getPosition();
+ Box sensorSolid = (Box) sensor.getGeometry().getLogicalVolume().getSolid();
+ Polygon3D sensorFace = sensorSolid.getFacesNormalTo(new BasicHep3Vector(0, 0, 1)).get(0);
+
+ List<Point3D> vertices = new ArrayList<Point3D>();
+ for(int index = 0; index < 4; index++){
+ vertices.add(new Point3D());
+ }
+ for(Point3D vertex : sensorFace.getVertices()){
+ if(vertex.y() < 0 && vertex.x() > 0){
+ localToGlobal.transform(vertex);
+ //vertices.set(0, new Point3D(vertex.y() + sensorPos.x(), vertex.x() + sensorPos.y(), vertex.z() + sensorPos.z()));
+ vertices.set(0, new Point3D(vertex.x(), vertex.y(), vertex.z()));
+ //System.out.println(this.getClass().getSimpleName() + ": Vertex 1 Position: " + vertices.get(0).toString());
+ //System.out.println(this.getClass().getSimpleName() + ": Transformed Vertex 1 Position: " + localToGlobal.transformed(vertex).toString());
+ }
+ else if(vertex.y() > 0 && vertex.x() > 0){
+ localToGlobal.transform(vertex);
+ //vertices.set(1, new Point3D(vertex.y() + sensorPos.x(), vertex.x() + sensorPos.y(), vertex.z() + sensorPos.z()));
+ vertices.set(1, new Point3D(vertex.x(), vertex.y(), vertex.z()));
+ //System.out.println(this.getClass().getSimpleName() + ": Vertex 2 Position: " + vertices.get(1).toString());
+ //System.out.println(this.getClass().getSimpleName() + ": Transformed Vertex 2 Position: " + localToGlobal.transformed(vertex).toString());
+ }
+ else if(vertex.y() > 0 && vertex.x() < 0){
+ localToGlobal.transform(vertex);
+ //vertices.set(2, new Point3D(vertex.y() + sensorPos.x(), vertex.x() + sensorPos.y(), vertex.z() + sensorPos.z()));
+ vertices.set(2, new Point3D(vertex.x(), vertex.y(), vertex.z()));
+ //System.out.println(this.getClass().getSimpleName() + ": Vertex 3 Position: " + vertices.get(2).toString());
+ //System.out.println(this.getClass().getSimpleName() + ": Transformed Vertex 3 Position: " + localToGlobal.transformed(vertex).toString());
+ }
+ else if(vertex.y() < 0 && vertex.x() < 0){
+ localToGlobal.transform(vertex);
+ //vertices.set(3, new Point3D(vertex.y() + sensorPos.x(), vertex.x() + sensorPos.y(), vertex.z() + sensorPos.z()));
+ vertices.set(3, new Point3D(vertex.x(), vertex.y(), vertex.z()));
+ //System.out.println(this.getClass().getSimpleName() + ": Vertex 4 Position: " + vertices.get(3).toString());
+ //System.out.println(this.getClass().getSimpleName() + ": Transformed Vertex 4 Position: " + localToGlobal.transformed(vertex).toString());
+ }
+ }
+
+ /*
+ double area1 = this.findTriangleArea(vertices.get(0).x(), vertices.get(0).y(), vertices.get(1).x(), vertices.get(1).y(), trackPosition.y(), trackPosition.z());
+ double area2 = this.findTriangleArea(vertices.get(1).x(), vertices.get(1).y(), vertices.get(2).x(), vertices.get(2).y(), trackPosition.y(), trackPosition.z());
+ double area3 = this.findTriangleArea(vertices.get(2).x(), vertices.get(2).y(), vertices.get(3).x(), vertices.get(3).y(), trackPosition.y(), trackPosition.z());
+ double area4 = this.findTriangleArea(vertices.get(3).x(), vertices.get(3).y(), vertices.get(0).x(), vertices.get(0).y(), trackPosition.y(), trackPosition.z());
+ */
+
+ double area1 = this.findTriangleArea(vertices.get(0).x(), vertices.get(0).y(), vertices.get(1).x(), vertices.get(1).y(), trackPosition.x(), trackPosition.y());
+ double area2 = this.findTriangleArea(vertices.get(1).x(), vertices.get(1).y(), vertices.get(2).x(), vertices.get(2).y(), trackPosition.x(), trackPosition.y());
+ double area3 = this.findTriangleArea(vertices.get(2).x(), vertices.get(2).y(), vertices.get(3).x(), vertices.get(3).y(), trackPosition.x(), trackPosition.y());
+ double area4 = this.findTriangleArea(vertices.get(3).x(), vertices.get(3).y(), vertices.get(0).x(), vertices.get(0).y(), trackPosition.x(), trackPosition.y());
+
+ if((area1 > 0 && area2 > 0 && area3 > 0 && area4 > 0) || (area1 < 0 && area2 < 0 && area3 < 0 && area4 < 0)) return true;
+ return false;
+ }
+
+ public double findTriangleArea(double x0, double y0, double x1, double y1, double x2, double y2){
+ return .5*(x1*y2 - y1*x2 -x0*y2 + y0*x2 + x0*y1 - y0*x1);
+ }
+
+ }
Added: java/branches/layer0-thin-branch/users/src/main/java/org/hps/users/mrsolt/Layer0ReconParticle.java
=============================================================================
--- java/branches/layer0-thin-branch/users/src/main/java/org/hps/users/mrsolt/Layer0ReconParticle.java (added)
+++ java/branches/layer0-thin-branch/users/src/main/java/org/hps/users/mrsolt/Layer0ReconParticle.java Wed Nov 30 11:12:55 2016
@@ -0,0 +1,557 @@
+/**
+ * Analysis driver to calculate hit efficiencies in the SVT
+ */
+/**
+ * @author mrsolt
+ *
+ */
+
+package org.hps.users.mrsolt;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import hep.aida.IAnalysisFactory;
+import hep.aida.IHistogramFactory;
+import hep.aida.IPlotterFactory;
+import hep.aida.IPlotter;
+import hep.aida.IHistogram1D;
+import hep.aida.IHistogram2D;
+import hep.aida.ITree;
+import hep.physics.vec.BasicHep3Matrix;
+import hep.physics.vec.BasicHep3Vector;
+import hep.physics.vec.Hep3Vector;
+import hep.physics.vec.VecOp;
+
+import org.lcsim.detector.converter.compact.subdetector.SvtStereoLayer;
+import org.lcsim.detector.tracker.silicon.HpsSiSensor;
+import org.lcsim.event.EventHeader;
+import org.lcsim.event.MCParticle;
+import org.lcsim.event.RawTrackerHit;
+import org.lcsim.event.ReconstructedParticle;
+import org.lcsim.event.RelationalTable;
+import org.lcsim.event.SimTrackerHit;
+import org.lcsim.event.Track;
+import org.lcsim.event.TrackerHit;
+import org.lcsim.event.Vertex;
+import org.lcsim.geometry.Detector;
+import org.lcsim.recon.tracking.seedtracker.SeedTrack;
+import org.lcsim.util.Driver;
+import org.lcsim.util.aida.AIDA;
+import org.hps.recon.tracking.TrackType;
+import org.hps.recon.tracking.TrackUtils;
+import org.hps.recon.tracking.TrackerHitUtils;
+import org.hps.recon.vertexing.BilliorTrack;
+import org.hps.recon.vertexing.BilliorVertex;
+import org.hps.recon.vertexing.BilliorVertexer;
+import org.hps.users.mrsolt.FindableTrackLayer0;
+import org.lcsim.event.base.BaseRelationalTable;
+import org.lcsim.fit.helicaltrack.HelicalTrackFit;
+import org.lcsim.fit.helicaltrack.HitIdentifier;
+
+
+public class Layer0ReconParticle extends Driver {
+
+
+ // Use JFreeChart as the default plotting backend
+ static {
+ hep.aida.jfree.AnalysisFactory.register();
+ }
+
+ // Plotting
+ protected AIDA aida = AIDA.defaultInstance();
+ ITree tree;
+ IHistogramFactory histogramFactory;
+ IPlotterFactory plotterFactory = IAnalysisFactory.create().createPlotterFactory();
+ protected Map<String, IPlotter> plotters = new HashMap<String, IPlotter>();
+ private Map<Integer, List<SvtStereoLayer>> topStereoLayers = new HashMap<Integer, List<SvtStereoLayer>>();
+ private Map<Integer, List<SvtStereoLayer>> bottomStereoLayers = new HashMap<Integer, List<SvtStereoLayer>>();
+ private static final String SUBDETECTOR_NAME = "Tracker";
+ RelationalTable<SimTrackerHit, MCParticle> _hittomc = null;
+ private List<HpsSiSensor> sensors = null;
+ private double _bfield;
+ private HitIdentifier _ID;
+ private int _nlayersTot = 14;
+ double eBeam = 1.05;
+ double maxFactor = 1.25;
+
+
+ IHistogram1D unconMass;
+ IHistogram1D unconVx;
+ IHistogram1D unconVy;
+ IHistogram1D unconVz;
+ IHistogram1D unconChi2;
+ IHistogram2D unconVzVsChi2;
+ IHistogram2D unconChi2VsTrkChi2;
+ /* beamspot constrained */
+
+ IHistogram1D nV0;
+
+ IHistogram1D v0Time;
+ IHistogram1D v0Dt;
+ IHistogram2D trigTimeV0Time;
+ IHistogram1D trigTime;
+
+ IHistogram1D bsconMass;
+ IHistogram1D bsconVx;
+ IHistogram1D bsconVy;
+ IHistogram1D bsconVz;
+ IHistogram1D bsconChi2;
+ IHistogram2D bsconVzVsChi2;
+ IHistogram2D bsconChi2VsTrkChi2;
+ /* target constrained */
+ IHistogram1D tarconMass;
+ IHistogram1D tarconVx;
+ IHistogram1D tarconVy;
+ IHistogram1D tarconVz;
+ IHistogram1D tarconChi2;
+ IHistogram2D tarconVzVsChi2;
+ IHistogram2D tarconChi2VsTrkChi2;
+
+ IHistogram2D pEleVspPos;
+ IHistogram2D pEleVspPosWithCut;
+ IHistogram2D pyEleVspyPos;
+ IHistogram2D pxEleVspxPos;
+
+ IHistogram2D VtxZVsMass;
+ IHistogram2D VtxYVsVtxZ;
+ IHistogram2D VtxXVsVtxZ;
+ IHistogram2D VtxXVsVtxY;
+ IHistogram2D VtxXVsVtxPx;
+ IHistogram2D VtxYVsVtxPy;
+ IHistogram2D VtxZVsVtxPx;
+ IHistogram2D VtxZVsVtxPy;
+ IHistogram2D VtxZVsVtxPz;
+
+ IHistogram2D VtxZVsL1Iso;
+ IHistogram2D VtxZVsTrkChi2;
+
+ IHistogram2D pEleVspEle;
+ IHistogram2D phiEleVsphiEle;
+ IHistogram2D pyEleVspyEle;
+ IHistogram2D pxEleVspxEle;
+ IHistogram2D pEleVspEleNoBeam;
+ IHistogram2D pyEleVspyEleNoBeam;
+ IHistogram2D pxEleVspxEleNoBeam;
+ IHistogram2D pEleVspEleMoller;
+ IHistogram2D pEleVsthetaMoller;
+ IHistogram2D thetaEleVsthetaMoller;
+ IHistogram2D pEleVspEleBeamBeam;
+ IHistogram2D pEleVsthetaBeamBeam;
+ IHistogram2D thetaEleVsthetaBeamBeam;
+
+ IHistogram1D mollerMass;
+ IHistogram1D mollerMassVtxCut;
+ IHistogram1D mollerVx;
+ IHistogram1D mollerVy;
+ IHistogram1D mollerVz;
+ IHistogram1D mollerVzVtxCut;
+ IHistogram2D mollerXVsVtxZ;
+ IHistogram2D mollerYVsVtxZ;
+ IHistogram2D mollerXVsVtxY;
+
+ IHistogram1D sumChargeHisto;
+ IHistogram1D numChargeHisto;
+
+ double v0ESumMinCut = 0.8 * eBeam;
+ double v0ESumMaxCut = 1.25 * eBeam;
+ double v0MaxPCut = 1.1;//GeV
+ double molPSumMin = 0.85;
+ double molPSumMax = 1.3;
+ double beambeamCut = 0.85;
+ double thetaMax = 0.06;
+ double thetaMin = 0.015;
+
+ private String stereoHitCollectionName = "HelicalTrackHits";
+ private String trackCollectionName = "MatchedTracks";
+ private String MCparticleCollectionName = "MCParticle";
+ String finalStateParticlesColName = "FinalStateParticles";
+ String unconstrainedV0CandidatesColName = "UnconstrainedV0Candidates";
+ String beamConV0CandidatesColName = "BeamspotConstrainedV0Candidates";
+ String targetV0ConCandidatesColName = "TargetConstrainedV0Candidates";
+ private final BasicHep3Matrix beamAxisRotation = new BasicHep3Matrix();
+
+ //some counters
+ int nRecoEvents = 0;
+ int nTotV0 = 0;
+ int nTot2Ele = 0;
+ //some summers
+ double sumMass = 0.0;
+ double sumVx = 0.0;
+ double sumVy = 0.0;
+ double sumVz = 0.0;
+ double sumChi2 = 0.0;
+
+ int num_lay = 7;
+
+ //double ebeam = 1.056;
+ double zPosTop = 59.3105;
+ double zPosBot = 40.843;
+
+
+ public void detectorChanged(Detector detector){
+
+ beamAxisRotation.setActiveEuler(Math.PI / 2, -0.0305, -Math.PI / 2);
+ aida.tree().cd("/");
+ tree = aida.tree();
+ 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.");
+ }
+
+ unconMass = aida.histogram1D(unconstrainedV0CandidatesColName + "/" + "Invariant Mass (GeV)", 100, 0, 0.200);
+ unconVx = aida.histogram1D(unconstrainedV0CandidatesColName + "/" + "Vx (mm)", 50, -10, 10);
+ unconVy = aida.histogram1D(unconstrainedV0CandidatesColName + "/" + "Vy (mm)", 50, -10, 10);
+ unconVz = aida.histogram1D(unconstrainedV0CandidatesColName + "/" + "Vz (mm)", 50, -50, 50);
+ unconChi2 = aida.histogram1D(unconstrainedV0CandidatesColName + "/" + "Chi2", 25, 0, 25);
+ unconVzVsChi2 = aida.histogram2D(unconstrainedV0CandidatesColName + "/" + "Vz vs. Chi2", 25, 0, 25, 50, -50, 50);
+ unconChi2VsTrkChi2 = aida.histogram2D(unconstrainedV0CandidatesColName + "/" + "Chi2 vs. total track chi2", 50, 0, 50, 50, 0, 25);
+ /* beamspot constrained */
+ bsconMass = aida.histogram1D(beamConV0CandidatesColName + "/" + "Mass (GeV)", 100, 0, 0.200);
+ bsconVx = aida.histogram1D(beamConV0CandidatesColName + "/" + "Vx (mm)", 50, -10, 10);
+ bsconVy = aida.histogram1D(beamConV0CandidatesColName + "/" + "Vy (mm)", 50, -10, 10);
+ bsconVz = aida.histogram1D(beamConV0CandidatesColName + "/" + "Vz (mm)", 50, -50, 50);
+ bsconChi2 = aida.histogram1D(beamConV0CandidatesColName + "/" + "Chi2", 25, 0, 25);
+ bsconVzVsChi2 = aida.histogram2D(beamConV0CandidatesColName + "/" + "Vz vs. Chi2", 25, 0, 25, 50, -50, 50);
+ bsconChi2VsTrkChi2 = aida.histogram2D(beamConV0CandidatesColName + "/" + "Chi2 vs. total track chi2", 50, 0, 50, 50, 0, 25);
+ /* target constrained */
+ tarconMass = aida.histogram1D(targetV0ConCandidatesColName + "/" + "Mass (GeV)", 100, 0, 0.200);
+ tarconVx = aida.histogram1D(targetV0ConCandidatesColName + "/" + "Vx (mm)", 50, -1, 1);
+ tarconVy = aida.histogram1D(targetV0ConCandidatesColName + "/" + "Vy (mm)", 50, -1, 1);
+ tarconVz = aida.histogram1D(targetV0ConCandidatesColName + "/" + "Vz (mm)", 50, -10, 10);
+ tarconChi2 = aida.histogram1D(targetV0ConCandidatesColName + "/" + "Chi2", 25, 0, 25);
+ tarconVzVsChi2 = aida.histogram2D(targetV0ConCandidatesColName + "/" + "Vz vs. Chi2", 25, 0, 25, 50, -50, 50);
+ tarconChi2VsTrkChi2 = aida.histogram2D(targetV0ConCandidatesColName + "/" + "Chi2 vs. total track chi2", 50, 0, 50, 50, 0, 25);
+
+ nV0 = aida.histogram1D("Number of V0 per event", 10, 0, 10);
+ v0Time = aida.histogram1D("V0 mean time", 100, -25, 25);
+ v0Dt = aida.histogram1D("V0 time difference", 100, -25, 25);
+ trigTimeV0Time = aida.histogram2D("Trigger phase vs. V0 mean time", 100, -25, 25, 6, 0, 24);
+ trigTime = aida.histogram1D("Trigger phase", 6, 0, 24);
+
+ pEleVspPos = aida.histogram2D("P(e) vs P(p)", 50, 0, eBeam * maxFactor, 50, 0, eBeam * maxFactor);
+ pEleVspPosWithCut = aida.histogram2D("P(e) vs P(p): Radiative", 50, 0, eBeam * maxFactor, 50, 0, eBeam * maxFactor);
+ pyEleVspyPos = aida.histogram2D("Py(e) vs Py(p)", 50, -0.04, 0.04, 50, -0.04, 0.04);
+ pxEleVspxPos = aida.histogram2D("Px(e) vs Px(p)", 50, -0.04, 0.04, 50, -0.04, 0.04);
+ VtxZVsMass = aida.histogram2D("Vz vs Mass", 50, 0, 0.15, 50, -50, 80);
+ VtxXVsVtxZ = aida.histogram2D("Vx vs Vz", 100, -10, 10, 100, -50, 80);
+ VtxYVsVtxZ = aida.histogram2D("Vy vs Vz", 100, -5, 5, 100, -50, 80);
+ VtxXVsVtxY = aida.histogram2D("Vx vs Vy", 100, -10, 10, 100, -5, 5);
+ VtxXVsVtxPx = aida.histogram2D("Vx vs Px", 100, -0.1, 0.1, 100, -10, 10);
+ VtxYVsVtxPy = aida.histogram2D("Vy vs Py", 100, -0.1, 0.1, 100, -5, 5);
+ VtxZVsVtxPx = aida.histogram2D("Vz vs Px", 100, -0.1, 0.1, 100, -50, 80);
+ VtxZVsVtxPy = aida.histogram2D("Vz vs Py", 100, -0.1, 0.1, 100, -50, 80);
+ VtxZVsVtxPz = aida.histogram2D("Vz vs Pz", 100, 0.0, eBeam * maxFactor, 100, -50, 80);
+ VtxZVsL1Iso = aida.histogram2D("Vz vs L1 Isolation", 100, 0.0, 5.0, 50, -50, 80);
+ VtxZVsTrkChi2 = aida.histogram2D("Vz vs Track Chi2", 50, 0, 50, 50, -50, 80);
+ pEleVspEle = aida.histogram2D("2 Electron/P(e) vs P(e)", 50, 0, eBeam * maxFactor, 50, 0, eBeam * maxFactor);
+ phiEleVsphiEle = aida.histogram2D("2 Electron/phi(e) vs phi(e)", 50, -Math.PI, Math.PI, 50, -Math.PI, Math.PI);
+ pyEleVspyEle = aida.histogram2D("2 Electron/Py(e) vs Py(e)", 50, -0.04, 0.04, 50, -0.04, 0.04);
+ pxEleVspxEle = aida.histogram2D("2 Electron/Px(e) vs Px(e)", 50, -0.02, 0.06, 50, -0.02, 0.06);
+ pEleVspEleNoBeam = aida.histogram2D("2 Electron/P(e) vs P(e) NoBeam", 50, 0, beambeamCut, 50, 0, beambeamCut);
+ pEleVspEleMoller = aida.histogram2D("2 Electron/P(e) vs P(e) Moller", 50, 0, beambeamCut, 50, 0, beambeamCut);
+ pEleVspEleBeamBeam = aida.histogram2D("2 Electron/P(e) vs P(e) BeamBeam", 50, beambeamCut, eBeam * maxFactor, 50, beambeamCut, eBeam * maxFactor);
+ pyEleVspyEleNoBeam = aida.histogram2D("2 Electron/Py(e) vs Py(e) NoBeam", 50, -0.04, 0.04, 50, -0.04, 0.04);
+ pxEleVspxEleNoBeam = aida.histogram2D("2 Electron/Px(e) vs Px(e) NoBeam", 50, -0.02, 0.06, 50, -0.02, 0.06);
+ sumChargeHisto = aida.histogram1D("Total Charge of Event", 5, -2, 3);
+ numChargeHisto = aida.histogram1D("Number of Charged Particles", 6, 0, 6);
+
+ pEleVsthetaMoller = aida.histogram2D("2 Electron/P(e) vs Theta Moller", 50, 0, beambeamCut, 50, thetaMin, thetaMax);
+ thetaEleVsthetaMoller = aida.histogram2D("2 Electron/Theta vs Theta Moller", 50, thetaMin, thetaMax, 50, thetaMin, thetaMax);
+ pEleVsthetaBeamBeam = aida.histogram2D("2 Electron/P(e) vs Theta BeamBeam", 50, beambeamCut, eBeam * maxFactor, 50, thetaMin, thetaMax);
+ thetaEleVsthetaBeamBeam = aida.histogram2D("2 Electron/Theta vs Theta BeamBeam", 50, thetaMin, thetaMax, 50, thetaMin, thetaMax);
+
+ mollerMass = aida.histogram1D("2 Electron/Moller Mass (GeV)", 100, 0, 0.100);
+ mollerMassVtxCut = aida.histogram1D("2 Electron/Moller Mass (GeV): VtxCut", 100, 0, 0.100);
+ mollerVx = aida.histogram1D("2 Electron/Moller Vx (mm)", 50, -10, 10);
+ mollerVy = aida.histogram1D("2 Electron/Moller Vy (mm)", 50, -2, 2);
+ mollerVz = aida.histogram1D("2 Electron/Moller Vz (mm)", 50, -50, 50);
+ mollerVzVtxCut = aida.histogram1D("2 Electron/Moller Vz (mm): VtxCut", 50, -50, 50);
+ mollerXVsVtxZ = aida.histogram2D("2 Electron/Moller Vx vs Vz", 100, -5, 5, 100, -50, 50);
+ mollerYVsVtxZ = aida.histogram2D("2 Electron/Moller Vy vs Vz", 100, -2, 2, 100, -50, 50);
+ mollerXVsVtxY = aida.histogram2D("2 Electron/Moller Vx vs Vy", 100, -5, 5, 100, -2, 2);
+
+
+ for (IPlotter plotter : plotters.values()) {
+ //plotter.show();
+ }
+ }
+
+ private void mapMCtoSimTrackerHit(List<SimTrackerHit> simTrackerHits) {
+
+ // Create a relational table that maps SimTrackerHits to MCParticles
+ _hittomc = new BaseRelationalTable<SimTrackerHit, MCParticle>(RelationalTable.Mode.MANY_TO_MANY, RelationalTable.Weighting.UNWEIGHTED);
+
+ // Loop over the SimTrackerHits and fill in the relational table
+ for (SimTrackerHit simhit : simTrackerHits) {
+ if (simhit.getMCParticle() != null)
+ _hittomc.add(simhit, simhit.getMCParticle());
+ }
+ }
+
+ @Override
+ public void process(EventHeader event){
+ //System.out.println("Pass1");
+ aida.tree().cd("/");
+
+ List<SimTrackerHit> simHits = event.get(SimTrackerHit.class, "TrackerHits");
+ this.mapMCtoSimTrackerHit(simHits);
+
+ RelationalTable hitToStrips = TrackUtils.getHitToStripsTable(event);
+ RelationalTable hitToRotated = TrackUtils.getHitToRotatedTable(event);
+
+ // If the event does not have tracks, skip it
+ //if(!event.hasCollection(Track.class, trackCollectionName)) return;
+
+
+
+ List<ReconstructedParticle> unonstrainedV0List = event.get(ReconstructedParticle.class, unconstrainedV0CandidatesColName);
+ for (ReconstructedParticle uncV0 : unonstrainedV0List) {
+ Vertex uncVert = uncV0.getStartVertex();
+ Hep3Vector pVtxRot = VecOp.mult(beamAxisRotation, uncV0.getMomentum());
+ Hep3Vector vtxPosRot = VecOp.mult(beamAxisRotation, uncVert.getPosition());
+ double theta = Math.acos(pVtxRot.z() / pVtxRot.magnitude());
+ double phi = Math.atan2(pVtxRot.y(), pVtxRot.x());
+ unconVx.fill(vtxPosRot.x());
+ unconVy.fill(vtxPosRot.y());
+ unconVz.fill(vtxPosRot.z());
+ unconMass.fill(uncV0.getMass());
+ unconChi2.fill(uncVert.getChi2());
+ unconVzVsChi2.fill(uncVert.getChi2(), vtxPosRot.z());
+ unconChi2VsTrkChi2.fill(Math.max(uncV0.getParticles().get(0).getTracks().get(0).getChi2(), uncV0.getParticles().get(1).getTracks().get(0).getChi2()), uncVert.getChi2());
+
+ VtxZVsMass.fill(uncV0.getMass(), vtxPosRot.z());
+ VtxXVsVtxZ.fill(vtxPosRot.x(), vtxPosRot.z());
+ VtxYVsVtxZ.fill(vtxPosRot.y(), vtxPosRot.z());
+ VtxXVsVtxY.fill(vtxPosRot.x(), vtxPosRot.y());
+ VtxXVsVtxPx.fill(pVtxRot.x(), vtxPosRot.x());
+ VtxYVsVtxPy.fill(pVtxRot.y(), vtxPosRot.y());
+ VtxZVsVtxPx.fill(pVtxRot.x(), vtxPosRot.z());
+ VtxZVsVtxPy.fill(pVtxRot.y(), vtxPosRot.z());
+ VtxZVsVtxPz.fill(pVtxRot.z(), vtxPosRot.z());
+
+ //this always has 2 tracks.
+ List<ReconstructedParticle> trks = uncV0.getParticles();
+// Track ele = trks.get(0).getTracks().get(0);
+// Track pos = trks.get(1).getTracks().get(0);
+// //if track #0 has charge>0 it's the electron! This seems mixed up, but remember the track
+// //charge is assigned assuming a positive B-field, while ours is negative
+// if (trks.get(0).getCharge() > 0) {
+// pos = trks.get(0).getTracks().get(0);
+// ele = trks.get(1).getTracks().get(0);
+// }
+// aida.histogram2D(plotDir + trkType + triggerType + "/" + "P(e) vs P(p)").fill(getMomentum(ele), getMomentum(pos));
+// aida.histogram2D(plotDir + trkType + triggerType + "/" + "Px(e) vs Px(p)").fill(ele.getTrackStates().get(0).getMomentum()[1], pos.getTrackStates().get(0).getMomentum()[1]);
+// aida.histogram2D(plotDir + trkType + triggerType + "/" + "Py(e) vs Py(p)").fill(ele.getTrackStates().get(0).getMomentum()[2], pos.getTrackStates().get(0).getMomentum()[2]);
+ ReconstructedParticle ele = trks.get(0);
+ ReconstructedParticle pos = trks.get(1);
+ //ReconParticles have the charge correct.
+ if (trks.get(0).getCharge() > 0) {
+ pos = trks.get(0);
+ ele = trks.get(1);
+ }
+ if (ele.getCharge() < 0 && pos.getCharge() > 0) {
+ VtxZVsTrkChi2.fill(Math.max(uncV0.getParticles().get(0).getTracks().get(0).getChi2(), uncV0.getParticles().get(1).getTracks().get(0).getChi2()), uncVert.getPosition().z());
+
+ /*Double[] eleIso = TrackUtils.getIsolations(ele.getTracks().get(0), hitToStrips, hitToRotated);
+ Double[] posIso = TrackUtils.getIsolations(pos.getTracks().get(0), hitToStrips, hitToRotated);
+ if (eleIso[0] != null && posIso[0] != null) {
+ double eleL1Iso = Math.min(Math.abs(eleIso[0]), Math.abs(eleIso[1]));
+ double posL1Iso = Math.min(Math.abs(posIso[0]), Math.abs(posIso[1]));
+ double minL1Iso = Math.min(eleL1Iso, posL1Iso);
+ VtxZVsL1Iso.fill(minL1Iso, uncVert.getPosition().z());
+ }*/
+
+ double pe = ele.getMomentum().magnitude();
+ double pp = pos.getMomentum().magnitude();
+ Hep3Vector pEleRot = VecOp.mult(beamAxisRotation, ele.getMomentum());
+ Hep3Vector pPosRot = VecOp.mult(beamAxisRotation, pos.getMomentum());
+
+ pEleVspPos.fill(pe, pp);
+ pxEleVspxPos.fill(pEleRot.x(), pPosRot.x());
+ pyEleVspyPos.fill(pEleRot.y(), pPosRot.y());
+ if (pe < v0MaxPCut && pp < v0MaxPCut && (pe + pp) > v0ESumMinCut && (pe + pp) < v0ESumMaxCut)//enrich radiative-like events
+
+ pEleVspPosWithCut.fill(pe, pp);
+ }
+
+ double eleT = TrackUtils.getTrackTime(ele.getTracks().get(0), hitToStrips, hitToRotated);
+ double posT = TrackUtils.getTrackTime(pos.getTracks().get(0), hitToStrips, hitToRotated);
+ double meanT = (eleT + posT) / 2.0;
+ v0Time.fill(meanT);
+ v0Dt.fill(eleT - posT);
+ trigTimeV0Time.fill(meanT, event.getTimeStamp() % 24);
+ trigTime.fill(event.getTimeStamp() % 24);
+ }
+
+ List<ReconstructedParticle> beamConstrainedV0List = event.get(ReconstructedParticle.class, beamConV0CandidatesColName);
+ nV0.fill(beamConstrainedV0List.size());
+ for (ReconstructedParticle bsV0 : beamConstrainedV0List) {
+
+ nTotV0++;
+ Vertex bsVert = bsV0.getStartVertex();
+ Hep3Vector vtxPosRot = VecOp.mult(beamAxisRotation, bsVert.getPosition());
+ bsconVx.fill(vtxPosRot.x());
+ bsconVy.fill(vtxPosRot.y());
+ bsconVz.fill(vtxPosRot.z());
+ bsconMass.fill(bsV0.getMass());
+ bsconChi2.fill(bsVert.getChi2());
+ bsconVzVsChi2.fill(bsVert.getChi2(), vtxPosRot.z());
+ bsconChi2VsTrkChi2.fill(Math.max(bsV0.getParticles().get(0).getTracks().get(0).getChi2(), bsV0.getParticles().get(1).getTracks().get(0).getChi2()), bsVert.getChi2());
+ sumMass += bsV0.getMass();
+ sumVx += vtxPosRot.x();
+ sumVy += vtxPosRot.y();
+ sumVz += vtxPosRot.z();
+ sumChi2 += bsVert.getChi2();
+ }
+
+ List<ReconstructedParticle> targetConstrainedV0List = event.get(ReconstructedParticle.class, targetV0ConCandidatesColName);
+ for (ReconstructedParticle tarV0 : targetConstrainedV0List) {
+
+ Vertex tarVert = tarV0.getStartVertex();
+ Hep3Vector vtxPosRot = VecOp.mult(beamAxisRotation, tarVert.getPosition());
+ tarconVx.fill(vtxPosRot.x());
+ tarconVy.fill(vtxPosRot.y());
+ tarconVz.fill(vtxPosRot.z());
+ tarconMass.fill(tarV0.getMass());
+ tarconChi2.fill(tarVert.getChi2());
+ tarconVzVsChi2.fill(tarVert.getChi2(), vtxPosRot.z());
+ tarconChi2VsTrkChi2.fill(Math.max(tarV0.getParticles().get(0).getTracks().get(0).getChi2(), tarV0.getParticles().get(1).getTracks().get(0).getChi2()), tarVert.getChi2());
+ }
+ List<ReconstructedParticle> finalStateParticles = event.get(ReconstructedParticle.class, finalStateParticlesColName);
+
+ ReconstructedParticle ele1 = null;
+ ReconstructedParticle ele2 = null;
+ int sumCharge = 0;
+ int numChargedParticles = 0;
+ for (ReconstructedParticle fsPart : finalStateParticles) {
+ double charge = fsPart.getCharge();
+ sumCharge += charge;
+ if (charge != 0) {
+ numChargedParticles++;
+ if (charge < 1)
+ if (ele1 == null)
+ ele1 = fsPart;
+ else if (!hasSharedStrips(ele1, fsPart, hitToStrips, hitToRotated))
+ ele2 = fsPart;
+ }
+ }
+ sumChargeHisto.fill(sumCharge);
+ numChargeHisto.fill(numChargedParticles);
+
+ if (ele1 != null && ele2 != null) {
+ Hep3Vector p1 = VecOp.mult(beamAxisRotation, ele1.getMomentum());
+ Hep3Vector p2 = VecOp.mult(beamAxisRotation, ele2.getMomentum());
+// Hep3Vector beamAxis = new BasicHep3Vector(Math.sin(0.0305), 0, Math.cos(0.0305));
+// LOGGER.info(p1);
+// LOGGER.info(VecOp.mult(rot, p1));
+
+ double theta1 = Math.acos(p1.z() / p1.magnitude());
+ double theta2 = Math.acos(p2.z() / p2.magnitude());
+ double phi1 = Math.atan2(p1.y(), p1.x());
+ double phi2 = Math.atan2(p2.y(), p2.x());
+ phiEleVsphiEle.fill(phi1, phi2);
+ pEleVspEle.fill(ele1.getMomentum().magnitude(), ele2.getMomentum().magnitude());
+ pyEleVspyEle.fill(ele1.getMomentum().y(), ele2.getMomentum().y());
+ pxEleVspxEle.fill(ele1.getMomentum().x(), ele2.getMomentum().x());
+ //remove beam electrons
+ if (ele1.getMomentum().magnitude() < beambeamCut && ele2.getMomentum().magnitude() < beambeamCut) {
+ pEleVspEleNoBeam.fill(ele1.getMomentum().magnitude(), ele2.getMomentum().magnitude());
+ pyEleVspyEleNoBeam.fill(ele1.getMomentum().y(), ele2.getMomentum().y());
+ pxEleVspxEleNoBeam.fill(ele1.getMomentum().x(), ele2.getMomentum().x());
+ }
+ //look at beam-beam events
+ if (ele1.getMomentum().magnitude() > beambeamCut && ele2.getMomentum().magnitude() > beambeamCut) {
+ pEleVspEleBeamBeam.fill(ele1.getMomentum().magnitude(), ele2.getMomentum().magnitude());
+ pEleVsthetaBeamBeam.fill(p1.magnitude(), theta1);
+ pEleVsthetaBeamBeam.fill(p2.magnitude(), theta2);
+ thetaEleVsthetaBeamBeam.fill(theta1, theta2);
+ }
+
+ //look at "Moller" events (if that's what they really are
+ if (ele1.getMomentum().magnitude() + ele2.getMomentum().magnitude() > molPSumMin
+ && ele1.getMomentum().magnitude() + ele2.getMomentum().magnitude() < molPSumMax
+ && (p1.magnitude() < beambeamCut && p2.magnitude() < beambeamCut)) {
+
+ Track ele1trk = ele1.getTracks().get(0);
+ Track ele2trk = ele2.getTracks().get(0);
+ SeedTrack stEle1 = TrackUtils.makeSeedTrackFromBaseTrack(ele1trk);
+ SeedTrack stEle2 = TrackUtils.makeSeedTrackFromBaseTrack(ele2trk);
+ BilliorTrack btEle1 = new BilliorTrack(stEle1.getSeedCandidate().getHelix());
+ BilliorTrack btEle2 = new BilliorTrack(stEle2.getSeedCandidate().getHelix());
+ BilliorVertex bv = fitVertex(btEle1, btEle2);
+// LOGGER.info("ee vertex: "+bv.toString());
+ mollerMass.fill(bv.getParameters().get("invMass"));
+ mollerVx.fill(bv.getPosition().x());
+ mollerVy.fill(bv.getPosition().y());
+ mollerVz.fill(bv.getPosition().z());
+ mollerXVsVtxZ.fill(bv.getPosition().x(), bv.getPosition().z());
+ mollerYVsVtxZ.fill(bv.getPosition().y(), bv.getPosition().z());
+ mollerXVsVtxY.fill(bv.getPosition().x(), bv.getPosition().y());
+ if (Math.abs(bv.getPosition().x()) < 2
+ && Math.abs(bv.getPosition().y()) < 0.5) {
+ mollerMassVtxCut.fill(bv.getParameters().get("invMass"));
+ mollerVzVtxCut.fill(bv.getPosition().z());
+ }
+ pEleVspEleMoller.fill(p1.magnitude(), p2.magnitude());
+ pEleVsthetaMoller.fill(p1.magnitude(), theta1);
+ pEleVsthetaMoller.fill(p2.magnitude(), theta2);
+ thetaEleVsthetaMoller.fill(theta1, theta2);
+ }
+ }
+
+
+ }
+ @Override
+ public void endOfData(){
+
+
+ System.out.println("%===================================================================%");
+ System.out.println("%====================== Layer 0 Reconctructed Particle Complete==========================%");
+ System.out.println("%===================================================================% \n%");
+ System.out.println("% \n%===================================================================%");
+ }
+
+
+ private BilliorVertex fitVertex(BilliorTrack electron, BilliorTrack positron) {
+ // Create a vertex fitter from the magnetic field.
+ double bField = 0.24;
+ double[] beamSize = {0.001, 0.2, 0.02};
+ BilliorVertexer vtxFitter = new BilliorVertexer(bField);
+ // TODO: The beam size should come from the conditions database.
+ vtxFitter.setBeamSize(beamSize);
+
+ // Perform the vertexing based on the specified constraint.
+ vtxFitter.doBeamSpotConstraint(false);
+
+ // Add the electron and positron tracks to a track list for
+ // the vertex fitter.
+ List<BilliorTrack> billiorTracks = new ArrayList<BilliorTrack>();
+
+ billiorTracks.add(electron);
+
+ billiorTracks.add(positron);
+
+ // Find and return a vertex based on the tracks.
+ return vtxFitter.fitVertex(billiorTracks);
+ }
+
+ private static boolean hasSharedStrips(ReconstructedParticle vertex, RelationalTable hittostrip, RelationalTable hittorotated) {
+ return hasSharedStrips(vertex.getParticles().get(0), vertex.getParticles().get(1), hittostrip, hittorotated);
+ }
+
+ private static boolean hasSharedStrips(ReconstructedParticle fs1, ReconstructedParticle fs2, RelationalTable hittostrip, RelationalTable hittorotated) {
+ return TrackUtils.hasSharedStrips(fs1.getTracks().get(0), fs2.getTracks().get(0), hittostrip, hittorotated);
+ }
+
+}
Added: java/branches/layer0-thin-branch/users/src/main/java/org/hps/users/mrsolt/TrackingReconstructionPlots.java
=============================================================================
--- java/branches/layer0-thin-branch/users/src/main/java/org/hps/users/mrsolt/TrackingReconstructionPlots.java (added)
+++ java/branches/layer0-thin-branch/users/src/main/java/org/hps/users/mrsolt/TrackingReconstructionPlots.java Wed Nov 30 11:12:55 2016
@@ -0,0 +1,1563 @@
+package org.hps.users.mrsolt;
+
+import hep.aida.IAnalysisFactory;
+import hep.aida.IHistogram1D;
+import hep.aida.IHistogram2D;
+import hep.aida.IPlotter;
+import hep.aida.IPlotterStyle;
+import hep.aida.IProfile;
+import hep.physics.vec.BasicHep3Vector;
+import hep.physics.vec.Hep3Vector;
+
+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.hps.recon.tracking.BeamlineConstants;
+import org.hps.recon.tracking.DumbShaperFit;
+import org.hps.recon.tracking.FittedRawTrackerHit;
+import org.hps.recon.tracking.HelixConverter;
+import org.hps.recon.tracking.ShaperFitAlgorithm;
+import org.hps.recon.tracking.StraightLineTrack;
+import org.hps.recon.tracking.TrackUtils;
+import org.hps.recon.tracking.gbl.HelicalTrackStripGbl;
+import org.lcsim.detector.tracker.silicon.HpsSiSensor;
+import org.lcsim.detector.tracker.silicon.SiSensor;
+import org.lcsim.event.Cluster;
+import org.lcsim.event.EventHeader;
+import org.lcsim.event.LCIOParameters.ParameterName;
+import org.lcsim.event.LCRelation;
+import org.lcsim.event.RawTrackerHit;
+import org.lcsim.event.Track;
+import org.lcsim.event.TrackerHit;
+import org.lcsim.fit.helicaltrack.HelicalTrackCross;
+import org.lcsim.fit.helicaltrack.HelicalTrackFit;
+import org.lcsim.fit.helicaltrack.HelicalTrackHit;
+import org.lcsim.fit.helicaltrack.HelicalTrackStrip;
+import org.lcsim.fit.helicaltrack.HelixUtils;
+import org.lcsim.geometry.Detector;
+import org.lcsim.geometry.IDDecoder;
+import org.lcsim.geometry.compact.converter.HPSTrackerBuilder;
+import org.lcsim.recon.tracking.digitization.sisim.SiTrackerHitStrip1D;
+import org.lcsim.recon.tracking.digitization.sisim.TrackerHitType;
+import org.lcsim.recon.tracking.seedtracker.SeedCandidate;
+import org.lcsim.recon.tracking.seedtracker.SeedTrack;
+import org.lcsim.util.Driver;
+import org.lcsim.util.aida.AIDA;
+
+/**
+ * Analysis class to check recon.
+ *
+ * @author phansson
+ */
+public class TrackingReconstructionPlots extends Driver {
+
+ static {
+ hep.aida.jfree.AnalysisFactory.register();
+ }
+
+
+ private AIDA aida = AIDA.defaultInstance();
+ private String helicalTrackHitCollectionName = "HelicalTrackHits";
+ private String stripClusterCollectionName = "StripClusterer_SiTrackerHitStrip1D";
+
+ private String trackCollectionName = "MatchedTracks";
+ String ecalSubdetectorName = "Ecal";
+ String ecalCollectionName = "EcalClusters";
+ IDDecoder dec;
+ private String outputPlots = null;
+ IPlotter plotter;
+ IPlotter plotter2;
+ IPlotter plotter22;
+ IPlotter plotter2221;
+ IPlotter plotter2222;
+ IPlotter plotter222;
+ IPlotter plotter22299;
+ IPlotter plotter22298;
+ IPlotter plotter2224;
+ IPlotter plotter2223;
+ IPlotter plotter3;
+ IPlotter plotter3_1;
+ IPlotter plotter3_11;
+ IPlotter plotter3_2;
+ IPlotter plotter4;
+ IPlotter plotter5;
+ IPlotter plotter5_1;
+ IPlotter plotter55;
+ IPlotter plotter6;
+ IPlotter plotter66;
+ IPlotter plotter8;
+ IPlotter plotter88;
+ IPlotter plotter888;
+ IPlotter plotter8888;
+ IPlotter top1;
+ IPlotter top2;
+ IPlotter top3;
+ IPlotter top4;
+ IPlotter top44;
+ IPlotter bot1;
+ IPlotter bot2;
+ IPlotter bot3;
+ IPlotter bot4;
+ double zAtColl = -1500;
+ IHistogram1D trkPx;
+ IHistogram1D nTracks;
+ IHistogram1D nTracksTop;
+ IHistogram1D nTracksBot;
+ ShaperFitAlgorithm _shaper = new DumbShaperFit();
+ HelixConverter converter = new HelixConverter(0);
+ private boolean showPlots = true;
+ private double _bfield;
+ private static Logger LOGGER = Logger.getLogger(TrackingReconstructionPlots.class.getName());
+ private List<HpsSiSensor> sensors = new ArrayList<HpsSiSensor>();
+ private int nLayers = 7;
+
+ @Override
+ protected void detectorChanged(Detector detector) {
+ aida.tree().cd("/");
+ for(HpsSiSensor s : detector.getDetectorElement().findDescendants(HpsSiSensor.class)) {
+ if(s.getName().startsWith("module_") && s.getName().endsWith("sensor0")) {
+ sensors.add(s);
+ }
+ }
+ LOGGER.info("Found " + sensors.size() + " SiSensors.");
+
+ Hep3Vector bfieldvec = detector.getFieldMap().getField(new BasicHep3Vector(0., 0., 1.));
+ _bfield = bfieldvec.y();
+
+ setupPlots();
+ }
+
+
+
+
+
+
+
+ public TrackingReconstructionPlots() {
+ LOGGER.setLevel(Level.WARNING);
+ }
+
+ public void setOutputPlots(String output) {
+ this.outputPlots = output;
+ }
+
+ public void setShowPlots(boolean show) {
+ this.showPlots = show;
+ }
+
+ public void setHelicalTrackHitCollectionName(String helicalTrackHitCollectionName) {
+ this.helicalTrackHitCollectionName = helicalTrackHitCollectionName;
+ }
+
+ public void setTrackCollectionName(String trackCollectionName) {
+ this.trackCollectionName = trackCollectionName;
+ }
+
+ @Override
+ public void process(EventHeader event) {
+ aida.tree().cd("/");
+ if (!event.hasCollection(HelicalTrackHit.class, helicalTrackHitCollectionName)) {
+// System.out.println(helicalTrackHitCollectionName + " does not exist; skipping event");
+ return;
+ }
+
+ List<SiTrackerHitStrip1D> stripClusters = event.get(SiTrackerHitStrip1D.class, stripClusterCollectionName);
+ //System.out.printf("%s: Got %d SiTrackerHitStrip1D in this event\n", stripHits.size());
+ Map<HpsSiSensor, Integer> stripHits = new HashMap<HpsSiSensor, Integer>();
+ Map<HpsSiSensor, Double> stripHitsIso = new HashMap<HpsSiSensor, Double>();
+ for (SiTrackerHitStrip1D stripHit : stripClusters) {
+ HpsSiSensor sensor = (HpsSiSensor) stripHit.getRawHits().get(0).getDetectorElement();
+ int n;
+ if(stripHits.containsKey(sensor)) {
+ n = stripHits.get(sensor);
+ } else {
+ n=0;
+ }
+ n++;
+ stripHits.put(sensor, n);
+
+ // calculate isolation to other strip clusters
+
+ SiTrackerHitStrip1D local = stripHit.getTransformedHit(TrackerHitType.CoordinateSystem.SENSOR);
+
+ double stripIsoMin = 9999.9;
+ for (SiTrackerHitStrip1D stripHitOther : stripClusters) {
+ LOGGER.fine(stripHit.getPositionAsVector().toString() + " c.f. " + stripHitOther.getPositionAsVector().toString());
+
+ if(stripHitOther.equals(stripHit)) {
+ continue;
+ }
+
+ HpsSiSensor sensorOther = (HpsSiSensor) stripHitOther.getRawHits().get(0).getDetectorElement();
+ //System.out.println(sensor.getName() + " c.f. " + sensorOther.getName());
+ if(sensorOther.equals(sensor)) {
+ SiTrackerHitStrip1D localOther = stripHitOther.getTransformedHit(TrackerHitType.CoordinateSystem.SENSOR);
+ double d = Math.abs(local.getPosition()[0] - localOther.getPosition()[0]);
+ //System.out.println(sensor.getName() + " d " + Double.toString(d));
+ if (d < stripIsoMin && d > 0) {
+ stripIsoMin = d;
+ }
+ }
+ }
+ stripHitsIso.put(sensor, stripIsoMin);
+ }
+
+ for(Map.Entry<HpsSiSensor,Integer> sensor : stripHits.entrySet()) {
+ aida.histogram1D(sensor.getKey().getName() + " strip hits").fill(sensor.getValue());
+ aida.histogram1D(sensor.getKey().getName() + " strip hits iso").fill(stripHitsIso.get(sensor.getKey()));
+ }
+
+
+ List<HelicalTrackHit> hthList = event.get(HelicalTrackHit.class, helicalTrackHitCollectionName);
+ Map<Integer, Integer> layersTop = new HashMap<Integer,Integer>();
+ Map<Integer, Integer> layersBot = new HashMap<Integer,Integer>();
+ Map<HpsSiSensor, Integer> stripHitsFromStereoHits = new HashMap<HpsSiSensor, Integer>();
+ for (HelicalTrackHit hth : hthList) {
+ HelicalTrackCross htc = (HelicalTrackCross) hth;
+ HpsSiSensor sensor = ((HpsSiSensor) ((RawTrackerHit) htc.getRawHits().get(0)).getDetectorElement());
+ for(HelicalTrackStrip strip : htc.getStrips()) {
+ HpsSiSensor stripsensor = (HpsSiSensor) ((RawTrackerHit)strip.rawhits().get(0)).getDetectorElement();
+ if(stripHitsFromStereoHits.containsKey(stripsensor)) {
+ stripHitsFromStereoHits.put(stripsensor, stripHitsFromStereoHits.get(stripsensor) + 1);
+ } else {
+ stripHitsFromStereoHits.put(stripsensor, 0);
+ }
+ }
+ int l = sensor.getLayerNumberFromDetectorElement();
+ int n = 0;
+ if(sensor.isTopLayer()) {
+ if (layersTop.containsKey(l) )
+ n = layersTop.get(l);
+ else
+ layersTop.put(l,n+1);
+ }
+ else {
+ if (layersBot.containsKey(l) )
+ n = layersTop.get(l);
+ else
+ layersTop.put(l,n+1);
+ }
+ }
+
+
+ for(Map.Entry<HpsSiSensor,Integer> sensor : stripHitsFromStereoHits.entrySet()) {
+ aida.histogram1D(sensor.getKey().getName() + " strip hits from stereo").fill(sensor.getValue());
+ }
+
+ for (Map.Entry<Integer,Integer> e : layersTop.entrySet())
+ aida.profile1D("Number of Stereo Hits per layer in Top Half").fill(e.getKey(), e.getValue());
+
+ for (Map.Entry<Integer,Integer> e : layersBot.entrySet())
+ aida.profile1D("Number of Stereo Hits per layer in Bottom Half").fill(e.getKey(), e.getValue());
+
+
+
+ if (!event.hasCollection(Track.class, trackCollectionName)) {
+// System.out.println(trackCollectionName + " does not exist; skipping event");
+ aida.histogram1D("Number Tracks/Event").fill(0);
+ return;
+ }
+
+ List<Track> tracks = event.get(Track.class, trackCollectionName);
+ nTracks.fill(tracks.size());
+ int nBotClusters = 0;
+ int nTopClusters = 0;
+ if (event.hasCollection(Cluster.class, ecalCollectionName)) {
+ List<Cluster> clusters = event.get(Cluster.class, ecalCollectionName);
+ for (Cluster cluster : clusters) {
+ // Get the ix and iy indices for the seed.
+// final int ix = cluster.getCalorimeterHits().get(0).getIdentifierFieldValue("ix");
+// final int iy = cluster.getCalorimeterHits().get(0).getIdentifierFieldValue("iy");
+
+ //System.out.println("cluser position = ("+cluster.getPosition()[0]+","+cluster.getPosition()[1]+") with energy = "+cluster.getEnergy());
+ if (cluster.getPosition()[1] > 0) {
+ nTopClusters++;
+ //System.out.println("cl " + cluster.getPosition()[0] + " " + cluster.getPosition()[1] + " ix " + ix + " iy " + iy);
+ aida.histogram2D("Top ECal Cluster Position").fill(cluster.getPosition()[0], cluster.getPosition()[1]);
+ aida.histogram1D("Top ECal Cluster Energy").fill(cluster.getEnergy());
+ }
+ if (cluster.getPosition()[1] < 0) {
+ nBotClusters++;
+ aida.histogram2D("Bottom ECal Cluster Position").fill(cluster.getPosition()[0], cluster.getPosition()[1]);
+ aida.histogram1D("Bottom ECal Cluster Energy").fill(cluster.getEnergy());
+ }
+
+ if (tracks.size() > 0) {
+ if (cluster.getPosition()[1] > 0) {
+ aida.histogram2D("Top ECal Cluster Position (>0 tracks)").fill(cluster.getPosition()[0], cluster.getPosition()[1]);
+ }
+ if (cluster.getPosition()[1] < 0) {
+ aida.histogram2D("Bottom ECal Cluster Position (>0 tracks)").fill(cluster.getPosition()[0], cluster.getPosition()[1]);
+ }
+
+ if (cluster.getEnergy() > 0.1) {
+ if (cluster.getPosition()[1] > 0) {
+ aida.histogram2D("Top ECal Cluster Position (E>0.1,>0 tracks)").fill(cluster.getPosition()[0], cluster.getPosition()[1]);
+ aida.histogram2D("Top ECal Cluster Position w_E (E>0.1,>0 tracks)").fill(cluster.getPosition()[0], cluster.getPosition()[1], cluster.getEnergy());
+ }
+ if (cluster.getPosition()[1] < 0) {
+ aida.histogram2D("Bottom ECal Cluster Position (E>0.1,>0 tracks)").fill(cluster.getPosition()[0], cluster.getPosition()[1]);
+ aida.histogram2D("Bottom ECal Cluster Position w_E (E>0.1,>0 tracks)").fill(cluster.getPosition()[0], cluster.getPosition()[1], cluster.getEnergy());
+ }
+ }
+ }
+
+ }
+ }
+
+ aida.histogram1D("Number of Clusters Top").fill(nTopClusters);
+ aida.histogram1D("Number of Clusters Bot").fill(nBotClusters);
+
+
+
+
+
+ //List<SiTrackerHitStrip1D> stripHits = event.get(SiTrackerHitStrip1D.class, "StripClusterer_SiTrackerHitStrip1D");
+ //int stripClustersPerLayerTop[] = getStripClustersPerLayer(stripHits, "up");
+ //int stripClustersPerLayerBottom[] = getStripClustersPerLayer(stripHits,"down");
+
+ //boolean hasSingleStripClusterPerLayer = singleStripClusterPerLayer(stripClustersPerLayerTop);
+
+ Map<Track, Cluster> eCanditates = new HashMap<Track, Cluster>();
+ Map<Track, Cluster> pCanditates = new HashMap<Track, Cluster>();
+
+ int ntracksTop = 0;
+ int ntracksBot = 0;
+
+ for (Track trk : tracks) {
+
+ //boolean isSingleHitPerLayerTrack = singleTrackHitPerLayer(trk);
+
+ aida.histogram1D("Track Momentum (Px)").fill(trk.getTrackStates().get(0).getMomentum()[1]);
+ aida.histogram1D("Track Momentum (Py)").fill(trk.getTrackStates().get(0).getMomentum()[2]);
+ aida.histogram1D("Track Momentum (Pz)").fill(trk.getTrackStates().get(0).getMomentum()[0]);
+ aida.histogram1D("Track Chi2").fill(trk.getChi2());
+
+ aida.histogram1D("Hits per Track").fill(trk.getTrackerHits().size());
+ SeedTrack stEle = (SeedTrack) trk;
+ SeedCandidate seedCandidate = stEle.getSeedCandidate();
+ HelicalTrackFit helicalTrackFit = seedCandidate.getHelix();
+ StraightLineTrack slt = converter.Convert(helicalTrackFit);
+
+ Hep3Vector posAtEcal = TrackUtils.getTrackPositionAtEcal(trk);
+
+ aida.histogram1D("X (mm) @ Z=-60cm").fill(slt.getYZAtX(BeamlineConstants.HARP_POSITION_TESTRUN)[0]); //this is y in the tracker frame
+ aida.histogram1D("Y (mm) @ Z=-60cm").fill(slt.getYZAtX(BeamlineConstants.HARP_POSITION_TESTRUN)[1]); //this is z in the tracker frame
+ aida.histogram1D("X (mm) @ Z=-150cm").fill(slt.getYZAtX(zAtColl)[0]);
+ aida.histogram1D("Y (mm) @ Z=-150cm").fill(slt.getYZAtX(zAtColl)[1]);
+
+ aida.histogram1D("X (mm) @ ECAL").fill(posAtEcal.x());
+ aida.histogram1D("Y (mm) @ ECAL").fill(posAtEcal.y());
+ if (trk.getTrackStates().get(0).getMomentum()[0] > 1.0) {
+ aida.histogram1D("X (mm) @ ECAL (Pz>1)").fill(posAtEcal.x());
+ aida.histogram1D("Y (mm) @ ECAL (Pz>1)").fill(posAtEcal.y());
+ }
+ aida.histogram1D("d0 ").fill(trk.getTrackStates().get(0).getParameter(ParameterName.d0.ordinal()));
+ aida.histogram1D("sinphi ").fill(Math.sin(trk.getTrackStates().get(0).getParameter(ParameterName.phi0.ordinal())));
+ aida.histogram1D("omega ").fill(trk.getTrackStates().get(0).getParameter(ParameterName.omega.ordinal()));
+ aida.histogram1D("tan(lambda) ").fill(trk.getTrackStates().get(0).getParameter(ParameterName.tanLambda.ordinal()));
+ aida.histogram1D("z0 ").fill(trk.getTrackStates().get(0).getParameter(ParameterName.z0.ordinal()));
+
+ int isTop = -1;
+ if (trk.getTrackerHits().get(0).getPosition()[2] > 0) {
+ isTop = 0;
+ }
+ if (isTop == 0) {
+ aida.histogram1D("Top Track Momentum (Px)").fill(trk.getTrackStates().get(0).getMomentum()[1]);
+ aida.histogram1D("Top Track Momentum (Py)").fill(trk.getTrackStates().get(0).getMomentum()[2]);
+ aida.histogram1D("Top Track Momentum (Pz)").fill(trk.getTrackStates().get(0).getMomentum()[0]);
+ aida.histogram1D("Top Track Chi2").fill(trk.getChi2());
+
+ aida.histogram1D("d0 Top").fill(trk.getTrackStates().get(0).getParameter(ParameterName.d0.ordinal()));
+ aida.histogram1D("sinphi Top").fill(Math.sin(trk.getTrackStates().get(0).getParameter(ParameterName.phi0.ordinal())));
+ aida.histogram1D("omega Top").fill(trk.getTrackStates().get(0).getParameter(ParameterName.omega.ordinal()));
+ aida.histogram1D("tan(lambda) Top").fill(trk.getTrackStates().get(0).getParameter(ParameterName.tanLambda.ordinal()));
+ aida.histogram1D("z0 Top").fill(trk.getTrackStates().get(0).getParameter(ParameterName.z0.ordinal()));
+ ntracksTop++;
+ } else {
+ aida.histogram1D("Bottom Track Momentum (Px)").fill(trk.getTrackStates().get(0).getMomentum()[1]);
+ aida.histogram1D("Bottom Track Momentum (Py)").fill(trk.getTrackStates().get(0).getMomentum()[2]);
+ aida.histogram1D("Bottom Track Momentum (Pz)").fill(trk.getTrackStates().get(0).getMomentum()[0]);
+ aida.histogram1D("Bottom Track Chi2").fill(trk.getChi2());
+
+ aida.histogram1D("d0 Bottom").fill(trk.getTrackStates().get(0).getParameter(ParameterName.d0.ordinal()));
+ aida.histogram1D("sinphi Bottom").fill(Math.sin(trk.getTrackStates().get(0).getParameter(ParameterName.phi0.ordinal())));
+ aida.histogram1D("omega Bottom").fill(trk.getTrackStates().get(0).getParameter(ParameterName.omega.ordinal()));
+ aida.histogram1D("tan(lambda) Bottom").fill(trk.getTrackStates().get(0).getParameter(ParameterName.tanLambda.ordinal()));
+ aida.histogram1D("z0 Bottom").fill(trk.getTrackStates().get(0).getParameter(ParameterName.z0.ordinal()));
+ ntracksBot++;
+ }
+ List<TrackerHit> hitsOnTrack = trk.getTrackerHits();
+ Map<HpsSiSensor, Integer> stripHitsOnTrack = new HashMap<HpsSiSensor, Integer>();
+ Map<HpsSiSensor, Double> stripHitsIsoOnTrack = new HashMap<HpsSiSensor, Double>();
+
+ for (TrackerHit hit : hitsOnTrack) {
+
+ HelicalTrackHit htc = (HelicalTrackHit) hit;
+ HelicalTrackCross htcross = (HelicalTrackCross) htc;
+ double sHit = helicalTrackFit.PathMap().get(htc);
+ Hep3Vector posonhelix = HelixUtils.PointOnHelix(helicalTrackFit, sHit);
+ int layer = ((HpsSiSensor) ((RawTrackerHit) htcross.getStrips().get(0).rawhits().get(0)).getDetectorElement()).getLayerNumberFromDetectorElement();
+ boolean isTopLayer = !((HpsSiSensor) ((RawTrackerHit) htcross.getStrips().get(0).rawhits().get(0)).getDetectorElement()).isBottomLayer();
+
+
+
+ //HpsSiSensor sensor = ((HpsSiSensor) ((RawTrackerHit) htc.getRawHits().get(0)).getDetectorElement());
+ for(HelicalTrackStrip strip : htcross.getStrips()) {
+ HpsSiSensor sensor = ((HpsSiSensor) ((RawTrackerHit) strip.rawhits().get(0)).getDetectorElement());
+ if(sensor.isTopLayer()) isTopLayer = true;
+ else isTopLayer=false;
+ HelicalTrackStripGbl stripGbl = new HelicalTrackStripGbl(strip, true);
+ Map<String, Double> stripResiduals = TrackUtils.calculateLocalTrackHitResiduals(helicalTrackFit, stripGbl, 0.,0.,_bfield);
+ LOGGER.fine("Sensor " + sensor.getName() + " ures = " + stripResiduals.get("ures"));
+ aida.histogram1D(sensor.getName() + " strip residual (mm)").fill(stripResiduals.get("ures"));
+
+
+ // calculate isolation to other strip clusters
+ double stripIsoMin = 9999.9;
+ for (SiTrackerHitStrip1D stripHit : stripClusters) {
+ if (stripHit.getRawHits().get(0).getDetectorElement().getName().equals(sensor.getName())) {
+ SiTrackerHitStrip1D local = stripHit.getTransformedHit(TrackerHitType.CoordinateSystem.SENSOR);
+ double d = Math.abs(strip.umeas() - local.getPosition()[0]);
+ if (d < stripIsoMin && d > 0) {
+ stripIsoMin = d;
+ }
+ }
+ }
+
+ if(stripHitsOnTrack.containsKey(sensor)) {
+ stripHitsOnTrack.put(sensor, stripHitsOnTrack.get(sensor) + 1);
+ } else {
+ stripHitsOnTrack.put(sensor, 1);
+ }
+ stripHitsIsoOnTrack.put(sensor, stripIsoMin);
+ }
+
+
+
+
+
+ double yTr = posonhelix.y();
+ double zTr = posonhelix.z();
+ String modNum = "Layer " + String.valueOf(layer) + " ";
+
+ aida.histogram1D(modNum + "Residual X(mm)").fill(htcross.getCorrectedPosition().y() - yTr);
+ aida.histogram1D(modNum + "Residual Y(mm)").fill(htcross.getCorrectedPosition().z() - zTr);
+
+ if (isTopLayer) {
+ aida.histogram1D(modNum + "Residual X(mm) Top").fill(htcross.getCorrectedPosition().y() - yTr);
+ aida.histogram1D(modNum + "Residual Y(mm) Top").fill(htcross.getCorrectedPosition().z() - zTr);
+
+ } else {
+ aida.histogram1D(modNum + "Residual X(mm) Bottom").fill(htcross.getCorrectedPosition().y() - yTr);
+ aida.histogram1D(modNum + "Residual Y(mm) Bottom").fill(htcross.getCorrectedPosition().z() - zTr);
+ }
+
+
+ boolean doAmplitudePlots = true;
+ if(doAmplitudePlots) {
+ for (HelicalTrackStrip hts : htcross.getStrips()) {
+ double clusterSum = 0;
+ double clusterT0 = 0;
+ int nHitsCluster = 0;
+
+ for (RawTrackerHit rawHit : (List<RawTrackerHit>) hts.rawhits()) {
+ if(event.hasCollection(LCRelation.class, "SVTFittedRawTrackerHits")) {
+ List<LCRelation> fittedHits = event.get(LCRelation.class, "SVTFittedRawTrackerHits");
+ for(LCRelation fittedHit : fittedHits) {
+ if(rawHit.equals((RawTrackerHit)fittedHit.getFrom())) {
+ double amp = FittedRawTrackerHit.getAmp(fittedHit);
+ double t0 = FittedRawTrackerHit.getT0(fittedHit);
+ //System.out.println("to="+t0 + " amp=" + amp);
+ aida.histogram1D("Amp (HitOnTrack)").fill(amp);
+ if (trk.getTrackStates().get(0).getMomentum()[0] > 0.8) {
+ aida.histogram1D("Amp Pz>0.8 (HitOnTrack)").fill(amp);
+ }
+ aida.histogram1D("t0 (HitOnTrack)").fill(t0);
+ if (trk.getTrackStates().get(0).getMomentum()[0] > 0.8) {
+ aida.histogram1D("t0 Pz>0.8 (HitOnTrack)").fill(t0);
+ }
+ clusterSum += amp;
+ clusterT0 += t0;
+ nHitsCluster++;
+ }
+ }
+ }
+ }
+
+ aida.histogram1D("Hits in Cluster (HitOnTrack)").fill(nHitsCluster);
+ aida.histogram1D("Cluster Amp (HitOnTrack)").fill(clusterSum);
+ if (trk.getTrackStates().get(0).getMomentum()[0] > 0.8) {
+ aida.histogram1D("Cluster Amp Pz>0.8 (HitOnTrack)").fill(clusterSum);
+ }
+ if(nHitsCluster>0) {
+ aida.histogram1D("Cluster t0 (HitOnTrack)").fill(clusterT0/nHitsCluster);
+ if (trk.getTrackStates().get(0).getMomentum()[0] > 0.8) {
+ aida.histogram1D("Cluster t0 Pz>0.8 (HitOnTrack)").fill(clusterT0/nHitsCluster);
+ }
+ }
+
+ }
+ }
+ }
+
+ for(Map.Entry<HpsSiSensor,Integer> sensor : stripHitsOnTrack.entrySet())
+ aida.histogram1D(sensor.getKey().getName() + " strip hits iso on track").fill(stripHitsIsoOnTrack.get(sensor.getKey()));
+
+
+
+ Cluster clust = null;
+ if(event.hasCollection(Cluster.class,ecalCollectionName)) {
+ List<Cluster> clusters = event.get(Cluster.class, ecalCollectionName);
+
+ Cluster cand_clust = findClosestCluster(posAtEcal, clusters);
+
+ if (cand_clust != null) {
+
+ // track matching requirement
+ if(Math.abs( posAtEcal.x() - cand_clust.getPosition()[0])<30.0 &&
+ Math.abs( posAtEcal.y() - cand_clust.getPosition()[1])<30.0)
+ {
+ clust = cand_clust;
+ if(trk.getCharge()<0) pCanditates.put(trk, clust);
+ else eCanditates.put(trk, clust);
+
+ posAtEcal = TrackUtils.extrapolateTrack(trk, clust.getPosition()[2]);//.positionAtEcal();
+
+ aida.histogram2D("Energy Vs Momentum").fill(clust.getEnergy(), trk.getTrackStates().get(0).getMomentum()[0]);
+ aida.histogram1D("Energy Over Momentum").fill(clust.getEnergy() / (trk.getTrackStates().get(0).getMomentum()[0] ));
+ aida.histogram1D("deltaX").fill(clust.getPosition()[0] - posAtEcal.x());
+ aida.histogram1D("deltaY").fill(clust.getPosition()[1] - posAtEcal.y());
+ aida.histogram2D("X ECal Vs Track").fill(clust.getPosition()[0], posAtEcal.x());
+ aida.histogram2D("Y ECal Vs Track").fill(clust.getPosition()[1], posAtEcal.y());
+
+ if (isTop == 0) {
+ aida.histogram2D("Top Energy Vs Momentum").fill(clust.getEnergy(), trk.getTrackStates().get(0).getMomentum()[0] );
+ // aida.histogram2D("Top Energy Vs Momentum").fill(posAtEcal.y(), trk.getTrackStates().get(0).getMomentum()[0]);
+ aida.histogram1D("Top Energy Over Momentum").fill(clust.getEnergy() / (trk.getTrackStates().get(0).getMomentum()[0]));
+ aida.histogram1D("Top deltaX").fill(clust.getPosition()[0] - posAtEcal.x());
+ aida.histogram1D("Top deltaY").fill(clust.getPosition()[1] - posAtEcal.y());
+ aida.histogram2D("Top deltaX vs X").fill(clust.getPosition()[0], clust.getPosition()[0] - posAtEcal.x());
+ aida.histogram2D("Top deltaY vs Y").fill(clust.getPosition()[1], clust.getPosition()[1] - posAtEcal.y());
+ aida.histogram2D("Top X ECal Vs Track").fill(clust.getPosition()[0], posAtEcal.x());
+ aida.histogram2D("Top Y ECal Vs Track").fill(clust.getPosition()[1], posAtEcal.y());
+ } else {
+ aida.histogram2D("Bottom Energy Vs Momentum").fill(clust.getEnergy(), trk.getTrackStates().get(0).getMomentum()[0] );
+ aida.histogram1D("Bottom Energy Over Momentum").fill(clust.getEnergy() / (trk.getTrackStates().get(0).getMomentum()[0]));
+ aida.histogram1D("Bottom deltaX").fill(clust.getPosition()[0] - posAtEcal.x());
+ aida.histogram1D("Bottom deltaY").fill(clust.getPosition()[1] - posAtEcal.y());
+ aida.histogram2D("Bottom deltaX vs X").fill(clust.getPosition()[0], clust.getPosition()[0] - posAtEcal.x());
+ aida.histogram2D("Bottom deltaY vs Y").fill(clust.getPosition()[1], clust.getPosition()[1] - posAtEcal.y());
+ aida.histogram2D("Bottom X ECal Vs Track").fill(clust.getPosition()[0], posAtEcal.x());
+ aida.histogram2D("Bottom Y ECal Vs Track").fill(clust.getPosition()[1], posAtEcal.y());
+ }
+ }
+ }
+ }
+
+ if (clust == null) {
+ aida.histogram1D("Tracks matched").fill(0);
+ if(trk.getTrackStates().get(0).getMomentum()[0] > 0.8){
+ aida.histogram1D("Tracks matched (Pz>0.8)").fill(0);
+ }
+ if(isTop == 0) {
+ aida.histogram1D("Tracks matched Top").fill(0);
+ if(trk.getTrackStates().get(0).getMomentum()[0] > 0.8){
+ aida.histogram1D("Tracks matched Top (Pz>0.8)").fill(0);
+ }
+ } else {
+ aida.histogram1D("Tracks matched Bottom").fill(0);
+ if(trk.getTrackStates().get(0).getMomentum()[0] > 0.8){
+ aida.histogram1D("Tracks matched Bottom (Pz>0.8)").fill(0);
+ }
+ }
+ } else {
+ aida.histogram1D("Tracks matched").fill(1);
+ if(trk.getTrackStates().get(0).getMomentum()[0] > 0.8){
+ aida.histogram1D("Tracks matched (Pz>0.8)").fill(1);
+ }
+
+ if (isTop == 0) {
+ aida.histogram1D("Tracks matched Top").fill(1);
+ if(trk.getTrackStates().get(0).getMomentum()[0] > 0.8){
+ aida.histogram1D("Tracks matched Top (Pz>0.8)").fill(1);
+ }
+ } else {
+ aida.histogram1D("Tracks matched Bottom").fill(1);
+ if(trk.getTrackStates().get(0).getMomentum()[0] > 0.8){
+ aida.histogram1D("Tracks matched Bottom (Pz>0.8)").fill(1);
+ }
+ }
+
+ }
+
+ }
+
+ nTracksBot.fill(ntracksBot);
+ nTracksTop.fill(ntracksTop);
+
+ // e+/e-
+ Map.Entry<Track, Cluster> ecand_highestP = null;
+ double e_pmax = -1;
+ Map.Entry<Track, Cluster> pcand_highestP = null;
+ double p_pmax = -1;
+ for(Map.Entry<Track, Cluster> ecand : eCanditates.entrySet()) {
+ double p = getMomentum(ecand.getKey());
+ aida.histogram1D("p(e-)").fill(p);
+ if(ecand_highestP == null ) {
+ ecand_highestP = ecand;
+ e_pmax = getMomentum(ecand_highestP.getKey());
+ } else {
+ if(p > e_pmax) {
+ ecand_highestP = ecand;
+ e_pmax = getMomentum(ecand_highestP.getKey());
+ }
+ }
+ }
+
+ for(Map.Entry<Track, Cluster> pcand : pCanditates.entrySet()) {
+ double p = getMomentum(pcand.getKey());
+ aida.histogram1D("p(e+)").fill(p);
+ if(pcand_highestP == null ) {
+ pcand_highestP = pcand;
+ p_pmax = getMomentum(pcand_highestP.getKey());
+ } else {
+ if(p > p_pmax) {
+ pcand_highestP = pcand;
+ p_pmax = getMomentum(pcand_highestP.getKey());
+ }
+ }
+ }
+
+ aida.histogram1D("n(e-)").fill(eCanditates.size());
+ aida.histogram1D("n(e+)").fill(pCanditates.size());
+ if(ecand_highestP!=null) {
+ aida.histogram1D("p(e-) max").fill(e_pmax);
+ }
+ if(pcand_highestP!=null) {
+ aida.histogram1D("p(e+) max").fill(p_pmax);
+ }
+ if(ecand_highestP!=null && pcand_highestP!=null) {
+ aida.histogram2D("p(e-) vs p(e+) max").fill(e_pmax, p_pmax);
+ }
+
+
+ }
+
+ private double getMomentum(Track trk) {
+ double p = Math.sqrt(trk.getTrackStates().get(0).getMomentum()[0]*trk.getTrackStates().get(0).getMomentum()[0] +
+ trk.getTrackStates().get(0).getMomentum()[1]*trk.getTrackStates().get(0).getMomentum()[1] +
+ trk.getTrackStates().get(0).getMomentum()[2]*trk.getTrackStates().get(0).getMomentum()[2]);
+ return p;
+ }
+
+ public int[] getTrackHitsPerLayer(Track trk) {
+ int n[] = {0, 0, 0, 0, 0, 0};
+ List<TrackerHit> hitsOnTrack = trk.getTrackerHits();
+ int layer;
+ for (TrackerHit hit : hitsOnTrack) {
+ HelicalTrackHit htc = (HelicalTrackHit) hit;
+// if (htc.getPosition()[2] < 0) {
+ layer = htc.Layer();
+ layer = (layer - 1) / 2;
+ n[layer] = n[layer] + 1;
+// }
+ }
+
+ return n;
+ }
+
+ public boolean singleTrackHitPerLayer(Track track) {
+ int hitsPerLayer[] = getTrackHitsPerLayer(track);
+ for (int i = 0; i < 5; ++i) {
+ if (hitsPerLayer[i] != 1) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ public boolean singleStripClusterPerLayer(int hitsPerLayer[]) {
+ //This includes both axial and stereo separately
+ // so for a hit in each double layer we need 10 hits
+ for (int i = 0; i < 10; ++i) {
+ if (hitsPerLayer[i] != 1) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ public int[] getStripClustersPerLayer(List<SiTrackerHitStrip1D> trackerHits, String side) {
+ String name;
+ int l;
+ int n[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+ boolean ddd = false;
+
+ if (ddd) {
+ System.out.println("Get # hits per layer on side \"" + side + "\"");
+ }
+
+ for (SiTrackerHitStrip1D stripCluster : trackerHits) {
+
+ if (ddd) {
+ System.out.println("Processing stripCluster " + stripCluster.toString());
+ }
+
+ if (!"".equals(side)) {
+ String s;
+ if (stripCluster.getPosition()[1] >= 0.0) {
+ s = "up";
+ } else {
+ s = "down";
+ }
+ if (!s.equals(side)) {
+ continue;
+ }
+ }
+
+ name = stripCluster.getSensor().getName();
+ if (name.length() < 14) {
+ System.err.println("This name is too short!!");
+ throw new RuntimeException("SiSensor name " + name + " is invalid?");
+ }
+
+ if (ddd) {
+ System.out.println("sensor name " + name);
+ }
+
+ if(name.contains("layer") && name.contains("_module")) {
+ //String str_l = name.substring(13);
+ String str_l = name.substring(name.indexOf("layer") + 5, name.indexOf("_module"));
+ l = Integer.parseInt(str_l);
+ }
+ else if(name.contains("module") && name.contains("_halfmodule")) {
+ int ll = HPSTrackerBuilder.getLayerFromVolumeName(name);
+ boolean isAxial = HPSTrackerBuilder.isAxialFromName(name);
+ boolean isTopLayer = HPSTrackerBuilder.getHalfFromName(name).equals("top") ? true : false;
+ if(isAxial) {
+ if(isTopLayer) {
+ l = 2*ll-1;
+ }
+ else {
+ l = 2*ll;
+ }
+ } else {
+ if(isTopLayer) {
+ l = 2*ll;
+ } else {
+ l = 2*ll-1;
+ }
+ }
+ } else {
+ throw new RuntimeException("Cannot get layer from name " + name);
+ }
+
+ if (ddd) {
+ System.out.println("sensor name " + name + " --> layer " + l);
+ }
+
+ if (l < 1 || l > 12) {
+ System.out.println("This layer doesn't exist?");
+ throw new RuntimeException("SiSensor name " + name + " is invalid?");
+ }
+
+ n[l - 1] = n[l - 1] + 1;
+
+ }
+
+ return n;
+ }
+
+ @Override
+ public void endOfData() {
+ if (outputPlots != null) {
+ try {
+ aida.saveAs(outputPlots);
+ } catch (IOException ex) {
+ Logger.getLogger(TrackingReconstructionPlots.class.getName()).log(Level.SEVERE, null, ex);
+ }
+ }
+ //plotterFrame.dispose();
+ //topFrame.dispose();
+ //bottomFrame.dispose();
+ }
+
+
+
+
+private void setupPlots() {
+
+
+ IAnalysisFactory fac = aida.analysisFactory();
+ plotter = fac.createPlotterFactory().create("HPS Tracking Plots");
+ plotter.setTitle("Momentum");
+ IPlotterStyle style = plotter.style();
+ style.dataStyle().fillStyle().setColor("yellow");
+ style.dataStyle().errorBarStyle().setVisible(false);
+ plotter.createRegions(2, 2);
+ //plotterFrame.addPlotter(plotter);
+
+ trkPx = aida.histogram1D("Track Momentum (Px)", 25, -0.25, 0.25);
+ IHistogram1D trkPy = aida.histogram1D("Track Momentum (Py)", 25, -0.5, 0.5);
+ IHistogram1D trkPz = aida.histogram1D("Track Momentum (Pz)", 25, 0, 1.5);
+ IHistogram1D trkChi2 = aida.histogram1D("Track Chi2", 25, 0, 25.0);
+
+ plotter.region(0).plot(trkPx);
+ plotter.region(1).plot(trkPy);
+ plotter.region(2).plot(trkPz);
+ plotter.region(3).plot(trkChi2);
+
+ if(showPlots) plotter.show();
+
+// ******************************************************************
+ top1 = fac.createPlotterFactory().create("Top Tracking Plots");
+ top1.setTitle("Top Momentum");
+ IPlotterStyle stop1 = top1.style();
+ stop1.dataStyle().fillStyle().setColor("green");
+ stop1.dataStyle().errorBarStyle().setVisible(false);
+ top1.createRegions(2, 2);
+ //topFrame.addPlotter(top1);
+
+ IHistogram1D toptrkPx = aida.histogram1D("Top Track Momentum (Px)", 25, -0.25, 0.25);
+ IHistogram1D toptrkPy = aida.histogram1D("Top Track Momentum (Py)", 25, -0.5, 0.5);
+ IHistogram1D toptrkPz = aida.histogram1D("Top Track Momentum (Pz)", 25, 0, 1.5);
+ IHistogram1D toptrkChi2 = aida.histogram1D("Top Track Chi2", 25, 0, 25.0);
+
+ top1.region(0).plot(toptrkPx);
+ top1.region(1).plot(toptrkPy);
+ top1.region(2).plot(toptrkPz);
+ top1.region(3).plot(toptrkChi2);
+
+ if(showPlots) top1.show();
+
+ bot1 = fac.createPlotterFactory().create("Bottom Tracking Plots");
+ bot1.setTitle("Bottom Momentum");
+ IPlotterStyle sbot1 = bot1.style();
+ sbot1.dataStyle().fillStyle().setColor("blue");
+ sbot1.dataStyle().errorBarStyle().setVisible(false);
+ bot1.createRegions(2, 2);
+ //bottomFrame.addPlotter(bot1);
+
+ IHistogram1D bottrkPx = aida.histogram1D("Bottom Track Momentum (Px)", 25, -0.25, 0.25);
+ IHistogram1D bottrkPy = aida.histogram1D("Bottom Track Momentum (Py)", 25, -0.5, 0.5);
+ IHistogram1D bottrkPz = aida.histogram1D("Bottom Track Momentum (Pz)", 25, 0, 1.5);
+ IHistogram1D bottrkChi2 = aida.histogram1D("Bottom Track Chi2", 25, 0, 25.0);
+
+ bot1.region(0).plot(bottrkPx);
+ bot1.region(1).plot(bottrkPy);
+ bot1.region(2).plot(bottrkPz);
+ bot1.region(3).plot(bottrkChi2);
+
+ if(showPlots) bot1.show();
+
+// ******************************************************************
+ IHistogram1D trkd0 = aida.histogram1D("d0 ", 25, -10.0, 10.0);
+ IHistogram1D trkphi = aida.histogram1D("sinphi ", 25, -0.2, 0.2);
+ IHistogram1D trkomega = aida.histogram1D("omega ", 25, -0.0025, 0.0025);
+ IHistogram1D trklam = aida.histogram1D("tan(lambda) ", 25, -0.1, 0.1);
+ IHistogram1D trkz0 = aida.histogram1D("z0 ", 25, -6.0, 6.0);
+
+ plotter22 = fac.createPlotterFactory().create("HPS Track Params");
+ plotter22.setTitle("Track parameters");
+ //plotterFrame.addPlotter(plotter22);
+ IPlotterStyle style22 = plotter22.style();
+ style22.dataStyle().fillStyle().setColor("yellow");
+ style22.dataStyle().errorBarStyle().setVisible(false);
+ plotter22.createRegions(2, 3);
+ plotter22.region(0).plot(trkd0);
+ plotter22.region(1).plot(trkphi);
+ plotter22.region(2).plot(trkomega);
+ plotter22.region(3).plot(trklam);
+ plotter22.region(4).plot(trkz0);
+
+ if(showPlots) plotter22.show();
+
+ // ******************************************************************
+
+
+ trkd0 = aida.histogram1D("d0 Top", 25, -10.0, 10.0);
+ trkphi = aida.histogram1D("sinphi Top", 25, -0.2, 0.2);
+ trkomega = aida.histogram1D("omega Top", 25, -0.0025, 0.0025);
+ trklam = aida.histogram1D("tan(lambda) Top", 25, -0.1, 0.1);
+ trkz0 = aida.histogram1D("z0 Top", 25, -6.0, 6.0);
+
+ plotter2221 = fac.createPlotterFactory().create("HPS Track Params");
+ plotter2221.setTitle("Track parameters");
+ //plotterFrame.addPlotter(plotter22);
+ IPlotterStyle style2221 = plotter2221.style();
+ style2221.dataStyle().fillStyle().setColor("yellow");
+ style2221.dataStyle().errorBarStyle().setVisible(false);
+ plotter2221.createRegions(2, 3);
+ plotter2221.region(0).plot(trkd0);
+ plotter2221.region(1).plot(trkphi);
+ plotter2221.region(2).plot(trkomega);
+ plotter2221.region(3).plot(trklam);
+ plotter2221.region(4).plot(trkz0);
+
+ if(showPlots) plotter2221.show();
+
+
+ // ******************************************************************
+
+
+ trkd0 = aida.histogram1D("d0 Bottom", 25, -10.0, 10.0);
+ trkphi = aida.histogram1D("sinphi Bottom", 25, -0.2, 0.2);
+ trkomega = aida.histogram1D("omega Bottom", 25, -0.0025, 0.0025);
+ trklam = aida.histogram1D("tan(lambda) Bottom", 25, -0.1, 0.1);
+ trkz0 = aida.histogram1D("z0 Bottom", 25, -6.0, 6.0);
+
+ plotter2222 = fac.createPlotterFactory().create("HPS Track Params");
+ plotter2222.setTitle("Track parameters");
+ //plotterFrame.addPlotter(plotter22);
+ IPlotterStyle style2222 = plotter2222.style();
+ style2222.dataStyle().fillStyle().setColor("yellow");
+ style2222.dataStyle().errorBarStyle().setVisible(false);
+ plotter2222.createRegions(2, 3);
+ plotter2222.region(0).plot(trkd0);
+ plotter2222.region(1).plot(trkphi);
+ plotter2222.region(2).plot(trkomega);
+ plotter2222.region(3).plot(trklam);
+ plotter2222.region(4).plot(trkz0);
+
+ if(showPlots) plotter2222.show();
+
+
+
+ // ******************************************************************
+
+
+ plotter2 = fac.createPlotterFactory().create("HPS Tracking Plots");
+ plotter2.setTitle("Track extrapolation");
+ //plotterFrame.addPlotter(plotter2);
+ IPlotterStyle style2 = plotter2.style();
+ style2.dataStyle().fillStyle().setColor("yellow");
+ style2.dataStyle().errorBarStyle().setVisible(false);
+ plotter2.createRegions(2, 4);
+ IHistogram1D xAtConverter = aida.histogram1D("X (mm) @ Z=-60cm", 50, -50, 50);
+ IHistogram1D yAtConverter = aida.histogram1D("Y (mm) @ Z=-60cm", 50, -20, 20);
+ IHistogram1D xAtColl = aida.histogram1D("X (mm) @ Z=-150cm", 50, -200, 200);
+ IHistogram1D yAtColl = aida.histogram1D("Y (mm) @ Z=-150cm", 50, -200, 200);
+ IHistogram1D xAtEcal = aida.histogram1D("X (mm) @ ECAL", 50, -500, 500);
+ IHistogram1D yAtEcal = aida.histogram1D("Y (mm) @ ECAL", 50, -100, 100);
+ IHistogram1D xAtEcal2 = aida.histogram1D("X (mm) @ ECAL (Pz>1)", 50, -500, 500);
+ IHistogram1D yAtEcal2 = aida.histogram1D("Y (mm) @ ECAL (Pz>1)", 50, -100, 100);
+
+ plotter2.region(0).plot(xAtConverter);
+ plotter2.region(4).plot(yAtConverter);
+ plotter2.region(1).plot(xAtColl);
+ plotter2.region(5).plot(yAtColl);
+ plotter2.region(2).plot(xAtEcal);
+ plotter2.region(6).plot(yAtEcal);
+ plotter2.region(3).plot(xAtEcal2);
+ plotter2.region(7).plot(yAtEcal2);
+
+ if(showPlots) plotter2.show();
+
+ // ******************************************************************
+
+ plotter222 = fac.createPlotterFactory().create("HPS Tracking Plots");
+ plotter222.setTitle("HPS Tracking Plots");
+ //plotterFrame.addPlotter(plotter222);
+ IPlotterStyle style222 = plotter222.style();
+ style222.dataStyle().fillStyle().setColor("yellow");
+ style222.dataStyle().errorBarStyle().setVisible(false);
+ plotter222.createRegions(2, 2);
+
+ IHistogram1D nHits = aida.histogram1D("Hits per Track", 5, 3, 8);
+ nTracks = aida.histogram1D("Tracks per Event", 3, 0, 3);
+ IHistogram1D nHitsCluster = aida.histogram1D("Hits in Cluster (HitOnTrack)", 4, 0, 4);
+
+
+ plotter222.region(0).plot(nHits);
+ plotter222.region(1).plot(nTracks);
+ plotter222.region(2).plot(nHitsCluster);
+
+ if(showPlots) plotter222.show();
+
+
+ // ******************************************************************
+
+ plotter22299 = fac.createPlotterFactory().create("HPS Tracking Plots Top");
+ plotter22299.setTitle("HPS Tracking Plots Top");
+ //plotterFrame.addPlotter(plotter22299);
+ IPlotterStyle style22299 = plotter22299.style();
+ style22299.dataStyle().fillStyle().setColor("yellow");
+ style22299.dataStyle().errorBarStyle().setVisible(false);
+ plotter22299.createRegions(2, 2);
+
+ IHistogram1D nHitsTop = aida.histogram1D("Hits per Track Top", 5, 3, 8);
+ nTracksTop = aida.histogram1D("Tracks per Event Top", 3, 0, 3);
+ IHistogram1D nHitsClusterTop = aida.histogram1D("Hits in Cluster (HitOnTrack) Top", 4, 0, 4);
+
+
+ plotter22299.region(0).plot(nHitsTop);
+ plotter22299.region(1).plot(nTracksTop);
+ plotter22299.region(2).plot(nHitsClusterTop);
+
+ if(showPlots) plotter22299.show();
+
+// ******************************************************************
+
+ plotter22298 = fac.createPlotterFactory().create("HPS Tracking Plots Bottom");
+ plotter22298.setTitle("HPS Tracking Plots Bottom");
+ //plotterFrame.addPlotter(plotter22298);
+ IPlotterStyle style22298 = plotter22298.style();
+ style22298.dataStyle().fillStyle().setColor("yellow");
+ style22298.dataStyle().errorBarStyle().setVisible(false);
+ plotter22298.createRegions(2, 2);
+
+ IHistogram1D nHitsBot = aida.histogram1D("Hits per Track Bot", 5, 3, 8);
+ nTracksBot = aida.histogram1D("Tracks per Event Bot", 3, 0, 3);
+ IHistogram1D nHitsClusterBot = aida.histogram1D("Hits in Cluster (HitOnTrack) Bot", 4, 0, 4);
+
+
+ plotter22298.region(0).plot(nHitsBot);
+ plotter22298.region(1).plot(nTracksBot);
+ plotter22298.region(2).plot(nHitsClusterBot);
+
+ if(showPlots) plotter22298.show();
+
+
+ // ******************************************************************
+
+
+ plotter2223 = fac.createPlotterFactory().create("Cluster Amp Plots");
+ plotter2223.setTitle("Other");
+ //plotterFrame.addPlotter(plotter222);
+ IPlotterStyle style2223 = plotter2223.style();
+ style2223.dataStyle().fillStyle().setColor("yellow");
+ style2223.dataStyle().errorBarStyle().setVisible(false);
+ plotter2223.createRegions(2, 2);
+
+
+
+ IHistogram1D amp = aida.histogram1D("Amp (HitOnTrack)", 50, 0, 5000);
+ IHistogram1D ampcl = aida.histogram1D("Cluster Amp (HitOnTrack)", 50, 0, 5000);
+ IHistogram1D amp2 = aida.histogram1D("Amp Pz>0.8 (HitOnTrack)", 50, 0, 5000);
+ IHistogram1D ampcl2 = aida.histogram1D("Cluster Amp Pz>0.8 (HitOnTrack)", 50, 0, 5000);
+
+
+ plotter2223.region(0).plot(amp);
+ plotter2223.region(1).plot(amp2);
+ plotter2223.region(2).plot(ampcl);
+ plotter2223.region(3).plot(ampcl2);
+
+ if(showPlots) plotter2223.show();
+
+// ******************************************************************
+
+
+ plotter2224 = fac.createPlotterFactory().create("t0 Plots");
+ plotter2224.setTitle("Other");
+ IPlotterStyle style2224 = plotter2224.style();
+ style2224.dataStyle().fillStyle().setColor("yellow");
+ style2224.dataStyle().errorBarStyle().setVisible(false);
+ plotter2224.createRegions(2, 2);
+
+ IHistogram1D t0 = aida.histogram1D("t0 (HitOnTrack)", 50, -100, 100);
+ IHistogram1D t0cl = aida.histogram1D("Cluster t0 (HitOnTrack)", 50, -100, 100);
+ IHistogram1D t02 = aida.histogram1D("t0 Pz>0.8 (HitOnTrack)", 50, -100, 100);
+ IHistogram1D t0cl2 = aida.histogram1D("Cluster t0 Pz>0.8 (HitOnTrack)", 50, -100, 100);
+
+ plotter2224.region(0).plot(t0);
+ plotter2224.region(1).plot(t0cl);
+ plotter2224.region(2).plot(t02);
+ plotter2224.region(3).plot(t0cl2);
+
+ if(showPlots) plotter2224.show();
+
+
+ // ******************************************************************
+
+ plotter3 = fac.createPlotterFactory().create("HPS Layer Residual Plots");
+ plotter3.setTitle("Layer Residuals");
+ //plotterFrame.addPlotter(plotter3);
+ IPlotterStyle style3 = plotter3.style();
+ style3.dataStyle().fillStyle().setColor("yellow");
+ style3.dataStyle().errorBarStyle().setVisible(false);
+ plotter3.createRegions(6, 2);
+
+ plotter3_1 = fac.createPlotterFactory().create("HPS Residual Plots (Single hit per layer)");
+ plotter3_1.setTitle("Residuals (Top)");
+ //plotterFrame.addPlotter(plotter3_1);
+ IPlotterStyle style3_1 = plotter3_1.style();
+ style3_1.dataStyle().fillStyle().setColor("yellow");
+ style3_1.dataStyle().errorBarStyle().setVisible(false);
+ plotter3_1.createRegions(6, 2);
+
+ plotter3_2 = fac.createPlotterFactory().create("HPS Residual Plots (Single strip cluster per layer)");
+ plotter3_2.setTitle("Residuals (Bottom)");
+ //plotterFrame.addPlotter(plotter3_2);
+ IPlotterStyle style3_2 = plotter3_2.style();
+ style3_2.dataStyle().fillStyle().setColor("yellow");
+ style3_2.dataStyle().errorBarStyle().setVisible(false);
+ plotter3_2.createRegions(6, 2);
+
+
+
+ for(int l=0; l < nLayers; ++l) {
+ for(int h=0; h <3;++h) {
+ String half;
+ if (h==0) half = "";
+ else if (h==1) half = " Top";
+ else half = " Bottom";
+ String name = "Layer " + String.valueOf(l+1) + " Residual X(mm)" + half;
+ IHistogram1D mod1ResX = aida.histogram1D(name, 25, -1, 1);
+ name = "Layer " + String.valueOf(l+1) + " Residual Y(mm)" + half;
+ IHistogram1D mod1ResY = aida.histogram1D(name, 25, -1, 1);
+
+ if(l>5) {
+ LOGGER.warning("cannot make plots for layer " + String.valueOf(l + 1));
+ continue;
+ }
+ if (h==0) {
+ plotter3.region(l*2).plot(mod1ResX);
+ plotter3.region(l*2 + 1).plot(mod1ResY);
+ }
+ else if (h==0) {
+ plotter3_1.region(l*2).plot(mod1ResX);
+ plotter3_1.region(l*2 + 1).plot(mod1ResY);
+ }
+ else {
+ plotter3_2.region(l*2).plot(mod1ResX);
+ plotter3_2.region(l*2 + 1).plot(mod1ResY);
+ }
+ }
+ }
+ if(showPlots) {
+ plotter3.show();
+ plotter3_1.show();
+ plotter3_2.show();
+ }
+
+
+
+ plotter3_11 = fac.createPlotterFactory().create("HPS Strip Residual Plots");
+ plotter3_11.setTitle("Strip Residuals (Top)");
+ //plotterFrame.addPlotter(plotter3_11);
+ IPlotterStyle style3_11 = plotter3_11.style();
+ style3_11.dataStyle().fillStyle().setColor("yellow");
+ style3_11.dataStyle().errorBarStyle().setVisible(false);
+ plotter3_11.createRegions(6, 6);
+ int i=0;
+ double[] limits = {1.,1.5,3.,4.,5.,5.,5.0};
+ for(HpsSiSensor sensor : sensors) {
+ double min = 0.0;
+ double max = 0.0;
+ int l = sensor.getLayerNumberFromDetectorElement();
+ max = limits[l-1];
+ min = -1.0*limits[l-1];
+ IHistogram1D resX = aida.histogram1D(sensor.getName() + " strip residual (mm)", 50, min, max);
+ if(l>6) {
+ LOGGER.warning("cannot make plots for this sensor " + sensor.getName());
+ continue;
+ }
+ plotter3_11.region(i).plot(resX);
+ i++;
+ }
+
+ if(showPlots) plotter3_11.show();
+
+
+
+
+
+
+ plotter4 = fac.createPlotterFactory().create("HPS Track and ECal Plots");
+ plotter4.setTitle("Track and ECal Correlations");
+ //plotterFrame.addPlotter(plotter4);
+ IPlotterStyle style4 = plotter4.style();
+ style4.setParameter("hist2DStyle", "colorMap");
+ style4.dataStyle().fillStyle().setParameter("colorMapScheme", "rainbow");
+ style4.dataStyle().fillStyle().setColor("yellow");
+ style4.dataStyle().errorBarStyle().setVisible(false);
+ plotter4.createRegions(2, 3);
+
+ IHistogram2D eVsP = aida.histogram2D("Energy Vs Momentum", 50, 0, 0.50, 50, 0, 1.5);
+ IHistogram1D eOverP = aida.histogram1D("Energy Over Momentum", 50, 0, 2);
+
+ IHistogram1D distX = aida.histogram1D("deltaX", 50, -100, 100);
+ IHistogram1D distY = aida.histogram1D("deltaY", 50, -40, 40);
+
+ IHistogram2D xEcalVsTrk = aida.histogram2D("X ECal Vs Track", 100, -400, 400, 100, -400, 400);
+ IHistogram2D yEcalVsTrk = aida.histogram2D("Y ECal Vs Track", 100, -100, 100, 100, -100, 100);
+
+ plotter4.region(0).plot(eVsP);
+ plotter4.region(3).plot(eOverP);
+ plotter4.region(1).plot(distX);
+ plotter4.region(4).plot(distY);
+ plotter4.region(2).plot(xEcalVsTrk);
+ plotter4.region(5).plot(yEcalVsTrk);
+
+ if(showPlots) plotter4.show();
+
+ // ******************************************************************
+ top2 = fac.createPlotterFactory().create("Top ECal Plots");
+ top2.setTitle("Top ECal Correlations");
+ IPlotterStyle stop2 = top2.style();
+ stop2.dataStyle().fillStyle().setColor("green");
+ stop2.dataStyle().errorBarStyle().setVisible(false);
+ stop2.setParameter("hist2DStyle", "colorMap");
+ stop2.dataStyle().fillStyle().setParameter("colorMapScheme", "rainbow");
+ top2.createRegions(2, 3);
+ //topFrame.addPlotter(top2);
+
+ IHistogram2D topeVsP = aida.histogram2D("Top Energy Vs Momentum", 50, 0, 0.500, 50, 0, 1.5);
+ IHistogram1D topeOverP = aida.histogram1D("Top Energy Over Momentum", 50, 0, 2);
+
+ IHistogram1D topdistX = aida.histogram1D("Top deltaX", 50, -100, 100);
+ IHistogram1D topdistY = aida.histogram1D("Top deltaY", 50, -40, 40);
+
+ IHistogram2D topxEcalVsTrk = aida.histogram2D("Top X ECal Vs Track", 100, -400, 400, 100, -100, 100);
+ IHistogram2D topyEcalVsTrk = aida.histogram2D("Top Y ECal Vs Track", 100, 0, 100, 100, 0, 100);
+
+ top2.region(0).plot(topeVsP);
+ top2.region(3).plot(topeOverP);
+ top2.region(1).plot(topdistX);
+ top2.region(4).plot(topdistY);
+ top2.region(2).plot(topxEcalVsTrk);
+ top2.region(5).plot(topyEcalVsTrk);
+
+ if(showPlots) top2.show();
+
+ bot2 = fac.createPlotterFactory().create("Bottom ECal Plots");
+ bot2.setTitle("Bottom ECal Correlations");
+ IPlotterStyle sbot2 = bot2.style();
+ sbot2.dataStyle().fillStyle().setColor("green");
+ sbot2.dataStyle().errorBarStyle().setVisible(false);
+ sbot2.setParameter("hist2DStyle", "colorMap");
+ sbot2.dataStyle().fillStyle().setParameter("colorMapScheme", "rainbow");
+ bot2.createRegions(2, 3);
+ //bottomFrame.addPlotter(bot2);
+
+ IHistogram2D BottomeVsP = aida.histogram2D("Bottom Energy Vs Momentum", 50, 0, 0.500, 50, 0, 1.5);
+ IHistogram1D BottomeOverP = aida.histogram1D("Bottom Energy Over Momentum", 50, 0, 2);
+
+ IHistogram1D BottomdistX = aida.histogram1D("Bottom deltaX", 50, -100, 100);
+ IHistogram1D BottomdistY = aida.histogram1D("Bottom deltaY", 50, -40, 40);
+
+ IHistogram2D BottomxEcalVsTrk = aida.histogram2D("Bottom X ECal Vs Track", 100, -400, 400, 100, -400, 400);
+ IHistogram2D BottomyEcalVsTrk = aida.histogram2D("Bottom Y ECal Vs Track", 100, -100, 0, 100, -100, 0);
+
+ bot2.region(0).plot(BottomeVsP);
+ bot2.region(3).plot(BottomeOverP);
+ bot2.region(1).plot(BottomdistX);
+ bot2.region(4).plot(BottomdistY);
+ bot2.region(2).plot(BottomxEcalVsTrk);
+ bot2.region(5).plot(BottomyEcalVsTrk);
+
+ if(showPlots) bot2.show();
+
+
+ // ******************************************************************
+ top3 = fac.createPlotterFactory().create("Top ECal Plots");
+ top3.setTitle("Top ECal More Correlations");
+ IPlotterStyle stop3 = top3.style();
+ stop3.dataStyle().fillStyle().setColor("green");
+ stop3.dataStyle().errorBarStyle().setVisible(false);
+ stop3.setParameter("hist2DStyle", "colorMap");
+ stop3.dataStyle().fillStyle().setParameter("colorMapScheme", "rainbow");
+ top3.createRegions(1, 2);
+ //topFrame.addPlotter(top3);
+
+ IHistogram2D topdistXvsX = aida.histogram2D("Top deltaX vs X", 51, -400, 400, 25, -100, 100);
+ IHistogram2D topdistYvsY = aida.histogram2D("Top deltaY vs Y", 51, 0, 100, 25, -40, 40);
+
+ top3.region(0).plot(topdistXvsX);
+ top3.region(1).plot(topdistYvsY);
+
+ if(showPlots) top3.show();
+
+ bot3 = fac.createPlotterFactory().create("Bottom ECal Plots");
+ bot3.setTitle("Bottom ECal More Correlations");
+ IPlotterStyle sbot3 = bot3.style();
+ sbot3.dataStyle().fillStyle().setColor("green");
+ sbot3.dataStyle().errorBarStyle().setVisible(false);
+ sbot3.setParameter("hist2DStyle", "colorMap");
+ sbot3.dataStyle().fillStyle().setParameter("colorMapScheme", "rainbow");
+ bot3.createRegions(1, 2);
+ //bottomFrame.addPlotter(bot3);
+
+ IHistogram2D botdistXvsX = aida.histogram2D("Bottom deltaX vs X", 51, -400, 400, 25, -100, 100);
+ IHistogram2D botdistYvsY = aida.histogram2D("Bottom deltaY vs Y", 51, -100, 0, 25, -40, 40);
+
+ bot3.region(0).plot(botdistXvsX);
+ bot3.region(1).plot(botdistYvsY);
+
+ if(showPlots) bot3.show();
+
+ // ******************************************************************
+ top4 = fac.createPlotterFactory().create("Track Matching Plots");
+ top4.setTitle("Track Matching Plots");
+ IPlotterStyle stop4 = top4.style();
+ stop4.dataStyle().fillStyle().setColor("green");
+ stop4.dataStyle().errorBarStyle().setVisible(false);
+ stop4.setParameter("hist2DStyle", "colorMap");
+ stop4.dataStyle().fillStyle().setParameter("colorMapScheme", "rainbow");
+ top4.createRegions(2, 3);
+ //topFrame.addPlotter(top4);
+
+ IHistogram1D trackmatchN = aida.histogram1D("Tracks matched", 3, 0, 3);
+ IHistogram1D toptrackmatchN = aida.histogram1D("Tracks matched Top", 3, 0, 3);
+ IHistogram1D bottrackmatchN = aida.histogram1D("Tracks matched Bottom", 3, 0, 3);
+ IHistogram1D trackmatchN2 = aida.histogram1D("Tracks matched (Pz>0.8)", 3, 0, 3);
+ IHistogram1D toptrackmatchN2 = aida.histogram1D("Tracks matched Top (Pz>0.8)", 3, 0, 3);
+ IHistogram1D bottrackmatchN2 = aida.histogram1D("Tracks matched Bottom (Pz>0.8)", 3, 0, 3);
+
+ top4.region(0).plot(trackmatchN);
+ top4.region(1).plot(toptrackmatchN);
+ top4.region(2).plot(bottrackmatchN);
+ top4.region(3).plot(trackmatchN2);
+ top4.region(4).plot(toptrackmatchN2);
+ top4.region(5).plot(bottrackmatchN2);
+
+ if(showPlots) top4.show();
+
+ // ******************************************************************
+ top44 = fac.createPlotterFactory().create("e+e- Plots");
+ top44.setTitle("e+e- Plots");
+ IPlotterStyle stop44 = top44.style();
+ stop44.dataStyle().fillStyle().setColor("green");
+ stop44.dataStyle().errorBarStyle().setVisible(false);
+ stop44.setParameter("hist2DStyle", "colorMap");
+ stop44.dataStyle().fillStyle().setParameter("colorMapScheme", "rainbow");
+ top44.createRegions(2,4);
+ //topFrame.addPlotter(top44);
+
+ IHistogram2D trackPCorr = aida.histogram2D("p(e-) vs p(e+) max", 25, 0, 1.2, 25, 0, 1.2);
+ IHistogram1D ne = aida.histogram1D("n(e-)", 3, 0, 3);
+ IHistogram1D np = aida.histogram1D("n(e+)", 3, 0, 3);
+ IHistogram1D pem = aida.histogram1D("p(e-) max", 25, 0, 1.5);
+ IHistogram1D pe = aida.histogram1D("p(e-)", 25, 0, 1.5);
+ IHistogram1D ppm = aida.histogram1D("p(e+) max", 25, 0, 1.5);
+ IHistogram1D pp = aida.histogram1D("p(e+)", 25, 0, 1.5);
+
+ top44.region(0).plot(trackPCorr);
+ top44.region(1).plot(ne);
+ top44.region(2).plot(np);
+ top44.region(3).plot(pe);
+ top44.region(4).plot(pp);
+ top44.region(5).plot(pem);
+ top44.region(6).plot(ppm);
+
+ if(showPlots) top44.show();
+
+
+
+// ******************************************************************
+ plotter5 = fac.createPlotterFactory().create("HPS Hit Positions");
+ plotter5.setTitle("Hit Positions: Top");
+ //plotterFrame.addPlotter(plotter5);
+ IPlotterStyle style5 = plotter5.style();
+ style5.setParameter("hist2DStyle", "colorMap");
+ style5.dataStyle().fillStyle().setParameter("colorMapScheme", "rainbow");
+ style5.dataStyle().fillStyle().setColor("yellow");
+ style5.dataStyle().errorBarStyle().setVisible(false);
+ plotter5.createRegions(1, 2);
+
+ IHistogram2D l1Pos = aida.histogram2D("Layer 1 HTH Position: Top", 50, -55, 55, 55, -25, 25);
+ IHistogram2D l7Pos = aida.histogram2D("Layer 7 HTH Position: Top", 50, -55, 55, 55, -25, 25);
+
+ plotter5.region(0).plot(l1Pos);
+ plotter5.region(1).plot(l7Pos);
+
+ if(showPlots) plotter5.show();
+
+ plotter5_1 = fac.createPlotterFactory().create("HPS Hit Positions");
+ plotter5_1.setTitle("Hit Positions: Bottom");
+ //plotterFrame.addPlotter(plotter5_1);
+ IPlotterStyle style5_1 = plotter5_1.style();
+ style5_1.setParameter("hist2DStyle", "colorMap");
+ style5_1.dataStyle().fillStyle().setParameter("colorMapScheme", "rainbow");
+ style5_1.dataStyle().fillStyle().setColor("yellow");
+ style5_1.dataStyle().errorBarStyle().setVisible(false);
+ plotter5_1.createRegions(1, 2);
+
+
+ IHistogram2D l1PosBot = aida.histogram2D("Layer 1 HTH Position: Bottom", 50, -55, 55, 55, -25, 25);
+ IHistogram2D l7PosBot = aida.histogram2D("Layer 7 HTH Position: Bottom", 50, -55, 55, 55, -25, 25);
+ plotter5_1.region(0).plot(l1PosBot);
+ plotter5_1.region(1).plot(l7PosBot);
+
+ if(showPlots) plotter5_1.show();
+
+ plotter55 = fac.createPlotterFactory().create("HPS Hit Positions");
+ plotter55.setTitle("Helical Track Hits");
+ //plotterFrame.addPlotter(plotter55);
+ IPlotterStyle style55 = plotter55.style();
+ style55.dataStyle().fillStyle().setColor("Green");
+ style55.dataStyle().errorBarStyle().setVisible(false);
+ style55.dataStyle().markerStyle().setSize(20);
+ plotter55.createRegions(1, 2);
+
+ IProfile avgLayersTopPlot = aida.profile1D("Number of Stereo Hits per layer in Top Half", 10, 0, 10);
+ IProfile avgLayersBottomPlot = aida.profile1D("Number of Stereo Hits per layer in Bottom Half", 10, 0, 10);
+
+ plotter55.region(0).plot(avgLayersTopPlot);
+ plotter55.region(1).plot(avgLayersBottomPlot);
+
+ if(showPlots) plotter55.show();
+
+ plotter6 = fac.createPlotterFactory().create("HPS ECAL Hit Positions");
+ plotter6.setTitle("ECAL Positions");
+ //plotterFrame.addPlotter(plotter6);
+ IPlotterStyle style6 = plotter6.style();
+ style6.setParameter("hist2DStyle", "colorMap");
+ style6.dataStyle().fillStyle().setParameter("colorMapScheme", "rainbow");
+ style6.dataStyle().fillStyle().setColor("yellow");
+ style6.dataStyle().errorBarStyle().setVisible(false);
+ plotter6.createRegions(4, 2);
+
+ IHistogram2D topECal = aida.histogram2D("Top ECal Cluster Position", 50, -400, 400, 10, 0, 100);
+ IHistogram2D botECal = aida.histogram2D("Bottom ECal Cluster Position", 50, -400, 400, 10, -100, 0);
+ IHistogram2D topECal1 = aida.histogram2D("Top ECal Cluster Position (>0 tracks)", 50, -400, 400, 10, 0, 100);
+ IHistogram2D botECal1 = aida.histogram2D("Bottom ECal Cluster Position (>0 tracks)", 50, -400, 400, 10, -100, 0);
+ IHistogram2D topECal2 = aida.histogram2D("Top ECal Cluster Position (E>0.1,>0 tracks)", 50, -400, 400, 10, 0, 100);
+ IHistogram2D botECal2 = aida.histogram2D("Bottom ECal Cluster Position (E>0.1,>0 tracks)", 50, -400, 400, 10, -100, 0);
+ IHistogram2D topECal3 = aida.histogram2D("Top ECal Cluster Position w_E (E>0.1,>0 tracks)", 50, -400, 400, 10, 0, 100);
+ IHistogram2D botECal3 = aida.histogram2D("Bottom ECal Cluster Position w_E (E>0.1,>0 tracks)", 50, -400, 400, 10, -100, 0);
+
+ plotter6.region(0).plot(topECal);
+ plotter6.region(1).plot(botECal);
+ plotter6.region(2).plot(topECal1);
+ plotter6.region(3).plot(botECal1);
+ plotter6.region(4).plot(topECal2);
+ plotter6.region(5).plot(botECal2);
+ plotter6.region(6).plot(topECal3);
+ plotter6.region(7).plot(botECal3);
+
+ if(showPlots) plotter6.show();
+
+
+ plotter66 = fac.createPlotterFactory().create("HPS ECAL Basic Plots");
+ plotter66.setTitle("ECAL Basic Plots");
+ //plotterFrame.addPlotter(plotter6);
+ IPlotterStyle style66 = plotter66.style();
+ style66.dataStyle().fillStyle().setColor("yellow");
+ style66.dataStyle().errorBarStyle().setVisible(false);
+ plotter66.createRegions(2, 2);
+
+ IHistogram1D topECalE = aida.histogram1D("Top ECal Cluster Energy", 50, 0, 2);
+ IHistogram1D botECalE = aida.histogram1D("Bottom ECal Cluster Energy", 50, 0, 2);
+ IHistogram1D topECalN = aida.histogram1D("Number of Clusters Top", 6, 0, 6);
+ IHistogram1D botECalN = aida.histogram1D("Number of Clusters Bot", 6, 0, 6);
+
+ plotter66.region(0).plot(topECalE);
+ plotter66.region(1).plot(botECalE);
+ plotter66.region(2).plot(botECalN);
+ plotter66.region(3).plot(topECalN);
+
+ if(showPlots) plotter66.show();
+
+
+
+
+ plotter8 = fac.createPlotterFactory().create("HPS Strip Hit From Stereo Multiplicity");
+ plotter8.setTitle("Strip Hit Multiplicity");
+ //plotterFrame.addPlotter(plotter8);
+ IPlotterStyle style8 = plotter8.style();
+ style8.dataStyle().fillStyle().setColor("yellow");
+ style8.dataStyle().errorBarStyle().setVisible(false);
+ plotter8.createRegions(6, 6);
+ i=0;
+ for(SiSensor sensor : sensors) {
+
+ IHistogram1D resX = aida.histogram1D(sensor.getName() + " strip hits from stereo", 10, 0, 10);
+ if(sensor.getName().contains("L7")) {
+ LOGGER.warning("cannot setup this plot. Fix.");
+ continue;
+ }
+ plotter8.region(i).plot(resX);
+ i++;
+ }
+
+ if(showPlots) plotter8.show();
+
+ plotter88 = fac.createPlotterFactory().create("HPS Strip Hit Multiplicity");
+ plotter88.setTitle("Strip Hit Multiplicity");
+ //plotterFrame.addPlotter(plotter88);
+ plotter88.setStyle(style8);
+ plotter88.createRegions(6, 6);
+ i=0;
+ for(SiSensor sensor : sensors) {
+
+ IHistogram1D resX = aida.histogram1D(sensor.getName() + " strip hits", 10, 0, 10);
+ if(sensor.getName().contains("L7")) {
+ LOGGER.warning("cannot setup this plot. Fix.");
+ continue;
+ }
+ plotter88.region(i).plot(resX);
+ i++;
+ }
+
+ if(showPlots) plotter88.show();
+
+
+
+
+
+ plotter888 = fac.createPlotterFactory().create("HPS Strip Hit Isolation");
+ plotter888.setTitle("Strip Hit Isolation");
+ //plotterFrame.addPlotter(plotter88);
+ plotter888.setStyle(style8);
+ plotter888.createRegions(6, 6);
+ i=0;
+ for(SiSensor sensor : sensors) {
+
+ IHistogram1D resX = aida.histogram1D(sensor.getName() + " strip hits iso", 50, 0, 5);
+ if(sensor.getName().contains("L7")) {
+ LOGGER.warning("cannot setup this plot. Fix.");
+ continue;
+ }
+ plotter888.region(i).plot(resX);
+ i++;
+ }
+
+ if(showPlots) plotter888.show();
+
+ plotter8888 = fac.createPlotterFactory().create("HPS Strip Hit On Track Isolation");
+ plotter8888.setTitle("Strip Hit On Track Isolation");
+ //plotterFrame.addPlotter(plotter88);
+ plotter8888.setStyle(style8);
+ plotter8888.createRegions(6, 6);
+ i=0;
+ for(SiSensor sensor : sensors) {
+
+ IHistogram1D resX = aida.histogram1D(sensor.getName() + " strip hits iso on track", 50, 0, 5);
+ if(sensor.getName().contains("L7")) {
+ LOGGER.warning("cannot setup this plot. Fix.");
+ continue;
+ }
+ plotter8888.region(i).plot(resX);
+ i++;
+ }
+
+ if(showPlots) plotter8888.show();
+
+
+ }
+
+
+
+
+ private Cluster findClosestCluster(Hep3Vector posonhelix, List<Cluster> clusters) {
+ Cluster closest = null;
+ double minDist = 9999;
+ for (Cluster cluster : clusters) {
+ double[] clPos = cluster.getPosition();
+ double clEne = cluster.getEnergy();
+ double dist = Math.sqrt(Math.pow(clPos[0] - posonhelix.x(), 2) + Math.pow(clPos[1] - posonhelix.y(), 2)); //coordinates!!!
+ if (dist < minDist && clEne > 0.4) {
+ closest = cluster;
+ minDist = dist;
+ }
+ }
+ return closest;
+ }
+}
|