ATLAS Offline Software
MuonValidationPlots.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration
3 */
4 
5 #include "MuonValidationPlots.h"
6 
7 #include <utility>
8 
10 
13 
14 MuonValidationPlots::MuonValidationPlots(PlotBase* pParent, const std::string& sDir, std::vector<int> wps,
15  std::vector<unsigned int> authors, bool isData, bool doBinnedResolutionPlots,
16  bool doSeparateSAFMuons, bool doMuonTree) :
17  PlotBase(pParent, sDir),
18  m_selectedWPs(std::move(wps)),
19  m_selectedAuthors(std::move(authors)),
20  m_truthSelections(2, ""),
21  m_oTruthRelatedMuonPlots(nullptr),
22  m_isData(isData),
23  m_doSeparateSAFMuons(doSeparateSAFMuons),
24  m_MuonTree(nullptr) {
25  if (!m_isData) {
26  m_truthSelections[0] = "all"; // no selection on truth muons (minimum selection is |eta|<2.5, pt>5 GeV, defined in
27  // MuonPhysValMonitoringTool::handleTruthMuon()
28  m_truthSelections[1] = "MSAcceptance"; // truth muons in MS acceptance (at least 4 associated hits in the MS)
29 
30  // histogram classes for all muons
31  for (const auto& truthSelection : m_truthSelections) {
32  m_oTruthMuonPlots.emplace_back(new Muon::TruthMuonPlotOrganizer(this, "truth/" + truthSelection));
33  }
35  new Muon::TruthRelatedMuonPlotOrganizer(this, "matched/AllMuons", doBinnedResolutionPlots));
36  }
37 
38  std::vector<int> allPlotCategories(0);
39  std::vector<int> selectedPlotCategories(0);
40  for (unsigned int i = 0; i < Muon::MAX_RECOPLOTCLASS; i++) {
41  allPlotCategories.emplace_back(i);
42  if (i != Muon::MUON_CHARGEPARAM) selectedPlotCategories.emplace_back(i);
43  }
44 
45  // histogram classes for all muons
46  m_oRecoMuonPlots.reset(new Muon::RecoMuonPlotOrganizer(this, "reco/AllMuons", allPlotCategories));
47 
48  // define a histogram class for each of the selected muon qualities
49  for (unsigned int i = 0; i < m_selectedWPs.size(); i++) {
50  std::string sQuality = Muon::EnumDefs::toString((xAOD::Muon::Quality)m_selectedWPs[i]);
52  this, "reco/" + sQuality, (sQuality == "Medium" || sQuality == "Tight") ? allPlotCategories : selectedPlotCategories));
53 
54  if (!m_isData) {
55  bool doBinnedPlots = false;
56  if (sQuality == "Medium") doBinnedPlots = true;
58  new Muon::TruthRelatedMuonPlotOrganizer(this, "matched/" + sQuality, doBinnedPlots));
59  }
60  }
61 
62  // define a histogram class for each of the selected muon authors (+one inclusive for all authors)
63  for (unsigned int i = 0; i < m_selectedAuthors.size(); i++) {
64  std::string sAuthor = Muon::EnumDefs::toString((xAOD::Muon::Author)m_selectedAuthors[i]);
65  if (sAuthor == "CaloTag") sAuthor = "CaloTagTight";
66  m_oRecoMuonPlots_perAuthor.emplace_back(
67  new Muon::RecoMuonPlotOrganizer(this, "reco/" + sAuthor, (sAuthor == "MuidCo") ? allPlotCategories : selectedPlotCategories));
68  if (!m_isData)
70  new Muon::TruthRelatedMuonPlotOrganizer(this, "matched/" + sAuthor, doBinnedResolutionPlots));
71  }
72 
73  // define histogram class for loose CaloTag and append to author plots, not very nice workaround though
74  for (unsigned int i = 0; i < m_selectedAuthors.size(); i++) {
75  if ((xAOD::Muon::Author)m_selectedAuthors[i] == xAOD::Muon::CaloTag) { // found CaloTag in list, also do CaloTagLoose
76  m_oRecoMuonPlots_perAuthor.emplace_back(new Muon::RecoMuonPlotOrganizer(this, "reco/CaloTagLoose", selectedPlotCategories));
77  if (!m_isData)
79  new Muon::TruthRelatedMuonPlotOrganizer(this, "matched/CaloTagLoose", doBinnedResolutionPlots));
80  }
81  }
82 
83  // define histogram class for SiliconAssociatedForwardMuons
85  m_oRecoMuonPlots_SiAssocFwrdMu.emplace_back(new Muon::RecoMuonPlotOrganizer(this, "reco/SiAssocForward", selectedPlotCategories));
86  if (!m_isData)
88  new Muon::TruthRelatedMuonPlotOrganizer(this, "matched/SiAssocForward", doBinnedResolutionPlots));
89  }
90 
91  if (doMuonTree) m_MuonTree.reset(new Muon::MuonTree(this, "", !m_isData));
92 }
93 
95 
97  // fill hists for all muons
98  m_oRecoMuonPlots->fill(mu, weight);
99  // fill separate hists for each muon quality
100  xAOD::Muon::Quality muqual = mu.quality();
101  for (unsigned int i = 0; i < m_selectedWPs.size(); i++) {
102  if (muqual <= (xAOD::Muon::Quality)m_selectedWPs[i]) { m_oRecoMuonPlots_perQuality[i]->fill(mu, weight); }
103  }
104  // fill separate hists for each author
105  for (unsigned int i = 0; i < m_selectedAuthors.size(); i++) {
106  if (mu.isAuthor((xAOD::Muon::Author)m_selectedAuthors[i])) {
108  int ipar = 0;
109  if (mu.parameter(ipar, xAOD::Muon::CaloMuonIDTag)) { ; }
110  if (ipar < 11) continue;
111  }
112 
113  // filter SiliconAssociatedForwardMuons
114  if (mu.muonType() != (xAOD::Muon::MuonType)xAOD::Muon::SiliconAssociatedForwardMuon || !m_doSeparateSAFMuons)
116  }
117  }
118  // fill SiliconAssociatedForwardMuons
119  for (unsigned int i = 0; i < m_oTruthRelatedMuonPlots_SiAssocFwrdMu.size(); i++) {
120  if (mu.muonType() == (xAOD::Muon::MuonType)xAOD::Muon::SiliconAssociatedForwardMuon)
122  }
123  // fill CaloTagLoose (one additional plot in plot list)
124  unsigned int counter = m_selectedAuthors.size();
125  if (counter + 1 == m_oRecoMuonPlots_perAuthor.size()) {
127  }
128 }
129 
131  m_oTruthMuonPlots[0]->fill(truthMu, weight); // no selections
132  if (isGoodTruthTrack(truthMu)) { // in MS acceptance (minimum precision hits)
133  m_oTruthMuonPlots[1]->fill(truthMu, weight);
134  }
135 }
136 
138 
140 
142  float weight) {
143  if (truthMu) fillTruthMuonPlots(*truthMu, weight);
144  if (mu) fillRecoMuonPlots(*mu, weight);
145 
146  if ((mu) && (truthMu)) {
147  // plots for all
148  m_oTruthRelatedMuonPlots->fill(*truthMu, *mu, MSTracks, weight);
149  // fill SiliconAssociatedForwardMuons
150  for (unsigned int i = 0; i < m_oTruthRelatedMuonPlots_SiAssocFwrdMu.size(); i++) {
151  if (mu->muonType() == xAOD::Muon::SiliconAssociatedForwardMuon || !m_doSeparateSAFMuons)
152  m_oTruthRelatedMuonPlots_SiAssocFwrdMu[i]->fill(*truthMu, *mu, MSTracks, weight);
153  }
154 
155  // plots per quality
156  xAOD::Muon::Quality muqual = mu->quality();
157  for (unsigned int i = 0; i < m_selectedWPs.size(); i++) {
158  if (muqual <= (xAOD::Muon::Quality)m_selectedWPs[i]) {
159  m_oTruthRelatedMuonPlots_perQuality[i]->fill(*truthMu, *mu, MSTracks, weight);
160  }
161  }
162  // plots per author
163  for (unsigned int i = 0; i < m_selectedAuthors.size(); i++) {
164  if (mu->isAuthor((xAOD::Muon::Author)m_selectedAuthors[i])) {
166  int ipar = 0;
167  if (mu->parameter(ipar, xAOD::Muon::CaloMuonIDTag)) { ; }
168  if (ipar < 11) continue;
169  }
170  // filter SilicionAssociatedForwardMuons
171  if (mu->muonType() != xAOD::Muon::SiliconAssociatedForwardMuon || !m_doSeparateSAFMuons)
172  m_oTruthRelatedMuonPlots_perAuthor[i]->fill(*truthMu, *mu, MSTracks, weight);
173  }
174  }
175  // fill CaloTagLoose (one additional plot in plot list)
176  unsigned int counter = m_selectedAuthors.size();
177  if (counter + 1 == m_oRecoMuonPlots_perAuthor.size()) {
178  if (mu->isAuthor(xAOD::Muon::CaloTag)) m_oTruthRelatedMuonPlots_perAuthor[counter]->fill(*truthMu, *mu, MSTracks, weight);
179  }
180  }
181 }
182 
184 
186  if (m_MuonTree) m_MuonTree->fillRecoMuonBranches(mu);
187 }
188 
190  if (m_MuonTree) m_MuonTree->fillTruthMuonBranches(truthMu, isGoodTruthTrack(truthMu));
191 }
192 
194  const xAOD::TrackParticleContainer* MSTracks) {
195  if (!m_MuonTree) return;
196  if (mu) m_MuonTree->fillRecoMuonBranches(*mu);
197  if (truthMu) m_MuonTree->fillTruthMuonBranches(*truthMu, isGoodTruthTrack(*truthMu));
198 
199  if (truthMu && mu) { m_MuonTree->fillTruthMuonBranches(*truthMu, *mu, MSTracks, isGoodTruthTrack(*truthMu)); }
200 }
201 
203  if (!m_MuonTree) return;
204  m_MuonTree->fillEventBranches(eventInfo, isData);
205  m_MuonTree->getTree()->Fill();
206  m_MuonTree->postFillTreeActions();
207 }
208 
210  static const std::array<std::string,6> hitTypes{"innerSmallHits", "innerLargeHits", "middleSmallHits",
211  "middleLargeHits", "outerSmallHits", "outerLargeHits"}; // MDT + CSC
212  int minPrecHits = 5;
213 
214  int nPrecHits = 0;
215  bool hasEnoughPrecHits = false;
216 
217  for (const auto& hitTypeItr : hitTypes) {
218  if (truthMu.isAvailable<uint8_t>(hitTypeItr)) {
219  nPrecHits += truthMu.auxdata<uint8_t>(hitTypeItr);
220  if (nPrecHits >= minPrecHits) {
221  hasEnoughPrecHits = true;
222  break;
223  }
224  }
225  }
226  return (hasEnoughPrecHits);
227 }
MuonValidationPlots::fillRecoMuonPlots
void fillRecoMuonPlots(const xAOD::Muon &mu, float weight=1.0)
Definition: MuonValidationPlots.cxx:96
MuonValidationPlots::MuonValidationPlots
MuonValidationPlots(PlotBase *pParent, const std::string &sDir, std::vector< int > wps, std::vector< unsigned int > authors, bool isData, bool doBinnedResolutionPlots, bool doSplitSAFMuons, bool doMuonTree=false)
Definition: MuonValidationPlots.cxx:14
MuonValidationPlots::fillTruthMuonPlots
void fillTruthMuonPlots(const xAOD::TruthParticle &truthMu, float weight=1.0)
Definition: MuonValidationPlots.cxx:130
MuonValidationPlots::m_truthSelections
std::vector< std::string > m_truthSelections
Definition: MuonValidationPlots.h:35
MuonValidationPlots::fillTree
void fillTree(const xAOD::EventInfo *eventInfo, bool isData)
Definition: MuonValidationPlots.cxx:202
MuonValidationPlots::m_selectedWPs
std::vector< int > m_selectedWPs
Definition: MuonValidationPlots.h:33
PlotBase
Definition: PlotBase.h:33
xAOD::uint8_t
uint8_t
Definition: Muon_v1.cxx:575
MuonValidationPlots::m_MuonTree
std::unique_ptr< Muon::MuonTree > m_MuonTree
Definition: MuonValidationPlots.h:55
TrackLink
ElementLink< xAOD::TrackParticleContainer > TrackLink
Definition: MuonValidationPlots.cxx:11
python.copyTCTOutput.sDir
sDir
Definition: copyTCTOutput.py:60
MuonValidationPlots::~MuonValidationPlots
virtual ~MuonValidationPlots()
MuonValidationPlots::m_oRecoMuonPlots_perQuality
std::vector< std::unique_ptr< Muon::RecoMuonPlotOrganizer > > m_oRecoMuonPlots_perQuality
Definition: MuonValidationPlots.h:39
MuonValidationPlots::m_oRecoMuonPlots
std::unique_ptr< Muon::RecoMuonPlotOrganizer > m_oRecoMuonPlots
Definition: MuonValidationPlots.h:37
Muon::TruthMuonPlotOrganizer
Definition: TruthMuonPlotOrganizer.h:21
MuonParameters::CaloTag
@ CaloTag
Definition: MuonParamDefs.h:64
xAOD::Muon_v1
Class describing a Muon.
Definition: Muon_v1.h:38
dqt_zlumi_pandas.weight
int weight
Definition: dqt_zlumi_pandas.py:200
MuonValidationPlots::m_isData
bool m_isData
Definition: MuonValidationPlots.h:52
MuonValidationPlots::m_oTruthRelatedMuonPlots
std::unique_ptr< Muon::TruthRelatedMuonPlotOrganizer > m_oTruthRelatedMuonPlots
Definition: MuonValidationPlots.h:38
MuonValidationPlots::m_oRecoMuonPlots_perAuthor
std::vector< std::unique_ptr< Muon::RecoMuonPlotOrganizer > > m_oRecoMuonPlots_perAuthor
Definition: MuonValidationPlots.h:40
MuonValidationPlots::m_selectedAuthors
std::vector< unsigned int > m_selectedAuthors
Definition: MuonValidationPlots.h:34
lumiFormat.i
int i
Definition: lumiFormat.py:92
MuonValidationPlots::getMuonTree
Muon::MuonTree * getMuonTree()
Definition: MuonValidationPlots.cxx:183
MuonValidationPlots::fill
void fill(const xAOD::Muon &mu, float weight=1.0)
Definition: MuonValidationPlots.cxx:137
xAOD::TruthParticle_v1
Class describing a truth particle in the MC record.
Definition: TruthParticle_v1.h:41
Muon::RecoMuonPlotOrganizer
Definition: RecoMuonPlotOrganizer.h:27
MuonValidationPlots::m_doSeparateSAFMuons
bool m_doSeparateSAFMuons
Definition: MuonValidationPlots.h:53
DataVector< xAOD::TrackParticle_v1 >
MuonValidationPlots::fillTreeBranches
void fillTreeBranches(const xAOD::Muon &mu)
Definition: MuonValidationPlots.cxx:185
Muon::TruthRelatedMuonPlotOrganizer
Definition: TruthRelatedMuonPlotOrganizer.h:27
MuonLink
ElementLink< xAOD::MuonContainer > MuonLink
Definition: MuonValidationPlots.cxx:12
xAOD::IParticle::isAvailable
bool isAvailable(const std::string &name, const std::string &clsname="") const
Check if a user property is available for reading or not.
Definition: Event/xAOD/xAODBase/xAODBase/IParticle.h:131
xAOD::EventInfo_v1
Class describing the basic event information.
Definition: EventInfo_v1.h:43
MuonValidationPlots::m_oTruthRelatedMuonPlots_perQuality
std::vector< std::unique_ptr< Muon::TruthRelatedMuonPlotOrganizer > > m_oTruthRelatedMuonPlots_perQuality
Definition: MuonValidationPlots.h:41
Muon::MUON_CHARGEPARAM
@ MUON_CHARGEPARAM
Definition: RecoMuonPlotOrganizer.h:25
xAOD::IParticle::auxdata
T & auxdata(const std::string &name, const std::string &clsname="")
Fetch an aux data variable, as a non-const reference.
Definition: Event/xAOD/xAODBase/xAODBase/IParticle.h:96
MuonValidationPlots::m_oTruthRelatedMuonPlots_perAuthor
std::vector< std::unique_ptr< Muon::TruthRelatedMuonPlotOrganizer > > m_oTruthRelatedMuonPlots_perAuthor
Definition: MuonValidationPlots.h:42
python.grid.isData
def isData(dataset)
Definition: grid.py:491
MuonValidationPlots::m_oTruthRelatedMuonPlots_SiAssocFwrdMu
std::vector< std::unique_ptr< Muon::TruthRelatedMuonPlotOrganizer > > m_oTruthRelatedMuonPlots_SiAssocFwrdMu
Definition: MuonValidationPlots.h:45
MuonValidationPlots::isGoodTruthTrack
bool isGoodTruthTrack(const xAOD::TruthParticle &truthMu)
Definition: MuonValidationPlots.cxx:209
test_pyathena.counter
counter
Definition: test_pyathena.py:15
ParticleJetParams::Author
Author
Definition: ParticleJetParamDefs.h:33
Muon::MAX_RECOPLOTCLASS
@ MAX_RECOPLOTCLASS
Definition: RecoMuonPlotOrganizer.h:25
MuonEnumDefs.h
CaloNoise_fillDB.mu
mu
Definition: CaloNoise_fillDB.py:53
Muon::MuonTree
Definition: MuonTree.h:20
MuonValidationPlots::m_oTruthMuonPlots
std::vector< std::unique_ptr< Muon::TruthMuonPlotOrganizer > > m_oTruthMuonPlots
Definition: MuonValidationPlots.h:43
MuonValidationPlots.h
MuonValidationPlots::m_oRecoMuonPlots_SiAssocFwrdMu
std::vector< std::unique_ptr< Muon::RecoMuonPlotOrganizer > > m_oRecoMuonPlots_SiAssocFwrdMu
Definition: MuonValidationPlots.h:46