Print

Print


Author: [log in to unmask]
Date: Wed Aug 26 00:12:28 2015
New Revision: 3403

Log:
Utility used to determine if a track and cluster are matched.

Added:
    java/trunk/recon/src/main/java/org/hps/recon/utils/
    java/trunk/recon/src/main/java/org/hps/recon/utils/TrackClusterMatcher.java   (with props)

Added: java/trunk/recon/src/main/java/org/hps/recon/utils/TrackClusterMatcher.java
 =============================================================================
--- java/trunk/recon/src/main/java/org/hps/recon/utils/TrackClusterMatcher.java	(added)
+++ java/trunk/recon/src/main/java/org/hps/recon/utils/TrackClusterMatcher.java	Wed Aug 26 00:12:28 2015
@@ -0,0 +1,132 @@
+package org.hps.recon.utils;
+
+import hep.physics.vec.BasicHep3Vector;
+import hep.physics.vec.Hep3Vector;
+
+import org.lcsim.event.Cluster;
+import org.lcsim.event.Track;
+
+import org.hps.recon.tracking.TrackUtils;
+
+/**
+ * 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 {
+
+   /*
+    * These cuts are set at +/- 3 sigma extracted from Gaussian fits to the 
+    * track-cluster residual distributions.
+    */
+   private double topClusterTrackMatchDeltaXLow = -7.61; // mm 
+   private double topClusterTrackMatchDeltaXHigh = 12.; // mm 
+   private double bottomClusterTrackMatchDeltaXLow = -13.75; // mm 
+   private double bottomClusterTrackMatchDeltaXHigh = 6.0; // mm 
+
+   private double topClusterTrackMatchDeltaYLow = -14; // mm 
+   private double topClusterTrackMatchDeltaYHigh = 14; // mm 
+   private double bottomClusterTrackMatchDeltaYLow = -14; // mm 
+   private double bottomClusterTrackMatchDeltaYHigh = 14; // mm 
+   
+   /** Constructor */
+   TrackClusterMatcher() {};
+ 
+   /**
+    * 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
+    */
+   public void setTopClusterTrackDxCuts(double xLow, double xHigh) {
+       this.topClusterTrackMatchDeltaXLow = xLow;
+       this.topClusterTrackMatchDeltaXHigh = xHigh;
+   }
+
+   /**
+    * 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
+    */
+   public void setTopClusterTrackDyCuts(double yLow, double yHigh) {
+       this.topClusterTrackMatchDeltaYLow = yLow;
+       this.topClusterTrackMatchDeltaYHigh = yHigh;
+   }
+
+   /**
+    * 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
+    */
+   public void setBottomClusterTrackDxCuts(double xLow, double xHigh) {
+       this.topClusterTrackMatchDeltaXLow = xLow;
+       this.topClusterTrackMatchDeltaXHigh = xHigh;
+   }
+
+   /**
+    * 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 
+    * considered a 'good match'
+    *  
+    * @param yLow
+    * @param yHigh
+    */
+   public void setBottomClusterTrackDyCuts(double yLow, double yHigh) {
+       this.topClusterTrackMatchDeltaYLow = yLow;
+       this.topClusterTrackMatchDeltaYHigh = yHigh;
+   }
+   
+   /**
+    * 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.
+    *  
+    * @param cluster : The Ecal cluster to check
+    * @param track : The SVT track to check
+    * @return true if all cuts are pased, false otherwise. 
+    */
+   private 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;
+      
+       // Get the cluster position
+       Hep3Vector clusterPosition = new BasicHep3Vector(cluster.getPosition());
+       
+       // Extrapolate the track to the Ecal cluster position
+       // TODO: At some point, this needs to use the fringe field
+       Hep3Vector trackPosAtEcal = TrackUtils.extrapolateTrack(track, clusterPosition.z());
+      
+       // 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 deltaY = 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 all cuts are pased, return true.
+       return true;
+   }
+}