ATLAS Offline Software
AsgElectronEfficiencyCorrectionTool.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
3  */
4 
10 // Include this class's header
13 // Library includes
14 #include <algorithm>
15 #include <cfloat>
16 #include <iostream>
17 #include <string>
18 #include <utility>
19 // xAOD includes
20 #include "xAODEgamma/Electron.h"
22 // PAT includes
23 #ifndef XAOD_STANDALONE
25 #endif
27 #include "PATCore/PATCoreEnums.h"
30 // ROOT includes
31 #include "TH2F.h"
32 #include "TSystem.h"
33 
34 namespace {
35 // Helper function Calculate and return at the spot
37 HelperFunc(double& sf, const double input)
38 {
39  sf = sf + input;
41 }
42 }
43 
44 namespace correlationModel {
45 enum model
46 {
48  MCTOYS = 1,
49  FULL = 2,
51  TOTAL = 4,
52  SYST = 5
53 };
54 }
55 AsgElectronEfficiencyCorrectionTool::AsgElectronEfficiencyCorrectionTool(
56  const std::string& myname)
57  : asg::AsgMetadataTool(myname)
58  , m_affectedSys()
59  , m_appliedSystematics(nullptr)
60  , m_correlation_model(correlationModel::SIMPLIFIED)
61  , m_sysSubstring("")
62  , m_dataType(PATCore::ParticleDataType::Full)
63  , m_nCorrSyst(0)
64  , m_nUncorrSyst(0)
65  , m_UncorrRegions(nullptr)
66  , m_nSimpleUncorrSyst(0)
67  , m_toysBasename{}
68  , m_corrVarUp{}
69  , m_corrVarDown{}
70  , m_uncorrVarUp{}
71  , m_uncorrVarDown{}
72  , m_accessors{std::make_unique<Accessors>(*this)}
73 {
74  // Create an instance of the underlying ROOT tool
75  m_rootTool = std::make_unique<Root::TElectronEfficiencyCorrectionTool>(
76  ("T" + (this->name())).c_str());
77  // Declare the needed properties
78  declareProperty(
79  "CorrectionFileNameList",
80  m_corrFileNameList,
81  "List of file names that store the correction factors for simulation.");
82  declareProperty("MapFilePath",
83  m_mapFile = "ElectronEfficiencyCorrection/2015_2025/rel22.2/2025_Precision2023_Recommendation/trigger/map1.txt",
84  "Full path to the map file");
85  declareProperty(
86  "RecoKey", m_recoKey = "", "Key associated with reconstruction");
87  declareProperty(
88  "IdKey", m_idKey = "", "Key associated with identification working point");
89  declareProperty(
90  "IsoKey", m_isoKey = "", "Key associated with isolation working point");
91  declareProperty(
92  "TriggerKey", m_trigKey = "", "Key associated with trigger working point");
93  declareProperty("ForceDataType",
94  m_dataTypeOverwrite = -1,
95  "Force the DataType of the electron to specified value (to "
96  "circumvent problem of incorrect DataType for forward "
97  "electrons in some old releases)");
98  declareProperty(
99  "ResultPrefix", m_resultPrefix = "", "The prefix string for the result");
100  declareProperty("ResultName", m_resultName = "", "The string for the result");
101  declareProperty("CorrelationModel",
102  m_correlation_model_name = "SIMPLIFIED",
103  "Uncertainty correlation model. At the moment TOTAL, FULL, "
104  "SIMPLIFIED, SYST, MCTOYS and COMBMCTOYS are implemented. "
105  "SIMPLIFIED is the default option.");
106  declareProperty("NumberOfToys",
107  m_number_of_toys = 100,
108  "Number of ToyMC replica, affecting MCTOYS and COMBMCTOYS "
109  "correlation models only.");
110  declareProperty("MCToySeed",
111  m_seed_toys = 0,
112  "Seed for ToyMC replica, affecting MCTOYS and COMBMCTOYS "
113  "correlation models only.");
114  declareProperty("MCToyScale",
115  m_scale_toys = 1,
116  "Scales Toy systematics up by this factor, affecting MCTOYS "
117  "and COMBMCTOYS correlation models only.");
118  declareProperty(
119  "UncorrEtaBinsUser",
120  m_uncorrSimplfEtaBinsUser = { 0.0, 1.37, 4.9 },
121  "Custom Eta/Pt binning for the SIMPLIFIED correlation model.");
122  declareProperty(
123  "UncorrEtBinsUser",
124  m_uncorrSimplfEtBinsUser = { 4000,
125  7000,
126  10000,
127  15000,
128  20000,
129  25000,
130  30000,
131  60000,
132  80000,
133  13600000 },
134  "Custom Eta/Pt binning for the SIMPLIFIED correlation model.");
135  declareProperty("EventInfoCollectionName",
136  m_eventInfoCollectionName = "EventInfo",
137  "The EventInfo Collection Name");
138  declareProperty("UseRandomRunNumber", m_useRandomRunNumber = true);
139  declareProperty("DefaultRandomRunNumber", m_defaultRandomRunNumber = 999999);
140 }
141 
143 {
144  if (m_UncorrRegions) {
145  delete m_UncorrRegions;
146  }
147 }
148 
151 {
152  // Forward the message level
153  m_rootTool->msg().setLevel(this->msg().level());
154 
155  if (m_corrFileNameList.empty() && m_recoKey.empty() && m_idKey.empty() &&
156  m_trigKey.empty() && m_isoKey.empty()) {
157  ATH_MSG_ERROR("CorrectionFileNameList as well as SFKeys are empty! Please "
158  "configure it properly...");
159  return StatusCode::FAILURE;
160  }
161  /*
162  * When metadata are available
163  * m_dataType will be whatever the metadata says i.e Full or Fast
164  * Its default value is Full.
165  * The user can overwrite all these ,using a flag,
166  * and force a specific dataType
167  */
168  if (m_dataTypeOverwrite != -1) {
169  if (m_dataTypeOverwrite !=
170  static_cast<int>(PATCore::ParticleDataType::Full) &&
172  static_cast<int>(PATCore::ParticleDataType::Fast)) {
173  ATH_MSG_ERROR("Unsupported Particle Data Type Overwrite"
175  return StatusCode::FAILURE;
176  }
177  m_dataType =
179  }
180  // Find the relevant input files
181  // Fill the vector with filename using keys if the user
182  // has not passed the full filename as a property
183  if (m_corrFileNameList.empty()) {
184  if (getFile(m_recoKey, m_idKey, m_isoKey, m_trigKey).isFailure()) {
185  ATH_MSG_ERROR("No Root file input specified, and not available map file");
186  return StatusCode::FAILURE;
187  }
188  }
189  // Resolve the paths to the input files for the full Geant4 simualtion
190  // corrections
191  for (auto& ifile : m_corrFileNameList) {
192 
194  if (filename.empty()) {
195  ATH_MSG_ERROR("Could NOT resolve file name " << ifile);
196  return StatusCode::FAILURE;
197  } else {
198  ATH_MSG_DEBUG(" Path found = " << filename);
199  }
200  m_rootTool->addFileName(filename);
201  // Determine the systematics substring according to the name of the input
202  // file
203  if (ifile.find("efficiencySF.") != std::string::npos) {
204  m_sysSubstring = "Trigger_";
205  }
206  if (ifile.find("efficiencySF.offline") != std::string::npos) {
207  m_sysSubstring = "ID_";
208  }
209  if (ifile.find("efficiencySF.offline.RecoTrk") != std::string::npos) {
210  m_sysSubstring = "Reco_";
211  }
212  if (ifile.find("efficiencySF.offline.Fwd") != std::string::npos) {
213  m_sysSubstring = "FwdID_";
214  }
215  if (ifile.find("efficiencySF.Isolation") != std::string::npos) {
216  m_sysSubstring = "Iso_";
217  }
218  if (ifile.find("efficiency.") != std::string::npos) {
219  m_sysSubstring = "TriggerEff_";
220  }
221  if (ifile.find("efficiencySF.ChargeID") != std::string::npos) {
222  m_sysSubstring = "ChargeIDSel_";
223  }
224  if (m_sysSubstring.empty()) {
225  ATH_MSG_ERROR("Could NOT find systematics Substring file name "
226  << m_sysSubstring);
227  return StatusCode::FAILURE;
228  }
229  }
230  //
231  // Find the proper correlation Model
232  if (m_correlation_model_name == "COMBMCTOYS") {
234  } else if (m_correlation_model_name == "MCTOYS") {
236  } else if (m_correlation_model_name == "FULL") {
238  } else if (m_correlation_model_name == "SIMPLIFIED") {
240  // a few checks on the binning that the user might have specified
241  if (m_uncorrSimplfEtaBinsUser.empty() || m_uncorrSimplfEtBinsUser.empty() ||
242  m_uncorrSimplfEtBinsUser.size() < 2 ||
243  m_uncorrSimplfEtaBinsUser.size() < 2) {
244  ATH_MSG_ERROR("Something went wrong when specifying bins for the "
245  "SIMPLIFIED correlation model ");
246  return StatusCode::FAILURE;
247  }
248  } else if (m_correlation_model_name == "TOTAL") {
250  } else if (m_correlation_model_name == "SYST") {
252  } else {
253  ATH_MSG_ERROR("Unknown correlation model " + m_correlation_model_name);
254  return StatusCode::FAILURE;
255  }
256  ATH_MSG_DEBUG("Correlation model: " + m_correlation_model_name
257  << " Enum " << m_correlation_model);
258 
259  // Histogram of simplified uncorrelated regions
261  m_UncorrRegions = new TH2F("UncorrRegions",
262  "UncorrRegions",
263  m_uncorrSimplfEtBinsUser.size() - 1,
265  m_uncorrSimplfEtaBinsUser.size() - 1,
267  m_UncorrRegions->SetDirectory(nullptr);
268 
269  // bins not entries here
271  (m_uncorrSimplfEtBinsUser.size() - 1);
272  }
273  // Finish the preaparation of the underlying tool
274  if (m_seed_toys != 0) {
275  m_rootTool->setSeed(m_seed_toys);
276  }
277  //
279  m_rootTool->bookCombToyMCScaleFactors(m_number_of_toys);
280  }
281  //
283  m_rootTool->bookToyMCScaleFactors(m_number_of_toys);
284  }
285  // We need to initialize the underlying ROOT TSelectorTool
286  if (0 == m_rootTool->initialize()) {
288  "Could not initialize the TElectronEfficiencyCorrectionTool!");
289  return StatusCode::FAILURE;
290  }
291 
292  // get Nsyst
293  m_nCorrSyst = m_rootTool->getNSyst();
294  std::map<float, std::vector<float>> tmp;
295  m_nUncorrSyst = m_rootTool->getNbins(tmp);
296  // copy over to vector for better access
297  for (const auto& i : tmp) {
298  m_pteta_bins.emplace_back(i.first, i.second);
299  }
300 
301  // Check if the input contains uncorr/stat necessary
302  // to run non-total systematic model
304  m_rootTool->uncorrEmpty(m_dataType) ) {
305  ATH_MSG_ERROR("Called correlation model "+m_correlation_model_name+
306  " but input does not contain necessary histograms.");
307  return StatusCode::FAILURE;
308  }
309 
310  // Initialize the systematics
311  if (InitSystematics() != StatusCode::SUCCESS) {
312  ATH_MSG_ERROR("(InitSystematics() != StatusCode::SUCCESS)");
313  return StatusCode::FAILURE;
314  }
315  // Add the recommended systematics to the registry
316  if (registerSystematics() != StatusCode::SUCCESS) {
317  ATH_MSG_ERROR("(registerSystematics() != StatusCode::SUCCESS)");
318  return StatusCode::FAILURE;
319  }
320  // Configure for nominal systematics
321  if (applySystematicVariation(CP::SystematicSet()) != StatusCode::SUCCESS) {
322  ATH_MSG_ERROR("Could not configure for nominal settings");
323  return StatusCode::FAILURE;
324  }
325 
326  if (m_useRandomRunNumber) {
327  resetAccessor (m_accessors->randomrunnumber, *this, "RandomRunNumber");
328  }
329  ATH_CHECK (initializeColumns());
330  return StatusCode::SUCCESS;
331 }
332 
335  const xAOD::Electron& inputObject,
336  double& efficiencyScaleFactor) const
337 {
338  const xAOD::EventInfo* eventInfo = nullptr;
339  if (evtStore()->retrieve(eventInfo, m_eventInfoCollectionName).isFailure()) {
340  ATH_MSG_ERROR("Could not retrieve EventInfo object!");
342  }
343  return getEfficiencyScaleFactor(columnar::ElectronId(inputObject), efficiencyScaleFactor, columnar::EventInfoId (*eventInfo));
344 }
345 
348  columnar::ElectronId inputObject,
349  double& efficiencyScaleFactor,
350  columnar::EventInfoId eventInfo) const
351 {
352  const Accessors& acc = *m_accessors;
353 
354  efficiencyScaleFactor = 1;
355  // Retrieve the proper random Run Number
356  unsigned int runNumber = m_defaultRandomRunNumber;
357  if (m_useRandomRunNumber) {
358  if (!acc.randomrunnumber.isAvailable(eventInfo)) {
360  "Pileup tool not run before using ElectronEfficiencyTool! SFs do not "
361  "reflect PU distribution in data");
363  }
364  runNumber = acc.randomrunnumber(eventInfo);
365  }
366  //
367  // Get the result
368  //
369  double cluster_eta(-9999.9);
370 
371  auto cluster = acc.caloClusterAcc (inputObject) [0].value();
372 
373  // we need to use different variables for central and forward electrons
374  if (acc.accAuthor.isAvailable(inputObject) &&
375  acc.accAuthor(inputObject) == xAOD::EgammaParameters::AuthorFwdElectron) {
376  cluster_eta = acc.clusterEtaAcc (cluster);
377  } else {
378  cluster_eta = acc.clusterEtaBEAcc (cluster, 2);
379  }
380 
381  // use et from cluster because it is immutable under syst variations of
382  // electron energy scale
383  const double energy = acc.clusterEAcc(cluster);
384  const double parEta = acc.m_eta(inputObject);
385  const double coshEta = std::cosh(parEta);
386  double et = (coshEta != 0.) ? energy / coshEta : 0.;
387  // allow for a 5% margin at the lowest pT bin boundary (i.e. increase et by 5%
388  // for sub-threshold electrons). This assures that electrons that pass the
389  // threshold only under syst variations of energy get a scale factor assigned.
390  auto itr_pt = m_pteta_bins.begin();
391  if (itr_pt != m_pteta_bins.end() && et < itr_pt->first) {
392  et = et * 1.05;
393  }
394  return getEfficiencyScaleFactor(et, cluster_eta, runNumber,
395  efficiencyScaleFactor);
396 }
397 
400  const double et, /*in MeV*/
401  const double cluster_eta, /*cluster*/
402  const unsigned int runNumber,
403  double& efficiencyScaleFactor) const
404 {
405  // We pass only one variation per time
406  // The applied systematic is always one systematic.
407  // Either is relevant and acquires a value
408  // or stays 0.
409  double sys(0);
410 
411  // Let's try to figure already what we are to do
412  bool doSFOnly = appliedSystematics().empty();
413  bool doToys = (m_correlation_model == correlationModel::MCTOYS ||
415  bool isTotal = (m_correlation_model == correlationModel::TOTAL);
416  bool isFull = (m_correlation_model == correlationModel::FULL);
417  bool isSimplified = (m_correlation_model == correlationModel::SIMPLIFIED);
418 
419  // Lets see if we have an uncorrelated syst variation passed
420  int unCorrSign = 0;
421  // or a correlated one
422  int indexCorrelated = -999;
423  int correlatedSign = 0;
424  if (!(doSFOnly || doToys || isTotal) && (isFull || isSimplified)) {
425  const auto& sysName = appliedSystematics().begin()->name();
426  bool isUncorr = (sysName.find("UncorrUnc") != std::string::npos);
427  int currentUncorReg = -999;
428  if (isUncorr) {
429  // Can we find an uncorrelated region?
430  if (isFull) {
431  currentUncorReg = currentUncorrSystRegion(cluster_eta, et);
432  } else if (isSimplified) {
433  currentUncorReg = currentSimplifiedUncorrSystRegion(cluster_eta, et);
434  }
435  if (currentUncorReg < 0) {
437  }
438  // And use it to if we got the "right" syst variation
439  if (appliedSystematics().matchSystematic(
440  m_uncorrVarDown[currentUncorReg])) {
441  unCorrSign = -1;
442  } else if (appliedSystematics().matchSystematic(
443  m_uncorrVarUp[currentUncorReg])) {
444  unCorrSign = 1;
445  }
446  } else if (m_nCorrSyst != 0) {//if we have 0 we do not care ...
447  if (sysName.find("CorrUnc") != std::string::npos) {
448  // given the name convention we
449  const auto varNumEnd = sysName.rfind("__");
450  const auto varNumBegin = sysName.rfind("NP") + 2;
451  const int varIndex =
452  std::stoi(sysName.substr(varNumBegin, (varNumEnd - varNumBegin)));
453  if (appliedSystematics().matchSystematic(m_corrVarUp[varIndex])) {
454  indexCorrelated = varIndex;
455  correlatedSign = 1;
456  } else if (appliedSystematics().matchSystematic(
457  m_corrVarDown[varIndex])) {
458  indexCorrelated = varIndex;
459  correlatedSign = -1;
460  }
461  } // find CorrUncertainty in name
462  } // not Uncorr and we have CorrSyst
463  } // Not (SF or toys or total)
464 
465  // Now lets do the call
466  // For now we more or less calculate on demand only
467  // the Correlated and the toys we can see if we want
468  // top opt also the "TOTAL"
470  const int status =
471  m_rootTool->calculate(m_dataType, runNumber, cluster_eta, et, /* in MeV */
472  result, isTotal);
473 
474  // if status 0 something went wrong
475  if (!status) {
476  efficiencyScaleFactor = 1;
478  }
479  // At this point we have the SF
480  efficiencyScaleFactor = result.SF;
481  //And if all we need we can return
482  if (doSFOnly) {
483  return CP::CorrectionCode::Ok;
484  }
485 
486  // First the logic if the user requested toys
487  if (doToys) {
489  toy.second = m_scale_toys;
490  sys = result.toys[toy.first - 1] * m_scale_toys;
491  // return here for Toy variations
492  efficiencyScaleFactor = sys;
493  return CP::CorrectionCode::Ok;
494  }
495  // The "TOTAL" single uncertainty uncorrelated+correlated
496  else if (isTotal) {
497  sys = result.Total;
498  if (appliedSystematics().matchSystematic(m_uncorrVarUp[0])) {
499  return HelperFunc(efficiencyScaleFactor, sys);
500  }
501  if (appliedSystematics().matchSystematic(m_uncorrVarDown[0])) {
502  return HelperFunc(efficiencyScaleFactor, -1 * sys);
503  }
504  }
505  // Then the uncorrelated part for the SiMPLIFIED/FULL models
506  else if (unCorrSign!=0) {
507  sys = unCorrSign * result.UnCorr;
508  return HelperFunc(efficiencyScaleFactor, sys);
509  }
510 
511  // If we reach this point
512  // it means we need to do the correlated part
513  // for the FULL/SIMPLIFIED models.
514  // First if there are not correlated systematic
515  if (m_nCorrSyst == 0) {
516 
517  if (appliedSystematics().matchSystematic(m_corrVarUp[0])) {
518  sys = std::sqrt(result.Total * result.Total -
519  result.UnCorr * result.UnCorr); // total
520  // -stat
521  return HelperFunc(efficiencyScaleFactor, sys);
522  }
523  if (appliedSystematics().matchSystematic(m_corrVarDown[0])) {
524  sys = -1 * std::sqrt(result.Total * result.Total -
525  result.UnCorr * result.UnCorr); // total
526  // -stat
527  return HelperFunc(efficiencyScaleFactor, sys);
528  }
529  }
530  //or if we had
531  if (correlatedSign != 0) {
532  sys = correlatedSign * result.Corr[indexCorrelated];
533  return HelperFunc(efficiencyScaleFactor, sys);
534  }
535  return CP::CorrectionCode::Ok;
536 }
537 
540  const xAOD::Electron& inputObject) const
541 {
542  double efficiencyScaleFactor = 1.0;
544  getEfficiencyScaleFactor(inputObject, efficiencyScaleFactor);
546  m_resultName + "SF");
547  dec(inputObject) = efficiencyScaleFactor;
548  return result;
549 }
550 
551 /*
552  * Systematics Interface
553  */
555 bool
557  const CP::SystematicVariation& systematic) const
558 {
559  if (systematic.empty()) {
560  return false;
561  }
565  return (sys.begin()->ensembleContains(systematic));
566  } else {
567  return (sys.find(systematic) != sys.end());
568  }
569 }
573 {
574  return m_affectedSys;
575 }
576 // Register the systematics with the registry and add them to the recommended
577 // list
580 {
582 
583  if (registry.registerSystematics(*this) != StatusCode::SUCCESS) {
585  "Failed to add systematic to list of recommended systematics.");
586  return StatusCode::FAILURE;
587  }
588  return StatusCode::SUCCESS;
589 }
593 {
594  return affectingSystematics();
595 }
599  const CP::SystematicSet& systConfig)
600 {
601  // First, check if this configuration exists in the filtered map/registy
602  auto itr = m_systFilter.find(systConfig);
603 
604  if (itr != m_systFilter.end()) {
605  CP::SystematicSet& mySysConf = itr->second;
606  m_appliedSystematics = &mySysConf;
607  }
608  // if not, we should register it, after it passes sanity checks
609  else {
610  // If it's a new input set, we need to filter it
611  CP::SystematicSet affectingSys = affectingSystematics();
612  CP::SystematicSet filteredSys;
614  systConfig, affectingSys, filteredSys)) {
616  "Unsupported combination of systematic variations passed to the tool!");
617  return StatusCode::FAILURE;
618  }
619  // Does filtered make sense, only one per time
620  if (filteredSys.size() > 1) {
622  "More than one systematic variation passed at the same time");
623  return StatusCode::FAILURE;
624  }
625 
626  if (filteredSys.empty() && !systConfig.empty()) {
627  ATH_MSG_DEBUG("systematics : ");
628  for (const auto& syst : systConfig) {
629  ATH_MSG_DEBUG(syst.name());
630  }
631  ATH_MSG_DEBUG(" Not supported ");
632  }
633  // insert to the registy
634  itr = m_systFilter.insert(std::make_pair(systConfig, filteredSys)).first;
635  // And return directly
636  CP::SystematicSet& mySysConf = itr->second;
637  m_appliedSystematics = &mySysConf;
638  }
639  return StatusCode::SUCCESS;
640 }
641 
642 /*
643  * Helper Methods
644  */
647 {
648  const std::string prefix = "EL_EFF_" + m_sysSubstring;
649  const std::string prefixUncorr = prefix + m_correlation_model_name + "_";
650  // Toys
652  m_toysBasename = prefix + "COMBMCTOY";
656  m_toysBasename = prefix + "MCTOY";
659  // Correlated for the different models (1 or Full set)
661  if (m_nCorrSyst == 0) {
662  auto varUp = CP::SystematicVariation(prefix + "CorrUncertainty", 1);
663  auto varDown = CP::SystematicVariation(prefix + "CorrUncertainty", -1);
664  m_corrVarUp.push_back(varUp);
665  m_corrVarDown.push_back(varDown);
666  m_affectedSys.insert(varUp);
667  m_affectedSys.insert(varDown);
668  } else
669  for (int i = 0; i < m_nCorrSyst; ++i) {
670  auto varUp =
671  CP::SystematicVariation(prefix + Form("CorrUncertaintyNP%d", i), 1);
672  auto varDown =
673  CP::SystematicVariation(prefix + Form("CorrUncertaintyNP%d", i), -1);
674  m_corrVarUp.push_back(varUp);
675  m_corrVarDown.push_back(varDown);
676  m_affectedSys.insert(varUp);
677  m_affectedSys.insert(varDown);
678  }
679  }
680  // Different tratement for the uncorrelated per model
682  auto varUp = CP::SystematicVariation(prefixUncorr + "1NPCOR_PLUS_UNCOR", 1);
683  auto varDown =
684  CP::SystematicVariation(prefixUncorr + "1NPCOR_PLUS_UNCOR", -1);
685  m_uncorrVarUp.push_back(varUp);
686  m_uncorrVarDown.push_back(varDown);
687  m_affectedSys.insert(varUp);
688  m_affectedSys.insert(varDown);
690  for (int i = 0; i < m_nUncorrSyst; ++i) {
691  auto varUp = CP::SystematicVariation(
692  prefixUncorr + Form("UncorrUncertaintyNP%d", i), 1);
693  auto varDown = CP::SystematicVariation(
694  prefixUncorr + Form("UncorrUncertaintyNP%d", i), -1);
695  m_uncorrVarUp.push_back(varUp);
696  m_uncorrVarDown.push_back(varDown);
697  m_affectedSys.insert(varUp);
698  m_affectedSys.insert(varDown);
699  }
701  for (int i = 0; i < m_nSimpleUncorrSyst; ++i) {
702  auto varUp = CP::SystematicVariation(
703  prefixUncorr + Form("UncorrUncertaintyNP%d", i), 1);
704  auto varDown = CP::SystematicVariation(
705  prefixUncorr + Form("UncorrUncertaintyNP%d", i), -1);
706  m_uncorrVarUp.push_back(varUp);
707  m_uncorrVarDown.push_back(varDown);
708  m_affectedSys.insert(varUp);
709  m_affectedSys.insert(varDown);
710  }
711  }
712  return StatusCode::SUCCESS;
713 }
714 
715 int
717  const double cluster_eta,
718  const double et) const
719 {
720  int ptbin = std::as_const(*m_UncorrRegions).GetXaxis()->FindBin(et) - 1;
721  if (ptbin < 0 ||
722  ptbin >= std::as_const(*m_UncorrRegions).GetXaxis()->GetNbins()) {
724  " Found electron with Et = "
725  << et / 1000. << " GeV, where you specified boundaries of ["
726  << std::as_const(*m_UncorrRegions).GetXaxis()->GetBinLowEdge(1) << ","
727  << std::as_const(*m_UncorrRegions)
728  .GetXaxis()
729  ->GetBinUpEdge(
730  std::as_const(*m_UncorrRegions).GetXaxis()->GetNbins())
731  << "] for the SIMPLIFIED correlation model ");
732  return -1;
733  }
734  int etabin =
735  std::as_const(*m_UncorrRegions).GetYaxis()->FindBin(std::abs(cluster_eta)) -
736  1;
737  if (etabin < 0 ||
738  etabin >= std::as_const(*m_UncorrRegions).GetYaxis()->GetNbins()) {
740  " Found electron with |eta| = "
741  << std::abs(cluster_eta) << ", where you specified boundaries of ["
742  << std::as_const(*m_UncorrRegions).GetYaxis()->GetBinLowEdge(1) << ","
743  << std::as_const(*m_UncorrRegions)
744  .GetYaxis()
745  ->GetBinUpEdge(
746  std::as_const(*m_UncorrRegions).GetYaxis()->GetNbins())
747  << "] for the SIMPLIFIED correlation model ");
748  return -1;
749  }
750  int reg = ((etabin)*m_UncorrRegions->GetNbinsX() + ptbin);
751  return reg;
752 }
753 
754 int
756  const double cluster_eta,
757  const double et) const
758 {
759  int etabin = 0;
760  int reg = 0;
761  bool found = false;
762  float cluster_eta_electron = 0;
763  auto itr_ptBEGIN = m_pteta_bins.begin();
764  auto itr_ptEND = m_pteta_bins.end();
765  for (; itr_ptBEGIN != itr_ptEND; ++itr_ptBEGIN) {
766  auto itr_ptBEGINplusOne = itr_ptBEGIN;
767  ++itr_ptBEGINplusOne;
768  // Find the pt bin : Larger or equal from the current and the next one is
769  // the last or the next one is larger.
770  if (et >= itr_ptBEGIN->first &&
771  (itr_ptBEGINplusOne == itr_ptEND || et < itr_ptBEGINplusOne->first)) {
772  if ((itr_ptBEGIN->second).at(0) >= 0) {
773  cluster_eta_electron = std::abs(cluster_eta);
774  } else {
775  cluster_eta_electron = (cluster_eta);
776  };
777  for (unsigned int etab = 0; etab < ((itr_ptBEGIN->second).size());
778  ++etab) {
779  unsigned int etabnext = etab + 1;
780  // Find the eta bin : Larger or equal from the current and the next one
781  // is the last or the next one is larger:.
782  if ((cluster_eta_electron) >= (itr_ptBEGIN->second).at(etab) &&
783  (etabnext == itr_ptBEGIN->second.size() ||
784  cluster_eta_electron < itr_ptBEGIN->second.at(etabnext))) {
785  found = true;
786  break;
787  }
788  // We did not find it. Increment eta and continue looking
789  etabin++;
790  }
791  }
792  if (found) {
793  break;
794  }
795  // Add the full size of the "passed" eta row
796  reg += (itr_ptBEGIN->second).size();
797  }
798  if (!found) {
799  ATH_MSG_WARNING("No index for the uncorrelated systematic was found, "
800  "returning the maximum index");
801  return m_nCorrSyst;
802  }
803  reg = reg + etabin;
804  return reg;
805 }
806 
807 int
809  const xAOD::Electron& inputObject) const
810 {
811  return systUncorrVariationIndex (columnar::ElectronId (inputObject));
812 }
813 
814 int
816  columnar::ElectronId inputObject) const
817 {
818  const Accessors& acc = *m_accessors;
819  int currentSystRegion = -999;
820  double cluster_eta(-9999.9);
821  double et(0.0);
822 
823  et = acc.m_pt(inputObject);
824  const auto cluster = acc.caloClusterAcc (inputObject) [0].value();
825  cluster_eta = acc.clusterEtaBEAcc (cluster, 2);
826  switch (m_correlation_model) {
828  currentSystRegion = currentSimplifiedUncorrSystRegion(cluster_eta, et);
829  break;
830  }
831  case correlationModel::FULL: {
832  currentSystRegion = currentUncorrSystRegion(cluster_eta, et);
833  break;
834  }
835  default: {
836  // not there for the other models
837  break;
838  }
839  }
840  return currentSystRegion;
841 }
842 
846  const std::string& idkey,
847  const std::string& isokey,
848  const std::string& trigkey)
849 {
850 
851  std::string mapFileName = PathResolverFindCalibFile(m_mapFile);
852  std::string key =
853  ElRecomFileHelpers::convertToOneKey(recokey, idkey, isokey, trigkey);
854  std::string value = ElRecomFileHelpers::getValueByKey(mapFileName, key);
855 
856  if (!value.empty()) {
857  m_corrFileNameList.push_back(value);
858  } else {
859  if (mapFileName.empty()) {
861  "Map file does not exist, Please set the path and version properly..");
862  } else {
864  "Key "
865  << key
866  << " does not exist in the map file, Please configure it properly..");
867  }
868  return StatusCode::FAILURE;
869  }
870 
871  ATH_MSG_DEBUG("Full File Name is " + value);
872  return StatusCode::SUCCESS;
873 }
874 /*
875  * Metadata methods.
876  * The tool operates in MC .
877  * The default type is Full sim.
878  *
879  * The user can override the MC type
880  * in which case we avoid doing anything.
881  *
882  * The typical scenario is :
883  * For every IncidentType::BeginInputFile we can check for metadata
884  * and try to employ them in determining the simulation Flavor.
885  * If we found metadata
886  * set m_metadata_retrieved= True else set it to False
887  *
888  * EndInputFile should not do something
889  *
890  * The beginEvent should kick in only if the beginInputFile has
891  * failed to find metadata and the user has no preference.
892  * Asg/base class has our back in cases where the 1st beginEvent
893  * happens before the 1st beginInputFile.
894  * For now we can not do something meaningfull in this method
895  * for this tool so can stay as a skeleton for the future
896  */
899 {
900 
901  // User forced a particular dataType
902  if (m_dataTypeOverwrite != -1)
903  return StatusCode::SUCCESS;
904 
905  PATCore::ParticleDataType::DataType dataType_metadata;
906  const StatusCode status = get_simType_from_metadata(dataType_metadata);
907  // Metadata got retrieved
908  if (status == StatusCode::SUCCESS) {
909  m_metadata_retrieved = true;
910  ATH_MSG_DEBUG("metadata from new file: "
911  << (dataType_metadata == PATCore::ParticleDataType::Data
912  ? "data"
913  : (dataType_metadata == PATCore::ParticleDataType::Full
914  ? "full simulation"
915  : "fast simulation")));
916 
917  if (dataType_metadata != PATCore::ParticleDataType::Data) {
918  if (m_dataTypeOverwrite == -1) {
919  m_dataType = dataType_metadata;
920  } else {
922  "Applying SF corrections to data while they make sense only for MC");
923  }
924  }
925  } else { // not able to retrieve metadata
926  m_metadata_retrieved = false;
927  ATH_MSG_DEBUG("not able to retrieve metadata");
928  }
929  return StatusCode::SUCCESS;
930 }
931 
934 {
935 
936  if (m_dataTypeOverwrite != -1)
937  return StatusCode::SUCCESS;
939  return StatusCode::SUCCESS;
940 
941  m_metadata_retrieved = true;
942  return StatusCode::SUCCESS;
943 }
944 
948 {
949 
950 #ifndef XAOD_STANDALONE
951  // Determine MC/Data
952  std::string dataType("");
954  "/TagInfo", "project_name", dataType, inputMetaStore()))
955  .isSuccess()) {
956  if (!(dataType == "IS_SIMULATION")) {
958  ATH_MSG_DEBUG("Running on data");
959  return StatusCode::SUCCESS;
960  }
961  // Determine Fast/FullSim
962  if (dataType == "IS_SIMULATION") {
963  std::string simType("");
964  ATH_CHECK(AthAnalysisHelper::retrieveMetadata("/Simulation/Parameters",
965  "SimulationFlavour",
966  simType,
967  inputMetaStore()));
968  std::transform(simType.begin(), simType.end(), simType.begin(), ::toupper);
969  result = (simType.find("ATLFAST") == std::string::npos)
972  return StatusCode::SUCCESS;
973  }
974  }
975 #endif
976  // Here's how things will work dual use, when file metadata is available in
977  // files
978  if (inputMetaStore()->contains<xAOD::FileMetaData>("FileMetaData")) {
979  const xAOD::FileMetaData* fmd = nullptr;
980  ATH_CHECK(inputMetaStore()->retrieve(fmd, "FileMetaData"));
981 
982  std::string simType("");
983  const bool s = fmd->value(xAOD::FileMetaData::simFlavour, simType);
984  if (!s) {
985  ATH_MSG_DEBUG("no sim flavour from metadata: must be data");
987  return StatusCode::SUCCESS;
988  } else {
989  ATH_MSG_DEBUG("sim type = " + simType);
990  std::transform(simType.begin(), simType.end(), simType.begin(), ::toupper);
991  result = (simType.find("ATLFAST") == std::string::npos)
994  return StatusCode::SUCCESS;
995  }
996  } else { // no metadata in the file
997  ATH_MSG_DEBUG("no metadata found in the file");
998  return StatusCode::FAILURE;
999  }
1000 }
1001 
1002 
1003 
1005 {
1006  const Accessors& acc = *m_accessors;
1008  {
1009  double sf = 0;
1011  {
1013  acc.m_sfDec(electron) = sf;
1014  acc.m_validDec(electron) = true;
1015  break;
1017  acc.m_sfDec(electron) = sf;
1018  acc.m_validDec(electron) = false;
1019  break;
1020  default:
1021  throw std::runtime_error("Error in getEfficiencyScaleFactor");
1022  }
1023  }
1024 }
1025 
1027 {
1028  const Accessors& acc = *m_accessors;
1030  {
1031  auto eventInfo = acc.m_eventInfo(event);
1032  callSingleEvent (acc.m_electrons(event), eventInfo);
1033  }
1034 }
python.PyKernel.retrieve
def retrieve(aClass, aKey=None)
Definition: PyKernel.py:110
AsgElectronEfficiencyCorrectionTool::getFile
virtual StatusCode getFile(const std::string &recokey, const std::string &idkey, const std::string &isokey, const std::string &trigkey)
Gets the correction filename from map.
Definition: AsgElectronEfficiencyCorrectionTool.cxx:845
python.Dso.registry
registry
Definition: Control/AthenaServices/python/Dso.py:158
AsgElectronEfficiencyCorrectionTool::m_correlation_model
int m_correlation_model
Definition: AsgElectronEfficiencyCorrectionTool.h:169
CaloCondBlobAlgs_fillNoiseFromASCII.sysName
sysName
Definition: CaloCondBlobAlgs_fillNoiseFromASCII.py:92
AsgElectronEfficiencyCorrectionTool::applySystematicVariation
virtual StatusCode applySystematicVariation(const CP::SystematicSet &systConfig) override final
Configure this tool for the given systematics.
Definition: AsgElectronEfficiencyCorrectionTool.cxx:598
et
Extra patterns decribing particle interation process.
CP::SystematicSet::getToyVariationByBaseName
std::pair< unsigned, float > getToyVariationByBaseName(const std::string &basename) const
the toy variation for the given basename
Definition: SystematicSet.cxx:201
AsgElectronEfficiencyCorrectionTool::m_corrFileNameList
std::vector< std::string > m_corrFileNameList
The list of file names.
Definition: AsgElectronEfficiencyCorrectionTool.h:181
AsgElectronEfficiencyCorrectionTool::recommendedSystematics
virtual CP::SystematicSet recommendedSystematics() const override final
returns: the list of all systematics this tool recommends to use
Definition: AsgElectronEfficiencyCorrectionTool.cxx:592
get_generator_info.result
result
Definition: get_generator_info.py:21
AsgElectronEfficiencyCorrectionTool::m_idKey
std::string m_idKey
Definition: AsgElectronEfficiencyCorrectionTool.h:176
AsgElectronEfficiencyCorrectionTool::m_appliedSystematics
CP::SystematicSet * m_appliedSystematics
Currently applied systematics.
Definition: AsgElectronEfficiencyCorrectionTool.h:165
AsgElectronEfficiencyCorrectionTool::m_rootTool
std::unique_ptr< Root::TElectronEfficiencyCorrectionTool > m_rootTool
Pointer to the underlying ROOT based tool.
Definition: AsgElectronEfficiencyCorrectionTool.h:156
AsgElectronEfficiencyCorrectionTool::m_mapFile
std::string m_mapFile
Definition: AsgElectronEfficiencyCorrectionTool.h:172
AsgElectronEfficiencyCorrectionTool::InitSystematics
StatusCode InitSystematics()
initialize the systematics
Definition: AsgElectronEfficiencyCorrectionTool.cxx:646
correlationModel::FULL
@ FULL
Definition: AsgElectronEfficiencyCorrectionTool.cxx:49
xAOD::et
et
Definition: TrigEMCluster_v1.cxx:25
AsgElectronEfficiencyCorrectionTool::m_uncorrSimplfEtaBinsUser
std::vector< float > m_uncorrSimplfEtaBinsUser
Definition: AsgElectronEfficiencyCorrectionTool.h:220
CP::SystematicSet::size
size_t size() const
returns: size of the set
Definition: SystematicSet.h:71
CP::SystematicSet::empty
bool empty() const
returns: whether the set is empty
Definition: SystematicSet.h:67
PATCore::ParticleDataType::Fast
@ Fast
Definition: PATCoreEnums.h:22
asg
Definition: DataHandleTestTool.h:28
ElRecomFileHelpers.h
AsgElectronEfficiencyCorrectionTool::m_useRandomRunNumber
bool m_useRandomRunNumber
Definition: AsgElectronEfficiencyCorrectionTool.h:196
CP::SystematicSet
Class to wrap a set of SystematicVariations.
Definition: SystematicSet.h:31
correlationModel::SYST
@ SYST
Definition: AsgElectronEfficiencyCorrectionTool.cxx:52
AsgElectronEfficiencyCorrectionTool::currentUncorrSystRegion
int currentUncorrSystRegion(const double cluster_eta, const double et) const
Definition: AsgElectronEfficiencyCorrectionTool.cxx:755
downloadSingle.dataType
string dataType
Definition: downloadSingle.py:18
asg::AsgMetadataTool::inputMetaStore
MetaStorePtr_t inputMetaStore() const
Accessor for the input metadata store.
Definition: AsgMetadataTool.cxx:93
AsgElectronEfficiencyCorrectionTool::initialize
virtual StatusCode initialize() override final
Gaudi Service Interface method implementations.
Definition: AsgElectronEfficiencyCorrectionTool.cxx:150
AsgElectronEfficiencyCorrectionTool::registerSystematics
StatusCode registerSystematics()
Definition: AsgElectronEfficiencyCorrectionTool.cxx:579
athena.value
value
Definition: athena.py:124
AsgElectronEfficiencyCorrectionTool::m_resultName
std::string m_resultName
The string for the result.
Definition: AsgElectronEfficiencyCorrectionTool.h:187
AsgElectronEfficiencyCorrectionTool.h
xAOD::EgammaParameters::AuthorFwdElectron
const uint16_t AuthorFwdElectron
Electron reconstructed by the Forward cluster-based algorithm.
Definition: EgammaDefs.h:30
AsgElectronEfficiencyCorrectionTool::m_correlation_model_name
std::string m_correlation_model_name
Definition: AsgElectronEfficiencyCorrectionTool.h:168
CP::SystematicVariation
Definition: SystematicVariation.h:47
columnar::ObjectRange
a class representing a continuous sequence of objects (a.k.a. a container)
Definition: ContainerId.h:175
python.TrigEgammaMonitorHelper.TH2F
def TH2F(name, title, nxbins, bins_par2, bins_par3, bins_par4, bins_par5=None, bins_par6=None, path='', **kwargs)
Definition: TrigEgammaMonitorHelper.py:45
PATCore::ParticleDataType::Data
@ Data
Definition: PATCoreEnums.h:22
python.DataFormatRates.events
events
Definition: DataFormatRates.py:105
AsgElectronEfficiencyCorrectionTool::m_accessors
std::unique_ptr< Accessors > m_accessors
Definition: AsgElectronEfficiencyCorrectionTool.h:256
mapkey::sys
@ sys
Definition: TElectronEfficiencyCorrectionTool.cxx:42
AsgElectronEfficiencyCorrectionTool::m_defaultRandomRunNumber
int m_defaultRandomRunNumber
Definition: AsgElectronEfficiencyCorrectionTool.h:197
AsgElectronEfficiencyCorrectionTool::beginInputFile
virtual StatusCode beginInputFile() override final
Function called when a new input file is opened.
Definition: AsgElectronEfficiencyCorrectionTool.cxx:898
AsgElectronEfficiencyCorrectionTool::m_dataType
PATCore::ParticleDataType::DataType m_dataType
Definition: AsgElectronEfficiencyCorrectionTool.h:200
PATCore::ParticleDataType::DataType
DataType
Definition: PATCoreEnums.h:22
python.iconfTool.models.loaders.level
level
Definition: loaders.py:20
xAOD::FileMetaData_v1::value
bool value(MetaDataType type, std::string &val) const
Get a pre-defined string value out of the object.
Definition: FileMetaData_v1.cxx:195
AsgElectronEfficiencyCorrectionTool::m_isoKey
std::string m_isoKey
Definition: AsgElectronEfficiencyCorrectionTool.h:177
xAOD::FileMetaData_v1::simFlavour
@ simFlavour
Fast or Full sim [string].
Definition: FileMetaData_v1.h:76
PATCore::ParticleDataType::Full
@ Full
Definition: PATCoreEnums.h:22
python.setupRTTAlg.size
int size
Definition: setupRTTAlg.py:39
AsgElectronEfficiencyCorrectionTool::callSingleEvent
void callSingleEvent(columnar::ElectronRange electrons, columnar::EventInfoId event) const
Definition: AsgElectronEfficiencyCorrectionTool.cxx:1004
correlationModel::MCTOYS
@ MCTOYS
Definition: AsgElectronEfficiencyCorrectionTool.cxx:48
AsgElectronEfficiencyCorrectionTool::m_uncorrSimplfEtBinsUser
std::vector< float > m_uncorrSimplfEtBinsUser
Definition: AsgElectronEfficiencyCorrectionTool.h:221
AthCommonDataStore< AthCommonMsg< AlgTool > >::evtStore
ServiceHandle< StoreGateSvc > & evtStore()
The standard StoreGateSvc (event store) Returns (kind of) a pointer to the StoreGateSvc.
Definition: AthCommonDataStore.h:85
CP::CorrectionCode::OutOfValidityRange
@ OutOfValidityRange
Input object is out of validity range.
Definition: CorrectionCode.h:37
Root::TElectronEfficiencyCorrectionTool::Result
Definition: TElectronEfficiencyCorrectionTool.h:42
CP::CorrectionCode::Error
@ Error
Some error happened during the object correction.
Definition: CorrectionCode.h:36
histSizes.code
code
Definition: histSizes.py:129
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
ParticleGun_FastCalo_ChargeFlip_Config.energy
energy
Definition: ParticleGun_FastCalo_ChargeFlip_Config.py:78
AsgElectronEfficiencyCorrectionTool::m_toysBasename
std::string m_toysBasename
Definition: AsgElectronEfficiencyCorrectionTool.h:228
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
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
AsgElectronEfficiencyCorrectionTool::m_uncorrVarDown
std::vector< CP::SystematicVariation > m_uncorrVarDown
Definition: AsgElectronEfficiencyCorrectionTool.h:232
PlotPulseshapeFromCool.input
input
Definition: PlotPulseshapeFromCool.py:106
PATCoreEnums.h
AsgElectronEfficiencyCorrectionTool::m_nCorrSyst
int m_nCorrSyst
Definition: AsgElectronEfficiencyCorrectionTool.h:215
Amg::transform
Amg::Vector3D transform(Amg::Vector3D &v, Amg::Transform3D &tr)
Transform a point from a Trasformation3D.
Definition: GeoPrimitivesHelpers.h:156
AsgElectronEfficiencyCorrectionTool::m_recoKey
std::string m_recoKey
Definition: AsgElectronEfficiencyCorrectionTool.h:175
AsgElectronEfficiencyCorrectionTool::appliedSystematics
virtual const CP::SystematicSet & appliedSystematics() const override final
returns: the currently applied systematics
Definition: AsgElectronEfficiencyCorrectionTool.h:115
checkCorrelInHIST.prefix
dictionary prefix
Definition: checkCorrelInHIST.py:391
AsgElectronEfficiencyCorrectionTool::m_number_of_toys
int m_number_of_toys
Definition: AsgElectronEfficiencyCorrectionTool.h:206
AsgElectronEfficiencyCorrectionTool::m_resultPrefix
std::string m_resultPrefix
The prefix string for the result.
Definition: AsgElectronEfficiencyCorrectionTool.h:184
AthenaPoolTestRead.acc
acc
Definition: AthenaPoolTestRead.py:16
AsgElectronEfficiencyCorrectionTool::systUncorrVariationIndex
virtual int systUncorrVariationIndex(const xAOD::Electron &inputObject) const override final
Definition: AsgElectronEfficiencyCorrectionTool.cxx:808
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
AsgElectronEfficiencyCorrectionTool::m_seed_toys
int m_seed_toys
Definition: AsgElectronEfficiencyCorrectionTool.h:209
AsgElectronEfficiencyCorrectionTool::applyEfficiencyScaleFactor
virtual CP::CorrectionCode applyEfficiencyScaleFactor(const xAOD::Electron &inputObject) const override final
Definition: AsgElectronEfficiencyCorrectionTool.cxx:539
AsgElectronEfficiencyCorrectionTool::m_nUncorrSyst
int m_nUncorrSyst
Definition: AsgElectronEfficiencyCorrectionTool.h:216
DeMoUpdate.tmp
string tmp
Definition: DeMoUpdate.py:1167
correlationModel::COMBMCTOYS
@ COMBMCTOYS
Definition: AsgElectronEfficiencyCorrectionTool.cxx:47
xAOD::FileMetaData_v1
Class holding file-level metadata about an xAOD file.
Definition: FileMetaData_v1.h:34
AsgElectronEfficiencyCorrectionTool::m_scale_toys
double m_scale_toys
Definition: AsgElectronEfficiencyCorrectionTool.h:212
AsgElectronEfficiencyCorrectionTool::m_dataTypeOverwrite
int m_dataTypeOverwrite
Force the data type to a given value.
Definition: AsgElectronEfficiencyCorrectionTool.h:203
AsgElectronEfficiencyCorrectionTool::m_corrVarDown
std::vector< CP::SystematicVariation > m_corrVarDown
Definition: AsgElectronEfficiencyCorrectionTool.h:230
columnar::ObjectId
a class representing a single object (electron, muons, etc.)
Definition: ContainerId.h:176
PathResolver.h
AsgElectronEfficiencyCorrectionTool::~AsgElectronEfficiencyCorrectionTool
virtual ASG_TOOL_CLASS(AsgElectronEfficiencyCorrectionTool, IAsgElectronEfficiencyCorrectionTool) public ~AsgElectronEfficiencyCorrectionTool() override final
Standard destructor.
Definition: AsgElectronEfficiencyCorrectionTool.cxx:142
CP::SystematicSet::insert
void insert(const SystematicVariation &systematic)
description: insert a systematic into the set
Definition: SystematicSet.cxx:88
correlationModel::SIMPLIFIED
@ SIMPLIFIED
Definition: AsgElectronEfficiencyCorrectionTool.cxx:50
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:240
AsgElectronEfficiencyCorrectionTool::getEfficiencyScaleFactor
virtual CP::CorrectionCode getEfficiencyScaleFactor(const xAOD::Electron &inputObject, double &efficiencyScaleFactor) const override final
Definition: AsgElectronEfficiencyCorrectionTool.cxx:334
AsgElectronEfficiencyCorrectionTool::m_systFilter
std::unordered_map< CP::SystematicSet, CP::SystematicSet > m_systFilter
Systematics filter map.
Definition: AsgElectronEfficiencyCorrectionTool.h:159
ParticleDataType
Information about type of data used to fill particle.
Definition: Event/EventKernel/EventKernel/IParticle.h:35
AsgElectronEfficiencyCorrectionTool::m_eventInfoCollectionName
std::string m_eventInfoCollectionName
The Event info collection name.
Definition: AsgElectronEfficiencyCorrectionTool.h:193
AsgElectronEfficiencyCorrectionTool::get_simType_from_metadata
StatusCode get_simType_from_metadata(PATCore::ParticleDataType::DataType &result) const
Definition: AsgElectronEfficiencyCorrectionTool.cxx:946
AsgElectronEfficiencyCorrectionTool::m_trigKey
std::string m_trigKey
Definition: AsgElectronEfficiencyCorrectionTool.h:178
AsgElectronEfficiencyCorrectionTool::affectingSystematics
virtual CP::SystematicSet affectingSystematics() const override final
returns: the list of all systematics this tool can be affected by
Definition: AsgElectronEfficiencyCorrectionTool.cxx:572
AsgElectronEfficiencyCorrectionTool::Accessors
Definition: AsgElectronEfficiencyCorrectionTool.h:237
checkTriggerxAOD.found
found
Definition: checkTriggerxAOD.py:328
xAOD::Electron_v1
Definition: Electron_v1.h:34
AsgElectronEfficiencyCorrectionTool::isAffectedBySystematic
virtual bool isAffectedBySystematic(const CP::SystematicVariation &systematic) const override final
returns: whether this tool is affected by the given systematis
Definition: AsgElectronEfficiencyCorrectionTool.cxx:556
EventInfo.h
xAOD::EventInfo_v1
Class describing the basic event information.
Definition: EventInfo_v1.h:43
PathResolverFindCalibFile
std::string PathResolverFindCalibFile(const std::string &logical_file_name)
Definition: PathResolver.cxx:283
AsgElectronEfficiencyCorrectionTool::m_uncorrVarUp
std::vector< CP::SystematicVariation > m_uncorrVarUp
Definition: AsgElectronEfficiencyCorrectionTool.h:231
AthAnalysisHelper.h
AsgElectronEfficiencyCorrectionTool::callEvents
void callEvents(columnar::EventContextRange events) const override
Definition: AsgElectronEfficiencyCorrectionTool.cxx:1026
DeMoAtlasDataLoss.runNumber
string runNumber
Definition: DeMoAtlasDataLoss.py:64
CP::CorrectionCode::Ok
@ Ok
The correction was done successfully.
Definition: CorrectionCode.h:38
correlationModel
Definition: AsgElectronEfficiencyCorrectionTool.cxx:44
AsgElectronEfficiencyCorrectionTool::beginEvent
virtual StatusCode beginEvent() override final
Function called when a new events is loaded.
Definition: AsgElectronEfficiencyCorrectionTool.cxx:933
FileMetaData.h
ElRecomFileHelpers::convertToOneKey
std::string convertToOneKey(const std::string &recokey, const std::string &idkey, const std::string &isokey, const std::string &trigkey)
Definition: ElRecomFileHelpers.cxx:38
mapkey::sf
@ sf
Definition: TElectronEfficiencyCorrectionTool.cxx:38
AsgElectronEfficiencyCorrectionTool::m_nSimpleUncorrSyst
int m_nSimpleUncorrSyst
Definition: AsgElectronEfficiencyCorrectionTool.h:225
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
CP::SystematicVariation::empty
bool empty() const
returns: whether this is an empty systematic, i.e.
Definition: SystematicVariation.cxx:294
CP::SystematicRegistry
This module implements the central registry for handling systematic uncertainties with CP tools.
Definition: SystematicRegistry.h:25
correlationModel::model
model
Definition: AsgElectronEfficiencyCorrectionTool.cxx:46
AsgElectronEfficiencyCorrectionTool::m_affectedSys
CP::SystematicSet m_affectedSys
Affected systematic, should be done only once.
Definition: AsgElectronEfficiencyCorrectionTool.h:162
CP::SystematicSet::begin
const_iterator begin() const
description: const iterator to the beginning of the set
Definition: SystematicSet.h:55
DeMoScan.first
bool first
Definition: DeMoScan.py:534
AsgElectronEfficiencyCorrectionTool::m_corrVarUp
std::vector< CP::SystematicVariation > m_corrVarUp
Definition: AsgElectronEfficiencyCorrectionTool.h:229
AsgElectronEfficiencyCorrectionTool::m_UncorrRegions
TH2F * m_UncorrRegions
Definition: AsgElectronEfficiencyCorrectionTool.h:224
AthCommonMsg< AlgTool >::msg
MsgStream & msg() const
Definition: AthCommonMsg.h:24
CP::CorrectionCode
Return value from object correction CP tools.
Definition: CorrectionCode.h:31
xAOD::EgammaParameters::electron
@ electron
Definition: EgammaEnums.h:18
CaloCellTimeCorrFiller.filename
filename
Definition: CaloCellTimeCorrFiller.py:23
python.SystemOfUnits.s
float s
Definition: SystemOfUnits.py:147
AsgElectronEfficiencyCorrectionTool::m_pteta_bins
std::vector< std::pair< float, std::vector< float > > > m_pteta_bins
Definition: AsgElectronEfficiencyCorrectionTool.h:217
ParticleDataType::Full
@ Full
Definition: Event/EventKernel/EventKernel/IParticle.h:36
AsgElectronEfficiencyCorrectionTool::m_sysSubstring
std::string m_sysSubstring
Definition: AsgElectronEfficiencyCorrectionTool.h:190
merge.status
status
Definition: merge.py:16
AsgElectronEfficiencyCorrectionTool::m_metadata_retrieved
bool m_metadata_retrieved
To check if the metadata can be retrieved.
Definition: AsgElectronEfficiencyCorrectionTool.h:153
Electron.h
LArCellNtuple.ifile
string ifile
Definition: LArCellNtuple.py:133
PATCore
Information about type of data used to fill particle.
Definition: PATCoreEnums.h:19
columnar::resetAccessor
void resetAccessor(AccessorTemplate< CI, CT, CAM, CM > &accessor, ColumnarTool< CM > &columnBase, const std::string &name, ColumnInfo &&info={})
reset a column accessor to point to a new column
Definition: ColumnAccessor.h:210
ElRecomFileHelpers::getValueByKey
std::string getValueByKey(const std::string &mapFile, const std::string &key)
Definition: ElRecomFileHelpers.cxx:75
CP::SystematicVariation::makeToyEnsemble
static SystematicVariation makeToyEnsemble(const std::string &basename)
constructor for toy systematics ensemble
Definition: SystematicVariation.cxx:258
InDetDD::electrons
@ electrons
Definition: InDetDD_Defs.h:17
CP::SystematicSet::filterForAffectingSystematics
static StatusCode filterForAffectingSystematics(const SystematicSet &systConfig, const SystematicSet &affectingSystematics, SystematicSet &filteredSystematics)
description: filter the systematics for the affected systematics returns: success guarantee: strong f...
Definition: SystematicSet.cxx:213
correlationModel::TOTAL
@ TOTAL
Definition: AsgElectronEfficiencyCorrectionTool.cxx:51
AuxElement.h
Base class for elements of a container that can have aux data.
CP::SystematicRegistry::getInstance
static SystematicRegistry & getInstance()
Get the singleton instance of the registry for the curren thread.
Definition: SystematicRegistry.cxx:25
AthAnalysisHelper::retrieveMetadata
static std::string retrieveMetadata(const std::string &folder, const std::string &key, const ServiceHandle< StoreGateSvc > &inputMetaStore)
method that always returns as a string you can use from, e.g, pyROOT with evt = ROOT....
Definition: AthAnalysisHelper.h:254
AsgElectronEfficiencyCorrectionTool::currentSimplifiedUncorrSystRegion
int currentSimplifiedUncorrSystRegion(const double cluster_eta, const double et) const
Definition: AsgElectronEfficiencyCorrectionTool.cxx:716
mapkey::key
key
Definition: TElectronEfficiencyCorrectionTool.cxx:37