1
2
3
4
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
24
25
26
27
28
29
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
52 public SeedTracker() {
53 this(new DefaultStrategy().getStrategyList());
54 }
55
56 public SeedTracker(List<SeedStrategy> strategylist) {
57 _strategylist = strategylist;
58
59
60
61
62
63 _hitmanager = new HitManager();
64
65
66 _helixfitter = new HelixFitter(_materialmanager);
67
68
69 _finder = new SeedTrackFinder(_hitmanager, _helixfitter);
70
71
72 _maketracks = new MakeTracks();
73 }
74
75
76
77
78
79 @Override
80 protected void process(EventHeader event) {
81
82
83
84 if (_diag != null) _diag.setEvent(event);
85
86
87 long last_time = System.currentTimeMillis();
88
89
90 List<HelicalTrackHit> hitcol = event.get(HelicalTrackHit.class, _inputCol);
91
92
93 _hitmanager.OrganizeHits(hitcol);
94
95
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
102 _finder.clearTrackSeedList();
103
104
105 for (SeedStrategy strategy : _strategylist) {
106
107
108 if (_diag != null) _diag.fireStrategyChanged(strategy);
109
110
111 _finder.FindTracks(strategy, _bfield);
112
113
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
121 List<SeedCandidate> trackseeds = _finder.getTrackSeeds();
122
123
124 if(_iterativeConfirmedFits>0) {
125
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
148 _maketracks.Process(event, trackseeds, _bfield);
149
150
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
161 _finder.clearTrackSeedList();
162
163
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
175 _materialmanager.buildModel(detector);
176
177
178 if(!_forceBField)_bfield = detector.getFieldMap().getField(_IP).z();
179
180 if (_diag != null) _diag.setBField(_bfield);
181 _helixfitter.setBField(_bfield);
182
183
184 _rtrk = _materialmanager.getRMax();
185
186
187 if (_autosectoring)
188 _hitmanager.setSectorParams(_strategylist, _bfield, _rtrk);
189 }
190
191
192
193
194
195
196
197 public void putStrategyList(List<SeedStrategy> strategylist) {
198
199
200 _strategylist = strategylist;
201
202
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
219 _diag = d;
220 _helixfitter.setDiagnostics(_diag);
221 _finder.setDiagnostic(_diag);
222
223
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
249
250
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
268
269
270 public void setTrackCheck(TrackCheck trackCheck) {
271 _finder._trackCheck = trackCheck;
272 _maketracks._trackCheck = trackCheck;
273 }
274
275
276
277
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
291
292
293 public void setDebug(boolean _debug) {
294 this._debug = _debug;
295 }
296
297 }