ATLAS Offline Software
Loading...
Searching...
No Matches
MuonPrintingTool.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration
3*/
4
11#include "MuonPrintingTool.h"
12
13#include "AthLinks/ElementLink.h"
18#include "TrkTrack/Track.h"
19#include "TrkTrack/TrackInfo.h"
22
24Rec::MuonPrintingTool::MuonPrintingTool(const std::string& type, const std::string& name, const IInterface* parent) :
25 AthAlgTool(type, name, parent) {
26 declareInterface<IMuonPrintingTool>(this);
27}
28
31
34 ATH_CHECK(m_edmPrinter.retrieve());
35 ATH_MSG_DEBUG("Retrieved " << m_edmPrinter);
36
37 ATH_MSG_INFO("Initialize() successful in " << name());
38 return StatusCode::SUCCESS;
39}
40
43 ATH_MSG_DEBUG("Nothing to finalize.");
44 return StatusCode::SUCCESS;
45}
46
48 std::ostringstream sout;
49 sout << " pt : " << tp.pt() << " eta : " << tp.eta() << " phi : " << tp.phi();
50 return sout.str();
51}
52
53std::string Rec::MuonPrintingTool::print(const xAOD::Muon& muon) const {
54 std::ostringstream sout;
55
56 sout << "##### Muon, pt : " << muon.pt() << " eta : " << muon.eta() << " phi : " << muon.phi() << " mass : " << muon.m()
57 << " author " << muon.author() << " type : " << muon.muonType() << " secondary authors: ";
58 for (int a = 0; a < Muon::MuonStationIndex::toInt(xAOD::Muon::Author::NumberOfMuonAuthors); ++a) {
59 xAOD::Muon::Author author = static_cast<xAOD::Muon::Author>(a);
60 if (author != muon.author() && muon.isAuthor(author)) sout << " " << a;
61 }
62 sout << std::endl;
63
64 sout << " ParamDef available:" << std::endl;
65 using enum xAOD::Muon::ParamDef;
66 static constexpr std::array<xAOD::Muon::ParamDef, 24> printPars{
67 spectrometerFieldIntegral,
68 scatteringCurvatureSignificance,
69 scatteringNeighbourSignificance,
70 momentumBalanceSignificance,
71 segmentDeltaEta,
72 segmentDeltaPhi,
73 segmentChi2OverDoF,
74 t0, beta, annBarrel, annEndCap, innAngle, meanDeltaADCCountsMDT,
75 CaloMuonScore, EnergyLossSigma, FSR_CandidateEnergy,
76 ParamEnergyLossSigmaMinus, ParamEnergyLossSigmaPlus,
77 midAngle, msInnerMatchChi2, msOuterMatchChi2
78 };
79 for (auto p : printPars) {
80 float val{0.f};
81 if (muon.parameter(val, p)){
82 sout<<" "<<p<<": "<<val<<std::endl;
83 }
84 }
85 int iVal{0};
86 if (muon.parameter(iVal, msInnerMatchDOF)) sout << " msInnerMatchDOF : " << msInnerMatchDOF << std::endl;
87 if (muon.parameter(iVal, msOuterMatchDOF)) sout << " msOuterMatchDOF : " << msOuterMatchDOF << std::endl;
88 if (muon.parameter(iVal, CaloMuonIDTag)) sout << " CaloMuonIDTag : " << CaloMuonIDTag << std::endl;
89 sout << " EnergyLossType : " << muon.energyLossType() << std::endl;
90
91 uint8_t nprecisionLayers = 0;
92 uint8_t nprecisionHoleLayers = 0;
93 uint8_t nphiLayers = 0;
94 uint8_t ntrigEtaLayers = 0;
95 uint8_t nphiHoleLayers = 0;
96 uint8_t ntrigEtaHoleLayers = 0;
97 uint8_t mainSector = 0;
98 uint8_t secondSector = 0;
99 const xAOD::TrackParticle& tp = *muon.primaryTrackParticle();
100 tp.summaryValue(nprecisionLayers, xAOD::numberOfPrecisionLayers);
101 tp.summaryValue(nprecisionHoleLayers, xAOD::numberOfPrecisionHoleLayers);
103 tp.summaryValue(nphiHoleLayers, xAOD::numberOfPhiHoleLayers);
105 tp.summaryValue(ntrigEtaHoleLayers, xAOD::numberOfTriggerEtaHoleLayers);
106
107 if (!muon.summaryValue(mainSector, xAOD::primarySector)) mainSector = 0;
108 if (!muon.summaryValue(secondSector, xAOD::secondarySector)) secondSector = 0;
109 sout << " Station Layers: precision " << static_cast<int>(nprecisionLayers) << " holes " << static_cast<int>(nprecisionHoleLayers)
110 << " phi " << static_cast<int>(nphiLayers) << " holes " << static_cast<int>(nphiHoleLayers) << " trigEta "
111 << static_cast<int>(ntrigEtaLayers) << " holes " << static_cast<int>(ntrigEtaHoleLayers) << " main sector "
112 << static_cast<int>(mainSector) << " secondary " << static_cast<int>(secondSector) << std::endl;
113
114 bool printMeasurements = true;
115
116 if (const xAOD::TrackParticle* cbtp = muon.trackParticle(xAOD::Muon::TrackParticleType::CombinedTrackParticle); cbtp != nullptr) {
117 sout << " --- Combined Muon track --- " << print(*cbtp);
118 if (!cbtp->trackLink().isValid()) {
119 sout << " No Track link";
120 ATH_MSG_DEBUG("Combined track particle without Trk::Track");
121 } else {
122 const Trk::Track* cbtr = *cbtp->trackLink();
123 if (cbtr) sout << std::endl << m_edmPrinter->printStations(*cbtr);
124 if (cbtr && printMeasurements) sout << std::endl << m_edmPrinter->printMeasurements(*cbtr);
125 }
126 sout << std::endl;
127 }
128
129 if (const xAOD::TrackParticle* satp = muon.trackParticle(xAOD::Muon::TrackParticleType::ExtrapolatedMuonSpectrometerTrackParticle); satp != nullptr) {
130 sout << " --- Extrapolated Muon track --- " << print(*satp);
131 if (!satp->trackLink().isValid()) {
132 sout << " No Track link";
133 ATH_MSG_DEBUG("Extrapolated track particle without Trk::Track");
134 } else {
135 const Trk::Track* satr = *satp->trackLink();
136 if (satr) sout << std::endl << m_edmPrinter->printStations(*satr);
137 if (satr && printMeasurements) sout << std::endl << m_edmPrinter->printMeasurements(*satr);
138 }
139 sout << std::endl;
140 }
141
142 if (const xAOD::TrackParticle* satp = muon.trackParticle(xAOD::Muon::TrackParticleType::MuonSpectrometerTrackParticle); satp != nullptr) {
143 sout << " --- MuonSpectrometer track --- " << print(*satp);
144 if (!satp->trackLink().isValid()) {
145 sout << " No Track link";
146 ATH_MSG_DEBUG("SA track particle without Trk::Track");
147 } else {
148 const Trk::Track* satr = *satp->trackLink();
149 if (satr) sout << std::endl << m_edmPrinter->printStations(*satr);
150 if (satr && printMeasurements) sout << std::endl << m_edmPrinter->printMeasurements(*satr);
151 }
152 sout << std::endl;
153 }
154 return sout.str();
155}
156
157std::string Rec::MuonPrintingTool::print(const xAOD::MuonContainer& muons) const {
158 std::ostringstream sout;
159 sout << "Muon Container Size :" << muons.size() << std::endl;
160
161 for (const auto *m : muons) { sout << print(*m); }
162 return sout.str();
163}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_INFO(x)
#define ATH_MSG_DEBUG(x)
static Double_t a
static Double_t t0
void print(char *figname, TCanvas *c1)
AthAlgTool(const std::string &type, const std::string &name, const IInterface *parent)
Constructor with parameters:
size_type size() const noexcept
Returns the number of elements in the collection.
virtual ~MuonPrintingTool()
Standard destructor.
PublicToolHandle< Muon::MuonEDMPrinterTool > m_edmPrinter
virtual StatusCode finalize()
end of the job - finalize
std::string print(const xAOD::Muon &muon) const
print muon object to a string
virtual StatusCode initialize()
Overriding initialize and finalize.
MuonPrintingTool(const std::string &type, const std::string &name, const IInterface *parent)
Standard Constructor.
virtual double phi() const override final
The azimuthal angle ( ) of the particle (has range to .).
bool summaryValue(uint8_t &value, const SummaryType &information) const
Accessor for TrackSummary values.
virtual double pt() const override final
The transverse momentum ( ) of the particle.
virtual double eta() const override final
The pseudorapidity ( ) of the particle.
constexpr int toInt(const EnumType enumVal)
TrackParticle_v1 TrackParticle
Reference the current persistent version:
Muon_v1 Muon
Reference the current persistent version:
MuonContainer_v1 MuonContainer
Definition of the current "Muon container version".
@ numberOfPrecisionLayers
layers with at least 3 hits [unit8_t].
@ numberOfTriggerEtaHoleLayers
layers with trigger eta holes but no hits [unit8_t].
@ numberOfPhiHoleLayers
layers with trigger phi holes but no hits [unit8_t].
@ numberOfTriggerEtaLayers
layers with trigger eta hits [unit8_t].
@ numberOfPhiLayers
layers with a trigger phi hit [unit8_t].
@ numberOfPrecisionHoleLayers
layers with holes AND no hits [unit8_t].
@ primarySector
primary sector crossed by the muon
@ secondarySector
secondary sector crossed by the muon (set to the primary if the muon only passed one sector)