Print

Print


Commit in lcsim/src/org/lcsim/recon/pfa/identifier on MAIN
SimpleTrackClusterMatcher.java+30-71.3 -> 1.4
MJC: Minor changes, make a little more flexible

lcsim/src/org/lcsim/recon/pfa/identifier
SimpleTrackClusterMatcher.java 1.3 -> 1.4
diff -u -r1.3 -r1.4
--- SimpleTrackClusterMatcher.java	3 Nov 2006 19:12:04 -0000	1.3
+++ SimpleTrackClusterMatcher.java	16 May 2007 17:41:39 -0000	1.4
@@ -3,6 +3,7 @@
 import java.util.*;
 import hep.physics.vec.*;
 
+import org.lcsim.util.decision.*;
 import org.lcsim.util.swim.HelixSwimmer;
 import org.lcsim.event.Cluster;
 import org.lcsim.event.CalorimeterHit;
@@ -26,11 +27,22 @@
  * Currently, the match criteria are hard-code. It would be better to
  * supply them as DecisionMaker objects.
  *
- * @version $Id: SimpleTrackClusterMatcher.java,v 1.3 2006/11/03 19:12:04 mcharles Exp $ 
+ * @version $Id: SimpleTrackClusterMatcher.java,v 1.4 2007/05/16 17:41:39 mcharles Exp $ 
  */
 
 public class SimpleTrackClusterMatcher extends Driver implements TrackClusterMatcher
 {
+    public SimpleTrackClusterMatcher(double cut) {
+	m_separationCut = cut;
+    }
+    public SimpleTrackClusterMatcher() {
+	// Use default cuts on track-cluster matching:
+	//   * Subdet must be EMBarrel or EMEndcap
+	//   * First layer of cluster in ECAL must be <5
+	//   * Track intercept point must be within 30 mm of a cluster hit
+	// For now, E/p cut is handled specially
+    }
+
     /**
       * Match this track to a cluster from the list supplied.
       */
@@ -153,20 +165,28 @@
     }
     protected double swimToEndcap(HelixSwimmer swimmer) {
 	// Look for a hit in the first layer of the ECAL endcap
-	return swimmer.getDistanceToZ(m_ECAL_endcap_z);
+	double distanceToEndcap1 = swimmer.getDistanceToZ(m_ECAL_endcap_z);
+	double distanceToEndcap2 = swimmer.getDistanceToZ(-m_ECAL_endcap_z);
+	if (distanceToEndcap1>0) {
+	    return distanceToEndcap1;
+	} else {
+	    return distanceToEndcap2;
+	}
     }
     protected boolean isValidBarrelIntercept(HelixSwimmer swimmer, double alpha) {
-	// Must have -m_ECAL_barrel_z <= z <= +m_ECAL_barrel_z
+	// Must have -m_ECAL_barrel_z <= z <= +m_ECAL_barrel_z (within errors)
+	double uncertainty = m_separationCut;
 	Hep3Vector intercept = swimmer.getPointAtDistance(alpha);
 	double z = intercept.z();
-	boolean zInRange = (z >= m_ECAL_barrel_zmin && z <= m_ECAL_barrel_zmax);
+	boolean zInRange = (z >= m_ECAL_barrel_zmin-uncertainty && z <= m_ECAL_barrel_zmax+uncertainty);
 	return zInRange;
     }
     protected boolean isValidEndcapIntercept(HelixSwimmer swimmer, double alpha) {
-	// Must have m_ECAL_endcap_rmin <= r <= m_ECAL_endcap_rmax
+	// Must have m_ECAL_endcap_rmin <= r <= m_ECAL_endcap_rmax (within errors)
+	double uncertainty = m_separationCut;
 	Hep3Vector intercept = swimmer.getPointAtDistance(alpha);
 	double r = Math.sqrt(intercept.x()*intercept.x() + intercept.y()*intercept.y());
-	boolean rInRange = (r >= m_ECAL_endcap_rmin && r <= m_ECAL_endcap_rmax);
+	boolean rInRange = (r >= m_ECAL_endcap_rmin-uncertainty && r <= m_ECAL_endcap_rmax+uncertainty);
 	return rInRange;
     }
 
@@ -189,7 +209,8 @@
 	    // Make cuts:
 	    boolean goodSubDet = (subdet.getName().compareTo("EMBarrel")==0) || (subdet.getName().compareTo("EMEndcap")==0);
 	    boolean goodFirstLayer = (firstHitInECAL!=null && getLayer(firstHitInECAL) < 5);
-	    boolean goodSeparation = (separation < 30.0);
+	    double separationCut = m_separationCut;
+	    boolean goodSeparation = (separation < separationCut);
 	    boolean foundMatch = goodSubDet && goodFirstLayer && goodSeparation;
 	    if (m_debug) { 
 		String printme = new String();
@@ -438,4 +459,6 @@
     }
     /** Specify what energy calibration to use for E/P check. */
     public void setCalibration(ClusterEnergyCalculator calib) { m_calib = calib; }
+
+    protected double m_separationCut = 30.0; // arbitrary
 }
CVSspam 0.2.8