Author: [log in to unmask] Date: Thu Jun 18 12:44:07 2015 New Revision: 3158 Log: add ghost hit cut Modified: java/trunk/tracking/src/main/java/org/hps/recon/tracking/HelicalTrackHitDriver.java Modified: java/trunk/tracking/src/main/java/org/hps/recon/tracking/HelicalTrackHitDriver.java ============================================================================= --- java/trunk/tracking/src/main/java/org/hps/recon/tracking/HelicalTrackHitDriver.java (original) +++ java/trunk/tracking/src/main/java/org/hps/recon/tracking/HelicalTrackHitDriver.java Thu Jun 18 12:44:07 2015 @@ -5,10 +5,12 @@ 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 java.util.Set; import org.hps.recon.tracking.axial.HelicalTrack2DHit; import org.lcsim.detector.IDetectorElement; import org.lcsim.detector.ITransform3D; @@ -24,6 +26,7 @@ import org.lcsim.event.RawTrackerHit; import org.lcsim.event.RelationalTable; import org.lcsim.event.SimTrackerHit; +import org.lcsim.event.TrackerHit; import org.lcsim.event.base.BaseRelationalTable; import org.lcsim.event.base.MyLCRelation; import org.lcsim.fit.helicaltrack.HelicalTrackCross; @@ -61,6 +64,7 @@ private boolean _saveAxialHits = false; private String _axialname = "AxialTrackHits"; private String _axialmcrelname = "AxialTrackHitsMCRelations"; + private boolean rejectGhostHits = false; public enum LayerGeometryType { @@ -101,6 +105,16 @@ public void setClusterAmplitudeCut(double clusterAmplitudeCut) { this.clusterAmplitudeCut = clusterAmplitudeCut; + } + + /** + * Drop any HelicalTrackHit containing a 1D hit that is also used in another + * HelicalTrackHit. + * + * @param rejectGhostHits + */ + public void setRejectGhostHits(boolean rejectGhostHits) { + this.rejectGhostHits = rejectGhostHits; } /** @@ -207,7 +221,7 @@ // Cast the hit as a 1D strip hit and find the // identifier for the detector/layer combo SiTrackerHitStrip1D h = (SiTrackerHitStrip1D) hit; - if (clusterAmplitudeCut > 0 && h.getdEdx()/DopedSilicon.ENERGY_EHPAIR < clusterAmplitudeCut) { + if (clusterAmplitudeCut > 0 && h.getdEdx() / DopedSilicon.ENERGY_EHPAIR < clusterAmplitudeCut) { continue; } if (_clusterTimeCut > 0 && Math.abs(h.getTime()) > _clusterTimeCut) { @@ -386,6 +400,29 @@ } if (_debug) { System.out.printf("%s: cross at %.2f,%.2f,%.2f \n", this.getClass().getSimpleName(), cross.getPosition()[0], cross.getPosition()[1], cross.getPosition()[2]); + } + } + + if (rejectGhostHits) { + RelationalTable hittostrip = new BaseRelationalTable(RelationalTable.Mode.MANY_TO_MANY, RelationalTable.Weighting.UNWEIGHTED); + for (HelicalTrackCross cross : helicalTrackCrosses) { + for (HelicalTrackStrip strip : cross.getStrips()) { + hittostrip.add(cross, stripmap.get(strip)); + } + } + crossLoop: + for (Iterator<HelicalTrackCross> iter = helicalTrackCrosses.listIterator(); iter.hasNext();) { + HelicalTrackCross cross = iter.next(); + Collection<TrackerHit> htsList = hittostrip.allFrom(cross); + for (TrackerHit strip : htsList) { + Set<HelicalTrackHit> sharedCrosses = hittostrip.allTo(strip); + System.out.println(sharedCrosses.size()); + if (sharedCrosses.size() > 1) { +// this.getLogger().warning(String.format("removing possible ghost hit")); + iter.remove(); + continue crossLoop; + } + } } }