ATLAS Offline Software
Loading...
Searching...
No Matches
TrigGlobEffCorrExample5a.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 * This example shows how to configure the tool for photon triggers.
10 * Here, the minimal configuration is shown (one symmetric diphoton trigger)
11 */
12
13// ROOT include(s):
14#include <TFile.h>
15#include <TError.h>
16
17// Infrastructure include(s):
18#ifdef XAOD_STANDALONE
19 #include "xAODRootAccess/Init.h"
22#else
25#endif
26
28// EDM include(s):
37
38// stdlib include(s):
39#include <random>
40#include <vector>
41#include <array>
42using std::vector;
43using std::string;
44
45#define MSGSOURCE "Example 5a"
46
49using namespace Test;
50int main(int argc, char* argv[])
51{
53 const char* filename = nullptr;
54 bool debug = false, cmdline_error = false, toys = false;
55 for(int i=1;i<argc;++i)
56 {
57 if(string(argv[i]) == "--debug") debug = true;
58 else if(string(argv[i]) == "--toys") toys = true;
59 else if(!filename && *argv[i]!='-') filename = argv[i];
60 else cmdline_error = true;
61 }
62 if(!filename || cmdline_error)
63 {
64 Error(MSGSOURCE, "No file name received!");
65 Error(MSGSOURCE, " Usage: %s [--debug] [--toys] [DxAOD file name]", argv[0]);
66 return 1;
67 }
68 #ifdef XAOD_STANDALONE
69 xAOD::Init(MSGSOURCE).ignore();
70 TFile* file = TFile::Open(filename, "READ");
71 if(!file)
72 {
73 Error(MSGSOURCE, "Unable to open file!");
74 return 2;
75 }
77 xAOD::TStore store;
78 StatusCode::enableFailure();
79 #else
80 IAppMgrUI* app = POOL::Init();
82 TString file(filename);
83 #endif
84 event.readFrom(file).ignore();
85 Long64_t entries = event.getEntries();
86 Info(MSGSOURCE, "Number of events in the file: %lli", entries);
87
88 /* ********************************************************************** */
89
90 Info(MSGSOURCE, "Configuring the photon CP tools");
92 ToolHandleArray<IAsgPhotonEfficiencyCorrectionTool> photonEffTools;
94 ToolHandleArray<IAsgPhotonEfficiencyCorrectionTool> photonSFTools;
95
97 vector<asg::AnaToolHandle<IAsgPhotonEfficiencyCorrectionTool>> factory;
98
99 const char* mapPath = "PhotonEfficiencyCorrection/2015_2018/"
100 "rel21.2/Summer2018_Rec_v1/map1.txt";
101 for(int j=0;j<2;++j)
102 {
103 string name = "AsgPhotonEfficiencyCorrectionTool/" + std::string(j? "PhTrigEff" : "PhTrigSF");
104 auto t = factory.emplace(factory.end(), name);
105 t->setProperty("MapFilePath", mapPath).ignore();
106 t->setProperty("TriggerKey", string(j?"":"Eff_") + "DI_PH_2015_2016_g20_tight_2016_g22_tight_2017_2018_g20_tight_icalovloose_L1EM15VHI").ignore();
107 t->setProperty("IsoKey", "Loose").ignore();
108 t->setProperty("ForceDataType", (int)PATCore::ParticleDataType::Full).ignore();
109 if(t->initialize() != StatusCode::SUCCESS)
110 {
111 Error(MSGSOURCE, "Unable to initialize the photon CP tool <%s>!",
112 t->name().c_str());
113 return 3;
114 }
115 auto& handles = (j? photonSFTools : photonEffTools);
116 handles.push_back(t->getHandle());
117 }
118
119 /* ********************************************************************** */
120
121 Info(MSGSOURCE, "Configuring the global trigger SF tool");
122 asg::AnaToolHandle<ITrigGlobalEfficiencyCorrectionTool> myTool("TrigGlobalEfficiencyCorrectionTool/TrigGlobal");
123 myTool.setProperty("PhotonEfficiencyTools", photonEffTools).ignore();
124 myTool.setProperty("PhotonScaleFactorTools", photonSFTools).ignore();
125 std::map<std::string, std::string> triggers;
126 triggers["266904-302872"] = "2g20_tight";
127 triggers["302919-311481"] = "2g22_tight";
128 triggers["2017"] = "2g22_tight_L12EM15VHI";
129 triggers["2018"] = "2g22_tight_L12EM15VHI";
130 myTool.setProperty("TriggerCombination", triggers).ignore();
131
132 if(debug) myTool.setProperty("OutputLevel", MSG::DEBUG).ignore();
133 if(toys) myTool.setProperty("NumberOfToys", 1000).ignore();
134 if(myTool.initialize() != StatusCode::SUCCESS)
135 {
136 Error(MSGSOURCE, "Unable to initialize the TrigGlob tool!");
137 return 3;
138 }
139
142 const unsigned periodRuns[] = {
144 276262, 278727, 279932, 280423, 281130, 282625,
146 297730, 300345, 301912, 302737, 303638, 303943, 305291, 307124,
147 305359, 309311, 310015,
149 325713, 329385, 330857, 332720, 334842, 336497, 336832, 338183,
151 348885, 349534, 350310, 352274, 354107, 354826, 355261, 355331,
152 355529, 357050, 359191
153 };
154 std::uniform_int_distribution<unsigned> uniformPdf(0,
155 sizeof(periodRuns)/sizeof(*periodRuns) - 1);
156 std::default_random_engine randomEngine;
157
158 /* ********************************************************************** */
159
160 Info(MSGSOURCE, "Starting the event loop");
161 unsigned errors = 0;
162 double nSuitableEvents = 0., sumW = 0.;
163 static const SG::Decorator<unsigned> RandomRunNumberDec("RandomRunNumber");
164 static const SG::ConstAccessor<int> truthTypeAcc("truthType");
165 for(Long64_t entry = 0; entry < entries; ++entry)
166 {
167 event.getEntry(entry);
168
170 const xAOD::EventInfo* eventInfo = nullptr;
171 event.retrieve(eventInfo,"EventInfo").ignore();
172 unsigned runNumber = periodRuns[uniformPdf(randomEngine)];
173 RandomRunNumberDec(*eventInfo) = runNumber;
174
175 vector<const xAOD::Photon*> myTriggeringPhotons;
176 const xAOD::PhotonContainer* photons = nullptr;
177 event.retrieve(photons,"Photons").ignore();
178 for(auto photon : *photons)
179 {
180 if(!photon->caloCluster()) continue;
181 float eta = fabs(photon->caloCluster()->etaBE(2));
182 float pt = photon->pt();
183 if(pt<10e3f || eta>=2.37 || (eta>1.37 && eta<1.52)) continue;
184 int t = truthTypeAcc(*photon);
185 if(t!=14) continue;
187 if(pt < (runNumber>=302919? 23e3f : 21e3f)) continue;
188 myTriggeringPhotons.push_back(photon);
189 }
190
192 if(myTriggeringPhotons.size() < 2) continue;
193
195 double sf = 1.;
196 auto cc = myTool->getEfficiencyScaleFactor(myTriggeringPhotons, sf);
198 {
199 nSuitableEvents += 1;
200 sumW += sf;
201 }
202 else
203 {
204 Warning(MSGSOURCE, "Scale factor evaluation failed");
205 ++errors;
206 }
207 if(errors>10)
208 {
209 Error(MSGSOURCE, "Too many errors reported!");
210 break;
211 }
212 }
213 Info(MSGSOURCE, "Average scale factor: %f (over %ld events)",
214 sumW / nSuitableEvents, long(nSuitableEvents));
215 #ifndef XAOD_STANDALONE
216 ANA_CHECK(app->finalize());
217 #endif
218 return errors? 4 : 0;
219}
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