ATLAS Offline Software
Loading...
Searching...
No Matches
CP::SystObjectLinkerAlg Class Referencefinal

#include <SystObjectLinkerAlg.h>

Inheritance diagram for CP::SystObjectLinkerAlg:
Collaboration diagram for CP::SystObjectLinkerAlg:

Public Member Functions

StatusCode initialize () override
 Initialisation method, for setting up tools and other persistent configs.
StatusCode execute (const EventContext &ctx) const override
 Execute method, for actions to be taken in the event loop.
 AnaReentrantAlgorithm (const std::string &name, ISvcLocator *pSvcLocator)
 The standard constructor.
virtual StatusCode sysInitialize () override
 Override sysInitialize.
virtual bool isClonable () const override
 Specify if the algorithm is clonable.
virtual StatusCode sysExecute (const EventContext &ctx) override
 Execute an algorithm.
virtual const DataObjIDColl & extraOutputDeps () const override
 Return the list of extra output dependencies.
virtual bool filterPassed (const EventContext &ctx) const
 Get filter decision:
virtual void setFilterPassed (bool state, const EventContext &ctx) const
 Set filter decision:
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

Protected Member Functions

virtual::StatusCode finalize ()
 finalize this algorithm
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

typedef ServiceHandle< StoreGateSvc > StoreGateSvc_t

Private Member Functions

Gaudi::Details::PropertyBase & declareGaudiProperty (Gaudi::Property< T, V, H > &hndl, const SG::VarHandleKeyType &)
 specialization for handling Gaudi::Property<SG::VarHandleKey>

Private Attributes

CP::SysListHandle m_systematicsList {this}
 We use default finalize() – this is for cleanup, and we don't do any.
CP::SysReadHandle< xAOD::IParticleContainer > m_inputHandle { this, "input", "", "Container to read" }
 Setup syst-aware input container handles.
CP::SysWriteDecorHandle< ElementLink< xAOD::IParticleContainer > > m_syst_link_decor {"systVarLink_%SYS%", this}
 Setup sys-aware output decorations.
DataObjIDColl m_extendedExtraObjects
 Extra output dependency collection, extended by AthAlgorithmDHUpdate to add symlinks.
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

Detailed Description

Definition at line 35 of file SystObjectLinkerAlg.h.

Member Typedef Documentation

◆ StoreGateSvc_t

typedef ServiceHandle<StoreGateSvc> AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::StoreGateSvc_t
privateinherited

Definition at line 376 of file AthCommonDataStore.h.

Member Function Documentation

◆ AnaReentrantAlgorithm()

EL::AnaReentrantAlgorithm::AnaReentrantAlgorithm ( const std::string & name,
ISvcLocator * pSvcLocator )

The standard constructor.

Definition at line 67 of file AnaReentrantAlgorithm.cxx.

32 : AsgComponent (name)
33#else
34 : AthReentrantAlgorithm (name, pSvcLocator)
35#endif
36 {
37 ANA_MSG_DEBUG ("AnaReentrantAlgorithm: " << name);
38 }
#define ANA_MSG_DEBUG(xmsg,...)
Macro printing debug messages.

◆ declareGaudiProperty()

Gaudi::Details::PropertyBase & AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::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< Gaudi::Algorithm > >::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< Gaudi::Algorithm > >::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< Gaudi::Algorithm > >::evtStore ( )
inlineinherited

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

Definition at line 85 of file AthCommonDataStore.h.

◆ execute()

StatusCode CP::SystObjectLinkerAlg::execute ( const EventContext & ctx) const
override

Execute method, for actions to be taken in the event loop.

Definition at line 35 of file SystObjectLinkerAlg.cxx.

36 {
37
38 // Populate a map of systematics hash to container, so we
39 // can iterate safely regardless of the ordering of systs
40 // from the SystematicsSvc
41 // (mainly avoid assumption that nominal comes first)
42 std::unordered_map<std::size_t, const xAOD::IParticleContainer*> systhash_to_container;
43 systhash_to_container.reserve(m_systematicsList.systematicsVector().size());
44 // Record the hash for the nominal for easier access
45 size_t nominal_hash{SIZE_MAX};
46 // Loop is over CP::SystematicsSet, but recommended to use auto
47 // in case this ever changes...
48 for (const auto& sys : m_systematicsList.systematicsVector())
49 {
50 const xAOD::IParticleContainer* sys_container = nullptr;
51 ATH_CHECK( m_inputHandle.retrieve(sys_container, sys, ctx) );
52
53 // Record the hash for the nominal
54 if(sys.name().empty()) {nominal_hash = sys.hash();}
55
56 // We can't find the original container if the systematics
57 // copies are empty. This is a slight vulnerability.
58 if (sys_container->empty()) {
59 ATH_MSG_DEBUG("Container for systematic variation '" << sys.name() << "' was empty.");
60 systhash_to_container.insert({sys.hash(), nullptr});
61 continue;
62 }
63
64 // Navigate to the full container, as this may be a view container
65 // holding a subset of the objects
66 // Cast from SG::AuxVectorData
67 const xAOD::IParticleContainer* full_container =
68 static_cast<const xAOD::IParticleContainer*>(sys_container->front()->container());
69 systhash_to_container.insert({sys.hash(), full_container});
70 if(full_container == sys_container) {
71 ATH_MSG_VERBOSE("The unfiltered container and the input container are the same.");
72 } else {
73 ATH_MSG_DEBUG("Read in container with " << sys_container->size() << " elements.");
74 ATH_MSG_DEBUG("Traced back to unfiltered container with " << full_container->size() << " elements.");
75 }
76 }
77
78 if(nominal_hash==SIZE_MAX) {
79 ATH_MSG_ERROR("The nominal variation was not detected!");
80 return StatusCode::FAILURE;
81 }
82
83 // Iterate over the nominal container, extract the index-parallel syst
84 // Then apply the bidirectional links as decorations
85 const xAOD::IParticleContainer* nom_cont = systhash_to_container[nominal_hash];
86 if(nom_cont==nullptr) {
87 for (const auto& sys : m_systematicsList.systematicsVector()) {
88 if(sys.hash()!=nominal_hash && systhash_to_container[sys.hash()]!=nullptr) {
89 ATH_MSG_WARNING("Nominal container is empty but the container for systematic variation '" << sys.name() << "' is not."
90 << " No nominal/systematic links will be written, so e.g. SystObjectUnioniserAlg will fail on this event.");
91 break;
92 }
93 }
94 ATH_MSG_DEBUG("Unable to retrieve the nominal container, will have to assume there are no relevant objects");
95 return StatusCode::SUCCESS;
96 }
97
98 for (const auto& sys : m_systematicsList.systematicsVector()) {
99 if(sys.hash()==nominal_hash) {continue;}
100 const xAOD::IParticleContainer *var_cont = systhash_to_container[sys.hash()];
101 if(var_cont==nullptr) {
102 ATH_MSG_ERROR("Cannot decorate syst '" << sys.name() << "'");
103 ATH_MSG_ERROR("Likely the systematics input container was empty after filtering.");
104 //must return here, the var_cont pointer is dereferenced below
105 return StatusCode::FAILURE;
106 }
107 ATH_MSG_VERBOSE("Writing decoration " << m_syst_link_decor.getName(sys));
108 for (const xAOD::IParticle* nom_obj : *nom_cont) {
109 const xAOD::IParticle* var_obj = (*var_cont)[nom_obj->index()];
110 dec_nominalObject(*var_obj) = iplink_t(*nom_cont, nom_obj->index(), ctx);
111 m_syst_link_decor.set(*nom_obj, iplink_t(*var_cont, var_obj->index(), ctx), sys);
112 ATH_MSG_VERBOSE("Nominal object with pt " << std::setprecision(3) << nom_obj->pt()/1e3 << " GeV linked to");
113 ATH_MSG_VERBOSE(" '" << sys.name() << "' varied object with pt " << std::setprecision(3) << var_obj->pt()/1e3 << " GeV.");
114 }
115 }
116
117 return StatusCode::SUCCESS;
118 }
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_DEBUG(x,...)
#define ATH_MSG_ERROR(x,...)
#define ATH_MSG_WARNING(x,...)
#define ATH_MSG_VERBOSE(x,...)
static const SG::Decorator< iplink_t > dec_nominalObject("nominalObjectLink")
CP::SysReadHandle< xAOD::IParticleContainer > m_inputHandle
Setup syst-aware input container handles.
CP::SysListHandle m_systematicsList
We use default finalize() – this is for cleanup, and we don't do any.
CP::SysWriteDecorHandle< ElementLink< xAOD::IParticleContainer > > m_syst_link_decor
Setup sys-aware output decorations.
const T * front() const
Access the first element in the collection as an rvalue.
size_type size() const noexcept
Returns the number of elements in the collection.
bool empty() const noexcept
Returns true if the collection is empty.
virtual double pt() const =0
The transverse momentum ( ) of the particle.
ElementLink< xAOD::IParticleContainer > iplink_t
const SG::AuxVectorData * container() const
Return the container holding this element.
DataVector< IParticle > IParticleContainer
Simple convenience declaration of IParticleContainer.

◆ extraDeps_update_handler()

void AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::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

◆ extraOutputDeps()

const DataObjIDColl & AthCommonAlgorithm< Gaudi::Algorithm >::extraOutputDeps ( ) const
overridevirtualinherited

Return the list of extra output dependencies.

This list is extended to include symlinks implied by inheritance relations.

Definition at line 89 of file AthCommonAlgorithm.cxx.

54{
55 // If we didn't find any symlinks to add, just return the collection
56 // from the base class. Otherwise, return the extended collection.
57 if (!m_extendedExtraObjects.empty()) {
59 }
61}
Common base class for algorithms.

◆ filterPassed()

virtual bool AthCommonAlgorithm< Gaudi::Algorithm >::filterPassed ( const EventContext & ctx) const
inlinevirtualinherited

Get filter decision:

Definition at line 93 of file AthCommonAlgorithm.h.

93 {
94 return execState( ctx ).filterPassed();
95 }
virtual bool filterPassed(const EventContext &ctx) const
Get filter decision:

◆ finalize()

StatusCode EL::AnaReentrantAlgorithm::finalize ( )
protectedinherited

finalize this algorithm

This gets called after event processing has finished. The last event may no longer be in memory, and the code should not try to access it.

Definition at line 96 of file AnaReentrantAlgorithm.cxx.

98 {
99 return StatusCode::SUCCESS;
100 }

◆ initialize()

StatusCode CP::SystObjectLinkerAlg::initialize ( )
override

Initialisation method, for setting up tools and other persistent configs.

Definition at line 18 of file SystObjectLinkerAlg.cxx.

19 {
20
21 // Read syst-aware input handles
23
24 // Intialise syst-aware output decorators
26
27 // Intialise syst list (must come after all syst-aware inputs and outputs)
28 ATH_CHECK (m_systematicsList.initialize());
29
30 ATH_MSG_DEBUG("Adding nominal/systematic object links for " << m_inputHandle.getNamePattern());
31
32 return StatusCode::SUCCESS;
33 }

◆ inputHandles()

virtual std::vector< Gaudi::DataHandle * > AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::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.

◆ isClonable()

virtual bool AthCommonAlgorithm< Gaudi::Algorithm >::isClonable ( ) const
inlineoverridevirtualinherited

Specify if the algorithm is clonable.

Only relevant for non-reentrant algorithms. Actual number of clones needs to be set via the "Cardinality" property.

Reimplemented in AFP_DigiTop, AlgB, AlgT, BCM_Digitization, CscDigitBuilder, CscDigitToCscRDO, G4AtlasAlg, G4RunAlg, HGTD_Digitization, HiveAlgBase, InDet::GNNSeedingTrackMaker, InDet::SCT_Clusterization, InDet::SiSPGNNTrackMaker, InDet::SiSPSeededTrackFinder, InDet::SiTrackerSpacePointFinder, ISF::SimKernelMT, ITk::StripDigitization, ITkPixelCablingAlg, ITkStripCablingAlg, LArHitEMapMaker, LArTTL1Maker, LUCID_DigiTop, LVL1::L1TopoSimulation, MergeCalibHits, MergeGenericMuonSimHitColl, MergeHijingPars, MergeMcEventCollection, MergeTrackRecordCollection, MergeTruthJets, MergeTruthParticles, MuonDigitizer, PileUpMTAlg, PixelDigitization, RoIBResultToxAOD, SCT_ByteStreamErrorsTestAlg, SCT_CablingCondAlgFromCoraCool, SCT_CablingCondAlgFromText, SCT_ConditionsParameterTestAlg, SCT_ConditionsSummaryTestAlg, SCT_ConfigurationConditionsTestAlg, SCT_Digitization, SCT_FlaggedConditionTestAlg, SCT_LinkMaskingTestAlg, SCT_MajorityConditionsTestAlg, SCT_ModuleVetoTestAlg, SCT_MonitorConditionsTestAlg, SCT_PrepDataToxAOD, SCT_RawDataToxAOD, SCT_ReadCalibChipDataTestAlg, SCT_ReadCalibDataTestAlg, SCT_RODVetoTestAlg, SCT_SensorsTestAlg, SCT_SiliconConditionsTestAlg, SCT_StripVetoTestAlg, SCT_TdaqEnabledTestAlg, SCT_TestCablingAlg, SCTEventFlagWriter, SCTRawDataProvider, SCTSiLorentzAngleTestAlg, SCTSiPropertiesTestAlg, SGInputLoader, Simulation::BeamEffectsAlg, TileHitVecToCnt, TileMuonFitter, TilePulseForTileMuonReceiver, TileRawChannelMaker, TRTDigitization, and ZDC_DigiTop.

Definition at line 68 of file AthCommonAlgorithm.h.

68 {
69 return true;
70 }

◆ msg()

MsgStream & AthCommonMsg< Gaudi::Algorithm >::msg ( ) const
inlineinherited

Definition at line 24 of file AthCommonMsg.h.

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

◆ msgLvl()

bool AthCommonMsg< Gaudi::Algorithm >::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< Gaudi::Algorithm > >::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.

◆ 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< Gaudi::Algorithm > >::renounce ( T & h)
inlineprotectedinherited

Definition at line 368 of file AthCommonDataStore.h.

369 {
370 h.renounce();
372 }
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< Gaudi::Algorithm > >::renounceArray ( SG::VarHandleKeyArray & handlesArray)
inlineprotectedinherited

remove all handles from I/O resolution

Definition at line 352 of file AthCommonDataStore.h.

352 {
354 }

◆ setFilterPassed()

virtual void AthCommonAlgorithm< Gaudi::Algorithm >::setFilterPassed ( bool state,
const EventContext & ctx ) const
inlinevirtualinherited

Set filter decision:

Definition at line 99 of file AthCommonAlgorithm.h.

99 {
101 }
virtual void setFilterPassed(bool state, const EventContext &ctx) const
Set filter decision:

◆ sysExecute()

StatusCode AthCommonAlgorithm< Gaudi::Algorithm >::sysExecute ( const EventContext & ctx)
overridevirtualinherited

Execute an algorithm.

We override this in order to work around an issue with the Algorithm base class storing the event context in a member variable that can cause crashes in MT jobs.

Reimplemented in AthAnalysisAlgorithm.

Definition at line 80 of file AthCommonAlgorithm.cxx.

41{
42 return BaseAlg::sysExecute (ctx);
43}

◆ sysInitialize()

StatusCode AthCommonAlgorithm< Gaudi::Algorithm >::sysInitialize ( )
overridevirtualinherited

Override sysInitialize.

Override sysInitialize from the base class.

Loop through all output handles, and if they're WriteCondHandles, automatically register them and this Algorithm with the CondSvc

Scan through all outputHandles, and if they're WriteCondHandles, register them with the CondSvc

Reimplemented from AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >.

Reimplemented in AthAnalysisAlgorithm, AthHistogramAlgorithm, HypoBase, InputMakerBase, and PyAthena::Alg.

Definition at line 60 of file AthCommonAlgorithm.cxx.

71 {
73
74 if (sc.isFailure()) {
75 return sc;
76 }
77
78 ServiceHandle<ICondSvc> cs("CondSvc",name());
79 for (auto h : outputHandles()) {
80 if (h->isCondition() && h->mode() == Gaudi::DataHandle::Writer) {
81 // do this inside the loop so we don't create the CondSvc until needed
82 if ( cs.retrieve().isFailure() ) {
83 ATH_MSG_WARNING("no CondSvc found: won't autoreg WriteCondHandles");
85 }
86 if (cs->regHandle(this,*h).isFailure()) {
88 ATH_MSG_ERROR("unable to register WriteCondHandle " << h->fullKey()
89 << " with CondSvc");
90 }
91 }
92 }
93 return sc;
94}
virtual StatusCode sysInitialize() override
virtual std::vector< Gaudi::DataHandle * > outputHandles() const override

◆ sysStart()

virtual StatusCode AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::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< Gaudi::Algorithm > >::updateVHKA ( Gaudi::Details::PropertyBase & )
inlineinherited

Definition at line 298 of file AthCommonDataStore.h.

298 {
299 for (auto &a : m_vhka) {
301 for (auto k : keys) {
302 k->setOwner(this);
303 }
304 }
305 }

Member Data Documentation

◆ m_detStore

StoreGateSvc_t AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::m_detStore
privateinherited

Pointer to StoreGate (detector store by default).

Definition at line 381 of file AthCommonDataStore.h.

◆ m_evtStore

StoreGateSvc_t AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::m_evtStore
privateinherited

Pointer to StoreGate (event store by default).

Definition at line 378 of file AthCommonDataStore.h.

◆ m_extendedExtraObjects

DataObjIDColl AthCommonAlgorithm< Gaudi::Algorithm >::m_extendedExtraObjects
privateinherited

Extra output dependency collection, extended by AthAlgorithmDHUpdate to add symlinks.

Empty if no symlinks were found.

Definition at line 108 of file AthCommonAlgorithm.h.

◆ m_inputHandle

CP::SysReadHandle<xAOD::IParticleContainer> CP::SystObjectLinkerAlg::m_inputHandle { this, "input", "", "Container to read" }
private

Setup syst-aware input container handles.

Definition at line 57 of file SystObjectLinkerAlg.h.

57{ this, "input", "", "Container to read" };

◆ m_syst_link_decor

CP::SysWriteDecorHandle<ElementLink<xAOD::IParticleContainer> > CP::SystObjectLinkerAlg::m_syst_link_decor {"systVarLink_%SYS%", this}
private

Setup sys-aware output decorations.

Definition at line 61 of file SystObjectLinkerAlg.h.

61{"systVarLink_%SYS%", this};

◆ m_systematicsList

CP::SysListHandle CP::SystObjectLinkerAlg::m_systematicsList {this}
private

We use default finalize() – this is for cleanup, and we don't do any.

Setup list of systematics on which to iterate

Definition at line 53 of file SystObjectLinkerAlg.h.

53{this};

◆ m_varHandleArraysDeclared

bool AthCommonDataStore< AthCommonMsg< Gaudi::Algorithm > >::m_varHandleArraysDeclared
privateinherited

Definition at line 387 of file AthCommonDataStore.h.

◆ m_vhka

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

Definition at line 386 of file AthCommonDataStore.h.


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