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));
+ }
+ }
}
|