ATLAS Offline Software
ExamplePlots.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
3  */
4 
6 
7 #include "TopEvent/EventTools.h"
9 
11 
12 #include <cmath>
13 #include <array>
14 
15 #include "TH1.h"
16 #include "TFile.h"
17 
18 // Systematic include(s):
20 
21 namespace top {
22  const double ExamplePlots::toGeV = 0.001;
23 
24  ExamplePlots::ExamplePlots(const std::string& name, TFile* outputFile, EL::Worker* wk,
25  std::shared_ptr<top::TopConfig> config) :
26  m_hists(name, outputFile, wk), m_nominalHashValue(0) {
27  m_config = config;
28  m_sfRetriever = asg::ToolStore::get<ScaleFactorRetriever>("top::ScaleFactorRetriever");
30  m_nominalHashValue = nominal.hash();
31 
32  m_hists.addHist("event_mu", ";<#mu>;Events", 25, 0., 50.);
33  if (m_config->isMC()) {
34  m_hists.addHist("mc_weight", ";MC Event Weight", 30, -1, 1000);
35  m_hists.addHist("beamspot_weight", ";Beamspot weight", 120, -0.5, 2.5);
36  m_hists.addHist("jvt_SF", ";JVT SF", 120, -0.5, 2.5);
37  if (m_config->useElectrons() || m_config->useMuons())
38  m_hists.addHist("lepton_SF", ";Lepton SF", 120, -0.5, 2.5);
39  if (m_config->useGlobalTriggerConfiguration())
40  m_hists.addHist("globalTriggerSF", ";Global Trigger SF", 120, -0.5, 2.5);
41  m_hists.addHist("triggerSF", ";Trigger SF", 120, -0.5, 2.5);
42  if (m_config->useTaus())
43  m_hists.addHist("tau_SF", ";Tau SF", 120, -0.5, 2.5);
44  if (m_config->usePhotons())
45  m_hists.addHist("photon_SF", ";Photon SF", 120, -0.5, 2.5);
46  }
47 
48  m_hists.addHist("pileup_weight", ";Pileup Weight", 20, -1, 5);
49 
50  m_hists.addHist("el_n", ";Electron multiplicity;Events", 10, -0.5, 9.5);
51  m_hists.addHist("el_pt", ";Electron p_{T} / GeV;Electrons", 20, 0., 250.);
52  m_hists.addHist("el_eta", ";Electron #eta;Electrons", 20, -2.5, 2.5);
53  m_hists.addHist("el_phi", ";Electron #phi;Electrons", 20, -M_PI, M_PI);
54  m_hists.addHist("el_charge", ";Electron charge;Electrons", 3, -1.5, 1.5);
55  if (m_config->isMC()) m_hists.addHist("el_true_type", ";Electron true type;Electrons", 20, 0., 20.);
56 
57  m_hists.addHist("mu_n", ";Muon multiplicity;Events", 10, -0.5, 9.5);
58  m_hists.addHist("mu_pt", ";Muon p_{T} / GeV;Muons", 20, 0., 250.);
59  m_hists.addHist("mu_eta", ";Muon #eta;Muons", 20, -2.5, 2.5);
60  m_hists.addHist("mu_phi", ";Muon #phi;Muons", 20, -M_PI, M_PI);
61  m_hists.addHist("mu_charge", ";Muon charge;Muons", 3, -1.5, 1.5);
62  if (m_config->isMC()) m_hists.addHist("mu_true_type", ";Muon true type;Muons", 20, 0., 20.);
63 
64  m_hists.addHist("ph_n", ";Photon multiplicity;Events", 10, -0.5, 9.5);
65  m_hists.addHist("ph_pt", ";Photon p_{T} / GeV;Photons", 20, 0., 250.);
66  m_hists.addHist("ph_eta", ";Photon #eta;Photons", 20, -2.5, 2.5);
67  m_hists.addHist("ph_phi", ";Photon #phi;Photons", 20, -M_PI, M_PI);
68  m_hists.addHist("ph_e", ";Photon e / GeV;Photons", 20, 0, 250);
69 
70  m_hists.addHist("jet_n", ";Jet multiplicity;Events", 10, -0.5, 9.5);
71  m_hists.addHist("jet_pt", ";Jet p_{T} / GeV;Jets", 40, 0., 500.);
72  m_hists.addHist("jet_e", ";Jet e / GeV;Jets", 40, 0., 1000.);
73  m_hists.addHist("jet_eta", ";Jet #eta;Jets", 20, -2.5, 2.5);
74  m_hists.addHist("jet_phi", ";Jet #phi;Jets", 20, -M_PI, M_PI);
75  if (m_config->isMC()) {
76  m_hists.addHist("jet_truthflav", ";Jet truth flavor;Jets", 20, 0., 20.);
77  m_hists.addHist("jet_btagSF_DL1dv01_77", ";Jet btag SF;Jets", 100, 0.5, 1.5);
78  }
79  m_hists.addHist("jet_isbtagged_DL1dv01_77", ";Jet is b-tagged;Jets", 2, 0., 2.);
80 
81  m_hists.addHist("jet0_pt", ";Jet0 p_{T} / GeV; Events / 10 GeV", 25, 5, 505);
82  m_hists.addHist("jet0_eta", ";Jet0 #eta; Jets", 25, -2.5, 2.5);
83  m_hists.addHist("jet0_phi", ";Jet0 #phi; Jets", 25, -M_PI, M_PI);
84  m_hists.addHist("jet0_e", ";Jet0 E / GeV; Jets", 100, 0, 1000);
85  if (m_config->isMC()) {
86  m_hists.addHist("jet0_truthflav", ";Jet0 truth flavor;Jets", 20, 0., 20.);
87  m_hists.addHist("jet0_btagSF_DL1dv01_77", ";Jet0 btag SF;Jets", 100, 0.5, 1.5);
88  }
89  m_hists.addHist("jet0_isbtagged_DL1dv01_77", ";Jet is b-tagged;Jets", 2, 0., 2.);
90 
91  m_hists.addHist("jet1_pt", ";Jet1 p_{T} / GeV; Events / 10 GeV", 25, 5, 505);
92  m_hists.addHist("jet1_eta", ";Jet1 #eta; Jets", 25, -2.5, 2.5);
93  m_hists.addHist("jet1_phi", ";Jet1 #phi; Jets", 25, -M_PI, M_PI);
94  m_hists.addHist("jet1_e", ";Jet1 E / GeV; Jets", 100, 0, 1000);
95  if (m_config->isMC()) {
96  m_hists.addHist("jet1_truthflav", ";Jet1 truth flavor;Jets", 20, 0., 20.);
97  m_hists.addHist("jet1_btagSF_DL1dv01_77", ";Jet1 btag SF;Jets", 100, 0.5, 1.5);
98  }
99  m_hists.addHist("jet1_isbtagged_DL1dv01_77", ";Jet is b-tagged;Jets", 2, 0., 2.);
100 
101  m_hists.addHist("jet2_pt", ";Jet2 p_{T} / GeV; Events / 10 GeV", 25, 5, 505);
102  m_hists.addHist("jet2_eta", ";Jet2 #eta; Jets", 25, -2.5, 2.5);
103  m_hists.addHist("jet2_phi", ";Jet2 #phi; Jets", 25, -M_PI, M_PI);
104  m_hists.addHist("jet2_e", ";Jet2 E / GeV; Jets", 100, 0, 1000);
105  if (m_config->isMC()) {
106  m_hists.addHist("jet2_truthflav", ";Jet2 truth flavor;Jets", 20, 0., 20.);
107  m_hists.addHist("jet2_btagSF_DL1dv01_77", ";Jet2 btag SF;Jets", 100, 0.5, 1.5);
108  }
109  m_hists.addHist("jet2_isbtagged_DL1dv01_77", ";Jet is b-tagged;Jets", 2, 0., 2.);
110 
111  m_hists.addHist("jet3_pt", ";Jet3 p_{T} / GeV; Events / 10 GeV", 25, 5, 505);
112  m_hists.addHist("jet3_eta", ";Jet3 #eta; Jets", 25, -2.5, 2.5);
113  m_hists.addHist("jet3_phi", ";Jet3 #phi; Jets", 25, -M_PI, M_PI);
114  m_hists.addHist("jet3_e", ";Jet3 E / GeV; Jets", 100, 0, 1000);
115  if (m_config->isMC()) {
116  m_hists.addHist("jet3_truthflav", ";Jet3 truth flavor;Jets", 20, 0., 20.);
117  m_hists.addHist("jet3_btagSF_DL1dv01_77", ";Jet3 btag SF;Jets", 100, 0.5, 1.5);
118  }
119  m_hists.addHist("jet3_isbtagged_DL1dv01_77", ";Jet is b-tagged;Jets", 2, 0., 2.);
120 
121  //Large-R jet
122  m_hists.addHist("ljet_n", ";Large-R Jet multiplicity; Jets ", 5, 0, 5);
123  m_hists.addHist("ljet_pt", ";Large-R Jet p_{T} / GeV; Jets / 26 GeV", 50, 200, 1500);
124  m_hists.addHist("ljet_eta", ";Large-R Jet #eta; Jets", 15, -2., 2.);
125  m_hists.addHist("ljet_phi", ";Large-R Jet #phi; Jets", 25, -M_PI, M_PI);
126  m_hists.addHist("ljet_m", ";Large-R mass / GeV; Jets/ 10 GeV", 35, 50, 400);
127 
128  m_hists.addHist("taujet_n", ";TauJet multiplicity;Events", 20, -0.5, 19.5);
129  m_hists.addHist("taujet_pt", ";TauJet p_{T} / GeV;TauJet", 20, 0., 200.);
130  m_hists.addHist("taujet_eta", ";TauJet #eta;TauJet", 20, -2.5, 2.5);
131  m_hists.addHist("taujet_phi", ";TauJet #phi;TauJet", 20, -M_PI, M_PI);
132  m_hists.addHist("taujet_charge", ";TauJet charge;TauJet", 3, -1.5, 1.5);
133 
134  m_hists.addHist("event_met_et", ";MET / GeV;Events", 50, 0., 400.);
135  m_hists.addHist("event_met_phi", ";MET #phi;Events", 20, -M_PI, M_PI);
136  }
137 
138  bool ExamplePlots::apply(const top::Event& event) const {
139  //only nominal
140 
141  if (event.m_hashValue != m_nominalHashValue) return true;
142 
143  //only plot tight selection
144  //before, we were plotting tight and loose together
145  if (event.m_isLoose) return true;
146 
147  double eventWeight = 1.;
148  if (top::isSimulation(event)) eventWeight = event.m_info->auxdataConst<float>("AnalysisTop_eventWeight");
149 
150  if (m_config->isMC()) {
151  m_hists.hist("mc_weight")->Fill(eventWeight, eventWeight);
152  m_hists.hist("beamspot_weight")->Fill(event.m_info->beamSpotWeight(), eventWeight);
153  m_hists.hist("jvt_SF")->Fill(event.m_jvtSF, eventWeight);
154 
155  if (m_config->useElectrons() || m_config->useMuons())
156  m_hists.hist("lepton_SF")->Fill(m_sfRetriever->leptonSF(event, topSFSyst::nominal), eventWeight);
157  if (m_config->useGlobalTriggerConfiguration())
158  m_hists.hist("globalTriggerSF")->Fill(m_sfRetriever->globalTriggerSF(event, topSFSyst::nominal), eventWeight);
159  m_hists.hist("triggerSF")->Fill(m_sfRetriever->triggerSF(event, topSFSyst::nominal), eventWeight);
160  if (m_config->useTaus())
161  m_hists.hist("tau_SF")->Fill(m_sfRetriever->tauSF(event, topSFSyst::nominal), eventWeight);
162  if (m_config->usePhotons())
163  m_hists.hist("photon_SF")->Fill(m_sfRetriever->photonSF(event, topSFSyst::nominal), eventWeight);
164 
165  //pileup weight needs pileup reweighting tool to have run
167  event), eventWeight);
168  }
169 
170  m_hists.hist("event_mu")->Fill(event.m_info->averageInteractionsPerCrossing(), eventWeight);
171 
172  m_hists.hist("el_n")->Fill(event.m_electrons.size(), eventWeight);
173  for (const auto* const elPtr : event.m_electrons) {
174  m_hists.hist("el_pt")->Fill(elPtr->pt() * toGeV, eventWeight);
175  m_hists.hist("el_eta")->Fill(elPtr->eta(), eventWeight);
176  m_hists.hist("el_phi")->Fill(elPtr->phi(), eventWeight);
177  m_hists.hist("el_charge")->Fill(elPtr->charge(), eventWeight);
178 
179  //retrieve the truth-matching variables from MCTruthClassifier
180  if (m_config->isMC()) {
181  static SG::AuxElement::Accessor<int> typeel("truthType");
182  if (typeel.isAvailable(*elPtr)) m_hists.hist("el_true_type")->Fill(typeel(*elPtr), eventWeight);
183  }
184 
185  }
186 
187  m_hists.hist("mu_n")->Fill(event.m_muons.size(), eventWeight);
188  for (const auto* const muPtr : event.m_muons) {
189  m_hists.hist("mu_pt")->Fill(muPtr->pt() * toGeV, eventWeight);
190  m_hists.hist("mu_eta")->Fill(muPtr->eta(), eventWeight);
191  m_hists.hist("mu_phi")->Fill(muPtr->phi(), eventWeight);
192 
193  m_hists.hist("mu_charge")->Fill(muPtr->charge(), eventWeight);
194  if (m_config->isMC()) {
195  static SG::AuxElement::Accessor<int> acc_mctt("truthType");
196  if (acc_mctt.isAvailable(*muPtr)) m_hists.hist("mu_true_type")->Fill(acc_mctt(*muPtr), eventWeight);
197  }
198  }
199 
200  m_hists.hist("ph_n")->Fill(event.m_photons.size(), eventWeight);
201  for (const auto* const phPtr : event.m_photons) {
202  m_hists.hist("ph_pt")->Fill(phPtr->pt() * toGeV, eventWeight);
203  m_hists.hist("ph_eta")->Fill(phPtr->eta(), eventWeight);
204  m_hists.hist("ph_phi")->Fill(phPtr->phi(), eventWeight);
205  m_hists.hist("ph_e")->Fill(phPtr->e() * toGeV, eventWeight);
206  }
207 
208  m_hists.hist("jet_n")->Fill(event.m_jets.size(), eventWeight);
209  unsigned int i = 0;
210  std::array<std::string, 4> numbers {{
211  "jet0", "jet1", "jet2", "jet3"
212  }};
213 
214  for (const auto* const jetPtr : event.m_jets) {
215  m_hists.hist("jet_pt")->Fill(jetPtr->pt() * toGeV, eventWeight);
216  m_hists.hist("jet_eta")->Fill(jetPtr->eta(), eventWeight);
217  m_hists.hist("jet_phi")->Fill(jetPtr->phi(), eventWeight);
218  m_hists.hist("jet_e")->Fill(jetPtr->e() * toGeV, eventWeight);
219 
220  int jet_truthflav = -1;
221  if (m_config->isMC()) {
222  if (jetPtr->isAvailable<int>("HadronConeExclTruthLabelID")) {
223  jetPtr->getAttribute("HadronConeExclTruthLabelID", jet_truthflav);
224  m_hists.hist("jet_truthflav")->Fill(jet_truthflav, eventWeight);
225  }
226  }
227 
228  int isbtagged = 0;
229  float btagSF = 1.;
230  bool hasBtagSF = false;
231  const bool hasBtag = jetPtr->isAvailable<char>("isbtagged_DL1dv01_FixedCutBEff_77");
232  if (hasBtag) {
233  isbtagged = jetPtr->auxdataConst<char>("isbtagged_DL1dv01_FixedCutBEff_77");
234  m_hists.hist("jet_isbtagged_DL1dv01_77")->Fill(isbtagged, eventWeight);
235  if (m_config->isMC()) {
236  if (jetPtr->isAvailable<float>("btag_SF_DL1dv01_FixedCutBEff_77_nom")) {
237  btagSF = jetPtr->auxdataConst<float>("btag_SF_DL1dv01_FixedCutBEff_77_nom");
238  m_hists.hist("jet_btagSF_DL1dv01_77")->Fill(btagSF, eventWeight);
239  hasBtagSF = true;
240  }
241  }
242  }
243 
244  if (i < numbers.size()) {
245  m_hists.hist(numbers[i] + "_pt")->Fill(jetPtr->pt() * toGeV, eventWeight);
246  m_hists.hist(numbers[i] + "_eta")->Fill(jetPtr->eta(), eventWeight);
247  m_hists.hist(numbers[i] + "_phi")->Fill(jetPtr->phi(), eventWeight);
248  m_hists.hist(numbers[i] + "_e")->Fill(jetPtr->e() * toGeV, eventWeight);
249  if (hasBtag) m_hists.hist(numbers[i] + "_isbtagged_DL1dv01_77")->Fill(isbtagged, eventWeight);
250  if (m_config->isMC()) {
251  if (hasBtagSF) m_hists.hist(numbers[i] + "_btagSF_DL1dv01_77")->Fill(btagSF, eventWeight);
252  m_hists.hist(numbers[i] + "_truthflav")->Fill(jet_truthflav, eventWeight);
253  }
254  }
255  ++i;
256  }
257 
258  m_hists.hist("ljet_n")->Fill(event.m_largeJets.size(), eventWeight);
259  for (const auto* const jetPtr : event.m_largeJets) {
260  m_hists.hist("ljet_pt")->Fill(jetPtr->pt() * toGeV, eventWeight);
261  m_hists.hist("ljet_eta")->Fill(jetPtr->eta(), eventWeight);
262  m_hists.hist("ljet_phi")->Fill(jetPtr->phi(), eventWeight);
263  m_hists.hist("ljet_m")->Fill(jetPtr->m() * toGeV, eventWeight);
264  }
265 
266  m_hists.hist("taujet_n")->Fill(event.m_tauJets.size(), eventWeight);
267  for (const auto* const tauPtr : event.m_tauJets) {
268  m_hists.hist("taujet_pt")->Fill(tauPtr->pt() * toGeV, eventWeight);
269  m_hists.hist("taujet_eta")->Fill(tauPtr->eta(), eventWeight);
270  m_hists.hist("taujet_phi")->Fill(tauPtr->phi(), eventWeight);
271  m_hists.hist("taujet_charge")->Fill(tauPtr->charge(), eventWeight);
272  }
273 
274  if (event.m_met != nullptr) {
275  m_hists.hist("event_met_et")->Fill(event.m_met->met() * toGeV, eventWeight);
276  m_hists.hist("event_met_phi")->Fill(event.m_met->phi(), eventWeight);
277  }
278 
279  return true;
280  }
281 
282  std::string ExamplePlots::name() const {
283  return "EXAMPLEPLOTS";
284  }
285 }
top::ExamplePlots::m_config
std::shared_ptr< top::TopConfig > m_config
Definition: ExamplePlots.h:64
top
TopConfig A simple configuration that is NOT a singleton.
Definition: AnalysisTrackingHelper.cxx:58
ExamplePlots.h
top::ExamplePlots::ExamplePlots
ExamplePlots(const std::string &name, TFile *outputFile, EL::Worker *wk=nullptr, std::shared_ptr< top::TopConfig > config=nullptr)
Setup some example plots.
Definition: ExamplePlots.cxx:24
SG::Accessor
Helper class to provide type-safe access to aux data.
Definition: Control/AthContainers/AthContainers/Accessor.h:66
top::ScaleFactorRetriever::tauSF
float tauSF(const top::Event &event, const top::topSFSyst SFSyst) const
: get the tauSF for all taus in event
Definition: ScaleFactorRetriever.cxx:1325
top::ScaleFactorRetriever::hasPileupSF
static bool hasPileupSF(const top::Event &event)
Definition: ScaleFactorRetriever.cxx:63
SystematicSet.h
CP::SystematicSet
Class to wrap a set of SystematicVariations.
Definition: SystematicSet.h:31
M_PI
#define M_PI
Definition: ActiveFraction.h:11
config
Definition: PhysicsAnalysis/AnalysisCommon/AssociationUtils/python/config.py:1
EventTools.h
A few functions for doing operations on particles / events. Currently holds code for dR,...
top::ScaleFactorRetriever::leptonSF
float leptonSF(const top::Event &event, const top::topSFSyst SFSyst) const
Definition: ScaleFactorRetriever.cxx:85
compareGeometries.outputFile
string outputFile
Definition: compareGeometries.py:25
EL::Worker
Definition: Worker.h:25
top::ScaleFactorRetriever::triggerSF
float triggerSF(const top::Event &event, const top::topSFSyst SFSyst) const
Definition: ScaleFactorRetriever.cxx:176
event
POOL::TEvent event(POOL::TEvent::kClassAccess)
lumiFormat.i
int i
Definition: lumiFormat.py:92
top::ExamplePlots::toGeV
static const double toGeV
File units are MeV and normally people like plots in GeV.
Definition: ExamplePlots.h:56
top::nominal
@ nominal
Definition: ScaleFactorRetriever.h:29
top::PlotManager::hist
TH1 * hist(const std::string &name) const
Recover an existing histogram, to fill it for example.
Definition: PlotManager.cxx:169
top::isSimulation
bool isSimulation(const top::Event &event)
Is this event MC simulation (True) or data (False)?
Definition: EventTools.cxx:52
TH1::Fill
int Fill(double)
Definition: rootspy.cxx:285
top::ScaleFactorRetriever::photonSF
float photonSF(const top::Event &event, const top::topSFSyst SFSyst) const
: get the photonSF for all photons in event
Definition: ScaleFactorRetriever.cxx:1411
top::ExamplePlots::name
std::string name() const override
Return the name for the cutflow table.
Definition: ExamplePlots.cxx:282
top::ExamplePlots::m_sfRetriever
top::ScaleFactorRetriever * m_sfRetriever
Definition: ExamplePlots.h:65
top::ScaleFactorRetriever::globalTriggerSF
float globalTriggerSF(const top::Event &event, const top::topSFSyst SFSyst) const
Definition: ScaleFactorRetriever.cxx:91
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:195
TopConfig.h
top::PlotManager::addHist
void addHist(const std::string &hname, const std::string &title, int bins, double start, double end) const
Add a 1D histogram to the output file.
Definition: PlotManager.cxx:60
top::ScaleFactorRetriever::pileupSF
static float pileupSF(const top::Event &event, int var=0)
Definition: ScaleFactorRetriever.cxx:68
config
std::vector< std::string > config
Definition: fbtTestBasics.cxx:72
SG::ConstAccessor< T, AuxAllocator_t< T > >::isAvailable
bool isAvailable(const ELT &e) const
Test to see if this variable exists in the store.
top::ExamplePlots::m_nominalHashValue
std::size_t m_nominalHashValue
Definition: ExamplePlots.h:62
top::ExamplePlots::apply
virtual bool apply(const top::Event &event) const override
Fill the histograms.
Definition: ExamplePlots.cxx:138
top::Event
Very simple class to hold event data after reading from a file.
Definition: Event.h:49
ScaleFactorRetriever.h
top::ExamplePlots::m_hists
PlotManager m_hists
Easy access to histograms.
Definition: ExamplePlots.h:59