ATLAS Offline Software
Loading...
Searching...
No Matches
MuonCombined::MuonCreatorTool Class Reference

#include <MuonCreatorTool.h>

Inheritance diagram for MuonCombined::MuonCreatorTool:

Public Types

using InDetCandidateTagsMap = std::vector<InDetCandidateTags>
using InDetCandidateTags = std::pair<const InDetCandidate*, std::vector<const TagBase*> >

Public Member Functions

 MuonCreatorTool (const std::string &type, const std::string &name, const IInterface *parent)
 ~MuonCreatorTool ()=default
virtual StatusCode initialize () override final
virtual void create (const EventContext &ctx, const MuonCandidateCollection *muonCandidates, const std::vector< const InDetCandidateToTagMap * > &tagMaps, OutputData &outputData) const override final
 IMuonCreatorTool interface: build muons from ID and MS candidates.
virtual xAOD::Muoncreate (const EventContext &ctx, const MuonCandidate &candidate, OutputData &outputData) const override final
 IMuonCreatorTool interface: create a muon from a muon candidate.
virtual xAOD::Muoncreate (const EventContext &ctx, InDetCandidateTags &candidate, OutputData &outputData) const override final
 IMuonCreatorTool interface: create a muon from a muon candidate.
ServiceHandle< StoreGateSvc > & evtStore ()
 The standard StoreGateSvc (event store) Returns (kind of) a pointer to the StoreGateSvc.
const ServiceHandle< StoreGateSvc > & detStore () const
 The standard StoreGateSvc/DetectorStore Returns (kind of) a pointer to the StoreGateSvc.
virtual StatusCode sysInitialize () override
 Perform system initialization for an algorithm.
virtual StatusCode sysStart () override
 Handle START transition.
virtual std::vector< Gaudi::DataHandle * > inputHandles () const override
 Return this algorithm's input handles.
virtual std::vector< Gaudi::DataHandle * > outputHandles () const override
 Return this algorithm's output handles.
Gaudi::Details::PropertyBase & declareProperty (Gaudi::Property< T, V, H > &t)
void updateVHKA (Gaudi::Details::PropertyBase &)
MsgStream & msg () const
bool msgLvl (const MSG::Level lvl) const

Static Public Member Functions

static const InterfaceID & interfaceID ()

Protected Member Functions

void renounceArray (SG::VarHandleKeyArray &handlesArray)
 remove all handles from I/O resolution
std::enable_if_t< std::is_void_v< std::result_of_t< decltype(&T::renounce)(T)> > &&!std::is_base_of_v< SG::VarHandleKeyArray, T > &&std::is_base_of_v< Gaudi::DataHandle, T >, void > renounce (T &h)
void extraDeps_update_handler (Gaudi::Details::PropertyBase &ExtraDeps)
 Add StoreName to extra input/output deps as needed.

Private Types

typedef ServiceHandle< StoreGateSvcStoreGateSvc_t

Private Member Functions

void create (const EventContext &ctx, const MuonCandidateCollection *muonCandidates, const std::vector< const InDetCandidateToTagMap * > &tagMaps, OutputData &outputData, bool select_comissioning) const
void decorateDummyValues (const EventContext &ctx, xAOD::Muon &muon, OutputData &outputData) const
 De^corated a bunch of dummy values to the muon to ensure data consistency in the xAOD.
void addStatisticalCombination (const EventContext &ctx, xAOD::Muon &muon, const InDetCandidate *candidate, const StacoTag *tag, OutputData &outputData) const
void addCombinedFit (const EventContext &ctx, xAOD::Muon &muon, const CombinedFitTag *tag, OutputData &outputData) const
void addMuGirl (const EventContext &ctx, xAOD::Muon &muon, const MuGirlTag *tag, OutputData &outputData) const
void addMuGirlLowBeta (const EventContext &ctx, xAOD::Muon &muon, const MuGirlLowBetaTag *tag, xAOD::SlowMuon *slowMuon, OutputData &outputData) const
void addSegmentTag (const EventContext &ctx, xAOD::Muon &muon, const SegmentTag *tag, OutputData &outputData) const
void addCaloTag (xAOD::Muon &muon, const CaloTag *tag) const
void addMuonCandidate (const EventContext &ctx, const MuonCandidate &candidate, xAOD::Muon &muon, OutputData &outputData, const ElementLink< TrackCollection > &meLink=ElementLink< TrackCollection >()) const
 add muon candidate info to a muon, if an updateExtrapolatedTrack is provided, the routine takes ownership of the track.
ElementLink< xAOD::TrackParticleContainercreateTrackParticleElementLink (const EventContext &ctx, const ElementLink< TrackCollection > &trackLink, xAOD::TrackParticleContainer &trackParticleContainer, TrackCollection *trackCollection=0) const
 function creates an element link to a track particle from the track and the TrackParticle collection.
ElementLink< xAOD::MuonSegmentContainercreateMuonSegmentElementLink (const EventContext &ctx, const Muon::MuonSegment *segLink, const OutputData &outData) const
void resolveOverlaps (const EventContext &ctx, const MuonCandidateCollection *muonCandidates, const std::vector< const InDetCandidateToTagMap * > &tagMaps, InDetCandidateTagsMap &resolvedInDetCandidates, std::vector< const MuonCombined::MuonCandidate * > &resolvedMuonCandidates, bool select_comissioning=false) const
void selectStaus (InDetCandidateTagsMap &resolvedInDetCandidates, const std::vector< const InDetCandidateToTagMap * > &tagMaps) const
std::unique_ptr< Trk::TrackcreateDummyTrack (const EventContext &ctx, const std::vector< const Muon::MuonSegment * > &segments, const Trk::Track &indetTrack) const
void setMuonHitCounts (xAOD::Muon &muon) const
bool dressMuon (xAOD::Muon &muon) const
void addEnergyLossToMuon (xAOD::Muon &muon) const
void fillEnergyLossFromTrack (xAOD::Muon &muon, const std::vector< const Trk::TrackStateOnSurface * > *tsosVector) const
void setP4 (xAOD::Muon &muon, const xAOD::TrackParticle &tp) const
void collectCells (const EventContext &ctx, xAOD::Muon &muon, xAOD::CaloClusterContainer *clusterContainer, const Trk::CaloExtension *inputCaloExt=nullptr) const
Gaudi::Details::PropertyBase & declareGaudiProperty (Gaudi::Property< T, V, H > &hndl, const SG::VarHandleKeyType &)
 specialization for handling Gaudi::Property<SG::VarHandleKey>

Private Attributes

ServiceHandle< Muon::IMuonIdHelperSvcm_idHelperSvc {this, "MuonIdHelperSvc", "Muon::MuonIdHelperSvc/MuonIdHelperSvc"}
ServiceHandle< Muon::IMuonEDMHelperSvcm_edmHelperSvc
PublicToolHandle< Muon::MuonEDMPrinterToolm_printer {this, "Printer", "Muon::MuonEDMPrinterTool/MuonEDMPrinterTool"}
ToolHandle< Rec::IMuonPrintingToolm_muonPrinter {this, "MuonPrinter", "Rec::MuonPrintingTool/MuonPrintingTool"}
ToolHandle< Trk::IParticleCaloExtensionToolm_caloExtTool
ToolHandle< Trk::ITrackParticleCreatorToolm_particleCreator
ToolHandle< Trk::ITrackAmbiguityProcessorToolm_ambiguityProcessor {this, "AmbiguityProcessor", ""}
ToolHandle< Trk::IPropagatorm_propagator {this, "Propagator", "Trk::RungeKuttaPropagator/AtlasRungeKuttaPropagator"}
ToolHandle< xAOD::IMuonDressingToolm_muonDressingTool {this, "MuonDressingTool", "MuonCombined::MuonDressingTool/MuonDressingTool"}
ToolHandle< Rec::IMuonMomentumBalanceSignificancem_momentumBalanceTool
ToolHandle< Rec::IMuonScatteringAngleSignificancem_scatteringAngleTool
ToolHandle< CP::IMuonSelectionToolm_selectorTool {this, "MuonSelectionTool", "CP::MuonSelectionTool/MuonSelectionTool"}
ToolHandle< Rec::IMuonMeanMDTdADCFillerm_meanMDTdADCTool
ToolHandle< Trk::ITrkMaterialProviderToolm_caloMaterialProvider
ToolHandle< Rec::IMuonTrackQuerym_trackQuery {this, "TrackQuery", "Rec::MuonTrackQuery/MuonTrackQuery"}
ToolHandle< Trk::IExtendedTrackSummaryToolm_trackSummaryTool {this, "TrackSummaryTool", "MuonTrackSummaryTool"}
Rec::CaloCellCollector m_cellCollector
SG::ReadHandleKey< CaloCellContainerm_cellContainerName {this, "CaloCellContainer", "AllCalo", "calo cells"}
SG::ReadCondHandleKey< CaloNoisem_caloNoiseKey {this, "CaloNoise", "", "CaloNoise object to use, or blank."}
Gaudi::Property< bool > m_buildStauContainer {this, "BuildStauContainer", false, "flag to decide whether to build stau or not"}
Gaudi::Property< bool > m_addMDTExtrasMuGirlLowBeta {this, "AddMDTExtrasMuGirlLowBeta", false}
Gaudi::Property< bool > m_fillEnergyLossFromTrack
Gaudi::Property< bool > m_fillExtraELossInfo
Gaudi::Property< bool > m_printSummary {this, "PrintSummary", false, "flag to print muon edm"}
Gaudi::Property< bool > m_useUpdatedExtrapolatedTrack
Gaudi::Property< bool > m_segLowBeta {this, "AssociateSegmentsToLowBetaMuons", false, "associate segments to MuGirlLowBeta muons"}
Gaudi::Property< bool > m_useCaloCells {this, "UseCaloCells", true}
Gaudi::Property< bool > m_doSA {this, "MakeSAMuons", false}
Gaudi::Property< bool > m_requireIDTracks {this, "RequireIDTrack", false}
 In case of running the muon reconstruction with LRT tracks this property removes the overlap of muons in the container in which in any case no ID track is available.
Gaudi::Property< float > m_sigmaCaloNoiseCut {this, "SigmaCaloNoiseCut", 3.4}
Gaudi::Property< std::vector< std::string > > m_copyFloatSummaryKeys
Gaudi::Property< std::vector< std::string > > m_copyCharSummaryKeys
Gaudi::Property< bool > m_requireMSOEforSA
Gaudi::Property< bool > m_requireCaloDepositForSA
std::vector< std::unique_ptr< SG::AuxElement::Accessor< float > > > m_copyFloatSummaryAccessors
std::vector< std::unique_ptr< SG::AuxElement::Accessor< uint8_t > > > m_copyCharSummaryAccessors
SG::ReadCondHandleKey< CaloDetDescrManagerm_caloMgrKey {this, "CaloDetDescrManager", "CaloDetDescrManager"}
StoreGateSvc_t m_evtStore
 Pointer to StoreGate (event store by default).
StoreGateSvc_t m_detStore
 Pointer to StoreGate (detector store by default).
std::vector< SG::VarHandleKeyArray * > m_vhka
bool m_varHandleArraysDeclared

Detailed Description

Definition at line 60 of file MuonCreatorTool.h.

Member Typedef Documentation

◆ InDetCandidateTags

Definition at line 35 of file IMuonCreatorTool.h.

◆ InDetCandidateTagsMap

◆ StoreGateSvc_t

typedef ServiceHandle<StoreGateSvc> AthCommonDataStore< AthCommonMsg< AlgTool > >::StoreGateSvc_t
privateinherited

Definition at line 388 of file AthCommonDataStore.h.

Constructor & Destructor Documentation

◆ MuonCreatorTool()

MuonCombined::MuonCreatorTool::MuonCreatorTool ( const std::string & type,
const std::string & name,
const IInterface * parent )

Definition at line 56 of file MuonCreatorTool.cxx.

56 :
57 AthAlgTool(type, name, parent) {
58 declareInterface<IMuonCreatorTool>(this);
59 }
AthAlgTool()
Default constructor:

◆ ~MuonCreatorTool()

MuonCombined::MuonCreatorTool::~MuonCreatorTool ( )
default

Member Function Documentation

◆ addCaloTag()

void MuonCombined::MuonCreatorTool::addCaloTag ( xAOD::Muon & muon,
const CaloTag * tag ) const
private

Definition at line 724 of file MuonCreatorTool.cxx.

724 {
725 static const SG::Accessor<float> acc_ElType("CT_EL_Type"); // FIXME - should be uint
726 static const SG::Accessor<float> acc_ElFSREnergy("CT_ET_FSRCandidateEnergy");
727
728 if (!tag) {
729 // init variables if necessary.
730
731 mu.setParameter(0.f, xAOD::Muon::CaloMuonScore);
732 mu.setParameter(static_cast<int>(0xFF), xAOD::Muon::CaloMuonIDTag);
734 // Here we can make sure that we store the extra calotag information -
735 // just always add it since this is then unambigious for debugging
736 acc_ET_Core(mu) = 0.0;
737 acc_ElType(mu) = -999.0;
738 acc_ElFSREnergy(mu) = -999.0;
739 }
740 return;
741 }
742
743 ATH_MSG_DEBUG("Adding Calo Muon with author " << tag->author() << ", type " << tag->type() << ", CaloMuonScore "
744 << tag->caloMuonScore());
745 mu.setParameter(static_cast<float>(tag->caloMuonScore()), xAOD::Muon::CaloMuonScore);
746 mu.setParameter(static_cast<int>(tag->caloMuonIdTag()), xAOD::Muon::CaloMuonIDTag);
747
749 // Here we can make sure that we store the extra calotag information - just
750 // always add it since this is then unambigious for debugging
751 acc_ET_Core(mu) = tag->etCore();
752 acc_ElType(mu) = tag->energyLossType();
753 acc_ElFSREnergy(mu) = tag->fsrCandidateEnergy();
754 }
755 // FIXME - calo deposits
756 }
#define ATH_MSG_DEBUG(x)
Gaudi::Property< bool > m_fillExtraELossInfo

◆ addCombinedFit()

void MuonCombined::MuonCreatorTool::addCombinedFit ( const EventContext & ctx,
xAOD::Muon & muon,
const CombinedFitTag * tag,
OutputData & outputData ) const
private

Definition at line 486 of file MuonCreatorTool.cxx.

487 {
488 if (!tag) {
489 // init variables if necessary.
490 return;
491 }
492
493 ATH_MSG_DEBUG("Adding Combined fit Muon " << tag->author() << " type " << tag->type());
494 if (!muon.combinedTrackParticleLink().isValid()) {
495 // if the combined track particle is part of a container set the link
496 if (outputData.combinedTrackParticleContainer) {
497 // create element link from the track
498 ElementLink<xAOD::TrackParticleContainer> link = createTrackParticleElementLink(
499 ctx, tag->combinedTrackLink(), *outputData.combinedTrackParticleContainer, outputData.combinedTrackCollection);
500
501 if (link.isValid()) {
502 // link.toPersistent();
503 ATH_MSG_DEBUG("Adding combined fit: pt " << (*link)->pt() << " eta " << (*link)->eta() << " phi " << (*link)->phi());
504 muon.setTrackParticleLink(xAOD::Muon::CombinedTrackParticle, link);
505 } else
506 ATH_MSG_WARNING("Creating of Combined TrackParticle Link failed");
507 }
508 }
509 // add muon candidate
510 addMuonCandidate(ctx, tag->muonCandidate(), muon, outputData, tag->updatedExtrapolatedTrackLink());
511
512 // Add inner match chi^2
513 const float inner_chi2 = tag->matchChi2();
514 muon.setParameter(tag->matchDoF(), xAOD::Muon::msInnerMatchDOF);
515 muon.setParameter(inner_chi2, xAOD::Muon::msInnerMatchChi2);
516
517 ATH_MSG_DEBUG("Done adding Combined Fit Muon " << tag->author() << " type " << tag->type());
518 }
#define ATH_MSG_WARNING(x)
void addMuonCandidate(const EventContext &ctx, const MuonCandidate &candidate, xAOD::Muon &muon, OutputData &outputData, const ElementLink< TrackCollection > &meLink=ElementLink< TrackCollection >()) const
add muon candidate info to a muon, if an updateExtrapolatedTrack is provided, the routine takes owner...
ElementLink< xAOD::TrackParticleContainer > createTrackParticleElementLink(const EventContext &ctx, const ElementLink< TrackCollection > &trackLink, xAOD::TrackParticleContainer &trackParticleContainer, TrackCollection *trackCollection=0) const
function creates an element link to a track particle from the track and the TrackParticle collection.
pointer & link(pointer p) const
Return a reference to the link for an element.

◆ addEnergyLossToMuon()

void MuonCombined::MuonCreatorTool::addEnergyLossToMuon ( xAOD::Muon & muon) const
private

Definition at line 1278 of file MuonCreatorTool.cxx.

1278 {
1279 if (!muon.inDetTrackParticleLink().isValid()) {
1280 ATH_MSG_WARNING("Missing ID track particle link in addEnergyLossToMuon!");
1281 return;
1282 }
1283
1284 // get ID track particle
1285 const Trk::Track* trk = (*(muon.inDetTrackParticleLink()))->track();
1286 if (!trk) {
1287 ATH_MSG_WARNING("Missing ID trk::track in addEnergyLossToMuon!");
1288 return;
1289 }
1290
1291 // find last ID TSOS with track parameters
1292 const Trk::TrackStateOnSurface* lastID = nullptr;
1295 for (; it != itEnd; ++it) {
1296 if ((*it)->trackParameters()) {
1297 lastID = *it;
1298 break;
1299 }
1300 }
1301 if (!lastID) {
1302 ATH_MSG_WARNING("Missing ID TSOS with track parameters in addEnergyLossToMuon!");
1303 return;
1304 }
1305
1306 // get calorimeter TSOS
1307 std::vector<const Trk::TrackStateOnSurface*>* caloTSOS = m_caloMaterialProvider->getCaloTSOS(*((*it)->trackParameters()), *trk);
1308
1309 if (!caloTSOS) {
1310 ATH_MSG_WARNING("Unable to find calo TSOS in addEnergyLossToMuon!");
1311 return;
1312 }
1313
1314 // fill muon parameters for eloss
1315 fillEnergyLossFromTrack(muon, caloTSOS);
1316
1317 // delete caloTSOS
1318 std::vector<const Trk::TrackStateOnSurface*>::const_iterator it2 = caloTSOS->begin();
1319 std::vector<const Trk::TrackStateOnSurface*>::const_iterator itEnd2 = caloTSOS->end();
1320 for (; it2 != itEnd2; ++it2) delete *it2;
1321 delete caloTSOS;
1322 }
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
void fillEnergyLossFromTrack(xAOD::Muon &muon, const std::vector< const Trk::TrackStateOnSurface * > *tsosVector) const
ToolHandle< Trk::ITrkMaterialProviderTool > m_caloMaterialProvider
const Trk::TrackStates * trackStateOnSurfaces() const
return a pointer to a const DataVector of const TrackStateOnSurfaces.

◆ addMuGirl()

void MuonCombined::MuonCreatorTool::addMuGirl ( const EventContext & ctx,
xAOD::Muon & muon,
const MuGirlTag * tag,
OutputData & outputData ) const
private

Definition at line 633 of file MuonCreatorTool.cxx.

633 {
634 if (!tag) {
635 // init variables if necessary.
636 return;
637 }
638
639 ATH_MSG_DEBUG("Adding MuGirl Muon " << tag->author() << " type " << tag->type());
640
641 if (!muon.combinedTrackParticleLink().isValid() && tag->combinedTrack()) {
642 // if the combined track particle is part of a container set the link
643 if (outputData.combinedTrackParticleContainer) {
644 // create element link
645 ElementLink<xAOD::TrackParticleContainer> link = createTrackParticleElementLink(
646 ctx, tag->combinedTrackLink(), *outputData.combinedTrackParticleContainer, outputData.combinedTrackCollection);
647
648 if (link.isValid()) {
649 // link.toPersistent();
650 ATH_MSG_DEBUG("Adding MuGirl: pt " << (*link)->pt() << " eta " << (*link)->eta() << " phi " << (*link)->phi());
651 muon.setTrackParticleLink(xAOD::Muon::CombinedTrackParticle, link);
652 } else
653 ATH_MSG_WARNING("Creating of MuGirl TrackParticle Link failed");
654 }
655
656 if (outputData.extrapolatedTrackParticleContainer && tag->updatedExtrapolatedTrack()) {
657 // create element link
658 ElementLink<xAOD::TrackParticleContainer> link =
659 createTrackParticleElementLink(ctx, tag->updatedExtrapolatedTrackLink(), *outputData.extrapolatedTrackParticleContainer,
660 outputData.extrapolatedTrackCollection);
661
662 if (link.isValid()) {
663 ATH_MSG_DEBUG("Adding MuGirl: pt " << (*link)->pt() << " eta " << (*link)->eta() << " phi " << (*link)->phi());
664 muon.setTrackParticleLink(xAOD::Muon::ExtrapolatedMuonSpectrometerTrackParticle, link);
665 } else
666 ATH_MSG_WARNING("Creating of MuGirl TrackParticle Link failed");
667 }
668
669 if (outputData.xaodSegmentContainer) {
670 ATH_MSG_DEBUG("Adding MuGirl muonSegmentCollection");
671
672 std::vector<ElementLink<xAOD::MuonSegmentContainer>> segments;
673 for (const Muon::MuonSegment* segLink : tag->associatedSegments()) {
674 ElementLink<xAOD::MuonSegmentContainer> link = createMuonSegmentElementLink(ctx, segLink, outputData);
675 if (link.isValid()) {
676 segments.push_back(link);
677 ATH_MSG_DEBUG("Adding MuGirl: xaod::MuonSegment px " << (*link)->px() << " py " << (*link)->py() << " pz "
678 << (*link)->pz());
679 } else
680 ATH_MSG_WARNING("Creating of MuGirl segment Link failed");
681 }
682 muon.setMuonSegmentLinks(segments);
683 }
684 }
685 ATH_MSG_DEBUG("Done Adding MuGirl Muon " << tag->author() << " type " << tag->type());
686 }
ElementLink< xAOD::MuonSegmentContainer > createMuonSegmentElementLink(const EventContext &ctx, const Muon::MuonSegment *segLink, const OutputData &outData) const

◆ addMuGirlLowBeta()

void MuonCombined::MuonCreatorTool::addMuGirlLowBeta ( const EventContext & ctx,
xAOD::Muon & muon,
const MuGirlLowBetaTag * tag,
xAOD::SlowMuon * slowMuon,
OutputData & outputData ) const
private

Definition at line 520 of file MuonCreatorTool.cxx.

524 {
525 if (!tag) {
526 // init variables if necessary.
527 return;
528 }
529
530 ATH_MSG_DEBUG("Adding MuGirlLowBeta Muon " << tag->author() << " type " << tag->type());
531
532 // get stauExtras and write to slowMuon
533 const MuGirlNS::StauExtras* stauExtras = tag->getStauExtras();
534 if (slowMuon && stauExtras) {
535 ATH_MSG_VERBOSE("StauSummary beta " << stauExtras->betaAll<<" "<<stauExtras->betaAllt);
536 slowMuon->setBeta(stauExtras->betaAll);
537 slowMuon->setBetaT(stauExtras->betaAllt);
538 slowMuon->setAnn(stauExtras->ann);
539 slowMuon->setNRpcHits(stauExtras->numRpcHitsInSeg);
540 slowMuon->setNTileCells(stauExtras->numCaloCells);
541 slowMuon->setRpcInfo(stauExtras->rpcBetaAvg, stauExtras->rpcBetaRms, stauExtras->rpcBetaChi2, stauExtras->rpcBetaDof);
542 slowMuon->setMdtInfo(stauExtras->mdtBetaAvg, stauExtras->mdtBetaRms, stauExtras->mdtBetaChi2, stauExtras->mdtBetaDof);
543 slowMuon->setCaloInfo(stauExtras->caloBetaAvg, stauExtras->caloBetaRms, stauExtras->caloBetaChi2, stauExtras->caloBetaDof);
544
545 static const SG::Accessor<std::vector<uint8_t> > eTechAcc ("hitTechnology");
546 static const SG::Accessor<std::vector<unsigned int> > idAcc ("hitIdentifier");
547 static const SG::Accessor<std::vector<float> > mToFAcc ("hitTOF");
548 static const SG::Accessor<std::vector<float> > xAcc ("hitPositionX");
549 static const SG::Accessor<std::vector<float> > yAcc ("hitPositionY");
550 static const SG::Accessor<std::vector<float> > zAcc ("hitPositionZ");
551 static const SG::Accessor<std::vector<float> > eAcc ("hitEnergy");
552 static const SG::Accessor<std::vector<float> > errorAcc ("hitError");
553 static const SG::Accessor<std::vector<float> > shiftAcc ("hitShift");
554 static const SG::Accessor<std::vector<float> > propTimeAcc ("hitPropagationTime");
555 static const SG::Accessor<std::vector<uint8_t> > hitPassesMDTBetaCutAcc ("hitPassesMDTBetaCut");
556
557 std::vector<uint8_t>& eTechVec = eTechAcc(*slowMuon);
558 std::vector<unsigned int>& idVec = idAcc(*slowMuon);
559 std::vector<float>& mToFVec = mToFAcc(*slowMuon);
560 std::vector<float>& xVec = xAcc(*slowMuon);
561 std::vector<float>& yVec = yAcc(*slowMuon);
562 std::vector<float>& zVec = zAcc(*slowMuon);
563 std::vector<float>& eVec = eAcc(*slowMuon);
564 std::vector<float>& errorVec = errorAcc(*slowMuon);
565 std::vector<float>& shiftVec = shiftAcc(*slowMuon);
566 std::vector<float>& propagationTimeVec = propTimeAcc(*slowMuon);
567 std::vector<uint8_t>& passesMDTBetaCutVec = hitPassesMDTBetaCutAcc(*slowMuon);
568
569 for (const auto& hit : stauExtras->hits) {
570 eTechVec.push_back(hit.eTech);
571 idVec.push_back(hit.id.get_identifier32().get_compact());
572 mToFVec.push_back(hit.mToF);
573 xVec.push_back(hit.x);
574 yVec.push_back(hit.y);
575 zVec.push_back(hit.z);
576 eVec.push_back(hit.e);
577 errorVec.push_back(hit.error);
578 shiftVec.push_back(hit.shift);
579 propagationTimeVec.push_back(hit.propagationTime);
580 passesMDTBetaCutVec.push_back(hit.passesMDTBetaCut ? uint8_t{1} : uint8_t{0});
581 }
582
583 // additional MDT hit info (optional)
585 static const SG::Accessor<std::vector<int> > adcAcc ("hitAdc");
586 static const SG::Accessor<std::vector<float> > rdriftAcc ("hitDriftRadius");
587
588 std::vector<int>& adcVec = adcAcc(*slowMuon);
589 std::vector<float>& rdriftVec = rdriftAcc(*slowMuon);
590
591 if (stauExtras->extraMDTHitInfo) { // check if extra MDT hit info added
592 for (const auto& extraMDTinfo : *stauExtras->extraMDTHitInfo) {
593 adcVec.push_back(extraMDTinfo.adc);
594 rdriftVec.push_back(extraMDTinfo.rdrift);
595 }
596 }
597 }
598
599
600 }
601
602 if (!muon.combinedTrackParticleLink().isValid() && tag->combinedTrack()) {
603 // if the combined track particle is part of a container set the link
604 if (outputData.combinedTrackParticleContainer) {
605 // create element link
606 ElementLink<xAOD::TrackParticleContainer> link = createTrackParticleElementLink(
607 ctx, tag->combinedTrackLink(), *outputData.combinedTrackParticleContainer, outputData.combinedTrackCollection);
608
609 if (link.isValid()) {
610 ATH_MSG_DEBUG("Adding MuGirlLowBeta: pt " << (*link)->pt() << " eta " << (*link)->eta() << " phi " << (*link)->phi());
611 muon.setTrackParticleLink(xAOD::Muon::CombinedTrackParticle, link);
612 } else
613 ATH_MSG_WARNING("Creating of MuGirlLowBeta TrackParticle Link failed");
614 }
615 }
616
617 if (outputData.xaodSegmentContainer) {
618 ATH_MSG_DEBUG("Adding MuGirlLowBeta muonSegmentColection");
619 std::vector<ElementLink<xAOD::MuonSegmentContainer>> segments;
620 for (const ElementLink<Trk::SegmentCollection>& seglink : tag->segments()) {
621 ElementLink<xAOD::MuonSegmentContainer> link{*outputData.xaodSegmentContainer, seglink.index(), ctx};
622 if (link.isValid()) {
623 segments.push_back(link);
624 ATH_MSG_DEBUG("Adding MuGirlLowBeta: xaod::MuonSegment px " << (*link)->px() << " py " << (*link)->py() << " pz "
625 << (*link)->pz());
626 } else
627 ATH_MSG_WARNING("Creating of MuGirlLowBeta segment Link failed");
628 }
629 muon.setMuonSegmentLinks(segments);
630 }
631 }
#define ATH_MSG_VERBOSE(x)
Gaudi::Property< bool > m_addMDTExtrasMuGirlLowBeta
void setNRpcHits(int nRpcHits)
Sets.
void setNTileCells(int nTileCells)
Sets.
void setAnn(float ann)
Sets.
void setMdtInfo(float mdtBetaAvg, float mdtBetaRms, float mdtBetaChi2, int mdtBetaDof)
Sets.
void setBeta(float beta)
Sets.
void setBetaT(float betaT)
Sets.
void setRpcInfo(float rpcBetaAvg, float rpcBetaRms, float rpcBetaChi2, int rpcBetaDof)
Sets.
void setCaloInfo(float caloBetaAvg, float caloBetaRms, float caloBetaChi2, int caloBetaDof)
Sets.
SG::Accessor< T, ALLOC > Accessor
Definition AuxElement.h:573
unsigned int numRpcHitsInSeg
std::optional< StauMDTHitExtras > extraMDTHitInfo

◆ addMuonCandidate()

void MuonCombined::MuonCreatorTool::addMuonCandidate ( const EventContext & ctx,
const MuonCandidate & candidate,
xAOD::Muon & muon,
OutputData & outputData,
const ElementLink< TrackCollection > & meLink = ElementLink<TrackCollection>() ) const
private

add muon candidate info to a muon, if an updateExtrapolatedTrack is provided, the routine takes ownership of the track.

The track will be used instead of the extrapolatedTrack of the MuonCandidate. The extrapolatedTrack of the MuonCandidate will be release during the operation.

Definition at line 802 of file MuonCreatorTool.cxx.

803 {
804 if (!muon.nMuonSegments()) {
805 std::vector< ElementLink<xAOD::MuonSegmentContainer>> segments;
806 for (const Muon::MuonSegment* segLink : candidate.getSegments()) {
807 ElementLink<xAOD::MuonSegmentContainer> link = createMuonSegmentElementLink(ctx, segLink, outputData);
808 if (link.isValid()) {
809 segments.push_back(link);
810 ATH_MSG_DEBUG("Adding MuGirl: xaod::MuonSegment px " << (*link)->px() << " py " << (*link)->py() << " pz "
811 << (*link)->pz());
812 } else
813 ATH_MSG_WARNING("Creating of Muon candidate segment failed "<<candidate.toString());
814
815 }
816 muon.setMuonSegmentLinks(segments);
817 }
818 // only set once
819 if (muon.muonSpectrometerTrackParticleLink().isValid()) { return; }
820 // case where we have a MuGirl muon that is also reconstructed by STACO: don't
821 // want to add this track as it is misleading however, we will still keep the
822 // MS-only extrapolated track (see below) for debugging purposes
823 if (muon.author() != xAOD::Muon::MuGirl)
824 muon.setTrackParticleLink(xAOD::Muon::MuonSpectrometerTrackParticle, candidate.muonSpectrometerTrackLink());
825
826 // we need both the container and the extrapolated muon track to add the link
827 if (!outputData.extrapolatedTrackParticleContainer || (!candidate.extrapolatedTrack() && !meLink.isValid())) { return; }
828
829 const Trk::Track* extrapolatedTrack = candidate.extrapolatedTrack();
830
831 if (!extrapolatedTrack || !extrapolatedTrack->perigeeParameters()) {
832 ATH_MSG_DEBUG("There is no extrapolated track associated to the MuonCandidate.");
833 if (muon.author() == xAOD::Muon::MuidCo) { // this can happen for MuidCo muons, though it's
834 // quite rare: in this case just add the ME track
835 if (meLink.isValid()) {
836 ElementLink<xAOD::TrackParticleContainer> link = createTrackParticleElementLink(
837 ctx, meLink, *outputData.extrapolatedTrackParticleContainer, outputData.extrapolatedTrackCollection);
838 if (link.isValid()) {
839 ATH_MSG_DEBUG("Adding standalone fit (refitted): pt " << (*link)->pt() << " eta " << (*link)->eta() << " phi "
840 << (*link)->phi());
841 muon.setTrackParticleLink(xAOD::Muon::ExtrapolatedMuonSpectrometerTrackParticle, link);
842 float fieldInt = m_trackQuery->fieldIntegral(**meLink, ctx).betweenSpectrometerMeasurements();
843 muon.setParameter(fieldInt, xAOD::Muon::spectrometerFieldIntegral);
844 int nunspoiled = (*link)->track()->trackSummary()->get(Trk::numberOfCscUnspoiltEtaHits);
845 acc_nUnspoiledCscHits(muon) = nunspoiled;
846 }
847 }
848 } else { // I don't think we should ever get here, but just in case
849 if (!extrapolatedTrack) ATH_MSG_WARNING("Track doesn't have extrapolated track. Skipping");
850 if (extrapolatedTrack && !extrapolatedTrack->perigeeParameters())
852 "Track doesn't have perigee parameters on extrapolated "
853 "track. Skipping");
854 }
855 } else {
856 // Now we just add the original extrapolated track itself
857 // but not for SA muons, for consistency they will still have
858 // extrapolatedTrackParticle
859 if (muon.muonType() != xAOD::Muon::MuonStandAlone) {
860 if (meLink.isValid()) { // add ME track and MS-only extrapolated track
861 if (outputData.msOnlyExtrapolatedTrackParticleContainer) { // add un-refitted
862 // extrapolated track
863 // as MS-only
864 // extrapolated track
865 ElementLink<xAOD::TrackParticleContainer> link = createTrackParticleElementLink(
866 ctx, candidate.extrapolatedTrackLink(), *outputData.msOnlyExtrapolatedTrackParticleContainer,
867 outputData.msOnlyExtrapolatedTrackCollection);
868
869 if (link.isValid()) {
870 ATH_MSG_DEBUG("Adding MS-only extrapolated track: pt " << (*link)->pt() << " eta " << (*link)->eta() << " phi "
871 << (*link)->phi());
872 // link.toPersistent();
873 muon.setTrackParticleLink(xAOD::Muon::MSOnlyExtrapolatedMuonSpectrometerTrackParticle, link);
874 } else
875 ATH_MSG_WARNING("failed to create MS-only extrapolated track particle");
876 }
877 // now add refitted track as ME track
878 ElementLink<xAOD::TrackParticleContainer> link = createTrackParticleElementLink(
879 ctx, meLink, *outputData.extrapolatedTrackParticleContainer, outputData.extrapolatedTrackCollection);
880 if (link.isValid()) {
881 ATH_MSG_DEBUG("Adding standalone fit (refitted): pt " << (*link)->pt() << " eta " << (*link)->eta() << " phi "
882 << (*link)->phi());
883 muon.setTrackParticleLink(xAOD::Muon::ExtrapolatedMuonSpectrometerTrackParticle, link);
884 float fieldInt = m_trackQuery->fieldIntegral(**meLink, ctx).betweenSpectrometerMeasurements();
885 muon.setParameter(fieldInt, xAOD::Muon::spectrometerFieldIntegral);
886 int nunspoiled = (*link)->track()->trackSummary()->get(Trk::numberOfCscUnspoiltEtaHits);
887 acc_nUnspoiledCscHits(muon) = nunspoiled;
888 }
889 } else { // no refitted track, so add original un-refitted extrapolated
890 // track as ME track
891 if (muon.author() == xAOD::Muon::MuGirl && muon.extrapolatedMuonSpectrometerTrackParticleLink().isValid()) {
892 // MuGirl case: ME track is already set, but now we have the
893 // extrapolated track from the STACO tag add this as the MS-only
894 // extrapolated track instead
895 ElementLink<xAOD::TrackParticleContainer> link = createTrackParticleElementLink(
896 ctx, candidate.extrapolatedTrackLink(), *outputData.msOnlyExtrapolatedTrackParticleContainer,
897 outputData.msOnlyExtrapolatedTrackCollection);
898
899 if (link.isValid()) {
900 ATH_MSG_DEBUG("Adding MS-only extrapolated track to MuGirl muon: pt "
901 << (*link)->pt() << " eta " << (*link)->eta() << " phi " << (*link)->phi());
902 // link.toPersistent();
903 muon.setTrackParticleLink(xAOD::Muon::MSOnlyExtrapolatedMuonSpectrometerTrackParticle, link);
904 float fieldInt =
905 m_trackQuery->fieldIntegral(**candidate.extrapolatedTrackLink(), ctx).betweenSpectrometerMeasurements();
906 muon.setParameter(fieldInt, xAOD::Muon::spectrometerFieldIntegral);
907 }
908 } else {
909 ElementLink<xAOD::TrackParticleContainer> link = createTrackParticleElementLink(
910 ctx, candidate.extrapolatedTrackLink(), *outputData.extrapolatedTrackParticleContainer,
911 outputData.extrapolatedTrackCollection);
912
913 if (link.isValid()) {
914 ATH_MSG_DEBUG("Adding standalone fit (un-refitted): pt " << (*link)->pt() << " eta " << (*link)->eta()
915 << " phi " << (*link)->phi());
916 // link.toPersistent();
917 muon.setTrackParticleLink(xAOD::Muon::ExtrapolatedMuonSpectrometerTrackParticle, link);
918 float fieldInt =
919 m_trackQuery->fieldIntegral(**candidate.extrapolatedTrackLink(), ctx).betweenSpectrometerMeasurements();
920 muon.setParameter(fieldInt, xAOD::Muon::spectrometerFieldIntegral);
921 }
922 }
923 }
924 } else { // SA tracks only get un-refitted track as ME track
925 // create element link from the track
926 ElementLink<xAOD::TrackParticleContainer> link =
927 createTrackParticleElementLink(ctx, candidate.extrapolatedTrackLink(), *outputData.extrapolatedTrackParticleContainer,
928 outputData.extrapolatedTrackCollection);
929
930 if (link.isValid()) {
931 ATH_MSG_DEBUG("Adding standalone fit: pt " << (*link)->pt() << " eta " << (*link)->eta() << " phi " << (*link)->phi());
932 // link.toPersistent();
933 muon.setTrackParticleLink(xAOD::Muon::ExtrapolatedMuonSpectrometerTrackParticle, link);
934 float fieldInt =
935 m_trackQuery->fieldIntegral(**candidate.extrapolatedTrackLink(), ctx).betweenSpectrometerMeasurements();
936 muon.setParameter(fieldInt, xAOD::Muon::spectrometerFieldIntegral);
937 int nunspoiled = extrapolatedTrack->trackSummary()->get(Trk::numberOfCscUnspoiltEtaHits);
938 acc_nUnspoiledCscHits(muon) = nunspoiled;
939 } else {
940 ATH_MSG_WARNING("failed to create ME track particle for SA muon");
941 }
942 }
943 }
944 }
ToolHandle< Rec::IMuonTrackQuery > m_trackQuery
int get(const SummaryType &type) const
returns the summary information for the passed SummaryType.
const Perigee * perigeeParameters() const
return Perigee.
const Trk::TrackSummary * trackSummary() const
Returns a pointer to the const Trk::TrackSummary owned by this const track (could be nullptr).
@ numberOfCscUnspoiltEtaHits
number of unspoilt CSC eta measurements (all CSC phi measurements are by definition spoilt).

◆ addSegmentTag()

void MuonCombined::MuonCreatorTool::addSegmentTag ( const EventContext & ctx,
xAOD::Muon & muon,
const SegmentTag * tag,
OutputData & outputData ) const
private

Definition at line 688 of file MuonCreatorTool.cxx.

688 {
689 if (!tag) {
690 // init variables if necessary.
691 muon.setParameter(-1.f, xAOD::Muon::segmentDeltaEta);
692 muon.setParameter(-1.f, xAOD::Muon::segmentDeltaPhi);
693 muon.setParameter(-1.f, xAOD::Muon::segmentChi2OverDoF);
694 return;
695 }
696
697 ATH_MSG_DEBUG("Adding Segment Tag Muon " << tag->author() << " type " << tag->type());
698
699 std::vector<ElementLink<xAOD::MuonSegmentContainer>> segments;
700 bool foundseg = false;
701 for (const auto& info : tag->segmentsInfo()) {
702 // this is a bit tricky, as we have here a link to an xAOD segment in the old container
703 // but the new container should have the segments in the same order, plus the MuGirl ones tacked on the end
704 // so we should be able to just make a new link here
705 // note that this only applies to segment-tagged muons, others get their associated segments elsewhere
706 if (muon.author() == xAOD::Muon::MuTagIMO) {
707 ElementLink<xAOD::MuonSegmentContainer> seglink = createMuonSegmentElementLink(ctx, info.segment, outputData);
708 if (seglink.isValid()) segments.push_back(seglink);
709 }
710
711 if (!foundseg) { // add parameters for the first segment
712 muon.setParameter(static_cast<float>(info.dtheta), xAOD::Muon::segmentDeltaEta);
713 muon.setParameter(static_cast<float>(info.dphi), xAOD::Muon::segmentDeltaPhi);
714 muon.setParameter(static_cast<float>(info.segment->fitQuality()->chiSquared() / info.segment->fitQuality()->numberDoF()),
715 xAOD::Muon::segmentChi2OverDoF);
716 foundseg = true;
717 } else if (muon.author() != xAOD::Muon::MuTagIMO)
718 break; // for non-segment-tagged muons, we only need to set the above
719 // parameters
720 }
721 if (muon.author() == xAOD::Muon::MuTagIMO) muon.setMuonSegmentLinks(segments); // set the associated segments
722 }

◆ addStatisticalCombination()

void MuonCombined::MuonCreatorTool::addStatisticalCombination ( const EventContext & ctx,
xAOD::Muon & muon,
const InDetCandidate * candidate,
const StacoTag * tag,
OutputData & outputData ) const
private

Also add this decoration to maintain data-format consistency to the combined track particles (cf. ATLASRECTS-6454)

Definition at line 389 of file MuonCreatorTool.cxx.

390 {
391 static const SG::Accessor<float> acc_d0("d0_staco");
392 static const SG::Accessor<float> acc_z0("z0_staco");
393 static const SG::Accessor<float> acc_phi0("phi0_staco");
394 static const SG::Accessor<float> acc_theta("theta_staco");
395 static const SG::Accessor<float> acc_qOverP("qOverP_staco");
396 static const SG::Accessor<float> acc_qOverPerr("qOverPErr_staco");
397
398 if (!tag) {
399 // init variables if necessary.
400 acc_d0(muon) = -999;
401 acc_z0(muon) = -999;
402 acc_phi0(muon) = -999;
403 acc_theta(muon) = -999;
404 acc_qOverP(muon) = -999;
405 acc_qOverPerr(muon) = -999.;
406 return;
407 }
408
409 ATH_MSG_DEBUG("Adding Staco Muon " << tag->author() << " type " << tag->type());
410
411 if (!muon.combinedTrackParticleLink().isValid()) {
412 // create primary track particle
413 // get summary
414 const Trk::Track* idTrack = candidate->indetTrackParticle().track();
415 const Trk::Track* msTrack = tag->muonCandidate().extrapolatedTrack() ? tag->muonCandidate().extrapolatedTrack()
416 : &tag->muonCandidate().muonSpectrometerTrack();
417
418 const Trk::TrackSummary* idSummary = idTrack ? idTrack->trackSummary() : nullptr;
419 const Trk::TrackSummary* msSummary = msTrack->trackSummary();
420
421 Trk::TrackSummary summary;
422 if (idSummary) summary += *idSummary;
423 if (msSummary) summary += *msSummary;
424
425 Trk::FitQuality fq(tag->matchChi2(), 5);
426 Trk::TrackInfo info(msTrack->info());
427 // todo update patrec bit set adding ID values
428
429 if (outputData.combinedTrackParticleContainer) {
430 xAOD::TrackParticle* tp = m_particleCreator->createParticle(ctx, &tag->combinedParameters(), &fq, &info, &summary, {}, {},
431 xAOD::muon, outputData.combinedTrackParticleContainer);
432 if (!tp) {
433 ATH_MSG_WARNING("Failed to create track particle");
434 } else {
437 std::vector<float> dummy_cov(15, 0.);
438 tp->setTrackParameterCovarianceMatrix(0, dummy_cov);
439
440 ElementLink<xAOD::TrackParticleContainer> link(*outputData.combinedTrackParticleContainer,
441 outputData.combinedTrackParticleContainer->size() - 1);
442 if (link.isValid()) {
443 // link.toPersistent();
444 ATH_MSG_DEBUG("Adding statistical combination: pt " << (*link)->pt() << " eta " << (*link)->eta() << " phi "
445 << (*link)->phi());
446 muon.setTrackParticleLink(xAOD::Muon::CombinedTrackParticle, link);
447 }
448 // for the purpose of the truth matching, set the track link to point to
449 // the ID track
450 // tp->setTrackLink(candidate.indetTrackParticle().trackLink());
451 tp->setTrackLink(ElementLink<TrackCollection>());
452 std::bitset<xAOD::NumberOfTrackRecoInfo> pattern;
453 pattern.set(xAOD::STACO);
454 tp->setPatternRecognitionInfo(pattern);
455
456 const xAOD::TrackParticle &id_track_particle = candidate->indetTrackParticle();
457 for (const std::unique_ptr< SG::Accessor<float> > &accessor : m_copyFloatSummaryAccessors ) {
458 (*accessor)( *tp ) = (*accessor)( id_track_particle );
459 }
460 for (const std::unique_ptr< SG::Accessor<uint8_t> > &accessor : m_copyCharSummaryAccessors ) {
461 (*accessor)( *tp ) = (*accessor)( id_track_particle );
462 }
463
464 }
465 } // endif outputData.combinedTrackParticleContainer
466 }
467
468 // add muon candidate
469 addMuonCandidate(ctx, tag->muonCandidate(), muon, outputData);
470
471 // Add inner match chi^2
472 muon.setParameter(5, xAOD::Muon::msInnerMatchDOF);
473 muon.setParameter(static_cast<float>(tag->matchChi2()), xAOD::Muon::msInnerMatchChi2);
474
475 // STACO parameters added as auxdata
476 acc_d0(muon) = tag->combinedParameters().parameters()[Trk::d0];
477 acc_z0(muon) = tag->combinedParameters().parameters()[Trk::z0];
478 acc_phi0(muon) = tag->combinedParameters().parameters()[Trk::phi0];
479 acc_theta(muon) = tag->combinedParameters().parameters()[Trk::theta];
480 acc_qOverP(muon) = tag->combinedParameters().parameters()[Trk::qOverP];
481 acc_qOverPerr(muon) = Amg::error(*tag->combinedParameters().covariance(), Trk::qOverP);
482
483 ATH_MSG_DEBUG("Done adding Staco Muon " << tag->author() << " type " << tag->type());
484 }
ToolHandle< Trk::ITrackParticleCreatorTool > m_particleCreator
std::vector< std::unique_ptr< SG::AuxElement::Accessor< float > > > m_copyFloatSummaryAccessors
std::vector< std::unique_ptr< SG::AuxElement::Accessor< uint8_t > > > m_copyCharSummaryAccessors
const TrackInfo & info() const
Returns a const ref to info of a const tracks.
void setTrackParameterCovarianceMatrix(unsigned int index, std::vector< float > &cov)
Set the cov matrix of the parameter at 'index', using a vector of floats.
void setTrackLink(const ElementLink< TrackCollection > &track)
Set the link to the original track.
void setPatternRecognitionInfo(const std::bitset< xAOD::NumberOfTrackRecoInfo > &patternReco)
Method setting the pattern recognition algorithm, using a bitset.
double error(const Amg::MatrixX &mat, int index)
return diagonal error of the matrix caller should ensure the matrix is symmetric and the index is in ...
@ phi0
Definition ParamDefs.h:65
@ theta
Definition ParamDefs.h:66
@ qOverP
perigee
Definition ParamDefs.h:67
@ d0
Definition ParamDefs.h:63
@ z0
Definition ParamDefs.h:64
TrackParticle_v1 TrackParticle
Reference the current persistent version:
@ STACO
Tracks produced by STACO.

◆ collectCells()

void MuonCombined::MuonCreatorTool::collectCells ( const EventContext & ctx,
xAOD::Muon & muon,
xAOD::CaloClusterContainer * clusterContainer,
const Trk::CaloExtension * inputCaloExt = nullptr ) const
private

Definition at line 1371 of file MuonCreatorTool.cxx.

1372 {
1373 const xAOD::TrackParticle* tp = muon.primaryTrackParticle();
1374 if (!tp || !clusterContainer) {
1375 if (!tp) ATH_MSG_WARNING("Can not get primary track.");
1376 return;
1377 }
1378
1379 // get ParticleCellAssociation
1380 ATH_MSG_DEBUG(" Selected track: pt " << tp->pt() << " eta " << tp->eta() << " phi " << tp->phi());
1381
1382 xAOD::CaloCluster* cluster = nullptr;
1383 SG::ReadHandle<CaloCellContainer> container(m_cellContainerName, ctx);
1384
1385 SG::ReadCondHandle<CaloDetDescrManager> caloMgrHandle{m_caloMgrKey, ctx};
1386 const CaloDetDescrManager* caloDDMgr = *caloMgrHandle;
1387
1388 if (!inputCaloExt) { // need to make one
1389 // for some reason, ID tracks need to be extrapolated from the ID exit, and
1390 // combined from the perigee
1391 std::unique_ptr<Trk::CaloExtension> caloExtension = m_caloExtTool->caloExtension(ctx, *tp);
1392 if (!caloExtension) {
1393 ATH_MSG_WARNING("Cannot get caloExtension.");
1394 return;
1395 }
1396 if (caloExtension->caloLayerIntersections().empty())
1397 ATH_MSG_DEBUG("Received a caloExtension object without track extrapolation");
1398
1399 cluster = m_cellCollector.collectCells(*caloExtension, caloDDMgr, *container, *clusterContainer);
1400 } else
1401 cluster = m_cellCollector.collectCells(*inputCaloExt, caloDDMgr, *container, *clusterContainer);
1402
1403 if (!cluster) {
1404 ATH_MSG_DEBUG("Failed to create cluster from ParticleCellAssociation");
1405 return;
1406 } else {
1407 ATH_MSG_DEBUG(" New cluster: eta " << cluster->eta() << " phi " << cluster->phi() << " cells " << cluster->size());
1408 }
1409
1410 // create element links
1411 ElementLink<xAOD::CaloClusterContainer> clusterLink(*clusterContainer, cluster->index(), ctx);
1412 muon.setClusterLink(clusterLink);
1413 const CaloNoise* caloNoise = nullptr;
1414 if (!m_caloNoiseKey.empty()) {
1415 SG::ReadCondHandle<CaloNoise> noiseH(m_caloNoiseKey, ctx);
1416 caloNoise = noiseH.cptr();
1417 }
1418 // collect the core energy
1419 std::vector<float> etcore(4, 0);
1420 m_cellCollector.collectEtCore(*cluster, etcore, caloNoise, m_sigmaCaloNoiseCut);
1421
1422 acc_ET_Core(muon) = etcore[Rec::CaloCellCollector::ET_Core];
1423 acc_ET_EMCore(muon) = etcore[Rec::CaloCellCollector::ET_EMCore];
1424 acc_ET_TileCore(muon) = etcore[Rec::CaloCellCollector::ET_TileCore];
1425 acc_ET_HECCore(muon) = etcore[Rec::CaloCellCollector::ET_HECCore];
1426 if (m_caloNoiseKey.empty())
1427 ATH_MSG_DEBUG("NO Tool for calo noise,sigma: " << m_sigmaCaloNoiseCut);
1428 else
1429 ATH_MSG_DEBUG("sigma: " << m_sigmaCaloNoiseCut);
1430
1431 ATH_MSG_DEBUG("Etcore: tot/em/tile/hec "
1432 << etcore[Rec::CaloCellCollector::ET_Core] << "/" << etcore[Rec::CaloCellCollector::ET_EMCore] << "/"
1434 }
ToolHandle< Trk::IParticleCaloExtensionTool > m_caloExtTool
SG::ReadHandleKey< CaloCellContainer > m_cellContainerName
SG::ReadCondHandleKey< CaloDetDescrManager > m_caloMgrKey
Gaudi::Property< float > m_sigmaCaloNoiseCut
SG::ReadCondHandleKey< CaloNoise > m_caloNoiseKey
Rec::CaloCellCollector m_cellCollector
virtual double eta() const
The pseudorapidity ( ) of the particle.
size_t size() const
size method (forwarded from CaloClusterCellLink obj)
virtual double phi() const
The azimuthal angle ( ) of the particle.
virtual double phi() const override final
The azimuthal angle ( ) of the particle (has range to .).
virtual double pt() const override final
The transverse momentum ( ) of the particle.
virtual double eta() const override final
The pseudorapidity ( ) of the particle.
const SG::AuxVectorData * container() const
Return the container holding this element.
CaloCluster_v1 CaloCluster
Define the latest version of the calorimeter cluster class.

◆ create() [1/4]

xAOD::Muon * MuonCombined::MuonCreatorTool::create ( const EventContext & ctx,
const MuonCandidate & candidate,
OutputData & outputData ) const
finaloverridevirtual

IMuonCreatorTool interface: create a muon from a muon candidate.

Implements MuonCombined::IMuonCreatorTool.

Definition at line 178 of file MuonCreatorTool.cxx.

178 {
179 // skip all muons without extrapolated track
180 if (m_requireMSOEforSA && !candidate.extrapolatedTrack()) {
181 ATH_MSG_DEBUG("MuonCreatorTool::create(...) No extrapolated track - aborting. Will not create Muon.");
182 return nullptr; // Do we really want to do this?
183 }
184
185 // Create the xAOD object:
186 xAOD::Muon* muon = new xAOD::Muon();
187 outputData.muonContainer->push_back(muon);
188 decorateDummyValues(ctx, *muon, outputData);
189
190 muon->setAuthor(xAOD::Muon::MuidSA);
191 muon->setMuonType(xAOD::Muon::MuonStandAlone);
192 muon->addAllAuthor(xAOD::Muon::MuidSA);
193
194 // create candidate from SA muon only
195 addMuonCandidate(ctx, candidate, *muon, outputData);
196
197 using TrackParticleType = xAOD::Muon::TrackParticleType;
198 if (m_requireMSOEforSA && !muon->trackParticle(TrackParticleType::ExtrapolatedMuonSpectrometerTrackParticle)) {
199 ATH_MSG_DEBUG("Creation of track particle for SA muon failed, removing it");
200 outputData.muonContainer->pop_back();
201 return nullptr;
202 }
203
204 if (!dressMuon(*muon)) {
205 ATH_MSG_WARNING("Failed to dress muon");
206 outputData.muonContainer->pop_back();
207 return nullptr;
208 }
209
210 const xAOD::TrackParticle* track = muon->trackParticle(TrackParticleType::ExtrapolatedMuonSpectrometerTrackParticle);
211 if (!track) track = muon->primaryTrackParticle();
212 std::unique_ptr<Trk::CaloExtension> caloExtension = m_caloExtTool->caloExtension(ctx, *track);
213 if (m_requireCaloDepositForSA && !caloExtension) {
214 ATH_MSG_DEBUG("failed to get a calo extension for this SA muon, discard it");
215 outputData.muonContainer->pop_back();
216 return nullptr;
217 }
218 if (m_requireCaloDepositForSA && caloExtension->caloLayerIntersections().empty()) {
219 ATH_MSG_DEBUG("failed to retrieve any calo layers for this SA muon, discard it");
220 outputData.muonContainer->pop_back();
221 return nullptr;
222 }
223 // check if there is a cluster container, if yes collect the cells around the
224 // muon and fill Etcore variables for muon
225 if (caloExtension && m_useCaloCells) collectCells(ctx, *muon, outputData.clusterContainer, caloExtension.get());
226
227 return muon;
228 }
Gaudi::Property< bool > m_useCaloCells
bool dressMuon(xAOD::Muon &muon) const
void collectCells(const EventContext &ctx, xAOD::Muon &muon, xAOD::CaloClusterContainer *clusterContainer, const Trk::CaloExtension *inputCaloExt=nullptr) const
Gaudi::Property< bool > m_requireCaloDepositForSA
Gaudi::Property< bool > m_requireMSOEforSA
void decorateDummyValues(const EventContext &ctx, xAOD::Muon &muon, OutputData &outputData) const
De^corated a bunch of dummy values to the muon to ensure data consistency in the xAOD.
Muon_v1 Muon
Reference the current persistent version:

◆ create() [2/4]

void MuonCombined::MuonCreatorTool::create ( const EventContext & ctx,
const MuonCandidateCollection * muonCandidates,
const std::vector< const InDetCandidateToTagMap * > & tagMaps,
OutputData & outputData ) const
finaloverridevirtual

IMuonCreatorTool interface: build muons from ID and MS candidates.

Implements MuonCombined::IMuonCreatorTool.

Definition at line 116 of file MuonCreatorTool.cxx.

117 {
118 create(ctx, muonCandidates, tagMaps, outputData, false);
119 create(ctx, muonCandidates, tagMaps, outputData, true);
120 }
virtual void create(const EventContext &ctx, const MuonCandidateCollection *muonCandidates, const std::vector< const InDetCandidateToTagMap * > &tagMaps, OutputData &outputData) const override final
IMuonCreatorTool interface: build muons from ID and MS candidates.

◆ create() [3/4]

void MuonCombined::MuonCreatorTool::create ( const EventContext & ctx,
const MuonCandidateCollection * muonCandidates,
const std::vector< const InDetCandidateToTagMap * > & tagMaps,
OutputData & outputData,
bool select_comissioning ) const
private

Definition at line 121 of file MuonCreatorTool.cxx.

123 {
124 // Create containers for resolved candidates (always of type VIEW_ELEMENTS)
125 InDetCandidateTagsMap resolvedInDetCandidates;
126 // std::vector<const MuonCombined::InDetCandidate*> resolvedInDetCandidates;
127 std::vector<const MuonCombined::MuonCandidate*> resolvedMuonCandidates;
128
129 // Resolve Overlap
131 resolveOverlaps(ctx, muonCandidates, tagMaps, resolvedInDetCandidates, resolvedMuonCandidates, select_commissioning);
132 else if (!select_commissioning)
133 selectStaus(resolvedInDetCandidates, tagMaps);
134
135 unsigned int numIdCan = resolvedInDetCandidates.size();
136 unsigned int numMuCan = muonCandidates ? muonCandidates->size() : 0;
137 ATH_MSG_DEBUG("Creating xAOD::Muons from: " << numIdCan << " indet candidates and " << numMuCan << " muon candidates ");
138
139 if (!m_buildStauContainer && muonCandidates)
140 ATH_MSG_DEBUG("MuonCandidates : overlap removal " << muonCandidates->size() << " in, " << resolvedMuonCandidates.size()
141 << " out");
142
143 // Create a container for resolved candidates (always of type VIEW_ELEMENTS)
144 for (InDetCandidateTags& can : resolvedInDetCandidates) {
145 ATH_MSG_DEBUG("New InDetCandidate");
146 xAOD::Muon* muon = create(ctx, can, outputData);
147 if (!muon) {
148 ATH_MSG_DEBUG("no muon found");
149 } else {
150 ATH_MSG_DEBUG("muon found");
151 if (select_commissioning) { muon->addAllAuthor(xAOD::Muon::Author::Commissioning); }
152
153 if (!muon->primaryTrackParticleLink().isValid()) {
154 ATH_MSG_ERROR("This muon has no valid primaryTrackParticleLink! Author=" << muon->author());
155 }
156 }
157 ATH_MSG_DEBUG("Creation of Muon from InDetCandidates done");
158 }
159 if (!m_requireIDTracks) { // only build SA muons if ID tracks are not required
160 for (const MuonCombined::MuonCandidate* can : resolvedMuonCandidates) {
161 ATH_MSG_DEBUG("New MuonCandidate");
162 xAOD::Muon* muon = create(ctx, *can, outputData);
163 if (muon && select_commissioning) { muon->addAllAuthor(xAOD::Muon::Author::Commissioning); }
164 ATH_MSG_DEBUG("Creation of Muon from MuonCandidates done");
165 }
166 }
167
168 if (msgLvl(MSG::DEBUG) || m_printSummary) {
169 ATH_MSG_INFO("Printing muon container:");
170 ATH_MSG_INFO(m_muonPrinter->print(*outputData.muonContainer));
171 ATH_MSG_INFO("Done");
172 }
173 if (msgLvl(MSG::VERBOSE) && outputData.clusterContainer) {
174 ATH_MSG_VERBOSE("Associated clusters : " << outputData.clusterContainer->size());
175 }
176 }
#define ATH_MSG_ERROR(x)
#define ATH_MSG_INFO(x)
bool msgLvl(const MSG::Level lvl) const
size_type size() const noexcept
Returns the number of elements in the collection.
std::pair< const InDetCandidate *, std::vector< const TagBase * > > InDetCandidateTags
std::vector< InDetCandidateTags > InDetCandidateTagsMap
void resolveOverlaps(const EventContext &ctx, const MuonCandidateCollection *muonCandidates, const std::vector< const InDetCandidateToTagMap * > &tagMaps, InDetCandidateTagsMap &resolvedInDetCandidates, std::vector< const MuonCombined::MuonCandidate * > &resolvedMuonCandidates, bool select_comissioning=false) const
ToolHandle< Rec::IMuonPrintingTool > m_muonPrinter
void selectStaus(InDetCandidateTagsMap &resolvedInDetCandidates, const std::vector< const InDetCandidateToTagMap * > &tagMaps) const
Gaudi::Property< bool > m_printSummary
Gaudi::Property< bool > m_buildStauContainer
Gaudi::Property< bool > m_requireIDTracks
In case of running the muon reconstruction with LRT tracks this property removes the overlap of muons...

◆ create() [4/4]

xAOD::Muon * MuonCombined::MuonCreatorTool::create ( const EventContext & ctx,
InDetCandidateTags & candidate,
OutputData & outputData ) const
finaloverridevirtual

IMuonCreatorTool interface: create a muon from a muon candidate.

Implements MuonCombined::IMuonCreatorTool.

Definition at line 250 of file MuonCreatorTool.cxx.

250 {
251 // no tags, no muon
252 if (candidate.second.empty()) {
253 ATH_MSG_DEBUG("MuonCreatorTool::create(...) - InDetCandidate with empty combinedDataTags. Aborting. Will not create Muon.");
254 return nullptr;
255 }
256 const std::vector<const TagBase*>& tags = candidate.second;
257 if (tags.size() == 1 && !m_buildStauContainer) {
258 const MuGirlLowBetaTag* muGirlLowBetaTag = dynamic_cast<const MuGirlLowBetaTag*>(tags[0]);
259 if (muGirlLowBetaTag) {
260 ATH_MSG_DEBUG("Track has only a MuGirlLowBetaTag but Staus are not being built, so will not create muon");
261 return nullptr;
262 }
263 }
264
265 // Create the xAOD object:
266 xAOD::Muon* muon = new xAOD::Muon();
267 outputData.muonContainer->push_back(muon);
268 muon->setMuonSegmentLinks(std::vector<ElementLink<xAOD::MuonSegmentContainer>>{});
269
270 // now we need to sort the tags to get the best muon
271
272 // set the link to the ID track particle
273 muon->setTrackParticleLink(xAOD::Muon::InnerDetectorTrackParticle, candidate.first->indetTrackParticleLink());
274 ATH_MSG_DEBUG("Adding InDet Track: pt " << candidate.first->indetTrackParticle().pt() << " eta "
275 << candidate.first->indetTrackParticle().eta() << " phi "
276 << candidate.first->indetTrackParticle().phi());
277
278 ATH_MSG_DEBUG("creating Muon with " << tags.size() << " tags ");
279 // loop over the tags
280
281 decorateDummyValues(ctx, *muon, outputData);
282 bool first = true;
283 for (const MuonCombined::TagBase* tag : tags) {
284 ATH_MSG_DEBUG("Handling tag: type " << tag->type());
285
286 // staus
288 const MuGirlLowBetaTag* muGirlLowBetaTag = dynamic_cast<const MuGirlLowBetaTag*>(tag);
289
290 if (muGirlLowBetaTag) {
291 ATH_MSG_DEBUG("MuonCreatorTool MuGirlLowBetaTag ");
292
293 muon->setAuthor(tag->author());
294 muon->setMuonType(tag->type());
295
296 if (tag->type() == xAOD::Muon::Combined) {
297 ATH_MSG_DEBUG("MuonCreatorTool MuGirlLowBetaTag combined");
298
299 // Create the xAOD object:
300 if (outputData.slowMuonContainer) {
301 xAOD::SlowMuon* slowMuon = new xAOD::SlowMuon();
302 outputData.slowMuonContainer->push_back(slowMuon);
303
304 addMuGirlLowBeta(ctx, *muon, muGirlLowBetaTag, slowMuon,
305 outputData); // CHECK to see what variables are created here.
306
307 ATH_MSG_DEBUG("slowMuon muonContainer size " << outputData.muonContainer->size());
308 ElementLink<xAOD::MuonContainer> muonLink(*outputData.muonContainer, outputData.muonContainer->size() - 1);
309 if (slowMuon && muonLink.isValid()) {
310 ATH_MSG_DEBUG("slowMuon muonLink valid");
311 slowMuon->setMuonLink(muonLink);
312 }
313 }
314 }
315 }
316 } else {
317 // Don't want staus in muon branch
318 const MuGirlLowBetaTag* muGirlLowBetaTag = dynamic_cast<const MuGirlLowBetaTag*>(tag);
319 if (muGirlLowBetaTag) continue;
320
321 // set author info
322 if (first) {
323 ATH_MSG_DEBUG("MuonCreatorTool first muon tag: author=" << tag->author() << " type=" << tag->type());
324 muon->setAuthor(tag->author());
325 muon->setMuonType(tag->type());
326 // Overrride type if InDet track is SiAssociated.
327 if (candidate.first->isSiliconAssociated()) { muon->setMuonType(xAOD::Muon::SiliconAssociatedForwardMuon); }
328 first = false;
329 }
330
331 muon->addAllAuthor(tag->author());
332
333 // this is not too elegant, maybe rethink implementation
334 xAOD::Muon::MuonType type = tag->type();
335 if (type == xAOD::Muon::Combined) {
336 // work out type of tag
337 const CombinedFitTag* cbFitTag = dynamic_cast<const CombinedFitTag*>(tag);
338 const StacoTag* stacoTag = dynamic_cast<const StacoTag*>(tag);
339 const MuGirlTag* muGirlTag = dynamic_cast<const MuGirlTag*>(tag);
340
341 addCombinedFit(ctx, *muon, cbFitTag, outputData);
342 addMuGirl(ctx, *muon, muGirlTag, outputData);
343 addStatisticalCombination(ctx, *muon, candidate.first, stacoTag, outputData);
344 if (!(cbFitTag || stacoTag || muGirlTag)) { ATH_MSG_WARNING("Unknown combined tag "); }
345
346 } else if (type == xAOD::Muon::SegmentTagged) {
347 const SegmentTag* segTag = dynamic_cast<const SegmentTag*>(tag);
348 const MuGirlTag* muGirlTag = dynamic_cast<const MuGirlTag*>(tag);
349
350 addSegmentTag(ctx, *muon, segTag, outputData);
351 addMuGirl(ctx, *muon, muGirlTag, outputData);
352
353 if (!(segTag || muGirlTag)) { ATH_MSG_WARNING("Unknown segment-tagged tag "); }
354 } else if (type == xAOD::Muon::CaloTagged) {
355 const CaloTag* caloTag = dynamic_cast<const CaloTag*>(tag);
356 addCaloTag(*muon, caloTag);
357 if (!caloTag) { ATH_MSG_WARNING("Unknown calo tag type "); }
358 } else {
359 ATH_MSG_WARNING("Unknown tag type. Type= " + std::to_string(type));
360 }
361 }
362 } // m_buildStauContainer
363
364 if (!dressMuon(*muon)) {
365 ATH_MSG_WARNING("Failed to dress muon");
366 outputData.muonContainer->pop_back();
367 // if we are dealing with staus, also need to remove the slowMuon
368 if (m_buildStauContainer) outputData.slowMuonContainer->pop_back();
369 return nullptr;
370 }
371
372 // If eLoss is not already available then build it
373 float eLoss = -1;
374 bool haveEloss = muon->parameter(eLoss, xAOD::Muon::EnergyLoss);
375 if (!haveEloss || eLoss == 0) {
376 ATH_MSG_DEBUG("Adding Energy Loss to muon" << std::endl << m_muonPrinter->print(*muon));
377 addEnergyLossToMuon(*muon);
378 }
379
380 // check if there is a cluster container, if yes collect the cells around the
381 // muon and fill Etcore variables for muon
382 if (m_useCaloCells) collectCells(ctx, *muon, outputData.clusterContainer, candidate.first->getCaloExtension());
383
384 ATH_MSG_DEBUG("Done creating muon with " << acc_nUnspoiledCscHits(*muon) << " unspoiled csc hits");
385
386 return muon;
387 }
void addCaloTag(xAOD::Muon &muon, const CaloTag *tag) const
void addSegmentTag(const EventContext &ctx, xAOD::Muon &muon, const SegmentTag *tag, OutputData &outputData) const
void addMuGirlLowBeta(const EventContext &ctx, xAOD::Muon &muon, const MuGirlLowBetaTag *tag, xAOD::SlowMuon *slowMuon, OutputData &outputData) const
void addEnergyLossToMuon(xAOD::Muon &muon) const
void addCombinedFit(const EventContext &ctx, xAOD::Muon &muon, const CombinedFitTag *tag, OutputData &outputData) const
void addMuGirl(const EventContext &ctx, xAOD::Muon &muon, const MuGirlTag *tag, OutputData &outputData) const
void addStatisticalCombination(const EventContext &ctx, xAOD::Muon &muon, const InDetCandidate *candidate, const StacoTag *tag, OutputData &outputData) const
void setMuonLink(const ElementLink< MuonContainer > &muonLink)
Sets.
std::vector< std::string > tags
Definition hcg.cxx:107
bool first
Definition DeMoScan.py:534
SlowMuon_v1 SlowMuon
Reference the current persistent version:
Definition SlowMuon.h:13

◆ createDummyTrack()

std::unique_ptr< Trk::Track > MuonCombined::MuonCreatorTool::createDummyTrack ( const EventContext & ctx,
const std::vector< const Muon::MuonSegment * > & segments,
const Trk::Track & indetTrack ) const
private

Definition at line 1170 of file MuonCreatorTool.cxx.

1172 {
1173 ATH_MSG_VERBOSE("Creating dummy tracks from segments...");
1174
1175 auto trackStateOnSurfaces = std::make_unique<Trk::TrackStates>();
1176
1177 for (const Muon::MuonSegment* seg : segments) {
1178 // create pars for muon and loop over hits
1179 double momentum{1e8}, charge{0.};
1180 std::unique_ptr<const Trk::TrackParameters> pars{m_edmHelperSvc->createTrackParameters(*seg, momentum, charge)};
1181 for (const Trk::MeasurementBase* meas : seg->containedMeasurements()) {
1182 std::bitset<Trk::TrackStateOnSurface::NumberOfTrackStateOnSurfaceTypes> typePattern(0);
1184 // TSoS takes ownership
1185 std::unique_ptr<Trk::TrackParameters> exPars{m_propagator->propagateParameters(
1186 ctx, *pars, meas->associatedSurface(), Trk::anyDirection, false, Trk::MagneticFieldProperties(Trk::NoField))};
1187 if (!exPars) { ATH_MSG_VERBOSE("Could not propagate Track to segment surface"); }
1188 Trk::TrackStateOnSurface* trackState =
1189 new Trk::TrackStateOnSurface(meas->uniqueClone(), std::move(exPars), nullptr, typePattern);
1190 trackStateOnSurfaces->push_back(trackState);
1191 } // end segment loop
1192 }
1193
1194 Trk::TrackInfo info(Trk::TrackInfo::Unknown, Trk::muon);
1196 info.setPatternRecognitionInfo(author);
1197 std::unique_ptr<Trk::Track> newtrack =
1198 std::make_unique<Trk::Track>(info, std::move(trackStateOnSurfaces), (indetTrack.fitQuality())->uniqueClone());
1199
1200 // create a track summary for this track
1201 if (m_trackSummaryTool.isEnabled()) { m_trackSummaryTool->computeAndReplaceTrackSummary(ctx, *newtrack, false); }
1202
1203 return newtrack;
1204 }
double charge(const T &p)
Definition AtlasPID.h:997
ToolHandle< Trk::IPropagator > m_propagator
ServiceHandle< Muon::IMuonEDMHelperSvc > m_edmHelperSvc
ToolHandle< Trk::IExtendedTrackSummaryTool > m_trackSummaryTool
@ Measurement
This is a measurement, and will at least contain a Trk::MeasurementBase.
const FitQuality * fitQuality() const
return a pointer to the fit quality const-overload
@ anyDirection
@ NoField
Field is set to 0., 0., 0.,.

◆ createMuonSegmentElementLink()

ElementLink< xAOD::MuonSegmentContainer > MuonCombined::MuonCreatorTool::createMuonSegmentElementLink ( const EventContext & ctx,
const Muon::MuonSegment * segLink,
const OutputData & outData ) const
private

Definition at line 785 of file MuonCreatorTool.cxx.

787 {
788 if (outData.xaodSegmentContainer && outData.tagToSegmentAssocMap) {
789 // if a muon segment collection is provided, duplicate the segment and
790 // create a link to that
791 unsigned int link = outData.tagToSegmentAssocMap->linkIndex(trkSeg);
792 if (link >= outData.xaodSegmentContainer->size()) {
793 ATH_MSG_WARNING("Failed to retrieve a proper link for segment " << m_printer->print(*trkSeg));
794 return {};
795 }
796 ElementLink<xAOD::MuonSegmentContainer> eleLink{*outData.xaodSegmentContainer, link, ctx};
797 return eleLink;
798 }
799 return ElementLink<xAOD::MuonSegmentContainer>();
800 }
PublicToolHandle< Muon::MuonEDMPrinterTool > m_printer

◆ createTrackParticleElementLink()

ElementLink< xAOD::TrackParticleContainer > MuonCombined::MuonCreatorTool::createTrackParticleElementLink ( const EventContext & ctx,
const ElementLink< TrackCollection > & trackLink,
xAOD::TrackParticleContainer & trackParticleContainer,
TrackCollection * trackCollection = 0 ) const
private

function creates an element link to a track particle from the track and the TrackParticle collection.

if a TrackCollection is also provided, the element link to the track will also be set takes ownership of the track

Definition at line 758 of file MuonCreatorTool.cxx.

761 {
762 ATH_MSG_DEBUG("createTrackParticleElementLink");
763 xAOD::TrackParticle* tp = nullptr;
764 if (trackCollection) {
765 trackCollection->push_back(new Trk::Track(**trackLink));
766 // want to link the track particle to this track
767 ElementLink<TrackCollection> link(*trackCollection, trackCollection->size() - 1);
768 if (link.isValid())
769 tp = m_particleCreator->createParticle(ctx, link, &trackParticleContainer, nullptr, xAOD::muon);
770 else
771 ATH_MSG_WARNING("new Track Collection link invalid");
772 }
773 if (!tp) {
774 // create track particle without a link to the track
775 tp = m_particleCreator->createParticle(ctx, **trackLink, &trackParticleContainer, nullptr, xAOD::muon);
776 }
777
778 if (tp) {
779 ElementLink<xAOD::TrackParticleContainer> link(trackParticleContainer, trackParticleContainer.size() - 1);
780 return link;
781 }
782 return ElementLink<xAOD::TrackParticleContainer>();
783 }
value_type push_back(value_type pElem)
Add an element to the end of the collection.

◆ declareGaudiProperty()

Gaudi::Details::PropertyBase & AthCommonDataStore< AthCommonMsg< AlgTool > >::declareGaudiProperty ( Gaudi::Property< T, V, H > & hndl,
const SG::VarHandleKeyType &  )
inlineprivateinherited

specialization for handling Gaudi::Property<SG::VarHandleKey>

Definition at line 156 of file AthCommonDataStore.h.

158 {
160 hndl.value(),
161 hndl.documentation());
162
163 }
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T, V, H > &t)

◆ declareProperty()

Gaudi::Details::PropertyBase & AthCommonDataStore< AthCommonMsg< AlgTool > >::declareProperty ( Gaudi::Property< T, V, H > & t)
inlineinherited

Definition at line 145 of file AthCommonDataStore.h.

145 {
146 typedef typename SG::HandleClassifier<T>::type htype;
148 }
Gaudi::Details::PropertyBase & declareGaudiProperty(Gaudi::Property< T, V, H > &hndl, const SG::VarHandleKeyType &)
specialization for handling Gaudi::Property<SG::VarHandleKey>

◆ decorateDummyValues()

void MuonCombined::MuonCreatorTool::decorateDummyValues ( const EventContext & ctx,
xAOD::Muon & muon,
OutputData & outputData ) const
private

De^corated a bunch of dummy values to the muon to ensure data consistency in the xAOD.

Unspoiled CSC hits

Definition at line 230 of file MuonCreatorTool.cxx.

230 {
231 // Set variables to zero by calling the functions with null pointers.
232 addCaloTag(muon, nullptr);
233 addCombinedFit(ctx, muon, nullptr, outputData);
234 addStatisticalCombination(ctx, muon, nullptr, nullptr, outputData);
235 addMuGirl(ctx, muon, nullptr, outputData);
236 addSegmentTag(ctx, muon, nullptr, outputData);
237
239 acc_nUnspoiledCscHits(muon) = 0;
240 acc_MuonSpectrometerPt(muon) = -1;
241 acc_InnerDetectorPt(muon) = -1;
242
243 acc_ET_Core(muon) = 0;
244 acc_ET_EMCore(muon) = 0;
245 acc_ET_TileCore(muon) = 0;
246 acc_ET_HECCore(muon) = 0;
247
248 fillEnergyLossFromTrack(muon, nullptr);
249 }

◆ detStore()

const ServiceHandle< StoreGateSvc > & AthCommonDataStore< AthCommonMsg< AlgTool > >::detStore ( ) const
inlineinherited

The standard StoreGateSvc/DetectorStore Returns (kind of) a pointer to the StoreGateSvc.

Definition at line 95 of file AthCommonDataStore.h.

◆ dressMuon()

bool MuonCombined::MuonCreatorTool::dressMuon ( xAOD::Muon & muon) const
private

Definition at line 1206 of file MuonCreatorTool.cxx.

1206 {
1207 if (!muon.primaryTrackParticleLink().isValid()) {
1208 ATH_MSG_DEBUG("No primary track particle set, deleting muon");
1209 return false;
1210 }
1211 const xAOD::TrackParticle* primary = muon.primaryTrackParticle();
1212 // update parameters with primary track particle
1213 setP4(muon, *primary);
1214 const float qOverP = primary->qOverP();
1215 if (qOverP != 0.0) {
1216 muon.setCharge(qOverP > 0 ? 1. : -1.);
1217 } else {
1218 ATH_MSG_WARNING("MuonCreatorTool::dressMuon - trying to set qOverP, but value from muon.primaryTrackParticle ["
1219 << muon.primaryTrackParticleLink().dataID()
1220 << "] is zero. Setting charge=0.0. The eta/phi of the muon is: " << muon.eta() << " / " << muon.phi());
1221 muon.setCharge(0.0);
1222 }
1223
1224 // add hit summary
1225 m_muonDressingTool->addMuonHitSummary(muon);
1226
1227 // calculate scattering significance and momentum balance significance
1228 if (!m_scatteringAngleTool.empty()) {
1229 Rec::ScatteringAngleSignificance scatSign = m_scatteringAngleTool->scatteringAngleSignificance(muon);
1230 float curvatureSignificance = scatSign.curvatureSignificance();
1231 muon.setParameter(curvatureSignificance, xAOD::Muon::scatteringCurvatureSignificance);
1232 float neighbourSignificance = scatSign.neighbourSignificance();
1233 muon.setParameter(neighbourSignificance, xAOD::Muon::scatteringNeighbourSignificance);
1234 ATH_MSG_VERBOSE("Got curvatureSignificance " << curvatureSignificance << " and neighbourSignificance "
1235 << neighbourSignificance);
1236 }
1237
1238 if (!m_momentumBalanceTool.empty()) {
1239 float momentumBalanceSignificance = m_momentumBalanceTool->momentumBalanceSignificance(muon);
1240 muon.setParameter(momentumBalanceSignificance, xAOD::Muon::momentumBalanceSignificance);
1241 ATH_MSG_VERBOSE("Got momentumBalanceSignificance " << momentumBalanceSignificance);
1242 }
1243
1244 if (!m_meanMDTdADCTool.empty()) {
1245 float meanDeltaADC = float(m_meanMDTdADCTool->meanMDTdADCFiller(muon));
1246 muon.setParameter(meanDeltaADC, xAOD::Muon::meanDeltaADCCountsMDT);
1247 ATH_MSG_VERBOSE("Got meanDeltaADCCountsMDT " << meanDeltaADC);
1248 }
1249
1250 if (!m_selectorTool.empty()) {
1251 acc_MuonSpectrometerPt(muon) = muon.pt();
1252 acc_InnerDetectorPt(muon) = muon.pt();
1253 // set id cuts
1254 m_selectorTool->setPassesIDCuts(muon);
1255 ATH_MSG_VERBOSE("Setting passesIDCuts " << muon.passesIDCuts());
1256 // set quality
1257 m_selectorTool->setQuality(muon);
1258 ATH_MSG_VERBOSE("Setting Quality " << muon.quality());
1259 }
1260
1262 const Trk::Track* trk = nullptr;
1263 if (muon.trackParticle(xAOD::Muon::CombinedTrackParticle)) {
1264 trk = muon.trackParticle(xAOD::Muon::CombinedTrackParticle)->track();
1265 }
1266 if (!trk && muon.trackParticle(xAOD::Muon::ExtrapolatedMuonSpectrometerTrackParticle)) {
1267 trk = muon.trackParticle(xAOD::Muon::ExtrapolatedMuonSpectrometerTrackParticle)->track();
1268 }
1269 if (trk) {
1271 } else {
1272 fillEnergyLossFromTrack(muon, nullptr); // Just fill empty variables.
1273 ATH_MSG_VERBOSE("Couldn't find matching track which might have energy loss.");
1274 }
1275 }
1276 return true;
1277 }
const PtrVector & stdcont() const
Return the underlying std::vector of the container.
void setP4(xAOD::Muon &muon, const xAOD::TrackParticle &tp) const
ToolHandle< Rec::IMuonScatteringAngleSignificance > m_scatteringAngleTool
ToolHandle< xAOD::IMuonDressingTool > m_muonDressingTool
ToolHandle< CP::IMuonSelectionTool > m_selectorTool
ToolHandle< Rec::IMuonMomentumBalanceSignificance > m_momentumBalanceTool
Gaudi::Property< bool > m_fillEnergyLossFromTrack
ToolHandle< Rec::IMuonMeanMDTdADCFiller > m_meanMDTdADCTool
double curvatureSignificance(void) const
ScatteringAngleSignificance inline accessor: significance of maximum curvature discontinuity.
double neighbourSignificance(void) const
ScatteringAngleSignificance inline accessor: maximum significance of neighbouring scatterers.
@ qOverP
perigee

◆ evtStore()

ServiceHandle< StoreGateSvc > & AthCommonDataStore< AthCommonMsg< AlgTool > >::evtStore ( )
inlineinherited

The standard StoreGateSvc (event store) Returns (kind of) a pointer to the StoreGateSvc.

Definition at line 85 of file AthCommonDataStore.h.

◆ extraDeps_update_handler()

void AthCommonDataStore< AthCommonMsg< AlgTool > >::extraDeps_update_handler ( Gaudi::Details::PropertyBase & ExtraDeps)
protectedinherited

Add StoreName to extra input/output deps as needed.

use the logic of the VarHandleKey to parse the DataObjID keys supplied via the ExtraInputs and ExtraOuputs Properties to add the StoreName if it's not explicitly given

◆ fillEnergyLossFromTrack()

void MuonCombined::MuonCreatorTool::fillEnergyLossFromTrack ( xAOD::Muon & muon,
const std::vector< const Trk::TrackStateOnSurface * > * tsosVector ) const
private

Definition at line 1324 of file MuonCreatorTool.cxx.

1324 {
1325 // Ensure these are set for every muon
1326 if (!tsosVector) {
1327 muon.setParameter(0.f, xAOD::Muon::EnergyLoss);
1328 muon.setParameter(0.f, xAOD::Muon::ParamEnergyLoss);
1329 muon.setParameter(0.f, xAOD::Muon::MeasEnergyLoss);
1330 muon.setParameter(0.f, xAOD::Muon::EnergyLossSigma);
1331 muon.setParameter(0.f, xAOD::Muon::MeasEnergyLossSigma);
1332 muon.setParameter(0.f, xAOD::Muon::ParamEnergyLossSigmaPlus);
1333 muon.setParameter(0.f, xAOD::Muon::ParamEnergyLossSigmaMinus);
1334
1335 muon.setEnergyLossType(xAOD::Muon::Parametrized); // Not so nice! Add 'unknown' type?
1336 muon.setParameter(0.f, xAOD::Muon::FSR_CandidateEnergy);
1337 if (m_fillExtraELossInfo) acc_numEnergyLossPerTrack(muon) = 0;
1338
1339 return;
1340 }
1341
1342 unsigned int numEnergyLossPerTrack = 0;
1343 bool problem = false;
1344 for (const auto* tsos : *tsosVector) {
1345 const Trk::MaterialEffectsOnTrack* meot = dynamic_cast<const Trk::MaterialEffectsOnTrack*>(tsos->materialEffectsOnTrack());
1346 if (!meot) continue;
1347 const Trk::EnergyLoss* el = meot->energyLoss();
1348 const CaloEnergy* caloEnergy = dynamic_cast<const CaloEnergy*>(el);
1349 if (!caloEnergy) continue;
1350 ++numEnergyLossPerTrack;
1351
1352 muon.setParameter(static_cast<float>(caloEnergy->deltaE()), xAOD::Muon::EnergyLoss);
1353 muon.setParameter(static_cast<float>(caloEnergy->deltaEParam()), xAOD::Muon::ParamEnergyLoss);
1354 muon.setParameter(static_cast<float>(caloEnergy->deltaEMeas()), xAOD::Muon::MeasEnergyLoss);
1355 muon.setParameter(static_cast<float>(caloEnergy->sigmaDeltaE()), xAOD::Muon::EnergyLossSigma);
1356 muon.setParameter(static_cast<float>(caloEnergy->sigmaDeltaEMeas()), xAOD::Muon::MeasEnergyLossSigma);
1357 muon.setParameter(static_cast<float>(caloEnergy->sigmaPlusDeltaEParam()), xAOD::Muon::ParamEnergyLossSigmaPlus);
1358 muon.setParameter(static_cast<float>(caloEnergy->sigmaMinusDeltaEParam()), xAOD::Muon::ParamEnergyLossSigmaMinus);
1359
1360 muon.setEnergyLossType(static_cast<xAOD::Muon::EnergyLossType>(caloEnergy->energyLossType()));
1361 muon.setParameter(static_cast<float>(caloEnergy->fsrCandidateEnergy()), xAOD::Muon::FSR_CandidateEnergy);
1362 }
1363 if (numEnergyLossPerTrack > 1) {
1364 ATH_MSG_VERBOSE("More than one e loss per track... ");
1365 problem = true;
1366 }
1367 if (m_fillExtraELossInfo) acc_numEnergyLossPerTrack(muon) = numEnergyLossPerTrack;
1368 if (problem) ATH_MSG_VERBOSE("Dumping problematic muon: " << m_muonPrinter->print(muon));
1369 }
CaloEnergy::EnergyLossType energyLossType(void) const
Accessor methods.
Definition CaloEnergy.h:162
double sigmaMinusDeltaEParam() const
get parametrised energy loss minus error
Definition CaloEnergy.h:140
double deltaEMeas() const
get measured energy loss
Definition CaloEnergy.h:127
double sigmaDeltaEMeas() const
get measured energy loss error
Definition CaloEnergy.h:130
double deltaEParam() const
get parametrised energy loss
Definition CaloEnergy.h:137
double sigmaPlusDeltaEParam() const
get parametrised energy loss plus error
Definition CaloEnergy.h:143
float fsrCandidateEnergy() const
FSR Candidate Energy.
Definition CaloEnergy.h:94
double sigmaDeltaE() const
returns the symmatric error
double deltaE() const
returns the
const EnergyLoss * energyLoss() const
returns the energy loss object.

◆ initialize()

StatusCode MuonCombined::MuonCreatorTool::initialize ( )
finaloverridevirtual

Definition at line 61 of file MuonCreatorTool.cxx.

61 {
62 if (m_buildStauContainer) ATH_MSG_DEBUG(" building Stau container ");
63
64 ATH_CHECK(m_idHelperSvc.retrieve());
65 ATH_CHECK(m_printer.retrieve());
66 ATH_CHECK(m_muonPrinter.retrieve());
67 ATH_CHECK(m_caloExtTool.retrieve());
68 ATH_CHECK(m_edmHelperSvc.retrieve());
69 ATH_CHECK(m_particleCreator.retrieve());
71 ATH_CHECK(m_muonDressingTool.retrieve());
72 ATH_CHECK(m_caloMgrKey.initialize());
73 ATH_CHECK(m_trackQuery.retrieve());
74 if (!m_momentumBalanceTool.empty())
76 else
77 m_momentumBalanceTool.disable();
78 if (!m_scatteringAngleTool.empty())
80 else
81 m_scatteringAngleTool.disable();
82 if (!m_selectorTool.empty())
83 ATH_CHECK(m_selectorTool.retrieve());
84 else
85 m_selectorTool.disable();
86 if (!m_meanMDTdADCTool.empty())
87 ATH_CHECK(m_meanMDTdADCTool.retrieve());
88 else
89 m_meanMDTdADCTool.disable();
90
92
93 ATH_MSG_INFO("ET_Core calculation: doNoiseCut, sigma - " << !m_caloNoiseKey.empty() << " " << m_sigmaCaloNoiseCut);
94
95 if (!m_doSA) {
97 ATH_CHECK(m_propagator.retrieve());
98 } else {
99 m_caloMaterialProvider.disable();
100 m_propagator.disable();
101 }
103 ATH_CHECK(m_trackSummaryTool.retrieve());
104
106 for (const std::string &a_key : m_copyFloatSummaryKeys ) {
107 m_copyFloatSummaryAccessors.push_back(std::make_unique< SG::Accessor<float> >(a_key));
108 }
110 for (const std::string &a_key : m_copyCharSummaryKeys ) {
111 m_copyCharSummaryAccessors.push_back(std::make_unique< SG::Accessor<uint8_t> >(a_key));
112 }
113
114 return StatusCode::SUCCESS;
115 }
#define ATH_CHECK
Evaluate an expression and check for errors.
ToolHandle< Trk::ITrackAmbiguityProcessorTool > m_ambiguityProcessor
ServiceHandle< Muon::IMuonIdHelperSvc > m_idHelperSvc
Gaudi::Property< std::vector< std::string > > m_copyCharSummaryKeys
Gaudi::Property< std::vector< std::string > > m_copyFloatSummaryKeys
Gaudi::Property< bool > m_doSA

◆ inputHandles()

virtual std::vector< Gaudi::DataHandle * > AthCommonDataStore< AthCommonMsg< AlgTool > >::inputHandles ( ) const
overridevirtualinherited

Return this algorithm's input handles.

We override this to include handle instances from key arrays if they have not yet been declared. See comments on updateVHKA.

◆ interfaceID()

const InterfaceID & MuonCombined::IMuonCreatorTool::interfaceID ( )
inlinestaticinherited

Definition at line 72 of file IMuonCreatorTool.h.

72 {
73 static const InterfaceID IID_IMuonCreatorTool("MuonCombined::IMuonCreatorTool", 1, 0);
74 return IID_IMuonCreatorTool;
75 }

◆ msg()

MsgStream & AthCommonMsg< AlgTool >::msg ( ) const
inlineinherited

Definition at line 24 of file AthCommonMsg.h.

24 {
25 return this->msgStream();
26 }

◆ msgLvl()

bool AthCommonMsg< AlgTool >::msgLvl ( const MSG::Level lvl) const
inlineinherited

Definition at line 30 of file AthCommonMsg.h.

30 {
31 return this->msgLevel(lvl);
32 }

◆ outputHandles()

virtual std::vector< Gaudi::DataHandle * > AthCommonDataStore< AthCommonMsg< AlgTool > >::outputHandles ( ) const
overridevirtualinherited

Return this algorithm's output handles.

We override this to include handle instances from key arrays if they have not yet been declared. See comments on updateVHKA.

◆ renounce()

std::enable_if_t< std::is_void_v< std::result_of_t< decltype(&T::renounce)(T)> > &&!std::is_base_of_v< SG::VarHandleKeyArray, T > &&std::is_base_of_v< Gaudi::DataHandle, T >, void > AthCommonDataStore< AthCommonMsg< AlgTool > >::renounce ( T & h)
inlineprotectedinherited

Definition at line 380 of file AthCommonDataStore.h.

381 {
382 h.renounce();
384 }
std::enable_if_t< std::is_void_v< std::result_of_t< decltype(&T::renounce)(T)> > &&!std::is_base_of_v< SG::VarHandleKeyArray, T > &&std::is_base_of_v< Gaudi::DataHandle, T >, void > renounce(T &h)

◆ renounceArray()

void AthCommonDataStore< AthCommonMsg< AlgTool > >::renounceArray ( SG::VarHandleKeyArray & handlesArray)
inlineprotectedinherited

remove all handles from I/O resolution

Definition at line 364 of file AthCommonDataStore.h.

364 {
366 }

◆ resolveOverlaps()

void MuonCombined::MuonCreatorTool::resolveOverlaps ( const EventContext & ctx,
const MuonCandidateCollection * muonCandidates,
const std::vector< const InDetCandidateToTagMap * > & tagMaps,
InDetCandidateTagsMap & resolvedInDetCandidates,
std::vector< const MuonCombined::MuonCandidate * > & resolvedMuonCandidates,
bool select_comissioning = false ) const
private

Find all InDetCandidate – Combined tag combinations Be aware that different InDetCandidateMaps could have different InDetCandidate objects but the underlying tracks are always the same

Check whether the author arises from the comissioning chain The maps are filled in dedicated algorithim. So all tags will fail / satisfy this condition

Add the track for the ambiguity reprocessing

Create firs the dummy track

Add it to the list piped to ambiguity solving

Move the candidate into the map to find the resolved tracks

In principle we can include here STACO as well but that is lower ranked as MuidSA

Definition at line 974 of file MuonCreatorTool.cxx.

978 {
979 resolvedMuonCandidates.clear();
980 resolvedInDetCandidates.clear();
981
982 std::unique_ptr<const TrackCollection> resolvedTracks;
983 std::vector<std::unique_ptr<Trk::Track>> garbage_collection;
984
988 InDetCandidateTagsMap inDetCandidateMap;
989 for (const InDetCandidateToTagMap* tag_map : tagMaps) {
990 if (!tag_map) continue;
991 for (const auto& comb_tag : *tag_map) {
992 const TagBase* tag = comb_tag.second.get();
996 if (tag->isCommissioning() != select_commissioning) break;
997 InDetCandidateTagsMap::iterator itr =
998 std::find_if(inDetCandidateMap.begin(), inDetCandidateMap.end(),
999 [&comb_tag](const InDetCandidateTags& to_test) { return (*to_test.first) == (*comb_tag.first); });
1000 if (itr != inDetCandidateMap.end())
1001 itr->second.emplace_back(tag);
1002 else
1003 inDetCandidateMap.emplace_back(std::make_pair(comb_tag.first, std::vector<const TagBase*>{tag}));
1004 }
1005 }
1006
1007 // Each InDetCandidate corresponds to a different ID track.
1008 // Resolve overlap among InDetCandidates for cases where different
1009 // ID tracks are tagged by the same MS info (track or segment)
1010 if (!inDetCandidateMap.empty()) {
1011 // the muons only found by the calo tagger should always be kept so we can
1012 // filter them out from the start
1013 InDetCandidateTagsMap caloMuons;
1014
1015 // first loop over ID candidates and select all candidates that have a tag
1016 resolvedInDetCandidates.reserve(inDetCandidateMap.size());
1017 caloMuons.reserve(inDetCandidateMap.size());
1018 for (InDetCandidateTags& comb_tag : inDetCandidateMap) {
1019 std::stable_sort(comb_tag.second.begin(), comb_tag.second.end(), SortTagBasePtr());
1020 if (comb_tag.second.size() == 1 && comb_tag.second.front()->type() == xAOD::Muon::CaloTagged) {
1021 caloMuons.emplace_back(std::move(comb_tag));
1022 } else
1023 resolvedInDetCandidates.emplace_back(std::move(comb_tag));
1024 }
1025 inDetCandidateMap.clear();
1026 // now sort the selected ID candidates
1027 std::stable_sort(resolvedInDetCandidates.begin(), resolvedInDetCandidates.end(), SortInDetCandidates());
1028 if (msgLvl(MSG::DEBUG)) {
1029 ATH_MSG_DEBUG("Found " << resolvedInDetCandidates.size() << " inner detector tags in event "
1030 << ctx.eventID().event_number());
1031 for (const InDetCandidateTags& candidate : resolvedInDetCandidates) {
1032 std::stringstream tags;
1033 for (const TagBase* tag : candidate.second) tags << " " << tag->toString();
1034 ATH_MSG_DEBUG("ID candidate: " << candidate.first->toString() << " " << tags.str());
1035 }
1036 }
1037
1038 ConstDataVector<TrackCollection> to_resolve{SG::VIEW_ELEMENTS};
1039
1040 to_resolve.reserve(resolvedInDetCandidates.size());
1041 garbage_collection.reserve(resolvedInDetCandidates.size());
1042
1043 // a dummy track for segment tagged candidates to be used in the overlap
1044 // check
1045 std::map<const Trk::Track*, InDetCandidateTags> trackInDetCandLinks;
1046
1047 for (InDetCandidateTags& candidate : resolvedInDetCandidates) {
1048 // retrieve the primary tag
1049 const TagBase* primaryTag = candidate.second[0];
1050
1051 // check if a track is available
1052 if (primaryTag->primaryTrack()) {
1054 to_resolve.push_back(primaryTag->primaryTrack());
1055 // create a track summary for this track
1056 trackInDetCandLinks[to_resolve.back()] = std::move(candidate);
1057 }
1058 // if not, make a dummy track out of segments, muonTracks takes ownership
1059 // of the memory
1060 else {
1061 std::vector<const Muon::MuonSegment*> segments = primaryTag->associatedSegments();
1062 if (!segments.empty()) {
1064 garbage_collection.emplace_back(
1065 createDummyTrack(ctx, primaryTag->associatedSegments(), *(candidate.first->indetTrackParticle().track())));
1067 to_resolve.push_back(garbage_collection.back().get());
1069 trackInDetCandLinks[garbage_collection.back().get()] = std::move(candidate);
1070 }
1071 }
1072 }
1073 resolvedInDetCandidates.clear();
1074
1075 // Resolve ambiguity between muon tracks
1076 resolvedTracks.reset(m_ambiguityProcessor->process(to_resolve.asDataVector()));
1077
1078 // link back to InDet candidates and fill the resolved container
1079 for (const Trk::Track* track : *resolvedTracks) {
1080 std::map<const Trk::Track*, InDetCandidateTags>::iterator trackCandLink = trackInDetCandLinks.find(track);
1081 if (trackCandLink == trackInDetCandLinks.end()) {
1082 ATH_MSG_WARNING("Unable to find internal link between MS track and ID candidate!");
1083 continue;
1084 }
1085 resolvedInDetCandidates.push_back(std::move(trackCandLink->second));
1086 }
1087
1088 // print-out
1089 if (msgLvl(MSG::VERBOSE)) {
1090 ATH_MSG_DEBUG("ID candidates after ambiguity solving "
1091 << resolvedInDetCandidates.size() << " trackCandLinks: " << trackInDetCandLinks.size()
1092 << " to_resolve: " << to_resolve.size() << " resolvedTracks: " << resolvedTracks->size());
1093 for (const InDetCandidateTags& candidate : resolvedInDetCandidates) {
1094 ATH_MSG_DEBUG("ID candidate: " << candidate.first->toString() << " " << candidate.second[0]->toString());
1095 }
1096 ATH_MSG_DEBUG("Calo muons after ambiguity solving: ");
1097 for (const InDetCandidateTags& candidate : caloMuons) {
1098 ATH_MSG_DEBUG("ID candidate: " << candidate.first->toString() << " " << candidate.second[0]->toString());
1099 }
1100 }
1101 // add muons only found by calo tagger
1102 resolvedInDetCandidates.insert(resolvedInDetCandidates.end(), caloMuons.begin(), caloMuons.end());
1103
1104 // now sort the selected ID candidates
1105 std::stable_sort(resolvedInDetCandidates.begin(), resolvedInDetCandidates.end(),
1106 [](const InDetCandidateTags& a, const InDetCandidateTags& b) {
1107 return a.first->indetTrackParticle().pt() > b.first->indetTrackParticle().pt();
1108 });
1109 }
1110
1111 // MuonCandidateCollection contains all muon tracks (SA extrapolated or not)
1112 // Resolve overlap with InDetCandidate collection
1113 if (!muonCandidates) { return; }
1114
1115 if (msgLvl(MSG::DEBUG)) {
1116 ATH_MSG_DEBUG("Muon candidates: " << muonCandidates->size());
1117 for (const MuonCandidate* candidate : *muonCandidates) { ATH_MSG_DEBUG("Muon candidate: " << candidate->toString()); }
1118 }
1119
1120 ConstDataVector<TrackCollection> resolvedTracks2{SG::VIEW_ELEMENTS};
1121 if (resolvedTracks) { resolvedTracks2.assign(resolvedTracks->begin(), resolvedTracks->end()); }
1122 // Keep track of the MuonCandidates used by MuidCo
1123 std::set<const MuonCandidate*> used_candidates;
1124 for (const InDetCandidateTags& indet_cand : resolvedInDetCandidates) {
1125 for (const TagBase* tag : indet_cand.second) {
1127 if (tag->author() == xAOD::Muon::MuidCo) {
1128 const CombinedFitTag* cmb_tag = dynamic_cast<const CombinedFitTag*>(tag);
1129 used_candidates.insert(&cmb_tag->muonCandidate());
1130 } else if (tag->author() == xAOD::Muon::STACO && indet_cand.second[0] == tag) {
1131 const StacoTag* staco_tag = dynamic_cast<const StacoTag*>(tag);
1132 used_candidates.insert(&staco_tag->muonCandidate());
1133 }
1134 }
1135 }
1136
1137 // add MS tracks to resolvedTrack collection and store a link between tracks
1138 // and muon candidates
1139 std::map<const Trk::Track*, const MuonCandidate*> trackMuonCandLinks;
1140 for (const MuonCandidate* candidate : *muonCandidates) {
1141 if (candidate->isCommissioning() != select_commissioning) continue;
1142 const Trk::Track* track = candidate->primaryTrack();
1143 if (used_candidates.count(candidate)) {
1144 ATH_MSG_DEBUG("Duplicate MS track " << m_printer->print(*track));
1145 continue;
1146 }
1147 used_candidates.insert(candidate);
1148 resolvedTracks2.push_back(track); // VIEW_ELEMENTS, pointer only
1149 trackMuonCandLinks[track] = candidate;
1150 }
1151
1152 // solve ambiguity
1153 resolvedTracks.reset(m_ambiguityProcessor->process(resolvedTracks2.asDataVector()));
1154
1155 // loop over resolved tracks and fill resolved muon candidates
1156 for (const Trk::Track* track : *resolvedTracks) {
1157 auto trackCandLink = trackMuonCandLinks.find(track);
1158 if (trackCandLink != trackMuonCandLinks.end()) resolvedMuonCandidates.push_back(trackCandLink->second);
1159 }
1160
1161 // print-out
1162 if (msgLvl(MSG::DEBUG)) {
1163 ATH_MSG_DEBUG("Muon candidates: " << muonCandidates->size() << " after ambiguity solving " << resolvedMuonCandidates.size());
1164 for (const MuonCandidate* candidate : resolvedMuonCandidates) {
1165 msg(MSG::DEBUG) << "Muon candidate: " << candidate->toString() << endmsg;
1166 }
1167 }
1168 }
#define endmsg
static Double_t a
MsgStream & msg() const
value_type push_back(value_type pElem)
Add an element to the end of the collection.
ElementProxy back()
Access the last element in the collection as an lvalue.
const DV * asDataVector() const
Return a pointer to this object, as a const DataVector.
void assign(InputIterator first, InputIterator last)
Assign from iterators.
std::unique_ptr< Trk::Track > createDummyTrack(const EventContext &ctx, const std::vector< const Muon::MuonSegment * > &segments, const Trk::Track &indetTrack) const
@ VIEW_ELEMENTS
this data object is a view, it does not own its elmts
void stable_sort(DataModel_detail::iterator< DVL > beg, DataModel_detail::iterator< DVL > end)
Specialization of stable_sort for DataVector/List.

◆ selectStaus()

void MuonCombined::MuonCreatorTool::selectStaus ( InDetCandidateTagsMap & resolvedInDetCandidates,
const std::vector< const InDetCandidateToTagMap * > & tagMaps ) const
private

Definition at line 946 of file MuonCreatorTool.cxx.

947 {
948 resolvedInDetCandidates.clear();
949 for (const InDetCandidateToTagMap* tag_map : tagMaps) {
950 if (!tag_map) continue;
951 for (const auto& combined_tag : *tag_map) {
952 const TagBase* tag = combined_tag.second.get();
953 const MuGirlLowBetaTag* muGirlLowBetaTag = dynamic_cast<const MuGirlLowBetaTag*>(tag);
954 if (muGirlLowBetaTag) { resolvedInDetCandidates.emplace_back(combined_tag.first, std::vector<const TagBase*>{tag}); }
955 }
956 break;
957 }
958 // print-out
959 if (msgLvl(MSG::DEBUG)) {
960 ATH_MSG_DEBUG("ID candidates: " << tagMaps.size() << " after stau selection " << resolvedInDetCandidates.size());
961 for (const InDetCandidateTags& candidate : resolvedInDetCandidates) {
962 msg(MSG::DEBUG) << "ID candidate staus: " << candidate.first->toString() << endmsg;
963 }
964 }
965
966 // tag_map above is keyed on a pointer.
967 // So we need to sort in order to get reproducible results.
968 std::stable_sort(resolvedInDetCandidates.begin(), resolvedInDetCandidates.end(),
969 [](const InDetCandidateTags& a, const InDetCandidateTags& b) {
970 return a.first->indetTrackParticle().pt() > b.first->indetTrackParticle().pt();
971 });
972 }

◆ setMuonHitCounts()

void MuonCombined::MuonCreatorTool::setMuonHitCounts ( xAOD::Muon & muon) const
private

◆ setP4()

void MuonCombined::MuonCreatorTool::setP4 ( xAOD::Muon & muon,
const xAOD::TrackParticle & tp ) const
private

Definition at line 1435 of file MuonCreatorTool.cxx.

1435{ muon.setP4(tp.pt(), tp.eta(), tp.phi()); }

◆ sysInitialize()

virtual StatusCode AthCommonDataStore< AthCommonMsg< AlgTool > >::sysInitialize ( )
overridevirtualinherited

Perform system initialization for an algorithm.

We override this to declare all the elements of handle key arrays at the end of initialization. See comments on updateVHKA.

Reimplemented in asg::AsgMetadataTool, AthCheckedComponent< AthAlgTool >, AthCheckedComponent<::AthAlgTool >, and DerivationFramework::CfAthAlgTool.

◆ sysStart()

virtual StatusCode AthCommonDataStore< AthCommonMsg< AlgTool > >::sysStart ( )
overridevirtualinherited

Handle START transition.

We override this in order to make sure that conditions handle keys can cache a pointer to the conditions container.

◆ updateVHKA()

void AthCommonDataStore< AthCommonMsg< AlgTool > >::updateVHKA ( Gaudi::Details::PropertyBase & )
inlineinherited

Definition at line 308 of file AthCommonDataStore.h.

308 {
309 // debug() << "updateVHKA for property " << p.name() << " " << p.toString()
310 // << " size: " << m_vhka.size() << endmsg;
311 for (auto &a : m_vhka) {
313 for (auto k : keys) {
314 k->setOwner(this);
315 }
316 }
317 }
std::vector< SG::VarHandleKeyArray * > m_vhka

Member Data Documentation

◆ m_addMDTExtrasMuGirlLowBeta

Gaudi::Property<bool> MuonCombined::MuonCreatorTool::m_addMDTExtrasMuGirlLowBeta {this, "AddMDTExtrasMuGirlLowBeta", false}
private

Definition at line 178 of file MuonCreatorTool.h.

178{this, "AddMDTExtrasMuGirlLowBeta", false};

◆ m_ambiguityProcessor

ToolHandle<Trk::ITrackAmbiguityProcessorTool> MuonCombined::MuonCreatorTool::m_ambiguityProcessor {this, "AmbiguityProcessor", ""}
private

Definition at line 153 of file MuonCreatorTool.h.

153{this, "AmbiguityProcessor", ""};

◆ m_buildStauContainer

Gaudi::Property<bool> MuonCombined::MuonCreatorTool::m_buildStauContainer {this, "BuildStauContainer", false, "flag to decide whether to build stau or not"}
private

Definition at line 177 of file MuonCreatorTool.h.

177{this, "BuildStauContainer", false, "flag to decide whether to build stau or not"};

◆ m_caloExtTool

ToolHandle<Trk::IParticleCaloExtensionTool> MuonCombined::MuonCreatorTool::m_caloExtTool
private
Initial value:
{this, "ParticleCaloExtensionTool",
"Trk::ParticleCaloExtensionTool/ParticleCaloExtensionTool"}

Definition at line 149 of file MuonCreatorTool.h.

149 {this, "ParticleCaloExtensionTool",
150 "Trk::ParticleCaloExtensionTool/ParticleCaloExtensionTool"};

◆ m_caloMaterialProvider

ToolHandle<Trk::ITrkMaterialProviderTool> MuonCombined::MuonCreatorTool::m_caloMaterialProvider
private
Initial value:
{this, "CaloMaterialProvider",
"Trk::TrkMaterialProviderTool/TrkMaterialProviderTool"}

Definition at line 166 of file MuonCreatorTool.h.

166 {this, "CaloMaterialProvider",
167 "Trk::TrkMaterialProviderTool/TrkMaterialProviderTool"};

◆ m_caloMgrKey

SG::ReadCondHandleKey<CaloDetDescrManager> MuonCombined::MuonCreatorTool::m_caloMgrKey {this, "CaloDetDescrManager", "CaloDetDescrManager"}
private

Definition at line 217 of file MuonCreatorTool.h.

217{this, "CaloDetDescrManager", "CaloDetDescrManager"};

◆ m_caloNoiseKey

SG::ReadCondHandleKey<CaloNoise> MuonCombined::MuonCreatorTool::m_caloNoiseKey {this, "CaloNoise", "", "CaloNoise object to use, or blank."}
private

Definition at line 175 of file MuonCreatorTool.h.

175{this, "CaloNoise", "", "CaloNoise object to use, or blank."};

◆ m_cellCollector

Rec::CaloCellCollector MuonCombined::MuonCreatorTool::m_cellCollector
private

Definition at line 172 of file MuonCreatorTool.h.

◆ m_cellContainerName

SG::ReadHandleKey<CaloCellContainer> MuonCombined::MuonCreatorTool::m_cellContainerName {this, "CaloCellContainer", "AllCalo", "calo cells"}
private

Definition at line 174 of file MuonCreatorTool.h.

174{this, "CaloCellContainer", "AllCalo", "calo cells"};

◆ m_copyCharSummaryAccessors

std::vector< std::unique_ptr<SG::AuxElement::Accessor<uint8_t> > > MuonCombined::MuonCreatorTool::m_copyCharSummaryAccessors
private

Definition at line 215 of file MuonCreatorTool.h.

◆ m_copyCharSummaryKeys

Gaudi::Property< std::vector<std::string> > MuonCombined::MuonCreatorTool::m_copyCharSummaryKeys
private
Initial value:
{this,"CopyUInt8SummaryKeys",
{"numberOfUsedHitsdEdx","numberOfIBLOverflowsdEdx","TRTdEdxUsedHits",
"expectInnermostPixelLayerHit", "expectNextToInnermostPixelLayerHit",
"numberOfPixelOutliers", "numberOfInnermostPixelLayerOutliers", "numberOfNextToInnermostPixelLayerOutliers", "numberOfSCTOutliers"},
"List of uint8_t aux element names to copy over from ID track particle summaries."}

Definition at line 202 of file MuonCreatorTool.h.

203 {this,"CopyUInt8SummaryKeys",
204 {"numberOfUsedHitsdEdx","numberOfIBLOverflowsdEdx","TRTdEdxUsedHits",
205 "expectInnermostPixelLayerHit", "expectNextToInnermostPixelLayerHit",
206 "numberOfPixelOutliers", "numberOfInnermostPixelLayerOutliers", "numberOfNextToInnermostPixelLayerOutliers", "numberOfSCTOutliers"},
207 "List of uint8_t aux element names to copy over from ID track particle summaries."};

◆ m_copyFloatSummaryAccessors

std::vector< std::unique_ptr<SG::AuxElement::Accessor<float> > > MuonCombined::MuonCreatorTool::m_copyFloatSummaryAccessors
private

Definition at line 214 of file MuonCreatorTool.h.

◆ m_copyFloatSummaryKeys

Gaudi::Property< std::vector<std::string> > MuonCombined::MuonCreatorTool::m_copyFloatSummaryKeys
private
Initial value:
{this,"CopyFloatSummaryKeys",{"TRTTrackOccupancy","eProbabilityComb","eProbabilityHT","pixeldEdx","TRTdEdx","eProbabilityNN"},
"List of float aux element names to copy over from ID track particle summaries."}

Definition at line 199 of file MuonCreatorTool.h.

200 {this,"CopyFloatSummaryKeys",{"TRTTrackOccupancy","eProbabilityComb","eProbabilityHT","pixeldEdx","TRTdEdx","eProbabilityNN"},
201 "List of float aux element names to copy over from ID track particle summaries."};

◆ m_detStore

StoreGateSvc_t AthCommonDataStore< AthCommonMsg< AlgTool > >::m_detStore
privateinherited

Pointer to StoreGate (detector store by default).

Definition at line 393 of file AthCommonDataStore.h.

◆ m_doSA

Gaudi::Property<bool> MuonCombined::MuonCreatorTool::m_doSA {this, "MakeSAMuons", false}
private

Definition at line 191 of file MuonCreatorTool.h.

191{this, "MakeSAMuons", false};

◆ m_edmHelperSvc

ServiceHandle<Muon::IMuonEDMHelperSvc> MuonCombined::MuonCreatorTool::m_edmHelperSvc
private
Initial value:
{this, "edmHelper", "Muon::MuonEDMHelperSvc/MuonEDMHelperSvc",
"Handle to the service providing the IMuonEDMHelperSvc interface"}

Definition at line 143 of file MuonCreatorTool.h.

143 {this, "edmHelper", "Muon::MuonEDMHelperSvc/MuonEDMHelperSvc",
144 "Handle to the service providing the IMuonEDMHelperSvc interface"};

◆ m_evtStore

StoreGateSvc_t AthCommonDataStore< AthCommonMsg< AlgTool > >::m_evtStore
privateinherited

Pointer to StoreGate (event store by default).

Definition at line 390 of file AthCommonDataStore.h.

◆ m_fillEnergyLossFromTrack

Gaudi::Property<bool> MuonCombined::MuonCreatorTool::m_fillEnergyLossFromTrack
private
Initial value:
{this, "FillEnergyLossFromTrack", true,
"Decide whether to try to extract the calo energy loss from tracks "}

Definition at line 179 of file MuonCreatorTool.h.

179 {this, "FillEnergyLossFromTrack", true,
180 "Decide whether to try to extract the calo energy loss from tracks "};

◆ m_fillExtraELossInfo

Gaudi::Property<bool> MuonCombined::MuonCreatorTool::m_fillExtraELossInfo
private
Initial value:
{this, "FillExtraELossInfo", true,
"Can enabled this for debugging - will add extra information not for "
"production"}

Definition at line 182 of file MuonCreatorTool.h.

182 {this, "FillExtraELossInfo", true,
183 "Can enabled this for debugging - will add extra information not for "
184 "production"};

◆ m_idHelperSvc

ServiceHandle<Muon::IMuonIdHelperSvc> MuonCombined::MuonCreatorTool::m_idHelperSvc {this, "MuonIdHelperSvc", "Muon::MuonIdHelperSvc/MuonIdHelperSvc"}
private

Definition at line 142 of file MuonCreatorTool.h.

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

◆ m_meanMDTdADCTool

ToolHandle<Rec::IMuonMeanMDTdADCFiller> MuonCombined::MuonCreatorTool::m_meanMDTdADCTool
private
Initial value:
{this, "MeanMDTdADCTool",
"Rec::MuonMeanMDTdADCFillerTool/MuonMeanMDTdADCFillerTool"}

Definition at line 164 of file MuonCreatorTool.h.

164 {this, "MeanMDTdADCTool",
165 "Rec::MuonMeanMDTdADCFillerTool/MuonMeanMDTdADCFillerTool"};

◆ m_momentumBalanceTool

ToolHandle<Rec::IMuonMomentumBalanceSignificance> MuonCombined::MuonCreatorTool::m_momentumBalanceTool
private
Initial value:
{this, "MomentumBalanceTool",
"Rec::MuonMomentumBalanceSignificanceTool/"
"MuonMomentumBalanceSignificanceTool"}

Definition at line 156 of file MuonCreatorTool.h.

156 {this, "MomentumBalanceTool",
157 "Rec::MuonMomentumBalanceSignificanceTool/"
158 "MuonMomentumBalanceSignificanceTool"};

◆ m_muonDressingTool

ToolHandle<xAOD::IMuonDressingTool> MuonCombined::MuonCreatorTool::m_muonDressingTool {this, "MuonDressingTool", "MuonCombined::MuonDressingTool/MuonDressingTool"}
private

Definition at line 155 of file MuonCreatorTool.h.

155{this, "MuonDressingTool", "MuonCombined::MuonDressingTool/MuonDressingTool"};

◆ m_muonPrinter

ToolHandle<Rec::IMuonPrintingTool> MuonCombined::MuonCreatorTool::m_muonPrinter {this, "MuonPrinter", "Rec::MuonPrintingTool/MuonPrintingTool"}
private

Definition at line 147 of file MuonCreatorTool.h.

147{this, "MuonPrinter", "Rec::MuonPrintingTool/MuonPrintingTool"};

◆ m_particleCreator

ToolHandle<Trk::ITrackParticleCreatorTool> MuonCombined::MuonCreatorTool::m_particleCreator
private
Initial value:
{this, "TrackParticleCreator",
"Trk::TrackParticleCreatorTool/MuonCombinedTrackParticleCreator"}

Definition at line 151 of file MuonCreatorTool.h.

151 {this, "TrackParticleCreator",
152 "Trk::TrackParticleCreatorTool/MuonCombinedTrackParticleCreator"};

◆ m_printer

PublicToolHandle<Muon::MuonEDMPrinterTool> MuonCombined::MuonCreatorTool::m_printer {this, "Printer", "Muon::MuonEDMPrinterTool/MuonEDMPrinterTool"}
private

Definition at line 146 of file MuonCreatorTool.h.

146{this, "Printer", "Muon::MuonEDMPrinterTool/MuonEDMPrinterTool"};

◆ m_printSummary

Gaudi::Property<bool> MuonCombined::MuonCreatorTool::m_printSummary {this, "PrintSummary", false, "flag to print muon edm"}
private

Definition at line 185 of file MuonCreatorTool.h.

185{this, "PrintSummary", false, "flag to print muon edm"};

◆ m_propagator

ToolHandle<Trk::IPropagator> MuonCombined::MuonCreatorTool::m_propagator {this, "Propagator", "Trk::RungeKuttaPropagator/AtlasRungeKuttaPropagator"}
private

Definition at line 154 of file MuonCreatorTool.h.

154{this, "Propagator", "Trk::RungeKuttaPropagator/AtlasRungeKuttaPropagator"};

◆ m_requireCaloDepositForSA

Gaudi::Property<bool> MuonCombined::MuonCreatorTool::m_requireCaloDepositForSA
private
Initial value:
{this, "RequireCaloForSA", true,
"Flag to discard SA muons that have no calorimeter loss associated."}

Definition at line 212 of file MuonCreatorTool.h.

212 {this, "RequireCaloForSA", true,
213 "Flag to discard SA muons that have no calorimeter loss associated."};

◆ m_requireIDTracks

Gaudi::Property<bool> MuonCombined::MuonCreatorTool::m_requireIDTracks {this, "RequireIDTrack", false}
private

In case of running the muon reconstruction with LRT tracks this property removes the overlap of muons in the container in which in any case no ID track is available.

Definition at line 195 of file MuonCreatorTool.h.

195{this, "RequireIDTrack", false};

◆ m_requireMSOEforSA

Gaudi::Property<bool> MuonCombined::MuonCreatorTool::m_requireMSOEforSA
private
Initial value:
{this, "RequireMSOEforSA", true,
"Flag to accept muons with SA track only but not MSOE. Interesting for BSM?"}

Definition at line 209 of file MuonCreatorTool.h.

209 {this, "RequireMSOEforSA", true,
210 "Flag to accept muons with SA track only but not MSOE. Interesting for BSM?"};

◆ m_scatteringAngleTool

ToolHandle<Rec::IMuonScatteringAngleSignificance> MuonCombined::MuonCreatorTool::m_scatteringAngleTool
private
Initial value:
{this, "ScatteringAngleTool",
"Rec::MuonScatteringAngleSignificanceTool/"
"MuonScatteringAngleSignificanceTool"}

Definition at line 159 of file MuonCreatorTool.h.

159 {this, "ScatteringAngleTool",
160 "Rec::MuonScatteringAngleSignificanceTool/"
161 "MuonScatteringAngleSignificanceTool"};

◆ m_segLowBeta

Gaudi::Property<bool> MuonCombined::MuonCreatorTool::m_segLowBeta {this, "AssociateSegmentsToLowBetaMuons", false, "associate segments to MuGirlLowBeta muons"}
private

Definition at line 189 of file MuonCreatorTool.h.

189{this, "AssociateSegmentsToLowBetaMuons", false, "associate segments to MuGirlLowBeta muons"};

◆ m_selectorTool

ToolHandle<CP::IMuonSelectionTool> MuonCombined::MuonCreatorTool::m_selectorTool {this, "MuonSelectionTool", "CP::MuonSelectionTool/MuonSelectionTool"}
private

Definition at line 162 of file MuonCreatorTool.h.

162{this, "MuonSelectionTool", "CP::MuonSelectionTool/MuonSelectionTool"};

◆ m_sigmaCaloNoiseCut

Gaudi::Property<float> MuonCombined::MuonCreatorTool::m_sigmaCaloNoiseCut {this, "SigmaCaloNoiseCut", 3.4}
private

Definition at line 197 of file MuonCreatorTool.h.

197{this, "SigmaCaloNoiseCut", 3.4};

◆ m_trackQuery

ToolHandle<Rec::IMuonTrackQuery> MuonCombined::MuonCreatorTool::m_trackQuery {this, "TrackQuery", "Rec::MuonTrackQuery/MuonTrackQuery"}
private

Definition at line 169 of file MuonCreatorTool.h.

169{this, "TrackQuery", "Rec::MuonTrackQuery/MuonTrackQuery"};

◆ m_trackSummaryTool

ToolHandle<Trk::IExtendedTrackSummaryTool> MuonCombined::MuonCreatorTool::m_trackSummaryTool {this, "TrackSummaryTool", "MuonTrackSummaryTool"}
private

Definition at line 170 of file MuonCreatorTool.h.

170{this, "TrackSummaryTool", "MuonTrackSummaryTool"};

◆ m_useCaloCells

Gaudi::Property<bool> MuonCombined::MuonCreatorTool::m_useCaloCells {this, "UseCaloCells", true}
private

Definition at line 190 of file MuonCreatorTool.h.

190{this, "UseCaloCells", true};

◆ m_useUpdatedExtrapolatedTrack

Gaudi::Property<bool> MuonCombined::MuonCreatorTool::m_useUpdatedExtrapolatedTrack
private
Initial value:
{this, "UseUpdatedExtrapolatedTrack", true,
"configure whether to use the updated extrapolated track for a combined "
"fit or not"}

Definition at line 186 of file MuonCreatorTool.h.

186 {this, "UseUpdatedExtrapolatedTrack", true,
187 "configure whether to use the updated extrapolated track for a combined "
188 "fit or not"};

◆ m_varHandleArraysDeclared

bool AthCommonDataStore< AthCommonMsg< AlgTool > >::m_varHandleArraysDeclared
privateinherited

Definition at line 399 of file AthCommonDataStore.h.

◆ m_vhka

std::vector<SG::VarHandleKeyArray*> AthCommonDataStore< AthCommonMsg< AlgTool > >::m_vhka
privateinherited

Definition at line 398 of file AthCommonDataStore.h.


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