1 added + 5 modified, total 6 files
lcsim/src/org/lcsim/recon/tracking/seedtracker
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
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
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
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
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
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