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!
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
105{
108 bool debug =
false, cmdline_error =
false, toys =
false;
110 {
111 if(
string(argv[i]) ==
"--debug")
debug =
true;
112 else if(string(argv[i]) == "--toys") toys = true;
114 else cmdline_error = true;
115 }
116 if(!filename || cmdline_error)
117 {
119 Error(
MSGSOURCE,
" Usage: %s [--debug] [--toys] [DxAOD file name]", argv[0]);
120 return 1;
121 }
122 #ifdef XAOD_STANDALONE
124 TFile*
file = TFile::Open(filename,
"READ");
126 {
128 return 2;
129 }
132 StatusCode::enableFailure();
133 #else
136 TString
file(filename);
137 #endif
138 event.readFrom(
file).ignore();
139 Long64_t
entries =
event.getEntries();
141
142
143
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;
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();
185 if(
t->initialize() != StatusCode::SUCCESS)
186 {
187 Error(
MSGSOURCE,
"Unable to initialize the electron CP tool <%s>!",
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];
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
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 {
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
242
243
244
247 double nSuitableEvents = 0., sumW = 0.;
250 {
251 event.getEntry(entry);
252
255 event.retrieve(eventInfo,"EventInfo").ignore();
256 unsigned runNumber = periodRuns[uniformPdf(randomEngine)];
257 RandomRunNumberDec(*eventInfo) =
runNumber;
258 vector<const xAOD::Electron*> myTriggeringElectrons;
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));
266 if(pt<10e3f || eta>=2.47) continue;
267 if(!
truthType.isAvailable(*electron))
continue;
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
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
298 auto cc = myTool->getEfficiencyScaleFactor(myTriggeringElectrons,
299 myTriggeringMuons, sf);
301 {
302 nSuitableEvents += 1;
304 }
305 else
306 {
307 Warning(
MSGSOURCE,
"Scale factor evaluation failed");
309 }
310 if(errors>10)
311 {
313 break;
314 }
315 }
316 Info(
MSGSOURCE,
"Average scale factor: %f (over %ld events)",
317 sumW / nSuitableEvents, long(nSuitableEvents));
318 #ifndef XAOD_STANDALONE
320 #endif
322}
Scalar eta() const
pseudorapidity method
@ 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.
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.
int truthOrigin(const U &p)
int truthType(const U &p)
Error
The different types of error that can be flagged in the L1TopoRDO.
IAppMgrUI * Init(const char *options="POOLRootAccess/basic.opts")
Bootstraps (creates and configures) the Gaudi Application with the provided options file.
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.
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".