ATLAS Offline Software
Loading...
Searching...
No Matches
ElectronPhotonVariableNFCorrectionTool Class Reference

Normalizing Flows-based correction tool for photon MC shower shape variables. More...

#include <ElectronPhotonVariableNFCorrectionTool.h>

Inheritance diagram for ElectronPhotonVariableNFCorrectionTool:
Collaboration diagram for ElectronPhotonVariableNFCorrectionTool:

Classes

struct  SSAccessors
 Accessor used to decorate photons per shower shape variable. More...

Public Member Functions

 ElectronPhotonVariableNFCorrectionTool (const std::string &name)
 Standard constructor.
 ~ElectronPhotonVariableNFCorrectionTool ()
 Standard destructor.
virtual StatusCode initialize () override
 Initialize the class instance.
virtual const CP::CorrectionCode applyCorrection (xAOD::Photon &photon) const override
 Apply the Normalizing Flow correction to the passed photon.
virtual const CP::CorrectionCode applyCorrection (xAOD::Electron &electron) const override
 Not supported, so electrons cannot be corrected by this tool.
virtual const CP::CorrectionCode correctedCopy (const xAOD::Photon &in_photon, xAOD::Photon *&out_photon) const override
 Make a corrected copy of the passed photon.
virtual const CP::CorrectionCode correctedCopy (const xAOD::Electron &in_electron, xAOD::Electron *&out_electron) const override
 Not supported, so electrons cannot be corrected by this tool.
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 sysInitialize () override
 Perform system initialization for an algorithm.
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
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.

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.

Private Types

enum class  ApplyToMode { TruthPhotons , All }
 NF will be applied only for TruthPhotons, or for All photons. More...
enum class  FoldStrategy { Unknown , EventNumber , EventNumberPhi }
 Fold selection strategy. More...
typedef ServiceHandle< StoreGateSvcStoreGateSvc_t

Private Member Functions

bool passSelectionCuts (const xAOD::Photon &photon, const std::vector< float > &ss) const
 Returns true if NF correction should be applied to this photon.
int selectFold (unsigned long long eventNumber, float phi) const
 Select fold index for the current event/photon.
FoldStrategy parseFoldStrategy (const std::string &s) const
 Parse fold strategy string from config.
Gaudi::Details::PropertyBase & declareGaudiProperty (Gaudi::Property< T, V, H > &hndl, const SG::VarHandleKeyType &)
 specialization for handling Gaudi::Property<SG::VarHandleKey>

Private Attributes

Gaudi::Property< std::string > m_configFile {this, "ConfigFile", "", "The configuration file for Normalizing Flows to use"}
 The configuration file for the tool, application mode and minimum photon pT cut in MeV.
Gaudi::Property< std::string > m_applyToStr {this, "ApplyTo", "TruthPhotons", "TruthPhotons or All"}
Gaudi::Property< float > m_pTcutMeV {this, "pTcut", 10000.f, "Min photon pT in MeV"}
int m_nFolds {0}
 Number of model folds configured (must match tool handle array sizes)
std::string m_onnxPattern
 Models path pattern string from config.
SG::ReadHandleKey< xAOD::EventInfom_eventInfoKey {this, "EventInfoKey", "EventInfo", "EventInfo key"}
 ReadHandleKey for EventInfo used for fold selection.
ApplyToMode m_applyToMode {ApplyToMode::TruthPhotons}
bool m_applyShowerShapeCuts {true}
 Cuts applied to remove default values of shower shapes.
FoldStrategy m_foldStrategy {FoldStrategy::EventNumber}
 Selected fold strategy (configured via FoldStrategy in the config)
ToolHandleArray< AthOnnx::IOnnxRuntimeInferenceToolm_onnxToolsForward {this, "OnnxInferenceToolsForward", {}, "Forward ONNX tools per fold"}
 ToolHandleArray for forward ONNX models (one tool per fold)
ToolHandleArray< AthOnnx::IOnnxRuntimeInferenceToolm_onnxToolsBackward {this, "OnnxInferenceToolsBackward", {}, "Backward ONNX tools per fold"}
 ToolHandleArray for backward ONNX models (one tool per fold)
std::vector< SSAccessorsm_accessors
 Per-variable accessors aligned with s_ssVarNames.
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 std::vector< std::string > s_ssVarNames
 List of shower shape variable names (order must match model I/O)
static const std::vector< xAOD::EgammaParameters::ShowerShapeTypes_ssEnums
 Egamma shower shape enum mapping for reading/writing values (order matches s_ssVarNames)

Detailed Description

Normalizing Flows-based correction tool for photon MC shower shape variables.

The tool applies a two-step NF mapping using ONNX Runtime inference:

  • Forward model: maps shower shape tenzor -> latent representation (z)
  • Backward model: maps latent representation (z) -> corrected shower shape tenzor

The correction is applied to the photon shower shape variables listed in s_ssVarNames (the order should correspond to order in a model).

The ONNX models are provided per-fold via ToolHandleArray, and the fold is selected event-by-event using EventInfo::eventNumber() (optionally including pT).

Author
Katerina Kazakova kater.nosp@m.ina..nosp@m.kazak.nosp@m.ova@.nosp@m.cern..nosp@m.ch
Date
February 2026

Definition at line 52 of file ElectronPhotonVariableNFCorrectionTool.h.

Member Typedef Documentation

◆ StoreGateSvc_t

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

Definition at line 388 of file AthCommonDataStore.h.

Member Enumeration Documentation

◆ ApplyToMode

NF will be applied only for TruthPhotons, or for All photons.

Enumerator
TruthPhotons 
All 

Definition at line 118 of file ElectronPhotonVariableNFCorrectionTool.h.

118{ TruthPhotons, All };

◆ FoldStrategy

Fold selection strategy.

  • EventNumber : fold = eventNumber % NFolds
  • EventNumberPhi : fold = (eventNumber + floor((phi + pi)*100)) % NFolds
Enumerator
Unknown 
EventNumber 
EventNumberPhi 

Definition at line 132 of file ElectronPhotonVariableNFCorrectionTool.h.

132{ Unknown, EventNumber, EventNumberPhi };
@ Unknown
Definition TruthClasses.h:9

Constructor & Destructor Documentation

◆ ElectronPhotonVariableNFCorrectionTool()

ElectronPhotonVariableNFCorrectionTool::ElectronPhotonVariableNFCorrectionTool ( const std::string & name)

Standard constructor.

Parameters
nameInternal name of the tool instance

Definition at line 43 of file ElectronPhotonVariableNFCorrectionTool.cxx.

43 :
44 AsgTool(name)
45{}
AsgTool(const std::string &name)
Constructor specifying the tool instance's name.
Definition AsgTool.cxx:58

◆ ~ElectronPhotonVariableNFCorrectionTool()

ElectronPhotonVariableNFCorrectionTool::~ElectronPhotonVariableNFCorrectionTool ( )
inline

Standard destructor.

Definition at line 64 of file ElectronPhotonVariableNFCorrectionTool.h.

64{};

Member Function Documentation

◆ applyCorrection() [1/2]

const CP::CorrectionCode ElectronPhotonVariableNFCorrectionTool::applyCorrection ( xAOD::Electron & electron) const
overridevirtual

Not supported, so electrons cannot be corrected by this tool.

Implements IElectronPhotonShowerShapeFudgeTool.

Definition at line 357 of file ElectronPhotonVariableNFCorrectionTool.cxx.

358{
359 ATH_MSG_ERROR("ElectronPhotonVariableNFCorrectionTool does not support electrons.");
361}
#define ATH_MSG_ERROR(x)
@ Error
Some error happened during the object correction.

◆ applyCorrection() [2/2]

const CP::CorrectionCode ElectronPhotonVariableNFCorrectionTool::applyCorrection ( xAOD::Photon & photon) const
overridevirtual

Apply the Normalizing Flow correction to the passed photon.

Parameters
photonThe photon to be corrected

Reads the configured shower-shape variables from the photon, runs forward and backward ONNX inference for the selected fold, and overwrites the photon shower-shape values with the corrected outputs.

Implements IElectronPhotonShowerShapeFudgeTool.

Definition at line 215 of file ElectronPhotonVariableNFCorrectionTool.cxx.

216{
217
218 const size_t nSS = s_ssEnums.size();
219 std::vector<float> ss(nSS);
220
221 // Read shower shapes, then store original values
222 for (size_t i = 0; i < nSS; ++i) {
223 ss[i] = photon.showerShapeValue(s_ssEnums[i]);
224 (*m_accessors[i].original)(photon) = ss[i];
225 }
226
227
228 static const SG::AuxElement::Decorator<char> dec_pass("NFCorrectedShowerShapes");
229
230 // Photon selection
231 bool pass = passSelectionCuts(photon, ss);
232
233 dec_pass(photon) = pass ? 1 : 0;
234
235 if (!pass) {
236 // If selection is not passed, then SS value will be same to original
238 }
239
240
241 // Get event info and select fold
242 SG::ReadHandle<xAOD::EventInfo> h(m_eventInfoKey);
243 if (!h.isValid()) {
244 ATH_MSG_ERROR("Failed to read EventInfo via key " << m_eventInfoKey.key());
246 }
247
248 const unsigned long long eventNumber = h->eventNumber();
249 float ptGeV = photon.pt() / 1000.0f;
250 const float phi = static_cast<float>(photon.phi());
251 const int fold = selectFold(eventNumber, phi);
252
253
254 if (fold < 0 || fold >= m_nFolds) {
255 ATH_MSG_ERROR("Selected fold " << fold << " out of range [0," << (m_nFolds-1) << "]");
257 }
258
259
260 // Kinematic inputs
261 const bool isConv = photon.conversionType() != xAOD::EgammaParameters::unconverted;
262 std::vector<float> kinematic = {
263 ptGeV,
264 static_cast<float>(photon.eta()),
265 static_cast<float>(photon.phi()),
266 static_cast<float>(isConv)
267 };
268
269 // Forward inference
270 std::vector<Ort::Value> inputTensors;
271
272 const auto& onnxToolForward = m_onnxToolsForward[fold];
273
274 // index 0 is for kinematics
275 int64_t batchSizeKin = onnxToolForward->getBatchSize(
276 static_cast<int64_t>(kinematic.size()), 0);
277 if (onnxToolForward->addInput(inputTensors, kinematic, 0, batchSizeKin).isFailure()) {
278 ATH_MSG_ERROR("Fold " << fold << ": failed to add kinematic input tensor");
280 }
281
282 // index 1 is for shower shape varibales
283 int64_t batchSizeSS = onnxToolForward->getBatchSize(
284 static_cast<int64_t>(ss.size()), 1);
285 if (onnxToolForward->addInput(inputTensors, ss, 1, batchSizeSS).isFailure()) {
286 ATH_MSG_ERROR("Fold " << fold << ": failed to add shower shape input tensor");
288 }
289
290 std::vector<Ort::Value> outputTensors;
291 std::vector<float> outputData;
292 if (onnxToolForward->addOutput(outputTensors, outputData, 0, batchSizeKin).isFailure()) {
293 ATH_MSG_ERROR("Fold " << fold << ": failed to add forward output tensor");
295 }
296
297 if (onnxToolForward->inference(inputTensors, outputTensors).isFailure()) {
298 ATH_MSG_ERROR("Fold " << fold << ": forward inference failed");
300 }
301
302 float* zPtr = outputTensors[0].GetTensorMutableData<float>();
303 std::vector<float> zVec(zPtr, zPtr + nSS);
304
305
306 // Backward inference
307 std::vector<Ort::Value> inputTensorsBack;
308 std::vector<Ort::Value> outputTensorsBack;
309 std::vector<float> outputDataBack;
310
311 const auto& onnxToolBackward = m_onnxToolsBackward[fold];
312
313 int64_t batchSizeKinBack = onnxToolBackward->getBatchSize(
314 static_cast<int64_t>(kinematic.size()), 0);
315 if (onnxToolBackward->addInput(inputTensorsBack, kinematic, 0, batchSizeKinBack).isFailure()) {
316 ATH_MSG_ERROR("Fold " << fold << ": failed to add kinematic input tensor for backward model");
318 }
319
320 int64_t batchSizeZBack = onnxToolBackward->getBatchSize(static_cast<int64_t>(zVec.size()), 1);
321
322 if (onnxToolBackward->addInput(inputTensorsBack, zVec, 1, batchSizeZBack).isFailure()) {
323 ATH_MSG_ERROR("Fold " << fold << ": failed to add z input tensor for backward model");
325 }
326
327 if (onnxToolBackward->addOutput(outputTensorsBack, outputDataBack, 0, batchSizeZBack).isFailure()) {
328 ATH_MSG_ERROR("Fold " << fold << ": failed to add backward output tensor");
330 }
331
332 if (onnxToolBackward->inference(inputTensorsBack, outputTensorsBack).isFailure()) {
333 ATH_MSG_ERROR("Fold " << fold << ": backward inference failed");
335 }
336
337 const auto infoB = outputTensorsBack[0].GetTensorTypeAndShapeInfo();
338 const auto nElB = infoB.GetElementCount();
339 if (nElB != nSS) {
340 ATH_MSG_ERROR("Fold "<<fold <<": backward output has " <<nElB<< " elements, expected "<<nSS);
342 }
343
344 // Write corrected shower shapes
345 float* corrPtr = outputTensorsBack[0].GetTensorMutableData<float>();
346 for (size_t i = 0; i < nSS; ++i) {
347 photon.setShowerShapeValue(corrPtr[i], s_ssEnums[i]);
348 }
349
350 ATH_MSG_DEBUG("NF correction applied successfully");
351
352
354}
Scalar phi() const
phi method
#define ATH_MSG_DEBUG(x)
static Double_t ss
@ Ok
The correction was done successfully.
std::vector< SSAccessors > m_accessors
Per-variable accessors aligned with s_ssVarNames.
ToolHandleArray< AthOnnx::IOnnxRuntimeInferenceTool > m_onnxToolsForward
ToolHandleArray for forward ONNX models (one tool per fold)
SG::ReadHandleKey< xAOD::EventInfo > m_eventInfoKey
ReadHandleKey for EventInfo used for fold selection.
int selectFold(unsigned long long eventNumber, float phi) const
Select fold index for the current event/photon.
ToolHandleArray< AthOnnx::IOnnxRuntimeInferenceTool > m_onnxToolsBackward
ToolHandleArray for backward ONNX models (one tool per fold)
bool passSelectionCuts(const xAOD::Photon &photon, const std::vector< float > &ss) const
Returns true if NF correction should be applied to this photon.
static const std::vector< xAOD::EgammaParameters::ShowerShapeType > s_ssEnums
Egamma shower shape enum mapping for reading/writing values (order matches s_ssVarNames)
int m_nFolds
Number of model folds configured (must match tool handle array sizes)
@ unconverted
unconverted photon

◆ correctedCopy() [1/2]

const CP::CorrectionCode ElectronPhotonVariableNFCorrectionTool::correctedCopy ( const xAOD::Electron & in_electron,
xAOD::Electron *& out_electron ) const
overridevirtual

Not supported, so electrons cannot be corrected by this tool.

Implements IElectronPhotonShowerShapeFudgeTool.

Definition at line 373 of file ElectronPhotonVariableNFCorrectionTool.cxx.

375{
376 ATH_MSG_ERROR("ElectronPhotonVariableNFCorrectionTool cannot correct electrons.");
377 out_electron = new xAOD::Electron(in_electron);
379}
Electron_v1 Electron
Definition of the current "egamma version".

◆ correctedCopy() [2/2]

const CP::CorrectionCode ElectronPhotonVariableNFCorrectionTool::correctedCopy ( const xAOD::Photon & in_photon,
xAOD::Photon *& out_photon ) const
overridevirtual

Make a corrected copy of the passed photon.

Parameters
in_photonThe original photon to copy
out_photonThe corrected copy

Implements IElectronPhotonShowerShapeFudgeTool.

Definition at line 364 of file ElectronPhotonVariableNFCorrectionTool.cxx.

366{
367
368 out_photon = new xAOD::Photon(in_photon);
369 return applyCorrection(*out_photon);
370}
virtual const CP::CorrectionCode applyCorrection(xAOD::Photon &photon) const override
Apply the Normalizing Flow correction to the passed photon.
Photon_v1 Photon
Definition of the current "egamma version".

◆ 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 }
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T, V, H > &t)

◆ 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.

◆ 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

◆ 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 }
ServiceHandle< StoreGateSvc > & evtStore()

◆ 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.

◆ initialize()

StatusCode ElectronPhotonVariableNFCorrectionTool::initialize ( void )
overridevirtual

Initialize the class instance.

Reads the configuration file set via setProperty("ConfigFile", ...) function and sets up the class instance accordingly.

The configuration provides:

  • SimulationType: FS/AF3
  • NFolds: number of folds (must match number of ONNX tools configured)
  • ONNXnamePattern: pattern string (informational; tool arrays are configured externally)
  • FoldStrategy: eventNumber or eventNumber_phi
  • ApplyTo: Signal/All

Reimplemented from asg::AsgTool.

Definition at line 122 of file ElectronPhotonVariableNFCorrectionTool.cxx.

123{
124 if (m_configFile.empty()) {
125 ATH_MSG_ERROR("ConfigFile property is empty. Please provide a config file to the tool.");
126 return StatusCode::FAILURE;
127 }
128
129 std::string resolvedConfig = PathResolverFindCalibFile(m_configFile);
130 if (resolvedConfig.empty()) {
131 ATH_MSG_ERROR("Failed to resolve config file \"" << m_configFile << "\"");
132 return StatusCode::FAILURE;
133 }
134 ATH_MSG_DEBUG("Use configuration file " << m_configFile);
135
136 TEnv env;
137 env.ReadFile(resolvedConfig.c_str(), kEnvLocal);
138 env.IgnoreDuplicates(false);
139
140 m_nFolds = env.GetValue("NFolds", 0);
141 if (m_nFolds <= 0) {
142 ATH_MSG_ERROR("NFolds not set or invalid in config: " << resolvedConfig);
143 return StatusCode::FAILURE;
144 }
145
146 TString pattern = env.GetValue("ONNXnamePattern", "");
147 if (pattern.IsNull()) {
148 ATH_MSG_ERROR("ONNXnamePattern not set in config: " << resolvedConfig);
149 return StatusCode::FAILURE;
150 }
151 m_onnxPattern = pattern.Data();
152
153
154 TString fs = env.GetValue("FoldStrategy", "eventNumber");
155 std::string fsStr = fs.Data();
156
158
160 ATH_MSG_ERROR("FoldStrategy must be 'eventNumber' or 'eventNumber_phi', but got '" << fsStr << "' in config: " << resolvedConfig);
161 return StatusCode::FAILURE;
162 }
163
164
165 ATH_MSG_VERBOSE("NFolds = " << m_nFolds << ", pattern = " << m_onnxPattern << ", FoldStrategy = " << fsStr);
166
167 if ((int)m_onnxToolsForward.size() != m_nFolds ||
168 (int)m_onnxToolsBackward.size() != m_nFolds) {
169 ATH_MSG_ERROR("Expected "<<m_nFolds<<" forward/backward tools, "<< "but got "<<m_onnxToolsForward.size()<<" / "<< m_onnxToolsBackward.size());
170 return StatusCode::FAILURE;
171 }
172
173
175 else if (m_applyToStr == "All") m_applyToMode = ApplyToMode::All;
176 else {
177 ATH_MSG_ERROR("ApplyTo must be TruthPhotons or All, but got '" << m_applyToStr << "'");
178 return StatusCode::FAILURE;
179 }
180
181 // Cuts on SS vars to remove default values
182 m_applyShowerShapeCuts = (env.GetValue("ApplyShowerShapeCuts", 1) == 1);
183
184 ATH_MSG_INFO("ApplyTo = " << m_applyToStr << ", pTcut=" << m_pTcutMeV << " MeV, ApplyShowerShapeCuts=" << m_applyShowerShapeCuts);
185
186
187 ATH_CHECK(m_onnxToolsForward.retrieve());
188 ATH_CHECK(m_onnxToolsBackward.retrieve());
189
190 if (msgLvl(MSG::DEBUG)) {
191 for (int i = 0; i < m_nFolds; ++i) {
192 ATH_MSG_VERBOSE("Fold " << i << " forward model info:");
193 m_onnxToolsForward[i]->printModelInfo();
194 ATH_MSG_VERBOSE("Fold " << i << " backward model info:");
195 m_onnxToolsBackward[i]->printModelInfo();
196 }
197 }
198
199 // Prepare decorations for each shower shape
200 m_accessors.resize(s_ssVarNames.size());
201 for (size_t i = 0; i < s_ssVarNames.size(); ++i) {
202 const std::string& var = s_ssVarNames[i];
203 m_accessors[i].original = std::make_unique<SG::AuxElement::Accessor<float>>(var + "_original");
204 }
205
206 ATH_CHECK(m_eventInfoKey.initialize());
207
208 ATH_MSG_INFO("NF correction tool initialized with " << m_nFolds << " folds. ");
209
210 return StatusCode::SUCCESS;
211}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_INFO(x)
#define ATH_MSG_VERBOSE(x)
static Double_t fs
std::string PathResolverFindCalibFile(const std::string &logical_file_name)
bool msgLvl(const MSG::Level lvl) const
static const std::vector< std::string > s_ssVarNames
List of shower shape variable names (order must match model I/O)
FoldStrategy parseFoldStrategy(const std::string &s) const
Parse fold strategy string from config.
std::string m_onnxPattern
Models path pattern string from config.
bool m_applyShowerShapeCuts
Cuts applied to remove default values of shower shapes.
Gaudi::Property< std::string > m_configFile
The configuration file for the tool, application mode and minimum photon pT cut in MeV.
FoldStrategy m_foldStrategy
Selected fold strategy (configured via FoldStrategy in the config)

◆ 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.

◆ 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 }

◆ 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.

◆ parseFoldStrategy()

ElectronPhotonVariableNFCorrectionTool::FoldStrategy ElectronPhotonVariableNFCorrectionTool::parseFoldStrategy ( const std::string & s) const
private

Parse fold strategy string from config.

Definition at line 64 of file ElectronPhotonVariableNFCorrectionTool.cxx.

◆ passSelectionCuts()

bool ElectronPhotonVariableNFCorrectionTool::passSelectionCuts ( const xAOD::Photon & photon,
const std::vector< float > & ss ) const
private

Returns true if NF correction should be applied to this photon.

Definition at line 72 of file ElectronPhotonVariableNFCorrectionTool.cxx.

75{
76 // pT cut
77 if (photon.pt() < m_pTcutMeV) return false;
78
79 // TruthType cut
81 static const SG::AuxElement::Accessor<int> acc_truthType("truthType");
82 if (!acc_truthType.isAvailable(photon)) {
83 ATH_MSG_WARNING("ApplyTo = TruthPhotons but truthType not available — skipping photon");
84 return false;
85 }
86 int truthType = acc_truthType(photon);
87 if (truthType < 13 || truthType > 15) return false;
88 }
89
90 // Shower shape cuts
92 // weta2
93 if (ss[0] <= -10.f || ss[0] >= 10.f) return false;
94 // weta1
95 if (ss[1] <= -10.f || ss[1] >= 10.f) return false;
96 // Rphi
97 if (ss[2] <= -10.f || ss[2] >= 10.f) return false;
98 // Reta
99 if (ss[3] <= -10.f || ss[3] >= 10.f) return false;
100 // wtots1
101 if (ss[4] < -2.f || ss[4] >= 10.f) return false;
102 // Rhad
103 if (ss[5] < -2.f || ss[5] > 2.f) return false;
104 // Rhad1
105 if (ss[6] < -2.f || ss[6] > 2.f) return false;
106 // f1
107 if (ss[7] <= -2.f || ss[7] >= 2.f) return false;
108 // fracs1
109 if (ss[8] <= -2.f || ss[8] >= 5.f) return false;
110 // DeltaE
111 if (ss[9] < 0.f || ss[9] >= 5000.f) return false;
112 // Eratio
113 if (ss[10] < 0.f || ss[10] > 1.f) return false;
114 }
115
116 return true;
117}
SG::Accessor< T, ALLOC > Accessor
Definition AuxElement.h:573
int truthType(const U &p)

◆ print()

◆ 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 }

◆ selectFold()

int ElectronPhotonVariableNFCorrectionTool::selectFold ( unsigned long long eventNumber,
float phi ) const
private

Select fold index for the current event/photon.

Parameters
eventNumberEventInfo::eventNumber()
phiPhoton phi in radians
Returns
Fold index in [0, NFolds-1]

Definition at line 48 of file ElectronPhotonVariableNFCorrectionTool.cxx.

49{
50 if (m_nFolds <= 1) return 0;
51
52 unsigned long long key = eventNumber;
53
55 const long long phiBin = static_cast<long long>(std::floor((phi + static_cast<float>(M_PI)) * 100.0f));
56 key = eventNumber + static_cast<unsigned long long>(phiBin);
57 }
58
59 return static_cast<int>(key % m_nFolds);
60}
#define M_PI
setSAddress setEtaMS setDirPhiMS setDirZMS setBarrelRadius setEndcapAlpha setEndcapRadius setPhiMap phiBin

◆ sysInitialize()

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

Perform system initialization for an algorithm.

We override this to declare all the elements of handle key arrays at the end of initialization. See comments on updateVHKA.

Reimplemented in asg::AsgMetadataTool, AthCheckedComponent< AthAlgTool >, AthCheckedComponent<::AthAlgTool >, and DerivationFramework::CfAthAlgTool.

◆ 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

Member Data Documentation

◆ m_accessors

std::vector<SSAccessors> ElectronPhotonVariableNFCorrectionTool::m_accessors
private

Per-variable accessors aligned with s_ssVarNames.

Definition at line 164 of file ElectronPhotonVariableNFCorrectionTool.h.

◆ m_applyShowerShapeCuts

bool ElectronPhotonVariableNFCorrectionTool::m_applyShowerShapeCuts {true}
private

Cuts applied to remove default values of shower shapes.

Definition at line 122 of file ElectronPhotonVariableNFCorrectionTool.h.

122{true};

◆ m_applyToMode

ApplyToMode ElectronPhotonVariableNFCorrectionTool::m_applyToMode {ApplyToMode::TruthPhotons}
private

◆ m_applyToStr

Gaudi::Property<std::string> ElectronPhotonVariableNFCorrectionTool::m_applyToStr {this, "ApplyTo", "TruthPhotons", "TruthPhotons or All"}
private

Definition at line 105 of file ElectronPhotonVariableNFCorrectionTool.h.

105{this, "ApplyTo", "TruthPhotons", "TruthPhotons or All"};

◆ m_configFile

Gaudi::Property<std::string> ElectronPhotonVariableNFCorrectionTool::m_configFile {this, "ConfigFile", "", "The configuration file for Normalizing Flows to use"}
private

The configuration file for the tool, application mode and minimum photon pT cut in MeV.

Definition at line 104 of file ElectronPhotonVariableNFCorrectionTool.h.

104{this, "ConfigFile", "", "The configuration file for Normalizing Flows to use"};

◆ 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_eventInfoKey

SG::ReadHandleKey<xAOD::EventInfo> ElectronPhotonVariableNFCorrectionTool::m_eventInfoKey {this, "EventInfoKey", "EventInfo", "EventInfo key"}
private

ReadHandleKey for EventInfo used for fold selection.

Definition at line 115 of file ElectronPhotonVariableNFCorrectionTool.h.

115{this, "EventInfoKey", "EventInfo", "EventInfo key"};

◆ 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_foldStrategy

FoldStrategy ElectronPhotonVariableNFCorrectionTool::m_foldStrategy {FoldStrategy::EventNumber}
private

Selected fold strategy (configured via FoldStrategy in the config)

Definition at line 135 of file ElectronPhotonVariableNFCorrectionTool.h.

◆ m_nFolds

int ElectronPhotonVariableNFCorrectionTool::m_nFolds {0}
private

Number of model folds configured (must match tool handle array sizes)

Definition at line 109 of file ElectronPhotonVariableNFCorrectionTool.h.

109{0};

◆ m_onnxPattern

std::string ElectronPhotonVariableNFCorrectionTool::m_onnxPattern
private

Models path pattern string from config.

Definition at line 112 of file ElectronPhotonVariableNFCorrectionTool.h.

◆ m_onnxToolsBackward

ToolHandleArray<AthOnnx::IOnnxRuntimeInferenceTool> ElectronPhotonVariableNFCorrectionTool::m_onnxToolsBackward {this, "OnnxInferenceToolsBackward", {}, "Backward ONNX tools per fold"}
private

ToolHandleArray for backward ONNX models (one tool per fold)

Definition at line 150 of file ElectronPhotonVariableNFCorrectionTool.h.

150{this, "OnnxInferenceToolsBackward", {}, "Backward ONNX tools per fold"};

◆ m_onnxToolsForward

ToolHandleArray<AthOnnx::IOnnxRuntimeInferenceTool> ElectronPhotonVariableNFCorrectionTool::m_onnxToolsForward {this, "OnnxInferenceToolsForward", {}, "Forward ONNX tools per fold"}
private

ToolHandleArray for forward ONNX models (one tool per fold)

Definition at line 148 of file ElectronPhotonVariableNFCorrectionTool.h.

148{this, "OnnxInferenceToolsForward", {}, "Forward ONNX tools per fold"};

◆ m_pTcutMeV

Gaudi::Property<float> ElectronPhotonVariableNFCorrectionTool::m_pTcutMeV {this, "pTcut", 10000.f, "Min photon pT in MeV"}
private

Definition at line 106 of file ElectronPhotonVariableNFCorrectionTool.h.

106{this, "pTcut", 10000.f, "Min photon pT in MeV"};

◆ m_varHandleArraysDeclared

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

Definition at line 399 of file AthCommonDataStore.h.

◆ m_vhka

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

Definition at line 398 of file AthCommonDataStore.h.

◆ s_ssEnums

const std::vector< xAOD::EgammaParameters::ShowerShapeType > ElectronPhotonVariableNFCorrectionTool::s_ssEnums
staticprivate
Initial value:
= {
}
@ wtots1
shower width is determined in a window detaxdphi = 0,0625 ×~0,2, corresponding typically to 20 strips...
@ f1
E1/E = fraction of energy reconstructed in the first sampling, where E1 is energy in all strips belon...
Definition EgammaEnums.h:53
@ Eratio
(emaxs1-e2tsts1)/(emaxs1+e2tsts1)
@ DeltaE
e2tsts1-emins1
@ fracs1
shower shape in the shower core : [E(+/-3)-E(+/-1)]/E(+/-1), where E(+/-n) is the energy in ± n strip...
@ weta2
the lateral width is calculated with a window of 3x5 cells using the energy weighted sum over all cel...
@ weta1
shower width using +/-3 strips around the one with the maximal energy deposit: w3 strips = sqrt{sum(E...
Definition EgammaEnums.h:98

Egamma shower shape enum mapping for reading/writing values (order matches s_ssVarNames)

Definition at line 27 of file ElectronPhotonVariableNFCorrectionTool.h.

◆ s_ssVarNames

const std::vector< std::string > ElectronPhotonVariableNFCorrectionTool::s_ssVarNames
staticprivate
Initial value:
= {
"weta2", "weta1", "Rphi", "Reta", "wtots1", "Rhad", "Rhad1", "f1", "fracs1", "DeltaE", "Eratio"
}

List of shower shape variable names (order must match model I/O)

Definition at line 22 of file ElectronPhotonVariableNFCorrectionTool.h.


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