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

Go to the source code of this file.

Macros

#define MSGSOURCE   "Example 3a"

Functions

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

Macro Definition Documentation

◆ MSGSOURCE

#define MSGSOURCE   "Example 3a"

Definition at line 99 of file TrigGlobEffCorrExample3a.cxx.

Function Documentation

◆ main()

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

For property 'ElectronEfficiencyTools':

For property 'ElectronScaleFactorTools':

For property 'ListOfLegsPerTool':

For property 'ListOfTagsPerTool':

For property 'ElectronLegsPerTag':

To tag the leading electron as 'Signal'

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

<key in map file>, <PID WP>, <iso WP> For leading electron:

For subleading electron(s):

one instance per trigger leg x working point

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

Safer to retrieve the name from the final ToolHandle, it might be prefixed (by the parent tool name) when the handle is copied

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

2015 periods D-H, J

Get a random run number, and decorate the event info

electron must be above softest trigger threshold (e12 here)

Events must contain at least two lepton above trigger threshold

Let's pretend that the leading electron passes TightLH+isolation, thus the event passes the selection; now we tag the electrons:

Leading electron tagged as 'Signal' -> decorated value set to 1 Subleading electron(s) not tagged -> decorated value set to 0

Finally retrieve the global trigger scale factor

Definition at line 104 of file TrigGlobEffCorrExample3a.cxx.

105{
107 const char* filename = nullptr;
108 bool debug = false, cmdline_error = false, toys = false;
109 for(int i=1;i<argc;++i)
110 {
111 if(string(argv[i]) == "--debug") debug = true;
112 else if(string(argv[i]) == "--toys") toys = true;
113 else if(!filename && *argv[i]!='-') filename = argv[i];
114 else cmdline_error = true;
115 }
116 if(!filename || cmdline_error)
117 {
118 Error(MSGSOURCE, "No file name received!");
119 Error(MSGSOURCE, " Usage: %s [--debug] [--toys] [DxAOD file name]", argv[0]);
120 return 1;
121 }
122 #ifdef XAOD_STANDALONE
123 xAOD::Init(MSGSOURCE).ignore();
124 TFile* file = TFile::Open(filename, "READ");
125 if(!file)
126 {
127 Error(MSGSOURCE, "Unable to open file!");
128 return 2;
129 }
132 StatusCode::enableFailure();
133 #else
134 IAppMgrUI* app = POOL::Init();
136 TString file(filename);
137 #endif
138 event.readFrom(file).ignore();
139 Long64_t entries = event.getEntries();
140 Info(MSGSOURCE, "Number of events in the file: %lli", entries);
141
142 /* ********************************************************************** */
143
144 Info(MSGSOURCE, "Configuring the electron CP tools");
146 ToolHandleArray<IAsgElectronEfficiencyCorrectionTool> electronEffTools;
148 ToolHandleArray<IAsgElectronEfficiencyCorrectionTool> electronSFTools;
150 std::map<std::string,std::string> legsPerTool;
152 std::map<std::string,std::string> tagsPerTool;
154 std::map<std::string,std::string> legsPerTag;
156 static const SG::Decorator<char> dec_signal("Signal");
157
159 vector<asg::AnaToolHandle<IAsgElectronEfficiencyCorrectionTool>> factory;
160 enum{ cLEGS, cTAG, cKEY, cPID, cISO };
161 std::vector<std::array<std::string,5> > toolConfigs = {
164 {"e12_lhloose_L1EM10VH", "Signal", "2015_e12_lhloose_L1EM10VH", "Tight", "FixedCutTightTrackOnly"},
166 {"e12_lhloose_L1EM10VH", "*", "2015_e12_lhloose_L1EM10VH", "LooseBLayer", ""}
167 };
168
169 const char* mapPath = "ElectronEfficiencyCorrection/2015_2017/"
170 "rel21.2/Moriond_February2018_v2/map6.txt";
171 for(auto& cfg : toolConfigs)
172 for(int j=0;j<2;++j)
173 {
174 string name = "AsgElectronEfficiencyCorrectionTool/"
175 + ((j? "ElTrigEff_" : "ElTrigSF_")
176 + std::to_string(factory.size()/2));
177 auto t = factory.emplace(factory.end(), name);
178 t->setProperty("MapFilePath", mapPath).ignore();
179 t->setProperty("TriggerKey", string(j?"":"Eff_") + cfg[cKEY]).ignore();
180 t->setProperty("IdKey", cfg[cPID]).ignore();
181 t->setProperty("IsoKey", cfg[cISO]).ignore();
182
183 t->setProperty("CorrelationModel", "TOTAL").ignore();
184 t->setProperty("ForceDataType", (int)PATCore::ParticleDataType::Full).ignore();
185 if(t->initialize() != StatusCode::SUCCESS)
186 {
187 Error(MSGSOURCE, "Unable to initialize the electron CP tool <%s>!",
188 t->name().c_str());
189 return 3;
190 }
191 auto& handles = (j? electronSFTools : electronEffTools);
192 handles.push_back(t->getHandle());
195 name = handles[handles.size()-1].name();
196 legsPerTool[name] = cfg[cLEGS];
197 tagsPerTool[name] = cfg[cTAG];
198 if(!j)
199 {
200 for(auto& tag : ::split_comma_delimited(cfg[cTAG]))
201 {
202 if(legsPerTag[tag]=="") legsPerTag[tag] = cfg[cLEGS];
203 else legsPerTag[tag] += "," + cfg[cLEGS];
204 }
205 }
206
207 }
208
209 /* ********************************************************************** */
210
211 Info(MSGSOURCE, "Configuring the global trigger SF tool");
212 asg::AnaToolHandle<ITrigGlobalEfficiencyCorrectionTool> myTool("TrigGlobalEfficiencyCorrectionTool/TrigGlobal");
213 myTool.setProperty("ElectronEfficiencyTools", electronEffTools).ignore();
214 myTool.setProperty("ElectronScaleFactorTools", electronSFTools).ignore();
215 const char* triggers2015 = "2e12_lhloose_L12EM10VH";
216 myTool.setProperty("TriggerCombination2015", triggers2015).ignore();
217 myTool.setProperty("LeptonTagDecorations", "Signal").ignore();
218 myTool.setProperty("ListOfLegsPerTool", legsPerTool).ignore();
219 myTool.setProperty("ListOfTagsPerTool", tagsPerTool).ignore();
220 myTool.setProperty("ListOfLegsPerTag", legsPerTag).ignore();
221
222 if(debug) myTool.setProperty("OutputLevel", MSG::DEBUG).ignore();
223 if(toys) myTool.setProperty("NumberOfToys", 1000).ignore();
224 if(myTool.initialize() != StatusCode::SUCCESS)
225 {
226 Error(MSGSOURCE, "Unable to initialize the TrigGlob tool!");
227 return 3;
228 }
229
232 const unsigned periodRuns[] = {
234 276073, 278727, 279932, 280423, 281130, 282625
235 };
236 std::uniform_int_distribution<unsigned> uniformPdf(0,
237 sizeof(periodRuns)/sizeof(*periodRuns) - 1);
238 std::default_random_engine randomEngine;
239
240 static const SG::ConstAccessor<int> truthType("truthType");
241 static const SG::ConstAccessor<int> truthOrigin("truthOrigin");
242
243 /* ********************************************************************** */
244
245 Info(MSGSOURCE, "Starting the event loop");
246 unsigned errors = 0;
247 double nSuitableEvents = 0., sumW = 0.;
248 static const SG::Decorator<unsigned> RandomRunNumberDec("RandomRunNumber");
249 for(Long64_t entry = 0; entry < entries; ++entry)
250 {
251 event.getEntry(entry);
252
254 const xAOD::EventInfo* eventInfo = nullptr;
255 event.retrieve(eventInfo,"EventInfo").ignore();
256 unsigned runNumber = periodRuns[uniformPdf(randomEngine)];
257 RandomRunNumberDec(*eventInfo) = runNumber;
258 vector<const xAOD::Electron*> myTriggeringElectrons;
259 const xAOD::ElectronContainer* electrons = nullptr;
260 event.retrieve(electrons,"Electrons").ignore();
261 for(auto electron : *electrons)
262 {
263 if(!electron->caloCluster()) continue;
264 float eta = fabs(electron->caloCluster()->etaBE(2));
265 float pt = electron->pt();
266 if(pt<10e3f || eta>=2.47) continue;
267 if(!truthType.isAvailable(*electron)) continue;
268 if(!truthOrigin.isAvailable(*electron)) continue;
269 int t = truthType(*electron), o = truthOrigin(*electron);
270 if(t!=2 || !(o==10 || (o>=12 && o<=22) || o==43)) continue;
272 if(pt < 13e3f) continue;
273
274 myTriggeringElectrons.push_back(electron);
275 }
276
277 vector<const xAOD::Muon*> myTriggeringMuons;
278
280 if(myTriggeringElectrons.size() < 2) continue;
281
284 auto compareByPt = [](const xAOD::Electron*e1, const xAOD::Electron*e2)
285 { return e1->pt() < e2->pt(); };
286 auto leadingElectron = *std::max_element(myTriggeringElectrons.begin(),
287 myTriggeringElectrons.end(), compareByPt);
288 for(auto electron : myTriggeringElectrons)
289 {
292 dec_signal(*electron) = (electron==leadingElectron)? 1 : 0;
293 }
294
295
297 double sf = 1.;
298 auto cc = myTool->getEfficiencyScaleFactor(myTriggeringElectrons,
299 myTriggeringMuons, sf);
301 {
302 nSuitableEvents += 1;
303 sumW += sf;
304 }
305 else
306 {
307 Warning(MSGSOURCE, "Scale factor evaluation failed");
308 ++errors;
309 }
310 if(errors>10)
311 {
312 Error(MSGSOURCE, "Too many errors reported!");
313 break;
314 }
315 }
316 Info(MSGSOURCE, "Average scale factor: %f (over %ld events)",
317 sumW / nSuitableEvents, long(nSuitableEvents));
318 #ifndef XAOD_STANDALONE
319 ANA_CHECK(app->finalize());
320 #endif
321 return errors? 4 : 0;
322}
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
double e2(const xAOD::CaloCluster &cluster)
return the uncorrected cluster energy in 2nd sampling
double e1(const xAOD::CaloCluster &cluster)
return the uncorrected cluster energy in 1st sampling
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.
Electron_v1 Electron
Definition of the current "egamma version".
#define MSGSOURCE
Test code to test ElectronPhotonVariableCorrectionTool Dictionaries.
TFile * file