Author: [log in to unmask] Date: Tue Nov 3 13:13:56 2015 New Revision: 3932 Log: merge tracks Modified: java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/GBLRefitterDriver.java java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/GblUtils.java Modified: java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/GBLRefitterDriver.java ============================================================================= --- java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/GBLRefitterDriver.java (original) +++ java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/GBLRefitterDriver.java Tue Nov 3 13:13:56 2015 @@ -10,11 +10,9 @@ import org.hps.recon.tracking.MultipleScattering; import org.hps.recon.tracking.TrackUtils; import org.lcsim.event.EventHeader; -import org.lcsim.event.RawTrackerHit; import org.lcsim.event.RelationalTable; import org.lcsim.event.Track; import org.lcsim.event.TrackerHit; -import org.lcsim.fit.helicaltrack.HelicalTrackFit; import org.lcsim.geometry.Detector; import org.lcsim.lcio.LCIOConstants; import org.lcsim.util.Driver; @@ -30,6 +28,7 @@ private double bfield; private final MultipleScattering _scattering = new MultipleScattering(new MaterialSupervisor()); + private boolean mergeTracks = false; public void setInputCollectionName(String inputCollectionName) { this.inputCollectionName = inputCollectionName; @@ -37,6 +36,16 @@ public void setOutputCollectionName(String outputCollectionName) { this.outputCollectionName = outputCollectionName; + } + + /** + * Merge tracks with overlapping hit content. Right now nothing actually + * happens to the merged tracks; this is just for testing. + * + * @param mergeTracks default to false + */ + public void setMergeTracks(boolean mergeTracks) { + this.mergeTracks = mergeTracks; } @Override @@ -59,46 +68,63 @@ Map<Track, Track> inputToRefitted = new HashMap<Track, Track>(); for (Track track : tracks) { - HelicalTrackFit helix = TrackUtils.getHTF(track); - FittedGblTrajectory fit = GblUtils.doGBLFit(helix, TrackUtils.getStripHits(track, hitToStrips, hitToRotated), _scattering, bfield, 0); - - Track newTrack = MakeGblTracks.makeCorrectedTrack(fit, helix, track.getTrackerHits(), track.getType(), bfield); + Track newTrack = GblUtils.refitTrack(TrackUtils.getHTF(track), TrackUtils.getStripHits(track, hitToStrips, hitToRotated), track.getTrackerHits(), 5, _scattering, bfield); refittedTracks.add(newTrack); inputToRefitted.put(track, newTrack); } - Map<Set<TrackerHit>, List<Track>> hitSetToTrackList = new HashMap<Set<TrackerHit>, List<Track>>(); + if (mergeTracks) { + List<Track> mergedTracks = new ArrayList<Track>(); - for (Track track : tracks) { - Set<TrackerHit> trackHth = new HashSet<TrackerHit>(track.getTrackerHits()); - for (Track otherTrack : tracks) { - Set<TrackerHit> allHth = new HashSet<TrackerHit>(otherTrack.getTrackerHits()); - allHth.addAll(trackHth); - List<TrackerHit> hthList = new ArrayList<TrackerHit>(allHth); - if (hthList.size() == trackHth.size()) { - continue; + for (Track track : refittedTracks) { + List<TrackerHit> trackHth = track.getTrackerHits(); + otherTrackLoop: + for (Track otherTrack : refittedTracks) { + if (track == otherTrack) { + continue; + } + + Set<TrackerHit> allHth = new HashSet<TrackerHit>(otherTrack.getTrackerHits()); + allHth.addAll(trackHth); +// if (allHth.size() == trackHth.size()) { +// continue; +// } + + boolean[] hasHit = new boolean[6]; + + for (TrackerHit hit : allHth) { + int layer = (TrackUtils.getLayer(hit) - 1) / 2; + if (hasHit[layer]) { + continue otherTrackLoop; + } + hasHit[layer] = true; + } + for (Track mergedTrack : mergedTracks) { + if (mergedTrack.getTrackerHits().containsAll(allHth)) { + continue otherTrackLoop; + } + } + + Track mergedTrack = GblUtils.refitTrack(TrackUtils.getHTF(track), TrackUtils.getStripHits(track, hitToStrips, hitToRotated), allHth, 5, _scattering, bfield); + mergedTracks.add(mergedTrack); +// System.out.format("%f %f %f\n", fit.get_chi2(), inputToRefitted.get(track).getChi2(), inputToRefitted.get(otherTrack).getChi2()); +// mergedTrackToTrackList.put(mergedTrack, new ArrayList<Track>()); } + } - boolean[] hasHit = new boolean[6]; - boolean isGood = true; - - for (TrackerHit hit : hthList) { - int layer = (TrackUtils.getLayer(hit) - 1) / 2; - if (hasHit[layer]) { - isGood = false; - break; + for (Track mergedTrack : mergedTracks) { + List<Track> subTracks = new ArrayList<Track>(); + Set<TrackerHit> trackHth = new HashSet<TrackerHit>(mergedTrack.getTrackerHits()); + for (Track track : refittedTracks) { + if (trackHth.containsAll(track.getTrackerHits())) { + subTracks.add(track); } - hasHit[layer] = true; } - if (isGood) { - HelicalTrackFit helix = TrackUtils.getHTF(track); - Set<TrackerHit> allStripHits = new HashSet<TrackerHit>(TrackUtils.getStripHits(track, hitToStrips, hitToRotated)); - allStripHits.addAll(TrackUtils.getStripHits(otherTrack, hitToStrips, hitToRotated)); - - FittedGblTrajectory fit = GblUtils.doGBLFit(helix, new ArrayList<TrackerHit>(allStripHits), _scattering, bfield, 0); - Track newTrack = MakeGblTracks.makeCorrectedTrack(fit, helix, new ArrayList<TrackerHit>(allHth), 0, bfield); - System.out.format("%f %f %f\n", fit.get_chi2(), inputToRefitted.get(track).getChi2(), inputToRefitted.get(otherTrack).getChi2()); + System.out.format("%f:\t", mergedTrack.getChi2()); + for (Track subTrack : subTracks) { + System.out.format("%f (%d)\t", subTrack.getChi2(), subTrack.getTrackerHits().size()); } + System.out.println(); } } // Put the tracks back into the event and exit Modified: java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/GblUtils.java ============================================================================= --- java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/GblUtils.java (original) +++ java/trunk/tracking/src/main/java/org/hps/recon/tracking/gbl/GblUtils.java Tue Nov 3 13:13:56 2015 @@ -6,6 +6,9 @@ import hep.physics.vec.Hep3Vector; import hep.physics.vec.VecOp; import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.Comparator; import java.util.List; import org.hps.recon.tracking.CoordinateTransformations; import org.hps.recon.tracking.MaterialSupervisor; @@ -19,6 +22,7 @@ import org.lcsim.detector.tracker.silicon.SiSensor; import org.lcsim.detector.tracker.silicon.SiSensorElectrodes; import org.lcsim.event.RawTrackerHit; +import org.lcsim.event.Track; import org.lcsim.event.TrackerHit; import org.lcsim.fit.helicaltrack.HelicalTrackFit; import org.lcsim.fit.helicaltrack.HelicalTrackStrip; @@ -125,6 +129,34 @@ } } + /** + * Do a GBL fit to an arbitrary set of strip hits, with a starting value of + * the helix parameters. + * + * @param helix Initial helix parameters. Only track parameters are used + * (not covariance) + * @param stripHits Strip hits to be used for the GBL fit. Does not need to + * be in sorted order. + * @param hth Stereo hits for the track's hit list (these are not used in + * the GBL fit). Does not need to be in sorted order. + * @param nIterations Number of times to iterate the GBL fit. + * @param scattering Multiple scattering manager. + * @param bfield B-field + * @return The refitted track. + */ + public static Track refitTrack(HelicalTrackFit helix, Collection<TrackerHit> stripHits, Collection<TrackerHit> hth, int nIterations, MultipleScattering scattering, double bfield) { + List<TrackerHit> allHthList = sortHits(hth); + List<TrackerHit> sortedStripHits = sortHits(stripHits); + FittedGblTrajectory fit = GblUtils.doGBLFit(helix, sortedStripHits, scattering, bfield, 0); + for (int i = 0; i < nIterations; i++) { + Track newTrack = MakeGblTracks.makeCorrectedTrack(fit, helix, allHthList, 0, bfield); + helix = TrackUtils.getHTF(newTrack); + fit = GblUtils.doGBLFit(helix, sortedStripHits, scattering, bfield, 0); + } + Track mergedTrack = MakeGblTracks.makeCorrectedTrack(fit, helix, allHthList, 0, bfield); + return mergedTrack; + } + public static FittedGblTrajectory doGBLFit(HelicalTrackFit htf, List<TrackerHit> stripHits, MultipleScattering _scattering, double bfield, int debug) { List<GBLStripClusterData> stripData = makeStripData(htf, stripHits, _scattering, bfield, debug); double bfac = Constants.fieldConversion * bfield; @@ -294,4 +326,18 @@ return strip; } + + private static List<TrackerHit> sortHits(Collection<TrackerHit> hits) { + List<TrackerHit> hitList = new ArrayList<TrackerHit>(hits); + Collections.sort(hitList, new LayerComparator()); + return hitList; + } + + private static class LayerComparator implements Comparator<TrackerHit> { + + @Override + public int compare(TrackerHit o1, TrackerHit o2) { + return Integer.compare(TrackUtils.getLayer(o1), TrackUtils.getLayer(o2)); + } + } }