Print

Print


Commit in lcsim/src/org/lcsim/contrib/seedtracker on MAIN
ConfirmerExtender.java+90-991.4 -> 1.5
FindSeeds.java+29-141.7 -> 1.8
SeedTracker.java+6-121.14 -> 1.15
+125-125
3 modified files
Fixed bug in ConfirmerExtended that was probably slowing down track finding.  Also, re-factored code to extend seeds immediately after they are confirmed.

lcsim/src/org/lcsim/contrib/seedtracker
ConfirmerExtender.java 1.4 -> 1.5
diff -u -r1.4 -r1.5
--- ConfirmerExtender.java	2 Jul 2008 18:00:38 -0000	1.4
+++ ConfirmerExtender.java	16 Jul 2008 05:10:41 -0000	1.5
@@ -5,10 +5,11 @@
 
 package org.lcsim.contrib.seedtracker;
 
-import org.lcsim.contrib.seedtracker.diagnostic.ISeedTrackerDiagnostics;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
+
+import org.lcsim.contrib.seedtracker.diagnostic.ISeedTrackerDiagnostics;
 import org.lcsim.fit.helicaltrack.HelicalTrackFitter.FitStatus;
 import org.lcsim.fit.helicaltrack.HelicalTrackHit;
 
@@ -17,20 +18,19 @@
  * @author cozzy
  */
 
-
 public class ConfirmerExtender {
-
+    
     public enum Task{
         CONFIRM,
         EXTEND;
     }
     
-    private HitManager hmanager; 
-    private HelixFitter fitter; 
-    private List<SeedCandidate> result; 
-    private ISeedTrackerDiagnostics diag = null; 
+    private HitManager hmanager;
+    private HelixFitter fitter;
+    private List<SeedCandidate> result;
+    private ISeedTrackerDiagnostics diag = null;
     /**
-     * Constructs the Confirmer/Extender class.. 
+     * Constructs the Confirmer/Extender class..
      * @param workinglist The list to work on, either confirmed (extending) or seed (confirming)
      * @param task the task to do (either Task.CONFIRM or Task.EXTEND)
      * @param optimize enables the sort / cutoff optimization
@@ -39,137 +39,128 @@
      * @param strategy pass the strategy
      */
     public ConfirmerExtender(HitManager hitmanager, HelixFitter helixfitter){
-        
-
-        
+              
         this.hmanager = hitmanager;
         this.fitter = helixfitter;
-        this.result = new ArrayList<SeedCandidate>();
-
     }
     
     /**
-     * Retrieves the result of the confirmation or extension. 
-     * @return result The list of confirmed/extended seeds.. 
+     * Retrieves the result of the confirmation or extension.
+     * @return result The list of confirmed/extended seeds..
      */
     public List<SeedCandidate> getResult(){
-
-        return result; 
+        
+        return result;
     }
     
     public void setDiagnostics(ISeedTrackerDiagnostics d) {
         diag = d;
-    }
-    
+    }    
     
     public boolean Confirm(SeedCandidate seed, boolean optimize, SeedStrategy strategy){
-        List<SeedCandidate> l = new ArrayList<SeedCandidate>();
-        l.add(seed); 
-        return doTask(l, Task.CONFIRM, optimize, strategy); 
+        return doTask(seed, Task.CONFIRM, optimize, strategy);
     }
     
-    public boolean Extend(List<SeedCandidate> l, boolean optimize, SeedStrategy strategy){
-        return doTask(l, Task.EXTEND, optimize, strategy); 
+    public boolean Extend(SeedCandidate seed, boolean optimize, SeedStrategy strategy){
+        return doTask(seed, Task.EXTEND, optimize, strategy);
     }
     
-    private boolean doTask(List<SeedCandidate> l, Task task, boolean optimize, SeedStrategy strategy){
+    private boolean doTask(SeedCandidate seed, Task task, boolean optimize, SeedStrategy strategy){
         
-        List<SeedLayer> lyrs; 
+        //  Create a list to hold the confirmed / extended seeds
+        this.result = new ArrayList<SeedCandidate>();
         
+        //  Get the list of layers to use
+        List<SeedLayer> lyrs;
         if (task == Task.EXTEND)
             lyrs= strategy.getLayers(SeedLayer.SeedType.Extend);
         else if (task == Task.CONFIRM)
             lyrs = strategy.getLayers(SeedLayer.SeedType.Confirm);
-        else throw new RuntimeException("Unrecognized Task"); 
+        else throw new RuntimeException("Unrecognized Task");
+        
+        int n = 0;
         
-        //  Loop over the confirmed seeds
-        for (SeedCandidate seed : l) {
-            int n = 0;
+        //  Create a list of input seeds to be searched for a confirmation/extension hit
+        List<SeedCandidate> seedlist = new ArrayList<SeedCandidate>();
+        //  For the first confirm/extend layer, the input seed is the seed we are trying to check out
+        seedlist.add(seed);
+        
+        //  Loop over the confirmation/extension layers
+        for (SeedLayer lyr : lyrs) {
+            
+            //  Get the hits on this confirmation/extension layer
+            List<HelicalTrackHit> hitlist = hmanager.getTrackerHits(lyr);
+            if (hitlist.size() == 0) continue;
             
-            //  Start a working seed list and add the input seed
-            List<SeedCandidate> seedlist = new ArrayList<SeedCandidate>();
-            seedlist.add(seed);
+            //  Create a list for seeds that are confirmed/extended using the current layer
+            List<SeedCandidate> newlist = new ArrayList<SeedCandidate>();
             
-            //  Loop over the confirmation/extension layers
-            for (SeedLayer lyr : lyrs) {
+            //  Loop over the input seeds for this layer search
+            for (SeedCandidate seedin : seedlist) {
                 
-                //  Get the hits on this confirmation/extension layer    
-                List<HelicalTrackHit> hitlist = hmanager.getTrackerHits(lyr);
+                //  Sort the hits
+                if(optimize) {
+                    SortHits comp = new SortHits(seedin.getHelix());
+                    Collections.sort(hitlist, comp);
+                }
                 
-                //  Create a list for seeds that are confirmed/extended using the current layer
-                List<SeedCandidate> newlist = new ArrayList<SeedCandidate>();
+                //  Retrieve the chisq for the last fit and initialize the best fit chisq for this layer
+                double oldchisq = seedin.getHelix().chisqtot();
+                double oldcirclechisq = seedin.getHelix().chisq()[0];
+                double chisqbest = 1.e6;
                 
-                //  Loop over the seeds in the working seed list
-                for (SeedCandidate seedin : seedlist) {
-                  
-                    SortHits comp; 
+                if(diag!=null) diag.fireConfirmerExtenderWorkingSeedInfo(task, seedin, hitlist);
+                
+                //  For each hit in this confirmation/extension layer, make a test seed including the new hit
+                for (HelicalTrackHit hit : hitlist) {
                     
-                    if(optimize) {
-                        comp = new SortHits(seedin.getHelix());
-                        Collections.sort(hitlist, comp);
-                    }
-                  
-                    //  Retrieve the chisq for the last fit and initialize the best fit chisq for this layer
-                    double oldchisq = seedin.getHelix().chisqtot();
-                    double oldcirclechisq = seedin.getHelix().chisq()[0];
-                    double chisqbest = 1.e6;
+                    SeedCandidate test = new SeedCandidate(seedin);
+                    test.addHit(hit);
                     
-                    if(diag!=null) diag.fireConfirmerExtenderWorkingSeedInfo(task, seedin, hitlist);
-                                        
-                    //  For each hit in this confirmation/extension layer, make a test seed including the new hit
-                    for (HelicalTrackHit hit : hitlist) {
-                            
-                        SeedCandidate test = new SeedCandidate(seedin);
-                        test.addHit(hit);
-                        
-                        //  See if we have a successful fit
-                        boolean success = fitter.FitCandidate(test, strategy);
-                        
-                        
+                    //  See if we have a successful fit
+                    boolean success = fitter.FitCandidate(test, strategy);
+                    
+                    if (!success ) {
                         
-                        if (!success ) {
-                            
-                            if(diag!=null) diag.fireConfirmerExtenderFitNoSuccess(task, seedin, hit, fitter, optimize);
-                            if (optimize){
-                                if (fitter.getFitStatus() != FitStatus.CircleFitFailed) {
-                                    double circlechisq = fitter.getCircleFit().chisq();
-                                    if (circlechisq > oldcirclechisq + strategy.getMaxChisq()) break;
-                                }
+                        if(diag!=null) diag.fireConfirmerExtenderFitNoSuccess(task, seedin, hit, fitter, optimize);
+                        if (optimize){
+                            if (fitter.getFitStatus() != FitStatus.CircleFitFailed) {
+                                double circlechisq = fitter.getCircleFit().chisq();
+                                if (circlechisq > oldcirclechisq + strategy.getMaxChisq()) break;
                             }
-                            continue; 
-                        }
-                        if (success) { 
-                            
-                            //  Attach the fit to the test seed and add it to the list
-                            test.setHelix(fitter.getHelix());
-                            if(diag!=null) diag.fireConfirmerExtenderFitSuccess(task, seedin, hit, fitter, chisqbest, optimize);
-                            newlist.add(test);
-                            chisqbest = Math.min(chisqbest, fitter.getHelix().chisqtot());
                         }
+                        continue;
+                    }
+                    if (success) {
+                        
+                        //  Attach the fit to the test seed and add it to the list
+                        test.setHelix(fitter.getHelix());
+                        if(diag!=null) diag.fireConfirmerExtenderFitSuccess(task, seedin, hit, fitter, chisqbest, optimize);
+                        newlist.add(test);
+                        chisqbest = Math.min(chisqbest, fitter.getHelix().chisqtot());
                     }
-                    
-                    //  If all fit tries for this layer are potentially bad hits, include the starting seed in the list
-                    if (chisqbest - oldchisq > strategy.getBadHitChisq()) {
-                        newlist.add(seedin);
-                        if(diag!=null) diag.fireConfirmerExtenderAllHitsPotentiallyBad(task, seedin, hitlist, chisqbest, oldchisq);
-                    } else n++;
                 }
-                //  Use the new list of seeds as input to the next layer search
                 
-                seedlist = newlist;
-                if(diag!=null) diag.fireConfirmerExtenderLayerDone(task, n, seedlist);
+                //  If all fit tries for this layer are potentially bad hits, include the starting seed in the list
+                if (chisqbest - oldchisq > strategy.getBadHitChisq()) {
+                    newlist.add(seedin);
+                    if(diag!=null) diag.fireConfirmerExtenderAllHitsPotentiallyBad(task, seedin, hitlist, chisqbest, oldchisq);
+                } else n++;
             }
             
+            //  Use the new list of seeds as the working listinput to the next layer search
+            seedlist = newlist;
+            if(diag!=null) diag.fireConfirmerExtenderLayerDone(task, n, seedlist);
+        }
+        
         //Check for seeds with sufficient numbers of confirmed/extended hits
-            for (SeedCandidate candidate : seedlist) {
-                int hits = candidate.getHits().size();
-                if ( (task == Task.EXTEND && hits >= strategy.getMinHits()) ||
-                     (task == Task.CONFIRM && hits >= strategy.getMinConfirm()+3) ) {
-                    
-                    result.add(candidate);
-                }
+        for (SeedCandidate candidate : seedlist) {
+            int hits = candidate.getHits().size();
+            if ( (task == Task.EXTEND && hits >= strategy.getMinHits()) ||
+                    (task == Task.CONFIRM && hits >= strategy.getMinConfirm()+3) ) {
+                result.add(candidate);
             }
         }
-        return result.size() > 0; 
+        return result.size() > 0;
     }
-}
+}
\ No newline at end of file

lcsim/src/org/lcsim/contrib/seedtracker
FindSeeds.java 1.7 -> 1.8
diff -u -r1.7 -r1.8
--- FindSeeds.java	2 Jul 2008 18:00:38 -0000	1.7
+++ FindSeeds.java	16 Jul 2008 05:10:41 -0000	1.8
@@ -21,21 +21,22 @@
 public class FindSeeds {
     private HitManager _hitmanager;
     private HelixFitter _helixfitter;
-    private ConfirmerExtender _confirmer;  
+    private ConfirmerExtender _confirmer;
     private List<SeedCandidate> _confirmedseeds;
-    private ISeedTrackerDiagnostics diag = null; 
+    private List<SeedCandidate> _extendedseeds;
+    private ISeedTrackerDiagnostics diag = null;
     
     /** Creates a new instance of FindSeeds */
     public FindSeeds(HitManager hitmanager, HelixFitter helixfitter) {
         _hitmanager = hitmanager;
         _helixfitter = helixfitter;
-        _confirmer = new ConfirmerExtender(hitmanager, helixfitter); 
+        _confirmer = new ConfirmerExtender(hitmanager, helixfitter);
     }
     
     public void setDiagnostic(ISeedTrackerDiagnostics d) {
-        diag = d; 
+        diag = d;
     }
-        
+    
     public boolean FindConfirmedSeeds(SeedStrategy strategy, double bfield) {
         
         if(diag!=null) _confirmer.setDiagnostics(diag);
@@ -44,6 +45,7 @@
         if (seedlayerlist.size() != 3) return false;
         
         _confirmedseeds = new ArrayList<SeedCandidate>();
+        _extendedseeds = new ArrayList<SeedCandidate>();
         
         double RMin = strategy.getMinPT() / (0.0003 * bfield);
         double dMax = strategy.getMaxDCA();
@@ -54,9 +56,9 @@
         int nseed = 0;
         int nconfirm = 0;
         int maxseeds = _hitmanager.getTrackerHits(seedlayerlist.get(0)).size() *
-                       _hitmanager.getTrackerHits(seedlayerlist.get(1)).size() *
-                       _hitmanager.getTrackerHits(seedlayerlist.get(2)).size();
-
+                _hitmanager.getTrackerHits(seedlayerlist.get(1)).size() *
+                _hitmanager.getTrackerHits(seedlayerlist.get(2)).size();
+        
         for (HelicalTrackHit hit1 : _hitmanager.getTrackerHits(seedlayerlist.get(0))) {
             double r1 = hit1.r();
             double phi1 = hit1.phi();
@@ -68,7 +70,7 @@
                 double dphi2 = Math.abs(phi2 - phi1);
                 if (dphi2 > Math.PI) dphi2 = 2. * Math.PI - dphi2;
                 boolean phicut = dphi2 > Math.abs(dphi2mx-dphi1mx);
-               if(diag!=null) diag.fireFinderDPhiCut(2, dphi2, phicut, hit2);
+                if(diag!=null) diag.fireFinderDPhiCut(2, dphi2, phicut, hit2);
                 if (phicut) continue;
                 for (HelicalTrackHit hit3 : _hitmanager.getTrackerHits(seedlayerlist.get(2))) {
                     double r3 = hit3.r();
@@ -89,22 +91,35 @@
                     seed.setHelix(_helixfitter.getHelix());
                     nfit++;
                     
-                    success = _confirmer.Confirm(seed, true, strategy); 
+                    success = _confirmer.Confirm(seed, true, strategy);
                     if (!success) continue;
-                    _confirmedseeds.addAll(_confirmer.getResult()); 
                     
+                    List<SeedCandidate> confirmedlist = _confirmer.getResult();
+                    _confirmedseeds.addAll(confirmedlist);
                     nconfirm++;
+                    
+                    for (SeedCandidate confirmedseed : confirmedlist) {
+                        
+                        success = _confirmer.Extend(confirmedseed, true, strategy);
+                        if (!success) continue;
+                        
+                        List<SeedCandidate> extendedlist = _confirmer.getResult();
+                        _extendedseeds.addAll(extendedlist);
+                    }
                 }
             }
         }
         
         if(diag!=null) diag.fireFinderDone(maxseeds, nseed, nfit, nconfirm, _confirmedseeds);
-
         
-        return true;
+        return _extendedseeds.size() > 0;
     }
-    
+   
     public List<SeedCandidate> getConfirmedSeeds() {
         return _confirmedseeds;
     }
+    
+    public List<SeedCandidate> getExtendedSeeds() {
+        return _extendedseeds;
+    }
 }
\ No newline at end of file

lcsim/src/org/lcsim/contrib/seedtracker
SeedTracker.java 1.14 -> 1.15
diff -u -r1.14 -r1.15
--- SeedTracker.java	2 Jul 2008 18:00:38 -0000	1.14
+++ SeedTracker.java	16 Jul 2008 05:10:41 -0000	1.15
@@ -30,7 +30,7 @@
 public class SeedTracker extends Driver {
     private List<SeedStrategy> _strategylist;
     private ISeedTrackerDiagnostics diag = null;
-    private MaterialManager materialmanager = new MaterialManager(); 
+    private MaterialManager materialmanager = new MaterialManager();
     
     /** Creates a new instance of SeedTracker */
     public SeedTracker() {
@@ -48,13 +48,14 @@
     @Override
     protected void process(EventHeader event) {
         
-       if(diag!=null) diag.setEvent(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);
@@ -63,6 +64,7 @@
         HitManager hitmanager = new HitManager();
         hitmanager.OrganizeHits(event);
         if(diag!=null) diag.setHitManager(hitmanager);
+        
         //  Instantiate the helix finder
         HelixFitter helixfitter = new HelixFitter(bfield, materialmanager);
         if(diag!=null) helixfitter.setDiagnostics(diag);
@@ -71,9 +73,6 @@
         FindSeeds finder = new FindSeeds(hitmanager, helixfitter);
         if(diag!=null) finder.setDiagnostic(diag);
         
-        //  Instantiate the Seed Extender
-        ConfirmerExtender extender = new ConfirmerExtender(hitmanager, helixfitter);          
-        if(diag!=null) extender.setDiagnostics(diag);
         //  Instantiate the Seed Merger
         MergeSeedLists mergeseedlists = new MergeSeedLists();
         if(diag!=null) mergeseedlists.setDiagnostic(diag);
@@ -92,12 +91,7 @@
             //  Find the confirmed seeds for this strategy
             boolean success = finder.FindConfirmedSeeds(strategy, bfield);
             if (!success) continue;
-            List<SeedCandidate> confirmed = finder.getConfirmedSeeds();
-            
-            //  Extend the confirmed seeds
-            success = extender.Extend(confirmed, true, strategy); 
-            if (!success) continue;
-            List<SeedCandidate> extended = extender.getResult(); 
+            List<SeedCandidate> extended = finder.getExtendedSeeds();
             
             //  Merge the extended seeds into the list of found track seeds, eliminating duplicates
             mergeseedlists.Merge(trackseeds, extended, strategy);
@@ -114,7 +108,7 @@
     
     @Override
     protected void detectorChanged(Detector detector){
-        //only build the model when the detector is changed. 
+        //only build the model when the detector is changed.
         materialmanager.BuildModel(detector);
     }
     
CVSspam 0.2.8