ATLAS Offline Software
Macros | Functions
TrigGlobEffCorrExample0.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/IAsgElectronEfficiencyCorrectionTool.h"
#include "MuonAnalysisInterfaces/IMuonTriggerScaleFactors.h"
#include "TriggerAnalysisInterfaces/ITrigGlobalEfficiencyCorrectionTool.h"
#include "xAODEventInfo/EventInfo.h"
#include "xAODEgamma/ElectronContainer.h"
#include "xAODMuon/MuonContainer.h"
#include "PATCore/PATCoreEnums.h"
#include "AthContainers/AuxElement.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 0"
 

Functions

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

Macro Definition Documentation

◆ MSGSOURCE

#define MSGSOURCE   "Example 0"

Definition at line 49 of file TrigGlobEffCorrExample0.cxx.

Function Documentation

◆ main()

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

For property 'ElectronEfficiencyTools':

For property 'ElectronScaleFactorTools':

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

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

For property 'MuonTools':

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

2015 periods D-H, J

2016 periods A-L

2017 periods B-K

2018 periods B-Q

Get a random run number, and decorate the event info

lepton must be above trigger threshold:

lepton must be above trigger threshold:

Events must contain at least one lepton above trigger threshold

Finally retrieve the global trigger scale factor

Definition at line 53 of file TrigGlobEffCorrExample0.cxx.

54 {
55  ANA_CHECK_SET_TYPE(bool)
56  const char* filename = nullptr;
57  bool debug = false, cmdline_error = false, toys = false;
58  for(int i=1;i<argc;++i)
59  {
60  if(string(argv[i]) == "--debug") debug = true;
61  else if(string(argv[i]) == "--toys") toys = true;
62  else if(!filename && *argv[i]!='-') filename = argv[i];
63  else cmdline_error = true;
64  }
65  if(!filename || cmdline_error)
66  {
67  Error(MSGSOURCE, "No file name received!");
68  Error(MSGSOURCE, " Usage: %s [--debug] [--toys] [DxAOD file name]", argv[0]);
69  return 1;
70  }
71  #ifdef XAOD_STANDALONE
72  xAOD::Init(MSGSOURCE).ignore();
73  TFile* file = TFile::Open(filename, "READ");
74  if(!file)
75  {
76  Error(MSGSOURCE, "Unable to open file!");
77  return 2;
78  }
81  StatusCode::enableFailure();
82  #else
83  IAppMgrUI* app = POOL::Init();
85  TString file(filename);
86  #endif
87  event.readFrom(file).ignore();
88  Long64_t entries = event.getEntries();
89  Info(MSGSOURCE, "Number of events in the file: %lli", entries);
90 
91  /* ********************************************************************** */
92 
93  Info(MSGSOURCE, "Configuring the electron CP tools");
95  ToolHandleArray<IAsgElectronEfficiencyCorrectionTool> electronEffTools;
97  ToolHandleArray<IAsgElectronEfficiencyCorrectionTool> electronSFTools;
99  vector<asg::AnaToolHandle<IAsgElectronEfficiencyCorrectionTool>> factory;
100  const char* mapPath = "ElectronEfficiencyCorrection/2015_2017/"
101  "rel21.2/Consolidation_September2018_v1/map1.txt";
102  for(int j=0;j<2;++j)
103  {
104  string name = "AsgElectronEfficiencyCorrectionTool/"
105  + ((j? "ElTrigEff_" : "ElTrigSF_")
106  + std::to_string(factory.size()/2));
107  auto t = factory.emplace(factory.end(), name);
108  t->setProperty("MapFilePath", mapPath).ignore();
109  t->setProperty("TriggerKey", string(j?"":"Eff_")
110  + "SINGLE_E_2015_e24_lhmedium_L1EM20VH_OR_e60_lhmedium_OR_e120_lhloose_2016_2018_e26_lhtight_nod0_ivarloose_OR_e60_lhmedium_nod0_OR_e140_lhloose_nod0").ignore();
111  t->setProperty("IdKey", "Tight").ignore();
112  t->setProperty("IsoKey", "FCTight").ignore();
113  t->setProperty("CorrelationModel", "TOTAL").ignore();
114  t->setProperty("ForceDataType", (int)PATCore::ParticleDataType::Full).ignore();
115  if(t->initialize() != StatusCode::SUCCESS)
116  {
117  Error(MSGSOURCE, "Unable to initialize the electron CP tool <%s>!",
118  t->name().c_str());
119  return 3;
120  }
121  auto& handles = (j? electronSFTools : electronEffTools);
122  handles.push_back(t->getHandle());
123  }
124 
125  /* ********************************************************************** */
126 
127  Info(MSGSOURCE, "Configuring the muon CP tools");
129  ToolHandleArray<CP::IMuonTriggerScaleFactors> muonTools;
130  asg::AnaToolHandle<CP::IMuonTriggerScaleFactors> muonTool("CP::MuonTriggerScaleFactors/MuonTrigEff");
131  muonTool.setProperty("MuonQuality", "Tight").ignore();
132  muonTool.setProperty("useRel207", false).ignore();
133  if(muonTool.initialize() != StatusCode::SUCCESS)
134  {
135  Error(MSGSOURCE, "Unable to initialize the muon CP tool!");
136  return 3;
137  }
138  muonTools.push_back(muonTool.getHandle());
139 
140  /* ********************************************************************** */
141 
142  Info(MSGSOURCE, "Configuring the global trigger SF tool");
143  asg::AnaToolHandle<ITrigGlobalEfficiencyCorrectionTool> myTool("TrigGlobalEfficiencyCorrectionTool/TrigGlobal");
144  myTool.setProperty("ElectronEfficiencyTools", electronEffTools).ignore();
145  myTool.setProperty("ElectronScaleFactorTools", electronSFTools).ignore();
146  myTool.setProperty("MuonTools", muonTools).ignore();
147  const char* triggers2015 =
148  "mu20_iloose_L1MU15_OR_mu50"
149  "|| e24_lhmedium_L1EM20VH_OR_e60_lhmedium_OR_e120_lhloose";
150  myTool.setProperty("TriggerCombination2015", triggers2015).ignore();
151  const char* triggers2016to2018 =
152  "mu26_ivarmedium_OR_mu50"
153  "|| e26_lhtight_nod0_ivarloose_OR_e60_lhmedium_nod0_OR_e140_lhloose_nod0";
154  myTool.setProperty("TriggerCombination2016", triggers2016to2018).ignore();
155  myTool.setProperty("TriggerCombination2017", triggers2016to2018).ignore();
156  myTool.setProperty("TriggerCombination2018", triggers2016to2018).ignore();
157 
158  if(debug) myTool.setProperty("OutputLevel", MSG::DEBUG).ignore();
159  if(toys) myTool.setProperty("NumberOfToys", 1000).ignore();
160  if(myTool.initialize() != StatusCode::SUCCESS)
161  {
162  Error(MSGSOURCE, "Unable to initialize the TrigGlob tool!");
163  return 3;
164  }
165 
168  const unsigned periodRuns[] = {
170  276073, 278727, 279932, 280423, 281130, 282625,
172  296939, 300345, 301912, 302737, 303638, 303943, 305291, 307124,
173  305359, 309311, 310015,
175  325713, 329385, 330857, 332720, 334842, 336497, 336832, 338183,
177  348885, 349534, 350310, 352274, 354107, 354826, 355261, 355331,
178  355529, 357050, 359191, 361635, 361738, 363664
179  };
180  std::uniform_int_distribution<unsigned> uniformPdf(0,
181  sizeof(periodRuns)/sizeof(*periodRuns) - 1);
182  std::default_random_engine randomEngine;
183 
184  static const SG::ConstAccessor<int> truthType("truthType");
185  static const SG::ConstAccessor<int> truthOrigin("truthOrigin");
186 
187  /* ********************************************************************** */
188 
189  Info(MSGSOURCE, "Starting the event loop");
190  unsigned errors = 0;
191  double nSuitableEvents = 0., sumW = 0.;
192  static const SG::Decorator<unsigned> RandomRunNumberDec("RandomRunNumber");
193  for(Long64_t entry = 0; entry < entries; ++entry)
194  {
195  event.getEntry(entry);
196 
198  const xAOD::EventInfo* eventInfo = nullptr;
199  event.retrieve(eventInfo,"EventInfo").ignore();
200  unsigned runNumber = periodRuns[uniformPdf(randomEngine)];
201  RandomRunNumberDec(*eventInfo) = runNumber;
202  vector<const xAOD::Electron*> myTriggeringElectrons;
203  const xAOD::ElectronContainer* electrons = nullptr;
204  event.retrieve(electrons,"Electrons").ignore();
205  for(auto electron : *electrons)
206  {
207  if(!electron->caloCluster()) continue;
208  float eta = fabs(electron->caloCluster()->etaBE(2));
209  float pt = electron->pt();
210  if(pt<10e3f || eta>=2.47) continue;
211  if(!truthType.isAvailable(*electron)) continue;
212  if(!truthOrigin.isAvailable(*electron)) continue;
213  int t = truthType(*electron), o = truthOrigin(*electron);
214  if(t!=2 || !(o==10 || (o>=12 && o<=22) || o==43)) continue;
216  if(pt < (runNumber>290000? 27e3f : 25e3f)) continue;
217 
218  myTriggeringElectrons.push_back(electron);
219  }
220 
221  vector<const xAOD::Muon*> myTriggeringMuons;
222  const xAOD::MuonContainer* muons = nullptr;
223  event.retrieve(muons,"Muons").ignore();
224  for(auto muon : *muons)
225  {
226  float pt = muon->pt();
227  if(pt<10e3f || fabs(muon->eta())>=2.5) continue;
228  auto mt = muon->muonType();
229  if(mt!=xAOD::Muon::Combined && mt!=xAOD::Muon::MuonStandAlone) continue;
230  auto& mtp = *(muon->primaryTrackParticle());
231  if(!truthType.isAvailable(mtp)) continue;
232  if(!truthOrigin.isAvailable(mtp)) continue;
233  int t = truthType(mtp), o = truthOrigin(mtp);
234  if(t!=6 || !(o==10 || (o>=12 && o<=22) || o==43)) continue;
236  if(pt < (runNumber>290000? 27.3e3f : 21e3f)) continue;
237 
238  myTriggeringMuons.push_back(muon);
239  }
240 
242  if(myTriggeringElectrons.size()+myTriggeringMuons.size() < 1) continue;
243 
244 
246  double sf = 1.;
247  auto cc = myTool->getEfficiencyScaleFactor(myTriggeringElectrons,
248  myTriggeringMuons, sf);
250  {
251  nSuitableEvents += 1;
252  sumW += sf;
253  }
254  else
255  {
256  Warning(MSGSOURCE, "Scale factor evaluation failed");
257  ++errors;
258  }
259  if(errors>10)
260  {
261  Error(MSGSOURCE, "Too many errors reported!");
262  break;
263  }
264  }
265  Info(MSGSOURCE, "Average scale factor: %f (over %ld events)",
266  sumW / nSuitableEvents, long(nSuitableEvents));
267  #ifndef XAOD_STANDALONE
268  ANA_CHECK(app->finalize())
269  #endif
270  return errors? 4 : 0;
271 }
store
StoreGateSvc * store
Definition: fbtTestBasics.cxx:69
xAOD::muon
@ muon
Definition: TrackingPrimitives.h:195
asg::AnaToolHandle< CP::IMuonTriggerScaleFactors >
eta
Scalar eta() const
pseudorapidity method
Definition: AmgMatrixBasePlugin.h:79
MSGSOURCE
#define MSGSOURCE
Definition: TrigGlobEffCorrExample0.cxx:48
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 >
LArCellConditions.argv
argv
Definition: LArCellConditions.py:112
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:97
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:45
PATCore::ParticleDataType::Full
@ Full
Definition: PATCoreEnums.h:22
DiTauMassTools::ignore
void ignore(T &&)
Definition: PhysicsAnalysis/TauID/DiTauMassTools/DiTauMassTools/HelperFunctions.h:54
event
POOL::TEvent event(POOL::TEvent::kClassAccess)
SG::Decorator
Helper class to provide type-safe access to aux data.
Definition: Decorator.h:58
lumiFormat.i
int i
Definition: lumiFormat.py:92
file
TFile * file
Definition: tile_monitor.h:29
DQHistogramMergeRegExp.argc
argc
Definition: DQHistogramMergeRegExp.py:20
DataVector
Derived DataVector<T>.
Definition: DataVector.h:581
Trk::Combined
@ Combined
Definition: TrackSummaryTool.h:32
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:39
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:195
debug
const bool debug
Definition: MakeUncertaintyPlots.cxx:53
ActsTrk::to_string
std::string to_string(const DetectorType &type)
Definition: GeometryDefs.h:34
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
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
xAOD::EgammaParameters::electron
@ electron
Definition: EgammaEnums.h:18
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
InDetDD::electrons
@ electrons
Definition: InDetDD_Defs.h:17
xAOD::TEvent
Tool for accessing xAOD files outside of Athena.
Definition: Control/xAODRootAccess/xAODRootAccess/TEvent.h:81
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