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

#include <EgammaCalibrationAndSmearingTool.h>

Inheritance diagram for CP::EgammaCalibrationAndSmearingTool:

Classes

struct  AbsEtaCaloPredicate
struct  Accessors
struct  DoubleOrAbsEtaCaloPredicate
struct  EtaCaloPredicate
struct  SysInfo

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/TEvent.
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 288 of file EgammaCalibrationAndSmearingTool.cxx.

290 : asg::AsgMetadataTool(name),
299 columnar::EgammaId egamma,
301 const Accessors& acc = *tool.m_accessors;
302 // avoid 0 as result, see
303 // https://root.cern.ch/root/html/TRandom3.html#TRandom3:SetSeed
304 auto cluster = acc.caloClusterAcc(egamma)[0].value();
305 return 1 + static_cast<RandomNumber>(
306 std::abs(acc.clusterPhiAcc(cluster)) * 1E6 +
307 std::abs(acc.clusterEtaAcc(cluster)) * 1E3 +
308 acc.eventNumberAcc(ei));
309 }),
310 m_accessors(std::make_unique<Accessors>(*this)) {
311
312 declareProperty("ESModel", m_ESModel = "");
313 declareProperty("decorrelationModel", m_decorrelation_model_name = "");
314 declareProperty("decorrelationModelScale",
316 declareProperty("decorrelationModelResolution",
318 declareProperty("ResolutionType", m_ResolutionType = "SigmaEff90");
319 declareProperty("varSF", m_varSF = 1.0);
320 declareProperty("doScaleCorrection", m_doScaleCorrection = AUTO);
321 declareProperty("doSmearing", m_doSmearing = AUTO);
322 declareProperty("useLayerCorrection", m_useLayerCorrection = AUTO);
323 declareProperty("usePSCorrection", m_usePSCorrection = AUTO);
324 declareProperty("useS12Correction", m_useS12Correction = AUTO);
325 declareProperty("useSaccCorrection", m_useSaccCorrection = AUTO);
326 declareProperty("useIntermoduleCorrection",
328 declareProperty("usePhiUniformCorrection", m_usePhiUniformCorrection = AUTO);
329 declareProperty("useCaloDistPhiUnifCorrection",
331 declareProperty("useGainCorrection", m_useGainCorrection = AUTO);
332 declareProperty("useGainInterpolation", m_useGainInterpolation = AUTO);
333 declareProperty("doADCLinearityCorrection",
335 declareProperty("doLeakageCorrection", m_doLeakageCorrection = AUTO);
336 declareProperty("MVAfolder", m_MVAfolder = "");
337 declareProperty("layerRecalibrationTune", m_layer_recalibration_tune = "");
338 declareProperty("useEPCombination", m_use_ep_combination = false);
339 declareProperty("useMVACalibration", m_use_mva_calibration = AUTO);
340 declareProperty("use_full_statistical_error",
342 declareProperty("use_temp_correction201215",
344 declareProperty("use_uA2MeV_2015_first2weeks_correction",
346 declareProperty("randomRunNumber", m_user_random_run_number = 0);
347 // this is the user input, it is never changed by the tool. The tool uses
348 // m_simulation.
349 declareProperty("useFastSim", m_useFastSim = -1,
350 "This should be explicitly set by the user depending on the "
351 "data type (int)0=full sim, (int)1=fast sim");
353 "useAFII", m_use_AFII = -1,
354 "This is now deprecated. Kept for explicit error message for now");
355 declareProperty("decorateEmva", m_decorateEmva = false, "whether to decorate the eMVA value");
356}
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< ContainerId::egamma > EgammaId
Definition EgammaDef.h:50
ObjectId< ContainerId::eventInfo > 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 358 of file EgammaCalibrationAndSmearingTool.cxx.

358 {
359 ATH_MSG_DEBUG("destructor");
361 delete m_gain_tool;
362}
#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 1292 of file EgammaCalibrationAndSmearingTool.cxx.

1293 {
1294 CP::SystematicSet affecting_systematics;
1295 for (const auto& it : m_syst_description) {
1296 affecting_systematics.insert(it.first);
1297 }
1298 for (const auto& it : m_syst_description_resolution) {
1299 affecting_systematics.insert(it.first);
1300 }
1301
1302 return affecting_systematics;
1303}
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 989 of file EgammaCalibrationAndSmearingTool.cxx.

990 {
991 const Accessors& acc = *m_accessors;
992
993 // only used in simulation (for the smearing)
994 RandomNumber seed = m_set_seed_function(*this, input, event_info);
995
996 columnar::ClusterId inputCluster = acc.caloClusterAcc (input)[0].value();
997
998 if (m_layer_recalibration_tool && acc.authorAcc (input) !=
1000 ATH_MSG_DEBUG("applying energy recalibration before E0|E1|E2|E3 = "
1001 << acc.energyBEAcc (inputCluster, 0) << "|"
1002 << acc.energyBEAcc (inputCluster, 1) << "|"
1003 << acc.energyBEAcc (inputCluster, 2) << "|"
1004 << acc.energyBEAcc (inputCluster, 3));
1005 // for now just go back to the xAOD object to access the subtool
1006 const CP::CorrectionCode status_layer_recalibration = m_layer_recalibration_tool->applyCorrection(input.getXAODObject(), event_info.getXAODObject());
1007 if (status_layer_recalibration == CP::CorrectionCode::Error) { return CP::CorrectionCode::Error; }
1008 ATH_MSG_DEBUG("eta|phi = " << acc.etaAcc (input) << "|" << acc.phiAcc (input));
1009 if (status_layer_recalibration == CP::CorrectionCode::Ok) {
1010 ATH_MSG_DEBUG("decoration E0|E1|E2|E3 = "
1011 << acc.Es0Acc(inputCluster) << "|"
1012 << acc.Es1Acc(inputCluster) << "|"
1013 << acc.Es2Acc(inputCluster) << "|"
1014 << acc.Es3Acc(inputCluster) << "|");
1015 if (acc.Es2Acc(inputCluster) == 0 and acc.Es1Acc(inputCluster) == 0 and
1016 acc.Es3Acc(inputCluster) == 0 and acc.Es0Acc(inputCluster) == 0 and
1017 (std::abs(acc.etaAcc (input)) < 1.37 or (std::abs(acc.etaAcc (input)) > 1.55 and std::abs(acc.etaAcc (input)) < 2.47)))
1018 {
1019 ATH_MSG_WARNING("all layer energies are zero");
1020 }
1021 }
1022 }
1023
1024 double energy = acc.momAcc.e (input);
1025 // apply MVA calibration
1026 if (!m_MVACalibSvc.empty()) {
1027 egammaMVACalib::GlobalEventInfo gei;
1028 if (acc.authorAcc (input) ==
1030 const xAOD::VertexContainer* pVtxCont = nullptr;
1031 if (evtStore()->retrieve(pVtxCont, m_pVtxKey).isFailure()) {
1032 ATH_MSG_ERROR("No primary vertex container " << m_pVtxKey << " could be retrieved");
1034 }
1035 unsigned int npv(0);
1036 for (const auto *vtx : *pVtxCont) {
1037 if (vtx->vertexType() == xAOD::VxType::PriVtx ||
1038 vtx->vertexType() == xAOD::VxType::PileUp) { ++npv; }
1039 }
1040 gei.nPV = npv;
1041 gei.acmu = acc.actIntPerXingAcc(event_info);
1042 ATH_MSG_DEBUG("Retrieved nPV = " << gei.nPV << " and mu = " << gei.acmu);
1043 }
1044 if (acc.authorAcc (input) !=
1046 if (m_MVACalibSvc->getEnergy(inputCluster.getXAODObject(), input.getXAODObject(), energy, gei)
1047 .isFailure()) {
1048 ATH_MSG_ERROR("Failure in MVACalib service");
1050 }
1051 ATH_MSG_DEBUG("energy after MVA calibration = " << std::format("{:.2f}", energy));
1052 }
1053 }
1054 if (m_decorateEmva)
1055 {
1056 acc.decEmva(input) = energy;
1057 }
1058
1059 // For the time being, it is just the MVA calib
1060 if (acc.authorAcc (input) ==
1062 setPt(input, energy);
1064 }
1065
1067 // Crack calibation correction for es2011c (calibration hits calibration)
1068 const auto ptype = xAOD2ptype(input);
1069 const double etaden =
1071 ? static_cast<const xAOD::Electron&>(input.getXAODObject()).trackParticle()->eta()
1072 : acc.clusterEtaAcc(inputCluster);
1073 energy *= m_rootTool->applyMCCalibration(acc.clusterEtaAcc(inputCluster),
1074 energy / cosh(etaden), ptype);
1075 ATH_MSG_DEBUG("energy after crack calibration es2011c = "
1076 << std::format("{:.2f}", energy));
1077 }
1078
1079 /*
1080 * Here we check for each event the kind of data DATA vs FullSim
1081 * The m_simulation flavour has already been configured
1082 */
1084 (acc.eventTypeAcc(event_info,xAOD::EventInfo::IS_SIMULATION))
1085 ? m_simulation
1087
1088 unsigned int runNumber_for_tool = 0;
1089
1090 // apply uniformity corrections to data
1091 if (dataType == PATCore::ParticleDataType::Data) {
1092 // Get run number
1093 runNumber_for_tool = acc.runNumberAcc(event_info);
1094 // Get etaCalo, phiCalo
1095 const auto cl_eta = acc.clusterEtaAcc(inputCluster);
1096 double etaCalo = 0, phiCalo = 0;
1098 etaCalo = acc.etaCaloAcc(inputCluster, acc.authorAcc(input), false);
1100 phiCalo =
1101 acc.phiCaloAcc(inputCluster, acc.authorAcc(input), false);
1102 }
1103 }
1104
1105 // Intermodule
1107 energy =
1108 intermodule_correction(energy, acc.clusterPhiAcc(inputCluster), cl_eta);
1109 ATH_MSG_DEBUG("energy after intermodule correction = "
1110 << std::format("{:.2f}", energy));
1111 }
1112
1113 // Calo distortion
1118 double etaC = acc.clusterEtaAcc(inputCluster);
1119 double phiC = acc.clusterPhiAcc(inputCluster);
1120 int ieta = m_caloDistPhiUnifCorr->GetXaxis()->FindBin(etaC);
1121 ieta = ieta == 0 ? 1
1122 : (ieta > m_caloDistPhiUnifCorr->GetNbinsX()
1123 ? m_caloDistPhiUnifCorr->GetNbinsX()
1124 : ieta);
1125 int iphi = m_caloDistPhiUnifCorr->GetYaxis()->FindBin(phiC);
1126 iphi = iphi == 0 ? 1
1127 : (iphi > m_caloDistPhiUnifCorr->GetNbinsY()
1128 ? m_caloDistPhiUnifCorr->GetNbinsY()
1129 : iphi);
1130 energy *= m_caloDistPhiUnifCorr->GetBinContent(ieta, iphi);
1132 "energy after phi uniformity correction (for calo distortion) = "
1133 << std::format("{:.2f}", energy));
1134 }
1135
1136 // Phi
1138 energy *= correction_phi_unif(etaCalo, phiCalo);
1139 ATH_MSG_DEBUG("energy after uniformity correction = "
1140 << std::format("{:.2f}", energy));
1141 }
1142
1143 // ADC
1144 if (m_ADCLinearity_tool) {
1145 double et = energy / std::cosh(cl_eta);
1146 double corr =
1147 m_ADCLinearity_tool->getCorr(etaCalo, et, xAOD2ptype(input));
1148 energy *= corr;
1149 ATH_MSG_DEBUG("energy after ADC linearity correction = "
1150 << std::format("{:.2f}", energy));
1151 }
1152
1153 // Gain
1154 if (m_gain_tool) {
1155 const auto es2 = acc.Es2Acc.isAvailable(inputCluster)
1156 ? acc.Es2Acc(inputCluster)
1157 : acc.energyBEAcc (inputCluster,2);
1158 if (!(std::abs(cl_eta) < 1.52 and std::abs(cl_eta) > 1.37) and
1159 std::abs(cl_eta) < 2.4)
1160 energy = m_gain_tool->CorrectionGainTool(
1161 cl_eta, energy / GeV, es2 / GeV,
1162 xAOD2ptype(input)); // cl_eta ok, TODO: check corrected E2
1163 } else if (m_gain_tool_run2) {
1164 double et = energy / std::cosh(cl_eta);
1165 double corr = m_gain_tool_run2->getUncertainty(etaCalo, et,
1166 xAOD2ptype(input), true);
1167 energy /= (1 + corr);
1168 }
1169 ATH_MSG_DEBUG("energy after gain correction = " << std::format("{:.2f}", energy));
1170 } else {
1171 if (m_user_random_run_number == 0) {
1172 if (acc.randomrunnumber_getter.isAvailable(event_info)) {
1173 runNumber_for_tool = acc.randomrunnumber_getter(event_info);
1174 } else {
1176 "Pileup tool not run before using "
1177 "ElectronPhotonFourMomentumCorrection! Assuming it is 2016. If you "
1178 "want to force a specific period set the property randomRunNumber "
1179 "of the tool, e.g. in the job option: "
1180 "tool.randomRunNumber = 123456 or "
1181 "tool.randomRunNumber = "
1182 "EgammaCalibrationAndSmearingToolRunNumbersExample.run_2016");
1184 }
1185 } else {
1186 runNumber_for_tool = m_user_random_run_number;
1187 }
1188 }
1189
1190 const double eraw = ((acc.Es0Acc.isAvailable(inputCluster)
1191 ? acc.Es0Acc(inputCluster)
1192 : acc.energyBEAcc(inputCluster,0)) +
1193 (acc.Es1Acc.isAvailable(inputCluster)
1194 ? acc.Es1Acc(inputCluster)
1195 : acc.energyBEAcc(inputCluster,1)) +
1196 (acc.Es2Acc.isAvailable(inputCluster)
1197 ? acc.Es2Acc(inputCluster)
1198 : acc.energyBEAcc(inputCluster,2)) +
1199 (acc.Es3Acc.isAvailable(inputCluster)
1200 ? acc.Es3Acc(inputCluster)
1201 : acc.energyBEAcc(inputCluster,3)));
1202
1203
1204 if (dataType == PATCore::ParticleDataType::Fast)
1205 ATH_MSG_DEBUG("is fast");
1206 else if (dataType == PATCore::ParticleDataType::Full)
1207 ATH_MSG_DEBUG("is full");
1208 else if (dataType == PATCore::ParticleDataType::Data)
1209 ATH_MSG_DEBUG("is data");
1210
1211 // apply scale factors or systematics
1212 energy = m_rootTool->getCorrectedEnergy(
1213 runNumber_for_tool, dataType, xAOD2ptype(input),
1214 inputCluster(acc.clusterEtaAcc),
1215 inputCluster(acc.clusterEtaBEAcc,2),
1216 acc.etaCaloAcc(inputCluster, acc.authorAcc (input), false), energy,
1217 acc.Es2Acc.isAvailable(inputCluster)
1218 ? acc.Es2Acc(inputCluster)
1219 : inputCluster(acc.energyBEAcc,2),
1220 eraw, seed, oldtool_scale_flag_this_event(input, event_info),
1222 m_varSF);
1223
1224 ATH_MSG_DEBUG("energy after scale/systematic correction = " << std::format("{:.2f}", energy));
1225
1226 // TODO: this check should be done before systematics variations
1227 setPt(input, energy);
1229}
#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< ContainerId::cluster > ClusterId
Definition ClusterDef.h:26
retrieve(aClass, aKey=None)
Definition PyKernel.py:110
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 934 of file EgammaCalibrationAndSmearingTool.cxx.

935 {
936 // Retrieve the event information:
937 const xAOD::EventInfo* event_info = nullptr;
938 if (evtStore()->retrieve(event_info, "EventInfo").isFailure()) {
939 ATH_MSG_ERROR("No EventInfo object could be retrieved");
941 }
942 return applyCorrection(input, *event_info);
943}
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 2143 of file EgammaCalibrationAndSmearingTool.cxx.

2144 {
2145
2146 // set the nominal one (no systematics)
2156
2157 if (systConfig.empty())
2158 return StatusCode::SUCCESS;
2159
2160 // the following code allows only ONE systematic variation at a time (1 for
2161 // scale, 1 for resolution)
2162
2163 bool first_scale = true;
2164 bool first_resolution = true;
2165 for (const auto& it : systConfig) {
2166 const auto found_scale = m_syst_description.find(it);
2167 if (found_scale != m_syst_description.end()) {
2168 if (not first_scale) {
2169 ATH_MSG_ERROR("multiple scale variations not supported");
2170 throw std::runtime_error("multiple scale variations not supported");
2171 }
2172 first_scale = false;
2173 m_currentScaleVariation_MC = found_scale->second.effect;
2174 m_currentScalePredicate = found_scale->second.predicate;
2175 }
2176
2177 const auto found_resolution = m_syst_description_resolution.find(it);
2178 if (found_resolution != m_syst_description_resolution.end()) {
2179 if (not first_resolution) {
2180 ATH_MSG_ERROR("multiple resolution variations not supported");
2181 throw std::runtime_error(
2182 "multiple resolution variations not supported");
2183 }
2184 first_resolution = false;
2185 m_currentResolutionVariation_MC = found_resolution->second;
2186 }
2187 }
2188
2189 return StatusCode::SUCCESS;
2190}
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 2554 of file EgammaCalibrationAndSmearingTool.cxx.

2556{
2557 const Accessors& acc = *m_accessors;
2558 for (auto event : events) {
2559 auto eventInfo = acc.m_eventHandle(event);
2560 callSingleEvent (acc.m_egammaHandle(event), eventInfo);
2561 }
2562}
void callSingleEvent(columnar::MutableEgammaRange egammas, columnar::EventInfoId event) const

◆ callSingleEvent()

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

Definition at line 2545 of file EgammaCalibrationAndSmearingTool.cxx.

2547{
2548 for (auto egamma : egammas) {
2549 if (applyCorrection (egamma, event) != CP::CorrectionCode::Ok)
2550 throw std::runtime_error ("EgammaCalibrationAndSmearingTool::callEvents: apply failed");
2551 }
2552}

◆ correctedCopy() [1/2]

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

Implements CP::IEgammaCalibrationAndSmearingTool.

Definition at line 945 of file EgammaCalibrationAndSmearingTool.cxx.

946 {
947 // A sanity check:
948 if (output)
950 "Non-null pointer received. "
951 "There's a possible memory leak!");
952
953 output = new xAOD::Electron();
954 output->makePrivateStore(input);
955 return applyCorrection(*output);
956}
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 958 of file EgammaCalibrationAndSmearingTool.cxx.

959 {
960 // A sanity check:
961 if (output)
963 "Non-null pointer received. "
964 "There's a possible memory leak!");
965
966 output = new xAOD::Photon();
967 output->makePrivateStore(input);
968 return applyCorrection(*output);
969}
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 2381 of file EgammaCalibrationAndSmearingTool.cxx.

2382 {
2383 constexpr double PI = M_PI;
2384 double Fcorr = 1.0;
2385
2387 // wrong mapping HV -> sectors in run1
2388 if (eta < -0.4 && eta > -0.6) {
2389 if (phi < (14 * PI / 32.) && phi > (13 * PI / 32.)) {
2390 Fcorr += 0.035;
2391 } else if (phi < (13 * PI / 32.) && phi > (12 * PI / 32.)) {
2392 Fcorr -= 0.035;
2393 }
2394 }
2395 }
2396
2409
2410 if (eta < 0.2 && eta > 0.) {
2411 if (phi < (-7 * 2 * PI / 32.) && phi > (-8 * 2 * PI / 32.)) {
2412 Fcorr = 1.016314;
2413 }
2414 }
2415
2416 else if (eta < 0.6 && eta > 0.4) {
2417 if (phi < 0 && phi > (-2 * PI / 32.)) {
2418 Fcorr = 1.041591;
2419 } else if (phi < (-4 * 2 * PI / 32.) && phi > (-5 * 2 * PI / 32.)) {
2420 Fcorr = 1.067346;
2421 }
2422 }
2423
2424 else if (eta < 0.8 && eta > 0.6) {
2425 if (phi < (7 * 2 * PI / 32.) && phi > (6 * 2 * PI / 32.)) {
2426 Fcorr = 1.027980;
2427 }
2428 }
2429
2430 else if (eta < 1.4 && eta > 1.2) {
2431 if (phi < (-9 * 2 * PI / 32.) && phi > (-10 * 2 * PI / 32.)) {
2432 Fcorr = 1.020299;
2433 } else if (phi < (-11 * 2 * PI / 32.) && phi > (-12 * 2 * PI / 32.)) {
2434 Fcorr = 1.051426;
2435 }
2436 }
2437
2438 else if (eta < 2.3 && eta > 2.1) {
2439 if (phi < (-12 * 2 * PI / 32.) && phi > (-13 * 2 * PI / 32.)) {
2440 Fcorr = 1.071695;
2441 }
2442 }
2443
2444 else if (eta < 0. && eta > -0.2) {
2445 if (phi < (-12 * 2 * PI / 32.) && phi > (-13 * 2 * PI / 32.)) {
2446 Fcorr = 1.008227;
2447 } else if (phi < (-8 * 2 * PI / 32.) && phi > (-9 * 2 * PI / 32.)) {
2448 Fcorr = 1.013929;
2449 }
2450 }
2451
2452 else if (eta < -0.2 && eta > -0.4) {
2453 if (phi < (-9 * 2 * PI / 32.) && phi > (-10 * 2 * PI / 32.)) {
2454 Fcorr = 1.015749;
2455 }
2456 }
2457
2458 else if (eta < -1.2 && eta > -1.4) {
2459 if (phi < (-6 * 2 * PI / 32.) && phi > (-7 * 2 * PI / 32.)) {
2460 Fcorr = 1.064954;
2461 }
2462 }
2463
2464 else if (eta < -1.6 && eta > -1.8) {
2465 if (phi < (9 * 2 * PI / 32.) && phi > (8 * 2 * PI / 32.)) {
2466 Fcorr = 1.027448;
2467 }
2468 }
2469
2470 else if (eta < -2.3 && eta > -2.5) {
2471 if (phi < (-8 * 2 * PI / 32.) && phi > (-9 * 2 * PI / 32.)) {
2472 Fcorr = 1.025882;
2473 } else if (phi < (5 * 2 * PI / 32.) && phi > (4 * 2 * PI / 32.)) {
2474 Fcorr = 1.036616;
2475 } else if (phi < (9 * 2 * PI / 32.) && phi > (8 * 2 * PI / 32.)) {
2476 Fcorr = 1.053838;
2477 } else if (phi < (10 * 2 * PI / 32.) && phi > (9 * 2 * PI / 32.)) {
2478 Fcorr = 1.026856;
2479 } else if (phi < (11 * 2 * PI / 32.) && phi > (10 * 2 * PI / 32.)) {
2480 Fcorr = 0.994382;
2481 }
2482 }
2483
2484 } // es2017_summer_improved end
2485
2486 else {
2487 if (eta < 0.6 && eta > 0.4) {
2488 if (phi < 0 && phi > (-2 * PI / 32.)) {
2489 Fcorr = 1.028;
2490 } else if (phi < (-4 * 2 * PI / 32.) && phi > (-5 * 2 * PI / 32.)) {
2491 Fcorr = 1.044;
2492 }
2493 }
2494
2495 else if (eta < 0.8 && eta > 0.6) {
2496 if (phi < (7 * 2 * PI / 32.) && phi > (6 * 2 * PI / 32.)) {
2497 Fcorr = 1.022;
2498 }
2499 }
2500
2501 else if (eta < 1.4 && eta > 1.2) {
2502 if (phi < (-11 * 2 * PI / 32.) && phi > (-12 * 2 * PI / 32.)) {
2503 Fcorr = 1.038;
2504 }
2505 }
2506
2507 else if (eta < 2.0 && eta > 1.9) {
2508 if (phi < (10 * 2 * PI / 32.) && phi > (9 * 2 * PI / 32.)) {
2509 Fcorr = 1.029;
2510 }
2511 }
2512
2513 else if (eta < -1.2 && eta > -1.4) {
2514 if (phi < (-4 * 2 * PI / 32.) && phi > (-5 * 2 * PI / 32.)) {
2515 Fcorr = 1.048;
2516 } else if (phi < (-6 * 2 * PI / 32.) && phi > (-7 * 2 * PI / 32.)) {
2517 Fcorr = 1.048;
2518 }
2519 }
2520
2521 else if (eta < -1.6 && eta > -1.8) {
2522 if (phi < (9 * 2 * PI / 32.) && phi > (8 * 2 * PI / 32.)) {
2523 Fcorr = 1.024;
2524 }
2525 }
2526
2527 else if (eta < -2.3 && eta > -2.5) {
2528 if (phi < (-8 * 2 * PI / 32.) && phi > (-9 * 2 * PI / 32.)) {
2529 Fcorr = 1.037;
2530 } else if (phi < (5 * 2 * PI / 32.) && phi > (4 * 2 * PI / 32.)) {
2531 Fcorr = 1.031;
2532 } else if (phi < (9 * 2 * PI / 32.) && phi > (8 * 2 * PI / 32.)) {
2533 Fcorr = 1.040;
2534 } else if (phi < (10 * 2 * PI / 32.) && phi > (9 * 2 * PI / 32.)) {
2535 Fcorr = 1.030;
2536 } else if (phi < (11 * 2 * PI / 32.) && phi > (10 * 2 * PI / 32.)) {
2537 Fcorr = 1.020;
2538 }
2539 }
2540 }
2541
2542 return Fcorr;
2543}
#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 1268 of file EgammaCalibrationAndSmearingTool.cxx.

1269 {
1272 ? m_simulation
1274
1275 const xAOD::TrackParticle* eTrack = el->trackParticle();
1276
1277 // track momentum and eta
1278 const float el_tracketa = eTrack->eta();
1279 const float el_trackmomentum = eTrack->pt() * cosh(el->eta());
1280
1281 return m_rootTool->getCorrectedMomentum(
1282 dataType, PATCore::ParticleType::Electron, el_trackmomentum, el_tracketa,
1283 oldtool_scale_flag_this_event(*el, *event_info), m_varSF);
1284}
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 980 of file EgammaCalibrationAndSmearingTool.cxx.

981 {
982 xAOD::Electron* new_particle = nullptr;
983 ANA_CHECK_THROW(correctedCopy(input, new_particle));
984 const double e = new_particle->e();
985 delete new_particle;
986 return e;
987}
#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 971 of file EgammaCalibrationAndSmearingTool.cxx.

972 {
973 xAOD::Photon* new_particle = nullptr;
974 ANA_CHECK_THROW(correctedCopy(input, new_particle));
975 const double e = new_particle->e();
976 delete new_particle;
977 return e;
978}
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 1240 of file EgammaCalibrationAndSmearingTool.cxx.

1241 {
1242 ANA_CHECK_THROW(applyCorrection(*p, *event_info));
1243 ATH_MSG_DEBUG("returning " << p->e());
1244 return p->e();
1245}

◆ 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::TEvent 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::TEvent, 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::TEvent 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::TEvent, 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 916 of file EgammaCalibrationAndSmearingTool.cxx.

917 {
918 const auto ptype = xAOD2ptype(particle);
919 const auto cl_etaCalo =
920 xAOD::get_eta_calo(*particle.caloCluster(), particle.author());
921
922 return m_rootTool->resolution(particle.e(), particle.caloCluster()->eta(),
923 cl_etaCalo, ptype, withCT,
924 false); // TODO: always for full simulation
925}
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/TEvent.

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 364 of file EgammaCalibrationAndSmearingTool.cxx.

364 {
365 ATH_MSG_INFO("Initialization");
366
367 if (m_ESModel == "es2015XX") {
368 ATH_MSG_ERROR("es2015XX is deprecated. Use es2015PRE");
369 }
370
371 if (m_ESModel == "es2010") {
373 } // legacy
374 else if (m_ESModel == "es2011c") {
376 } // mc11c : faulty G4; old geometry
377 else if (m_ESModel == "es2011d") {
379 } // mc11d : corrected G4; new geometry == final Run1 scheme
380 else if (m_ESModel == "es2012a") {
382 } // mc12a : "crude" G4 fix; old geometry
383 else if (m_ESModel == "es2012c") {
385 } // mc12c : corrected G4; new geometry == final Run1 scheme
386 else if (m_ESModel == "es2012XX") {
388 } else if (m_ESModel == "es2015PRE") {
390 } else if (m_ESModel == "es2015PRE_res_improved") {
392 } else if (m_ESModel == "es2015cPRE") {
394 } else if (m_ESModel == "es2015cPRE_res_improved") {
396 } else if (m_ESModel == "es2015c_summer") {
398 } else if (m_ESModel == "es2016PRE") {
400 } else if (m_ESModel == "es2016data_mc15c") {
402 } else if (m_ESModel == "es2016data_mc15c_summer") {
404 } else if (m_ESModel == "es2016data_mc15c_summer_improved") {
406 } else if (m_ESModel == "es2016data_mc15c_final") {
408 } else if (m_ESModel == "es2015_5TeV") {
410 } else if (m_ESModel == "es2017_R21_PRE") {
412 } else if (m_ESModel == "es2017_R21_v0") {
414 } else if (m_ESModel == "es2017_R21_v1") {
416 } else if (m_ESModel == "es2017_R21_ofc0_v1") {
418 } else if (m_ESModel == "es2018_R21_v0") {
420 } else if (m_ESModel == "es2018_R21_v1") {
422 } else if (m_ESModel == "es2022_R22_PRE") {
424 } else if (m_ESModel == "es2023_R22_Run2_v0") {
426 } else if (m_ESModel == "es2023_R22_Run2_v1") {
428 } else if (m_ESModel == "es2024_Run3_ofc0_v0") {
430 } else if (m_ESModel == "es2024_Run3_v0") {
432 } else if (m_ESModel.empty()) {
433 ATH_MSG_ERROR("you must set ESModel property");
434 return StatusCode::FAILURE;
435 } else {
436 ATH_MSG_ERROR("Cannot understand model " << m_ESModel);
437 return StatusCode::FAILURE;
438 }
439
440 if (m_ResolutionType == "Gaussian") {
442 } else if (m_ResolutionType == "SigmaEff80") {
444 } else if (m_ResolutionType == "SigmaEff90") {
446 } else {
447 ATH_MSG_ERROR("Cannot understand resolution " << m_ResolutionType);
448 return StatusCode::FAILURE;
449 }
450
451 if (m_use_AFII != -1) {
453 "Property useAFII is deprecated. It is now replaced with useFastSim, "
454 "which should be explicitly configured");
455 return StatusCode::FAILURE;
456 }
457
458 if (m_useFastSim == 1) {
460 } else if (m_useFastSim == 0) {
462 } else {
463 ATH_MSG_ERROR("Property useFastSim should be explicitly configured");
464 return StatusCode::FAILURE;
465 }
466
470 "Sample is FastSim but no AF3 calibration is supported with "
471 "MC23 pre-recommendations (es2022_R22_PRE and es2024_Run3_ofc0_v0). "
472 "Please swtich to Run3 consolidated recommendations (es2024_Run3_v0), "
473 "or get in touch with the EGamma CP group in case you are using this");
474 return StatusCode::FAILURE;
475 }
476
477 // configure decorrelation model, translate string property to internal class
478 // enum
479 /* S R SR
480 0. 0 0 0 WARNING Full, Full (this is the default without configuration)
481 1. 0 0 1 SR
482 2. 0 1 0 FATAL
483 3. 0 1 1 WARNING SR then R
484 4. 1 0 0 FATAL
485 5. 1 0 1 WARNING SR then S
486 6. 1 1 0 S, R
487 7. 1 1 1 FATAL
488 */
489 if (m_decorrelation_model_name.empty() and
492 // case 0
493 ATH_MSG_WARNING("no decorrelation model specified, assuming full model");
494 m_decorrelation_model_scale = ScaleDecorrelation::FULL;
496 m_decorrelation_model_name = "FULL_v1";
497 } else if (not m_decorrelation_model_name.empty() and
500 // case 7
501 ATH_MSG_FATAL("too many flags for the decorrelation model");
502 return StatusCode::FAILURE;
503 } else {
504 // set scale decorrelation model
505 if (not m_decorrelation_model_scale_name.empty()) { // case 4, 5, 6, (7)
506 if (not m_decorrelation_model_name.empty()) {
508 "flag decorrelation model ignored for scale decorrelation model");
509 } // case 5
510 if (m_decorrelation_model_scale_name == "1NP_v1")
511 m_decorrelation_model_scale = ScaleDecorrelation::ONENP;
512 else if (m_decorrelation_model_scale_name == "FULL_ETACORRELATED_v1")
513 m_decorrelation_model_scale = ScaleDecorrelation::FULL_ETA_CORRELATED;
514 else if (m_decorrelation_model_scale_name == "1NPCOR_PLUS_UNCOR")
515 m_decorrelation_model_scale = ScaleDecorrelation::ONENP_PLUS_UNCONR;
516 else if (m_decorrelation_model_scale_name == "FULL_v1")
517 m_decorrelation_model_scale = ScaleDecorrelation::FULL;
518 else {
519 ATH_MSG_FATAL("cannot understand the scale decorrelation model '"
520 << m_decorrelation_model_scale_name << "'(typo?)");
521 return StatusCode::FAILURE;
522 }
523 } else if (not m_decorrelation_model_name.empty()) { // case 1, 3
524 if (m_decorrelation_model_name == "1NP_v1")
525 m_decorrelation_model_scale = ScaleDecorrelation::ONENP;
526 else if (m_decorrelation_model_name == "FULL_ETACORRELATED_v1")
527 m_decorrelation_model_scale = ScaleDecorrelation::FULL_ETA_CORRELATED;
528 else if (m_decorrelation_model_name == "1NPCOR_PLUS_UNCOR")
529 m_decorrelation_model_scale = ScaleDecorrelation::ONENP_PLUS_UNCONR;
530 else if (m_decorrelation_model_name == "FULL_v1")
531 m_decorrelation_model_scale = ScaleDecorrelation::FULL;
532 else {
533 ATH_MSG_FATAL("cannot understand the decorrelation model '"
534 << m_decorrelation_model_name << "'(typo?)");
535 return StatusCode::FAILURE;
536 }
537 } else { // case 2, (7)
539 "not information how to initialize the scale decorrelation model");
540 return StatusCode::FAILURE;
541 }
542
543 // set resolution decorralation model
545 .empty()) { // case 2, 3, 6, (7)
546 if (not m_decorrelation_model_name.empty()) {
548 "flag decorrelation model ignored for resolution decorrelation "
549 "model");
550 } // case 3
553 else if (m_decorrelation_model_resolution_name == "FULL_v1")
555 else {
556 ATH_MSG_FATAL("cannot understand the resolution decorrelation model '"
558 return StatusCode::FAILURE;
559 }
560 } else if (not m_decorrelation_model_name.empty()) { // case 1, 5
561 if (m_decorrelation_model_name == "1NP_v1")
563 else if (m_decorrelation_model_name == "FULL_ETACORRELATED_v1")
565 else if (m_decorrelation_model_name == "1NPCOR_PLUS_UNCOR")
567 else if (m_decorrelation_model_name == "FULL_v1")
569 else {
570 ATH_MSG_FATAL("cannot understand the decorrelation model '"
571 << m_decorrelation_model_name << "'(typo?)");
572 return StatusCode::FAILURE;
573 }
574 }
575 }
576
577 // create correction tool
578 ATH_MSG_DEBUG("creating internal correction tool");
579 m_rootTool = std::make_unique<AtlasRoot::egammaEnergyCorrectionTool>();
580 if (!m_rootTool) {
581 ATH_MSG_ERROR("Cannot initialize underlying tool");
582 return StatusCode::FAILURE;
583 }
584 m_rootTool->setESModel(m_TESModel);
585
591 "Using linear interpolation in the gain tool (uncertainties only)");
593 m_rootTool->setApplyL2GainInterpolation();
594 }
595 m_rootTool->msg().setLevel(this->msg().level());
596 m_rootTool->initialize();
597
598 // configure MVA calibration
599 if (m_use_mva_calibration != 0) {
600 ATH_MSG_DEBUG("creating MVA calibration tool (if needed)");
601 if (m_MVAfolder.empty()) { // automatically configure MVA tool
603 }
604
605 if (not m_MVAfolder.empty()) {
606
607 // electron MVA tool
608 asg::AsgToolConfig config_mva_electron(
609 "egammaMVACalibTool/tool_mva_electron");
610 config_mva_electron.setPropertyFromString("folder", m_MVAfolder);
611 ATH_CHECK(config_mva_electron.setProperty("use_layer_corrected", true));
612 ATH_CHECK(config_mva_electron.setProperty(
613 "ParticleType", xAOD::EgammaParameters::electron));
614
615 // unconverted photon MVA tool
616 asg::AsgToolConfig config_mva_unconverted(
617 "egammaMVACalibTool/tool_mva_unconverted");
618 config_mva_unconverted.setPropertyFromString("folder", m_MVAfolder);
619 ATH_CHECK(
620 config_mva_unconverted.setProperty("use_layer_corrected", true));
621 ATH_CHECK(config_mva_unconverted.setProperty(
623 ATH_CHECK(config_mva_unconverted.setProperty("OutputLevel",
624 this->msg().level()));
625
626 // converted photon MVA tool
627 asg::AsgToolConfig config_mva_converted(
628 "egammaMVACalibTool/tool_mva_converted");
629 config_mva_converted.setPropertyFromString("folder", m_MVAfolder);
630 ATH_CHECK(config_mva_converted.setProperty("use_layer_corrected", true));
631 ATH_CHECK(config_mva_converted.setProperty(
633 ATH_CHECK(config_mva_converted.setProperty("OutputLevel",
634 this->msg().level()));
635
636 // initialize the ServiceHandler egammaMVASvc
637 // make the name unique
638 std::ostringstream mva_service_name;
639 mva_service_name << "egammaMVASvc/service_mva_egamma_id"
640 << (void const*)this;
641 asg::AsgServiceConfig config_mva_service(mva_service_name.str());
642 ATH_CHECK(config_mva_service.addPrivateTool("ElectronTool",
643 config_mva_electron));
644 ATH_CHECK(config_mva_service.addPrivateTool("UnconvertedPhotonTool",
645 config_mva_unconverted));
646 ATH_CHECK(config_mva_service.addPrivateTool("ConvertedPhotonTool",
647 config_mva_converted));
648 // fwd electron MVA tool
649 if (m_doFwdCalib) {
650 asg::AsgToolConfig config_mva_fwdelectron(
651 "egammaMVACalibTool/tool_mva_fwdelectron");
652 config_mva_fwdelectron.setPropertyFromString("folder", m_MVAfolder);
653 ATH_CHECK(config_mva_fwdelectron.setProperty(
655 ATH_CHECK(config_mva_fwdelectron.setProperty("ShiftType", 0));
656 ATH_CHECK(config_mva_fwdelectron.setProperty("OutputLevel", this->msg().level()));
657 ATH_CHECK(config_mva_service.addPrivateTool("FwdElectronTool",
658 config_mva_fwdelectron));
659 }
660 config_mva_service.setPropertyFromString("folder", m_MVAfolder);
661 ATH_CHECK(
662 config_mva_service.setProperty("OutputLevel", this->msg().level()));
663 ATH_CHECK(config_mva_service.makeService(m_MVACalibSvc));
664 } else {
665 m_use_mva_calibration = false;
666 }
667 }
668
669 // configure layer recalibration tool
670 // For now: layer recalibration not applied to PRE release 21 (using run 1
671 // based calibration applied at reco level)
672 // for following R21 recommendations, need to apply the run2/run1 layer
673 // calibration ratio
674 if (m_ESModel == "es2017_R21_PRE") {
675 ATH_MSG_INFO("Layer recalibration already applied at cell level");
676 m_useLayerCorrection = false;
677 } else if (!m_useLayerCorrection) {
678 ATH_MSG_INFO("Layer corrections disabled!");
679 } else {
680 ATH_MSG_DEBUG("initializing layer recalibration tool (if needed)");
682 .empty()) { // automatically configure layer recalibration tool
685 .release();
687 ATH_MSG_INFO("not using layer recalibration");
688 }
689 } else {
691 new egammaLayerRecalibTool(m_layer_recalibration_tune);
692 }
694 m_layer_recalibration_tool->msg().setLevel(this->msg().level());
696 if (!m_usePSCorrection) {
697 ATH_MSG_INFO("PS corrections disabled!");
698 m_layer_recalibration_tool->disable_PSCorrections();
699 }
700 if (!m_useS12Correction) {
701 ATH_MSG_INFO("S12 corrections disabled!");
702 m_layer_recalibration_tool->disable_S12Corrections();
703 }
704 if (!m_useSaccCorrection) {
705 ATH_MSG_INFO("Sacc corrections disabled!");
706 m_layer_recalibration_tool->disable_SaccCorrections();
707 }
708 }
709 }
710
712 m_rootTool->use_temp_correction201215(m_use_temp_correction201215);
714 m_rootTool->use_uA2MeV_2015_first2weeks_correction(
717 m_decorrelation_model_scale == ScaleDecorrelation::FULL) {
718 m_rootTool->useStatErrorScaling(true);
719 }
720
722 ATH_MSG_ERROR("ep combination not supported yet");
723 throw std::runtime_error("ep combination not supported yet");
724 }
725
728 }
731 }
733
734 if (m_useGainCorrection == AUTO) {
739 }
740 else {
741 ATH_MSG_DEBUG("initializing gain tool");
744 }
745 }
746 else if (m_useGainCorrection == 1) {
752 "cannot instantiate gain tool for this model (you can only disable "
753 "the gain tool, but not enable it)");
754 }
755 else {
757 "initializing gain tool for run2 final precision recommendations");
759 "Gain corrections required but Zee scales are derived without Gain, "
760 "will cause inconsistency!");
761 std::string gain_tool_run_2_filename = PathResolverFindCalibFile(
762 "ElectronPhotonFourMomentumCorrection/v29/"
763 "gain_uncertainty_specialRun.root");
764 m_gain_tool_run2 = std::make_unique<egGain::GainUncertainty>(
765 gain_tool_run_2_filename, false, "GainCorrection",
767 m_gain_tool_run2->msg().setLevel(this->msg().level());
768 }
769 }
770
774 // ADC non linearity correction
777 std::string adcLinearityCorr_filename = PathResolverFindCalibFile(
778 "ElectronPhotonFourMomentumCorrection/v25/linearity_ADC.root");
779 m_ADCLinearity_tool = std::make_shared<LinearityADC>(adcLinearityCorr_filename);
780 m_ADCLinearity_tool->msg().setLevel(this->msg().level());
781 m_rootTool->setADCTool(m_ADCLinearity_tool);
782 } else {
784 m_ESModel + " recommendations use ADC corrections for scale "
785 "derivation. Disabling the ADCLinearity flag will create "
786 "inconsistency!");
787 }
788
791 m_rootTool->setApplyLeakageCorrection(true);
792 }
793
794 // Calo distortion phi unif correction
798 std::string phiUnifCorrfileName = PathResolverFindCalibFile(
799 "ElectronPhotonFourMomentumCorrection/v33/"
800 "egammaEnergyCorrectionData.root");
801 std::unique_ptr<TFile> fCorr(
802 TFile::Open(phiUnifCorrfileName.c_str(), "READ"));
804 dynamic_cast<TH2*>(fCorr->Get("CaloDistortionPhiUniformityCorrection/"
805 "es2023_R22_Run2_v0/h2DcorrPhiUnif")));
806 m_caloDistPhiUnifCorr->SetDirectory(nullptr);
807 } else {
809 m_ESModel + " recommendations use CaloDistPhiUnif for scale "
810 "derivation. Disabling the CaloDistPhiUnif flag will create "
811 "inconsistency!");
812 }
813 }
814
815 // No scale correction for release 21 ==> obsolete
816 /*if (m_ESModel == "es2017_R21_PRE"){
817 m_doScaleCorrection = 0;
818 }
819 */
820
821 ATH_MSG_INFO("ESModel: " << m_ESModel);
822 ATH_MSG_INFO("ResolutionType: " << m_ResolutionType);
823 ATH_MSG_INFO("decorrelation Model: " << m_decorrelation_model_name);
824 ATH_MSG_DEBUG("layer correction = " << m_useLayerCorrection);
825 ATH_MSG_DEBUG("PS correction = " << m_usePSCorrection);
826 ATH_MSG_DEBUG("S12 correction = " << m_useS12Correction);
827 ATH_MSG_DEBUG("Sacc correction = " << m_useSaccCorrection);
828 ATH_MSG_DEBUG("intermodule correction = " << m_useIntermoduleCorrection);
829 ATH_MSG_DEBUG("phi uniformity correction = " << m_usePhiUniformCorrection);
830 ATH_MSG_DEBUG("distorted calo phi uniformity correction = "
832 ATH_MSG_DEBUG("gain correction = " << m_useGainCorrection);
833 ATH_MSG_DEBUG("ADC non-linearity correction = " << m_doADCLinearityCorrection);
834 ATH_MSG_DEBUG("leakage correction for photons = " << m_doLeakageCorrection);
835 ATH_MSG_DEBUG("smearing = " << m_doSmearing);
836 ATH_MSG_DEBUG("insitu scales = " << m_doScaleCorrection);
837 ATH_MSG_DEBUG("ep combination = " << m_use_ep_combination);
838 ATH_MSG_DEBUG("use MVA calibration = " << m_use_mva_calibration);
840 "use temperature correction 2015 = " << m_use_temp_correction201215);
841 ATH_MSG_DEBUG("use uA2MeV correction 2015 1/2 week = "
843
845
846 applySystematicVariation(CP::SystematicSet())
847 .ignore(); // this set the flags for the internal tool without
848 // systematics
849 CP::SystematicRegistry& registry = CP::SystematicRegistry::getInstance();
850 if (registry.registerSystematics(*this) != StatusCode::SUCCESS)
851 return StatusCode::FAILURE;
852
853 if (m_onlyElectrons.value() && m_onlyPhotons.value()) {
854 ATH_MSG_ERROR("Cannot select both onlyElectrons and onlyPhotons");
855 return StatusCode::FAILURE;
856 }
857 if (m_onlyElectrons.value()) {
860 resetAccessor (m_accessors->electronTrackAcc, *this, "trackParticleLinks");
861 }
862 }
863 if (m_onlyPhotons.value()) {
865 resetAccessor (m_accessors->photonVertexAcc, *this, "vertexLinks");
866 }
867 if (m_decorateEmva)
868 resetAccessor (m_accessors->decEmva, *this, "E_mva_only");
869
870 ANA_CHECK (initializeColumns ());
871
872 return StatusCode::SUCCESS;
873}
#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 resetAccessor(AccessorTemplate< CI, CT, CAM, CM > &accessor, ColumnarTool< CM > &columnBase, const std::string &name, ColumnInfo &&info={})
reset a column accessor to point to a new column
void resetPhoton(MomentumAccessors< CI, CM > &accessors, ColumnarTool< CM > &columnarTool)
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 2192 of file EgammaCalibrationAndSmearingTool.cxx.

2193 {
2194
2195 // Intermodule Widening Correction: E_corr = E / (a' - b' * ((1 / (1 +
2196 // exp((phi_mod - 2 * pi / 32) * c))) * (1 / (1 + exp((phi_mod - 2 * pi / 32)
2197 // * (d)))))) (phi_min, phi_max) : [a' = a / a, b' = b / a, c, d]
2198
2199 double Ecl_corr = 0.;
2200 int DivInt = 0;
2201 double pi = M_PI;
2202
2215
2216 double phi_mod = 0;
2217 if (phi < 0)
2218 phi_mod = fmod(phi, 2 * pi / 16.) + pi / 8.;
2219 else
2220 phi_mod = fmod(phi, 2 * pi / 16.);
2221
2222 // The correction concerns only the barrel
2223 if (std::abs(eta) <= 1.37) {
2224
2225 if (phi < (-7 * pi / 8) && phi > (-1 * pi))
2226 Ecl_corr =
2227 Ecl /
2228 (1 - 0.1086 *
2229 ((1 / (1 + exp((phi_mod - 2 * pi / 32.) * 175.2759))) *
2230 (1 / (1 + exp((phi_mod - 2 * pi / 32.) * (-189.3612))))));
2231 if (phi < (-6 * pi / 8) && phi > (-7 * pi / 8))
2232 Ecl_corr =
2233 Ecl /
2234 (1 - 0.0596 *
2235 ((1 / (1 + exp((phi_mod - 2 * pi / 32.) * 170.8305))) *
2236 (1 / (1 + exp((phi_mod - 2 * pi / 32.) * (-233.3782))))));
2237 if (phi < (-5 * pi / 8) && phi > (-6 * pi / 8))
2238 Ecl_corr =
2239 Ecl /
2240 (1 - 0.0596 *
2241 ((1 / (1 + exp((phi_mod - 2 * pi / 32.) * 147.1451))) *
2242 (1 / (1 + exp((phi_mod - 2 * pi / 32.) * (-139.3386))))));
2243 if (phi < (-4 * pi / 8) && phi > (-5 * pi / 8))
2244 Ecl_corr =
2245 Ecl /
2246 (1 - 0.0583 *
2247 ((1 / (1 + exp((phi_mod - 2 * pi / 32.) * 168.4644))) *
2248 (1 / (1 + exp((phi_mod - 2 * pi / 32.) * (-246.2897))))));
2249 if (phi < (-3 * pi / 8) && phi > (-4 * pi / 8))
2250 Ecl_corr =
2251 Ecl /
2252 (1 - 0.0530 *
2253 ((1 / (1 + exp((phi_mod - 2 * pi / 32.) * 177.6703))) *
2254 (1 / (1 + exp((phi_mod - 2 * pi / 32.) * (-198.3227))))));
2255 if (phi < (-2 * pi / 8) && phi > (-3 * pi / 8))
2256 Ecl_corr =
2257 Ecl /
2258 (1 - 0.0672 *
2259 ((1 / (1 + exp((phi_mod - 2 * pi / 32.) * 145.0693))) *
2260 (1 / (1 + exp((phi_mod - 2 * pi / 32.) * (-242.1771))))));
2261 if (phi < (-1 * pi / 8) && phi > (-2 * pi / 8))
2262 Ecl_corr =
2263 Ecl /
2264 (1 - 0.0871 *
2265 ((1 / (1 + exp((phi_mod - 2 * pi / 32.) * 132.3303))) *
2266 (1 / (1 + exp((phi_mod - 2 * pi / 32.) * (-166.1833))))));
2267 if (phi < (0 * pi / 8) && phi > (-1 * pi / 8))
2268 Ecl_corr =
2269 Ecl /
2270 (1 - 0.0948 *
2271 ((1 / (1 + exp((phi_mod - 2 * pi / 32.) * 127.6780))) *
2272 (1 / (1 + exp((phi_mod - 2 * pi / 32.) * (-150.0700))))));
2273 if (phi < (1 * pi / 8) && phi > (0 * pi / 8))
2274 Ecl_corr =
2275 Ecl /
2276 (1 - 0.1166 *
2277 ((1 / (1 + exp((phi_mod - 2 * pi / 32.) * 172.0679))) *
2278 (1 / (1 + exp((phi_mod - 2 * pi / 32.) * (-235.3293))))));
2279 if (phi < (2 * pi / 8) && phi > (1 * pi / 8))
2280 Ecl_corr =
2281 Ecl /
2282 (1 - 0.1172 *
2283 ((1 / (1 + exp((phi_mod - 2 * pi / 32.) * 190.3524))) *
2284 (1 / (1 + exp((phi_mod - 2 * pi / 32.) * (-198.9400))))));
2285 if (phi < (3 * pi / 8) && phi > (2 * pi / 8))
2286 Ecl_corr =
2287 Ecl /
2288 (1 - 0.1292 *
2289 ((1 / (1 + exp((phi_mod - 2 * pi / 32.) * 158.0540))) *
2290 (1 / (1 + exp((phi_mod - 2 * pi / 32.) * (-165.3893))))));
2291 if (phi < (4 * pi / 8) && phi > (3 * pi / 8))
2292 Ecl_corr =
2293 Ecl /
2294 (1 - 0.1557 *
2295 ((1 / (1 + exp((phi_mod - 2 * pi / 32.) * 162.2793))) *
2296 (1 / (1 + exp((phi_mod - 2 * pi / 32.) * (-133.5131))))));
2297 if (phi < (5 * pi / 8) && phi > (4 * pi / 8))
2298 Ecl_corr =
2299 Ecl /
2300 (1 - 0.1659 *
2301 ((1 / (1 + exp((phi_mod - 2 * pi / 32.) * 180.5270))) *
2302 (1 / (1 + exp((phi_mod - 2 * pi / 32.) * (-168.5074))))));
2303 if (phi < (6 * pi / 8) && phi > (5 * pi / 8))
2304 Ecl_corr =
2305 Ecl /
2306 (1 - 0.1123 *
2307 ((1 / (1 + exp((phi_mod - 2 * pi / 32.) * 128.2277))) *
2308 (1 / (1 + exp((phi_mod - 2 * pi / 32.) * (-154.4455))))));
2309 if (phi < (7 * pi / 8) && phi > (6 * pi / 8))
2310 Ecl_corr =
2311 Ecl /
2312 (1 - 0.1394 *
2313 ((1 / (1 + exp((phi_mod - 2 * pi / 32.) * 192.1216))) *
2314 (1 / (1 + exp((phi_mod - 2 * pi / 32.) * (-198.0727))))));
2315 if (phi < (8 * pi / 8) && phi > (7 * pi / 8))
2316 Ecl_corr =
2317 Ecl /
2318 (1 - 0.1001 *
2319 ((1 / (1 + exp((phi_mod - 2 * pi / 32.) * 199.1735))) *
2320 (1 / (1 + exp((phi_mod - 2 * pi / 32.) * (-176.4056))))));
2321 }
2322
2323 // No correction for the EC
2324 else {
2325 Ecl_corr = Ecl;
2326 }
2327
2328 }
2329
2330 else {
2331
2332 // Definitions of module folding into four quarters (top, left, bottom and
2333 // right)
2334
2335 DivInt = (int)(phi / ((2 * pi) / 16.));
2336 double phi_mod = phi - DivInt * (2 * pi / 16.);
2337
2338 // Centring on the intermodule --> phi_mod will now be in [0,0.4]
2339 if (phi_mod < 0)
2340 phi_mod += pi / 8.;
2341
2342 // The correction concerns only the barrel
2343 if (std::abs(eta) <= 1.4) {
2344
2345 // Top quarter
2346 if (phi < (3 * pi) / 4. && phi >= pi / 4.) {
2347 Ecl_corr =
2348 Ecl / (1 - 0.131 * ((1 / (1 + exp((phi_mod - 0.2) * 199.08))) *
2349 (1 / (1 + exp((phi_mod - 0.2) * (-130.36))))));
2350 }
2351
2352 // Right quarter
2353 if (phi < pi / 4. && phi >= -pi / 4.) {
2354 Ecl_corr =
2355 Ecl / (1 - 0.0879 * ((1 / (1 + exp((phi_mod - 0.2) * 221.01))) *
2356 (1 / (1 + exp((phi_mod - 0.2) * (-149.51))))));
2357 }
2358 // Bottom quarter
2359 if (phi < -pi / 4. && phi >= (-3 * pi) / 4.) {
2360 Ecl_corr =
2361 Ecl / (1 - 0.0605 * ((1 / (1 + exp((phi_mod - 0.2) * 281.37))) *
2362 (1 / (1 + exp((phi_mod - 0.2) * (-170.29))))));
2363 }
2364 // Left quarter
2365 if ((phi < (-3 * pi) / 4.) || (phi >= (3 * pi) / 4.)) {
2366 Ecl_corr =
2367 Ecl / (1 - 0.102 * ((1 / (1 + exp((phi_mod - 0.2) * 235.37))) *
2368 (1 / (1 + exp((phi_mod - 0.2) * (-219.04))))));
2369 }
2370 }
2371
2372 // No correction for the EC
2373 else {
2374 Ecl_corr = Ecl;
2375 }
2376 }
2377
2378 return Ecl_corr;
2379}
#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 1286 of file EgammaCalibrationAndSmearingTool.cxx.

1287 {
1288 CP::SystematicSet sys = affectingSystematics();
1289 return sys.find(systematic) != sys.end();
1290}
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 1260 of file EgammaCalibrationAndSmearingTool.cxx.

1261 {
1262 const Accessors& acc = *m_accessors;
1263 return acc.eventTypeAcc (event_info, xAOD::EventInfo::IS_SIMULATION)
1266}

◆ 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 1248 of file EgammaCalibrationAndSmearingTool.cxx.

1249 {
1250 const Accessors& acc = *m_accessors;
1251 if (!acc.eventTypeAcc (event_info, xAOD::EventInfo::IS_SIMULATION))
1253 if (m_currentScalePredicate(*this,p))
1255 else
1257}

◆ 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 2138 of file EgammaCalibrationAndSmearingTool.cxx.

2139 {
2140 return affectingSystematics();
2141}

◆ 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 927 of file EgammaCalibrationAndSmearingTool.cxx.

929 {
930 return m_rootTool->resolution(energy, cl_eta, cl_etaCalo, ptype, withCT,
931 false);
932}

◆ setPt()

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

Definition at line 1231 of file EgammaCalibrationAndSmearingTool.cxx.

1231 {
1232 const double new_energy2 = energy * energy;
1233 const double m = m_accessors->momAcc.m (input);
1234 const double m2 = m * m;
1235 const double p2 = new_energy2 > m2 ? new_energy2 - m2 : 0.;
1236 m_accessors->ptOutDec (input) = sqrt(p2) / cosh(m_accessors->etaAcc (input));
1237 ATH_MSG_DEBUG("after setting pt, energy = " << m_accessors->momAcc.e (input));
1238}

◆ 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 1305 of file EgammaCalibrationAndSmearingTool.cxx.

1305 {
1306 const EgammaPredicate always = [](const EgammaCalibrationAndSmearingTool&, columnar::EgammaId) { return true; };
1307
1308 // Try to simplify a bit for the ones that are fully correlate in eta,
1309 // whatever the model and that are not included in the macros including
1310 // - ADC non linearity
1311 // - L2Gain
1312 // - Leakage
1313 // - Conversion related
1314 // - TopoCluster threshold
1315 // - AF2
1316 // - PS_BARREL_B12
1317 // - S12EXTRALASTETABINRUN2
1318 // - ZEESTAT
1319 // - Run3 pre OFC + EXTRA
1320 if (m_decorrelation_model_scale == ScaleDecorrelation::FULL_ETA_CORRELATED ||
1321 m_decorrelation_model_scale == ScaleDecorrelation::FULL) {
1322 // Electron leakage, ADCLin, convReco only in final run2 recommendations
1326 // systematic related to ADC non linearity correction. Before 2022, there
1327 // was not correction, nor related systematic
1329 m_syst_description[CP::SystematicVariation("EG_SCALE_ADCLIN", +1)] =
1331 m_syst_description[CP::SystematicVariation("EG_SCALE_ADCLIN", -1)] =
1333 }
1334 // Gain splitted uncertainty
1335 m_syst_description[CP::SystematicVariation("EG_SCALE_L2MEDIUMGAIN", +1)] =
1337 m_syst_description[CP::SystematicVariation("EG_SCALE_L2MEDIUMGAIN", -1)] =
1339 m_syst_description[CP::SystematicVariation("EG_SCALE_L2LOWGAIN", +1)] =
1341 m_syst_description[CP::SystematicVariation("EG_SCALE_L2LOWGAIN", -1)] =
1343
1344 // Electron leakage
1345 m_syst_description[CP::SystematicVariation("EG_SCALE_LEAKAGEELEC", +1)] =
1347 m_syst_description[CP::SystematicVariation("EG_SCALE_LEAKAGEELEC", -1)] =
1349
1350 // Conversion related
1351 m_syst_description[CP::SystematicVariation("PH_SCALE_CONVRECO", +1)] =
1353 m_syst_description[CP::SystematicVariation("PH_SCALE_CONVRECO", -1)] =
1355 }
1356 // The equivalent of convReco (convefficiency and convfakerate) for other
1357 // models
1358 else {
1359 m_syst_description[CP::SystematicVariation("PH_SCALE_CONVEFFICIENCY",
1360 +1)] =
1362 m_syst_description[CP::SystematicVariation("PH_SCALE_CONVEFFICIENCY",
1363 -1)] =
1365 m_syst_description[CP::SystematicVariation("PH_SCALE_CONVFAKERATE", +1)] =
1367 m_syst_description[CP::SystematicVariation("PH_SCALE_CONVFAKERATE", -1)] =
1369 }
1370
1371 // additional systematics for R22 OFC and MC21 pre and bulk
1373 m_syst_description[CP::SystematicVariation("EG_SCALE_OFC", +1)] =
1375 m_syst_description[CP::SystematicVariation("EG_SCALE_OFC", -1)] =
1377
1378 m_syst_description[CP::SystematicVariation("EG_SCALE_EXTRARUN3PRE", +1)] =
1380 m_syst_description[CP::SystematicVariation("EG_SCALE_EXTRARUN3PRE", -1)] =
1382 }
1383
1394
1395 // topo clustr threshold systematics aded to release 21 recommendations
1396 m_syst_description[CP::SystematicVariation("EG_SCALE_TOPOCLUSTER_THRES",
1397 +1)] =
1399 m_syst_description[CP::SystematicVariation("EG_SCALE_TOPOCLUSTER_THRES",
1400 -1)] =
1402
1403 // AF3 for run3 models: es2022_R22_PRE and esmodel >= es2023_R22_Run2_v1
1404 // although we prevent AF for es2022_R22_PRE and es2024_Run3_ofc0_v0
1405 // AF3 are still technically added in the tool
1406 // but normally uncertainty will be 0
1408 m_syst_description[CP::SystematicVariation("EG_SCALE_AF3", +1)] =
1410 m_syst_description[CP::SystematicVariation("EG_SCALE_AF3", -1)] =
1412 }
1413 else {
1414 // and extra AF2 systematics for release 21 recommendations - Moriond 2018
1415 // - pending proper AF2 to FullSim correction with release 21
1416 m_syst_description[CP::SystematicVariation("EG_SCALE_AF2", +1)] =
1418 m_syst_description[CP::SystematicVariation("EG_SCALE_AF2", -1)] =
1420 }
1421 }
1422
1423 // PS correlated barrel uncertainty
1432 m_syst_description[CP::SystematicVariation("EG_SCALE_PS_BARREL_B12",
1433 +1)] =
1435 m_syst_description[CP::SystematicVariation("EG_SCALE_PS_BARREL_B12",
1436 -1)] =
1438 }
1439
1440 // additional systematic for S12 last eta bin run2
1445 m_syst_description[CP::SystematicVariation(
1446 "EG_SCALE_S12EXTRALASTETABINRUN2", +1)] =
1448 m_syst_description[CP::SystematicVariation(
1449 "EG_SCALE_S12EXTRALASTETABINRUN2", -1)] =
1451 }
1452
1453 // Zee stat, if for FULL we do not ask for m_use_full_statistical_error
1455 ScaleDecorrelation::FULL_ETA_CORRELATED or
1457 // return 1 variation only, fully correlated in eta, equal to the correct
1458 // value but scaled by sqrt(number of bins) the scaling is done by the old
1459 // tool
1460 m_syst_description[CP::SystematicVariation("EG_SCALE_ZEESTAT", +1)] =
1462 m_syst_description[CP::SystematicVariation("EG_SCALE_ZEESTAT", -1)] =
1464 }
1465 }
1466 if (m_decorrelation_model_scale == ScaleDecorrelation::ONENP) {
1467 // TODO: independet implementation of ALL UP looping on all the variations
1468 m_syst_description[CP::SystematicVariation("EG_SCALE_ALL", +1)] =
1470 m_syst_description[CP::SystematicVariation("EG_SCALE_ALL", -1)] =
1472
1473 // to be consistent with other schemes, we add
1474 // extra AF systematics in addition to the 1NP
1481 m_syst_description[CP::SystematicVariation("EG_SCALE_AF2", +1)] =
1483 m_syst_description[CP::SystematicVariation("EG_SCALE_AF2", -1)] =
1485 }
1487 m_syst_description[CP::SystematicVariation("EG_SCALE_AF3", +1)] =
1489 m_syst_description[CP::SystematicVariation("EG_SCALE_AF3", -1)] =
1491 }
1492 }
1493 else if (m_decorrelation_model_scale ==
1494 ScaleDecorrelation::FULL_ETA_CORRELATED) {
1495// all the physical effects separately, considered as fully correlated in eta
1497#define SYSMACRO(name, fullcorrelated, decorrelation, flagup, flagdown) \
1498 m_syst_description[CP::SystematicVariation(#name, +1)] = \
1499 SysInfo{always, flagup}; \
1500 m_syst_description[CP::SystematicVariation(#name, -1)] = \
1501 SysInfo{always, flagdown};
1502#include "ElectronPhotonFourMomentumCorrection/systematics_es2024_Run3_v0.def"
1503#undef SYSMACRO
1504 }
1505 else {
1506// common systematics for all the esmodels
1507#define SYSMACRO(name, fullcorrelated, decorrelation, flagup, flagdown) \
1508 m_syst_description[CP::SystematicVariation(#name, +1)] = \
1509 SysInfo{always, flagup}; \
1510 m_syst_description[CP::SystematicVariation(#name, -1)] = \
1511 SysInfo{always, flagdown};
1512#include "ElectronPhotonFourMomentumCorrection/systematics_S12_2022.def"
1513#undef SYSMACRO
1514 }
1515
1519 m_syst_description[CP::SystematicVariation("EG_SCALE_LARCALIB", +1)] =
1521 m_syst_description[CP::SystematicVariation("EG_SCALE_LARCALIB", -1)] =
1523 m_syst_description[CP::SystematicVariation("EG_SCALE_L2GAIN", +1)] =
1525 m_syst_description[CP::SystematicVariation("EG_SCALE_L2GAIN", -1)] =
1527 }
1528
1529 // additional systematics for S12 run2
1539 m_syst_description[CP::SystematicVariation(
1540 "EG_SCALE_LARCALIB_EXTRA2015PRE", +1)] =
1542 m_syst_description[CP::SystematicVariation(
1543 "EG_SCALE_LARCALIB_EXTRA2015PRE", -1)] =
1545 }
1546
1547 // additional systematics for temperature run1->run2
1553 m_syst_description[CP::SystematicVariation(
1554 "EG_SCALE_LARTEMPERATURE_EXTRA2015PRE", +1)] =
1556 m_syst_description[CP::SystematicVariation(
1557 "EG_SCALE_LARTEMPERATURE_EXTRA2015PRE", -1)] =
1559 }
1560
1561 // additional systematic for temperature 2015->2016
1563 m_syst_description[CP::SystematicVariation(
1564 "EG_SCALE_LARTEMPERATURE_EXTRA2016PRE", +1)] =
1566 m_syst_description[CP::SystematicVariation(
1567 "EG_SCALE_LARTEMPERATURE_EXTRA2016PRE", -1)] =
1569 }
1570
1571 // additional systematic for PP0 region
1587 m_syst_description[CP::SystematicVariation("EG_SCALE_MATPP0", +1)] =
1589 m_syst_description[CP::SystematicVariation("EG_SCALE_MATPP0", -1)] =
1591 }
1592
1593 // systematic related to wtots1
1609 m_syst_description[CP::SystematicVariation("EG_SCALE_WTOTS1", +1)] =
1611 m_syst_description[CP::SystematicVariation("EG_SCALE_WTOTS1", -1)] =
1613 }
1614
1615 // systematic for the scintillators
1634 // scintillator systematics
1635 m_syst_description[CP::SystematicVariation("EG_SCALE_E4SCINTILLATOR",
1636 +1)] =
1638 m_syst_description[CP::SystematicVariation("EG_SCALE_E4SCINTILLATOR",
1639 -1)] =
1641 }
1642
1643 } else if (m_decorrelation_model_scale ==
1644 ScaleDecorrelation::ONENP_PLUS_UNCONR) {
1645// qsum of all variations correlated 8/13 TeV + uncorrelated (additional
1646// systematics for 2015PRE or 2016) all the physical effects separately,
1647// considered as fully correlated in eta
1648// TODO: fix for es2017
1649#define SYSMACRO(name, fullcorrelated, decorrelation, flagup, flagdown) \
1650 m_syst_description[CP::SystematicVariation(#name, +1)] = \
1651 SysInfo{always, flagup}; \
1652 m_syst_description[CP::SystematicVariation(#name, -1)] = \
1653 SysInfo{always, flagdown};
1654#include "ElectronPhotonFourMomentumCorrection/systematics_1NPCOR_PLUS_UNCOR.def"
1655#undef SYSMACRO
1656
1657 // additional systematic for S12 last eta bin run2 - not needed anymore for
1658 // last 20.7 model since it is part of bin per bin E1/E2 uncertainty in root
1659 // file
1663 m_syst_description[CP::SystematicVariation(
1664 "EG_SCALE_S12EXTRALASTETABINRUN2", +1)] =
1666 m_syst_description[CP::SystematicVariation(
1667 "EG_SCALE_S12EXTRALASTETABINRUN2", -1)] =
1669 }
1670
1671 } else if (m_decorrelation_model_scale == ScaleDecorrelation::FULL) {
1672 using pairvector = std::vector<std::pair<double, double>>;
1673 const pairvector decorrelation_bins_BE = {{0., 1.45}, {1.52, 2.5}};
1674 const std::vector<double> decorrelation_edges_TWELVE = {
1675 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};
1676 std::vector<double> decorrelation_edges_MODULE = {
1677 0., 0.2, 0.4, 0.6, 0.8, 1.0, 1.2, 1.37, 1.52, 1.8};
1678 const std::vector<double> decorrelation_edges_MATERIAL = {0.0, 1.1, 1.5,
1679 2.1, 2.5};
1680 std::vector<double> decorrelation_edges_S12_EXTRARUN3 = {
1681 0., 0.8, 1.5, 2.5};
1682
1683 std::vector<double> decorrelation_edges_S12;
1684 // for es2018_R21_v1 : 4 eta bins for muon E1/E2 uncertainty correlation
1686 decorrelation_edges_S12.resize(5);
1687 decorrelation_edges_S12 = {0., 1.35, 1.5, 2.4, 2.5};
1691 decorrelation_edges_S12.resize(8);
1692 decorrelation_edges_S12 = {0., 0.6, 1.0, 1.35, 1.5, 1.8, 2.4, 2.5};
1693 //
1694 // PS scale from muons, so "crack" is a bit different
1695 decorrelation_edges_MODULE[7] = 1.4;
1696 decorrelation_edges_MODULE[8] = 1.5;
1697 }
1698 // for previous run 2 muon calibration with 20.7, 5 eta bins for E1/E2
1699 // uncertainty correlation
1700 else {
1701 decorrelation_edges_S12.resize(6);
1702 decorrelation_edges_S12 = {0., 0.6, 1.4, 1.5, 2.4, 2.5};
1703 }
1704
1716#define SYSMACRO(name, fullcorrelated, decorrelation, flagup, flagdown) \
1717 if (bool(fullcorrelated)) { \
1718 m_syst_description[CP::SystematicVariation(#name, +1)] = \
1719 SysInfo{always, flagup}; \
1720 m_syst_description[CP::SystematicVariation(#name, -1)] = \
1721 SysInfo{always, flagdown}; \
1722 } else { \
1723 int i = 0; \
1724 for (const auto& p : AbsEtaCaloPredicatesFactory(decorrelation)) { \
1725 m_syst_description[CP::SystematicVariation( \
1726 #name "__ETABIN" + std::to_string(i), +1)] = SysInfo{p, flagup}; \
1727 m_syst_description[CP::SystematicVariation( \
1728 #name "__ETABIN" + std::to_string(i), -1)] = SysInfo{p, flagdown}; \
1729 i += 1; \
1730 } \
1731 }
1732#include "ElectronPhotonFourMomentumCorrection/systematics.def"
1733#undef SYSMACRO
1736#define SYSMACRO(name, fullcorrelated, decorrelation, flagup, flagdown) \
1737 if (bool(fullcorrelated)) { \
1738 m_syst_description[CP::SystematicVariation(#name, +1)] = \
1739 SysInfo{always, flagup}; \
1740 m_syst_description[CP::SystematicVariation(#name, -1)] = \
1741 SysInfo{always, flagdown}; \
1742 } else { \
1743 int i = 0; \
1744 for (const auto& p : AbsEtaCaloPredicatesFactory(decorrelation)) { \
1745 m_syst_description[CP::SystematicVariation( \
1746 #name "__ETABIN" + std::to_string(i), +1)] = SysInfo{p, flagup}; \
1747 m_syst_description[CP::SystematicVariation( \
1748 #name "__ETABIN" + std::to_string(i), -1)] = SysInfo{p, flagdown}; \
1749 i += 1; \
1750 } \
1751 }
1752#include "ElectronPhotonFourMomentumCorrection/systematics_S12_2022.def"
1753#undef SYSMACRO
1755#define SYSMACRO(name, fullcorrelated, decorrelation, flagup, flagdown) \
1756 if (bool(fullcorrelated)) { \
1757 m_syst_description[CP::SystematicVariation(#name, +1)] = \
1758 SysInfo{always, flagup}; \
1759 m_syst_description[CP::SystematicVariation(#name, -1)] = \
1760 SysInfo{always, flagdown}; \
1761 } else { \
1762 int i = 0; \
1763 for (const auto& p : AbsEtaCaloPredicatesFactory(decorrelation)) { \
1764 m_syst_description[CP::SystematicVariation( \
1765 #name "__ETABIN" + std::to_string(i), +1)] = SysInfo{p, flagup}; \
1766 m_syst_description[CP::SystematicVariation( \
1767 #name "__ETABIN" + std::to_string(i), -1)] = SysInfo{p, flagdown}; \
1768 i += 1; \
1769 } \
1770 }
1771#include "ElectronPhotonFourMomentumCorrection/systematics_es2024_Run3_v0.def"
1772#undef SYSMACRO
1773 } else {
1774#define SYSMACRO(name, fullcorrelated, decorrelation, flagup, flagdown) \
1775 if (bool(fullcorrelated)) { \
1776 m_syst_description[CP::SystematicVariation(#name, +1)] = \
1777 SysInfo{always, flagup}; \
1778 m_syst_description[CP::SystematicVariation(#name, -1)] = \
1779 SysInfo{always, flagdown}; \
1780 } else { \
1781 int i = 0; \
1782 for (const auto& p : AbsEtaCaloPredicatesFactory(decorrelation)) { \
1783 m_syst_description[CP::SystematicVariation( \
1784 #name "__ETABIN" + std::to_string(i), +1)] = SysInfo{p, flagup}; \
1785 m_syst_description[CP::SystematicVariation( \
1786 #name "__ETABIN" + std::to_string(i), -1)] = SysInfo{p, flagdown}; \
1787 i += 1; \
1788 } \
1789 }
1790#include "ElectronPhotonFourMomentumCorrection/systematics_S12.def"
1791#undef SYSMACRO
1792 } // else
1793
1795 // statistical error, decorrelate in *all* the bins
1796 int i = 0;
1797 const TAxis& axis_statistical_error(m_rootTool->get_ZeeStat_eta_axis());
1798 for (int ibin = 1; ibin <= axis_statistical_error.GetNbins(); ++ibin) {
1800 axis_statistical_error.GetBinLowEdge(ibin),
1801 axis_statistical_error.GetBinLowEdge(ibin + 1));
1802 m_syst_description[CP::SystematicVariation(
1803 "EG_SCALE_ZEESTAT__ETABIN" + std::to_string(i), +1)] =
1805 m_syst_description[CP::SystematicVariation(
1806 "EG_SCALE_ZEESTAT__ETABIN" + std::to_string(i), -1)] =
1808 ++i;
1809 }
1810 }
1811
1812 // additional systematics for S12 run2
1822 m_syst_description[CP::SystematicVariation(
1823 "EG_SCALE_LARCALIB_EXTRA2015PRE__ETABIN0", +1)] =
1826 m_syst_description[CP::SystematicVariation(
1827 "EG_SCALE_LARCALIB_EXTRA2015PRE__ETABIN0", -1)] =
1830 m_syst_description[CP::SystematicVariation(
1831 "EG_SCALE_LARCALIB_EXTRA2015PRE__ETABIN1", +1)] =
1832 SysInfo{AbsEtaCaloPredicateFactory({1.45, 2.47}),
1834 m_syst_description[CP::SystematicVariation(
1835 "EG_SCALE_LARCALIB_EXTRA2015PRE__ETABIN1", -1)] =
1836 SysInfo{AbsEtaCaloPredicateFactory({1.45, 2.47}),
1838 m_syst_description[CP::SystematicVariation(
1839 "EG_SCALE_LARCALIB_EXTRA2015PRE__ETABIN2", +1)] =
1842 m_syst_description[CP::SystematicVariation(
1843 "EG_SCALE_LARCALIB_EXTRA2015PRE__ETABIN2", -1)] =
1846 }
1847
1848 // additional systematics for temperature run1->run2
1854 m_syst_description[CP::SystematicVariation(
1855 "EG_SCALE_LARTEMPERATURE_EXTRA2015PRE__ETABIN0", +1)] =
1856 SysInfo{AbsEtaCaloPredicateFactory(decorrelation_bins_BE[0]),
1858 m_syst_description[CP::SystematicVariation(
1859 "EG_SCALE_LARTEMPERATURE_EXTRA2015PRE__ETABIN0", -1)] =
1860 SysInfo{AbsEtaCaloPredicateFactory(decorrelation_bins_BE[0]),
1862 m_syst_description[CP::SystematicVariation(
1863 "EG_SCALE_LARTEMPERATURE_EXTRA2015PRE__ETABIN1", +1)] =
1864 SysInfo{AbsEtaCaloPredicateFactory(decorrelation_bins_BE[1]),
1866 m_syst_description[CP::SystematicVariation(
1867 "EG_SCALE_LARTEMPERATURE_EXTRA2015PRE__ETABIN1", -1)] =
1868 SysInfo{AbsEtaCaloPredicateFactory(decorrelation_bins_BE[1]),
1870 }
1871
1872 // additional systematic for temperature 2015->2016
1874 m_syst_description[CP::SystematicVariation(
1875 "EG_SCALE_LARTEMPERATURE_EXTRA2016PRE__ETABIN0", +1)] =
1876 SysInfo{AbsEtaCaloPredicateFactory(decorrelation_bins_BE[0]),
1878 m_syst_description[CP::SystematicVariation(
1879 "EG_SCALE_LARTEMPERATURE_EXTRA2016PRE__ETABIN1", +1)] =
1880 SysInfo{AbsEtaCaloPredicateFactory(decorrelation_bins_BE[1]),
1882 m_syst_description[CP::SystematicVariation(
1883 "EG_SCALE_LARTEMPERATURE_EXTRA2016PRE__ETABIN0", -1)] =
1884 SysInfo{AbsEtaCaloPredicateFactory(decorrelation_bins_BE[0]),
1886 m_syst_description[CP::SystematicVariation(
1887 "EG_SCALE_LARTEMPERATURE_EXTRA2016PRE__ETABIN1", -1)] =
1888 SysInfo{AbsEtaCaloPredicateFactory(decorrelation_bins_BE[1]),
1890 }
1891
1892 // additional systematic for PP0 region
1908 m_syst_description[CP::SystematicVariation("EG_SCALE_MATPP0__ETABIN0",
1909 +1)] = SysInfo{
1911 m_syst_description[CP::SystematicVariation("EG_SCALE_MATPP0__ETABIN1",
1912 +1)] = SysInfo{
1914 m_syst_description[CP::SystematicVariation("EG_SCALE_MATPP0__ETABIN0",
1915 -1)] = SysInfo{
1917 m_syst_description[CP::SystematicVariation("EG_SCALE_MATPP0__ETABIN1",
1918 -1)] =
1921 }
1922
1923 // systematic related to wtots1
1936 m_syst_description[CP::SystematicVariation("EG_SCALE_WTOTS1", +1)] =
1938 m_syst_description[CP::SystematicVariation("EG_SCALE_WTOTS1", -1)] =
1940 }
1941
1942 // systematic related to wtots1, decorrelate eta bin [1.52,1.82] from rest
1946 m_syst_description[CP::SystematicVariation("EG_SCALE_WTOTS1__ETABIN0",
1947 +1)] =
1948 SysInfo{DoubleOrAbsEtaCaloPredicate(0, 1.52, 1.82, 2.47),
1950 m_syst_description[CP::SystematicVariation("EG_SCALE_WTOTS1__ETABIN0",
1951 -1)] =
1952 SysInfo{DoubleOrAbsEtaCaloPredicate(0, 1.52, 1.82, 2.47),
1954 m_syst_description[CP::SystematicVariation("EG_SCALE_WTOTS1__ETABIN1",
1955 +1)] =
1956 SysInfo{AbsEtaCaloPredicateFactory({1.52, 1.82}),
1958 m_syst_description[CP::SystematicVariation("EG_SCALE_WTOTS1__ETABIN1",
1959 -1)] =
1960 SysInfo{AbsEtaCaloPredicateFactory({1.52, 1.82}),
1962 }
1963
1964 // systematic for the scintillators
1983 m_syst_description[CP::SystematicVariation(
1984 "EG_SCALE_E4SCINTILLATOR__ETABIN0", +1)] =
1987 m_syst_description[CP::SystematicVariation(
1988 "EG_SCALE_E4SCINTILLATOR__ETABIN1", +1)] =
1991 m_syst_description[CP::SystematicVariation(
1992 "EG_SCALE_E4SCINTILLATOR__ETABIN2", +1)] =
1995 m_syst_description[CP::SystematicVariation(
1996 "EG_SCALE_E4SCINTILLATOR__ETABIN0", -1)] =
1999 m_syst_description[CP::SystematicVariation(
2000 "EG_SCALE_E4SCINTILLATOR__ETABIN1", -1)] =
2003 m_syst_description[CP::SystematicVariation(
2004 "EG_SCALE_E4SCINTILLATOR__ETABIN2", -1)] =
2007 if (m_TESModel == egEnergyCorr::es2024_Run3_v0) { // extended E4 in Run 3
2008 m_syst_description[CP::SystematicVariation(
2009 "EG_SCALE_E4SCINTILLATOR__ETABIN3", +1)] =
2012 m_syst_description[CP::SystematicVariation(
2013 "EG_SCALE_E4SCINTILLATOR__ETABIN3", -1)] =
2016 }
2017 }
2018 } else {
2019 ATH_MSG_FATAL("scale decorrelation model invalid");
2020 }
2021
2022 // resolution systematics
2024 // ALL will not include AF2/AF3 systematic
2025 // individual AF NP is always provided
2026 // linghua.guo@cern.ch 2025-04-23
2027 m_syst_description_resolution[CP::SystematicVariation(
2028 "EG_RESOLUTION_ALL", +1)] = egEnergyCorr::Resolution::AllUp;
2029 m_syst_description_resolution[CP::SystematicVariation(
2030 "EG_RESOLUTION_ALL", -1)] = egEnergyCorr::Resolution::AllDown;
2033 m_syst_description_resolution[CP::SystematicVariation(
2034 "EG_RESOLUTION_ZSMEARING", +1)] = egEnergyCorr::Resolution::ZSmearingUp;
2035 m_syst_description_resolution[CP::SystematicVariation(
2036 "EG_RESOLUTION_ZSMEARING", -1)] =
2038 m_syst_description_resolution[CP::SystematicVariation(
2039 "EG_RESOLUTION_SAMPLINGTERM", +1)] =
2041 m_syst_description_resolution[CP::SystematicVariation(
2042 "EG_RESOLUTION_SAMPLINGTERM", -1)] =
2044 m_syst_description_resolution[CP::SystematicVariation(
2045 "EG_RESOLUTION_MATERIALID", +1)] =
2047 m_syst_description_resolution[CP::SystematicVariation(
2048 "EG_RESOLUTION_MATERIALID", -1)] =
2050 m_syst_description_resolution[CP::SystematicVariation(
2051 "EG_RESOLUTION_MATERIALCALO", +1)] =
2053 m_syst_description_resolution[CP::SystematicVariation(
2054 "EG_RESOLUTION_MATERIALCALO", -1)] =
2056 m_syst_description_resolution[CP::SystematicVariation(
2057 "EG_RESOLUTION_MATERIALGAP", +1)] =
2059 m_syst_description_resolution[CP::SystematicVariation(
2060 "EG_RESOLUTION_MATERIALGAP", -1)] =
2062 m_syst_description_resolution[CP::SystematicVariation(
2063 "EG_RESOLUTION_MATERIALCRYO", +1)] =
2065 m_syst_description_resolution[CP::SystematicVariation(
2066 "EG_RESOLUTION_MATERIALCRYO", -1)] =
2068 m_syst_description_resolution[CP::SystematicVariation(
2069 "EG_RESOLUTION_PILEUP", +1)] = egEnergyCorr::Resolution::PileUpUp;
2070 m_syst_description_resolution[CP::SystematicVariation(
2071 "EG_RESOLUTION_PILEUP", -1)] = egEnergyCorr::Resolution::PileUpDown;
2087 m_syst_description_resolution[CP::SystematicVariation(
2088 "EG_RESOLUTION_MATERIALIBL", +1)] =
2090 m_syst_description_resolution[CP::SystematicVariation(
2091 "EG_RESOLUTION_MATERIALIBL", -1)] =
2093 m_syst_description_resolution[CP::SystematicVariation(
2094 "EG_RESOLUTION_MATERIALPP0", +1)] =
2096 m_syst_description_resolution[CP::SystematicVariation(
2097 "EG_RESOLUTION_MATERIALPP0", -1)] =
2099
2100 if (m_TESModel == egEnergyCorr::es2022_R22_PRE) { // exta sys. for Run-3
2101 // pre-recommendations
2102 m_syst_description_resolution[CP::SystematicVariation(
2103 "EG_RESOLUTION_OFC", +1)] = egEnergyCorr::Resolution::OFCUp;
2104 m_syst_description_resolution[CP::SystematicVariation(
2105 "EG_RESOLUTION_OFC", -1)] = egEnergyCorr::Resolution::OFCDown;
2106 }
2107 }
2108 } else {
2109 ATH_MSG_FATAL("resolution decorrelation model invalid");
2110 }
2111
2112 // Always use individual AF2/AF3 systematics for resolution
2117 m_syst_description_resolution[CP::SystematicVariation(
2118 "EG_RESOLUTION_AF2", +1)] = egEnergyCorr::Resolution::afUp;
2119 m_syst_description_resolution[CP::SystematicVariation(
2120 "EG_RESOLUTION_AF2", -1)] = egEnergyCorr::Resolution::afDown;
2121 }
2123 m_syst_description_resolution[CP::SystematicVariation(
2124 "EG_RESOLUTION_AF3", +1)] = egEnergyCorr::Resolution::afUp;
2125 m_syst_description_resolution[CP::SystematicVariation(
2126 "EG_RESOLUTION_AF3", -1)] = egEnergyCorr::Resolution::afDown;
2127 }
2128
2129 // ep combination systematics
2131 m_syst_description[CP::SystematicVariation("EL_SCALE_MOMENTUM", +1)] =
2133 m_syst_description[CP::SystematicVariation("EL_SCALE_MOMENTUM", -1)] =
2135 }
2136}
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 876 of file EgammaCalibrationAndSmearingTool.cxx.

877{
878 const Accessors& acc = *m_accessors;
879
880 // this is departing from the logic below, as we are now requiring the
881 // user to specify at configuration time whether we run on electrons
882 // or photons. this is necessary to configure the columns we need
883 // correctly.
884 if (m_onlyElectrons.value())
885 {
887 }
888 if (m_onlyPhotons.value())
889 {
890 if (acc.photonVertexAcc(particle).size() > 0)
891 {
893 }
894 else
895 {
897 }
898 }
899
900 // this is the old logic and should not be visited in columnar mode
901 // (disabled by turning on onlyElectrons or onlyPhotons)
903 //no ForwardElectron ptype: consider them as Electron
905 else if (xAOD::EgammaHelpers::isPhoton(&particle.getXAODObject())) {
908 }
909 else {
910 ATH_MSG_ERROR("particle is not electron of photon");
911 throw std::runtime_error("particle is not electron or photon");
912 }
913 return ptype;
914}
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 487 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: