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 {
73  // Create an instance of the underlying ROOT tool
74  m_rootTool = std::make_unique<Root::TElectronEfficiencyCorrectionTool>(
75  ("T" + (this->name())).c_str());
76  // Declare the needed properties
78  "CorrectionFileNameList",
79  m_corrFileNameList,
80  "List of file names that store the correction factors for simulation.");
81  declareProperty("MapFilePath",
82  m_mapFile = "ElectronEfficiencyCorrection/2015_2025/rel22.2/"
83  "2022_Summer_Prerecom_v1/map4.txt",
84  "Full path to the map file");
86  "RecoKey", m_recoKey = "", "Key associated with reconstruction");
88  "IdKey", m_idKey = "", "Key associated with identification working point");
90  "IsoKey", m_isoKey = "", "Key associated with isolation working point");
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)");
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.");
119  "UncorrEtaBinsUser",
120  m_uncorrSimplfEtaBinsUser = { 0.0, 1.37, 4.9 },
121  "Custom Eta/Pt binning for the SIMPLIFIED correlation model.");
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  // Initialize the systematics
302  if (InitSystematics() != StatusCode::SUCCESS) {
303  ATH_MSG_ERROR("(InitSystematics() != StatusCode::SUCCESS)");
304  return StatusCode::FAILURE;
305  }
306  // Add the recommended systematics to the registry
307  if (registerSystematics() != StatusCode::SUCCESS) {
308  ATH_MSG_ERROR("(registerSystematics() != StatusCode::SUCCESS)");
309  return StatusCode::FAILURE;
310  }
311  // Configure for nominal systematics
312  if (applySystematicVariation(CP::SystematicSet()) != StatusCode::SUCCESS) {
313  ATH_MSG_ERROR("Could not configure for nominal settings");
314  return StatusCode::FAILURE;
315  }
316  return StatusCode::SUCCESS;
317 }
318 
321  const xAOD::Electron& inputObject,
322  double& efficiencyScaleFactor) const
323 {
324 
325  efficiencyScaleFactor = 1;
326  // Retrieve the proper random Run Number
327  unsigned int runNumber = m_defaultRandomRunNumber;
328  if (m_useRandomRunNumber) {
329  const xAOD::EventInfo* eventInfo =
331  if (!eventInfo) {
332  ATH_MSG_ERROR("Could not retrieve EventInfo object!");
334  }
335  static const SG::AuxElement::Accessor<unsigned int> randomrunnumber(
336  "RandomRunNumber");
337  if (!randomrunnumber.isAvailable(*eventInfo)) {
339  "Pileup tool not run before using ElectronEfficiencyTool! SFs do not "
340  "reflect PU distribution in data");
342  }
343  runNumber = randomrunnumber(*(eventInfo));
344  }
345  //
346  // Get the result
347  //
348  double cluster_eta(-9999.9);
349 
350  const xAOD::CaloCluster* cluster = inputObject.caloCluster();
351  if (!cluster) {
352  ATH_MSG_ERROR("ERROR no cluster associated to the Electron \n");
354  }
355 
356  // we need to use different variables for central and forward electrons
357  static const SG::AuxElement::ConstAccessor<uint16_t> accAuthor("author");
358  if (accAuthor.isAvailable(inputObject) &&
359  accAuthor(inputObject) == xAOD::EgammaParameters::AuthorFwdElectron) {
360  cluster_eta = cluster->eta();
361  } else {
362  cluster_eta = cluster->etaBE(2);
363  }
364 
365  // use et from cluster because it is immutable under syst variations of
366  // electron energy scale
367  const double energy = cluster->e();
368  const double parEta = inputObject.eta();
369  const double coshEta = std::cosh(parEta);
370  double et = (coshEta != 0.) ? energy / coshEta : 0.;
371  // allow for a 5% margin at the lowest pT bin boundary (i.e. increase et by 5%
372  // for sub-threshold electrons). This assures that electrons that pass the
373  // threshold only under syst variations of energy get a scale factor assigned.
374  auto itr_pt = m_pteta_bins.begin();
375  if (itr_pt != m_pteta_bins.end() && et < itr_pt->first) {
376  et = et * 1.05;
377  }
378  return getEfficiencyScaleFactor(et, cluster_eta, runNumber,
379  efficiencyScaleFactor);
380 }
381 
384  const double et, /*in MeV*/
385  const double cluster_eta, /*cluster*/
386  const unsigned int runNumber,
387  double& efficiencyScaleFactor) const
388 {
389  // We pass only one variation per time
390  // The applied systematic is always one systematic.
391  // Either is relevant and acquires a value
392  // or stays 0.
393  double sys(0);
394 
395  // Let's try to figure already what we are to do
396  bool doSFOnly = appliedSystematics().empty();
397  bool doToys = (m_correlation_model == correlationModel::MCTOYS ||
399  bool isTotal = (m_correlation_model == correlationModel::TOTAL);
400  bool isFull = (m_correlation_model == correlationModel::FULL);
401  bool isSimplified = (m_correlation_model == correlationModel::SIMPLIFIED);
402 
403  // Lets see if we have an uncorrelated syst variation passed
404  int unCorrSign = 0;
405  // or a correlated one
406  int indexCorrelated = -999;
407  int correlatedSign = 0;
408  if (!(doSFOnly || doToys || isTotal) && (isFull || isSimplified)) {
409  const auto& sysName = appliedSystematics().begin()->name();
410  bool isUncorr = (sysName.find("UncorrUnc") != std::string::npos);
411  int currentUncorReg = -999;
412  if (isUncorr) {
413  // Can we find an uncorrelated region?
414  if (isFull) {
415  currentUncorReg = currentUncorrSystRegion(cluster_eta, et);
416  } else if (isSimplified) {
417  currentUncorReg = currentSimplifiedUncorrSystRegion(cluster_eta, et);
418  }
419  if (currentUncorReg < 0) {
421  }
422  // And use it to if we got the "right" syst variation
423  if (appliedSystematics().matchSystematic(
424  m_uncorrVarDown[currentUncorReg])) {
425  unCorrSign = -1;
426  } else if (appliedSystematics().matchSystematic(
427  m_uncorrVarUp[currentUncorReg])) {
428  unCorrSign = 1;
429  }
430  } else if (m_nCorrSyst != 0) {//if we have 0 we do not care ...
431  if (sysName.find("CorrUnc") != std::string::npos) {
432  // given the name convention we
433  const auto varNumEnd = sysName.rfind("__");
434  const auto varNumBegin = sysName.rfind("NP") + 2;
435  const int varIndex =
436  std::stoi(sysName.substr(varNumBegin, (varNumEnd - varNumBegin)));
437  if (appliedSystematics().matchSystematic(m_corrVarUp[varIndex])) {
438  indexCorrelated = varIndex;
439  correlatedSign = 1;
440  } else if (appliedSystematics().matchSystematic(
441  m_corrVarDown[varIndex])) {
442  indexCorrelated = varIndex;
443  correlatedSign = -1;
444  }
445  } // find CorrUncertainty in name
446  } // not Uncorr and we have CorrSyst
447  } // Not (SF or toys or total)
448 
449  // Now lets do the call
450  // For now we more or less calculate on demand only
451  // the Correlated and the toys we can see if we want
452  // top opt also the "TOTAL"
454  const int status =
455  m_rootTool->calculate(m_dataType, runNumber, cluster_eta, et, /* in MeV */
456  result, isTotal);
457 
458  // if status 0 something went wrong
459  if (!status) {
460  efficiencyScaleFactor = 1;
462  }
463  // At this point we have the SF
464  efficiencyScaleFactor = result.SF;
465  //And if all we need we can return
466  if (doSFOnly) {
467  return CP::CorrectionCode::Ok;
468  }
469 
470  // First the logic if the user requested toys
471  if (doToys) {
473  toy.second = m_scale_toys;
474  sys = result.toys[toy.first - 1] * m_scale_toys;
475  // return here for Toy variations
476  efficiencyScaleFactor = sys;
477  return CP::CorrectionCode::Ok;
478  }
479  // The "TOTAL" single uncertainty uncorrelated+correlated
480  else if (isTotal) {
481  sys = result.Total;
482  if (appliedSystematics().matchSystematic(m_uncorrVarUp[0])) {
483  return HelperFunc(efficiencyScaleFactor, sys);
484  }
485  if (appliedSystematics().matchSystematic(m_uncorrVarDown[0])) {
486  return HelperFunc(efficiencyScaleFactor, -1 * sys);
487  }
488  }
489  // Then the uncorrelated part for the SiMPLIFIED/FULL models
490  else if (unCorrSign!=0) {
491  sys = unCorrSign * result.UnCorr;
492  return HelperFunc(efficiencyScaleFactor, sys);
493  }
494 
495  // If we reach this point
496  // it means we need to do the correlated part
497  // for the FULL/SIMPLIFIED models.
498  // First if there are not correlated systematic
499  if (m_nCorrSyst == 0) {
500 
501  if (appliedSystematics().matchSystematic(m_corrVarUp[0])) {
502  sys = std::sqrt(result.Total * result.Total -
503  result.UnCorr * result.UnCorr); // total
504  // -stat
505  return HelperFunc(efficiencyScaleFactor, sys);
506  }
507  if (appliedSystematics().matchSystematic(m_corrVarDown[0])) {
508  sys = -1 * std::sqrt(result.Total * result.Total -
509  result.UnCorr * result.UnCorr); // total
510  // -stat
511  return HelperFunc(efficiencyScaleFactor, sys);
512  }
513  }
514  //or if we had
515  if (correlatedSign != 0) {
516  sys = correlatedSign * result.Corr[indexCorrelated];
517  return HelperFunc(efficiencyScaleFactor, sys);
518  }
519  return CP::CorrectionCode::Ok;
520 }
521 
524  const xAOD::Electron& inputObject) const
525 {
526  double efficiencyScaleFactor = 1.0;
528  getEfficiencyScaleFactor(inputObject, efficiencyScaleFactor);
530  m_resultName + "SF");
531  dec(inputObject) = efficiencyScaleFactor;
532  return result;
533 }
534 
535 /*
536  * Systematics Interface
537  */
539 bool
541  const CP::SystematicVariation& systematic) const
542 {
543  if (systematic.empty()) {
544  return false;
545  }
549  return (sys.begin()->ensembleContains(systematic));
550  } else {
551  return (sys.find(systematic) != sys.end());
552  }
553 }
557 {
558  return m_affectedSys;
559 }
560 // Register the systematics with the registry and add them to the recommended
561 // list
564 {
566 
567  if (registry.registerSystematics(*this) != StatusCode::SUCCESS) {
569  "Failed to add systematic to list of recommended systematics.");
570  return StatusCode::FAILURE;
571  }
572  return StatusCode::SUCCESS;
573 }
577 {
578  return affectingSystematics();
579 }
583  const CP::SystematicSet& systConfig)
584 {
585  // First, check if this configuration exists in the filtered map/registy
586  auto itr = m_systFilter.find(systConfig);
587 
588  if (itr != m_systFilter.end()) {
589  CP::SystematicSet& mySysConf = itr->second;
590  m_appliedSystematics = &mySysConf;
591  }
592  // if not, we should register it, after it passes sanity checks
593  else {
594  // If it's a new input set, we need to filter it
595  CP::SystematicSet affectingSys = affectingSystematics();
596  CP::SystematicSet filteredSys;
598  systConfig, affectingSys, filteredSys)) {
600  "Unsupported combination of systematic variations passed to the tool!");
601  return StatusCode::FAILURE;
602  }
603  // Does filtered make sense, only one per time
604  if (filteredSys.size() > 1) {
606  "More than one systematic variation passed at the same time");
607  return StatusCode::FAILURE;
608  }
609 
610  if (filteredSys.empty() && !systConfig.empty()) {
611  ATH_MSG_DEBUG("systematics : ");
612  for (const auto& syst : systConfig) {
613  ATH_MSG_DEBUG(syst.name());
614  }
615  ATH_MSG_DEBUG(" Not supported ");
616  }
617  // insert to the registy
618  itr = m_systFilter.insert(std::make_pair(systConfig, filteredSys)).first;
619  // And return directly
620  CP::SystematicSet& mySysConf = itr->second;
621  m_appliedSystematics = &mySysConf;
622  }
623  return StatusCode::SUCCESS;
624 }
625 
626 /*
627  * Helper Methods
628  */
631 {
632  const std::string prefix = "EL_EFF_" + m_sysSubstring;
633  const std::string prefixUncorr = prefix + m_correlation_model_name + "_";
634  // Toys
636  m_toysBasename = prefix + "COMBMCTOY";
640  m_toysBasename = prefix + "MCTOY";
643  // Correlated for the different models (1 or Full set)
645  if (m_nCorrSyst == 0) {
646  auto varUp = CP::SystematicVariation(prefix + "CorrUncertainty", 1);
647  auto varDown = CP::SystematicVariation(prefix + "CorrUncertainty", -1);
648  m_corrVarUp.push_back(varUp);
649  m_corrVarDown.push_back(varDown);
650  m_affectedSys.insert(varUp);
651  m_affectedSys.insert(varDown);
652  } else
653  for (int i = 0; i < m_nCorrSyst; ++i) {
654  auto varUp =
655  CP::SystematicVariation(prefix + Form("CorrUncertaintyNP%d", i), 1);
656  auto varDown =
657  CP::SystematicVariation(prefix + Form("CorrUncertaintyNP%d", i), -1);
658  m_corrVarUp.push_back(varUp);
659  m_corrVarDown.push_back(varDown);
660  m_affectedSys.insert(varUp);
661  m_affectedSys.insert(varDown);
662  }
663  }
664  // Different tratement for the uncorrelated per model
666  auto varUp = CP::SystematicVariation(prefixUncorr + "1NPCOR_PLUS_UNCOR", 1);
667  auto varDown =
668  CP::SystematicVariation(prefixUncorr + "1NPCOR_PLUS_UNCOR", -1);
669  m_uncorrVarUp.push_back(varUp);
670  m_uncorrVarDown.push_back(varDown);
671  m_affectedSys.insert(varUp);
672  m_affectedSys.insert(varDown);
674  for (int i = 0; i < m_nUncorrSyst; ++i) {
675  auto varUp = CP::SystematicVariation(
676  prefixUncorr + Form("UncorrUncertaintyNP%d", i), 1);
677  auto varDown = CP::SystematicVariation(
678  prefixUncorr + Form("UncorrUncertaintyNP%d", i), -1);
679  m_uncorrVarUp.push_back(varUp);
680  m_uncorrVarDown.push_back(varDown);
681  m_affectedSys.insert(varUp);
682  m_affectedSys.insert(varDown);
683  }
685  for (int i = 0; i < m_nSimpleUncorrSyst; ++i) {
686  auto varUp = CP::SystematicVariation(
687  prefixUncorr + Form("UncorrUncertaintyNP%d", i), 1);
688  auto varDown = CP::SystematicVariation(
689  prefixUncorr + Form("UncorrUncertaintyNP%d", i), -1);
690  m_uncorrVarUp.push_back(varUp);
691  m_uncorrVarDown.push_back(varDown);
692  m_affectedSys.insert(varUp);
693  m_affectedSys.insert(varDown);
694  }
695  }
696  return StatusCode::SUCCESS;
697 }
698 
699 int
701  const double cluster_eta,
702  const double et) const
703 {
704  int ptbin = std::as_const(*m_UncorrRegions).GetXaxis()->FindBin(et) - 1;
705  if (ptbin < 0 ||
706  ptbin >= std::as_const(*m_UncorrRegions).GetXaxis()->GetNbins()) {
708  " Found electron with Et = "
709  << et / 1000. << " GeV, where you specified boundaries of ["
710  << std::as_const(*m_UncorrRegions).GetXaxis()->GetBinLowEdge(1) << ","
711  << std::as_const(*m_UncorrRegions)
712  .GetXaxis()
713  ->GetBinUpEdge(
714  std::as_const(*m_UncorrRegions).GetXaxis()->GetNbins())
715  << "] for the SIMPLIFIED correlation model ");
716  return -1;
717  }
718  int etabin =
719  std::as_const(*m_UncorrRegions).GetYaxis()->FindBin(std::abs(cluster_eta)) -
720  1;
721  if (etabin < 0 ||
722  etabin >= std::as_const(*m_UncorrRegions).GetYaxis()->GetNbins()) {
724  " Found electron with |eta| = "
725  << std::abs(cluster_eta) << ", where you specified boundaries of ["
726  << std::as_const(*m_UncorrRegions).GetYaxis()->GetBinLowEdge(1) << ","
727  << std::as_const(*m_UncorrRegions)
728  .GetYaxis()
729  ->GetBinUpEdge(
730  std::as_const(*m_UncorrRegions).GetYaxis()->GetNbins())
731  << "] for the SIMPLIFIED correlation model ");
732  return -1;
733  }
734  int reg = ((etabin)*m_UncorrRegions->GetNbinsX() + ptbin);
735  return reg;
736 }
737 
738 int
740  const double cluster_eta,
741  const double et) const
742 {
743  int etabin = 0;
744  int reg = 0;
745  bool found = false;
746  float cluster_eta_electron = 0;
747  auto itr_ptBEGIN = m_pteta_bins.begin();
748  auto itr_ptEND = m_pteta_bins.end();
749  for (; itr_ptBEGIN != itr_ptEND; ++itr_ptBEGIN) {
750  auto itr_ptBEGINplusOne = itr_ptBEGIN;
751  ++itr_ptBEGINplusOne;
752  // Find the pt bin : Larger or equal from the current and the next one is
753  // the last or the next one is larger.
754  if (et >= itr_ptBEGIN->first &&
755  (itr_ptBEGINplusOne == itr_ptEND || et < itr_ptBEGINplusOne->first)) {
756  if ((itr_ptBEGIN->second).at(0) >= 0) {
757  cluster_eta_electron = std::abs(cluster_eta);
758  } else {
759  cluster_eta_electron = (cluster_eta);
760  };
761  for (unsigned int etab = 0; etab < ((itr_ptBEGIN->second).size());
762  ++etab) {
763  unsigned int etabnext = etab + 1;
764  // Find the eta bin : Larger or equal from the current and the next one
765  // is the last or the next one is larger:.
766  if ((cluster_eta_electron) >= (itr_ptBEGIN->second).at(etab) &&
767  (etabnext == itr_ptBEGIN->second.size() ||
768  cluster_eta_electron < itr_ptBEGIN->second.at(etabnext))) {
769  found = true;
770  break;
771  }
772  // We did not find it. Increment eta and continue looking
773  etabin++;
774  }
775  }
776  if (found) {
777  break;
778  }
779  // Add the full size of the "passed" eta row
780  reg += (itr_ptBEGIN->second).size();
781  }
782  if (!found) {
783  ATH_MSG_WARNING("No index for the uncorrelated systematic was found, "
784  "returning the maximum index");
785  return m_nCorrSyst;
786  }
787  reg = reg + etabin;
788  return reg;
789 }
790 
791 int
793  const xAOD::Electron& inputObject) const
794 {
795  int currentSystRegion = -999;
796  double cluster_eta(-9999.9);
797  double et(0.0);
798 
799  et = inputObject.pt();
800  const xAOD::CaloCluster* cluster = inputObject.caloCluster();
801  if (!cluster) {
802  ATH_MSG_ERROR("ERROR no cluster associated to the Electron \n");
803  return currentSystRegion;
804  }
805  cluster_eta = cluster->etaBE(2);
806  switch (m_correlation_model) {
808  currentSystRegion = currentSimplifiedUncorrSystRegion(cluster_eta, et);
809  break;
810  }
811  case correlationModel::FULL: {
812  currentSystRegion = currentUncorrSystRegion(cluster_eta, et);
813  break;
814  }
815  default: {
816  // not there for the other models
817  break;
818  }
819  }
820  return currentSystRegion;
821 }
822 
826  const std::string& idkey,
827  const std::string& isokey,
828  const std::string& trigkey)
829 {
830 
831  std::string mapFileName = PathResolverFindCalibFile(m_mapFile);
832  std::string key =
833  ElRecomFileHelpers::convertToOneKey(recokey, idkey, isokey, trigkey);
834  std::string value = ElRecomFileHelpers::getValueByKey(mapFileName, key);
835 
836  if (!value.empty()) {
837  m_corrFileNameList.push_back(value);
838  } else {
839  if (mapFileName.empty()) {
841  "Map file does not exist, Please set the path and version properly..");
842  } else {
844  "Key "
845  << key
846  << " does not exist in the map file, Please configure it properly..");
847  }
848  return StatusCode::FAILURE;
849  }
850 
851  ATH_MSG_DEBUG("Full File Name is " + value);
852  return StatusCode::SUCCESS;
853 }
854 /*
855  * Metadata methods.
856  * The tool operates in MC .
857  * The default type is Full sim.
858  *
859  * The user can override the MC type
860  * in which case we avoid doing anything.
861  *
862  * The typical scenario is :
863  * For every IncidentType::BeginInputFile we can check for metadata
864  * and try to employ them in determining the simulation Flavor.
865  * If we found metadata
866  * set m_metadata_retrieved= True else set it to False
867  *
868  * EndInputFile should not do something
869  *
870  * The beginEvent should kick in only if the beginInputFile has
871  * failed to find metadata and the user has no preference.
872  * Asg/base class has our back in cases where the 1st beginEvent
873  * happens before the 1st beginInputFile.
874  * For now we can not do something meaningfull in this method
875  * for this tool so can stay as a skeleton for the future
876  */
879 {
880 
881  // User forced a particular dataType
882  if (m_dataTypeOverwrite != -1)
883  return StatusCode::SUCCESS;
884 
885  PATCore::ParticleDataType::DataType dataType_metadata;
886  const StatusCode status = get_simType_from_metadata(dataType_metadata);
887  // Metadata got retrieved
888  if (status == StatusCode::SUCCESS) {
889  m_metadata_retrieved = true;
890  ATH_MSG_DEBUG("metadata from new file: "
891  << (dataType_metadata == PATCore::ParticleDataType::Data
892  ? "data"
893  : (dataType_metadata == PATCore::ParticleDataType::Full
894  ? "full simulation"
895  : "fast simulation")));
896 
897  if (dataType_metadata != PATCore::ParticleDataType::Data) {
898  if (m_dataTypeOverwrite == -1) {
899  m_dataType = dataType_metadata;
900  } else {
902  "Applying SF corrections to data while they make sense only for MC");
903  }
904  }
905  } else { // not able to retrieve metadata
906  m_metadata_retrieved = false;
907  ATH_MSG_DEBUG("not able to retrieve metadata");
908  }
909  return StatusCode::SUCCESS;
910 }
911 
914 {
915 
916  if (m_dataTypeOverwrite != -1)
917  return StatusCode::SUCCESS;
919  return StatusCode::SUCCESS;
920 
921  m_metadata_retrieved = true;
922  return StatusCode::SUCCESS;
923 }
924 
928 {
929 
930 #ifndef XAOD_STANDALONE
931  // Determine MC/Data
932  std::string dataType("");
934  "/TagInfo", "project_name", dataType, inputMetaStore()))
935  .isSuccess()) {
936  if (!(dataType == "IS_SIMULATION")) {
938  ATH_MSG_DEBUG("Running on data");
939  return StatusCode::SUCCESS;
940  }
941  // Determine Fast/FullSim
942  if (dataType == "IS_SIMULATION") {
943  std::string simType("");
944  ATH_CHECK(AthAnalysisHelper::retrieveMetadata("/Simulation/Parameters",
945  "SimulationFlavour",
946  simType,
947  inputMetaStore()));
948  std::transform(simType.begin(), simType.end(), simType.begin(), ::toupper);
949  result = (simType.find("ATLFAST") == std::string::npos)
952  return StatusCode::SUCCESS;
953  }
954  }
955 #endif
956  // Here's how things will work dual use, when file metadata is available in
957  // files
958  if (inputMetaStore()->contains<xAOD::FileMetaData>("FileMetaData")) {
959  const xAOD::FileMetaData* fmd = nullptr;
960  ATH_CHECK(inputMetaStore()->retrieve(fmd, "FileMetaData"));
961 
962  std::string simType("");
963  const bool s = fmd->value(xAOD::FileMetaData::simFlavour, simType);
964  if (!s) {
965  ATH_MSG_DEBUG("no sim flavour from metadata: must be data");
967  return StatusCode::SUCCESS;
968  } else {
969  ATH_MSG_DEBUG("sim type = " + simType);
970  std::transform(simType.begin(), simType.end(), simType.begin(), ::toupper);
971  result = (simType.find("ATLFAST") == std::string::npos)
974  return StatusCode::SUCCESS;
975  }
976  } else { // no metadata in the file
977  ATH_MSG_DEBUG("no metadata found in the file");
978  return StatusCode::FAILURE;
979  }
980 }
981 
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:825
python.Dso.registry
registry
Definition: Control/AthenaServices/python/Dso.py:159
AsgElectronEfficiencyCorrectionTool::m_correlation_model
int m_correlation_model
Definition: AsgElectronEfficiencyCorrectionTool.h:154
TestSUSYToolsAlg.ifile
ifile
Definition: TestSUSYToolsAlg.py:92
CaloCondBlobAlgs_fillNoiseFromASCII.sysName
sysName
Definition: CaloCondBlobAlgs_fillNoiseFromASCII.py:93
AsgElectronEfficiencyCorrectionTool::applySystematicVariation
virtual StatusCode applySystematicVariation(const CP::SystematicSet &systConfig) override final
Configure this tool for the given systematics.
Definition: AsgElectronEfficiencyCorrectionTool.cxx:582
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:166
python.SystemOfUnits.s
int s
Definition: SystemOfUnits.py:131
AsgElectronEfficiencyCorrectionTool::recommendedSystematics
virtual CP::SystematicSet recommendedSystematics() const override final
returns: the list of all systematics this tool recommends to use
Definition: AsgElectronEfficiencyCorrectionTool.cxx:576
get_generator_info.result
result
Definition: get_generator_info.py:21
AsgElectronEfficiencyCorrectionTool::m_idKey
std::string m_idKey
Definition: AsgElectronEfficiencyCorrectionTool.h:161
AsgElectronEfficiencyCorrectionTool::m_appliedSystematics
CP::SystematicSet * m_appliedSystematics
Currently applied systematics.
Definition: AsgElectronEfficiencyCorrectionTool.h:150
AsgElectronEfficiencyCorrectionTool::m_rootTool
std::unique_ptr< Root::TElectronEfficiencyCorrectionTool > m_rootTool
Pointer to the underlying ROOT based tool.
Definition: AsgElectronEfficiencyCorrectionTool.h:141
AsgElectronEfficiencyCorrectionTool::m_mapFile
std::string m_mapFile
Definition: AsgElectronEfficiencyCorrectionTool.h:157
AsgElectronEfficiencyCorrectionTool::InitSystematics
StatusCode InitSystematics()
initialize the systematics
Definition: AsgElectronEfficiencyCorrectionTool.cxx:630
correlationModel::FULL
@ FULL
Definition: AsgElectronEfficiencyCorrectionTool.cxx:49
xAOD::et
et
Definition: TrigEMCluster_v1.cxx:25
SG::Accessor
Helper class to provide type-safe access to aux data.
Definition: Control/AthContainers/AthContainers/Accessor.h:66
AsgElectronEfficiencyCorrectionTool::m_uncorrSimplfEtaBinsUser
std::vector< float > m_uncorrSimplfEtaBinsUser
Definition: AsgElectronEfficiencyCorrectionTool.h:205
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:181
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:739
downloadSingle.dataType
string dataType
Definition: downloadSingle.py:18
asg::AsgMetadataTool::inputMetaStore
MetaStorePtr_t inputMetaStore() const
Accessor for the input metadata store.
Definition: AsgMetadataTool.cxx:88
AsgElectronEfficiencyCorrectionTool::initialize
virtual StatusCode initialize() override final
Gaudi Service Interface method implementations.
Definition: AsgElectronEfficiencyCorrectionTool.cxx:150
AsgElectronEfficiencyCorrectionTool::registerSystematics
StatusCode registerSystematics()
Definition: AsgElectronEfficiencyCorrectionTool.cxx:563
athena.value
value
Definition: athena.py:122
SG::ConstAccessor
Helper class to provide constant type-safe access to aux data.
Definition: ConstAccessor.h:54
AsgElectronEfficiencyCorrectionTool::m_resultName
std::string m_resultName
The string for the result.
Definition: AsgElectronEfficiencyCorrectionTool.h:172
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:153
CP::SystematicVariation
Definition: SystematicVariation.h:47
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
python.DomainsRegistry.reg
reg
globals -----------------------------------------------------------------—
Definition: DomainsRegistry.py:343
PATCore::ParticleDataType::Data
@ Data
Definition: PATCoreEnums.h:22
mapkey::sys
@ sys
Definition: TElectronEfficiencyCorrectionTool.cxx:42
AsgElectronEfficiencyCorrectionTool::m_defaultRandomRunNumber
int m_defaultRandomRunNumber
Definition: AsgElectronEfficiencyCorrectionTool.h:182
AsgElectronEfficiencyCorrectionTool::beginInputFile
virtual StatusCode beginInputFile() override final
Function called when a new input file is opened.
Definition: AsgElectronEfficiencyCorrectionTool.cxx:878
AsgElectronEfficiencyCorrectionTool::m_dataType
PATCore::ParticleDataType::DataType m_dataType
Definition: AsgElectronEfficiencyCorrectionTool.h:185
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:162
xAOD::FileMetaData_v1::simFlavour
@ simFlavour
Fast or Full sim [string].
Definition: FileMetaData_v1.h:76
PATCore::ParticleDataType::Full
@ Full
Definition: PATCoreEnums.h:22
xAOD::CaloCluster_v1::etaBE
float etaBE(const unsigned layer) const
Get the eta in one layer of the EM Calo.
Definition: CaloCluster_v1.cxx:644
python.setupRTTAlg.size
int size
Definition: setupRTTAlg.py:39
correlationModel::MCTOYS
@ MCTOYS
Definition: AsgElectronEfficiencyCorrectionTool.cxx:48
AsgElectronEfficiencyCorrectionTool::m_uncorrSimplfEtBinsUser
std::vector< float > m_uncorrSimplfEtBinsUser
Definition: AsgElectronEfficiencyCorrectionTool.h:206
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
xAOD::CaloCluster_v1
Description of a calorimeter cluster.
Definition: CaloCluster_v1.h:59
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:213
SG::Decorator
Helper class to provide type-safe access to aux data.
Definition: Decorator.h:58
xAOD::CaloCluster_v1::eta
virtual double eta() const
The pseudorapidity ( ) of the particle.
Definition: CaloCluster_v1.cxx:251
lumiFormat.i
int i
Definition: lumiFormat.py:92
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:217
PlotPulseshapeFromCool.input
input
Definition: PlotPulseshapeFromCool.py:106
PATCoreEnums.h
xAOD::Egamma_v1::caloCluster
const xAOD::CaloCluster * caloCluster(size_t index=0) const
Pointer to the xAOD::CaloCluster/s that define the electron candidate.
Definition: Egamma_v1.cxx:388
AsgElectronEfficiencyCorrectionTool::m_nCorrSyst
int m_nCorrSyst
Definition: AsgElectronEfficiencyCorrectionTool.h:200
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:160
AsgElectronEfficiencyCorrectionTool::appliedSystematics
virtual const CP::SystematicSet & appliedSystematics() const override final
returns: the currently applied systematics
Definition: AsgElectronEfficiencyCorrectionTool.h:102
checkCorrelInHIST.prefix
dictionary prefix
Definition: checkCorrelInHIST.py:391
AsgElectronEfficiencyCorrectionTool::m_number_of_toys
int m_number_of_toys
Definition: AsgElectronEfficiencyCorrectionTool.h:191
AsgElectronEfficiencyCorrectionTool::m_resultPrefix
std::string m_resultPrefix
The prefix string for the result.
Definition: AsgElectronEfficiencyCorrectionTool.h:169
AsgElectronEfficiencyCorrectionTool::systUncorrVariationIndex
virtual int systUncorrVariationIndex(const xAOD::Electron &inputObject) const override final
Definition: AsgElectronEfficiencyCorrectionTool.cxx:792
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
AsgElectronEfficiencyCorrectionTool::m_seed_toys
int m_seed_toys
Definition: AsgElectronEfficiencyCorrectionTool.h:194
AsgElectronEfficiencyCorrectionTool::applyEfficiencyScaleFactor
virtual CP::CorrectionCode applyEfficiencyScaleFactor(const xAOD::Electron &inputObject) const override final
Definition: AsgElectronEfficiencyCorrectionTool.cxx:523
AsgElectronEfficiencyCorrectionTool::m_nUncorrSyst
int m_nUncorrSyst
Definition: AsgElectronEfficiencyCorrectionTool.h:201
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:197
AsgElectronEfficiencyCorrectionTool::m_dataTypeOverwrite
int m_dataTypeOverwrite
Force the data type to a given value.
Definition: AsgElectronEfficiencyCorrectionTool.h:188
AsgElectronEfficiencyCorrectionTool::m_corrVarDown
std::vector< CP::SystematicVariation > m_corrVarDown
Definition: AsgElectronEfficiencyCorrectionTool.h:215
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:192
AsgElectronEfficiencyCorrectionTool::getEfficiencyScaleFactor
virtual CP::CorrectionCode getEfficiencyScaleFactor(const xAOD::Electron &inputObject, double &efficiencyScaleFactor) const override final
Definition: AsgElectronEfficiencyCorrectionTool.cxx:320
AsgElectronEfficiencyCorrectionTool::m_systFilter
std::unordered_map< CP::SystematicSet, CP::SystematicSet > m_systFilter
Systematics filter map.
Definition: AsgElectronEfficiencyCorrectionTool.h:144
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:178
AsgElectronEfficiencyCorrectionTool::get_simType_from_metadata
StatusCode get_simType_from_metadata(PATCore::ParticleDataType::DataType &result) const
Definition: AsgElectronEfficiencyCorrectionTool.cxx:926
AsgElectronEfficiencyCorrectionTool::m_trigKey
std::string m_trigKey
Definition: AsgElectronEfficiencyCorrectionTool.h:163
AsgElectronEfficiencyCorrectionTool::affectingSystematics
virtual CP::SystematicSet affectingSystematics() const override final
returns: the list of all systematics this tool can be affected by
Definition: AsgElectronEfficiencyCorrectionTool.cxx:556
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:540
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:431
AsgElectronEfficiencyCorrectionTool::m_uncorrVarUp
std::vector< CP::SystematicVariation > m_uncorrVarUp
Definition: AsgElectronEfficiencyCorrectionTool.h:216
AthAnalysisHelper.h
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:913
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
CondAlgsOpts.found
int found
Definition: CondAlgsOpts.py:101
mapkey::sf
@ sf
Definition: TElectronEfficiencyCorrectionTool.cxx:38
AsgElectronEfficiencyCorrectionTool::m_nSimpleUncorrSyst
int m_nSimpleUncorrSyst
Definition: AsgElectronEfficiencyCorrectionTool.h:210
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:147
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:214
AsgElectronEfficiencyCorrectionTool::m_UncorrRegions
TH2F * m_UncorrRegions
Definition: AsgElectronEfficiencyCorrectionTool.h:209
AthCommonMsg< AlgTool >::msg
MsgStream & msg() const
Definition: AthCommonMsg.h:24
CP::CorrectionCode
Return value from object correction CP tools.
Definition: CorrectionCode.h:31
CaloCellTimeCorrFiller.filename
filename
Definition: CaloCellTimeCorrFiller.py:24
xAOD::Egamma_v1::pt
virtual double pt() const override final
The transverse momentum ( ) of the particle.
Definition: Egamma_v1.cxx:65
declareProperty
#define declareProperty(n, p, h)
Definition: BaseFakeBkgTool.cxx:15
AsgElectronEfficiencyCorrectionTool::m_pteta_bins
std::vector< std::pair< float, std::vector< float > > > m_pteta_bins
Definition: AsgElectronEfficiencyCorrectionTool.h:202
ParticleDataType::Full
@ Full
Definition: Event/EventKernel/EventKernel/IParticle.h:36
SG::ConstAccessor< T, AuxAllocator_t< T > >::isAvailable
bool isAvailable(const ELT &e) const
Test to see if this variable exists in the store.
xAOD::Egamma_v1::eta
virtual double eta() const override final
The pseudorapidity ( ) of the particle.
Definition: Egamma_v1.cxx:70
AsgElectronEfficiencyCorrectionTool::m_sysSubstring
std::string m_sysSubstring
Definition: AsgElectronEfficiencyCorrectionTool.h:175
merge.status
status
Definition: merge.py:17
AsgElectronEfficiencyCorrectionTool::m_metadata_retrieved
bool m_metadata_retrieved
To check if the metadata can be retrieved.
Definition: AsgElectronEfficiencyCorrectionTool.h:138
Electron.h
PATCore
Information about type of data used to fill particle.
Definition: PATCoreEnums.h:19
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
xAOD::CaloCluster_v1::e
virtual double e() const
The total energy of the particle.
Definition: CaloCluster_v1.cxx:265
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:700
mapkey::key
key
Definition: TElectronEfficiencyCorrectionTool.cxx:37