ATLAS Offline Software
Loading...
Searching...
No Matches
xAOD::TEvent Class Referenceabstract

Tool for accessing xAOD files outside of Athena. More...

#include <TEvent.h>

Inheritance diagram for xAOD::TEvent:
Collaboration diagram for xAOD::TEvent:

Public Types

enum  EAuxMode { kBranchAccess = 0 , kClassAccess = 1 , kAthenaAccess = 2 }
 Auxiliary store "mode". More...
using sgkey_t = SG::sgkey_t

Public Member Functions

 TEvent (EAuxMode mode=kClassAccess)
 Default constructor.
 TEvent (::TFile *file, EAuxMode mode=kClassAccess)
 Constructor connecting the object to an input TFile.
 TEvent (::TTree *tree, EAuxMode mode=kClassAccess)
 Constructor connecting the objects to an input TTree/TChain.
virtual ~TEvent ()
 Destructor.
void setOtherMetaDataTreeNamePattern (const std::string &pattern)
 Change the pattern used for collecting information from other MetaData trees NB: Additional MetaData trees are only expected for augmented files This function also allows user to redefine MetaData tree pattern to skip trees that would not be proper MetaData ones i.e.
EAuxMode auxMode () const
 Get what auxiliary access mode the object was constructed with.
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 (::TFile &inFile) override
 Set up the reading of an input file from TFile This method implements the interface from Event.
StatusCode readFrom (::TFile *file, bool useTreeCache=true, std::string_view treeName=EVENT_TREE_NAME)
 This is the 'native' interface for reading from a TFile, allowing the specification of TTree cache use and the event tree name.
StatusCode readFrom (::TTree *tree, bool useTreeCache=true)
 Connect the object to a new input tree/chain.
StatusCode writeTo (TFile &file) override
 Connect the object to an output file.
StatusCode writeTo (::TFile *file, int autoFlush=200, std::string_view treeName=EVENT_TREE_NAME)
 Connect the object to an output file.
StatusCode finishWritingTo (TFile &file) override
 Finish writing to an output file.
StatusCode finishWritingTo (::TFile *file)
 Finish writing to an output file.
Event data accessor/modifier functions
SG::IAuxStorerecordAux (const std::string &key, SG::IAuxStoreHolder::AuxStoreType type=SG::IAuxStoreHolder::AST_ContainerStore)
 Add an auxiliary store object to the output.
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.
Persistent data accessor/modifier functions
::Long64_t getEntries () const override
 Get how many entries are available from the current input file(s).
::Int_t getEntry (::Long64_t entry, ::Int_t getall=0) override
 Function loading a given entry of the input TTree.
::Long64_t getFiles () const
 Get how many files are available on the currently defined input.
::Int_t getFile (::Long64_t file, ::Int_t getall=0)
 Load the first event for a given file from the input TChain.
::Int_t fill () override
 Function filling one event into the output tree.
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.
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

StatusCode initStats ()
 Function to initialise the statistics for all Tree content.
StatusCode record (std::unique_ptr< TAuxStore > store, const std::string &key)
 Internal function for adding an auxiliary store object to the output.
StatusCode setUpDynamicStore (TObjectManager &mgr, ::TTree *tree)
 Function adding dynamic variable reading capabilities to an auxiliary store object.
StatusCode putAux (::TTree &outTree, TVirtualManager &mgr, bool metadata)
 Function saving the dynamically created auxiliary properties.
StatusCode recordAux (TAuxStore *store, const std::string &key)
 Function setting up an existing auxiliary store for writing.
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.
const EventContext & currentContext () const
 Return the event context corresponding to this event.
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.
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.

Protected Attributes

EAuxMode m_auxMode
 The auxiliary access mode.
::TTree * m_inTree = nullptr
 The main tree that we are reading from.
bool m_inTreeMissing = false
 Internal status flag showing that an input file is open, but it doesn't contain an event tree.
::TChain * m_inChain = nullptr
 The (optional) chain provided as input.
std::unique_ptr< TChainStateTrackerm_inChainTracker
 Optional object for tracking the state changes of an input TChain.
::Int_t m_inTreeNumber = -1
 The number of the currently open tree in the input chain.
::TTree * m_inMetaTree = nullptr
 Pointer to the metadata tree in the input file.
::Long64_t m_entry = -1
 The entry to look at from the input tree.
std::unique_ptr<::TTree > m_outTree
 The tree that we are writing to.
std::regex m_otherMetaDataTreeNamePattern
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

friend::TTree * MakeTransientTree (TEvent &, const char *)
void initMessaging () const
 Initialize our message level and MessageSvc.

Private Attributes

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.

Friends

class ::xAODTEventBranch
class ::xAODTMetaBranch
class xAOD::TFileMerger
class xAOD::TTreeMgr
class CP::xAODWriterAlg

Variable(s) used in the @c IProxyDict implementation

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

Helper functions for the IProxyDict interface

EventContext m_ctx
 The event context associated with this event.
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.

Setup functions

virtual StatusCode readFrom (TFile &inFile)=0
 Read from a new file - only needed for the second+ files.
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.
static const char *const EVENT_TREE_NAME = "CollectionTree"
 Default name of the event TTree.
static const char *const EVENT_RNTUPLE_NAME = "EventData"
 Name of the event RNTuple.
static const char *const METADATA_OBJECT_NAME = "MetaData"
 Name of the metadata tree or RNTuple.
static std::unique_ptr< EventcreateAndReadFrom (TFile &file)
 static method to create an Event object and readFrom a file, given by a TFile.

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.

Detailed Description

Tool for accessing xAOD files outside of Athena.

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.

For a detailed description of the usage of this class, see: <Link to be added here...>

Author
Attila Krasznahorkay Attil.nosp@m.a.Kr.nosp@m.aszna.nosp@m.hork.nosp@m.ay@ce.nosp@m.rn.c.nosp@m.h

Definition at line 59 of file Control/xAODRootAccess/xAODRootAccess/TEvent.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 338 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 383 of file Event.h.

◆ upgrading_lock_t

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

Lock type for multithread synchronization.

Definition at line 385 of file Event.h.

Member Enumeration Documentation

◆ EAuxMode

Auxiliary store "mode".

Enumerator
kBranchAccess 

Access auxiliary data branch-by-branch.

kClassAccess 

Access auxiliary data using the aux containers.

kAthenaAccess 

Access containers/objects like Athena does.

Definition at line 71 of file Control/xAODRootAccess/xAODRootAccess/TEvent.h.

71 {
72 kBranchAccess = 0,
73 kClassAccess = 1,
74 kAthenaAccess = 2
75 };
@ kAthenaAccess
Access containers/objects like Athena does.
@ kClassAccess
Access auxiliary data using the aux containers.
@ kBranchAccess
Access auxiliary data branch-by-branch.

Constructor & Destructor Documentation

◆ TEvent() [1/3]

xAOD::TEvent::TEvent ( EAuxMode mode = kClassAccess)

Default constructor.

Definition at line 69 of file Control/xAODRootAccess/Root/TEvent.cxx.

69: Event("xAOD::TEvent"), m_auxMode(mode) {}
Event(std::string_view name)
Constructor with a name.
Definition EventCore.cxx:29
EAuxMode m_auxMode
The auxiliary access mode.

◆ TEvent() [2/3]

xAOD::TEvent::TEvent ( ::TFile * file,
EAuxMode mode = kClassAccess )

Constructor connecting the object to an input TFile.

Definition at line 71 of file Control/xAODRootAccess/Root/TEvent.cxx.

71 : TEvent(mode) {
72
73 // Let the initialisation function deal with setting up the object.
74 readFrom(file).ignore();
75}
StatusCode readFrom(::TFile &inFile) override
Set up the reading of an input file from TFile This method implements the interface from Event.
TEvent(EAuxMode mode=kClassAccess)
Default constructor.
TFile * file

◆ TEvent() [3/3]

xAOD::TEvent::TEvent ( ::TTree * tree,
EAuxMode mode = kClassAccess )

Constructor connecting the objects to an input TTree/TChain.

Definition at line 77 of file Control/xAODRootAccess/Root/TEvent.cxx.

77 : TEvent(mode) {
78
79 // Let the initialisation function deal with setting up the object.
80 readFrom(tree).ignore();
81}
TChain * tree

◆ ~TEvent()

xAOD::TEvent::~TEvent ( )
virtual

Destructor.

Definition at line 83 of file Control/xAODRootAccess/Root/TEvent.cxx.

83 {
84
85 // Check that the user didn't forget to call finishWritingTo().
86 if (m_outTree) {
88 "Did not call finishWritingTo() before destroying the TEvent object!");
89 }
90
91 // Clear the input and output objects before the input/output files would be
92 // closed. Otherwise we can be left with "TTree related" objects pointing
93 // nowhere.
94 m_inputObjects.clear();
95 m_outputObjects.clear();
96}
#define ATH_MSG_ERROR(x)
Object_t m_inputObjects
Collection of all the managed input objects.
Definition Event.h:342
Object_t m_outputObjects
Collection of all the managed output object.
Definition Event.h:347
std::unique_ptr<::TTree > m_outTree
The tree that we are writing to.

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 104 of file EventCore.cxx.

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

◆ 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 169 of file EventCore.cxx.

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

◆ 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}
virtual void lock()=0
Interface to allow an object to lock itself when made const in SG.
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:388
bool m_printEventProxyWarnings
Option to silence common warnings that seem to be harmless.
Definition Event.h:369
SG::SGKeyMap< BranchInfo > m_branches ATLAS_THREAD_SAFE
Map from hashed sgkey to BranchInfo.
Definition Event.h:392
AthContainers_detail::upgrading_lock< upgrade_mutex_t > upgrading_lock_t
Lock type for multithread synchronization.
Definition Event.h:385
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:375
std::unique_ptr< SG::DataProxy > m_proxy
Data proxy describing this branch/object.
Definition Event.h:377

◆ auxMode()

TEvent::EAuxMode xAOD::TEvent::auxMode ( ) const

Get what auxiliary access mode the object was constructed with.

Returns
The auxiliary data access mode currently in use

Definition at line 100 of file Control/xAODRootAccess/Root/TEvent.cxx.

100{ return m_auxMode; }

◆ 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 150 of file EventCore.cxx.

150 {
151
152 m_listeners.clear();
153}

◆ 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 200 of file EventCore.cxx.

200 {
201
202 m_nameRemapping.clear();
203}

◆ connectAux()

StatusCode xAOD::TEvent::connectAux ( const std::string & prefix,
bool standalone )
overrideprotectedvirtual

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 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 1356 of file Control/xAODRootAccess/Root/TEvent.cxx.

1356 {
1357
1358 // A simple test...
1359 if (hasInput() == false) {
1360 ATH_MSG_ERROR("No input tree is available");
1361 return StatusCode::FAILURE;
1362 }
1363
1364 // Check if we know anything about this auxiliary object:
1365 if ((!m_inTree->GetBranch(prefix.c_str())) &&
1367 // If not, then let's just return right away. Not having
1368 // an auxiliary object with this name is not an error per se.
1369 return StatusCode::SUCCESS;
1370 }
1371
1372 // Check if the branch is already connected.
1373 if (m_inputObjects.contains(prefix)) {
1374 return StatusCode::SUCCESS;
1375 }
1376
1377 // Do different things based on the "auxiliary mode" we are in.
1378 if ((m_auxMode == kClassAccess) || (m_auxMode == kAthenaAccess)) {
1379
1380 // In "class" and "athena" access modes just connect the concrete auxiliary
1381 // object to the input.
1382 static constexpr bool SILENT = false;
1383 ATH_CHECK(connectObject(prefix, SILENT));
1384
1385 // Return gracefully.
1386 return StatusCode::SUCCESS;
1387
1388 } else if (m_auxMode == kBranchAccess) {
1389
1390 // In "branch access mode" let's create a TAuxStore object, and let
1391 // that take care of the auxiliary store access.
1392 static constexpr bool TOP_STORE = true;
1393 auto store = std::make_unique<TAuxStore>(
1394 this->currentContext(),
1395 prefix, TOP_STORE,
1398
1399 // Connect it to the input tree.
1400 ATH_CHECK(store->readFrom(*m_inTree));
1401
1402 // We're using this object to read from the input, it needs to be
1403 // locked:
1404 store->lock();
1405
1406 // Finally, set up an appropriate manager for it.
1407 static constexpr bool IS_OWNER = true;
1409 std::make_unique<TAuxManager>(store.release(), IS_OWNER);
1410
1411 // Return gracefully:
1412 return StatusCode::SUCCESS;
1413 }
1414
1415 // There was some problem:
1416 ATH_MSG_ERROR("Unknown auxiliary access mode set (" << m_auxMode << ")");
1417 return StatusCode::FAILURE;
1418}
#define ATH_CHECK
Evaluate an expression and check for errors.
const EventContext & currentContext() const
Return the event context corresponding to this event.
StatusCode connectObject(const std::string &key, bool silent) override
Function setting up access to a particular object.
bool hasInput() const override
Check if an input file is connected to the object.
::TTree * m_inTree
The main tree that we are reading from.
@ kObjectStore
The object describes a single object.
@ kContainerStore
The object describes an entire container.
@ SILENT
don't print anything and return success
TestStore store
Definition TestStore.cxx:23

◆ connectMetaAux()

StatusCode xAOD::TEvent::connectMetaAux ( const std::string & prefix,
bool standalone )
overrideprotectedvirtual

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 1429 of file Control/xAODRootAccess/Root/TEvent.cxx.

1429 {
1430
1431 // Check if the branch is already connected:
1432 if (m_inputMetaObjects.contains(prefix)) {
1433 return StatusCode::SUCCESS;
1434 }
1435
1436 // A sanity check:
1437 if (!m_inMetaTree) {
1438 ATH_MSG_FATAL("Internal logic error detected");
1439 return StatusCode::FAILURE;
1440 }
1441
1442 // Do different things based on the "auxiliary mode" we are in:
1444
1445 // In "class" and "athena" access modes just connect the concrete auxiliary
1446 // object to the input.
1447 static constexpr bool SILENT = false;
1448 ATH_CHECK(connectMetaObject(prefix, SILENT));
1449
1450 // Return gracefully:
1451 return StatusCode::SUCCESS;
1452
1453 } else if (m_auxMode == kBranchAccess) {
1454
1455 // In "branch access mode" let's create a TAuxStore object, and let
1456 // that take care of the auxiliary store access.
1457 static constexpr bool TOP_STORE = true;
1458 auto store = std::make_unique<TAuxStore>(
1459 this->currentContext(),
1460 prefix, TOP_STORE,
1463
1464 // Connect it to the input tree.
1465 ATH_CHECK(store->readFrom(*m_inMetaTree));
1466
1467 // We're using this object to read from the input, it needs to be
1468 // locked:
1469 store->lock();
1470
1471 // Finally, set up an appropriate manager for it.
1472 static constexpr bool IS_OWNER = true;
1474 std::make_unique<TAuxManager>(store.release(), IS_OWNER);
1475
1476 // Return gracefully.
1477 return StatusCode::SUCCESS;
1478 }
1479
1480 // There was some problem:
1481 ATH_MSG_ERROR("Unknown auxiliary access mode set (" << m_auxMode << ")");
1482 return StatusCode::FAILURE;
1483}
#define ATH_MSG_FATAL(x)
Object_t m_inputMetaObjects
Collection of all the managed input meta-objects.
Definition Event.h:350
::TTree * m_inMetaTree
Pointer to the metadata tree in the input file.
StatusCode connectMetaObject(const std::string &key, bool silent) override
Function setting up access to a particular metadata object.

◆ connectMetaObject()

StatusCode xAOD::TEvent::connectMetaObject ( const std::string & key,
bool silent )
overrideprotectedvirtual

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 1255 of file Control/xAODRootAccess/Root/TEvent.cxx.

1255 {
1256
1257 // A little sanity check:
1258 if (!m_inMetaTree) {
1259 ATH_MSG_ERROR("Function called on un-initialised object");
1260 return StatusCode::FAILURE;
1261 }
1262
1263 // Check if the branch is already connected:
1264 if (m_inputMetaObjects.contains(key)) {
1265 return StatusCode::SUCCESS;
1266 }
1267
1268 // Check if the branch exists in our metadata tree:
1269 ::TBranch* br = m_inMetaTree->GetBranch(key.c_str());
1270 if (br == nullptr) {
1271 if (silent == false) {
1272 ATH_MSG_WARNING("Metadata branch \"" << key
1273 << "\" not available on input");
1274 }
1275 return StatusCode::RECOVERABLE;
1276 }
1277
1278 // Check that we have an entry in the branch:
1279 if (br->GetEntries() == 0) {
1280 if (silent == false) {
1281 ATH_MSG_WARNING("Metadata branch \"" << key
1282 << "\" doesn't hold any data");
1283 }
1284 return StatusCode::RECOVERABLE;
1285 }
1286
1287 // Make sure that it's not in "MakeClass mode":
1288 br->SetMakeClass(0);
1289
1290 // Extract the type of the branch:
1291 ::TClass* cl = 0;
1292 ::EDataType dt = kOther_t;
1293 if (br->GetExpectedType(cl, dt) || (!cl)) {
1294 ATH_MSG_ERROR("Couldn't get the type for metadata branch \"" << key
1295 << "\"");
1296 return StatusCode::FAILURE;
1297 }
1298
1299 // Create the object, and all of the managers around it:
1300 void* ptr = cl->New();
1301 const bool renewOnRead = (m_auxMode == kAthenaAccess);
1302 auto mgr = std::make_unique<TObjectManager>(
1303 nullptr, std::make_unique<THolder>(ptr, cl), renewOnRead);
1304
1305 // Now try to connect to the branch:
1306 const ::Int_t status = m_inMetaTree->SetBranchAddress(
1307 key.c_str(), mgr->holder()->getPtr(), mgr->branchPtr(), cl, dt, kTRUE);
1308 if (status < 0) {
1309 ATH_MSG_ERROR("Couldn't connect variable of type \""
1310 << cl->GetName() << "\" to input branch \"" << key
1311 << "\". Return code: " << status);
1312 // Clean up:
1313 *(mgr->holder()->getPtr()) = 0;
1314 m_inputMetaObjects.erase(key);
1315 return StatusCode::FAILURE;
1316 }
1317
1318 // Store the manager.
1319 TObjectManager *mgrPtr = mgr.get();
1320 m_inputMetaObjects[key] = std::move(mgr);
1321
1322 // Read in the object:
1323 if (mgrPtr->getEntry() < 0) {
1324 ATH_MSG_ERROR("Couldn't read in metadata object with key \"" << key
1325 << "\"");
1326 return StatusCode::FAILURE;
1327 }
1328
1329 // If it's an auxiliary store object, set it up correctly:
1330 if (Details::isAuxStore(*(mgrPtr->holder()->getClass()))) {
1332 }
1333
1334 // If there may be an auxiliary object connected to this one,
1335 // connect that as well.
1336 if (Details::hasAuxStore(*(mgrPtr->holder()->getClass()))) {
1338 key + "Aux.", Details::isStandalone(*(mgrPtr->holder()->getClass()))));
1339 static constexpr bool METADATA = true;
1340 ATH_CHECK(setAuxStore(key, *mgrPtr, METADATA));
1341 }
1342
1343 // We succeeded:
1344 return StatusCode::SUCCESS;
1345}
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 setUpDynamicStore(TObjectManager &mgr, ::TTree *tree)
Function adding dynamic variable reading capabilities to an auxiliary store object.
constexpr auto getPtr(typename std::remove_reference< T >::type &arg) noexcept
void * ptr(T *p)
Definition SGImplSvc.cxx:74
cl
print [x.__class__ for x in toList(dqregion.getSubRegions()) ]
status
Definition merge.py:16
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::TEvent::connectObject ( const std::string & key,
bool silent )
overrideprotectedvirtual

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 branch of the input TTree.

The type that is read in to memory is not actually determined by the type written to the tree itself, but from the xAOD::EventFormat object. Which is there to make it possible to possibly use ROOT read rules in the future 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 branch can't be connected to
Returns
The usual StatusCode types

Implements xAOD::Event.

Definition at line 1086 of file Control/xAODRootAccess/Root/TEvent.cxx.

1086 {
1087
1088 // A little sanity check:
1089 if (hasInput() == false) {
1090 ATH_MSG_ERROR("Function called on un-initialised object");
1091 return StatusCode::FAILURE;
1092 }
1093
1094 // Increment the access counter on this container:
1096
1097 // Check if the branch is already connected:
1098 if (m_inputObjects.contains(key)) {
1099 return StatusCode::SUCCESS;
1100 }
1101 // Check if it was already found to be missing.
1102 if (m_inputMissingObjects.contains(key)) {
1103 if (silent == false) {
1104 ATH_MSG_WARNING("Branch \"" << key << "\" not available on input");
1105 }
1106 return StatusCode::RECOVERABLE;
1107 }
1108
1109 // Check if we have metadata about this branch:
1110 const xAOD::EventFormatElement* ef = nullptr;
1111 if (m_inputEventFormat.exists(key) == false) {
1112 if (silent == false) {
1113 ATH_MSG_WARNING("No metadata available for branch: " << key);
1114 }
1115 } else {
1116 ef = m_inputEventFormat.get(key);
1117 }
1118
1119 // Check if the branch exists in our input tree:
1120 ::TBranch* br = m_inTree->GetBranch(key.c_str());
1121 if (br == nullptr) {
1122 if (!silent) {
1123 ATH_MSG_WARNING("Branch \"" << key << "\" not available on input");
1124 }
1125 m_inputMissingObjects.insert(key);
1126 return StatusCode::RECOVERABLE;
1127 }
1128
1129 // Make sure that it's not in "MakeClass mode":
1130 br->SetMakeClass(0);
1131
1132 // Decide about the type that we need to use for the reading of this
1133 // branch:
1134 std::string className = br->GetClassName();
1135 if (className == "") {
1136 if (ef) {
1137 // This is a fairly weird situation, but let's fall back to taking
1138 // the class name from the metadata object in this case.
1139 className = ef->className();
1140 } else {
1142 "Couldn't find an appropriate type with a dictionary for branch \""
1143 << key << "\"");
1144 return StatusCode::FAILURE;
1145 }
1146 }
1147 ::TClass* realClass = ::TClass::GetClass(className.c_str());
1148 if (((!realClass) || (!realClass->IsLoaded())) && ef) {
1149 // We may need to do an actual schema evolution here, in which
1150 // case let's fall back on the class name coming from the metadata
1151 // object.
1152 className = ef->className();
1153 realClass = ::TClass::GetClass(className.c_str());
1154 }
1155 if ((!realClass) || (!realClass->IsLoaded())) {
1156 // Now we're in trouble...
1158 "Couldn't find an appropriate type with a dictionary for branch \""
1159 << key << "\"");
1160 return StatusCode::FAILURE;
1161 }
1162
1163 // Make sure that the current object is the "active event":
1164 setActive();
1165
1166 // The data type is always "other" for us:
1167 static const ::EDataType dataType = kOther_t;
1168
1169 // Check if the output already has this object. If it does, let's
1170 // assume that we have been copying the object to the output. Which
1171 // means that we need to resume filling the same memory address that
1172 // the output holder points to.
1173 void* ptr = nullptr;
1174 Object_t::const_iterator out_itr = m_outputObjects.find(key);
1175 if (out_itr != m_outputObjects.end()) {
1176 // It needs to be an object manager...
1177 TObjectManager* mgr = dynamic_cast<TObjectManager* >(out_itr->second.get());
1178 if (mgr == nullptr) {
1179 ATH_MSG_ERROR("Couldn't access output manager for: " << key);
1180 return StatusCode::FAILURE;
1181 }
1182 // Get the pointer out of it:
1183 ptr = mgr->holder()->get();
1184 }
1185
1186 // If there is no output object, then let's create one ourselves.
1187 // This is the only way in which we can have the memory management of
1188 // THolder do the right thing with this object.
1189 if (ptr == nullptr) {
1190 ptr = realClass->New();
1191 }
1192
1193 // Create the new manager object that will hold this EDM object:
1194 const bool renewOnRead = (m_auxMode == kAthenaAccess);
1195 auto mgr = std::make_unique<TObjectManager>(
1196 nullptr, std::make_unique<THolder>(ptr, realClass), renewOnRead);
1197
1198 // One final check. If it's not an auxiliary store, then it must have
1199 // a split level of 0. Otherwise read rules may not work on it. Causing
1200 // *very* serious silent corruption in the data read, if we don't use
1201 // the "Athena read mode".
1202 if ((m_auxMode != kAthenaAccess) && (br->GetSplitLevel() != 0) &&
1203 (Details::isAuxStore(*(mgr->holder()->getClass())) == false)) {
1204 ATH_MSG_ERROR("Split level for branch \""
1205 << key << "\" is " << br->GetSplitLevel()
1206 << ". This can only be read in kAthenaAccess mode.");
1207 // Clean up:
1208 *(mgr->holder()->getPtr()) = nullptr;
1209 m_inputObjects.erase(key);
1210 return StatusCode::FAILURE;
1211 }
1212
1213 // Now try to connect to the branch:
1214 const ::Int_t status =
1215 m_inTree->SetBranchAddress(key.c_str(), mgr->holder()->getPtr(),
1216 mgr->branchPtr(), realClass, dataType, kTRUE);
1217 if (status < 0) {
1218 ATH_MSG_ERROR("Couldn't connect variable of type \""
1219 << className << "\" to input branch \"" << key
1220 << "\". Return code: " << status);
1221 // Clean up:
1222 *(mgr->holder()->getPtr()) = 0;
1223 m_inputObjects.erase(key);
1224 return StatusCode::FAILURE;
1225 }
1226
1227 // At this point we have successfully connected the branch.
1228 TObjectManager* mgrPtr = mgr.get();
1229 m_inputObjects[key] = std::move(mgr);
1230
1231 // If it's an auxiliary store object, set it up correctly:
1232 if (Details::isAuxStore(*(mgrPtr->holder()->getClass()))) {
1234 }
1235
1236 // If there may be an auxiliary object connected to this one,
1237 // connect that as well:
1238 if (Details::hasAuxStore(*(mgrPtr->holder()->getClass()))) {
1240 key + "Aux.", Details::isStandalone(*(mgrPtr->holder()->getClass()))));
1241 }
1242
1243 // Return gracefully.
1244 return StatusCode::SUCCESS;
1245}
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:345
void setActive() const
Set this event object as the currently active one.
Definition EventCore.cxx:61
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.
StatusCode connectAux(const std::string &prefix, bool standalone) override
Function setting up access to a set of auxiliary branches.

◆ 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 95 of file EventIO.cxx.

95 {
96
97 // Tell the user what's happening.
98 ATH_MSG_DEBUG("Copying objects matching pattern \"" << pattern
99 << "\" to the output");
100
101 // Collect a list of keys to copy.
102 std::set<std::string> keys;
103
104 // The regular expression to use.
105 std::regex re{pattern};
106
107 // Loop over the known input containers.
108 for (const auto& [key, efe] : m_inputEventFormat) {
109
110 // Tell the user what's happening.
111 ATH_MSG_VERBOSE("Considering input object with key \"" << key << "\"");
112
113 // Check if the class in question matches the requested pattern.
114 if (std::regex_match(key, re) == false) {
115 continue;
116 }
117 // Skip all branches ending in "Aux.":
118 if (key.ends_with("Aux.")) {
119 continue;
120 }
121 // Also skip dynamic branches:
122 if (efe.parentName() != "") {
123 continue;
124 }
125 // Ignore objects that don't exist on the input.
126 static const bool SILENT = true;
127 if (connectObject(key, SILENT).isSuccess() == false) {
128 continue;
129 }
130 // Add the key to the list.
131 ATH_MSG_VERBOSE("Matched key \"" << key << "\"");
132 keys.insert(key);
133 }
134
135 // Check if the pattern matches any of the name remapping rules.
136 for (const auto& [newname, onfile] : m_nameRemapping) {
137
138 // Tell the user what's happening.
139 ATH_MSG_VERBOSE("Considering remapped key \"" << newname << "\"");
140
141 // Check if the remapped name matches the pattern.
142 if (std::regex_match(newname, re) == false) {
143 continue;
144 }
145 // Ignore objects that don't exist on the input.
146 static const bool SILENT = true;
147 if (connectObject(onfile, SILENT).isSuccess() == false) {
148 continue;
149 }
150 // Add the remapped name to the list.
151 ATH_MSG_VERBOSE("Matched remapped key \"" << newname << "\"");
152 keys.insert(newname);
153 }
154
155 // Now loop over all of the found keys.
156 for (const std::string& key : keys) {
157
158 // Check if a name re-mapping should be applied or not.
159 std::string keyToUse = key;
160 auto remap_itr = m_nameRemapping.find(key);
161 if ((remap_itr != m_nameRemapping.end()) &&
162 (!m_inputEventFormat.exists(key)) &&
163 m_inputEventFormat.exists(remap_itr->second)) {
164 keyToUse = remap_itr->second;
165 }
166
167 // Make sure that the input object got connected to.
168 static const bool SILENT = false;
169 ATH_CHECK(connectObject(keyToUse, SILENT));
170
171 // Make sure that the input object is properly updated.
172 Object_t::const_iterator vobjMgr = m_inputObjects.find(keyToUse);
173 if (vobjMgr == m_inputObjects.end()) {
174 ATH_MSG_FATAL("Internal logic error detected");
175 return StatusCode::FAILURE;
176 }
177 Details::IObjectManager* objMgr =
178 dynamic_cast<Details::IObjectManager*>(vobjMgr->second.get());
179 if (objMgr == nullptr) {
180 ATH_MSG_FATAL("Internal logic error detected");
181 return StatusCode::FAILURE;
182 }
183 static const bool METADATA = false;
184 if (getInputObject(keyToUse, *(objMgr->holder()->getClass()->GetTypeInfo()),
185 SILENT, METADATA) == nullptr) {
186 ATH_MSG_FATAL("Internal logic error detected");
187 return StatusCode::FAILURE;
188 }
189
190 // Put the interface object into the output.
191 static const bool OVERWRITE = true;
192 static const bool IS_OWNER = true;
193 ATH_CHECK(record(objMgr->object(), objMgr->holder()->getClass()->GetName(),
194 key, OVERWRITE, METADATA, IS_OWNER));
195
196 // If there is also an auxiliary store for this object/container, copy that
197 // as well.
198 const std::string auxKey = keyToUse + "Aux.";
199 if (m_inputObjects.contains(auxKey)) {
200 ATH_CHECK(
201 recordAux(*(m_inputObjects.at(auxKey)), key + "Aux.", METADATA));
202 }
203 }
204
205 // Return gracefully:
206 return StatusCode::SUCCESS;
207}
const std::regex re(r_e)
#define ATH_MSG_VERBOSE(x)
#define ATH_MSG_DEBUG(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

◆ createAndReadFrom()

std::unique_ptr< Event > Event::createAndReadFrom ( TFile & inFile)
staticinherited

static method to create an Event object and readFrom a file, given by a TFile.

static method to get Event object for reading either TTree (TEvent) or RNTuple (REvent).

The the reader technology, TTree read by TEvent or RNTuple read by REvent, is determined by the looking into the file, given as a TFile object.

Here we access by TFile object

Definition at line 43 of file EventIO.cxx.

43 {
44
45 // Make use of the messaging function(s) from the xAODEvent namespace.
46 using xAODEvent::msg;
47
48 if (inFile.FindKey(EVENT_RNTUPLE_NAME) != nullptr) {
49 // Create and set up an REvent object
50 auto event = std::make_unique<Experimental::REvent>();
51 if (event->readFrom(inFile).isFailure()) {
52 ANA_MSG_ERROR("Could not read RNTuple from: " << inFile.GetName());
53 return {};
54 }
55 return event;
56 } else if (inFile.FindKey(EVENT_TREE_NAME) != nullptr) {
57 // Create and set up a TEvent object
58 // Check if file is AOD, in which case kAthenaAccess must be used
59 auto eauxMode = TEvent::kClassAccess;
60 std::string sauxMode = "kClassAccess";
61 auto metaData = dynamic_cast<TTree*>(inFile.Get("MetaData"));
62 if (metaData) {
63 auto rc = metaData->LoadTree(0);
64 if (rc < 0)[[unlikely]]{
65 ANA_MSG_ERROR("Error from LoadTree: "<< rc);
66 return {};
67 }
68 if (metaData->GetBranch("StreamAOD")) {
69 eauxMode = TEvent::kAthenaAccess;
70 sauxMode = "kAthenaAccess";
71 }
72 }
73 ANA_MSG_INFO("Using aux mode " << sauxMode << " for file " << inFile.GetName());
74 auto event = std::make_unique<TEvent>(eauxMode);
75 if (event->readFrom(inFile).isFailure()) {
76 ANA_MSG_ERROR("Could not read TTree from: " << inFile.GetName());
77 return {};
78 }
79 return event;
80 } else {
81 ANA_MSG_ERROR("Could not recognize file: " << inFile.GetName());
82 return {};
83 }
84}
#define ANA_MSG_INFO(xmsg)
Macro printing info messages.
#define ANA_MSG_ERROR(xmsg)
Macro printing error messages.
static Double_t rc
static const char *const EVENT_TREE_NAME
Default name of the event TTree.
Definition Event.h:77
static const char *const EVENT_RNTUPLE_NAME
Name of the event RNTuple.
Definition Event.h:78
str inFile
Definition makeTOC.py:5
#define unlikely(x)

◆ currentContext()

const EventContext & Event::currentContext ( ) const
protectedinherited

Return the event context corresponding to this event.

(Returns a dummy in standalone builds.)

Definition at line 311 of file EventCore.cxx.

311 {
312#ifdef XAOD_STANDALONE
313 return Gaudi::Hive::currentContext();
314#else
315 return m_ctx;
316#endif
317}
EventContext m_ctx
The event context associated with this event.
Definition Event.h:408

◆ 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 257 of file EventCore.cxx.

257 {
258
259 // The internal stream object.
260 std::ostringstream ost;
261 ost << "<<<<<<<<<<<<<<<<<<<< xAOD::TEvent Dump >>>>>>>>>>>>>>>>>>>>\n";
262
263 // Loop over the input EventFormat object.
264 for (const auto& [key, element] : m_inputEventFormat) {
265
266 // Get the type.
267 ::TClass* cl = ::TClass::GetClass(element.className().c_str());
268 const std::type_info* ti = (cl ? cl->GetTypeInfo() : nullptr);
269 if ((cl == nullptr) || (cl->IsLoaded() == false) || (ti == nullptr)) {
270 ATH_MSG_WARNING("Unknown type (" << element.className()
271 << ") found in the event format");
272 continue;
273 }
274
275 // Skip containers that are not available anyway.
276 static const bool METADATA = false;
277 if (!contains(element.branchName(), *ti, METADATA)) {
278 continue;
279 }
280
281 // Do the printout.
282 ost << " Hash: 0x" << std::setw(8) << std::setfill('0') << std::hex
283 << element.hash() << " Key: \"" << element.branchName() << "\"\n";
284
285 ost << " type: " << element.className() << "\n";
286 const bool isNonConst =
287 transientContains(element.branchName(), *ti, METADATA);
288 ost << " isConst: " << (isNonConst ? "No" : "Yes") << "\n";
289 static const bool SILENT = false;
290 ost << " Data: "
291 << (isNonConst
292 ? getOutputObject(element.branchName(), *ti, METADATA)
293 : getInputObject(element.branchName(), *ti, SILENT, METADATA))
294 << "\n";
295 }
296
297 // Finish with the construction:
298 ost << "<<<<<<<<<<<<<<<<<<<<<<<<<<<<<>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>";
299 return ost.str();
300}
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.

◆ fill()

Int_t xAOD::TEvent::fill ( )
overridevirtual

Function filling one event into the output tree.

This function needs to be called by the user at the end of processing each event that is meant to be written out.

Returns
The number of bytes written if successful, a negative number if not

Implements xAOD::Event.

Definition at line 844 of file Control/xAODRootAccess/Root/TEvent.cxx.

844 {
845
846 // A little sanity check:
847 if (!m_outTree) {
848 ATH_MSG_ERROR("Object not connected to an output file!");
849 return 0;
850 }
851
852 // Make sure that all objects have been read in. The 99 as the value
853 // has a special meaning for TAuxStore. With this value it doesn't
854 // delete its transient (decoration) variables. Otherwise it does.
855 // (As it's supposed to, when moving to a new event.)
856 Int_t readBytes = 0;
857 if (m_inChain != nullptr) {
858 readBytes = getEntry(m_inChain->GetReadEntry(), 99);
859 } else if (m_inTree != nullptr) {
860 readBytes = getEntry(m_entry, 99);
861 }
862 if (readBytes < 0) {
863 ATH_MSG_ERROR("getEntry failed!");
864 return readBytes;
865 }
866
867 // Prepare the objects for writing. Note that we need to iterate over a
868 // copy of the m_outputObjects container. Since the putAux(...) function
869 // called inside the loop may itself add elements to the m_outputObject
870 // container.
871 std::string unsetObjects;
872 std::vector<std::pair<std::string, TVirtualManager* >> outputObjectsCopy;
873 outputObjectsCopy.reserve(m_outputObjects.size());
874 for (const auto &[key, mgr] : m_outputObjects) {
875 outputObjectsCopy.emplace_back(key, mgr.get());
876 }
877 for (auto &[key, mgr] : outputObjectsCopy) {
878 // Check that a new object was provided in the event:
879 if (!mgr->create()) {
880 // We are now going to fail. But let's collect the names of
881 // all the unset objects:
882 if (unsetObjects.size()) {
883 unsetObjects += ", ";
884 }
885 unsetObjects.append("\"" + key + "\"");
886 continue;
887 }
888 // Make sure that any dynamic auxiliary variables that
889 // were added to the object after it was put into the event,
890 // get added to the output:
891 static constexpr bool METADATA = false;
892 if (putAux(*m_outTree, *mgr, METADATA).isFailure()) {
893 ATH_MSG_ERROR("Failed to put dynamic auxiliary variables "
894 "in the output for object \""
895 << key << "\"");
896 return 0;
897 }
898 }
899
900 // Check if there were any unset objects:
901 if (unsetObjects.size()) {
902 ATH_MSG_ERROR("The following objects were not set in the current event: "
903 << unsetObjects);
904 return 0;
905 }
906
907 // Write the entry, and check the return value:
908 const ::Int_t ret = m_outTree->Fill();
909 if (ret <= 0) {
910 ATH_MSG_ERROR("Output tree filling failed with return value: " << ret);
911 }
912
913 // Reset the object managers.
914 for (auto &[key, mgr] : m_outputObjects) {
915 mgr->reset();
916 }
917
918 // Return the value:
919 return ret;
920}
::Int_t getEntry(::Long64_t entry, ::Int_t getall=0) override
Function loading a given entry of the input TTree.
::Long64_t m_entry
The entry to look at from the input tree.
::TChain * m_inChain
The (optional) chain provided as input.
StatusCode putAux(::TTree &outTree, TVirtualManager &mgr, bool metadata)
Function saving the dynamically created auxiliary properties.

◆ finishWritingTo() [1/2]

StatusCode xAOD::TEvent::finishWritingTo ( ::TFile * file)

Finish writing to an output file.

This function needs to be called when the user is done writing events to a file, before (s)he would close the file itself.

Parameters
fileThe file that the event data is written to
Returns
The usual StatusCode tyoes

Definition at line 476 of file Control/xAODRootAccess/Root/TEvent.cxx.

476 {
477
478 // A small sanity check:
479 if (!m_outTree) {
480 ATH_MSG_ERROR("The object doesn't seem to be connected to an output file!");
481 return StatusCode::FAILURE;
482 }
483
484 // Make sure we return to the current directory:
485 TDirectoryReset dr;
486
487 // Notify the listeners that they should write out their metadata, if they
488 // have any.
489 const TIncident incident(IncidentType::MetaDataStop);
490 for (auto &listener : m_listeners) {
491 listener->handle(incident);
492 }
493
494 // Write out the event tree, and delete it:
495 m_outTree->AutoSave("FlushBaskets");
496 m_outTree->SetDirectory(0);
497 m_outTree.reset();
498
499 // Now go to the output file:
500 file->cd();
501
502 // Check if there's already a metadata tree in the output:
503 if (file->Get(METADATA_OBJECT_NAME)) {
504 // Let's assume that the metadata is complete in the file already.
505 return StatusCode::SUCCESS;
506 }
507
508 // Create the metadata tree.
509 auto metatree =
510 std::make_unique<TTree>(METADATA_OBJECT_NAME, "xAOD metadata tree");
511 metatree->SetAutoSave(10000);
512 metatree->SetAutoFlush(-30000000);
513 metatree->SetDirectory(file);
514
515 // Create the xAOD::EventFormat branch in it.
516 try {
517 metatree->Branch(
518 "EventFormat",
521 } catch (const CxxUtils::ClassName::ExcBadClassName &e) {
522 ::Error("xAOD::TEvent::finishWritingTo",
523 XAOD_MESSAGE("Class name parsing fails for %s ! "), e.what());
524 return StatusCode::FAILURE;
525 }
526
527 // Create a copy of the m_outputMetaObjects variable. This is necessary
528 // because the putAux(...) function will modify this variable while we
529 // loop over it.
530 std::vector<std::pair<std::string, TObjectManager* >> outputMetaObjects;
531 outputMetaObjects.reserve(m_outputMetaObjects.size());
532 for (const auto &[key, mgr] : m_outputMetaObjects) {
533 TObjectManager* objMgr = dynamic_cast<TObjectManager* >(mgr.get());
534 if (objMgr == nullptr) {
535 ATH_MSG_FATAL("Internal logic error detected");
536 return StatusCode::FAILURE;
537 }
538 outputMetaObjects.emplace_back(key, objMgr);
539 }
540
541 // Now loop over all the metadata objects that need to be put into the
542 // output file:
543 for (auto &[key, mgr] : outputMetaObjects) {
544
545 // Select a split level depending on whether this is an interface or an
546 // auxiliary object:
547 const ::Int_t splitLevel = (key.ends_with("Aux.") ? 1 : 0);
548 // Create the new branch:
549 *(mgr->branchPtr()) =
550 metatree->Branch(key.c_str(), mgr->holder()->getClass()->GetName(),
551 mgr->holder()->getPtr(), 32000, splitLevel);
552 if (!mgr->branch()) {
553 ATH_MSG_ERROR("Failed to create metadata branch \""
554 << mgr->holder()->getClass()->GetName() << "/" << key
555 << "\"");
556 return StatusCode::FAILURE;
557 }
558 // Set up the saving of all the dynamic auxiliary properties
559 // of the object if it has any:
560 static constexpr bool METADATA = true;
561 ATH_CHECK(putAux(*metatree, *mgr, METADATA));
562 }
563
564 // Write the metadata objects:
565 if (metatree->Fill() <= 0) {
566 ATH_MSG_ERROR("Failed to write event format metadata into the output");
567 metatree->SetDirectory(nullptr);
568 return StatusCode::FAILURE;
569 }
570
571 // Now clean up:
572 metatree->Write();
573 metatree->SetDirectory(nullptr);
574 m_outputEventFormat = nullptr;
575 m_outputObjects.clear();
576 m_outputMetaObjects.clear();
577
578 // Return gracefully:
579 return StatusCode::SUCCESS;
580}
#define XAOD_MESSAGE(MESSAGE)
Simple macro for printing error/verbose messages.
static const char *const METADATA_OBJECT_NAME
Name of the metadata tree or RNTuple.
Definition Event.h:79
EventFormat * m_outputEventFormat
Format of the current output file.
Definition Event.h:357
Object_t m_outputMetaObjects
Collection of all the managed output meta-objects.
Definition Event.h:352
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...
static const ::Int_t MetaDataStop
The metadata for the output file should be written out.
Definition TIncident.h:31
EventFormat_v1 EventFormat
Definition of the current event format version.
Definition EventFormat.h:16

◆ finishWritingTo() [2/2]

StatusCode xAOD::TEvent::finishWritingTo ( TFile & file)
overridevirtual

Finish writing to an output file.

This function needs to be called when the user is done writing events to a file, before (s)he would close the file itself.

Parameters
fileThe file that the event data is written to
Returns
The usual StatusCode tyoes

Implements xAOD::Event.

Definition at line 466 of file Control/xAODRootAccess/Root/TEvent.cxx.

466 {
467 return finishWritingTo(&file);
468}
StatusCode finishWritingTo(TFile &file) override
Finish writing to an output file.

◆ 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:65
const xAOD::EventFormatElement * getEventFormatElement(SG::sgkey_t sgkey) const
Get the metadata object for a given "SG key".

◆ getEntries()

Long64_t xAOD::TEvent::getEntries ( ) const
overridevirtual

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

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

Implements xAOD::Event.

Definition at line 651 of file Control/xAODRootAccess/Root/TEvent.cxx.

651 {
652
653 if (m_inChain) {
654 return m_inChain->GetEntries();
655 } else if (m_inTree) {
656 return m_inTree->GetEntries();
657 } else if (m_inTreeMissing) {
658 // The input file is empty:
659 return 0;
660 } else {
661 ATH_MSG_ERROR("Function called on an uninitialised object");
662 return 0;
663 }
664}
bool m_inTreeMissing
Internal status flag showing that an input file is open, but it doesn't contain an event tree.

◆ getEntry()

Int_t xAOD::TEvent::getEntry ( ::Long64_t entry,
::Int_t getall = 0 )
overridevirtual

Function loading a given entry of the input TTree.

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

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

Implements xAOD::Event.

Definition at line 680 of file Control/xAODRootAccess/Root/TEvent.cxx.

680 {
681
682 // A little sanity check:
683 if ((!m_inTree) && (!m_inChain)) {
684 ATH_MSG_ERROR("Function called on an uninitialised object");
685 return -1;
686 }
687
688 // If we have a chain as input:
689 if (m_inChain) {
690 // Make sure that the correct tree is loaded:
691 const ::Long64_t fileEntry = m_inChain->LoadTree(entry);
692 if (fileEntry < 0) {
693 ATH_MSG_ERROR("Failure in loading entry " << entry
694 << " from the input chain");
695 return -1;
696 }
697 // Check if a new file was loaded:
698 if ((m_inTreeNumber != m_inChain->GetTreeNumber()) ||
699 m_inChainTracker->internalStateChanged()) {
700 // Reset the tracker:
701 m_inChainTracker->reset();
702 // Connect to this new file:
703 m_inTreeNumber = m_inChain->GetTreeNumber();
704 ::TFile* file = m_inChain->GetFile();
705 // The useTreeCache parameter is set to false, since the cache
706 // is anyway set up through the TChain. It shouldn't be modified
707 // on the file level.
708 static constexpr bool USE_TREE_CACHE = false;
709 if (readFrom(file, USE_TREE_CACHE, m_inChain->GetName()).isFailure()) {
710 ATH_MSG_ERROR("Couldn't connect to input file #"
711 << m_inTreeNumber << " of the input chain");
712 return -1;
713 }
714 }
715 // Restore the previously received entry number.
716 m_entry = fileEntry;
717 }
718 // If we have a regular file/tree as input:
719 else {
720 m_entry = entry;
721 }
722
723 // In order to make the reading of branches+tree cache work
724 // NB: TTree::LoadTree() only set the entry that should be read for each
725 // branch but no reading of the branch content is performed when calling that
726 // function. The entry set that can be retrieved with
727 // branch->GetTree()->GetReadEntry()
728 // For friend trees, if an index was built, then the entry which is set for
729 // the related branches is found by the LoadTree function by matching the the
730 // major and minor values of the main tree and friend tree
731 if (m_inTree && m_inTree->LoadTree(m_entry) < 0) {
732 ATH_MSG_ERROR("Failure in loading entry " << m_entry
733 << " from the input file");
734 return -1;
735 }
736
737 // Stats counter needs to know it's the next event:
739
740 // The final number of bytes read.
741 ::Int_t result = 0;
742
743 // Check if objects need to be read in.
744 if (getall) {
745 if (m_auxMode == kAthenaAccess) {
746 // In kAthenaAccess mode we need to use getInputObject(...) to load
747 // all the input objects correctly.
748 for (auto &[key, mgr] : m_inputObjects) {
749 static const std::string dynStorePostfix = "Aux.Dynamic";
750 if (key.ends_with(dynStorePostfix)) {
751 // Ignore the dynamic store objects. They get loaded through
752 // their parents.
753 } else {
754 // Load the objects and their auxiliary stores through the
755 // getInputObject(...) function, which takes care of correctly
756 // setting them up. The type is irrelevant here. We don't
757 // really care about the exact type of the objects.
758 static constexpr bool SILENT = true;
759 static constexpr bool METADATA = false;
760 getInputObject(key, typeid(int), SILENT, METADATA);
761 }
762 }
763 } else {
764 // In a "reasonable" access mode, we do something very simple:
765 for (auto &[key, mgr] : m_inputObjects) {
766 result += mgr->getEntry(getall);
767 }
768 }
769 }
770
771 // Notify the listeners that a new event was loaded:
772 const TIncident incident(IncidentType::BeginEvent);
773 for (auto &listener : m_listeners) {
774 listener->handle(incident);
775 }
776
777 // Return the number of bytes read:
778 return result;
779}
void nextEvent()
Function incrementing the processed event counter.
std::unique_ptr< TChainStateTracker > m_inChainTracker
Optional object for tracking the state changes of an input TChain.
::Int_t m_inTreeNumber
The number of the currently open tree in the input chain.
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::lock_guard< mutex_t > guard_t
Guard type for multithreaded synchronisation.
std::unordered_set< sgkey_t > SGKeySet
A set of sgkey_t values.
Definition sgkey_t.h:97
AthContainers_detail::mutex mutex_t
Mutex used to synchronize modifications to the cache vector.

◆ getFile()

Int_t xAOD::TEvent::getFile ( ::Long64_t file,
::Int_t getall = 0 )

Load the first event for a given file from the input TChain.

This function can be used to iterate over the input files specified for the object.

It should be most useful for collecting metadata about a set of input files, if there's no regular event loop done to process them.

Parameters
fileThe file number to load
getallIf set to 1, all connected branches are loaded
Returns
The number of read bytes on success, or a negative number on failure

Definition at line 810 of file Control/xAODRootAccess/Root/TEvent.cxx.

810 {
811
812 // Check if the file number is valid:
813 if ((file < 0) || (file >= getFiles())) {
814 ATH_MSG_ERROR("Function called with invalid file number (" << file << ")");
815 return -1;
816 }
817
818 // If we are not reading a TChain, return at this point. As the one and
819 // only file is open already...
820 if (!m_inChain) {
821 return 0;
822 }
823
824 // Trigger the "scanning" of the input files, so the TChain would know
825 // how many entries are in the various files.
826 getEntries();
827
828 // Calculate which entry/event we need to load:
829 ::Long64_t entry = 0;
830 for (::Long64_t i = 0; i < file; ++i) {
831 entry += m_inChain->GetTreeOffset()[i];
832 }
833
834 // Load this entry using the regular event opening function:
835 return getEntry(entry, getall);
836}
::Long64_t getFiles() const
Get how many files are available on the currently defined input.
::Long64_t getEntries() const override
Get how many entries are available from the current input file(s).

◆ getFiles()

Long64_t xAOD::TEvent::getFiles ( ) const

Get how many files are available on the currently defined input.

This function can be used to get the number of input files that the object currently knows about.

This is meant to be used to collect the metadata from each of the input files, or to access the metadata using a transient tree. (xAOD::TMetaTree)

Returns
The number of input files when reading from a TChain, 1 when reading from a TFile, and 0 if the object is not connected to any input

Definition at line 790 of file Control/xAODRootAccess/Root/TEvent.cxx.

790 {
791
792 if (m_inChain) {
793 return m_inChain->GetListOfFiles()->GetEntries();
794 } else if (m_inTree || m_inTreeMissing) {
795 return 1;
796 } else {
797 return 0;
798 }
799}

◆ 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 285 of file EventIO.cxx.

287 {
288
289 // Check if a name remapping should be applied or not:
290 std::string keyToUse = key;
291 auto remap_itr = m_nameRemapping.find(key);
292 if ((remap_itr != m_nameRemapping.end()) &&
293 (!m_inputEventFormat.exists(key)) &&
294 m_inputEventFormat.exists(remap_itr->second)) {
295 keyToUse = remap_itr->second;
296 }
297
298 // The following catches the cases when we ask for a transient
299 // ConstDataVector object to be returned as "const DataVector".
300 TStore* store = TActiveStore::store();
301 if (store && store->contains(keyToUse, ti) && store->isConst(keyToUse, ti)) {
302 const void* result = store->getConstObject(keyToUse, ti);
303 return result;
304 }
305
306 // A sanity check before checking for an object from the input file.
307 if (hasInput() == false) {
308 if (silent == false) {
309 ATH_MSG_WARNING("No input file connected to the Event object");
310 }
311 return nullptr;
312 }
313
314 // Make sure that the requested input is connected to.
315 const StatusCode sc = (metadata ? connectMetaObject(keyToUse, silent)
316 : connectObject(keyToUse, silent));
317 if (sc.isSuccess() == false) {
318 return nullptr;
319 }
320
321 // Select which object container to use:
322 Object_t& objects = (metadata ? m_inputMetaObjects : m_inputObjects);
323
324 // Access the object's manager:
325 auto itr = objects.find(keyToUse);
326 if (itr == objects.end()) {
327 ATH_MSG_FATAL("There is an internal logic error in the code...");
328 return nullptr;
329 }
330
331 // This has to be an ObjectManager object:
332 Details::IObjectManager* mgr =
333 dynamic_cast<Details::IObjectManager*>(itr->second.get());
334 if (mgr == nullptr) {
335 if (key == keyToUse) {
336 ATH_MSG_ERROR("Object of wrong type found for key \"" << key << "\"");
337 } else {
338 ATH_MSG_ERROR("Object of wrong type found for key \""
339 << key << "\"/\"" << keyToUse << "\"");
340 }
341 return nullptr;
342 }
343
344 // Make sure that the current entry is loaded for event data objects.
345 if (metadata == false) {
346 const Int_t readBytes = mgr->getEntry();
347 if (readBytes > 0) {
348 // Connect the auxiliary store to objects needing it. This call also
349 // takes care of updating the dynamic store of auxiliary containers,
350 // when they are getting accessed directly.
351 static const bool IS_METADATA = false;
352 if (setAuxStore(key, *mgr, IS_METADATA).isSuccess() == false) {
353 ATH_MSG_ERROR("Failed to set the auxiliary store for "
354 << mgr->holder()->getClass()->GetName() << "/"
355 << keyToUse);
356 return nullptr;
357 }
358 } else if (readBytes < 0) {
359 ATH_MSG_ERROR("Failed to load current entry for object "
360 << mgr->holder()->getClass()->GetName() << "/" << keyToUse);
361 return nullptr;
362 }
363 }
364
365 // Ask the holder object for the object of this type:
366 const void* result = mgr->holder()->getAsConst(ti, silent);
367 if (result == nullptr) {
368 if (!silent) {
369 ATH_MSG_WARNING("Could not retrieve object with key \""
370 << keyToUse << "\" as \""
371 << SG::normalizedTypeinfoName(ti) << "\"");
372 }
373 return nullptr;
374 }
375
376 // We succeeded:
377 return result;
378}
static Double_t sc
if(pathvar)
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:338
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.
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::TEvent::getNames ( const std::string & targetClassName,
std::vector< std::string > & vkeys,
bool metadata ) const
overrideprotectedvirtual

Function determining the list keys associated with a type name.

Implements xAOD::Event.

Definition at line 929 of file Control/xAODRootAccess/Root/TEvent.cxx.

931 {
932 // The results go in here
933 std::set<std::string> keys;
934
935 // Get list of branches from
936 // the input metadata tree or input tree
937 std::vector<TObjArray* > fullListOfBranches = {};
938 if (metadata) {
939 if (m_inMetaTree) {
940 // No friend tree expected for metadata tree
941 // Only add the list of branches of the metadata tree
942 ATH_MSG_DEBUG("Scanning for input metadata objects");
943 fullListOfBranches.push_back(m_inMetaTree->GetListOfBranches());
944 }
945 } else {
946 if (m_inTree) {
947 ATH_MSG_DEBUG("Scanning for input data objects");
948 // Add the list of branches of the main tree
949 fullListOfBranches.push_back(m_inTree->GetListOfBranches());
950 // If the input tree has friend trees
951 // add as well the list of friend tree branches
952 if (m_inTree->GetListOfFriends()) {
953 // Get the list of friends
954 TList* fList = m_inTree->GetListOfFriends();
955 // Loop over friend elements
956 for (TObject* feObj : *fList) {
957 if (feObj) {
958 // Get corresponding friend tree
959 auto* pElement = dynamic_cast<TFriendElement* >(feObj);
960 if (pElement == nullptr) {
961 continue;
962 }
963 TTree* friendTree = pElement->GetTree();
964 // Add list of branches of the friend tree
965 fullListOfBranches.push_back(friendTree->GetListOfBranches());
966 }
967 }
968 }
969 }
970 }
971
972 // Loop over all list of branches (if any)
973 for (const TObjArray* in : fullListOfBranches) {
974 // Loop over all branches inside the current list of branches
975 for (const TObject* obj : *in) {
976
977 if (obj == nullptr) {
978 continue;
979 }
980 const TBranch* element = dynamic_cast<const TBranch* >(obj);
981 if (!element) {
982 ATH_MSG_ERROR("Failure inspecting input data objects");
983 return StatusCode::FAILURE;
984 }
985 const std::string objClassName = element->GetClassName();
986 std::string key = obj->GetName();
987 ATH_MSG_VERBOSE("Inspecting \"" << objClassName << "\" / \"" << key
988 << "\"");
989 if (objClassName == targetClassName) {
990 ATH_MSG_DEBUG("Matched \"" << targetClassName << "\" to key \"" << key
991 << "\"");
992 keys.insert(std::move(key));
993 }
994 }
995 }
996
998
999 ATH_MSG_DEBUG("Scanning input objects for \"" << targetClassName << "\"");
1000 for (const auto &[key, vmgr] : inAux) {
1001 // All (metadata) objects should be held by TObjectManager objects.
1002 const TObjectManager* mgr =
1003 dynamic_cast<const TObjectManager* >(vmgr.get());
1004 if (mgr == nullptr) {
1005 continue;
1006 }
1007 const std::string &objClassName = mgr->holder()->getClass()->GetName();
1008 ATH_MSG_VERBOSE("Inspecting \"" << objClassName << "\" / \"" << key
1009 << "\"");
1010 if (objClassName == targetClassName) {
1011 ATH_MSG_DEBUG("Matched \"" << targetClassName << "\" to key \"" << key
1012 << "\"");
1013 keys.insert(key);
1014 }
1015 }
1016
1017 // Check for output objects.
1018 if ((metadata == false) && m_outTree) {
1019 const TObjArray* out = m_outTree->GetListOfBranches();
1020 ATH_MSG_DEBUG("Scanning for output data objects");
1021
1022 for (const TObject* obj : *out) {
1023 if (obj == nullptr) {
1024 continue;
1025 }
1026 const TBranch* element = dynamic_cast<const TBranch* >(obj);
1027 if (element == nullptr) {
1028 ATH_MSG_ERROR("Failure inspecting output objects");
1029 return StatusCode::FAILURE;
1030 }
1031 const std::string objClassName = element->GetClassName();
1032 std::string key = obj->GetName();
1033 ATH_MSG_VERBOSE("Inspecting \"" << objClassName << "\" / \"" << key
1034 << "\"");
1035 if (objClassName == targetClassName) {
1036 ATH_MSG_DEBUG("Matched \"" << targetClassName << "\" to key \"" << key
1037 << "\"");
1038 keys.insert(std::move(key));
1039 }
1040 }
1041 }
1042
1044
1045 // Search though the in-memory output objects.
1046 ATH_MSG_DEBUG("Scanning output objects for \"" << targetClassName << "\"");
1047 for (const auto &[key, vmgr] : outAux) {
1048 // All (metadata) objects should be held by TObjectManager objects.
1049 TObjectManager* mgr = dynamic_cast<TObjectManager* >(vmgr.get());
1050 if (mgr == nullptr) {
1051 continue;
1052 }
1053 const std::string &objClassName = mgr->holder()->getClass()->GetName();
1054 ATH_MSG_VERBOSE("Inspecting \"" << objClassName << "\" / \"" << key
1055 << "\"");
1056 if (objClassName == targetClassName) {
1057 ATH_MSG_DEBUG("Matched \"" << targetClassName << "\" to key \"" << key
1058 << "\"");
1059 keys.insert(key);
1060 }
1061 }
1062
1063 vkeys.insert(vkeys.end(), keys.begin(), keys.end());
1064
1065 // Return gracefully.
1066 return StatusCode::SUCCESS;
1067}

◆ 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 221 of file EventIO.cxx.

222 {
223
224 // Select which object container to use:
226
227 // Check if the object can be found:
228 auto itr = objects.find(key);
229 if (itr == objects.end()) {
230 // Do the following only for event data:
231 if (!metadata) {
232 // It's not in the event. Let's check if we find it in an active
233 // TStore object...
234 TStore* store = TActiveStore::store();
235 if ((!store) || (!store->contains(key, ti)) || store->isConst(key, ti)) {
236 // Nope, not there either...
237 return nullptr;
238 }
239 // Let's return the object from the TStore:
240 void* result = store->getObject(key, ti);
241 return result;
242 } else {
243 // For metadata we don't use external resources.
244 return nullptr;
245 }
246 }
247
248 // If the object is not set in this event yet, we can't continue:
249 if (itr->second->isSet() == false) {
250 return nullptr;
251 }
252
253 // If it does exist, check if it's the right kind of object:
254 Details::IObjectManager* mgr =
255 dynamic_cast<Details::IObjectManager*>(itr->second.get());
256 if (mgr == nullptr) {
257 ATH_MSG_ERROR("Object of wrong type found for key \"" << key << "\"");
258 return nullptr;
259 }
260
261 // Ask the holder object for the object of this type:
262 void* result = mgr->holder()->getAs(ti);
263 if (result == nullptr) {
264 ATH_MSG_WARNING("Couldn't retrieve object as \""
265 << SG::normalizedTypeinfoName(ti) << "\"");
266 return nullptr;
267 }
268
269 // Return the object:
270 return result;
271}

◆ 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::TEvent::hasInput ( ) const
overrideprotectedvirtual

Check if an input file is connected to the object.

Implements xAOD::Event.

Definition at line 922 of file Control/xAODRootAccess/Root/TEvent.cxx.

922 {
923
924 return ((m_inTree != nullptr) || (m_inChain != nullptr));
925}

◆ hasOutput()

bool xAOD::TEvent::hasOutput ( ) const
overrideprotectedvirtual

Check if an output file is connected to the object.

Implements xAOD::Event.

Definition at line 927 of file Control/xAODRootAccess/Root/TEvent.cxx.

927{ return (m_outTree.get() != nullptr); }

◆ 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::TEvent::initStats ( )
protected

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 tyoes

Definition at line 1837 of file Control/xAODRootAccess/Root/TEvent.cxx.

1837 {
1838
1839 // If we're dealing with an empty input file, stop here:
1840 if (m_inTreeMissing) {
1841 return StatusCode::SUCCESS;
1842 }
1843
1844 // A little sanity check:
1845 if (!m_inTree) {
1846 ATH_MSG_ERROR("Function called on an uninitialised object");
1847 return StatusCode::FAILURE;
1848 }
1849
1850 // Reset the number of input branches information:
1852
1853 // Loop over the EventFormat information
1856 for (; itr != end; ++itr) {
1857
1858 // Get the name of the branch in question:
1859 const std::string &branchName = itr->second.branchName();
1860
1861 // If it's an auxiliary container, scan it using TAuxStore:
1862 if (branchName.find("Aux.") != std::string::npos) {
1863
1864 // But first decide whether it describes a container, or just
1865 // a single object. Since the file may have been written in
1866 // kBranchAccess mode, it's not necessarily a good idea to check
1867 // the type of the auxiliary class. So let's check the interface
1868 // class instead.
1869 //
1870 // Get the name of the interface object/container:
1871 const std::string intName = branchName.substr(0, branchName.size() - 4);
1872 if (!m_inputEventFormat.exists(intName)) {
1873 // When this happens, it may still be that both the interface and
1874 // the auxiliary container is missing from the file. As we didn't
1875 // check yet whether the auxiliary container is in place or not.
1876 // So, before printing a warning, let's check for this.
1877 // Unfortunately the check is pretty expensive, but this should
1878 // not be performance critical code after all...
1879 ::Bool_t auxFound = kFALSE;
1880 const std::string dynName = Utils::dynBranchPrefix(branchName);
1881
1882 std::vector<TObjArray* > fullListOfBranches = {};
1883 // Add the list of branches of the main tree
1884 fullListOfBranches.push_back(m_inTree->GetListOfBranches());
1885 // If input tree has friend trees
1886 // add as well the list of friend tree branches
1887 if (m_inTree->GetListOfFriends()) {
1888 // Get the list of friends
1889 TList* fList = m_inTree->GetListOfFriends();
1890 // Loop over friend elements
1891 for (TObject* feObj : *fList) {
1892 if (feObj) {
1893 // Get corresponding friend tree
1894 auto* pElement = dynamic_cast<TFriendElement* >(feObj);
1895 if (not pElement)
1896 continue;
1897 TTree* friendTree = pElement->GetTree();
1898 // Add list of branches of the friend tree
1899 fullListOfBranches.push_back(friendTree->GetListOfBranches());
1900 }
1901 }
1902 }
1903
1904 for (TObjArray* branches : fullListOfBranches) {
1905 for (Int_t i = 0; i < branches->GetEntriesFast(); ++i) {
1906 if (!branches->At(i))
1907 continue;
1908
1909 const TString name(branches->At(i)->GetName());
1910 if (name.BeginsWith(branchName) || name.BeginsWith(dynName)) {
1911 auxFound = kTRUE;
1912 break;
1913 }
1914 }
1915 }
1916 if (auxFound) {
1917 ATH_MSG_WARNING("Couldn't find interface object/container \""
1918 << intName << "\" belonging to branch \""
1919 << branchName << "\"");
1920 }
1921 continue;
1922 }
1923
1924 // Get the type of the interface:
1925 const EventFormatElement* el = m_inputEventFormat.get(intName);
1926 ::TClass* cl = ::TClass::GetClass(el->className().c_str());
1927 if ((!cl) || (!cl->IsLoaded())) {
1928 ATH_MSG_WARNING("Couldn't find dictionary for type \""
1929 << el->className() << "\"");
1930 continue;
1931 }
1932
1933 // Get the dictionary for the DataVector base class:
1934 static const std::type_info &baseTi = typeid(SG::AuxVectorBase);
1935 static const std::string baseName = SG::normalizedTypeinfoName(baseTi);
1936 static ::TClass* const baseCl = ::TClass::GetClass(baseName.c_str());
1937 if (!baseCl) {
1938 ATH_MSG_ERROR("Couldn't get dictionary for type \"" << baseName
1939 << "\"");
1940 return StatusCode::FAILURE;
1941 }
1942
1943 // The type of the auxiliary store is finally deduced from the
1944 // inheritance of the interface container.
1946 (cl->InheritsFrom(baseCl) ? TAuxStore::EStructMode::kContainerStore
1948
1949 // Scan the branches using a temporary TAuxStore instance:
1950 static constexpr bool TOP_STORE = true;
1951 TAuxStore temp(this->currentContext(), branchName, TOP_STORE, mode);
1952 static constexpr bool PRINT_WARNINGS = false;
1953 ATH_CHECK(temp.readFrom(*m_inTree, PRINT_WARNINGS));
1954
1955 // Conveninence variable:
1956 ReadStats &stats = IOStats::instance().stats();
1957
1958 // Teach the cache about all the branches:
1959 for (SG::auxid_t id : temp.getAuxIDs()) {
1960 stats.branch(branchName, id);
1961 }
1962
1963 // Increment the number of known branches:
1964 stats.setBranchNum(stats.branchNum() + temp.getAuxIDs().size());
1965 }
1966 // If it's an interface container:
1967 else {
1968 // Try to access the branch:
1969 const ::TBranch* container = m_inTree->GetBranch(branchName.c_str());
1970 // If it exists, let's remember it:
1971 if (container) {
1972 IOStats::instance().stats().container(branchName);
1973 }
1974 }
1975 }
1976
1977 // Return gracefully:
1978 return StatusCode::SUCCESS;
1979}
KeyedData_t::const_iterator const_iterator
Iterator for looping over the elements of the object.
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
const SG::AuxVectorData * container() const
Return the container holding this element.
size_t auxid_t
Identifier for a particular aux data item.
Definition AuxTypes.h:27
std::string dynBranchPrefix(const std::string &key)
This function is used to figure out what to name dynamic auxiliary branches coming from a container c...

◆ inputEventFormat()

const EventFormat * Event::inputEventFormat ( ) const
inherited

Get information about the input objects.

Definition at line 235 of file EventCore.cxx.

235 {
236
237 if (hasInput()) {
238 return &m_inputEventFormat;
239 }
240 return nullptr;
241}

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

◆ MakeTransientTree()

friend::TTree * xAOD::TEvent::MakeTransientTree ( TEvent & ,
const char *  )
private

◆ 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 243 of file EventCore.cxx.

243 {
244
245 return m_outputEventFormat;
246}

◆ 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 305 of file EventCore.cxx.

305 {
306
307 // Simply do this via the xAODCore code:
308 IOStats::instance().stats().Print("Summary");
309}
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 208 of file EventCore.cxx.

208 {
209
210 // Print a header.
211 ATH_MSG_INFO("Name remapping rules:");
212
213 // In case no remapping rules have been set.
214 if (m_nameRemapping.empty()) {
215 ATH_MSG_INFO(" NONE");
216 return;
217 }
218
219 // Otherwise.
220 for (const auto& [newName, onfile] : m_nameRemapping) {
221 ATH_MSG_INFO(" \"" << newName << "\" -> \"" << onfile << "\"");
222 }
223}
#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 230 of file EventCore.cxx.

230 {
231
233}

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

◆ putAux()

StatusCode xAOD::TEvent::putAux ( ::TTree & outTree,
TVirtualManager & vmgr,
bool metadata )
protected

Function saving the dynamically created auxiliary properties.

This function is used internally to set up the writing of the auxiliary store variables that were dynamically created on an object.

(And not statically defined to be part of that object.)

Parameters
outTreeThe TTree to put the auxiliary branches into
mgrThe object manager of the output object
metadataFlag specifying whether the info written is metadata or not
Returns
The usual StatusCode types

Definition at line 2164 of file Control/xAODRootAccess/Root/TEvent.cxx.

2165 {
2166
2167 // A little sanity check:
2168 assert(m_outputEventFormat != 0);
2169
2170 // Do the conversion:
2171 TObjectManager* mgr = dynamic_cast<TObjectManager* >(&vmgr);
2172 if (!mgr) {
2173 // It's not an error any more when we don't get a TObjectManager.
2174 return StatusCode::SUCCESS;
2175 }
2176
2177 // Check if we need to do anything here:
2178 if (!mgr->holder()->getClass()->InheritsFrom("SG::IAuxStoreIO")) {
2179 return StatusCode::SUCCESS;
2180 }
2181
2182 // Get a pointer to the auxiliary store I/O interface:
2183 SG::IAuxStoreIO* aux = reinterpret_cast<SG::IAuxStoreIO* >(
2184 mgr->holder()->getAs(typeid(SG::IAuxStoreIO)));
2185 if (!aux) {
2186 ATH_MSG_FATAL("There is a logic error in the code!");
2187 return StatusCode::FAILURE;
2188 }
2189
2190 // Check if we have rules defined for which auxiliary properties
2191 // to write out:
2192 xAOD::AuxSelection sel;
2193 if (!metadata) {
2194 auto item_itr = m_auxItemList.find(mgr->branch()->GetName());
2195 if (item_itr != m_auxItemList.end()) {
2196 sel.selectAux(item_itr->second);
2197 }
2198 }
2199
2200 // Get the dynamic auxiliary variables held by this object, which
2201 // were selected to be written:
2202 const SG::auxid_set_t auxids =
2203 sel.getSelectedAuxIDs(aux->getSelectedAuxIDs());
2204
2205 // If there are no dynamic auxiliary variables in the object, return
2206 // right away:
2207 if (auxids.empty()) {
2208 return StatusCode::SUCCESS;
2209 }
2210
2211 // Decide what should be the prefix of all the dynamic branches:
2212 const std::string dynNamePrefix =
2213 Utils::dynBranchPrefix(mgr->branch()->GetName());
2214
2215 // Select which container to add the variables to:
2217
2218 // This iteration will determine the ordering of branches within
2219 // the tree, so sort auxids by name.
2220 const SG::AuxTypeRegistry &r = SG::AuxTypeRegistry::instance();
2221 typedef std::pair<std::string, SG::auxid_t> AuxVarSort_t;
2222 std::vector<AuxVarSort_t> varsort;
2223 varsort.reserve(auxids.size());
2224 for (SG::auxid_t id : auxids) {
2225 varsort.emplace_back(r.getName(id), id);
2226 }
2227 std::sort(varsort.begin(), varsort.end());
2228
2229 // Extract all the dynamic variables from the object:
2230 for (const auto &p : varsort) {
2231
2232 // The auxiliary ID:
2233 const SG::auxid_t id = p.second;
2234
2235 // Construct a name for the branch that we will write:
2236 const std::string brName = dynNamePrefix + p.first;
2237
2238 // Try to find the branch:
2239 Object_t::iterator bmgr = objects.find(brName);
2240
2241 // Check if we already know about this variable:
2242 if (bmgr == objects.end()) {
2243
2244 // Construct the full type name of the variable:
2245 const std::type_info* brType = aux->getIOType(id);
2246 if (!brType) {
2247 ATH_MSG_ERROR("No I/O type found for variable " << brName);
2248 return StatusCode::FAILURE;
2249 }
2250 const std::string brTypeName = Utils::getTypeName(*brType);
2251 std::string brProperTypeName = "<unknown>";
2252
2253 // The branch that will hopefully be created:
2254 ::TBranch* br = 0;
2255
2256 // Check if it's a primitive type or not:
2257 if (strlen(brType->name()) == 1) {
2258
2259 // Making the "proper" type name is simple in this case:
2260 brProperTypeName = brTypeName;
2261
2262 // Get the character describing this type for ROOT:
2263 const char rootType = Utils::rootType(brType->name()[0]);
2264 if (rootType == '\0') {
2265 ATH_MSG_ERROR("Type not known for variable \""
2266 << brName << "\" of type \"" << brTypeName << "\"");
2267 return StatusCode::FAILURE;
2268 }
2269
2270 // Create the full description of the variable for ROOT:
2271 std::ostringstream leaflist;
2272 leaflist << brName << "/" << rootType;
2273
2274 // Let's create a holder for this property:
2275 static constexpr bool IS_OWNER = false;
2276 auto auxmgr = std::make_unique<TPrimitiveAuxBranchManager>(
2277 id, nullptr, new THolder(aux->getIOData(id), nullptr, IS_OWNER));
2278
2279 // ... and let's add it to the output TTree:
2280 static constexpr Int_t BASKET_SIZE = 32000;
2281 *(auxmgr->branchPtr()) =
2282 outTree.Branch(brName.c_str(), auxmgr->holder()->get(),
2283 leaflist.str().c_str(), BASKET_SIZE);
2284 if (!auxmgr->branch()) {
2285 ATH_MSG_ERROR("Failed to create branch \""
2286 << brName << "\" out of type \"" << brProperTypeName
2287 << "\"");
2288 // Clean up:
2289 *(auxmgr->holder()->getPtr()) = 0;
2290 return StatusCode::FAILURE;
2291 }
2292 br = auxmgr->branch();
2293
2294 // Store it in the output list.
2295 objects[brName] = std::move(auxmgr);
2296
2297 } else {
2298
2299 // Check if we have a dictionary for this type:
2300 static constexpr Bool_t LOAD_IF_NOT_FOUND = kTRUE;
2301 static constexpr Bool_t SILENT = kTRUE;
2302 TClass* cl = TClass::GetClass(*brType, LOAD_IF_NOT_FOUND, SILENT);
2303 if (cl == nullptr) {
2304 // The dictionary needs to be loaded now. This could be an
2305 // issue. But let's hope for the best...
2306 cl = TClass::GetClass(brTypeName.c_str());
2307 // If still not found...
2308 if (cl == nullptr) {
2309 ATH_MSG_ERROR("Dictionary not available for variable \""
2310 << brName << "\" of type \"" << brTypeName << "\"");
2311 return StatusCode::FAILURE;
2312 }
2313 }
2314
2315 // The proper type name comes from the dictionary in this case:
2316 brProperTypeName = cl->GetName();
2317
2318 // Let's create a holder for this property:
2319 static constexpr bool IS_OWNER = false;
2320 auto auxmgr = std::make_unique<TAuxBranchManager>(
2321 id, nullptr, new THolder(aux->getIOData(id), cl, IS_OWNER));
2322
2323 // ... and let's add it to the output TTree.
2324 static constexpr Int_t BASKET_SIZE = 32000;
2325 static constexpr Int_t SPLIT_LEVEL = 0;
2326 *(auxmgr->branchPtr()) = outTree.Branch(brName.c_str(), cl->GetName(),
2327 auxmgr->holder()->getPtr(),
2328 BASKET_SIZE, SPLIT_LEVEL);
2329 if (!auxmgr->branch()) {
2330 ATH_MSG_ERROR("Failed to create branch \""
2331 << brName << "\" out of type \"" << brProperTypeName
2332 << "\"");
2333 // Clean up:
2334 *(auxmgr->holder()->getPtr()) = 0;
2335 return StatusCode::FAILURE;
2336 }
2337 br = auxmgr->branch();
2338
2339 // Store it in the output list.
2340 objects[brName] = std::move(auxmgr);
2341 }
2342
2343 // If this is not the first event, fill up the already filled
2344 // events with (empty) content:
2345 if (outTree.GetEntries()) {
2346 void* ptr = br->GetAddress();
2347 br->SetAddress(0);
2348 for (::Long64_t i = 0; i < outTree.GetEntries(); ++i) {
2349 br->Fill();
2350 }
2351 br->SetAddress(ptr);
2352 }
2353
2354 // If all went fine, let's add this branch to the event format
2355 // metadata:
2356 if (!m_outputEventFormat->exists(brName)) {
2357 m_outputEventFormat->add(EventFormatElement(brName, brProperTypeName,
2358 mgr->branch()->GetName(),
2359 getHash(brName)));
2360 }
2361
2362 // We don't need to do the rest:
2363 continue;
2364 }
2365
2366 // Access the object manager:
2367 bmgr = objects.find(brName);
2368 if (bmgr == objects.end()) {
2369 ATH_MSG_FATAL("There is an internal logic error in the code...");
2370 return StatusCode::FAILURE;
2371 }
2372
2373 // Replace the managed object:
2374 void* nc_data ATLAS_THREAD_SAFE = // we hold non-const pointers but check
2375 // on retrieve
2376 const_cast<void* >(static_cast<const void* >(aux->getIOData(id)));
2377 bmgr->second->setObject(nc_data);
2378 }
2379
2380 // Return gracefully:
2381 return StatusCode::SUCCESS;
2382}
std::atomic_flag m_initialized ATLAS_THREAD_SAFE
Messaging initialized (initMessaging).
static AuxTypeRegistry & instance()
Return the singleton registry instance.
virtual SG::auxid_set_t getSelectedAuxIDs() const
Get a list of dynamic variables that need to be written out.
Definition IAuxStoreIO.h:86
virtual const std::type_info * getIOType(SG::auxid_t auxid) const =0
Return the type of the data to be stored for one aux data item.
virtual const void * getIOData(SG::auxid_t auxid) const =0
Return a pointer to the data to be stored for one aux data item.
std::unordered_map< std::string, std::set< std::string > > m_auxItemList
Rules for selecting which auxiliary branches to write.
Definition Event.h:360
int r
Definition globals.cxx:22
void sort(typename DataModel_detail::iterator< DVL > beg, typename DataModel_detail::iterator< DVL > end)
Specialization of sort for DataVector/List.
char rootType(char typeidType)
This function is used internally in the code when creating primitive dynamic auxiliary branches.
std::string getTypeName(const std::type_info &ti)
This function is necessary in order to create type names that ROOT can understand.

◆ readFrom() [1/4]

virtual StatusCode xAOD::Event::readFrom ( TFile & inFile)
pure virtualinherited

Read from a new file - only needed for the second+ files.

Implemented in xAOD::Experimental::REvent.

◆ readFrom() [2/4]

StatusCode xAOD::TEvent::readFrom ( ::TFile & inFile)
override

Set up the reading of an input file from TFile This method implements the interface from Event.

◆ readFrom() [3/4]

StatusCode xAOD::TEvent::readFrom ( ::TFile * file,
bool useTreeCache = true,
std::string_view treeName = EVENT_TREE_NAME )

This is the 'native' interface for reading from a TFile, allowing the specification of TTree cache use and the event tree name.

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
filePointer to the file being read
useTreeCacheFlag for turning on/off the usage of TTreeCache
treeNameName of the input tree
Returns
The usual StatusCode tyoes

Definition at line 126 of file Control/xAODRootAccess/Root/TEvent.cxx.

127 {
128
129 // If no file was specified, return gracefully.
130 if (file == nullptr) {
131 ATH_MSG_DEBUG("No input file specified for readFrom(...)");
132 return StatusCode::SUCCESS;
133 }
134
135 // Clear the cached input objects.
136 m_inputObjects.clear();
137 m_inputMissingObjects.clear();
138 m_inputMetaObjects.clear();
139 {
141 lock.upgrade();
142 m_branches.clear();
143 }
144
145 // Reset the internal flags.
146 m_inTreeMissing = kFALSE;
147 m_entry = -1;
148
149 // Make sure we return to the current directory:
150 TDirectoryReset dr;
151
152 // Set up the file access tracer.
154
155 // Look for the metadata tree:
157 if (m_inMetaTree == nullptr) {
158 ATH_MSG_ERROR("Couldn't find metadata tree on input. Object is unusable!");
159 return StatusCode::FAILURE;
160 }
161
162 // Set metadata entry to be read
163 // NB: no reading is done calling LoadTree
164 if (m_inMetaTree->LoadTree(0) < 0) {
165 ATH_MSG_ERROR("Failed to load entry 0 for metadata tree");
166 return StatusCode::FAILURE;
167 }
168
169 // A sanity check.
170 if (m_inMetaTree->GetEntries() != 1) {
171 ATH_MSG_WARNING("Was expecting a metadata tree with size 1, instead of "
172 << m_inMetaTree->GetEntries() << ".");
173 ATH_MSG_WARNING("The input file was most probably produced by hadd...");
174 }
175
176 // Make sure that the xAOD::EventFormat dictonary is loaded.
177 // This may not be the case if streamer information reading is turned
178 // off.
179 static const std::string eventFormatTypeName =
181 ::TClass* cl = ::TClass::GetClass(eventFormatTypeName.c_str());
182 if (cl == nullptr) {
183 ATH_MSG_WARNING("Couldn't load the xAOD::EventFormat dictionary");
184 }
185
186 // Helper lambda for collecting the event format metadata from an RNTuple
187 // with a given name.
188 auto readEventFormatMetadata =
189 [&](std::string_view thisTreeName) -> StatusCode {
190 // Look for the metadata tree:
191 TTree* metaTree = file->Get<TTree>(thisTreeName.data());
192 if (metaTree == nullptr) {
193 ATH_MSG_ERROR("Couldn't find metadata tree \"" << thisTreeName
194 << "\"on input.");
195 return StatusCode::FAILURE;
196 }
197 // Set metadata entry to be read.
198 if (metaTree->LoadTree(0) < 0) {
199 ATH_MSG_ERROR("Failed to load entry 0 for metadata tree \""
200 << thisTreeName << "\"");
201 return StatusCode::FAILURE;
202 }
203
204 // Check if the EventFormat branch is available:
205 const std::string eventFormatBranchName =
207 if (!metaTree->GetBranch(eventFormatBranchName.c_str())) {
208 // This can happen when the file was produced by an Athena job that
209 // didn't have any input events itself. This means that the file
210 // doesn't actually have any useful metadata.
211 ATH_MSG_INFO("Input file provides no event or metadata");
212 return StatusCode::RECOVERABLE;
213 }
214
215 // Read in the event format object:
216 EventFormat* format = 0;
217 ::TBranch* br = 0;
218 const Int_t status =
219 metaTree->SetBranchAddress(eventFormatBranchName.c_str(), &format, &br);
220 if (status < 0) {
221 ATH_MSG_ERROR("Failed to connect to xAOD::EventFormat object");
222 return StatusCode::FAILURE;
223 }
224
225 // Merge the object into our private member.
226 br->GetEntry(0);
227 for (const auto &[key, element] : *format) {
228 m_inputEventFormat.add(element);
229 }
230
231 // This is a strange place. The object has to be deleted, as it is the
232 // responsibility of the user code to do so. But if I also explicitly
233 // tell the branch to forget about the address of the pointer, then
234 // all hell breaks loose...
235 delete format;
236
237 // Return gracefully.
238 return StatusCode::SUCCESS;
239 };
240
241 // Read in the metadata from the "main" metadata ntuple.
243 const StatusCode sc = readEventFormatMetadata(METADATA_OBJECT_NAME);
244 if (sc.isRecoverable()) {
245 m_inTree = nullptr;
246 m_inTreeMissing = true;
247 return StatusCode::SUCCESS;
248 }
249 ATH_CHECK(sc);
250
251 // List all the other Metadata trees in the input file
252 // Having several metatrees can happen for augmented files for instance
253 // as one metadata tree per stream is produced
254 std::set<std::string> lOtherMetaTreeNames = {};
255 TList* lKeys = file->GetListOfKeys();
256
257 if (lKeys) {
258 for (int iKey = 0; iKey < lKeys->GetEntries(); iKey++) {
259 // iterate over keys and add
260 std::string keyName = lKeys->At(iKey)->GetName();
261 // Make sure the key corresponds to a metadata tree but
262 // do not add the current metadata tree in the list of other trees
263 // and do not add the metadata tree handlers to the list
264 if ((keyName != METADATA_OBJECT_NAME) &&
265 std::regex_match(keyName, m_otherMetaDataTreeNamePattern)) {
266 // Make sure key corresponds to a tree
267 const char* className = ((::TKey* )lKeys->At(iKey))->GetClassName();
268 static constexpr Bool_t LOAD = kFALSE;
269 static constexpr Bool_t SILENT = kTRUE;
270 ::TClass* cl = ::TClass::GetClass(className, LOAD, SILENT);
271 if ((cl != nullptr) && cl->InheritsFrom(::TTree::Class())) {
272 // key is corresponding to a metadata tree
273 lOtherMetaTreeNames.insert(std::move(keyName));
274 }
275 }
276 }
277 }
278
279 // Loop over the other metadata trees found (if any).
280 for (const std::string &metaTreeName : lOtherMetaTreeNames) {
281 ATH_CHECK(readEventFormatMetadata(metaTreeName));
282 }
283
284 // Look for the event tree in the input file.
285 m_inTree = file->Get<TTree>(treeName.data());
286 if (m_inTree == nullptr) {
287 // This is no longer an error condition. As it can happen for DxAODs
288 // that don't have any events in them. But they still have metadata
289 // that needs to be collected.
290 m_inTreeMissing = kTRUE;
291 }
292
293 // Turn on the cache if requested.
294 if (m_inTree && useTreeCache && (!m_inTree->GetCacheSize())) {
295 m_inTree->SetCacheSize(CACHE_SIZE);
296 m_inTree->SetCacheLearnEntries(10);
297 }
298
299 // Init the statistics collection.
301 // Update the event counter in the statistics object.
302 xAOD::ReadStats &stats = IOStats::instance().stats();
303 if (m_inTree) {
304 stats.setNEvents(stats.nEvents() + m_inTree->GetEntries());
305 }
306
307 // Notify the listeners that a new file was opened.
308 const TIncident beginIncident(IncidentType::BeginInputFile);
309 for (TVirtualIncidentListener* listener : m_listeners) {
310 listener->handle(beginIncident);
311 }
312 // For now implement a very simple scheme in which we claim already
313 // at the start that the entire file was processed. Since we have no way
314 // of ensuring that the user indeed does this. And we can't delay calling
315 // this function, as the user may likely close his/her output file before
316 // closing the last opened input file.
317 const TIncident endIncident(IncidentType::EndInputFile);
318 for (TVirtualIncidentListener* listener : m_listeners) {
319 listener->handle(endIncident);
320 }
321
322 // The initialisation was successful.
323 return StatusCode::SUCCESS;
324}
StatusCode initStats()
Function to initialise the statistics for all Tree content.
void add(std::string_view fileName)
Add information about a new file that got accessed.
static TFileAccessTracer & instance()
Access the singleton instance of this class.
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 getFirstBranchMatch(TTree *tree, const std::string &pre)
This function is used to search for a branch in a TTree that contains a given substring.
static const ::Int_t CACHE_SIZE
Size of a possible TTreeCache.

◆ readFrom() [4/4]

StatusCode xAOD::TEvent::readFrom ( ::TTree * tree,
bool useTreeCache = true )

Connect the object to a new input tree/chain.

This version of the function sets up the object to read information from a tree/chain.

Using it with a TTree pointer makes not much sense, but using it with a TChain pointer could be a very valid usage mode.

Parameters
treeThe pointer to a TTree or a TChain
useTreeCacheFlag for switching TTreeCache usage on/off
Returns
The usual StatusCode tyoes

Definition at line 334 of file Control/xAODRootAccess/Root/TEvent.cxx.

334 {
335
336 // Remember the info:
337 m_inTree = nullptr;
338 m_inTreeMissing = false;
339 m_inChain = dynamic_cast<TChain* >(tree);
340 m_inMetaTree = nullptr;
341
342 if (m_inChain) {
343
344 // Set up the caching on the chain level. The individual trees of the
345 // input files will get a cache set up automatically after this.
346 if (useTreeCache && (!m_inChain->GetCacheSize())) {
347 m_inChain->SetCacheSize(CACHE_SIZE);
348 m_inChain->SetCacheLearnEntries(10);
349 }
350
351 // Explicitly open the first file of the chain. To correctly auto-load
352 // the dictionaries necessary. This doesn't happen automatically with
353 // some ROOT versions...
354 const TObjArray* files = m_inChain->GetListOfFiles();
355 if (!files) {
356 ATH_MSG_ERROR("Couldn't get the list of files from the input TChain");
357 return StatusCode::FAILURE;
358 }
359 if (!files->GetEntries()) {
360 ATH_MSG_ERROR("No files are present in the received TChain");
361 return StatusCode::FAILURE;
362 }
363 const ::TChainElement* chEl =
364 dynamic_cast<const ::TChainElement* >(files->At(0));
365 if (!chEl) {
366 ATH_MSG_ERROR("Couldn't cast object to TChainElement");
367 return StatusCode::FAILURE;
368 }
369 {
370 std::unique_ptr<TFile> dummyFile{TFile::Open(chEl->GetTitle())};
371 if (!dummyFile) {
372 ATH_MSG_ERROR("Couldn't open file " << chEl->GetTitle());
373 return StatusCode::FAILURE;
374 }
375 }
376
377 // Set up a tracker for the chain.
378 if (!m_inChainTracker) {
379 m_inChainTracker = std::make_unique<TChainStateTracker>();
380 }
381 m_inChainTracker->reset();
382 tree->SetNotify(m_inChainTracker.get());
383
384 // Stop at this point. The first file will be opened when the user
385 // asks for the first event. Otherwise we open the first file of the
386 // chain multiple times.
387 m_inTreeNumber = -1;
388 return StatusCode::SUCCESS;
389
390 } else {
391
392 // If it's a simple TTree, then let's fully initialise the object
393 // using its file:
394 m_inTreeNumber = -1;
395 if (m_inChainTracker) {
396 m_inChainTracker.reset();
397 }
398 ::TFile* file = tree->GetCurrentFile();
399 return readFrom(file, useTreeCache, tree->GetName());
400 }
401}
std::vector< std::string > files
file names and file pointers
Definition hcg.cxx:52

◆ record() [1/4]

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

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

◆ record() [2/4]

StatusCode xAOD::TEvent::record ( std::unique_ptr< TAuxStore > store,
const std::string & key )
protected

Internal function for adding an auxiliary store object to the output.

This function is used internally when copying an object with its auxiliary store from the input file, and branch access mode is activated for the event object.

The assumption is that the store object already knows what prefix it should be using. The key parameter only specifies under what ID the object should be handled in the output object list.

Parameters
storeThe store object to connect to the output
keyThe "key" with which to record the object
Returns
The usual StatusCode tyoes

Definition at line 1993 of file Control/xAODRootAccess/Root/TEvent.cxx.

1994 {
1995
1996 // Check if we have an output tree:
1997 if (!m_outTree) {
1999 "No output tree defined. Did you forget to call writeTo(...)?");
2000 return StatusCode::FAILURE;
2001 }
2002
2003 // Check if we have a filtering rule for this key:
2004 const std::set<std::string>* filter = 0;
2005 auto filter_itr = m_auxItemList.find(key);
2006 if (filter_itr != m_auxItemList.end()) {
2007 filter = &(filter_itr->second);
2008 }
2009
2010 // Check if we need to add it to the event record:
2011 Object_t::iterator vitr = m_outputObjects.find(key);
2012 if (vitr == m_outputObjects.end()) {
2013
2014 // Configure the object for variable filtering:
2015 if (filter) {
2016 store->selectAux(*filter);
2017 }
2018 // Tell the object where to write its contents:
2019 ATH_CHECK(store->writeTo(*m_outTree));
2020 // Record it to the output list:
2021 static constexpr bool OWNS_STORE = true;
2023 std::make_unique<TAuxManager>(store.release(), OWNS_STORE);
2024
2025 // We're done:
2026 return StatusCode::SUCCESS;
2027 }
2028
2029 // Check if the output has the right store:
2030 if (vitr->second->object() == store.get()) {
2031 // We're done already:
2032 return StatusCode::SUCCESS;
2033 }
2034
2035 // If not, update the output manager. This can happen when we copy
2036 // objects from the input to the output files, and we process
2037 // multiple input files.
2038
2039 // Check if the output manager is of the right type:
2040 TAuxManager* mgr = dynamic_cast<TAuxManager* >(vitr->second.get());
2041 if (mgr == nullptr) {
2042 ATH_MSG_ERROR("Output object with key \""
2043 << key << "\" already exists, and is not of type TAuxStore");
2044 return StatusCode::FAILURE;
2045 }
2046
2047 // Configure the object for variable filtering:
2048 if (filter) {
2049 store->selectAux(*filter);
2050 }
2051
2052 // Connect the auxiliary store to the output tree:
2053 ATH_CHECK(store->writeTo(*m_outTree));
2054
2055 // Update the manager:
2056 mgr->setObject(store.release());
2057
2058 // Return gracefully:
2059 return StatusCode::SUCCESS;
2060}

◆ record() [3/4]

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

Add an output object to the event.

◆ record() [4/4]

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

Record an object into a connected output file.

This is the function doing the heavy lifting when recording a new object into the output tree/file.

It makes sure that the object is saved together with all of its dynamic auxiliary data if it has any.

Parameters
objA typeless pointer to the object that we want to record
typeNameThe type name of the output object
keyThe key (branch name) of the object to record
overwriteFlag selecting if it is allowed to overwrite an already existing object (used internally)
metadataFlag selecting if we are writing an event or a metadata object
isOwnerFlag selecting if we should take ownership of the object or not
Returns
The usual StatusCode tyoes

Implements xAOD::Event.

Definition at line 1667 of file Control/xAODRootAccess/Root/TEvent.cxx.

1669 {
1670
1671 // Check if we have an output tree when writing an event:
1672 if (!m_outTree && !metadata) {
1674 "No output tree defined. Did you forget to call writeTo(...)?");
1675 return StatusCode::FAILURE;
1676 }
1677 assert(m_outputEventFormat != 0);
1678
1679 // If this is metadata, just take ownership of it. The object will only
1680 // be recorded into the output file when calling finishWritingTo(...).
1681 if (metadata) {
1682 // Check whether we already have such an object:
1683 if ((!overwrite) &&
1684 (m_outputMetaObjects.find(key) != m_outputMetaObjects.end())) {
1685 ATH_MSG_ERROR("Meta-object \"" << typeName << "\"/\"" << key
1686 << "\" already recorded");
1687 return StatusCode::FAILURE;
1688 }
1689 // Check if we have a dictionary for this object:
1690 TClass* cl = TClass::GetClass(typeName.c_str());
1691 if (!cl) {
1692 ATH_MSG_ERROR("Didn't find dictionary for type: " << typeName);
1693 return StatusCode::FAILURE;
1694 }
1695 // Let's create a holder for the object:
1696 const bool renewOnRead = (m_auxMode == kAthenaAccess);
1697 m_outputMetaObjects[key] = std::make_unique<TObjectManager>(
1698 nullptr, std::make_unique<THolder>(obj, cl, isOwner), renewOnRead);
1699 // We're done. The rest will be done later on.
1700 return StatusCode::SUCCESS;
1701 }
1702
1703 // Check if we accessed this object on the input. If yes, then this
1704 // key may not be used for recording.
1705 if ((!overwrite) && (m_inputObjects.find(key) != m_inputObjects.end())) {
1706 ATH_MSG_ERROR("Object \"" << typeName << "\"/\"" << key
1707 << "\" already accessed from the input, can't be "
1708 "overwritten in memory");
1709 return StatusCode::FAILURE;
1710 }
1711
1712 // Choose a split level.
1713 const Int_t splitLevel = (key.ends_with("Aux.") ? 1 : 0);
1714
1715 // Check if we need to add it to the event record:
1716 Object_t::iterator vitr = m_outputObjects.find(key);
1717 if (vitr == m_outputObjects.end()) {
1718
1719 // Check if we have a dictionary for this object:
1720 TClass* cl = TClass::GetClass(typeName.c_str());
1721 if (cl == nullptr) {
1722 ATH_MSG_ERROR("Didn't find dictionary for type: " << typeName);
1723 return StatusCode::FAILURE;
1724 }
1725
1726 // Check if this is a new object "type" or not.
1727 if (!m_outputEventFormat->exists(key)) {
1729 EventFormatElement(key, cl->GetName(), "", getHash(key)));
1730 }
1731
1732 // Let's create a holder for the object.
1733 const bool renewOnRead = (m_auxMode == kAthenaAccess);
1734 auto mgr = std::make_unique<TObjectManager>(
1735 nullptr, std::make_unique<THolder>(obj, cl, isOwner), renewOnRead);
1736 TObjectManager* mgrPtr = mgr.get();
1737 m_outputObjects[key] = std::move(mgr);
1738
1739 // ... and let's add it to the output TTree.
1740 static constexpr Int_t basketSize = 32000;
1741 *(mgrPtr->branchPtr()) =
1742 m_outTree->Branch(key.c_str(), cl->GetName(),
1743 mgrPtr->holder()->getPtr(), basketSize, splitLevel);
1744 if (!mgrPtr->branch()) {
1745 ATH_MSG_ERROR("Failed to create branch \"" << key << "\" out of type \""
1746 << cl->GetName() << "\"");
1747 // Clean up:
1748 mgrPtr->holder()->setOwner(kFALSE);
1749 return StatusCode::FAILURE;
1750 }
1751
1752 // Set up the saving of all the dynamic auxiliary properties
1753 // of the object if it has any:
1754 static constexpr bool METADATA = false;
1755 ATH_CHECK(putAux(*m_outTree, *mgrPtr, METADATA));
1756
1757 // Return at this point, as we don't want to run the rest of
1758 // the function's code:
1759 return StatusCode::SUCCESS;
1760 }
1761
1762 // Access the object manager:
1763 TObjectManager* omgr = dynamic_cast<TObjectManager* >(vitr->second.get());
1764 if (!omgr) {
1765 ATH_MSG_ERROR("Manager object of the wrong type encountered");
1766 return StatusCode::FAILURE;
1767 }
1768
1769 // Check that the type of the object matches that of the previous
1770 // object:
1771 if (typeName != omgr->holder()->getClass()->GetName()) {
1772 // This may still be, when the ROOT dictionary name differs from the
1773 // "simple type name" known to C++. So let's get the ROOT name of the
1774 // new type:
1775 TClass* cl = TClass::GetClass(typeName.c_str());
1776 if ((!cl) ||
1777 ::strcmp(cl->GetName(), omgr->holder()->getClass()->GetName())) {
1778 ATH_MSG_ERROR("For output key \""
1779 << key << "\" the previous type was \""
1780 << omgr->holder()->getClass()->GetName()
1781 << "\", but the newly requested type is \"" << typeName
1782 << "\"");
1783 return StatusCode::FAILURE;
1784 }
1785 }
1786
1787 // Replace the managed object.
1788 omgr->setObject(obj);
1789
1790 // Replace the auxiliary objects.
1791 static constexpr bool METADATA = false;
1792 ATH_CHECK(putAux(*m_outTree, *omgr, METADATA));
1793
1794 // Return gracefully.
1795 return StatusCode::SUCCESS;
1796}

◆ recordAux() [1/3]

SG::IAuxStore * xAOD::TEvent::recordAux ( const std::string & key,
SG::IAuxStoreHolder::AuxStoreType type = SG::IAuxStoreHolder::AST_ContainerStore )

Add an auxiliary store object to the output.

This function can be used to create/retrieve a ROOT-specific auxiliary object container that can be used to write information in the output file.

Any auxiliary information written this way will however only be readable in ROOT, using the kBranchAccess option.

Parameters
keyThe name/prefix of the auxiliary store object/branches
typeThe type of the auxiliary store (object/container)
Returns
An auxiliary store object that will write to the output

Definition at line 591 of file Control/xAODRootAccess/Root/TEvent.cxx.

592 {
593
594 // A sanity check:
595 if (!m_outTree) {
596 ATH_MSG_ERROR("No output tree given to the object");
597 return nullptr;
598 }
599
600 // Check for an object with this name in the output list:
601 Object_t::iterator itr = m_outputObjects.find(key);
602 if (itr == m_outputObjects.end()) {
603 // Create one if if it doesn't exist yet...
604 // Translate the store type:
606 switch (type) {
609 break;
612 break;
613 default:
614 ATH_MSG_ERROR("Unknown store type (" << type << ") requested");
615 return nullptr;
616 }
617 // Create and record the object:
618 static constexpr bool TOP_STORE = true;
619 if (record(std::make_unique<TAuxStore>(this->currentContext(),
620 key, TOP_STORE, mode), key)
621 .isFailure()) {
622 ATH_MSG_ERROR("Couldn't connect TAuxStore object to the output");
623 return nullptr;
624 }
625 // Update the iterator:
626 itr = m_outputObjects.find(key);
627 }
628
629 // A security check:
630 if (itr == m_outputObjects.end()) {
631 ATH_MSG_ERROR("Internal logic error detected");
632 return nullptr;
633 }
634
635 // Check that it is of the right type:
636 TAuxManager* mgr = dynamic_cast<TAuxManager* >(itr->second.get());
637 if (!mgr) {
638 ATH_MSG_ERROR("Internal logic error detected");
639 return nullptr;
640 }
641
642 // Extract the pointer out of it:
643 TAuxStore* store = mgr->getStore();
644
645 // Give it to the user:
646 return store;
647}
@ AST_ContainerStore
The store describes a container.
@ AST_ObjectStore
The store describes a single object.
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.
@ kUndefinedStore
The structure mode is not defined.

◆ recordAux() [2/3]

StatusCode xAOD::TEvent::recordAux ( TAuxStore * store,
const std::string & key )
protected

Function setting up an existing auxiliary store for writing.

Definition at line 2384 of file Control/xAODRootAccess/Root/TEvent.cxx.

2384 {
2385
2386 // Check if we have an output tree:
2387 if (hasOutput() == false) {
2388 ATH_MSG_ERROR("No output tree set up.");
2389 return StatusCode::FAILURE;
2390 }
2391
2392 // Check if we have a filtering rule for this key:
2393 const std::set<std::string>* filter = 0;
2394 auto filter_itr = m_auxItemList.find(key);
2395 if (filter_itr != m_auxItemList.end()) {
2396 filter = &(filter_itr->second);
2397 }
2398
2399 // Check if we need to add it to the event record:
2400 Object_t::iterator vitr = m_outputObjects.find(key);
2401 if (vitr == m_outputObjects.end()) {
2402
2403 // Configure the object for variable filtering:
2404 if (filter) {
2405 store->selectAux(*filter);
2406 }
2407 // Tell the object where to write its contents:
2408 ATH_CHECK(store->writeTo(*m_outTree));
2409 // Record it to the output list.
2410 static constexpr bool OWNS_STORE = false;
2411 m_outputObjects[key] = std::make_unique<TAuxManager>(store, OWNS_STORE);
2412
2413 // We're done:
2414 return StatusCode::SUCCESS;
2415 }
2416
2417 // Check if the output has the right store:
2418 if (vitr->second->object() == store) {
2419 // We're done already:
2420 return StatusCode::SUCCESS;
2421 }
2422
2423 // If not, update the output manager. This can happen when we copy
2424 // objects from the input to the output files, and we process
2425 // multiple input files.
2426
2427 // Check if the output manager is of the right type:
2428 TAuxManager* mgr = dynamic_cast<TAuxManager* >(vitr->second.get());
2429 if (mgr == nullptr) {
2430 ATH_MSG_ERROR("Output object with key \""
2431 << key << "\" already exists, and is not of type TAuxStore");
2432 return StatusCode::FAILURE;
2433 }
2434
2435 // Configure the object for variable filtering:
2436 if (filter) {
2437 store->selectAux(*filter);
2438 }
2439
2440 // Connect the auxiliary store to the output tree:
2441 ATH_CHECK(store->writeTo(*m_outTree));
2442
2443 // Update the manager:
2444 mgr->setObject(store);
2445
2446 // Return gracefully:
2447 return StatusCode::SUCCESS;
2448}
bool hasOutput() const override
Check if an output file is connected to the object.

◆ recordAux() [3/3]

StatusCode xAOD::TEvent::recordAux ( TVirtualManager & mgr,
const std::string & key,
bool metadata )
overrideprotectedvirtual

Record an auxiliary store into a connected output file.

Implements xAOD::Event.

Definition at line 1798 of file Control/xAODRootAccess/Root/TEvent.cxx.

1799 {
1800
1801 // Check if the auxiliary store is a generic object.
1802 Details::IObjectManager* iomgr = dynamic_cast<Details::IObjectManager*>(&mgr);
1803 if (iomgr != nullptr) {
1804 // Record the auxiliary object using the main record function.
1805 static const bool OVERWRITE = true;
1806 static const bool IS_OWNER = true;
1807 ATH_CHECK(record(iomgr->object(), iomgr->holder()->getClass()->GetName(),
1808 key, OVERWRITE, metadata, IS_OWNER));
1809 return StatusCode::SUCCESS;
1810 }
1811
1812 // Check if it's a TAuxStore object.
1813 TAuxManager* auxmgr = dynamic_cast<TAuxManager* >(&mgr);
1814 if (auxmgr != nullptr) {
1815 // This type has to be an event object.
1816 if (metadata) {
1818 "TAuxStore auxiliary objects can only be recorded for event data");
1819 return StatusCode::FAILURE;
1820 }
1821 // Record the auxiliary object with the dedicated record function.
1822 ATH_CHECK(recordAux(auxmgr->getStore(), key));
1823 return StatusCode::SUCCESS;
1824 }
1825
1826 // Apparently we didn't recorgnize the auxiliary store type.
1827 ATH_MSG_ERROR("Unknown auxiliary store manager type encountered");
1828 return StatusCode::FAILURE;
1829}
SG::IAuxStore * recordAux(const std::string &key, SG::IAuxStoreHolder::AuxStoreType type=SG::IAuxStoreHolder::AST_ContainerStore)
Add an auxiliary store object to the output.

◆ 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 133 of file EventCore.cxx.

133 {
134
135 // Remove the listener. Or at least try to...
136 auto itr = std::find(m_listeners.begin(), m_listeners.end(), listener);
137 if (itr == m_listeners.end()) {
138 ATH_MSG_ERROR("Listener " << static_cast<void*>(listener) << " not known");
139 return StatusCode::FAILURE;
140 }
141 m_listeners.erase(itr);
142
143 // Return gracefully:
144 return StatusCode::SUCCESS;
145}

◆ 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 61 of file EventCore.cxx.

61 {
62
63 // The active event and current store are thread-local globals.
64 Event* nc_this ATLAS_THREAD_SAFE = const_cast<Event*>(this);
65 TActiveEvent::setEvent(static_cast<TVirtualEvent*>(nc_this));
66#ifndef XAOD_STANDALONE
67 SG::CurrentEventStore::setStore(nc_this);
68#endif // not XAOD_STANDALONE
69}
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 78 of file EventCore.cxx.

79 {
80
81 // Decoded attributes.
82 std::set<std::string> attributes;
83
84 // Split up the received string using "." as the separator.
85 if (itemList.size()) {
86 std::istringstream ss(itemList);
87 std::string attr;
88 while (std::getline(ss, attr, '.')) {
89 attributes.insert(attr);
90 }
91 }
92
93 // Remember the setting.
94 m_auxItemList[containerKey] = std::move(attributes);
95}
static Double_t ss

◆ setAuxStore()

StatusCode xAOD::TEvent::setAuxStore ( const std::string & key,
Details::IObjectManager & mgr,
bool metadata )
overrideprotectedvirtual

Function connecting a DV object to its auxiliary store.

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

This function takes care of this.

Parameters
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 1494 of file Control/xAODRootAccess/Root/TEvent.cxx.

1495 {
1496
1497 // Pre-compute some values.
1498 const bool isAuxStore = Details::isAuxStore(*(mgr.holder()->getClass()));
1499
1500 // Check if we need to do anything.
1501 if ((Details::hasAuxStore(*(mgr.holder()->getClass())) == false) &&
1502 (isAuxStore == false)) {
1503 return StatusCode::SUCCESS;
1504 }
1505
1506 // Select which object container to use:
1508
1509 // Look up the auxiliary object's manager:
1510 TVirtualManager* auxMgr = nullptr;
1511 std::string auxKey;
1512 if (isAuxStore) {
1513 auxMgr = &mgr;
1514 auxKey = key;
1515 } else {
1516 auto itr = objects.find(key + "Aux.");
1517 if (itr == objects.end()) {
1518 // Apparently there's no auxiliary object for this DV, so let's
1519 // give up:
1520 return StatusCode::SUCCESS;
1521 }
1522 auxMgr = itr->second.get();
1523 auxKey = key + "Aux.";
1524 }
1525
1526 if (metadata == false) {
1527 // Make sure the auxiliary object is up to date:
1528 const ::Int_t readBytes = auxMgr->getEntry();
1529 if (readBytes < 0) {
1531 "Couldn't load current entry for auxiliary object with key \""
1532 << auxKey << "\"");
1533 return StatusCode::FAILURE;
1534 }
1535
1536 // Check if there is a separate auxiliary object for the dynamic
1537 // variables:
1538 const std::string dynAuxKey = auxKey + "Dynamic";
1539 auto dynAuxMgr = objects.find(dynAuxKey);
1540
1541 if ((dynAuxMgr != objects.end()) &&
1542 (readBytes || (m_auxMode == kAthenaAccess) || (auxMgr == &mgr))) {
1543 // Do different things based on the access mode:
1544 if (m_auxMode != kAthenaAccess) {
1545 // In "normal" access modes just tell the dynamic store object
1546 // to switch to a new event.
1547 dynAuxMgr->second->getEntry();
1548 } else {
1549 // In "Athena mode" this object has already been deleted when
1550 // the main auxiliary store object was switched to the new
1551 // event. So let's re-create it:
1552 xAOD::TObjectManager &auxMgrRef =
1553 dynamic_cast<xAOD::TObjectManager &>(*auxMgr);
1554 ATH_CHECK(
1555 setUpDynamicStore(auxMgrRef, (metadata ? m_inMetaTree : m_inTree)));
1556 // Now tell the newly created dynamic store object which event
1557 // it should be looking at:
1558 auto dynAuxMgr = objects.find(dynAuxKey);
1559 if (dynAuxMgr == objects.end()) {
1560 ATH_MSG_ERROR("Internal logic error detected");
1561 return StatusCode::FAILURE;
1562 }
1563 dynAuxMgr->second->getEntry();
1564 }
1565 }
1566 }
1567
1568 // Stop here if we've set up an auxiliary store.
1569 if (isAuxStore) {
1570 return StatusCode::SUCCESS;
1571 }
1572
1573 // Access the auxiliary base class of the object/vector:
1574 SG::AuxVectorBase* vec = 0;
1575 SG::AuxElement* aux = 0;
1576 switch (mgr.holder()->typeKind()) {
1577 case THolder::DATAVECTOR: {
1578 void* vvec = mgr.holder()->getAs(typeid(SG::AuxVectorBase));
1579 vec = reinterpret_cast<SG::AuxVectorBase*>(vvec);
1580 } break;
1581 case THolder::AUXELEMENT: {
1582 void* vaux = mgr.holder()->getAs(typeid(SG::AuxElement));
1583 aux = reinterpret_cast<SG::AuxElement*>(vaux);
1584 } break;
1585 default:
1586 break;
1587 }
1588
1589 // Check whether index tracking is enabled for the type. If not, then
1590 // we need to fix it...
1591 if (vec && (!vec->trackIndices())) {
1592 Details::forceTrackIndices(*vec);
1593 }
1594
1595 // Check if we were successful:
1596 if ((!vec) && (!aux)) {
1597 ATH_MSG_FATAL("Couldn't access class \""
1598 << mgr.holder()->getClass()->GetName()
1599 << "\" as SG::AuxVectorBase or SG::AuxElement");
1600 return StatusCode::FAILURE;
1601 }
1602
1603 // Get the auxiliary store object:
1604 const SG::IConstAuxStore* store = 0;
1605 if (m_auxMode == kBranchAccess) {
1606 // Get the concrete auxiliary manager:
1607 TAuxManager* amgr = dynamic_cast<TAuxManager* >(auxMgr);
1608 if (!amgr) {
1609 ATH_MSG_FATAL("Auxiliary manager for \""
1610 << auxKey << "\" is not of the right type");
1611 return StatusCode::FAILURE;
1612 }
1613 store = amgr->getConstStore();
1614 // If the store still doesn't know its type, help it now:
1615 if (amgr->getStore()->structMode() ==
1620 amgr->getStore()->setStructMode(mode);
1621 }
1622 } else if (m_auxMode == kClassAccess || m_auxMode == kAthenaAccess) {
1623 // Get the concrete auxiliary manager:
1624 TObjectManager* omgr = dynamic_cast<TObjectManager* >(auxMgr);
1625 if (!omgr) {
1626 ATH_MSG_FATAL("Auxiliary manager for \""
1627 << auxKey << "\" is not of the right type");
1628 return StatusCode::FAILURE;
1629 }
1630 void* p = omgr->holder()->getAs(typeid(SG::IConstAuxStore));
1631 store = reinterpret_cast<const SG::IConstAuxStore* >(p);
1632 }
1633 if (!store) {
1634 ATH_MSG_FATAL("Logic error detected in the code");
1635 return StatusCode::FAILURE;
1636 }
1637
1638 // Connect the two:
1639 if (vec) {
1640 vec->setStore(store);
1641 } else if (aux) {
1642 aux->setStore(store);
1643 } else {
1644 ATH_MSG_FATAL("Logic error detected in the code");
1645 return StatusCode::FAILURE;
1646 }
1647
1648 // We succeeded:
1649 return StatusCode::SUCCESS;
1650}
std::vector< size_t > vec
@ DATAVECTOR
A DataVector container.
Definition THolder.h:105
@ AUXELEMENT
A type inheriting from SG::AuxElement.
Definition THolder.h:106
AuxElement(SG::AuxVectorData *container, size_t index)
Base class for elements of a container that can have aux data.

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

◆ setOtherMetaDataTreeNamePattern()

void xAOD::TEvent::setOtherMetaDataTreeNamePattern ( const std::string & pattern)

Change the pattern used for collecting information from other MetaData trees NB: Additional MetaData trees are only expected for augmented files This function also allows user to redefine MetaData tree pattern to skip trees that would not be proper MetaData ones i.e.

trees not containing an EventFormat* branch

Definition at line 102 of file Control/xAODRootAccess/Root/TEvent.cxx.

102 {
103 // Only change if pattern provided is not empty
104 if (pattern.size()) {
105 // User provided a regular expression for other MetaData trees
106 m_otherMetaDataTreeNamePattern = std::regex(pattern);
107 }
108}

◆ setUpDynamicStore()

StatusCode xAOD::TEvent::setUpDynamicStore ( TObjectManager & mgr,
::TTree * tree )
protected

Function adding dynamic variable reading capabilities to an auxiliary store object.

This function is used by connectBranch(...) and connectMetaBranch(...) 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
treeThe tree to read dynamic variables from
Returns
The usual StatusCode types

Definition at line 2070 of file Control/xAODRootAccess/Root/TEvent.cxx.

2070 {
2071
2072 // Check if we can call setName(...) on the object:
2073 ::TMethodCall setNameCall;
2074 // Don't use this code in Athena access mode. And just accept that access
2075 // monitoring is disabled in this case...
2076 if (m_auxMode != kAthenaAccess) {
2077 setNameCall.InitWithPrototype(mgr.holder()->getClass(), "setName",
2078 "const char*");
2079 if (setNameCall.IsValid()) {
2080 // Yes, there is such a function. Let's call it with the branch
2081 // name:
2082 const ::TString params =
2083 ::TString::Format("\"%s\"", mgr.branch()->GetName());
2084 const char* charParams = params.Data();
2085 setNameCall.Execute(mgr.holder()->get(), charParams);
2086 } else {
2087 // This is weird. What sort of auxiliary container is this? :-/
2088 ATH_MSG_WARNING("Couldn't find setName(...) function for container \""
2089 << mgr.branch()->GetName() << "\" (type: "
2090 << mgr.holder()->getClass()->GetName() << ")");
2091 }
2092 }
2093
2094 // Check if we can switch out the internal store of this object:
2095 static const TClass* const holderClass =
2096 TClass::GetClass(typeid(SG::IAuxStoreHolder));
2097 if (!mgr.holder()->getClass()->InheritsFrom(holderClass)) {
2098 // Nope... So let's just end the journey here.
2099 return StatusCode::SUCCESS;
2100 }
2101
2102 // Try to get the object as an IAuxStoreHolder:
2103 SG::IAuxStoreHolder* storeHolder = reinterpret_cast<SG::IAuxStoreHolder* >(
2104 mgr.holder()->getAs(typeid(SG::IAuxStoreHolder)));
2105 if (!storeHolder) {
2106 ATH_MSG_FATAL("There's a logic error in the code");
2107 return StatusCode::FAILURE;
2108 }
2109
2110 // If we read an auxiliary store, call toTransient on it.
2111 const EventContext& ctx = this->currentContext();
2112#ifndef XAOD_STANDALONE
2113 if (SG::IAuxStore* istore = dynamic_cast<SG::IAuxStore*> (storeHolder)) {
2114 istore->toTransient( ctx );
2115 }
2116#endif
2117
2118 // Create a TAuxStore instance that will read the dynamic variables
2119 // of this container. Notice that the TAuxManager doesn't own the
2120 // TAuxStore object. It will be owned by the SG::IAuxStoreHolder
2121 // object.
2122 static constexpr bool TOP_STORE = false;
2123 auto store = std::make_unique<TAuxStore>(
2124 ctx, mgr.branch()->GetName(), TOP_STORE,
2128 // This object is used to read data from the input, it needs to be
2129 // locked:
2130 store->lock();
2131
2132 // Set it up to read from the input RNTuple.
2133 ATH_CHECK(store->readFrom(*tree));
2134
2135 // Set it up to read from the input TTree.
2136 ATH_CHECK(store->readFrom(*tree));
2137 // Tell the auxiliary store which entry to use. This is essential for
2138 // metadata objects, and non-important for event data objects, which will
2139 // get a possibly different entry loaded in setAuxStore(...).
2140 store->getEntry(0);
2141
2142 // Set up a manager for it.
2143 static constexpr bool SHARED_OWNER = false;
2144 m_inputObjects[std::string(mgr.branch()->GetName()) + "Dynamic"] =
2145 std::make_unique<TAuxManager>(store.get(), SHARED_OWNER);
2146
2147 // Give this object to the store holder:
2148 storeHolder->setStore(store.release());
2149
2150 // Return gracefully:
2151 return StatusCode::SUCCESS;
2152}
virtual AuxStoreType getStoreType() const =0
Return the type of the store object.
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.

◆ writeTo() [1/2]

StatusCode xAOD::TEvent::writeTo ( ::TFile * file,
int autoFlush = 200,
std::string_view treeName = EVENT_TREE_NAME )

Connect the object to an output file.

This function should be called on a file opened be the user, before any event processing would occur.

It sets up the output event tree.

Parameters
fileThe file that the event data should be written to
autoFlushThe auto-flush setting to use on the output TTree
treeNameName of the output event tree
Returns
The usual StatusCode tyoes

Definition at line 427 of file Control/xAODRootAccess/Root/TEvent.cxx.

428 {
429
430 // Just a simple security check.
431 if (!file) {
432 ATH_MSG_ERROR("Null pointer received!");
433 return StatusCode::FAILURE;
434 }
435
436 // Check that the object is in the "right state":
437 if (m_outTree) {
438 ATH_MSG_ERROR("Object already writing to a file. Close that file first!");
439 return StatusCode::FAILURE;
440 }
441
442 // Make sure we return to the current directory:
443 TDirectoryReset dr;
444
445 // Create the output TTree:
446 file->cd();
447 m_outTree = std::make_unique<TTree>(treeName.data(), "xAOD event tree");
448 m_outTree->SetDirectory(file);
449 m_outTree->SetAutoSave(1000000);
450 m_outTree->SetAutoFlush(autoFlush);
451
452 // Access the EventFormat object associated with this file:
455
456 // Return gracefully:
457 return StatusCode::SUCCESS;
458}
static const TEventFormatRegistry & instance()
Access the only instance of the object in memory.
EventFormat & getEventFormat(const TFile *file) const
Access the managed EventFormat object.

◆ writeTo() [2/2]

StatusCode xAOD::TEvent::writeTo ( TFile & file)
overridevirtual

Connect the object to an output file.

This interface function should be called on a file opened be the user, before any event processing would occur.

It sets up the output event tree.

Parameters
fileThe file that the event data should be written to
Returns
The usual StatusCode tyoes

Implements xAOD::Event.

Definition at line 410 of file Control/xAODRootAccess/Root/TEvent.cxx.

410 {
411
412 // Forward call
414
415 // Return gracefully:
416 return StatusCode::SUCCESS;
417}
StatusCode writeTo(TFile &file) override
Connect the object to an output file.

◆ ::xAODTEventBranch

friend class ::xAODTEventBranch
friend

◆ ::xAODTMetaBranch

friend class ::xAODTMetaBranch
friend

◆ CP::xAODWriterAlg

friend class CP::xAODWriterAlg
friend

◆ xAOD::TFileMerger

friend class xAOD::TFileMerger
friend

◆ xAOD::TTreeMgr

friend class xAOD::TTreeMgr
friend

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

◆ EVENT_RNTUPLE_NAME

const char *const Event::EVENT_RNTUPLE_NAME = "EventData"
staticinherited

Name of the event RNTuple.

Definition at line 78 of file Event.h.

◆ EVENT_TREE_NAME

const char *const Event::EVENT_TREE_NAME = "CollectionTree"
staticinherited

Default name of the event TTree.

Name of the event TTree.

Definition at line 77 of file Event.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 360 of file Event.h.

◆ m_auxMode

EAuxMode xAOD::TEvent::m_auxMode
protected

The auxiliary access mode.

Definition at line 206 of file Control/xAODRootAccess/xAODRootAccess/TEvent.h.

◆ m_branchesMutex

upgrade_mutex_t xAOD::Event::m_branchesMutex
mutableprotectedinherited

Mutex for multithread synchronization.

Definition at line 388 of file Event.h.

◆ m_ctx

EventContext xAOD::Event::m_ctx
protectedinherited

The event context associated with this event.

Definition at line 408 of file Event.h.

◆ m_entry

::Long64_t xAOD::TEvent::m_entry = -1
protected

The entry to look at from the input tree.

Definition at line 222 of file Control/xAODRootAccess/xAODRootAccess/TEvent.h.

◆ m_imsg

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

MessageSvc pointer.

Definition at line 135 of file AthMessaging.h.

135{ nullptr };

◆ m_inChain

::TChain* xAOD::TEvent::m_inChain = nullptr
protected

The (optional) chain provided as input.

Definition at line 214 of file Control/xAODRootAccess/xAODRootAccess/TEvent.h.

◆ m_inChainTracker

std::unique_ptr<TChainStateTracker> xAOD::TEvent::m_inChainTracker
protected

Optional object for tracking the state changes of an input TChain.

Definition at line 216 of file Control/xAODRootAccess/xAODRootAccess/TEvent.h.

◆ m_inMetaTree

::TTree* xAOD::TEvent::m_inMetaTree = nullptr
protected

Pointer to the metadata tree in the input file.

Definition at line 220 of file Control/xAODRootAccess/xAODRootAccess/TEvent.h.

◆ m_inputEventFormat

EventFormat xAOD::Event::m_inputEventFormat
protectedinherited

Format of the current input file.

Definition at line 355 of file Event.h.

◆ m_inputMetaObjects

Object_t xAOD::Event::m_inputMetaObjects
protectedinherited

Collection of all the managed input meta-objects.

Definition at line 350 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 345 of file Event.h.

◆ m_inputObjects

Object_t xAOD::Event::m_inputObjects
protectedinherited

Collection of all the managed input objects.

Definition at line 342 of file Event.h.

◆ m_inTree

::TTree* xAOD::TEvent::m_inTree = nullptr
protected

The main tree that we are reading from.

Definition at line 209 of file Control/xAODRootAccess/xAODRootAccess/TEvent.h.

◆ m_inTreeMissing

bool xAOD::TEvent::m_inTreeMissing = false
protected

Internal status flag showing that an input file is open, but it doesn't contain an event tree.

Definition at line 212 of file Control/xAODRootAccess/xAODRootAccess/TEvent.h.

◆ m_inTreeNumber

::Int_t xAOD::TEvent::m_inTreeNumber = -1
protected

The number of the currently open tree in the input chain.

Definition at line 218 of file Control/xAODRootAccess/xAODRootAccess/TEvent.h.

◆ m_listeners

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

Listeners who should be notified when certain incidents happen.

Definition at line 363 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_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 366 of file Event.h.

◆ m_nm

std::string AthMessaging::m_nm
privateinherited

Message source name.

Definition at line 129 of file AthMessaging.h.

◆ m_otherMetaDataTreeNamePattern

std::regex xAOD::TEvent::m_otherMetaDataTreeNamePattern
protected
Initial value:
=
std::regex("^MetaData(?!Hdr)_.*$")

Definition at line 230 of file Control/xAODRootAccess/xAODRootAccess/TEvent.h.

◆ m_outputEventFormat

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

Format of the current output file.

Definition at line 357 of file Event.h.

◆ m_outputMetaObjects

Object_t xAOD::Event::m_outputMetaObjects
protectedinherited

Collection of all the managed output meta-objects.

Definition at line 352 of file Event.h.

◆ m_outputObjects

Object_t xAOD::Event::m_outputObjects
protectedinherited

Collection of all the managed output object.

Definition at line 347 of file Event.h.

◆ m_outTree

std::unique_ptr<::TTree> xAOD::TEvent::m_outTree
protected

The tree that we are writing to.

Definition at line 225 of file Control/xAODRootAccess/xAODRootAccess/TEvent.h.

◆ m_printEventProxyWarnings

bool xAOD::Event::m_printEventProxyWarnings = false
protectedinherited

Option to silence common warnings that seem to be harmless.

Definition at line 369 of file Event.h.

◆ METADATA_OBJECT_NAME

const char *const Event::METADATA_OBJECT_NAME = "MetaData"
staticinherited

Name of the metadata tree or RNTuple.

Definition at line 79 of file Event.h.


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