ATLAS Offline Software
Loading...
Searching...
No Matches
xAOD::Experimental::REvent Class Reference

Tool for accessing xAOD files outside of Athena, version RNTuple. More...

#include <REvent.h>

Inheritance diagram for xAOD::Experimental::REvent:
Collaboration diagram for xAOD::Experimental::REvent:

Public Types

using sgkey_t = SG::sgkey_t

Public Member Functions

 REvent ()
 Default constructor.
virtual ~REvent ()
 Destructor.
template<typename T>
bool retrieve (const T *&obj, sgkey_t key=DEFAULT_KEY, bool silent=false)
 Function retrieving an object from the event (constant version)
template<typename T>
bool retrieve (const T *&obj, const std::string &key, bool silent=false)
 Function retrieving an object from the event (constant version)
void setLevel (MSG::Level lvl)
 Change the current logging level.
Setup functions
StatusCode readFrom (std::string_view fileName)
 Set up the reading of an input file.
Persistent data accessor/modifier functions
::Long64_t getEntries () const
 Get how many entries are available from the current input file(s)
::Int_t getEntry (::Long64_t entry, ::Int_t getall=0)
 Function loading a given entry of the input TTree.
Setup functions
void setActive () const
 Set this event object as the currently active one.
void setAuxItemList (const std::string &containerKey, const std::string &itemList)
 Configure which dynamic variables to write out for a given store.
StatusCode addListener (TVirtualIncidentListener *listener)
 Register an incident listener object.
StatusCode removeListener (TVirtualIncidentListener *listener)
 Remove an incident listener object.
void clearListeners ()
 Remove all listeners from the object.
StatusCode addNameRemap (const std::string &onfile, const std::string &newName)
 Add a name re-mapping rule.
void clearNameRemap ()
 Clear the current name re-mapping.
void printNameRemap () const
 Print the current name re-mapping rules.
void printProxyWarnings (bool value=true)
 Enable warnings associated with broken element links.
Persistent data accessor/modifier functions
const EventFormatinputEventFormat () const
 Get information about the input objects.
const EventFormatoutputEventFormat () const
 Get information about the output objects.
Event data accessor/modifier functions
std::string dump ()
 Function creating a user-readable dump of the current input.
void printIOStats () const
 Function printing the I/O statistics of the current process.
template<typename T>
bool contains (const std::string &key)
 Function checking if an object is available from the store.
template<typename T>
bool transientContains (const std::string &key) const
 Function checking if an object is already in memory.
template<typename T>
StatusCode keys (std::vector< std::string > &vkeys, bool metadata) const
 Provide a list of all data object keys associated with a specific type.
template<typename T>
StatusCode retrieve (const T *&obj, const std::string &key)
 Retrieve either an input or an output object from the event.
template<typename T>
StatusCode retrieve (T *&obj, const std::string &key)
 Retrieve an output object from the event.
template<typename T>
StatusCode record (T *obj, const std::string &key)
 Add an output object to the event.
template<typename T>
StatusCode record (std::unique_ptr< T > obj, const std::string &key)
 Add an output object to the event, explicitly taking ownership of it.
StatusCode copy (const std::string &pattern=".*")
 Copy an object directly from the input to the output.
Metadata accessor/modifier functions
template<typename T>
bool containsMeta (const std::string &key)
 Function checking if a meta-object is available from the store.
template<typename T>
bool transientContainsMeta (const std::string &key) const
 Function checking if a meta-object is already in memory.
template<typename T>
StatusCode metaKeys (std::vector< std::string > &vkeys) const
 Provide a list of all metadata object keys associated with a specific type.
template<typename T>
StatusCode retrieveMetaInput (const T *&obj, const std::string &key)
 Retrieve an input metadata object.
template<typename T>
StatusCode retrieveMetaOutput (const T *&obj, const std::string &key)
 Retrieve an output metadata object.
template<typename T>
StatusCode retrieveMetaOutput (T *&obj, const std::string &key)
 Retrieve an output metadata object.
template<typename T>
StatusCode recordMeta (T *obj, const std::string &key)
 Add an object to the output file's metadata.
template<typename T>
StatusCode recordMeta (std::unique_ptr< T > obj, const std::string &key)
 Add an object to the output file's metadata, explicitly taking ownership of it.
Functions providing the same interface as AthMessaging
bool msgLvl (const MSG::Level lvl) const
 Test the output level of the object.
MsgStream & msg () const
 The standard message stream.
MsgStream & msg (const MSG::Level lvl) const
 The standard message stream.

Static Public Attributes

static constexpr sgkey_t DEFAULT_KEY = ~static_cast<sgkey_t>(0)
 Key for retrieving the "default" object of a given type.
static constexpr sgkey_t KEY_MASK = DEFAULT_KEY >> 2
 Mask for the keys, used mostly internally.

Protected Types

using Object_t
 Definition of the internal data structure type.

Protected Member Functions

bool contains (const std::string &key, const std::type_info &ti, bool metadata)
 Internal function checking if an object is in the input.
bool transientContains (const std::string &key, const std::type_info &ti, bool metadata) const
 Internal function checking if an object is already in memory.
void * getOutputObject (const std::string &key, const std::type_info &ti, bool metadata) const
 Function for retrieving an output object in a non-template way.
const void * getInputObject (const std::string &key, const std::type_info &ti, bool silent, bool metadata)
 Function for retrieving an input object in a non-template way.
StatusCode recordTypeless (void *obj, const std::string &typeName, const std::string &key, bool overwrite=false, bool metadata=true, bool isOwner=true)
 Internal function for recording an object into the output.
Functions implementing the IProxyDict interface
SG::DataProxyproxy (const void *const pTransient) const override
 get proxy for a given data object address in memory
SG::DataProxyproxy (const CLID &id, const std::string &key) const override
 get proxy with given id and key. Returns 0 to flag failure
SG::DataProxyproxy_exact (SG::sgkey_t sgkey) const override
 Get proxy given a hashed key+clid.
StatusCode addToStore (CLID id, SG::DataProxy *proxy) override
 Add a new proxy to the store.
std::vector< const SG::DataProxy * > proxies () const override
 return the list of all current proxies in store
SG::sgkey_t stringToKey (const std::string &str, CLID clid) override
 Find the string corresponding to a given key.
const std::string * keyToString (SG::sgkey_t key) const override
 Find the string corresponding to a given key.
const std::string * keyToString (SG::sgkey_t key, CLID &clid) const override
 Find the string and CLID corresponding to a given key.
void registerKey (SG::sgkey_t key, const std::string &str, CLID clid) override
 Remember an additional mapping from key to string/CLID.
SG::DataProxyrecordObject (SG::DataObjectSharedPtr< DataObject > obj, const std::string &key, bool allowMods, bool returnExisting) override
 Record an object in the store.
const std::string & name () const override
 Get the name of the instance.
Helper functions for the IProxyDict interface
const xAOD::EventFormatElementgetEventFormatElement (SG::sgkey_t sgkey) const
 Get the metadata object for a given "SG key".
const BranchInfogetBranchInfo (SG::sgkey_t sgkey) const
 Get the object describing one object/branch.

Protected Attributes

Object_t m_inputObjects
 Collection of all the managed input objects.
std::set< std::string > m_inputMissingObjects
 Objects that have been asked for, but were found to be missing in the current input.
Object_t m_outputObjects
 Collection of all the managed output object.
Object_t m_inputMetaObjects
 Collection of all the managed input meta-objects.
Object_t m_outputMetaObjects
 Collection of all the managed output meta-objects.
EventFormat m_inputEventFormat
 Format of the current input file.
EventFormatm_outputEventFormat = nullptr
 Format of the current output file.
std::unordered_map< std::string, std::set< std::string > > m_auxItemList
 Rules for selecting which auxiliary branches to write.
std::vector< TVirtualIncidentListener * > m_listeners
 Listeners who should be notified when certain incidents happen.
std::unordered_map< std::string, std::string > m_nameRemapping
 Container name re-mapping rules.
bool m_printEventProxyWarnings = false
 Option to silence common warnings that seem to be harmless.

Private Member Functions

StatusCode initStats ()
 Function to initialise the statistics for all Tree content.
StatusCode setUpDynamicStore (RObjectManager &mgr, ROOT::RNTupleReader &ntupleReader)
 event uses RNTupleReader:
void initMessaging () const
 Initialize our message level and MessageSvc.
Functions implemented from @c xAOD::Event
bool hasInput () const override
 Check if an input file is connected to the object.
bool hasOutput () const override
 Check if an output file is connected to the object.
StatusCode getNames (const std::string &targetClassName, std::vector< std::string > &vkeys, bool metadata) const override
 Function determining the list keys associated with a type name.
StatusCode connectObject (const std::string &key, bool silent) override
 Function setting up access to a particular object.
StatusCode connectMetaObject (const std::string &key, bool silent) override
 Function setting up access to a particular metadata object.
StatusCode connectAux (const std::string &prefix, bool standalone) override
 Function setting up access to a set of auxiliary branches.
StatusCode connectMetaAux (const std::string &prefix, bool standalone) override
 Function setting up access to a set of auxiliary branches for a metadata object.
StatusCode setAuxStore (const std::string &key, Details::IObjectManager &mgr, bool metadata) override
 Function connecting a DV object to its auxiliary store.
StatusCode record (void *obj, const std::string &typeName, const std::string &key, bool overwrite, bool metadata, bool isOwner) override
 Record an object into a connected output file.
StatusCode recordAux (TVirtualManager &mgr, const std::string &key, bool metadata) override
 Record an auxiliary store into a connected output file.

Private Attributes

std::unique_ptr< ROOT::RNTupleReader > m_eventReader
 The main event data reader.
bool m_inputNTupleIsMissing = false
 Whether the input has an event RNTuple or not.
std::unique_ptr< ROOT::RNTupleReader > m_metaReader
 The metadata reader.
::Long64_t m_entry {}
 The entry to look at from the input tree.
std::string m_nm
 Message source name.
boost::thread_specific_ptr< MsgStream > m_msg_tls
 MsgStream instance (a std::cout like with print-out levels)
std::atomic< IMessageSvc * > m_imsg { nullptr }
 MessageSvc pointer.
std::atomic< MSG::Level > m_lvl { MSG::NIL }
 Current logging level.

Functions implementing the @c xAOD::TVirtualEvent interface

SG::sgkey_t getHash (const std::string &key) const override
 Function returning the hash describing an object name.
SG::sgkey_t getKey (const void *obj) const override
 Function returning the hash describing a known object.
const std::string & getName (const void *obj) const override
 Function returning the key describing a known object.
const std::string & getName (SG::sgkey_t hash) const override
 Function returning the key describing a known object.
void * getOutputObject (SG::sgkey_t key, const std::type_info &ti) override
 Function for retrieving an output object in a non-template way.
const void * getInputObject (SG::sgkey_t key, const std::type_info &ti, bool silent) override
 Function for retrieving an input object in a non-template way.

Variable(s) used in the @c IProxyDict implementation

using upgrade_mutex_t = AthContainers_detail::upgrade_mutex
 Mutex type for multithread synchronization.
using upgrading_lock_t
 Lock type for multithread synchronization.
upgrade_mutex_t m_branchesMutex
 Mutex for multithread synchronization.
SG::SGKeyMap< BranchInfo > m_branches ATLAS_THREAD_SAFE
 Map from hashed sgkey to BranchInfo.

Detailed Description

Tool for accessing xAOD files outside of Athena, version RNTuple.

Proper access to xAOD files in ROOT (outside of Athena) needs to be done through such an object. It takes care of reading and writing xAOD files together with their file format metadata, setting up smart pointers correctly, etc.

Definition at line 28 of file REvent.h.

Member Typedef Documentation

◆ Object_t

using xAOD::Event::Object_t
protectedinherited
Initial value:
std::unordered_map<std::string, std::unique_ptr<TVirtualManager>>

Definition of the internal data structure type.

Definition at line 304 of file Event.h.

◆ sgkey_t

Definition at line 29 of file TVirtualEvent.h.

◆ upgrade_mutex_t

using xAOD::Event::upgrade_mutex_t = AthContainers_detail::upgrade_mutex
protectedinherited

Mutex type for multithread synchronization.

Definition at line 349 of file Event.h.

◆ upgrading_lock_t

using xAOD::Event::upgrading_lock_t
protectedinherited
Initial value:

Lock type for multithread synchronization.

Definition at line 351 of file Event.h.

Constructor & Destructor Documentation

◆ REvent()

xAOD::Experimental::REvent::REvent ( )

Default constructor.

Definition at line 73 of file REvent.cxx.

73: Event("xAOD::Experimental::REvent") {}
Event(std::string_view name)
Constructor with a name.
Definition EventCore.cxx:27

◆ ~REvent()

xAOD::Experimental::REvent::~REvent ( )
virtual

Destructor.

Definition at line 75 of file REvent.cxx.

75 {
76
77 // Clear the input and output objects before the input/output files would be
78 // closed. Otherwise we can be left with RNTuple view objects pointing
79 // nowhere.
80 m_inputObjects.clear();
81 m_outputObjects.clear();
82}
Object_t m_inputObjects
Collection of all the managed input objects.
Definition Event.h:308
Object_t m_outputObjects
Collection of all the managed output object.
Definition Event.h:313

Member Function Documentation

◆ addListener()

StatusCode Event::addListener ( TVirtualIncidentListener * listener)
inherited

Register an incident listener object.

This function works pretty much like IIncidentSvc::addListener does in Athena.

It tells the TEvent object that when certain "interesting incidents" happen, a given object should be notified about it.

Parameters
listenerPointer to the object that should be notified
Returns
The usual StatusCode types

Definition at line 97 of file EventCore.cxx.

97 {
98
99 // Check that we received a valid pointer:
100 if (listener == nullptr) {
101 ATH_MSG_ERROR("Received a null pointer for the listener");
102 return StatusCode::FAILURE;
103 }
104
105 // Check whether we already have this listener.
106 auto itr = std::find(m_listeners.begin(), m_listeners.end(), listener);
107 if (itr != m_listeners.end()) {
108 ATH_MSG_WARNING("Listener " << static_cast<void*>(listener)
109 << " is already registered");
110 return StatusCode::SUCCESS;
111 }
112
113 // Add the listener.
114 m_listeners.push_back(listener);
115
116 // Return gracefully:
117 return StatusCode::SUCCESS;
118}
#define ATH_MSG_ERROR(x)
#define ATH_MSG_WARNING(x)
std::vector< TVirtualIncidentListener * > m_listeners
Listeners who should be notified when certain incidents happen.
Definition Event.h:329

◆ addNameRemap()

StatusCode Event::addNameRemap ( const std::string & onfile,
const std::string & newName )
inherited

Add a name re-mapping rule.

The names of containers can change during the lifetime of the experiment.

One such change happened after the DC14 exercise, when many containers got a new name. (Like "ElectronCollection" became simply "Electrons".)

This function allows us to create aliases with which certain containers should be accessible. So that the analyser would be able to access older files, while using the latest container name(s).

Parameters
onfileThe name of the container as it was saved into the input file
newNameThe alias with which the object/container should be accessible
Returns
The usual StatusCode types

Save the new name association:

Definition at line 162 of file EventCore.cxx.

163 {
164
165 // Check if this name is known on the input or output already. As that's
166 // not good.
167 if (m_inputEventFormat.exists(newName)) {
168 ATH_MSG_ERROR("Can't use \"" << newName << "\" as the target name in the \""
169 << onfile << "\" -> \"" << newName
170 << "\" remapping");
171 return StatusCode::FAILURE;
172 }
173
174 // Check if this name was remapped to something already.
175 auto itr = m_nameRemapping.find(newName);
176 if (itr != m_nameRemapping.end()) {
177 ATH_MSG_WARNING("Overriding existing name remapping \""
178 << itr->second << "\" -> \"" << itr->first << "\" with: \""
179 << onfile << "\" -> \"" << newName << "\"");
180 }
181
183 m_nameRemapping[newName] = onfile;
184
185 // Return gracefully:
186 return StatusCode::SUCCESS;
187}
EventFormat m_inputEventFormat
Format of the current input file.
Definition Event.h:321
std::unordered_map< std::string, std::string > m_nameRemapping
Container name re-mapping rules.
Definition Event.h:332

◆ addToStore()

StatusCode Event::addToStore ( CLID clid,
SG::DataProxy * proxy )
overrideprotectedinherited

Add a new proxy to the store.

Smart pointers to objects that don't exist in the input event, can end up calling this function.

In this case warn the user that something fishy is happening, and take posession of the received proxy.

Parameters
clidThe CLID of the type. Not taken into account.
proxyThe proxy to take posession of. Not used for anything useful.

Definition at line 251 of file EventIProxyDict.cxx.

251 {
252
254
255 // Warn the user that the function got called:
256 static std::atomic_flag warningPrinted ATLAS_THREAD_SAFE = ATOMIC_FLAG_INIT;
257 if (!warningPrinted.test_and_set() && m_printEventProxyWarnings) {
259 "Function should only be called through an invalid ElementLink");
260 }
261
262 // Hold on to the proxy with some non-existent, hopefully unique key:
263 const ::TString uniqueKey =
264 ::TString::Format("NonExistentKey_%lu", m_branches.size());
265 BranchInfo bi;
266 bi.m_proxy.reset(proxy);
267 lock.upgrade();
268 m_branches.insert(
269 std::make_pair(stringToKey(uniqueKey.Data(), clid), std::move(bi)));
270
271 // Return gracefully:
272 return StatusCode::SUCCESS;
273}
SG::sgkey_t stringToKey(const std::string &str, CLID clid) override
Find the string corresponding to a given key.
upgrade_mutex_t m_branchesMutex
Mutex for multithread synchronization.
Definition Event.h:354
AthContainers_detail::upgrading_lock< upgrade_mutex_t > upgrading_lock_t
Lock type for multithread synchronization.
Definition Event.h:351
bool m_printEventProxyWarnings
Option to silence common warnings that seem to be harmless.
Definition Event.h:335
SG::SGKeyMap< BranchInfo > m_branches ATLAS_THREAD_SAFE
Map from hashed sgkey to BranchInfo.
Definition Event.h:358
SG::DataProxy * proxy(const void *const pTransient) const override
get proxy for a given data object address in memory
Helper struct used by the IProxyDict code.
Definition Event.h:341
std::unique_ptr< SG::DataProxy > m_proxy
Data proxy describing this branch/object.
Definition Event.h:343

◆ clearListeners()

void Event::clearListeners ( )
inherited

Remove all listeners from the object.

This function can be used to remove all the listeners from the internal list.

Should not be necessary under regular circumstances.

Definition at line 143 of file EventCore.cxx.

143 {
144
145 m_listeners.clear();
146}

◆ clearNameRemap()

void Event::clearNameRemap ( )
inherited

Clear the current name re-mapping.

This function simply clears out any existing name remapping declarations.

In case the remapping rules need to be changed in the code in some complicated way.

Definition at line 193 of file EventCore.cxx.

193 {
194
195 m_nameRemapping.clear();
196}

◆ connectAux()

StatusCode xAOD::Experimental::REvent::connectAux ( const std::string & prefix,
bool standalone )
overrideprivatevirtual

Function setting up access to a set of auxiliary branches.

This function is used internally to connect an auxiliary object to the input.

Based on the configuration of the object it will either use RAuxStore, or the EDM object that was used to write the auxiliary information in Athena.

Parameters
prefixThe prefix (main branch name) of the auxiliary data
standaloneType of the auxiliary store that should be created
Returns
kTRUE if the connection was successful, or kFALSE if it was not

Implements xAOD::Event.

Definition at line 593 of file REvent.cxx.

593 {
594
595 // A little sanity check.
596 if (!m_eventReader) {
597 ATH_MSG_ERROR("Function called on un-initialised object");
598 return StatusCode::FAILURE;
599 }
600
601 // Check if the field is already connected.
602 if (m_inputObjects.contains(prefix)) {
603 return StatusCode::SUCCESS;
604 }
605
606 // Connect to the field as we would for any other.
607 static constexpr bool SILENT = false;
608 ATH_CHECK(connectObject(prefix, SILENT));
609
610 // Access the object's manager.
611 Object_t::const_iterator mgr_itr = m_inputObjects.find(prefix);
612 if (mgr_itr == m_inputObjects.end()) {
613 ATH_MSG_FATAL("There's a logic error in the code");
614 return StatusCode::FAILURE;
615 }
616 const Details::IObjectManager* omgr =
617 dynamic_cast<const RObjectManager*>(mgr_itr->second.get());
618 if (omgr == nullptr) {
619 ATH_MSG_FATAL("There's a logic error in the code");
620 return StatusCode::FAILURE;
621 }
622
623 // Check if we can switch out the internal store of this object.
624 static const TClass* const holderClass =
625 TClass::GetClass(typeid(SG::IAuxStoreHolder));
626 if (omgr->holder()->getClass()->InheritsFrom(holderClass) == false) {
627 // Nope... So let's just end the journey here.
628 return StatusCode::SUCCESS;
629 }
630
631 // Try to get the object as an IAuxStoreHolder.
632 SG::IAuxStoreHolder* storeHolder = reinterpret_cast<SG::IAuxStoreHolder*>(
633 omgr->holder()->getAs(typeid(SG::IAuxStoreHolder)));
634 if (!storeHolder) {
635 ATH_MSG_FATAL("There's a logic error in the code");
636 return StatusCode::FAILURE;
637 }
638
639 // A sanity check to see whether the store's type is in sync with the
640 // object's type that it will be connected to:
641 if ((standalone &&
643 ((!standalone) && (storeHolder->getStoreType() !=
645 ATH_MSG_ERROR("Requested store types inconsistent for: " << prefix);
646 ATH_MSG_ERROR("standalone = "
647 << standalone << ", getStoreType() = "
648 << static_cast<int>(storeHolder->getStoreType()));
649 return StatusCode::FAILURE;
650 }
651
652 // Return gracefully.
653 return StatusCode::SUCCESS;
654}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_FATAL(x)
@ AST_ContainerStore
The store describes a container.
@ AST_ObjectStore
The store describes a single object.
virtual AuxStoreType getStoreType() const =0
Return the type of the store object.
std::unique_ptr< ROOT::RNTupleReader > m_eventReader
The main event data reader.
Definition REvent.h:102
StatusCode connectObject(const std::string &key, bool silent) override
Function setting up access to a particular object.
Definition REvent.cxx:364
@ SILENT
don't print anything and return success

◆ connectMetaAux()

StatusCode xAOD::Experimental::REvent::connectMetaAux ( const std::string & prefix,
bool standalone )
overrideprivatevirtual

Function setting up access to a set of auxiliary branches for a metadata object.

This function is used internally to connect an auxiliary metadata object to the input.

Based on the configuration of the object it will either use TAuxStore, or the EDM object that was used to write the auxiliary information in Athena.

Parameters
prefixThe prefix (main branch name) of the auxiliary data
standaloneType of the auxiliary store that should be created
Returns
The usual StatusCode types

Implements xAOD::Event.

Definition at line 665 of file REvent.cxx.

666 {
667
668 // A little sanity check.
669 if (!m_metaReader) {
670 ATH_MSG_ERROR("Function called on un-initialised object");
671 return StatusCode::FAILURE;
672 }
673
674 // Check if the field is already connected.
675 if (m_inputMetaObjects.contains(prefix)) {
676 return StatusCode::SUCCESS;
677 }
678
679 // Connect to the field as we would for any other.
680 static constexpr bool SILENT = false;
681 ATH_CHECK(connectMetaObject(prefix, SILENT));
682
683 // Access the object's manager.
684 Object_t::const_iterator mgr_itr = m_inputMetaObjects.find(prefix);
685 if (mgr_itr == m_inputMetaObjects.end()) {
686 ATH_MSG_FATAL("There's a logic error in the code");
687 return StatusCode::FAILURE;
688 }
689 const Details::IObjectManager* omgr =
690 dynamic_cast<const RObjectManager*>(mgr_itr->second.get());
691 if (omgr == nullptr) {
692 ATH_MSG_FATAL("There's a logic error in the code");
693 return StatusCode::FAILURE;
694 }
695
696 // Check if we can switch out the internal store of this object.
697 static const TClass* const holderClass =
698 TClass::GetClass(typeid(SG::IAuxStoreHolder));
699 if (omgr->holder()->getClass()->InheritsFrom(holderClass) == false) {
700 // Nope... So let's just end the journey here.
701 return StatusCode::SUCCESS;
702 }
703
704 // Try to get the object as an IAuxStoreHolder.
705 SG::IAuxStoreHolder* storeHolder = reinterpret_cast<SG::IAuxStoreHolder*>(
706 omgr->holder()->getAs(typeid(SG::IAuxStoreHolder)));
707 if (!storeHolder) {
708 ATH_MSG_FATAL("There's a logic error in the code");
709 return StatusCode::FAILURE;
710 }
711
712 // A sanity check to see whether the store's type is in sync with the
713 // object's type that it will be connected to:
714 if ((standalone &&
716 ((!standalone) && (storeHolder->getStoreType() !=
718 ATH_MSG_ERROR("Requested store types inconsistent for: " << prefix);
719 ATH_MSG_ERROR("standalone = "
720 << standalone << ", getStoreType() = "
721 << static_cast<int>(storeHolder->getStoreType()));
722 return StatusCode::FAILURE;
723 }
724
725 // Return gracefully.
726 return StatusCode::SUCCESS;
727}
Object_t m_inputMetaObjects
Collection of all the managed input meta-objects.
Definition Event.h:316
std::unique_ptr< ROOT::RNTupleReader > m_metaReader
The metadata reader.
Definition REvent.h:106
StatusCode connectMetaObject(const std::string &key, bool silent) override
Function setting up access to a particular metadata object.
Definition REvent.cxx:502

◆ connectMetaObject()

StatusCode xAOD::Experimental::REvent::connectMetaObject ( const std::string & key,
bool silent )
overrideprivatevirtual

Function setting up access to a particular metadata object.

This is the function doing the heavy lifting with creating metadata objects in memory out of the payload of the input file.

Parameters
keyThe key (branch name) of the metadata object to retrieve
silentSet to kTRUE to make the code fail silently in case the branch can't be connected to
Returns
The usual StatusCode types

Implements xAOD::Event.

Definition at line 502 of file REvent.cxx.

502 {
503
504 // A little sanity check.
505 if (!m_metaReader) {
506 ATH_MSG_ERROR("Function called on un-initialised object");
507 return StatusCode::FAILURE;
508 }
509
510 // Check if the branch is already connected.
511 if (m_inputMetaObjects.contains(key)) {
512 return StatusCode::SUCCESS;
513 }
514
515 // RNTuples store fields with an "Aux:" postfix instead of "Aux.".
516 std::string key_to_read = key;
517 if (key.ends_with("Aux.")) {
518 key_to_read.replace(key_to_read.size() - 1, 1, ":");
519 }
520
521 // Check if the field exists in our input RNTuple.
522 if (m_metaReader->GetDescriptor().FindFieldId(key_to_read.c_str()) ==
523 ROOT::kInvalidDescriptorId) {
524 // Field doesn't exist
525 if (!silent) {
526 ATH_MSG_WARNING("Field \"" << key_to_read << "\" not available on input");
527 }
528 return StatusCode::RECOVERABLE;
529 }
530
531 // RDS: may need some logic here to get type from inputEventFormat rather than
532 // the view
533 // to read in with automatic schema evolution
534
535 // Get class name from the field
536 ROOT::RNTupleView<void> view =
537 m_metaReader->GetView<void>(key_to_read.c_str(), nullptr);
538 std::string className = view.GetField().GetTypeName();
539 if (className == "") {
541 "Couldn't find an appropriate type with a dictionary for field \""
542 << key_to_read << "\"");
543 return StatusCode::FAILURE;
544 }
545 ::TClass* realClass = ::TClass::GetClass(className.c_str());
546 if ((!realClass) || (!realClass->IsLoaded())) {
547 // Now we're in trouble...
549 "Couldn't find an appropriate type with a dictionary for field \""
550 << key_to_read << "\"");
551 return StatusCode::FAILURE;
552 }
553
554 // Create the object and the manager(s) around it.
555 void* ptr = realClass->New();
556 static const ::Long64_t FIRST_ENTRY = 0;
557 auto mgr = std::make_unique<RObjectManager>(
558 m_metaReader->GetView(key_to_read, ptr, className), FIRST_ENTRY,
559 std::make_unique<THolder>(ptr, realClass));
560 // For metadata, we must read in the first entry - entry number already set by FIRST_ENTRY in constructor
561 mgr->getEntry();
562 RObjectManager* mgrPtr = mgr.get();
563 m_inputMetaObjects[key] = std::move(mgr);
564
565 // If it's an auxiliary store object, set it up correctly.
566 if (Details::isAuxStore(*(mgrPtr->holder()->getClass()))) {
567 // For reading in of the dynamic variables for metadata
569 }
570
571 // If it (probably) has an associated auxiliary store, set it up as well.
572 if (Details::hasAuxStore(*(mgrPtr->holder()->getClass()))) {
574 key + "Aux.", Details::isStandalone(*(mgrPtr->holder()->getClass()))));
575 static constexpr bool METADATA = true;
576 ATH_CHECK(setAuxStore(key, *mgrPtr, METADATA));
577 }
578
579 // Return gracefully.
580 return StatusCode::SUCCESS;
581} // connectMetaObject
StatusCode setUpDynamicStore(RObjectManager &mgr, ROOT::RNTupleReader &ntupleReader)
event uses RNTupleReader:
Definition REvent.cxx:960
StatusCode connectMetaAux(const std::string &prefix, bool standalone) override
Function setting up access to a set of auxiliary branches for a metadata object.
Definition REvent.cxx:665
StatusCode setAuxStore(const std::string &key, Details::IObjectManager &mgr, bool metadata) override
Function connecting a DV object to its auxiliary store.
Definition REvent.cxx:740
void * ptr(T *p)
Definition SGImplSvc.cxx:74
bool hasAuxStore(const TClass &cl)
Helper function deciding if a given type "has an auxiliary store".
Definition IOUtils.cxx:40
bool isAuxStore(const TClass &cl)
Helper function deciding if a given type "is an auxiliary store".
Definition IOUtils.cxx:53
bool isStandalone(const TClass &cl)
Helper function deciding if a given type "is a standalone object".
Definition IOUtils.cxx:65

◆ connectObject()

StatusCode xAOD::Experimental::REvent::connectObject ( const std::string & key,
bool silent )
overrideprivatevirtual

Function setting up access to a particular object.

This is one of the more important functions of the class.

It connects the event object to a given field of the input RNTuple.

The type that is read in to memory is not actually determined by the type written to the ntuple itself, but from the xAOD::EventFormat object. Which is there to make it possible to possibly use ROOT read rules to read a different type than what's on disk.

Everything else is fairly basic ROOT stuff, the code just has to make sure that the memory management is set up correctly for the created object.

Parameters
keyThe name of the branch to connect to
silentSet to true to make the code fail silently in case the field can't be connected to
Returns
The usual StatusCode values

Implements xAOD::Event.

Definition at line 364 of file REvent.cxx.

364 {
365
366 // A little sanity check.
367 if (!m_eventReader) {
368 ATH_MSG_ERROR("Function called on un-initialised object");
369 return StatusCode::FAILURE;
370 }
371
372 // Increment the access counter on this container.
374
375 // Check if the branch is already connected.
376 if (m_inputObjects.contains(key)) {
377 return StatusCode::SUCCESS;
378 }
379 // Check if it was already found to be missing.
380 if (m_inputMissingObjects.contains(key)) {
381 if (!silent) {
382 ATH_MSG_WARNING("Field \"" << key << "\" not available on input");
383 }
384 return StatusCode::RECOVERABLE;
385 }
386
387 // Tell the user what's happening.
388 ATH_MSG_DEBUG("Connecting to branch \"" << key << "\"");
389
390 // Check if we have metadata about this branch.
391 const xAOD::EventFormatElement* ef = nullptr;
392
393 // RNTuples store fields with an "Aux:" postfix instead of "Aux.".
394 std::string key_to_read = key;
395 if (key.ends_with("Aux.")) {
396 key_to_read.replace(key_to_read.size() - 1, 1, ":");
397 }
398
399 if (m_inputEventFormat.exists(key) == false) {
400 if (!silent) {
401 ATH_MSG_WARNING("No metadata available for object: " << key);
402 }
403 } else {
404 ef = m_inputEventFormat.get(key);
405 }
406
407 // Check if the field exists in our input RNTuple.
408 if (m_eventReader->GetDescriptor().FindFieldId(key_to_read.c_str()) ==
409 ROOT::kInvalidDescriptorId) {
410 // Field doesn't exist
411 if (!silent) {
412 ATH_MSG_WARNING("Field \"" << key_to_read << "\" not available on input");
413 }
414 m_inputMissingObjects.insert(key);
415 return StatusCode::RECOVERABLE;
416 }
417
418 // RDS: may need some logic here to get type from inputEventFormat rather than
419 // the view
420 // to read in with automatic schema evolution
421
422 // Get class name from the field
423 ROOT::RNTupleView<void> view =
424 m_eventReader->GetView<void>(key_to_read.c_str(), nullptr);
425 std::string className = view.GetField().GetTypeName();
426 if (className == "") {
427 if (ef) {
428 // This is a fairly weird situation, but let's fall back to taking
429 // the class name from the metadata object in this case.
430 className = ef->className();
431 } else {
433 "Couldn't find an appropriate type with a dictionary for field \""
434 << key_to_read << "\"");
435 return StatusCode::FAILURE;
436 }
437 }
438 ::TClass* realClass = ::TClass::GetClass(className.c_str());
439 if (((!realClass) || (!realClass->IsLoaded())) && ef) {
440 // We may need to do an actual schema evolution here, in which
441 // case let's fall back on the class name coming from the metadata
442 // object.
443 className = ef->className();
444 realClass = ::TClass::GetClass(className.c_str());
445 }
446 if ((!realClass) || (!realClass->IsLoaded())) {
447 // Now we're in trouble...
449 "Couldn't find an appropriate type with a dictionary for field \""
450 << key_to_read << "\"");
451 return StatusCode::FAILURE;
452 }
453
454 // Make sure that the current object is the "active event":
455 setActive();
456
457 // Check if the output already has this object. If it does, let's
458 // assume that we have been copying the object to the output. Which
459 // means that we need to resume filling the same memory address that
460 // the output holder points to.
461 void* ptr = nullptr;
462
463 // Handle the case where an output object with this key already exists.
464
465 // If there is no output object, then let's create one ourselves.
466 // This is the only way in which we can have the memory management of
467 // THolder do the right thing with this object.
468 if (ptr == nullptr) {
469 ptr = realClass->New();
470 }
471
472 // Create the new manager object that will hold this EDM object.
473 auto mgr = std::make_unique<RObjectManager>(
474 m_eventReader->GetView(key_to_read, ptr, className), m_entry,
475 std::make_unique<THolder>(ptr, realClass));
476 RObjectManager* mgrPtr = mgr.get();
477 m_inputObjects[key] = std::move(mgr);
478
479 // If it's an auxiliary store object, set it up correctly.
480 if (Details::isAuxStore(*(mgrPtr->holder()->getClass()))) {
482 }
483
484 // If it (probably) has an associated auxiliary store, set it up as well.
485 if (Details::hasAuxStore(*(mgrPtr->holder()->getClass()))) {
487 key + "Aux.", Details::isStandalone(*(mgrPtr->holder()->getClass()))));
488 }
489
490 // Return gracefully.
491 return StatusCode::SUCCESS;
492}
#define ATH_MSG_DEBUG(x)
std::set< std::string > m_inputMissingObjects
Objects that have been asked for, but were found to be missing in the current input.
Definition Event.h:311
void setActive() const
Set this event object as the currently active one.
Definition EventCore.cxx:54
::Long64_t m_entry
The entry to look at from the input tree.
Definition REvent.h:109
StatusCode connectAux(const std::string &prefix, bool standalone) override
Function setting up access to a set of auxiliary branches.
Definition REvent.cxx:593
ReadStats & stats()
Access the object belonging to the current thread.
Definition IOStats.cxx:17
static IOStats & instance()
Singleton object accessor.
Definition IOStats.cxx:11
void readContainer(const std::string &name)
Function incrementing the read counter on a specific container.

◆ contains() [1/2]

template<typename T>
bool xAOD::Event::contains ( const std::string & key)
inherited

Function checking if an object is available from the store.

◆ contains() [2/2]

bool xAOD::Event::contains ( const std::string & key,
const std::type_info & ti,
bool metadata )
protectedinherited

Internal function checking if an object is in the input.

◆ containsMeta()

template<typename T>
bool xAOD::Event::containsMeta ( const std::string & key)
inherited

Function checking if a meta-object is available from the store.

◆ copy()

StatusCode Event::copy ( const std::string & pattern = ".*")
inherited

Copy an object directly from the input to the output.

This function can be used to easily copy a given (set of) object/container(s) to the output, without modifying the contents of it/them.

It only needs to be called on the interface object/container(s), the copying of the auxiliary data is done automatically, and is steered by the xAOD::Event::setAuxItemList function.

Parameters
patternRegular expression for the key(s)/name(s) of the object(s)/container(s) to copy

Definition at line 28 of file EventIO.cxx.

28 {
29
30 // Tell the user what's happening.
31 ATH_MSG_DEBUG("Copying objects matching pattern \"" << pattern
32 << "\" to the output");
33
34 // Collect a list of keys to copy.
35 std::set<std::string> keys;
36
37 // The regular expression to use.
38 std::regex re{pattern};
39
40 // Loop over the known input containers.
41 for (const auto& [key, efe] : m_inputEventFormat) {
42
43 // Tell the user what's happening.
44 ATH_MSG_VERBOSE("Considering input object with key \"" << key << "\"");
45
46 // Check if the class in question matches the requested pattern.
47 if (std::regex_match(key, re) == false) {
48 continue;
49 }
50 // Skip all branches ending in "Aux.":
51 if (key.ends_with("Aux.")) {
52 continue;
53 }
54 // Also skip dynamic branches:
55 if (efe.parentName() != "") {
56 continue;
57 }
58 // Ignore objects that don't exist on the input.
59 static const bool SILENT = true;
60 if (connectObject(key, SILENT).isSuccess() == false) {
61 continue;
62 }
63 // Add the key to the list.
64 ATH_MSG_VERBOSE("Matched key \"" << key << "\"");
65 keys.insert(key);
66 }
67
68 // Check if the pattern matches any of the name remapping rules.
69 for (const auto& [newname, onfile] : m_nameRemapping) {
70
71 // Tell the user what's happening.
72 ATH_MSG_VERBOSE("Considering remapped key \"" << newname << "\"");
73
74 // Check if the remapped name matches the pattern.
75 if (std::regex_match(newname, re) == false) {
76 continue;
77 }
78 // Ignore objects that don't exist on the input.
79 static const bool SILENT = true;
80 if (connectObject(onfile, SILENT).isSuccess() == false) {
81 continue;
82 }
83 // Add the remapped name to the list.
84 ATH_MSG_VERBOSE("Matched remapped key \"" << newname << "\"");
85 keys.insert(newname);
86 }
87
88 // Now loop over all of the found keys.
89 for (const std::string& key : keys) {
90
91 // Check if a name re-mapping should be applied or not.
92 std::string keyToUse = key;
93 auto remap_itr = m_nameRemapping.find(key);
94 if ((remap_itr != m_nameRemapping.end()) &&
95 (!m_inputEventFormat.exists(key)) &&
96 m_inputEventFormat.exists(remap_itr->second)) {
97 keyToUse = remap_itr->second;
98 }
99
100 // Make sure that the input object got connected to.
101 static const bool SILENT = false;
102 ATH_CHECK(connectObject(keyToUse, SILENT));
103
104 // Make sure that the input object is properly updated.
105 Object_t::const_iterator vobjMgr = m_inputObjects.find(keyToUse);
106 if (vobjMgr == m_inputObjects.end()) {
107 ATH_MSG_FATAL("Internal logic error detected");
108 return StatusCode::FAILURE;
109 }
110 Details::IObjectManager* objMgr =
111 dynamic_cast<Details::IObjectManager*>(vobjMgr->second.get());
112 if (objMgr == nullptr) {
113 ATH_MSG_FATAL("Internal logic error detected");
114 return StatusCode::FAILURE;
115 }
116 static const bool METADATA = false;
117 if (getInputObject(keyToUse, *(objMgr->holder()->getClass()->GetTypeInfo()),
118 SILENT, METADATA) == nullptr) {
119 ATH_MSG_FATAL("Internal logic error detected");
120 return StatusCode::FAILURE;
121 }
122
123 // Put the interface object into the output.
124 static const bool OVERWRITE = true;
125 static const bool IS_OWNER = true;
126 ATH_CHECK(record(objMgr->object(), objMgr->holder()->getClass()->GetName(),
127 key, OVERWRITE, METADATA, IS_OWNER));
128
129 // If there is also an auxiliary store for this object/container, copy that
130 // as well.
131 const std::string auxKey = keyToUse + "Aux.";
132 if (m_inputObjects.contains(auxKey)) {
133 ATH_CHECK(
134 recordAux(*(m_inputObjects.at(auxKey)), key + "Aux.", METADATA));
135 }
136 }
137
138 // Return gracefully:
139 return StatusCode::SUCCESS;
140}
const boost::regex re(r_e)
#define ATH_MSG_VERBOSE(x)
virtual StatusCode recordAux(TVirtualManager &mgr, const std::string &key, bool metadata)=0
Record an auxiliary store into a connected output file.
const void * getInputObject(SG::sgkey_t key, const std::type_info &ti, bool silent) override
Function for retrieving an input object in a non-template way.
virtual StatusCode connectObject(const std::string &key, bool silent)=0
Function setting up access to a particular object.
StatusCode record(T *obj, const std::string &key)
Add an output object to the event.
StatusCode keys(std::vector< std::string > &vkeys, bool metadata) const
Provide a list of all data object keys associated with a specific type.
@ OVERWRITE
create the directory as is, removing existing directories if needed

◆ dump()

std::string Event::dump ( )
inherited

Function creating a user-readable dump of the current input.

This function behaves exactly like StoreGateSvc::dump().

It doesn't actually print anything to the screen, it just returns a user readable dump of the contents of the current input file/chain.

It is a pretty dumb implementation for the moment. Should be made nicer later on.

Returns
The user-readable contents of the current input file/chain

Definition at line 250 of file EventCore.cxx.

250 {
251
252 // The internal stream object.
253 std::ostringstream ost;
254 ost << "<<<<<<<<<<<<<<<<<<<< xAOD::TEvent Dump >>>>>>>>>>>>>>>>>>>>\n";
255
256 // Loop over the input EventFormat object.
257 for (const auto& [key, element] : m_inputEventFormat) {
258
259 // Get the type.
260 ::TClass* cl = ::TClass::GetClass(element.className().c_str());
261 const std::type_info* ti = (cl ? cl->GetTypeInfo() : nullptr);
262 if ((cl == nullptr) || (cl->IsLoaded() == false) || (ti == nullptr)) {
263 ATH_MSG_WARNING("Unknown type (" << element.className()
264 << ") found in the event format");
265 continue;
266 }
267
268 // Skip containers that are not available anyway.
269 static const bool METADATA = false;
270 if (!contains(element.branchName(), *ti, METADATA)) {
271 continue;
272 }
273
274 // Do the printout.
275 ost << " Hash: 0x" << std::setw(8) << std::setfill('0') << std::hex
276 << element.hash() << " Key: \"" << element.branchName() << "\"\n";
277
278 ost << " type: " << element.className() << "\n";
279 const bool isNonConst =
280 transientContains(element.branchName(), *ti, METADATA);
281 ost << " isConst: " << (isNonConst ? "No" : "Yes") << "\n";
282 static const bool SILENT = false;
283 ost << " Data: "
284 << (isNonConst
285 ? getOutputObject(element.branchName(), *ti, METADATA)
286 : getInputObject(element.branchName(), *ti, SILENT, METADATA))
287 << "\n";
288 }
289
290 // Finish with the construction:
291 ost << "<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>";
292 return ost.str();
293}
bool transientContains(const std::string &key) const
Function checking if an object is already in memory.
bool contains(const std::string &key)
Function checking if an object is available from the store.
void * getOutputObject(SG::sgkey_t key, const std::type_info &ti) override
Function for retrieving an output object in a non-template way.
cl
print [x.__class__ for x in toList(dqregion.getSubRegions()) ]

◆ getBranchInfo()

const Event::BranchInfo * Event::getBranchInfo ( SG::sgkey_t sgkey) const
protectedinherited

Get the object describing one object/branch.

Definition at line 347 of file EventIProxyDict.cxx.

347 {
348
349 {
350 // We can only hold the lock (even though it's a shared lock) for
351 // this limited scope because the call to getInputObject below
352 // leads to a recursion and dead-lock if not released immediately.
354
355 // If the object already exists, return it:
356 auto it = m_branches.find(sgkey);
357 if (it != m_branches.end()) {
358 return &(it->second);
359 }
360 }
361
362 // If not, construct it now:
363 BranchInfo bi;
364 const xAOD::EventFormatElement* efe = getEventFormatElement(sgkey);
365 if (!efe) {
366 // Apparently this key is not known:
367 return nullptr;
368 }
369
370 // Helper variable(s).
371 static const bool SILENT = true;
372 static const bool METADATA = false;
373
374 // The name of the requested object.
375 const std::string& name = getName(sgkey);
376 // This is a bit perverse... In order to let the "base class" figure
377 // out the exact type of this object, we ask for it with an "Event
378 // pointer". I use that type because I need something that has a
379 // dictionary, and which should always be available when this code
380 // runs. In the end it doesn't matter that the object can't be
381 // retrieved as that type (of course...), it only matters that it gets
382 // "set up" following these calls.
383 Event* nc_this = const_cast<Event*>(this);
384 static const std::type_info& dummy = typeid(Event);
385 nc_this->getInputObject(name, dummy, SILENT, METADATA);
386 auto itr = m_outputObjects.find(name);
387 if (itr == m_outputObjects.end()) {
388 itr = m_inputObjects.find(name);
389 if (itr == m_inputObjects.end()) {
390 // We didn't find this object in the store...
391 return nullptr;
392 }
393 }
394 const Details::IObjectManager* mgr =
395 dynamic_cast<const Details::IObjectManager*>(itr->second.get());
396 if (!mgr) {
397 ATH_MSG_ERROR("Internal logic error found");
398 return nullptr;
399 }
400 bi.m_class = mgr->holder()->getClass();
401 // There's no need to check whether this is a "proper" dictionary
402 // at this point, since if TEvent is holding on to it, the type
403 // must have a proper compiled dictionary.
404
405#ifndef XAOD_STANDALONE
406 // Create a proper proxy for the input branch:
407 auto taddr = std::make_unique<SG::TransientAddress>(
408 CLID_NULL, efe->branchName(), new GenericAddress());
409 taddr->setSGKey(sgkey);
411 *nc_this, getName(sgkey), *bi.m_class->GetTypeInfo());
412 bi.m_proxy = std::make_unique<SG::DataProxy>(std::move(taddr), loader);
413 loader->setProxy(*bi.m_proxy.get());
414#endif // not XAOD_STANDALONE
415
416 // Add the branch info to our list:
418 lock.upgrade();
419 auto ret = m_branches.insert(std::make_pair(sgkey, std::move(bi)));
420
421 // Return a pointer to the branch info:
422 return &(ret.first->second);
423}
void setProxy(SG::DataProxy &proxy)
const std::string & branchName() const
Get the branch/key name.
const std::string & name() const override
Get the name of the instance.
const std::string & getName(const void *obj) const override
Function returning the key describing a known object.
friend class xAODPrivate::Loader
Definition Event.h:63
const xAOD::EventFormatElement * getEventFormatElement(SG::sgkey_t sgkey) const
Get the metadata object for a given "SG key".

◆ getEntries()

Long64_t xAOD::Experimental::REvent::getEntries ( ) const

Get how many entries are available from the current input file(s)

Returns
The number of events in the input file(s)

Definition at line 264 of file REvent.cxx.

264 {
265
266 if (m_eventReader) {
267 return m_eventReader->GetNEntries();
268 } else if (m_inputNTupleIsMissing) {
269 return 0u;
270 } else {
271 ATH_MSG_ERROR("Function called on an uninitialised object");
272 return 0u;
273 }
274}
bool m_inputNTupleIsMissing
Whether the input has an event RNTuple or not.
Definition REvent.h:104
@ u
Enums for curvilinear frames.
Definition ParamDefs.h:77

◆ getEntry()

Int_t xAOD::Experimental::REvent::getEntry ( ::Long64_t entry,
::Int_t getall = 0 )

Function loading a given entry of the input TTree.

This function is used to move to looking at a new entry from the input ntuple.

It doesn't do any I/O operation at this point, it just remembers which entry the objects should be loaded from later on.

Unless one calls the function with getall==1. In that case all input is force-read. This is necessary when writing out an event that was processed in a load-on-request manner.

Parameters
entryThe entry from the input tree to load
getallParameter deciding if partial reading should be used or not.
Returns
The number of bytes read, or a negative number in case of an error

Definition at line 290 of file REvent.cxx.

290 {
291
292 // A little sanity check:
293 if (!m_eventReader) {
294 ATH_MSG_ERROR("Function called on an uninitialised object");
295 return -1;
296 }
297
298 // Check if anything needs to be done.
299 if (entry == m_entry) {
300 ATH_MSG_DEBUG("Entry " << entry << " is already the active one");
301 return 0;
302 }
303
304 // Set entry value
305 m_entry = entry;
306
307 // Stats counter needs to know it's the next event.
309
310 // Loop over all input object managers, and force them to load their
311 // content. But only if getall was used.
312 ::Int_t result = 0;
313 if (getall) {
314 for (auto& [key, inObj] : m_inputObjects) {
315 result += inObj->getEntry(getall);
316 }
317 }
318
319 // Notify the listeners that a new event was loaded.
320 const TIncident incident(IncidentType::BeginEvent);
321 for (TVirtualIncidentListener* listener : m_listeners) {
322 listener->handle(incident);
323 }
324
325 // Return the number of bytes read.
326 return result;
327}
void nextEvent()
Function incrementing the processed event counter.
static const ::Int_t BeginEvent
A new event was just loaded.
Definition TIncident.h:29

◆ getEventFormatElement()

const xAOD::EventFormatElement * Event::getEventFormatElement ( SG::sgkey_t sgkey) const
protectedinherited

Get the metadata object for a given "SG key".

Definition at line 321 of file EventIProxyDict.cxx.

322 {
323
324 const xAOD::EventFormatElement* efe = nullptr;
325 static const bool QUIET = true;
327 efe = m_outputEventFormat->get(sgkey, QUIET);
328 }
329 if (!efe) {
330 efe = m_inputEventFormat.get(sgkey, QUIET);
331 }
332 if (!efe) {
333 static SG::SGKeySet missingSGKeys ATLAS_THREAD_SAFE;
334 static mutex_t mutex;
335 guard_t lock(mutex);
336 if (missingSGKeys.emplace(sgkey).second) {
339 "Can't find EventFormatElement for hashed SG key: " << sgkey);
340 }
341 return 0;
342 }
343 }
344 return efe;
345}
AthContainers_detail::mutex mutex_t
Mutex type for multithread synchronization.
AthContainers_detail::lock_guard< mutex_t > guard_t
Guard type for multithreaded synchronisation.
EventFormat * m_outputEventFormat
Format of the current output file.
Definition Event.h:323
std::unordered_set< sgkey_t > SGKeySet
A set of sgkey_t values.
Definition sgkey_t.h:97

◆ getHash()

SG::sgkey_t Event::getHash ( const std::string & key) const
overridevirtualinherited

Function returning the hash describing an object name.

This helper function is mostly needed by the smart pointers of the xAOD EDM.

Right now it very simply just calculates the hash just based on the key given to the function. But later on it might be good to do some tests here, checking if the event format knows about the specified key or not. This is why it's not made to be a static function

Parameters
keyString key to turn into a hash
Returns
A hash corresponding to the specified string key

Implements xAOD::TVirtualEvent.

Definition at line 27 of file EventTVirtualEvent.cxx.

27 {
28
29 // For empty keys let's finish quickly.
30 if (key == "") {
31 return 0;
32 }
33
34 // If the key is used in the input file, let's use the same hash for
35 // the output file as well.
36 if (m_inputEventFormat.exists(key)) {
37 return m_inputEventFormat.get(key)->hash();
38 }
39
40 // If it's a new key, make a new hash for it from scratch:
41 return Utils::hash(key);
42}
SG::sgkey_t hash(const std::string &name)
This function provides a hashed version of the key (branch) names used in the xAOD file,...

◆ getInputObject() [1/2]

const void * Event::getInputObject ( const std::string & key,
const std::type_info & ti,
bool silent,
bool metadata )
protectedinherited

Function for retrieving an input object in a non-template way.

This is the function doing the heavy lifting to retrieve objects from the input file.

Parameters
keyThe key (branch name) of the object to retrieve
tiThe type as which the object is to be retrieved
silentSet to kTRUE to make the code fail silently in case the object can't be retrieved
metadataFlag deciding whether we're looking for a metadata or event data object
Returns
A pointer to the input object if successful, or a null pointer if not

Definition at line 218 of file EventIO.cxx.

220 {
221
222 // Check if a name remapping should be applied or not:
223 std::string keyToUse = key;
224 auto remap_itr = m_nameRemapping.find(key);
225 if ((remap_itr != m_nameRemapping.end()) &&
226 (!m_inputEventFormat.exists(key)) &&
227 m_inputEventFormat.exists(remap_itr->second)) {
228 keyToUse = remap_itr->second;
229 }
230
231 // The following catches the cases when we ask for a transient
232 // ConstDataVector object to be returned as "const DataVector".
233 TStore* store = TActiveStore::store();
234 if (store && store->contains(keyToUse, ti) && store->isConst(keyToUse, ti)) {
235 const void* result = store->getConstObject(keyToUse, ti);
236 return result;
237 }
238
239 // A sanity check before checking for an object from the input file.
240 if (hasInput() == false) {
241 if (silent == false) {
242 ATH_MSG_WARNING("No input file connected to the Event object");
243 }
244 return nullptr;
245 }
246
247 // Make sure that the requested input is connected to.
248 const StatusCode sc = (metadata ? connectMetaObject(keyToUse, silent)
249 : connectObject(keyToUse, silent));
250 if (sc.isSuccess() == false) {
251 return nullptr;
252 }
253
254 // Select which object container to use:
255 Object_t& objects = (metadata ? m_inputMetaObjects : m_inputObjects);
256
257 // Access the object's manager:
258 auto itr = objects.find(keyToUse);
259 if (itr == objects.end()) {
260 ATH_MSG_FATAL("There is an internal logic error in the code...");
261 return nullptr;
262 }
263
264 // This has to be an ObjectManager object:
265 Details::IObjectManager* mgr =
266 dynamic_cast<Details::IObjectManager*>(itr->second.get());
267 if (mgr == nullptr) {
268 if (key == keyToUse) {
269 ATH_MSG_ERROR("Object of wrong type found for key \"" << key << "\"");
270 } else {
271 ATH_MSG_ERROR("Object of wrong type found for key \""
272 << key << "\"/\"" << keyToUse << "\"");
273 }
274 return nullptr;
275 }
276
277 // Make sure that the current entry is loaded for event data objects.
278 if (metadata == false) {
279 const Int_t readBytes = mgr->getEntry();
280 if (readBytes > 0) {
281 // Connect the auxiliary store to objects needing it. This call also
282 // takes care of updating the dynamic store of auxiliary containers,
283 // when they are getting accessed directly.
284 static const bool IS_METADATA = false;
285 if (setAuxStore(key, *mgr, IS_METADATA).isSuccess() == false) {
286 ATH_MSG_ERROR("Failed to set the auxiliary store for "
287 << mgr->holder()->getClass()->GetName() << "/"
288 << keyToUse);
289 return nullptr;
290 }
291 } else if (readBytes < 0) {
292 ATH_MSG_ERROR("Failed to load current entry for object "
293 << mgr->holder()->getClass()->GetName() << "/" << keyToUse);
294 return nullptr;
295 }
296 }
297
298 // Ask the holder object for the object of this type:
299 const void* result = mgr->holder()->getAsConst(ti, silent);
300 if (result == nullptr) {
301 if (!silent) {
302 ATH_MSG_WARNING("Could not retrieve object with key \""
303 << keyToUse << "\" as \""
304 << SG::normalizedTypeinfoName(ti) << "\"");
305 }
306 return nullptr;
307 }
308
309 // We succeeded:
310 return result;
311}
static Double_t sc
if(febId1==febId2)
virtual bool hasInput() const =0
Check if an input file is connected to the object.
std::unordered_map< std::string, std::unique_ptr< TVirtualManager > > Object_t
Definition of the internal data structure type.
Definition Event.h:304
virtual StatusCode connectMetaObject(const std::string &key, bool silent)=0
Function setting up access to a particular metadata object.
virtual StatusCode setAuxStore(const std::string &key, Details::IObjectManager &mgr, bool metadata)=0
Function connecting a DV object to its auxiliary store.
static TStore * store()
Access the currently active TStore object.
::StatusCode StatusCode
StatusCode definition for legacy code.
TestStore store
Definition TestStore.cxx:23
std::string normalizedTypeinfoName(const std::type_info &info)
Convert a type_info to a normalized string representation (matching the names used in the root dictio...
silent(func)
Redirect stdout/err to /dev/null Useful wrapper to get rid of ROOT verbosity... N....

◆ getInputObject() [2/2]

const void * Event::getInputObject ( SG::sgkey_t key,
const std::type_info & ti,
bool silent )
overrideprotectedvirtualinherited

Function for retrieving an input object in a non-template way.

This function is used by the TVirtualEvent interface to access an input object with a given hashed key.

The function looks up the string key belonging to the hash, and then calls the other GetInputObject(...) function in the class with that parameter.

Parameters
keyThe hashed key of the input object
tiThe type description of the object requested
silentSwitch for being silent about failures or not
Returns
A pointer to the requested object, or a null pointer in case of failure

Implements xAOD::TVirtualEvent.

Definition at line 162 of file EventTVirtualEvent.cxx.

163 {
164
165 // Get a string name for this key:
166 const std::string& name = getName(key);
167 if (name.empty() && (silent == false)) {
168 ATH_MSG_WARNING("Key 0x" << std::hex << key << " unknown");
169 return nullptr;
170 }
171
172 // Forward the call to the function using an std::string key:
173 static const bool METADATA = false;
174 return getInputObject(name, ti, silent, METADATA);
175}

◆ getKey()

SG::sgkey_t Event::getKey ( const void * obj) const
overridevirtualinherited

Function returning the hash describing a known object.

This function is used by the smart pointer code to find the identifier of an object that's already in the event in some way.

Parameters
objPointer to the object that we want to look up
Returns
The hashed identifier of the object, or 0 if the object was not found in the event

Implements xAOD::TVirtualEvent.

Definition at line 51 of file EventTVirtualEvent.cxx.

51 {
52
53 // Make use of the getName function.
54 return getHash(getName(obj));
55}
SG::sgkey_t getHash(const std::string &key) const override
Function returning the hash describing an object name.

◆ getName() [1/2]

const std::string & Event::getName ( const void * obj) const
overridevirtualinherited

Function returning the key describing a known object.

This function is used by the smart pointer code to find the identifier of an object that's already in the event in some way.

Parameters
objPointer to the object that we want to look up
Returns
The name of the object, or an empty string if the object was not found in the event

Implements xAOD::TVirtualEvent.

Definition at line 64 of file EventTVirtualEvent.cxx.

64 {
65
66 // First look among the output objects.
67 for (const auto& [key, manager] : m_outputObjects) {
68 // Check if this is our object.
69 if (manager->object() == obj) {
70 // If it is, let's return right away.
71 return key;
72 }
73 }
74
75 // Now look among the input objects.
76 for (const auto& [key, manager] : m_inputObjects) {
77 // Check if this is our object.
78 if (manager->object() == obj) {
79 // If it is, let's return.
80 return key;
81 }
82 }
83
84 // If it's not there either, check if it's in an active TStore object:
85 const TStore* store = TActiveStore::store();
86 if (store && store->contains(obj)) {
87 // Get the name from the store then:
88 return store->getName(obj);
89 }
90
91 // We didn't find the object in the event...
92 ATH_MSG_WARNING("Didn't find object with pointer \"" << obj
93 << "\" in the event");
94 static const std::string dummy;
95 return dummy;
96}

◆ getName() [2/2]

const std::string & Event::getName ( SG::sgkey_t hash) const
overridevirtualinherited

Function returning the key describing a known object.

This function is used primarily when getting the string key of a smart pointer that we read in from a file, or access it in memory.

Parameters
hashThe hashed key for the container/object
Returns
The name of the object, or an empty string if the object was not found in the event

Implements xAOD::TVirtualEvent.

Definition at line 105 of file EventTVirtualEvent.cxx.

105 {
106
107 // If the branch is known from the input:
108 if (m_inputEventFormat.exists(hash)) {
109 return m_inputEventFormat.get(hash)->branchName();
110 }
111
112 // If the branch is known on the output:
113 if (m_outputEventFormat && m_outputEventFormat->exists(hash)) {
114 return m_outputEventFormat->get(hash)->branchName();
115 }
116
117 // If this is an object in the active store:
118 const TStore* store = TActiveStore::store();
119 if (store && store->contains(hash)) {
120 return store->getName(hash);
121 }
122
123 // If it is unknown:
124 static const std::string dummy;
125 return dummy;
126}

◆ getNames()

StatusCode xAOD::Experimental::REvent::getNames ( const std::string & targetClassName,
std::vector< std::string > & vkeys,
bool metadata ) const
overrideprivatevirtual

Function determining the list keys associated with a type name.

Implements xAOD::Event.

Definition at line 339 of file REvent.cxx.

341 {
342
343 ATH_MSG_ERROR("xAOD::REvent::getNames not yet implemented");
344 return StatusCode::FAILURE;
345}

◆ getOutputObject() [1/2]

void * Event::getOutputObject ( const std::string & key,
const std::type_info & ti,
bool metadata ) const
protectedinherited

Function for retrieving an output object in a non-template way.

This function does the heavy lifting of retrieving object from the list of output objects.

While it returns a typeless pointer, that pointer can be cast directly to the type described by the second parameter in the caller code.

Parameters
keyThe key (branch name) of the object to retrieve
tiThe type as which the object is to be retrieved
metadataFlag deciding whether we're looking for a metadata or event data object
Returns
A pointer to the output object if successful, or a null pointer if not

Definition at line 154 of file EventIO.cxx.

155 {
156
157 // Select which object container to use:
159
160 // Check if the object can be found:
161 auto itr = objects.find(key);
162 if (itr == objects.end()) {
163 // Do the following only for event data:
164 if (!metadata) {
165 // It's not in the event. Let's check if we find it in an active
166 // TStore object...
167 TStore* store = TActiveStore::store();
168 if ((!store) || (!store->contains(key, ti)) || store->isConst(key, ti)) {
169 // Nope, not there either...
170 return nullptr;
171 }
172 // Let's return the object from the TStore:
173 void* result = store->getObject(key, ti);
174 return result;
175 } else {
176 // For metadata we don't use external resources.
177 return nullptr;
178 }
179 }
180
181 // If the object is not set in this event yet, we can't continue:
182 if (itr->second->isSet() == false) {
183 return nullptr;
184 }
185
186 // If it does exist, check if it's the right kind of object:
187 Details::IObjectManager* mgr =
188 dynamic_cast<Details::IObjectManager*>(itr->second.get());
189 if (mgr == nullptr) {
190 ATH_MSG_ERROR("Object of wrong type found for key \"" << key << "\"");
191 return nullptr;
192 }
193
194 // Ask the holder object for the object of this type:
195 void* result = mgr->holder()->getAs(ti);
196 if (result == nullptr) {
197 ATH_MSG_WARNING("Couldn't retrieve object as \""
198 << SG::normalizedTypeinfoName(ti) << "\"");
199 return nullptr;
200 }
201
202 // Return the object:
203 return result;
204}
Object_t m_outputMetaObjects
Collection of all the managed output meta-objects.
Definition Event.h:318

◆ getOutputObject() [2/2]

void * Event::getOutputObject ( SG::sgkey_t key,
const std::type_info & ti )
overrideprotectedvirtualinherited

Function for retrieving an output object in a non-template way.

This function is used by the TVirtualEvent interface to access an output object with a given hashed key.

The function looks up the string key belonging to the hash, and then calls the other GetOutputObject(...) function in the class with that parameter.

Parameters
keyThe hashed key of the output object
tiThe type description of the object requested
Returns
A pointer to the requested object, or a null pointer in case of failure

Implements xAOD::TVirtualEvent.

Definition at line 138 of file EventTVirtualEvent.cxx.

138 {
139
140 // Get a string name for this key.
141 const std::string& name = getName(key);
142 if (name.empty()) {
143 return nullptr;
144 }
145
146 // Forward the call to the function using an std::string key.
147 static const bool METADATA = false;
148 return getOutputObject(name, ti, METADATA);
149}

◆ hasInput()

bool xAOD::Experimental::REvent::hasInput ( ) const
overrideprivatevirtual

Check if an input file is connected to the object.

Implements xAOD::Event.

Definition at line 329 of file REvent.cxx.

329 {
330
332}

◆ hasOutput()

bool xAOD::Experimental::REvent::hasOutput ( ) const
overrideprivatevirtual

Check if an output file is connected to the object.

Implements xAOD::Event.

Definition at line 334 of file REvent.cxx.

334 {
335
336 return false;
337}

◆ initMessaging()

void AthMessaging::initMessaging ( ) const
privateinherited

Initialize our message level and MessageSvc.

This method should only be called once.

Definition at line 39 of file AthMessaging.cxx.

40{
42 // If user did not set an explicit level, set a default
43 if (m_lvl == MSG::NIL) {
44 m_lvl = m_imsg ?
45 static_cast<MSG::Level>( m_imsg.load()->outputLevel(m_nm) ) :
46 MSG::INFO;
47 }
48}
std::string m_nm
Message source name.
std::atomic< IMessageSvc * > m_imsg
MessageSvc pointer.
std::atomic< MSG::Level > m_lvl
Current logging level.
IMessageSvc * getMessageSvc(bool quiet=false)

◆ initStats()

StatusCode xAOD::Experimental::REvent::initStats ( )
private

Function to initialise the statistics for all Tree content.

This function is used internally to initialise the reading of an input file.

It prepares the "monitoring information" in memory that gets filled while the code is running, with information about xAOD I/O.

Returns
The usual StatusCode values

Definition at line 867 of file REvent.cxx.

867 {
868
869 // A little sanity check.
870 if (!m_eventReader) {
871 ATH_MSG_ERROR("Function called on an uninitialised object");
872 return StatusCode::FAILURE;
873 }
874
875 // Reset the number of input branches information.
877
878 // Loop over the EventFormat information.
879 for (const auto& [key, format] : m_inputEventFormat) {
880
881 ATH_MSG_DEBUG("Investigating object \"" << key << "\" of class \""
882 << format.className() << "\"");
883
884 // If it's an auxiliary container, scan it using RAuxStore.
885 if (key.ends_with("Aux.")) {
886
887 // But first decide whether it describes a container, or just
888 // a single object. For that, first get the class that it was
889 // written with.
890 TClass* cl = TClass::GetClass(format.className().c_str());
891 if ((cl == nullptr) || (cl->IsLoaded() == false)) {
893 "Couldn't find the dictionary for type: " << format.className());
894 continue;
895 }
896
897 // And then check if it inherits from xAOD::AuxContainerBase or from
898 // xAOD::AuxInfoBase.
899 static TClass* const auxContCl = TClass::GetClass(
900 SG::normalizedTypeinfoName(typeid(xAOD::AuxContainerBase)).c_str());
901 static TClass* const auxInfoCl = TClass::GetClass(
902 SG::normalizedTypeinfoName(typeid(xAOD::AuxInfoBase)).c_str());
903 if ((auxContCl == nullptr) || (auxInfoCl == nullptr)) {
905 "Couldn't get dictionary for xAOD::AuxContainerBase or "
906 "xAOD::AuxInfoBase");
907 return StatusCode::FAILURE;
908 }
909 const bool isContainer = cl->InheritsFrom(auxContCl);
910 const bool isInfo = cl->InheritsFrom(auxInfoCl);
911 if ((isContainer == false) && (isInfo == false)) {
912 ATH_MSG_WARNING("Auxiliary store \""
913 << key
914 << "\" is of an unknown type: " << format.className());
915 continue;
916 }
917 ATH_MSG_VERBOSE("isContainer = " << isContainer
918 << ", isInfo = " << isInfo);
919
920 // Scan the branches using a temporary RAuxStore instance.
921 const std::string fieldName = key.substr(0, key.size() - 1) + ":";
925 static constexpr bool TOP_STORE = true;
926 RAuxStore temp(fieldName, TOP_STORE, mode);
927 ATH_CHECK(temp.readFrom(*m_eventReader));
928
929 // Add all the auxids to the statistics object:
930 ReadStats& stats = IOStats::instance().stats();
931 for (SG::auxid_t id : temp.getAuxIDs()) {
932 stats.branch(fieldName, id);
933 }
934
935 // Increment the number of known branches.
936 stats.setBranchNum(stats.branchNum() + temp.getAuxIDs().size());
937 }
938 // If it's an interface container.
939 else {
940 // Check if it's part of the input ntuple.
941 if (m_eventReader->GetDescriptor().FindFieldId(key) !=
942 ROOT::kInvalidDescriptorId) {
944 }
945 }
946 }
947
948 // Return gracefully:
949 return StatusCode::SUCCESS;
950}
BranchStats * container(const std::string &name)
Access the description of a container. Creating it if necessary.
void setBranchNum(::Int_t num)
Set the total number of branches on the input.
EStructMode
"Structural" modes of the object
@ kObjectStore
The object describes a single object.
@ kContainerStore
The object describes an entire container.
size_t auxid_t
Identifier for a particular aux data item.
Definition AuxTypes.h:27

◆ inputEventFormat()

const EventFormat * Event::inputEventFormat ( ) const
inherited

Get information about the input objects.

Definition at line 228 of file EventCore.cxx.

228 {
229
230 if (hasInput()) {
231 return &m_inputEventFormat;
232 }
233 return nullptr;
234}

◆ keys()

template<typename T>
StatusCode xAOD::Event::keys ( std::vector< std::string > & vkeys,
bool metadata ) const
inherited

Provide a list of all data object keys associated with a specific type.

◆ keyToString() [1/2]

const std::string * Event::keyToString ( SG::sgkey_t key) const
overrideprotectedinherited

Find the string corresponding to a given key.

Definition at line 294 of file EventIProxyDict.cxx.

294 {
295
296 return &(getName(key));
297}

◆ keyToString() [2/2]

const std::string * Event::keyToString ( SG::sgkey_t key,
CLID & clid ) const
overrideprotectedinherited

Find the string and CLID corresponding to a given key.

Definition at line 299 of file EventIProxyDict.cxx.

299 {
300
301 return &(getName(key));
302}

◆ metaKeys()

template<typename T>
StatusCode xAOD::Event::metaKeys ( std::vector< std::string > & vkeys) const
inherited

Provide a list of all metadata object keys associated with a specific type.

◆ msg() [1/2]

MsgStream & asg::AsgMessaging::msg ( ) const
inherited

The standard message stream.

Returns
A reference to the default message stream of this object.

Definition at line 49 of file AsgMessaging.cxx.

49 {
50#ifndef XAOD_STANDALONE
51 return ::AthMessaging::msg();
52#else // not XAOD_STANDALONE
53 return m_msg;
54#endif // not XAOD_STANDALONE
55 }

◆ msg() [2/2]

MsgStream & asg::AsgMessaging::msg ( const MSG::Level lvl) const
inherited

The standard message stream.

Parameters
lvlThe message level to set the stream to
Returns
A reference to the default message stream, set to level "lvl"

Definition at line 57 of file AsgMessaging.cxx.

57 {
58#ifndef XAOD_STANDALONE
59 return ::AthMessaging::msg( lvl );
60#else // not XAOD_STANDALONE
61 m_msg << lvl;
62 return m_msg;
63#endif // not XAOD_STANDALONE
64 }

◆ msgLvl()

bool asg::AsgMessaging::msgLvl ( const MSG::Level lvl) const
inherited

Test the output level of the object.

Parameters
lvlThe message level to test against
Returns
boolean Indicting if messages at given level will be printed
true If messages at level "lvl" will be printed

Definition at line 41 of file AsgMessaging.cxx.

41 {
42#ifndef XAOD_STANDALONE
43 return ::AthMessaging::msgLvl( lvl );
44#else // not XAOD_STANDALONE
45 return m_msg.msgLevel( lvl );
46#endif // not XAOD_STANDALONE
47 }

◆ name()

const std::string & Event::name ( ) const
overrideprotectedinherited

Get the name of the instance.

Definition at line 315 of file EventIProxyDict.cxx.

315 {
316
317 static const std::string result{"xAOD::Event"};
318 return result;
319}

◆ outputEventFormat()

const EventFormat * Event::outputEventFormat ( ) const
inherited

Get information about the output objects.

Definition at line 236 of file EventCore.cxx.

236 {
237
238 return m_outputEventFormat;
239}

◆ printIOStats()

void Event::printIOStats ( ) const
inherited

Function printing the I/O statistics of the current process.

This is a convenience function for printing basic I/O information about the current job.

It can be called at the end of a job to get an overview of what the job did exactly I/O-wise.

Definition at line 298 of file EventCore.cxx.

298 {
299
300 // Simply do this via the xAODCore code:
301 IOStats::instance().stats().Print("Summary");
302}
void Print(::Option_t *option="") const
Print information about the collected statistics.

◆ printNameRemap()

void Event::printNameRemap ( ) const
inherited

Print the current name re-mapping rules.

This function can be used for debugging, to check what container/object name remapping rules are in place for the current TEvent object.

Definition at line 201 of file EventCore.cxx.

201 {
202
203 // Print a header.
204 ATH_MSG_INFO("Name remapping rules:");
205
206 // In case no remapping rules have been set.
207 if (m_nameRemapping.empty()) {
208 ATH_MSG_INFO(" NONE");
209 return;
210 }
211
212 // Otherwise.
213 for (const auto& [newName, onfile] : m_nameRemapping) {
214 ATH_MSG_INFO(" \"" << newName << "\" -> \"" << onfile << "\"");
215 }
216}
#define ATH_MSG_INFO(x)

◆ printProxyWarnings()

void Event::printProxyWarnings ( bool value = true)
inherited

Enable warnings associated with broken element links.

These appear harmless so long as you don't actually try to access the links.

Which will cause other errors anyway.

Parameters
valueThe new value for the option

Definition at line 223 of file EventCore.cxx.

223 {
224
226}

◆ proxies()

std::vector< const SG::DataProxy * > Event::proxies ( ) const
overrideprotectedinherited

return the list of all current proxies in store

Definition at line 275 of file EventIProxyDict.cxx.

275 {
276
278
279 std::vector<const SG::DataProxy*> ret;
280 for (const auto& p : m_branches) {
281 const SG::DataProxy* proxy = p.second.m_proxy.get();
282 if (proxy) {
283 ret.push_back(proxy);
284 }
285 }
286 return ret;
287}

◆ proxy() [1/2]

SG::DataProxy * Event::proxy ( const CLID & id,
const std::string & key ) const
overrideprotectedinherited

get proxy with given id and key. Returns 0 to flag failure

Definition at line 213 of file EventIProxyDict.cxx.

213 {
214
215 const SG::sgkey_t sgkey = getHash(key);
216 if (!sgkey) {
217 return 0;
218 }
219 return proxy_exact(sgkey);
220}
SG::DataProxy * proxy_exact(SG::sgkey_t sgkey) const override
Get proxy given a hashed key+clid.
uint32_t sgkey_t
Type used for hashed StoreGate key+CLID pairs.
Definition sgkey_t.h:32
sgkey(tool)
Definition common.py:1027

◆ proxy() [2/2]

SG::DataProxy * Event::proxy ( const void *const pTransient) const
overrideprotectedinherited

get proxy for a given data object address in memory

Definition at line 185 of file EventIProxyDict.cxx.

185 {
186
187 // Look up the name of this object
188 std::string name = getName(pTransient);
189 if (name.empty()) {
190 // Apparently the object is not known...
191 return nullptr;
192 }
193
194 // Get the metadata object for it:
195 const xAOD::EventFormatElement* efe = 0;
196 static const bool QUIET = true;
198 efe = m_outputEventFormat->get(name, QUIET);
199 }
200 if (!efe) {
201 efe = m_inputEventFormat.get(name, QUIET);
202 }
203 if (!efe) {
204 // No metadata found...
205 return nullptr;
206 }
207
208 // Return the proxy:
209 const BranchInfo* bi = getBranchInfo(efe->hash());
210 return bi->m_proxy.get();
211}
sgkey_t hash() const
Get the hash belonging to this branch/key.
const BranchInfo * getBranchInfo(SG::sgkey_t sgkey) const
Get the object describing one object/branch.

◆ proxy_exact()

SG::DataProxy * Event::proxy_exact ( SG::sgkey_t sgkey) const
overrideprotectedinherited

Get proxy given a hashed key+clid.

Definition at line 222 of file EventIProxyDict.cxx.

222 {
223
224 // Get the object describing this branch/object:
225 const BranchInfo* bi = getBranchInfo(sgkey);
226 if (!bi) {
227 static SG::SGKeySet missingSGKeys ATLAS_THREAD_SAFE;
228 static mutex_t mutex;
229 guard_t lock(mutex);
230 if (missingSGKeys.emplace(sgkey).second && m_printEventProxyWarnings) {
231 ATH_MSG_WARNING("Can't find BranchInfo for: " << sgkey);
232 }
233 return 0;
234 }
235
236 // Access its data proxy:
237 SG::DataProxy* proxy = bi->m_proxy.get();
238
239 // Return the proxy:
240 return proxy;
241}

◆ readFrom()

StatusCode xAOD::Experimental::REvent::readFrom ( std::string_view fileName)

Set up the reading of an input file.

This function takes care of connecting the event object to a new input file.

It reads in the metadata of the input file needed for reading the file.

Parameters
fileNamename of file needed for metadata access

Definition at line 90 of file REvent.cxx.

90 {
91
92 ATH_MSG_INFO("REvent::readFrom: fileName " << fileName);
93
94
95 // Clear the cached input objects.
96 m_inputObjects.clear();
98 m_inputMetaObjects.clear();
99 {
101 lock.upgrade();
102 m_branches.clear();
103 }
104 m_eventReader.reset();
105
106 // Reset the internal flags.
107 m_entry = -1;
109
110 // Clear out the current object.
112
113
114 ATH_MSG_DEBUG("Create RNTupleReader for \"" << METADATA_NTUPLE_NAME
115 << "\" in file: " << fileName);
116
117
118 // Set up a reader for the metadata ntuple.
119 // Since some types are non-xAOD types and so not 'visible' when running in AnalysisBase
120 // we need to protect for unknown types with SetEmulateUnknownTypes(true)
121 ROOT::RNTupleDescriptor::RCreateModelOptions opts;
122 opts.SetEmulateUnknownTypes(true);
123 m_metaReader = ROOT::RNTupleReader::Open(opts, METADATA_NTUPLE_NAME, fileName);
124 if (!m_metaReader) {
125 ATH_MSG_ERROR("Couldn't find \"" << METADATA_NTUPLE_NAME
126 << "\" tree in input file: " << fileName);
127 return StatusCode::FAILURE;
128 }
129 ATH_MSG_DEBUG("Created RNTupleReader for \"" << METADATA_NTUPLE_NAME
130 << "\" in file: " << fileName);
131
132 // Make sure that the xAOD::EventFormat dictonary is loaded.
133 // This may not be the case if streamer information reading is turned
134 // off.
135 static const std::string eventFormatTypeName =
137 if (::TClass::GetClass(eventFormatTypeName.c_str()) == nullptr) {
138 ATH_MSG_WARNING("Couldn't load the EventFormat dictionary");
139 }
140 ATH_MSG_VERBOSE("Loaded the xAOD::EventFormat dictionary");
141
142 // Helper lambda for collecting the event format metadata from an RNTuple
143 // with a given name.
144 auto readEventFormatMetadata = [&](std::string_view tupleName) -> StatusCode {
145 // Set up a reader. This may technically be the same as m_metaReader, but
146 // it's easier to write the code this way.
147 auto metaReader = ROOT::RNTupleReader::Open(tupleName, fileName);
148 if (!metaReader) {
149 ATH_MSG_ERROR("Couldn't find \""
150 << tupleName << "\" ntuple in input file: " << fileName);
151 return StatusCode::FAILURE;
152 }
153 ATH_MSG_VERBOSE("Created temporary RNTupleReader for \""
154 << tupleName << "\" in file: " << fileName);
155
156 // Try to read in the event format metadata.
157 const std::string eventFormatFieldName =
158 getFirstFieldMatch(*m_metaReader, "EventFormat");
159 try {
160 // Add its elements to m_inputEventFormat.
161 auto ef = m_metaReader->GetView<xAOD::EventFormat>(eventFormatFieldName);
162 for (const auto& [key, element] : ef(0u)) {
163 m_inputEventFormat.add(element);
164 }
165 } catch (const ROOT::RException&) {
166 ATH_MSG_WARNING("Input file provides no event or metadata");
167 return StatusCode::RECOVERABLE;
168 }
169 ATH_MSG_VERBOSE("Merged event format metadata from \"" << tupleName
170 << "\" ntuple");
171
172 // Return gracefully.
173 return StatusCode::SUCCESS;
174 };
175
176 // Read in the metadata from the "main" metadata ntuple.
177 const StatusCode sc = readEventFormatMetadata(METADATA_NTUPLE_NAME);
178 if (sc.isRecoverable()) {
180 return StatusCode::SUCCESS;
181 }
182 ATH_CHECK(sc);
183
184 // List all the other Metadata RNTuples in the input file.
185 // Having several metadata tuples can happen for augmented files
186 // as one metadata tree per stream is produced.
187 std::set<std::string> lOtherMetaTupleNames;
188 {
189 std::unique_ptr<TFile> inFile(TFile::Open(fileName.data(), "READ"));
190 TList* lKeys = inFile->GetListOfKeys();
191 if (lKeys == nullptr) {
192 ATH_MSG_ERROR("Could not get list of keys for input file: " << fileName);
193 return StatusCode::FAILURE;
194 }
195 for (const TObject* obj : *lKeys) {
196 const std::string keyName = obj->GetName();
197 // Make sure the key corresponds to a metadata ntuple but
198 // do not add the current metadata tree in the list of other trees
199 // and do not add the metadata tree handlers to the list
200 if ((keyName != METADATA_NTUPLE_NAME) &&
201 (keyName.find("MetaData") != std::string::npos) &&
202 (keyName.find("MetaDataHdr") == std::string::npos)) {
203 // Make sure key corresponds to an RNTuple
204 const TKey* key = dynamic_cast<const TKey*>(obj);
205 if (key == nullptr) {
206 ATH_MSG_ERROR("Object describing \"" << keyName << "\" in file \""
207 << fileName
208 << "\" is not a TKey?");
209 return StatusCode::FAILURE;
210 }
211 const char* className = key->GetClassName();
212 static constexpr bool LOAD = kFALSE;
213 static constexpr bool SILENT = kTRUE;
214 ::TClass* cl = ::TClass::GetClass(className, LOAD, SILENT);
215 if ((cl != nullptr) && cl->InheritsFrom(ROOT::RNTuple::Class())) {
216 lOtherMetaTupleNames.insert(std::move(keyName));
217 }
218 }
219 }
220 }
221
222 // Read in the metadata from any additonal NTuples found (if any).
223 for (const std::string& tupleName : lOtherMetaTupleNames) {
224 ATH_CHECK(readEventFormatMetadata(tupleName));
225 }
226
227 // Set up the main ntuple reader.
228 m_eventReader = ROOT::RNTupleReader::Open(EVENT_NTUPLE_NAME, fileName);
229 if (!m_eventReader) {
230 ATH_MSG_ERROR("Couldn't access RNTuple \"" << EVENT_NTUPLE_NAME
231 << "\" in file: " << fileName);
232 return StatusCode::FAILURE;
233 }
234 ATH_MSG_DEBUG("Created RNTupleReader for \"" << EVENT_NTUPLE_NAME
235 << "\" in file: " << fileName);
236
237 // Init the statistics collection.
239 // Update the event counter in the statistics object:
240 xAOD::ReadStats& stats = IOStats::instance().stats();
241 stats.setNEvents(stats.nEvents() + m_eventReader->GetNEntries());
242
243 // Notify the listeners that a new file was opened:
244 const TIncident beginIncident(IncidentType::BeginInputFile);
245 for (TVirtualIncidentListener* listener : m_listeners) {
246 listener->handle(beginIncident);
247 }
248 // For now implement a very simple scheme in which we claim already
249 // at the start that the entire file was processed. Since we have no way
250 // of ensuring that the user indeed does this. And we can't delay calling
251 // this function, as the user may likely close his/her output file before
252 // closing the last opened input file.
253 const TIncident endIncident(IncidentType::EndInputFile);
254 for (TVirtualIncidentListener* listener : m_listeners) {
255 listener->handle(endIncident);
256 }
257
258 // The initialisation was successful:
259 return StatusCode::SUCCESS;
260}
StatusCode initStats()
Function to initialise the statistics for all Tree content.
Definition REvent.cxx:867
str inFile
Definition makeTOC.py:5
static const char *const METADATA_NTUPLE_NAME
Definition REvent.cxx:71
static const char *const EVENT_NTUPLE_NAME
Definition REvent.cxx:70
static const ::Int_t EndInputFile
The processing of an input file has finished.
Definition TIncident.h:40
static const ::Int_t BeginInputFile
A new input file was just opened.
Definition TIncident.h:27
std::string getTypeName(const std::type_info &ti)
This function is necessary in order to create type names that ROOT can understand.
EventFormat_v1 EventFormat
Definition of the current event format version.
Definition EventFormat.h:16

◆ record() [1/3]

template<typename T>
StatusCode xAOD::Event::record ( std::unique_ptr< T > obj,
const std::string & key )
inherited

Add an output object to the event, explicitly taking ownership of it.

◆ record() [2/3]

template<typename T>
StatusCode xAOD::Event::record ( T * obj,
const std::string & key )
inherited

Add an output object to the event.

◆ record() [3/3]

StatusCode xAOD::Experimental::REvent::record ( void * obj,
const std::string & typeName,
const std::string & key,
bool overwrite,
bool metadata,
bool isOwner )
overrideprivatevirtual

Record an object into a connected output file.

Implements xAOD::Event.

Definition at line 848 of file REvent.cxx.

849 {
850
851 ATH_MSG_ERROR("xAOD::REvent::record not yet implemented");
852 return StatusCode::FAILURE;
853}

◆ recordAux()

StatusCode xAOD::Experimental::REvent::recordAux ( TVirtualManager & mgr,
const std::string & key,
bool metadata )
overrideprivatevirtual

Record an auxiliary store into a connected output file.

Implements xAOD::Event.

Definition at line 855 of file REvent.cxx.

855 {
856
857 ATH_MSG_ERROR("xAOD::REvent::recordAux not yet implemented");
858 return StatusCode::FAILURE;
859}

◆ recordMeta() [1/2]

template<typename T>
StatusCode xAOD::Event::recordMeta ( std::unique_ptr< T > obj,
const std::string & key )
inherited

Add an object to the output file's metadata, explicitly taking ownership of it.

◆ recordMeta() [2/2]

template<typename T>
StatusCode xAOD::Event::recordMeta ( T * obj,
const std::string & key )
inherited

Add an object to the output file's metadata.

◆ recordObject()

SG::DataProxy * Event::recordObject ( SG::DataObjectSharedPtr< DataObject > obj,
const std::string & key,
bool allowMods,
bool returnExisting )
overrideprotectedinherited

Record an object in the store.

Definition at line 309 of file EventIProxyDict.cxx.

310 {
311
312 throw std::runtime_error("xAOD::Event::recordObject is not implemented");
313}

◆ recordTypeless()

StatusCode xAOD::Event::recordTypeless ( void * obj,
const std::string & typeName,
const std::string & key,
bool overwrite = false,
bool metadata = true,
bool isOwner = true )
protectedinherited

Internal function for recording an object into the output.

◆ registerKey()

void Event::registerKey ( SG::sgkey_t key,
const std::string & str,
CLID clid )
overrideprotectedinherited

Remember an additional mapping from key to string/CLID.

Definition at line 304 of file EventIProxyDict.cxx.

304 {
305
306 return;
307}

◆ removeListener()

StatusCode Event::removeListener ( TVirtualIncidentListener * listener)
inherited

Remove an incident listener object.

This function allows us to remove a listener when for instance a metadata tool is deleted during a job.

Parameters
listenerPointer to the listener that should be removed
Returns
The usual StatusCode types

Definition at line 126 of file EventCore.cxx.

126 {
127
128 // Remove the listener. Or at least try to...
129 auto itr = std::find(m_listeners.begin(), m_listeners.end(), listener);
130 if (itr == m_listeners.end()) {
131 ATH_MSG_ERROR("Listener " << static_cast<void*>(listener) << " not known");
132 return StatusCode::FAILURE;
133 }
134 m_listeners.erase(itr);
135
136 // Return gracefully:
137 return StatusCode::SUCCESS;
138}

◆ retrieve() [1/4]

template<typename T>
StatusCode xAOD::Event::retrieve ( const T *& obj,
const std::string & key )
inherited

Retrieve either an input or an output object from the event.

◆ retrieve() [2/4]

template<typename T>
StatusCode xAOD::Event::retrieve ( T *& obj,
const std::string & key )
inherited

Retrieve an output object from the event.

◆ retrieve() [3/4]

template<typename T>
bool xAOD::TVirtualEvent::retrieve ( const T *& obj,
const std::string & key,
bool silent = false )
inherited

Function retrieving an object from the event (constant version)

◆ retrieve() [4/4]

template<typename T>
bool xAOD::TVirtualEvent::retrieve ( const T *& obj,
sgkey_t key = DEFAULT_KEY,
bool silent = false )
inherited

Function retrieving an object from the event (constant version)

◆ retrieveMetaInput()

template<typename T>
StatusCode xAOD::Event::retrieveMetaInput ( const T *& obj,
const std::string & key )
inherited

Retrieve an input metadata object.

◆ retrieveMetaOutput() [1/2]

template<typename T>
StatusCode xAOD::Event::retrieveMetaOutput ( const T *& obj,
const std::string & key )
inherited

Retrieve an output metadata object.

◆ retrieveMetaOutput() [2/2]

template<typename T>
StatusCode xAOD::Event::retrieveMetaOutput ( T *& obj,
const std::string & key )
inherited

Retrieve an output metadata object.

◆ setActive()

void Event::setActive ( ) const
inherited

Set this event object as the currently active one.

Definition at line 54 of file EventCore.cxx.

54 {
55
56 // The active event and current store are thread-local globals.
57 Event* nc_this ATLAS_THREAD_SAFE = const_cast<Event*>(this);
58 TActiveEvent::setEvent(static_cast<TVirtualEvent*>(nc_this));
59#ifndef XAOD_STANDALONE
61#endif // not XAOD_STANDALONE
62}
static IProxyDict * setStore(IProxyDict *store)
Set the current store.
static void setEvent(TVirtualEvent *ptr)
Set the active event pointer.

◆ setAuxItemList()

void Event::setAuxItemList ( const std::string & containerKey,
const std::string & itemList )
inherited

Configure which dynamic variables to write out for a given store.

This function receives the rules for selecting which dynamic auxiliary branches should be written for a given container, in the exact same format in which we need to set it in the Athena output ItemList.

Parameters
containerKeyThe name of the auxiliary container in question
itemListThe variable list according to the formatting rules

Definition at line 71 of file EventCore.cxx.

72 {
73
74 // Decoded attributes.
75 std::set<std::string> attributes;
76
77 // Split up the received string using "." as the separator.
78 if (itemList.size()) {
79 std::istringstream ss(itemList);
80 std::string attr;
81 while (std::getline(ss, attr, '.')) {
82 attributes.insert(attr);
83 }
84 }
85
86 // Remember the setting.
87 m_auxItemList[containerKey] = std::move(attributes);
88}
static Double_t ss
std::unordered_map< std::string, std::set< std::string > > m_auxItemList
Rules for selecting which auxiliary branches to write.
Definition Event.h:326

◆ setAuxStore()

StatusCode xAOD::Experimental::REvent::setAuxStore ( const std::string & key,
Details::IObjectManager & mgr,
bool metadata )
overrideprivatevirtual

Function connecting a DV object to its auxiliary store.

Every time a DataVector is read in from the input for a new RNTuple entry, one needs to re-connect it with its auxiliary store.

This function takes care of this.

Parameters
keyThe key (field name) of the object whose auxiliary store should be set up
mgrThe manager object of the DV container
metadataFlag specifying whether we're dealing with a metadata or event data object
Returns
The usual StatusCode types

Implements xAOD::Event.

Definition at line 740 of file REvent.cxx.

741 {
742
743 // Check if we need to do anything:
744 if ((Details::hasAuxStore(*(mgr.holder()->getClass())) == false) &&
745 (Details::isAuxStore(*(mgr.holder()->getClass())) == false)) {
746 return StatusCode::SUCCESS;
747 }
748
749 // Select which object container to use:
751
752 // Look up the auxiliary object's manager:
753 TVirtualManager* auxMgr = nullptr;
754 std::string auxKey;
755 if (Details::isAuxStore(*(mgr.holder()->getClass()))) {
756 auxMgr = &mgr;
757 auxKey = key;
758 } else {
759 auto itr = objects.find(key + "Aux.");
760 if (itr == objects.end()) {
761 // Apparently there's no auxiliary object for this DV, so let's
762 // give up.
763 return StatusCode::SUCCESS;
764 }
765 auxMgr = itr->second.get();
766 auxKey = key + "Aux:";
767 }
768
769 if (!metadata) {
770 // Make sure the auxiliary object is up to date.
771 ::Int_t readBytes = auxMgr->getEntry();
772
773 // Check if there is a separate auxiliary object for the dynamic
774 // variables, which would need to be updated.
775 const std::string dynAuxKey = auxKey + "Dynamic";
776 auto dynAuxMgr = objects.find(dynAuxKey);
777 if ((dynAuxMgr != objects.end()) && (readBytes || (auxMgr == &mgr))) {
778
779 // Tell the dynamic store object to switch to a new entry.
780 dynAuxMgr->second->getEntry();
781 }
782 }
783
784 // Stop here if we've set up an auxiliary store.
785 if (auxMgr == &mgr) {
786 return StatusCode::SUCCESS;
787 }
788
789 // Access the auxiliary base class of the object/vector:
790 SG::AuxVectorBase* vec = 0;
791 SG::AuxElement* aux = 0;
792 switch (mgr.holder()->typeKind()) {
793 case THolder::DATAVECTOR: {
794 void* vvec = mgr.holder()->getAs(typeid(SG::AuxVectorBase));
795 vec = reinterpret_cast<SG::AuxVectorBase*>(vvec);
796 } break;
797 case THolder::AUXELEMENT: {
798 void* vaux = mgr.holder()->getAs(typeid(SG::AuxElement));
799 aux = reinterpret_cast<SG::AuxElement*>(vaux);
800 } break;
801 default:
802 break;
803 }
804
805 // Check whether index tracking is enabled for the type. If not, then
806 // we need to fix it...
807 if (vec && (!vec->trackIndices())) {
808 Details::forceTrackIndices(*vec);
809 }
810
811 // Check if we were successful:
812 if ((!vec) && (!aux)) {
813 ATH_MSG_FATAL("Couldn't access class \""
814 << mgr.holder()->getClass()->GetName()
815 << "\" as SG::AuxVectorBase or SG::AuxElement");
816 return StatusCode::FAILURE;
817 }
818
819 // Get the concrete auxiliary manager:
820 RObjectManager* omgr = dynamic_cast<RObjectManager*>(auxMgr);
821 if (!omgr) {
822 ATH_MSG_FATAL("Auxiliary manager for \"" << auxKey
823 << "\" is not of the right type");
824 return StatusCode::FAILURE;
825 }
826 void* p = omgr->holder()->getAs(typeid(SG::IConstAuxStore));
827 const SG::IConstAuxStore* store =
828 reinterpret_cast<const SG::IConstAuxStore*>(p);
829 if (store == nullptr) {
830 ATH_MSG_FATAL("There's a logic error in the code");
831 return StatusCode::FAILURE;
832 }
833
834 // Connect the two:
835 if (vec) {
836 vec->setStore(store);
837 } else if (aux) {
838 aux->setStore(store);
839 } else {
840 ATH_MSG_FATAL("There's a logic error in the code");
841 return StatusCode::FAILURE;
842 }
843
844 // We succeeded:
845 return StatusCode::SUCCESS;
846}
std::vector< size_t > vec
void setStore(const SG::IConstAuxStore *store)
Set the store associated with this object.
@ DATAVECTOR
A DataVector container.
Definition THolder.h:105
@ AUXELEMENT
A type inheriting from SG::AuxElement.
Definition THolder.h:106

◆ setLevel()

void AthMessaging::setLevel ( MSG::Level lvl)
inherited

Change the current logging level.

Use this rather than msg().setLevel() for proper operation with MT.

Definition at line 28 of file AthMessaging.cxx.

29{
30 m_lvl = lvl;
31}

◆ setUpDynamicStore()

StatusCode xAOD::Experimental::REvent::setUpDynamicStore ( RObjectManager & mgr,
ROOT::RNTupleReader & reader )
private

event uses RNTupleReader:

This function is used by connectObject(...) and connectMetaObject(...) to set up auxiliary store type objects correctly for accessing dynamic variables from the input file.

Parameters
mgrThe object manager of the auxiliary store object
readerThe RNTuple reader to read dynamic variables from
Returns
The usual StatusCode types

Definition at line 960 of file REvent.cxx.

961 {
962
963 // The name of the field that the object is connected to.
964 const std::string fieldName = mgr.field().GetField().GetFieldName();
965
966 // Check if we can call setName(...) on the object.
967 ::TMethodCall setNameCall;
968 setNameCall.InitWithPrototype(mgr.holder()->getClass(), "setName",
969 "const char*");
970 if (setNameCall.IsValid()) {
971 // Yes, there is such a function. Let's call it with the field
972 // name.
973 const ::TString params = ::TString::Format("\"%s\"", fieldName.c_str());
974 const char* charParams = params.Data();
975 setNameCall.Execute(mgr.holder()->get(), charParams);
976 } else {
977 // This is weird. What sort of auxiliary container is this? :-/
978 ATH_MSG_WARNING("Couldn't find setName(...) function for container \""
979 << fieldName << "\" (type: "
980 << mgr.holder()->getClass()->GetName() << ")");
981 }
982
983 // Check if we can switch out the internal store of this object:
984 static const TClass* const holderClass =
985 TClass::GetClass(typeid(SG::IAuxStoreHolder));
986 if (!mgr.holder()->getClass()->InheritsFrom(holderClass)) {
987 // Nope... So let's just end the journey here.
988 return StatusCode::SUCCESS;
989 }
990
991 // Try to get the object as an IAuxStoreHolder:
992 SG::IAuxStoreHolder* storeHolder = reinterpret_cast<SG::IAuxStoreHolder*>(
993 mgr.holder()->getAs(typeid(SG::IAuxStoreHolder)));
994 if (!storeHolder) {
995 ATH_MSG_FATAL("There's a logic error in the code");
996 return StatusCode::FAILURE;
997 }
998
999 // Create an RAuxStore instance that will read the dynamic variables
1000 // of this container. Notice that the RAuxManager doesn't own the
1001 // RAuxStore object. It will be owned by the SG::IAuxStoreHolder
1002 // object.
1003 static constexpr bool TOP_STORE = false;
1004 auto store = std::make_unique<RAuxStore>(
1005 fieldName, TOP_STORE,
1009 // This object is used to read data from the input, it needs to be
1010 // locked:
1011 store->lock();
1012
1013 // Set it up to read from the input RNTuple.
1014 ATH_CHECK(store->readFrom(reader));
1015 // Tell the auxiliary store which entry to use. This is essential for
1016 // metadata objects, and non-important for event data objects, which will
1017 // get a possibly different entry loaded in setAuxStore(...).
1018 ATH_CHECK(store->getEntry(0));
1019
1020 // Set up a manager for it.
1021 static constexpr bool SHARED_OWNER = false;
1022 m_inputObjects[fieldName + "Dynamic"] =
1023 std::make_unique<RAuxManager>(store.get(), m_entry, SHARED_OWNER);
1024
1025 // Give this object to the store holder.
1026 storeHolder->setStore(store.release());
1027
1028 // Return gracefully:
1029 return StatusCode::SUCCESS;
1030}
virtual void setStore(IAuxStore *store)=0
Give an auxiliary store object to the holder object.

◆ stringToKey()

SG::sgkey_t Event::stringToKey ( const std::string & str,
CLID clid )
overrideprotectedinherited

Find the string corresponding to a given key.

Definition at line 289 of file EventIProxyDict.cxx.

289 {
290
291 return getHash(str);
292}

◆ transientContains() [1/2]

template<typename T>
bool xAOD::Event::transientContains ( const std::string & key) const
inherited

Function checking if an object is already in memory.

◆ transientContains() [2/2]

bool xAOD::Event::transientContains ( const std::string & key,
const std::type_info & ti,
bool metadata ) const
protectedinherited

Internal function checking if an object is already in memory.

◆ transientContainsMeta()

template<typename T>
bool xAOD::Event::transientContainsMeta ( const std::string & key) const
inherited

Function checking if a meta-object is already in memory.

Member Data Documentation

◆ ATLAS_THREAD_SAFE

SG::SGKeyMap<BranchInfo> m_branches xAOD::Event::ATLAS_THREAD_SAFE
mutableprotectedinherited

Map from hashed sgkey to BranchInfo.

Definition at line 358 of file Event.h.

◆ DEFAULT_KEY

sgkey_t xAOD::TVirtualEvent::DEFAULT_KEY = ~static_cast<sgkey_t>(0)
staticconstexprinherited

Key for retrieving the "default" object of a given type.

Definition at line 35 of file TVirtualEvent.h.

◆ KEY_MASK

sgkey_t xAOD::TVirtualEvent::KEY_MASK = DEFAULT_KEY >> 2
staticconstexprinherited

Mask for the keys, used mostly internally.

Definition at line 37 of file TVirtualEvent.h.

◆ m_auxItemList

std::unordered_map<std::string, std::set<std::string> > xAOD::Event::m_auxItemList
protectedinherited

Rules for selecting which auxiliary branches to write.

Definition at line 326 of file Event.h.

◆ m_branchesMutex

upgrade_mutex_t xAOD::Event::m_branchesMutex
mutableprotectedinherited

Mutex for multithread synchronization.

Definition at line 354 of file Event.h.

◆ m_entry

::Long64_t xAOD::Experimental::REvent::m_entry {}
private

The entry to look at from the input tree.

Definition at line 109 of file REvent.h.

109{};

◆ m_eventReader

std::unique_ptr<ROOT::RNTupleReader> xAOD::Experimental::REvent::m_eventReader
private

The main event data reader.

Definition at line 102 of file REvent.h.

◆ m_imsg

std::atomic<IMessageSvc*> AthMessaging::m_imsg { nullptr }
mutableprivateinherited

MessageSvc pointer.

Definition at line 135 of file AthMessaging.h.

135{ nullptr };

◆ m_inputEventFormat

EventFormat xAOD::Event::m_inputEventFormat
protectedinherited

Format of the current input file.

Definition at line 321 of file Event.h.

◆ m_inputMetaObjects

Object_t xAOD::Event::m_inputMetaObjects
protectedinherited

Collection of all the managed input meta-objects.

Definition at line 316 of file Event.h.

◆ m_inputMissingObjects

std::set<std::string> xAOD::Event::m_inputMissingObjects
protectedinherited

Objects that have been asked for, but were found to be missing in the current input.

Definition at line 311 of file Event.h.

◆ m_inputNTupleIsMissing

bool xAOD::Experimental::REvent::m_inputNTupleIsMissing = false
private

Whether the input has an event RNTuple or not.

Definition at line 104 of file REvent.h.

◆ m_inputObjects

Object_t xAOD::Event::m_inputObjects
protectedinherited

Collection of all the managed input objects.

Definition at line 308 of file Event.h.

◆ m_listeners

std::vector<TVirtualIncidentListener*> xAOD::Event::m_listeners
protectedinherited

Listeners who should be notified when certain incidents happen.

Definition at line 329 of file Event.h.

◆ m_lvl

std::atomic<MSG::Level> AthMessaging::m_lvl { MSG::NIL }
mutableprivateinherited

Current logging level.

Definition at line 138 of file AthMessaging.h.

138{ MSG::NIL };

◆ m_metaReader

std::unique_ptr<ROOT::RNTupleReader> xAOD::Experimental::REvent::m_metaReader
private

The metadata reader.

Definition at line 106 of file REvent.h.

◆ m_msg_tls

boost::thread_specific_ptr<MsgStream> AthMessaging::m_msg_tls
mutableprivateinherited

MsgStream instance (a std::cout like with print-out levels)

Definition at line 132 of file AthMessaging.h.

◆ m_nameRemapping

std::unordered_map<std::string, std::string> xAOD::Event::m_nameRemapping
protectedinherited

Container name re-mapping rules.

Definition at line 332 of file Event.h.

◆ m_nm

std::string AthMessaging::m_nm
privateinherited

Message source name.

Definition at line 129 of file AthMessaging.h.

◆ m_outputEventFormat

EventFormat* xAOD::Event::m_outputEventFormat = nullptr
protectedinherited

Format of the current output file.

Definition at line 323 of file Event.h.

◆ m_outputMetaObjects

Object_t xAOD::Event::m_outputMetaObjects
protectedinherited

Collection of all the managed output meta-objects.

Definition at line 318 of file Event.h.

◆ m_outputObjects

Object_t xAOD::Event::m_outputObjects
protectedinherited

Collection of all the managed output object.

Definition at line 313 of file Event.h.

◆ m_printEventProxyWarnings

bool xAOD::Event::m_printEventProxyWarnings = false
protectedinherited

Option to silence common warnings that seem to be harmless.

Definition at line 335 of file Event.h.


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