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

Class used for the test. More...

Inheritance diagram for REventClass:
Collaboration diagram for REventClass:

Public Types

using sgkey_t = SG::sgkey_t

Public Member Functions

StatusCode loadInputObjects ()
 Function loading all interface objects of the event.
 REvent (const EventContext *ctx=nullptr)
 Default constructor.
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 (std::string_view fileName)
 Set up the reading of an input file via a file name.
StatusCode writeTo (TFile &file) override
 Connect the object to an output file.
StatusCode finishWritingTo (TFile &file) override
 Finish writing to an output file.
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 RNTuple.
::Int_t fill () override
 Method filling one event into 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
const EventFormat * inputEventFormat () const
 Get information about the input objects.
const EventFormat * outputEventFormat () 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

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 implementing the IProxyDict interface
SG::DataProxy * proxy (const void *const pTransient) const override
 get proxy for a given data object address in memory
SG::DataProxy * proxy (const CLID &id, const std::string &key) const override
 get proxy with given id and key. Returns 0 to flag failure
SG::DataProxy * proxy_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::DataProxy * recordObject (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

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.
EventFormat * m_outputEventFormat = nullptr
 Format of the current output file.
std::unordered_map< std::string, std::set< std::string > > m_auxItemList
 Rules for selecting which auxiliary branches to write.
std::vector< TVirtualIncidentListener * > m_listeners
 Listeners who should be notified when certain incidents happen.
std::unordered_map< std::string, std::string > m_nameRemapping
 Container name re-mapping rules.
bool m_printEventProxyWarnings = false
 Option to silence common warnings that seem to be harmless.

Private Member Functions

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

Private Attributes

std::unique_ptr< ROOT::RNTupleReader > m_eventReader
 The main event data reader.
bool m_inputNTupleIsMissing = false
 Whether the input has an event RNTuple or not.
std::unique_ptr< ROOT::RNTupleReader > m_metaReader
 The metadata reader.
::Long64_t m_entry {}
 The entry to look at from the input.
std::unique_ptr< ROOT::RNTupleModel > m_model
 The RNTuple model used for event fields.
std::unique_ptr< ROOT::RNTupleWriter > m_eventWriter
 The main event writer: RNTupleWeader.
::TFile * m_outputFile {nullptr}
 The output file for writing.
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.

Setup functions

void setActive () const
 Set this event object as the currently active one.
void setAuxItemList (const std::string &containerKey, const std::string &itemList)
 Configure which dynamic variables to write out for a given store.
StatusCode addListener (TVirtualIncidentListener *listener)
 Register an incident listener object.
StatusCode removeListener (TVirtualIncidentListener *listener)
 Remove an incident listener object.
void clearListeners ()
 Remove all listeners from the object.
StatusCode addNameRemap (const std::string &onfile, const std::string &newName)
 Add a name re-mapping rule.
void clearNameRemap ()
 Clear the current name re-mapping.
void printNameRemap () const
 Print the current name re-mapping rules.
void printProxyWarnings (bool value=true)
 Enable warnings associated with broken element links.
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< Event > createAndReadFrom (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.

Variable(s) used in the @c IProxyDict implementation

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

Helper functions for the IProxyDict interface

EventContext m_ctx
 The event context associated with this event.
const xAOD::EventFormatElement * getEventFormatElement (SG::sgkey_t sgkey) const
 Get the metadata object for a given "SG key".
const BranchInfo * getBranchInfo (SG::sgkey_t sgkey) const
 Get the object describing one object/branch.

Detailed Description

Class used for the test.

Definition at line 36 of file xAODRNFileReadTest.cxx.

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 340 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 385 of file Event.h.

◆ upgrading_lock_t

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

Lock type for multithread synchronization.

Definition at line 387 of file Event.h.

Member Function Documentation

◆ addField()

StatusCode xAOD::Experimental::REvent::addField ( const std::string & key,
const TVirtualManager & mgr )
privateinherited

Add field to RNTuple model given the StoreGate key and output object manager.

Definition at line 1696 of file REvent.cxx.

1696 {
1697
1698 // Add to the RNTuple model -
1699 // This is done by either adding the field to the initial model before the first event is written, or
1700 // after the first event has been written a new field is added via an extension of the output RNTuple model.
1701 // This can occurs when an AuxStore is empty for the initial events
1702
1703 // Get field name and class name to create a RFieldBase
1704 std::string fieldName;
1705 std::string className;
1706 if (getInfoForFieldCreation( key, mgr, fieldName, className ).isFailure()) return StatusCode::FAILURE;
1707 // should have found class name
1708 if ( className.empty() ) {
1709 ATH_MSG_ERROR( "could not find className!" );
1710 return StatusCode::FAILURE;
1711 }
1712
1713 if (m_model) {
1714 // Continue to add to the initial RNTuple model
1715 m_model->AddField( ROOT::RFieldBase::Create( fieldName, className ).Unwrap());
1716 }
1717 else {
1718 if (m_eventWriter.get() == nullptr) {
1719 ATH_MSG_ERROR("Internal logic error detected - no output found");
1720 return StatusCode::FAILURE;
1721 }
1722 // After the first event, one needs to extend the output RNTuple model
1723 auto field = ROOT::RFieldBase::Create(fieldName, className).Unwrap();
1724 auto updater = m_eventWriter->CreateModelUpdater();
1725 updater->BeginUpdate();
1726 updater->AddField(std::move(field));
1727 updater->CommitUpdate();
1728 }
1729
1730 // Return gracefully:
1731 return StatusCode::SUCCESS;
1732
1733}
#define ATH_MSG_ERROR(x,...)
std::unique_ptr< ROOT::RNTupleWriter > m_eventWriter
The main event writer: RNTupleWeader.
Definition REvent.h:144
std::unique_ptr< ROOT::RNTupleModel > m_model
The RNTuple model used for event fields.
Definition REvent.h:141
Updater_t & updater()
Access the Updater instance.

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

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

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

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

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

257 {
258
260
261 // Warn the user that the function got called:
262 static std::atomic_flag warningPrinted ATLAS_THREAD_SAFE = ATOMIC_FLAG_INIT;
263 if (!warningPrinted.test_and_set() && m_printEventProxyWarnings) {
265 "Function should only be called through an invalid ElementLink");
266 }
267
268 // Hold on to the proxy
269 BranchInfo bi;
270 bi.m_proxy.reset(proxy);
271 lock.upgrade();
272#ifdef XAOD_STANDALONE
273 std::string uniqueKey = std::format("NonExistentKey_{}", m_branches.size());
274 SG::sgkey_t sgkey = stringToKey(uniqueKey, clid);
275#else
276 SG::sgkey_t sgkey = proxy->sgkey();
277#endif
278 m_branches.emplace (sgkey, std::move(bi));
279
280 // Return gracefully:
281 return StatusCode::SUCCESS;
282}
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:390
bool m_printEventProxyWarnings
Option to silence common warnings that seem to be harmless.
Definition Event.h:371
SG::SGKeyMap< BranchInfo > m_branches ATLAS_THREAD_SAFE
Map from hashed sgkey to BranchInfo.
Definition Event.h:394
AthContainers_detail::upgrading_lock< upgrade_mutex_t > upgrading_lock_t
Lock type for multithread synchronization.
Definition Event.h:387
SG::DataProxy * proxy(const void *const pTransient) const override
get proxy for a given data object address in memory
uint32_t sgkey_t
Type used for hashed StoreGate key+CLID pairs.
Definition sgkey_t.h:32
sgkey(tool)
Definition common.py:1027
Helper struct used by the IProxyDict code.
Definition Event.h:377
std::unique_ptr< SG::DataProxy > m_proxy
Data proxy describing this branch/object.
Definition Event.h:379

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

155 {
156
157 m_listeners.clear();
158}

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

205 {
206
207 m_nameRemapping.clear();
208}

◆ connectAux()

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

Function setting up access to a set of auxiliary branches.

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

This uses the EDM object that was used to write the auxiliary information in Athena.

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

Implements xAOD::Event.

Definition at line 1087 of file REvent.cxx.

1087 {
1088
1089 // A little sanity check.
1090 if (!m_eventReader) {
1091 ATH_MSG_ERROR("Function called on un-initialised object");
1092 return StatusCode::FAILURE;
1093 }
1094
1095 // Check if the field is already connected.
1096 if (m_inputObjects.contains(prefix)) {
1097 return StatusCode::SUCCESS;
1098 }
1099
1100 // Connect to the field as we would for any other.
1101 static constexpr bool SILENT = false;
1102 ATH_CHECK(connectObject(prefix, SILENT));
1103
1104 // Access the object's manager.
1105 Object_t::const_iterator mgr_itr = m_inputObjects.find(prefix);
1106 if (mgr_itr == m_inputObjects.end()) {
1107 ATH_MSG_FATAL("There's a logic error in the code");
1108 return StatusCode::FAILURE;
1109 }
1110 const Details::IObjectManager* omgr =
1111 dynamic_cast<const RObjectManager*>(mgr_itr->second.get());
1112 if (omgr == nullptr) {
1113 ATH_MSG_FATAL("There's a logic error in the code");
1114 return StatusCode::FAILURE;
1115 }
1116
1117 // Check if we can switch out the internal store of this object.
1118 static const TClass* const holderClass = TClass::GetClass(typeid(SG::IAuxStoreHolder));
1119 if (omgr->holder()->getClass()->InheritsFrom(holderClass) == false) {
1120 // Nope... So let's just end the journey here.
1121 return StatusCode::SUCCESS;
1122 }
1123
1124 // Try to get the object as an IAuxStoreHolder.
1125 SG::IAuxStoreHolder* storeHolder = reinterpret_cast<SG::IAuxStoreHolder*>(
1126 omgr->holder()->getAs(typeid(SG::IAuxStoreHolder)));
1127 if (!storeHolder) {
1128 ATH_MSG_FATAL("There's a logic error in the code");
1129 return StatusCode::FAILURE;
1130 }
1131
1132 // A sanity check to see whether the store's type is in sync with the
1133 // object's type that it will be connected to:
1134 if ((standalone &&
1136 ((!standalone) && (storeHolder->getStoreType() !=
1138 ATH_MSG_ERROR("Requested store types inconsistent for: " << prefix);
1139 ATH_MSG_ERROR("standalone = "
1140 << standalone << ", getStoreType() = "
1141 << static_cast<int>(storeHolder->getStoreType()));
1142 return StatusCode::FAILURE;
1143 }
1144
1145 // Return gracefully.
1146 return StatusCode::SUCCESS;
1147}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_FATAL(x,...)
@ AST_ContainerStore
The store describes a container.
@ AST_ObjectStore
The store describes a single object.
virtual AuxStoreType getStoreType() const =0
Return the type of the store object.
Object_t m_inputObjects
Collection of all the managed input objects.
Definition Event.h:344
std::unique_ptr< ROOT::RNTupleReader > m_eventReader
The main event data reader.
Definition REvent.h:131
StatusCode connectObject(const std::string &key, bool silent) override
Function setting up access to a particular object.
Definition REvent.cxx:850
@ SILENT
don't print anything and return success

◆ connectMetaAux()

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

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.

This uses 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 1157 of file REvent.cxx.

1158 {
1159
1160 // A little sanity check.
1161 if (!m_metaReader) {
1162 ATH_MSG_ERROR("Function called on un-initialised object");
1163 return StatusCode::FAILURE;
1164 }
1165
1166 // Check if the field is already connected.
1167 if (m_inputMetaObjects.contains(prefix)) {
1168 return StatusCode::SUCCESS;
1169 }
1170
1171 // Connect to the field as we would for any other.
1172 static constexpr bool SILENT = false;
1173 ATH_CHECK(connectMetaObject(prefix, SILENT));
1174
1175 // Access the object's manager.
1176 Object_t::const_iterator mgr_itr = m_inputMetaObjects.find(prefix);
1177 if (mgr_itr == m_inputMetaObjects.end()) {
1178 ATH_MSG_FATAL("There's a logic error in the code");
1179 return StatusCode::FAILURE;
1180 }
1181 const Details::IObjectManager* omgr =
1182 dynamic_cast<const RObjectManager*>(mgr_itr->second.get());
1183 if (omgr == nullptr) {
1184 ATH_MSG_FATAL("There's a logic error in the code");
1185 return StatusCode::FAILURE;
1186 }
1187
1188 // Check if we can switch out the internal store of this object.
1189 static const TClass* const holderClass =
1190 TClass::GetClass(typeid(SG::IAuxStoreHolder));
1191 if (omgr->holder()->getClass()->InheritsFrom(holderClass) == false) {
1192 // Nope... So let's just end the journey here.
1193 return StatusCode::SUCCESS;
1194 }
1195
1196 // Try to get the object as an IAuxStoreHolder.
1197 SG::IAuxStoreHolder* storeHolder = reinterpret_cast<SG::IAuxStoreHolder*>(
1198 omgr->holder()->getAs(typeid(SG::IAuxStoreHolder)));
1199 if (!storeHolder) {
1200 ATH_MSG_FATAL("There's a logic error in the code");
1201 return StatusCode::FAILURE;
1202 }
1203
1204 // A sanity check to see whether the store's type is in sync with the
1205 // object's type that it will be connected to:
1206 if ((standalone &&
1208 ((!standalone) && (storeHolder->getStoreType() !=
1210 ATH_MSG_ERROR("Requested store types inconsistent for: " << prefix);
1211 ATH_MSG_ERROR("standalone = "
1212 << standalone << ", getStoreType() = "
1213 << static_cast<int>(storeHolder->getStoreType()));
1214 return StatusCode::FAILURE;
1215 }
1216
1217 // Return gracefully.
1218 return StatusCode::SUCCESS;
1219}
Object_t m_inputMetaObjects
Collection of all the managed input meta-objects.
Definition Event.h:352
std::unique_ptr< ROOT::RNTupleReader > m_metaReader
The metadata reader.
Definition REvent.h:135
StatusCode connectMetaObject(const std::string &key, bool silent) override
Function setting up access to a particular metadata object.
Definition REvent.cxx:1000

◆ connectMetaObject()

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

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 1000 of file REvent.cxx.

1000 {
1001
1002 // A little sanity check.
1003 if (!m_metaReader) {
1004 ATH_MSG_ERROR("Function called on un-initialised object");
1005 return StatusCode::FAILURE;
1006 }
1007
1008 // Check if the branch is already connected.
1009 if (m_inputMetaObjects.contains(key)) {
1010 return StatusCode::SUCCESS;
1011 }
1012
1013 // Find the name of the field that stores the object.
1014 const std::string fieldName =
1015 Utils::getFieldName(m_metaReader->GetDescriptor(), key);
1016
1017 // Check if the field exists in our input RNTuple.
1018 if (m_metaReader->GetDescriptor().FindFieldId(fieldName.c_str()) ==
1019 ROOT::kInvalidDescriptorId) {
1020 // Field doesn't exist
1021 if (!silent) {
1022 ATH_MSG_WARNING("Field \"" << fieldName << "\" not available on input");
1023 }
1024 return StatusCode::RECOVERABLE;
1025 }
1026
1027 // RDS: may need some logic here to get type from inputEventFormat rather than
1028 // the view to read in with automatic schema evolution
1029
1030 // Get class name from the field
1031 ROOT::RNTupleView<void> view =
1032 m_metaReader->GetView<void>(fieldName.c_str(), nullptr);
1033 std::string className = view.GetField().GetTypeName();
1034 if (className == "") {
1036 "Couldn't find an appropriate type with a dictionary for field \""
1037 << fieldName << "\"");
1038 return StatusCode::FAILURE;
1039 }
1040 ::TClass* realClass = ::TClass::GetClass(className.c_str());
1041 if ((!realClass) || (!realClass->IsLoaded())) {
1042 // Now we're in trouble...
1044 "Couldn't find an appropriate type with a dictionary for field \""
1045 << fieldName << "\"");
1046 return StatusCode::FAILURE;
1047 }
1048
1049 // Create the object and the manager(s) around it.
1050 void* ptr = realClass->New();
1051 static const ::Long64_t FIRST_ENTRY = 0;
1052 auto mgr = std::make_unique<RObjectManager>(
1053 m_metaReader->GetView(fieldName, ptr, className), FIRST_ENTRY,
1054 std::make_unique<THolder>(ptr, realClass));
1055 // For metadata, we must read in the first entry - entry number already set by FIRST_ENTRY in constructor
1056 mgr->getEntry();
1057 RObjectManager* mgrPtr = mgr.get();
1058 m_inputMetaObjects[key] = std::move(mgr);
1059
1060 // If it's an auxiliary store object, set it up correctly.
1061 if (Details::isAuxStore(*(mgrPtr->holder()->getClass()))) {
1062 // For reading in of the dynamic variables for metadata
1064 }
1065
1066 // If it (probably) has an associated auxiliary store, set it up as well.
1067 if (Details::hasAuxStore(*(mgrPtr->holder()->getClass()))) {
1069 key + "Aux.", Details::isStandalone(*(mgrPtr->holder()->getClass()))));
1070 static constexpr bool METADATA = true;
1071 ATH_CHECK(setAuxStore(key, *mgrPtr, METADATA));
1072 }
1073
1074 // Return gracefully.
1075 return StatusCode::SUCCESS;
1076} // connectMetaObject
StatusCode setUpDynamicStore(RObjectManager &mgr, ROOT::RNTupleReader &ntupleReader)
event uses RNTupleReader:
Definition REvent.cxx:1826
StatusCode connectMetaAux(const std::string &prefix, bool standalone) override
Function setting up access to a set of auxiliary branches for a metadata object.
Definition REvent.cxx:1157
StatusCode setAuxStore(const std::string &key, Details::IObjectManager &mgr, bool metadata) override
Function connecting a DV object to its auxiliary store.
Definition REvent.cxx:1232
void * ptr(T *p)
Definition SGImplSvc.cxx:75
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
std::string getFieldName(const ROOT::RNTupleDescriptor &descriptor, const std::string &key)
This function is used to find the name of the field in an RNTuple that stores the object with a given...

◆ connectObject()

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

Function setting up access to a particular object.

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

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

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

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

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

Implements xAOD::Event.

Definition at line 850 of file REvent.cxx.

850 {
851
852 // A little sanity check.
853 if (!m_eventReader) {
854 ATH_MSG_ERROR("Function called on un-initialised object");
855 return StatusCode::FAILURE;
856 }
857
858 // Increment the access counter on this container.
860
861 // Check if the branch is already connected.
862 if (m_inputObjects.contains(key)) {
863 return StatusCode::SUCCESS;
864 }
865 // Check if it was already found to be missing.
866 if (m_inputMissingObjects.contains(key)) {
867 if (!silent) {
868 ATH_MSG_WARNING("Field \"" << key << "\" not available on input");
869 }
870 return StatusCode::RECOVERABLE;
871 }
872
873 // Tell the user what's happening.
874 ATH_MSG_DEBUG("Connecting to field \"" << key << "\"");
875
876 // Check if we have metadata about this branch.
877 const xAOD::EventFormatElement* ef = nullptr;
878
879 // Find the name of the field that stores the object.
880 const std::string fieldName =
881 Utils::getFieldName(m_eventReader->GetDescriptor(), key);
882
883 if (m_inputEventFormat.exists(key) == false) {
884 if (!silent) {
885 ATH_MSG_WARNING("No metadata available for object: " << key);
886 }
887 } else {
888 ef = m_inputEventFormat.get(key);
889 }
890
891 // Check if the field exists in our input RNTuple.
892 if (m_eventReader->GetDescriptor().FindFieldId(fieldName.c_str()) ==
893 ROOT::kInvalidDescriptorId) {
894 // Field doesn't exist
895 if (!silent) {
896 ATH_MSG_WARNING("Field \"" << fieldName << "\" not available on input");
897 }
898 m_inputMissingObjects.insert(key);
899 return StatusCode::RECOVERABLE;
900 }
901
902 // RDS: may need some logic here to get type from inputEventFormat rather than
903 // the view to read in with automatic schema evolution
904
905 // Get class name from the field
906 ROOT::RNTupleView<void> view =
907 m_eventReader->GetView<void>(fieldName.c_str(), nullptr);
908 std::string className = view.GetField().GetTypeName();
909 if (className == "") {
910 if (ef) {
911 // This is a fairly weird situation, but let's fall back to taking
912 // the class name from the metadata object in this case.
913 className = ef->className();
914 } else {
916 "Couldn't find an appropriate type with a dictionary for field \""
917 << fieldName << "\"");
918 return StatusCode::FAILURE;
919 }
920 }
921 ::TClass* realClass = ::TClass::GetClass(className.c_str());
922 if (((!realClass) || (!realClass->IsLoaded())) && ef) {
923 // We may need to do an actual schema evolution here, in which
924 // case let's fall back on the class name coming from the metadata
925 // object.
926 className = ef->className();
927 realClass = ::TClass::GetClass(className.c_str());
928 }
929 if ((!realClass) || (!realClass->IsLoaded())) {
930 // Now we're in trouble...
932 "Couldn't find an appropriate type with a dictionary for field \""
933 << fieldName << "\"");
934 return StatusCode::FAILURE;
935 }
936
937 // Make sure that the current object is the "active event":
938#ifndef XAOD_STANDALONE
939 SG::CurrentEventStore::Push save (SG::CurrentEventStore::store());
940#endif
941 setActive();
942
943 // Check if the output already has this object. If it does, let's
944 // assume that we have been copying the object to the output. Which
945 // means that we need to resume filling the same memory address that
946 // the output holder points to.
947 void* ptr = nullptr;
948
949 // Handle the case where an output object with this key already exists.
950 Object_t::const_iterator out_itr = m_outputObjects.find( key );
951 if( out_itr != m_outputObjects.end() ) {
952 // It needs to be an object manager...
953 RObjectManager* mgr =
954 dynamic_cast< RObjectManager* >( out_itr->second.get() );
955 if( ! mgr ) {
956 ATH_MSG_ERROR("Couldn't access output manager for: " << key );
957 return StatusCode::FAILURE;
958 }
959 // Get the pointer out of it:
960 ptr = mgr->holder()->get();
961 }
962
963 // If there is no output object, then let's create one ourselves.
964 // This is the only way in which we can have the memory management of
965 // THolder do the right thing with this object.
966 if (ptr == nullptr) {
967 ptr = realClass->New();
968 }
969
970 // Create the new manager object that will hold this EDM object.
971 auto mgr = std::make_unique<RObjectManager>(
972 m_eventReader->GetView(fieldName, ptr, className), m_entry,
973 std::make_unique<THolder>(ptr, realClass));
974 RObjectManager* mgrPtr = mgr.get();
975 m_inputObjects[key] = std::move(mgr);
976
977 // If it's an auxiliary store object, set it up correctly.
978 if (Details::isAuxStore(*(mgrPtr->holder()->getClass()))) {
980 }
981
982 // If it (probably) has an associated auxiliary store, set it up as well.
983 if (Details::hasAuxStore(*(mgrPtr->holder()->getClass()))) {
985 key + "Aux.", Details::isStandalone(*(mgrPtr->holder()->getClass()))));
986 }
987
988 // Return gracefully.
989 return StatusCode::SUCCESS;
990} // connectObject
#define ATH_MSG_DEBUG(x,...)
std::set< std::string > m_inputMissingObjects
Objects that have been asked for, but were found to be missing in the current input.
Definition Event.h:347
void setActive() const
Set this event object as the currently active one.
Definition EventCore.cxx:65
Object_t m_outputObjects
Collection of all the managed output object.
Definition Event.h:349
::Long64_t m_entry
The entry to look at from the input.
Definition REvent.h:138
StatusCode connectAux(const std::string &prefix, bool standalone) override
Function setting up access to a set of auxiliary branches.
Definition REvent.cxx:1087
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.
save(self, fileName="./columbo.out")
Definition checkTP.py:176

◆ 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,...)
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_ERROR(xmsg,...)
Macro printing error messages.
#define ANA_MSG_INFO(xmsg,...)
Macro printing info messages.
static Double_t rc
static const char *const EVENT_TREE_NAME
Default name of the event TTree.
Definition Event.h:79
static const char *const EVENT_RNTUPLE_NAME
Name of the event RNTuple.
Definition Event.h:80
@ kAthenaAccess
Access containers/objects like Athena does.
@ kClassAccess
Access auxiliary data using the aux containers.
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 316 of file EventCore.cxx.

316 {
317#ifdef XAOD_STANDALONE
318 return Gaudi::Hive::currentContext();
319#else
320 return m_ctx;
321#endif
322}
EventContext m_ctx
The event context associated with this event.
Definition Event.h:410

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

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

◆ fill()

Int_t xAOD::Experimental::REvent::fill ( )
overridevirtualinherited

Method filling one event into the output.

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 623 of file REvent.cxx.

623 {
624
625 // Make sure that all objects have been read in. The 99 as the value
626 // has a special meaning for RAuxStore. With this value it doesn't
627 // delete its transient (decoration) variables. Otherwise it does.
628 // (As it's supposed to, when moving to a new event.)
629 if( m_eventReader ) {
630 if (getEntry( m_entry, 99 ) < 0) {
631 ATH_MSG_ERROR( "getEntry failed!" );
632 return 0;
633 }
634 }
635
636 // Prepare the objects for writing. Note that we need to iterate over a
637 // copy of the m_outputObjects container. Since the putAux(...) function
638 // called inside the loop may itself add elements to the m_outputObject
639 // container.
640 std::string unsetObjects;
641 std::vector<std::pair<std::string, TVirtualManager*>> outputObjectsCopy;
642 outputObjectsCopy.reserve(m_outputObjects.size());
643 for (const auto& [key, mgr] : m_outputObjects) {
644 TVirtualManager* objMgr = dynamic_cast<TVirtualManager*>(mgr.get());
645 if (objMgr == nullptr) {
646 ATH_MSG_ERROR("Internal logic error detected");
647 return 0;
648 }
649 outputObjectsCopy.emplace_back(key, objMgr);
650 }
651 for (auto &[key, mgr] : outputObjectsCopy) {
652
653 ATH_MSG_DEBUG("REvent::fill - checking and adding aux for " << key << ", " << mgr << " isSet " << mgr->isSet());
654
655 // Check that a new object was provided in the event - skip dynamic variables:
656 if ((key.find("AuxDyn") == std::string::npos) && !mgr->isSet()) {
657
658 ATH_MSG_DEBUG("REvent::fill - not set " << key);
659
660 // We are now going to fail. But let's collect the names of
661 // all the unset objects:
662 if (unsetObjects.size()) {
663 unsetObjects += ", ";
664 }
665 unsetObjects.append("\"" + key + "\"");
666 continue;
667 }
668
669 // Make sure that any dynamic auxiliary variables that
670 // were added to the object after it was put into the event
671 // are also added to the output.
672 if( putAux( *mgr ).isFailure() ) {
673 ATH_MSG_ERROR( "Failed to put dynamic auxiliary variables in the output for object \"" << key << "\"" );
674 return 0;
675 }
676 }
677
678 // Check if there were any unset objects:
679 if (unsetObjects.size()) {
680 ATH_MSG_ERROR("The following objects were not set in the current event: "
681 << unsetObjects);
682 return 0;
683 }
684
685 // For the first call to fill, we create an RNTupleWriter with the RNTuple model already accumulated
686 // - there may be extensions for Aux containers which are empty for the first few events
687 ATH_MSG_DEBUG( "REvent::fill - has event writer " << (m_eventWriter.get() != nullptr) );
688
689 if( m_eventWriter.get() == nullptr ) {
690
691 // Set output RNTuple name as model description
692 const char* rnTupleName = EVENT_RNTUPLE_NAME;
693
694 // Create RNTuple write with model
695 m_eventWriter = ROOT::RNTupleWriter::Append(std::move(m_model), rnTupleName, *m_outputFile);
696
697 // Reset the RNTupleModel so that subsequent additions of new fields will be done with model extensions
698 m_model.reset();
699
700 ATH_MSG_DEBUG( "REvent::fill - created writer and reset model " );
701
702 }
703
704 // Get entry for writing
705 auto rnEntry = m_eventWriter->GetModel().CreateBareEntry();
706
707 // Now loop over all object managers and bind the output object pointers
708 // to the those in the output RNTuple
709 ::Int_t nbytes = 0;
710 for (auto &[key, mgr] : m_outputObjects) {
711
712 // Get field name from the key
713 auto fieldName = getFieldNameFromKey(key);
714
715 // Check if this is a container, top-level or aux, rather than a aux variable (AuxDyn):
716 ROutObjManager* omgr = dynamic_cast< ROutObjManager* >( mgr.get() );
717 bool isContainer = (omgr != nullptr);
718
719 ATH_MSG_DEBUG("REvent::fill - bind ptr " << key << " mgr " << mgr << " is set " << mgr->isSet()
720 << ", is container " << isContainer);
721
722 // Save value, if an object has been set, otherwise save default value
723 // Dynamic attributes don't exist for empty containers, e.g. no electrons in an event
724 if (mgr->isSet()) {
725 rnEntry->BindRawPtr(fieldName, mgr->object());
726 } else {
727
728 ATH_MSG_DEBUG("REvent::fill - bind unSet ptr " << key << " mgr " << mgr << " is set " << mgr->isSet()
729 << ", is container " << isContainer);
730
731 rnEntry->EmplaceNewValue(fieldName);
732 }
733 }
734
735 ATH_MSG_DEBUG("REvent::fill - writer fill ");
736
737 // Write the entry, and check the return value:
738 const ::Int_t ret = m_eventWriter->Fill(*rnEntry);
739 if( ret <= 0 ) {
740 ATH_MSG_ERROR( "Output RNTuple filling failed with return value: " << ret );
741 }
742 nbytes += ret;
743
744 ATH_MSG_DEBUG("REvent::fill - writer filled ");
745
746 // Reset the object managers:
747 for (auto &[key, mgr] : m_outputObjects) {
748 mgr->reset();
749
750 ATH_MSG_DEBUG("REvent::fill - after reset " << key << " is set " << mgr->isSet());
751
752 }
753
754 // Return the number of bytes written:
755 return nbytes;
756}
StatusCode putAux(TVirtualManager &mgr, ::Bool_t metadata=kFALSE)
Method saving the dynamically created auxiliary properties.
Definition REvent.cxx:1516
::Int_t getEntry(::Long64_t entry, ::Int_t getall=0) override
Function loading a given entry of the input RNTuple.
Definition REvent.cxx:569
::TFile * m_outputFile
The output file for writing.
Definition REvent.h:147

◆ finishWritingTo()

StatusCode xAOD::Experimental::REvent::finishWritingTo ( TFile & file)
overridevirtualinherited

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
kTRUE if successful, kFALSE otherwise

reset writer (metaDataWriter will be reset when going out of scope)

Implements xAOD::Event.

Definition at line 388 of file REvent.cxx.

388 {
389
390 // A small sanity check for meta data writing - need output file as long as MetaData is in a rntuple:
391 if( m_outputFile != &file ) {
392 ATH_MSG_FATAL("File given to finishWritingTo does not match the file given in writeTo file!");
393 return StatusCode::FAILURE;
394 }
395
396 // Notify the listeners that they should write out their metadata, if they
397 // have any.
398 const TIncident incident( IncidentType::MetaDataStop );
399 for (auto& listener : m_listeners) {
400 listener->handle(incident);
401 }
402
403 // Now go to the output file:
404 m_outputFile->cd();
405
406 const char* outRNTupleName = METADATA_OBJECT_NAME;
407
408 // Check if there's already a metadata tree in the output, if so we can return:
409 if( m_outputFile->Get( outRNTupleName ) ) {
410
411 // Let's assume that the metadata is complete in the file already.
412 ATH_MSG_INFO( "Metadata tree already exists, returning" );
413
414 return StatusCode::SUCCESS;
415 }
416
417 // Write out meta data
418
419 // Create new model for this file
420 auto model = ROOT::RNTupleModel::Create();
421
422 // Set output RNTuple name as model description
423 model->SetDescription(outRNTupleName);
424
425
426 // Create field explicitly for EventFormat
427
428 // Check if we have a dictionary: for this object:
429 std::string typeName = SG::normalizedTypeinfoName( typeid( xAOD::EventFormat ) );
430 TClass* cl = TClass::GetClass( typeName.c_str() );
431 if( ! cl ) {
432 ATH_MSG_ERROR( "Didn't find dictionary for type: " << typeName );
433 return StatusCode::FAILURE;
434 }
435 std::string efName = cl->GetName();
436
437 ATH_MSG_DEBUG("finishWriting");
438
439 model->AddField( ROOT::RFieldBase::Create( "EventFormat", efName ).Unwrap());
440
441 // Loop over output meta data object managers and create the corresponding fields for the output model
442
443 // Make sure that any dynamic auxiliary variables that
444 // were added to the object after it was put into the event,
445 // get added to the output
446
447 // Must copy m_outputMetaObjects because it may be augmented in putAux
448 std::vector<std::pair<std::string, TVirtualManager*>> outputMetaObjects;
449 outputMetaObjects.reserve(m_outputMetaObjects.size());
450 for (const auto& [key, mgr] : m_outputMetaObjects) {
451 TVirtualManager* objMgr = dynamic_cast<TVirtualManager*>(mgr.get());
452 if (objMgr == nullptr) {
453 ATH_MSG_FATAL("Internal logic error detected");
454 return StatusCode::FAILURE;
455 }
456
457 ATH_MSG_DEBUG("finishWriting: save metadata key " << key);
458
459 outputMetaObjects.emplace_back(key, objMgr);
460 }
461
462 // Set up the saving of all the dynamic auxiliary properties
463 // of the object if it has any:
464 for( auto& itr : outputMetaObjects ) {
465 static constexpr bool IS_METADATA = true;
466 ATH_CHECK( putAux( *(itr.second), IS_METADATA ) );
467 }
468
469 // Now create fields for each output metadata object
470 for (auto &[key, mgr] : m_outputMetaObjects) {
471
472 // Get field name and class name to create a RFieldBase
473 std::string fieldName;
474 std::string className;
475 if (getInfoForFieldCreation( key, *mgr, fieldName, className ).isFailure()) return StatusCode::FAILURE;
476
477 // should have found class name
478 if ( className.empty() ) {
479 ATH_MSG_ERROR( "could not find className!" );
480 return StatusCode::FAILURE;
481 }
482
483 // Add RFieldBase to model
484 model->AddField( ROOT::RFieldBase::Create( fieldName, className ).Unwrap());
485
486 }
487
488 // Create RNTuple write for meta data with model
489 auto metaDataWriter = ROOT::RNTupleWriter::Append(std::move(model), outRNTupleName, *m_outputFile);
490
491
492 // Get entry for writing
493 auto rnEntry = metaDataWriter->GetModel().CreateBareEntry();
494
495 // Now loop over all object managers and bind the output object pointers
496 // to the those in the output metadata RNTuple
497 for (auto &[key, mgr] : m_outputMetaObjects) {
498
499 // Get field name from the key
500 auto fieldName = getFieldNameFromKey(key);
501
502 // Save value, if exist, otherwise save default value
503 if (mgr.get()) {
504 rnEntry->BindRawPtr(fieldName, mgr->object());
505 } else {
506 rnEntry->EmplaceNewValue(fieldName);
507 }
508 }
509
510 // Add EventFormat to the RNEntry
511 rnEntry->BindRawPtr( "EventFormat", m_outputEventFormat );
512
513 // Write the entry, and check the return value:
514 const ::Int_t ret = metaDataWriter->Fill(*rnEntry);
515 if( ret <= 0 ) {
516 ATH_MSG_FATAL( "Output rntuple filling failed with return value: " << ret );
517 }
518 else {
519 ATH_MSG_INFO( "Output meta data rntuple filled. nbytes = " << ret );
520 }
521
522 // Now clean up:
523
524 // reset output EventFormat
526 m_outputObjects.clear();
527 m_outputMetaObjects.clear();
528
529 rnEntry.reset();
530
532 m_eventWriter.reset();
533
534 metaDataWriter.reset();
535
536 // Return gracefully:
537 return StatusCode::SUCCESS;
538} // finishWriting
#define ATH_MSG_INFO(x,...)
static const char *const METADATA_OBJECT_NAME
Name of the metadata tree or RNTuple.
Definition Event.h:81
EventFormat * m_outputEventFormat
Format of the current output file.
Definition Event.h:359
Object_t m_outputMetaObjects
Collection of all the managed output meta-objects.
Definition Event.h:354
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
TFile * file

◆ getBranchInfo()

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

Get the object describing one object/branch.

Definition at line 356 of file EventIProxyDict.cxx.

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

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 543 of file REvent.cxx.

543 {
544
545 if (m_eventReader) {
546 return m_eventReader->GetNEntries();
547 } else if (m_inputNTupleIsMissing) {
548 return 0u;
549 } else {
550 ATH_MSG_ERROR("Function called on an uninitialised object");
551 return 0u;
552 }
553}
bool m_inputNTupleIsMissing
Whether the input has an event RNTuple or not.
Definition REvent.h:133
@ u
Enums for curvilinear frames.
Definition ParamDefs.h:77

◆ getEntry()

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

Function loading a given entry of the input RNTuple.

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

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

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

Parameters
entryThe entry from the input RNtuple 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 569 of file REvent.cxx.

569 {
570
571 // A little sanity check:
572 if (!m_eventReader) {
573 ATH_MSG_ERROR("Function called on an uninitialised object");
574 return -1;
575 }
576
577 // Check if anything needs to be done.
578 if (entry == m_entry) {
579 ATH_MSG_DEBUG("Entry " << entry << " is already the active one");
580 return 0;
581 }
582
583 // Set entry value
584 m_entry = entry;
585
586 // Stats counter needs to know it's the next event.
588
589 // Loop over all input object managers, and force them to load their
590 // content. But only if getall was used.
591 ::Int_t result = 0;
592 if (getall) {
593 for (auto& [key, inObj] : m_inputObjects) {
594 result += inObj->getEntry(getall);
595 }
596 }
597
598 // Notify the listeners that a new event was loaded.
599 const TIncident incident(IncidentType::BeginEvent);
600 for (TVirtualIncidentListener* listener : m_listeners) {
601 listener->handle(incident);
602 }
603
604 // Return the number of bytes read.
605 return result;
606}
void nextEvent()
Function incrementing the processed event counter.
static const ::Int_t BeginEvent
A new event was just loaded.
Definition TIncident.h:29

◆ getEventFormatElement()

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

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

Definition at line 330 of file EventIProxyDict.cxx.

331 {
332
333 const xAOD::EventFormatElement* efe = nullptr;
334 static const bool QUIET = true;
336 efe = m_outputEventFormat->get(sgkey, QUIET);
337 }
338 if (!efe) {
339 efe = m_inputEventFormat.get(sgkey, QUIET);
340 }
341 if (!efe) {
342 static SG::SGKeySet missingSGKeys ATLAS_THREAD_SAFE;
343 static mutex_t mutex;
344 guard_t lock(mutex);
345 if (missingSGKeys.emplace(sgkey).second) {
348 "Can't find EventFormatElement for hashed SG key: " << sgkey);
349 }
350 return 0;
351 }
352 }
353 return efe;
354}
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.

◆ 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 static constexpr bool QUIET = true;
37 if (const EventFormatElement* efe = m_inputEventFormat.get(key, QUIET)) {
38 return efe->hash();
39 }
40
41 // If it's a new key, make a new hash for it from scratch:
42 return Utils::hash(key);
43}
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 281 of file EventIO.cxx.

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

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

◆ 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 52 of file EventTVirtualEvent.cxx.

52 {
53
54 // Make use of the getName function.
55 return getHash(getName(obj));
56}
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 65 of file EventTVirtualEvent.cxx.

65 {
66
67 // Check the active TStore first, its pointer lookup is cheap.
68 const TStore* store = TActiveStore::store();
69 if (store && store->contains(obj)) {
70 return store->getName(obj);
71 }
72
73 // Then look among the output objects.
74 for (const auto& [key, manager] : m_outputObjects) {
75 // Check if this is our object.
76 if (manager->object() == obj) {
77 // If it is, let's return right away.
78 return key;
79 }
80 }
81
82 // Now look among the input objects.
83 for (const auto& [key, manager] : m_inputObjects) {
84 // Check if this is our object.
85 if (manager->object() == obj) {
86 // If it is, let's return.
87 return key;
88 }
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 static constexpr bool QUIET = true;
109 if (const EventFormatElement* efe = m_inputEventFormat.get(hash, QUIET)) {
110 return efe->branchName();
111 }
112
113 // If the branch is known on the output:
114 if (const EventFormatElement* efe =
115 (m_outputEventFormat ? m_outputEventFormat->get(hash, QUIET)
116 : nullptr)) {
117 return efe->branchName();
118 }
119
120 // If this is an object in the active store:
121 const TStore* store = TActiveStore::store();
122 if (store && store->contains(hash)) {
123 return store->getName(hash);
124 }
125
126 // If it is unknown:
127 static const std::string dummy;
128 return dummy;
129}

◆ getNames()

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

Function determining the list keys associated with a type name.

Implements xAOD::Event.

Definition at line 759 of file REvent.cxx.

761 {
762
763 // The results go in here
764 std::set<std::string> keys;
765
766 // Get list of fields from
767 // the input metadata tree or input tree
768
769 ROOT::RNTupleReader* reader = (metadata) ? m_metaReader.get() : m_eventReader.get();
770 if (reader == nullptr) {
771 ATH_MSG_ERROR("No input file is connected");
772 return StatusCode::FAILURE;
773 }
774 if (metadata) ATH_MSG_DEBUG("scanning input objects for metadata for type name " << targetClassName);
775 else ATH_MSG_DEBUG("scanning input objects for event data for type name " << targetClassName);
776
777 // add in names for all top level fields
778 for (const auto &topLevelField : reader->GetDescriptor().GetTopLevelFields()) {
779 std::string objClassName = topLevelField.GetTypeName();
780 std::string key = topLevelField.GetFieldName();
781 if (objClassName == targetClassName) {
782 ATH_MSG_VERBOSE("Matched " << targetClassName << " to key " << key);
783 keys.insert(std::move(key));
784 }
785 }
786
787 // check output objects
788 if (m_eventWriter && !metadata){
789 ATH_MSG_DEBUG("scanning output objects for type name " << targetClassName);
790 // add in names for all top level fields
791 for (const auto& topLevelFieldName : m_eventWriter->GetModel().GetRegisteredSubfieldNames()) {
792 auto& topLevelField = m_eventWriter->GetModel().GetConstField(topLevelFieldName);
793 std::string objClassName = topLevelField.GetTypeName();
794 std::string key = topLevelField.GetFieldName();
795 ATH_MSG_VERBOSE("Inspecting " << objClassName << "/" << key);
796 if (objClassName == targetClassName) {
797 ATH_MSG_VERBOSE("Matched " << targetClassName << " to key " << key);
798 keys.insert(std::move(key));
799 }
800 }
801 }
802
803 const Object_t& outAux = ( metadata ?
805
806 // Search though EventFormat for entries where class matches the provided
807 // typeName
808
809 ATH_MSG_DEBUG("scanning output Aux objects for type name " << targetClassName);
810
811 for( const auto& object : outAux ) {
812 // All metadata objects should be held by ROutObjManager objects.
813 // Anything else is an error.
814 std::string objClassName;
815 if ( metadata ) {
816 ROutObjManager* mgr = dynamic_cast< ROutObjManager* >( object.second.get() );
817 if ( ! mgr ) continue;
818 objClassName = mgr->holder()->getClass()->GetName();
819 }
820 const std::string& key = object.first;
821 ATH_MSG_VERBOSE("Inspecting " << objClassName << "/" << key);
822 if (objClassName == targetClassName) {
823 ATH_MSG_VERBOSE("Matched " << targetClassName << " to key " << key);
824 keys.insert(std::move(key));
825 }
826 }
827
828 vkeys.insert(vkeys.end(), keys.begin(), keys.end());
829
830 return StatusCode::SUCCESS;
831}
reader
read the goodrunslist xml file(s)
Definition collisions.py:22

◆ 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. (getAs fails for const objects, and wrong types.)
234 const TStore* store = TActiveStore::store();
235 const THolder* holder = (store ? store->holder(key) : nullptr);
236 static constexpr bool SILENT = true;
237 return (holder ? holder->getAs(ti, SILENT) : nullptr);
238 } else {
239 // For metadata we don't use external resources.
240 return nullptr;
241 }
242 }
243
244 // If the object is not set in this event yet, we can't continue:
245 if (itr->second->isSet() == false) {
246 return nullptr;
247 }
248
249 // If it does exist, check if it's the right kind of object:
250 Details::IObjectManager* mgr =
251 dynamic_cast<Details::IObjectManager*>(itr->second.get());
252 if (mgr == nullptr) {
253 ATH_MSG_ERROR("Object of wrong type found for key \"" << key << "\"");
254 return nullptr;
255 }
256
257 // Ask the holder object for the object of this type:
258 void* result = mgr->holder()->getAs(ti);
259 if (result == nullptr) {
260 ATH_MSG_WARNING("Couldn't retrieve object as \""
261 << SG::normalizedTypeinfoName(ti) << "\"");
262 return nullptr;
263 }
264
265 // Return the object:
266 return result;
267}

◆ 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 141 of file EventTVirtualEvent.cxx.

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

◆ hasInput()

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

Check if an input file is connected to the object.

Implements xAOD::Event.

Definition at line 608 of file REvent.cxx.

608 {
609
611}

◆ hasOutput()

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

Check if an output file is connected to the object.

Implements xAOD::Event.

Definition at line 613 of file REvent.cxx.

613 {
614 return (m_outputFile != nullptr);
615}

◆ 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)
int outputLevel(const IMessageSvc *ims, const std::string &source)

◆ initStats()

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

Function to initialise the statistics for all RNTuple content.

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

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

Returns
The usual StatusCode values

Definition at line 1742 of file REvent.cxx.

1742 {
1743
1744 // A little sanity check.
1745 if (!m_eventReader) {
1746 ATH_MSG_ERROR("Function called on an uninitialised object");
1747 return StatusCode::FAILURE;
1748 }
1749
1750 // Reset the number of input branches information.
1752
1753 // Loop over the EventFormat information.
1754 for (const auto& [key, format] : m_inputEventFormat) {
1755
1756 ATH_MSG_DEBUG("Investigating object \"" << key << "\" of class \""
1757 << format.className() << "\"");
1758
1759 // If it's an auxiliary container, scan it using RAuxStore.
1760 if (key.ends_with("Aux.")) {
1761
1762 // But first decide whether it describes a container, or just
1763 // a single object. For that, first get the class that it was
1764 // written with.
1765 TClass* cl = TClass::GetClass(format.className().c_str());
1766 if ((cl == nullptr) || (cl->IsLoaded() == false)) {
1768 "Couldn't find the dictionary for type: " << format.className());
1769 continue;
1770 }
1771
1772 // And then check if it inherits from xAOD::AuxInfoBase.
1773 // If so, consider this standalone, otherwise a container.
1774 static TClass* const auxInfoCl = TClass::GetClass(
1775 SG::normalizedTypeinfoName(typeid(xAOD::AuxInfoBase)).c_str());
1776 if (auxInfoCl == nullptr) {
1777 ATH_MSG_ERROR("Couldn't get dictionary for xAOD::AuxInfoBase");
1778 return StatusCode::FAILURE;
1779 }
1780 const bool isInfo = cl->InheritsFrom(auxInfoCl);
1781 ATH_MSG_VERBOSE("isInfo = {}", isInfo);
1782
1783 // Scan the branches using a temporary RAuxStore instance.
1784 const std::string fieldName =
1785 Utils::getFieldName(m_eventReader->GetDescriptor(), key);
1789 static constexpr bool TOP_STORE = true;
1790 RAuxStore temp(this->currentContext(), fieldName, TOP_STORE, mode);
1791 ATH_CHECK(temp.readFrom(*m_eventReader));
1792
1793 // Add all the auxids to the statistics object:
1794 ReadStats& stats = IOStats::instance().stats();
1795 for (SG::auxid_t id : temp.getAuxIDs()) {
1796 stats.branch(fieldName, id);
1797 }
1798
1799 // Increment the number of known branches.
1800 stats.setBranchNum(stats.branchNum() + temp.getAuxIDs().size());
1801 }
1802 // If it's an interface container.
1803 else {
1804 // Check if it's part of the input ntuple.
1805 const ROOT::RNTupleDescriptor& descriptor =
1806 m_eventReader->GetDescriptor();
1807 if (descriptor.FindFieldId(Utils::getFieldName(descriptor, key)) !=
1808 ROOT::kInvalidDescriptorId) {
1810 }
1811 }
1812 }
1813
1814 // Return gracefully:
1815 return StatusCode::SUCCESS;
1816}
const EventContext & currentContext() const
Return the event context corresponding to this event.
BranchStats * container(const std::string &name)
Access the description of a container. Creating it if necessary.
void setBranchNum(::Int_t num)
Set the total number of branches on the input.
EStructMode
"Structural" modes of the object
@ kObjectStore
The object describes a single object.
@ kContainerStore
The object describes an entire container.
size_t auxid_t
Identifier for a particular aux data item.
Definition AuxTypes.h:27

◆ inputEventFormat()

const EventFormat * Event::inputEventFormat ( ) const
inherited

Get information about the input objects.

Definition at line 240 of file EventCore.cxx.

240 {
241
242 if (hasInput()) {
243 return &m_inputEventFormat;
244 }
245 return nullptr;
246}

◆ 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 303 of file EventIProxyDict.cxx.

303 {
304
305 return &(getName(key));
306}

◆ 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 308 of file EventIProxyDict.cxx.

308 {
309
310 return &(getName(key));
311}

◆ loadInputObjects()

StatusCode REventClass::loadInputObjects ( )
inline

Function loading all interface objects of the event.

Definition at line 42 of file xAODRNFileReadTest.cxx.

42 {
43 // Get the event format object:
44 const xAOD::EventFormat* ef = this->inputEventFormat();
45 if( ! ef ) {
46 return StatusCode::FAILURE;
47 }
48 // Loop over the objects of the file:
49 for( const auto & ef_itr : *ef ) {
50 // A helper object:
51 const xAOD::EventFormatElement& efe = ef_itr.second;
52 // Skip auxiliary objects:
53 if( efe.branchName().rfind( "Aux." ) ==
54 ( efe.branchName().size() - 4 ) ) {
55 continue;
56 }
57 // And dynamic variables:
58 if( efe.parentName() != "" ) {
59 continue;
60 }
61 // Skip auxiliary stores with non-standard names:
62 ::TClass* cl = ::TClass::GetClass( efe.className().c_str(), kTRUE,
63 kTRUE );
64 if( ! cl ) continue;
65 if( cl->InheritsFrom( "SG::IConstAuxStore" ) ) {
66 continue;
67 }
68 // Get the type of the branch:
69 const std::type_info* ti = cl->GetTypeInfo();
70 if( ! ti ) {
71 ::Warning( "REventClass::loadInputObjects",
72 "Couldn't find std::type_info object for type %s "
73 "(key=%s)", cl->GetName(), efe.branchName().c_str() );
74 continue;
75 }
76 // Check if the branch exists in the file:
77 static constexpr bool METADATA = false;
78 if( ! this->contains( efe.branchName(), *ti, METADATA ) ) {
79 continue;
80 }
81 // Try to load the object/container:
82 static constexpr bool SILENT = false;
83 if( ! this->getInputObject( efe.branchName(), *ti, SILENT, METADATA ) ) {
84 Error( "REventClass::loadInputObjects",
85 XAOD_MESSAGE( "Couldn't load object: %s" ),
86 efe.branchName().c_str() );
87 return StatusCode::FAILURE;
88 }
89 }
90 // Return gracefully:
91 return StatusCode::SUCCESS;
92 }
#define XAOD_MESSAGE(MESSAGE)
Simple macro for printing error/verbose messages.
const std::string & parentName() const
Get the name of the parent auxiliary object.
const std::string & className() const
Get the class name of this branch/key.
const EventFormat * inputEventFormat() const
Get information about the input objects.
Error
The different types of error that can be flagged in the L1TopoRDO.
Definition Error.h:16

◆ 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 324 of file EventIProxyDict.cxx.

324 {
325
326 static const std::string result{"xAOD::Event"};
327 return result;
328}

◆ outputEventFormat()

const EventFormat * Event::outputEventFormat ( ) const
inherited

Get information about the output objects.

Definition at line 248 of file EventCore.cxx.

248 {
249
250 return m_outputEventFormat;
251}

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

310 {
311
312 // Simply do this via the xAODCore code:
313 IOStats::instance().stats().Print("Summary");
314}
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 213 of file EventCore.cxx.

213 {
214
215 // Print a header.
216 ATH_MSG_INFO("Name remapping rules:");
217
218 // In case no remapping rules have been set.
219 if (m_nameRemapping.empty()) {
220 ATH_MSG_INFO(" NONE");
221 return;
222 }
223
224 // Otherwise.
225 for (const auto& [newName, onfile] : m_nameRemapping) {
226 ATH_MSG_INFO(" \"" << newName << "\" -> \"" << onfile << "\"");
227 }
228}

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

235 {
236
238}

◆ proxies()

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

return the list of all current proxies in store

Definition at line 284 of file EventIProxyDict.cxx.

284 {
285
287
288 std::vector<const SG::DataProxy*> ret;
289 for (const auto& p : m_branches) {
290 const SG::DataProxy* proxy = p.second.m_proxy.get();
291 if (proxy) {
292 ret.push_back(proxy);
293 }
294 }
295 return ret;
296}

◆ 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 219 of file EventIProxyDict.cxx.

219 {
220
221 const SG::sgkey_t sgkey = getHash(key);
222 if (!sgkey) {
223 return 0;
224 }
225 return proxy_exact(sgkey);
226}
SG::DataProxy * proxy_exact(SG::sgkey_t sgkey) const override
Get proxy given a hashed key+clid.

◆ 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 191 of file EventIProxyDict.cxx.

191 {
192
193 // Look up the name of this object
194 std::string name = getName(pTransient);
195 if (name.empty()) {
196 // Apparently the object is not known...
197 return nullptr;
198 }
199
200 // Get the metadata object for it:
201 const xAOD::EventFormatElement* efe = 0;
202 static const bool QUIET = true;
204 efe = m_outputEventFormat->get(name, QUIET);
205 }
206 if (!efe) {
207 efe = m_inputEventFormat.get(name, QUIET);
208 }
209 if (!efe) {
210 // No metadata found...
211 return nullptr;
212 }
213
214 // Return the proxy:
215 const BranchInfo* bi = getBranchInfo(efe->hash());
216 return bi->m_proxy.get();
217}
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 228 of file EventIProxyDict.cxx.

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

◆ putAux()

StatusCode xAOD::Experimental::REvent::putAux ( TVirtualManager & vmgr,
::Bool_t metadata = kFALSE )
privateinherited

Method 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.) The first time an aux store variable is encountered, an RAuxFieldManager is created to manage it. And for each call, the manager holder is set to point to the aux variable. Note: this may be called when recording an aux container, but new aux variables may be created up to a call to fill One also needs to keep track of empty aux containers on the first event to allow to add in the aux fields to the RNTuple model for the next event which has a non-empty container

Parameters
mgrThe object manager of the output object
metadataFlag specifying whether the info written is metadata or not
Returns
kTRUE if the setup was successful, or kFALSE if it was not

Add field to RNTuple model

Definition at line 1516 of file REvent.cxx.

1516 {
1517
1518 // A little sanity check:
1519 assert( m_outputEventFormat != 0 );
1520
1521 // Do the conversion:
1522 ROutObjManager* mgr = dynamic_cast< ROutObjManager* >( &vmgr );
1523
1524 ATH_MSG_DEBUG("REvent::putAux - vmgr " << mgr);
1525
1526 if( ! mgr ) {
1527 // It's not an error any more when we don't get a ROutObjManager.
1528 return StatusCode::SUCCESS;
1529 }
1530
1531 // Check if this class has an auxiliary store, if not nothing needs to be done:
1532 if( ! mgr->holder()->getClass()->InheritsFrom( "SG::IAuxStoreIO" ) ) {
1533
1534 ATH_MSG_DEBUG("REvent::putAux - no Aux store ");
1535
1536 return StatusCode::SUCCESS;
1537 }
1538
1539 // Get a pointer to the auxiliary store I/O interface:
1540 SG::IAuxStoreIO* aux = reinterpret_cast< SG::IAuxStoreIO* >(mgr->holder()->getAs( typeid( SG::IAuxStoreIO ) ) );
1541 if( ! aux ) {
1542 ATH_MSG_FATAL( "There is a logic error in the code!" );
1543 }
1544
1545 // Check if we have rules defined for which auxiliary properties
1546 // to write out:
1547 xAOD::AuxSelection sel;
1548 if( ! metadata ) {
1549 auto item_itr = m_auxItemList.find( mgr->key() );
1550 if( item_itr != m_auxItemList.end() ) {
1551 sel.selectAux( item_itr->second );
1552 }
1553 }
1554
1555 // Get the dynamic auxiliary variables held by this object, which
1556 // were selected to be written:
1557 const SG::auxid_set_t auxids = sel.getSelectedAuxIDs (aux->getSelectedAuxIDs());
1558
1559 // Decide what should be the prefix of all the dynamic branches:
1560 const std::string dynNamePrefix = Utils::dynBranchPrefix( mgr->key() );
1561
1562 ATH_MSG_DEBUG("REvent::putAux - dynNamePrefix " << dynNamePrefix);
1563
1564
1565 // Select which container to add the variables to:
1567
1568 // RDS: is the following needed in an RNTuple?
1569 // This iteration will determine the ordering of branches within
1570 // the tree, so sort auxids by name.
1571 const SG::AuxTypeRegistry& r = SG::AuxTypeRegistry::instance();
1572 typedef std::pair< std::string, SG::auxid_t > AuxVarSort_t;
1573 std::vector< AuxVarSort_t > varsort;
1574 varsort.reserve( auxids.size() );
1575 for( SG::auxid_t id : auxids ) {
1576 varsort.emplace_back( r.getName( id ), id );
1577 }
1578 std::sort( varsort.begin(), varsort.end() );
1579
1580 // Extract all the dynamic variables from the object:
1581 for( const auto& p : varsort ) {
1582
1583 // The auxiliary ID:
1584 const SG::auxid_t id = p.second;
1585
1586 // Construct a dynamic key name for the field that we will write:
1587 const std::string dynKey = dynNamePrefix + p.first;
1588
1589 ATH_MSG_DEBUG("REvent::putAux - id, dynKey " << id << ", " << dynKey);
1590
1591
1592 // Try to find the object manager:
1593 Object_t::iterator bmgr = objects.find( dynKey );
1594
1595 // Check if we already know about this variable:
1596 if( bmgr == objects.end() ) {
1597 // Construct the full type name of the variable:
1598 const std::type_info* brType = aux->getIOType( id );
1599 if( ! brType ) {
1600 ATH_MSG_FATAL( "No I/O type found for variable " << dynKey );
1601 return StatusCode::FAILURE;
1602 }
1603 const std::string brTypeName = Utils::getTypeName( *brType );
1604 std::string brProperTypeName = "<unknown>";
1605
1606 // Check if it's a primitive type or not:
1607 bool isPrimitive = false;
1608 TVirtualManager* outmgrPtr = nullptr;
1609
1610 if( strlen( brType->name() ) == 1 ) {
1611 isPrimitive = true;
1612
1613 ATH_MSG_DEBUG("REvent::putAux - primitive " << id << ", " << brTypeName << " brType name " << brType->name());
1614
1615
1616 // Making the "proper" type name is simple in this case:
1617 brProperTypeName = std::move(brTypeName);
1618
1619 // Let's create an RAuxFieldManager for this property:
1620 static constexpr bool IS_OWNER = false;
1621 auto auxmgr = std::make_unique<RAuxFieldManager>(
1622 std::make_unique<THolder>(aux->getIOData( id ), *brType, IS_OWNER), isPrimitive );
1623 outmgrPtr = auxmgr.get();
1624
1625 objects[ dynKey ] = std::move(auxmgr);
1626
1627 } else {
1628
1629 ATH_MSG_DEBUG("REvent::putAux - not primitive " << id << ", " << brTypeName);
1630
1631 // Check if we have a dictionary for this type:
1632 TClass* cl = TClass::GetClass( *brType, kTRUE, kTRUE );
1633 if( ! cl ) {
1634 // The dictionary needs to be loaded now. This could be an
1635 // issue. But let's hope for the best...
1636 cl = TClass::GetClass( brTypeName.c_str() );
1637 // If still not found...
1638 if( ! cl ) {
1639 ATH_MSG_FATAL( "Dictionary not available for variable \"" << dynKey
1640 << "\" of type \"" << brTypeName << "\"" );
1641 return StatusCode::FAILURE;
1642 }
1643 }
1644
1645 // The proper type name comes from the dictionary in this case:
1646 brProperTypeName = cl->GetName();
1647
1648 // Let's create an RAuxFieldManager for this property - not a primitive:
1649 static constexpr bool IS_OWNER = false;
1650 auto auxmgr = std::make_unique<RAuxFieldManager>(
1651 std::make_unique<THolder>(aux->getIOData( id ), cl, IS_OWNER), isPrimitive );
1652 outmgrPtr = auxmgr.get();
1653 objects[ dynKey ] = std::move(auxmgr);
1654 }
1655
1656 // For event data, add in the the new fields to the RNTuple model and event format metadata
1657 if (!metadata) {
1658
1660 ATH_CHECK( addField(dynKey, *outmgrPtr) );
1661
1662 // If all went fine, let's add this branch to the event format
1663 // metadata (but not for regular metadata):
1664 if( ! m_outputEventFormat->exists( dynKey ) ) {
1666 EventFormatElement( dynKey,
1667 brProperTypeName,
1668 mgr->key(),
1669 getHash( dynKey ) ) );
1670 }
1671 }
1672
1673 // We don't need to do the rest:
1674 continue;
1675 }
1676
1677 ATH_MSG_DEBUG("REvent::putAux - setObj " << dynKey);
1678
1679 // Access the object manager:
1680 bmgr = objects.find( dynKey );
1681 if( bmgr == objects.end() ) {
1682 ATH_MSG_FATAL( "There is an internal logic error in the code..." );
1683 }
1684 // Replace the managed object:
1685 void* nc_data ATLAS_THREAD_SAFE = // we hold non-const pointers but check on retrieve
1686 const_cast< void* >( static_cast< const void* >( aux->getIOData( id ) ) );
1687 bmgr->second->setObject( nc_data );
1688 }
1689
1690 // Return gracefully:
1691 return StatusCode::SUCCESS;
1692}
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:362
StatusCode addField(const std::string &key, const TVirtualManager &mgr)
Add field to RNTuple model given the StoreGate key and output object manager.
Definition REvent.cxx:1696
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.
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...
std::string getTypeName(const std::type_info &ti)
This function is necessary in order to create type names that ROOT can understand.

◆ readFrom() [1/2]

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

Set up the reading of an input file via a file name.

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

This can be considered the 'native' interface as an RNTupleReader opens a file with a name

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

Parameters
fileNamename of file needed for metadata access

Definition at line 176 of file REvent.cxx.

176 {
177
178 ATH_MSG_INFO("REvent::readFrom: fileName " << fileName);
179
180 // Set up the file access tracer.
182
183 // Clear the cached input objects.
184 m_inputObjects.clear();
185 m_inputMissingObjects.clear();
186 m_inputMetaObjects.clear();
187 {
189 lock.upgrade();
190 m_branches.clear();
191 }
192 m_eventReader.reset();
193
194 // Reset the internal flags.
195 m_entry = -1;
197
198 // Clear out the current object.
200
201
202 ATH_MSG_DEBUG("Create RNTupleReader for \"" << METADATA_OBJECT_NAME
203 << "\" in file: " << fileName);
204
205 // Set up a reader for the metadata ntuple.
206 // Since some types are non-xAOD types and so not 'visible' when running in AnalysisBase
207 // we need to protect for unknown types with SetEmulateUnknownTypes(true)
208 ROOT::RNTupleDescriptor::RCreateModelOptions opts;
209 opts.SetEmulateUnknownTypes(true);
210 m_metaReader = ROOT::RNTupleReader::Open(opts, METADATA_OBJECT_NAME, fileName);
211 if (!m_metaReader) {
212 ATH_MSG_ERROR("Couldn't find \"" << METADATA_OBJECT_NAME
213 << "\" tree in input file: " << fileName);
214 return StatusCode::FAILURE;
215 }
216 ATH_MSG_DEBUG("Created RNTupleReader for \"" << METADATA_OBJECT_NAME
217 << "\" in file: " << fileName);
218
219 // Make sure that the xAOD::EventFormat dictonary is loaded.
220 // This may not be the case if streamer information reading is turned
221 // off.
222 static const std::string eventFormatTypeName =
224 if (::TClass::GetClass(eventFormatTypeName.c_str()) == nullptr) {
225 ATH_MSG_WARNING("Couldn't load the EventFormat dictionary");
226 }
227 ATH_MSG_VERBOSE("Loaded the xAOD::EventFormat dictionary");
228
229 // Helper lambda for collecting the event format metadata from an RNTuple
230 // with a given name.
231 auto readEventFormatMetadata = [&](std::string_view tupleName) -> StatusCode {
232 // Set up a reader. This may technically be the same as m_metaReader, but
233 // it's easier to write the code this way.
234 auto metaReader = ROOT::RNTupleReader::Open(tupleName, fileName);
235 if (!metaReader) {
236 ATH_MSG_ERROR("Couldn't find \""
237 << tupleName << "\" ntuple in input file: " << fileName);
238 return StatusCode::FAILURE;
239 }
240 ATH_MSG_VERBOSE("Created temporary RNTupleReader for \""
241 << tupleName << "\" in file: " << fileName);
242
243 // Try to read in the event format metadata.
244 const std::string eventFormatFieldName =
245 getFirstFieldMatch(*m_metaReader, "EventFormat");
246 try {
247 // Add its elements to m_inputEventFormat.
248 auto ef = m_metaReader->GetView<xAOD::EventFormat>(eventFormatFieldName);
249 for (const auto& [key, element] : ef(0u)) {
250 m_inputEventFormat.add(element);
251 }
252 } catch (const ROOT::RException&) {
253 ATH_MSG_WARNING("Input file provides no event or metadata");
254 return StatusCode::RECOVERABLE;
255 }
256 ATH_MSG_VERBOSE("Merged event format metadata from \"" << tupleName
257 << "\" ntuple");
258
259 // Return gracefully.
260 return StatusCode::SUCCESS;
261 };
262
263 // Read in the metadata from the "main" metadata ntuple.
264 const StatusCode sc = readEventFormatMetadata(METADATA_OBJECT_NAME);
265 if (sc.isRecoverable()) {
267 return StatusCode::SUCCESS;
268 }
269 ATH_CHECK(sc);
270
271 // List all the other Metadata RNTuples in the input file.
272 // Having several metadata tuples can happen for augmented files
273 // as one metadata tree per stream is produced.
274 std::set<std::string> lOtherMetaTupleNames;
275 {
276 std::unique_ptr<TFile> inFile(TFile::Open(fileName.data(), "READ"));
277 TList* lKeys = inFile->GetListOfKeys();
278 if (lKeys == nullptr) {
279 ATH_MSG_ERROR("Could not get list of keys for input file: " << fileName);
280 return StatusCode::FAILURE;
281 }
282 for (const TObject* obj : *lKeys) {
283 const std::string keyName = obj->GetName();
284 // Make sure the key corresponds to a metadata ntuple but
285 // do not add the current metadata tree in the list of other trees
286 // and do not add the metadata tree handlers to the list
287 if ((keyName != METADATA_OBJECT_NAME) &&
288 (keyName.find("MetaData") != std::string::npos) &&
289 (keyName.find("MetaDataHdr") == std::string::npos)) {
290 // Make sure key corresponds to an RNTuple
291 const TKey* key = dynamic_cast<const TKey*>(obj);
292 if (key == nullptr) {
293 ATH_MSG_ERROR("Object describing \"" << keyName << "\" in file \""
294 << fileName
295 << "\" is not a TKey?");
296 return StatusCode::FAILURE;
297 }
298 const char* className = key->GetClassName();
299 static constexpr bool LOAD = kFALSE;
300 static constexpr bool SILENT = kTRUE;
301 ::TClass* cl = ::TClass::GetClass(className, LOAD, SILENT);
302 if ((cl != nullptr) && cl->InheritsFrom(ROOT::RNTuple::Class())) {
303 lOtherMetaTupleNames.insert(std::move(keyName));
304 }
305 }
306 }
307 }
308
309 // Read in the metadata from any additonal NTuples found (if any).
310 for (const std::string& tupleName : lOtherMetaTupleNames) {
311 ATH_CHECK(readEventFormatMetadata(tupleName));
312 }
313
314 // Set up the main ntuple reader.
315 // Files written by Athena also store non-xAOD types (e.g. DataHeader_p6) in the
316 // event ntuple, so protect for unknown types the same way as for the metadata
317 m_eventReader = ROOT::RNTupleReader::Open(opts, EVENT_RNTUPLE_NAME, fileName);
318 if (!m_eventReader) {
319 ATH_MSG_ERROR("Couldn't access RNTuple \"" << EVENT_RNTUPLE_NAME
320 << "\" in file: " << fileName);
321 return StatusCode::FAILURE;
322 }
323 ATH_MSG_DEBUG("Created RNTupleReader for \"" << EVENT_RNTUPLE_NAME
324 << "\" in file: " << fileName);
325
326 // Init the statistics collection.
328 // Update the event counter in the statistics object:
329 xAOD::ReadStats& stats = IOStats::instance().stats();
330 stats.setNEvents(stats.nEvents() + m_eventReader->GetNEntries());
331
332 // Notify the listeners that a new file was opened:
333 const TIncident beginIncident(IncidentType::BeginInputFile);
334 for (TVirtualIncidentListener* listener : m_listeners) {
335 listener->handle(beginIncident);
336 }
337 // For now implement a very simple scheme in which we claim already
338 // at the start that the entire file was processed. Since we have no way
339 // of ensuring that the user indeed does this. And we can't delay calling
340 // this function, as the user may likely close his/her output file before
341 // closing the last opened input file.
342 const TIncident endIncident(IncidentType::EndInputFile);
343 for (TVirtualIncidentListener* listener : m_listeners) {
344 listener->handle(endIncident);
345 }
346
347 // The initialisation was successful:
348 return StatusCode::SUCCESS;
349}
StatusCode initStats()
Function to initialise the statistics for all RNTuple content.
Definition REvent.cxx:1742
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

◆ readFrom() [2/2]

StatusCode xAOD::Experimental::REvent::readFrom ( TFile & inFile)
overridevirtualinherited

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

Implementation of interface method taking a TFile object. Forwards to the method with a string view below.

Implements xAOD::Event.

Definition at line 165 of file REvent.cxx.

165 {
166 ATH_CHECK(readFrom(inFile.GetName()));
167 return StatusCode::SUCCESS;
168}
StatusCode readFrom(TFile &inFile) override
Set up the reading of an input file from TFile This method implements the interface from Event.
Definition REvent.cxx:165

◆ record() [1/3]

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

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

◆ record() [2/3]

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

Add an output object to the event.

◆ record() [3/3]

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

Record an object into a connected output file.

This is the function doing the heavy lifting when recording a new object into the output RNTuple.

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
kTRUE if the operation was successful, or kFALSE if it was not

Add field to RNTuple model

Implements xAOD::Event.

Definition at line 1361 of file REvent.cxx.

1366 {
1367
1368
1369 // Check if we have an output file when writing an event:
1370 if ( !hasOutput() ) {
1371 ATH_MSG_FATAL("No output output file defined. Did you forget to call writeTo(...)?" );
1372 return StatusCode::FAILURE;
1373 }
1374 assert( m_outputEventFormat != 0 );
1375
1376 ATH_MSG_DEBUG("REvent::record - key, type " << key << ", " << typeName);
1377
1378
1379 // If this is metadata, just take ownership of it. The object will only
1380 // be recorded into the output file when calling finishWriting(...).
1381 if( metadata ) {
1382 // Check whether we already have such an object:
1383 if( ( ! overwrite ) &&
1384 ( m_outputMetaObjects.find( key ) !=
1385 m_outputMetaObjects.end() ) ) {
1386 ATH_MSG_FATAL("Meta-object " << typeName << "/" << key << " already recorded" );
1387 return StatusCode::FAILURE;
1388 }
1389 // Check if we have a dictionary for this object:
1390 TClass* cl = TClass::GetClass( typeName.c_str() );
1391 if( ! cl ) {
1392 ATH_MSG_ERROR( "Didn't find dictionary for type: " << typeName );
1393 return StatusCode::FAILURE;
1394 }
1395 // Create output object manager with a holder for the object:
1396 auto outmgr = std::make_unique<ROutObjManager>( key, std::make_unique<THolder>(obj, cl, isOwner));
1397 m_outputMetaObjects[key] = std::move(outmgr);
1398 // We're done. The rest will be done later on.
1399 return StatusCode::SUCCESS;
1400 }
1401
1402 // Check if we accessed this object on the input. If yes, then this
1403 // key may not be used for recording.
1404 if( ( ! overwrite ) &&
1405 ( m_inputObjects.find( key ) != m_inputObjects.end() ) ) {
1406 ATH_MSG_FATAL( "Object " << typeName << "/" << key <<
1407 " already accessed from the input, can't be overwritten in memory" );
1408 return StatusCode::FAILURE;
1409 }
1410
1411 // Check if we need to add it to the event record:
1412 Object_t::iterator vitr = m_outputObjects.find( key );
1413 if( vitr == m_outputObjects.end() ) {
1414
1415 // Check if we have a dictionary for this object:
1416 TClass* cl = TClass::GetClass( typeName.c_str() );
1417 if( ! cl ) {
1418 ATH_MSG_ERROR( "Didn't find dictionary for type: " << typeName );
1419 return StatusCode::FAILURE;
1420 }
1421 // Check if this is a new object "type" or not:
1422 if( ! m_outputEventFormat->exists( key ) ) {
1423 m_outputEventFormat->add( EventFormatElement( key, cl->GetName(),
1424 "", getHash( key ) ) );
1425 }
1426 // Create output object manager with a holder for the object:
1427 auto outmgr = std::make_unique<ROutObjManager>( key, std::make_unique<THolder>(obj, cl, isOwner));
1428 ROutObjManager* outmgrPtr = outmgr.get();
1429 m_outputObjects[ key ] = std::move(outmgr);
1430
1431 ATH_MSG_DEBUG("REvent::record - save outObjMgr for key, type " << key << ", " << typeName);
1432
1433 // Set up the saving of all the dynamic auxiliary properties
1434 // of the object if it has any:
1435 ATH_CHECK( putAux( *outmgrPtr ) );
1436
1438 ATH_CHECK( addField(key, *outmgrPtr) );
1439
1440 // Return at this point, as we don't want to run the rest of
1441 // the function's code:
1442 return StatusCode::SUCCESS;
1443 }
1444
1445 // Access the object manager:
1446 ROutObjManager* omgr = dynamic_cast< ROutObjManager* >( vitr->second.get() );
1447 if( ! omgr ) {
1448 ATH_MSG_FATAL( "Manager object of the wrong type encountered" );
1449 return StatusCode::FAILURE;
1450 }
1451
1452 // RDS: Is the following still needed?
1453 // // Check that the type of the object matches that of the previous
1454 // // object:
1455 // if( typeName != omgr->holder()->getClass()->GetName() ) {
1456 // // This may still be, when the ROOT dictionary name differs from the
1457 // // "simple type name" known to C++. So let's get the ROOT name of the
1458 // // new type:
1459 // TClass* cl = TClass::GetClass( typeName.c_str() );
1460 // if( ( ! cl ) || ::strcmp( cl->GetName(),
1461 // omgr->holder()->getClass()->GetName() ) ) {
1462 // ATH_MSG_FATAL(
1463 // XAOD_MESSAGE( "For output key \"%s\" the previous type "
1464 // "was \"%s\", the newly requested type is "
1465 // "\"%s\"" ),
1466 // key.c_str(), omgr->holder()->getClass()->GetName(),
1467 // typeName.c_str() );
1468 // return StatusCode::FAILURE;
1469 // }
1470 // }
1471
1472 // Replace the managed object:
1473 omgr->setObject( obj );
1474
1475 // Replace the auxiliary objects:
1476 return putAux( *omgr );
1477} // record
bool hasOutput() const override
Check if an output file is connected to the object.
Definition REvent.cxx:613

◆ recordAux()

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

Record an auxiliary store into a connected output file.

Implements xAOD::Event.

Definition at line 1479 of file REvent.cxx.

1480 {
1481
1482 // Check if the auxiliary store is a generic object.
1483 Details::IObjectManager* iomgr = dynamic_cast<Details::IObjectManager*>(&mgr);
1484 if (iomgr != nullptr) {
1485 // Record the auxiliary object using the main record function.
1486 static const bool OVERWRITE = true;
1487 static const bool IS_OWNER = true;
1488 ATH_CHECK(record(iomgr->object(), iomgr->holder()->getClass()->GetName(),
1489 key, OVERWRITE, metadata, IS_OWNER));
1490 return StatusCode::SUCCESS;
1491 }
1492
1493 // Apparently we didn't recorgnize the auxiliary store type.
1494 ATH_MSG_ERROR("Unknown auxiliary store manager type encountered");
1495 return StatusCode::FAILURE;
1496}
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.
Definition REvent.cxx:1361

◆ 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 318 of file EventIProxyDict.cxx.

319 {
320
321 throw std::runtime_error("xAOD::Event::recordObject is not implemented");
322}

◆ 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 313 of file EventIProxyDict.cxx.

313 {
314
315 return;
316}

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

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

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

◆ REvent()

xAOD::Experimental::REvent::REvent ( const EventContext * ctx = nullptr)

Default constructor.

Definition at line 37 of file REvent.cxx.

148 : Event("xAOD::Experimental::REvent", ctx)
149{}

◆ setActive()

void Event::setActive ( ) const
inherited

Set this event object as the currently active one.

Definition at line 65 of file EventCore.cxx.

65 {
66
67 // The active event and current store are thread-local globals.
68 Event* nc_this ATLAS_THREAD_SAFE = const_cast<Event*>(this);
69 TActiveEvent::setEvent(static_cast<TVirtualEvent*>(nc_this));
70#ifndef XAOD_STANDALONE
71 SG::CurrentEventStore::setStore(nc_this);
73#endif // not XAOD_STANDALONE
74}
static void setEvent(TVirtualEvent *ptr)
Set the active event pointer.
void setProxyDictInEventContext(IProxyDict *sg)
Update the IProxyDict in the current EventContext.

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

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

◆ setAuxStore()

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

Function connecting a DV object to its auxiliary store.

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

This function takes care of this.

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

Implements xAOD::Event.

Definition at line 1232 of file REvent.cxx.

1233 {
1234
1235 // Check if we need to do anything:
1236 if ((Details::hasAuxStore(*(mgr.holder()->getClass())) == false) &&
1237 (Details::isAuxStore(*(mgr.holder()->getClass())) == false)) {
1238 return StatusCode::SUCCESS;
1239 }
1240
1241 // Select which object container to use:
1243
1244 // Look up the auxiliary object's manager:
1245 TVirtualManager* auxMgr = nullptr;
1246 std::string auxKey;
1247 if (Details::isAuxStore(*(mgr.holder()->getClass()))) {
1248 auxMgr = &mgr;
1249 auxKey = key;
1250 } else {
1251 auto itr = objects.find(key + "Aux.");
1252 if (itr == objects.end()) {
1253 // Apparently there's no auxiliary object for this DV, so let's
1254 // give up.
1255 return StatusCode::SUCCESS;
1256 }
1257 auxMgr = itr->second.get();
1258 auxKey = key + "Aux:";
1259 }
1260
1261 // Get the aux store object.
1262 RObjectManager* omgr = dynamic_cast<RObjectManager*>(auxMgr);
1263 if (!omgr) {
1264 ATH_MSG_FATAL("Auxiliary manager for \"" << auxKey
1265 << "\" is not of the right type");
1266 return StatusCode::FAILURE;
1267 }
1268 void* p = omgr->holder()->getAs(typeid(SG::IAuxStore));
1269 SG::IAuxStore* store = reinterpret_cast<SG::IAuxStore*>(p);
1270 if (store == nullptr) {
1271 ATH_MSG_FATAL("There's a logic error in the code");
1272 return StatusCode::FAILURE;
1273 }
1274
1275 if (!metadata) {
1276 // Make sure the auxiliary object is up to date.
1277 ::Int_t readBytes = auxMgr->getEntry();
1278
1279 // Check if there is a separate auxiliary object for the dynamic
1280 // variables, which would need to be updated.
1281 const std::string dynAuxKey = auxKey + "Dynamic";
1282 auto dynAuxMgr = objects.find(dynAuxKey);
1283 if ((dynAuxMgr != objects.end()) && (readBytes || (auxMgr == &mgr))) {
1284
1285 // Tell the dynamic store object to switch to a new entry.
1286 dynAuxMgr->second->getEntry();
1287 }
1288
1289#ifndef XAOD_STANDALONE
1290 // Call toTransient on the aux store.
1291 store->toTransient (this->currentContext());
1292#endif
1293 }
1294
1295 // Stop here if we've set up an auxiliary store.
1296 if (auxMgr == &mgr) {
1297 return StatusCode::SUCCESS;
1298 }
1299
1300 // Access the auxiliary base class of the object/vector:
1301 SG::AuxVectorBase* vec = 0;
1302 SG::AuxElement* aux = 0;
1303 switch (mgr.holder()->typeKind()) {
1304 case THolder::DATAVECTOR: {
1305 void* vvec = mgr.holder()->getAs(typeid(SG::AuxVectorBase));
1306 vec = reinterpret_cast<SG::AuxVectorBase*>(vvec);
1307 } break;
1308 case THolder::AUXELEMENT: {
1309 void* vaux = mgr.holder()->getAs(typeid(SG::AuxElement));
1310 aux = reinterpret_cast<SG::AuxElement*>(vaux);
1311 } break;
1312 default:
1313 break;
1314 }
1315
1316 // Check whether index tracking is enabled for the type. If not, then
1317 // we need to fix it...
1318 if (vec && (!vec->trackIndices())) {
1319 Details::forceTrackIndices(*vec);
1320 }
1321
1322 // Check if we were successful:
1323 if ((!vec) && (!aux)) {
1324 ATH_MSG_FATAL("Couldn't access class \""
1325 << mgr.holder()->getClass()->GetName()
1326 << "\" as SG::AuxVectorBase or SG::AuxElement");
1327 return StatusCode::FAILURE;
1328 }
1329
1330 // Connect with the aux store.
1331 if (vec) {
1332 vec->setStore(store);
1333 } else if (aux) {
1334 aux->setStore(store);
1335 } else {
1336 ATH_MSG_FATAL("There's a logic error in the code");
1337 return StatusCode::FAILURE;
1338 }
1339
1340 // We succeeded:
1341 return StatusCode::SUCCESS;
1342}
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}

◆ setUpDynamicStore()

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

event uses RNTupleReader:

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

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

Definition at line 1826 of file REvent.cxx.

1827 {
1828
1829 // The name of the field that the object is connected to.
1830 const std::string fieldName = mgr.field().GetField().GetFieldName();
1831
1832 // Check if we can call setName(...) on the object.
1833 ::TMethodCall setNameCall;
1834 setNameCall.InitWithPrototype(mgr.holder()->getClass(), "setName",
1835 "const char*");
1836 if (setNameCall.IsValid()) {
1837 // Yes, there is such a function. Let's call it with the field
1838 // name.
1839 const ::TString params = ::TString::Format("\"%s\"", fieldName.c_str());
1840 const char* charParams = params.Data();
1841 setNameCall.Execute(mgr.holder()->get(), charParams);
1842 } else {
1843 // This is weird. What sort of auxiliary container is this? :-/
1844 ATH_MSG_WARNING("Couldn't find setName(...) function for container \""
1845 << fieldName << "\" (type: "
1846 << mgr.holder()->getClass()->GetName() << ")");
1847 }
1848
1849 // Check if we can switch out the internal store of this object:
1850 static const TClass* const holderClass =
1851 TClass::GetClass(typeid(SG::IAuxStoreHolder));
1852 if (!mgr.holder()->getClass()->InheritsFrom(holderClass)) {
1853 // Nope... So let's just end the journey here.
1854 return StatusCode::SUCCESS;
1855 }
1856
1857 // Try to get the object as an IAuxStoreHolder:
1858 SG::IAuxStoreHolder* storeHolder = reinterpret_cast<SG::IAuxStoreHolder*>(
1859 mgr.holder()->getAs(typeid(SG::IAuxStoreHolder)));
1860 if (!storeHolder) {
1861 ATH_MSG_FATAL("There's a logic error in the code");
1862 return StatusCode::FAILURE;
1863 }
1864
1865 // Create an RAuxStore instance that will read the dynamic variables
1866 // of this container. Notice that the RAuxManager doesn't own the
1867 // RAuxStore object. It will be owned by the SG::IAuxStoreHolder
1868 // object.
1869 static constexpr bool TOP_STORE = false;
1870 const EventContext& ctx = this->currentContext();
1871 auto store = std::make_unique<RAuxStore>(
1872 ctx,
1873 fieldName, TOP_STORE,
1877 // This object is used to read data from the input, it needs to be
1878 // locked:
1879 store->lock();
1880
1881 // Set it up to read from the input RNTuple.
1882 ATH_CHECK(store->readFrom(reader));
1883 // Tell the auxiliary store which entry to use. This is essential for
1884 // metadata objects, and non-important for event data objects, which will
1885 // get a possibly different entry loaded in setAuxStore(...).
1886 ATH_CHECK(store->getEntry(0));
1887
1888 // Set up a manager for it.
1889 static constexpr bool SHARED_OWNER = false;
1890 m_inputObjects[fieldName + "Dynamic"] =
1891 std::make_unique<RAuxManager>(store.get(), m_entry, SHARED_OWNER);
1892
1893 // Give this object to the store holder.
1894 storeHolder->setStore(store.release());
1895
1896 // Return gracefully:
1897 return StatusCode::SUCCESS;
1898}
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 298 of file EventIProxyDict.cxx.

298 {
299
300 return getHash(str);
301}

◆ 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()

StatusCode xAOD::Experimental::REvent::writeTo ( TFile & file)
overridevirtualinherited

Connect the object to an output file.

This function should be called to create a file for writing and setup the output RNTuple and metadata trees.

Parameters
filethe TFile to which the output is writter

Implements xAOD::Event.

Definition at line 358 of file REvent.cxx.

358 {
359
360 // Save filefor writing
362
363 ATH_MSG_DEBUG("REvent::writeTo - opened output file " << m_outputFile->GetName());
364
365 // Access the EventFormat object associated with this file:
368
369 ATH_MSG_DEBUG("REvent::writeTo - creating RNTupleModel ");
370
371 // Create new model for this file
372 m_model = ROOT::RNTupleModel::Create();
373
374 // Set output RNTuple name as model description
375 const char* rnTupleName = EVENT_RNTUPLE_NAME;
376 m_model->SetDescription(rnTupleName);
377
378 // Return gracefully:
379 return StatusCode::SUCCESS;
380}
static const TEventFormatRegistry & instance()
Access the only instance of the object in memory.
EventFormat & getEventFormat(const TFile *file) const
Access the managed EventFormat object.

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 394 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 80 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 79 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 362 of file Event.h.

◆ m_branchesMutex

upgrade_mutex_t xAOD::Event::m_branchesMutex
mutableprotectedinherited

Mutex for multithread synchronization.

Definition at line 390 of file Event.h.

◆ m_ctx

EventContext xAOD::Event::m_ctx
protectedinherited

The event context associated with this event.

Definition at line 410 of file Event.h.

◆ m_entry

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

The entry to look at from the input.

Definition at line 138 of file REvent.h.

138{};

◆ m_eventReader

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

The main event data reader.

Definition at line 131 of file REvent.h.

◆ m_eventWriter

std::unique_ptr<ROOT::RNTupleWriter> xAOD::Experimental::REvent::m_eventWriter
privateinherited

The main event writer: RNTupleWeader.

Definition at line 144 of file REvent.h.

◆ m_imsg

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

MessageSvc pointer.

Definition at line 135 of file AthMessaging.h.

135{ nullptr };

◆ m_inputEventFormat

EventFormat xAOD::Event::m_inputEventFormat
protectedinherited

Format of the current input file.

Definition at line 357 of file Event.h.

◆ m_inputMetaObjects

Object_t xAOD::Event::m_inputMetaObjects
protectedinherited

Collection of all the managed input meta-objects.

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

◆ m_inputNTupleIsMissing

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

Whether the input has an event RNTuple or not.

Definition at line 133 of file REvent.h.

◆ m_inputObjects

Object_t xAOD::Event::m_inputObjects
protectedinherited

Collection of all the managed input objects.

Definition at line 344 of file Event.h.

◆ m_listeners

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

Listeners who should be notified when certain incidents happen.

Definition at line 365 of file Event.h.

◆ m_lvl

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

Current logging level.

Definition at line 138 of file AthMessaging.h.

138{ MSG::NIL };

◆ m_metaReader

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

The metadata reader.

Definition at line 135 of file REvent.h.

◆ m_model

std::unique_ptr<ROOT::RNTupleModel> xAOD::Experimental::REvent::m_model
privateinherited

The RNTuple model used for event fields.

Definition at line 141 of file REvent.h.

◆ m_msg_tls

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

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

Definition at line 132 of file AthMessaging.h.

◆ m_nameRemapping

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

Container name re-mapping rules.

Definition at line 368 of file Event.h.

◆ m_nm

std::string AthMessaging::m_nm
privateinherited

Message source name.

Definition at line 129 of file AthMessaging.h.

◆ m_outputEventFormat

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

Format of the current output file.

Definition at line 359 of file Event.h.

◆ m_outputFile

::TFile* xAOD::Experimental::REvent::m_outputFile {nullptr}
privateinherited

The output file for writing.

Definition at line 147 of file REvent.h.

147{nullptr};

◆ m_outputMetaObjects

Object_t xAOD::Event::m_outputMetaObjects
protectedinherited

Collection of all the managed output meta-objects.

Definition at line 354 of file Event.h.

◆ m_outputObjects

Object_t xAOD::Event::m_outputObjects
protectedinherited

Collection of all the managed output object.

Definition at line 349 of file Event.h.

◆ m_printEventProxyWarnings

bool xAOD::Event::m_printEventProxyWarnings = false
protectedinherited

Option to silence common warnings that seem to be harmless.

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


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