ATLAS Offline Software
Loading...
Searching...
No Matches
MuonTrackMonitorAlgorithm.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3 2020 Matthias Schott - Uni Mainz
4*/
5
10
11
12namespace{
13 constexpr double MeVtoGeV = 1.e-3;
14}
15
16
17MuonTrackMonitorAlgorithm::MuonTrackMonitorAlgorithm (const std::string& name, ISvcLocator* pSvcLocator)
18 :AthMonitorAlgorithm(name,pSvcLocator){}
19
20
22{
24 ATH_CHECK(m_MuonContainerKey.initialize());
25 ATH_CHECK(m_MuonIsoDecorKey.initialize());
27 ATH_CHECK(m_derEventInfoKey.initialize());
30 return StatusCode::SUCCESS;
31}
32
33
34//========================================================================================================
35StatusCode MuonTrackMonitorAlgorithm::FillTrackInformation(const std::string& sIdentifier, const xAOD::Muon* muon, const xAOD::Vertex *pvtx, const std::string& sTrack, const xAOD::EventInfo &evt) const
36{
37
38
39 const double beamPosSigmaX = m_useBeamSpot ? evt.beamPosSigmaX() : -1.;
40 const double beamPosSigmaY = m_useBeamSpot ? evt.beamPosSigmaY() : -1.;
41 const double beamPosSigmaXY = m_useBeamSpot ? evt.beamPosSigmaXY() : -1.;
42
44 using namespace Monitored;
45 auto tool = getGroup("MuonTrackMonitorAlgorithm");
46 auto Author = Monitored::Scalar<float>((sIdentifier+sTrack+"Author").c_str(), -1);
47 auto Quality = Monitored::Scalar<float>((sIdentifier+sTrack+"Quality").c_str(), -1);
48 auto Type = Monitored::Scalar<float>((sIdentifier+sTrack+"Quality").c_str(), -1);
49 auto Eta = Monitored::Scalar<float>((sIdentifier+sTrack+"Eta").c_str(), -9);
50 auto Phi = Monitored::Scalar<float>((sIdentifier+sTrack+"Phi").c_str(), -9);
51 auto Pt = Monitored::Scalar<float>((sIdentifier+sTrack+"Pt").c_str(), -9);
52 auto D0 = Monitored::Scalar<float>((sIdentifier+sTrack+"D0").c_str(), -9);
53 auto Z0 = Monitored::Scalar<float>((sIdentifier+sTrack+"Z0").c_str(), -9);
54 auto deltaZ0 = Monitored::Scalar<float>((sIdentifier+sTrack+"deltaZ0").c_str(), -9);
55 auto D0sig = Monitored::Scalar<float>((sIdentifier+sTrack+"D0sig").c_str(), -9);
56 auto chi2ndof = Monitored::Scalar<float>((sIdentifier+sTrack+"chi2ndof").c_str(), -9);
57
58 Author = static_cast<int>(muon->author());
59 Quality = static_cast<int>(muon->quality());
60 Type = static_cast<int>(muon->type());
61
62 // fill track particle hists
63 const xAOD::TrackParticle *tp = nullptr;
64 if (sTrack == "ME") {
65 tp = muon->trackParticle(xAOD::Muon::TrackParticleType::ExtrapolatedMuonSpectrometerTrackParticle);
66 }
67 if (sTrack == "MS") {
68 tp = muon->trackParticle(xAOD::Muon::TrackParticleType::MuonSpectrometerTrackParticle);
69 }
70 if (tp) {
71 Eta = tp->eta();
72 Phi = tp->phi();
73 Pt = tp->pt() * MeVtoGeV;
74 D0 = tp->d0();
75 Z0 = tp->z0();
76 chi2ndof = tp->chiSquared()/std::max(1.f,tp->numberDoF());
77
78 if (pvtx) {
79 deltaZ0 = tp->z0() + tp->vz() - pvtx->z();
80 }
81
82 D0sig = m_useBeamSpot ? xAOD::TrackingHelpers::d0significance( tp, beamPosSigmaX, beamPosSigmaY, beamPosSigmaXY ) : -1.;
83
84 fill(tool, Author, Quality, Type, Eta, Phi, Pt, D0, Z0, chi2ndof, deltaZ0, D0sig);
85 }
86 return StatusCode::SUCCESS;
87}
88
89
90//========================================================================================================
91StatusCode MuonTrackMonitorAlgorithm::FillMuonInformation(const std::string& sIdentifier, std::vector<const xAOD::Muon*> &vecMuons, const xAOD::Vertex *pvtx, const xAOD::EventInfo &evt) const
92{
94 using namespace Monitored;
95 auto tool = getGroup("MuonTrackMonitorAlgorithm");
96 auto MuonEta = Monitored::Scalar<float>((sIdentifier+"MuonEta").c_str(), 0);
97 auto MuonPhi = Monitored::Scalar<float>((sIdentifier+"MuonPhi").c_str(), 0);
98 auto MuonEtaTight = Monitored::Scalar<float>((sIdentifier+"MuonEtaTight").c_str(), 0);
99 auto MuonPhiTight = Monitored::Scalar<float>((sIdentifier+"MuonPhiTight").c_str(), 0);
100 auto MuonEtaMedium = Monitored::Scalar<float>((sIdentifier+"MuonEtaMedium").c_str(), 0);
101 auto MuonPhiMedium = Monitored::Scalar<float>((sIdentifier+"MuonPhiMedium").c_str(), 0);
102 auto MuonD0 = Monitored::Scalar<float>((sIdentifier+"MuonD0").c_str(), 0);
103 auto MuonZ0 = Monitored::Scalar<float>((sIdentifier+"MuonZ0").c_str(), 0);
104 auto MuonPt = Monitored::Scalar<float>((sIdentifier+"MuonPt").c_str(), 0);
105 auto MuonDPTIDME = Monitored::Scalar<float>((sIdentifier+"MuonDPTIDME").c_str(), 0);
106 auto MuonDPTIDMS = Monitored::Scalar<float>((sIdentifier+"MuonDPTIDMS").c_str(), 0);
107 auto MuonDPTIDMECB = Monitored::Scalar<float>((sIdentifier+"MuonDPTIDMECB").c_str(), 0);
108 auto MuonDPTCBME = Monitored::Scalar<float>((sIdentifier+"MuonDPTCBME").c_str(), 0);
109 auto MuonsNBHits = Monitored::Scalar<float>((sIdentifier+"MuonNBHits").c_str(), 0);
110 auto MuonsNPixHits = Monitored::Scalar<float>((sIdentifier+"MuonNPixHits").c_str(), 0);
111 auto MuonsNSCTHits = Monitored::Scalar<float>((sIdentifier+"MuonNSCTHits").c_str(), 0);
112 auto MuonsNTRTHits = Monitored::Scalar<float>((sIdentifier+"MuonNTRTHits").c_str(), 0);
113 auto MuonsNBHitsAvg = Monitored::Scalar<float>((sIdentifier+"MuonNBHitsAvg").c_str(), 0);
114 auto MuonsNPixHitsAvg = Monitored::Scalar<float>((sIdentifier+"MuonNPixHitsAvg").c_str(), 0);
115 auto MuonsNSCTHitsAvg = Monitored::Scalar<float>((sIdentifier+"MuonNSCTHitsAvg").c_str(), 0);
116 auto MuonsNTRTHitsAvg = Monitored::Scalar<float>((sIdentifier+"MuonNTRTHitsAvg").c_str(), 0);
117 auto MuonsIDchi2ndof = Monitored::Scalar<float>((sIdentifier+"MuonIDchi2ndof").c_str(), 0);
118 auto MuonsMEchi2ndof = Monitored::Scalar<float>((sIdentifier+"MuonMEchi2ndof").c_str(), 0);
119 auto MuonsEtaHitsLayer1 = Monitored::Scalar<float>((sIdentifier+"MuonsEtaHitsLayer1").c_str(), 0);
120 auto MuonsEtaHitsLayer2 = Monitored::Scalar<float>((sIdentifier+"MuonsEtaHitsLayer2").c_str(), 0);
121 auto MuonsEtaHitsLayer3 = Monitored::Scalar<float>((sIdentifier+"MuonsEtaHitsLayer3").c_str(), 0);
122 auto MuonsEtaHitsLayer4 = Monitored::Scalar<float>((sIdentifier+"MuonsEtaHitsLayer4").c_str(), 0);
123 auto MuonsPhiHitsLayer1 = Monitored::Scalar<float>((sIdentifier+"MuonsPhiHitsLayer1").c_str(), 0);
124 auto MuonsPhiHitsLayer2 = Monitored::Scalar<float>((sIdentifier+"MuonsPhiHitsLayer2").c_str(), 0);
125 auto MuonsPhiHitsLayer3 = Monitored::Scalar<float>((sIdentifier+"MuonsPhiHitsLayer3").c_str(), 0);
126 auto MuonsPhiHitsLayer4 = Monitored::Scalar<float>((sIdentifier+"MuonsPhiHitsLayer4").c_str(), 0);
127
128 auto LumiBlock = Monitored::Scalar<float>("LumiBlock", 0);
129 auto LumiBlockTrackCategory = Monitored::Scalar<float>("LumiBlockTrackCategory", 0);
130
131 uint32_t lumiBlockID = evt.lumiBlock();
132 LumiBlock = lumiBlockID;
133 LumiBlockTrackCategory = getTrackCategoryID(sIdentifier);
134
136 for(unsigned int n=0; n<vecMuons.size(); n++) {
137 const xAOD::Muon* muon = vecMuons[n];
138 xAOD::Muon::MuonType muonType = muon->muonType();
139 xAOD::Muon::Quality muonQuality = muon->quality();
140
142 ATH_CHECK ( FillTrackInformation(sIdentifier, muon, pvtx, "ME", evt) );
143
145 MuonEta = muon->eta();
146 MuonPhi = muon->phi();
147 MuonPt = muon->pt() * MeVtoGeV;
148
149 const xAOD::TrackParticle *metp = muon->trackParticle(xAOD::Muon::ExtrapolatedMuonSpectrometerTrackParticle);
150 const xAOD::TrackParticle *idtp = muon->trackParticle(xAOD::Muon::InnerDetectorTrackParticle);
151 const xAOD::TrackParticle *mstp = muon->trackParticle(xAOD::Muon::MuonSpectrometerTrackParticle);
152
153 LumiBlockTrackCategory = 1;
154 fill(tool, LumiBlock, LumiBlockTrackCategory);
155 {
156 using enum xAOD::Muon::Quality;
157 if (muonQuality <= Loose) {
158 LumiBlockTrackCategory = 2;
159 fill(tool, LumiBlock, LumiBlockTrackCategory);
160 }
161 if (muonQuality <= Medium) {
162 LumiBlockTrackCategory = 3;
163 fill(tool, LumiBlock, LumiBlockTrackCategory);
164 }
165 if (muonQuality == Tight) {
166 LumiBlockTrackCategory = 4;
167 fill(tool, LumiBlock, LumiBlockTrackCategory);
168 }
169 }
170
171 LumiBlockTrackCategory = getTrackCategoryID(sIdentifier);
172 fill(tool, LumiBlock, LumiBlockTrackCategory);
173
174 if (muonType==xAOD::Muon::MuonType::Combined) {
175 const xAOD::TrackParticle *cbtp = muon->trackParticle(xAOD::Muon::CombinedTrackParticle);
176
177 if (cbtp) {
178 uint8_t hitval_numberOfBLayerHits, hitval_numberOfPixelHits, hitval_numberOfSCTHits, hitval_numberOfTRTHits;
180 cbtp->summaryValue(hitval_numberOfPixelHits, xAOD::SummaryType::numberOfPixelHits);
181 cbtp->summaryValue(hitval_numberOfSCTHits, xAOD::SummaryType::numberOfSCTHits);
182 cbtp->summaryValue(hitval_numberOfTRTHits, xAOD::SummaryType::numberOfTRTHits);
183
184 MuonZ0 = cbtp->z0();
185 MuonD0 = cbtp->d0();
186
187 fill(tool, MuonEta, MuonPhi, MuonPt, MuonZ0, MuonD0);
188
190 MuonsNBHits = static_cast<unsigned int>(hitval_numberOfBLayerHits);
191 MuonsNPixHits = static_cast<unsigned int>(hitval_numberOfPixelHits);
192 MuonsNSCTHits = static_cast<unsigned int>(hitval_numberOfSCTHits);
193 MuonsNTRTHits = static_cast<unsigned int>(hitval_numberOfTRTHits);
194 fill(tool, MuonsNBHits, MuonsNPixHits, MuonsNSCTHits, MuonsNTRTHits);
195 MuonsNBHitsAvg = hitval_numberOfBLayerHits / vecMuons.size();
196 MuonsNPixHitsAvg = hitval_numberOfPixelHits / vecMuons.size();
197 MuonsNSCTHitsAvg = hitval_numberOfSCTHits / vecMuons.size();
198 MuonsNTRTHitsAvg = hitval_numberOfTRTHits / vecMuons.size();
199 fill(tool, MuonsNBHitsAvg, MuonsNPixHitsAvg, MuonsNSCTHitsAvg, MuonsNTRTHitsAvg);
200
202 uint8_t hitval_nEtaLayer1{0}, hitval_nEtaLayer2{0}, hitval_nEtaLayer3{0}, hitval_nEtaLayer4{0};
203 uint8_t hitval_nPhiLayer1{0}, hitval_nPhiLayer2{0}, hitval_nPhiLayer3{0}, hitval_nPhiLayer4{0};
204 muon->summaryValue(hitval_nEtaLayer1, xAOD::MuonSummaryType::etaLayer1Hits);
205 muon->summaryValue(hitval_nEtaLayer2, xAOD::MuonSummaryType::etaLayer2Hits);
206 muon->summaryValue(hitval_nEtaLayer3, xAOD::MuonSummaryType::etaLayer3Hits);
207 muon->summaryValue(hitval_nEtaLayer4, xAOD::MuonSummaryType::etaLayer4Hits);
208 muon->summaryValue(hitval_nPhiLayer1, xAOD::MuonSummaryType::phiLayer1Hits);
209 muon->summaryValue(hitval_nPhiLayer2, xAOD::MuonSummaryType::phiLayer2Hits);
210 muon->summaryValue(hitval_nPhiLayer3, xAOD::MuonSummaryType::phiLayer3Hits);
211 muon->summaryValue(hitval_nPhiLayer4, xAOD::MuonSummaryType::phiLayer4Hits);
212 MuonsEtaHitsLayer1 = static_cast<unsigned int>(hitval_nEtaLayer1);
213 MuonsEtaHitsLayer2 = static_cast<unsigned int>(hitval_nEtaLayer2);
214 MuonsEtaHitsLayer3 = static_cast<unsigned int>(hitval_nEtaLayer3);
215 MuonsEtaHitsLayer4 = static_cast<unsigned int>(hitval_nEtaLayer4);
216 MuonsPhiHitsLayer1 = static_cast<unsigned int>(hitval_nPhiLayer1);
217 MuonsPhiHitsLayer2 = static_cast<unsigned int>(hitval_nPhiLayer2);
218 MuonsPhiHitsLayer3 = static_cast<unsigned int>(hitval_nPhiLayer3);
219 MuonsPhiHitsLayer4 = static_cast<unsigned int>(hitval_nPhiLayer4);
220 fill(tool, MuonsEtaHitsLayer1, MuonsEtaHitsLayer2, MuonsEtaHitsLayer3, MuonsEtaHitsLayer4, MuonsPhiHitsLayer1, MuonsPhiHitsLayer2, MuonsPhiHitsLayer3, MuonsPhiHitsLayer4);
221
224 if (muonQuality==xAOD::Muon::Quality::Medium) {
225 MuonEtaMedium = cbtp->eta();
226 MuonPhiMedium = cbtp->phi();
227 fill(tool, MuonEtaMedium, MuonPhiMedium);
228 }
229 if (muonQuality==xAOD::Muon::Quality::Tight) {
230 MuonEtaTight = cbtp->eta();
231 MuonPhiTight = cbtp->phi();
232 fill(tool, MuonEtaTight, MuonPhiTight);
233 }
235 if (idtp && metp) {
236 MuonDPTIDME = (idtp->pt() - metp->pt()) / idtp->pt();
237 MuonDPTCBME = (cbtp->pt() - metp->pt()) / cbtp->pt();
238 MuonDPTIDMECB = (idtp->pt() - metp->pt()) / cbtp->pt();
239 MuonsIDchi2ndof = idtp->chiSquared()/std::max(1.f,idtp->numberDoF());
240 MuonsMEchi2ndof = metp->chiSquared()/std::max(1.f,metp->numberDoF());
241 fill(tool, MuonDPTIDME, MuonsIDchi2ndof, MuonsMEchi2ndof);
242 }
243 }
244 }
245 else {
246 const xAOD::TrackParticle *ptp = muon->trackParticle(xAOD::Muon::TrackParticleType::Primary);
247 if (ptp) {
248 MuonZ0 = ptp->z0();
249 MuonD0 = ptp->d0();
250
251 fill(tool, MuonEta, MuonPhi, MuonPt, MuonZ0, MuonD0);
252
253 // Information on hits in each layer
254 uint8_t hitval_numberOfBLayerHits{0}, hitval_numberOfPixelHits{0}, hitval_numberOfSCTHits{0}, hitval_numberOfTRTHits{0};
256 ptp->summaryValue(hitval_numberOfPixelHits, xAOD::SummaryType::numberOfPixelHits);
257 ptp->summaryValue(hitval_numberOfSCTHits, xAOD::SummaryType::numberOfSCTHits);
258 ptp->summaryValue(hitval_numberOfTRTHits, xAOD::SummaryType::numberOfTRTHits);
259 MuonsNBHits = static_cast<unsigned int>(hitval_numberOfBLayerHits);
260 MuonsNPixHits = static_cast<unsigned int>(hitval_numberOfPixelHits);
261 MuonsNSCTHits = static_cast<unsigned int>(hitval_numberOfSCTHits);
262 MuonsNTRTHits = static_cast<unsigned int>(hitval_numberOfTRTHits);
263 fill(tool, MuonsNBHits, MuonsNPixHits, MuonsNSCTHits, MuonsNTRTHits);
264
266 if (idtp && metp) {
267 MuonDPTIDME = (idtp->pt() - metp->pt()) / idtp->pt();
268 MuonsIDchi2ndof = idtp->chiSquared()/idtp->numberDoF();
269 MuonsMEchi2ndof = metp->chiSquared()/metp->numberDoF();
270 fill(tool, MuonDPTIDME, MuonsIDchi2ndof, MuonsMEchi2ndof);
271 }
272 }
273 }
274
276 auto muonEta = muon->eta();
277 if (mstp) {
278 if (muonEta > 1.05) {
279 LumiBlockTrackCategory = getTrackCategoryID("MS_EA");
280 } else if (muonEta > 0) {
281 LumiBlockTrackCategory = getTrackCategoryID("MS_BA");
282 } else if (muonEta > -1.05) {
283 LumiBlockTrackCategory = getTrackCategoryID("MS_BC");
284 } else if (muonEta <= -1.05) {
285 LumiBlockTrackCategory = getTrackCategoryID("MS_EC");
286 }
287 fill(tool, LumiBlock, LumiBlockTrackCategory);
288 }
289 if (idtp) {
290 auto muonEta = muon->eta();
291 if (muonEta > 1.05) {
292 LumiBlockTrackCategory = getTrackCategoryID("ID_EA");
293 } else if (muonEta > 0) {
294 LumiBlockTrackCategory = getTrackCategoryID("ID_BA");
295 } else if (muonEta > -1.05) {
296 LumiBlockTrackCategory = getTrackCategoryID("ID_BC");
297 } else if (muonEta <= -1.05) {
298 LumiBlockTrackCategory = getTrackCategoryID("ID_EC");
299 }
300 fill(tool, LumiBlock, LumiBlockTrackCategory);
301 }
302 if (metp) {
303 auto muonEta = muon->eta();
304 if (muonEta > 1.05) {
305 LumiBlockTrackCategory = getTrackCategoryID("ME_EA");
306 } else if (muonEta > 0) {
307 LumiBlockTrackCategory = getTrackCategoryID("ME_BA");
308 } else if (muonEta > -1.05) {
309 LumiBlockTrackCategory = getTrackCategoryID("ME_BC");
310 } else if (muonEta <= -1.05) {
311 LumiBlockTrackCategory = getTrackCategoryID("ME_EC");
312 }
313 fill(tool, LumiBlock, LumiBlockTrackCategory);
314 }
315 }
316 return StatusCode::SUCCESS;
317}
318
319//========================================================================================================
320StatusCode MuonTrackMonitorAlgorithm::analyseLowLevelMuonFeatures(const std::string& sIdentifier, std::vector<const xAOD::Muon*> &Muons, const xAOD::EventInfo &evt) const
321{
322 uint32_t lumiBlockID = evt.lumiBlock();
323
324 using namespace Monitored;
325
327 auto tool = getGroup("MuonTrackMonitorAlgorithm");
328 auto MuonAuthor = Monitored::Scalar<float>((sIdentifier+"MuonAuthor").c_str(), 0);
329 auto MuonQuality = Monitored::Scalar<float>((sIdentifier+"MuonQuality").c_str(), 0);
330 auto MuonType = Monitored::Scalar<float>((sIdentifier+"MuonType").c_str(), 0);
331 auto MuonLargeSectorR = Monitored::Scalar<float>((sIdentifier+"MuonLargeSectorR").c_str(), 0);
332 auto MuonLargeSectorZ = Monitored::Scalar<float>((sIdentifier+"MuonLargeSectorZ").c_str(), 0);
333 auto MuonSmallSectorR = Monitored::Scalar<float>((sIdentifier+"MuonSmallSectorR").c_str(), 0);
334 auto MuonSmallSectorZ = Monitored::Scalar<float>((sIdentifier+"MuonSmallSectorZ").c_str(), 0);
335 auto MuonEta = Monitored::Scalar<float>((sIdentifier+"MuonEta").c_str(), 0);
336 auto MuonPhi = Monitored::Scalar<float>((sIdentifier+"MuonPhi").c_str(), 0);
337 auto MuonPt = Monitored::Scalar<float>((sIdentifier+"MuonPt").c_str(), 0);
338 auto MuonEtaHi = Monitored::Scalar<float>((sIdentifier+"MuonEtaHi").c_str(), 0);
339 auto MuonPhiHi = Monitored::Scalar<float>((sIdentifier+"MuonPhiHi").c_str(), 0);
340 auto MuonPtHi = Monitored::Scalar<float>((sIdentifier+"MuonPtHi").c_str(), 0);
341 auto MuonSector = Monitored::Scalar<float>((sIdentifier+"MuonSector").c_str(), 0);
342 auto MuonCIndex = Monitored::Scalar<float>((sIdentifier+"MuonCIndex").c_str(), 0);
343 auto MuonEta1 = Monitored::Scalar<float>((sIdentifier+"MuonEta1All").c_str(), 0);
344 auto MuonPhi1 = Monitored::Scalar<float>((sIdentifier+"MuonPhi1All").c_str(), 0);
345 auto MuonLumiBlock = Monitored::Scalar<float>((sIdentifier+"MuonLumiBlock").c_str(), 0);
346 auto SegmentXPosBarrel = Monitored::Scalar<float>((sIdentifier+"SegmentXPosBarrel").c_str(), 0);
347 auto SegmentYPosBarrel = Monitored::Scalar<float>((sIdentifier+"SegmentYPosBarrel").c_str(), 0);
348 auto SegmentXPosEndcap = Monitored::Scalar<float>((sIdentifier+"SegmentXPosEndcap").c_str(), 0);
349 auto SegmentYPosEndcap = Monitored::Scalar<float>((sIdentifier+"SegmentYPosEndcap").c_str(), 0);
350
352 for(const auto muon : Muons) {
353 xAOD::Muon::Quality muonQuality = muon->quality();
354 xAOD::Muon::MuonType muonType = muon->muonType();
355 xAOD::Muon::Author muonAuthor = muon->author();
356 MuonLumiBlock = lumiBlockID;
357 fill(tool, MuonLumiBlock);
358
360 MuonAuthor = static_cast<int>(muonAuthor);
361 MuonQuality = static_cast<int>(muonQuality);
362 MuonType = static_cast<int>(muonType);
363 MuonEta = muon->eta();
364 MuonPhi = muon->phi();
365 MuonPt = muon->pt() * MeVtoGeV;
366 fill(tool, MuonAuthor, MuonQuality, MuonType, MuonEta, MuonPhi, MuonPt);
367
368 // Fill high pT plots
369 if (muon->pt() > m_CBmuons_minPt) {
370 MuonEtaHi = muon->eta();
371 MuonPhiHi = muon->phi();
372 MuonPtHi = muon->pt() * MeVtoGeV;
373 fill(tool, MuonEtaHi, MuonPhiHi, MuonPtHi);
374 }
375
377 for (size_t nSeg=0; nSeg < muon->nMuonSegments(); nSeg++) {
378 const xAOD::MuonSegment* muonSegment = muon->muonSegment(nSeg);
379 if (!muonSegment) {
380 continue;
381 }
382 using namespace Muon::MuonStationIndex;
383 MuonSmallSectorR = MuonLargeSectorR = std::hypot(muonSegment->x(), muonSegment->y());
384 MuonSmallSectorZ = MuonLargeSectorZ = muonSegment->z();
385 MuonSector = muonSegment->sector();
386 MuonCIndex = toInt(muonSegment->chamberIndex());
387 int sector = muonSegment->sector();
388 if(sector % 2 == 0) {
389 fill(tool, MuonLargeSectorZ, MuonLargeSectorR, MuonSector, MuonCIndex);
390 } else {
391 fill(tool, MuonSmallSectorZ, MuonSmallSectorR, MuonSector, MuonCIndex);
392 }
393 const double muonSegmentEta = Amg::Vector3D(muonSegment->px(), muonSegment->py(), muonSegment->pz()).eta();
394 if (std::abs(muonSegmentEta) > 1.05) {
395 SegmentXPosEndcap = muonSegment->x();
396 SegmentYPosEndcap = muonSegment->y();
397 fill(tool, SegmentXPosEndcap, SegmentYPosEndcap);
398 } else {
399 SegmentXPosBarrel = muonSegment->x();
400 SegmentYPosBarrel = muonSegment->y();
401 fill(tool, SegmentXPosBarrel, SegmentYPosBarrel);
402 }
403 }
404 }
405
406 return StatusCode::SUCCESS;
407}
408
409
410
411//========================================================================================================
413 using namespace Monitored;
414
416 auto tool = getGroup("MuonTrackMonitorAlgorithm");
417 auto MuonPrefix = Monitored::Scalar<const char*>("MuonPrefix", "");
418 auto NMuons = Monitored::Scalar<int>("NMuons", 0);
419 auto NMuonsTrig = Monitored::Scalar<int>("NMuonsTrig", 0);
420 auto NMuonsTrigCB = Monitored::Scalar<int>("NMuonsTrigCB", 0);
421 auto NMuonsTrigNonCB = Monitored::Scalar<int>("NMuonsTrigNonCB", 0);
422 auto NMuonsNoTrigCB = Monitored::Scalar<int>("NMuonsNoTrigCB", 0);
423 auto NMuonsNoTrigNonCB = Monitored::Scalar<int>("NMuonsNoTrigNonCB", 0);
424 auto LumiBlockNumberOfMuonTracks = Monitored::Scalar<float>("MSLumiBlockNumberOfMuonTracks", 0);
425 auto LumiBlockNumberOfSegments = Monitored::Scalar<float>("MSLumiBlockNumberOfSegments", 0);
426
428 std::vector<const xAOD::Muon*> vecAllCombinedMuons;
429 std::vector<const xAOD::Muon*> vecCombinedMuons;
430 std::vector<const xAOD::Muon*> vecNoTrigCombinedMuons;
431
433 std::vector<const xAOD::Muon*> vecAllNonCombinedMuons;
434 std::vector<const xAOD::Muon*> vecNonCombinedMuons;
435 std::vector<const xAOD::Muon*> vecNoTrigNonCombinedMuons;
436
437 uint32_t n_muons = 0;
438 uint32_t n_muons_trig = 0;
439 uint32_t n_muons_trig_cb = 0;
440 uint32_t n_muons_trig_noncb = 0;
441 uint32_t n_muons_no_trig_cb = 0;
442 uint32_t n_muons_no_trig_noncb = 0;
443 for(const auto muon : Muons) {
444 n_muons++;
445 bool isTriggered = false;
446 for(const auto& chain : m_hltchainList){
447 if(!getTrigDecisionTool().empty() && getTrigDecisionTool()->isPassed( chain ) ){
448 isTriggered = true;
449 }
450 }
451
453 if (isTriggered) {
454 ATH_CHECK ( FillTrackInformation("Container", muon, pvtx, "MS", evt) );
455 }
456 else {
457 ATH_CHECK ( FillTrackInformation("ContainerNoTrig", muon, pvtx, "MS", evt) );
458 }
459
460 xAOD::Muon::MuonType muonType = muon->muonType();
461 if (muonType==xAOD::Muon::MuonType::Combined) {
462 vecAllCombinedMuons.push_back(muon);
463 if (isTriggered) {
464 vecCombinedMuons.push_back(muon);
465 n_muons_trig++;
466 n_muons_trig_cb++;
467 MuonPrefix = "TrigCB";
468 }
469 else {
470 vecNoTrigCombinedMuons.push_back(muon);
471 MuonPrefix = "NoTrigCB";
472 n_muons_no_trig_cb++;
473 }
474 }
475 else {
476 vecAllNonCombinedMuons.push_back(muon);
477 if (isTriggered) {
478 vecNonCombinedMuons.push_back(muon);
479 n_muons_trig++;
480 n_muons_trig_noncb++;
481 MuonPrefix = "TrigNonCB";
482 }
483 else {
484 vecNoTrigNonCombinedMuons.push_back(muon);
485 MuonPrefix = "NoTrigNonCB";
486 n_muons_no_trig_noncb++;
487 }
488 }
489 fill(tool, MuonPrefix);
490 for (size_t nSeg=0; nSeg < muon->nMuonSegments(); nSeg++) {
491 LumiBlockNumberOfSegments = evt.lumiBlock();
492 fill(tool, LumiBlockNumberOfSegments);
493 }
494 }
495 NMuons = n_muons;
496 NMuonsTrig = n_muons_trig;
497 NMuonsTrigCB = n_muons_trig_cb;
498 NMuonsTrigNonCB = n_muons_trig_noncb;
499 NMuonsNoTrigCB = n_muons_no_trig_cb;
500 NMuonsNoTrigNonCB = n_muons_no_trig_noncb;
501 fill(tool, NMuons, NMuonsTrig, NMuonsTrigCB, NMuonsTrigNonCB, NMuonsNoTrigCB, NMuonsNoTrigNonCB);
502
503 LumiBlockNumberOfMuonTracks = evt.lumiBlock();
504 fill(tool, LumiBlockNumberOfMuonTracks);
505
507 ATH_CHECK (analyseLowLevelMuonFeatures("AllCB", vecAllCombinedMuons, evt) );
508 ATH_CHECK (analyseLowLevelMuonFeatures("AllNonCB", vecAllNonCombinedMuons, evt) );
509 ATH_CHECK (analyseLowLevelMuonFeatures("CB", vecCombinedMuons, evt) );
510 ATH_CHECK (analyseLowLevelMuonFeatures("NonCB", vecNonCombinedMuons, evt) );
511 ATH_CHECK (analyseLowLevelMuonFeatures("NoTrigCB", vecNoTrigCombinedMuons, evt) );
512 ATH_CHECK (analyseLowLevelMuonFeatures("NoTrigNonCB", vecNoTrigNonCombinedMuons, evt) );
513
515 ATH_CHECK (FillMuonInformation("AllCB", vecAllCombinedMuons, pvtx, evt) );
516 ATH_CHECK (FillMuonInformation("AllNonCB", vecAllNonCombinedMuons, pvtx, evt) );
517 ATH_CHECK (FillMuonInformation("CB", vecCombinedMuons, pvtx, evt) );
518 ATH_CHECK (FillMuonInformation("NonCB", vecNonCombinedMuons, pvtx, evt) );
519 ATH_CHECK (FillMuonInformation("NoTrigCB", vecNoTrigCombinedMuons, pvtx, evt) );
520 ATH_CHECK (FillMuonInformation("NoTrigNonCB", vecNoTrigNonCombinedMuons, pvtx, evt) );
521
522 return StatusCode::SUCCESS;
523}
524
525
526//========================================================================================================
527StatusCode MuonTrackMonitorAlgorithm::plotResonanceCandidates(const std::string& resonanceName, std::vector<const xAOD::Muon*>& muonCandidates, const xAOD::Vertex *pvtx, const xAOD::EventInfo &evt) const {
528
529 uint32_t lumiBlockID = evt.lumiBlock();
530
531 using namespace Monitored;
532
534 auto tool = getGroup("MuonTrackMonitorAlgorithm");
535 auto Eta = Monitored::Scalar<float>((resonanceName+"Eta").c_str(), 0);
536 auto Mass = Monitored::Scalar<float>((resonanceName+"Mass").c_str(), 0);
537 auto MuonLumiBlock = Monitored::Scalar<float>((resonanceName+"MuonLumiBlock").c_str(), 0);
538 auto muMinusEta = Monitored::Scalar<float>((resonanceName+"muMinusEta").c_str(), -9);
539 auto muPlusEta = Monitored::Scalar<float>((resonanceName+"muPlusEta").c_str(), -9);
540 auto Eta2 = Monitored::Scalar<const char*>((resonanceName+"Eta2").c_str(), "out");
541 auto Eta2D = Monitored::Scalar<int>((resonanceName+"Eta2D").c_str(), -9);
542
544 std::map<int, int> mapTagged_Resonance;
545 std::vector<const xAOD::Muon*> vecMuons;
546 for (unsigned int n=0; n<muonCandidates.size(); n++)
547 mapTagged_Resonance[n]=0;
548 for (unsigned int n=0; n<muonCandidates.size(); n++){
549 const TLorentzVector& tVec1 = muonCandidates[n]->p4();
550 for (unsigned int m=n+1; m<muonCandidates.size(); m++) {
551 const TLorentzVector& tVec2 = muonCandidates[m]->p4();
552 const TLorentzVector candidate = tVec1 + tVec2;
553 const float resonance_Mass = candidate.M() * MeVtoGeV;
554 const float resonance_Eta = candidate.Eta();
555 if (muonCandidates[n]->charge()==muonCandidates[m]->charge()) continue;
556 if ((candidate.M() < m_ZBosonSelection_minMass)&&(resonanceName=="Z")) continue;
557 if ((candidate.M() > m_ZBosonSelection_maxMass)&&(resonanceName=="Z")) continue;
558 if ((candidate.M() < m_JpsiSelection_minMass)&&(resonanceName=="Jpsi")) continue;
559 if ((candidate.M() > m_JpsiSelection_maxMass)&&(resonanceName=="Jpsi")) continue;
560
561 if (mapTagged_Resonance[n]!=1) vecMuons.push_back(muonCandidates[n]);
562 mapTagged_Resonance[n]=1;
563 if (mapTagged_Resonance[m]!=1) vecMuons.push_back(muonCandidates[m]);
564 mapTagged_Resonance[m]=1;
565
566 if (muonCandidates[n]->charge()<0){
567 muMinusEta = tVec1.Eta();
568 muPlusEta = tVec2.Eta();
569 }
570 else{
571 muMinusEta = tVec2.Eta();
572 muPlusEta = tVec1.Eta();
573 }
574 int EtaReg = -9;
575 const char* EtaRegio = "out";
576 if ((muMinusEta>1.05)&&(muPlusEta>1.05)){
577 EtaReg = 1;
578 EtaRegio = "EA_EA";
579 auto Mass2D = Monitored::Scalar<float>((resonanceName+"Mass_"+EtaRegio).c_str(), 0);
580 Mass2D = resonance_Mass;
581 fill(tool, Mass2D);
582 } else if ((muMinusEta>1.05)&&(muPlusEta>0.)&&(muPlusEta<1.05)){
583 //EtaReg = "EA_BA";
584 EtaReg = 2;
585 auto Mass2D = Monitored::Scalar<float>((resonanceName+"Mass_"+EtaRegio).c_str(), 0);
586 Mass2D = resonance_Mass;
587 fill(tool, Mass2D);
588 } else if ((muMinusEta>1.05)&&(muPlusEta>-1.05)&&(muPlusEta<0.)){
589 //EtaReg = "EA_BC";
590 EtaReg = 3;
591 auto Mass2D = Monitored::Scalar<float>((resonanceName+"Mass_"+EtaRegio).c_str(), 0);
592 Mass2D = resonance_Mass;
593 fill(tool, Mass2D);
594 } else if ((muMinusEta>1.05)&&(muPlusEta<-1.05)){
595 //EtaReg = "EA_EC";
596 EtaReg = 4;
597 auto Mass2D = Monitored::Scalar<float>((resonanceName+"Mass_"+EtaRegio).c_str(), 0);
598 Mass2D = resonance_Mass;
599 fill(tool, Mass2D);
600 } else if ((muMinusEta>0.)&&(muMinusEta<1.05)&&(muPlusEta>1.05)){
601 //EtaReg = "BA_EA";
602 EtaReg = 5;
603 auto Mass2D = Monitored::Scalar<float>((resonanceName+"Mass_"+EtaRegio).c_str(), 0);
604 Mass2D = resonance_Mass;
605 fill(tool, Mass2D);
606 } else if ((muMinusEta>0.)&&(muMinusEta<1.05)&&(muPlusEta>0.)&&(muPlusEta<1.05)){
607 //EtaReg = "BA_BA";
608 EtaReg = 6;
609 auto Mass2D = Monitored::Scalar<float>((resonanceName+"Mass_"+EtaRegio).c_str(), 0);
610 Mass2D = resonance_Mass;
611 fill(tool, Mass2D);
612 } else if ((muMinusEta>0.)&&(muMinusEta<1.05)&&(muPlusEta>-1.05)&&(muPlusEta<0.)){
613 //EtaReg = "BA_BC";
614 EtaReg = 7;
615 auto Mass2D = Monitored::Scalar<float>((resonanceName+"Mass_"+EtaRegio).c_str(), 0);
616 Mass2D = resonance_Mass;
617 fill(tool, Mass2D);
618 } else if ((muMinusEta>0.)&&(muMinusEta<1.05)&&(muPlusEta<-1.05)){
619 //EtaReg = "BA_EC";
620 EtaReg = 8;
621 auto Mass2D = Monitored::Scalar<float>((resonanceName+"Mass_"+EtaRegio).c_str(), 0);
622 Mass2D = resonance_Mass;
623 fill(tool, Mass2D);
624 } else if ((muMinusEta>-1.05)&&(muMinusEta<0.)&&(muPlusEta>1.05)){
625 //EtaReg = "BC_EA";
626 EtaReg = 9;
627 auto Mass2D = Monitored::Scalar<float>((resonanceName+"Mass_"+EtaRegio).c_str(), 0);
628 Mass2D = resonance_Mass;
629 fill(tool, Mass2D);
630 } else if ((muMinusEta>-1.05)&&(muMinusEta<0.)&&(muPlusEta>0.)&&(muPlusEta<1.05)){
631 //EtaReg = "BC_BA";
632 EtaReg = 10;
633 auto Mass2D = Monitored::Scalar<float>((resonanceName+"Mass_"+EtaRegio).c_str(), 0);
634 Mass2D = resonance_Mass;
635 fill(tool, Mass2D);
636 } else if ((muMinusEta>-1.05)&&(muMinusEta<0.)&&(muPlusEta>-1.05)&&(muPlusEta<0.)){
637 //EtaReg = "BC_BC";
638 EtaReg = 11;
639 auto Mass2D = Monitored::Scalar<float>((resonanceName+"Mass_"+EtaRegio).c_str(), 0);
640 Mass2D = resonance_Mass;
641 fill(tool, Mass2D);
642 } else if ((muMinusEta>-1.05)&&(muMinusEta<0.)&&(muPlusEta<-1.05)){
643 //EtaReg = "BC_EC";
644 EtaReg = 12;
645 auto Mass2D = Monitored::Scalar<float>((resonanceName+"Mass_"+EtaRegio).c_str(), 0);
646 Mass2D = resonance_Mass;
647 fill(tool, Mass2D);
648 } else if ((muMinusEta<-1.05)&&(muPlusEta>1.05)){
649 //EtaReg = "EC_EA";
650 EtaReg = 13;
651 auto Mass2D = Monitored::Scalar<float>((resonanceName+"Mass_"+EtaRegio).c_str(), 0);
652 Mass2D = resonance_Mass;
653 fill(tool, Mass2D);
654 } else if ((muMinusEta<-1.05)&&(muPlusEta>0.)&&(muPlusEta<1.05)){
655 //EtaReg = "EC_BA";
656 EtaReg = 14;
657 auto Mass2D = Monitored::Scalar<float>((resonanceName+"Mass_"+EtaRegio).c_str(), 0);
658 Mass2D = resonance_Mass;
659 fill(tool, Mass2D);
660 } else if ((muMinusEta<-1.05)&&(muPlusEta>-1.05)&&(muPlusEta<0.)){
661 //EtaReg = "EC_BC";
662 EtaReg = 15;
663 auto Mass2D = Monitored::Scalar<float>((resonanceName+"Mass_"+EtaRegio).c_str(), 0);
664 Mass2D = resonance_Mass;
665 fill(tool, Mass2D);
666 } else if ((muMinusEta<-1.05)&&(muPlusEta<-1.05)){
667 //EtaReg = "EC_EC";
668 EtaReg = 16;
669 auto Mass2D = Monitored::Scalar<float>((resonanceName+"Mass_"+EtaRegio).c_str(), 0);
670 Mass2D = resonance_Mass;
671 fill(tool, Mass2D);
672 } else {
673 //EtaReg = "out";
674 EtaReg = 19;
675 auto Mass2D = Monitored::Scalar<float>((resonanceName+"Mass_"+EtaRegio).c_str(), 0);
676 }
677 Mass = resonance_Mass;
678 Eta = resonance_Eta;
679 Eta2D = EtaReg;
680 Eta2 = EtaRegio;
681 fill(tool, Mass, Eta, Eta2, Eta2D, muMinusEta, muPlusEta);
682
683 MuonLumiBlock = lumiBlockID;
684 fill(tool, MuonLumiBlock);
685 }
686 }
687
689 ATH_CHECK( FillMuonInformation(resonanceName, vecMuons, pvtx, evt) );
690
691 return StatusCode::SUCCESS;
692}
693
694
695//========================================================================================================
697
698 std::vector<const xAOD::Muon*> vecMuons_ZBoson_Candidates;
699 std::vector<const xAOD::Muon*> vecMuons_Jpsi_Candidates;
700
702 for(const auto muon : Muons) {
703 xAOD::Muon::MuonType muonType = muon->muonType();
704 if (muonType==xAOD::Muon::MuonType::Combined) {
705 const xAOD::TrackParticle *cbtp = muon->trackParticle(xAOD::Muon::TrackParticleType::CombinedTrackParticle);
707 if (cbtp) {
708 float trkiso = muon->isolation(xAOD::Iso::ptcone30)/muon->pt();
709 if (muonType==xAOD::Muon::MuonType::Combined &&
710 cbtp &&
711 muon->pt()>m_ZBosonSelection_minPt &&
712 std::abs(muon->eta())<m_ZBosonSelection_maxEta &&
714 std::abs(cbtp->z0())<m_ZBosonSelection_Z0Cut &&
715 std::abs(cbtp->d0())<m_ZBosonSelection_D0Cut )
716 vecMuons_ZBoson_Candidates.push_back(muon);
717 if (muonType==xAOD::Muon::MuonType::Combined &&
718 cbtp &&
719 muon->pt()>m_JpsiSelection_minPt &&
720 std::abs(muon->eta())<m_JpsiSelection_maxEta &&
722 std::abs(cbtp->z0())<m_JpsiSelection_Z0Cut &&
723 std::abs(cbtp->d0())<m_JpsiSelection_D0Cut )
724 vecMuons_Jpsi_Candidates.push_back(muon);
725 }
726 }
727 }
728
729 ATH_CHECK( plotResonanceCandidates("Z", vecMuons_ZBoson_Candidates, pvtx, evt) );
730 ATH_CHECK( plotResonanceCandidates("Jpsi", vecMuons_Jpsi_Candidates, pvtx, evt) );
731
732 return StatusCode::SUCCESS;
733}
734
735
736//========================================================================================================
737StatusCode MuonTrackMonitorAlgorithm::fillHistograms(const EventContext& ctx) const
738{
739 using namespace Monitored;
740
742 if ((!m_derEventInfoKey.empty()) && (!m_MuonContainerKey.empty()) && (!m_VertexContainerKey.empty())) {
744 if (ATH_UNLIKELY(! EventInfo.isValid())) {
745 ATH_MSG_ERROR("Unable to retrieve Event Info " << m_MuonContainerKey);
746 return StatusCode::FAILURE;
747 }
748
749 const xAOD::Vertex *pvtx = nullptr;
751 if (!Vertices.isValid()) {
752 ATH_MSG_ERROR("Unable to retrieve Vertex container" << m_VertexContainerKey);
753 return StatusCode::FAILURE;
754 }
755 else {
756 pvtx = getPrimaryVertex(*Vertices);
757 }
758
760 if (ATH_UNLIKELY(! Muons.isValid())) {
761 ATH_MSG_ERROR("Unable to retrieve muon container " << m_MuonContainerKey);
762 return StatusCode::FAILURE;
763 }
764
767
768 }
769
770 return StatusCode::SUCCESS;
771}
772
773
774//========================================================================================================
776{
777 const xAOD::Vertex *pvtx = nullptr;
778 for(const auto vertex : Vertices){
779 if (vertex->vertexType() == xAOD::VxType::PriVtx) {
780 pvtx = vertex;
781 }
782 }
783 return pvtx;
784}
785
786//========================================================================================================
787int MuonTrackMonitorAlgorithm::getTrackCategoryID(const std::string& sIdentifier) const
788{
789 int trackCategoryID = -1;
790
791 if (sIdentifier == "NoTrigNonCB") trackCategoryID = 6;
792 else if (sIdentifier == "NoTrigCB") trackCategoryID = 7;
793 else if (sIdentifier == "NonCB") trackCategoryID = 8;
794 else if (sIdentifier == "CB") trackCategoryID = 9;
795 else if (sIdentifier == "AllNonCB") trackCategoryID = 10;
796 else if (sIdentifier == "AllCB") trackCategoryID = 11;
797 // --------------------
798 else if (sIdentifier == "Z") trackCategoryID = 13;
799 else if (sIdentifier == "Jpsi") trackCategoryID = 14;
800 // --------------------
801 else if (sIdentifier == "ME_EC") trackCategoryID = 16;
802 else if (sIdentifier == "ME_BC") trackCategoryID = 17;
803 else if (sIdentifier == "ME_BA") trackCategoryID = 18;
804 else if (sIdentifier == "ME_EA") trackCategoryID = 19;
805 // --------------------
806 else if (sIdentifier == "MS_EC") trackCategoryID = 21;
807 else if (sIdentifier == "MS_BC") trackCategoryID = 22;
808 else if (sIdentifier == "MS_BA") trackCategoryID = 23;
809 else if (sIdentifier == "MS_EA") trackCategoryID = 24;
810 // --------------------
811 else if (sIdentifier == "ID_EC") trackCategoryID = 26;
812 else if (sIdentifier == "ID_BC") trackCategoryID = 27;
813 else if (sIdentifier == "ID_BA") trackCategoryID = 28;
814 else if (sIdentifier == "ID_EA") trackCategoryID = 29;
815
816 return trackCategoryID;
817}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
#define ATH_UNLIKELY(x)
double charge(const T &p)
Definition AtlasPID.h:997
static const Attributes_t empty
const ToolHandle< GenericMonitoringTool > & getGroup(const std::string &name) const
Get a specific monitoring tool from the tool handle array.
virtual StatusCode initialize() override
initialize
const ToolHandle< Trig::TrigDecisionTool > & getTrigDecisionTool() const
Get the trigger decision tool member.
AthMonitorAlgorithm(const std::string &name, ISvcLocator *pSvcLocator)
Constructor.
Declare a monitored scalar variable.
Gaudi::Property< float > m_JpsiSelection_Z0Cut
Gaudi::Property< float > m_ZBosonSelection_minPt
Gaudi::Property< float > m_ZBosonSelection_maxEta
StatusCode plotResonanceCandidates(const std::string &resonanceName, std::vector< const xAOD::Muon * > &muonCandidates, const xAOD::Vertex *pvtx, const xAOD::EventInfo &evt) const
Function to create performance plots for all combined muons that lead to a Jpsi Meson Candidate event...
virtual StatusCode fillHistograms(const EventContext &ctx) const override
adds event to the monitoring histograms
StatusCode FillTrackInformation(const std::string &sIdentifier, const xAOD::Muon *muon, const xAOD::Vertex *pvtx, const std::string &sTrack, const xAOD::EventInfo &evt) const
Function to fill low level Track information.
Gaudi::Property< float > m_ZBosonSelection_maxMass
StatusCode analyseResonanceCandidates(const xAOD::MuonContainer &Muons, const xAOD::Vertex *pvtx, const xAOD::EventInfo &evt) const
Function to create performance plots for all combined muons that lead to a Z Boson Candidate event.
Gaudi::Property< float > m_ZBosonSelection_trkIsolation
StatusCode FillMuonInformation(const std::string &sIdentifier, std::vector< const xAOD::Muon * > &vecMuons, const xAOD::Vertex *pvtx, const xAOD::EventInfo &evt) const
Fills data-quality information (e.g.
SG::ReadDecorHandleKeyArray< xAOD::EventInfo > m_beamSpotKey
Gaudi::Property< float > m_JpsiSelection_D0Cut
Gaudi::Property< float > m_JpsiSelection_minMass
virtual StatusCode initialize() override
initialize
const xAOD::Vertex * getPrimaryVertex(const xAOD::VertexContainer &Vertices) const
Function to get the primary vertex.
StatusCode analyseLowLevelMuonFeatures(const std::string &sIdentifier, std::vector< const xAOD::Muon * > &Muons, const xAOD::EventInfo &evt) const
Function to create performance plots for muon standalone tracks with some detailed informatiom.
Gaudi::Property< float > m_ZBosonSelection_minMass
Gaudi::Property< std::vector< std::string > > m_hltchainList
MuonTrackMonitorAlgorithm(const std::string &name, ISvcLocator *pSvcLocator)
Gaudi::Property< float > m_ZBosonSelection_Z0Cut
SG::ReadDecorHandleKey< xAOD::MuonContainer > m_MuonIsoDecorKey
SG::ReadHandleKey< xAOD::EventInfo > m_derEventInfoKey
Gaudi::Property< float > m_JpsiSelection_maxMass
Gaudi::Property< float > m_JpsiSelection_maxEta
Gaudi::Property< float > m_ZBosonSelection_D0Cut
StatusCode analyseCombinedTracks(const xAOD::MuonContainer &Muons, const xAOD::Vertex *pvtx, const xAOD::EventInfo &evt) const
Function to create performance plots for all combined muons.
Gaudi::Property< float > m_JpsiSelection_trkIsolation
SG::ReadHandleKey< xAOD::VertexContainer > m_VertexContainerKey
Gaudi::Property< bool > m_useBeamSpot
SG::ReadHandleKey< xAOD::MuonContainer > m_MuonContainerKey
Gaudi::Property< float > m_CBmuons_minPt
Gaudi::Property< float > m_JpsiSelection_minPt
int getTrackCategoryID(const std::string &sIdentifier) const
Function to get the track category ID for the given identifier.
virtual bool isValid() override final
Can the handle be successfully dereferenced?
float px() const
float y() const
Returns the x position.
float pz() const
Returns the pz.
float py() const
Returns the py.
::Muon::MuonStationIndex::ChIndex chamberIndex() const
Returns the chamber index.
float z() const
Returns the y position.
float z0() const
Returns the parameter.
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 .).
float vz() const
The z origin for the parameters.
float d0() const
Returns the parameter.
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.
float chiSquared() const
Returns the of the overall track fit.
virtual double eta() const override final
The pseudorapidity ( ) of the particle.
float z() const
Returns the z position.
Eigen::Matrix< double, 3, 1 > Vector3D
constexpr float MeVtoGeV
Generic monitoring tool for athena components.
constexpr int toInt(const EnumType enumVal)
Definition Muons.py:1
double d0significance(const xAOD::TrackParticle *tp, double d0_uncert_beam_spot_2)
@ PriVtx
Primary vertex.
EventInfo_v1 EventInfo
Definition of the latest event info version.
TrackParticle_v1 TrackParticle
Reference the current persistent version:
VertexContainer_v1 VertexContainer
Definition of the current "Vertex container version".
Vertex_v1 Vertex
Define the latest version of the vertex class.
Muon_v1 Muon
Reference the current persistent version:
MuonContainer_v1 MuonContainer
Definition of the current "Muon container version".
MuonSegment_v1 MuonSegment
Reference the current persistent version:
@ numberOfTRTHits
number of TRT hits [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].
@ phiLayer3Hits
number of phi hits in the third trigger layer (BOL1 ot T2)
@ phiLayer2Hits
number of phi hits in the second trigger layer (BML2 ot T1)
@ etaLayer3Hits
number of eta hits in the third trigger layer (BOL1 ot T2)
@ etaLayer1Hits
number of eta hits in the first trigger layer (BML1 ot T4)
@ phiLayer1Hits
number of phi hits in the first trigger layer (BML1 ot T4)
@ phiLayer4Hits
number of phi hits in the fourth trigger layer (T3)
@ etaLayer4Hits
number of eta hits in the fourth trigger layer (T3)
@ etaLayer2Hits
number of eta hits in the second trigger layer (BML2 ot T1)
void fill(H5::Group &out_file, size_t iterations)