lcsim/src/org/lcsim/recon/pfa/identifier
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
}