Commit in lcsim/src/org/lcsim/contrib/seedtracker on MAIN
DefaultStrategy.java+39-211.2 -> 1.3
HitManager.java+29-401.1 -> 1.2
SeedLayer.java+27-141.2 -> 1.3
SeedTracker.java+191-2051.3 -> 1.4
SeedTrackerDriver.java+6-11.2 -> 1.3
SmearMCHits.java+14-451.1 -> 1.2
+306-326
6 modified files


lcsim/src/org/lcsim/contrib/seedtracker
DefaultStrategy.java 1.2 -> 1.3
diff -u -r1.2 -r1.3
--- DefaultStrategy.java	10 Aug 2007 15:50:26 -0000	1.2
+++ DefaultStrategy.java	11 Aug 2007 00:17:32 -0000	1.3
@@ -11,39 +11,57 @@
 import java.util.ArrayList;
 
 import org.lcsim.contrib.seedtracker.SeedLayer.SeedType;
+import org.lcsim.geometry.subdetector.BarrelEndcapFlag;
 
 /**
- *
+ * Define the default strategy to be used by the SeedTracker tracking algorithm.  The default strategy may be
+ * over-ridden by calling the method SeedTracker.putStrategyList.
  * @author Richard Partridge
  * @version 1.0
  */
-public class DefaultStrategy
-{
+public class DefaultStrategy {
     private List<SeedStrategy> StrategyList;
     
     /** Creates a new instance of DefaultStrategy */
-    public DefaultStrategy()
-    {
+    public DefaultStrategy() {
         StrategyList = new ArrayList();
+        // Barrel only strategies
+        List<SeedLayer> TB012Layers = new ArrayList();
+        TB012Layers.add(new SeedLayer("TrackerBarrel", 0, BarrelEndcapFlag.BARREL, SeedType.Seed));
+        TB012Layers.add(new SeedLayer("TrackerBarrel", 1, BarrelEndcapFlag.BARREL, SeedType.Seed));
+        TB012Layers.add(new SeedLayer("TrackerBarrel", 2, BarrelEndcapFlag.BARREL, SeedType.Seed));
+        StrategyList.add(new SeedStrategy("TB012",TB012Layers));
         
-        List<SeedLayer> TD012Layers = new ArrayList();
-        TD012Layers.add(new SeedLayer("TrackerEndcap", 0, SeedType.Seed));
-        TD012Layers.add(new SeedLayer("TrackerEndcap", 1, SeedType.Seed));
-        TD012Layers.add(new SeedLayer("TrackerEndcap", 2, SeedType.Seed));
-//        StrategyList.add(new SeedStrategy("TD012",TD012Layers));
-        
-        List<SeedLayer> VB012Layers = new ArrayList();
-        VB012Layers.add(new SeedLayer("VertexBarrel", 2, SeedType.Seed));
-        VB012Layers.add(new SeedLayer("VertexBarrel", 3, SeedType.Seed));
-        VB012Layers.add(new SeedLayer("VertexBarrel", 4, SeedType.Seed));
-        VB012Layers.add(new SeedLayer("TrackerBarrel", 0, SeedType.Confirm));
-//        VB012Layers.add(new SeedLayer("VertexBarrel", 0, SeedType.Confirm));
-//        VB012Layers.add(new SeedLayer("VertexBarrel", 1, SeedType.Confirm));
-        StrategyList.add(new SeedStrategy("VB012",VB012Layers));
+        List<BarrelEndcapFlag> belist = new ArrayList();
+        belist.add(BarrelEndcapFlag.ENDCAP_NORTH);
+        belist.add(BarrelEndcapFlag.ENDCAP_SOUTH);
         
+        for (BarrelEndcapFlag beflag : belist) {
+            List<SeedLayer> TD012Layers = new ArrayList();
+            TD012Layers.add(new SeedLayer("TrackerEndcap", 0, beflag, SeedType.Seed));
+            TD012Layers.add(new SeedLayer("TrackerEndcap", 2, beflag, SeedType.Seed));
+            TD012Layers.add(new SeedLayer("TrackerEndcap", 4, beflag, SeedType.Seed));
+            StrategyList.add(new SeedStrategy("TD012"+beflag.toString(),TD012Layers));
+            
+            List<SeedLayer> TCALayers = new ArrayList();
+            TCALayers.add(new SeedLayer("TrackerBarrel", 0, BarrelEndcapFlag.BARREL, SeedType.Seed));
+            TCALayers.add(new SeedLayer("TrackerBarrel", 1, BarrelEndcapFlag.BARREL, SeedType.Seed));
+            TCALayers.add(new SeedLayer("TrackerEndcap", 4, beflag, SeedType.Seed));
+            StrategyList.add(new SeedStrategy("TCA"+beflag.toString(),TCALayers));
+            
+            List<SeedLayer> TCBLayers = new ArrayList();
+            TCBLayers.add(new SeedLayer("TrackerBarrel", 0, BarrelEndcapFlag.BARREL, SeedType.Seed));
+            TCBLayers.add(new SeedLayer("TrackerEndcap", 2, beflag, SeedType.Seed));
+            TCBLayers.add(new SeedLayer("TrackerEndcap", 4, beflag, SeedType.Seed));
+            StrategyList.add(new SeedStrategy("TCB"+beflag.toString(),TCBLayers));
+        }        
     }
-    public List<SeedStrategy> getStrategyList()
-    {
+    
+    /**
+     * Returns the default list of track-finding strategies
+     * @return List of strategies to be used by SeedTracker
+     */
+    public List<SeedStrategy> getStrategyList() {
         return StrategyList;
     }
 }

lcsim/src/org/lcsim/contrib/seedtracker
HitManager.java 1.1 -> 1.2
diff -u -r1.1 -r1.2
--- HitManager.java	10 Aug 2007 15:50:26 -0000	1.1
+++ HitManager.java	11 Aug 2007 00:17:32 -0000	1.2
@@ -52,6 +52,10 @@
                 String identifier = LyrIdentifier(hit);
                 if (!_hitlist.containsKey(identifier)) {
                     _hitlist.put(identifier, new ArrayList<TrackerHit>());
+                    _rmin.put(identifier,9999999.);
+                    _rmax.put(identifier,0.);
+                    _zmin.put(identifier,9999999.);
+                    _zmax.put(identifier,-9999999.);
                 }
                 _hitlist.get(identifier).add(hit);
                 double r = Math.sqrt(Math.pow(hit.getPosition()[0],2)+Math.pow(hit.getPosition()[1],2));
@@ -76,17 +80,14 @@
     }
     
     /**
-     * Return the list of tracker hits associated with a specified SeedLayer and list of BarrelEndcapFlags
+     * Return the list of tracker hits associated with a specified SeedLayer
      * @param seedlayer Seedlayer to look at
-     * @param beflaglist List of BarrelEndcapFlags to include
      * @return List of TrackerHits
      */
-    public List<TrackerHit> getTrackerHits(SeedLayer seedlayer, List<BarrelEndcapFlag> beflaglist) {
+    public List<TrackerHit> getTrackerHits(SeedLayer seedlayer) {
         List<TrackerHit> hits = new ArrayList<TrackerHit>();
-        for (BarrelEndcapFlag beflag : beflaglist) {
-            String identifier = Identifier(seedlayer.getDetName(),seedlayer.getLayer(),beflag);
-            if (_hitlist.containsKey(identifier)) hits.addAll(_hitlist.get(identifier));
-        }
+        String identifier = Identifier(seedlayer.getDetName(),seedlayer.getLayer(),seedlayer.getBarrelEndcapFlag());
+        if (_hitlist.containsKey(identifier)) hits.addAll(_hitlist.get(identifier));
         return hits;
     }
     
@@ -106,63 +107,51 @@
     }
     
     /**
-     * Return the smallest radius hit for a particular SeedLayer and list of BarrelEndcapFlags
+     * Return the smallest radius hit for a particular SeedLayer
      * @param seedlayer SeedLayer to consider
-     * @param beflaglist List of BarrelEndcapFlags to consider
      * @return Minimum hit radius
      */
-    public double getRMin(SeedLayer seedlayer, List<BarrelEndcapFlag> beflaglist) {
+    public double getRMin(SeedLayer seedlayer) {
         double rmin = 9999999.;
-        for (BarrelEndcapFlag beflag : beflaglist) {
-            String identifier = Identifier(seedlayer.getDetName(),seedlayer.getLayer(),beflag);
-            if (_rmin.containsKey(identifier)) rmin = Math.min(rmin,_rmin.get(identifier));
-        }
-       return rmin;
+        String identifier = Identifier(seedlayer.getDetName(), seedlayer.getLayer(), seedlayer.getBarrelEndcapFlag());
+        if (_rmin.containsKey(identifier)) rmin = Math.min(rmin, _rmin.get(identifier));
+        return rmin;
     }
     
     /**
-     * Return the largest radius hit for a particular SeedLayer and list of BarrelEndcapFlags
+     * Return the largest radius hit for a particular SeedLayer
      * @param seedlayer SeedLayer to consider
-     * @param beflaglist List of BarrelEndcapFlags to consider
      * @return Maximum hit radius
      */
-    public double getRMax(SeedLayer seedlayer, List<BarrelEndcapFlag> beflaglist) {
+    public double getRMax(SeedLayer seedlayer) {
         double rmax = 0.;
-        for (BarrelEndcapFlag beflag : beflaglist) {
-            String identifier = Identifier(seedlayer.getDetName(),seedlayer.getLayer(),beflag);
-            if (_rmax.containsKey(identifier)) rmax = Math.max(rmax,_rmax.get(identifier));
-        }
-       return rmax;
+        String identifier = Identifier(seedlayer.getDetName(), seedlayer.getLayer(), seedlayer.getBarrelEndcapFlag());
+        if (_rmax.containsKey(identifier)) rmax = Math.max(rmax, _rmax.get(identifier));
+        return rmax;
     }
     
     /**
-     * Return the minimum z coordinate for a hit in a particular SeedLayer and list of BarrelEndcapFlags
+     * Return the minimum z coordinate for a hit in a particular SeedLayer
      * @param seedlayer SeedLayer to consider
-     * @param beflaglist List of BarrelEndcapFlags to consider
      * @return Minimum z coordinate
      */
-    public double getZMin(SeedLayer seedlayer, List<BarrelEndcapFlag> beflaglist) {
+    public double getZMin(SeedLayer seedlayer) {
         double zmin = 9999999.;
-        for (BarrelEndcapFlag beflag : beflaglist) {
-            String identifier = Identifier(seedlayer.getDetName(),seedlayer.getLayer(),beflag);
-            if (_zmin.containsKey(identifier)) zmin = Math.min(zmin,_zmin.get(identifier));
-        }
-       return zmin;
+        String identifier = Identifier(seedlayer.getDetName(), seedlayer.getLayer(), seedlayer.getBarrelEndcapFlag());
+        if (_zmin.containsKey(identifier)) zmin = Math.min(zmin, _zmin.get(identifier));
+        return zmin;
     }
     
     /**
-     * Return the maximum z coordinate for a hit in a particular SeedLayer and list of BarrelEndcapFlags
+     * Return the maximum z coordinate for a hit in a particular SeedLayer
      * @param seedlayer SeedLayer to consider
-     * @param beflaglist List of BarrelEndcapFlags to consider
      * @return Maximum z coordinate
      */
-    public double getZMax(SeedLayer seedlayer, List<BarrelEndcapFlag> beflaglist) {
-        double zmax = 0.;
-        for (BarrelEndcapFlag beflag : beflaglist) {
-            String identifier = Identifier(seedlayer.getDetName(),seedlayer.getLayer(),beflag);
-            if (_zmax.containsKey(identifier)) zmax = Math.max(zmax,_zmax.get(identifier));
-        }
-       return zmax;
+    public double getZMax(SeedLayer seedlayer) {
+        double zmax = -9999999.;
+        String identifier = Identifier(seedlayer.getDetName(), seedlayer.getLayer(), seedlayer.getBarrelEndcapFlag());
+        if (_zmax.containsKey(identifier)) zmax = Math.max(zmax, _zmax.get(identifier));
+        return zmax;
     }
     
 }

lcsim/src/org/lcsim/contrib/seedtracker
SeedLayer.java 1.2 -> 1.3
diff -u -r1.2 -r1.3
--- SeedLayer.java	10 Aug 2007 15:50:26 -0000	1.2
+++ SeedLayer.java	11 Aug 2007 00:17:32 -0000	1.3
@@ -7,6 +7,8 @@
 
 package org.lcsim.contrib.seedtracker;
 
+import org.lcsim.geometry.subdetector.BarrelEndcapFlag;
+
 /**
  * Encapsulates information about a tracker layer needed for the SeedTracker algorithm
  * @author Richard Partridge
@@ -30,20 +32,23 @@
          */
         Extend}
 
-    private String _DetName;
-    private int _Layer;
-    private SeedType _Type;
+    private String _detname;
+    private int _layer;
+    private BarrelEndcapFlag _beflag;
+    private SeedType _type;
     
     /**
      * Creates a new instance of SeedLayer
-     * @param DetName Decector name
-     * @param Layer Layer number
-     * @param Type Layer type
-     */
-    public SeedLayer(String DetName, int Layer, SeedType Type) {
-        _DetName = DetName;
-        _Layer = Layer;
-        _Type = Type;
+     * @param detname Decector name
+     * @param layer Layer number
+     * @param beflag Barrel-endcap flag
+     * @param type Layer type
+     */
+    public SeedLayer(String detname, int layer, BarrelEndcapFlag beflag, SeedType type) {
+        _detname = detname;
+        _layer = layer;
+        _beflag = beflag;
+        _type = type;
     }
     
     /**
@@ -51,7 +56,7 @@
      * @return Detector name
      */
     public String getDetName() {
-        return _DetName;
+        return _detname;
     }
     
     /**
@@ -59,7 +64,15 @@
      * @return Layer number
      */
     public int getLayer() {
-        return _Layer;
+        return _layer;
+    }
+    
+    /**
+     * Return the BarrelEndcapFlag
+     * @return Barrel-endcap flag
+     */
+    public BarrelEndcapFlag getBarrelEndcapFlag() {
+        return _beflag;
     }
     
     /**
@@ -67,6 +80,6 @@
      * @return Layer type
      */
     public SeedType getType() {
-        return _Type;
+        return _type;
     }
 }

lcsim/src/org/lcsim/contrib/seedtracker
SeedTracker.java 1.3 -> 1.4
diff -u -r1.3 -r1.4
--- SeedTracker.java	10 Aug 2007 15:50:26 -0000	1.3
+++ SeedTracker.java	11 Aug 2007 00:17:32 -0000	1.4
@@ -21,16 +21,17 @@
 //import org.lcsim.event.base.BaseTrackerHitMC;
 import org.lcsim.fit.helicaltrack.HelicalTrackFit;
 import org.lcsim.fit.helicaltrack.HelicalTrackFitter;
-import org.lcsim.geometry.subdetector.BarrelEndcapFlag;
 import org.lcsim.util.Driver;
 
 import hep.physics.vec.BasicHep3Vector;
 import hep.physics.vec.Hep3Vector;
 
 /**
- * Tracking algorithm based on forming track seeds from all 3-hit combinations
- * and adding tracks to the helix defined by the three hits.
- *
+ * Tracking algorithm based on forming track seeds from all 3-hit combinations,
+ * confirming this tentantive helix by requiring additional hits, and extending
+ * the track to additional layers.  The operation of the algorithm is controlled
+ * by a list of SeedStrategy that define the tracker layers to be used and the
+ * cuts on the tracking algorithm.
  * @author Richard Partridge
  * @version 1.0
  */
@@ -39,132 +40,134 @@
     private List<SeedStrategy> _strategylist;
     private HelicalTrackFitter _hf = new HelicalTrackFitter();
     private Hep3Vector _IP = new BasicHep3Vector(0.,0.,0.);
+    private double[] _OldIP = {0., 0., 0.};
     private double _BField;
     private HitManager _HM = new HitManager();
-    private List<List<BarrelEndcapFlag>> _beflagcol;
     
     /** Creates a new instance of SeedTracker */
     public SeedTracker() {
         _strategylist = _DS.getStrategyList();
-        _beflagcol = getDefaultBEFlagLists();
     }
     
+    /**
+     * Invoke the track finding algorithm
+     * @param event EventHeader for this event
+     */
     protected void process(EventHeader event) {
         
         //  Find the magnetic field
-        _BField = event.getDetector().getFieldMap().getField(_IP).z();
+//        _BField = event.getDetector().getFieldMap().getField(_IP).z();
+        _BField = event.getDetector().getFieldMap().getField(_OldIP)[2];
         //  Tell the hit manager to sort the hits for this event
         _HM.OrganizeHits(event);
         //  Create the list of final track seeds
         List<SeedCandidate> trackseeds = new ArrayList<SeedCandidate>();
         //  Loop over all strategies
         for (SeedStrategy strategy : _strategylist) {
-            //  Loop over the BarrelEndcapFlag combinations to consider
-            for (List<BarrelEndcapFlag> beflaglist : _beflagcol) {
-                //  Find the 3 hits seeds for this strategy
-                List<SeedCandidate> seedlist = FindSeeds(strategy, beflaglist);
-                //  Loop over the seeds
-                for (SeedCandidate seed : seedlist) {
-                    //  Try to add confirming hits to the seed
-                    List<SeedCandidate> confirmedseeds = FindConfirmedSeeds(strategy, beflaglist, seed);
-                    //  Loop over the confirmed seeds
-                    for (SeedCandidate conseed : confirmedseeds) {
-                        //  Try to extend seeds to additional layers
-                        List<SeedCandidate> extendedseeds = FindExtendedSeeds(strategy, beflaglist, conseed);
-                        //  Loop over the extended seeds
-                        for (SeedCandidate extseed : extendedseeds) {
-                            //  Purge any duplicate extended seeds
-                            PurgeDuplicateSeeds(trackseeds,extseed);
-                        }
+            //  Find the 3 hits seeds for this strategy
+            List<SeedCandidate> seedlist = FindSeeds(strategy);
+            //  Loop over the seeds
+            for (SeedCandidate seed : seedlist) {
+                //  Try to add confirming hits to the seed
+                List<SeedCandidate> confirmedseeds = FindConfirmedSeeds(strategy, seed);
+                //  Loop over the confirmed seeds
+                for (SeedCandidate conseed : confirmedseeds) {
+                    //  Try to extend seeds to additional layers
+                    List<SeedCandidate> extendedseeds = FindExtendedSeeds(strategy, conseed);
+                    //  Loop over the extended seeds
+                    for (SeedCandidate extseed : extendedseeds) {
+                        //  Purge any duplicate extended seeds
+                        PurgeDuplicateSeeds(trackseeds,extseed);
                     }
                 }
             }
         }
         //  Make tracks from the final list of track seeds
-        MakeTracks(trackseeds);
+        MakeTracks(event, trackseeds);
         return;
     }
-        
-        private List<SeedCandidate> FindSeeds(SeedStrategy strategy, List<BarrelEndcapFlag> beflaglist) {
-            List<SeedCandidate> candidates = new ArrayList<SeedCandidate>();
-            //  Get the SeedLayers for this strategy
-            List<SeedLayer> seedlayerlist = strategy.getLayers(SeedType.Seed);
-            if (seedlayerlist.size() != 3) return candidates;
-            //  Get the hits for the seed layers
-            List<List<TrackerHit>> seedhits = new ArrayList<List<TrackerHit>>();
-            for (SeedLayer seedlyr : seedlayerlist) {
-                seedhits.add(_HM.getTrackerHits(seedlyr, beflaglist));
-            }
-            //  Order the seed layers from fewest hits to most hits
-            for (int i=0; i<2; i++) {
-                for (int j=i+1; j<3; j++) {
-                    if (seedhits.get(i).size() > seedhits.get(j).size()) {
-                        List<TrackerHit> temp = seedhits.get(i);
-                        seedhits.set(i,seedhits.get(j));
-                        seedhits.set(j,temp);
-                    }
+    
+    private List<SeedCandidate> FindSeeds(SeedStrategy strategy) {
+        List<SeedCandidate> candidates = new ArrayList<SeedCandidate>();
+        //  Get the SeedLayers for this strategy
+        List<SeedLayer> seedlayerlist = strategy.getLayers(SeedType.Seed);
+        if (seedlayerlist.size() != 3) return candidates;
+        //  Get the hits for the seed layers
+        List<List<TrackerHit>> seedhits = new ArrayList<List<TrackerHit>>();
+        for (SeedLayer seedlyr : seedlayerlist) {
+            seedhits.add(_HM.getTrackerHits(seedlyr));
+        }
+        //  Order the seed layers from fewest hits to most hits
+        for (int i=0; i<2; i++) {
+            for (int j=i+1; j<3; j++) {
+                if (seedhits.get(i).size() > seedhits.get(j).size()) {
+                    List<TrackerHit> temp = seedhits.get(i);
+                    seedhits.set(i,seedhits.get(j));
+                    seedhits.set(j,temp);
                 }
             }
-            double RMin = strategy.getMinPT() / (0.0003 * _BField);
-            double dMax = strategy.getMaxDCA();
-            
-            // Todo: add code to limit seeds to those that satisfy cuts
-            
-            for (TrackerHit s1 : seedhits.get(0)) {
-                double[] pos1 = s1.getPosition();
-                double r1 = Math.sqrt(pos1[0]*pos1[0] + pos1[1]*pos1[1]);
-                double phi1 = Math.atan2(pos1[1],pos1[0]);
-                double dphi1 = Math.asin((2*RMin*dMax - dMax*dMax-r1*r1)/(2*r1*(RMin-dMax)));
-                for (TrackerHit s2 : seedhits.get(1)) {
-                    double[] pos2 = s2.getPosition();
-                    double r2 = Math.sqrt(pos2[0]*pos2[0] + pos2[1]*pos2[1]);
-                    double phi2 = Math.atan2(pos2[1],pos2[0]);
-                    double dphi2 = Math.asin((2*RMin*dMax - dMax*dMax-r2*r2)/(2*r2*(RMin-dMax)));
-                    if (Math.abs(phi2-phi1) > Math.abs(dphi2-dphi1)) continue;
-                    
-                    for (TrackerHit s3 : seedhits.get(2)) {
-                        double[] pos3 = s3.getPosition();
-                        double r3 = Math.sqrt(pos3[0]*pos3[0] + pos3[1]*pos3[1]);
-                        double phi3 = Math.atan2(pos3[1],pos3[0]);
-                        double dphi3 = Math.asin((2*RMin*dMax - dMax*dMax-r3*r3)/(2*r3*(RMin-dMax)));
-                        if (Math.abs(phi3-phi2) > Math.abs(dphi3-dphi2)) continue;
-                        List<TrackerHit> hitlist = new ArrayList<TrackerHit>();
-                        hitlist.add(s1);
-                        hitlist.add(s2);
-                        hitlist.add(s3);
-                        boolean status = _hf.fit(hitlist);
-                        if (!status) continue;
-                        HelicalTrackFit helix = _hf.getFit();
-                        if (!HelixCuts(strategy, helix)) continue;
-                        candidates.add(new SeedCandidate(hitlist, helix));
+        }
+        double RMin = strategy.getMinPT() / (0.0003 * _BField);
+        double dMax = strategy.getMaxDCA();
+        
+        // Todo: add code to limit seeds to those that satisfy cuts
+        
+        for (TrackerHit s1 : seedhits.get(0)) {
+            double[] pos1 = s1.getPosition();
+            double r1 = Math.sqrt(pos1[0]*pos1[0] + pos1[1]*pos1[1]);
+            double phi1 = Math.atan2(pos1[1],pos1[0]);
+            double dphi1 = Math.asin((2*RMin*dMax - dMax*dMax-r1*r1)/(2*r1*(RMin-dMax)));
+            for (TrackerHit s2 : seedhits.get(1)) {
+                double[] pos2 = s2.getPosition();
+                double r2 = Math.sqrt(pos2[0]*pos2[0] + pos2[1]*pos2[1]);
+                double phi2 = Math.atan2(pos2[1],pos2[0]);
+                double dphi2 = Math.asin((2*RMin*dMax - dMax*dMax-r2*r2)/(2*r2*(RMin-dMax)));
+                if (Math.abs(phi2-phi1) > Math.abs(dphi2-dphi1)) continue;
+                
+                for (TrackerHit s3 : seedhits.get(2)) {
+                    double[] pos3 = s3.getPosition();
+                    double r3 = Math.sqrt(pos3[0]*pos3[0] + pos3[1]*pos3[1]);
+                    double phi3 = Math.atan2(pos3[1],pos3[0]);
+                    double dphi3 = Math.asin((2*RMin*dMax - dMax*dMax-r3*r3)/(2*r3*(RMin-dMax)));
+                    if (Math.abs(phi3-phi2) > Math.abs(dphi3-dphi2)) continue;
+                    List<TrackerHit> hitlist = new ArrayList<TrackerHit>();
+                    hitlist.add(s1);
+                    hitlist.add(s2);
+                    hitlist.add(s3);
+                    boolean status = _hf.fit(hitlist);
+                    if (!status) continue;
+                    HelicalTrackFit helix = _hf.getFit();
+                    if (!HelixCuts(strategy, helix)) continue;
+                    for (TrackerHit hit : hitlist) {
+                        System.out.println(" Hit x "+hit.getPosition()[0]+" y "+hit.getPosition()[1]+" z "+hit.getPosition()[2]);
                     }
+                    candidates.add(new SeedCandidate(hitlist, helix));
                 }
             }
-            System.out.println(" Number of seeds: "+candidates.size());
-            
-            return candidates;
-        }
-        
-        private boolean HelixCuts(SeedStrategy strategy, HelicalTrackFit helix) {
-            double[] params = helix.parameters();
-            if (helix.chisq()[0]+helix.chisq()[1] < strategy.getMaxChisq()) return false;
-            double pT = 0.0003 * _BField / Math.abs(params[2]);
-            if (pT > strategy.getMinPT()) return false;
-            if (params[0] < strategy.getMaxDCA()) return false;
-            if (params[3] < strategy.getMaxZ0()) return false;
-            System.out.println(" d0 "+params[0]);
-            System.out.println(" phi0 "+params[1]);
-            System.out.println(" curvatures "+params[2]);
-            System.out.println(" z0 "+params[3]);
-            System.out.println(" slope "+params[4]);
-            System.out.println(" pT "+pT);
-            return true;
         }
-        
-        private List<SeedCandidate> FindConfirmedSeeds(SeedStrategy strategy, List<BarrelEndcapFlag> beflaglist, SeedCandidate seed) {
-            List<SeedCandidate> confirmedseeds = new ArrayList<SeedCandidate>();
-            //  For now, confirm our original seed
-            confirmedseeds.add(seed);
+        return candidates;
+    }
+    
+    private boolean HelixCuts(SeedStrategy strategy, HelicalTrackFit helix) {
+        double[] params = helix.parameters();
+        if (helix.chisq()[0]+helix.chisq()[1] > strategy.getMaxChisq()) return false;
+        double pT = 0.0003 * _BField / Math.abs(params[2]);
+        if (pT < strategy.getMinPT()) return false;
+        if (params[0] > strategy.getMaxDCA()) return false;
+        if (params[3] > strategy.getMaxZ0()) return false;
+        System.out.println(" d0 "+params[0]);
+        System.out.println(" phi0 "+params[1]);
+        System.out.println(" curvatures "+params[2]);
+        System.out.println(" z0 "+params[3]);
+        System.out.println(" slope "+params[4]);
+        System.out.println(" pT "+pT);
+        return true;
+    }
+    
+    private List<SeedCandidate> FindConfirmedSeeds(SeedStrategy strategy, SeedCandidate seed) {
+        List<SeedCandidate> confirmedseeds = new ArrayList<SeedCandidate>();
+        //  For now, confirm our original seed
+        confirmedseeds.add(seed);
 //        private List<List<TrackerHit>> FindConfirms(SeedStrategy strategy, List<BarrelEndcapFlag> beflaglist, SeedCandidate seed) {
 //            // Create a list of possible confirmation hits for each confirmation layer
 //            List<List<TrackerHit>> confirmbylayer = new ArrayList();
@@ -176,21 +179,21 @@
 //                // If we have some confirmation hits in this layer, add the list of hits for this layer
 //                if (confirmhits.size()>0) confirmbylayer.add(confirmhits);
 //            }
-            // Initialize a list of track candidates that include confirmation hits
+        // Initialize a list of track candidates that include confirmation hits
 //            List<List<TrackerHit>> candlist = new ArrayList();
-            // check that there are sufficient layers with confirmation hits
+        // check that there are sufficient layers with confirmation hits
 //            if (confirmbylayer.size() >= strategy.getMinConfirm()) {
-                // Start with our seed hits as a candidate
+        // Start with our seed hits as a candidate
 //                candlist.add(seed.getTrackerHits());
-                // Loop over all the confirming layers
+        // Loop over all the confirming layers
 //                for (List<TrackerHit> confirmhits : confirmbylayer) {
-                    // Create a list of new candidates that have hits added from this layer
+        // Create a list of new candidates that have hits added from this layer
 //                    List<List<TrackerHit>> newcandlist = new ArrayList();
-                    // Loop over all existing candidates
+        // Loop over all existing candidates
 //                    for (List<TrackerHit> oldcand : candlist) {
-                        // Loop over all the hits in this confirming layer
+        // Loop over all the hits in this confirming layer
 //                        for (TrackerHit hit : confirmhits) {
-                            // Create a new track candidate that adds this hit
+        // Create a new track candidate that adds this hit
 //                            List<TrackerHit> newcand = new ArrayList();
 //                            boolean status = newcand.addAll(oldcand);
 //                            newcand.add(hit);
@@ -200,13 +203,13 @@
 //                    boolean status = candlist.addAll(newcandlist);
 //                }
 //            }
-            // Remove candidates that have too few confirmation hits
+        // Remove candidates that have too few confirmation hits
 //        ListIterator<List<BaseTrackerHitMC>> itr = candlist.listIterator();
 //        while (itr.hasNext()) {
 //            List<BaseTrackerHitMC> hitlist = itr.next();
 //            if (hitlist.size() < strategy.getMinConfirm()+3) candlist.remove(hitlist);
 //        }
-//            
+//
 //            return candlist;
 //        }
 //                    int maxhits = 3 + strategy.getLayers(SeedType.Confirm).size();
@@ -219,109 +222,92 @@
 //                            if (candidate.size() == nhit) {
 //                                if (!isDuplicate(candidate, tracklist)) {
 //                                    boolean status2 = FindHelix(strategy, candidate);
-            return confirmedseeds;
-        }
-
-         private List<SeedCandidate> FindExtendedSeeds(SeedStrategy strategy, List<BarrelEndcapFlag> beflaglist, SeedCandidate seed) {
-            List<SeedCandidate> extendedseeds = new ArrayList<SeedCandidate>();
-            //  For now, just pass along the input seed
-            extendedseeds.add(seed);
-            return extendedseeds;
-        }
-
-         private void PurgeDuplicateSeeds(List<SeedCandidate> trackseeds, SeedCandidate extseed) {
-             //  Ignore duplicates for now
-             return;
-         }
-       
-         private void MakeTracks(List<SeedCandidate> trackseeds) {
+        return confirmedseeds;
+    }
+    
+    private List<SeedCandidate> FindExtendedSeeds(SeedStrategy strategy, SeedCandidate seed) {
+        List<SeedCandidate> extendedseeds = new ArrayList<SeedCandidate>();
+        //  For now, just pass along the input seed
+        extendedseeds.add(seed);
+        return extendedseeds;
+    }
+    
+    private void PurgeDuplicateSeeds(List<SeedCandidate> trackseeds, SeedCandidate extseed) {
+        //  Ignore duplicates for now
+        trackseeds.add(extseed);
+        return;
+    }
+    
+    private void MakeTracks(EventHeader event, List<SeedCandidate> trackseeds) {
         // Create a list of tracks
         List<Track> tracklist = new ArrayList<Track>();
-//                                        BaseTrack track = new BaseTrack();
-//                                        track.setReferencePoint(_IP.v());
-//                                        track.setRefPointIsDCA(false);
-//                                        HelicalTrackFit helix = seed.getHelix();
-//                                        track.setTrackParameters(helix.parameters(), _BField);
-//                                        track.setChisq(helix.chisq()[0]+helix.chisq()[1]);
-//                                        track.setNDF(helix.ndf()[0]+helix.ndf()[1]);
-//                                        track.setCovarianceMatrix(helix.covariance());
-//                                        track.setTrackType(0);
-//                                        List<TrackerHit> castcand = new ArrayList();
-//                                        for (TrackerHit hit : candidate) {
-//                                            castcand.add((TrackerHit) hit);
-//                                        }
-//                                        track.addHits(castcand);
-//                                        tracklist.add(track);
-//                                        foundtrack = true;
-             return;
-         }
-         
-        private boolean isDuplicate(List<TrackerHit> hitlist, List<Track> tracklist) {
-            boolean isDuplicate = false;
-            for (Track track : tracklist) {
-                List<TrackerHit> hitlist2 = track.getTrackerHits();
-                boolean matchall = true;
-                if (hitlist.size() <= hitlist2.size()) {
-                    for (TrackerHit hit1 : hitlist) {
-                        boolean match = false;
-                        for (TrackerHit hit2 : hitlist2) {
-                            if (hit1 == hit2) {
-                                match = true;
-                                break;
-                            }
-                        }
-                        if (!match) {
-                            matchall = false;
+        for (SeedCandidate seed : trackseeds) {
+            BaseTrack track = new BaseTrack();
+            track.setReferencePoint(_IP.v());
+            track.setRefPointIsDCA(false);
+            HelicalTrackFit helix = seed.getHelix();
+            track.setTrackParameters(helix.parameters(), _BField);
+            track.setChisq(helix.chisq()[0]+helix.chisq()[1]);
+            track.setNDF(helix.ndf()[0]+helix.ndf()[1]);
+            track.setCovarianceMatrix(helix.covariance());
+            track.setTrackType(0);
+            track.addHits(seed.getTrackerHits());
+            tracklist.add(track);
+        }
+        System.out.println(" Tracks found: "+tracklist.size());
+        event.put(EventHeader.TRACKS, tracklist, Track.class, 0);
+        List<Track> test = event.getTracks();
+        return;
+    }
+    
+    private boolean isDuplicate(List<TrackerHit> hitlist, List<Track> tracklist) {
+        boolean isDuplicate = false;
+        for (Track track : tracklist) {
+            List<TrackerHit> hitlist2 = track.getTrackerHits();
+            boolean matchall = true;
+            if (hitlist.size() <= hitlist2.size()) {
+                for (TrackerHit hit1 : hitlist) {
+                    boolean match = false;
+                    for (TrackerHit hit2 : hitlist2) {
+                        if (hit1 == hit2) {
+                            match = true;
                             break;
                         }
                     }
-                    if (matchall) {
-                        isDuplicate = true;
+                    if (!match) {
+                        matchall = false;
                         break;
                     }
                 }
+                if (matchall) {
+                    isDuplicate = true;
+                    break;
+                }
             }
-            return isDuplicate;
-        }
-        
-        private double rphi_error(double[] position, double[] covmat) {
-            // Todo: include MS errors in weight
-            double x = position[0];
-            double y = position[1];
-            double r2 = x * x + y * y;
-            double varxx = covmat[0];
-            double varxy = covmat[1];
-            double varyy = covmat[2];
-            return Math.sqrt((y * y * varxx + x * x * varyy - 2 * x * y * varxy) / r2);
-        }
-        
-        private List<List<BarrelEndcapFlag>> getDefaultBEFlagLists() {
-           
-        // Create the default lists of BarrelEndcapFlags to consider
-        List<BarrelEndcapFlag> north = new ArrayList<BarrelEndcapFlag>();
-        north.add(BarrelEndcapFlag.BARREL);
-        north.add(BarrelEndcapFlag.ENDCAP_NORTH);
-        List<BarrelEndcapFlag> south = new ArrayList<BarrelEndcapFlag>();
-        south.add(BarrelEndcapFlag.BARREL);
-        south.add(BarrelEndcapFlag.ENDCAP_SOUTH);
-        List<List<BarrelEndcapFlag>> beflagcol = new ArrayList<List<BarrelEndcapFlag>>();
-        beflagcol.add(north);
-        beflagcol.add(south);
-        return beflagcol;
-        }
-        
-        public List<List<BarrelEndcapFlag>> getBEFlagLists() {
-            return _beflagcol;
-        }
-        
-        public void putBEFlagLists(List<List<BarrelEndcapFlag>> beflagcol) {
-            _beflagcol = beflagcol;
-            return;
-        }
-        
-        public void putStrategyList(List<SeedStrategy> strategylist) {
-            _strategylist = strategylist;
-            return;
         }
+        return isDuplicate;
+    }
+    
+    private double rphi_error(double[] position, double[] covmat) {
+        // Todo: include MS errors in weight
+        double x = position[0];
+        double y = position[1];
+        double r2 = x * x + y * y;
+        double varxx = covmat[0];
+        double varxy = covmat[1];
+        double varyy = covmat[2];
+        return Math.sqrt((y * y * varxx + x * x * varyy - 2 * x * y * varxy) / r2);
+    }
         
-    }
\ No newline at end of file
+    /**
+     * Specifiy the strategies to be used by the SeedTracker algorithm.  Invoking this
+     * method will override the default strategies defined by the DefaultStrategy
+     * class.
+     * @param strategylist List of strategies to be used
+     */
+    public void putStrategyList(List<SeedStrategy> strategylist) {
+        _strategylist = strategylist;
+        return;
+    }
+    
+}
\ No newline at end of file

lcsim/src/org/lcsim/contrib/seedtracker
SeedTrackerDriver.java 1.2 -> 1.3
diff -u -r1.2 -r1.3
--- SeedTrackerDriver.java	26 Apr 2007 22:16:31 -0000	1.2
+++ SeedTrackerDriver.java	11 Aug 2007 00:17:32 -0000	1.3
@@ -13,7 +13,8 @@
 import org.lcsim.util.Driver;
 
 /**
- *
+ * Driver for testing the SeedTracker track finding algorithm.  This driver causes
+ * the SmearMCHits and SeedTracker drivers to be invoked for each event.
  * @author Richard Partridge
  * @version 1.0
  */
@@ -26,6 +27,10 @@
         add(new SeedTracker());
     }
 
+    /**
+     * Process the current event
+     * @param event EventHeader for this event
+     */
     public void process(EventHeader event)
     {
         super.process(event);

lcsim/src/org/lcsim/contrib/seedtracker
SmearMCHits.java 1.1 -> 1.2
diff -u -r1.1 -r1.2
--- SmearMCHits.java	7 Aug 2006 17:46:32 -0000	1.1
+++ SmearMCHits.java	11 Aug 2007 00:17:32 -0000	1.2
@@ -11,72 +11,41 @@
 
 import java.util.ArrayList;
 import java.util.List;
-import java.util.Random;
-import org.lcsim.util.Driver;
+
+import org.lcsim.contrib.tracking.TrackerHitCheater;
 import org.lcsim.event.EventHeader;
 import org.lcsim.event.SimTrackerHit;
-import org.lcsim.event.base.BaseTrackerHitMC;
+import org.lcsim.event.TrackerHit;
+import org.lcsim.util.Driver;
 
 /**
- *
+ * Create cheated and smeared TrackerHits from all collections of SimTrackerHits
  * @author partridge
  */
 public class SmearMCHits extends Driver{
     
-    Random rn = new Random();
-    double drphi = 0.005;
-    double dz = 0.005;
+    TrackerHitCheater cheater = new TrackerHitCheater();
     
     /** Creates a new instance of SmearMCHits */
     public SmearMCHits() {
     }
     
+    /**
+     * Process the current event
+     * @param event EventHeader for this event
+     */
     public void process(EventHeader event) {
         
         //  Initialize the TrackerHit list
-        List<BaseTrackerHitMC> trkhits = new ArrayList<BaseTrackerHitMC>();
+        List<TrackerHit> allhits = new ArrayList<TrackerHit>();
         //  Get the SimTrackerHit collections
         List<List<SimTrackerHit>> allgenhits = event.get(SimTrackerHit.class);
         //  Loop over the various hit collections
         for (List<SimTrackerHit> genhitcol : allgenhits) {
-            //  Now loop over the hits in a particular collection
-            for (SimTrackerHit genhit : genhitcol) {
-                //  Generate a new BaseTrackerHitMC for each SimTrackerHit
-                //  Note: treat all layers the same for now, hard code the resolution
-                double x = genhit.getPoint()[0];
-                double y = genhit.getPoint()[1];
-                double z = genhit.getPoint()[2];
-                double r = Math.sqrt(x*x + y*y);
-                double phi = Math.atan2(y,x);
-                phi = phi + (drphi / r) * rn.nextGaussian();
-                z = z + dz * rn.nextGaussian();
-                // Fill in smeared position
-                double[] pos = new double[3];
-                pos[0] = r * Math.cos(phi);
-                pos[1] = r * Math.sin(phi);
-                pos[2] = z;
-                // covariance matrix in lower triangular form
-                double[] cov = new double[6];
-                cov[0] = Math.pow(Math.sin(phi)*drphi,2);
-                cov[1] = -Math.sin(phi)*Math.cos(phi)*drphi*drphi;
-                cov[2] = Math.pow(Math.cos(phi)*drphi,2);
-                cov[3] = 0.;
-                cov[4] = 0.;
-                cov[5] = dz*dz;
-                
-                double time = genhit.getTime();
-                
-                double dedx = genhit.getdEdx();
-                
-                int type = 0;
-                //  Create the list of SimTrackerHits for this TrackerHit and add our hit to the list
-                List<SimTrackerHit> hits = new ArrayList<SimTrackerHit>();
-                hits.add(genhit);
-                //  Create a new TrackerHit and add it to our list of tracker hits
-                trkhits.add(new BaseTrackerHitMC(pos, cov,  time, dedx, type, hits));
-            }
+            List<TrackerHit> hits = cheater.makeTrackerHits(genhitcol);
+            allhits.addAll(hits);
         }
         //  Put the list of TrackerHits into the event
-        event.put("BaseTrackerHitMC",trkhits,BaseTrackerHitMC.class,0);
+        event.put("TrackerHit",allhits,TrackerHit.class,0);
     }  
 }
CVSspam 0.2.8