ATLAS Offline Software
FwdElectronScaleFactorCalculator.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2019 CERN for the benefit of the ATLAS collaboration
3  */
4 
5 // $Id: ElectronScaleFactorCalculator.cxx 799556 2017-03-05 19:46:03Z tpelzer $
8 #include "TopEvent/EventTools.h"
9 
11 
12 
13 namespace top {
15  asg::AsgTool(name),
16  m_config(nullptr),
17 
18  m_systNominal(CP::SystematicSet()),
19  m_systID_UP(CP::SystematicSet()),
20  m_systID_DOWN(CP::SystematicSet()),
21  m_electronEffSFID("AsgFwdElectronEfficiencyCorrectionTool_ID"),
22  m_electronEffSFIDLoose("AsgFwdElectronEfficiencyCorrectionTool_IDLoose"),
23  m_decor_idSF("SetMe"),
24  m_decor_idSF_loose("SetMe") {
25  declareProperty("config", m_config);
26  }
27 
29  ATH_MSG_INFO(" top::FwdElectronScaleFactorCalculator initialize");
30 
31  top::check(m_electronEffSFID.retrieve(), "Failed to retrieve FWD electron SF Tool");
32  top::check(m_electronEffSFIDLoose.retrieve(), "Failed to retrieve FWD electron Loose SF Tool");
33 
34  m_systID_UP.insert(CP::SystematicVariation("EL_EFF_FwdID_TOTAL_1NPCOR_PLUS_UNCOR", 1));
35  m_systID_DOWN.insert(CP::SystematicVariation("EL_EFF_FwdID_TOTAL_1NPCOR_PLUS_UNCOR", -1));
36 
37  m_decor_idSF = "FWDEL_SF_ID_" + m_config->fwdElectronID();
38  m_decor_idSF_loose = "FWDEL_LOOSE_SF_ID_" + m_config->fwdElectronIDLoose();
39 
40  return StatusCode::SUCCESS;
41  }
42 
45  for (auto currentSystematic : *m_config->systSgKeyMapFwdElectrons()) {
46  const xAOD::ElectronContainer* electrons(nullptr);
47  top::check(evtStore()->retrieve(electrons, currentSystematic.second), "failed to retrieve electrons");
48 
50  top::check(m_electronEffSFID->applySystematicVariation(m_systNominal), "Failed to set systematic");
51  top::check(m_electronEffSFIDLoose->applySystematicVariation(m_systNominal), "Failed to set systematic");
52 
54  for (auto electronPtr : *electrons) {
56  bool passSelection(false);
57  if (electronPtr->isAvailable<char>("passPreORSelection")) {
58  if (electronPtr->auxdataConst<char>("passPreORSelection") == 1) {
59  passSelection = true;
60  }
61  }
62  if (electronPtr->isAvailable<char>("passPreORSelectionLoose")) {
63  if (electronPtr->auxdataConst<char>("passPreORSelectionLoose") == 1) {
64  passSelection = true;
65  }
66  }
67 
68  if (passSelection) {
69  double SF_ID(1.), SF_IDLoose(1.);
70 
72 
73  top::check(m_electronEffSFID->getEfficiencyScaleFactor(*electronPtr, SF_ID), "Failed to get SF");
74  top::check(m_electronEffSFIDLoose->getEfficiencyScaleFactor(*electronPtr, SF_IDLoose), "Failed to get SF");
75 
76 
78  electronPtr->auxdecor<float>(m_decor_idSF) = SF_ID;
79  electronPtr->auxdecor<float>(m_decor_idSF_loose) = SF_IDLoose;
80 
82  if (currentSystematic.first == m_config->nominalHashValue()) {
83  double SF_ID_UP(1.), SF_IDLoose_UP(1.);
84  double SF_ID_DOWN(1.), SF_IDLoose_DOWN(1.);
85 
88  top::check(m_electronEffSFID->applySystematicVariation(m_systID_UP), "Failed to set systematic");
89  top::check(m_electronEffSFID->getEfficiencyScaleFactor(*electronPtr, SF_ID_UP), "Failed to get SF");
90  top::check(m_electronEffSFIDLoose->applySystematicVariation(m_systID_UP), "Failed to set systematic");
91  top::check(m_electronEffSFIDLoose->getEfficiencyScaleFactor(*electronPtr, SF_IDLoose_UP),
92  "Failed to get SF");
93 
95  top::check(m_electronEffSFID->applySystematicVariation(m_systID_DOWN), "Failed to set systematic");
96  top::check(m_electronEffSFID->getEfficiencyScaleFactor(*electronPtr, SF_ID_DOWN), "Failed to get SF");
97  top::check(m_electronEffSFIDLoose->applySystematicVariation(m_systID_DOWN), "Failed to set systematic");
98  top::check(m_electronEffSFIDLoose->getEfficiencyScaleFactor(*electronPtr,
99  SF_IDLoose_DOWN), "Failed to get SF");
100 
102  top::check(m_electronEffSFID->applySystematicVariation(m_systNominal), "Failed to set systematic");
103  top::check(m_electronEffSFIDLoose->applySystematicVariation(m_systNominal), "Failed to set systematic");
104 
106  electronPtr->auxdecor<float>(m_decor_idSF + "_UP") = SF_ID_UP;
107  electronPtr->auxdecor<float>(m_decor_idSF + "_DOWN") = SF_ID_DOWN;
108  electronPtr->auxdecor<float>(m_decor_idSF_loose + "_UP") = SF_IDLoose_UP;
109  electronPtr->auxdecor<float>(m_decor_idSF_loose + "_DOWN") = SF_IDLoose_DOWN;
110 
112 
113  ATH_MSG_DEBUG("Fwd Electron ID SF = " << electronPtr->auxdataConst<float>(m_decor_idSF) << " + " <<
114  electronPtr->auxdataConst<float>(m_decor_idSF + "_UP") << " - " <<
115  electronPtr->auxdataConst<float>(m_decor_idSF + "_DOWN")
116  );
117  } // Calibration systematic is nominal, so calculate SF systematics
118  }
119  }
120  }
121 
122 
123  return StatusCode::SUCCESS;
124  }
125 }
python.PyKernel.retrieve
def retrieve(aClass, aKey=None)
Definition: PyKernel.py:110
FwdElectronScaleFactorCalculator.h
top
TopConfig A simple configuration that is NOT a singleton.
Definition: AnalysisTrackingHelper.cxx:58
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
AthCommonDataStore< AthCommonMsg< AlgTool > >::declareProperty
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T > &t)
Definition: AthCommonDataStore.h:145
asg
Definition: DataHandleTestTool.h:28
top::FwdElectronScaleFactorCalculator::m_systNominal
CP::SystematicSet m_systNominal
Definition: FwdElectronScaleFactorCalculator.h:52
top::FwdElectronScaleFactorCalculator::m_electronEffSFID
ToolHandle< IAsgElectronEfficiencyCorrectionTool > m_electronEffSFID
Definition: FwdElectronScaleFactorCalculator.h:56
CP::SystematicVariation
Definition: SystematicVariation.h:47
CP
Select isolated Photons, Electrons and Muons.
Definition: Control/xAODRootAccess/xAODRootAccess/TEvent.h:48
EventTools.h
A few functions for doing operations on particles / events. Currently holds code for dR,...
top::FwdElectronScaleFactorCalculator::m_decor_idSF
std::string m_decor_idSF
Definition: FwdElectronScaleFactorCalculator.h:59
AthCommonDataStore< AthCommonMsg< AlgTool > >::evtStore
ServiceHandle< StoreGateSvc > & evtStore()
The standard StoreGateSvc (event store) Returns (kind of) a pointer to the StoreGateSvc.
Definition: AthCommonDataStore.h:85
ElectronContainer.h
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
top::check
void check(bool thingToCheck, const std::string &usefulFailureMessage)
Print an error message and terminate if thingToCheck is false.
Definition: EventTools.cxx:15
top::FwdElectronScaleFactorCalculator::m_systID_DOWN
CP::SystematicSet m_systID_DOWN
Definition: FwdElectronScaleFactorCalculator.h:54
DataVector
Derived DataVector<T>.
Definition: DataVector.h:581
top::FwdElectronScaleFactorCalculator::m_decor_idSF_loose
std::string m_decor_idSF_loose
Definition: FwdElectronScaleFactorCalculator.h:60
CP::SystematicSet::insert
void insert(const SystematicVariation &systematic)
description: insert a systematic into the set
Definition: SystematicSet.cxx:88
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:195
top::FwdElectronScaleFactorCalculator::m_electronEffSFIDLoose
ToolHandle< IAsgElectronEfficiencyCorrectionTool > m_electronEffSFIDLoose
Definition: FwdElectronScaleFactorCalculator.h:57
TopConfig.h
top::FwdElectronScaleFactorCalculator::initialize
StatusCode initialize()
Dummy implementation of the initialisation function.
Definition: FwdElectronScaleFactorCalculator.cxx:28
top::FwdElectronScaleFactorCalculator::m_systID_UP
CP::SystematicSet m_systID_UP
Definition: FwdElectronScaleFactorCalculator.h:53
top::FwdElectronScaleFactorCalculator::FwdElectronScaleFactorCalculator
FwdElectronScaleFactorCalculator(const std::string &name)
Definition: FwdElectronScaleFactorCalculator.cxx:14
top::FwdElectronScaleFactorCalculator::execute
StatusCode execute()
Definition: FwdElectronScaleFactorCalculator.cxx:43
top::FwdElectronScaleFactorCalculator::m_config
std::shared_ptr< top::TopConfig > m_config
Definition: FwdElectronScaleFactorCalculator.h:50
InDetDD::electrons
@ electrons
Definition: InDetDD_Defs.h:17