ATLAS Offline Software
Loading...
Searching...
No Matches
TrigGlobEffCorrExample5b.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 * Another example showing how to configure the tool for photon triggers.
10 * This time for a more complex configuration (asymmetric diphoton trigger);
11 * see also the explanations in the example 1 as the configuration for photon triggers
12 * is very similar to that for electron triggers.
13 */
14
15// ROOT include(s):
16#include <TFile.h>
17#include <TError.h>
18
19// Infrastructure include(s):
20#ifdef XAOD_STANDALONE
21 #include "xAODRootAccess/Init.h"
24#else
27#endif
28
30// EDM include(s):
39
40// stdlib include(s):
41#include <random>
42#include <vector>
43#include <array>
44using std::vector;
45using std::string;
46
47#define MSGSOURCE "Example 5b"
48
51using namespace Test;
52int main(int argc, char* argv[])
53{
55 const char* filename = nullptr;
56 bool debug = false, cmdline_error = false, toys = false;
57 for(int i=1;i<argc;++i)
58 {
59 if(string(argv[i]) == "--debug") debug = true;
60 else if(string(argv[i]) == "--toys") toys = true;
61 else if(!filename && *argv[i]!='-') filename = argv[i];
62 else cmdline_error = true;
63 }
64 if(!filename || cmdline_error)
65 {
66 Error(MSGSOURCE, "No file name received!");
67 Error(MSGSOURCE, " Usage: %s [--debug] [--toys] [DxAOD file name]", argv[0]);
68 return 1;
69 }
70 #ifdef XAOD_STANDALONE
71 xAOD::Init(MSGSOURCE).ignore();
72 TFile* file = TFile::Open(filename, "READ");
73 if(!file)
74 {
75 Error(MSGSOURCE, "Unable to open file!");
76 return 2;
77 }
79 xAOD::TStore store;
80 StatusCode::enableFailure();
81 #else
82 IAppMgrUI* app = POOL::Init();
84 TString file(filename);
85 #endif
86 event.readFrom(file).ignore();
87 Long64_t entries = event.getEntries();
88 Info(MSGSOURCE, "Number of events in the file: %lli", entries);
89
90 /* ********************************************************************** */
91
92 Info(MSGSOURCE, "Configuring the photon CP tools");
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();
121 t->setProperty("ForceDataType", (int)PATCore::ParticleDataType::Full).ignore();
122 if(t->initialize() != StatusCode::SUCCESS)
123 {
124 Error(MSGSOURCE, "Unable to initialize the photon CP tool <%s>!",
125 t->name().c_str());
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
138 Info(MSGSOURCE, "Configuring the global trigger SF tool");
139 asg::AnaToolHandle<ITrigGlobalEfficiencyCorrectionTool> myTool("TrigGlobalEfficiencyCorrectionTool/TrigGlobal");
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 {
152 Error(MSGSOURCE, "Unable to initialize the TrigGlob tool!");
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
176 Info(MSGSOURCE, "Starting the event loop");
177 unsigned errors = 0;
178 double nSuitableEvents = 0., sumW = 0.;
179 static const SG::Decorator<unsigned> RandomRunNumberDec("RandomRunNumber");
180 static const SG::ConstAccessor<int> truthTypeAcc("truthType");
181 for(Long64_t entry = 0; entry < entries; ++entry)
182 {
183 event.getEntry(entry);
184
186 const xAOD::EventInfo* eventInfo = nullptr;
187 event.retrieve(eventInfo,"EventInfo").ignore();
188 unsigned runNumber = periodRuns[uniformPdf(randomEngine)];
189 RandomRunNumberDec(*eventInfo) = runNumber;
190
191 vector<const xAOD::Photon*> myTriggeringPhotons;
192 const xAOD::PhotonContainer* photons = nullptr;
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));
199 float pt = photon->pt();
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
213 double sf = 1.;
214 auto cc = myTool->getEfficiencyScaleFactor(myTriggeringPhotons, sf);
216 {
217 nSuitableEvents += 1;
218 sumW += sf;
219 }
220 else
221 {
222 Warning(MSGSOURCE, "Scale factor evaluation failed");
223 ++errors;
224 }
225 if(errors>10)
226 {
227 Error(MSGSOURCE, "Too many errors reported!");
228 break;
229 }
230 }
231 Info(MSGSOURCE, "Average scale factor: %f (over %ld events)",
232 sumW / nSuitableEvents, long(nSuitableEvents));
233 #ifndef XAOD_STANDALONE
234 ANA_CHECK(app->finalize());
235 #endif
236 return errors? 4 : 0;
237}
Scalar eta() const
pseudorapidity method
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
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
PhotonContainer_v1 PhotonContainer
Definition of the current "photon container version".
EventInfo_v1 EventInfo
Definition of the latest event info version.
#define MSGSOURCE
Test code to test ElectronPhotonVariableCorrectionTool Dictionaries.
TFile * file