lcsim/src/org/lcsim/contrib/seedtracker
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
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
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);
}