Author: [log in to unmask]
Date: Mon Sep 21 17:21:37 2015
New Revision: 3662
Log:
fix bug with GBL tracks
Modified:
java/trunk/recon/src/main/java/org/hps/recon/utils/TrackClusterMatcher.java
java/trunk/tracking/src/main/java/org/hps/recon/tracking/TrackUtils.java
Modified: java/trunk/recon/src/main/java/org/hps/recon/utils/TrackClusterMatcher.java
=============================================================================
--- java/trunk/recon/src/main/java/org/hps/recon/utils/TrackClusterMatcher.java (original)
+++ java/trunk/recon/src/main/java/org/hps/recon/utils/TrackClusterMatcher.java Mon Sep 21 17:21:37 2015
@@ -22,33 +22,37 @@
/**
* Utility used to determine if a track and cluster are matched.
- *
+ *
* @author <a href="mailto:[log in to unmask]">Omar Moreno</a>
*/
public class TrackClusterMatcher {
- /** The B field map */
+ /**
+ * The B field map
+ */
FieldMap bFieldMap = null;
-
+
// Plotting
- private ITree tree;
- private IHistogramFactory histogramFactory;
+ private ITree tree;
+ private IHistogramFactory histogramFactory;
private Map<String, IHistogram1D> plots1D;
private Map<String, IHistogram2D> plots2D;
-
- /** Flag used to determine if plots are enabled/disabled */
- boolean enablePlots = false;
-
- /**
+
+ /**
+ * Flag used to determine if plots are enabled/disabled
+ */
+ boolean enablePlots = false;
+
+ /**
* Flag used to determine whether the analytic or field map extrapolator
- * should be used.
- */
- boolean useAnalyticExtrapolator = false;
-
- /**
- * These cuts are set at +/- 4 sigma extracted from Gaussian fits to the
- * track-cluster residual distributions. The data used to determine these
- * limits is a pass 2 test file (t2.6) using run 5772.
+ * should be used.
+ */
+ boolean useAnalyticExtrapolator = false;
+
+ /**
+ * These cuts are set at +/- 4 sigma extracted from Gaussian fits to the
+ * track-cluster residual distributions. The data used to determine these
+ * limits is a pass 2 test file (t2.6) using run 5772.
*/
private double topClusterTrackMatchDeltaXLow = -14.5; // mm
private double topClusterTrackMatchDeltaXHigh = 23.5; // mm
@@ -60,17 +64,28 @@
private double bottomClusterTrackMatchDeltaYLow = -28; // mm
private double bottomClusterTrackMatchDeltaYHigh = 24; // mm
- /** Z position to start extrapolation from */
+ /**
+ * Z position to start extrapolation from
+ */
double extStartPos = 700; // mm
-
- /** The extrapolation step size */
+
+ /**
+ * The extrapolation step size
+ */
double stepSize = 5.; // mm
-
- /** Constant denoting the index of the {@link TrackState} at the Ecal */
- private static final int ECAL_TRACK_STATE_INDEX = 1;
-
- /** Constructor */
- public TrackClusterMatcher() {};
+
+ /**
+ * Constant denoting the index of the {@link TrackState} at the Ecal
+ */
+ private static final int ECAL_TRACK_STATE_INDEX = 1;
+
+ /**
+ * Constructor
+ */
+ public TrackClusterMatcher() {
+ }
+
+ ;
/**
* Enable/disable booking, filling of Ecal cluster and extrapolated track
@@ -78,37 +93,39 @@
*
* @param enablePlots true to enable, false to disable
*/
- public void enablePlots(boolean enablePlots) {
+ public void enablePlots(boolean enablePlots) {
this.enablePlots = enablePlots;
- if (enablePlots == true) this.bookHistograms();
- }
-
+ if (enablePlots == true) {
+ this.bookHistograms();
+ }
+ }
+
/**
* Set the 3D field map to be used by the extrapolator.
- *
+ *
* @param bFieldMap The {@link FieldMap} object containing a mapping to the
- * 3D field map.
- */
- public void setBFieldMap(FieldMap bFieldMap) {
- this.bFieldMap = bFieldMap;
- }
-
- /**
- * Use the analytic track extrapolator i.e. the no fringe extrapolator.
- * The field map extrapolator is used by default.
- *
- * @param useAnalyticExtrapolator Set to true to use the analytic
- * extrapolator, false otherwise.
- */
- public void setUseAnalyticExtrapolator(boolean useAnalyticExtrapolator) {
- this.useAnalyticExtrapolator = useAnalyticExtrapolator;
- }
-
- /**
- * Set the window in which the x residual of the extrapolated bottom track
+ * 3D field map.
+ */
+ public void setBFieldMap(FieldMap bFieldMap) {
+ this.bFieldMap = bFieldMap;
+ }
+
+ /**
+ * Use the analytic track extrapolator i.e. the no fringe extrapolator. The
+ * field map extrapolator is used by default.
+ *
+ * @param useAnalyticExtrapolator Set to true to use the analytic
+ * extrapolator, false otherwise.
+ */
+ public void setUseAnalyticExtrapolator(boolean useAnalyticExtrapolator) {
+ this.useAnalyticExtrapolator = useAnalyticExtrapolator;
+ }
+
+ /**
+ * Set the window in which the x residual of the extrapolated bottom track
* position at the Ecal and the Ecal cluster position must be within to be
* considered a 'good match'
- *
+ *
* @param xLow
* @param xHigh
*/
@@ -119,9 +136,9 @@
/**
* Set the window in which the y residual of the extrapolated bottom track
- * position at the Ecal and the Ecal cluster position must be within to be
+ * position at the Ecal and the Ecal cluster position must be within to be
* considered a 'good match'
- *
+ *
* @param yLow
* @param yHigh
*/
@@ -129,12 +146,12 @@
this.topClusterTrackMatchDeltaYLow = yLow;
this.topClusterTrackMatchDeltaYHigh = yHigh;
}
-
- /**
- * Set the window in which the x residual of the extrapolated top track position
- * at the Ecal and the Ecal cluster position must be within to be considered
- * a 'good match'
- *
+
+ /**
+ * Set the window in which the x residual of the extrapolated top track
+ * position at the Ecal and the Ecal cluster position must be within to be
+ * considered a 'good match'
+ *
* @param xLow
* @param xHigh
*/
@@ -144,10 +161,10 @@
}
/**
- * Set the window in which the y residual of the extrapolated top track position
- * at the Ecal and the Ecal cluster position must be within to be considered
- * a 'good match'
- *
+ * Set the window in which the y residual of the extrapolated top track
+ * position at the Ecal and the Ecal cluster position must be within to be
+ * considered a 'good match'
+ *
* @param yLow
* @param yHigh
*/
@@ -157,26 +174,28 @@
}
/**
- * Determine if a track is matched to a cluster. Currently, this is
+ * Determine if a track is matched to a cluster. Currently, this is
* determined by checking that the track and cluster are within the same
- * detector volume of each other and that the extrapolated track position
- * is within some defined distance of the cluster.
- *
+ * detector volume of each other and that the extrapolated track position is
+ * within some defined distance of the cluster.
+ *
* @param cluster : The Ecal cluster to check
* @param track : The SVT track to check
- * @return true if all cuts are pased, false otherwise.
- */
- public boolean isMatch(Cluster cluster, Track track) {
+ * @return true if all cuts are pased, false otherwise.
+ */
+ public boolean isMatch(Cluster cluster, Track track) {
// Check that the track and cluster are in the same detector volume.
// If not, there is no way they can be a match.
if ((track.getTrackStates().get(0).getTanLambda() > 0 && cluster.getPosition()[1] < 0)
- || (track.getTrackStates().get(0).getTanLambda() < 0 && cluster.getPosition()[1] > 0 )) return false;
+ || (track.getTrackStates().get(0).getTanLambda() < 0 && cluster.getPosition()[1] > 0)) {
+ return false;
+ }
// Get the cluster position
Hep3Vector clusterPosition = new BasicHep3Vector(cluster.getPosition());
//System.out.println("Cluster Position: " + clusterPosition.toString());
-
+
// Extrapolate the track to the Ecal cluster position
Hep3Vector trackPosAtEcal = null;
if (this.useAnalyticExtrapolator) {
@@ -184,159 +203,162 @@
trackPosAtEcal = TrackUtils.extrapolateTrack(track, clusterPosition.z());
} else {
//System.out.println("Using field map extrapolator");
- TrackState trackStateAtEcal = (TrackState) track.getTrackStates().get(this.ECAL_TRACK_STATE_INDEX);
- trackPosAtEcal = new BasicHep3Vector(trackStateAtEcal.getReferencePoint());
+ TrackState trackStateAtEcal = TrackUtils.getTrackStateAtECal(track);
+ trackPosAtEcal = new BasicHep3Vector(trackStateAtEcal.getReferencePoint());
trackPosAtEcal = CoordinateTransformations.transformVectorToDetector(trackPosAtEcal);
}
//System.out.println("Track position at Ecal: " + trackPosAtEcal.toString());
-
-
-
+
// Calculate the difference between the cluster position at the Ecal and
// the track in both the x and y directions
- double deltaX = clusterPosition.x() - trackPosAtEcal.x();
+ double deltaX = clusterPosition.x() - trackPosAtEcal.x();
double deltaY = clusterPosition.y() - trackPosAtEcal.y();
-
+
//System.out.println("delta X: " + deltaX);
//System.out.println("delta Y: " + deltaY);
-
if (enablePlots) {
- if (track.getTrackStates().get(0).getTanLambda() > 0) {
-
- plots1D.get("Ecal cluster x - track x @ Ecal - top - all").fill(deltaX);
- plots2D.get("Ecal cluster x v track x @ Ecal - top - all").fill(clusterPosition.x(),
- trackPosAtEcal.x());
- plots1D.get("Ecal cluster y - track y @ Ecal - top - all").fill(deltaY);
- plots2D.get("Ecal cluster y v track y @ Ecal - top - all").fill(clusterPosition.y(),
- trackPosAtEcal.y());
-
- } else if (track.getTrackStates().get(0).getTanLambda() < 0) {
-
- plots1D.get("Ecal cluster x - track x @ Ecal - bottom - all").fill(deltaX);
- plots2D.get("Ecal cluster x v track x @ Ecal - bottom - all").fill(clusterPosition.x(),
- trackPosAtEcal.x());
- plots1D.get("Ecal cluster y - track y @ Ecal - bottom - all").fill(deltaY);
- plots2D.get("Ecal cluster y v track y @ Ecal - bottom - all").fill(clusterPosition.y(),
- trackPosAtEcal.y());
+ if (track.getTrackStates().get(0).getTanLambda() > 0) {
+
+ plots1D.get("Ecal cluster x - track x @ Ecal - top - all").fill(deltaX);
+ plots2D.get("Ecal cluster x v track x @ Ecal - top - all").fill(clusterPosition.x(),
+ trackPosAtEcal.x());
+ plots1D.get("Ecal cluster y - track y @ Ecal - top - all").fill(deltaY);
+ plots2D.get("Ecal cluster y v track y @ Ecal - top - all").fill(clusterPosition.y(),
+ trackPosAtEcal.y());
+
+ } else if (track.getTrackStates().get(0).getTanLambda() < 0) {
+
+ plots1D.get("Ecal cluster x - track x @ Ecal - bottom - all").fill(deltaX);
+ plots2D.get("Ecal cluster x v track x @ Ecal - bottom - all").fill(clusterPosition.x(),
+ trackPosAtEcal.x());
+ plots1D.get("Ecal cluster y - track y @ Ecal - bottom - all").fill(deltaY);
+ plots2D.get("Ecal cluster y v track y @ Ecal - bottom - all").fill(clusterPosition.y(),
+ trackPosAtEcal.y());
}
}
// Check that dx and dy between the extrapolated track and cluster
// positions is reasonable. Different requirements are imposed on
// top and bottom tracks in order to account for offsets.
- if ((track.getTrackStates().get(0).getTanLambda() > 0 && (deltaX > topClusterTrackMatchDeltaXHigh ||
- deltaX < topClusterTrackMatchDeltaXLow)) ||
- (track.getTrackStates().get(0).getTanLambda() < 0 && (deltaX > bottomClusterTrackMatchDeltaXHigh ||
- deltaX < bottomClusterTrackMatchDeltaXLow))) return false;
-
- if ((track.getTrackStates().get(0).getTanLambda() > 0 && (deltaY > topClusterTrackMatchDeltaYHigh ||
- deltaY < topClusterTrackMatchDeltaYLow)) ||
- (track.getTrackStates().get(0).getTanLambda() < 0 && (deltaY > bottomClusterTrackMatchDeltaYHigh ||
- deltaY < bottomClusterTrackMatchDeltaYLow))) return false;
+ if ((track.getTrackStates().get(0).getTanLambda() > 0 && (deltaX > topClusterTrackMatchDeltaXHigh
+ || deltaX < topClusterTrackMatchDeltaXLow))
+ || (track.getTrackStates().get(0).getTanLambda() < 0 && (deltaX > bottomClusterTrackMatchDeltaXHigh
+ || deltaX < bottomClusterTrackMatchDeltaXLow))) {
+ return false;
+ }
+
+ if ((track.getTrackStates().get(0).getTanLambda() > 0 && (deltaY > topClusterTrackMatchDeltaYHigh
+ || deltaY < topClusterTrackMatchDeltaYLow))
+ || (track.getTrackStates().get(0).getTanLambda() < 0 && (deltaY > bottomClusterTrackMatchDeltaYHigh
+ || deltaY < bottomClusterTrackMatchDeltaYLow))) {
+ return false;
+ }
if (enablePlots) {
- if (track.getTrackStates().get(0).getTanLambda() > 0) {
-
- plots1D.get("Ecal cluster x - track x @ Ecal - top - matched").fill(deltaX);
- plots2D.get("Ecal cluster x v track x @ Ecal - top - matched").fill(clusterPosition.x(),
- trackPosAtEcal.x());
- plots1D.get("Ecal cluster y - track y @ Ecal - top - matched").fill(deltaY);
- plots2D.get("Ecal cluster y v track y @ Ecal - top - matched").fill(clusterPosition.y(),
- trackPosAtEcal.y());
-
- } else if (track.getTrackStates().get(0).getTanLambda() < 0) {
-
- plots1D.get("Ecal cluster x - track x @ Ecal - bottom - matched").fill(deltaX);
- plots2D.get("Ecal cluster x v track x @ Ecal - bottom - matched").fill(clusterPosition.x(),
- trackPosAtEcal.x());
- plots1D.get("Ecal cluster y - track y @ Ecal - bottom - matched").fill(deltaY);
- plots2D.get("Ecal cluster y v track y @ Ecal - bottom - matched").fill(clusterPosition.y(),
- trackPosAtEcal.y());
+ if (track.getTrackStates().get(0).getTanLambda() > 0) {
+
+ plots1D.get("Ecal cluster x - track x @ Ecal - top - matched").fill(deltaX);
+ plots2D.get("Ecal cluster x v track x @ Ecal - top - matched").fill(clusterPosition.x(),
+ trackPosAtEcal.x());
+ plots1D.get("Ecal cluster y - track y @ Ecal - top - matched").fill(deltaY);
+ plots2D.get("Ecal cluster y v track y @ Ecal - top - matched").fill(clusterPosition.y(),
+ trackPosAtEcal.y());
+
+ } else if (track.getTrackStates().get(0).getTanLambda() < 0) {
+
+ plots1D.get("Ecal cluster x - track x @ Ecal - bottom - matched").fill(deltaX);
+ plots2D.get("Ecal cluster x v track x @ Ecal - bottom - matched").fill(clusterPosition.x(),
+ trackPosAtEcal.x());
+ plots1D.get("Ecal cluster y - track y @ Ecal - bottom - matched").fill(deltaY);
+ plots2D.get("Ecal cluster y v track y @ Ecal - bottom - matched").fill(clusterPosition.y(),
+ trackPosAtEcal.y());
}
}
-
+
// If all cuts are pased, return true.
return true;
}
-
- /** Book histograms of Ecal cluster x/y vs extrapolated track x/y */
- private void bookHistograms() {
-
+
+ /**
+ * Book histograms of Ecal cluster x/y vs extrapolated track x/y
+ */
+ private void bookHistograms() {
+
plots1D = new HashMap<String, IHistogram1D>();
plots2D = new HashMap<String, IHistogram2D>();
-
+
tree = IAnalysisFactory.create().createTreeFactory().create();
histogramFactory = IAnalysisFactory.create().createHistogramFactory(tree);
-
+
//--- All tracks and clusters ---//
//-------------------------------//
-
//--- Top ---//
- plots1D.put("Ecal cluster x - track x @ Ecal - top - all",
- histogramFactory.createHistogram1D("Ecal cluster x - track x @ Ecal - top - all", 200, -200, 200));
-
- plots2D.put("Ecal cluster x v track x @ Ecal - top - all",
- histogramFactory.createHistogram2D("Ecal cluster x v track x @ Ecal - top - all", 200, -200, 200, 200, -200, 200));
-
- plots1D.put("Ecal cluster y - track y @ Ecal - top - all",
- histogramFactory.createHistogram1D("Ecal cluster y - track y @ Ecal - top - all", 100, -100, 100));
-
- plots2D.put("Ecal cluster y v track y @ Ecal - top - all",
- histogramFactory.createHistogram2D("Ecal cluster y v track @ Ecal - top - all", 100, -100, 100, 100, -100, 100));
-
+ plots1D.put("Ecal cluster x - track x @ Ecal - top - all",
+ histogramFactory.createHistogram1D("Ecal cluster x - track x @ Ecal - top - all", 200, -200, 200));
+
+ plots2D.put("Ecal cluster x v track x @ Ecal - top - all",
+ histogramFactory.createHistogram2D("Ecal cluster x v track x @ Ecal - top - all", 200, -200, 200, 200, -200, 200));
+
+ plots1D.put("Ecal cluster y - track y @ Ecal - top - all",
+ histogramFactory.createHistogram1D("Ecal cluster y - track y @ Ecal - top - all", 100, -100, 100));
+
+ plots2D.put("Ecal cluster y v track y @ Ecal - top - all",
+ histogramFactory.createHistogram2D("Ecal cluster y v track @ Ecal - top - all", 100, -100, 100, 100, -100, 100));
+
//--- Bottom ---//
- plots1D.put("Ecal cluster x - track x @ Ecal - bottom - all",
- histogramFactory.createHistogram1D("Ecal cluster x - track x @ Ecal - bottom - all", 200, -200, 200));
-
- plots2D.put("Ecal cluster x v track x @ Ecal - bottom - all",
- histogramFactory.createHistogram2D("Ecal cluster x v track x @ Ecal - bottom - all", 200, -200, 200, 200, -200, 200));
-
- plots1D.put("Ecal cluster y - track y @ Ecal - bottom - all",
- histogramFactory.createHistogram1D("Ecal cluster y - track y @ Ecal - bottom - all", 100, -100, 100));
-
- plots2D.put("Ecal cluster y v track y @ Ecal - bottom - all",
- histogramFactory.createHistogram2D("Ecal cluster y v track @ Ecal - bottom - all", 100, -100, 100, 100, -100, 100));
+ plots1D.put("Ecal cluster x - track x @ Ecal - bottom - all",
+ histogramFactory.createHistogram1D("Ecal cluster x - track x @ Ecal - bottom - all", 200, -200, 200));
+
+ plots2D.put("Ecal cluster x v track x @ Ecal - bottom - all",
+ histogramFactory.createHistogram2D("Ecal cluster x v track x @ Ecal - bottom - all", 200, -200, 200, 200, -200, 200));
+
+ plots1D.put("Ecal cluster y - track y @ Ecal - bottom - all",
+ histogramFactory.createHistogram1D("Ecal cluster y - track y @ Ecal - bottom - all", 100, -100, 100));
+
+ plots2D.put("Ecal cluster y v track y @ Ecal - bottom - all",
+ histogramFactory.createHistogram2D("Ecal cluster y v track @ Ecal - bottom - all", 100, -100, 100, 100, -100, 100));
//--- Matched tracks ---//
//----------------------//
-
//--- Top ---//
- plots1D.put("Ecal cluster x - track x @ Ecal - top - matched",
- histogramFactory.createHistogram1D("Ecal cluster x - track x @ Ecal - top - matched", 200, -200, 200));
-
- plots2D.put("Ecal cluster x v track x @ Ecal - top - matched",
- histogramFactory.createHistogram2D("Ecal cluster x v track x @ Ecal - top - matched", 200, -200, 200, 200, -200, 200));
-
- plots1D.put("Ecal cluster y - track y @ Ecal - top - matched",
- histogramFactory.createHistogram1D("Ecal cluster y - track y @ Ecal - top - matched", 100, -100, 100));
-
- plots2D.put("Ecal cluster y v track y @ Ecal - top - matched",
- histogramFactory.createHistogram2D("Ecal cluster y v track @ Ecal - top - matched", 100, -100, 100, 100, -100, 100));
-
+ plots1D.put("Ecal cluster x - track x @ Ecal - top - matched",
+ histogramFactory.createHistogram1D("Ecal cluster x - track x @ Ecal - top - matched", 200, -200, 200));
+
+ plots2D.put("Ecal cluster x v track x @ Ecal - top - matched",
+ histogramFactory.createHistogram2D("Ecal cluster x v track x @ Ecal - top - matched", 200, -200, 200, 200, -200, 200));
+
+ plots1D.put("Ecal cluster y - track y @ Ecal - top - matched",
+ histogramFactory.createHistogram1D("Ecal cluster y - track y @ Ecal - top - matched", 100, -100, 100));
+
+ plots2D.put("Ecal cluster y v track y @ Ecal - top - matched",
+ histogramFactory.createHistogram2D("Ecal cluster y v track @ Ecal - top - matched", 100, -100, 100, 100, -100, 100));
+
//--- Bottom ---//
- plots1D.put("Ecal cluster x - track x @ Ecal - bottom - matched",
- histogramFactory.createHistogram1D("Ecal cluster x - track x @ Ecal - bottom - matched", 200, -200, 200));
-
- plots2D.put("Ecal cluster x v track x @ Ecal - bottom - matched",
- histogramFactory.createHistogram2D("Ecal cluster x v track x @ Ecal - bottom - matched", 200, -200, 200, 200, -200, 200));
-
- plots1D.put("Ecal cluster y - track y @ Ecal - bottom - matched",
- histogramFactory.createHistogram1D("Ecal cluster y - track y @ Ecal - bottom - matched", 100, -100, 100));
-
- plots2D.put("Ecal cluster y v track y @ Ecal - bottom - matched",
- histogramFactory.createHistogram2D("Ecal cluster y v track @ Ecal - bottom - matched", 100, -100, 100, 100, -100, 100));
-
- }
-
- /** Save the histograms to a ROO file */
- public void saveHistograms() {
-
+ plots1D.put("Ecal cluster x - track x @ Ecal - bottom - matched",
+ histogramFactory.createHistogram1D("Ecal cluster x - track x @ Ecal - bottom - matched", 200, -200, 200));
+
+ plots2D.put("Ecal cluster x v track x @ Ecal - bottom - matched",
+ histogramFactory.createHistogram2D("Ecal cluster x v track x @ Ecal - bottom - matched", 200, -200, 200, 200, -200, 200));
+
+ plots1D.put("Ecal cluster y - track y @ Ecal - bottom - matched",
+ histogramFactory.createHistogram1D("Ecal cluster y - track y @ Ecal - bottom - matched", 100, -100, 100));
+
+ plots2D.put("Ecal cluster y v track y @ Ecal - bottom - matched",
+ histogramFactory.createHistogram2D("Ecal cluster y v track @ Ecal - bottom - matched", 100, -100, 100, 100, -100, 100));
+
+ }
+
+ /**
+ * Save the histograms to a ROO file
+ */
+ public void saveHistograms() {
+
String rootFile = "track_cluster_matching_plots.root";
RootFileStore store = new RootFileStore(rootFile);
try {
store.open();
store.add(tree);
- store.close();
+ store.close();
} catch (IOException e) {
e.printStackTrace();
}
Modified: java/trunk/tracking/src/main/java/org/hps/recon/tracking/TrackUtils.java
=============================================================================
--- java/trunk/tracking/src/main/java/org/hps/recon/tracking/TrackUtils.java (original)
+++ java/trunk/tracking/src/main/java/org/hps/recon/tracking/TrackUtils.java Mon Sep 21 17:21:37 2015
@@ -1272,4 +1272,12 @@
return new Line(r0, phi, lambda);
}
+ public static TrackState getTrackStateAtECal(Track trk) {
+ for (TrackState state : trk.getTrackStates()) {
+ if (state.getLocation() == TrackState.AtCalorimeter) {
+ return state;
+ }
+ }
+ return null;
+ }
}
|