Print

Print


Author: [log in to unmask]
Date: Thu Jun  4 18:10:12 2015
New Revision: 3089

Log:
add optional test for shared hits

Modified:
    java/trunk/tracking/src/main/java/org/hps/recon/tracking/TrackerReconDriver.java

Modified: java/trunk/tracking/src/main/java/org/hps/recon/tracking/TrackerReconDriver.java
 =============================================================================
--- java/trunk/tracking/src/main/java/org/hps/recon/tracking/TrackerReconDriver.java	(original)
+++ java/trunk/tracking/src/main/java/org/hps/recon/tracking/TrackerReconDriver.java	Thu Jun  4 18:10:12 2015
@@ -3,11 +3,18 @@
 import hep.physics.vec.BasicHep3Vector;
 import hep.physics.vec.Hep3Vector;
 import hep.physics.vec.VecOp;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
+import java.util.Map;
 import org.lcsim.event.EventHeader;
+import org.lcsim.event.LCRelation;
+import org.lcsim.event.RelationalTable;
 import org.lcsim.event.Track;
 import org.lcsim.event.TrackerHit;
+import org.lcsim.event.base.BaseRelationalTable;
 import org.lcsim.event.base.BaseTrack;
 import org.lcsim.fit.helicaltrack.HelicalTrackHit;
 import org.lcsim.geometry.Detector;
@@ -50,7 +57,9 @@
     // enable the use of sectoring using sector binning in SeedTracker
     private boolean _applySectorBinning = true;
     private double rmsTimeCut = -1;
-
+    private boolean rejectUncorrectedHits = true;
+    private boolean rejectSharedHits = false;
+    
     public TrackerReconDriver() {
     }
 
@@ -110,6 +119,14 @@
      */
     public void setRmsTimeCut(double rmsTimeCut) {
         this.rmsTimeCut = rmsTimeCut;
+    }
+
+    public void setRejectUncorrectedHits(boolean rejectUncorrectedHits) {
+        this.rejectUncorrectedHits = rejectUncorrectedHits;
+    }
+
+    public void setRejectSharedHits(boolean rejectSharedHits) {
+        this.rejectSharedHits = rejectSharedHits;
     }
 
     /**
@@ -193,23 +210,79 @@
 
         // Set the type of track to indicate B-field in Y e.g. for swimming in Wired.
         List<Track> tracks = event.get(Track.class, trackCollectionName);
-        Iterator<Track> iter = tracks.iterator();
-        while (iter.hasNext()) {
-            Track track = iter.next();
-            boolean badTrack = false;
-            for (TrackerHit hit : track.getTrackerHits()) {
-                HelicalTrackHit hth = (HelicalTrackHit) hit;
-                double correction = VecOp.sub(hth.getCorrectedPosition(), new BasicHep3Vector(hth.getPosition())).magnitude();
-                double chisq = hth.chisq();
-                if (correction < 1e-6) {
-                    this.getLogger().warning(String.format("Bad HelicalTrackHit on track (correction distance %f, chisq penalty %f) - discarding track\n", correction, chisq));
-                    badTrack = true;
-                }
-            }
-            if (badTrack) {
-                iter.remove();
+
+        if (rejectUncorrectedHits) {
+            Iterator<Track> iter = tracks.iterator();
+            trackLoop:
+            while (iter.hasNext()) {
+                Track track = iter.next();
+                for (TrackerHit hit : track.getTrackerHits()) {
+                    HelicalTrackHit hth = (HelicalTrackHit) hit;
+                    double correction = VecOp.sub(hth.getCorrectedPosition(), new BasicHep3Vector(hth.getPosition())).magnitude();
+                    double chisq = hth.chisq();
+                    if (correction < 1e-6) {
+                        this.getLogger().warning(String.format("Discarding track with bad HelicalTrackHit (correction distance %f, chisq penalty %f)", correction, chisq));
+                        iter.remove();
+                        continue trackLoop;
+                    }
+                }
             }
         }
+
+        if (rejectSharedHits) {
+
+            RelationalTable hittostrip = new BaseRelationalTable(RelationalTable.Mode.MANY_TO_MANY, RelationalTable.Weighting.UNWEIGHTED);
+            List<LCRelation> hitrelations = event.get(LCRelation.class, "HelicalTrackHitRelations");
+            for (LCRelation relation : hitrelations) {
+                if (relation != null && relation.getFrom() != null && relation.getTo() != null) {
+                    hittostrip.add(relation.getFrom(), relation.getTo());
+                }
+            }
+
+            RelationalTable hittorotated = new BaseRelationalTable(RelationalTable.Mode.ONE_TO_ONE, RelationalTable.Weighting.UNWEIGHTED);
+            List<LCRelation> rotaterelations = event.get(LCRelation.class, "RotatedHelicalTrackHitRelations");
+            for (LCRelation relation : rotaterelations) {
+                if (relation != null && relation.getFrom() != null && relation.getTo() != null) {
+                    hittorotated.add(relation.getFrom(), relation.getTo());
+                }
+            }
+
+            Map<TrackerHit, List<Track>> stripsToTracks = new HashMap<TrackerHit, List<Track>>();
+            for (Track track : tracks) {
+                for (TrackerHit hit : track.getTrackerHits()) {
+                    Collection<TrackerHit> htsList = hittostrip.allFrom(hittorotated.from(hit));
+                    for (TrackerHit strip : htsList) {
+                        List<Track> sharedTracks = stripsToTracks.get(strip);
+                        if (sharedTracks == null) {
+                            sharedTracks = new ArrayList<Track>();
+                            stripsToTracks.put(strip, sharedTracks);
+                        }
+                        sharedTracks.add(track);
+                    }
+                }
+            }
+            Iterator<Track> iter = tracks.iterator();
+            trackLoop:
+            while (iter.hasNext()) {
+                Track track = iter.next();
+                for (TrackerHit hit : track.getTrackerHits()) {
+                    Collection<TrackerHit> htsList = hittostrip.allFrom(hittorotated.from(hit));
+                    for (TrackerHit strip : htsList) {
+                        List<Track> sharedTracks = stripsToTracks.get(strip);
+                        if (sharedTracks.size() > 1) {
+                            for (Track otherTrack : sharedTracks) {
+                                if (otherTrack.getChi2() < track.getChi2()) {
+                                    this.getLogger().warning(String.format("removing track with shared hits: chisq %f, d0 %f (other track has chisq %f)", track.getChi2(), track.getTrackStates().get(0).getD0(), otherTrack.getChi2()));
+                                    iter.remove();
+                                    continue trackLoop;
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        }
+
         setTrackType(tracks);
 
         // Increment number of events.