Print

Print


Author: [log in to unmask]
Date: Sun Dec  6 13:05:52 2015
New Revision: 4011

Log:
updating cluster/track matching

Modified:
    java/branches/nathan-dev/recon/src/main/java/org/hps/recon/particle/ReconParticleDriver.java
    java/branches/nathan-dev/recon/src/main/java/org/hps/recon/utils/TrackClusterMatcher.java

Modified: java/branches/nathan-dev/recon/src/main/java/org/hps/recon/particle/ReconParticleDriver.java
 =============================================================================
--- java/branches/nathan-dev/recon/src/main/java/org/hps/recon/particle/ReconParticleDriver.java	(original)
+++ java/branches/nathan-dev/recon/src/main/java/org/hps/recon/particle/ReconParticleDriver.java	Sun Dec  6 13:05:52 2015
@@ -267,30 +267,41 @@
                     ((BaseReconstructedParticle) particle).setParticleIdUsed(new SimpleParticleID(11, 0, 0, 0));
                 }
 
+                // the cluster matched to the track:
                 Cluster matchedCluster = null;
-
-                // Track the best matching cluster for the track.
-                // TODO: This should find the best match not just the first match.
-                clusterLoop:
-                for (Cluster cluster : clusters) {
-                    // Check if the cluster and track are a valid match.
-                    if (matcher.isMatch(cluster, track)) {
-
-                    	// Store the matched cluster to matched track.
-                    	clusterToTrack.put(cluster, track);
-                    	
-                        // Store the matched cluster.
-                        matchedCluster = cluster;
-
-                        // Since a match has been found, the loop can be
-                        // terminated.
-                        break clusterLoop;
-                    }
+              
+                // normalized cluster-track distance required for qualifying as a match:
+                final double maximumNSigma=5;
+                
+                // only match clusters to GBL tracks:
+                if (track.getType() >= 32) {
+                	 
+                	// normalized distance of the closest match:
+                	double smallestNSigma=Double.MAX_VALUE;
+                	
+                	for (Cluster cluster : clusters) {
+                		
+                		// normalized distance between this cluster and track:
+                		double thisNSigma=matcher.getNSigmaFromMeanGBL(cluster, track);
+
+                		// ignore if distance doesn't make the cut:
+                		if (thisNSigma > maximumNSigma) continue;
+                		
+                		// keep the cluster with the smallest normalized distance to the track:
+                		if (thisNSigma < smallestNSigma) {
+                			smallestNSigma = thisNSigma;
+                			matchedCluster = cluster;
+                		}
+                	}
                 }
-
+                
                 // If a cluster was found that matches the track...
                 if (matchedCluster != null) {
-                    particle.addCluster(matchedCluster);
+
+                	// store the matching for later cluster corrections: 
+                	clusterToTrack.put(matchedCluster,  track);
+                    
+                	particle.addCluster(matchedCluster);
 
                     int pid = particle.getParticleIDUsed().getPDG();
                     if (Math.abs(pid) == 11) {
@@ -645,7 +656,7 @@
     // Beam size variables.
     // The beamsize array is in the tracking frame
     /* TODO  mg-May 14, 2014:  the the beam size from the conditions db...also beam position!  */
-    protected double[] beamSize = {0.001, 0.130, 0.050}; //rough estimate from harp scans during engineering run production running
+    protected double[] beamSize = {0.001, 0.2, 0.02};
     protected double bField;
 
     //  flipSign is a kludge...

Modified: java/branches/nathan-dev/recon/src/main/java/org/hps/recon/utils/TrackClusterMatcher.java
 =============================================================================
--- java/branches/nathan-dev/recon/src/main/java/org/hps/recon/utils/TrackClusterMatcher.java	(original)
+++ java/branches/nathan-dev/recon/src/main/java/org/hps/recon/utils/TrackClusterMatcher.java	Sun Dec  6 13:05:52 2015
@@ -64,6 +64,104 @@
     private double bottomClusterTrackMatchDeltaYLow = -28; // mm 
     private double bottomClusterTrackMatchDeltaYHigh = 24; // mm 
 
+
+    /**
+     * Rafo's parameterization of cluster-seed x/y position residuals as function of energy.
+     * Derived using GBL tracks, non-analytic extrapolation, and uncorrected cluster positions.
+     */
+    private static final double dxMeanTopPosiGBL[] = { 6.67414,-9.57296, 5.70647, 27.4523,-28.1103,-9.11424 };
+    private static final double dxSigmTopPosiGBL[] = { 52.6437,-478.805, 1896.73,-3761.48, 3676.77,-1408.31 };
+    private static final double dxMeanBotPosiGBL[] = { 4.13802, 15.8887,-74.2844,-9.78944, 308.541,-287.668 };
+    private static final double dxSigmBotPosiGBL[] = { 37.6513,-294.851, 1002.15,-1639.08, 1228.02,-308.754 };
+    private static final double dxMeanTopElecGBL[] = {-1.6473,  5.58701, 25.3977,-17.1523,-121.025, 145.969 };
+    private static final double dxSigmTopElecGBL[] = { 48.7018,-423.599, 1592.66,-2959.99, 2668.97,-919.876 };
+    private static final double dxMeanBotElecGBL[] = {-6.63558, 83.7763,-460.451, 1275.63,-1702.83, 873.913 };
+    private static final double dxSigmBotElecGBL[] = { 47.0029,-411.784, 1586.52,-3083.37, 2985.58,-1145.53 };
+    private static final double dyMeanTopPosiGBL[] = { 0.71245, 5.57585,-6.50267,-8.21688, 39.8607,-43.9661 };
+    private static final double dySigmTopPosiGBL[] = { 33.0213,-275.174, 1168.77,-2642.34, 3045.52,-1406.21 };
+    private static final double dyMeanBotPosiGBL[] = {-5.532,   74.9738,-383.972, 977.849,-1250.28, 637.75  };
+    private static final double dySigmBotPosiGBL[] = { 19.019, -83.9253, 133.813, 119.883,-546.951, 405.207 };
+    private static final double dyMeanTopElecGBL[] = { 2.88498,-20.4101, 62.9689, 25.6386,-259.957, 207.145 };
+    private static final double dySigmTopElecGBL[] = { 8.65583, 120.676,-1166.43, 3811.72,-5383.19, 2787.42 };
+    private static final double dyMeanBotElecGBL[] = {-9.02276, 112.329,-489.761, 953.037,-829.96,  260.772 };
+    private static final double dySigmBotElecGBL[] = { 23.4856,-108.19,  158.7,   189.261,-682.034, 459.15  };
+
+    public double getNSigmaFromMeanGBL(Cluster cluster,Track track) {
+
+        if (this.useAnalyticExtrapolator)
+            throw new RuntimeException("This is to be used with non-analytic extrapolator only.");
+       
+        if (track.getType() < 32) 
+            throw new RuntimeException("This is to be used with GBL tracks only.");
+        
+    	// Get the cluster position:
+        Hep3Vector cPos = new BasicHep3Vector(cluster.getPosition());
+        
+        // Get the extrapolated track position at the calorimeter:
+        TrackState trackStateAtEcal = TrackUtils.getTrackStateAtECal(track);
+        Hep3Vector tPos = new BasicHep3Vector(trackStateAtEcal.getReferencePoint());
+        tPos = CoordinateTransformations.transformVectorToDetector(tPos);
+
+        // whether track is in top half of detector:
+        final boolean isTopTrack = track.getTrackStates().get(0).getTanLambda() > 0;
+       
+        // track and cluster in different halves:
+        if (isTopTrack != cPos.y()>0) return Double.MAX_VALUE;
+       
+        // choose which parameterization of mean and sigma to use:
+        double dxMean[],dyMean[],dxSigm[],dySigm[];
+        if (track.getCharge()==1) {
+        	if (isTopTrack) {
+        		dxMean=dxMeanTopPosiGBL;
+        		dxSigm=dxSigmTopPosiGBL;
+        		dyMean=dyMeanTopPosiGBL;
+        		dySigm=dySigmTopPosiGBL;
+        	}
+        	else {
+        		dxMean=dxMeanBotPosiGBL;
+        		dxSigm=dxSigmBotPosiGBL;
+        		dyMean=dyMeanBotPosiGBL;
+        		dySigm=dySigmBotPosiGBL;
+        	}
+        }
+        else if (track.getCharge()==-1) {
+        	if (isTopTrack) {
+        		dxMean=dxMeanTopElecGBL;
+        		dxSigm=dxSigmTopElecGBL;
+        		dyMean=dyMeanTopElecGBL;
+        		dySigm=dySigmTopElecGBL;
+        	}
+        	else {
+        		dxMean=dxMeanBotElecGBL;
+        		dxSigm=dxSigmBotElecGBL;
+        		dyMean=dyMeanBotElecGBL;
+        		dySigm=dySigmBotElecGBL;
+        	}
+        }
+        else {
+            return Double.MAX_VALUE;
+        }
+       
+        // get particle energy:
+        final double pp[] = track.getMomentum();
+        double ee = Math.sqrt( pp[0]*pp[0] + pp[1]*pp[1] + pp[2]*pp[2] );
+        
+        // force the parameterizations to be constant above a certain energy:
+        if (ee > 0.6) ee=0.6;
+
+        // calculate measured mean and sigma of deltaX and deltaY for this energy:
+        double aDxMean=0,aDxSigm=0,aDyMean=0,aDySigm=0;
+        for (int ii=dxMean.length-1; ii>=0; ii--) aDxMean = dxMean[ii] + ee*aDxMean;
+        for (int ii=dxSigm.length-1; ii>=0; ii--) aDxSigm = dxSigm[ii] + ee*aDxSigm;
+        for (int ii=dyMean.length-1; ii>=0; ii--) aDyMean = dyMean[ii] + ee*aDyMean;
+        for (int ii=dySigm.length-1; ii>=0; ii--) aDySigm = dySigm[ii] + ee*aDySigm;
+        
+        // calculate nSigma between track and cluster:
+        final double nSigmaX = Math.abs(cPos.x() - tPos.x() - aDxMean) / aDxSigm;
+        final double nSigmaY = Math.abs(cPos.y() - tPos.y() - aDyMean) / aDySigm;
+        return Math.sqrt(nSigmaX*nSigmaX + nSigmaY*nSigmaY);
+    }
+    
     /**
      * Z position to start extrapolation from
      */
@@ -194,7 +292,7 @@
             tPos = new BasicHep3Vector(trackStateAtEcal.getReferencePoint());
             tPos = CoordinateTransformations.transformVectorToDetector(tPos);
         }
-        
+       
         return Math.sqrt(Math.pow(cPos.x()-tPos.x(),2)+Math.pow(cPos.y()-tPos.y(),2));
     }