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.
|