Commit in java/trunk/tracking/src/main/java/org/hps/recon/tracking/nobfield on MAIN
StraightTrack.java+26-231232 -> 1233
StraightTrackFinder.java+129-611232 -> 1233
TrackChecker.java+51232 -> 1233
TrackCollectionUtilities.java+85added 1233
+245-84
1 added + 3 modified, total 4 files
Straight track fitting stuff...not ready for the big league yet. 

java/trunk/tracking/src/main/java/org/hps/recon/tracking/nobfield
StraightTrack.java 1232 -> 1233
--- 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
StraightTrackFinder.java 1232 -> 1233
--- 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;
+    }
+
 }

java/trunk/tracking/src/main/java/org/hps/recon/tracking/nobfield
TrackChecker.java 1232 -> 1233
--- java/trunk/tracking/src/main/java/org/hps/recon/tracking/nobfield/TrackChecker.java	2014-10-16 21:32:51 UTC (rev 1232)
+++ java/trunk/tracking/src/main/java/org/hps/recon/tracking/nobfield/TrackChecker.java	2014-10-16 21:33:15 UTC (rev 1233)
@@ -19,4 +19,9 @@
         return true;
     }
 
+    public boolean checkSeed(StraightTrack trk) {
+
+        return true;
+    }
+
 }

java/trunk/tracking/src/main/java/org/hps/recon/tracking/nobfield
TrackCollectionUtilities.java added at 1233
--- java/trunk/tracking/src/main/java/org/hps/recon/tracking/nobfield/TrackCollectionUtilities.java	                        (rev 0)
+++ java/trunk/tracking/src/main/java/org/hps/recon/tracking/nobfield/TrackCollectionUtilities.java	2014-10-16 21:33:15 UTC (rev 1233)
@@ -0,0 +1,85 @@
+package org.hps.recon.tracking.nobfield;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.lcsim.event.Track;
+import org.lcsim.event.TrackerHit;
+
+/**
+ * * Some methods which manipulate track collections in various ways
+ *
+ * @author mgraham -- date created 7/9/2014
+ */
+public class TrackCollectionUtilities {
+
+    public static boolean pruneTrackList(List<Track> tracklist, Track newseed, int nMaxOverlap) {
+//        if(diag!=null) diag.fireMergeStartDiagnostics(newseedlist);
+
+        //  Assume the new seed is better than all duplicates
+        boolean best = true;
+
+        //  Create a list of duplicates that are inferior
+        List<Track> duplist = new ArrayList<Track>();
+
+        //  Loop over all existing seeds
+        for (Track seed : tracklist) {
+            //first, check if they are identical...don't do anything if they are
+            if (seed.equals(newseed))
+                continue;
+
+            //  See if the new seed is considered a duplicate of the current seed        
+            boolean dupe = isDuplicate(newseed, seed, nMaxOverlap);
+
+            if (dupe) {
+
+                //  Check if the new seed is better than the existing seed
+                boolean better = isBetter(newseed, seed);
+
+                if (better)
+
+                    //  If the new seed is better, add the existing seed to the list for deletion
+                    duplist.add(seed);
+                else {
+
+                    //  If the new seed is inferior to an existing seed, leave everything unchanged
+                    best = false;
+                    break;
+                }
+            }
+        }
+     
+
+        return best;
+    }
+
+    public static boolean isDuplicate(Track seed1, Track seed2,int nMaxOverlap) {
+        int nduplicate = 0;
+        for (TrackerHit hit1 : seed1.getTrackerHits())
+            for (TrackerHit hit2 : seed2.getTrackerHits())
+                if (hit1 == hit2) {
+                    nduplicate++;
+                    if (nduplicate > nMaxOverlap)
+                        return true;
+                }
+        return false;
+    }
+
+    public static boolean isBetter(Track newseed, Track oldseed) {
+
+        int hitdif = newseed.getTrackerHits().size() - oldseed.getTrackerHits().size();
+        double chisqdif = newseed.getChi2() - oldseed.getChi2();
+        if (hitdif > 1)
+            return true;
+        if (hitdif == 1) {
+            return true;//for now just keep the longer tracks...
+//            return chisqdif < strategy.getBadHitChisq();
+        }
+        if (hitdif == 0)
+            return chisqdif < 0.;
+        if (hitdif == -1) {
+            return false;
+            //           return chisqdif < -strategy.getBadHitChisq();
+        }
+        return false;
+    }
+}
SVNspam 0.1