ATLAS Offline Software
Loading...
Searching...
No Matches
CP::EgammaCalibrationAndSmearingTool Class Referenceabstract

#include <EgammaCalibrationAndSmearingTool.h>

Inheritance diagram for CP::EgammaCalibrationAndSmearingTool:

Classes

struct  EtaCaloPredicate
struct  AbsEtaCaloPredicate
struct  DoubleOrAbsEtaCaloPredicate
struct  SysInfo
struct  Accessors

Public Types

Definition of the StoreGate-like object's definition
typedef ServiceHandle< StoreGateSvcMetaStore_t
 Type of the metadata store object in Athena.
typedef const ServiceHandle< StoreGateSvc > & MetaStorePtr_t
 Type of the metadata store pointer in standalone mode.

Public Member Functions

virtual double getEnergy (xAOD::Egamma *, const xAOD::EventInfo *)
virtual double getElectronMomentum (const xAOD::Electron *, const xAOD::EventInfo *)
double getResolution (const xAOD::Egamma &particle, bool withCT=true) const override
double intermodule_correction (double Ecl, double phi, double eta) const
double correction_phi_unif (double eta, double phi) const
void callSingleEvent (columnar::MutableEgammaRange egammas, columnar::EventInfoId event) const
void callEvents (columnar::EventContextRange events) const override
virtual void print () const =0
 Print the state of the tool.
virtual StatusCode sysInitialize ()
 Function initialising the tool in the correct way in Athena.
virtual void print () const
 Print the state of the tool.
ServiceHandle< StoreGateSvc > & evtStore ()
 The standard StoreGateSvc (event store) Returns (kind of) a pointer to the StoreGateSvc.
const ServiceHandle< StoreGateSvc > & detStore () const
 The standard StoreGateSvc/DetectorStore Returns (kind of) a pointer to the StoreGateSvc.
virtual StatusCode sysStart () override
 Handle START transition.
virtual std::vector< Gaudi::DataHandle * > inputHandles () const override
 Return this algorithm's input handles.
virtual std::vector< Gaudi::DataHandle * > outputHandles () const override
 Return this algorithm's output handles.
Gaudi::Details::PropertyBase & declareProperty (Gaudi::Property< T, V, H > &t)
void updateVHKA (Gaudi::Details::PropertyBase &)
MsgStream & msg () const
bool msgLvl (const MSG::Level lvl) const
Functions providing access to the input/output metadata
MetaStorePtr_t inputMetaStore () const
 Accessor for the input metadata store.
MetaStorePtr_t outputMetaStore () const
 Accessor for the output metadata store.
Additional helper functions, not directly mimicking Athena
template<class T>
const T * getProperty (const std::string &name) const
 Get one of the tool's properties.
const std::string & msg_level_name () const __attribute__((deprecated))
 A deprecated function for getting the message level's name.
const std::string & getName (const void *ptr) const
 Get the name of an object that is / should be in the event store.
SG::sgkey_t getKey (const void *ptr) const
 Get the (hashed) key of an object that is in the event store.

Public Attributes

Gaudi::Property< boolm_onlyElectrons {this, "onlyElectrons", false, "the tool will only be applied to electrons"}
Gaudi::Property< boolm_onlyPhotons {this, "onlyPhotons", false, "the tool will only be applied to photons"}
std::unique_ptr< Accessorsm_accessors

Protected Member Functions

void renounceArray (SG::VarHandleKeyArray &handlesArray)
 remove all handles from I/O resolution
std::enable_if_t< std::is_void_v< std::result_of_t< decltype(&T::renounce)(T)> > &&!std::is_base_of_v< SG::VarHandleKeyArray, T > &&std::is_base_of_v< Gaudi::DataHandle, T >, void > renounce (T &h)
void extraDeps_update_handler (Gaudi::Details::PropertyBase &ExtraDeps)
 Add StoreName to extra input/output deps as needed.
Callback functions helping in metadata reading/writing
void setUseIncidents (const bool flag)
virtual void handle (const Incident &inc)
 Function receiving incidents from IncidentSvc/Event.
virtual StatusCode beginInputFile ()
 Function called when a new input file is opened.
virtual StatusCode endInputFile ()
 Function called when the currently open input file got completely processed.
virtual StatusCode beginEvent ()
 Function called when a new events is loaded.
virtual StatusCode metaDataStop ()
 Function called when the tool should write out its metadata.

Private Types

enum class  ResolutionDecorrelation { FULL , ONENP }
typedef unsigned int RandomNumber
typedef std::function< int(const EgammaCalibrationAndSmearingTool &, columnar::EgammaId, columnar::EventInfoId)> IdFunction
typedef std::function< bool(const EgammaCalibrationAndSmearingTool &, columnar::EgammaId)> EgammaPredicate
typedef ServiceHandle< StoreGateSvcStoreGateSvc_t

Private Member Functions

 EgammaCalibrationAndSmearingTool (const std::string &name)
 ~EgammaCalibrationAndSmearingTool ()
StatusCode initialize () override
virtual CP::CorrectionCode applyCorrection (xAOD::Egamma &) const override
CP::CorrectionCode applyCorrection (columnar::MutableEgammaId input, columnar::EventInfoId event_info) const
void setPt (columnar::MutableEgammaId input, double energy) const
virtual CP::CorrectionCode correctedCopy (const xAOD::Electron &, xAOD::Electron *&) const override
virtual CP::CorrectionCode correctedCopy (const xAOD::Photon &, xAOD::Photon *&) const override
double getEnergy (const xAOD::Photon &) const
double getEnergy (const xAOD::Electron &) const
virtual CP::SystematicSet affectingSystematics () const override
 the list of all systematics this tool can be affected by
virtual bool isAffectedBySystematic (const CP::SystematicVariation &systematic) const override
 Declare the interface that this class provides.
virtual CP::SystematicSet recommendedSystematics () const override
 the list of all systematics this tool recommends to use
virtual StatusCode applySystematicVariation (const CP::SystematicSet &systConfig) override
 effects: configure this tool for the given list of systematic variations.
virtual void setRandomSeedFunction (const IdFunction &&function)
const IdFunction getRandomSeedFunction () const
virtual double resolution (double energy, double cl_eta, double cl_etaCalo, PATCore::ParticleType::Type ptype=PATCore::ParticleType::Electron, bool withCT=false) const override
void setupSystematics ()
const EgammaPredicate EtaCaloPredicateFactory (double eta_min, double eta_max) const
const EgammaPredicate AbsEtaCaloPredicateFactory (double eta_min, double eta_max) const
const EgammaPredicate AbsEtaCaloPredicateFactory (std::pair< double, double > edges) const
const std::vector< EgammaPredicateAbsEtaCaloPredicatesFactory (const std::vector< std::pair< double, double > > &edges) const
const std::vector< EgammaPredicateAbsEtaCaloPredicatesFactory (const std::vector< double > &edges) const
const EgammaPredicate DoubleOrAbsEtaCaloPredicateFactory (double eta1_min, double eta1_max, double eta2_min, double eta2_max) const
PATCore::ParticleType::Type xAOD2ptype (columnar::EgammaId particle) const
egEnergyCorr::Scale::Variation oldtool_scale_flag_this_event (columnar::EgammaId p, columnar::EventInfoId event_info) const
egEnergyCorr::Resolution::Variation oldtool_resolution_flag_this_event (columnar::EgammaId p, columnar::EventInfoId event_info) const
Gaudi::Details::PropertyBase & declareGaudiProperty (Gaudi::Property< T, V, H > &hndl, const SG::VarHandleKeyType &)
 specialization for handling Gaudi::Property<SG::VarHandleKey>

Private Attributes

std::string m_ESModel
std::string m_decorrelation_model_name
std::string m_decorrelation_model_scale_name
std::string m_decorrelation_model_resolution_name
ScaleDecorrelation m_decorrelation_model_scale = ScaleDecorrelation::FULL
ResolutionDecorrelation m_decorrelation_model_resolution
egEnergyCorr::ESModel m_TESModel
int m_doScaleCorrection
int m_doSmearing
double m_varSF
std::string m_ResolutionType
egEnergyCorr::Resolution::resolutionType m_TResolutionType
int m_useFastSim
int m_use_AFII
PATCore::ParticleDataType::DataType m_simulation
int m_useIntermoduleCorrection
int m_usePhiUniformCorrection
int m_useCaloDistPhiUnifCorrection
int m_useGainCorrection
int m_doADCLinearityCorrection
int m_doLeakageCorrection
bool m_use_ep_combination
int m_use_mva_calibration
bool m_use_full_statistical_error
int m_use_temp_correction201215
int m_use_uA2MeV_2015_first2weeks_correction
bool m_use_mapping_correction
int m_user_random_run_number
int m_useGainInterpolation
int m_useLayerCorrection
int m_usePSCorrection
int m_useS12Correction
int m_useSaccCorrection
bool m_decorateEmva
std::unique_ptr< TH2 > m_caloDistPhiUnifCorr
Gaudi::Property< boolm_fixForMissingCells
Gaudi::Property< boolm_doFwdCalib
Gaudi::Property< std::string > m_pVtxKey
ServiceHandle< IegammaMVASvcm_MVACalibSvc
std::unique_ptr< egGain::GainUncertaintym_gain_tool_run2
std::shared_ptr< LinearityADCm_ADCLinearity_tool
egGain::GainToolm_gain_tool = nullptr
egammaLayerRecalibToolm_layer_recalibration_tool = nullptr
std::string m_layer_recalibration_tune
std::unique_ptr< AtlasRoot::egammaEnergyCorrectionToolm_rootTool
std::string m_MVAfolder
std::map< CP::SystematicVariation, SysInfom_syst_description
std::map< CP::SystematicVariation, egEnergyCorr::Resolution::Variationm_syst_description_resolution
egEnergyCorr::Scale::Variation m_currentScaleVariation_MC
egEnergyCorr::Scale::Variation m_currentScaleVariation_data
egEnergyCorr::Resolution::Variation m_currentResolutionVariation_MC
egEnergyCorr::Resolution::Variation m_currentResolutionVariation_data
EgammaPredicate m_currentScalePredicate
IdFunction m_set_seed_function
MetaStore_t m_inputMetaStore
 Object accessing the input metadata store.
MetaStore_t m_outputMetaStore
 Object accessing the output metadata store.
bool m_beginInputFileCalled
 Flag helping to discover when the tool misses the opening of the first input file.
bool m_useIncidents
StoreGateSvc_t m_evtStore
 Pointer to StoreGate (event store by default).
StoreGateSvc_t m_detStore
 Pointer to StoreGate (detector store by default).
std::vector< SG::VarHandleKeyArray * > m_vhka
bool m_varHandleArraysDeclared

Static Private Attributes

static const int AUTO = 2
static const unsigned int m_Run2Run3runNumberTransition = 400000

Detailed Description

Definition at line 183 of file EgammaCalibrationAndSmearingTool.h.

Member Typedef Documentation

◆ EgammaPredicate

◆ IdFunction

◆ MetaStore_t

Type of the metadata store object in Athena.

Definition at line 66 of file AsgMetadataTool.h.

◆ MetaStorePtr_t

Type of the metadata store pointer in standalone mode.

Definition at line 68 of file AsgMetadataTool.h.

◆ RandomNumber

◆ StoreGateSvc_t

typedef ServiceHandle<StoreGateSvc> AthCommonDataStore< AthCommonMsg< AlgTool > >::StoreGateSvc_t
privateinherited

Definition at line 388 of file AthCommonDataStore.h.

Member Enumeration Documentation

◆ ResolutionDecorrelation

Enumerator
FULL 
ONENP 

Definition at line 198 of file EgammaCalibrationAndSmearingTool.h.

Constructor & Destructor Documentation

◆ EgammaCalibrationAndSmearingTool()

CP::EgammaCalibrationAndSmearingTool::EgammaCalibrationAndSmearingTool ( const std::string & name)
private

Definition at line 290 of file EgammaCalibrationAndSmearingTool.cxx.

292 : asg::AsgMetadataTool(name),
301 columnar::EgammaId egamma,
303 const Accessors& acc = *tool.m_accessors;
304 // avoid 0 as result, see
305 // https://root.cern.ch/root/html/TRandom3.html#TRandom3:SetSeed
306 auto cluster = acc.caloClusterAcc(egamma)[0].value();
307 return 1 + static_cast<RandomNumber>(
308 std::abs(acc.clusterPhiAcc(cluster)) * 1E6 +
309 std::abs(acc.clusterEtaAcc(cluster)) * 1E3 +
310 acc.eventNumberAcc(ei));
311 }),
312 m_accessors(std::make_unique<Accessors>(*this)) {
313
314 declareProperty("ESModel", m_ESModel = "");
315 declareProperty("decorrelationModel", m_decorrelation_model_name = "");
316 declareProperty("decorrelationModelScale",
318 declareProperty("decorrelationModelResolution",
320 declareProperty("ResolutionType", m_ResolutionType = "SigmaEff90");
321 declareProperty("varSF", m_varSF = 1.0);
322 declareProperty("doScaleCorrection", m_doScaleCorrection = AUTO);
323 declareProperty("doSmearing", m_doSmearing = AUTO);
324 declareProperty("useLayerCorrection", m_useLayerCorrection = AUTO);
325 declareProperty("usePSCorrection", m_usePSCorrection = AUTO);
326 declareProperty("useS12Correction", m_useS12Correction = AUTO);
327 declareProperty("useSaccCorrection", m_useSaccCorrection = AUTO);
328 declareProperty("useIntermoduleCorrection",
330 declareProperty("usePhiUniformCorrection", m_usePhiUniformCorrection = AUTO);
331 declareProperty("useCaloDistPhiUnifCorrection",
333 declareProperty("useGainCorrection", m_useGainCorrection = AUTO);
334 declareProperty("useGainInterpolation", m_useGainInterpolation = AUTO);
335 declareProperty("doADCLinearityCorrection",
337 declareProperty("doLeakageCorrection", m_doLeakageCorrection = AUTO);
338 declareProperty("MVAfolder", m_MVAfolder = "");
339 declareProperty("layerRecalibrationTune", m_layer_recalibration_tune = "");
340 declareProperty("useEPCombination", m_use_ep_combination = false);
341 declareProperty("useMVACalibration", m_use_mva_calibration = AUTO);
342 declareProperty("use_full_statistical_error",
344 declareProperty("use_temp_correction201215",
346 declareProperty("use_uA2MeV_2015_first2weeks_correction",
348 declareProperty("randomRunNumber", m_user_random_run_number = 0);
349 // this is the user input, it is never changed by the tool. The tool uses
350 // m_simulation.
351 declareProperty("useFastSim", m_useFastSim = -1,
352 "This should be explicitly set by the user depending on the "
353 "data type (int)0=full sim, (int)1=fast sim");
355 "useAFII", m_use_AFII = -1,
356 "This is now deprecated. Kept for explicit error message for now");
357 declareProperty("decorateEmva", m_decorateEmva = false, "whether to decorate the eMVA value");
358}
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T, V, H > &t)
egEnergyCorr::Resolution::Variation m_currentResolutionVariation_MC
egEnergyCorr::Scale::Variation m_currentScaleVariation_data
egEnergyCorr::Scale::Variation m_currentScaleVariation_MC
egEnergyCorr::Resolution::resolutionType m_TResolutionType
egEnergyCorr::Resolution::Variation m_currentResolutionVariation_data
ObjectId< EgammaDef > EgammaId
Definition EgammaDef.h:47
ObjectId< EventInfoDef > EventInfoId
static const SG::AuxElement::Accessor< ElementLink< IParticleContainer > > acc("originalObjectLink")
Object used for setting/getting the dynamic decoration in question.

◆ ~EgammaCalibrationAndSmearingTool()

CP::EgammaCalibrationAndSmearingTool::~EgammaCalibrationAndSmearingTool ( )
private

Definition at line 360 of file EgammaCalibrationAndSmearingTool.cxx.

360 {
361 ATH_MSG_DEBUG("destructor");
363 delete m_gain_tool;
364}
#define ATH_MSG_DEBUG(x)

Member Function Documentation

◆ AbsEtaCaloPredicateFactory() [1/2]

const EgammaPredicate CP::EgammaCalibrationAndSmearingTool::AbsEtaCaloPredicateFactory ( double eta_min,
double eta_max ) const
inlineprivate

Definition at line 341 of file EgammaCalibrationAndSmearingTool.h.

342 {
343 /*return [eta_min, eta_max](const xAOD::Egamma& p) {
344 const double aeta = std::abs(xAOD::get_eta_calo(*p.caloCluster()));
345 return (aeta >= eta_min and aeta < eta_max); };*/
346 return AbsEtaCaloPredicate(eta_min, eta_max);
347 }

◆ AbsEtaCaloPredicateFactory() [2/2]

const EgammaPredicate CP::EgammaCalibrationAndSmearingTool::AbsEtaCaloPredicateFactory ( std::pair< double, double > edges) const
inlineprivate

Definition at line 349 of file EgammaCalibrationAndSmearingTool.h.

350 {
351 return AbsEtaCaloPredicateFactory(edges.first, edges.second);
352 }
const EgammaPredicate AbsEtaCaloPredicateFactory(double eta_min, double eta_max) const

◆ AbsEtaCaloPredicatesFactory() [1/2]

const std::vector< EgammaPredicate > CP::EgammaCalibrationAndSmearingTool::AbsEtaCaloPredicatesFactory ( const std::vector< double > & edges) const
inlineprivate

Definition at line 364 of file EgammaCalibrationAndSmearingTool.h.

365 {
366 std::vector<EgammaPredicate> result;
367 result.reserve(edges.size() - 1);
368 auto it2 = edges.begin();
369 auto it = it2++;
370 for (; it2 != edges.end(); ++it, ++it2) {
371 result.push_back(AbsEtaCaloPredicateFactory(*it, *it2));
372 }
373 return result;
374 }

◆ AbsEtaCaloPredicatesFactory() [2/2]

const std::vector< EgammaPredicate > CP::EgammaCalibrationAndSmearingTool::AbsEtaCaloPredicatesFactory ( const std::vector< std::pair< double, double > > & edges) const
inlineprivate

Definition at line 354 of file EgammaCalibrationAndSmearingTool.h.

355 {
356 std::vector<EgammaPredicate> result;
357 result.reserve(edges.size());
358 for (const auto& it : edges) {
359 result.push_back(AbsEtaCaloPredicateFactory(it.first, it.second));
360 }
361 return result;
362 }

◆ affectingSystematics()

CP::SystematicSet CP::EgammaCalibrationAndSmearingTool::affectingSystematics ( ) const
overrideprivatevirtual

the list of all systematics this tool can be affected by

Implements CP::IReentrantSystematicsTool.

Definition at line 1325 of file EgammaCalibrationAndSmearingTool.cxx.

1326 {
1327 CP::SystematicSet affecting_systematics;
1328 for (const auto& it : m_syst_description) {
1329 affecting_systematics.insert(it.first);
1330 }
1331 for (const auto& it : m_syst_description_resolution) {
1332 affecting_systematics.insert(it.first);
1333 }
1334
1335 return affecting_systematics;
1336}
std::map< CP::SystematicVariation, SysInfo > m_syst_description
std::map< CP::SystematicVariation, egEnergyCorr::Resolution::Variation > m_syst_description_resolution
void insert(const SystematicVariation &systematic)
description: insert a systematic into the set

◆ applyCorrection() [1/2]

CP::CorrectionCode CP::EgammaCalibrationAndSmearingTool::applyCorrection ( columnar::MutableEgammaId input,
columnar::EventInfoId event_info ) const
private

Definition at line 1009 of file EgammaCalibrationAndSmearingTool.cxx.

1010 {
1011 const Accessors& acc = *m_accessors;
1012
1013 // only used in simulation (for the smearing)
1014 RandomNumber seed = m_set_seed_function(*this, input, event_info);
1015
1016 columnar::ClusterId inputCluster = acc.caloClusterAcc (input)[0].value();
1017
1018 if (m_layer_recalibration_tool && acc.authorAcc (input) !=
1020 ATH_MSG_DEBUG("applying energy recalibration before E0|E1|E2|E3 = "
1021 << acc.energyBEAcc (inputCluster, 0) << "|"
1022 << acc.energyBEAcc (inputCluster, 1) << "|"
1023 << acc.energyBEAcc (inputCluster, 2) << "|"
1024 << acc.energyBEAcc (inputCluster, 3));
1025 // for now just go back to the xAOD object to access the subtool
1026 const CP::CorrectionCode status_layer_recalibration = m_layer_recalibration_tool->applyCorrection(input.getXAODObject(), event_info.getXAODObject());
1027 if (status_layer_recalibration == CP::CorrectionCode::Error) { return CP::CorrectionCode::Error; }
1028 ATH_MSG_DEBUG("eta|phi = " << acc.etaAcc (input) << "|" << acc.phiAcc (input));
1029 if (status_layer_recalibration == CP::CorrectionCode::Ok) {
1030 ATH_MSG_DEBUG("decoration E0|E1|E2|E3 = "
1031 << acc.Es0Acc(inputCluster) << "|"
1032 << acc.Es1Acc(inputCluster) << "|"
1033 << acc.Es2Acc(inputCluster) << "|"
1034 << acc.Es3Acc(inputCluster) << "|");
1035 if (acc.Es2Acc(inputCluster) == 0 and acc.Es1Acc(inputCluster) == 0 and
1036 acc.Es3Acc(inputCluster) == 0 and acc.Es0Acc(inputCluster) == 0 and
1037 (std::abs(acc.etaAcc (input)) < 1.37 or (std::abs(acc.etaAcc (input)) > 1.55 and std::abs(acc.etaAcc (input)) < 2.47)))
1038 {
1039 ATH_MSG_WARNING("all layer energies are zero");
1040 }
1041 }
1042 }
1043
1044 double energy = acc.momAcc.e (input);
1045 // apply MVA calibration
1046 if (!m_MVACalibSvc.empty()) {
1047 egammaMVACalib::GlobalEventInfo gei;
1048 if (acc.authorAcc (input) ==
1050 const xAOD::VertexContainer* pVtxCont = nullptr;
1051 if (evtStore()->retrieve(pVtxCont, m_pVtxKey).isFailure()) {
1052 ATH_MSG_ERROR("No primary vertex container " << m_pVtxKey << " could be retrieved");
1054 }
1055 unsigned int npv(0);
1056 for (const auto *vtx : *pVtxCont) {
1057 if (vtx->vertexType() == xAOD::VxType::PriVtx ||
1058 vtx->vertexType() == xAOD::VxType::PileUp) { ++npv; }
1059 }
1060 gei.nPV = npv;
1061 gei.acmu = acc.actIntPerXingAcc(event_info);
1062 ATH_MSG_DEBUG("Retrieved nPV = " << gei.nPV << " and mu = " << gei.acmu);
1063 }
1064 if (acc.authorAcc (input) !=
1066 if (m_MVACalibSvc->getEnergy(inputCluster.getXAODObject(), input.getXAODObject(), energy, gei)
1067 .isFailure()) {
1068 ATH_MSG_ERROR("Failure in MVACalib service");
1070 }
1071 ATH_MSG_DEBUG("energy after MVA calibration = " << std::format("{:.2f}", energy));
1072 }
1073 }
1075 // for now assume the input has already the layer calibration applied
1076 // and just take the decorated gnn_energy
1077 if (!acc.gnn_energy_Acc.isAvailable(input)) {
1078 ATH_MSG_ERROR("GNN energy requested but decoration TransformerEnergy not found");
1080 }
1081 energy = acc.gnn_energy_Acc(input);
1082 ATH_MSG_DEBUG("energy after GNN calibration = " << std::format("{:.2f}", energy));
1083
1084 }
1085 if (m_decorateEmva)
1086 {
1087 acc.decEmva(input) = energy;
1088 }
1089
1090 // For the time being, it is just the MVA calib
1091 if (acc.authorAcc (input) ==
1093 setPt(input, energy);
1095 }
1096
1098 // Crack calibation correction for es2011c (calibration hits calibration)
1099 const auto ptype = xAOD2ptype(input);
1100 const double etaden =
1102 ? static_cast<const xAOD::Electron&>(input.getXAODObject()).trackParticle()->eta()
1103 : acc.clusterEtaAcc(inputCluster);
1104 energy *= m_rootTool->applyMCCalibration(acc.clusterEtaAcc(inputCluster),
1105 energy / cosh(etaden), ptype);
1106 ATH_MSG_DEBUG("energy after crack calibration es2011c = "
1107 << std::format("{:.2f}", energy));
1108 }
1109
1110 /*
1111 * Here we check for each event the kind of data DATA vs FullSim
1112 * The m_simulation flavour has already been configured
1113 */
1115 (acc.eventTypeAcc(event_info,xAOD::EventInfo::IS_SIMULATION))
1116 ? m_simulation
1118
1119 unsigned int runNumber_for_tool = 0;
1120
1121 // apply uniformity corrections to data
1122 if (dataType == PATCore::ParticleDataType::Data) {
1123 // Get run number
1124 runNumber_for_tool = acc.runNumberAcc(event_info);
1125 // Get etaCalo, phiCalo
1126 const auto cl_eta = acc.clusterEtaAcc(inputCluster);
1127 double etaCalo = 0, phiCalo = 0;
1129 etaCalo = acc.etaCaloAcc(inputCluster, acc.authorAcc(input), false);
1131 phiCalo =
1132 acc.phiCaloAcc(inputCluster, acc.authorAcc(input), false);
1133 }
1134 }
1135
1136 // Intermodule
1138 energy =
1139 intermodule_correction(energy, acc.clusterPhiAcc(inputCluster), cl_eta);
1140 ATH_MSG_DEBUG("energy after intermodule correction = "
1141 << std::format("{:.2f}", energy));
1142 }
1143
1144 // Calo distortion
1150 double etaC = acc.clusterEtaAcc(inputCluster);
1151 double phiC = acc.clusterPhiAcc(inputCluster);
1152 int ieta = m_caloDistPhiUnifCorr->GetXaxis()->FindBin(etaC);
1153 ieta = ieta == 0 ? 1
1154 : (ieta > m_caloDistPhiUnifCorr->GetNbinsX()
1155 ? m_caloDistPhiUnifCorr->GetNbinsX()
1156 : ieta);
1157 int iphi = m_caloDistPhiUnifCorr->GetYaxis()->FindBin(phiC);
1158 iphi = iphi == 0 ? 1
1159 : (iphi > m_caloDistPhiUnifCorr->GetNbinsY()
1160 ? m_caloDistPhiUnifCorr->GetNbinsY()
1161 : iphi);
1162 energy *= m_caloDistPhiUnifCorr->GetBinContent(ieta, iphi);
1164 "energy after phi uniformity correction (for calo distortion) = "
1165 << std::format("{:.2f}", energy));
1166 }
1167
1168 // Phi
1170 energy *= correction_phi_unif(etaCalo, phiCalo);
1171 ATH_MSG_DEBUG("energy after uniformity correction = "
1172 << std::format("{:.2f}", energy));
1173 }
1174
1175 // ADC
1176 if (m_ADCLinearity_tool) {
1177 double et = energy / std::cosh(cl_eta);
1178 double corr =
1179 m_ADCLinearity_tool->getCorr(etaCalo, et, xAOD2ptype(input));
1180 energy *= corr;
1181 ATH_MSG_DEBUG("energy after ADC linearity correction = "
1182 << std::format("{:.2f}", energy));
1183 }
1184
1185 // Gain
1186 if (m_gain_tool) {
1187 const auto es2 = acc.Es2Acc.isAvailable(inputCluster)
1188 ? acc.Es2Acc(inputCluster)
1189 : acc.energyBEAcc (inputCluster,2);
1190 if (!(std::abs(cl_eta) < 1.52 and std::abs(cl_eta) > 1.37) and
1191 std::abs(cl_eta) < 2.4)
1192 energy = m_gain_tool->CorrectionGainTool(
1193 cl_eta, energy / GeV, es2 / GeV,
1194 xAOD2ptype(input)); // cl_eta ok, TODO: check corrected E2
1195 } else if (m_gain_tool_run2) {
1196 double et = energy / std::cosh(cl_eta);
1197 double corr = m_gain_tool_run2->getUncertainty(etaCalo, et,
1198 xAOD2ptype(input), true);
1199 energy /= (1 + corr);
1200 }
1201 ATH_MSG_DEBUG("energy after gain correction = " << std::format("{:.2f}", energy));
1202 } else {
1203 if (m_user_random_run_number == 0) {
1204 if (acc.randomrunnumber_getter.isAvailable(event_info)) {
1205 runNumber_for_tool = acc.randomrunnumber_getter(event_info);
1206 } else {
1208 "Pileup tool not run before using "
1209 "ElectronPhotonFourMomentumCorrection! Assuming it is 2016. If you "
1210 "want to force a specific period set the property randomRunNumber "
1211 "of the tool, e.g. in the job option: "
1212 "tool.randomRunNumber = 123456 or "
1213 "tool.randomRunNumber = "
1214 "EgammaCalibrationAndSmearingToolRunNumbersExample.run_2016");
1216 }
1217 } else {
1218 runNumber_for_tool = m_user_random_run_number;
1219 }
1220 }
1221
1222 const double eraw = ((acc.Es0Acc.isAvailable(inputCluster)
1223 ? acc.Es0Acc(inputCluster)
1224 : acc.energyBEAcc(inputCluster,0)) +
1225 (acc.Es1Acc.isAvailable(inputCluster)
1226 ? acc.Es1Acc(inputCluster)
1227 : acc.energyBEAcc(inputCluster,1)) +
1228 (acc.Es2Acc.isAvailable(inputCluster)
1229 ? acc.Es2Acc(inputCluster)
1230 : acc.energyBEAcc(inputCluster,2)) +
1231 (acc.Es3Acc.isAvailable(inputCluster)
1232 ? acc.Es3Acc(inputCluster)
1233 : acc.energyBEAcc(inputCluster,3)));
1234
1235
1236 if (dataType == PATCore::ParticleDataType::Fast)
1237 ATH_MSG_DEBUG("is fast");
1238 else if (dataType == PATCore::ParticleDataType::Full)
1239 ATH_MSG_DEBUG("is full");
1240 else if (dataType == PATCore::ParticleDataType::Data)
1241 ATH_MSG_DEBUG("is data");
1242
1243 // apply scale factors or systematics
1244 energy = m_rootTool->getCorrectedEnergy(
1245 runNumber_for_tool, dataType, xAOD2ptype(input),
1246 inputCluster(acc.clusterEtaAcc),
1247 inputCluster(acc.clusterEtaBEAcc,2),
1248 acc.etaCaloAcc(inputCluster, acc.authorAcc (input), false), energy,
1249 acc.Es2Acc.isAvailable(inputCluster)
1250 ? acc.Es2Acc(inputCluster)
1251 : inputCluster(acc.energyBEAcc,2),
1252 eraw, seed, oldtool_scale_flag_this_event(input, event_info),
1254 m_varSF);
1255
1256 ATH_MSG_DEBUG("energy after scale/systematic correction = " << std::format("{:.2f}", energy));
1257
1258 // TODO: this check should be done before systematics variations
1259 setPt(input, energy);
1261}
#define ATH_MSG_ERROR(x)
#define ATH_MSG_WARNING(x)
ServiceHandle< StoreGateSvc > & evtStore()
@ Error
Some error happened during the object correction.
@ Ok
The correction was done successfully.
PATCore::ParticleDataType::DataType m_simulation
void setPt(columnar::MutableEgammaId input, double energy) const
double intermodule_correction(double Ecl, double phi, double eta) const
egEnergyCorr::Scale::Variation oldtool_scale_flag_this_event(columnar::EgammaId p, columnar::EventInfoId event_info) const
std::unique_ptr< egGain::GainUncertainty > m_gain_tool_run2
PATCore::ParticleType::Type xAOD2ptype(columnar::EgammaId particle) const
double correction_phi_unif(double eta, double phi) const
egEnergyCorr::Resolution::Variation oldtool_resolution_flag_this_event(columnar::EgammaId p, columnar::EventInfoId event_info) const
std::unique_ptr< AtlasRoot::egammaEnergyCorrectionTool > m_rootTool
const xAOD::TrackParticle * trackParticle(size_t index=0) const
Pointer to the xAOD::TrackParticle/s that match the electron candidate.
@ IS_SIMULATION
true: simulation, false: data
virtual double eta() const override final
The pseudorapidity ( ) of the particle.
ObjectId< ClusterDef > ClusterId
Definition ClusterDef.h:23
const uint16_t AuthorFwdElectron
Electron reconstructed by the Forward cluster-based algorithm.
Definition EgammaDefs.h:30
@ PileUp
Pile-up vertex.
@ PriVtx
Primary vertex.
VertexContainer_v1 VertexContainer
Definition of the current "Vertex container version".
Electron_v1 Electron
Definition of the current "egamma version".

◆ applyCorrection() [2/2]

CP::CorrectionCode CP::EgammaCalibrationAndSmearingTool::applyCorrection ( xAOD::Egamma & input) const
overrideprivatevirtual

Implements CP::IEgammaCalibrationAndSmearingTool.

Definition at line 954 of file EgammaCalibrationAndSmearingTool.cxx.

955 {
956 // Retrieve the event information:
957 const xAOD::EventInfo* event_info = nullptr;
958 if (evtStore()->retrieve(event_info, "EventInfo").isFailure()) {
959 ATH_MSG_ERROR("No EventInfo object could be retrieved");
961 }
962 return applyCorrection(input, *event_info);
963}
virtual CP::CorrectionCode applyCorrection(xAOD::Egamma &) const override
EventInfo_v1 EventInfo
Definition of the latest event info version.

◆ applySystematicVariation()

StatusCode CP::EgammaCalibrationAndSmearingTool::applySystematicVariation ( const CP::SystematicSet & systConfig)
overrideprivatevirtual

effects: configure this tool for the given list of systematic variations.

any requested systematics that are not affecting this tool will be silently ignored (unless they cause other errors). failures: systematic unknown failures: requesting multiple variations on the same systematic (e.g. up & down) failures: requesting an unsupported variation on an otherwise supported systematic (e.g. a 2 sigma variation and the tool only supports 1 sigma variations) failures: unsupported combination of supported systematic failures: other tool specific errors

Implements CP::ISystematicsTool.

Definition at line 2176 of file EgammaCalibrationAndSmearingTool.cxx.

2177 {
2178
2179 // set the nominal one (no systematics)
2189
2190 if (systConfig.empty())
2191 return StatusCode::SUCCESS;
2192
2193 // the following code allows only ONE systematic variation at a time (1 for
2194 // scale, 1 for resolution)
2195
2196 bool first_scale = true;
2197 bool first_resolution = true;
2198 for (const auto& it : systConfig) {
2199 const auto found_scale = m_syst_description.find(it);
2200 if (found_scale != m_syst_description.end()) {
2201 if (not first_scale) {
2202 ATH_MSG_ERROR("multiple scale variations not supported");
2203 throw std::runtime_error("multiple scale variations not supported");
2204 }
2205 first_scale = false;
2206 m_currentScaleVariation_MC = found_scale->second.effect;
2207 m_currentScalePredicate = found_scale->second.predicate;
2208 }
2209
2210 const auto found_resolution = m_syst_description_resolution.find(it);
2211 if (found_resolution != m_syst_description_resolution.end()) {
2212 if (not first_resolution) {
2213 ATH_MSG_ERROR("multiple resolution variations not supported");
2214 throw std::runtime_error(
2215 "multiple resolution variations not supported");
2216 }
2217 first_resolution = false;
2218 m_currentResolutionVariation_MC = found_resolution->second;
2219 }
2220 }
2221
2222 return StatusCode::SUCCESS;
2223}
bool empty() const
returns: whether the set is empty

◆ beginEvent()

StatusCode asg::AsgMetadataTool::beginEvent ( )
protectedvirtualinherited

◆ beginInputFile()

StatusCode asg::AsgMetadataTool::beginInputFile ( )
protectedvirtualinherited

Function called when a new input file is opened.

Dummy implementation that can be overridden by the derived tool.

Reimplemented in AsgElectronEfficiencyCorrectionTool, BookkeeperDumperTool, BookkeeperTool, PMGTools::PMGTruthWeightTool, TauAnalysisTools::TauEfficiencyCorrectionsTool, TauAnalysisTools::TauSmearingTool, Trig::TrigDecisionTool, Trig::xAODBunchCrossingTool, TrigConf::xAODConfigTool, xAODMaker::TriggerMenuMetaDataTool, and xAODMaker::TruthMetaDataTool.

Definition at line 185 of file AsgMetadataTool.cxx.

185 {
186
187 // Return gracefully:
188 return StatusCode::SUCCESS;
189 }

◆ callEvents()

void CP::EgammaCalibrationAndSmearingTool::callEvents ( columnar::EventContextRange events) const
override

Definition at line 2589 of file EgammaCalibrationAndSmearingTool.cxx.

2591{
2592 const Accessors& acc = *m_accessors;
2593 for (auto event : events) {
2594 auto eventInfo = acc.m_eventHandle(event);
2595 callSingleEvent (acc.m_egammaHandle(event), eventInfo);
2596 }
2597}
void callSingleEvent(columnar::MutableEgammaRange egammas, columnar::EventInfoId event) const

◆ callSingleEvent()

void CP::EgammaCalibrationAndSmearingTool::callSingleEvent ( columnar::MutableEgammaRange egammas,
columnar::EventInfoId event ) const

Definition at line 2580 of file EgammaCalibrationAndSmearingTool.cxx.

2582{
2583 for (auto egamma : egammas) {
2584 if (applyCorrection (egamma, event) != CP::CorrectionCode::Ok)
2585 throw std::runtime_error ("EgammaCalibrationAndSmearingTool::callEvents: apply failed");
2586 }
2587}

◆ correctedCopy() [1/2]

CP::CorrectionCode CP::EgammaCalibrationAndSmearingTool::correctedCopy ( const xAOD::Electron & input,
xAOD::Electron *& output ) const
overrideprivatevirtual

Implements CP::IEgammaCalibrationAndSmearingTool.

Definition at line 965 of file EgammaCalibrationAndSmearingTool.cxx.

966 {
967 // A sanity check:
968 if (output)
970 "Non-null pointer received. "
971 "There's a possible memory leak!");
972
973 output = new xAOD::Electron();
974 output->makePrivateStore(input);
975 return applyCorrection(*output);
976}
output
Definition merge.py:16

◆ correctedCopy() [2/2]

CP::CorrectionCode CP::EgammaCalibrationAndSmearingTool::correctedCopy ( const xAOD::Photon & input,
xAOD::Photon *& output ) const
overrideprivatevirtual

Implements CP::IEgammaCalibrationAndSmearingTool.

Definition at line 978 of file EgammaCalibrationAndSmearingTool.cxx.

979 {
980 // A sanity check:
981 if (output)
983 "Non-null pointer received. "
984 "There's a possible memory leak!");
985
986 output = new xAOD::Photon();
987 output->makePrivateStore(input);
988 return applyCorrection(*output);
989}
Photon_v1 Photon
Definition of the current "egamma version".

◆ correction_phi_unif()

double CP::EgammaCalibrationAndSmearingTool::correction_phi_unif ( double eta,
double phi ) const

Definition at line 2415 of file EgammaCalibrationAndSmearingTool.cxx.

2416 {
2417 constexpr double PI = M_PI;
2418 double Fcorr = 1.0;
2419
2421 // wrong mapping HV -> sectors in run1
2422 if (eta < -0.4 && eta > -0.6) {
2423 if (phi < (14 * PI / 32.) && phi > (13 * PI / 32.)) {
2424 Fcorr += 0.035;
2425 } else if (phi < (13 * PI / 32.) && phi > (12 * PI / 32.)) {
2426 Fcorr -= 0.035;
2427 }
2428 }
2429 }
2430
2444
2445 if (eta < 0.2 && eta > 0.) {
2446 if (phi < (-7 * 2 * PI / 32.) && phi > (-8 * 2 * PI / 32.)) {
2447 Fcorr = 1.016314;
2448 }
2449 }
2450
2451 else if (eta < 0.6 && eta > 0.4) {
2452 if (phi < 0 && phi > (-2 * PI / 32.)) {
2453 Fcorr = 1.041591;
2454 } else if (phi < (-4 * 2 * PI / 32.) && phi > (-5 * 2 * PI / 32.)) {
2455 Fcorr = 1.067346;
2456 }
2457 }
2458
2459 else if (eta < 0.8 && eta > 0.6) {
2460 if (phi < (7 * 2 * PI / 32.) && phi > (6 * 2 * PI / 32.)) {
2461 Fcorr = 1.027980;
2462 }
2463 }
2464
2465 else if (eta < 1.4 && eta > 1.2) {
2466 if (phi < (-9 * 2 * PI / 32.) && phi > (-10 * 2 * PI / 32.)) {
2467 Fcorr = 1.020299;
2468 } else if (phi < (-11 * 2 * PI / 32.) && phi > (-12 * 2 * PI / 32.)) {
2469 Fcorr = 1.051426;
2470 }
2471 }
2472
2473 else if (eta < 2.3 && eta > 2.1) {
2474 if (phi < (-12 * 2 * PI / 32.) && phi > (-13 * 2 * PI / 32.)) {
2475 Fcorr = 1.071695;
2476 }
2477 }
2478
2479 else if (eta < 0. && eta > -0.2) {
2480 if (phi < (-12 * 2 * PI / 32.) && phi > (-13 * 2 * PI / 32.)) {
2481 Fcorr = 1.008227;
2482 } else if (phi < (-8 * 2 * PI / 32.) && phi > (-9 * 2 * PI / 32.)) {
2483 Fcorr = 1.013929;
2484 }
2485 }
2486
2487 else if (eta < -0.2 && eta > -0.4) {
2488 if (phi < (-9 * 2 * PI / 32.) && phi > (-10 * 2 * PI / 32.)) {
2489 Fcorr = 1.015749;
2490 }
2491 }
2492
2493 else if (eta < -1.2 && eta > -1.4) {
2494 if (phi < (-6 * 2 * PI / 32.) && phi > (-7 * 2 * PI / 32.)) {
2495 Fcorr = 1.064954;
2496 }
2497 }
2498
2499 else if (eta < -1.6 && eta > -1.8) {
2500 if (phi < (9 * 2 * PI / 32.) && phi > (8 * 2 * PI / 32.)) {
2501 Fcorr = 1.027448;
2502 }
2503 }
2504
2505 else if (eta < -2.3 && eta > -2.5) {
2506 if (phi < (-8 * 2 * PI / 32.) && phi > (-9 * 2 * PI / 32.)) {
2507 Fcorr = 1.025882;
2508 } else if (phi < (5 * 2 * PI / 32.) && phi > (4 * 2 * PI / 32.)) {
2509 Fcorr = 1.036616;
2510 } else if (phi < (9 * 2 * PI / 32.) && phi > (8 * 2 * PI / 32.)) {
2511 Fcorr = 1.053838;
2512 } else if (phi < (10 * 2 * PI / 32.) && phi > (9 * 2 * PI / 32.)) {
2513 Fcorr = 1.026856;
2514 } else if (phi < (11 * 2 * PI / 32.) && phi > (10 * 2 * PI / 32.)) {
2515 Fcorr = 0.994382;
2516 }
2517 }
2518
2519 } // es2017_summer_improved end
2520
2521 else {
2522 if (eta < 0.6 && eta > 0.4) {
2523 if (phi < 0 && phi > (-2 * PI / 32.)) {
2524 Fcorr = 1.028;
2525 } else if (phi < (-4 * 2 * PI / 32.) && phi > (-5 * 2 * PI / 32.)) {
2526 Fcorr = 1.044;
2527 }
2528 }
2529
2530 else if (eta < 0.8 && eta > 0.6) {
2531 if (phi < (7 * 2 * PI / 32.) && phi > (6 * 2 * PI / 32.)) {
2532 Fcorr = 1.022;
2533 }
2534 }
2535
2536 else if (eta < 1.4 && eta > 1.2) {
2537 if (phi < (-11 * 2 * PI / 32.) && phi > (-12 * 2 * PI / 32.)) {
2538 Fcorr = 1.038;
2539 }
2540 }
2541
2542 else if (eta < 2.0 && eta > 1.9) {
2543 if (phi < (10 * 2 * PI / 32.) && phi > (9 * 2 * PI / 32.)) {
2544 Fcorr = 1.029;
2545 }
2546 }
2547
2548 else if (eta < -1.2 && eta > -1.4) {
2549 if (phi < (-4 * 2 * PI / 32.) && phi > (-5 * 2 * PI / 32.)) {
2550 Fcorr = 1.048;
2551 } else if (phi < (-6 * 2 * PI / 32.) && phi > (-7 * 2 * PI / 32.)) {
2552 Fcorr = 1.048;
2553 }
2554 }
2555
2556 else if (eta < -1.6 && eta > -1.8) {
2557 if (phi < (9 * 2 * PI / 32.) && phi > (8 * 2 * PI / 32.)) {
2558 Fcorr = 1.024;
2559 }
2560 }
2561
2562 else if (eta < -2.3 && eta > -2.5) {
2563 if (phi < (-8 * 2 * PI / 32.) && phi > (-9 * 2 * PI / 32.)) {
2564 Fcorr = 1.037;
2565 } else if (phi < (5 * 2 * PI / 32.) && phi > (4 * 2 * PI / 32.)) {
2566 Fcorr = 1.031;
2567 } else if (phi < (9 * 2 * PI / 32.) && phi > (8 * 2 * PI / 32.)) {
2568 Fcorr = 1.040;
2569 } else if (phi < (10 * 2 * PI / 32.) && phi > (9 * 2 * PI / 32.)) {
2570 Fcorr = 1.030;
2571 } else if (phi < (11 * 2 * PI / 32.) && phi > (10 * 2 * PI / 32.)) {
2572 Fcorr = 1.020;
2573 }
2574 }
2575 }
2576
2577 return Fcorr;
2578}
#define M_PI
Scalar eta() const
pseudorapidity method
const float PI

◆ declareGaudiProperty()

Gaudi::Details::PropertyBase & AthCommonDataStore< AthCommonMsg< AlgTool > >::declareGaudiProperty ( Gaudi::Property< T, V, H > & hndl,
const SG::VarHandleKeyType &  )
inlineprivateinherited

specialization for handling Gaudi::Property<SG::VarHandleKey>

Definition at line 156 of file AthCommonDataStore.h.

158 {
160 hndl.value(),
161 hndl.documentation());
162
163 }

◆ declareProperty()

Gaudi::Details::PropertyBase & AthCommonDataStore< AthCommonMsg< AlgTool > >::declareProperty ( Gaudi::Property< T, V, H > & t)
inlineinherited

Definition at line 145 of file AthCommonDataStore.h.

145 {
146 typedef typename SG::HandleClassifier<T>::type htype;
148 }
Gaudi::Details::PropertyBase & declareGaudiProperty(Gaudi::Property< T, V, H > &hndl, const SG::VarHandleKeyType &)
specialization for handling Gaudi::Property<SG::VarHandleKey>

◆ detStore()

const ServiceHandle< StoreGateSvc > & AthCommonDataStore< AthCommonMsg< AlgTool > >::detStore ( ) const
inlineinherited

The standard StoreGateSvc/DetectorStore Returns (kind of) a pointer to the StoreGateSvc.

Definition at line 95 of file AthCommonDataStore.h.

◆ DoubleOrAbsEtaCaloPredicateFactory()

const EgammaPredicate CP::EgammaCalibrationAndSmearingTool::DoubleOrAbsEtaCaloPredicateFactory ( double eta1_min,
double eta1_max,
double eta2_min,
double eta2_max ) const
inlineprivate

◆ endInputFile()

StatusCode asg::AsgMetadataTool::endInputFile ( )
protectedvirtualinherited

Function called when the currently open input file got completely processed.

Dummy implementation that can be overridden by the derived tool.

Reimplemented in BookkeeperDumperTool, BookkeeperTool, xAODMaker::TriggerMenuMetaDataTool, and xAODMaker::TruthMetaDataTool.

Definition at line 193 of file AsgMetadataTool.cxx.

193 {
194
195 // Return gracefully:
196 return StatusCode::SUCCESS;
197 }

◆ EtaCaloPredicateFactory()

const EgammaPredicate CP::EgammaCalibrationAndSmearingTool::EtaCaloPredicateFactory ( double eta_min,
double eta_max ) const
inlineprivate

◆ evtStore()

ServiceHandle< StoreGateSvc > & AthCommonDataStore< AthCommonMsg< AlgTool > >::evtStore ( )
inlineinherited

The standard StoreGateSvc (event store) Returns (kind of) a pointer to the StoreGateSvc.

Definition at line 85 of file AthCommonDataStore.h.

◆ extraDeps_update_handler()

void AthCommonDataStore< AthCommonMsg< AlgTool > >::extraDeps_update_handler ( Gaudi::Details::PropertyBase & ExtraDeps)
protectedinherited

Add StoreName to extra input/output deps as needed.

use the logic of the VarHandleKey to parse the DataObjID keys supplied via the ExtraInputs and ExtraOuputs Properties to add the StoreName if it's not explicitly given

◆ getElectronMomentum()

double CP::EgammaCalibrationAndSmearingTool::getElectronMomentum ( const xAOD::Electron * el,
const xAOD::EventInfo * event_info )
virtual

Definition at line 1301 of file EgammaCalibrationAndSmearingTool.cxx.

1302 {
1305 ? m_simulation
1307
1308 const xAOD::TrackParticle* eTrack = el->trackParticle();
1309
1310 // track momentum and eta
1311 const float el_tracketa = eTrack->eta();
1312 const float el_trackmomentum = eTrack->pt() * cosh(el->eta());
1313
1314 return m_rootTool->getCorrectedMomentum(
1315 dataType, PATCore::ParticleType::Electron, el_trackmomentum, el_tracketa,
1316 oldtool_scale_flag_this_event(*el, *event_info), m_varSF);
1317}
bool eventType(EventType type) const
Check for one particular bitmask value.
virtual double pt() const override final
The transverse momentum ( ) of the particle.
TrackParticle_v1 TrackParticle
Reference the current persistent version:

◆ getEnergy() [1/3]

double CP::EgammaCalibrationAndSmearingTool::getEnergy ( const xAOD::Electron & input) const
private

Definition at line 1000 of file EgammaCalibrationAndSmearingTool.cxx.

1001 {
1002 xAOD::Electron* new_particle = nullptr;
1003 ANA_CHECK_THROW(correctedCopy(input, new_particle));
1004 const double e = new_particle->e();
1005 delete new_particle;
1006 return e;
1007}
#define ANA_CHECK_THROW(EXP)
check whether the given expression was successful, throwing an exception on failure
virtual CP::CorrectionCode correctedCopy(const xAOD::Electron &, xAOD::Electron *&) const override
virtual double e() const override
The total energy of the particle.
Definition Egamma_v1.cxx:86

◆ getEnergy() [2/3]

double CP::EgammaCalibrationAndSmearingTool::getEnergy ( const xAOD::Photon & input) const
private

Definition at line 991 of file EgammaCalibrationAndSmearingTool.cxx.

992 {
993 xAOD::Photon* new_particle = nullptr;
994 ANA_CHECK_THROW(correctedCopy(input, new_particle));
995 const double e = new_particle->e();
996 delete new_particle;
997 return e;
998}
virtual double e() const override final
The total energy of the particle.
Definition Photon_v1.cxx:46

◆ getEnergy() [3/3]

double CP::EgammaCalibrationAndSmearingTool::getEnergy ( xAOD::Egamma * p,
const xAOD::EventInfo * event_info )
virtual

Definition at line 1273 of file EgammaCalibrationAndSmearingTool.cxx.

1274 {
1275 ANA_CHECK_THROW(applyCorrection(*p, *event_info));
1276 ATH_MSG_DEBUG("returning " << p->e());
1277 return p->e();
1278}

◆ getKey()

SG::sgkey_t asg::AsgTool::getKey ( const void * ptr) const
inherited

Get the (hashed) key of an object that is in the event store.

This is a bit of a special one. StoreGateSvc and xAOD::Event both provide ways for getting the SG::sgkey_t key for an object that is in the store, based on a bare pointer. But they provide different interfaces for doing so.

In order to allow tools to efficiently perform this operation, they can use this helper function.

See also
asg::AsgTool::getName
Parameters
ptrThe bare pointer to the object that the event store should know about
Returns
The hashed key of the object in the store. If not found, an invalid (zero) key.

Definition at line 119 of file AsgTool.cxx.

119 {
120
121#ifdef XAOD_STANDALONE
122 // In case we use @c xAOD::Event, we have a direct function call
123 // for this.
124 return evtStore()->event()->getKey( ptr );
125#else
126 const SG::DataProxy* proxy = evtStore()->proxy( ptr );
127 return ( proxy == nullptr ? 0 : proxy->sgkey() );
128#endif // XAOD_STANDALONE
129 }

◆ getName()

const std::string & asg::AsgTool::getName ( const void * ptr) const
inherited

Get the name of an object that is / should be in the event store.

This is a bit of a special one. StoreGateSvc and xAOD::Event both provide ways for getting the std::string name for an object that is in the store, based on a bare pointer. But they provide different interfaces for doing so.

In order to allow tools to efficiently perform this operation, they can use this helper function.

See also
asg::AsgTool::getKey
Parameters
ptrThe bare pointer to the object that the event store should know about
Returns
The string name of the object in the store. If not found, an empty string.

Definition at line 106 of file AsgTool.cxx.

106 {
107
108#ifdef XAOD_STANDALONE
109 // In case we use @c xAOD::Event, we have a direct function call
110 // for this.
111 return evtStore()->event()->getName( ptr );
112#else
113 const SG::DataProxy* proxy = evtStore()->proxy( ptr );
114 static const std::string dummy = "";
115 return ( proxy == nullptr ? dummy : proxy->name() );
116#endif // XAOD_STANDALONE
117 }

◆ getProperty()

template<class T>
const T * asg::AsgTool::getProperty ( const std::string & name) const
inherited

Get one of the tool's properties.

◆ getRandomSeedFunction()

const IdFunction CP::EgammaCalibrationAndSmearingTool::getRandomSeedFunction ( ) const
inlineprivate

Definition at line 241 of file EgammaCalibrationAndSmearingTool.h.

241{ return m_set_seed_function; }

◆ getResolution()

double CP::EgammaCalibrationAndSmearingTool::getResolution ( const xAOD::Egamma & particle,
bool withCT = true ) const
overridevirtual

Implements CP::IEgammaCalibrationAndSmearingTool.

Definition at line 936 of file EgammaCalibrationAndSmearingTool.cxx.

937 {
938 const auto ptype = xAOD2ptype(particle);
939 const auto cl_etaCalo =
940 xAOD::get_eta_calo(*particle.caloCluster(), particle.author());
941
942 return m_rootTool->resolution(particle.e(), particle.caloCluster()->eta(),
943 cl_etaCalo, ptype, withCT,
944 false); // TODO: always for full simulation
945}
constexpr ParticleHypothesis particle[PARTICLEHYPOTHESES]
the array of masses
float get_eta_calo(const xAOD::CaloCluster &cluster, int author, bool do_throw=false)

◆ handle()

void asg::AsgMetadataTool::handle ( const Incident & inc)
protectedvirtualinherited

Function receiving incidents from IncidentSvc/Event.

Reimplemented in Trig::TrigDecisionTool.

Definition at line 135 of file AsgMetadataTool.cxx.

135 {
136
137 // Tell the user what's happening:
138 ATH_MSG_VERBOSE( "Callback received with incident: " << inc.type() );
139
140 // Call the appropriate member function:
141 if( inc.type() == IncidentType::BeginInputFile ) {
143 if( beginInputFile().isFailure() ) {
144 ATH_MSG_FATAL( "Failed to call beginInputFile()" );
145 throw std::runtime_error( "Couldn't call beginInputFile()" );
146 }
147 } else if( inc.type() == IncidentType::EndInputFile ) {
148 if( endInputFile().isFailure() ) {
149 ATH_MSG_FATAL( "Failed to call endInputFile()" );
150 throw std::runtime_error( "Couldn't call endInputFile()" );
151 }
152 } else if( inc.type() == IncidentType::BeginEvent ) {
153 // If the tool didn't catch the begin input file incident for the
154 // first input file of the job, then call the appropriate function
155 // now.
156 if( ! m_beginInputFileCalled ) {
158 if( beginInputFile().isFailure() ) {
159 ATH_MSG_FATAL( "Failed to call beginInputFile()" );
160 throw std::runtime_error( "Couldn't call beginInputFile()" );
161 }
162 }
163 if( beginEvent().isFailure() ) {
164 ATH_MSG_FATAL( "Failed to call beginEvent()" );
165 throw std::runtime_error( "Couldn't call beginEvent()" );
166 }
167
168 #ifdef XAOD_STANDALONE
169 } else if( inc.type() == IncidentType::MetaDataStop ) {
170 if( metaDataStop().isFailure() ) {
171 ATH_MSG_FATAL( "Failed to call metaDataStop()" );
172 throw std::runtime_error( "Couldn't call metaDataStop()" );
173 }
174
175 #endif // XAOD_STANDALONE
176 } else {
177 ATH_MSG_WARNING( "Unknown incident type received in AsgMetaDataTool: " << inc.type() );
178 }
179
180 return;
181 }
#define ATH_MSG_FATAL(x)
#define ATH_MSG_VERBOSE(x)
virtual StatusCode beginInputFile()
Function called when a new input file is opened.
virtual StatusCode beginEvent()
Function called when a new events is loaded.
bool m_beginInputFileCalled
Flag helping to discover when the tool misses the opening of the first input file.
virtual StatusCode endInputFile()
Function called when the currently open input file got completely processed.
virtual StatusCode metaDataStop()
Function called when the tool should write out its metadata.

◆ initialize()

StatusCode CP::EgammaCalibrationAndSmearingTool::initialize ( void )
overrideprivatevirtual

Implements CP::IEgammaCalibrationAndSmearingTool.

Definition at line 366 of file EgammaCalibrationAndSmearingTool.cxx.

366 {
367 ATH_MSG_INFO("Initialization");
368
369 if (m_ESModel == "es2015XX") {
370 ATH_MSG_ERROR("es2015XX is deprecated. Use es2015PRE");
371 }
372
373 if (m_ESModel == "es2010") {
375 } // legacy
376 else if (m_ESModel == "es2011c") {
378 } // mc11c : faulty G4; old geometry
379 else if (m_ESModel == "es2011d") {
381 } // mc11d : corrected G4; new geometry == final Run1 scheme
382 else if (m_ESModel == "es2012a") {
384 } // mc12a : "crude" G4 fix; old geometry
385 else if (m_ESModel == "es2012c") {
387 } // mc12c : corrected G4; new geometry == final Run1 scheme
388 else if (m_ESModel == "es2012XX") {
390 } else if (m_ESModel == "es2015PRE") {
392 } else if (m_ESModel == "es2015PRE_res_improved") {
394 } else if (m_ESModel == "es2015cPRE") {
396 } else if (m_ESModel == "es2015cPRE_res_improved") {
398 } else if (m_ESModel == "es2015c_summer") {
400 } else if (m_ESModel == "es2016PRE") {
402 } else if (m_ESModel == "es2016data_mc15c") {
404 } else if (m_ESModel == "es2016data_mc15c_summer") {
406 } else if (m_ESModel == "es2016data_mc15c_summer_improved") {
408 } else if (m_ESModel == "es2016data_mc15c_final") {
410 } else if (m_ESModel == "es2015_5TeV") {
412 } else if (m_ESModel == "es2017_R21_PRE") {
414 } else if (m_ESModel == "es2017_R21_v0") {
416 } else if (m_ESModel == "es2017_R21_v1") {
418 } else if (m_ESModel == "es2017_R21_ofc0_v1") {
420 } else if (m_ESModel == "es2018_R21_v0") {
422 } else if (m_ESModel == "es2018_R21_v1") {
424 } else if (m_ESModel == "es2022_R22_PRE") {
426 } else if (m_ESModel == "es2023_R22_Run2_v0") {
428 } else if (m_ESModel == "es2023_R22_Run2_v1") {
430 } else if (m_ESModel == "es2024_Run3_ofc0_v0") {
432 } else if (m_ESModel == "es2024_Run3_v0") {
434 } else if (m_ESModel == "es2025_Run3_GNN_v0") {
436 } else if (m_ESModel.empty()) {
437 ATH_MSG_ERROR("you must set ESModel property");
438 return StatusCode::FAILURE;
439 } else {
440 ATH_MSG_ERROR("Cannot understand model " << m_ESModel);
441 return StatusCode::FAILURE;
442 }
443
444 if (m_ResolutionType == "Gaussian") {
446 } else if (m_ResolutionType == "SigmaEff80") {
448 } else if (m_ResolutionType == "SigmaEff90") {
450 } else {
451 ATH_MSG_ERROR("Cannot understand resolution " << m_ResolutionType);
452 return StatusCode::FAILURE;
453 }
454
455 if (m_use_AFII != -1) {
457 "Property useAFII is deprecated. It is now replaced with useFastSim, "
458 "which should be explicitly configured");
459 return StatusCode::FAILURE;
460 }
461
462 if (m_useFastSim == 1) {
464 } else if (m_useFastSim == 0) {
466 } else {
467 ATH_MSG_ERROR("Property useFastSim should be explicitly configured");
468 return StatusCode::FAILURE;
469 }
470
474 "Sample is FastSim but no AF3 calibration is supported with "
475 "MC23 pre-recommendations (es2022_R22_PRE and es2024_Run3_ofc0_v0). "
476 "Please swtich to Run3 consolidated recommendations (es2024_Run3_v0), "
477 "or get in touch with the EGamma CP group in case you are using this");
478 return StatusCode::FAILURE;
479 }
480
481 // configure decorrelation model, translate string property to internal class
482 // enum
483 /* S R SR
484 0. 0 0 0 WARNING Full, Full (this is the default without configuration)
485 1. 0 0 1 SR
486 2. 0 1 0 FATAL
487 3. 0 1 1 WARNING SR then R
488 4. 1 0 0 FATAL
489 5. 1 0 1 WARNING SR then S
490 6. 1 1 0 S, R
491 7. 1 1 1 FATAL
492 */
493 if (m_decorrelation_model_name.empty() and
496 // case 0
497 ATH_MSG_WARNING("no decorrelation model specified, assuming full model");
498 m_decorrelation_model_scale = ScaleDecorrelation::FULL;
500 m_decorrelation_model_name = "FULL_v1";
501 } else if (not m_decorrelation_model_name.empty() and
504 // case 7
505 ATH_MSG_FATAL("too many flags for the decorrelation model");
506 return StatusCode::FAILURE;
507 } else {
508 // set scale decorrelation model
509 if (not m_decorrelation_model_scale_name.empty()) { // case 4, 5, 6, (7)
510 if (not m_decorrelation_model_name.empty()) {
512 "flag decorrelation model ignored for scale decorrelation model");
513 } // case 5
514 if (m_decorrelation_model_scale_name == "1NP_v1")
515 m_decorrelation_model_scale = ScaleDecorrelation::ONENP;
516 else if (m_decorrelation_model_scale_name == "FULL_ETACORRELATED_v1")
517 m_decorrelation_model_scale = ScaleDecorrelation::FULL_ETA_CORRELATED;
518 else if (m_decorrelation_model_scale_name == "1NPCOR_PLUS_UNCOR")
519 m_decorrelation_model_scale = ScaleDecorrelation::ONENP_PLUS_UNCONR;
520 else if (m_decorrelation_model_scale_name == "FULL_v1")
521 m_decorrelation_model_scale = ScaleDecorrelation::FULL;
522 else {
523 ATH_MSG_FATAL("cannot understand the scale decorrelation model '"
524 << m_decorrelation_model_scale_name << "'(typo?)");
525 return StatusCode::FAILURE;
526 }
527 } else if (not m_decorrelation_model_name.empty()) { // case 1, 3
528 if (m_decorrelation_model_name == "1NP_v1")
529 m_decorrelation_model_scale = ScaleDecorrelation::ONENP;
530 else if (m_decorrelation_model_name == "FULL_ETACORRELATED_v1")
531 m_decorrelation_model_scale = ScaleDecorrelation::FULL_ETA_CORRELATED;
532 else if (m_decorrelation_model_name == "1NPCOR_PLUS_UNCOR")
533 m_decorrelation_model_scale = ScaleDecorrelation::ONENP_PLUS_UNCONR;
534 else if (m_decorrelation_model_name == "FULL_v1")
535 m_decorrelation_model_scale = ScaleDecorrelation::FULL;
536 else {
537 ATH_MSG_FATAL("cannot understand the decorrelation model '"
538 << m_decorrelation_model_name << "'(typo?)");
539 return StatusCode::FAILURE;
540 }
541 } else { // case 2, (7)
543 "not information how to initialize the scale decorrelation model");
544 return StatusCode::FAILURE;
545 }
546
547 // set resolution decorralation model
549 .empty()) { // case 2, 3, 6, (7)
550 if (not m_decorrelation_model_name.empty()) {
552 "flag decorrelation model ignored for resolution decorrelation "
553 "model");
554 } // case 3
557 else if (m_decorrelation_model_resolution_name == "FULL_v1")
559 else {
560 ATH_MSG_FATAL("cannot understand the resolution decorrelation model '"
562 return StatusCode::FAILURE;
563 }
564 } else if (not m_decorrelation_model_name.empty()) { // case 1, 5
565 if (m_decorrelation_model_name == "1NP_v1")
567 else if (m_decorrelation_model_name == "FULL_ETACORRELATED_v1")
569 else if (m_decorrelation_model_name == "1NPCOR_PLUS_UNCOR")
571 else if (m_decorrelation_model_name == "FULL_v1")
573 else {
574 ATH_MSG_FATAL("cannot understand the decorrelation model '"
575 << m_decorrelation_model_name << "'(typo?)");
576 return StatusCode::FAILURE;
577 }
578 }
579 }
580
581 // create correction tool
582 ATH_MSG_DEBUG("creating internal correction tool");
583 m_rootTool = std::make_unique<AtlasRoot::egammaEnergyCorrectionTool>();
584 if (!m_rootTool) {
585 ATH_MSG_ERROR("Cannot initialize underlying tool");
586 return StatusCode::FAILURE;
587 }
588 m_rootTool->setESModel(m_TESModel);
589
595 "Using linear interpolation in the gain tool (uncertainties only)");
597 m_rootTool->setApplyL2GainInterpolation();
598 }
599 m_rootTool->msg().setLevel(this->msg().level());
600 m_rootTool->initialize();
601
602 // configure MVA calibration
603 if (m_use_mva_calibration != 0) {
604 ATH_MSG_DEBUG("creating MVA calibration tool (if needed)");
605 if (m_MVAfolder.empty()) { // automatically configure MVA tool
607 }
608
609 if (not m_MVAfolder.empty()) {
610
611 // electron MVA tool
612 asg::AsgToolConfig config_mva_electron(
613 "egammaMVACalibTool/tool_mva_electron");
614 config_mva_electron.setPropertyFromString("folder", m_MVAfolder);
615 ATH_CHECK(config_mva_electron.setProperty("use_layer_corrected", true));
616 ATH_CHECK(config_mva_electron.setProperty(
617 "ParticleType", xAOD::EgammaParameters::electron));
618
619 // unconverted photon MVA tool
620 asg::AsgToolConfig config_mva_unconverted(
621 "egammaMVACalibTool/tool_mva_unconverted");
622 config_mva_unconverted.setPropertyFromString("folder", m_MVAfolder);
623 ATH_CHECK(
624 config_mva_unconverted.setProperty("use_layer_corrected", true));
625 ATH_CHECK(config_mva_unconverted.setProperty(
627 ATH_CHECK(config_mva_unconverted.setProperty("OutputLevel",
628 this->msg().level()));
629
630 // converted photon MVA tool
631 asg::AsgToolConfig config_mva_converted(
632 "egammaMVACalibTool/tool_mva_converted");
633 config_mva_converted.setPropertyFromString("folder", m_MVAfolder);
634 ATH_CHECK(config_mva_converted.setProperty("use_layer_corrected", true));
635 ATH_CHECK(config_mva_converted.setProperty(
637 ATH_CHECK(config_mva_converted.setProperty("OutputLevel",
638 this->msg().level()));
639
640 // initialize the ServiceHandler egammaMVASvc
641 // make the name unique
642 std::ostringstream mva_service_name;
643 mva_service_name << "egammaMVASvc/service_mva_egamma_id"
644 << (void const*)this;
645 asg::AsgServiceConfig config_mva_service(mva_service_name.str());
646 ATH_CHECK(config_mva_service.addPrivateTool("ElectronTool",
647 config_mva_electron));
648 ATH_CHECK(config_mva_service.addPrivateTool("UnconvertedPhotonTool",
649 config_mva_unconverted));
650 ATH_CHECK(config_mva_service.addPrivateTool("ConvertedPhotonTool",
651 config_mva_converted));
652 // fwd electron MVA tool
653 if (m_doFwdCalib) {
654 asg::AsgToolConfig config_mva_fwdelectron(
655 "egammaMVACalibTool/tool_mva_fwdelectron");
656 config_mva_fwdelectron.setPropertyFromString("folder", m_MVAfolder);
657 ATH_CHECK(config_mva_fwdelectron.setProperty(
659 ATH_CHECK(config_mva_fwdelectron.setProperty("ShiftType", 0));
660 ATH_CHECK(config_mva_fwdelectron.setProperty("OutputLevel", this->msg().level()));
661 ATH_CHECK(config_mva_service.addPrivateTool("FwdElectronTool",
662 config_mva_fwdelectron));
663 }
664 config_mva_service.setPropertyFromString("folder", m_MVAfolder);
665 ATH_CHECK(
666 config_mva_service.setProperty("OutputLevel", this->msg().level()));
667 ATH_CHECK(config_mva_service.makeService(m_MVACalibSvc));
670 "WIP: testing GNN based calibration for Run3,"
671 "requring decorated GNN energy (gnn_energy) from input,"
672 "which should already have the layer calibration applied");
673 } else {
674 m_use_mva_calibration = false;
675 }
676 }
677
678 // configure layer recalibration tool
679 // For now: layer recalibration not applied to PRE release 21 (using run 1
680 // based calibration applied at reco level)
681 // for following R21 recommendations, need to apply the run2/run1 layer
682 // calibration ratio
683 if (m_ESModel == "es2017_R21_PRE") {
684 ATH_MSG_INFO("Layer recalibration already applied at cell level");
685 m_useLayerCorrection = false;
686 } else if (!m_useLayerCorrection) {
687 ATH_MSG_INFO("Layer corrections disabled!");
688 } else {
689 ATH_MSG_DEBUG("initializing layer recalibration tool (if needed)");
691 .empty()) { // automatically configure layer recalibration tool
694 .release();
696 ATH_MSG_INFO("not using layer recalibration");
697 }
698 } else {
700 new egammaLayerRecalibTool(m_layer_recalibration_tune, m_useSaccCorrection);
701 }
703 m_layer_recalibration_tool->msg().setLevel(this->msg().level());
705 if (!m_usePSCorrection) {
706 ATH_MSG_INFO("PS corrections disabled!");
707 m_layer_recalibration_tool->disable_PSCorrections();
708 }
709 if (!m_useS12Correction) {
710 ATH_MSG_INFO("S12 corrections disabled!");
711 m_layer_recalibration_tool->disable_S12Corrections();
712 }
713 if (!m_useSaccCorrection) {
714 ATH_MSG_INFO("Sacc corrections disabled!");
715 m_layer_recalibration_tool->disable_SaccCorrections();
716 }
717 }
718 }
719
721 m_rootTool->use_temp_correction201215(m_use_temp_correction201215);
723 m_rootTool->use_uA2MeV_2015_first2weeks_correction(
726 m_decorrelation_model_scale == ScaleDecorrelation::FULL) {
727 m_rootTool->useStatErrorScaling(true);
728 }
729
731 ATH_MSG_ERROR("ep combination not supported yet");
732 throw std::runtime_error("ep combination not supported yet");
733 }
734
737 }
740 }
742
743 if (m_useGainCorrection == AUTO) {
748 }
749 else {
750 ATH_MSG_DEBUG("initializing gain tool");
753 }
754 }
755 else if (m_useGainCorrection == 1) {
761 "cannot instantiate gain tool for this model (you can only disable "
762 "the gain tool, but not enable it)");
763 }
764 else {
766 "initializing gain tool for run2 final precision recommendations");
768 "Gain corrections required but Zee scales are derived without Gain, "
769 "will cause inconsistency!");
770 std::string gain_tool_run_2_filename = PathResolverFindCalibFile(
771 "ElectronPhotonFourMomentumCorrection/v29/"
772 "gain_uncertainty_specialRun.root");
773 m_gain_tool_run2 = std::make_unique<egGain::GainUncertainty>(
774 gain_tool_run_2_filename, false, "GainCorrection",
776 m_gain_tool_run2->msg().setLevel(this->msg().level());
777 }
778 }
779
784 // ADC non linearity correction
787 std::string adcLinearityCorr_filename = PathResolverFindCalibFile(
788 "ElectronPhotonFourMomentumCorrection/v25/linearity_ADC.root");
789 m_ADCLinearity_tool = std::make_shared<LinearityADC>(adcLinearityCorr_filename);
790 m_ADCLinearity_tool->msg().setLevel(this->msg().level());
791 m_rootTool->setADCTool(m_ADCLinearity_tool);
792 } else {
794 m_ESModel + " recommendations use ADC corrections for scale "
795 "derivation. Disabling the ADCLinearity flag will create "
796 "inconsistency!");
797 }
798
801 m_rootTool->setApplyLeakageCorrection(true);
802 }
803
804 // Calo distortion phi unif correction
808 std::string phiUnifCorrfileName = PathResolverFindCalibFile(
809 "ElectronPhotonFourMomentumCorrection/v33/"
810 "egammaEnergyCorrectionData.root");
811 std::unique_ptr<TFile> fCorr(
812 TFile::Open(phiUnifCorrfileName.c_str(), "READ"));
814 dynamic_cast<TH2*>(fCorr->Get("CaloDistortionPhiUniformityCorrection/"
815 "es2023_R22_Run2_v0/h2DcorrPhiUnif")));
816 m_caloDistPhiUnifCorr->SetDirectory(nullptr);
817 } else {
819 m_ESModel + " recommendations use CaloDistPhiUnif for scale "
820 "derivation. Disabling the CaloDistPhiUnif flag will create "
821 "inconsistency!");
822 }
823 }
824
825 // No scale correction for release 21 ==> obsolete
826 /*if (m_ESModel == "es2017_R21_PRE"){
827 m_doScaleCorrection = 0;
828 }
829 */
830
831 ATH_MSG_INFO("ESModel: " << m_ESModel);
832 ATH_MSG_INFO("ResolutionType: " << m_ResolutionType);
833 ATH_MSG_INFO("decorrelation Model: " << m_decorrelation_model_name);
834 ATH_MSG_DEBUG("layer correction = " << m_useLayerCorrection);
835 ATH_MSG_DEBUG("PS correction = " << m_usePSCorrection);
836 ATH_MSG_DEBUG("S12 correction = " << m_useS12Correction);
837 ATH_MSG_DEBUG("Sacc correction = " << m_useSaccCorrection);
838 ATH_MSG_DEBUG("intermodule correction = " << m_useIntermoduleCorrection);
839 ATH_MSG_DEBUG("phi uniformity correction = " << m_usePhiUniformCorrection);
840 ATH_MSG_DEBUG("distorted calo phi uniformity correction = "
842 ATH_MSG_DEBUG("gain correction = " << m_useGainCorrection);
843 ATH_MSG_DEBUG("ADC non-linearity correction = " << m_doADCLinearityCorrection);
844 ATH_MSG_DEBUG("leakage correction for photons = " << m_doLeakageCorrection);
845 ATH_MSG_DEBUG("smearing = " << m_doSmearing);
846 ATH_MSG_DEBUG("insitu scales = " << m_doScaleCorrection);
847 ATH_MSG_DEBUG("ep combination = " << m_use_ep_combination);
848 ATH_MSG_DEBUG("use MVA calibration = " << m_use_mva_calibration);
850 "use temperature correction 2015 = " << m_use_temp_correction201215);
851 ATH_MSG_DEBUG("use uA2MeV correction 2015 1/2 week = "
853
855
856 applySystematicVariation(CP::SystematicSet())
857 .ignore(); // this set the flags for the internal tool without
858 // systematics
859 CP::SystematicRegistry& registry = CP::SystematicRegistry::getInstance();
860 if (registry.registerSystematics(*this) != StatusCode::SUCCESS)
861 return StatusCode::FAILURE;
862
863 // For columnar, it is important only to set this accessor if it is
864 // needed, as it creates a hard data dependency on the column, which
865 // is not present in older PHYSLITE files, causing the tool to fail.
866 // An alternative would be to mark the column with `isOptional`, but
867 // since it is always required for the GNN calibration (and never
868 // otherwise), declaring it only for the GNN calibration seemed
869 // cleaner.
871 resetAccessor (m_accessors->gnn_energy_Acc, *this, "TransformerEnergy");
872 }
873 if (m_onlyElectrons.value() && m_onlyPhotons.value()) {
874 ATH_MSG_ERROR("Cannot select both onlyElectrons and onlyPhotons");
875 return StatusCode::FAILURE;
876 }
877 if (m_onlyElectrons.value()) {
880 resetAccessor (m_accessors->electronTrackAcc, *this, "trackParticleLinks");
881 }
882 }
883 if (m_onlyPhotons.value()) {
885 resetAccessor (m_accessors->photonVertexAcc, *this, "vertexLinks");
886 }
887 if (m_decorateEmva)
888 resetAccessor (m_accessors->decEmva, *this, "E_mva_only");
889
890 ANA_CHECK (initializeColumns ());
891
892 return StatusCode::SUCCESS;
893}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_INFO(x)
#define ANA_CHECK(EXP)
check whether the given expression was successful
std::string PathResolverFindCalibFile(const std::string &logical_file_name)
static const Attributes_t empty
virtual StatusCode applySystematicVariation(const CP::SystematicSet &systConfig) override
effects: configure this tool for the given list of systematic variations.
static SystematicRegistry & getInstance()
Get the singleton instance of the registry for the curren thread.
StatusCode registerSystematics(const IReentrantSystematicsTool &tool)
effects: register all the systematics from the tool
std::unique_ptr< egGain::GainTool > gainToolFactory(egEnergyCorr::ESModel model)
std::string egammaMVAToolFolder(egEnergyCorr::ESModel model)
bool is_after_run1(egEnergyCorr::ESModel model)
bool use_intermodule_correction(egEnergyCorr::ESModel model)
std::unique_ptr< egammaLayerRecalibTool > egammaLayerRecalibToolFactory(egEnergyCorr::ESModel model, int enableSacc)
bool use_phi_uniform_correction(egEnergyCorr::ESModel model)
void resetElectron(MomentumAccessors< CI, CM > &accessors, ColumnarTool< CM > &columnarTool)
void resetPhoton(MomentumAccessors< CI, CM > &accessors, ColumnarTool< CM > &columnarTool)
void resetAccessor(AccessorTemplate< CI, CT, CAM, CM > &accessor, ColumnarTool< CM > &columnBase, const std::string &name, ColumnAccessorOptions &&options={})
reset a column accessor to point to a new column
setBGCode setTAP setLVL2ErrorBits bool
MsgStream & msg
Definition testRead.cxx:32

◆ inputHandles()

virtual std::vector< Gaudi::DataHandle * > AthCommonDataStore< AthCommonMsg< AlgTool > >::inputHandles ( ) const
overridevirtualinherited

Return this algorithm's input handles.

We override this to include handle instances from key arrays if they have not yet been declared. See comments on updateVHKA.

◆ inputMetaStore()

AsgMetadataTool::MetaStorePtr_t asg::AsgMetadataTool::inputMetaStore ( ) const
inherited

Accessor for the input metadata store.

Definition at line 93 of file AsgMetadataTool.cxx.

93 {
94
95#ifdef XAOD_STANDALONE
96 return &m_inputMetaStore;
97#else // XAOD_STANDALONE
98 return m_inputMetaStore;
99#endif // XAOD_STANDALONE
100 }
MetaStore_t m_inputMetaStore
Object accessing the input metadata store.

◆ intermodule_correction()

double CP::EgammaCalibrationAndSmearingTool::intermodule_correction ( double Ecl,
double phi,
double eta ) const

Definition at line 2225 of file EgammaCalibrationAndSmearingTool.cxx.

2226 {
2227
2228 // Intermodule Widening Correction: E_corr = E / (a' - b' * ((1 / (1 +
2229 // exp((phi_mod - 2 * pi / 32) * c))) * (1 / (1 + exp((phi_mod - 2 * pi / 32)
2230 // * (d)))))) (phi_min, phi_max) : [a' = a / a, b' = b / a, c, d]
2231
2232 double Ecl_corr = 0.;
2233 int DivInt = 0;
2234 double pi = M_PI;
2235
2249
2250 double phi_mod = 0;
2251 if (phi < 0)
2252 phi_mod = fmod(phi, 2 * pi / 16.) + pi / 8.;
2253 else
2254 phi_mod = fmod(phi, 2 * pi / 16.);
2255
2256 // The correction concerns only the barrel
2257 if (std::abs(eta) <= 1.37) {
2258
2259 if (phi < (-7 * pi / 8) && phi > (-1 * pi))
2260 Ecl_corr =
2261 Ecl /
2262 (1 - 0.1086 *
2263 ((1 / (1 + exp((phi_mod - 2 * pi / 32.) * 175.2759))) *
2264 (1 / (1 + exp((phi_mod - 2 * pi / 32.) * (-189.3612))))));
2265 if (phi < (-6 * pi / 8) && phi > (-7 * pi / 8))
2266 Ecl_corr =
2267 Ecl /
2268 (1 - 0.0596 *
2269 ((1 / (1 + exp((phi_mod - 2 * pi / 32.) * 170.8305))) *
2270 (1 / (1 + exp((phi_mod - 2 * pi / 32.) * (-233.3782))))));
2271 if (phi < (-5 * pi / 8) && phi > (-6 * pi / 8))
2272 Ecl_corr =
2273 Ecl /
2274 (1 - 0.0596 *
2275 ((1 / (1 + exp((phi_mod - 2 * pi / 32.) * 147.1451))) *
2276 (1 / (1 + exp((phi_mod - 2 * pi / 32.) * (-139.3386))))));
2277 if (phi < (-4 * pi / 8) && phi > (-5 * pi / 8))
2278 Ecl_corr =
2279 Ecl /
2280 (1 - 0.0583 *
2281 ((1 / (1 + exp((phi_mod - 2 * pi / 32.) * 168.4644))) *
2282 (1 / (1 + exp((phi_mod - 2 * pi / 32.) * (-246.2897))))));
2283 if (phi < (-3 * pi / 8) && phi > (-4 * pi / 8))
2284 Ecl_corr =
2285 Ecl /
2286 (1 - 0.0530 *
2287 ((1 / (1 + exp((phi_mod - 2 * pi / 32.) * 177.6703))) *
2288 (1 / (1 + exp((phi_mod - 2 * pi / 32.) * (-198.3227))))));
2289 if (phi < (-2 * pi / 8) && phi > (-3 * pi / 8))
2290 Ecl_corr =
2291 Ecl /
2292 (1 - 0.0672 *
2293 ((1 / (1 + exp((phi_mod - 2 * pi / 32.) * 145.0693))) *
2294 (1 / (1 + exp((phi_mod - 2 * pi / 32.) * (-242.1771))))));
2295 if (phi < (-1 * pi / 8) && phi > (-2 * pi / 8))
2296 Ecl_corr =
2297 Ecl /
2298 (1 - 0.0871 *
2299 ((1 / (1 + exp((phi_mod - 2 * pi / 32.) * 132.3303))) *
2300 (1 / (1 + exp((phi_mod - 2 * pi / 32.) * (-166.1833))))));
2301 if (phi < (0 * pi / 8) && phi > (-1 * pi / 8))
2302 Ecl_corr =
2303 Ecl /
2304 (1 - 0.0948 *
2305 ((1 / (1 + exp((phi_mod - 2 * pi / 32.) * 127.6780))) *
2306 (1 / (1 + exp((phi_mod - 2 * pi / 32.) * (-150.0700))))));
2307 if (phi < (1 * pi / 8) && phi > (0 * pi / 8))
2308 Ecl_corr =
2309 Ecl /
2310 (1 - 0.1166 *
2311 ((1 / (1 + exp((phi_mod - 2 * pi / 32.) * 172.0679))) *
2312 (1 / (1 + exp((phi_mod - 2 * pi / 32.) * (-235.3293))))));
2313 if (phi < (2 * pi / 8) && phi > (1 * pi / 8))
2314 Ecl_corr =
2315 Ecl /
2316 (1 - 0.1172 *
2317 ((1 / (1 + exp((phi_mod - 2 * pi / 32.) * 190.3524))) *
2318 (1 / (1 + exp((phi_mod - 2 * pi / 32.) * (-198.9400))))));
2319 if (phi < (3 * pi / 8) && phi > (2 * pi / 8))
2320 Ecl_corr =
2321 Ecl /
2322 (1 - 0.1292 *
2323 ((1 / (1 + exp((phi_mod - 2 * pi / 32.) * 158.0540))) *
2324 (1 / (1 + exp((phi_mod - 2 * pi / 32.) * (-165.3893))))));
2325 if (phi < (4 * pi / 8) && phi > (3 * pi / 8))
2326 Ecl_corr =
2327 Ecl /
2328 (1 - 0.1557 *
2329 ((1 / (1 + exp((phi_mod - 2 * pi / 32.) * 162.2793))) *
2330 (1 / (1 + exp((phi_mod - 2 * pi / 32.) * (-133.5131))))));
2331 if (phi < (5 * pi / 8) && phi > (4 * pi / 8))
2332 Ecl_corr =
2333 Ecl /
2334 (1 - 0.1659 *
2335 ((1 / (1 + exp((phi_mod - 2 * pi / 32.) * 180.5270))) *
2336 (1 / (1 + exp((phi_mod - 2 * pi / 32.) * (-168.5074))))));
2337 if (phi < (6 * pi / 8) && phi > (5 * pi / 8))
2338 Ecl_corr =
2339 Ecl /
2340 (1 - 0.1123 *
2341 ((1 / (1 + exp((phi_mod - 2 * pi / 32.) * 128.2277))) *
2342 (1 / (1 + exp((phi_mod - 2 * pi / 32.) * (-154.4455))))));
2343 if (phi < (7 * pi / 8) && phi > (6 * pi / 8))
2344 Ecl_corr =
2345 Ecl /
2346 (1 - 0.1394 *
2347 ((1 / (1 + exp((phi_mod - 2 * pi / 32.) * 192.1216))) *
2348 (1 / (1 + exp((phi_mod - 2 * pi / 32.) * (-198.0727))))));
2349 if (phi < (8 * pi / 8) && phi > (7 * pi / 8))
2350 Ecl_corr =
2351 Ecl /
2352 (1 - 0.1001 *
2353 ((1 / (1 + exp((phi_mod - 2 * pi / 32.) * 199.1735))) *
2354 (1 / (1 + exp((phi_mod - 2 * pi / 32.) * (-176.4056))))));
2355 }
2356
2357 // No correction for the EC
2358 else {
2359 Ecl_corr = Ecl;
2360 }
2361
2362 }
2363
2364 else {
2365
2366 // Definitions of module folding into four quarters (top, left, bottom and
2367 // right)
2368
2369 DivInt = (int)(phi / ((2 * pi) / 16.));
2370 double phi_mod = phi - DivInt * (2 * pi / 16.);
2371
2372 // Centring on the intermodule --> phi_mod will now be in [0,0.4]
2373 if (phi_mod < 0)
2374 phi_mod += pi / 8.;
2375
2376 // The correction concerns only the barrel
2377 if (std::abs(eta) <= 1.4) {
2378
2379 // Top quarter
2380 if (phi < (3 * pi) / 4. && phi >= pi / 4.) {
2381 Ecl_corr =
2382 Ecl / (1 - 0.131 * ((1 / (1 + exp((phi_mod - 0.2) * 199.08))) *
2383 (1 / (1 + exp((phi_mod - 0.2) * (-130.36))))));
2384 }
2385
2386 // Right quarter
2387 if (phi < pi / 4. && phi >= -pi / 4.) {
2388 Ecl_corr =
2389 Ecl / (1 - 0.0879 * ((1 / (1 + exp((phi_mod - 0.2) * 221.01))) *
2390 (1 / (1 + exp((phi_mod - 0.2) * (-149.51))))));
2391 }
2392 // Bottom quarter
2393 if (phi < -pi / 4. && phi >= (-3 * pi) / 4.) {
2394 Ecl_corr =
2395 Ecl / (1 - 0.0605 * ((1 / (1 + exp((phi_mod - 0.2) * 281.37))) *
2396 (1 / (1 + exp((phi_mod - 0.2) * (-170.29))))));
2397 }
2398 // Left quarter
2399 if ((phi < (-3 * pi) / 4.) || (phi >= (3 * pi) / 4.)) {
2400 Ecl_corr =
2401 Ecl / (1 - 0.102 * ((1 / (1 + exp((phi_mod - 0.2) * 235.37))) *
2402 (1 / (1 + exp((phi_mod - 0.2) * (-219.04))))));
2403 }
2404 }
2405
2406 // No correction for the EC
2407 else {
2408 Ecl_corr = Ecl;
2409 }
2410 }
2411
2412 return Ecl_corr;
2413}
#define pi
setRawEt setRawPhi int

◆ isAffectedBySystematic()

bool CP::EgammaCalibrationAndSmearingTool::isAffectedBySystematic ( const CP::SystematicVariation & systematic) const
overrideprivatevirtual

Declare the interface that this class provides.

returns: whether this tool is affected by the given systematics

Implements CP::ISystematicsTool.

Definition at line 1319 of file EgammaCalibrationAndSmearingTool.cxx.

1320 {
1321 CP::SystematicSet sys = affectingSystematics();
1322 return sys.find(systematic) != sys.end();
1323}
virtual CP::SystematicSet affectingSystematics() const override
the list of all systematics this tool can be affected by

◆ metaDataStop()

StatusCode asg::AsgMetadataTool::metaDataStop ( )
protectedvirtualinherited

Function called when the tool should write out its metadata.

Dummy implementation that can be overridden by the derived tool.

Reimplemented in BookkeeperDumperTool, BookkeeperTool, xAODMaker::TriggerMenuMetaDataTool, and xAODMaker::TruthMetaDataTool.

Definition at line 209 of file AsgMetadataTool.cxx.

209 {
210
211 // Return gracefully:
212 return StatusCode::SUCCESS;
213 }

◆ msg()

MsgStream & AthCommonMsg< AlgTool >::msg ( ) const
inlineinherited

Definition at line 24 of file AthCommonMsg.h.

24 {
25 return this->msgStream();
26 }

◆ msg_level_name()

const std::string & asg::AsgTool::msg_level_name ( ) const
inherited

A deprecated function for getting the message level's name.

Instead of using this, weirdly named function, user code should get the string name of the current minimum message level (in case they really need it...), with:

MSG::name( msg().level() )

This function's name doesn't follow the ATLAS coding rules, and as such will be removed in the not too distant future.

Returns
The string name of the current minimum message level that's printed

Definition at line 101 of file AsgTool.cxx.

101 {
102
103 return MSG::name( msg().level() );
104 }
MsgStream & msg() const
const std::string & name(Level lvl)
Convenience function for translating message levels to strings.
Definition MsgLevel.cxx:19

◆ msgLvl()

bool AthCommonMsg< AlgTool >::msgLvl ( const MSG::Level lvl) const
inlineinherited

Definition at line 30 of file AthCommonMsg.h.

30 {
31 return this->msgLevel(lvl);
32 }

◆ oldtool_resolution_flag_this_event()

egEnergyCorr::Resolution::Variation CP::EgammaCalibrationAndSmearingTool::oldtool_resolution_flag_this_event ( columnar::EgammaId p,
columnar::EventInfoId event_info ) const
inlineprivate

Definition at line 1293 of file EgammaCalibrationAndSmearingTool.cxx.

1294 {
1295 const Accessors& acc = *m_accessors;
1296 return acc.eventTypeAcc (event_info, xAOD::EventInfo::IS_SIMULATION)
1299}

◆ oldtool_scale_flag_this_event()

egEnergyCorr::Scale::Variation CP::EgammaCalibrationAndSmearingTool::oldtool_scale_flag_this_event ( columnar::EgammaId p,
columnar::EventInfoId event_info ) const
inlineprivate

Definition at line 1281 of file EgammaCalibrationAndSmearingTool.cxx.

1282 {
1283 const Accessors& acc = *m_accessors;
1284 if (!acc.eventTypeAcc (event_info, xAOD::EventInfo::IS_SIMULATION))
1286 if (m_currentScalePredicate(*this,p))
1288 else
1290}

◆ outputHandles()

virtual std::vector< Gaudi::DataHandle * > AthCommonDataStore< AthCommonMsg< AlgTool > >::outputHandles ( ) const
overridevirtualinherited

Return this algorithm's output handles.

We override this to include handle instances from key arrays if they have not yet been declared. See comments on updateVHKA.

◆ outputMetaStore()

AsgMetadataTool::MetaStorePtr_t asg::AsgMetadataTool::outputMetaStore ( ) const
inherited

Accessor for the output metadata store.

Definition at line 102 of file AsgMetadataTool.cxx.

102 {
103
104#ifdef XAOD_STANDALONE
105 return &m_outputMetaStore;
106#else // XAOD_STANDALONE
107 return m_outputMetaStore;
108#endif // XAOD_STANDALONE
109 }
MetaStore_t m_outputMetaStore
Object accessing the output metadata store.

◆ print() [1/2]

◆ print() [2/2]

◆ recommendedSystematics()

CP::SystematicSet CP::EgammaCalibrationAndSmearingTool::recommendedSystematics ( ) const
overrideprivatevirtual

the list of all systematics this tool recommends to use

Implements CP::IReentrantSystematicsTool.

Definition at line 2171 of file EgammaCalibrationAndSmearingTool.cxx.

2172 {
2173 return affectingSystematics();
2174}

◆ renounce()

std::enable_if_t< std::is_void_v< std::result_of_t< decltype(&T::renounce)(T)> > &&!std::is_base_of_v< SG::VarHandleKeyArray, T > &&std::is_base_of_v< Gaudi::DataHandle, T >, void > AthCommonDataStore< AthCommonMsg< AlgTool > >::renounce ( T & h)
inlineprotectedinherited

Definition at line 380 of file AthCommonDataStore.h.

381 {
382 h.renounce();
384 }
std::enable_if_t< std::is_void_v< std::result_of_t< decltype(&T::renounce)(T)> > &&!std::is_base_of_v< SG::VarHandleKeyArray, T > &&std::is_base_of_v< Gaudi::DataHandle, T >, void > renounce(T &h)

◆ renounceArray()

void AthCommonDataStore< AthCommonMsg< AlgTool > >::renounceArray ( SG::VarHandleKeyArray & handlesArray)
inlineprotectedinherited

remove all handles from I/O resolution

Definition at line 364 of file AthCommonDataStore.h.

364 {
366 }

◆ resolution()

double CP::EgammaCalibrationAndSmearingTool::resolution ( double energy,
double cl_eta,
double cl_etaCalo,
PATCore::ParticleType::Type ptype = PATCore::ParticleType::Electron,
bool withCT = false ) const
overrideprivatevirtual

Implements CP::IEgammaCalibrationAndSmearingTool.

Definition at line 947 of file EgammaCalibrationAndSmearingTool.cxx.

949 {
950 return m_rootTool->resolution(energy, cl_eta, cl_etaCalo, ptype, withCT,
951 false);
952}

◆ setPt()

void CP::EgammaCalibrationAndSmearingTool::setPt ( columnar::MutableEgammaId input,
double energy ) const
private

Definition at line 1263 of file EgammaCalibrationAndSmearingTool.cxx.

1263 {
1264 const double new_energy2 = energy * energy;
1265 const auto ptype = xAOD2ptype(input);
1267 const double m2 = m * m;
1268 const double p2 = new_energy2 > m2 ? new_energy2 - m2 : 0.;
1269 m_accessors->ptOutDec (input) = sqrt(p2) / cosh(m_accessors->etaAcc (input));
1270 ATH_MSG_DEBUG("after setting pt, energy = " << m_accessors->momAcc.e (input));
1271}
constexpr double electronMassInMeV
the mass of the electron (in MeV)
constexpr double photonMassInMeV
various mass-less particles

◆ setRandomSeedFunction()

virtual void CP::EgammaCalibrationAndSmearingTool::setRandomSeedFunction ( const IdFunction && function)
inlineprivatevirtual

Definition at line 238 of file EgammaCalibrationAndSmearingTool.h.

238 {
239 m_set_seed_function = function;
240 }

◆ setupSystematics()

void CP::EgammaCalibrationAndSmearingTool::setupSystematics ( )
private

Definition at line 1338 of file EgammaCalibrationAndSmearingTool.cxx.

1338 {
1339 const EgammaPredicate always = [](const EgammaCalibrationAndSmearingTool&, columnar::EgammaId) { return true; };
1340
1341 // Try to simplify a bit for the ones that are fully correlate in eta,
1342 // whatever the model and that are not included in the macros including
1343 // - ADC non linearity
1344 // - L2Gain
1345 // - Leakage
1346 // - Conversion related
1347 // - TopoCluster threshold
1348 // - AF2
1349 // - PS_BARREL_B12
1350 // - S12EXTRALASTETABINRUN2
1351 // - ZEESTAT
1352 // - Run3 pre OFC + EXTRA
1353 if (m_decorrelation_model_scale == ScaleDecorrelation::FULL_ETA_CORRELATED ||
1354 m_decorrelation_model_scale == ScaleDecorrelation::FULL) {
1355 // Electron leakage, ADCLin, convReco only in final run2 recommendations
1359 // systematic related to ADC non linearity correction. Before 2022, there
1360 // was not correction, nor related systematic
1362 m_syst_description[CP::SystematicVariation("EG_SCALE_ADCLIN", +1)] =
1364 m_syst_description[CP::SystematicVariation("EG_SCALE_ADCLIN", -1)] =
1366 }
1367 // Gain splitted uncertainty
1368 m_syst_description[CP::SystematicVariation("EG_SCALE_L2MEDIUMGAIN", +1)] =
1370 m_syst_description[CP::SystematicVariation("EG_SCALE_L2MEDIUMGAIN", -1)] =
1372 m_syst_description[CP::SystematicVariation("EG_SCALE_L2LOWGAIN", +1)] =
1374 m_syst_description[CP::SystematicVariation("EG_SCALE_L2LOWGAIN", -1)] =
1376
1377 // Electron leakage
1378 m_syst_description[CP::SystematicVariation("EG_SCALE_LEAKAGEELEC", +1)] =
1380 m_syst_description[CP::SystematicVariation("EG_SCALE_LEAKAGEELEC", -1)] =
1382
1383 // Conversion related
1384 m_syst_description[CP::SystematicVariation("PH_SCALE_CONVRECO", +1)] =
1386 m_syst_description[CP::SystematicVariation("PH_SCALE_CONVRECO", -1)] =
1388 }
1389 // The equivalent of convReco (convefficiency and convfakerate) for other
1390 // models
1391 else {
1392 m_syst_description[CP::SystematicVariation("PH_SCALE_CONVEFFICIENCY",
1393 +1)] =
1395 m_syst_description[CP::SystematicVariation("PH_SCALE_CONVEFFICIENCY",
1396 -1)] =
1398 m_syst_description[CP::SystematicVariation("PH_SCALE_CONVFAKERATE", +1)] =
1400 m_syst_description[CP::SystematicVariation("PH_SCALE_CONVFAKERATE", -1)] =
1402 }
1403
1404 // additional systematics for R22 OFC and MC21 pre and bulk
1406 m_syst_description[CP::SystematicVariation("EG_SCALE_OFC", +1)] =
1408 m_syst_description[CP::SystematicVariation("EG_SCALE_OFC", -1)] =
1410
1411 m_syst_description[CP::SystematicVariation("EG_SCALE_EXTRARUN3PRE", +1)] =
1413 m_syst_description[CP::SystematicVariation("EG_SCALE_EXTRARUN3PRE", -1)] =
1415 }
1416
1427
1428 // topo clustr threshold systematics aded to release 21 recommendations
1429 m_syst_description[CP::SystematicVariation("EG_SCALE_TOPOCLUSTER_THRES",
1430 +1)] =
1432 m_syst_description[CP::SystematicVariation("EG_SCALE_TOPOCLUSTER_THRES",
1433 -1)] =
1435
1436 // AF3 for run3 models: es2022_R22_PRE and esmodel >= es2023_R22_Run2_v1
1437 // although we prevent AF for es2022_R22_PRE and es2024_Run3_ofc0_v0
1438 // AF3 are still technically added in the tool
1439 // but normally uncertainty will be 0
1441 m_syst_description[CP::SystematicVariation("EG_SCALE_AF3", +1)] =
1443 m_syst_description[CP::SystematicVariation("EG_SCALE_AF3", -1)] =
1445 }
1446 else {
1447 // and extra AF2 systematics for release 21 recommendations - Moriond 2018
1448 // - pending proper AF2 to FullSim correction with release 21
1449 m_syst_description[CP::SystematicVariation("EG_SCALE_AF2", +1)] =
1451 m_syst_description[CP::SystematicVariation("EG_SCALE_AF2", -1)] =
1453 }
1454 }
1455
1456 // PS correlated barrel uncertainty
1465 m_syst_description[CP::SystematicVariation("EG_SCALE_PS_BARREL_B12",
1466 +1)] =
1468 m_syst_description[CP::SystematicVariation("EG_SCALE_PS_BARREL_B12",
1469 -1)] =
1471 }
1472
1473 // additional systematic for S12 last eta bin run2
1478 m_syst_description[CP::SystematicVariation(
1479 "EG_SCALE_S12EXTRALASTETABINRUN2", +1)] =
1481 m_syst_description[CP::SystematicVariation(
1482 "EG_SCALE_S12EXTRALASTETABINRUN2", -1)] =
1484 }
1485
1486 // Zee stat, if for FULL we do not ask for m_use_full_statistical_error
1488 ScaleDecorrelation::FULL_ETA_CORRELATED or
1490 // return 1 variation only, fully correlated in eta, equal to the correct
1491 // value but scaled by sqrt(number of bins) the scaling is done by the old
1492 // tool
1493 m_syst_description[CP::SystematicVariation("EG_SCALE_ZEESTAT", +1)] =
1495 m_syst_description[CP::SystematicVariation("EG_SCALE_ZEESTAT", -1)] =
1497 }
1498 }
1499 if (m_decorrelation_model_scale == ScaleDecorrelation::ONENP) {
1500 // TODO: independet implementation of ALL UP looping on all the variations
1501 m_syst_description[CP::SystematicVariation("EG_SCALE_ALL", +1)] =
1503 m_syst_description[CP::SystematicVariation("EG_SCALE_ALL", -1)] =
1505
1506 // to be consistent with other schemes, we add
1507 // extra AF systematics in addition to the 1NP
1514 m_syst_description[CP::SystematicVariation("EG_SCALE_AF2", +1)] =
1516 m_syst_description[CP::SystematicVariation("EG_SCALE_AF2", -1)] =
1518 }
1520 m_syst_description[CP::SystematicVariation("EG_SCALE_AF3", +1)] =
1522 m_syst_description[CP::SystematicVariation("EG_SCALE_AF3", -1)] =
1524 }
1525 }
1526 else if (m_decorrelation_model_scale ==
1527 ScaleDecorrelation::FULL_ETA_CORRELATED) {
1528// all the physical effects separately, considered as fully correlated in eta
1530#define SYSMACRO(name, fullcorrelated, decorrelation, flagup, flagdown) \
1531 m_syst_description[CP::SystematicVariation(#name, +1)] = \
1532 SysInfo{always, flagup}; \
1533 m_syst_description[CP::SystematicVariation(#name, -1)] = \
1534 SysInfo{always, flagdown};
1535#include "ElectronPhotonFourMomentumCorrection/systematics_es2024_Run3_v0.def"
1536#undef SYSMACRO
1537 }
1538 else {
1539// common systematics for all the esmodels
1540#define SYSMACRO(name, fullcorrelated, decorrelation, flagup, flagdown) \
1541 m_syst_description[CP::SystematicVariation(#name, +1)] = \
1542 SysInfo{always, flagup}; \
1543 m_syst_description[CP::SystematicVariation(#name, -1)] = \
1544 SysInfo{always, flagdown};
1545#include "ElectronPhotonFourMomentumCorrection/systematics_S12_2022.def"
1546#undef SYSMACRO
1547 }
1548
1552 m_syst_description[CP::SystematicVariation("EG_SCALE_LARCALIB", +1)] =
1554 m_syst_description[CP::SystematicVariation("EG_SCALE_LARCALIB", -1)] =
1556 m_syst_description[CP::SystematicVariation("EG_SCALE_L2GAIN", +1)] =
1558 m_syst_description[CP::SystematicVariation("EG_SCALE_L2GAIN", -1)] =
1560 }
1561
1562 // additional systematics for S12 run2
1572 m_syst_description[CP::SystematicVariation(
1573 "EG_SCALE_LARCALIB_EXTRA2015PRE", +1)] =
1575 m_syst_description[CP::SystematicVariation(
1576 "EG_SCALE_LARCALIB_EXTRA2015PRE", -1)] =
1578 }
1579
1580 // additional systematics for temperature run1->run2
1586 m_syst_description[CP::SystematicVariation(
1587 "EG_SCALE_LARTEMPERATURE_EXTRA2015PRE", +1)] =
1589 m_syst_description[CP::SystematicVariation(
1590 "EG_SCALE_LARTEMPERATURE_EXTRA2015PRE", -1)] =
1592 }
1593
1594 // additional systematic for temperature 2015->2016
1596 m_syst_description[CP::SystematicVariation(
1597 "EG_SCALE_LARTEMPERATURE_EXTRA2016PRE", +1)] =
1599 m_syst_description[CP::SystematicVariation(
1600 "EG_SCALE_LARTEMPERATURE_EXTRA2016PRE", -1)] =
1602 }
1603
1604 // additional systematic for PP0 region
1620 m_syst_description[CP::SystematicVariation("EG_SCALE_MATPP0", +1)] =
1622 m_syst_description[CP::SystematicVariation("EG_SCALE_MATPP0", -1)] =
1624 }
1625
1626 // systematic related to wtots1
1642 m_syst_description[CP::SystematicVariation("EG_SCALE_WTOTS1", +1)] =
1644 m_syst_description[CP::SystematicVariation("EG_SCALE_WTOTS1", -1)] =
1646 }
1647
1648 // systematic for the scintillators
1667 // scintillator systematics
1668 m_syst_description[CP::SystematicVariation("EG_SCALE_E4SCINTILLATOR",
1669 +1)] =
1671 m_syst_description[CP::SystematicVariation("EG_SCALE_E4SCINTILLATOR",
1672 -1)] =
1674 }
1675
1676 } else if (m_decorrelation_model_scale ==
1677 ScaleDecorrelation::ONENP_PLUS_UNCONR) {
1678// qsum of all variations correlated 8/13 TeV + uncorrelated (additional
1679// systematics for 2015PRE or 2016) all the physical effects separately,
1680// considered as fully correlated in eta
1681// TODO: fix for es2017
1682#define SYSMACRO(name, fullcorrelated, decorrelation, flagup, flagdown) \
1683 m_syst_description[CP::SystematicVariation(#name, +1)] = \
1684 SysInfo{always, flagup}; \
1685 m_syst_description[CP::SystematicVariation(#name, -1)] = \
1686 SysInfo{always, flagdown};
1687#include "ElectronPhotonFourMomentumCorrection/systematics_1NPCOR_PLUS_UNCOR.def"
1688#undef SYSMACRO
1689
1690 // additional systematic for S12 last eta bin run2 - not needed anymore for
1691 // last 20.7 model since it is part of bin per bin E1/E2 uncertainty in root
1692 // file
1696 m_syst_description[CP::SystematicVariation(
1697 "EG_SCALE_S12EXTRALASTETABINRUN2", +1)] =
1699 m_syst_description[CP::SystematicVariation(
1700 "EG_SCALE_S12EXTRALASTETABINRUN2", -1)] =
1702 }
1703
1704 } else if (m_decorrelation_model_scale == ScaleDecorrelation::FULL) {
1705 using pairvector = std::vector<std::pair<double, double>>;
1706 const pairvector decorrelation_bins_BE = {{0., 1.45}, {1.52, 2.5}};
1707 const std::vector<double> decorrelation_edges_TWELVE = {
1708 0., 0.2, 0.4, 0.6, 0.8, 1.0, 1.2, 1.4, 1.6, 1.8, 2.0, 2.2, 2.4};
1709 std::vector<double> decorrelation_edges_MODULE = {
1710 0., 0.2, 0.4, 0.6, 0.8, 1.0, 1.2, 1.37, 1.52, 1.8};
1711 const std::vector<double> decorrelation_edges_MATERIAL = {0.0, 1.1, 1.5,
1712 2.1, 2.5};
1713 std::vector<double> decorrelation_edges_S12_EXTRARUN3 = {
1714 0., 0.8, 1.5, 2.5};
1715
1716 std::vector<double> decorrelation_edges_S12;
1717 // for es2018_R21_v1 : 4 eta bins for muon E1/E2 uncertainty correlation
1719 decorrelation_edges_S12.resize(5);
1720 decorrelation_edges_S12 = {0., 1.35, 1.5, 2.4, 2.5};
1724 decorrelation_edges_S12.resize(8);
1725 decorrelation_edges_S12 = {0., 0.6, 1.0, 1.35, 1.5, 1.8, 2.4, 2.5};
1726 //
1727 // PS scale from muons, so "crack" is a bit different
1728 decorrelation_edges_MODULE[7] = 1.4;
1729 decorrelation_edges_MODULE[8] = 1.5;
1730 }
1731 // for previous run 2 muon calibration with 20.7, 5 eta bins for E1/E2
1732 // uncertainty correlation
1733 else {
1734 decorrelation_edges_S12.resize(6);
1735 decorrelation_edges_S12 = {0., 0.6, 1.4, 1.5, 2.4, 2.5};
1736 }
1737
1749#define SYSMACRO(name, fullcorrelated, decorrelation, flagup, flagdown) \
1750 if (bool(fullcorrelated)) { \
1751 m_syst_description[CP::SystematicVariation(#name, +1)] = \
1752 SysInfo{always, flagup}; \
1753 m_syst_description[CP::SystematicVariation(#name, -1)] = \
1754 SysInfo{always, flagdown}; \
1755 } else { \
1756 int i = 0; \
1757 for (const auto& p : AbsEtaCaloPredicatesFactory(decorrelation)) { \
1758 m_syst_description[CP::SystematicVariation( \
1759 #name "__ETABIN" + std::to_string(i), +1)] = SysInfo{p, flagup}; \
1760 m_syst_description[CP::SystematicVariation( \
1761 #name "__ETABIN" + std::to_string(i), -1)] = SysInfo{p, flagdown}; \
1762 i += 1; \
1763 } \
1764 }
1765#include "ElectronPhotonFourMomentumCorrection/systematics.def"
1766#undef SYSMACRO
1769#define SYSMACRO(name, fullcorrelated, decorrelation, flagup, flagdown) \
1770 if (bool(fullcorrelated)) { \
1771 m_syst_description[CP::SystematicVariation(#name, +1)] = \
1772 SysInfo{always, flagup}; \
1773 m_syst_description[CP::SystematicVariation(#name, -1)] = \
1774 SysInfo{always, flagdown}; \
1775 } else { \
1776 int i = 0; \
1777 for (const auto& p : AbsEtaCaloPredicatesFactory(decorrelation)) { \
1778 m_syst_description[CP::SystematicVariation( \
1779 #name "__ETABIN" + std::to_string(i), +1)] = SysInfo{p, flagup}; \
1780 m_syst_description[CP::SystematicVariation( \
1781 #name "__ETABIN" + std::to_string(i), -1)] = SysInfo{p, flagdown}; \
1782 i += 1; \
1783 } \
1784 }
1785#include "ElectronPhotonFourMomentumCorrection/systematics_S12_2022.def"
1786#undef SYSMACRO
1788#define SYSMACRO(name, fullcorrelated, decorrelation, flagup, flagdown) \
1789 if (bool(fullcorrelated)) { \
1790 m_syst_description[CP::SystematicVariation(#name, +1)] = \
1791 SysInfo{always, flagup}; \
1792 m_syst_description[CP::SystematicVariation(#name, -1)] = \
1793 SysInfo{always, flagdown}; \
1794 } else { \
1795 int i = 0; \
1796 for (const auto& p : AbsEtaCaloPredicatesFactory(decorrelation)) { \
1797 m_syst_description[CP::SystematicVariation( \
1798 #name "__ETABIN" + std::to_string(i), +1)] = SysInfo{p, flagup}; \
1799 m_syst_description[CP::SystematicVariation( \
1800 #name "__ETABIN" + std::to_string(i), -1)] = SysInfo{p, flagdown}; \
1801 i += 1; \
1802 } \
1803 }
1804#include "ElectronPhotonFourMomentumCorrection/systematics_es2024_Run3_v0.def"
1805#undef SYSMACRO
1806 } else {
1807#define SYSMACRO(name, fullcorrelated, decorrelation, flagup, flagdown) \
1808 if (bool(fullcorrelated)) { \
1809 m_syst_description[CP::SystematicVariation(#name, +1)] = \
1810 SysInfo{always, flagup}; \
1811 m_syst_description[CP::SystematicVariation(#name, -1)] = \
1812 SysInfo{always, flagdown}; \
1813 } else { \
1814 int i = 0; \
1815 for (const auto& p : AbsEtaCaloPredicatesFactory(decorrelation)) { \
1816 m_syst_description[CP::SystematicVariation( \
1817 #name "__ETABIN" + std::to_string(i), +1)] = SysInfo{p, flagup}; \
1818 m_syst_description[CP::SystematicVariation( \
1819 #name "__ETABIN" + std::to_string(i), -1)] = SysInfo{p, flagdown}; \
1820 i += 1; \
1821 } \
1822 }
1823#include "ElectronPhotonFourMomentumCorrection/systematics_S12.def"
1824#undef SYSMACRO
1825 } // else
1826
1828 // statistical error, decorrelate in *all* the bins
1829 int i = 0;
1830 const TAxis& axis_statistical_error(m_rootTool->get_ZeeStat_eta_axis());
1831 for (int ibin = 1; ibin <= axis_statistical_error.GetNbins(); ++ibin) {
1833 axis_statistical_error.GetBinLowEdge(ibin),
1834 axis_statistical_error.GetBinLowEdge(ibin + 1));
1835 m_syst_description[CP::SystematicVariation(
1836 "EG_SCALE_ZEESTAT__ETABIN" + std::to_string(i), +1)] =
1838 m_syst_description[CP::SystematicVariation(
1839 "EG_SCALE_ZEESTAT__ETABIN" + std::to_string(i), -1)] =
1841 ++i;
1842 }
1843 }
1844
1845 // additional systematics for S12 run2
1855 m_syst_description[CP::SystematicVariation(
1856 "EG_SCALE_LARCALIB_EXTRA2015PRE__ETABIN0", +1)] =
1859 m_syst_description[CP::SystematicVariation(
1860 "EG_SCALE_LARCALIB_EXTRA2015PRE__ETABIN0", -1)] =
1863 m_syst_description[CP::SystematicVariation(
1864 "EG_SCALE_LARCALIB_EXTRA2015PRE__ETABIN1", +1)] =
1865 SysInfo{AbsEtaCaloPredicateFactory({1.45, 2.47}),
1867 m_syst_description[CP::SystematicVariation(
1868 "EG_SCALE_LARCALIB_EXTRA2015PRE__ETABIN1", -1)] =
1869 SysInfo{AbsEtaCaloPredicateFactory({1.45, 2.47}),
1871 m_syst_description[CP::SystematicVariation(
1872 "EG_SCALE_LARCALIB_EXTRA2015PRE__ETABIN2", +1)] =
1875 m_syst_description[CP::SystematicVariation(
1876 "EG_SCALE_LARCALIB_EXTRA2015PRE__ETABIN2", -1)] =
1879 }
1880
1881 // additional systematics for temperature run1->run2
1887 m_syst_description[CP::SystematicVariation(
1888 "EG_SCALE_LARTEMPERATURE_EXTRA2015PRE__ETABIN0", +1)] =
1889 SysInfo{AbsEtaCaloPredicateFactory(decorrelation_bins_BE[0]),
1891 m_syst_description[CP::SystematicVariation(
1892 "EG_SCALE_LARTEMPERATURE_EXTRA2015PRE__ETABIN0", -1)] =
1893 SysInfo{AbsEtaCaloPredicateFactory(decorrelation_bins_BE[0]),
1895 m_syst_description[CP::SystematicVariation(
1896 "EG_SCALE_LARTEMPERATURE_EXTRA2015PRE__ETABIN1", +1)] =
1897 SysInfo{AbsEtaCaloPredicateFactory(decorrelation_bins_BE[1]),
1899 m_syst_description[CP::SystematicVariation(
1900 "EG_SCALE_LARTEMPERATURE_EXTRA2015PRE__ETABIN1", -1)] =
1901 SysInfo{AbsEtaCaloPredicateFactory(decorrelation_bins_BE[1]),
1903 }
1904
1905 // additional systematic for temperature 2015->2016
1907 m_syst_description[CP::SystematicVariation(
1908 "EG_SCALE_LARTEMPERATURE_EXTRA2016PRE__ETABIN0", +1)] =
1909 SysInfo{AbsEtaCaloPredicateFactory(decorrelation_bins_BE[0]),
1911 m_syst_description[CP::SystematicVariation(
1912 "EG_SCALE_LARTEMPERATURE_EXTRA2016PRE__ETABIN1", +1)] =
1913 SysInfo{AbsEtaCaloPredicateFactory(decorrelation_bins_BE[1]),
1915 m_syst_description[CP::SystematicVariation(
1916 "EG_SCALE_LARTEMPERATURE_EXTRA2016PRE__ETABIN0", -1)] =
1917 SysInfo{AbsEtaCaloPredicateFactory(decorrelation_bins_BE[0]),
1919 m_syst_description[CP::SystematicVariation(
1920 "EG_SCALE_LARTEMPERATURE_EXTRA2016PRE__ETABIN1", -1)] =
1921 SysInfo{AbsEtaCaloPredicateFactory(decorrelation_bins_BE[1]),
1923 }
1924
1925 // additional systematic for PP0 region
1941 m_syst_description[CP::SystematicVariation("EG_SCALE_MATPP0__ETABIN0",
1942 +1)] = SysInfo{
1944 m_syst_description[CP::SystematicVariation("EG_SCALE_MATPP0__ETABIN1",
1945 +1)] = SysInfo{
1947 m_syst_description[CP::SystematicVariation("EG_SCALE_MATPP0__ETABIN0",
1948 -1)] = SysInfo{
1950 m_syst_description[CP::SystematicVariation("EG_SCALE_MATPP0__ETABIN1",
1951 -1)] =
1954 }
1955
1956 // systematic related to wtots1
1969 m_syst_description[CP::SystematicVariation("EG_SCALE_WTOTS1", +1)] =
1971 m_syst_description[CP::SystematicVariation("EG_SCALE_WTOTS1", -1)] =
1973 }
1974
1975 // systematic related to wtots1, decorrelate eta bin [1.52,1.82] from rest
1979 m_syst_description[CP::SystematicVariation("EG_SCALE_WTOTS1__ETABIN0",
1980 +1)] =
1981 SysInfo{DoubleOrAbsEtaCaloPredicate(0, 1.52, 1.82, 2.47),
1983 m_syst_description[CP::SystematicVariation("EG_SCALE_WTOTS1__ETABIN0",
1984 -1)] =
1985 SysInfo{DoubleOrAbsEtaCaloPredicate(0, 1.52, 1.82, 2.47),
1987 m_syst_description[CP::SystematicVariation("EG_SCALE_WTOTS1__ETABIN1",
1988 +1)] =
1989 SysInfo{AbsEtaCaloPredicateFactory({1.52, 1.82}),
1991 m_syst_description[CP::SystematicVariation("EG_SCALE_WTOTS1__ETABIN1",
1992 -1)] =
1993 SysInfo{AbsEtaCaloPredicateFactory({1.52, 1.82}),
1995 }
1996
1997 // systematic for the scintillators
2016 m_syst_description[CP::SystematicVariation(
2017 "EG_SCALE_E4SCINTILLATOR__ETABIN0", +1)] =
2020 m_syst_description[CP::SystematicVariation(
2021 "EG_SCALE_E4SCINTILLATOR__ETABIN1", +1)] =
2024 m_syst_description[CP::SystematicVariation(
2025 "EG_SCALE_E4SCINTILLATOR__ETABIN2", +1)] =
2028 m_syst_description[CP::SystematicVariation(
2029 "EG_SCALE_E4SCINTILLATOR__ETABIN0", -1)] =
2032 m_syst_description[CP::SystematicVariation(
2033 "EG_SCALE_E4SCINTILLATOR__ETABIN1", -1)] =
2036 m_syst_description[CP::SystematicVariation(
2037 "EG_SCALE_E4SCINTILLATOR__ETABIN2", -1)] =
2040 if (m_TESModel == egEnergyCorr::es2024_Run3_v0) { // extended E4 in Run 3
2041 m_syst_description[CP::SystematicVariation(
2042 "EG_SCALE_E4SCINTILLATOR__ETABIN3", +1)] =
2045 m_syst_description[CP::SystematicVariation(
2046 "EG_SCALE_E4SCINTILLATOR__ETABIN3", -1)] =
2049 }
2050 }
2051 } else {
2052 ATH_MSG_FATAL("scale decorrelation model invalid");
2053 }
2054
2055 // resolution systematics
2057 // ALL will not include AF2/AF3 systematic
2058 // individual AF NP is always provided
2059 // linghua.guo@cern.ch 2025-04-23
2060 m_syst_description_resolution[CP::SystematicVariation(
2061 "EG_RESOLUTION_ALL", +1)] = egEnergyCorr::Resolution::AllUp;
2062 m_syst_description_resolution[CP::SystematicVariation(
2063 "EG_RESOLUTION_ALL", -1)] = egEnergyCorr::Resolution::AllDown;
2066 m_syst_description_resolution[CP::SystematicVariation(
2067 "EG_RESOLUTION_ZSMEARING", +1)] = egEnergyCorr::Resolution::ZSmearingUp;
2068 m_syst_description_resolution[CP::SystematicVariation(
2069 "EG_RESOLUTION_ZSMEARING", -1)] =
2071 m_syst_description_resolution[CP::SystematicVariation(
2072 "EG_RESOLUTION_SAMPLINGTERM", +1)] =
2074 m_syst_description_resolution[CP::SystematicVariation(
2075 "EG_RESOLUTION_SAMPLINGTERM", -1)] =
2077 m_syst_description_resolution[CP::SystematicVariation(
2078 "EG_RESOLUTION_MATERIALID", +1)] =
2080 m_syst_description_resolution[CP::SystematicVariation(
2081 "EG_RESOLUTION_MATERIALID", -1)] =
2083 m_syst_description_resolution[CP::SystematicVariation(
2084 "EG_RESOLUTION_MATERIALCALO", +1)] =
2086 m_syst_description_resolution[CP::SystematicVariation(
2087 "EG_RESOLUTION_MATERIALCALO", -1)] =
2089 m_syst_description_resolution[CP::SystematicVariation(
2090 "EG_RESOLUTION_MATERIALGAP", +1)] =
2092 m_syst_description_resolution[CP::SystematicVariation(
2093 "EG_RESOLUTION_MATERIALGAP", -1)] =
2095 m_syst_description_resolution[CP::SystematicVariation(
2096 "EG_RESOLUTION_MATERIALCRYO", +1)] =
2098 m_syst_description_resolution[CP::SystematicVariation(
2099 "EG_RESOLUTION_MATERIALCRYO", -1)] =
2101 m_syst_description_resolution[CP::SystematicVariation(
2102 "EG_RESOLUTION_PILEUP", +1)] = egEnergyCorr::Resolution::PileUpUp;
2103 m_syst_description_resolution[CP::SystematicVariation(
2104 "EG_RESOLUTION_PILEUP", -1)] = egEnergyCorr::Resolution::PileUpDown;
2120 m_syst_description_resolution[CP::SystematicVariation(
2121 "EG_RESOLUTION_MATERIALIBL", +1)] =
2123 m_syst_description_resolution[CP::SystematicVariation(
2124 "EG_RESOLUTION_MATERIALIBL", -1)] =
2126 m_syst_description_resolution[CP::SystematicVariation(
2127 "EG_RESOLUTION_MATERIALPP0", +1)] =
2129 m_syst_description_resolution[CP::SystematicVariation(
2130 "EG_RESOLUTION_MATERIALPP0", -1)] =
2132
2133 if (m_TESModel == egEnergyCorr::es2022_R22_PRE) { // exta sys. for Run-3
2134 // pre-recommendations
2135 m_syst_description_resolution[CP::SystematicVariation(
2136 "EG_RESOLUTION_OFC", +1)] = egEnergyCorr::Resolution::OFCUp;
2137 m_syst_description_resolution[CP::SystematicVariation(
2138 "EG_RESOLUTION_OFC", -1)] = egEnergyCorr::Resolution::OFCDown;
2139 }
2140 }
2141 } else {
2142 ATH_MSG_FATAL("resolution decorrelation model invalid");
2143 }
2144
2145 // Always use individual AF2/AF3 systematics for resolution
2150 m_syst_description_resolution[CP::SystematicVariation(
2151 "EG_RESOLUTION_AF2", +1)] = egEnergyCorr::Resolution::afUp;
2152 m_syst_description_resolution[CP::SystematicVariation(
2153 "EG_RESOLUTION_AF2", -1)] = egEnergyCorr::Resolution::afDown;
2154 }
2156 m_syst_description_resolution[CP::SystematicVariation(
2157 "EG_RESOLUTION_AF3", +1)] = egEnergyCorr::Resolution::afUp;
2158 m_syst_description_resolution[CP::SystematicVariation(
2159 "EG_RESOLUTION_AF3", -1)] = egEnergyCorr::Resolution::afDown;
2160 }
2161
2162 // ep combination systematics
2164 m_syst_description[CP::SystematicVariation("EL_SCALE_MOMENTUM", +1)] =
2166 m_syst_description[CP::SystematicVariation("EL_SCALE_MOMENTUM", -1)] =
2168 }
2169}
const EgammaPredicate EtaCaloPredicateFactory(double eta_min, double eta_max) const
std::function< bool(const EgammaCalibrationAndSmearingTool &, columnar::EgammaId)> EgammaPredicate

◆ setUseIncidents()

void asg::AsgMetadataTool::setUseIncidents ( const bool flag)
inlineprotectedinherited

Definition at line 132 of file AsgMetadataTool.h.

133 {
135 }
bool flag
Definition master.py:29

◆ sysInitialize()

StatusCode asg::AsgMetadataTool::sysInitialize ( )
virtualinherited

Function initialising the tool in the correct way in Athena.

This function is used to set up the callbacks from IncidentSvc in Athena at the right time during initialisation, without the user having to do anything special in his/her code.

Reimplemented from AthCommonDataStore< AthCommonMsg< AlgTool > >.

Definition at line 115 of file AsgMetadataTool.cxx.

115 {
116
117#ifndef XAOD_STANDALONE
118 if (m_useIncidents) {
119 // Connect to the IncidentSvc:
120 ServiceHandle< IIncidentSvc > incSvc( "IncidentSvc", name() );
121 ATH_CHECK( incSvc.retrieve() );
122
123 // Set up the right callbacks: don't rethrow exceptions, any failure and we should end
124 incSvc->addListener( this, IncidentType::BeginEvent, 0, false );
125 }
126 // Let the base class do its thing:
127 ATH_CHECK( AlgTool::sysInitialize() );
128
129#endif // not XAOD_STANDALONE
130
131 // Return gracefully:
132 return StatusCode::SUCCESS;
133 }

◆ sysStart()

virtual StatusCode AthCommonDataStore< AthCommonMsg< AlgTool > >::sysStart ( )
overridevirtualinherited

Handle START transition.

We override this in order to make sure that conditions handle keys can cache a pointer to the conditions container.

◆ updateVHKA()

void AthCommonDataStore< AthCommonMsg< AlgTool > >::updateVHKA ( Gaudi::Details::PropertyBase & )
inlineinherited

Definition at line 308 of file AthCommonDataStore.h.

308 {
309 // debug() << "updateVHKA for property " << p.name() << " " << p.toString()
310 // << " size: " << m_vhka.size() << endmsg;
311 for (auto &a : m_vhka) {
313 for (auto k : keys) {
314 k->setOwner(this);
315 }
316 }
317 }
std::vector< SG::VarHandleKeyArray * > m_vhka

◆ xAOD2ptype()

PATCore::ParticleType::Type CP::EgammaCalibrationAndSmearingTool::xAOD2ptype ( columnar::EgammaId particle) const
private

Definition at line 896 of file EgammaCalibrationAndSmearingTool.cxx.

897{
898 const Accessors& acc = *m_accessors;
899
900 // this is departing from the logic below, as we are now requiring the
901 // user to specify at configuration time whether we run on electrons
902 // or photons. this is necessary to configure the columns we need
903 // correctly.
904 if (m_onlyElectrons.value())
905 {
907 }
908 if (m_onlyPhotons.value())
909 {
910 if (acc.photonVertexAcc(particle).size() > 0)
911 {
913 }
914 else
915 {
917 }
918 }
919
920 // this is the old logic and should not be visited in columnar mode
921 // (disabled by turning on onlyElectrons or onlyPhotons)
923 //no ForwardElectron ptype: consider them as Electron
925 else if (xAOD::EgammaHelpers::isPhoton(&particle.getXAODObject())) {
928 }
929 else {
930 ATH_MSG_ERROR("particle is not electron of photon");
931 throw std::runtime_error("particle is not electron or photon");
932 }
933 return ptype;
934}
bool isConvertedPhoton(const xAOD::Egamma *eg, bool excludeTRT=false)
is the object a converted photon
bool isElectron(const xAOD::Egamma *eg)
is the object an electron (not Fwd)
bool isPhoton(const xAOD::Egamma *eg)
is the object a photon

Member Data Documentation

◆ AUTO

const int CP::EgammaCalibrationAndSmearingTool::AUTO = 2
staticprivate

Definition at line 199 of file EgammaCalibrationAndSmearingTool.h.

◆ m_accessors

std::unique_ptr<Accessors> CP::EgammaCalibrationAndSmearingTool::m_accessors

Definition at line 489 of file EgammaCalibrationAndSmearingTool.h.

◆ m_ADCLinearity_tool

std::shared_ptr<LinearityADC> CP::EgammaCalibrationAndSmearingTool::m_ADCLinearity_tool
private

Definition at line 417 of file EgammaCalibrationAndSmearingTool.h.

◆ m_beginInputFileCalled

bool asg::AsgMetadataTool::m_beginInputFileCalled
privateinherited

Flag helping to discover when the tool misses the opening of the first input file.

Definition at line 126 of file AsgMetadataTool.h.

◆ m_caloDistPhiUnifCorr

std::unique_ptr<TH2> CP::EgammaCalibrationAndSmearingTool::m_caloDistPhiUnifCorr
private

Definition at line 291 of file EgammaCalibrationAndSmearingTool.h.

◆ m_currentResolutionVariation_data

egEnergyCorr::Resolution::Variation CP::EgammaCalibrationAndSmearingTool::m_currentResolutionVariation_data
private

Definition at line 439 of file EgammaCalibrationAndSmearingTool.h.

◆ m_currentResolutionVariation_MC

egEnergyCorr::Resolution::Variation CP::EgammaCalibrationAndSmearingTool::m_currentResolutionVariation_MC
private

Definition at line 438 of file EgammaCalibrationAndSmearingTool.h.

◆ m_currentScalePredicate

EgammaPredicate CP::EgammaCalibrationAndSmearingTool::m_currentScalePredicate
private

Definition at line 441 of file EgammaCalibrationAndSmearingTool.h.

◆ m_currentScaleVariation_data

egEnergyCorr::Scale::Variation CP::EgammaCalibrationAndSmearingTool::m_currentScaleVariation_data
private

Definition at line 437 of file EgammaCalibrationAndSmearingTool.h.

◆ m_currentScaleVariation_MC

egEnergyCorr::Scale::Variation CP::EgammaCalibrationAndSmearingTool::m_currentScaleVariation_MC
private

Definition at line 436 of file EgammaCalibrationAndSmearingTool.h.

◆ m_decorateEmva

bool CP::EgammaCalibrationAndSmearingTool::m_decorateEmva
private

Definition at line 287 of file EgammaCalibrationAndSmearingTool.h.

◆ m_decorrelation_model_name

std::string CP::EgammaCalibrationAndSmearingTool::m_decorrelation_model_name
private

Definition at line 252 of file EgammaCalibrationAndSmearingTool.h.

◆ m_decorrelation_model_resolution

ResolutionDecorrelation CP::EgammaCalibrationAndSmearingTool::m_decorrelation_model_resolution
private
Initial value:

Definition at line 256 of file EgammaCalibrationAndSmearingTool.h.

◆ m_decorrelation_model_resolution_name

std::string CP::EgammaCalibrationAndSmearingTool::m_decorrelation_model_resolution_name
private

Definition at line 254 of file EgammaCalibrationAndSmearingTool.h.

◆ m_decorrelation_model_scale

ScaleDecorrelation CP::EgammaCalibrationAndSmearingTool::m_decorrelation_model_scale = ScaleDecorrelation::FULL
private

Definition at line 255 of file EgammaCalibrationAndSmearingTool.h.

◆ m_decorrelation_model_scale_name

std::string CP::EgammaCalibrationAndSmearingTool::m_decorrelation_model_scale_name
private

Definition at line 253 of file EgammaCalibrationAndSmearingTool.h.

◆ m_detStore

StoreGateSvc_t AthCommonDataStore< AthCommonMsg< AlgTool > >::m_detStore
privateinherited

Pointer to StoreGate (detector store by default).

Definition at line 393 of file AthCommonDataStore.h.

◆ m_doADCLinearityCorrection

int CP::EgammaCalibrationAndSmearingTool::m_doADCLinearityCorrection
private

Definition at line 273 of file EgammaCalibrationAndSmearingTool.h.

◆ m_doFwdCalib

Gaudi::Property<bool> CP::EgammaCalibrationAndSmearingTool::m_doFwdCalib
private
Initial value:
{
this, "DoFwdElectronCalibration", false,
"MVA calibration of the forward electron"}

Definition at line 297 of file EgammaCalibrationAndSmearingTool.h.

297 {
298 this, "DoFwdElectronCalibration", false,
299 "MVA calibration of the forward electron"};

◆ m_doLeakageCorrection

int CP::EgammaCalibrationAndSmearingTool::m_doLeakageCorrection
private

Definition at line 274 of file EgammaCalibrationAndSmearingTool.h.

◆ m_doScaleCorrection

int CP::EgammaCalibrationAndSmearingTool::m_doScaleCorrection
private

Definition at line 259 of file EgammaCalibrationAndSmearingTool.h.

◆ m_doSmearing

int CP::EgammaCalibrationAndSmearingTool::m_doSmearing
private

Definition at line 260 of file EgammaCalibrationAndSmearingTool.h.

◆ m_ESModel

std::string CP::EgammaCalibrationAndSmearingTool::m_ESModel
private

Definition at line 251 of file EgammaCalibrationAndSmearingTool.h.

◆ m_evtStore

StoreGateSvc_t AthCommonDataStore< AthCommonMsg< AlgTool > >::m_evtStore
privateinherited

Pointer to StoreGate (event store by default).

Definition at line 390 of file AthCommonDataStore.h.

◆ m_fixForMissingCells

Gaudi::Property<bool> CP::EgammaCalibrationAndSmearingTool::m_fixForMissingCells
private
Initial value:
{
this, "FixForMissingCells", true,
"AOD fix for cell recovery in core egamma cluster"}

Definition at line 293 of file EgammaCalibrationAndSmearingTool.h.

293 {
294 this, "FixForMissingCells", true,
295 "AOD fix for cell recovery in core egamma cluster"};

◆ m_gain_tool

egGain::GainTool* CP::EgammaCalibrationAndSmearingTool::m_gain_tool = nullptr
private

Definition at line 418 of file EgammaCalibrationAndSmearingTool.h.

◆ m_gain_tool_run2

std::unique_ptr<egGain::GainUncertainty> CP::EgammaCalibrationAndSmearingTool::m_gain_tool_run2
private

Definition at line 416 of file EgammaCalibrationAndSmearingTool.h.

◆ m_inputMetaStore

MetaStore_t asg::AsgMetadataTool::m_inputMetaStore
privateinherited

Object accessing the input metadata store.

Definition at line 119 of file AsgMetadataTool.h.

◆ m_layer_recalibration_tool

egammaLayerRecalibTool* CP::EgammaCalibrationAndSmearingTool::m_layer_recalibration_tool = nullptr
private

Definition at line 419 of file EgammaCalibrationAndSmearingTool.h.

◆ m_layer_recalibration_tune

std::string CP::EgammaCalibrationAndSmearingTool::m_layer_recalibration_tune
private

Definition at line 420 of file EgammaCalibrationAndSmearingTool.h.

◆ m_MVACalibSvc

ServiceHandle<IegammaMVASvc> CP::EgammaCalibrationAndSmearingTool::m_MVACalibSvc
private
Initial value:
{this, "MVACalibSvc", "",
"calibration service"}

Definition at line 414 of file EgammaCalibrationAndSmearingTool.h.

414 {this, "MVACalibSvc", "",
415 "calibration service"};

◆ m_MVAfolder

std::string CP::EgammaCalibrationAndSmearingTool::m_MVAfolder
private

Definition at line 424 of file EgammaCalibrationAndSmearingTool.h.

◆ m_onlyElectrons

Gaudi::Property<bool> CP::EgammaCalibrationAndSmearingTool::m_onlyElectrons {this, "onlyElectrons", false, "the tool will only be applied to electrons"}

Definition at line 452 of file EgammaCalibrationAndSmearingTool.h.

452{this, "onlyElectrons", false, "the tool will only be applied to electrons"};

◆ m_onlyPhotons

Gaudi::Property<bool> CP::EgammaCalibrationAndSmearingTool::m_onlyPhotons {this, "onlyPhotons", false, "the tool will only be applied to photons"}

Definition at line 453 of file EgammaCalibrationAndSmearingTool.h.

453{this, "onlyPhotons", false, "the tool will only be applied to photons"};

◆ m_outputMetaStore

MetaStore_t asg::AsgMetadataTool::m_outputMetaStore
privateinherited

Object accessing the output metadata store.

Definition at line 121 of file AsgMetadataTool.h.

◆ m_pVtxKey

Gaudi::Property<std::string> CP::EgammaCalibrationAndSmearingTool::m_pVtxKey
private
Initial value:
{
this, "PrimaryVerticesKey", "PrimaryVertices",
"Name of the primary vertex container"}

Definition at line 301 of file EgammaCalibrationAndSmearingTool.h.

301 {
302 this, "PrimaryVerticesKey", "PrimaryVertices",
303 "Name of the primary vertex container"};

◆ m_ResolutionType

std::string CP::EgammaCalibrationAndSmearingTool::m_ResolutionType
private

Definition at line 262 of file EgammaCalibrationAndSmearingTool.h.

◆ m_rootTool

std::unique_ptr<AtlasRoot::egammaEnergyCorrectionTool> CP::EgammaCalibrationAndSmearingTool::m_rootTool
private

Definition at line 423 of file EgammaCalibrationAndSmearingTool.h.

◆ m_Run2Run3runNumberTransition

const unsigned int CP::EgammaCalibrationAndSmearingTool::m_Run2Run3runNumberTransition = 400000
staticprivate

Definition at line 249 of file EgammaCalibrationAndSmearingTool.h.

◆ m_set_seed_function

IdFunction CP::EgammaCalibrationAndSmearingTool::m_set_seed_function
private

Definition at line 443 of file EgammaCalibrationAndSmearingTool.h.

◆ m_simulation

PATCore::ParticleDataType::DataType CP::EgammaCalibrationAndSmearingTool::m_simulation
private
Initial value:

Definition at line 266 of file EgammaCalibrationAndSmearingTool.h.

◆ m_syst_description

std::map<CP::SystematicVariation, SysInfo> CP::EgammaCalibrationAndSmearingTool::m_syst_description
private

Definition at line 431 of file EgammaCalibrationAndSmearingTool.h.

◆ m_syst_description_resolution

std::map<CP::SystematicVariation, egEnergyCorr::Resolution::Variation> CP::EgammaCalibrationAndSmearingTool::m_syst_description_resolution
private

Definition at line 433 of file EgammaCalibrationAndSmearingTool.h.

◆ m_TESModel

egEnergyCorr::ESModel CP::EgammaCalibrationAndSmearingTool::m_TESModel
private

Definition at line 258 of file EgammaCalibrationAndSmearingTool.h.

◆ m_TResolutionType

egEnergyCorr::Resolution::resolutionType CP::EgammaCalibrationAndSmearingTool::m_TResolutionType
private

Definition at line 263 of file EgammaCalibrationAndSmearingTool.h.

◆ m_use_AFII

int CP::EgammaCalibrationAndSmearingTool::m_use_AFII
private

Definition at line 265 of file EgammaCalibrationAndSmearingTool.h.

◆ m_use_ep_combination

bool CP::EgammaCalibrationAndSmearingTool::m_use_ep_combination
private

Definition at line 275 of file EgammaCalibrationAndSmearingTool.h.

◆ m_use_full_statistical_error

bool CP::EgammaCalibrationAndSmearingTool::m_use_full_statistical_error
private

Definition at line 277 of file EgammaCalibrationAndSmearingTool.h.

◆ m_use_mapping_correction

bool CP::EgammaCalibrationAndSmearingTool::m_use_mapping_correction
private

Definition at line 280 of file EgammaCalibrationAndSmearingTool.h.

◆ m_use_mva_calibration

int CP::EgammaCalibrationAndSmearingTool::m_use_mva_calibration
private

Definition at line 276 of file EgammaCalibrationAndSmearingTool.h.

◆ m_use_temp_correction201215

int CP::EgammaCalibrationAndSmearingTool::m_use_temp_correction201215
private

Definition at line 278 of file EgammaCalibrationAndSmearingTool.h.

◆ m_use_uA2MeV_2015_first2weeks_correction

int CP::EgammaCalibrationAndSmearingTool::m_use_uA2MeV_2015_first2weeks_correction
private

Definition at line 279 of file EgammaCalibrationAndSmearingTool.h.

◆ m_useCaloDistPhiUnifCorrection

int CP::EgammaCalibrationAndSmearingTool::m_useCaloDistPhiUnifCorrection
private

Definition at line 271 of file EgammaCalibrationAndSmearingTool.h.

◆ m_useFastSim

int CP::EgammaCalibrationAndSmearingTool::m_useFastSim
private

Definition at line 264 of file EgammaCalibrationAndSmearingTool.h.

◆ m_useGainCorrection

int CP::EgammaCalibrationAndSmearingTool::m_useGainCorrection
private

Definition at line 272 of file EgammaCalibrationAndSmearingTool.h.

◆ m_useGainInterpolation

int CP::EgammaCalibrationAndSmearingTool::m_useGainInterpolation
private

Definition at line 282 of file EgammaCalibrationAndSmearingTool.h.

◆ m_useIncidents

bool asg::AsgMetadataTool::m_useIncidents
privateinherited

Definition at line 128 of file AsgMetadataTool.h.

◆ m_useIntermoduleCorrection

int CP::EgammaCalibrationAndSmearingTool::m_useIntermoduleCorrection
private

Definition at line 269 of file EgammaCalibrationAndSmearingTool.h.

◆ m_useLayerCorrection

int CP::EgammaCalibrationAndSmearingTool::m_useLayerCorrection
private

Definition at line 283 of file EgammaCalibrationAndSmearingTool.h.

◆ m_usePhiUniformCorrection

int CP::EgammaCalibrationAndSmearingTool::m_usePhiUniformCorrection
private

Definition at line 270 of file EgammaCalibrationAndSmearingTool.h.

◆ m_usePSCorrection

int CP::EgammaCalibrationAndSmearingTool::m_usePSCorrection
private

Definition at line 284 of file EgammaCalibrationAndSmearingTool.h.

◆ m_user_random_run_number

int CP::EgammaCalibrationAndSmearingTool::m_user_random_run_number
private

Definition at line 281 of file EgammaCalibrationAndSmearingTool.h.

◆ m_useS12Correction

int CP::EgammaCalibrationAndSmearingTool::m_useS12Correction
private

Definition at line 285 of file EgammaCalibrationAndSmearingTool.h.

◆ m_useSaccCorrection

int CP::EgammaCalibrationAndSmearingTool::m_useSaccCorrection
private

Definition at line 286 of file EgammaCalibrationAndSmearingTool.h.

◆ m_varHandleArraysDeclared

bool AthCommonDataStore< AthCommonMsg< AlgTool > >::m_varHandleArraysDeclared
privateinherited

Definition at line 399 of file AthCommonDataStore.h.

◆ m_varSF

double CP::EgammaCalibrationAndSmearingTool::m_varSF
private

Definition at line 261 of file EgammaCalibrationAndSmearingTool.h.

◆ m_vhka

std::vector<SG::VarHandleKeyArray*> AthCommonDataStore< AthCommonMsg< AlgTool > >::m_vhka
privateinherited

Definition at line 398 of file AthCommonDataStore.h.


The documentation for this class was generated from the following files: