1
2
3
4
5
6
7 package org.lcsim.recon.tracking.seedtracker;
8
9 import java.util.ArrayList;
10 import java.util.HashSet;
11 import java.util.List;
12
13 import java.util.Set;
14 import org.lcsim.event.MCParticle;
15 import org.lcsim.fit.helicaltrack.HelicalTrackHit;
16 import org.lcsim.recon.tracking.seedtracker.diagnostic.ISeedTrackerDiagnostics;
17
18
19
20
21
22
23 public class SeedTrackFinder {
24
25 private HitManager _hitmanager;
26 private HelixFitter _helixfitter;
27 private ConfirmerExtender _confirmer;
28 private List<SeedCandidate> _trackseeds;
29 private ISeedTrackerDiagnostics _diag = null;
30 private Set<MCParticle> _seededmcp;
31 private Set<MCParticle> _confirmedmcp;
32 TrackCheck _trackCheck;
33 private boolean _debug = false;
34 private boolean _applySectorBinning = false;
35
36
37
38
39 public SeedTrackFinder(HitManager hitmanager, HelixFitter helixfitter) {
40
41
42 _hitmanager = hitmanager;
43 _helixfitter = helixfitter;
44
45
46 _confirmer = new ConfirmerExtender(_hitmanager, _helixfitter);
47
48
49 _trackseeds = new ArrayList<SeedCandidate>();
50
51
52 _seededmcp = new HashSet<MCParticle>();
53 _confirmedmcp = new HashSet<MCParticle>();
54
55 }
56
57 public void setDiagnostic(ISeedTrackerDiagnostics d) {
58
59
60 _diag = d;
61 _confirmer.setDiagnostics(_diag);
62 }
63
64 public boolean FindTracks(SeedStrategy strategy, double bfield) {
65
66
67 FastCheck checker = new FastCheck(strategy, bfield, _diag);
68 if(_applySectorBinning) checker.setDoSectorBinCheck(_hitmanager.getSectorManager());
69
70
71 SeedSectoring ss = new SeedSectoring(_hitmanager, strategy, bfield,_applySectorBinning);
72 List<List<Sector>> sslist = ss.SeedSectors();
73
74
75 for (List<Sector> slist : sslist) {
76
77
78 for (HelicalTrackHit hit1 : slist.get(0).Hits()) {
79
80
81 for (HelicalTrackHit hit2 : slist.get(1).Hits()) {
82
83
84 if (_trackCheck != null) {
85 SeedCandidate tempseed = new SeedCandidate(strategy, bfield);
86 tempseed.addHit(hit1);
87 tempseed.addHit(hit2);
88 if (!_trackCheck.checkSeed(tempseed)) continue;
89 }
90
91
92 if (!checker.TwoPointCircleCheck(hit1, hit2, null)) {
93 if (_diag != null) _diag.fireCheckHitPairFailed(hit1, hit2);
94 continue;
95 }
96
97
98 for (HelicalTrackHit hit3 : slist.get(2).Hits()) {
99
100
101 if (_trackCheck != null) {
102 SeedCandidate tempseed2 = new SeedCandidate(strategy, bfield);
103 tempseed2.addHit(hit1);
104 tempseed2.addHit(hit3);
105 if (!_trackCheck.checkSeed(tempseed2)) continue;
106
107 SeedCandidate tempseed3 = new SeedCandidate(strategy, bfield);
108 tempseed3.addHit(hit2);
109 tempseed3.addHit(hit3);
110 if (!_trackCheck.checkSeed(tempseed3)) continue;
111 }
112
113
114 SeedCandidate seed = new SeedCandidate(strategy, bfield);
115 seed.addHit(hit1);
116 seed.addHit(hit2);
117 seed.addHit(hit3);
118
119
120 if (!checker.ThreePointHelixCheck(hit1, hit2, hit3)) {
121
122 if (_diag != null) {
123 if (seed.isTrueSeed())
124 _diag.fireCheckHitTripletFailed(hit1, hit2, hit3);
125 }
126 continue;
127 }
128
129
130
131
132 if (_diag != null)
133 if (seed.isTrueSeed())
134 _seededmcp.addAll(seed.getMCParticles());
135
136 if(_debug) System.out.println(this.getClass().getSimpleName()+": fit the candidate");
137
138
139
140 boolean success = _helixfitter.FitCandidate(seed, strategy);
141
142 if (!success) continue;
143
144 if(_debug) System.out.println(this.getClass().getSimpleName()+": fit success");
145
146
147 seed.setHelix(_helixfitter.getHelix());
148
149
150 if (_trackCheck != null) {
151 if (!_trackCheck.checkSeed(seed)) continue;
152 }
153
154
155 success = _confirmer.Confirm(seed, strategy, bfield);
156 if (!success) continue;
157
158 if(_debug) System.out.println(this.getClass().getSimpleName()+": confirmed seed");
159
160
161 if (_diag != null)
162 if (seed.isTrueSeed())
163 _confirmedmcp.addAll(seed.getMCParticles());
164
165 if(_debug) System.out.println(this.getClass().getSimpleName()+": try to extend");
166
167
168 List<SeedCandidate> confirmedlist = _confirmer.getResult();
169 for (SeedCandidate confirmedseed : confirmedlist) {
170
171
172 _confirmer.Extend(confirmedseed, strategy, bfield, _trackseeds);
173 }
174 }
175 }
176 }
177 }
178
179
180 if (_diag != null)
181 _diag.fireFinderDone(_trackseeds, _seededmcp);
182
183 return _trackseeds.size() > 0;
184 }
185
186
187
188
189
190
191 public List<SeedCandidate> getTrackSeeds() {
192 return _trackseeds;
193 }
194
195
196
197
198
199 public void clearTrackSeedList() {
200 _trackseeds.clear();
201 _seededmcp.clear();
202 _confirmedmcp.clear();
203 }
204
205
206
207
208
209
210 public void setMaxFit(int maxfits) {
211 _confirmer.setMaxFit(maxfits);
212 }
213
214
215
216
217
218
219 public void setApplySectorBinning(boolean applySectorBinning) {
220 this._applySectorBinning = applySectorBinning;
221 }
222
223
224
225
226
227
228 public Set<MCParticle> getSeededMCParticles() {
229 return _seededmcp;
230 }
231
232
233
234
235
236
237 public Set<MCParticle> getConfirmedMCParticles() {
238 return _confirmedmcp;
239 }
240
241
242
243
244
245
246
247 public ConfirmerExtender getConfirmer() {
248 return _confirmer;
249 }
250
251 }