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

Go to the source code of this file.

Macros

#define MSGSOURCE   "Example 5a"

Functions

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

Macro Definition Documentation

◆ MSGSOURCE

#define MSGSOURCE   "Example 5a"

Definition at line 45 of file TrigGlobEffCorrExample5a.cxx.

Function Documentation

◆ main()

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

For property 'PhotonEfficiencyTools':

For property 'PhotonScaleFactorTools':

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

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

2015 + 2016 periods A-D3

2016 periods D4-L

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

2015 periods D3-H, J

2016 periods A3-L

2017 periods B-K

2018 periods B-M

Get a random run number, and decorate the event info

photon must be above trigger threshold:

Events must contain enough photons to trigger

Finally retrieve the global trigger scale factor

Definition at line 50 of file TrigGlobEffCorrExample5a.cxx.

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 }
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
#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
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
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