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!
53{
56 bool debug =
false, cmdline_error =
false, toys =
false;
58 {
59 if(
string(argv[i]) ==
"--debug")
debug =
true;
60 else if(string(argv[i]) == "--toys") toys = true;
62 else cmdline_error = true;
63 }
64 if(!filename || cmdline_error)
65 {
67 Error(
MSGSOURCE,
" Usage: %s [--debug] [--toys] [DxAOD file name]", argv[0]);
68 return 1;
69 }
70 #ifdef XAOD_STANDALONE
72 TFile*
file = TFile::Open(filename,
"READ");
74 {
76 return 2;
77 }
80 StatusCode::enableFailure();
81 #else
84 TString
file(filename);
85 #endif
86 event.readFrom(
file).ignore();
87 Long64_t
entries =
event.getEntries();
89
90
91
94 ToolHandleArray<IAsgPhotonEfficiencyCorrectionTool> photonEffTools;
96 ToolHandleArray<IAsgPhotonEfficiencyCorrectionTool> photonSFTools;
98 std::map<string,string> legsPerTool;
99
101 vector<asg::AnaToolHandle<IAsgPhotonEfficiencyCorrectionTool>> factory;
102 enum{ cLEGS, cKEY };
103 vector<std::array<string,2>> toolConfigs = {
105 {"g35_loose, g35_medium_L1EM20VH", "DI_PH_2015_g35_loose_2016_g35_loose_2017_g35_medium_L1EM20VH_2018_g35_medium_L1EM20VH"},
106 {"g25_loose, g25_medium_L1EM20VH", "DI_PH_2015_g25_loose_2016_g25_loose_2017_g25_medium_L1EM20VH_2018_g25_medium_L1EM20VH"}
107 };
108
109 const char* mapPath = "PhotonEfficiencyCorrection/2015_2018/"
110 "rel21.2/Summer2018_Rec_v1/map1.txt";
111 for(auto& cfg : toolConfigs)
112 for(int j=0;j<2;++j)
113 {
114 string name =
"AsgPhotonEfficiencyCorrectionTool/"
115 + ((j? "PhTrigEff_" : "PhTrigSF_")
116 + std::to_string(factory.size()/2));
117 auto t = factory.emplace(factory.end(), name);
118 t->setProperty(
"MapFilePath", mapPath).ignore();
119 t->setProperty(
"TriggerKey",
string(j?
"":
"Eff_") + cfg[cKEY]).ignore();
120 t->setProperty(
"IsoKey",
"Loose").ignore();
122 if(
t->initialize() != StatusCode::SUCCESS)
123 {
126 return 3;
127 }
128 auto& handles = (j? photonSFTools : photonEffTools);
129 handles.push_back(
t->getHandle());
132 name = handles[handles.size()-1].name();
133 legsPerTool[
name] =
cfg[cLEGS];
134 }
135
136
137
140 myTool.setProperty("PhotonEfficiencyTools", photonEffTools).ignore();
141 myTool.setProperty("PhotonScaleFactorTools", photonSFTools).ignore();
142 myTool.setProperty("TriggerCombination2015", "g35_loose_g25_loose").ignore();
143 myTool.setProperty("TriggerCombination2016", "g35_loose_g25_loose").ignore();
144 myTool.setProperty("TriggerCombination2017", "g35_medium_g25_medium_L12EM20VH").ignore();
145 myTool.setProperty("TriggerCombination2018", "g35_medium_g25_medium_L12EM20VH").ignore();
146 myTool.setProperty("ListOfLegsPerTool", legsPerTool).ignore();
147
148 if(
debug) myTool.setProperty(
"OutputLevel", MSG::DEBUG).ignore();
149 if(toys) myTool.setProperty("NumberOfToys", 1000).ignore();
150 if(myTool.initialize() != StatusCode::SUCCESS)
151 {
153 return 3;
154 }
155
158 const unsigned periodRuns[] = {
160 276262, 278727, 279932, 280423, 281130, 282625,
162 297730, 300345, 301912, 302737, 303638, 303943, 305291, 307124,
163 305359, 309311, 310015,
165 325713, 329385, 330857, 332720, 334842, 336497, 336832, 338183,
167 348885, 349534, 350310, 352274, 354107, 354826, 355261, 355331,
168 355529, 357050, 359191
169 };
170 std::uniform_int_distribution<unsigned> uniformPdf(0,
171 sizeof(periodRuns)/sizeof(*periodRuns) - 1);
172 std::default_random_engine randomEngine;
173
174
175
178 double nSuitableEvents = 0., sumW = 0.;
182 {
183 event.getEntry(entry);
184
187 event.retrieve(eventInfo,"EventInfo").ignore();
188 unsigned runNumber = periodRuns[uniformPdf(randomEngine)];
189 RandomRunNumberDec(*eventInfo) =
runNumber;
190
191 vector<const xAOD::Photon*> myTriggeringPhotons;
193 event.retrieve(photons,"Photons").ignore();
194 unsigned n36 = 0;
195 for(auto photon : *photons)
196 {
197 if(!
photon->caloCluster())
continue;
198 float eta = fabs(
photon->caloCluster()->etaBE(2));
200 if(pt<10e3f || eta>=2.37 || (
eta>1.37 &&
eta<1.52))
continue;
201 int t = truthTypeAcc(*photon);
202 if(t!=14) continue;
204 if(pt < 26e3f) continue;
205 myTriggeringPhotons.push_back(photon);
206 if(pt > 36e3f) ++n36;
207 }
208
210 if(myTriggeringPhotons.size()<2 || n36<1) continue;
211
214 auto cc = myTool->getEfficiencyScaleFactor(myTriggeringPhotons, sf);
216 {
217 nSuitableEvents += 1;
219 }
220 else
221 {
222 Warning(
MSGSOURCE,
"Scale factor evaluation failed");
224 }
225 if(errors>10)
226 {
228 break;
229 }
230 }
231 Info(
MSGSOURCE,
"Average scale factor: %f (over %ld events)",
232 sumW / nSuitableEvents, long(nSuitableEvents));
233 #ifndef XAOD_STANDALONE
235 #endif
237}
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.
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.
StatusCode Init(const char *appname)
Function initialising ROOT/PyROOT for using the ATLAS EDM.
PhotonContainer_v1 PhotonContainer
Definition of the current "photon container version".
EventInfo_v1 EventInfo
Definition of the latest event info version.