View Javadoc

1   /*
2    * SeedTracker.java
3    *
4    * Created on August 16, 2005, 8:54 AM
5    *
6    */
7   package org.lcsim.recon.tracking.seedtracker;
8   
9   import hep.physics.vec.BasicHep3Vector;
10  import hep.physics.vec.Hep3Vector;
11  
12  import java.util.*;
13  import org.lcsim.detector.ITransform3D;
14  import org.lcsim.event.EventHeader;
15  import org.lcsim.event.MCParticle;
16  import org.lcsim.fit.helicaltrack.HelicalTrackHit;
17  import org.lcsim.geometry.Detector;
18  import org.lcsim.recon.tracking.seedtracker.diagnostic.ISeedTrackerDiagnostics;
19  import org.lcsim.util.Driver;
20  import org.lcsim.util.aida.AIDA;
21  
22  /**
23   * Tracking algorithm based on forming track seeds from all 3-hit combinations,
24   * confirming this tentantive helix by requiring additional hits, and extending
25   * the track to additional layers.  The operation of the algorithm is controlled
26   * by a list of SeedStrategy that define the tracker layers to be used and the
27   * cuts on the tracking algorithm.
28   * @author Richard Partridge
29   * @version 1.0
30   */
31  public class SeedTracker extends Driver {
32  
33      protected List<SeedStrategy> _strategylist;
34      protected ISeedTrackerDiagnostics _diag = null;
35      protected MaterialManager _materialmanager = new MaterialManager();
36      protected HitManager _hitmanager;
37      protected HelixFitter _helixfitter;
38      protected SeedTrackFinder _finder;
39      protected MakeTracks _maketracks;
40      protected Hep3Vector _IP = new BasicHep3Vector(0., 0., 0.);
41      protected double _bfield = 0.;
42      protected boolean _forceBField = false;
43      protected double _rtrk = 1000.;
44      protected boolean _autosectoring = false;
45      protected AIDA aida = AIDA.defaultInstance();
46      protected boolean _timing = false;
47      protected String _inputCol = "HelicalTrackHits";
48      private int _iterativeConfirmedFits = 0;
49      private boolean _debug = false;
50      
51      /** Creates a new instance of SeedTracker */
52      public SeedTracker() {
53          this(new DefaultStrategy().getStrategyList());
54      }
55  
56      public SeedTracker(List<SeedStrategy> strategylist) {
57          _strategylist = strategylist;
58  
59          //  Instantiate the material manager
60         // _materialmanager = new MaterialManager();
61  
62          //  Instantiate the hit manager
63          _hitmanager = new HitManager();
64  
65          //  Instantiate the helix finder
66          _helixfitter = new HelixFitter(_materialmanager);
67  
68          //  Instantiate the Seed Finder
69          _finder = new SeedTrackFinder(_hitmanager, _helixfitter);
70  
71          //  Instantiate the Track Maker
72          _maketracks = new MakeTracks();
73      }
74  
75      /**
76       * Invoke the track finding algorithm
77       * @param event EventHeader for this event
78       */
79      @Override
80      protected void process(EventHeader event) {
81  
82  //        System.out.println("New event");
83          //  Pass the event to the diagnostics package
84          if (_diag != null) _diag.setEvent(event);
85  
86          //  Initialize timing
87          long last_time = System.currentTimeMillis();
88  
89          //  Get the hit collection from the event
90          List<HelicalTrackHit> hitcol = event.get(HelicalTrackHit.class, _inputCol);
91          
92          //  Sort the hits for this event
93          _hitmanager.OrganizeHits(hitcol);
94          
95          //  Make the timing plots if requested
96          long start_time = System.currentTimeMillis();
97          double dtime = ((double) (start_time - last_time)) / 1000.;
98          last_time = start_time;
99          if (_timing) aida.cloud1D("Organize Hits").fill(dtime);
100 
101         //  Make sure that we have cleared the list of track seeds in the finder
102         _finder.clearTrackSeedList();
103 
104         //  Loop over strategies and perform track finding
105         for (SeedStrategy strategy : _strategylist) {
106 
107             //  Set the strategy for the diagnostics
108             if (_diag != null) _diag.fireStrategyChanged(strategy);
109 
110             //  Perform track finding under this strategy
111             _finder.FindTracks(strategy, _bfield);
112 
113             //  Make the timing plots if requested
114             long time = System.currentTimeMillis();
115             dtime = ((double) (time - last_time)) / 1000.;
116             last_time = time;
117             if (_timing) aida.cloud1D("Tracking time for strategy "+strategy.getName()).fill(dtime);
118         }
119 
120         //  Get the list of final list of SeedCandidates
121         List<SeedCandidate> trackseeds = _finder.getTrackSeeds();
122         
123 
124         if(_iterativeConfirmedFits>0) {
125             // Iteratively re-fit tracks to take into account helix and hit position correlations
126             if(_debug) System.out.printf("%s: Iteratively improve %d seeds\n",this.getClass().getSimpleName(),trackseeds.size());
127             List<SeedCandidate> seedsToRemove = new ArrayList<SeedCandidate>();
128             for(SeedCandidate seed : trackseeds) {
129                 SeedStrategy strategy = seed.getSeedStrategy();
130                 boolean success = false;
131                 for(int iterFit=0;iterFit<_iterativeConfirmedFits;++iterFit) {
132                     success = _helixfitter.FitCandidate(seed, strategy);
133                 }
134                 if(!success) {
135                     seedsToRemove.add(seed);
136                 } else {
137                     if(_debug) System.out.printf("%s: done iterating, this seed will be added to event:\n%s\n",this.getClass().getSimpleName(),seed.toString());
138                 }
139             }
140             for(SeedCandidate badseed : seedsToRemove) {
141                 trackseeds.remove(badseed);
142             }
143         }
144 
145 
146 
147         //  Make tracks from the final list of track seeds
148         _maketracks.Process(event, trackseeds, _bfield);
149 
150         //  Save the MC Particles that have been seeded / confirmed if diagnostics are enabled
151         if (_diag != null) {
152             Set<MCParticle> seededmcpset = _finder.getSeededMCParticles();
153             List<MCParticle> seededmcp = new ArrayList<MCParticle>(seededmcpset);
154             event.put("SeededMCParticles", seededmcp, MCParticle.class, 0);
155             Set<MCParticle> confirmedmcpset = _finder.getConfirmedMCParticles();
156             List<MCParticle> confirmedmcp = new ArrayList<MCParticle>(confirmedmcpset);
157             event.put("ConfirmedMCParticles", confirmedmcp, MCParticle.class, 0);
158         }
159 
160         //  Clear the list of track seeds accumulated in the track finder
161         _finder.clearTrackSeedList();
162 
163         //  Make the total time plot if requested
164         long end_time = System.currentTimeMillis();
165         dtime = ((double) (end_time - start_time)) / 1000.;
166         if (_timing) aida.cloud1D("Total tracking time").fill(dtime);
167 
168         return;
169     }
170 
171     @Override
172     protected void detectorChanged(Detector detector) {
173 
174         //  Only build the model when the detector is changed
175         _materialmanager.buildModel(detector);
176 
177         //  Find the bfield and pass it to the helix fitter and diagnostic package
178         if(!_forceBField)_bfield = detector.getFieldMap().getField(_IP).z();
179 
180         if (_diag != null) _diag.setBField(_bfield);
181         _helixfitter.setBField(_bfield);
182 
183         //  Get the tracking radius
184         _rtrk = _materialmanager.getRMax();
185 
186         //  Set the sectoring parameters
187         if (_autosectoring)
188             _hitmanager.setSectorParams(_strategylist, _bfield, _rtrk);
189     }
190 
191     /**
192      * Specifiy the strategies to be used by the SeedTracker algorithm.  Invoking this
193      * method will override the default strategies defined by the DefaultStrategy
194      * class.
195      * @param strategylist List of strategies to be used
196      */
197     public void putStrategyList(List<SeedStrategy> strategylist) {
198 
199         //  Save the strategy list
200         _strategylist = strategylist;
201 
202         //  Set the sectoring parameters
203         if (_autosectoring)
204             _hitmanager.setSectorParams(strategylist, _bfield, _rtrk);
205 
206         return;
207     }
208 
209     public void setSectorParams(int nphi, double dz) {
210         _hitmanager.setSectorParams(nphi, dz);
211         _autosectoring = false;
212         return;
213     }
214 
215 
216     public void setDiagnostics(ISeedTrackerDiagnostics d) {
217 
218         //  Set the diagnostic package
219         _diag = d;
220         _helixfitter.setDiagnostics(_diag);
221         _finder.setDiagnostic(_diag);
222 
223         //  Pass the hit manager, material manager, and bfield to the diagnostic package
224         if (_diag != null) {
225             _diag.setMaterialManager(_materialmanager);
226             _diag.setHitManager(_hitmanager);
227             _diag.setBField(_bfield);
228         }
229     }
230 
231     public void setTimingPlots(boolean timing) {
232         _timing = timing;
233     }
234 
235     public void setTrkCollectionName(String name) {
236         _maketracks.setTrkCollectionName(name);
237     }
238 
239     public void setInputCollectionName(String name) {
240         _inputCol = name;
241     }
242 
243      public void setMaterialManagerTransform(ITransform3D _detToTrk) {
244         _materialmanager.setTransform(_detToTrk);
245     }
246 
247     /**
248      * Set the maximum number of fits used to confirm or extend a seed.
249      * 
250      * @param maxfit maximum number of fits
251      */
252     public void setMaxFit(int maxfit) {
253         _finder.setMaxFit(maxfit);
254     }
255 
256     public void setBField(double bfield) {
257         _forceBField=true;
258         _bfield=bfield;
259     }
260       public void setReferencePoint(double xref,double yref){
261         _helixfitter.setReferencePoint(xref, yref);
262     }
263       public void setSectorParams(boolean sector){
264           _hitmanager.setDoSectoring(sector);
265       }
266     /**
267      * Set {@link TrackCheck} object to be used by the track finding algorithm.
268      * If this method is never called, no external checking of seeds and tracks is performed.
269      */  
270     public void setTrackCheck(TrackCheck trackCheck) {
271         _finder._trackCheck = trackCheck;
272         _maketracks._trackCheck = trackCheck;
273     }
274     /**
275      * Set the maximum number of iterative fits on a confirmed/extended candidate.
276      *  
277      * @param maxfits maximum number of fits
278      */
279     public void setIterativeConfirmed(int maxfits) {
280         this._iterativeConfirmedFits = maxfits;
281     }
282     
283     public void setUseDefaultXPlane(boolean useDefault)
284     {
285         _materialmanager.setDefaultXPlaneUsage(useDefault);
286         
287     }
288 
289     /**
290      * Enable or disable the debug output
291      * @param _debug output switch
292      */
293     public void setDebug(boolean _debug) {
294         this._debug = _debug;
295     }
296     
297 }