ATLAS Offline Software
Loading...
Searching...
No Matches
TrigGlobEffCorrExample0.cxx File Reference

Go to the source code of this file.

Macros

#define MSGSOURCE   "Example 0"

Functions

int main (int argc, char *argv[])

Macro Definition Documentation

◆ MSGSOURCE

#define MSGSOURCE   "Example 0"

Definition at line 48 of file TrigGlobEffCorrExample0.cxx.

Function Documentation

◆ main()

int main ( int argc,
char * argv[] )

For property 'ElectronEfficiencyTools':

For property 'ElectronScaleFactorTools':

RAII on-the-fly creation of electron CP tools:

two instances: 0 -> MC efficiencies, 1 -> SFs

For property 'MuonTools':

Uniform random run number generation spanning the target dataset. In real life, use the PileupReweightingTool instead!

2015 periods D-H, J

2016 periods A-L

2017 periods B-K

2018 periods B-Q

Get a random run number, and decorate the event info

lepton must be above trigger threshold:

lepton must be above trigger threshold:

Events must contain at least one lepton above trigger threshold

Finally retrieve the global trigger scale factor

Definition at line 53 of file TrigGlobEffCorrExample0.cxx.

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 }
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}
Scalar eta() const
pseudorapidity method
#define ANA_CHECK(EXP)
check whether the given expression was successful
#define ANA_CHECK_SET_TYPE(TYPE)
set the type for ANA_CHECK to report failures
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
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
double entries
Definition listroot.cxx:49
int truthOrigin(const U &p)
int truthType(const U &p)
Error
The different types of error that can be flagged in the L1TopoRDO.
Definition Error.h:16
IAppMgrUI * Init(const char *options="POOLRootAccess/basic.opts")
Bootstraps (creates and configures) the Gaudi Application with the provided options file.
TestStore store
Definition TestStore.cxx:23
@ Info
Definition ZDCMsg.h:20
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