ATLAS Offline Software
Loading...
Searching...
No Matches
Rec::CombinedMuonTrackFitter Class Reference

#include <CombinedMuonTrackFitter.h>

Inheritance diagram for Rec::CombinedMuonTrackFitter:
Collaboration diagram for Rec::CombinedMuonTrackFitter:

Public Member Functions

virtual ~CombinedMuonTrackFitter ()
virtual StatusCode initialize () override
virtual StatusCode finalize () override
virtual std::unique_ptr< Trk::Trackfit (const EventContext &ctx, const Trk::Track &track, const Trk::RunOutlierRemoval runOutlier, const Trk::ParticleHypothesis particleHypothesis) const override

Protected Member Functions

std::unique_ptr< Trk::Trackfit (const EventContext &ctx, const Trk::MeasurementSet &measurementSet, const Trk::TrackParameters &perigeeStartValue, const Trk::RunOutlierRemoval runOutlier, const Trk::ParticleHypothesis particleHypothesis) const
 fit a set of MeasurementBase objects with starting value for perigeeParameters
std::unique_ptr< Trk::Trackfit (const EventContext &ctx, const Trk::Track &indetTrack, Trk::Track &extrapolatedTrack, const Trk::RunOutlierRemoval runOutlier, const Trk::ParticleHypothesis particleHypothesis) const
 combined muon fit
double normalizedChi2 (const Trk::Track &track) const
bool checkTrack (std::string_view txt, const Trk::Track *newTrack) const
unsigned int countAEOTs (const Trk::Track &track, const std::string &txt) const
bool loadMagneticField (const EventContext &ctx, MagField::AtlasFieldCache &field_cache) const

Protected Attributes

ToolHandle< Rec::IMuidCaloTrackStateOnSurfacem_caloTSOS
ToolHandle< Muon::IMuonErrorOptimisationToolm_muonErrorOptimizer
PublicToolHandle< Muon::MuonEDMPrinterToolm_printer
ToolHandle< Rec::IMuonTrackQuerym_trackQuery
ToolHandle< Trk::ITrackSummaryToolm_trackSummary
ToolHandle< Trk::ITrkMaterialProviderToolm_materialUpdator
ServiceHandle< Muon::IMuonIdHelperSvcm_idHelperSvc {this, "MuonIdHelperSvc", "Muon::MuonIdHelperSvc/MuonIdHelperSvc"}
Gaudi::Property< double > m_badFitChi2 {this, "BadFitChi2", 2.5}
Gaudi::Property< double > m_zECToroid {this, "zECToroid", 10. * Gaudi::Units::meter}
Gaudi::Property< bool > m_updateWithCaloTG {this, "UpdateWithCaloTG", false}
Gaudi::Property< bool > m_useCaloTG {this, "UseCaloTG", false}
std::unique_ptr< const Trk::Volumem_indetVolume {nullptr}
std::unique_ptr< const Trk::Volumem_calorimeterVolume {nullptr}
std::unique_ptr< MessageHelperm_messageHelper {std::make_unique<MessageHelper>(*this, 50)}

Private Member Functions

bool optimizeErrors (const EventContext &ctx, Trk::Track &track) const

Private Attributes

ToolHandle< Muon::IMuonTrackCleanerm_cleaner
ToolHandle< Trk::ITrackFitterm_fitter
ToolHandle< Trk::ITrackFitterm_fitterSL
SG::ReadCondHandleKey< AtlasFieldCacheCondObjm_fieldCacheCondObjInputKey
ServiceHandle< Trk::ITrackingVolumesSvcm_trackingVolumesSvc {this, "TrackingVolumesSvc", "Trk::TrackingVolumesSvc/TrackingVolumesSvc"}
Gaudi::Property< bool > m_allowCleanerVeto {this, "AllowCleanerVeto", true}
Gaudi::Property< unsigned > m_maxWarnings
std::atomic_uint m_countCombinedCleanerVeto {0}
std::atomic_uint m_countExtensionCleanerVeto {0}
std::atomic_uint m_countStandaloneCleanerVeto {0}

Detailed Description

Definition at line 43 of file CombinedMuonTrackFitter.h.

Constructor & Destructor Documentation

◆ ~CombinedMuonTrackFitter()

Rec::CombinedMuonTrackFitter::~CombinedMuonTrackFitter ( )
virtualdefault

Member Function Documentation

◆ checkTrack()

bool Rec::CombinedMuonTrackFitter::checkTrack ( std::string_view txt,
const Trk::Track * newTrack ) const
protected

Check that the combined track contains enough MS measurements

Definition at line 588 of file CombinedMuonTrackFitter.cxx.

588 {
589 if (!newTrack) return false;
590
591 const DataVector<const Trk::TrackParameters>* pars = newTrack->trackParameters();
592 if (!pars || pars->empty() || !newTrack->fitQuality()) { return false; }
594
595 if ((*it)->position().dot((*it)->momentum()) < 0) {
596 return false;
597 ATH_MSG_DEBUG(txt <<" "<< __FILE__<<":"<<__LINE__<< " ALARM position " << (*it)->position() << " direction " << (*it)->momentum().unit());
598 } else {
599 ATH_MSG_DEBUG(txt <<" "<< __FILE__<<":"<<__LINE__<< " OK position " << (*it)->position() << " direction " << (*it)->momentum().unit());
600 }
601
602 for (const Trk::TrackParameters* par : *pars) {
603 if (!par->covariance()) { continue; }
604 if (!Amg::hasPositiveDiagElems(*par->covariance())) {
605 ATH_MSG_DEBUG(txt<<" "<<__FILE__<<":"<<__LINE__<< "covariance matrix has negative diagonal element, killing track "
606 <<std::endl<<Amg::toString(*par->covariance()));
607 return false;
608 }
609 }
610 unsigned int numberMS{0}, numberMSPrec{0};
614 for (; r != rEnd; ++r) {
615 const Trk::TrackStateOnSurface* tsos{*r};
616 if (tsos->trackParameters() && m_calorimeterVolume->inside(tsos->trackParameters()->position())) break;
617
618 if (tsos->measurementOnTrack()) {
619 ++numberMS;
620 const Trk::RIO_OnTrack* rot = dynamic_cast<const Trk::RIO_OnTrack*>(tsos->measurementOnTrack());
621 numberMSPrec+= rot && !m_idHelperSvc->measuresPhi(rot->identify());
622 }
623 }
624
625 ATH_MSG_VERBOSE( txt<< " "<<__FILE__<<":"<<__LINE__<<" "<< numberMS << "/"<< numberMSPrec<< " fitted MS measurements ");
626 // reject with insufficient MS measurements
627 if (numberMS < 5 || numberMSPrec < 3) {
628 return false;
629 }
630
631 return true;
632 }
#define ATH_MSG_VERBOSE(x)
#define ATH_MSG_DEBUG(x)
DataModel_detail::const_iterator< DataVector > const_iterator
Standard const_iterator.
Definition DataVector.h:838
const_reverse_iterator rend() const noexcept
Return a const_reverse_iterator pointing at the beginning of the collection.
const_reverse_iterator rbegin() const noexcept
Return a const_reverse_iterator pointing past the end of the collection.
std::reverse_iterator< const_iterator > const_reverse_iterator
Definition DataVector.h:847
ServiceHandle< Muon::IMuonIdHelperSvc > m_idHelperSvc
std::unique_ptr< const Trk::Volume > m_calorimeterVolume
const Amg::Vector3D & position() const
Access method for the position.
Identifier identify() const
return the identifier -extends MeasurementBase
const MeasurementBase * measurementOnTrack() const
returns MeasurementBase const overload
const TrackParameters * trackParameters() const
return ptr to trackparameters const overload
const Trk::TrackStates * trackStateOnSurfaces() const
return a pointer to a const DataVector of const TrackStateOnSurfaces.
const DataVector< const TrackParameters > * trackParameters() const
Return a pointer to a vector of TrackParameters.
const FitQuality * fitQuality() const
return a pointer to the fit quality const-overload
int r
Definition globals.cxx:22
std::string toString(const Translation3D &translation, int precision=4)
GeoPrimitvesToStringConverter.
bool hasPositiveDiagElems(const AmgSymMatrix(N) &mat)
Returns true if all diagonal elements of the covariance matrix are finite aka sane in the above defin...
ParametersBase< TrackParametersDim, Charged > TrackParameters

◆ countAEOTs()

unsigned int Rec::CombinedMuonTrackFitter::countAEOTs ( const Trk::Track & track,
const std::string & txt ) const
protected

Definition at line 634 of file CombinedMuonTrackFitter.cxx.

634 {
635 const Trk::TrackStates* trackTSOS = track.trackStateOnSurfaces();
636 unsigned int naeots = 0;
637
638 if (!trackTSOS){
639 ATH_MSG_ERROR("No trackStateOnSurfaces");
640 return naeots;
641 }
642
643 for (const auto* m : *trackTSOS) {
644 if (m && m->alignmentEffectsOnTrack()) naeots++;
645 }
646
647 ATH_MSG_DEBUG(" count AEOTs " << txt << " " << naeots);
648
649 // add VEBOSE for checking TSOS order
650
651
652 int tsos{0}, nperigee{0};
653 for ( const Trk::TrackStateOnSurface* it : *trackTSOS) {
654 tsos++;
655
657 ATH_MSG_DEBUG("perigee");
658 nperigee++;
659 }
660
661 if (it->trackParameters()) {
662 ATH_MSG_VERBOSE(" check tsos " << tsos << " TSOS tp "
663 << " r " << it->trackParameters()->position().perp() << " z "
664 << it->trackParameters()->position().z() << " momentum "
665 << it->trackParameters()->momentum().mag());
666 } else if (it->measurementOnTrack()) {
667 ATH_MSG_VERBOSE(" check tsos " << tsos << " TSOS mst "
668 << " r " << it->measurementOnTrack()->associatedSurface().center().perp() << " z "
669 << it->measurementOnTrack()->associatedSurface().center().z());
670 } else if (it->materialEffectsOnTrack()) {
671 ATH_MSG_VERBOSE(" check tsos " << tsos << " TSOS mat "
672 << " r "
673 << it->materialEffectsOnTrack()->associatedSurface().globalReferencePoint().perp()
674 << " z " << it->materialEffectsOnTrack()->associatedSurface().globalReferencePoint().z());
675 } else {
676 ATH_MSG_VERBOSE(" check tsos other than above " << tsos);
677 }
678 }
679
680 ATH_MSG_VERBOSE(" track with number of TSOS perigees " << nperigee);
681
682 return naeots;
683 }
#define ATH_MSG_ERROR(x)
@ Perigee
This represents a perigee, and so will contain a Perigee object only.
DataVector< const Trk::TrackStateOnSurface > TrackStates

◆ finalize()

StatusCode Rec::CombinedMuonTrackFitter::finalize ( )
overridevirtual

Reimplemented in Rec::CombinedMuonTrackBuilder.

Definition at line 139 of file CombinedMuonTrackFitter.cxx.

139 {
140 ATH_MSG_INFO("Finalizing CombinedMuonTrackFitter:"
141 << m_countStandaloneCleanerVeto << " standalone fits with cleaner veto" << endmsg << " "
142 << m_countExtensionCleanerVeto << " extension fits with cleaner veto" << endmsg << " "
143 << m_countCombinedCleanerVeto << " combined fits with cleaner veto");
144 // // summarize WARNINGs
145 m_messageHelper->printSummary();
146 return StatusCode::SUCCESS;
147 }
#define endmsg
#define ATH_MSG_INFO(x)
std::unique_ptr< MessageHelper > m_messageHelper

◆ fit() [1/3]

std::unique_ptr< Trk::Track > Rec::CombinedMuonTrackFitter::fit ( const EventContext & ctx,
const Trk::MeasurementSet & measurementSet,
const Trk::TrackParameters & perigeeStartValue,
const Trk::RunOutlierRemoval runOutlier,
const Trk::ParticleHypothesis particleHypothesis ) const
protected

fit a set of MeasurementBase objects with starting value for perigeeParameters

Definition at line 317 of file CombinedMuonTrackFitter.cxx.

320 {
321 // check valid particleHypothesis
322 if (particleHypothesis != Trk::muon && particleHypothesis != Trk::nonInteracting) {
323 // invalid particle hypothesis
324 std::stringstream ss;
325 ss << particleHypothesis;
326 m_messageHelper->printWarning(31, ss.str());
327 return nullptr;
328 }
329
330 // select straightLine fitter when magnets downstream of leading measurement are off
331 MagField::AtlasFieldCache fieldCache;
332 // Get field cache object
333 if (!loadMagneticField(ctx, fieldCache)) return nullptr;
334
335 const Trk::ITrackFitter* fitter = m_fitter.get();
336 if (!fieldCache.toroidOn() || std::abs(perigeeStartValue.position().z()) > m_zECToroid) {
337 fitter = m_fitterSL.get();
338 ATH_MSG_VERBOSE(" fit (track refit method): select SL fitter ");
339 }
340
341 // redo ROTs: ID, CROT and MDT specific treatments
342 // if (m_redoRots) redoRots(track);
343
344 // calo association (if relevant)
345
346 // create Perigee if starting parameters given for a different surface type
347 std::unique_ptr<Trk::TrackParameters> perigee = perigeeStartValue.uniqueClone();
348 std::unique_ptr<Trk::PerigeeSurface> perigeeSurface;
349
350 if (perigee->surfaceType() != Trk::SurfaceType::Perigee) {
351 Amg::Vector3D origin(perigeeStartValue.position());
352 perigeeSurface = std::make_unique<Trk::PerigeeSurface>(origin);
353
354 perigee = std::make_unique<Trk::Perigee>(perigeeStartValue.position(), perigeeStartValue.momentum(), perigeeStartValue.charge(),
355 *perigeeSurface);
356 }
357
358 // FIT
359 std::unique_ptr<Trk::Track> fittedTrack(fitter->fit(ctx, measurementSet, *perigee, false, particleHypothesis));
360
361 if (!checkTrack("fitInterface2", fittedTrack.get())) { return nullptr; }
362
363 // eventually this whole tool will use unique_ptrs
364 // in the meantime, this allows the MuonErrorOptimisationTool and MuonRefitTool to use them
365
366 // track cleaning
367 if (runOutlier) {
368 // fit with optimized spectrometer errors
369
370 if (!m_muonErrorOptimizer.empty() && !fittedTrack->info().trackProperties(Trk::TrackInfo::StraightTrack) &&
371 optimizeErrors(ctx, *fittedTrack)) {
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);
376 if (msgLevel(MSG::DEBUG)) countAEOTs(*fittedTrack, " fit mstSet scaled errors Track ");
377 }
378
379 }
380
381 // chi2 before clean
382 double chi2Before = normalizedChi2(*fittedTrack);
383
384 // muon cleaner
385 ATH_MSG_VERBOSE(__FILE__<<":"<<__LINE__<<" perform track cleaning... ");
386
387 if (msgLevel(MSG::DEBUG)) countAEOTs(*fittedTrack, " fit mstSet before cleaning ");
388
389 std::unique_ptr<Trk::Track> cleanTrack = m_cleaner->clean(*fittedTrack, ctx);
390
391 if (msgLevel(MSG::DEBUG)) countAEOTs(*cleanTrack, " fit mstSet clean Track ");
392
393 if (!checkTrack("fitInterface2Cleaner", cleanTrack.get())) { cleanTrack.reset(); }
394
395 if (!cleanTrack) {
396 if (m_allowCleanerVeto && chi2Before > m_badFitChi2) {
397 ATH_MSG_DEBUG(" cleaner veto B");
399 fittedTrack.reset();
400 } else {
401 ATH_MSG_DEBUG(" keep original extension track despite cleaner veto ");
402 }
403 } else if (!(*cleanTrack->perigeeParameters() == *fittedTrack->perigeeParameters())) {
404 double chi2After = normalizedChi2(*cleanTrack);
405 if (chi2After < m_badFitChi2 || chi2After < chi2Before) {
406 ATH_MSG_VERBOSE(" found and removed spectrometer outlier(s) ");
407 fittedTrack.swap(cleanTrack);
408 } else {
409 ATH_MSG_VERBOSE(" keep original track despite cleaning ");
410 }
411 }
412
413 // FIXME: provide indet cleaner
414 ATH_MSG_VERBOSE(" Finished cleaning");
415 }
416 // have to use release until the whole code uses unique_ptr
417 return fittedTrack;
418 }
static Double_t ss
bool fit(const LArSamples::AbsShape &data, const AbsShape &reference, double &k, double &deltaT, double &chi2, const ScaledErrorData *sed=0) const
ToolHandle< Muon::IMuonErrorOptimisationTool > m_muonErrorOptimizer
bool optimizeErrors(const EventContext &ctx, Trk::Track &track) const
Gaudi::Property< double > m_badFitChi2
Gaudi::Property< double > m_zECToroid
ToolHandle< Muon::IMuonTrackCleaner > m_cleaner
ToolHandle< Trk::ITrackFitter > m_fitterSL
double normalizedChi2(const Trk::Track &track) const
unsigned int countAEOTs(const Trk::Track &track, const std::string &txt) const
bool checkTrack(std::string_view txt, const Trk::Track *newTrack) const
ToolHandle< Trk::ITrackFitter > m_fitter
bool loadMagneticField(const EventContext &ctx, MagField::AtlasFieldCache &field_cache) const
Gaudi::Property< bool > m_allowCleanerVeto
const Amg::Vector3D & momentum() const
Access method for the momentum.
double charge() const
Returns the charge.
std::unique_ptr< ParametersBase< DIM, T > > uniqueClone() const
clone method for polymorphic deep copy returning unique_ptr; it is not overriden, but uses the existi...
Eigen::Matrix< double, 3, 1 > Vector3D
const ShapeFitter * fitter

◆ fit() [2/3]

std::unique_ptr< Trk::Track > Rec::CombinedMuonTrackFitter::fit ( const EventContext & ctx,
const Trk::Track & indetTrack,
Trk::Track & extrapolatedTrack,
const Trk::RunOutlierRemoval runOutlier,
const Trk::ParticleHypothesis particleHypothesis ) const
protected

combined muon fit

Definition at line 421 of file CombinedMuonTrackFitter.cxx.

423 {
424 // check valid particleHypothesis
425 if (particleHypothesis != Trk::muon && particleHypothesis != Trk::nonInteracting) {
426 // invalid particle hypothesis
427 std::stringstream ss;
428 ss << particleHypothesis;
429 m_messageHelper->printWarning(32, ss.str());
430 return nullptr;
431 }
432
433 // select straightLine fitter when solenoid and toroid are off
434 const Trk::ITrackFitter* fitter = m_fitter.get();
435 MagField::AtlasFieldCache fieldCache;
436 // Get field cache object
437 if (!loadMagneticField(ctx, fieldCache)) return nullptr;
438
439 if (!fieldCache.toroidOn() && !fieldCache.solenoidOn()) {
440 fitter = m_fitterSL.get();
441 ATH_MSG_VERBOSE(" fit (combined muon fit method): select SL fitter ");
442 }
443
444 // redo ROTs: ID, CROT and MDT specific treatments
445
446 // calo association (for now just WARN if missing)
447 if (particleHypothesis == Trk::muon && !m_trackQuery->isCaloAssociated(extrapolatedTrack, ctx)) {
448 // combined muon track is missing the TSOS's describing calorimeter association
449 m_messageHelper->printWarning(33);
450 }
451
452 // Updates the calo TSOS with the ones from TG+corrections
453 if (m_updateWithCaloTG && !m_useCaloTG && particleHypothesis == Trk::muon) {
454 ATH_MSG_VERBOSE("Updating Calorimeter TSOS in Muon Combined Fit ...");
455 m_materialUpdator->updateCaloTSOS(indetTrack, extrapolatedTrack);
456 }
457
458 // FIT
459 ATH_MSG_VERBOSE(" perform combined fit... " << std::endl
460 << m_printer->print(indetTrack) << std::endl
461 << m_printer->print(extrapolatedTrack));
462
463 std::unique_ptr<Trk::Track> fittedTrack(fitter->fit(ctx, indetTrack, extrapolatedTrack, false, particleHypothesis));
464
465 if (!fittedTrack) return nullptr;
466 // track cleaning
467 if (runOutlier) {
468 // fit with optimized spectrometer errors
469
470 if (!m_muonErrorOptimizer.empty() && !fittedTrack->info().trackProperties(Trk::TrackInfo::StraightTrack) &&
471 optimizeErrors(ctx, *fittedTrack)) {
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()) &&
475 normalizedChi2(*optimizedTrack) < normalizedChi2(*fittedTrack)) {
476 fittedTrack.swap(optimizedTrack);
477 if (msgLevel(MSG::DEBUG)) countAEOTs(*fittedTrack, " cbfit scaled errors Track ");
478 }
479 }
480
481 // chi2 before clean
482 double chi2Before = normalizedChi2(*fittedTrack);
483
484 // muon cleaner
485 ATH_MSG_VERBOSE(__FILE__<<":"<<__LINE__<<" perform track cleaning... " << m_printer->print(*fittedTrack) << std::endl
486 << m_printer->printStations(*fittedTrack));
487
488 if (msgLevel(MSG::DEBUG)) { countAEOTs(*fittedTrack, " cb before clean Track "); }
489 std::unique_ptr<Trk::Track> cleanTrack = m_cleaner->clean(*fittedTrack, ctx);
490 if (cleanTrack && msgLevel(MSG::DEBUG)) { countAEOTs(*cleanTrack, " cb after clean Track "); }
491
492 if (!cleanTrack) {
493 if (m_allowCleanerVeto && chi2Before > m_badFitChi2) {
494 ATH_MSG_DEBUG("cleaner veto C "<<chi2Before<<" Cut: "<<m_badFitChi2);
496 fittedTrack.reset();
497 } else {
498 ATH_MSG_DEBUG(" keep original combined track despite cleaner veto ");
499 }
500 } else if (!(*cleanTrack->perigeeParameters() == *fittedTrack->perigeeParameters())) {
501 double chi2After = normalizedChi2(*cleanTrack);
502 if (chi2After < m_badFitChi2 || chi2After < chi2Before) {
503 ATH_MSG_VERBOSE(" found and removed spectrometer outlier(s) ");
504 fittedTrack.swap(cleanTrack);
505 } else {
506 ATH_MSG_VERBOSE(" keep original track despite cleaning ");
507 }
508 }
509
510 // FIXME: provide indet cleaner
511 ATH_MSG_VERBOSE(" finished cleaning");
512 }
513 // have to use release until the whole code uses unique_ptr
514 return fittedTrack;
515 }
bool solenoidOn() const
status of the magnets
ToolHandle< Trk::ITrkMaterialProviderTool > m_materialUpdator
PublicToolHandle< Muon::MuonEDMPrinterTool > m_printer
Gaudi::Property< bool > m_updateWithCaloTG
ToolHandle< Rec::IMuonTrackQuery > m_trackQuery

◆ fit() [3/3]

std::unique_ptr< Trk::Track > Rec::CombinedMuonTrackFitter::fit ( const EventContext & ctx,
const Trk::Track & track,
const Trk::RunOutlierRemoval runOutlier,
const Trk::ParticleHypothesis particleHypothesis ) const
overridevirtual

Definition at line 148 of file CombinedMuonTrackFitter.cxx.

150 {
151 ATH_MSG_VERBOSE(" fit() " << m_printer->print(track) << std::endl
152 << m_printer->printMeasurements(track) << std::endl
153 << m_printer->printStations(track));
154 // check valid particleHypothesis
155 if (particleHypothesis != Trk::muon && particleHypothesis != Trk::nonInteracting) {
156 // invalid particle hypothesis
157 std::stringstream ss;
158 ss << particleHypothesis;
159 m_messageHelper->printWarning(29, ss.str());
160 return nullptr;
161 }
162
163 // check if combined or subsystem track
164 bool isCombined = m_trackQuery->isCombined(track, ctx);
165 // select straightLine fitter when magnets downstream of leading measurement are off
166 const Trk::ITrackFitter* fitter = m_fitter.get();
167 MagField::AtlasFieldCache fieldCache;
168 // Get field cache object
169
170 if (!loadMagneticField(ctx, fieldCache)) return nullptr;
171
172 if (!fieldCache.toroidOn() && !(isCombined && fieldCache.solenoidOn())) {
173 fitter = m_fitterSL.get();
174 ATH_MSG_VERBOSE(" fit (track refit method): select SL fitter ");
175 }
176
177 // redo ROTs: ID, CROT and MDT specific treatments
178 // if (m_redoRots) redoRots(track);
179
180 // perform fit after ensuring calo is associated for combined tracks
181 // calo association for combined tracks (WARN if missing from input)
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 // about to add the TSOS's describing calorimeter association to a combined muon;
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 // run-2 schema, update default eloss with parametrised value
193 if (m_useCaloTG) {
194 ATH_MSG_VERBOSE("Updating Calorimeter TSOS in Muon Combined (re)Fit ...");
195 m_materialUpdator->updateCaloTSOS(*fittedTrack);
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));
209 const Trk::TrackParameters* parameters = combinedTSOS->back()->trackParameters();
210 if (in_tsos->type(Trk::TrackStateOnSurface::CaloDeposit)) {
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 // Updates the calo TSOS with the ones from TG+corrections
233 if (m_updateWithCaloTG && !m_useCaloTG && particleHypothesis == Trk::muon) {
234 ATH_MSG_VERBOSE("Updating Calorimeter TSOS in Muon Combined (re)Fit ...");
235 m_materialUpdator->updateCaloTSOS(*combinedTrack);
236 }
237 // FIT
238 fittedTrack = fitter->fit(ctx, *combinedTrack, false, particleHypothesis);
239 } else {
240 // Updates the calo TSOS with the ones from TG+corrections
241 if (m_updateWithCaloTG && !m_useCaloTG && particleHypothesis == Trk::muon) {
242 ATH_MSG_VERBOSE("Updating Calorimeter TSOS in Muon Standalone Fit ...");
243 m_materialUpdator->updateCaloTSOS(*fittedTrack);
244 }
245
246 // FIT
247 fittedTrack = fitter->fit(ctx, *fittedTrack, false, particleHypothesis);
248 }
249
250 // quit if fit has failed
251 if (!fittedTrack) return nullptr;
252
253
254 if (!checkTrack("fitInterface1", fittedTrack.get())) return nullptr;
255
256
257 // eventually this whole tool will use unique_ptrs
258 // in the meantime, this allows the MuonErrorOptimisationTool and MuonRefitTool to use them
259 // track cleaning
260 if (runOutlier) {
261 // fit with optimized spectrometer errors
262
263 const double chi2BeforeOptimizer = normalizedChi2(*fittedTrack);
264 if (!m_muonErrorOptimizer.empty() && !fittedTrack->info().trackProperties(Trk::TrackInfo::StraightTrack) &&
265 optimizeErrors(ctx, *fittedTrack)) {
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 // chi2 before clean
275 const double chi2Before = normalizedChi2(*fittedTrack);
276
277 // muon cleaner
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) {
290 if (m_allowCleanerVeto && chi2Before > m_badFitChi2) {
291 ATH_MSG_DEBUG(" cleaner veto A "<<chi2Before<<" "<<m_badFitChi2<<" "<<m_printer->printMeasurements(*fittedTrack) );
293 fittedTrack.reset();
294 } else {
295 ATH_MSG_DEBUG(" keep original standalone track despite cleaner veto ");
296 }
297 } else if (!(*cleanTrack->perigeeParameters() == *fittedTrack->perigeeParameters())) {
298 double chi2After = normalizedChi2(*cleanTrack);
299
300 if (chi2After < m_badFitChi2 || chi2After < chi2Before) {
301 ATH_MSG_VERBOSE(" found and removed spectrometer outlier(s) ");
302 fittedTrack.swap(cleanTrack);
303 } else {
304 ATH_MSG_VERBOSE(" keep original track despite cleaning ");
305 }
306 }
307
308 // FIXME: provide indet cleaner
309 if (fittedTrack) {
310 ATH_MSG_VERBOSE(" finished track cleaning... " << m_printer->print(*fittedTrack) << std::endl
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)
Definition XYZtrp.cxx:113

◆ initialize()

StatusCode Rec::CombinedMuonTrackFitter::initialize ( )
overridevirtual

Reimplemented in Rec::CombinedMuonTrackBuilder.

Definition at line 50 of file CombinedMuonTrackFitter.cxx.

50 {
51 ATH_MSG_DEBUG("Initializing CombinedMuonTrackFitter.");
52 ATH_MSG_DEBUG(" with options: ");
53
54 if (m_allowCleanerVeto) ATH_MSG_DEBUG(" AllowCleanerVeto");
55 if (!m_muonErrorOptimizer.empty()) ATH_MSG_DEBUG(" ErrorOptimisation");
56
57 // fill WARNING messages
58 m_messageHelper->setMaxNumberOfMessagesPrinted(m_maxWarnings);
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");
73 m_messageHelper->setMessage(14, "standaloneRefit:: no inner material");
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");
81 m_messageHelper->setMessage(22, "standaloneRefit:: no outer material");
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");
106 m_messageHelper->setMessage(47, "reallocateMaterial:: refit fails");
107 m_messageHelper->setMessage(48, "standaloneFit:: insufficient measurements on input spectrometer track");
108 m_messageHelper->setMessage(49, "standaloneFit:: inconsistent TSOS on input spectrometer track");
109
110 ATH_CHECK(m_printer.retrieve());
112 ATH_MSG_DEBUG("Setup handle for key " << m_fieldCacheCondObjInputKey);
113 ATH_CHECK(m_muonErrorOptimizer.retrieve(DisableTool{m_muonErrorOptimizer.empty()}));
114
115 ATH_CHECK(m_caloTSOS.retrieve());
116 ATH_MSG_DEBUG("Retrieved tool " << m_caloTSOS);
117 ATH_CHECK(m_cleaner.retrieve());
118 ATH_MSG_DEBUG("Retrieved tool " << m_cleaner);
119
120 ATH_CHECK(m_fitter.retrieve());
121 ATH_CHECK(m_fitterSL.retrieve());
122 ATH_CHECK(m_idHelperSvc.retrieve());
123
125 ATH_MSG_DEBUG("Retrieved Svc " << m_trackingVolumesSvc);
128
129 ATH_CHECK(m_trackQuery.retrieve());
130 ATH_MSG_DEBUG("Retrieved tool " << m_trackQuery);
131 ATH_CHECK(m_trackSummary.retrieve());
132 ATH_MSG_DEBUG("Retrieved tool " << m_trackSummary);
133 ATH_CHECK(m_materialUpdator.retrieve());
134 ATH_MSG_DEBUG("Retrieved tool " << m_materialUpdator);
135
136 return StatusCode::SUCCESS;
137 }
#define ATH_CHECK
Evaluate an expression and check for errors.
SG::ReadCondHandleKey< AtlasFieldCacheCondObj > m_fieldCacheCondObjInputKey
Gaudi::Property< unsigned > m_maxWarnings
ServiceHandle< Trk::ITrackingVolumesSvc > m_trackingVolumesSvc
ToolHandle< Trk::ITrackSummaryTool > m_trackSummary
@ CalorimeterEntryLayer
Tracking Volume which defines the entrance srufaces of the calorimeter.
@ MuonSpectrometerEntryLayer
Tracking Volume which defines the entrance surfaces of the MS.

◆ loadMagneticField()

bool Rec::CombinedMuonTrackFitter::loadMagneticField ( const EventContext & ctx,
MagField::AtlasFieldCache & field_cache ) const
protected

Definition at line 531 of file CombinedMuonTrackFitter.cxx.

531 {
532 SG::ReadCondHandle<AtlasFieldCacheCondObj> fieldCondObj{m_fieldCacheCondObjInputKey, ctx};
533 if (!fieldCondObj.isValid()) {
534 ATH_MSG_ERROR("Failed to retrieve AtlasFieldCacheCondObj with key " << m_fieldCacheCondObjInputKey.key());
535 return false;
536 }
537 fieldCondObj->getInitializedCache(fieldCache);
538 return true;
539 }

◆ normalizedChi2()

double Rec::CombinedMuonTrackFitter::normalizedChi2 ( const Trk::Track & track) const
protected

Definition at line 518 of file CombinedMuonTrackFitter.cxx.

518 {
519 double chi2 = 999999.;
520 if (track.fitQuality()) {
521 if (track.fitQuality()->numberDoF()) {
522 chi2 = track.fitQuality()->chiSquared() / track.fitQuality()->doubleNumberDoF();
523 } else {
525 }
526 }
527
528 return chi2;
529 }
double chi2(TH1 *h0, TH1 *h1)

◆ optimizeErrors()

bool Rec::CombinedMuonTrackFitter::optimizeErrors ( const EventContext & ctx,
Trk::Track & track ) const
private

Definition at line 540 of file CombinedMuonTrackFitter.cxx.

540 {
541 const Trk::MuonTrackSummary* muonSummary = nullptr;
542 const Trk::TrackSummary* summary = track.trackSummary();
543
544 if (summary) {
545 muonSummary = summary->muonTrackSummary();
546 } else {
547 m_trackSummary->updateTrack(ctx, track);
548 summary = track.trackSummary();
549 muonSummary = summary->muonTrackSummary();
550 }
551
552 if (!muonSummary) return false;
553
554
555 unsigned int optimize{0},nBarrel{0}, nEndcap{0}, nSmall{0}, nLarge{0};
556
557 for (const Trk::MuonTrackSummary::ChamberHitSummary& summary : muonSummary->chamberHitSummary()) {
558 const Identifier& id = summary.chamberId();
559 bool isMdt = m_idHelperSvc->isMdt(id);
560 if (!isMdt) continue;
561
562 using namespace Muon::MuonStationIndex;
563
564 const ChIndex chIdx = m_idHelperSvc->chamberIndex(id);
565 const bool isSmall = m_idHelperSvc->isSmallChamber(id);
566 nBarrel += isBarrel(chIdx);
567 nEndcap += !isBarrel(chIdx);
568 nSmall+= isSmall;
569 nLarge += !isSmall;
570
571 if (chIdx == ChIndex::BIS &&
572 std::abs(m_idHelperSvc->stationEta(id)) > 6) {
573 optimize = 2;
574 } else if (chIdx == ChIndex::BEE) {
575 optimize = 1;
576 }
577 }
578
579 if (nBarrel > 0 && nEndcap > 0) { optimize += 10; }
580
581 if (nSmall > 0 && nLarge > 0) { optimize += 100; }
582
583 if (optimize > 0) { ATH_MSG_DEBUG(" OptimizeErrors with value " << optimize); }
584
585 return optimize > 0;
586 }
const std::vector< ChamberHitSummary > & chamberHitSummary() const
access to the vector of chamber hit summaries on the track
bool isSmall(const ChIndex index)
Returns true if the chamber index is in a small sector.
ChIndex
enum to classify the different chamber layers in the muon spectrometer

Member Data Documentation

◆ m_allowCleanerVeto

Gaudi::Property<bool> Rec::CombinedMuonTrackFitter::m_allowCleanerVeto {this, "AllowCleanerVeto", true}
private

Definition at line 139 of file CombinedMuonTrackFitter.h.

139{this, "AllowCleanerVeto", true};

◆ m_badFitChi2

Gaudi::Property<double> Rec::CombinedMuonTrackFitter::m_badFitChi2 {this, "BadFitChi2", 2.5}
protected

Definition at line 144 of file CombinedMuonTrackFitter.h.

144{this, "BadFitChi2", 2.5};

◆ m_calorimeterVolume

std::unique_ptr<const Trk::Volume> Rec::CombinedMuonTrackFitter::m_calorimeterVolume {nullptr}
protected

Definition at line 152 of file CombinedMuonTrackFitter.h.

152{nullptr};

◆ m_caloTSOS

ToolHandle<Rec::IMuidCaloTrackStateOnSurface> Rec::CombinedMuonTrackFitter::m_caloTSOS
protected
Initial value:
{
this,
"CaloTSOS",
"",
}

Definition at line 99 of file CombinedMuonTrackFitter.h.

99 {
100 this,
101 "CaloTSOS",
102 "",
103 };

◆ m_cleaner

ToolHandle<Muon::IMuonTrackCleaner> Rec::CombinedMuonTrackFitter::m_cleaner
private
Initial value:
{
this,
"Cleaner",
"Muon::MuonTrackCleaner/MuidTrackCleaner",
}

Definition at line 82 of file CombinedMuonTrackFitter.h.

82 {
83 this,
84 "Cleaner",
85 "Muon::MuonTrackCleaner/MuidTrackCleaner",
86 };

◆ m_countCombinedCleanerVeto

std::atomic_uint Rec::CombinedMuonTrackFitter::m_countCombinedCleanerVeto {0}
mutableprivate

Definition at line 158 of file CombinedMuonTrackFitter.h.

158{0};

◆ m_countExtensionCleanerVeto

std::atomic_uint Rec::CombinedMuonTrackFitter::m_countExtensionCleanerVeto {0}
mutableprivate

Definition at line 159 of file CombinedMuonTrackFitter.h.

159{0};

◆ m_countStandaloneCleanerVeto

std::atomic_uint Rec::CombinedMuonTrackFitter::m_countStandaloneCleanerVeto {0}
mutableprivate

Definition at line 160 of file CombinedMuonTrackFitter.h.

160{0};

◆ m_fieldCacheCondObjInputKey

SG::ReadCondHandleKey<AtlasFieldCacheCondObj> Rec::CombinedMuonTrackFitter::m_fieldCacheCondObjInputKey
private
Initial value:
{this, "AtlasFieldCacheCondObj", "fieldCondObj",
"Name of the Magnetic Field conditions object key"}

Definition at line 133 of file CombinedMuonTrackFitter.h.

133 {this, "AtlasFieldCacheCondObj", "fieldCondObj",
134 "Name of the Magnetic Field conditions object key"};

◆ m_fitter

ToolHandle<Trk::ITrackFitter> Rec::CombinedMuonTrackFitter::m_fitter
private
Initial value:
{
this,
"Fitter",
"Trk::iPatFitter/iPatFitter",
}

Definition at line 87 of file CombinedMuonTrackFitter.h.

87 {
88 this,
89 "Fitter",
90 "Trk::iPatFitter/iPatFitter",
91 }; // curved track fitter

◆ m_fitterSL

ToolHandle<Trk::ITrackFitter> Rec::CombinedMuonTrackFitter::m_fitterSL
private
Initial value:
{
this,
"SLFitter",
"Trk::iPatFitter/iPatSLFitter",
}

Definition at line 92 of file CombinedMuonTrackFitter.h.

92 {
93 this,
94 "SLFitter",
95 "Trk::iPatFitter/iPatSLFitter",
96 }; // straight line fitter

◆ m_idHelperSvc

ServiceHandle<Muon::IMuonIdHelperSvc> Rec::CombinedMuonTrackFitter::m_idHelperSvc {this, "MuonIdHelperSvc", "Muon::MuonIdHelperSvc/MuonIdHelperSvc"}
protected

Definition at line 129 of file CombinedMuonTrackFitter.h.

129{this, "MuonIdHelperSvc", "Muon::MuonIdHelperSvc/MuonIdHelperSvc"};

◆ m_indetVolume

std::unique_ptr<const Trk::Volume> Rec::CombinedMuonTrackFitter::m_indetVolume {nullptr}
protected

Definition at line 151 of file CombinedMuonTrackFitter.h.

151{nullptr};

◆ m_materialUpdator

ToolHandle<Trk::ITrkMaterialProviderTool> Rec::CombinedMuonTrackFitter::m_materialUpdator
protected
Initial value:
{
this,
"CaloMaterialProvider",
"",
}

Definition at line 124 of file CombinedMuonTrackFitter.h.

124 {
125 this,
126 "CaloMaterialProvider",
127 "",
128 };

◆ m_maxWarnings

Gaudi::Property<unsigned> Rec::CombinedMuonTrackFitter::m_maxWarnings
private
Initial value:
{this, "MaxNumberOfWarnings", 10,
"Maximum number of permitted WARNING messages per message type."}

Definition at line 140 of file CombinedMuonTrackFitter.h.

140 {this, "MaxNumberOfWarnings", 10,
141 "Maximum number of permitted WARNING messages per message type."};

◆ m_messageHelper

std::unique_ptr<MessageHelper> Rec::CombinedMuonTrackFitter::m_messageHelper {std::make_unique<MessageHelper>(*this, 50)}
protected

Definition at line 155 of file CombinedMuonTrackFitter.h.

155{std::make_unique<MessageHelper>(*this, 50)};

◆ m_muonErrorOptimizer

ToolHandle<Muon::IMuonErrorOptimisationTool> Rec::CombinedMuonTrackFitter::m_muonErrorOptimizer
protected
Initial value:
{
this,
"MuonErrorOptimizer",
"",
}

Definition at line 104 of file CombinedMuonTrackFitter.h.

104 {
105 this,
106 "MuonErrorOptimizer",
107 "",
108 };

◆ m_printer

PublicToolHandle<Muon::MuonEDMPrinterTool> Rec::CombinedMuonTrackFitter::m_printer
protected
Initial value:
{
this,
"Printer",
"Muon::MuonEDMPrinterTool/MuonEDMPrinterTool",
}

Definition at line 109 of file CombinedMuonTrackFitter.h.

109 {
110 this,
111 "Printer",
112 "Muon::MuonEDMPrinterTool/MuonEDMPrinterTool",
113 };

◆ m_trackingVolumesSvc

ServiceHandle<Trk::ITrackingVolumesSvc> Rec::CombinedMuonTrackFitter::m_trackingVolumesSvc {this, "TrackingVolumesSvc", "Trk::TrackingVolumesSvc/TrackingVolumesSvc"}
private

Definition at line 136 of file CombinedMuonTrackFitter.h.

136{this, "TrackingVolumesSvc", "Trk::TrackingVolumesSvc/TrackingVolumesSvc"};

◆ m_trackQuery

ToolHandle<Rec::IMuonTrackQuery> Rec::CombinedMuonTrackFitter::m_trackQuery
protected
Initial value:
{
this,
"TrackQuery",
"Rec::MuonTrackQuery/MuonTrackQuery",
}

Definition at line 114 of file CombinedMuonTrackFitter.h.

114 {
115 this,
116 "TrackQuery",
117 "Rec::MuonTrackQuery/MuonTrackQuery",
118 };

◆ m_trackSummary

ToolHandle<Trk::ITrackSummaryTool> Rec::CombinedMuonTrackFitter::m_trackSummary
protected
Initial value:
{
this,
"TrackSummaryTool",
"Trk::TrackSummaryTool/MuidTrackSummaryTool",
}

Definition at line 119 of file CombinedMuonTrackFitter.h.

119 {
120 this,
121 "TrackSummaryTool",
122 "Trk::TrackSummaryTool/MuidTrackSummaryTool",
123 };

◆ m_updateWithCaloTG

Gaudi::Property<bool> Rec::CombinedMuonTrackFitter::m_updateWithCaloTG {this, "UpdateWithCaloTG", false}
protected

Definition at line 147 of file CombinedMuonTrackFitter.h.

147{this, "UpdateWithCaloTG", false};

◆ m_useCaloTG

Gaudi::Property<bool> Rec::CombinedMuonTrackFitter::m_useCaloTG {this, "UseCaloTG", false}
protected

Definition at line 148 of file CombinedMuonTrackFitter.h.

148{this, "UseCaloTG", false};

◆ m_zECToroid

Gaudi::Property<double> Rec::CombinedMuonTrackFitter::m_zECToroid {this, "zECToroid", 10. * Gaudi::Units::meter}
protected

Definition at line 146 of file CombinedMuonTrackFitter.h.

146{this, "zECToroid", 10. * Gaudi::Units::meter};

The documentation for this class was generated from the following files: