150 {
152 <<
m_printer->printMeasurements(track) << std::endl
154
156
157 std::stringstream
ss;
158 ss << particleHypothesis;
160 return nullptr;
161 }
162
163
165
167 MagField::AtlasFieldCache fieldCache;
168
169
171
175 }
176
177
178
179
180
181
182 std::unique_ptr<Trk::Track> fittedTrack = std::make_unique<Trk::Track>(track);
183 if (isCombined && particleHypothesis ==
Trk::muon && !
m_trackQuery->isCaloAssociated(*fittedTrack, ctx)) {
184
185 ATH_MSG_VERBOSE(
"fit:: about to add the TSOS's describing calorimeter association to a combined muon" );
186
187 auto combinedTSOS = std::make_unique<Trk::TrackStates>();
188
189 combinedTSOS->reserve(fittedTrack->trackStateOnSurfaces()->size() + 3);
190 bool caloAssociated = false;
191
192
194 ATH_MSG_VERBOSE(
"Updating Calorimeter TSOS in Muon Combined (re)Fit ...");
196 caloAssociated = true;
197 }
198
199 for (const Trk::TrackStateOnSurface* in_tsos : *fittedTrack->trackStateOnSurfaces()) {
200 if (caloAssociated) {
201 combinedTSOS->push_back(in_tsos->clone());
202 }
else if ((in_tsos->measurementOnTrack() &&
m_indetVolume->inside(in_tsos->measurementOnTrack()->globalPosition())) ||
203 (in_tsos->trackParameters() &&
m_indetVolume->inside(in_tsos->trackParameters()->position()))) {
204 combinedTSOS->push_back(in_tsos->clone());
205 } else {
206 std::unique_ptr<const Trk::TrackStateOnSurface> tsos =
m_caloTSOS->innerTSOS(ctx, *fittedTrack->perigeeParameters());
207 if (tsos) {
208 combinedTSOS->push_back(std::move(tsos));
211 combinedTSOS->push_back(in_tsos->clone());
212 tsos =
m_caloTSOS->outerTSOS(ctx, *parameters);
213 if (tsos) combinedTSOS->push_back(std::move(tsos));
214 } else {
215 tsos =
m_caloTSOS->middleTSOS(ctx, *parameters);
216 if (tsos) combinedTSOS->push_back(std::move(tsos));
217 tsos =
m_caloTSOS->outerTSOS(ctx, *parameters);
218 if (tsos) combinedTSOS->push_back(std::move(tsos));
219 combinedTSOS->push_back(in_tsos->clone());
220 }
221 }
222 caloAssociated = true;
223 }
224 }
225
226 std::unique_ptr<Trk::Track>
combinedTrack = std::make_unique<Trk::Track>(fittedTrack->info(), std::move(combinedTSOS),
nullptr);
227
228 if (msgLevel(MSG::DEBUG))
countAEOTs(*combinedTrack,
" combinedTrack track before fit ");
229
230 caloAssociated =
m_trackQuery->isCaloAssociated(*combinedTrack, ctx);
231
232
234 ATH_MSG_VERBOSE(
"Updating Calorimeter TSOS in Muon Combined (re)Fit ...");
236 }
237
238 fittedTrack =
fitter->
fit(ctx, *combinedTrack,
false, particleHypothesis);
239 } else {
240
242 ATH_MSG_VERBOSE(
"Updating Calorimeter TSOS in Muon Standalone Fit ...");
244 }
245
246
247 fittedTrack =
fitter->
fit(ctx, *fittedTrack,
false, particleHypothesis);
248 }
249
250
251 if (!fittedTrack) return nullptr;
252
253
254 if (!
checkTrack(
"fitInterface1", fittedTrack.get()))
return nullptr;
255
256
257
258
259
260 if (runOutlier) {
261
262
266 ATH_MSG_VERBOSE(
" perform spectrometer error optimization after cleaning ");
267 std::unique_ptr<Trk::Track> optimizedTrack =
m_muonErrorOptimizer->optimiseErrors(*fittedTrack, ctx);
268 if (
checkTrack(
"fitInterface1Opt", optimizedTrack.get()) && chi2BeforeOptimizer >
normalizedChi2(*optimizedTrack)) {
269 fittedTrack.swap(optimizedTrack);
270 if (msgLevel(MSG::DEBUG))
countAEOTs(*fittedTrack,
" re fit scaled errors Track ");
271 }
272 }
273
274
276
277
278 ATH_MSG_VERBOSE(__FILE__<<
":"<<__LINE__<<
" perform track cleaning... " <<
m_printer->print(*fittedTrack) << std::endl
279 <<
m_printer->printStations(*fittedTrack));
280
281 if (msgLevel(MSG::DEBUG))
countAEOTs(*fittedTrack,
" refit: fitted track before cleaning ");
282
283 std::unique_ptr<Trk::Track> cleanTrack =
m_cleaner->clean(*fittedTrack, ctx);
284
285 if (msgLevel(MSG::DEBUG))
countAEOTs(*cleanTrack,
" refit: after cleaning");
286
287 if (!
checkTrack(
"fitInterface1Cleaner", cleanTrack.get())) { cleanTrack.reset(); }
288
289 if (!cleanTrack) {
293 fittedTrack.reset();
294 } else {
295 ATH_MSG_DEBUG(
" keep original standalone track despite cleaner veto ");
296 }
297 } else if (!(*cleanTrack->perigeeParameters() == *fittedTrack->perigeeParameters())) {
299
300 if (chi2After <
m_badFitChi2 || chi2After < chi2Before) {
302 fittedTrack.swap(cleanTrack);
303 } else {
305 }
306 }
307
308
309 if (fittedTrack) {
311 <<
m_printer->printStations(*fittedTrack));
312 }
313 }
314 return fittedTrack;
315 }
ToolHandle< Rec::IMuidCaloTrackStateOnSurface > m_caloTSOS
std::unique_ptr< const Trk::Volume > m_indetVolume
@ CaloDeposit
This TSOS contains a CaloEnergy object.
void combinedTrack(long int ICH, double *pv0, double *covi, double BMAG, double *par, double *covo)