ATLAS Offline Software
Loading...
Searching...
No Matches
TrigGlobEffCorrExample0.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3*/
4
8/*
9 * Simple example: single electron or single muon trigger, using different
10 * triggers for 2015 and 2016-2018.
11 *
12 */
13
14// ROOT include(s):
15#include <TFile.h>
16#include <TError.h>
17
18// Infrastructure include(s):
19#ifdef XAOD_STANDALONE
20 #include "xAODRootAccess/Init.h"
23#else
26#endif
28// EDM include(s):
40
41// stdlib include(s):
42#include <random>
43#include <vector>
44#include <array>
45using std::vector;
46using std::string;
47
48#define MSGSOURCE "Example 0"
49
52using namespace Test;
53int main(int argc, char* argv[])
54{
56 const char* filename = nullptr;
57 bool debug = false, cmdline_error = false, toys = false;
58 for(int i=1;i<argc;++i)
59 {
60 if(string(argv[i]) == "--debug") debug = true;
61 else if(string(argv[i]) == "--toys") toys = true;
62 else if(!filename && *argv[i]!='-') filename = argv[i];
63 else cmdline_error = true;
64 }
65 if(!filename || cmdline_error)
66 {
67 Error(MSGSOURCE, "No file name received!");
68 Error(MSGSOURCE, " Usage: %s [--debug] [--toys] [DxAOD file name]", argv[0]);
69 return 1;
70 }
71 #ifdef XAOD_STANDALONE
72 xAOD::Init(MSGSOURCE).ignore();
73 TFile* file = TFile::Open(filename, "READ");
74 if(!file)
75 {
76 Error(MSGSOURCE, "Unable to open file!");
77 return 2;
78 }
80 xAOD::TStore store;
81 StatusCode::enableFailure();
82 #else
83 IAppMgrUI* app = POOL::Init();
85 TString file(filename);
86 #endif
87 event.readFrom(file).ignore();
88 Long64_t entries = event.getEntries();
89 Info(MSGSOURCE, "Number of events in the file: %lli", entries);
90
91 /* ********************************************************************** */
92
93 Info(MSGSOURCE, "Configuring the electron CP tools");
95 ToolHandleArray<IAsgElectronEfficiencyCorrectionTool> electronEffTools;
97 ToolHandleArray<IAsgElectronEfficiencyCorrectionTool> electronSFTools;
99 vector<asg::AnaToolHandle<IAsgElectronEfficiencyCorrectionTool>> factory;
100 const char* mapPath = "ElectronEfficiencyCorrection/2015_2017/"
101 "rel21.2/Consolidation_September2018_v1/map1.txt";
102 for(int j=0;j<2;++j)
103 {
104 string name = "AsgElectronEfficiencyCorrectionTool/"
105 + ((j? "ElTrigEff_" : "ElTrigSF_")
106 + std::to_string(factory.size()/2));
107 auto t = factory.emplace(factory.end(), name);
108 t->setProperty("MapFilePath", mapPath).ignore();
109 t->setProperty("TriggerKey", string(j?"":"Eff_")
110 + "SINGLE_E_2015_e24_lhmedium_L1EM20VH_OR_e60_lhmedium_OR_e120_lhloose_2016_2018_e26_lhtight_nod0_ivarloose_OR_e60_lhmedium_nod0_OR_e140_lhloose_nod0").ignore();
111 t->setProperty("IdKey", "Tight").ignore();
112 t->setProperty("IsoKey", "FCTight").ignore();
113 t->setProperty("CorrelationModel", "TOTAL").ignore();
114 t->setProperty("ForceDataType", (int)PATCore::ParticleDataType::Full).ignore();
115 if(t->initialize() != StatusCode::SUCCESS)
116 {
117 Error(MSGSOURCE, "Unable to initialize the electron CP tool <%s>!",
118 t->name().c_str());
119 return 3;
120 }
121 auto& handles = (j? electronSFTools : electronEffTools);
122 handles.push_back(t->getHandle());
123 }
124
125 /* ********************************************************************** */
126
127 Info(MSGSOURCE, "Configuring the muon CP tools");
129 ToolHandleArray<CP::IMuonTriggerScaleFactors> muonTools;
130 asg::AnaToolHandle<CP::IMuonTriggerScaleFactors> muonTool("CP::MuonTriggerScaleFactors/MuonTrigEff");
131 muonTool.setProperty("MuonQuality", "Tight").ignore();
132 muonTool.setProperty("useRel207", false).ignore();
133 if(muonTool.initialize() != StatusCode::SUCCESS)
134 {
135 Error(MSGSOURCE, "Unable to initialize the muon CP tool!");
136 return 3;
137 }
138 muonTools.push_back(muonTool.getHandle());
139
140 /* ********************************************************************** */
141
142 Info(MSGSOURCE, "Configuring the global trigger SF tool");
143 asg::AnaToolHandle<ITrigGlobalEfficiencyCorrectionTool> myTool("TrigGlobalEfficiencyCorrectionTool/TrigGlobal");
144 myTool.setProperty("ElectronEfficiencyTools", electronEffTools).ignore();
145 myTool.setProperty("ElectronScaleFactorTools", electronSFTools).ignore();
146 myTool.setProperty("MuonTools", muonTools).ignore();
147 const char* triggers2015 =
148 "mu20_iloose_L1MU15_OR_mu50"
149 "|| e24_lhmedium_L1EM20VH_OR_e60_lhmedium_OR_e120_lhloose";
150 myTool.setProperty("TriggerCombination2015", triggers2015).ignore();
151 const char* triggers2016to2018 =
152 "mu26_ivarmedium_OR_mu50"
153 "|| e26_lhtight_nod0_ivarloose_OR_e60_lhmedium_nod0_OR_e140_lhloose_nod0";
154 myTool.setProperty("TriggerCombination2016", triggers2016to2018).ignore();
155 myTool.setProperty("TriggerCombination2017", triggers2016to2018).ignore();
156 myTool.setProperty("TriggerCombination2018", triggers2016to2018).ignore();
157
158 if(debug) myTool.setProperty("OutputLevel", MSG::DEBUG).ignore();
159 if(toys) myTool.setProperty("NumberOfToys", 1000).ignore();
160 if(myTool.initialize() != StatusCode::SUCCESS)
161 {
162 Error(MSGSOURCE, "Unable to initialize the TrigGlob tool!");
163 return 3;
164 }
165
168 const unsigned periodRuns[] = {
170 276073, 278727, 279932, 280423, 281130, 282625,
172 296939, 300345, 301912, 302737, 303638, 303943, 305291, 307124,
173 305359, 309311, 310015,
175 325713, 329385, 330857, 332720, 334842, 336497, 336832, 338183,
177 348885, 349534, 350310, 352274, 354107, 354826, 355261, 355331,
178 355529, 357050, 359191, 361635, 361738, 363664
179 };
180 std::uniform_int_distribution<unsigned> uniformPdf(0,
181 sizeof(periodRuns)/sizeof(*periodRuns) - 1);
182 std::default_random_engine randomEngine;
183
184 static const SG::ConstAccessor<int> truthType("truthType");
185 static const SG::ConstAccessor<int> truthOrigin("truthOrigin");
186
187 /* ********************************************************************** */
188
189 Info(MSGSOURCE, "Starting the event loop");
190 unsigned errors = 0;
191 double nSuitableEvents = 0., sumW = 0.;
192 static const SG::Decorator<unsigned> RandomRunNumberDec("RandomRunNumber");
193 for(Long64_t entry = 0; entry < entries; ++entry)
194 {
195 event.getEntry(entry);
196
198 const xAOD::EventInfo* eventInfo = nullptr;
199 event.retrieve(eventInfo,"EventInfo").ignore();
200 unsigned runNumber = periodRuns[uniformPdf(randomEngine)];
201 RandomRunNumberDec(*eventInfo) = runNumber;
202 vector<const xAOD::Electron*> myTriggeringElectrons;
203 const xAOD::ElectronContainer* electrons = nullptr;
204 event.retrieve(electrons,"Electrons").ignore();
205 for(auto electron : *electrons)
206 {
207 if(!electron->caloCluster()) continue;
208 float eta = fabs(electron->caloCluster()->etaBE(2));
209 float pt = electron->pt();
210 if(pt<10e3f || eta>=2.47) continue;
211 if(!truthType.isAvailable(*electron)) continue;
212 if(!truthOrigin.isAvailable(*electron)) continue;
213 int t = truthType(*electron), o = truthOrigin(*electron);
214 if(t!=2 || !(o==10 || (o>=12 && o<=22) || o==43)) continue;
216 if(pt < (runNumber>290000? 27e3f : 25e3f)) continue;
217
218 myTriggeringElectrons.push_back(electron);
219 }
220
221 vector<const xAOD::Muon*> myTriggeringMuons;
222 const xAOD::MuonContainer* muons = nullptr;
223 event.retrieve(muons,"Muons").ignore();
224 for(auto muon : *muons)
225 {
226 float pt = muon->pt();
227 if(pt<10e3f || fabs(muon->eta())>=2.5) continue;
228 auto mt = muon->muonType();
229 if(mt!=xAOD::Muon::Combined && mt!=xAOD::Muon::MuonStandAlone) continue;
230 auto& mtp = *(muon->primaryTrackParticle());
231 if(!truthType.isAvailable(mtp)) continue;
232 if(!truthOrigin.isAvailable(mtp)) continue;
233 int t = truthType(mtp), o = truthOrigin(mtp);
234 if(t!=6 || !(o==10 || (o>=12 && o<=22) || o==43)) continue;
236 if(pt < (runNumber>290000? 27.3e3f : 21e3f)) continue;
237
238 myTriggeringMuons.push_back(muon);
239 }
240
242 if(myTriggeringElectrons.size()+myTriggeringMuons.size() < 1) continue;
243
244
246 double sf = 1.;
247 auto cc = myTool->getEfficiencyScaleFactor(myTriggeringElectrons,
248 myTriggeringMuons, sf);
250 {
251 nSuitableEvents += 1;
252 sumW += sf;
253 }
254 else
255 {
256 Warning(MSGSOURCE, "Scale factor evaluation failed");
257 ++errors;
258 }
259 if(errors>10)
260 {
261 Error(MSGSOURCE, "Too many errors reported!");
262 break;
263 }
264 }
265 Info(MSGSOURCE, "Average scale factor: %f (over %ld events)",
266 sumW / nSuitableEvents, long(nSuitableEvents));
267 #ifndef XAOD_STANDALONE
268 ANA_CHECK(app->finalize());
269 #endif
270 return errors? 4 : 0;
271}
272
Scalar eta() const
pseudorapidity method
Base class for elements of a container that can have aux data.
Helper class to provide constant type-safe access to aux data.
macros for messaging and checking status codes
#define ANA_CHECK(EXP)
check whether the given expression was successful
#define ANA_MSG_HEADER(NAME)
for standalone code this creates a new message category
#define ANA_MSG_SOURCE(NAME, TITLE)
the source code part of ANA_MSG_SOURCE
#define ANA_CHECK_SET_TYPE(TYPE)
set the type for ANA_CHECK to report failures
Helper class to provide type-safe access to aux data.
const bool debug
@ Ok
The correction was done successfully.
Helper class to provide constant type-safe access to aux data.
Helper class to provide type-safe access to aux data.
Definition Decorator.h:59
a modified tool handle that allows its owner to configure new tools from the C++ side
StatusCode setProperty(const std::string &property, const T2 &value)
set the given property of the tool.
StatusCode initialize()
initialize the tool
const ToolHandle< T > & getHandle() const noexcept
the tool handle we wrap
Tool for accessing xAOD files outside of Athena.
@ kClassAccess
Access auxiliary data using the aux containers.
A relatively simple transient store for objects created in analysis.
Definition TStore.h:45
int main()
Definition hello.cxx:18
double entries
Definition listroot.cxx:49
IAppMgrUI * Init(const char *options="POOLRootAccess/basic.opts")
Bootstraps (creates and configures) the Gaudi Application with the provided options file.
StatusCode Init(const char *appname)
Function initialising ROOT/PyROOT for using the ATLAS EDM.
Definition Init.cxx:31
ElectronContainer_v1 ElectronContainer
Definition of the current "electron container version".
EventInfo_v1 EventInfo
Definition of the latest event info version.
MuonContainer_v1 MuonContainer
Definition of the current "Muon container version".
#define MSGSOURCE
Test code to test ElectronPhotonVariableCorrectionTool Dictionaries.
TFile * file