java/trunk/tracking/src/main/java/org/hps/recon/tracking/nobfield
--- java/trunk/tracking/src/main/java/org/hps/recon/tracking/nobfield/StraightTrack.java 2014-10-16 21:32:51 UTC (rev 1232)
+++ java/trunk/tracking/src/main/java/org/hps/recon/tracking/nobfield/StraightTrack.java 2014-10-16 21:33:15 UTC (rev 1233)
@@ -1,20 +1,12 @@
package org.hps.recon.tracking.nobfield;
import hep.physics.matrix.SymmetricMatrix;
-import static java.lang.Math.abs;
-import static java.lang.Math.signum;
import java.util.ArrayList;
import java.util.List;
-import org.lcsim.constants.Constants;
import org.lcsim.event.LCIOParameters;
import org.lcsim.event.Track;
import org.lcsim.event.TrackState;
import org.lcsim.event.TrackerHit;
-import static org.lcsim.event.base.BaseTrack.D0;
-import static org.lcsim.event.base.BaseTrack.OMEGA;
-import static org.lcsim.event.base.BaseTrack.PHI;
-import static org.lcsim.event.base.BaseTrack.TANLAMBDA;
-import static org.lcsim.event.base.BaseTrack.Z0;
import org.lcsim.event.base.BaseTrackState;
/**
@@ -31,6 +23,9 @@
protected List<TrackState> _trackStates;
protected double[] _chi2 = new double[2];
protected double[] _parameters = new double[5];
+ protected double[] _momentum = new double[3];
+ protected double[] _ref = new double[3];
+ protected int _ndf;
// Parameter ordering.
public static final int x0 = LCIOParameters.ParameterName.d0.ordinal();
public static final int slopeXZ = LCIOParameters.ParameterName.phi0.ordinal();
@@ -139,59 +134,59 @@
@Override
public int getCharge() {
- throw new UnsupportedOperationException("StraightTrack...no momentum measured."); //To change body of generated methods, choose Tools | Templates.
+ return -999;
}
@Override
public double[] getReferencePoint() {
- throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+ return _ref;
}
@Override
public double getReferencePointX() {
- throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+ return _ref[0];
}
@Override
public double getReferencePointY() {
- throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+ return _ref[1];
}
@Override
public double getReferencePointZ() {
- throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+ return _ref[2];
}
@Override
public boolean isReferencePointPCA() {
- throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+ return false;
}
@Override
public double[] getMomentum() {
- throw new UnsupportedOperationException("StraightTrack...no momentum measured."); //To change body of generated methods, choose Tools | Templates.
+ return _momentum;
}
@Override
public double getPX() {
- throw new UnsupportedOperationException("StraightTrack...no momentum measured."); //To change body of generated methods, choose Tools | Templates.
+ return -999;
}
@Override
public double getPY() {
- throw new UnsupportedOperationException("StraightTrack...no momentum measured."); //To change body of generated methods, choose Tools | Templates.
+ return -999;
}
@Override
public double getPZ() {
- throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+ return -999;
}
@Override
public boolean fitSuccess() {
throw new UnsupportedOperationException("StraightTrack...no momentum measured."); //To change body of generated methods, choose Tools | Templates.
}
-
+
@Override
public double getTrackParameter(int i) {
return _parameters[i];
@@ -227,24 +222,32 @@
@Override
public int getNDF() {
- throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+ return _ndf;
}
+ public void setNDF(int ndf) {
+ _ndf = ndf;
+ }
+
@Override
public double getdEdx() {
- throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+ return -999;
}
@Override
public double getdEdxError() {
- throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+ return -999;
}
@Override
public double getRadiusOfInnermostHit() {
- throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+ return -999;
}
+// public TrackDirection getTrackDirection(){
+
+ // }
+
public String toString() {
String className = getClass().getName();
int lastDot = className.lastIndexOf('.');
java/trunk/tracking/src/main/java/org/hps/recon/tracking/nobfield
--- java/trunk/tracking/src/main/java/org/hps/recon/tracking/nobfield/StraightTrackFinder.java 2014-10-16 21:32:51 UTC (rev 1232)
+++ java/trunk/tracking/src/main/java/org/hps/recon/tracking/nobfield/StraightTrackFinder.java 2014-10-16 21:33:15 UTC (rev 1233)
@@ -3,7 +3,10 @@
import java.util.ArrayList;
import java.util.List;
import org.hps.recon.tracking.HitCollectionUtilites;
+import org.hps.recon.tracking.nobfield.TrackCollectionUtilities;
import org.lcsim.event.EventHeader;
+import org.lcsim.event.Track;
+import org.lcsim.event.TrackerHit;
import org.lcsim.fit.helicaltrack.HelicalTrackHit;
import org.lcsim.fit.line.SlopeInterceptLineFit;
import org.lcsim.fit.line.SlopeInterceptLineFitter;
@@ -17,7 +20,7 @@
public class StraightTrackFinder extends Driver {
// Debug flag.
- private boolean debug = false;
+ private boolean debug = true;
// Tracks found across all events.
int ntracks = 0;
// Number of events processed.
@@ -36,9 +39,10 @@
private int _iterativeConfirmed = 3;
// use HPS implementation of material manager
private boolean _useHPSMaterialManager = true;
- // enable the use of sectoring using sector binning in SeedTracker
- private boolean _applySectorBinning = true;
+ private TrackChecker checkerTrack = new TrackChecker();
+ private HitOnTrackChecker checkerHOT = new HitOnTrackChecker();
+
private SlopeInterceptLineFitter _lfitter = new SlopeInterceptLineFitter();
public void setDebug(boolean debug) {
@@ -76,9 +80,6 @@
this._useHPSMaterialManager = useHPSMaterialManager;
}
- /**
- * This is used to setup the Drivers after XML config.
- */
@Override
public void detectorChanged(Detector detector) {
// Cache Detector object.
@@ -93,68 +94,44 @@
return;
List<HelicalTrackHit> allHits = event.get(HelicalTrackHit.class, stInputCollectionName);
- if (allHits.size() == 0)
- return;
+
List<List<HelicalTrackHit>> splitTopBot = HitCollectionUtilites.SplitTopBottomHits(allHits);
// will always have top(=0) and bottom(=1) lists (though they may be empty)
List<HelicalTrackHit> topHits = splitTopBot.get(0);
List<HelicalTrackHit> bottomHits = splitTopBot.get(1);
- //a simple strategy...eventually implement SeedTracker strategies
+ //a simple strategy...eventually implement SeedTracker strategies?
int nTotLayers = 6;
- int[] layerStrategy = {1, 3, 5, 7, 9, 11};
+ int nSeed = 3;
+ int nExtra = nTotLayers - nSeed;
+ int[] seedStrategy = {1, 3, 5};
+ int[] extendStrategy = {7, 9, 11};
int minHits = 4;
- List<StraightTrack> trackList = new ArrayList<>();
-//sort the hits for some reason
-// List<List<HelicalTrackHit>> sortedTopHits=new ArrayList<>();
-// List<List<HelicalTrackHit>> sortedBottomHits=new ArrayList<>();
-// for(int i = 0;i<nTotLayers;i++){
-// List<HelicalTrackHit> sortedTop=HitCollectionUtilites.GetSortedHits(topHits,layerStrategy[i]);
-// sortedTopHits.add(sortedTop);
-// List<HelicalTrackHit> sortedBot=HitCollectionUtilites.GetSortedHits(bottomHits,layerStrategy[i]);
-// sortedBottomHits.add(sortedBot);
-// }
-//
- if (topHits.size() < 4)
- return;
- //first do top...
- for (HelicalTrackHit h1 : HitCollectionUtilites.GetSortedHits(topHits, layerStrategy[0])) {
- if (debug)
- System.out.println(h1.toString());
- for (HelicalTrackHit h2 : HitCollectionUtilites.GetSortedHits(topHits, layerStrategy[1])) {
- if (debug)
- System.out.println(h2.toString());
- for (HelicalTrackHit h3 : HitCollectionUtilites.GetSortedHits(topHits, layerStrategy[2])) {
- if (debug)
- System.out.println(h3.toString());
- for (HelicalTrackHit h4 : HitCollectionUtilites.GetSortedHits(topHits, layerStrategy[3])) {
- if (debug)
- System.out.println(h4.toString());
- for (HelicalTrackHit h5 : HitCollectionUtilites.GetSortedHits(topHits, layerStrategy[4])) {
- if (debug)
- System.out.println(h5.toString());
- // Setup for the line fit
- List<HelicalTrackHit> testTrack = new ArrayList<HelicalTrackHit>();
- testTrack.add(h1);
- testTrack.add(h2);
- testTrack.add(h3);
- testTrack.add(h4);
- testTrack.add(h5);
- SlopeInterceptLineFit xfit = FitToLine(testTrack, 0);
- SlopeInterceptLineFit yfit = FitToLine(testTrack, 1);
- if (debug)
- System.out.println("xfit = " + xfit.toString());
- if (debug)
- System.out.println("yfit = " + yfit.toString());
- StraightTrack trk = makeTrack(xfit, yfit);
- trackList.add(trk);
- }
- }
- }
- }
+ TrackChecker checkerTrack = new TrackChecker();
+ HitOnTrackChecker checkerHOT = new HitOnTrackChecker();
+
+// List<StraightTrack> seeds = getSeeds(seedStrategy, topHits);
+ List<StraightTrack> seeds = getSeeds(seedStrategy, allHits);
+ System.out.println("Found " + seeds.size() + " seeds");
+
+ List<StraightTrack> extendedSeeds = new ArrayList<>();
+ for (StraightTrack seed : seeds)
+ extendTrack(extendStrategy, 0, seed, allHits, extendedSeeds);
+// extendTrack(extendStrategy, 0, seed, topHits, extendedSeeds);
+
+ System.out.println("Prepruning :Found " + extendedSeeds.size() + " extended seeds");
+
+ //remove tracks with more than m overlaping hits...pick best chi2
+ //...
+ List<StraightTrack> finalTracks = new ArrayList<>();
+ for (StraightTrack track : extendedSeeds) {
+ boolean isbest = TrackCollectionUtilities.pruneTrackList((ArrayList<Track>) (ArrayList) extendedSeeds, track, 1);
+ if (isbest)
+ finalTracks.add(track);
}
- event.put(trackCollectionName, trackList);
+ System.out.println("Postpruning :Found " + finalTracks.size() + " extended seeds");
+ event.put(trackCollectionName, finalTracks);
}
public SlopeInterceptLineFit FitToLine(List<HelicalTrackHit> hits, int projection) {
@@ -188,17 +165,108 @@
}
- private StraightTrack makeTrack(SlopeInterceptLineFit xfit, SlopeInterceptLineFit yfit) {
+ private StraightTrack makeTrack(List<HelicalTrackHit> hits, SlopeInterceptLineFit xfit, SlopeInterceptLineFit yfit) {
StraightTrack track = new StraightTrack();
- double[] pars = {-99, -99, -99, -99};
+ double[] pars = {-99, -99, -99, -99, -99};//this needs to have 5 fields to implement Track
pars[0] = xfit.intercept();
pars[1] = xfit.slope();
pars[2] = yfit.intercept();
pars[3] = yfit.slope();
track.setTrackParameters(pars);
track.setChi2(xfit.chisquared(), yfit.chisquared());
+ track.setNDF(xfit.ndf()+yfit.ndf());
+ for (TrackerHit hit : hits)
+ track.addHit(hit);
// TODO: set convariance,
return track;
}
+ private StraightTrack makeTrack(List<HelicalTrackHit> hits) {
+ SlopeInterceptLineFit xfit = FitToLine(hits, 0);
+ SlopeInterceptLineFit yfit = FitToLine(hits, 1);
+ if (debug)
+ System.out.println("xfit = " + xfit.toString());
+ if (debug)
+ System.out.println("yfit = " + yfit.toString());
+ return makeTrack(hits, xfit, yfit);
+ }
+
+ /*
+ * Get all seed combinations that make sense (pass checkSeed)
+ * currently, just assume there are 3 seed layers (don't have to be first 3 though.
+ */
+ private List<StraightTrack> getSeeds(int[] seedLayers, List<HelicalTrackHit> hits) {
+ List<StraightTrack> seeds = new ArrayList<>();
+ int nseeds = seedLayers.length;
+ if (nseeds == 3)//TODO ... set this up so that this works for arbitrary nseeds...use recursion
+ for (HelicalTrackHit h1 : HitCollectionUtilites.GetSortedHits(hits, seedLayers[0])) {
+ if (debug)
+ System.out.println(h1.toString());
+ for (HelicalTrackHit h2 : HitCollectionUtilites.GetSortedHits(hits, seedLayers[1])) {
+ if (debug)
+ System.out.println(h2.toString());
+ for (HelicalTrackHit h3 : HitCollectionUtilites.GetSortedHits(hits, seedLayers[2])) {
+ if (debug)
+ System.out.println(h3.toString());
+ //make a 3-hit test track...see if it passes CheckTrack
+ List<HelicalTrackHit> testTrack = new ArrayList<HelicalTrackHit>();
+ testTrack.add(h1);
+ testTrack.add(h2);
+ testTrack.add(h3);
+ StraightTrack trk = makeTrack(testTrack);
+ if (!checkerTrack.checkSeed(trk))
+ break;
+ seeds.add(trk);
+ }
+ }
+ }
+ return seeds;
+ }
+
+ /*
+ * recursively extend the seeds through all of the extend layers..
+ * ...I think this should work...
+ */
+ private void extendTrack(int[] extendLayers, int n, StraightTrack origTrack, List<HelicalTrackHit> hits, List<StraightTrack> trackList) {
+ if (n >= extendLayers.length) {
+ if (debug)
+ System.out.println("Done finding this track through all " + n + " extra layers");
+ trackList.add(origTrack);
+ return;
+ }
+
+ boolean cannotExtendThisLayer = true;
+ if (debug)
+ System.out.println("Extending to layer " + extendLayers[n]);
+ for (HelicalTrackHit h : HitCollectionUtilites.GetSortedHits(hits, extendLayers[n])) {
+ //let's see if this hit makes sense to add to original track
+ if (!checkerHOT.checkNewHit(origTrack, h))
+ continue;
+
+ List<TrackerHit> origHits = origTrack.getTrackerHits();
+ //make a new list and cast them as HelicalTrackHits (Track only stores TrackerHits)
+ List<HelicalTrackHit> newHits = new ArrayList<>();
+ for (TrackerHit oh : origHits) {
+ HelicalTrackHit hoh = (HelicalTrackHit) oh;
+ System.out.println(hoh.getPosition()[0]);
+ newHits.add(hoh);
+ }
+ //add the new hit to the list & make new track
+ newHits.add(h);
+ StraightTrack newTrack = makeTrack(newHits);
+ //check the new track after we've added this hit
+ if (!checkerTrack.checkTrack(newTrack))
+ continue;
+ cannotExtendThisLayer = false;
+ //extend again to the next layer
+ extendTrack(extendLayers, n + 1, newTrack, hits, trackList);
+ }
+
+ //didn't find any hits in this layer that match the track...but let's try the next one
+ if (cannotExtendThisLayer)
+ extendTrack(extendLayers, n + 1, origTrack, hits, trackList);
+
+ return;
+ }
+
}