Commit in lcsim/src/org/lcsim/recon/tracking/seedtracker on MAIN
SeedTrackFinder.java+167added 1.1
ConstrainHelix.java+10-41.1 -> 1.2
HelixFitter.java+23-111.1 -> 1.2
MergeSeedLists.java+2-11.1 -> 1.2
MultipleScattering.java+10-31.1 -> 1.2
SeedTracker.java+64-531.1 -> 1.2
+276-72
1 added + 5 modified, total 6 files
Restructure tracking code to avoid large memory usage for complex events

lcsim/src/org/lcsim/recon/tracking/seedtracker
SeedTrackFinder.java added at 1.1
diff -N SeedTrackFinder.java
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ SeedTrackFinder.java	9 Oct 2008 17:47:30 -0000	1.1
@@ -0,0 +1,167 @@
+/*
+ * SeedTrackFinder.java
+ *
+ * Created on January 22, 2008, 9:39 AM
+ *
+ */
+
+package org.lcsim.recon.tracking.seedtracker;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.lcsim.constants.Constants;
+import org.lcsim.fit.helicaltrack.HelicalTrackHit;
+import org.lcsim.recon.tracking.seedtracker.diagnostic.ISeedTrackerDiagnostics;
+
+/**
+ *
+ * @author Richard Partridge
+ * @version 1.0
+ */
+public class SeedTrackFinder {
+    private HitManager _hitmanager;
+    private HelixFitter _helixfitter;
+    private ConfirmerExtender _confirmer;
+    private MergeSeedLists _merger;
+    private List<SeedCandidate> _trackseeds;
+    private ISeedTrackerDiagnostics _diag = null;
+    private double _RMin;
+    private double _dMax;
+    private HelicalTrackHit _lasthit;
+    
+    /**
+     * Creates a new instance of SeedTrackFinder
+     */
+    public SeedTrackFinder(HitManager hitmanager, HelixFitter helixfitter) {
+        
+        //  Save the pointers to the hit manager and helix fitter classes
+        _hitmanager = hitmanager;
+        _helixfitter = helixfitter;
+        
+        //  Instantiate the Confirmer/Extender and Seed Candidate merging classes
+        _confirmer = new ConfirmerExtender(_hitmanager, _helixfitter);
+        _merger = new MergeSeedLists();
+        
+        //  Create a list of track seeds that have been found
+        _trackseeds = new ArrayList<SeedCandidate>();
+    }
+    
+    public void setDiagnostic(ISeedTrackerDiagnostics d) {
+        
+        //  Setup the diagnostics for this class and the classes used by this class
+        _diag = d;
+        _confirmer.setDiagnostics(_diag);
+        _merger.setDiagnostic(_diag);
+    }
+    
+    public boolean FindTracks(SeedStrategy strategy, double bfield) {
+        
+        //  Get the SeedLayers for this strategy
+        List<SeedLayer> seedlayerlist = strategy.getLayers(SeedLayer.SeedType.Seed);
+        if (seedlayerlist.size() != 3) return false;
+       
+        //  Cache the minimum radius of curvature and DCA for use by the HitCheck method
+        _RMin = strategy.getMinPT() / (Constants.fieldConversion * bfield);
+        _dMax = strategy.getMaxDCA();
+        
+        //  Initialize counters
+        int nfit = 0;
+        int nseed = 0;
+        int nconfirm = 0;
+        int nextend = 0;
+        int maxseeds = _hitmanager.getTrackerHits(seedlayerlist.get(0)).size() *
+                _hitmanager.getTrackerHits(seedlayerlist.get(1)).size() *
+                _hitmanager.getTrackerHits(seedlayerlist.get(2)).size();
+        
+        //  Loop over the first seed layer
+        for (HelicalTrackHit hit1 : _hitmanager.getTrackerHits(seedlayerlist.get(0))) {
+            
+            //  Loop over the second seed layer and check that we have a hit pair consistent with our strategy
+            for (HelicalTrackHit hit2 : _hitmanager.getTrackerHits(seedlayerlist.get(1))) {
+                if (!HitCheck(2, hit1, hit2)) continue;
+                
+                //  Loop over the third seed layer and check that we have a hit triplet consistent with our strategy
+                for (HelicalTrackHit hit3 : _hitmanager.getTrackerHits(seedlayerlist.get(2))) {
+                    if (!HitCheck(3, hit2, hit3)) continue;
+                    if (!HitCheck(4, hit1, hit3)) continue;
+                    
+                    //  Create a seed candidate from this 3-hit seed
+                    SeedCandidate seed = new SeedCandidate(strategy);
+                    seed.addHit(hit1);
+                    seed.addHit(hit2);
+                    seed.addHit(hit3);
+                    nseed++;
+                    
+                    //  See if we can fit a helix to this seed candidate
+                    boolean success = _helixfitter.FitCandidate(seed, strategy);
+                    if (!success) continue;
+                    
+                    //  Save the helix fit
+                    seed.setHelix(_helixfitter.getHelix());
+                    nfit++;
+                    
+                    //  See if we can confirm this seed candidate
+                    success = _confirmer.Confirm(seed, true, strategy);
+                    if (!success) continue;
+                    nconfirm++;
+                    
+                    //  Try to extend each confirmed seed candidates to make a track candidate
+                    List<SeedCandidate> confirmedlist = _confirmer.getResult();
+                    for (SeedCandidate confirmedseed : confirmedlist) {
+                        
+                        //  See if we can extend this seed candidate
+                        success = _confirmer.Extend(confirmedseed, true, strategy);
+                        if (!success) continue;
+                        nextend++;
+                        
+                        //  Found a track candidate - merge it into the list of track candidates
+                        List<SeedCandidate> extendedlist = _confirmer.getResult();
+                        _merger.Merge(_trackseeds, extendedlist, strategy);
+                    }
+                }
+            }
+        }
+        System.out.println("Strategy"+strategy.getName()+"nseed: "+nseed+" nfit: "+nfit+" nconfirm: "+nconfirm+" nextend: "+nextend+" ntrk: "+_trackseeds.size());
+        
+        //  Done with track finding for this strategy
+        if(_diag!=null) _diag.fireFinderDone(maxseeds, nseed, nfit, nconfirm, _trackseeds);
+        return _trackseeds.size() > 0;
+    }
+    
+    public List<SeedCandidate> getTrackSeeds() {
+        return _trackseeds;
+    }
+    
+    public void clearTrackSeedList() {
+        _trackseeds.clear();
+    }
+    
+    private boolean HitCheck(int level, HelicalTrackHit hit1, HelicalTrackHit hit2) {
+        
+        //  Get the polar coordinates for the hits
+        double r1 = hit1.r();
+        double r2 = hit2.r();
+        double phi1 = hit1.phi();
+        double phi2 = hit2.phi();
+        
+        //  Get the maximum deviation in phi from a radial track given the cuts on radius of curvature and DCA
+        double dphi1mx = Math.asin((2*_RMin*_dMax - _dMax*_dMax - r1*r1)/(2*r1*(_RMin - _dMax)));
+        double dphi2mx = Math.asin((2*_RMin*_dMax - _dMax*_dMax - r2*r2)/(2*r2*(_RMin - _dMax)));
+        
+        //  Calculate the difference in azimuthal angle between these two hits, which should always be positive
+        double dphi = Math.abs(phi2 - phi1);
+        if (dphi > Math.PI) dphi = 2. * Math.PI - dphi;
+        if (dphi < 0.) System.out.println("HitCheck: negative dphi = "+dphi);
+        //  Check that the difference in azimuthal angle is less than the difference in maximum phi deviations
+        boolean phicut = dphi <= Math.abs(dphi2mx - dphi1mx);
+//        if (hit1.getMCParticles().contains(hit2.getMCParticles().get(0))) {
+//            System.out.println(" phicut for MC Particle match: "+phicut);
+//            System.out.println("RMin: "+_RMin+" dMax: "+_dMax);
+//            System.out.println("dphi1mx: "+dphi1mx+" dphi2mx: "+dphi2mx+" dphi: "+dphi);
+//        }
+        //  Call the diagnostics if requested and return
+        if(_diag!=null) _diag.fireFinderDPhiCut(level, dphi, phicut, hit2);
+        return phicut;
+    }
+}
\ No newline at end of file

lcsim/src/org/lcsim/recon/tracking/seedtracker
ConstrainHelix.java 1.1 -> 1.2
diff -u -r1.1 -r1.2
--- ConstrainHelix.java	27 Aug 2008 17:59:02 -0000	1.1
+++ ConstrainHelix.java	9 Oct 2008 17:47:30 -0000	1.2
@@ -9,6 +9,7 @@
 
 import java.util.List;
 
+import org.lcsim.constants.Constants;
 import org.lcsim.fit.helicaltrack.HelicalTrackFit;
 import org.lcsim.fit.helicaltrack.HelicalTrackHit;
 
@@ -18,24 +19,25 @@
  * @version 1.0
  */
 public class ConstrainHelix {
-    double _bfield;
+    private double _bfield = 0.;
     
     /**
      * Creates a new instance of ConstrainHelix
      */
-    public ConstrainHelix(double bfield) {
-        _bfield = bfield;
+    public ConstrainHelix() {
     }
     
     public void setConstraintChisq(SeedStrategy strategy, HelicalTrackFit helix, List<HelicalTrackHit> hits) {
         
+        if (_bfield == 0.) throw new RuntimeException("B Field must be set before calling setConstraintChisq method");
+        
         //  Retrieve the helix parameters
         double[] params = helix.parameters();
         
         double nhchisq = 0.;
         
         //  Inflate chi^2 if |curvature| is too large
-        double curvmax = 0.0003 * _bfield / strategy.getMinPT();
+        double curvmax = Constants.fieldConversion * _bfield / strategy.getMinPT();
         double curv = Math.abs(params[2]);
         if (curv > curvmax) {
             nhchisq += Math.pow(curv - curvmax, 2) / Math.abs(helix.covariance().e(2, 2));
@@ -66,4 +68,8 @@
         return;
     }
 
+    public void setBField(double bfield) {
+        _bfield = bfield;
+        return;
+    }
 }

lcsim/src/org/lcsim/recon/tracking/seedtracker
HelixFitter.java 1.1 -> 1.2
diff -u -r1.1 -r1.2
--- HelixFitter.java	27 Aug 2008 17:59:02 -0000	1.1
+++ HelixFitter.java	9 Oct 2008 17:47:30 -0000	1.2
@@ -7,7 +7,6 @@
 
 package org.lcsim.recon.tracking.seedtracker;
 
-import org.lcsim.recon.tracking.seedtracker.diagnostic.ISeedTrackerDiagnostics;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -22,6 +21,7 @@
 import org.lcsim.fit.helicaltrack.MultipleScatter;
 import org.lcsim.fit.helicaltrack.TrackDirection;
 import org.lcsim.fit.line.SlopeInterceptLineFit;
+import org.lcsim.recon.tracking.seedtracker.diagnostic.ISeedTrackerDiagnostics;
 import org.lcsim.fit.zsegment.ZSegmentFit;
 
 /**
@@ -36,21 +36,20 @@
     private MaterialManager _materialmanager;
     private ConstrainHelix _constrain;
     private HelixUtils _helixutils;
-    private double _bfield;
+    private double _bfield = 0.;
     private CircleFit _circlefit;
     private SlopeInterceptLineFit _linefit;
     private ZSegmentFit _zsegmentfit;
     private FitStatus _status;
-    private ISeedTrackerDiagnostics diag = null;
+    private ISeedTrackerDiagnostics _diag = null;
     /**
      * Creates a new instance of HelixFitter
      */
-    public HelixFitter(double bfield, MaterialManager materialmanager) {
+    public HelixFitter(MaterialManager materialmanager) {
         _materialmanager = materialmanager;
         _helixutils = new HelixUtils();
-        _bfield = bfield;
-        _scattering = new MultipleScattering(_materialmanager, _bfield);
-        _constrain = new ConstrainHelix(_bfield);
+        _scattering = new MultipleScattering(_materialmanager);
+        _constrain = new ConstrainHelix();
     }
     
     public boolean FitCandidate(SeedCandidate seed, SeedStrategy strategy) {
@@ -58,6 +57,9 @@
         //  Initialize fit results to null objects
         _helix = null;
 
+        //  Check that we have set the magnetic field
+        if (_bfield == 0.) throw new RuntimeException("B Field must be set before calling the Helix fitter");
+        
         //  Set the tolerance in the fitter
         _fitter.setTolerance(Math.sqrt(strategy.getMaxChisq()));
         
@@ -78,7 +80,7 @@
             _status = _fitter.fit(hitlist);
             checkfit();
             if (_status != FitStatus.Success) {
-                if(diag!=null) diag.fireFitterFitMade(seed, null,_circlefit,_linefit,_zsegmentfit, _status, false);
+                if(_diag!=null) _diag.fireFitterFitMade(seed, null,_circlefit,_linefit,_zsegmentfit, _status, false);
                 return false;
             }
             
@@ -102,7 +104,7 @@
         _status = _fitter.fit(hitlist, msmap, oldhelix);
         checkfit();
         if (_status != FitStatus.Success) {
-            if(diag!=null) diag.fireFitterFitMade(seed, null,_circlefit,_linefit,_zsegmentfit, _status, false);
+            if(_diag!=null) _diag.fireFitterFitMade(seed, null,_circlefit,_linefit,_zsegmentfit, _status, false);
             return false;
         }
         
@@ -112,12 +114,22 @@
         //  Set the non-holonomic constraint chi square
         _constrain.setConstraintChisq(strategy, _helix, hitlist);
         boolean success = _helix.chisqtot() <= strategy.getMaxChisq();
-        if(diag!=null) diag.fireFitterFitMade(seed, _helix, _circlefit, _linefit, _zsegmentfit, _status, success);
+        if(_diag!=null) _diag.fireFitterFitMade(seed, _helix, _circlefit, _linefit, _zsegmentfit, _status, success);
         return success;
     }
     
     public void setDiagnostics(ISeedTrackerDiagnostics d) {
-        diag = d;
+        _diag = d;
+        return;
+    }
+    
+    public void setBField(double bfield) {
+        
+        //  Save b field and pass it to the multiple scattering and chisq constraint classes
+        _bfield = bfield;
+        _scattering.setBField(_bfield);
+        _constrain.setBField(_bfield);
+        return;
     }
     
     public HelicalTrackFit getHelix() {

lcsim/src/org/lcsim/recon/tracking/seedtracker
MergeSeedLists.java 1.1 -> 1.2
diff -u -r1.1 -r1.2
--- MergeSeedLists.java	27 Aug 2008 17:59:02 -0000	1.1
+++ MergeSeedLists.java	9 Oct 2008 17:47:30 -0000	1.2
@@ -7,12 +7,13 @@
 
 package org.lcsim.recon.tracking.seedtracker;
 
-import org.lcsim.recon.tracking.seedtracker.diagnostic.ISeedTrackerDiagnostics;
 import hep.physics.vec.Hep3Vector;
+
 import java.util.List;
 import java.util.ListIterator;
 
 import org.lcsim.fit.helicaltrack.HelicalTrackHit;
+import org.lcsim.recon.tracking.seedtracker.diagnostic.ISeedTrackerDiagnostics;
 import org.lcsim.util.aida.AIDA;
 
 /**

lcsim/src/org/lcsim/recon/tracking/seedtracker
MultipleScattering.java 1.1 -> 1.2
diff -u -r1.1 -r1.2
--- MultipleScattering.java	27 Aug 2008 17:59:02 -0000	1.1
+++ MultipleScattering.java	9 Oct 2008 17:47:30 -0000	1.2
@@ -30,7 +30,7 @@
 public class MultipleScattering {
     private HelixUtils _hutil = new HelixUtils();
     private MaterialManager _materialmanager;
-    private double _bfield;
+    private double _bfield = 0.;
     private int _mxint = 10;
     
     /**
@@ -38,9 +38,8 @@
      * @param materialmanager MaterialManager provides access to the scattering material
      * @param bfield magnetic field in the tracking volume
      */
-    public MultipleScattering(MaterialManager materialmanager, double bfield) {
+    public MultipleScattering(MaterialManager materialmanager) {
         _materialmanager = materialmanager;
-        _bfield = bfield;
     }
     
     /**
@@ -121,6 +120,9 @@
      */
     public List<ScatterAngle> FindScatters(HelicalTrackFit helix) {
         
+        //  Check that B Field is set
+        if (_bfield == 0.) throw new RuntimeException("B Field must be set before calling FindScatters method");
+        
         //  Create a new list to contain the mutliple scatters
         List<ScatterAngle> scatters = new ArrayList<ScatterAngle>();
         
@@ -180,6 +182,11 @@
         return scatters;
     }
     
+    public void setBField(double bfield) {
+        _bfield = bfield;
+        return;
+    }
+    
 //  Calculate the multiple scattering angle for a given momentum and thickness
     private double msangle(double p, double radlength) {
         double angle = (0.0136 / p) * Math.sqrt(radlength) * (1.0 + 0.038 * Math.log(radlength));

lcsim/src/org/lcsim/recon/tracking/seedtracker
SeedTracker.java 1.1 -> 1.2
diff -u -r1.1 -r1.2
--- SeedTracker.java	27 Aug 2008 17:59:02 -0000	1.1
+++ SeedTracker.java	9 Oct 2008 17:47:30 -0000	1.2
@@ -7,14 +7,14 @@
 
 package org.lcsim.recon.tracking.seedtracker;
 
-import org.lcsim.recon.tracking.seedtracker.diagnostic.ISeedTrackerDiagnostics;
 import hep.physics.vec.BasicHep3Vector;
+import hep.physics.vec.Hep3Vector;
 
-import java.util.ArrayList;
 import java.util.List;
 
 import org.lcsim.event.EventHeader;
 import org.lcsim.geometry.Detector;
+import org.lcsim.recon.tracking.seedtracker.diagnostic.ISeedTrackerDiagnostics;
 import org.lcsim.util.Driver;
 
 
@@ -29,16 +29,37 @@
  */
 public class SeedTracker extends Driver {
     private List<SeedStrategy> _strategylist;
-    private ISeedTrackerDiagnostics diag = null;
-    private MaterialManager materialmanager = new MaterialManager();
+    private ISeedTrackerDiagnostics _diag = null;
+    private MaterialManager _materialmanager;
+    private HitManager _hitmanager;
+    private HelixFitter _helixfitter;
+    private SeedTrackFinder _finder;
+    private MakeTracks _maketracks;
+    private Hep3Vector _IP = new BasicHep3Vector(0.,0.,0.);
+    private double _bfield;
     
     /** Creates a new instance of SeedTracker */
     public SeedTracker() {
-        _strategylist = new DefaultStrategy().getStrategyList();
+        this(new DefaultStrategy().getStrategyList());
     }
     
     public SeedTracker(List<SeedStrategy> strategylist) {
         _strategylist = strategylist;
+        
+        //  Instantiate the material manager
+        _materialmanager = new MaterialManager();
+        
+        //  Instantiate the hit manager
+        _hitmanager = new HitManager();
+        
+        //  Instantiate the helix finder
+        _helixfitter = new HelixFitter(_materialmanager);
+        
+        //  Instantiate the Seed Finder
+        _finder = new SeedTrackFinder(_hitmanager, _helixfitter);
+        
+        //  Instantiate the Track Maker
+        _maketracks = new MakeTracks();
     }
     
     /**
@@ -48,68 +69,45 @@
     @Override
     protected void process(EventHeader event) {
         
-        if(diag!=null) diag.setEvent(event);
-        //  Find the magnetic field
-//        Hep3Vector _IP = new BasicHep3Vector(0.,0.,0.);
-//        double BField = event.getDetector().getFieldMap().getField(_IP).z();
-        double[] _OldIP = {0., 0., 0.};
-        double bfield = event.getDetector().getFieldMap().getField(_OldIP)[2];
-        if(diag!=null)diag.setBField(bfield);
-        
-        //  Instantiate the material manager and build the material model used
-        //  to estimate multiple scattering errors
-        if(diag!=null)diag.setMaterialManager(materialmanager);
-        
-        //  Instantiate the hit manager and sort the hits for this event
-        HitManager hitmanager = new HitManager();
-        hitmanager.OrganizeHits(event);
-        if(diag!=null) diag.setHitManager(hitmanager);
+        //  Pass the event to the diagnostics package
+        if(_diag!=null) _diag.setEvent(event);
         
-        //  Instantiate the helix finder
-        HelixFitter helixfitter = new HelixFitter(bfield, materialmanager);
-        if(diag!=null) helixfitter.setDiagnostics(diag);
-        
-        //  Instantiate the Seed Finder
-        FindSeeds finder = new FindSeeds(hitmanager, helixfitter);
-        if(diag!=null) finder.setDiagnostic(diag);
+        //  Sort the hits for this event
+        _hitmanager.OrganizeHits(event);
         
-        //  Instantiate the Seed Merger
-        MergeSeedLists mergeseedlists = new MergeSeedLists();
-        if(diag!=null) mergeseedlists.setDiagnostic(diag);
+        //  Clear the list of track seeds accumulated in the track finder
+        _finder.clearTrackSeedList();
         
-        //  Instantiate the Track Maker
-        MakeTracks maketracks = new MakeTracks();
-        
-        //  Create the list of final track seeds
-        List<SeedCandidate> trackseeds = new ArrayList<SeedCandidate>();
-        
-        //  Loop over all strategies
+        //  Loop over strategies and perform track finding
         for (SeedStrategy strategy : _strategylist) {
             
-            if(diag!=null) diag.fireStrategyChanged(strategy);
-            
-            //  Find the confirmed seeds for this strategy
-            boolean success = finder.FindConfirmedSeeds(strategy, bfield);
-            if (!success) continue;
-            List<SeedCandidate> extended = finder.getExtendedSeeds();
-            
-            //  Merge the extended seeds into the list of found track seeds, eliminating duplicates
-            mergeseedlists.Merge(trackseeds, extended, strategy);
-            
-            if(diag!=null) diag.fireFinalDiagnostics(trackseeds);
+            //  Set the strategy for the diagnostics
+            if(_diag!=null) _diag.fireStrategyChanged(strategy);
             
+            //  Perform track finding under this strategy
+            _finder.FindTracks(strategy, _bfield);
         }
         
+        //  Get the list of final list of SeedCandidates
+        List<SeedCandidate> trackseeds = _finder.getTrackSeeds();
+        if(_diag!=null) _diag.fireFinalDiagnostics(trackseeds);
+        
         //  Make tracks from the final list of track seeds
-        maketracks.Process(event, trackseeds, bfield);
+        _maketracks.Process(event, trackseeds, _bfield);
         
         return;
     }
     
     @Override
     protected void detectorChanged(Detector detector){
-        //only build the model when the detector is changed.
-        materialmanager.BuildModel(detector);
+        
+        //  Only build the model when the detector is changed
+        _materialmanager.BuildModel(detector);
+        
+        //  Find the bfield and pass it to the helix fitter and diagnostic package
+        _bfield = detector.getFieldMap().getField(_IP).z();
+        _helixfitter.setBField(_bfield);
+        if (_diag!=null) _diag.setBField(_bfield);
     }
     
     /**
@@ -119,11 +117,24 @@
      * @param strategylist List of strategies to be used
      */
     public void putStrategyList(List<SeedStrategy> strategylist) {
+        
+        //  Save the strategy list
         _strategylist = strategylist;
         return;
     }
     
     public void setDiagnostics(ISeedTrackerDiagnostics d){
-        diag = d;
+        
+        //  Set the diagnostic package
+        _diag = d;
+        _helixfitter.setDiagnostics(_diag);
+        _finder.setDiagnostic(_diag);
+        
+        //  Pass the hit manager, material manager, and bfield to the diagnostic package
+        if (_diag!=null) {
+            _diag.setMaterialManager(_materialmanager);
+            _diag.setHitManager(_hitmanager);
+            _diag.setBField(_bfield);
+        }
     }
 }
\ No newline at end of file
CVSspam 0.2.8