ATLAS Offline Software
Macros | Functions
TrigGlobEffCorrExample5b.cxx File Reference
#include <TFile.h>
#include <TError.h>
#include "AthAnalysisBaseComps/AthAnalysisHelper.h"
#include "POOLRootAccess/TEvent.h"
#include "AsgMessaging/MessageCheck.h"
#include "AsgTools/AnaToolHandle.h"
#include "EgammaAnalysisInterfaces/IAsgPhotonEfficiencyCorrectionTool.h"
#include "TriggerAnalysisInterfaces/ITrigGlobalEfficiencyCorrectionTool.h"
#include "xAODEventInfo/EventInfo.h"
#include "xAODEgamma/PhotonContainer.h"
#include "PATCore/PATCoreEnums.h"
#include "AthContainers/ConstAccessor.h"
#include "AthContainers/Decorator.h"
#include <random>
#include <vector>
#include <array>

Go to the source code of this file.

Macros

#define MSGSOURCE   "Example 5b"
 

Functions

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

Macro Definition Documentation

◆ MSGSOURCE

#define MSGSOURCE   "Example 5b"

Definition at line 48 of file TrigGlobEffCorrExample5b.cxx.

Function Documentation

◆ main()

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

For property 'PhotonEfficiencyTools':

For property 'PhotonScaleFactorTools':

For property 'ListOfLegsPerTool':

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

{

<key in map file>}

one instance per trigger leg x working point

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

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!

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 for the softest leg:

also counting those suitable for the highest-pT leg

Events must contain enough photons to trigger

Finally retrieve the global trigger scale factor

Definition at line 52 of file TrigGlobEffCorrExample5b.cxx.

53 {
54  ANA_CHECK_SET_TYPE(bool)
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  }
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 }
SGTest::store
TestStore store
Definition: TestStore.cxx:23
asg::AnaToolHandle< ITrigGlobalEfficiencyCorrectionTool >
eta
Scalar eta() const
pseudorapidity method
Definition: AmgMatrixBasePlugin.h:83
test_pyathena.pt
pt
Definition: test_pyathena.py:11
ANA_CHECK
#define ANA_CHECK(EXP)
check whether the given expression was successful
Definition: Control/AthToolSupport/AsgMessaging/AsgMessaging/MessageCheck.h:324
SG::ConstAccessor< int >
read_hist_ntuple.t
t
Definition: read_hist_ntuple.py:5
xAOD::TEvent::kClassAccess
@ kClassAccess
Access auxiliary data using the aux containers.
Definition: Control/xAODRootAccess/xAODRootAccess/TEvent.h:100
ZDCMsg::Info
@ Info
Definition: ZDCMsg.h:20
POOL::Init
IAppMgrUI * Init(const char *options="POOLRootAccess/basic.opts")
Bootstraps (creates and configures) the Gaudi Application with the provided options file.
Definition: PhysicsAnalysis/POOLRootAccess/src/TEvent.cxx:29
POOL::TEvent::kClassAccess
@ kClassAccess
Definition: PhysicsAnalysis/POOLRootAccess/POOLRootAccess/TEvent.h:46
PATCore::ParticleDataType::Full
@ Full
Definition: PATCoreEnums.h:22
DiTauMassTools::ignore
void ignore(T &&)
Definition: PhysicsAnalysis/TauID/DiTauMassTools/DiTauMassTools/HelperFunctions.h:58
event
POOL::TEvent event(POOL::TEvent::kClassAccess)
SG::Decorator
Helper class to provide type-safe access to aux data.
Definition: Decorator.h:59
lumiFormat.i
int i
Definition: lumiFormat.py:85
LArCellNtuple.argv
argv
Definition: LArCellNtuple.py:152
MSGSOURCE
#define MSGSOURCE
Definition: TrigGlobEffCorrExample5b.cxx:47
file
TFile * file
Definition: tile_monitor.h:29
DQHistogramMergeRegExp.argc
argc
Definition: DQHistogramMergeRegExp.py:20
DataVector
Derived DataVector<T>.
Definition: DataVector.h:794
mergePhysValFiles.errors
list errors
Definition: DataQuality/DataQualityUtils/scripts/mergePhysValFiles.py:43
GetAllXsec.entry
list entry
Definition: GetAllXsec.py:132
POOL::TEvent
Definition: PhysicsAnalysis/POOLRootAccess/POOLRootAccess/TEvent.h:40
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:228
debug
const bool debug
Definition: MakeUncertaintyPlots.cxx:53
ActsTrk::to_string
std::string to_string(const DetectorType &type)
Definition: GeometryDefs.h:34
WriteCaloSwCorrections.cfg
cfg
Definition: WriteCaloSwCorrections.py:23
xAOD::EventInfo_v1
Class describing the basic event information.
Definition: EventInfo_v1.h:43
DeMoAtlasDataLoss.runNumber
string runNumber
Definition: DeMoAtlasDataLoss.py:64
CP::CorrectionCode::Ok
@ Ok
The correction was done successfully.
Definition: CorrectionCode.h:38
xAOD::TStore
A relatively simple transient store for objects created in analysis.
Definition: TStore.h:44
xAOD::photon
@ photon
Definition: TrackingPrimitives.h:199
mapkey::sf
@ sf
Definition: TElectronEfficiencyCorrectionTool.cxx:38
ANA_CHECK_SET_TYPE
#define ANA_CHECK_SET_TYPE(TYPE)
set the type for ANA_CHECK to report failures
Definition: Control/AthToolSupport/AsgMessaging/AsgMessaging/MessageCheck.h:314
DEBUG
#define DEBUG
Definition: page_access.h:11
CaloCellTimeCorrFiller.filename
filename
Definition: CaloCellTimeCorrFiller.py:24
entries
double entries
Definition: listroot.cxx:49
L1Topo::Error
Error
The different types of error that can be flagged in the L1TopoRDO.
Definition: Error.h:16
xAOD::TEvent
Tool for accessing xAOD files outside of Athena.
Definition: Control/xAODRootAccess/xAODRootAccess/TEvent.h:84
python.handimod.cc
int cc
Definition: handimod.py:523
xAOD::Init
StatusCode Init(const char *appname)
Function initialising ROOT/PyROOT for using the ATLAS EDM.
Definition: Init.cxx:31