ATLAS Offline Software
Loading...
Searching...
No Matches
RecoMuonPlots.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3*/
4
7
9#include "xAODTracking/TrackingPrimitives.h" //for MuonSummaryType enum
11
12#include <TH2.h>
13#include <vector>
14#include <cmath> //for abs, sqrt
15
18
19RecoMuonPlots::RecoMuonPlots(PlotBase* pParent, const std::string& sDir, bool detail):PlotBase(pParent, sDir)
20
21, m_oAllPlots(this, "/", "Reco Muon")
22, m_oMuRecoInfoPlots(this, "/")
23, m_oImpactPlots(this, "/")
24, m_oMomentumPullPlots(this, "/")
25, m_origin_eta_phi(nullptr)
26, m_eff_tight(nullptr)
27, m_eff_medium(nullptr)
28, m_tight_eta_phi(nullptr)
29, m_medium_eta_phi(nullptr)
30, m_pt_broad(nullptr)
31, m_eta_phi_broad(nullptr)
32, m_eff_nPrec(nullptr)
33, m_eff_nPhi(nullptr)
34, m_eff_nTrigEta(nullptr)
35, m_eff_ndof(nullptr)
36, m_eff_chi2(nullptr)
37, m_ID_eff_ndof(nullptr)
38, m_ID_eff_chi2(nullptr)
39, m_MS_eff_ndof(nullptr)
40, m_MS_eff_chi2(nullptr)
41{
42 Detail = detail;
43}
44
46 //be very careful here, bin size is the same as the defult value
47 std::vector<HistData> hists = m_oAllPlots.retrieveBookedHistograms(); // HistData -> std::pair<TH1*, std::string>
48 int xbins = 52;
49 int ybins = 64;
50 float xmin = -2.6;
51 float xmax = 2.6;
52 float ymin = -3.2;
53 float ymax = 3.2;
54
55 //now register!
56 m_origin_eta_phi= Book2D("_Origin_eta_phi", "Original Distribution;#eta;#phi", xbins, xmin, xmax, ybins, ymin, ymax);
57 m_eff_tight = Book2D("_Tight_eff", "Tight Quality Efficiency;#eta;#phi", xbins, xmin, xmax, ybins, ymin, ymax);
58 m_eff_medium = Book2D("_Medium_eff", "Medium Quality Efficiency;#eta;#phi", xbins, xmin, xmax, ybins, ymin, ymax);
59 m_tight_eta_phi = Book2D("_Tight_eta_phi", "Tight Muon #eta #phi Distribution;#eta;#phi", xbins, xmin, xmax, ybins, ymin, ymax);
60 m_medium_eta_phi = Book2D("_Medium_eta_phi", "Medium Muon #eta #phi Distribution;#eta;#phi", xbins, xmin, xmax, ybins, ymin, ymax);
61 if (Detail){
62 m_pt_broad = Book1D("_pt_broad", "High p_{T} Distribution;p_{T} [GeV]", 70, 100, 1500);
63 m_eta_phi_broad = Book2D("_eta_phi_broad", "High p_{T} Muon #eta #phi Distribution;#eta;#phi", xbins, xmin, xmax, ybins, ymin, ymax);
64
65 m_eff_nPrec = Book2D("_eff_nPrec", "average number of Precision Layers;#eta;#phi", xbins, xmin, xmax, ybins, ymin, ymax);
66 m_eff_nPhi = Book2D("_eff_nPhi", "average number of Phi Layers;#eta;#phi", xbins, xmin, xmax, ybins, ymin, ymax);
67 m_eff_nTrigEta = Book2D("_eff_nTrigEta","average number of Trigger Eta Layers;#eta;#phi", xbins, xmin, xmax, ybins, ymin, ymax);
68 m_eff_ndof = Book2D("_eff_ndof", "average number of hits;#eta;#phi", xbins, xmin, xmax, ybins, ymin, ymax);
69 m_eff_chi2 = Book2D("_eff_chi2", "average #chi^{2} per DOF;#eta;#phi", xbins, xmin, xmax, ybins, ymin, ymax);
70 m_ID_eff_ndof = Book2D("_ID_eff_ndof", "ID track average number of hits;#eta;#phi", xbins, xmin, xmax, ybins, ymin, ymax);
71 m_ID_eff_chi2 = Book2D("_ID_eff_chi2", "ID track average #chi^{2} per DOF;#eta;#phi", xbins, xmin, xmax, ybins, ymin, ymax);
72 m_MS_eff_ndof = Book2D("_MS_eff_ndof", "MS track average number of hits;#eta;#phi", xbins, xmin, xmax, ybins, ymin, ymax);
73 m_MS_eff_chi2 = Book2D("_MS_eff_chi2", "MS track average #chi^{2} per DOF;#eta;#phi", xbins, xmin, xmax, ybins, ymin, ymax);
74
75 m_avg_hits_precision_inner = Book2D("_avg_hits_precision_inner", "avg. precision hits, inner;#eta;#phi", xbins, xmin, xmax, ybins, ymin, ymax);
76 m_avg_hits_precision_middle = Book2D("_avg_hits_precision_middle", "avg. precision hits, middle;#eta;#phi", xbins, xmin, xmax, ybins, ymin, ymax);
77 m_avg_hits_precision_outer = Book2D("_avg_hits_precision_outer", "avg. precision hits, outer;#eta;#phi", xbins, xmin, xmax, ybins, ymin, ymax);
78 m_avg_hits_precision_extended = Book2D("_avg_hits_precision_extended", "avg. precision hits, extended;#eta;#phi", xbins, xmin, xmax, ybins, ymin, ymax);
79
80 m_avg_hits_trigger_layer1 = Book2D("_avg_hits_trigger_layer1", "avg. trigger hits, layer 1;#eta;#phi", xbins, xmin, xmax, ybins, ymin, ymax);
81 m_avg_hits_trigger_layer2 = Book2D("_avg_hits_trigger_layer2", "avg. trigger hits, layer 2;#eta;#phi", xbins, xmin, xmax, ybins, ymin, ymax);
82 m_avg_hits_trigger_layer3 = Book2D("_avg_hits_trigger_layer3", "avg. trigger hits, layer 3;#eta;#phi", xbins, xmin, xmax, ybins, ymin, ymax);
83 m_avg_hits_trigger_layer4 = Book2D("_avg_hits_trigger_layer4", "avg. trigger hits, layer 4;#eta;#phi", xbins, xmin, xmax, ybins, ymin, ymax);
84
85 m_avg_hits_ibl = Book2D("_avg_hits_ibl", "avg. IBL hits;#eta;#phi", xbins, xmin, xmax, ybins, ymin, ymax);
86 m_avg_hits_pix = Book2D("_avg_hits_pix", "avg. Pix hits;#eta;#phi", xbins, xmin, xmax, ybins, ymin, ymax);
87 m_avg_hits_sct = Book2D("_avg_hits_sct", "avg. SCT hits;#eta;#phi", xbins, xmin, xmax, ybins, ymin, ymax);
88 m_avg_hits_trt = Book2D("_avg_hits_trt", "avg. TRT hits;#eta;#phi", xbins, xmin, xmax, ybins, ymin, ymax);
89
90 m_avg_ddpt_idme = Book2D("_avg_ddpt_idme", "avg. |pt_{ID} - pt_{ME}| / pt_{CB};#eta;#phi", xbins, xmin, xmax, ybins, ymin, ymax);
91 m_avg_dptsignif = Book2D("_avg_dptsignif", "avg. momentum diff. signif.;#eta;#phi", xbins, xmin, xmax, ybins, ymin, ymax);
92
93 }
94}
95
97 //General Plots
98 m_oAllPlots.fill(mu);
99 m_oMuRecoInfoPlots.fill(mu);
100 m_oMomentumPullPlots.fill(mu);
101
102 const xAOD::TrackParticle* primaryTrk = mu.trackParticle(xAOD::Muon::Primary);
103 // tracking related plots
104 if (!primaryTrk) return;
105 m_oImpactPlots.fill(*primaryTrk);
106 //m_oMSHitPlots.fill(*primaryTrk);
107
108}
109
110void RecoMuonPlots::fill(const xAOD::Muon& mu, xAOD::Muon::Quality my_quality){
111
112 //always fill the origin plot
113 m_origin_eta_phi->Fill(mu.eta(), mu.phi());
114
115 //General Plots; inclusive
116 if (my_quality <= xAOD::Muon::Tight) m_tight_eta_phi->Fill(mu.eta(), mu.phi());
117 if (my_quality <= xAOD::Muon::Medium) m_medium_eta_phi->Fill(mu.eta(), mu.phi());
118
119 if(!Detail) return;
120 if (mu.pt()/1000.0 > 100) {//ony for high pt muons
121 m_pt_broad->Fill(mu.pt()/1000.0);
122 m_eta_phi_broad->Fill(mu.eta(), mu.phi());
123 }
124 const xAOD::TrackParticle* primaryTrk = mu.trackParticle(xAOD::Muon::Primary);
125 const xAOD::TrackParticle* inDetTrk = mu.trackParticle(xAOD::Muon::InnerDetectorTrackParticle);
126 int correctEnum = (int) xAOD::Muon::MuonSpectrometerTrackParticle;
128 extrapMSTPLinkAcc("extrapolatedMuonSpectrometerTrackParticleLink");
129 if (extrapMSTPLinkAcc.isAvailable(mu) && extrapMSTPLinkAcc(mu).isValid()) correctEnum+=2; //check correct numbering in Muon.h
130 const xAOD::TrackParticle* msExtrapTrk = mu.trackParticle((xAOD::Muon::TrackParticleType) correctEnum);
131
132 //fill the ndof and chi2 as eta phi map; to calculate efficiencies in post processing
133 //if necessary, can use a quality cut here
134 if (primaryTrk) {
135 m_eff_ndof->Fill(primaryTrk->eta(), primaryTrk->phi(), primaryTrk->numberDoF());
136 m_eff_chi2->Fill(primaryTrk->eta(), primaryTrk->phi(), primaryTrk->chiSquared()/(primaryTrk->numberDoF() * 1.0));
137 }
138 if (inDetTrk) {
139 m_ID_eff_ndof->Fill(inDetTrk->eta(), inDetTrk->phi(), inDetTrk->numberDoF());
140 m_ID_eff_chi2->Fill(inDetTrk->eta(), inDetTrk->phi(), inDetTrk->chiSquared()/(inDetTrk->numberDoF() * 1.0));
141 }
142 if (msExtrapTrk) {
143 m_MS_eff_ndof->Fill(msExtrapTrk->eta(), msExtrapTrk->phi(), msExtrapTrk->numberDoF());
144 m_MS_eff_chi2->Fill(msExtrapTrk->eta(), msExtrapTrk->phi(), msExtrapTrk->chiSquared()/(msExtrapTrk->numberDoF() * 1.0));
145 }
146
147 if (primaryTrk) {
151 }
152
153 if (!mu.summaryValue(hitval_innerSmallHits, xAOD::MuonSummaryType::innerSmallHits)) return;
154 if (!mu.summaryValue(hitval_innerLargeHits, xAOD::MuonSummaryType::innerLargeHits)) return;
157 if (!mu.summaryValue(hitval_outerSmallHits, xAOD::MuonSummaryType::outerSmallHits)) return;
158 if (!mu.summaryValue(hitval_outerLargeHits, xAOD::MuonSummaryType::outerLargeHits)) return;
161
162 if (!mu.summaryValue(hitval_etaLayer1Hits, xAOD::MuonSummaryType::etaLayer1Hits)) return;
163 if (!mu.summaryValue(hitval_etaLayer2Hits, xAOD::MuonSummaryType::etaLayer2Hits)) return;
164 if (!mu.summaryValue(hitval_etaLayer3Hits, xAOD::MuonSummaryType::etaLayer3Hits)) return;
165 if (!mu.summaryValue(hitval_etaLayer4Hits, xAOD::MuonSummaryType::etaLayer4Hits)) return;
166
169 if (!mu.summaryValue(hitval_numberOfSCTHits, xAOD::SummaryType::numberOfSCTHits)) return;
170 if (!mu.summaryValue(hitval_numberOfTRTHits, xAOD::SummaryType::numberOfTRTHits)) return;
171
172 m_eff_nPrec -> Fill(mu.eta(), mu.phi(), hitval_numberOfPrecisionLayers);
173 m_eff_nPhi -> Fill(mu.eta(), mu.phi(), hitval_numberOfPhiLayers);
174 m_eff_nTrigEta -> Fill(mu.eta(), mu.phi(), hitval_numberOfTriggerEtaLayers);
175
180
181 m_avg_hits_trigger_layer1 -> Fill(mu.eta(), mu.phi(), hitval_etaLayer1Hits);
182 m_avg_hits_trigger_layer2 -> Fill(mu.eta(), mu.phi(), hitval_etaLayer2Hits);
183 m_avg_hits_trigger_layer3 -> Fill(mu.eta(), mu.phi(), hitval_etaLayer3Hits);
184 m_avg_hits_trigger_layer4 -> Fill(mu.eta(), mu.phi(), hitval_etaLayer4Hits);
185
186 m_avg_hits_ibl -> Fill(mu.eta(), mu.phi(), hitval_numberOfBLayerHits);
187 m_avg_hits_pix -> Fill(mu.eta(), mu.phi(), hitval_numberOfPixelHits);
188 m_avg_hits_sct -> Fill(mu.eta(), mu.phi(), hitval_numberOfSCTHits);
189 m_avg_hits_trt -> Fill(mu.eta(), mu.phi(), hitval_numberOfTRTHits);
190
191 if (primaryTrk && inDetTrk && msExtrapTrk) {
192 qoverp_diff = std::abs(inDetTrk->qOverP() - msExtrapTrk->qOverP());
193 qoverp_sigma = std::sqrt(inDetTrk->definingParametersCovMatrix()(4,4) + msExtrapTrk->definingParametersCovMatrix()(4,4));
195 ddpt_idme = (primaryTrk->pt() > 0) ? std::abs(inDetTrk->pt() - msExtrapTrk->pt()) / primaryTrk->pt() : -999;
196
197 m_avg_ddpt_idme -> Fill(mu.eta(), mu.phi(), ddpt_idme);
198 m_avg_dptsignif -> Fill(mu.eta(), mu.phi(), qoverp_signif);
199 }
200
201}
bool isValid(const T &p)
Av: we implement here an ATLAS-sepcific convention: all particles which are 99xxxxx are fine.
Definition AtlasPID.h:878
ElementLink< xAOD::MuonContainer > MuonLink
Helper class to provide constant type-safe access to aux data.
ElementLink< xAOD::TrackParticleContainer > TrackLink
TH1D * Book1D(const std::string &name, const std::string &labels, int nBins, float start, float end, bool prependDir=true)
Book a TH1D histogram.
Definition PlotBase.cxx:94
PlotBase(PlotBase *parent, const std::string &sDir)
Definition PlotBase.cxx:29
TH2F * Book2D(const std::string &name, const std::string &labels, int nBinsX, float startX, float endX, int nBinsY, float startY, float endY, bool prependDir=true)
Book a TH2F histogram.
Definition PlotBase.cxx:123
TH2 * m_tight_eta_phi
uint8_t hitval_middleSmallHits
uint8_t hitval_numberOfSCTHits
TH2 * m_avg_ddpt_idme
RecoMuonPlots(PlotBase *pParent, const std::string &sDir, bool detail=false)
uint8_t hitval_numberOfTRTHits
TH2 * m_avg_hits_trigger_layer3
uint8_t hitval_outerSmallHits
void fill(const xAOD::Muon &mu)
TH2 * m_origin_eta_phi
Muon::MomentumPullPlots m_oMomentumPullPlots
uint8_t hitval_etaLayer1Hits
TH2 * m_avg_hits_trigger_layer1
uint8_t hitval_extendedSmallHits
Trk::ImpactPlots m_oImpactPlots
TH2 * m_avg_hits_precision_extended
uint8_t hitval_numberOfPrecisionLayers
Muon::RecoInfoPlots m_oMuRecoInfoPlots
uint8_t hitval_outerLargeHits
TH2 * m_avg_hits_precision_outer
TH2 * m_avg_dptsignif
uint8_t hitval_innerSmallHits
TH2 * m_avg_hits_trigger_layer4
Trk::ParamPlots m_oAllPlots
uint8_t hitval_extendedLargeHits
uint8_t hitval_etaLayer4Hits
TH2 * m_avg_hits_trigger_layer2
uint8_t hitval_numberOfPixelHits
uint8_t hitval_numberOfBLayerHits
uint8_t hitval_numberOfTriggerEtaLayers
TH2 * m_eta_phi_broad
uint8_t hitval_numberOfPhiLayers
TH2 * m_medium_eta_phi
TH2 * m_avg_hits_precision_inner
uint8_t hitval_innerLargeHits
uint8_t hitval_etaLayer3Hits
uint8_t hitval_etaLayer2Hits
uint8_t hitval_middleLargeHits
TH2 * m_avg_hits_precision_middle
Helper class to provide constant type-safe access to aux data.
bool isAvailable(const ELT &e) const
Test to see if this variable exists in the store.
float numberDoF() const
Returns the number of degrees of freedom of the overall track or vertex fit as float.
virtual double phi() const override final
The azimuthal angle ( ) of the particle (has range to .)
const ParametersCovMatrix_t definingParametersCovMatrix() const
Returns the 5x5 symmetric matrix containing the defining parameters covariance matrix.
bool summaryValue(uint8_t &value, const SummaryType &information) const
Accessor for TrackSummary values.
float qOverP() const
Returns the parameter.
virtual double pt() const override final
The transverse momentum ( ) of the particle.
float chiSquared() const
Returns the of the overall track fit.
virtual double eta() const override final
The pseudorapidity ( ) of the particle.
double xmax
Definition listroot.cxx:61
double ymin
Definition listroot.cxx:63
double xmin
Definition listroot.cxx:60
double ymax
Definition listroot.cxx:64
TrackParticle_v1 TrackParticle
Reference the current persistent version:
Muon_v1 Muon
Reference the current persistent version:
@ numberOfPrecisionLayers
layers with at least 3 hits [unit8_t].
@ numberOfTRTHits
number of TRT hits [unit8_t].
@ numberOfTriggerEtaLayers
layers with trigger eta hits [unit8_t].
@ numberOfPhiLayers
layers with a trigger phi hit [unit8_t].
@ numberOfSCTHits
number of hits in SCT [unit8_t].
@ numberOfInnermostPixelLayerHits
these are the hits in the 0th pixel barrel layer
@ numberOfPixelHits
these are the pixel hits, including the b-layer [unit8_t].
@ outerSmallHits
number of precision hits in the outer small layer
@ middleSmallHits
number of precision hits in the middle small layer
@ outerLargeHits
number of precision hits in the outer large layer
@ etaLayer3Hits
number of eta hits in the third trigger layer (BOL1 ot T2)
@ middleLargeHits
number of precision hits in the middle large layer
@ etaLayer1Hits
number of eta hits in the first trigger layer (BML1 ot T4)
@ extendedSmallHits
number of precision hits in the extended small layer
@ extendedLargeHits
number of precision hits in the extended large layer
@ innerLargeHits
number of precision hits in the inner large layer
@ etaLayer4Hits
number of eta hits in the fourth trigger layer (T3)
@ etaLayer2Hits
number of eta hits in the second trigger layer (BML2 ot T1)
@ innerSmallHits
number of precision hits in the inner small layer