59 m_messageHelper->setMessage(0,
"combinedFit:: missing MeasuredPerigee for indet track");
60 m_messageHelper->setMessage(1,
"combinedFit:: fail with MS removed by cleaner");
61 m_messageHelper->setMessage(2,
"combinedFit:: fail with perigee outside indet");
62 m_messageHelper->setMessage(3,
"combinedFit:: fail with missing caloEnergy");
63 m_messageHelper->setMessage(4,
"combinedFit:: final combined track lost, this should not happen");
64 m_messageHelper->setMessage(5,
"indetExtension:: reject with insufficient MS measurements");
65 m_messageHelper->setMessage(6,
"standaloneFit:: input vertex fails dynamic_cast");
66 m_messageHelper->setMessage(7,
"standaloneFit:: missing MeasuredPerigee for spectrometer track");
67 m_messageHelper->setMessage(8,
"standaloneFit:: missing TrackParameters on prefit");
68 m_messageHelper->setMessage(9,
"standaloneFit:: prefit fails parameter extrapolation to calo");
69 m_messageHelper->setMessage(10,
"standaloneFit:: extrapolated track missing TrackParameters at calo scatterer");
70 m_messageHelper->setMessage(11,
"standaloneFit:: final track lost, this should not happen");
71 m_messageHelper->setMessage(12,
"standaloneFit:: fail as calo incorrectly described");
72 m_messageHelper->setMessage(13,
"standaloneRefit:: fail track as no TSOS with type CaloDeposit");
74 m_messageHelper->setMessage(15,
"standaloneRefit:: no inner parameters");
75 m_messageHelper->setMessage(16,
"standaloneRefit:: innerScattering dynamic_cast failed");
76 m_messageHelper->setMessage(17,
"standaloneRefit:: no TSOS of type CaloDeposit found");
77 m_messageHelper->setMessage(18,
"standaloneRefit:: no inner scattering TSOS found");
78 m_messageHelper->setMessage(19,
"standaloneRefit:: no middle material");
79 m_messageHelper->setMessage(20,
"standaloneRefit:: no middle parameters");
80 m_messageHelper->setMessage(21,
"standaloneRefit:: no CaloDeposit TSOS found");
82 m_messageHelper->setMessage(23,
"standaloneRefit:: no outer parameters");
83 m_messageHelper->setMessage(24,
"standaloneRefit:: outerScattering dynamic_cast failed");
84 m_messageHelper->setMessage(25,
"standaloneRefit:: no outerScattering or CaloDeposit TSOS found");
85 m_messageHelper->setMessage(26,
"standaloneRefit:: failed propagation to innerTSOS");
86 m_messageHelper->setMessage(27,
"standaloneRefit:: failed propagation to middleTSOS");
87 m_messageHelper->setMessage(28,
"standaloneRefit:: fail as calo incorrectly described");
88 m_messageHelper->setMessage(29,
"fit:: particle hypothesis must be 0 or 2 (nonInteracting or muon). Requested: ");
89 m_messageHelper->setMessage(30,
"fit:: about to add the TSOS's describing calorimeter association to a combined muon");
90 m_messageHelper->setMessage(31,
"fit:: particle hypothesis must be 0 or 2 (nonInteracting or muon). Requested: ");
91 m_messageHelper->setMessage(32,
"fit:: particle hypothesis must be 0 or 2 (nonInteracting or muon). Requested: ");
92 m_messageHelper->setMessage(33,
"fit:: combined muon track is missing the TSOS's describing calorimeter association");
93 m_messageHelper->setMessage(34,
"appendSelectedTSOS:: skip duplicate measurement ");
94 m_messageHelper->setMessage(35,
"caloEnergyParameters:: muonTrack without caloEnergy association");
95 m_messageHelper->setMessage(36,
"caloEnergyParameters:: combinedTrack without caloEnergy association");
96 m_messageHelper->setMessage(37,
"createMuonTrack:: should never happen: FSR caloEnergy delete");
97 m_messageHelper->setMessage(38,
"createSpectrometerTSOS:: missing MeasuredPerigee for spectrometer track");
98 m_messageHelper->setMessage(39,
"createSpectrometerTSOS:: skip unrecognized TSOS without TrackParameters. Type: ");
99 m_messageHelper->setMessage(40,
"createSpectrometerTSOS:: skip duplicate measurement on same Surface. Type: ");
100 m_messageHelper->setMessage(41,
"entrancePerigee:: missing TrackingGeometrySvc - no perigee will be added at MS entrance");
101 m_messageHelper->setMessage(42,
"extrapolatedParameters:: missing MeasuredPerigee for spectrometer track");
102 m_messageHelper->setMessage(43,
"extrapolatedParameters:: missing spectrometer parameters on spectrometer track");
103 m_messageHelper->setMessage(44,
"final track lost, this should not happen");
104 m_messageHelper->setMessage(45,
"momentumUpdate:: update failed, keeping original value");
105 m_messageHelper->setMessage(46,
"reallocateMaterial:: null perigeeStartValue");
107 m_messageHelper->setMessage(48,
"standaloneFit:: insufficient measurements on input spectrometer track");
108 m_messageHelper->setMessage(49,
"standaloneFit:: inconsistent TSOS on input spectrometer track");
136 return StatusCode::SUCCESS;
146 return StatusCode::SUCCESS;
157 std::stringstream
ss;
158 ss << particleHypothesis;
182 std::unique_ptr<Trk::Track> fittedTrack = std::make_unique<Trk::Track>(
track);
183 if (isCombined && particleHypothesis ==
Trk::muon && !
m_trackQuery->isCaloAssociated(*fittedTrack, ctx)) {
185 ATH_MSG_VERBOSE(
"fit:: about to add the TSOS's describing calorimeter association to a combined muon" );
187 auto combinedTSOS = std::make_unique<Trk::TrackStates>();
190 bool caloAssociated =
false;
194 ATH_MSG_VERBOSE(
"Updating Calorimeter TSOS in Muon Combined (re)Fit ...");
196 caloAssociated =
true;
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());
208 combinedTSOS->push_back(std::move(tsos));
211 combinedTSOS->push_back(in_tsos->clone());
213 if (tsos) combinedTSOS->push_back(std::move(tsos));
216 if (tsos) combinedTSOS->push_back(std::move(tsos));
218 if (tsos) combinedTSOS->push_back(std::move(tsos));
219 combinedTSOS->push_back(in_tsos->clone());
222 caloAssociated =
true;
226 std::unique_ptr<Trk::Track>
combinedTrack = std::make_unique<Trk::Track>(fittedTrack->
info(), std::move(combinedTSOS),
nullptr);
234 ATH_MSG_VERBOSE(
"Updating Calorimeter TSOS in Muon Combined (re)Fit ...");
242 ATH_MSG_VERBOSE(
"Updating Calorimeter TSOS in Muon Standalone Fit ...");
247 fittedTrack =
fitter->
fit(ctx, *fittedTrack,
false, particleHypothesis);
251 if (!fittedTrack)
return nullptr;
254 if (!
checkTrack(
"fitInterface1", fittedTrack.get()))
return nullptr;
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);
278 ATH_MSG_VERBOSE(__FILE__<<
":"<<__LINE__<<
" perform track cleaning... " <<
m_printer->print(*fittedTrack) << std::endl
279 <<
m_printer->printStations(*fittedTrack));
283 std::unique_ptr<Trk::Track> cleanTrack =
m_cleaner->clean(*fittedTrack, ctx);
287 if (!
checkTrack(
"fitInterface1Cleaner", cleanTrack.get())) { cleanTrack.reset(); }
295 ATH_MSG_DEBUG(
" keep original standalone track despite cleaner veto ");
300 if (chi2After <
m_badFitChi2 || chi2After < chi2Before) {
302 fittedTrack.swap(cleanTrack);
311 <<
m_printer->printStations(*fittedTrack));
324 std::stringstream
ss;
325 ss << particleHypothesis;
347 std::unique_ptr<Trk::TrackParameters> perigee = perigeeStartValue.
uniqueClone();
348 std::unique_ptr<Trk::PerigeeSurface> perigeeSurface;
352 perigeeSurface = std::make_unique<Trk::PerigeeSurface>(origin);
354 perigee = std::make_unique<Trk::Perigee>(perigeeStartValue.
position(), perigeeStartValue.
momentum(), perigeeStartValue.
charge(),
359 std::unique_ptr<Trk::Track> fittedTrack(
fitter->
fit(ctx, measurementSet, *perigee,
false, particleHypothesis));
361 if (!
checkTrack(
"fitInterface2", fittedTrack.get())) {
return nullptr; }
372 ATH_MSG_VERBOSE(
" perform spectrometer error optimization after cleaning ");
373 std::unique_ptr<Trk::Track> optimizedTrack =
m_muonErrorOptimizer->optimiseErrors(*fittedTrack, ctx);
374 if (
checkTrack(
"fitInterface2Opt", optimizedTrack.get())) {
375 fittedTrack.swap(optimizedTrack);
385 ATH_MSG_VERBOSE(__FILE__<<
":"<<__LINE__<<
" perform track cleaning... ");
389 std::unique_ptr<Trk::Track> cleanTrack =
m_cleaner->clean(*fittedTrack, ctx);
393 if (!
checkTrack(
"fitInterface2Cleaner", cleanTrack.get())) { cleanTrack.reset(); }
401 ATH_MSG_DEBUG(
" keep original extension track despite cleaner veto ");
405 if (chi2After <
m_badFitChi2 || chi2After < chi2Before) {
407 fittedTrack.swap(cleanTrack);
427 std::stringstream
ss;
428 ss << particleHypothesis;
460 <<
m_printer->print(indetTrack) << std::endl
463 std::unique_ptr<Trk::Track> fittedTrack(
fitter->
fit(ctx, indetTrack, extrapolatedTrack,
false, particleHypothesis));
465 if (!fittedTrack)
return nullptr;
472 ATH_MSG_VERBOSE(
" perform spectrometer error optimization after cleaning ");
473 std::unique_ptr<Trk::Track> optimizedTrack =
m_muonErrorOptimizer->optimiseErrors(*fittedTrack, ctx);
474 if (
checkTrack(
"Error opt", optimizedTrack.get()) &&
476 fittedTrack.swap(optimizedTrack);
485 ATH_MSG_VERBOSE(__FILE__<<
":"<<__LINE__<<
" perform track cleaning... " <<
m_printer->print(*fittedTrack) << std::endl
486 <<
m_printer->printStations(*fittedTrack));
489 std::unique_ptr<Trk::Track> cleanTrack =
m_cleaner->clean(*fittedTrack, ctx);
498 ATH_MSG_DEBUG(
" keep original combined track despite cleaner veto ");
502 if (chi2After <
m_badFitChi2 || chi2After < chi2Before) {
504 fittedTrack.swap(cleanTrack);
519 double chi2 = 999999.;
520 if (
track.fitQuality()) {
521 if (
track.fitQuality()->numberDoF()) {
522 chi2 =
track.fitQuality()->chiSquared() /
track.fitQuality()->doubleNumberDoF();
533 if (!fieldCondObj.isValid()) {
537 fieldCondObj->getInitializedCache(fieldCache);
545 muonSummary =
summary->muonTrackSummary();
549 muonSummary =
summary->muonTrackSummary();
552 if (!muonSummary)
return false;
555 unsigned int optimize{0},nBarrel{0}, nEndcap{0}, nSmall{0}, nLarge{0};
560 if (!isMdt)
continue;
579 if (nBarrel > 0 && nEndcap > 0) { optimize += 10; }
581 if (nSmall > 0 && nLarge > 0) { optimize += 100; }
583 if (optimize > 0) {
ATH_MSG_DEBUG(
" OptimizeErrors with value " << optimize); }
589 if (!newTrack)
return false;
595 if ((*it)->position().dot((*it)->momentum()) < 0) {
597 ATH_MSG_DEBUG(txt <<
" "<< __FILE__<<
":"<<__LINE__<<
" ALARM position " << (*it)->position() <<
" direction " << (*it)->momentum().unit());
599 ATH_MSG_DEBUG(txt <<
" "<< __FILE__<<
":"<<__LINE__<<
" OK position " << (*it)->position() <<
" direction " << (*it)->momentum().unit());
603 if (!
par->covariance()) {
continue; }
605 ATH_MSG_DEBUG(txt<<
" "<<__FILE__<<
":"<<__LINE__<<
"covariance matrix has negative diagonal element, killing track "
610 unsigned int numberMS{0}, numberMSPrec{0};
614 for (;
r != rEnd; ++
r) {
616 if (tsos->trackParameters() &&
m_calorimeterVolume->inside(tsos->trackParameters()->position()))
break;
618 if (tsos->measurementOnTrack()) {
625 ATH_MSG_VERBOSE( txt<<
" "<<__FILE__<<
":"<<__LINE__<<
" "<< numberMS <<
"/"<< numberMSPrec<<
" fitted MS measurements ");
627 if (numberMS < 5 || numberMSPrec < 3) {
636 unsigned int naeots = 0;
643 for (
const auto*
m : *trackTSOS) {
644 if (
m &&
m->alignmentEffectsOnTrack()) naeots++;
652 int tsos{0}, nperigee{0};
661 if (
it->trackParameters()) {
663 <<
" r " <<
it->trackParameters()->position().perp() <<
" z "
664 <<
it->trackParameters()->position().z() <<
" momentum "
665 <<
it->trackParameters()->momentum().mag());
666 }
else if (
it->measurementOnTrack()) {
668 <<
" r " <<
it->measurementOnTrack()->associatedSurface().center().perp() <<
" z "
669 <<
it->measurementOnTrack()->associatedSurface().center().z());
670 }
else if (
it->materialEffectsOnTrack()) {
673 <<
it->materialEffectsOnTrack()->associatedSurface().globalReferencePoint().perp()
674 <<
" z " <<
it->materialEffectsOnTrack()->associatedSurface().globalReferencePoint().z());