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< bool > m_forceOneFold {this, "forceOneFold", false, "Force the usage of one fold regardless of the config file settings"}
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 phi).

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 119 of file ElectronPhotonVariableNFCorrectionTool.h.

119{ 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 133 of file ElectronPhotonVariableNFCorrectionTool.h.

133{ 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 366 of file ElectronPhotonVariableNFCorrectionTool.cxx.

367{
368 ATH_MSG_ERROR("ElectronPhotonVariableNFCorrectionTool does not support electrons.");
370}
#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 216 of file ElectronPhotonVariableNFCorrectionTool.cxx.

217{
218
219 const size_t nSS = s_ssEnums.size();
220 std::vector<float> ss(nSS);
221
222 // Read shower shapes, then store original values
223 for (size_t i = 0; i < nSS; ++i) {
224 ss[i] = photon.showerShapeValue(s_ssEnums[i]);
225 (*m_accessors[i].original)(photon) = ss[i];
226 }
227
228
229 static const SG::AuxElement::Decorator<char> dec_pass("NFCorrectedShowerShapes");
230
231 // Photon selection
232 bool pass = passSelectionCuts(photon, ss);
233
234 dec_pass(photon) = pass ? 1 : 0;
235
236 if (!pass) {
237 // If selection is not passed, then SS value will be same to original
239 }
240
241
242 // Get event info and select fold
243 SG::ReadHandle<xAOD::EventInfo> h(m_eventInfoKey);
244 if (!h.isValid()) {
245 ATH_MSG_ERROR("Failed to read EventInfo via key " << m_eventInfoKey.key());
247 }
248
249 const unsigned long long eventNumber = h->eventNumber();
250 float ptGeV = photon.pt() / 1000.0f;
251 const float phi = static_cast<float>(photon.phi());
252 const int fold = selectFold(eventNumber, phi);
253
254
255 if (fold < 0 || fold >= m_nFolds) {
256 ATH_MSG_ERROR("Selected fold " << fold << " out of range [0," << (m_nFolds-1) << "]");
258 }
259
260
261 // Kinematic inputs
262 const bool isConv = photon.conversionType() != xAOD::EgammaParameters::unconverted;
263 std::vector<float> kinematic = {
264 ptGeV,
265 static_cast<float>(photon.eta()),
266 static_cast<float>(photon.phi()),
267 static_cast<float>(isConv)
268 };
269
270 // Forward inference
271 std::vector<Ort::Value> inputTensors;
272
273 const auto& onnxToolForward = m_onnxToolsForward[fold];
274
275 // index 0 is for kinematics
276 int64_t batchSizeKin = onnxToolForward->getBatchSize(
277 static_cast<int64_t>(kinematic.size()), 0);
278 if (onnxToolForward->addInput(inputTensors, kinematic, 0, batchSizeKin).isFailure()) {
279 ATH_MSG_ERROR("Fold " << fold << ": failed to add kinematic input tensor");
281 }
282
283 // index 1 is for shower shape varibales
284 int64_t batchSizeSS = onnxToolForward->getBatchSize(
285 static_cast<int64_t>(ss.size()), 1);
286 if (onnxToolForward->addInput(inputTensors, ss, 1, batchSizeSS).isFailure()) {
287 ATH_MSG_ERROR("Fold " << fold << ": failed to add shower shape input tensor");
289 }
290
291 std::vector<Ort::Value> outputTensors;
292 std::vector<float> outputData;
293 if (onnxToolForward->addOutput(outputTensors, outputData, 0, batchSizeKin).isFailure()) {
294 ATH_MSG_ERROR("Fold " << fold << ": failed to add forward output tensor");
296 }
297
298 if (onnxToolForward->inference(inputTensors, outputTensors).isFailure()) {
299 ATH_MSG_ERROR("Fold " << fold << ": forward inference failed");
301 }
302
303 float* zPtr = outputTensors[0].GetTensorMutableData<float>();
304 std::vector<float> zVec(zPtr, zPtr + nSS);
305
306
307 // Backward inference
308 std::vector<Ort::Value> inputTensorsBack;
309 std::vector<Ort::Value> outputTensorsBack;
310 std::vector<float> outputDataBack;
311
312 const auto& onnxToolBackward = m_onnxToolsBackward[fold];
313
314 // index 0 is for kinematics
315 int64_t batchSizeKinBack = onnxToolBackward->getBatchSize(
316 static_cast<int64_t>(kinematic.size()), 0);
317 if (onnxToolBackward->addInput(inputTensorsBack, kinematic, 0, batchSizeKinBack).isFailure()) {
318 ATH_MSG_ERROR("Fold " << fold << ": failed to add kinematic input tensor for backward model");
320 }
321
322 // index 1 is for shower shapes in latent space
323 int64_t batchSizeZBack = onnxToolBackward->getBatchSize(static_cast<int64_t>(zVec.size()), 1);
324
325 if (onnxToolBackward->addInput(inputTensorsBack, zVec, 1, batchSizeZBack).isFailure()) {
326 ATH_MSG_ERROR("Fold " << fold << ": failed to add z input tensor for backward model");
328 }
329
330 // index 2 is for original shower shapes (models use them to cut on std values [-5, 5])
331 if (onnxToolBackward->addInput(inputTensorsBack, ss, 2, batchSizeKinBack).isFailure()) {
332 ATH_MSG_ERROR("Fold " << fold << ": failed to add original SS input tensor for backward model");
334 }
335
336 if (onnxToolBackward->addOutput(outputTensorsBack, outputDataBack, 0, batchSizeZBack).isFailure()) {
337 ATH_MSG_ERROR("Fold " << fold << ": failed to add backward output tensor");
339 }
340
341 if (onnxToolBackward->inference(inputTensorsBack, outputTensorsBack).isFailure()) {
342 ATH_MSG_ERROR("Fold " << fold << ": backward inference failed");
344 }
345
346 const auto infoB = outputTensorsBack[0].GetTensorTypeAndShapeInfo();
347 const auto nElB = infoB.GetElementCount();
348 if (nElB != nSS) {
349 ATH_MSG_ERROR("Fold "<<fold <<": backward output has " <<nElB<< " elements, expected "<<nSS);
351 }
352
353 // Write corrected shower shapes
354 float* corrPtr = outputTensorsBack[0].GetTensorMutableData<float>();
355 for (size_t i = 0; i < nSS; ++i) {
356 photon.setShowerShapeValue(corrPtr[i], s_ssEnums[i]);
357 }
358
359 ATH_MSG_DEBUG("NF correction applied successfully");
360
361
363}
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 382 of file ElectronPhotonVariableNFCorrectionTool.cxx.

384{
385 ATH_MSG_ERROR("ElectronPhotonVariableNFCorrectionTool cannot correct electrons.");
386 out_electron = new xAOD::Electron(in_electron);
388}
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 373 of file ElectronPhotonVariableNFCorrectionTool.cxx.

375{
376
377 out_photon = new xAOD::Photon(in_photon);
378 return applyCorrection(*out_photon);
379}
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: TruthPhotons/All

Reimplemented from asg::AsgTool.

Definition at line 123 of file ElectronPhotonVariableNFCorrectionTool.cxx.

124{
125 if (m_configFile.empty()) {
126 ATH_MSG_ERROR("ConfigFile property is empty. Please provide a config file to the tool.");
127 return StatusCode::FAILURE;
128 }
129
130 std::string resolvedConfig = PathResolverFindCalibFile(m_configFile);
131 if (resolvedConfig.empty()) {
132 ATH_MSG_ERROR("Failed to resolve config file \"" << m_configFile << "\"");
133 return StatusCode::FAILURE;
134 }
135 ATH_MSG_DEBUG("Use configuration file " << m_configFile);
136
137 TEnv env;
138 env.ReadFile(resolvedConfig.c_str(), kEnvLocal);
139 env.IgnoreDuplicates(false);
140
141 m_nFolds = (m_forceOneFold)?1:env.GetValue("NFolds", 0);
142 if (m_nFolds <= 0) {
143 ATH_MSG_ERROR("NFolds not set or invalid in config: " << resolvedConfig);
144 return StatusCode::FAILURE;
145 }
146
147 TString pattern = env.GetValue("ONNXnamePattern", "");
148 if (pattern.IsNull()) {
149 ATH_MSG_ERROR("ONNXnamePattern not set in config: " << resolvedConfig);
150 return StatusCode::FAILURE;
151 }
152 m_onnxPattern = pattern.Data();
153
154
155 TString fs = env.GetValue("FoldStrategy", "eventNumber");
156 std::string fsStr = fs.Data();
157
159
161 ATH_MSG_ERROR("FoldStrategy must be 'eventNumber' or 'eventNumber_phi', but got '" << fsStr << "' in config: " << resolvedConfig);
162 return StatusCode::FAILURE;
163 }
164
165
166 ATH_MSG_VERBOSE("NFolds = " << m_nFolds << ", pattern = " << m_onnxPattern << ", FoldStrategy = " << fsStr);
167
168 if (static_cast<int>(m_onnxToolsForward.size()) != m_nFolds ||
169 static_cast<int>(m_onnxToolsBackward.size()) != m_nFolds) {
170 ATH_MSG_ERROR("Expected "<<m_nFolds<<" forward/backward tools, "<< "but got "<<m_onnxToolsForward.size()<<" / "<< m_onnxToolsBackward.size());
171 return StatusCode::FAILURE;
172 }
173
174
176 else if (m_applyToStr == "All") m_applyToMode = ApplyToMode::All;
177 else {
178 ATH_MSG_ERROR("ApplyTo must be TruthPhotons or All, but got '" << m_applyToStr << "'");
179 return StatusCode::FAILURE;
180 }
181
182 // Cuts on SS vars to remove default values
183 m_applyShowerShapeCuts = (env.GetValue("ApplyShowerShapeCuts", 1) == 1);
184
185 ATH_MSG_INFO("ApplyTo = " << m_applyToStr << ", pTcut=" << m_pTcutMeV << " MeV, ApplyShowerShapeCuts=" << m_applyShowerShapeCuts);
186
187
188 ATH_CHECK(m_onnxToolsForward.retrieve());
189 ATH_CHECK(m_onnxToolsBackward.retrieve());
190
191 if (msgLvl(MSG::DEBUG)) {
192 for (int i = 0; i < m_nFolds; ++i) {
193 ATH_MSG_VERBOSE("Fold " << i << " forward model info:");
194 m_onnxToolsForward[i]->printModelInfo();
195 ATH_MSG_VERBOSE("Fold " << i << " backward model info:");
196 m_onnxToolsBackward[i]->printModelInfo();
197 }
198 }
199
200 // Prepare decorations for each shower shape
201 m_accessors.resize(s_ssVarNames.size());
202 for (size_t i = 0; i < s_ssVarNames.size(); ++i) {
203 const std::string& var = s_ssVarNames[i];
204 m_accessors[i].original = std::make_unique<SG::AuxElement::Accessor<float>>(var + "_original");
205 }
206
207 ATH_CHECK(m_eventInfoKey.initialize());
208
209 ATH_MSG_INFO("NF correction tool initialized with " << m_nFolds << " folds. ");
210
211 return StatusCode::SUCCESS;
212}
#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 65 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 73 of file ElectronPhotonVariableNFCorrectionTool.cxx.

76{
77 // pT cut
78 if (photon.pt() < m_pTcutMeV) return false;
79
80 // TruthType cut
82 static const SG::AuxElement::Accessor<int> acc_truthType("truthType");
83 if (!acc_truthType.isAvailable(photon)) {
84 ATH_MSG_WARNING("ApplyTo = TruthPhotons but truthType not available — skipping photon");
85 return false;
86 }
87 int truthType = acc_truthType(photon);
88 if (truthType < 13 || truthType > 15) return false;
89 }
90
91 // Shower shape cuts
93 // weta2
94 if (ss[0] <= -10.f || ss[0] >= 10.f) return false;
95 // weta1
96 if (ss[1] <= -10.f || ss[1] >= 10.f) return false;
97 // Rphi
98 if (ss[2] <= -10.f || ss[2] >= 10.f) return false;
99 // Reta
100 if (ss[3] <= -10.f || ss[3] >= 10.f) return false;
101 // wtots1
102 if (ss[4] < -2.f || ss[4] >= 10.f) return false;
103 // Rhad
104 if (ss[5] < -2.f || ss[5] > 2.f) return false;
105 // Rhad1
106 if (ss[6] < -2.f || ss[6] > 2.f) return false;
107 // f1
108 if (ss[7] <= -2.f || ss[7] >= 2.f) return false;
109 // fracs1
110 if (ss[8] <= -2.f || ss[8] >= 5.f) return false;
111 // DeltaE
112 if (ss[9] < 0.f || ss[9] >= 5000.f) return false;
113 // Eratio
114 if (ss[10] < 0.f || ss[10] > 1.f) return false;
115 }
116
117 return true;
118}
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_forceOneFold) return 0;
51 if (m_nFolds <= 1) return 0;
52
53 unsigned long long key = eventNumber;
54
56 const long long phiBin = static_cast<long long>(std::floor((phi + static_cast<float>(M_PI)) * 100.0f));
57 key = eventNumber + static_cast<unsigned long long>(phiBin);
58 }
59
60 return static_cast<int>(key % m_nFolds);
61}
#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 165 of file ElectronPhotonVariableNFCorrectionTool.h.

◆ m_applyShowerShapeCuts

bool ElectronPhotonVariableNFCorrectionTool::m_applyShowerShapeCuts {true}
private

Cuts applied to remove default values of shower shapes.

Definition at line 123 of file ElectronPhotonVariableNFCorrectionTool.h.

123{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 106 of file ElectronPhotonVariableNFCorrectionTool.h.

106{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 116 of file ElectronPhotonVariableNFCorrectionTool.h.

116{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 136 of file ElectronPhotonVariableNFCorrectionTool.h.

◆ m_forceOneFold

Gaudi::Property<bool> ElectronPhotonVariableNFCorrectionTool::m_forceOneFold {this, "forceOneFold", false, "Force the usage of one fold regardless of the config file settings"}
private

Definition at line 105 of file ElectronPhotonVariableNFCorrectionTool.h.

105{this, "forceOneFold", false, "Force the usage of one fold regardless of the config file settings"};

◆ m_nFolds

int ElectronPhotonVariableNFCorrectionTool::m_nFolds {0}
private

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

Definition at line 110 of file ElectronPhotonVariableNFCorrectionTool.h.

110{0};

◆ m_onnxPattern

std::string ElectronPhotonVariableNFCorrectionTool::m_onnxPattern
private

Models path pattern string from config.

Definition at line 113 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 151 of file ElectronPhotonVariableNFCorrectionTool.h.

151{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 149 of file ElectronPhotonVariableNFCorrectionTool.h.

149{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 107 of file ElectronPhotonVariableNFCorrectionTool.h.

107{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: