ATLAS Offline Software
Loading...
Searching...
No Matches
MuonPhysValMonitoringTool.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
3*/
4
5// MuonPhysValMonitoringTool.cxx
6// Implementation file for class MuonPhysValMonitoringTool
7// Author: S.Binet<binet@cern.ch>
9
10// PhysVal includes
12
14
16
17
18#include "xAODTrigger/MuonRoI.h"
20
24
25#include "TString.h"
27#include <cmath>
28#include <limits>
29#include <format>
30
31namespace{
34 using MuonSegmentLink = ElementLink<xAOD::MuonSegmentContainer>;
36
37 constexpr int comm_bit = (1<<xAOD::Muon::Commissioning);
38}
39using namespace xAOD::P4Helpers;
40
42
44 // Public methods:
46 template <class ContType> StatusCode MuonPhysValMonitoringTool::retrieveContainer(const EventContext& ctx,
48 const ContType* & container) const{
49 container = nullptr;
50 if (key.empty()) {
51 ATH_MSG_DEBUG("No key of type "<<typeid(ContType).name()<<" has been parsed");
52 return StatusCode::SUCCESS;
53 }
54 SG::ReadHandle readHandle{key,ctx};
55 if (!readHandle.isPresent()) {
56 ATH_MSG_ERROR("Failed to retrieve "<<key.fullKey()<<". Please check.");
57 return StatusCode::FAILURE;
58 }
59 container = readHandle.cptr();
60 return StatusCode::SUCCESS;
61 }
62
63 // Athena algtool's Hooks
66 ATH_MSG_INFO("Initializing " << name() << "...");
68
69 for (unsigned int i = 0; i < m_selectHLTMuonItems.size(); i++) {
70 if (m_selectHLTMuonItems[i][0] == "" || m_selectHLTMuonItems[i][1] == "") continue;
71 m_muonItems.emplace_back(m_selectHLTMuonItems[i][0]);
72 m_L1Seed.emplace_back(m_selectHLTMuonItems[i][1]);
73 }
74
75 // setup flags
76 if (m_doTrigMuonValidation == false) {
80 }
81 ATH_CHECK(m_trigDec.retrieve(DisableTool{!m_doTrigMuonValidation}));
82
83 ATH_CHECK(m_eventInfo.initialize());
85 ATH_CHECK(m_trackSelector.retrieve());
86 ATH_CHECK(m_isoTool.retrieve());
87
88 ATH_CHECK(m_tracksName.initialize());
89 ATH_CHECK(m_fwdtracksName.initialize(!m_fwdtracksName.empty()));
90 ATH_CHECK(m_muonsName.initialize());
91 ATH_CHECK(m_slowMuonsName.initialize(!m_slowMuonsName.empty()));
92
93 ATH_CHECK(m_muonTracksName.initialize());
96
97 ATH_CHECK(m_muonSegmentsName.initialize());
104
105 if (!m_isData) {
106 const std::vector<std::string> truthDecors{"truthOrigin", "truthType", "truthParticleLink"};
107 const std::vector<std::string> keys{m_tracksName.key(), m_fwdtracksName.key(), m_muonsName.key(),
110 for (const std::string& key : keys) {
111 if (key.empty()) continue;
112 for (const std::string& decor : truthDecors){
113 m_decorDep.emplace_back(std::format("{:}.{:}", key , decor));
114 }
115 }
116 const std::vector<std::string> truthPartDecors{"MuonEntryLayer_px", "nprecLayers",
117 "truthOrigin", "truthType"};
118
119 for (const std::string& decor: truthPartDecors) {
120 m_decorDep.emplace_back(m_muonsTruthName, decor);
121 }
122
123
124
125 }
126
127 ATH_CHECK(m_decorDep.initialize());
128 return StatusCode::SUCCESS;
129 }
130
131
132
134 ATH_MSG_INFO("Booking hists " << name() << "...");
135
136 if (m_selectMuonWPs.size() == 1 && m_selectMuonWPs[0] < 0) m_selectMuonWPs.clear();
137
138 if (m_selectMuonAuthors.size() == 1 && m_selectMuonAuthors[0] == 0) m_selectMuonAuthors.clear();
139
140 static const std::map<int,std::string> theMuonCategories = {
141 {ALL, "All"},
142 {PROMPT, "Prompt"},
143 {INFLIGHT, "InFlight"},
144 {NONISO, "NonIsolated"},
145 {REST, "Rest"}
146 };
147
148 for (const auto& category : m_selectMuonCategories) m_selectMuonCategoriesStr.emplace_back(theMuonCategories.at(category));
149
150 // no such muons in case of SlowMuon reco
151 bool separateSAFMuons = m_slowMuonsName.empty();
152
153 std::string muonContainerName = m_muonsName.key();
154 for (const auto& category : m_selectMuonCategoriesStr) {
155 std::string categoryPath = muonContainerName + "/" + category + "/";
156
157 m_muonValidationPlots.emplace_back(std::make_unique<MuonValidationPlots>(
158 nullptr, categoryPath, m_selectMuonWPs, m_selectMuonAuthors, m_isData,
159 (category == theMuonCategories.at(ALL) ? false : m_doBinnedResolutionPlots.value()), separateSAFMuons, false));
160
161 if (!m_slowMuonsName.empty()) m_slowMuonValidationPlots.emplace_back(std::make_unique<SlowMuonValidationPlots>(nullptr, categoryPath, m_isData));
163 if (category == "All") {
164 m_TriggerMuonValidationPlots.emplace_back(std::make_unique<TriggerMuonValidationPlots>(
167 }
168 }
169 if (!m_muonTracksName.empty()) {
170 m_muonMSTrackValidationPlots.emplace_back(std::make_unique<MuonTrackValidationPlots>(nullptr, categoryPath, "MSTrackParticles", m_isData));
171 if (!m_isData)
172 m_oUnmatchedRecoMuonTrackPlots = std::make_unique<Muon::RecoMuonTrackPlotOrganizer>(nullptr, muonContainerName + "/UnmatchedRecoMuonTracks/");
173 }
174 if (!m_muonExtrapolatedTracksName.empty())
175 m_muonMETrackValidationPlots.emplace_back(std::make_unique<MuonTrackValidationPlots>(nullptr, categoryPath, "METrackParticles", m_isData));
178 std::make_unique<MuonTrackValidationPlots>(nullptr, categoryPath, "MSOnlyMETrackParticles", m_isData));
179
180 if (!m_tracksName.empty()) {
181 m_muonIDTrackValidationPlots.emplace_back(std::make_unique<MuonTrackValidationPlots>(nullptr, categoryPath, "IDTrackParticles", m_isData));
183 std::make_unique<MuonTrackValidationPlots>(nullptr, categoryPath, "IDSelectedTrackParticles", m_isData));
184 }
185 if (!m_fwdtracksName.empty())
187 std::make_unique<MuonTrackValidationPlots>(nullptr, categoryPath, "IDForwardTrackParticles", m_isData));
188
189 if (!m_muonSegmentsName.empty()) {
190 if (category != theMuonCategories.at(ALL)) continue; // cannot identify the truth origin of segments...
191 m_muonSegmentValidationPlots.emplace_back(std::make_unique<MuonSegmentValidationPlots>(nullptr, categoryPath, m_isData));
192 if (!m_isData)
194 new Muon::MuonSegmentPlots(nullptr, Form("%s/UnmatchedRecoMuonSegments/", muonContainerName.c_str())));
195 }
196 }
197
198 if (!m_isData) {
199 m_oUnmatchedRecoMuonPlots = std::make_unique<Muon::RecoMuonPlotOrganizer>(nullptr, muonContainerName +"/UnmatchedRecoMuons/");
200 m_oUnmatchedTruthMuonPlots = std::make_unique<Muon::TruthMuonPlotOrganizer>(nullptr, muonContainerName +"/UnmatchedTruthMuons/");
201 }
202
203 for (const auto& plots : m_muonValidationPlots) bookValidationPlots(*plots).ignore();
204 for (const auto& plots : m_slowMuonValidationPlots) bookValidationPlots(*plots).ignore();
205 for (const auto& plots : m_TriggerMuonValidationPlots) bookValidationPlots(*plots).ignore();
206 for (const auto& plots : m_muonIDTrackValidationPlots) bookValidationPlots(*plots).ignore();
207 for (const auto& plots : m_muonIDSelectedTrackValidationPlots) bookValidationPlots(*plots).ignore();
208 for (const auto& plots : m_muonIDForwardTrackValidationPlots) bookValidationPlots(*plots).ignore();
209 for (const auto& plots : m_muonMSTrackValidationPlots) bookValidationPlots(*plots).ignore();
210 for (const auto& plots : m_muonMETrackValidationPlots) bookValidationPlots(*plots).ignore();
211 for (const auto& plots : m_muonMSOnlyMETrackValidationPlots) bookValidationPlots(*plots).ignore();
212 if (!m_isData) {
213 bookValidationPlots(*m_oUnmatchedRecoMuonPlots).ignore();
214 bookValidationPlots(*m_oUnmatchedTruthMuonPlots).ignore();
215 if (m_oUnmatchedRecoMuonTrackPlots) bookValidationPlots(*m_oUnmatchedRecoMuonTrackPlots).ignore();
216 for (const auto& plots : m_muonSegmentValidationPlots) bookValidationPlots(*plots).ignore();
217 if (m_oUnmatchedRecoMuonSegmentPlots) bookValidationPlots(*m_oUnmatchedRecoMuonSegmentPlots).ignore();
218 }
219 // book overview hists
220 m_h_overview_Z_mass = new TH1F(Form("%s_Overview_Z_mass", muonContainerName.c_str()), "", 20, 76, 106);
221 ATH_CHECK(regHist(m_h_overview_Z_mass, Form("%s/Overview", muonContainerName.c_str()), all));
222 m_h_overview_Z_mass_ME = new TH1F(Form("%s_Overview_Z_mass_ME", muonContainerName.c_str()), "", 20, 76, 106);
223 ATH_CHECK(regHist(m_h_overview_Z_mass_ME, Form("%s/Overview", muonContainerName.c_str()), all));
224 m_h_overview_Z_mass_ID = new TH1F(Form("%s_Overview_Z_mass_ID", muonContainerName.c_str()), "", 20, 76, 106);
225 ATH_CHECK(regHist(m_h_overview_Z_mass_ID, Form("%s/Overview", muonContainerName.c_str()), all));
226
227 m_h_overview_nObjects.clear();
228 m_h_overview_nObjects.emplace_back(new TH1F(Form("%s_Overview_N_perevent_truth_muons", muonContainerName.c_str()),
229 "Number of truth Muons per event", 20, -0.5, 19.5));
230 m_h_overview_nObjects.emplace_back(
231 new TH1F(Form("%s_Overview_N_perevent_muons", muonContainerName.c_str()), "Number of Muons per event", 20, -0.5, 19.5));
232 m_h_overview_nObjects.emplace_back(
233 new TH1F(Form("%s_Overview_N_perevent_tracks", muonContainerName.c_str()), "Number of Tracks per event", 50, -0.5, 49.5));
234 m_h_overview_nObjects.emplace_back(new TH1F(Form("%s_Overview_N_perevent_truth_segments", muonContainerName.c_str()),
235 "Number of truth Segments per event", 200, -0.5, 199.5));
236 m_h_overview_nObjects.emplace_back(
237 new TH1F(Form("%s_Overview_N_perevent_segments", muonContainerName.c_str()), "Number of Segments per event", 200, -0.5, 199.5));
238 for (const auto& hist : m_h_overview_nObjects) {
239 if (hist) ATH_CHECK(regHist(hist, Form("%s/Overview", muonContainerName.c_str()), all));
240 }
241
243 new TH1F(Form("%s_Overview_reco_category", muonContainerName.c_str()), "", 4, 0, 4); // prompt/in-flight/non-isolated/other
244 for (int i = 1; i < 4; i++) { // skip 'All'
245 m_h_overview_reco_category->GetXaxis()->SetBinLabel(i, theMuonCategories.at(i).c_str());
246 }
247 m_h_overview_reco_category->GetXaxis()->SetBinLabel(4, "Other"); // of some other origin or fakes
248 ATH_CHECK(regHist(m_h_overview_reco_category, Form("%s/Overview", muonContainerName.c_str()), all));
249
250 int nAuth = xAOD::Muon::NumberOfMuonAuthors;
251 for (int i = 1; i < 4; i++) {
252 m_h_overview_reco_authors.emplace_back(new TH1F((muonContainerName + "_" + theMuonCategories.at(i) + "_reco_authors").c_str(),
253 (muonContainerName + "_" + theMuonCategories.at(i) + "_reco_authors").c_str(),
254 nAuth + 1, -0.5, nAuth + 0.5));
255 }
256 m_h_overview_reco_authors.emplace_back(new TH1F((muonContainerName + "_Overview_Other_reco_authors").c_str(),
257 (muonContainerName + "_Other_reco_authors").c_str(), nAuth + 1, -0.5, nAuth + 0.5));
258
259 for (const auto& hist : m_h_overview_reco_authors) {
260 if (hist) ATH_CHECK(regHist(hist, Form("%s/Overview", muonContainerName.c_str()), all));
261 }
262
263 return StatusCode::SUCCESS;
264 }//bookHistograms*/
265
267 valPlots.initialize();
268 std::vector<HistData> hists = valPlots.retrieveBookedHistograms();
269
270 for (auto& hist : hists) {
271 TString sHistName = hist.first->GetName();
272 ATH_MSG_VERBOSE("Initializing " << hist.first << " " << sHistName << " " << hist.second << "...");
273
274 // check for histograms that are useless and skip regHist:
275 if (sHistName.Contains("momentumPulls")) {
276 if (sHistName.Contains(Muon::EnumDefs::toString(xAOD::Muon::MuidSA))) continue; // empty for standalone muons
277 if (!(sHistName.Contains("Prompt") && (sHistName.Contains("AllMuons") || sHistName.Contains("SiAssocForward"))))
278 continue; // don't need binned eloss plots for separate muon types, keep only for Prompt AllMuons
279 }
280 if ((sHistName.Contains("resolution") || sHistName.Contains("pulls")) && !sHistName.Contains("Prompt"))
281 continue; // don't need resolution plots except for prompt muons
282 if (sHistName.Contains("trigger") && sHistName.Contains("wrt") && sHistName.Contains("Features")) continue;
283 modifyHistogram(hist.first);
284 ATH_CHECK(regHist(hist.first, hist.second, all));
285 }
286
287 // register trees
288 std::vector<TreeData> trees = valPlots.retrieveBookedTrees();
289 for (auto& tree : trees) {
290 std::string sTreeName = tree.first->GetName();
291 ATH_MSG_VERBOSE("Initializing " << tree.first << " " << sTreeName << " " << tree.second << "...");
292 ATH_CHECK(regTree(tree.first, tree.second, all));
293 }
294
295 return StatusCode::SUCCESS;
296 }
297
298 StatusCode MuonPhysValMonitoringTool::fillHistograms(const EventContext& ctx) {
299 ATH_MSG_DEBUG("Filling hists " << name() << "...");
300 m_vMatchedTruthMuons.clear();
301 m_vMatchedMuons.clear();
302 m_vMatchedSlowMuons.clear();
303 m_vMatchedMuonTracks.clear();
305 m_vZmumuIDTracks.clear();
306 m_vZmumuMETracks.clear();
307 m_vZmumuMuons.clear();
308 m_vEFMuons.clear();
309 m_vEFMuonsSelected.clear();
310 m_vL2SAMuons.clear();
311 m_vL2SAMuonsSelected.clear();
312 m_vL2CBMuons.clear();
313 m_vL2CBMuonsSelected.clear();
314 m_vRecoMuons.clear();
315 m_vRecoMuons_EffDen.clear();
318
319 const xAOD::EventInfo* eventInfo{nullptr};
320 ATH_CHECK(retrieveContainer(ctx, m_eventInfo, eventInfo));
321
322 float beamSpotWeight = eventInfo->beamSpotWeight();
323
324 const xAOD::TruthParticleContainer* TruthMuons{nullptr};
326
327 if (!m_isData) {
328 m_h_overview_nObjects[0]->Fill(TruthMuons->size(), beamSpotWeight);
329 }
330
331 const xAOD::MuonContainer* Muons = nullptr;
332 const xAOD::SlowMuonContainer* SlowMuons{nullptr};
335 if (SlowMuons) {
336 ATH_MSG_DEBUG("Retrieved slow muons " << SlowMuons->size());
337 m_h_overview_nObjects[1]->Fill(SlowMuons->size(), beamSpotWeight);
338 }
339 if (Muons) {
340 ATH_MSG_DEBUG("Retrieved muons " << Muons->size());
341 m_h_overview_nObjects[1]->Fill(Muons->size(), beamSpotWeight);
342 }
343
345 // @@@ Temp hack to get the MuonSpectrometerTrackParticle (@MS Entry, not extrapolated), needed for eloss plots
346 // Remove when the link to the real MuonSpectrometerTrackParticle appears in the xAOD muon
349
350 // Do resonance selection
351 std::vector<std::pair<const xAOD::Muon*, const xAOD::Muon*> > pairs;
352 if (Muons) {
353 // Use iterator loop to avoid double counting
354 for (xAOD::MuonContainer::const_iterator mu1_itr = Muons->begin(); mu1_itr != Muons->end(); ++mu1_itr) {
355 const xAOD::Muon* mu1 = (*mu1_itr);
356 if (!m_selectComissioning && mu1->allAuthors() & comm_bit) continue;
357 for (xAOD::MuonContainer::const_iterator mu2_itr = Muons->begin(); mu2_itr != mu1_itr; ++mu2_itr) {
358 const xAOD::Muon* mu2 = (*mu2_itr);
359 if (!m_selectComissioning && mu2->allAuthors() & comm_bit) continue;
360 if (mu1->charge() * mu2->charge() >= 0) continue;
361 pairs.emplace_back(std::make_pair(mu1, mu2));
362 }
363 }
364 }
365
366 float dMmin {1e10}, mZ{0.};
367 for (std::pair<const xAOD::Muon*, const xAOD::Muon*>& x : pairs) {
368 // select best Z
369 const TLorentzVector mu1{x.first->p4()}, mu2{x.second->p4()};
370 const float M = (mu1 + mu2).M();
371 if (M < 66000. || M > 116000.) continue;
372
373 // choose the Z candidate closest to the Z pole - if multiple exist
374 float dM = std::abs(M - 91187.);
375 if (dM > dMmin) continue;
376 dMmin = dM;
377 mZ = M;
378
379 m_vZmumuMuons.clear();
380 m_vZmumuMuons.emplace_back(x.first);
381 m_vZmumuMuons.emplace_back(x.second);
382 }
383
384 if (m_vZmumuMuons.size() == 2) {
385 m_h_overview_Z_mass->Fill(mZ / 1000., beamSpotWeight);
386
387 const xAOD::TrackParticle* metr1 = m_vZmumuMuons[0]->trackParticle(xAOD::Muon::ExtrapolatedMuonSpectrometerTrackParticle);
388 const xAOD::TrackParticle* metr2 = m_vZmumuMuons[1]->trackParticle(xAOD::Muon::ExtrapolatedMuonSpectrometerTrackParticle);
389 if (metr1 && metr2) {
390 const TLorentzVector mu1ME{metr1->p4()}, mu2ME{metr2->p4()};
391 m_h_overview_Z_mass_ME->Fill((mu1ME + mu2ME).M() / 1000., beamSpotWeight);
392 if (m_isData) {
393 m_vZmumuMETracks.clear();
394 m_vZmumuMETracks.emplace_back(metr1);
395 m_vZmumuMETracks.emplace_back(metr2);
396 }
397 }
398
399 const xAOD::TrackParticle* tr1 = m_vZmumuMuons[0]->trackParticle(xAOD::Muon::InnerDetectorTrackParticle);
400 const xAOD::TrackParticle* tr2 = m_vZmumuMuons[1]->trackParticle(xAOD::Muon::InnerDetectorTrackParticle);
401 if (tr1 && tr2) {
402 const TLorentzVector mu1ID{tr1->p4()}, mu2ID{tr2->p4()};
403 m_h_overview_Z_mass_ID->Fill((mu1ID + mu2ID).M() / 1000., beamSpotWeight);
404 if (m_isData) {
405 m_vZmumuIDTracks.clear();
406 m_vZmumuIDTracks.emplace_back(tr1);
407 m_vZmumuIDTracks.emplace_back(tr2);
408 }
409 }
410 }
411
412 if (!m_isData) {
413 for (const auto truthMu : *TruthMuons) handleTruthMuon(truthMu, beamSpotWeight);
414 }
415
416 if (SlowMuons) {
417 for (const auto smu : *SlowMuons) {
418 if (!smu) continue;
419 const MuonLink link = smu->muonLink();
420 if (!link.isValid()) continue;
421 handleMuon(*link, smu, beamSpotWeight);
422 }
423 }
424 if (Muons) {
425 for (const xAOD::Muon* mu : *Muons) {
426 handleMuon(mu, nullptr, beamSpotWeight);
427 }
428 }
429
430 const xAOD::TrackParticleContainer* IDTracks{nullptr};
432 if (IDTracks) {
433 ATH_MSG_DEBUG("handling " << IDTracks->size() << " " << m_tracksName);
434 for (const auto tp : *IDTracks) handleMuonTrack(tp, xAOD::Muon::InnerDetectorTrackParticle, beamSpotWeight);
435 }
436 const xAOD::TrackParticleContainer* FwdIDTracks{nullptr};
438 if (FwdIDTracks) {
439 ATH_MSG_DEBUG("handling " << FwdIDTracks->size() << " " << m_fwdtracksName);
440 for (const auto tp : *FwdIDTracks) handleMuonTrack(tp, xAOD::Muon::InnerDetectorTrackParticle, beamSpotWeight);
441 }
442 const xAOD::TrackParticleContainer* MuonTracks{nullptr};
444 if (MuonTracks) {
445 ATH_MSG_DEBUG("handling " << MuonTracks->size() << " " << m_muonTracksName);
446 m_h_overview_nObjects[2]->Fill(MuonTracks->size(), beamSpotWeight);
447 for (const auto tp : *MuonTracks) handleMuonTrack(tp, xAOD::Muon::MuonSpectrometerTrackParticle, beamSpotWeight);
448 }
449 const xAOD::TrackParticleContainer* MuonExtrapolatedTracks{nullptr};
450 ATH_CHECK(retrieveContainer(ctx, m_muonExtrapolatedTracksName, MuonExtrapolatedTracks));
451 if (MuonExtrapolatedTracks) {
452 ATH_MSG_DEBUG("handling " << MuonExtrapolatedTracks->size() << " " << m_muonExtrapolatedTracksName);
453 for (const auto tp : *MuonExtrapolatedTracks)
454 handleMuonTrack(tp, xAOD::Muon::ExtrapolatedMuonSpectrometerTrackParticle, beamSpotWeight);
455 }
456 const xAOD::TrackParticleContainer* MSOnlyMuonExtrapolatedTracks{nullptr};
457 ATH_CHECK(retrieveContainer(ctx, m_muonMSOnlyExtrapolatedTracksName, MSOnlyMuonExtrapolatedTracks));
458
459 if (MSOnlyMuonExtrapolatedTracks) {
460 ATH_MSG_DEBUG("handling " << MSOnlyMuonExtrapolatedTracks->size() << " " << m_muonMSOnlyExtrapolatedTracksName);
461 for (const auto tp : *MSOnlyMuonExtrapolatedTracks)
462 handleMuonTrack(tp, xAOD::Muon::MSOnlyExtrapolatedMuonSpectrometerTrackParticle, beamSpotWeight);
463 }
464
465 const xAOD::MuonSegmentContainer* TruthMuonSegments{nullptr};
466 ATH_CHECK(retrieveContainer(ctx, m_muonSegmentsTruthName, TruthMuonSegments));
467 if (TruthMuonSegments) {
468 m_h_overview_nObjects[3]->Fill(TruthMuonSegments->size(), beamSpotWeight);
469 ATH_MSG_DEBUG("handling " << TruthMuonSegments->size() << " " << m_muonSegmentsTruthName);
470 for (const auto truthMuSeg : *TruthMuonSegments) handleTruthMuonSegment(truthMuSeg, TruthMuons, beamSpotWeight);
471 }
472
473 const xAOD::MuonSegmentContainer* MuonSegments{nullptr};
475 if (MuonSegments) {
476 m_h_overview_nObjects[4]->Fill(MuonSegments->size(), beamSpotWeight);
477 ATH_MSG_DEBUG("handling " << MuonSegments->size() << " " << m_muonSegmentsName);
478 for (const auto muSeg : *MuonSegments) handleMuonSegment(muSeg, beamSpotWeight);
479 }
480
481 //@@@@@@@@@@@@@@@@ TRIGGER MONITORING IMPLEMENTATION @@@@@@@@@@@@@@@@@
483 auto chainGroups = m_trigDec->getChainGroup("HLT_.*mu.*");
484 for (auto& trig : chainGroups->getListOfTriggers()) {
485 if (m_trigDec->isPassed(trig, TrigDefs::EF_passedRaw)) {
486 ATH_MSG_DEBUG("Chain " << trig << " is passed: YES");
487 } else
488 ATH_MSG_DEBUG("Chain " << trig << " is passed: NO");
489 }
490 auto L1chainGroups = m_trigDec->getChainGroup("L1_MU.*");
491 for (auto& L1trig : L1chainGroups->getListOfTriggers()) {
492 if (m_trigDec->isPassed(L1trig, TrigDefs::EF_passedRaw))
493 ATH_MSG_DEBUG("Chain " << L1trig << " is passed: YES");
494 else
495 ATH_MSG_DEBUG("Chain " << L1trig << " is passed: NO");
496 }
497 for (auto mu : m_vRecoMuons) {
498 if (passesAcceptanceCuts(mu) && std::abs(mu->eta()) < 2.4) {
499 if (mu->author() == 1) {
500 m_vRecoMuons_EffDen_CB.emplace_back(mu);
501 ATH_MSG_DEBUG("##### m_vRecoMuons_EffDen_CB pt:" << mu->pt() << " phi:" << mu->phi() << " eta:" << mu->eta());
502 } else if (mu->author() == 5) {
503 m_vRecoMuons_EffDen_MS.emplace_back(mu);
504 ATH_MSG_DEBUG("##### m_vRecoMuons_EffDen_MS pt:" << mu->pt() << " phi:" << mu->phi() << " eta:" << mu->eta());
505 }
506 }
507 }
508
509 //@@@@@ L1 @@@@@
511 const xAOD::MuonRoIContainer* L1TrigMuons{nullptr};
512 ATH_CHECK(retrieveContainer(ctx, m_muonL1TrigName, L1TrigMuons));
513 ATH_MSG_DEBUG("Retrieved L1 triggered muons " << L1TrigMuons->size());
514 for (const auto TrigL1mu : *L1TrigMuons) handleMuonL1Trigger(TrigL1mu);
515 }
516
517 //@@@@@ L2 @@@@@
519 //@@@@@ L2SA @@@@@
520 const xAOD::L2StandAloneMuonContainer* L2SAMuons{nullptr};
522 ATH_MSG_DEBUG("Retrieved L2 StandAlone triggered muons " << L2SAMuons->size());
523 if (L2SAMuons->size() != 0) {
524 for (const auto L2SAmu : *L2SAMuons) {
525 ATH_MSG_DEBUG("Muon L2SA Trigger: pt " << L2SAmu->pt() << " phi " << L2SAmu->phi() << " eta " << L2SAmu->eta()
526 << " roiWord " << L2SAmu->roiWord() << " sAddress " << L2SAmu->sAddress());
527 m_vL2SAMuons.emplace_back(L2SAmu);
528 }
529 for (const auto& mu : m_vL2SAMuons) {
530 if (mu->pt() != 0.) {
531 m_vL2SAMuonsSelected.emplace_back(mu);
532 break;
533 }
534 }
535 for (unsigned int i = 0; i < m_vL2SAMuons.size(); i++) {
536 unsigned int cont = 0;
537 for (unsigned int j = 0; j < m_vL2SAMuonsSelected.size(); j++) {
538 if (((m_vL2SAMuons.at(i)->pt()) != 0.) && ((deltaR(m_vL2SAMuonsSelected.at(j), m_vL2SAMuons.at(i))) > 0.1))
539 cont++;
540 if (cont == m_vL2SAMuonsSelected.size()) {
541 m_vL2SAMuonsSelected.emplace_back(m_vL2SAMuons.at(i));
542 break;
543 }
544 }
545 }
546 for (unsigned int i = 0; i < m_vL2SAMuonsSelected.size(); i++) { handleMuonL2Trigger(m_vL2SAMuonsSelected.at(i)); }
548 }
549 for (const auto& muonItem : m_muonItems) {
550 std::vector<Trig::Feature<xAOD::L2StandAloneMuonContainer> > vec_muons;
551 TString muonItem_str = (TString)muonItem;
552 if (muonItem_str.Contains("_OR_")) {
553 muonItem_str.ReplaceAll("_OR_", " ");
554 std::vector<std::string> v_subchains = CxxUtils::tokenize(muonItem_str, ' ');
555 for (int i = 0; i < (int)v_subchains.size(); i++) {
556 Trig::FeatureContainer fc1 = m_trigDec->features(v_subchains.at(i));
557 std::vector<Trig::Feature<xAOD::L2StandAloneMuonContainer> > vec_muons_1 =
559 for (const auto& mufeat : vec_muons_1) { vec_muons.emplace_back(mufeat); }
560 }
561 } else {
562 Trig::FeatureContainer fc = m_trigDec->features(muonItem);
563 vec_muons = fc.get<xAOD::L2StandAloneMuonContainer>();
564 }
565 ATH_MSG_DEBUG("Size of vector Trig::Feature<xAOD::L2StandAloneMuonContainer> for chain " << muonItem << " = "
566 << vec_muons.size());
567 for (const auto& mufeat : vec_muons) {
568 ATH_MSG_DEBUG(muonItem << " vec_muons.size() = " << vec_muons.size()
569 << " mufeat.cptr()->size() = " << mufeat.cptr()->size());
570 for (unsigned int i = 0; i < mufeat.cptr()->size(); i++) {
571 ATH_MSG_DEBUG("#####" << muonItem << " L2SA feature pt: " << (*mufeat.cptr())[i]->pt()
572 << " eta: " << (*mufeat.cptr())[i]->eta() << " phi: " << (*mufeat.cptr())[i]->phi());
573 }
574 }
575 }
576
577 //@@@@@ L2CB @@@@@
578
579 const xAOD::L2CombinedMuonContainer* L2CBMuons{nullptr};
581 ATH_MSG_DEBUG("Retrieved L2 Combined triggered muons " << L2CBMuons->size());
582 if (L2CBMuons->size() != 0) {
583 for (const auto L2CBmu : *L2CBMuons) {
584 ATH_MSG_DEBUG("Muon L2CB Trigger: pt " << L2CBmu->pt() << " phi " << L2CBmu->phi() << " eta " << L2CBmu->eta());
585 m_vL2CBMuons.emplace_back(L2CBmu);
586 }
587 for (unsigned int i = 0; i < m_vL2CBMuons.size(); i++) {
588 if ((m_vL2CBMuons.at(i)->pt()) != 0.) {
589 m_vL2CBMuonsSelected.emplace_back(m_vL2CBMuons.at(i));
590 break;
591 }
592 }
593 for (unsigned int i = 0; i < m_vL2CBMuons.size(); i++) {
594 unsigned int cont = 0;
595 for (unsigned int j = 0; j < m_vL2CBMuonsSelected.size(); j++) {
596 if (((m_vL2CBMuons.at(i)->pt()) != 0.) && ((deltaR(m_vL2CBMuonsSelected.at(j), m_vL2CBMuons.at(i))) > 0.1))
597 cont++;
598 if (cont == m_vL2CBMuonsSelected.size()) {
599 m_vL2CBMuonsSelected.emplace_back(m_vL2CBMuons.at(i));
600 break;
601 }
602 }
603 }
604 for (unsigned int i = 0; i < m_vL2CBMuonsSelected.size(); i++) { handleMuonL2Trigger(m_vL2CBMuonsSelected.at(i)); }
606 }
607 for (const auto& muonItem : m_muonItems) {
608 std::vector<Trig::Feature<xAOD::L2CombinedMuonContainer> > vec_muons;
609 TString muonItem_str = (TString)muonItem;
610 if (muonItem_str.Contains("_OR_")) {
611 muonItem_str.ReplaceAll("_OR_", " ");
612 auto v_subchains = CxxUtils::tokenize(muonItem_str, ' ');
613 for (int i = 0; i < (int)v_subchains.size(); i++) {
614 Trig::FeatureContainer fc1 = m_trigDec->features(v_subchains.at(i));
615 std::vector<Trig::Feature<xAOD::L2CombinedMuonContainer> > vec_muons_1 =
617 for (const auto& mufeat : vec_muons_1) { vec_muons.emplace_back(mufeat); }
618 }
619 } else {
620 Trig::FeatureContainer fc = m_trigDec->features(muonItem);
621 vec_muons = fc.get<xAOD::L2CombinedMuonContainer>();
622 }
623 ATH_MSG_DEBUG("Size of vector Trig::Feature<xAOD::L2CombinedMuonContainer> for chain " << muonItem << " = "
624 << vec_muons.size());
625 for (const auto& mufeat : vec_muons) {
626 ATH_MSG_DEBUG(muonItem << " vec_muons.size() = " << vec_muons.size()
627 << " mufeat.cptr()->size() = " << mufeat.cptr()->size());
628 for (unsigned int i = 0; i < mufeat.cptr()->size(); i++) {
629 ATH_MSG_DEBUG("#####" << muonItem << " L2CB feature pt: " << (*mufeat.cptr())[i]->pt()
630 << " eta: " << (*mufeat.cptr())[i]->eta() << " phi: " << (*mufeat.cptr())[i]->phi());
631 }
632 }
633 }
634 } // close if(m_doTrigMuonL2Validation)
635
636 //@@@@@ EF @@@@@
638 const xAOD::MuonContainer* EFCombTrigMuons{nullptr};
639 const xAOD::MuonRoIContainer* L1TrigMuons{nullptr};
640 ATH_CHECK(retrieveContainer(ctx, m_muonEFCombTrigName, EFCombTrigMuons));
641 ATH_CHECK(retrieveContainer(ctx, m_muonL1TrigName, L1TrigMuons));
642 ATH_MSG_DEBUG("Retrieved EF triggered muons " << EFCombTrigMuons->size());
643 if (EFCombTrigMuons->size() != 0) {
644 for (const auto Trigmu : *EFCombTrigMuons) {
645 ATH_MSG_DEBUG("Muon EF Trigger: pt " << Trigmu->pt() << " phi " << Trigmu->phi() << " eta " << Trigmu->eta()
646 << " author" << Trigmu->author());
647 m_vEFMuons.emplace_back(Trigmu);
648 }
649 m_vEFMuonsSelected.emplace_back(m_vEFMuons.at(0));
650 for (unsigned int i = 0; i < m_vEFMuons.size(); i++) {
651 unsigned int cont = 0;
652 for (unsigned int j = 0; j < m_vEFMuonsSelected.size(); j++) {
653 if (((deltaR(m_vEFMuonsSelected.at(j), m_vEFMuons.at(i))) > 0.1) ||
654 ((m_vEFMuons.at(i)->author() - m_vEFMuonsSelected.at(j)->author()) != 0))
655 cont++;
656 if (cont == m_vEFMuonsSelected.size()) {
657 m_vEFMuonsSelected.emplace_back(m_vEFMuons.at(i));
658 break;
659 }
660 }
661 }
662 for (unsigned int i = 0; i < m_vEFMuonsSelected.size(); i++) { handleMuonTrigger(m_vEFMuonsSelected.at(i)); }
664 }
665 if (!m_isData) {
666 for (const auto truthMu : *TruthMuons) {
667 ATH_MSG_DEBUG("TRUTH:: pt=" << truthMu->pt() << " eta=" << truthMu->eta() << " phi=" << truthMu->phi());
668 }
669 }
670 // handleMuonTrigger_ResoWRTTruth(m_vEFMuonsSelected,)
671 //@@@@@ chains efficiency @@@@@
672 for (const auto& muonItem : m_muonItems) {
675 if ((muonItem.find("msonly") != std::string::npos)) {
678 }
679 std::vector<Trig::Feature<xAOD::MuonContainer> > vec_muons;
680 TString muonItem_str = (TString)muonItem;
681 if (muonItem_str.Contains("_OR_")) {
682 muonItem_str.ReplaceAll("_OR_", " ");
683 auto v_subchains = CxxUtils::tokenize(muonItem_str, ' ');
684 for (int i = 0; i < (int)v_subchains.size(); i++) {
685 Trig::FeatureContainer fc1 = m_trigDec->features(v_subchains.at(i));
686 std::vector<Trig::Feature<xAOD::MuonContainer> > vec_muons_1 = fc1.get<xAOD::MuonContainer>();
687 for (const auto& mufeat : vec_muons_1) { vec_muons.emplace_back(mufeat); }
688 }
689 } else {
690 Trig::FeatureContainer fc = m_trigDec->features(muonItem);
691 vec_muons = fc.get<xAOD::MuonContainer>();
692 }
693 ATH_MSG_DEBUG("Size of vector Trig::Feature<xAOD::MuonContainer> for chain " << muonItem << " = " << vec_muons.size());
694 for (const auto& mufeat : vec_muons) {
695 ATH_MSG_DEBUG(muonItem << " vec_muons.size() = " << vec_muons.size()
696 << " mufeat.cptr()->size() = " << mufeat.cptr()->size());
697 for (unsigned int i = 0; i < mufeat.cptr()->size(); i++) {
698 ATH_MSG_DEBUG("#####" << muonItem << " EF feature pt: " << (*mufeat.cptr())[i]->pt()
699 << " eta: " << (*mufeat.cptr())[i]->eta() << " phi: " << (*mufeat.cptr())[i]->phi()
700 << " author: " << (*mufeat.cptr())[i]->author());
701 for (unsigned int j = 0; j < m_selectMuonCategories.size(); j++) {
702 if (m_selectMuonCategories[j] == ALL) {
703 if (((*mufeat.cptr())[i]->author()) == m_SelectedAuthor)
704 m_TriggerMuonValidationPlots[j]->fillFeatPlots(*(*mufeat.cptr())[i], muonItem);
705 } // if categ=ALL
706 } // categories
707 } // mufeat.cptr
708 } // mufeat
709 for (unsigned int k = 0; k < m_vRecoMuons_EffDen.size(); k++) {
710 bool break_flag = false;
711 for (unsigned int j = 0; j < m_selectMuonCategories.size(); j++) {
712 if (m_selectMuonCategories[j] == ALL) {
713 m_TriggerMuonValidationPlots[j]->fillDenEff(*m_vRecoMuons_EffDen.at(k), muonItem);
714 }
715 }
716 for (const auto& mufeat : vec_muons) {
717 for (unsigned int i = 0; i < mufeat.cptr()->size(); i++) {
718 if ((((*mufeat.cptr())[i]->author()) == m_SelectedAuthor) &&
719 (deltaR((*mufeat.cptr())[i], m_vRecoMuons_EffDen.at(k)) < 0.1)) {
720 break_flag = true;
721 ATH_MSG_DEBUG(" $$$ match Reco_EffDen "
722 << muonItem << " pt: " << m_vRecoMuons_EffDen.at(k)->pt() << " eta: "
723 << m_vRecoMuons_EffDen.at(k)->eta() << " phi: " << m_vRecoMuons_EffDen.at(k)->phi()
724 << " author: " << m_vRecoMuons_EffDen.at(k)->author());
725 ATH_MSG_DEBUG(" $$$ match EF MuidCo feature "
726 << muonItem << " pt: " << (*mufeat.cptr())[i]->pt()
727 << " eta: " << (*mufeat.cptr())[i]->eta() << " phi: " << (*mufeat.cptr())[i]->phi()
728 << " author: " << (*mufeat.cptr())[i]->author() << " rel_p "
729 << (std::abs(((*mufeat.cptr())[i]->pt() - m_vRecoMuons_EffDen.at(k)->pt()) /
730 (m_vRecoMuons_EffDen.at(k)->pt()))));
731 for (unsigned int j = 0; j < m_selectMuonCategories.size(); j++) {
732 if (m_selectMuonCategories[j] == ALL) {
733 m_TriggerMuonValidationPlots[j]->fillNumEff(*m_vRecoMuons_EffDen.at(k), muonItem);
734 // if (muonItem=="HLT_2mu10") m_TriggerMuonValidationPlots[j]->fill(
735 // *(*mufeat.cptr())[i],*m_vRecoMuons_EffDen.at(k));
736
737 } // if categ=ALL
738 } // categories
739 break;
740 } // if(Delta_R)
741 } // mufeat
742 if (break_flag) break;
743 } // vec_muons
744 } // m_vRecoMuons_EffDen
745 } // m_muonItems
746 //@@@@@ L1 items efficiency @@@@@
747 for (const auto& L1MuonItem : m_L1MuonItems) {
750 float threshold = 0.;
751 if (L1MuonItem == "L1_MU4") threshold = 4000;
752 else if (L1MuonItem == "L1_MU6") threshold = 6000;
753 else if (L1MuonItem == "L1_MU10") threshold = 10000;
754 else if (L1MuonItem == "L1_MU11") threshold = 11000;
755 else if (L1MuonItem == "L1_MU15") threshold = 15000;
756 else if (L1MuonItem == "L1_MU20") threshold = 20000;
757 for (const auto TrigL1mu : *L1TrigMuons) {
758 for (unsigned int j = 0; j < m_selectMuonCategories.size(); j++) {
759 if (m_selectMuonCategories[j] == ALL) {
760 if ((TrigL1mu->thrValue()) >= threshold)
761 m_TriggerMuonValidationPlots[j]->fillFeatPlots(*TrigL1mu, L1MuonItem);
762 } // if categ=ALL
763 } // categories
764 } // L1TrigMuons
765 for (unsigned int k = 0; k < m_vRecoMuons_EffDen.size(); k++) {
766 for (unsigned int j = 0; j < m_selectMuonCategories.size(); j++) {
767 if (m_selectMuonCategories[j] == ALL) {
768 m_TriggerMuonValidationPlots[j]->fillDenL1Eff(*m_vRecoMuons_EffDen.at(k), L1MuonItem);
769 }
770 }
771 for (const auto TrigL1mu : *L1TrigMuons) {
772 if (((TrigL1mu->thrValue()) >= threshold) &&
773 (sqrt(pow(m_vRecoMuons_EffDen.at(k)->eta() - TrigL1mu->eta(), 2.) +
774 pow(m_vRecoMuons_EffDen.at(k)->phi() - TrigL1mu->phi(), 2.)) < 0.2)) {
775 ATH_MSG_DEBUG(" $$$ match Reco_EffDen "
776 << L1MuonItem << " pt: " << m_vRecoMuons_EffDen.at(k)->pt() << " eta: "
777 << m_vRecoMuons_EffDen.at(k)->eta() << " phi: " << m_vRecoMuons_EffDen.at(k)->phi()
778 << " author: " << m_vRecoMuons_EffDen.at(k)->author());
779 ATH_MSG_DEBUG(" $$$ L1 feature " << L1MuonItem << " pt: " << TrigL1mu->thrValue()
780 << " eta: " << TrigL1mu->eta() << " phi: " << TrigL1mu->phi());
781 for (unsigned int j = 0; j < m_selectMuonCategories.size(); j++) {
782 if (m_selectMuonCategories[j] == ALL) {
783 m_TriggerMuonValidationPlots[j]->fillNumL1Eff(*m_vRecoMuons_EffDen.at(k), L1MuonItem);
784 } // if categ=ALL
785 } // categories
786 break;
787 } // if(Delta_R)
788 } // L1TrigMuons
789 } // m_vRecoMuons_EffDen
790 }
791 //@@@@@ chains efficiency w.r.t. L1 @@@@@
792 for (unsigned int m = 0; m < m_muonItems.size(); m++) {
793 std::vector<Trig::Feature<xAOD::MuonContainer> > vec_muons;
794 TString muonItem_str = (TString)m_muonItems[m];
795 if (muonItem_str.Contains("_OR_")) {
796 muonItem_str.ReplaceAll("_OR_", " ");
797 auto v_subchains = CxxUtils::tokenize(muonItem_str, ' ');
798 for (int i = 0; i < (int)v_subchains.size(); i++) {
799 Trig::FeatureContainer fc1 = m_trigDec->features(v_subchains.at(i));
800 std::vector<Trig::Feature<xAOD::MuonContainer> > vec_muons_1 = fc1.get<xAOD::MuonContainer>();
801 for (const auto& mufeat : vec_muons_1) { vec_muons.emplace_back(mufeat); }
802 }
803 } else {
805 vec_muons = fc.get<xAOD::MuonContainer>();
806 }
809 if ((m_muonItems[m].find("msonly") != std::string::npos)) {
812 }
813 float threshold = 0.;
814 if (m_L1Seed[m] == "L1_MU4") threshold = 4000;
815 if (m_L1Seed[m] == "L1_MU6") threshold = 6000;
816 if (m_L1Seed[m] == "L1_MU10") threshold = 10000;
817 if (m_L1Seed[m] == "L1_MU11") threshold = 11000;
818 if (m_L1Seed[m] == "L1_MU15") threshold = 15000;
819 if (m_L1Seed[m] == "L1_MU20") threshold = 20000;
820 for (unsigned int k = 0; k < m_vRecoMuons_EffDen.size(); k++) {
821 bool break_flag = false;
822 for (const auto TrigL1mu : *L1TrigMuons) {
823 if (((TrigL1mu->thrValue()) >= threshold) &&
824 (sqrt(pow(m_vRecoMuons_EffDen.at(k)->eta() - TrigL1mu->eta(), 2.) +
825 pow(m_vRecoMuons_EffDen.at(k)->phi() - TrigL1mu->phi(), 2.)) < 0.2)) {
826 for (unsigned int j = 0; j < m_selectMuonCategories.size(); j++) {
827 if (m_selectMuonCategories[j] == ALL) {
829 } // if categ=ALL
830 } // categories
831 for (const auto& mufeat : vec_muons) {
832 for (unsigned int i = 0; i < mufeat.cptr()->size(); i++) {
833 if ((((*mufeat.cptr())[i]->author()) == m_SelectedAuthor) &&
834 (deltaR((*mufeat.cptr())[i], m_vRecoMuons_EffDen.at(k)) < 0.1)) {
835 break_flag = true;
836 for (unsigned int j = 0; j < m_selectMuonCategories.size(); j++) {
837 if (m_selectMuonCategories[j] == ALL) {
838 m_TriggerMuonValidationPlots[j]->fillNumRELEff(*m_vRecoMuons_EffDen.at(k),
839 m_muonItems[m]);
840 } // if categ=ALL
841 } // categories
842 break;
843 } // if(Delta_R)
844 } // mufeat
845 if (break_flag) break;
846 } // vec_muons
847 break;
848 } // if(Delta_R)
849 } // L1TrigMuons
850 } // m_vRecoMuons_EffDen
851 } // m_muonItems.size()
852 } // m_doTrigMuonEFValidation
853 }
854 return StatusCode::SUCCESS;
855 }//fillHistograms()*/
856
858 const xAOD::TruthParticleContainer* /*muonTruthContainer*/, float weight) {
859 const xAOD::MuonSegment* muSeg = findRecoMuonSegment(truthMuSeg);
861
862 unsigned int thisMuonCategory = ALL; // getMuonSegmentTruthCategory(truthMuSeg, muonTruthContainer) @@@ Does not work...
863
864 for (unsigned int i = 0; i < m_selectMuonCategories.size(); i++) {
865 if (m_selectMuonCategories[i] == ALL || m_selectMuonCategories[i] == thisMuonCategory) {
866 m_muonSegmentValidationPlots[i]->fill(truthMuSeg, muSeg,
867 weight); // if no reco muon segment is found a protection inside
868 // MuonSegmentValidationPlots will ensure, its plots won't be filled
869 }
870 }
871 }
872
874 if (!muSeg) {
875 ATH_MSG_WARNING("No muon segment found");
876 return;
877 }
878 if (std::find(std::begin(m_vMatchedMuonSegments), std::end(m_vMatchedMuonSegments), muSeg) != std::end(m_vMatchedMuonSegments))
879 return;
880 if (!m_isData) m_oUnmatchedRecoMuonSegmentPlots->fill(*muSeg, weight);
881 for (unsigned int i = 0; i < m_selectMuonCategories.size(); i++) {
882 if (m_selectMuonCategories[i] == ALL) {
883 m_muonSegmentValidationPlots[i]->fill(muSeg, weight);
884 break;
885 }
886 }
887 }
888
889 void MuonPhysValMonitoringTool::handleMuon(const xAOD::Muon* mu, const xAOD::SlowMuon* smu, float weight) {
890 if (!mu) return;
891 if (!m_selectComissioning && mu->allAuthors() & comm_bit) return;
892
893 if (msgLvl(MSG::DEBUG)) printMuonDebug(mu);
894
895 // make deep copy of muon and decorate with quality
896 std::unique_ptr<xAOD::Muon> mu_c;
897 try {
898 mu_c = getCorrectedMuon(*mu);
899 } catch (const SG::ExcBadAuxVar&) {
900 ATH_MSG_ERROR("Cannot retrieve aux-item - rejecting muon");
901 return;
902 }
903
904 if (m_isData) {
905 MUCATEGORY thisMuonCategory = ALL;
906 // for events with a Zmumu candidate, separate Z muons from the rest:
907 if (m_vZmumuMuons.size() > 0) {
908 thisMuonCategory = REST;
909 if (std::find(m_vZmumuMuons.begin(), m_vZmumuMuons.end(), mu) != m_vZmumuMuons.end()) { thisMuonCategory = PROMPT; }
910 }
911 // fill plots
912 for (unsigned int i = 0; i < m_selectMuonCategories.size(); i++) {
913 if (m_selectMuonCategories[i] == ALL or m_selectMuonCategories[i] == thisMuonCategory) {
914 if (mu_c){
915 // histos
916 m_muonValidationPlots[i]->fill(*mu_c, weight);
917 if (smu) m_slowMuonValidationPlots[i]->fill(*smu, *mu_c, weight);
918 // tree branches
919 m_muonValidationPlots[i]->fillTreeBranches(*mu_c);
920 }
921 }
922 }
923 }
924
926 // SELECT MUON MEDIUM QUALITY FOR TRIGGER VALIDATION
927 xAOD::Muon::Quality my_quality = m_muonSelectionTool->getQuality(*mu_c);
928 if (my_quality <= xAOD::Muon::Medium && m_isoTool->accept(*mu_c)) m_vRecoMuons.emplace_back(mu);
930
931 if (smu) {
932 if (std::find(std::begin(m_vMatchedSlowMuons), std::end(m_vMatchedSlowMuons), smu) != std::end(m_vMatchedSlowMuons)) { return; }
933 } else {
934 if (std::find(std::begin(m_vMatchedMuons), std::end(m_vMatchedMuons), mu) != std::end(m_vMatchedMuons)) { return; }
935 }
936
937 // unmatched reco muons (not matched with any kind of truth particle, fakes)
938 if (!m_isData) m_oUnmatchedRecoMuonPlots->fill(*mu_c, weight);
939
940 m_h_overview_reco_category->Fill("Other", weight);
941 m_h_overview_reco_authors[3]->Fill(mu->author(), weight);
942
943 for (unsigned int i = 0; i < m_selectMuonCategories.size(); i++) {
944 if (m_selectMuonCategories[i] == ALL) {
945 if (mu_c){// histos
946 m_muonValidationPlots[i]->fill(*mu_c);
947 if (smu) m_slowMuonValidationPlots[i]->fill(*smu, *mu_c, weight);
948 // tree branches
949 m_muonValidationPlots[i]->fillTreeBranches(*mu_c);
950 break;
951 }
952 }
953 }
954 }
955
957 const xAOD::SlowMuon* smu = nullptr;
958 const xAOD::Muon* mu = nullptr;
959 if (!m_slowMuonsName.empty()) {
960 smu = findRecoSlowMuon(truthMu);
961 if (smu) {
962 const MuonLink muLink = smu->muonLink();
963 if (muLink.isValid()) mu = *muLink;
964
965 if (!mu) {
966 ATH_MSG_WARNING("Found SlowMuon without valid muon link");
967 smu = nullptr;
968 }
969 }
970 } else {
971 mu = findRecoMuon(truthMu);
972 }
973
974 if (msgLvl(MSG::DEBUG)) printTruthMuonDebug(truthMu, mu);
975 if (!passesAcceptanceCuts(truthMu)) return;
976
977 std::unique_ptr<xAOD::Muon> mu_c;
978 if (mu) {
979 try {
980 mu_c = getCorrectedMuon(*mu);
981 } catch (const SG::ExcBadAuxVar&) {
982 ATH_MSG_ERROR("Cannot retrieve aux-item - rejecting muon");
983 return;
984 }
985 }
986
987 unsigned int thisMuonCategory = getMuonTruthCategory(truthMu);
988 for (unsigned int i = 0; i < m_selectMuonCategories.size(); i++) {
989 if (m_selectMuonCategories[i] == ALL || m_selectMuonCategories[i] == thisMuonCategory) {
990 // histos
991 m_muonValidationPlots[i]->fill(
992 truthMu, mu_c.get(), m_MSTracks,
993 weight); // if no muon is found a protection inside MuonValidationPlots will ensure, its plots won't be filled
994 if (!m_slowMuonsName.empty()) m_slowMuonValidationPlots[i]->fill(truthMu, smu, mu_c.get(), weight);
995 // tree branches
996 m_muonValidationPlots[i]->fillTreeBranches(truthMu, mu_c.get(), m_MSTracks);
997 }
998 }
999 if (mu_c) {
1000 m_h_overview_reco_category->Fill(thisMuonCategory - 1, weight);
1001 m_h_overview_reco_authors[thisMuonCategory - 1]->Fill(mu_c->author(), weight);
1002 } else if (!m_isData)
1003 m_oUnmatchedTruthMuonPlots->fill(*truthMu, weight);
1004 }
1005
1006 void MuonPhysValMonitoringTool::handleMuonTrack(const xAOD::TrackParticle* tp, xAOD::Muon::TrackParticleType type, float weight) {
1007 if (!tp) {
1008 ATH_MSG_WARNING("No track particle found");
1009 return;
1010 }
1011
1012 // if ID track, check that it passes standard combined mu reco selections
1013 bool passesMuonTrackSel = false;
1014 if (type == xAOD::Muon::InnerDetectorTrackParticle) { passesMuonTrackSel = m_trackSelector->decision(*tp); }
1015
1016 if (m_isData) {
1017 if (type == xAOD::Muon::InnerDetectorTrackParticle) {
1018 MUCATEGORY thisTrkCategory = ALL;
1019 // for events with a Zmumu candidate, separate Z muon tracks from the rest:
1020 if (m_vZmumuIDTracks.size() > 0) {
1021 thisTrkCategory = REST;
1022 for (const auto& zmu : m_vZmumuIDTracks) {
1023 if (deltaR(zmu, tp) < 0.01) {
1024 thisTrkCategory = PROMPT;
1025 break;
1026 }
1027 }
1028 }
1029
1030 for (unsigned int i = 0; i < m_selectMuonCategories.size(); i++) {
1031 if (m_selectMuonCategories[i] == ALL || m_selectMuonCategories[i] == thisTrkCategory) {
1032 m_muonIDTrackValidationPlots[i]->fill(*tp, weight);
1033 if (passesMuonTrackSel) m_muonIDSelectedTrackValidationPlots[i]->fill(*tp, weight);
1034 }
1035 }
1036 } else if (type == xAOD::Muon::MuonSpectrometerTrackParticle)
1037 m_muonMSTrackValidationPlots[ALL]->fill(*tp, weight);
1038 else if (type == xAOD::Muon::ExtrapolatedMuonSpectrometerTrackParticle)
1039 m_muonMETrackValidationPlots[ALL]->fill(*tp, weight);
1040 else if (type == xAOD::Muon::MSOnlyExtrapolatedMuonSpectrometerTrackParticle)
1041 m_muonMSOnlyMETrackValidationPlots[ALL]->fill(*tp, weight);
1042
1043 return;
1044 }
1045
1046 static const SG::ConstAccessor<TruthLink> truthParticleLinkAcc("truthParticleLink");
1047 TruthLink truthLink = truthParticleLinkAcc.withDefault(*tp, TruthLink());
1048
1049 if (!truthLink.isValid()) {
1050 ATH_MSG_DEBUG("No truth link available");
1051 if (type == xAOD::Muon::InnerDetectorTrackParticle) return;
1052 if (!passesAcceptanceCuts(tp)) return;
1053
1054 for (unsigned int i = 0; i < m_selectMuonCategories.size(); i++) {
1055 if (m_selectMuonCategories[i] == ALL) {
1056 // ID track plots for any track
1057 // if (type==xAOD::Muon::InnerDetectorTrackParticle) {
1058 // m_muonIDTrackValidationPlots[i]->fill(*tp);
1059 // if (passesMuonTrackSel) m_muonIDSelectedTrackValidationPlots[i]->fill(*tp);
1060 // } else
1061 if (type == xAOD::Muon::MuonSpectrometerTrackParticle) {
1062 if (!m_isData) m_oUnmatchedRecoMuonTrackPlots->fill(*tp, weight);
1063 m_muonMSTrackValidationPlots[i]->fill(*tp, weight);
1064 } else if (type == xAOD::Muon::ExtrapolatedMuonSpectrometerTrackParticle) {
1065 m_muonMETrackValidationPlots[i]->fill(*tp, weight);
1066 } else if (type == xAOD::Muon::MSOnlyExtrapolatedMuonSpectrometerTrackParticle) {
1067 m_muonMSOnlyMETrackValidationPlots[i]->fill(*tp, weight);
1068 }
1069 break;
1070 }
1071 }
1072 } // end if no valid truth link
1073 else { // here: valid truth link and truthType
1074
1075 if (type ==
1076 xAOD::Muon::InnerDetectorTrackParticle) { // don't fill histograms for any ID track, only for muons; buys a lot of time
1077 if ((*truthLink)->absPdgId() != 13 || !MC::isStable(*truthLink)) return; // not a muon
1078 if (HepMC::uniqueID(*truthLink) == HepMC::UNDEFINED_ID || HepMC::is_simulation_particle((*truthLink))) return; // must have valid barcode
1079 }
1080
1081 if (!passesAcceptanceCuts(*truthLink)) return;
1082 unsigned int thisMuonCategory = getMuonTruthCategory(tp);
1083
1084 for (unsigned int i = 0; i < m_selectMuonCategories.size(); i++) {
1085 if (m_selectMuonCategories[i] == ALL || m_selectMuonCategories[i] == thisMuonCategory) {
1086 if (type == xAOD::Muon::InnerDetectorTrackParticle) {
1087 if (!m_fwdtracksName.empty() && std::abs((*truthLink)->eta()) > 2.5)
1088 m_muonIDForwardTrackValidationPlots[i]->fill(*truthLink, tp, weight);
1089 else if (!m_tracksName.empty()) {
1090 m_muonIDTrackValidationPlots[i]->fill(*truthLink, tp, weight);
1091 if (passesMuonTrackSel) m_muonIDSelectedTrackValidationPlots[i]->fill(*truthLink, tp, weight);
1092 }
1093 } else if (type == xAOD::Muon::MuonSpectrometerTrackParticle) {
1094 m_muonMSTrackValidationPlots[i]->fill(*truthLink, tp, weight);
1095 } else if (type == xAOD::Muon::ExtrapolatedMuonSpectrometerTrackParticle) {
1096 m_muonMETrackValidationPlots[i]->fill(*truthLink, tp, weight);
1097 } else if (type == xAOD::Muon::MSOnlyExtrapolatedMuonSpectrometerTrackParticle) {
1098 m_muonMSOnlyMETrackValidationPlots[i]->fill(*truthLink, tp, weight);
1099 }
1100 }
1101 }
1102 }
1103
1104 return;
1105 }
1106
1108 ATH_MSG_DEBUG("MuonRoI L1 Trigger: ptThr " << TrigL1mu->thrValue() << " phi " << TrigL1mu->phi() << " eta " << TrigL1mu->eta());
1109 for (unsigned int i = 0; i < m_selectMuonCategories.size(); i++) {
1110 if (m_selectMuonCategories[i] == ALL) {
1111 m_TriggerMuonValidationPlots[i]->fill(*TrigL1mu);
1112 break;
1113 }
1114 }
1115 }
1116
1118 for (unsigned int i = 0; i < m_selectMuonCategories.size(); i++) {
1119 if (m_selectMuonCategories[i] == ALL) {
1120 m_TriggerMuonValidationPlots[i]->fill(*L2SAMu);
1121 break;
1122 }
1123 }
1124 ATH_MSG_DEBUG(" ==> Geometrical selection of Muon L2SA Trigger : pt " << L2SAMu->pt() << " phi " << L2SAMu->phi() << " eta "
1125 << L2SAMu->eta() << " roiWord " << L2SAMu->roiWord()
1126 << " sAddress " << L2SAMu->sAddress());
1127 }
1128
1130 int k_L2SAMu_MinDeltaR = -1;
1131 float MinDeltaR = 0.;
1132 ATH_MSG_DEBUG(" m_vL2SAMuons.size()" << m_vL2SAMuons.size());
1133 for (unsigned int i = 0; i < m_vRecoMuons.size(); i++) {
1134 ATH_MSG_DEBUG(":: TEST: listing all Recomu pt=" << m_vRecoMuons.at(i)->pt() << " eta=" << m_vRecoMuons.at(i)->eta() << " phi="
1135 << m_vRecoMuons.at(i)->phi() << " auth=" << m_vRecoMuons.at(i)->author());
1136 }
1137 for (unsigned int i = 0; i < m_vRecoMuons.size(); i++) {
1138 if ((m_vRecoMuons.at(i)->author() != 1) || (std::abs(m_vRecoMuons.at(i)->eta()) > 2.4)) continue;
1139 ATH_MSG_DEBUG(":::: TEST: Recomu pt=" << m_vRecoMuons.at(i)->pt() << " eta=" << m_vRecoMuons.at(i)->eta()
1140 << " phi=" << m_vRecoMuons.at(i)->phi() << " auth=" << m_vRecoMuons.at(i)->author());
1141 k_L2SAMu_MinDeltaR = -1;
1142 MinDeltaR = 1000;
1143 ATH_MSG_DEBUG("==============>>>> k_L2SAMu_MinDeltaR=" << k_L2SAMu_MinDeltaR << " MinDeltaR" << MinDeltaR);
1144 for (unsigned int k = 0; k < m_vL2SAMuons.size(); k++) {
1145 ATH_MSG_DEBUG(" :::::::: TEST: L2SA pt=" << m_vL2SAMuons.at(k)->pt() << " eta=" << m_vL2SAMuons.at(k)->eta()
1146 << " phi=" << m_vL2SAMuons.at(k)->phi()
1147 << " DeltaR=" << deltaR(m_vRecoMuons.at(i), m_vL2SAMuons.at(k)));
1148 if ((deltaR(m_vRecoMuons.at(i), m_vL2SAMuons.at(k)) < 0.1 &&
1149 (deltaR(m_vRecoMuons.at(i), m_vL2SAMuons.at(k)) < MinDeltaR))) {
1150 k_L2SAMu_MinDeltaR = k;
1151 MinDeltaR = deltaR(m_vRecoMuons.at(i), m_vL2SAMuons.at(k));
1152 ATH_MSG_DEBUG("==============>>>> taken!!!! k_L2SAMu_MinDeltaR=" << k_L2SAMu_MinDeltaR << " MinDeltaR"
1153 << MinDeltaR);
1154 }
1155 }
1156 if (k_L2SAMu_MinDeltaR == -1) continue;
1157 for (unsigned int c = 0; c < m_selectMuonCategories.size(); c++) {
1158 if (m_selectMuonCategories[c] == ALL) {
1159 m_TriggerMuonValidationPlots[c]->fill(*m_vL2SAMuons.at(k_L2SAMu_MinDeltaR), *m_vRecoMuons.at(i));
1160 }
1161 }
1162 }
1163 }
1164
1166 for (unsigned int i = 0; i < m_selectMuonCategories.size(); i++) {
1167 if (m_selectMuonCategories[i] == ALL) {
1168 m_TriggerMuonValidationPlots[i]->fill(*L2CBMu);
1169 break;
1170 }
1171 }
1172 ATH_MSG_DEBUG(" ==> Geometrical selection of Muon L2CB Trigger : pt " << L2CBMu->pt() << " phi " << L2CBMu->phi() << " eta "
1173 << L2CBMu->eta());
1174 }
1175
1177 int k_L2CBMu_MinDeltaR = -1;
1178 float MinDeltaR = 0.;
1179 ATH_MSG_DEBUG(" m_vL2CBMuons.size()" << m_vL2CBMuons.size());
1180 for (unsigned int i = 0; i < m_vRecoMuons.size(); i++) {
1181 ATH_MSG_DEBUG(":: TEST: listing all Recomu pt=" << m_vRecoMuons.at(i)->pt() << " eta=" << m_vRecoMuons.at(i)->eta() << " phi="
1182 << m_vRecoMuons.at(i)->phi() << " auth=" << m_vRecoMuons.at(i)->author());
1183 }
1184 for (unsigned int i = 0; i < m_vRecoMuons.size(); i++) {
1185 if ((m_vRecoMuons.at(i)->author() != 1) || (std::abs(m_vRecoMuons.at(i)->eta()) > 2.4)) continue;
1186 ATH_MSG_DEBUG(":::: TEST: Recomu pt=" << m_vRecoMuons.at(i)->pt() << " eta=" << m_vRecoMuons.at(i)->eta()
1187 << " phi=" << m_vRecoMuons.at(i)->phi() << " auth=" << m_vRecoMuons.at(i)->author());
1188 k_L2CBMu_MinDeltaR = -1;
1189 MinDeltaR = 1000;
1190 ATH_MSG_DEBUG("==============>>>> k_L2CBMu_MinDeltaR=" << k_L2CBMu_MinDeltaR << " MinDeltaR" << MinDeltaR);
1191 for (unsigned int k = 0; k < m_vL2CBMuons.size(); k++) {
1192 ATH_MSG_DEBUG(" :::::::: TEST: L2CB pt=" << m_vL2CBMuons.at(k)->pt() << " eta=" << m_vL2CBMuons.at(k)->eta()
1193 << " phi=" << m_vL2CBMuons.at(k)->phi()
1194 << " DeltaR=" << deltaR(m_vRecoMuons.at(i), m_vL2CBMuons.at(k)));
1195 if ((deltaR(m_vRecoMuons.at(i), m_vL2CBMuons.at(k)) < 0.1 &&
1196 (deltaR(m_vRecoMuons.at(i), m_vL2CBMuons.at(k)) < MinDeltaR))) {
1197 k_L2CBMu_MinDeltaR = k;
1198 MinDeltaR = deltaR(m_vRecoMuons.at(i), m_vL2CBMuons.at(k));
1199 ATH_MSG_DEBUG("==============>>>> taken!!!! k_L2CBMu_MinDeltaR=" << k_L2CBMu_MinDeltaR << " MinDeltaR"
1200 << MinDeltaR);
1201 }
1202 }
1203 if (k_L2CBMu_MinDeltaR == -1) continue;
1204 for (unsigned int c = 0; c < m_selectMuonCategories.size(); c++) {
1205 if (m_selectMuonCategories[c] == ALL) {
1206 m_TriggerMuonValidationPlots[c]->fill(*m_vL2CBMuons.at(k_L2CBMu_MinDeltaR), *m_vRecoMuons.at(i));
1207 }
1208 }
1209 }
1210 }
1211
1213 for (unsigned int i = 0; i < m_selectMuonCategories.size(); i++) {
1214 if (m_selectMuonCategories[i] == ALL) {
1215 m_TriggerMuonValidationPlots[i]->fill(*EFMu);
1216 break;
1217 }
1218 }
1219 ATH_MSG_DEBUG("==> Geometrical selection of EF Trigger muons: pt " << EFMu->pt() << " phi " << EFMu->phi() << " eta " << EFMu->eta()
1220 << " author " << EFMu->author());
1221 }
1222
1224 int k_EFMu_MinDeltaR = -1;
1225 float MinDeltaR = 0.;
1226 std::vector<int> vAvailableAuthors;
1227 vAvailableAuthors.clear();
1228 vAvailableAuthors.emplace_back(m_vEFMuons[0]->author());
1229 unsigned int iter = 0;
1230 for (unsigned int k = 0; k < m_vEFMuons.size(); k++) {
1231 iter = 0;
1232 for (unsigned int l = 0; l < vAvailableAuthors.size(); l++) {
1233 if (m_vEFMuons[k]->author() != vAvailableAuthors[l]) iter++;
1234 }
1235 if (iter == vAvailableAuthors.size()) vAvailableAuthors.emplace_back(m_vEFMuons[k]->author());
1236 }
1237 ATH_MSG_DEBUG(" m_vEFMuons.size()" << m_vEFMuons.size());
1238 for (unsigned int i = 0; i < m_vRecoMuons.size(); i++) {
1239 ATH_MSG_DEBUG(":: TEST: listing all Recomu pt=" << m_vRecoMuons.at(i)->pt() << " eta=" << m_vRecoMuons.at(i)->eta() << " phi="
1240 << m_vRecoMuons.at(i)->phi() << " auth=" << m_vRecoMuons.at(i)->author());
1241 }
1242 for (unsigned int i = 0; i < m_vRecoMuons.size(); i++) {
1243 if ((m_vRecoMuons.at(i)->author() != 1) || (std::abs(m_vRecoMuons.at(i)->eta()) > 2.4)) continue;
1244 ATH_MSG_DEBUG(":::: TEST: Recomu pt=" << m_vRecoMuons.at(i)->pt() << " eta=" << m_vRecoMuons.at(i)->eta()
1245 << " phi=" << m_vRecoMuons.at(i)->phi() << " auth=" << m_vRecoMuons.at(i)->author());
1246 for (unsigned int l = 0; l < vAvailableAuthors.size(); l++) {
1247 k_EFMu_MinDeltaR = -1;
1248 MinDeltaR = 1000;
1249 for (unsigned int k = 0; k < m_vEFMuons.size(); k++) {
1250 ATH_MSG_DEBUG(" :::::::: TEST: EF pt=" << m_vEFMuons.at(k)->pt() << " eta=" << m_vEFMuons.at(k)->eta()
1251 << " phi=" << m_vEFMuons.at(k)->phi()
1252 << " DeltaR=" << deltaR(m_vRecoMuons.at(i), m_vEFMuons.at(k))
1253 << " author=" << m_vEFMuons.at(k)->author());
1254 if (m_vEFMuons.at(k)->author() == vAvailableAuthors.at(l) &&
1255 (deltaR(m_vRecoMuons.at(i), m_vEFMuons.at(k)) < 0.1 &&
1256 (deltaR(m_vRecoMuons.at(i), m_vEFMuons.at(k)) < MinDeltaR))) {
1257 k_EFMu_MinDeltaR = k;
1258 MinDeltaR = deltaR(m_vRecoMuons.at(i), m_vEFMuons.at(k));
1259 }
1260 }
1261 if (k_EFMu_MinDeltaR == -1) continue;
1262 for (unsigned int c = 0; c < m_selectMuonCategories.size(); c++) {
1263 if (m_selectMuonCategories[c] == ALL) {
1264 m_TriggerMuonValidationPlots[c]->fill(*m_vEFMuons.at(k_EFMu_MinDeltaR), *m_vRecoMuons.at(i));
1265 }
1266 }
1267 }
1268 }
1269 }
1270
1272 const xAOD::TrackParticle* tp = mu->primaryTrackParticle();
1273 static const SG::ConstAccessor<TruthLink> truthParticleLinkAcc("truthParticleLink");
1274 TruthLink truthLink;
1275 if (tp) {
1276 truthLink = truthParticleLinkAcc.withDefault(*tp, TruthLink());
1277 }
1278 ATH_MSG_DEBUG("Muon: pt " << mu->pt() << " eta " << mu->eta() << " link " << truthLink.isValid());
1279 }
1280
1282 static const SG::ConstAccessor<MuonLink> acc_muon("recoMuonLink");
1283 if (!acc_muon.isAvailable(*truthMu)) return nullptr;
1284 MuonLink link = acc_muon(*truthMu);
1285 if (!link.isValid()) return nullptr;
1286 const xAOD::Muon* reco_mu = (*link);
1287 if (!m_selectComissioning && reco_mu->allAuthors() & comm_bit) return nullptr;
1288 m_vMatchedMuons.emplace_back(reco_mu);
1289 return reco_mu;
1290 }
1291
1293 const xAOD::SlowMuonContainer* SlowMuons = nullptr;
1294 retrieveContainer(Gaudi::Hive::currentContext() , m_slowMuonsName, SlowMuons).ignore();
1295 if (!SlowMuons) return nullptr;
1296 for (const auto smu : *SlowMuons) {
1297 const MuonLink muLink = smu->muonLink();
1298 if (!muLink.isValid()) continue;
1299 float DR = deltaR(*muLink , truthMu);
1300 if (DR < 0.005) {
1301 m_vMatchedSlowMuons.emplace_back(smu);
1302 return smu;
1303 }
1304 }
1305
1306 return nullptr;
1307 }
1308
1310 ATH_MSG_DEBUG("Truth muon: " << truthMu->pt() << " eta " << truthMu->eta());
1311 if (!mu) return;
1312 ATH_MSG_DEBUG("Reco muon: " << mu->pt() << " eta " << mu->eta());
1313 }
1314
1316 ATH_MSG_INFO("Finalising hists " << name() << "...");
1317 for (const auto& plots : m_muonValidationPlots) plots->finalize();
1318 for (const auto& plots : m_TriggerMuonValidationPlots) plots->finalize();
1319 if (!m_isData) {
1320 m_oUnmatchedRecoMuonPlots->finalize();
1321 m_oUnmatchedTruthMuonPlots->finalize();
1322 }
1323
1324 for (const auto& plots : m_muonMSTrackValidationPlots) plots->finalize();
1325 for (const auto& plots : m_muonMETrackValidationPlots) plots->finalize();
1326 for (const auto& plots : m_muonMSOnlyMETrackValidationPlots) plots->finalize();
1327 for (const auto& plots : m_muonIDTrackValidationPlots) plots->finalize();
1328 for (const auto& plots : m_muonIDSelectedTrackValidationPlots) plots->finalize();
1329 for (const auto& plots : m_muonIDForwardTrackValidationPlots) plots->finalize();
1330 if (!m_isData)
1332
1333 for (const auto& plots : m_muonSegmentValidationPlots) plots->finalize();
1334 if (!m_isData)
1336
1337 return StatusCode::SUCCESS;
1338 }//procHistograms*/
1339
1341 static const SG::ConstAccessor<MuonSegmentLink> recoSegmentLinkAcc("recoSegmentLink");
1342 if (!recoSegmentLinkAcc.isAvailable(*truthMuSeg)) {
1343 ATH_MSG_DEBUG("recoSegmentLink not found");
1344 return nullptr;
1345 }
1346 MuonSegmentLink link = recoSegmentLinkAcc(*truthMuSeg);
1347 if (!link.isValid()) {
1348 ATH_MSG_DEBUG("recoSegmentLink not valid");
1349 return nullptr;
1350 }
1351 m_vMatchedMuonSegments.emplace_back(*link);
1352 return (*link);
1353 }
1354
1355 TH1F* MuonPhysValMonitoringTool::findHistogram(const std::vector<HistData>& hists, const std::string& hnameTag,
1356 const std::string& hdirTag, const std::string& hNewName) {
1357 TH1F* h = nullptr;
1358 for (const auto& hist : hists) {
1359 if (hist.second.find(hdirTag) != std::string::npos || hdirTag.empty()) {
1360 std::string histname = hist.first->GetName();
1361 if (histname.find(hnameTag) != std::string::npos) {
1362 h = (TH1F*)hist.first->Clone(hNewName.c_str());
1363 return h;
1364 }
1365 }
1366 }
1367 return h;
1368 }
1369
1371 const xAOD::MuonSegment* truthMuSeg, const xAOD::TruthParticleContainer* muonTruthContainer) {
1372 static const SG::ConstAccessor<TruthLink> truthParticleLinkAcc("truthParticleLink");
1373 TruthLink truthLink;
1374 if (truthParticleLinkAcc.isAvailable(*truthMuSeg)) {
1375 truthLink = truthParticleLinkAcc(*truthMuSeg);
1376 if (truthLink.isValid()) {
1377 const int theUniqueID = HepMC::uniqueID(*truthLink);
1378 if (std::abs((*truthLink)->pdgId()) != 13) return REST;
1379
1380 for (const auto muTruthPart : *muonTruthContainer) {
1381 if ( HepMC::uniqueID(muTruthPart) == theUniqueID ) { return getMuonTruthCategory(muTruthPart); }
1382 }
1383 }
1384 } else
1385 ATH_MSG_WARNING("No truth link available for muon truth segment");
1386
1387 return REST;
1388 }
1389
1391 static const SG::ConstAccessor<int> truthTypeAcc("truthType");
1392 static const SG::ConstAccessor<int> truthOriginAcc("truthOrigin");
1393 int truthType = truthTypeAcc(*mu);
1394 if (truthType == 6)
1395 return PROMPT;
1396 else if (truthType == 8 && (truthOriginAcc(*mu) == 34 || truthOriginAcc(*mu) == 35))
1397 return INFLIGHT;
1398 else if (truthType == 7)
1399 return NONISO;
1400 return REST;
1401 }
1402
1403 std::unique_ptr<xAOD::Muon> MuonPhysValMonitoringTool::getCorrectedMuon(const xAOD::Muon& mu) {
1404 std::unique_ptr<xAOD::Muon> mu_c;
1405 if (mu.m() <= 0) return mu_c;
1406 mu_c = std::make_unique<xAOD::Muon>();
1407 mu_c->makePrivateStore(mu);
1408
1409 // add decorations too fool the muon selector tool
1410 const xAOD::TrackParticle* idtrk{mu_c->trackParticle(xAOD::Muon::InnerDetectorTrackParticle)};
1411 const xAOD::TrackParticle* metrk{mu_c->trackParticle(xAOD::Muon::ExtrapolatedMuonSpectrometerTrackParticle)};
1412 if (idtrk && metrk) {
1413 const static SG::Decorator<float> InnerDetectorPtDec("InnerDetectorPt");
1414 const static SG::Decorator<float> MuonSpectrometerPtDec("MuonSpectrometerPt");
1415 InnerDetectorPtDec(*mu_c) = idtrk->pt();
1416 MuonSpectrometerPtDec(*mu_c) = metrk->pt();
1417 }
1418 m_muonSelectionTool->setQuality(*mu_c);
1419 m_muonSelectionTool->setPassesIDCuts(*mu_c);
1420 return mu_c;
1421 }
1422
1424 std::string histname = hist->GetName();
1425
1426 if(m_muonsName.key() == "Muons"){
1427 if (histname.find("parameters_z0") != std::string::npos) {
1428 hist->GetXaxis()->Set(80, -200., 200.);
1429 }
1430 if (histname.find("parameters_d0") != std::string::npos && histname.find("parameters_d0_small") == std::string::npos) {
1431 hist->GetXaxis()->Set(80, -1., 1.);
1432 hist->GetYaxis()->SetTitle("Entries / 0.025 mm");
1433 }
1434 } else if(m_muonsName.key() == "MuonsLRT"){
1435 if (histname.find("parameters_d0") != std::string::npos && histname.find("parameters_d0_small") == std::string::npos) {
1436 hist->Rebin(100);
1437 hist->GetYaxis()->SetTitle("Entries / 2.5 mm");
1438 }
1439 }
1440
1441
1442 if (histname.find("trigger_L1_pt") != std::string::npos) { // if (histname=="Muons_All_trigger_L1_pt"){
1443 hist->SetTitle("L1Trigger Muons pt threshold");
1444 hist->GetXaxis()->SetTitle("L1Trigger Muons pt threshold [GeV]");
1445 hist->GetXaxis()->Set(30, -0.5, 29.5);
1446 }
1447 if (histname.find("trigger_L1_eta_pt") != std::string::npos) { // if (histname=="Muons_All_trigger_L1_eta_pt") {
1448 hist->SetTitle("L1Trigger Muons pt threshold vs eta");
1449 hist->GetYaxis()->Set(90, -0.5, 29.5);
1450 hist->GetYaxis()->SetTitle("L1Trigger Muons pt threshold [GeV]");
1451 }
1452
1453 if (histname.find("trigger") != std::string::npos &&
1454 ((histname.find("Denom_pt") != std::string::npos) || (histname.find("Numer_pt") != std::string::npos) ||
1455 (histname.find("Features_pt") != std::string::npos)))
1456 hist->GetXaxis()->Set(200, 0., 200.);
1457
1458 if (histname.find("hits") != std::string::npos) {
1459 if (histname.find("etaLayer2") != std::string::npos)
1460 hist->GetXaxis()->Set(15, -0.5, 14.5);
1461 else if (histname.find("etaLayer") != std::string::npos)
1462 hist->GetXaxis()->Set(11, -0.5, 10.5);
1463 }
1464
1466 bool is2D = !(histname.find("_vs_") == std::string::npos);
1468
1469 if (histname.find("METrackParticles") != std::string::npos) {
1470 if (histname.find("Res_eta") != std::string::npos) {
1471 if (is2D)
1472 hist->GetYaxis()->Set(50, -0.025, 0.025);
1473 else
1474 hist->GetXaxis()->Set(50, -0.025, 0.025);
1475 } else if (histname.find("Res_phi") != std::string::npos) {
1476 if (is2D)
1477 hist->GetYaxis()->Set(50, -0.02, 0.02);
1478 else
1479 hist->GetXaxis()->Set(50, -0.02, 0.02);
1480 }
1481 } else if (histname.find("MSTrackParticles") != std::string::npos) {
1482 if (histname.find("Res_eta") != std::string::npos) {
1483 if (is2D)
1484 hist->GetYaxis()->Set(50, -0.025, 0.025);
1485 else
1486 hist->GetXaxis()->Set(50, -0.025, 0.025);
1487 } else if (histname.find("Res_phi") != std::string::npos) {
1488 if (is2D)
1489 hist->GetYaxis()->Set(50, -0.05, 0.05);
1490 else
1491 hist->GetXaxis()->Set(50, -0.05, 0.05);
1492 }
1493 } else {
1494 if (histname.find("Res_eta") != std::string::npos) {
1495 if (is2D)
1496 hist->GetYaxis()->Set(50, -0.005, 0.005);
1497 else
1498 hist->GetXaxis()->Set(50, -0.005, 0.005);
1499 } else if (histname.find("Res_phi") != std::string::npos) {
1500 if (is2D)
1501 hist->GetYaxis()->Set(50, -0.002, 0.002);
1502 else
1503 hist->GetXaxis()->Set(50, -0.002, 0.002);
1504 }
1505 }
1506
1507 if (histname.find("trigger") != std::string::npos) {
1508 // RESO EF - MC
1509 if ((!m_isData) && histname.find("MuidCo") != std::string::npos &&
1510 (histname.find("BARREL") != std::string::npos || histname.find("WHOLE_DETECT") != std::string::npos)) {
1511 if (histname.find("Res_pT") != std::string::npos && histname.find("_vs_") == std::string::npos) {
1512 hist->GetXaxis()->Set(100, -0.04, 0.04);
1513 }
1514 if (histname.find("Res_pT_vs_") != std::string::npos) { hist->GetYaxis()->Set(100, -0.04, 0.04); }
1515 if (histname.find("Res_eta") != std::string::npos && histname.find("_vs_") == std::string::npos) {
1516 hist->GetXaxis()->Set(100, -0.0005, 0.0005);
1517 }
1518 if (histname.find("Res_eta_vs_") != std::string::npos) { hist->GetYaxis()->Set(100, -0.0005, 0.0005); }
1519
1520 if (histname.find("Res_phi") != std::string::npos && histname.find("_vs_") == std::string::npos) {
1521 hist->GetXaxis()->Set(100, -0.0002, 0.0002);
1522 }
1523 if (histname.find("Res_phi_vs_") != std::string::npos) { hist->GetYaxis()->Set(100, -0.0002, 0.0002); }
1524 }
1525 if ((!m_isData) && histname.find("MuidCo") != std::string::npos && (histname.find("ENDCAPS") != std::string::npos)) {
1526 if (histname.find("Res_pT") != std::string::npos && histname.find("_vs_") == std::string::npos) {
1527 hist->GetXaxis()->Set(100, -0.05, 0.05);
1528 }
1529 if (histname.find("Res_pT_vs_") != std::string::npos) { hist->GetYaxis()->Set(100, -0.05, 0.05); }
1530 if (histname.find("Res_eta") != std::string::npos && histname.find("_vs_") == std::string::npos) {
1531 hist->GetXaxis()->Set(100, -0.001, 0.001);
1532 }
1533 if (histname.find("Res_eta_vs_") != std::string::npos) { hist->GetYaxis()->Set(100, -0.001, 0.001); }
1534
1535 if (histname.find("Res_phi") != std::string::npos && histname.find("_vs_") == std::string::npos) {
1536 hist->GetXaxis()->Set(100, -0.0003, 0.0003);
1537 }
1538 if (histname.find("Res_phi_vs_") != std::string::npos) { hist->GetYaxis()->Set(100, -0.0003, 0.0003); }
1539 }
1540 if ((!m_isData) && histname.find("MuidSA") != std::string::npos) {
1541 if (histname.find("Res_eta") != std::string::npos && histname.find("_vs_") == std::string::npos) {
1542 hist->GetXaxis()->Set(100, -0.03, 0.03);
1543 }
1544 if (histname.find("Res_eta_vs_") != std::string::npos) { hist->GetYaxis()->Set(100, -0.03, 0.03); }
1545
1546 if (histname.find("Res_phi") != std::string::npos && histname.find("_vs_") == std::string::npos) {
1547 hist->GetXaxis()->Set(100, -0.03, 0.03);
1548 }
1549 if (histname.find("Res_phi_vs_") != std::string::npos) { hist->GetYaxis()->Set(100, -0.03, 0.03); }
1550 }
1551 if ((!m_isData) && histname.find("MuidSA") != std::string::npos && (histname.find("BARREL") != std::string::npos)) {
1552 if (histname.find("Res_pT") != std::string::npos && histname.find("_vs_") == std::string::npos) {
1553 hist->GetXaxis()->Set(100, -0.15, 0.15);
1554 }
1555 if (histname.find("Res_pT_vs_") != std::string::npos) { hist->GetYaxis()->Set(100, -0.15, 0.15); }
1556 }
1557 if ((!m_isData) && histname.find("MuidSA") != std::string::npos &&
1558 (histname.find("ENDCAPS") != std::string::npos || histname.find("WHOLE_DETECT") != std::string::npos)) {
1559 if (histname.find("Res_pT") != std::string::npos && histname.find("_vs_") == std::string::npos) {
1560 hist->GetXaxis()->Set(100, -0.2, 0.2);
1561 }
1562 if (histname.find("Res_pT_vs_") != std::string::npos) { hist->GetYaxis()->Set(100, -0.2, 0.2); }
1563 }
1564
1565 // RESO EF - DATA
1566 if ((m_isData) && histname.find("MuidCo") != std::string::npos &&
1567 (histname.find("BARREL") != std::string::npos || histname.find("WHOLE_DETECT") != std::string::npos)) {
1568 if (histname.find("Res_pT") != std::string::npos && histname.find("_vs_") == std::string::npos) {
1569 hist->GetXaxis()->Set(100, -0.06, 0.06);
1570 }
1571 if (histname.find("Res_pT_vs_") != std::string::npos) { hist->GetYaxis()->Set(100, -0.06, 0.06); }
1572 if (histname.find("Res_eta") != std::string::npos && histname.find("_vs_") == std::string::npos) {
1573 hist->GetXaxis()->Set(100, -0.001, 0.001);
1574 }
1575 if (histname.find("Res_eta_vs_") != std::string::npos) { hist->GetYaxis()->Set(100, -0.001, 0.001); }
1576
1577 if (histname.find("Res_phi") != std::string::npos && histname.find("_vs_") == std::string::npos) {
1578 hist->GetXaxis()->Set(100, -0.0005, 0.0005);
1579 }
1580 if (histname.find("Res_phi_vs_") != std::string::npos) { hist->GetYaxis()->Set(100, -0.0005, 0.0005); }
1581 }
1582 if ((m_isData) && histname.find("MuidCo") != std::string::npos && (histname.find("ENDCAPS") != std::string::npos)) {
1583 if (histname.find("Res_pT") != std::string::npos && histname.find("_vs_") == std::string::npos) {
1584 hist->GetXaxis()->Set(100, -0.1, 0.1);
1585 }
1586 if (histname.find("Res_pT_vs_") != std::string::npos) { hist->GetYaxis()->Set(100, -0.1, 0.1); }
1587 if (histname.find("Res_eta") != std::string::npos && histname.find("_vs_") == std::string::npos) {
1588 hist->GetXaxis()->Set(100, -0.0015, 0.0015);
1589 }
1590 if (histname.find("Res_eta_vs_") != std::string::npos) { hist->GetYaxis()->Set(100, -0.0015, 0.0015); }
1591
1592 if (histname.find("Res_phi") != std::string::npos && histname.find("_vs_") == std::string::npos) {
1593 hist->GetXaxis()->Set(100, -0.0005, 0.0005);
1594 }
1595 if (histname.find("Res_phi_vs_") != std::string::npos) { hist->GetYaxis()->Set(100, -0.0005, 0.0005); }
1596 }
1597 if ((m_isData) && histname.find("MuidSA") != std::string::npos) {
1598 if (histname.find("Res_eta") != std::string::npos && histname.find("_vs_") == std::string::npos) {
1599 hist->GetXaxis()->Set(100, -0.03, 0.03);
1600 }
1601 if (histname.find("Res_eta_vs_") != std::string::npos) { hist->GetYaxis()->Set(100, -0.03, 0.03); }
1602
1603 if (histname.find("Res_phi") != std::string::npos && histname.find("_vs_") == std::string::npos) {
1604 hist->GetXaxis()->Set(100, -0.03, 0.03);
1605 }
1606 if (histname.find("Res_phi_vs_") != std::string::npos) { hist->GetYaxis()->Set(100, -0.03, 0.03); }
1607 }
1608 if ((m_isData) && histname.find("MuidSA") != std::string::npos && (histname.find("BARREL") != std::string::npos)) {
1609 if (histname.find("Res_pT") != std::string::npos && histname.find("_vs_") == std::string::npos) {
1610 hist->GetXaxis()->Set(100, -0.3, 0.3);
1611 }
1612 if (histname.find("Res_pT_vs_") != std::string::npos) { hist->GetYaxis()->Set(100, -0.3, 0.3); }
1613 }
1614 if ((m_isData) && histname.find("MuidSA") != std::string::npos &&
1615 (histname.find("ENDCAPS") != std::string::npos || histname.find("WHOLE_DETECT") != std::string::npos)) {
1616 if (histname.find("Res_pT") != std::string::npos && histname.find("_vs_") == std::string::npos) {
1617 hist->GetXaxis()->Set(100, -0.5, 0.5);
1618 }
1619 if (histname.find("Res_pT_vs_") != std::string::npos) { hist->GetYaxis()->Set(100, -0.5, 0.5); }
1620 }
1621
1622 // LEVEL2
1623 if ((histname.find("L2_StandAlone") != std::string::npos)) {
1624 if (histname.find("Res_eta") != std::string::npos && histname.find("_vs_") == std::string::npos) {
1625 hist->GetXaxis()->Set(100, -0.03, 0.03);
1626 }
1627 if (histname.find("Res_eta_vs_") != std::string::npos) { hist->GetYaxis()->Set(100, -0.03, 0.03); }
1628
1629 if (histname.find("Res_phi") != std::string::npos && histname.find("_vs_") == std::string::npos) {
1630 hist->GetXaxis()->Set(100, -0.03, 0.03);
1631 }
1632 if (histname.find("Res_phi_vs_") != std::string::npos) { hist->GetYaxis()->Set(100, -0.03, 0.03); }
1633 }
1634 if ((histname.find("L2_StandAlone") != std::string::npos) && (histname.find("BARREL") != std::string::npos)) {
1635 if (histname.find("Res_pT") != std::string::npos && histname.find("_vs_") == std::string::npos) {
1636 hist->GetXaxis()->Set(100, -0.3, 0.3);
1637 }
1638 if (histname.find("Res_pT_vs_") != std::string::npos) { hist->GetYaxis()->Set(100, -0.3, 0.3); }
1639 }
1640 if ((histname.find("L2_StandAlone") != std::string::npos) &&
1641 ((histname.find("ENDCAPS") != std::string::npos) || (histname.find("WHOLE_DETECT") != std::string::npos))) {
1642 if (histname.find("Res_pT") != std::string::npos && histname.find("_vs_") == std::string::npos) {
1643 hist->GetXaxis()->Set(100, -0.5, 0.5);
1644 }
1645 if (histname.find("Res_pT_vs_") != std::string::npos) { hist->GetYaxis()->Set(100, -0.5, 0.5); }
1646 }
1647
1648 if ((histname.find("L2_Combined") != std::string::npos)) {
1649 if (histname.find("Res_eta") != std::string::npos && histname.find("_vs_") == std::string::npos) {
1650 hist->GetXaxis()->Set(100, -0.002, 0.002);
1651 }
1652 if (histname.find("Res_eta_vs_") != std::string::npos) { hist->GetYaxis()->Set(100, -0.002, 0.002); }
1653
1654 if (histname.find("Res_phi") != std::string::npos && histname.find("_vs_") == std::string::npos) {
1655 hist->GetXaxis()->Set(100, -0.001, 0.001);
1656 }
1657 if (histname.find("Res_phi_vs_") != std::string::npos) { hist->GetYaxis()->Set(100, -0.001, 0.001); }
1658 if (histname.find("Res_pT") != std::string::npos && histname.find("_vs_") == std::string::npos) {
1659 hist->GetXaxis()->Set(100, -0.2, 0.2);
1660 }
1661 if (histname.find("Res_pT_vs_") != std::string::npos) { hist->GetYaxis()->Set(100, -0.2, 0.2); }
1662 }
1663 }
1664 }
1665
1667 if (prt->pt() < 2000.) return false;
1668 if (std::abs(prt->eta()) > 2.7) return false;
1669 return true;
1670 }
1671
1672} // namespace MuonPhysValMonitoring
Scalar deltaR(const MatrixBase< Derived > &vec) const
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_ERROR(x)
#define ATH_MSG_INFO(x)
#define ATH_MSG_VERBOSE(x)
#define ATH_MSG_WARNING(x)
#define ATH_MSG_DEBUG(x)
ElementLink< xAOD::MuonContainer > MuonLink
Helper class to provide constant type-safe access to aux data.
ATLAS-specific HepMC functions.
ElementLink< xAOD::TrackParticleContainer > TrackLink
size_t size() const
Number of registered mappings.
ElementLink< xAOD::TruthParticleContainer > TruthLink
#define x
bool msgLvl(const MSG::Level lvl) const
DataModel_detail::const_iterator< DataVector > const_iterator
Definition DataVector.h:838
size_type size() const noexcept
Returns the number of elements in the collection.
virtual StatusCode regHist(TH1 *h, const std::string &system, Interval_t interval, MgmtAttr_t histo_mgmt=ATTRIB_MANAGED, const std::string &chain="", const std::string &merge="")
Registers a TH1 (including TH2, TH3, and TProfile) to be included in the output stream using logical ...
virtual StatusCode regTree(TTree *t, const std::string &system, Interval_t interval, MgmtAttr_t histo_mgmt=ATTRIB_MANAGED, const std::string &chain="", const std::string &merge="")
Registers a TTree to be included in the output stream using logical parameters that describe it.
std::vector< const xAOD::TrackParticle * > m_vZmumuMETracks
std::vector< const xAOD::L2CombinedMuon * > m_vL2CBMuonsSelected
std::unique_ptr< Muon::MuonSegmentPlots > m_oUnmatchedRecoMuonSegmentPlots
void handleTruthMuon(const xAOD::TruthParticle *truthMu, float weight=1.0)
Gaudi::Property< bool > m_selectComissioning
Flag to tell whether muons with the comissioning author will be selected or not.
std::unique_ptr< xAOD::Muon > getCorrectedMuon(const xAOD::Muon &mu)
MuonPhysValMonitoringTool::MUCATEGORY getMuonSegmentTruthCategory(const xAOD::MuonSegment *truthMuSeg, const xAOD::TruthParticleContainer *muonTruthContainer)
std::vector< const xAOD::TruthParticle * > m_vMatchedTruthMuons
std::vector< const xAOD::L2StandAloneMuon * > m_vL2SAMuonsSelected
std::vector< const xAOD::SlowMuon * > m_vMatchedSlowMuons
void handleMuonL2Trigger(const xAOD::L2StandAloneMuon *L2SAMu)
ToolHandle< Trk::ITrackSelectorTool > m_trackSelector
std::vector< std::unique_ptr< MuonSegmentValidationPlots > > m_muonSegmentValidationPlots
SG::ReadDecorHandleKeyArray< xAOD::IParticleContainer > m_decorDep
std::unique_ptr< Muon::TruthMuonPlotOrganizer > m_oUnmatchedTruthMuonPlots
std::vector< std::unique_ptr< SlowMuonValidationPlots > > m_slowMuonValidationPlots
std::vector< const xAOD::L2StandAloneMuon * > m_vL2SAMuons
void handleTruthMuonSegment(const xAOD::MuonSegment *truthMuSeg, const xAOD::TruthParticleContainer *muonTruthContainer, float weight=1.0)
const xAOD::MuonSegment * findRecoMuonSegment(const xAOD::MuonSegment *truthMuSeg)
std::unique_ptr< Muon::RecoMuonPlotOrganizer > m_oUnmatchedRecoMuonPlots
ToolHandle< CP::IIsolationSelectionTool > m_isoTool
std::vector< const xAOD::MuonSegment * > m_vMatchedMuonSegments
std::unique_ptr< Muon::RecoMuonTrackPlotOrganizer > m_oUnmatchedRecoMuonTrackPlots
virtual StatusCode procHistograms() override
An inheriting class should either override this function or finalHists().
MuonPhysValMonitoringTool::MUCATEGORY getMuonTruthCategory(const xAOD::IParticle *prt)
std::vector< const xAOD::TrackParticle * > m_vZmumuIDTracks
std::vector< std::unique_ptr< MuonTrackValidationPlots > > m_muonIDForwardTrackValidationPlots
virtual StatusCode fillHistograms(const EventContext &ctx) override
An inheriting class should either override this function or fillHists().
std::vector< std::unique_ptr< MuonTrackValidationPlots > > m_muonMETrackValidationPlots
void handleMuonTrack(const xAOD::TrackParticle *tp, xAOD::Muon::TrackParticleType type, float weight=1.0)
const xAOD::SlowMuon * findRecoSlowMuon(const xAOD::TruthParticle *truthMu)
std::vector< std::unique_ptr< TriggerMuonValidationPlots > > m_TriggerMuonValidationPlots
std::vector< std::unique_ptr< MuonTrackValidationPlots > > m_muonMSTrackValidationPlots
Gaudi::Property< std::vector< unsigned int > > m_selectMuonAuthors
void handleMuonSegment(const xAOD::MuonSegment *muSeg, float weight=1.0)
Gaudi::Property< std::vector< std::string > > m_L1MuonItems
std::vector< const xAOD::TrackParticle * > m_vMatchedMuonTracks
Gaudi::Property< std::vector< unsigned int > > m_selectMuonCategories
TH1F * findHistogram(const std::vector< HistData > &hists, const std::string &hnameTag, const std::string &hdirTag, const std::string &hNewName)
const xAOD::Muon * findRecoMuon(const xAOD::TruthParticle *truthMu)
std::vector< std::unique_ptr< MuonValidationPlots > > m_muonValidationPlots
Gaudi::Property< std::vector< int > > m_selectMuonWPs
Gaudi::Property< std::vector< std::vector< std::string > > > m_selectHLTMuonItems
std::vector< const xAOD::L2CombinedMuon * > m_vL2CBMuons
StatusCode retrieveContainer(const EventContext &ctx, const SG::ReadHandleKey< ContType > &key, const ContType *&container) const
std::vector< std::unique_ptr< MuonTrackValidationPlots > > m_muonMSOnlyMETrackValidationPlots
void printTruthMuonDebug(const xAOD::TruthParticle *truthMu, const xAOD::Muon *mu)
std::vector< std::unique_ptr< MuonTrackValidationPlots > > m_muonIDTrackValidationPlots
virtual StatusCode bookHistograms() override
An inheriting class should either override this function or bookHists().
ToolHandle< CP::IMuonSelectionTool > m_muonSelectionTool
void handleMuon(const xAOD::Muon *mu, const xAOD::SlowMuon *smu=nullptr, float weight=1.0)
std::vector< std::unique_ptr< MuonTrackValidationPlots > > m_muonIDSelectedTrackValidationPlots
std::vector< HistData > retrieveBookedHistograms()
Retrieve all booked histograms.
Definition PlotBase.cxx:63
void initialize()
Definition PlotBase.cxx:39
std::vector< TreeData > retrieveBookedTrees()
Retrieve all booked trees.
Definition PlotBase.cxx:73
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.
const_reference_type withDefault(const ELT &e, const T &deflt) const
Fetch the variable for one element, as a const reference, with a default.
Exception — Attempt to retrieve nonexistent aux data item.
Property holding a SG store/key/clid from which a ReadHandle is made.
const_pointer_type cptr()
Dereference the pointer.
bool isPresent() const
Is the referenced object present in SG?
const std::vector< Trig::Feature< T > > get(const std::string &label="", unsigned int condition=TrigDefs::Physics, const std::string &teName="") const
returns flattened vector of Features of given type This method is in fact sullied by 3 arguments.
float beamSpotWeight() const
Weight for beam spot size reweighting.
Class providing the definition of the 4-vector interface.
virtual double eta() const =0
The pseudorapidity ( ) of the particle.
virtual double pt() const =0
The transverse momentum ( ) of the particle.
virtual double eta() const
The pseudorapidity ( ) of the particle.
virtual double phi() const
The azimuthal angle ( ) of the particle.
virtual double pt() const
The transverse momentum ( ) of the particle.
int sAddress() const
Get the station address of the muon.
virtual double pt() const
The transverse momentum ( ) of the particle.
virtual double phi() const
The azimuthal angle ( ) of the particle.
uint32_t roiWord() const
Get the RoI ID of the seeding LVL1 muon.
virtual double eta() const
The pseudorapidity ( ) of the particle.
float eta() const
The pseudorapidity ( ) of the muon candidate.
float thrValue() const
The highest threshold value (in MeV) passed by the muon candidate.
float phi() const
The azimuthal angle ( ) of the muon candidate.
virtual double eta() const
The pseudorapidity ( ) of the particle.
virtual double phi() const
The azimuthal angle ( ) of the particle.
virtual double pt() const
The transverse momentum ( ) of the particle.
float charge() const
uint16_t allAuthors() const
Get all the authors of this Muon.
Author author() const
const ElementLink< MuonContainer > & muonLink() const
virtual FourMom_t p4() const override final
The full 4-momentum of the particle.
virtual double pt() const override final
The transverse momentum ( ) of the particle.
virtual double pt() const override final
The transverse momentum ( ) of the particle.
virtual double eta() const override final
The pseudorapidity ( ) of the particle.
std::string find(const std::string &s)
return a remapped string
Definition hcg.cxx:140
std::vector< std::string > tokenize(std::string_view the_str, std::string_view delimiters)
Splits the string into smaller substrings.
int uniqueID(const T &p)
constexpr int UNDEFINED_ID
bool is_simulation_particle(const T &p)
Method to establish if a particle (or barcode) was created during the simulation (TODO update to be s...
bool isStable(const T &p)
Identify if the particle is stable, i.e. has not decayed.
static const char * toString(Muon::EnumDefs::DetRegion reg)
Definition Muons.py:1
SG::Decorator< T, ALLOC > Decorator
Helper class to provide type-safe access to aux data, specialized for JaggedVecElt.
Definition AuxElement.h:576
EventInfo_v1 EventInfo
Definition of the latest event info version.
MuonRoIContainer_v1 MuonRoIContainer
L2CombinedMuon_v1 L2CombinedMuon
Define the latest version of the muon CB class.
MuonSegmentContainer_v1 MuonSegmentContainer
Definition of the current "MuonSegment container version".
L2CombinedMuonContainer_v1 L2CombinedMuonContainer
Define the latest version of the muon CB container.
TrackParticle_v1 TrackParticle
Reference the current persistent version:
SlowMuon_v1 SlowMuon
Reference the current persistent version:
Definition SlowMuon.h:13
TruthParticle_v1 TruthParticle
Typedef to implementation.
L2StandAloneMuonContainer_v2 L2StandAloneMuonContainer
Define the latest version of the muon SA container.
TrackParticleContainer_v1 TrackParticleContainer
Definition of the current "TrackParticle container version".
Muon_v1 Muon
Reference the current persistent version:
L2StandAloneMuon_v2 L2StandAloneMuon
Define the latest version of the muon SA class.
SlowMuonContainer_v1 SlowMuonContainer
Definition of the current "SlowMuon container version".
MuonContainer_v1 MuonContainer
Definition of the current "Muon container version".
MuonRoI_v1 MuonRoI
Definition MuonRoI.h:15
MuonSegment_v1 MuonSegment
Reference the current persistent version:
TruthParticleContainer_v1 TruthParticleContainer
Declare the latest version of the truth particle container.
TChain * tree