ATLAS Offline Software
REventProxyDict.cxx
Go to the documentation of this file.
1 // Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
2 //
3 // File holding the implementation of the xAOD::REvent functions that implement
4 // the IProxyDict interface. Just to make REvent.cxx a little smaller.
5 //
6 
7 // System include(s):
8 #include <stdexcept>
9 #include <set>
10 
11 // ROOT include(s):
12 #include <TClass.h>
13 #include <TString.h>
14 #include <TBranch.h>
15 
16 // Offline include(s):
17 #ifndef XAOD_STANDALONE
18 # include "SGTools/DataProxy.h"
21 # include "GaudiKernel/Converter.h"
22 # include "GaudiKernel/GenericAddress.h"
23 #endif // NOT XAOD_STANDALONE
24 
27 #include "xAODRootAccess/REvent.h"
31 
32 
33 
34 namespace {
36  typedef AthContainers_detail::mutex mutex_t;
38  typedef AthContainers_detail::lock_guard< mutex_t > guard_t;
39 }
40 
41 
42 #ifndef XAOD_STANDALONE
43 namespace xAODPrivate {
44 
46  class RHolderBucket : public DataBucketBase {
47 
48  public:
50  RHolderBucket( const std::string& key,
51  const std::type_info& ti,
53  : m_key( key ), m_ti( ti ), m_event( event ) {}
54 
56  void* object() override {
57 
58  // Look among the output objects first:
59  const void* result = m_event.getOutputObject( m_key, m_ti );
60  // Check if it succeeded:
61  if( ! result ) {
62  // Try the input then:
64  } else {
65  // Even if there is an output object with this key, it may
66  // be an input object that was copied to the output. So let's
67  // try to silently retrieve an input object as well. This makes
68  // sure that the input/output object is updated for the current
69  // event.
70  m_event.getInputObject( m_key, m_ti, kTRUE );
71  }
72 
73  // Return the pointer:
74  void* nc_result ATLAS_THREAD_SAFE = const_cast< void* >( result ); //DataBucketBase interface
75  return nc_result;
76  }
77 
79  const std::type_info& tinfo() const override {
80 
81  return m_ti;
82  }
83 
86  bool ) override {
87 
88  throw std::runtime_error( "RHolderBucket::cast not implemented" );
89  return 0;
90  }
91 
93  void* cast( const std::type_info& tinfo,
95  bool isConst ) override {
96 
97  // Do the cast:
98  static const bool QUIET = true;
99  const void* result = 0;
100  if( isConst ) {
101  // Just look among the inputs:
102  result = m_event.getInputObject( m_key, tinfo, QUIET );
103  } else {
104  // Look among the output objects first:
106  // Check if it succeeded:
107  if( ! result ) {
108  // Try the input then:
109  result = m_event.getInputObject( m_key, tinfo, QUIET );
110  } else {
111  // Even if there is an output object with this key, it may
112  // be an input object that was copied to the output. So let's
113  // try to silently retrieve an input object as well. This makes
114  // sure that the input/output object is updated for the current
115  // event.
116  m_event.getInputObject( m_key, tinfo, QUIET );
117  }
118  }
119 
120  // Return the pointer:
121  void* nc_result ATLAS_THREAD_SAFE = const_cast< void* >( result ); //DataBucketBase interface
122  return nc_result;
123  }
124 
126  void* cast( CLID,
127  const std::type_info& tinfo,
129  bool isConst) override
130  {
131  return RHolderBucket::cast (tinfo, irt, isConst);
132  }
133 
135  void relinquish() override {}
137  void lock() override {}
138 
139  private:
141  const std::string m_key;
143  const std::type_info& m_ti;
146 
147  }; // class RHolderBucket
148 
149  class RLoader
150  : public Converter
151  {
152  public:
154  const std::string& name,
155  const std::type_info& ti)
156  : Converter (0, CLID_NULL),
157  m_event (event),
158  m_name (name),
159  m_ti (ti),
160  m_proxy (nullptr)
161  {
162  }
163 
164 
166  {
167  m_proxy = &proxy;
168  }
169 
170 
171  virtual StatusCode createObj(IOpaqueAddress*, DataObject*&) override;
172  virtual long repSvcType() const override { return 0; }
173 
174 
175  private:
177  std::string m_name;
178  const std::type_info& m_ti;
180  };
181 
182 
183  StatusCode RLoader::createObj(IOpaqueAddress* /*addr*/, DataObject*& obj)
184  {
185  static const bool SILENT = true;
186  static const bool METADATA = false;
187 
188  // Try to find the object amongst the output objects first:
189  if( m_event.getOutputObject( m_name, m_ti, METADATA ) ) {
191  }
192  // If it's not on the output, try the input:
193  else if( m_event.getInputObject( m_name, m_ti, SILENT, METADATA ) ) {
195  m_proxy->setConst();
196  }
197 
198  return StatusCode::SUCCESS;
199  }
200 
201 } // xAODPrivate namespace
202 #endif // not XAOD_STANDALONE
203 
204 namespace xAOD {
205 
206  namespace Experimental {
207 
208  SG::DataProxy* REvent::proxy( const void* const pTransient ) const {
209 
210  // Look up the name of this object
211  std::string name = getName( pTransient );
212  if( name.empty() ) {
213  // Apparently the object is not known...
214  return nullptr;
215  }
216 
217  // Get the metadata object for it:
218  const xAOD::EventFormatElement* efe = 0;
219  static const bool QUIET = true;
220  if( m_outputEventFormat ) {
221  efe = m_outputEventFormat->get( name, QUIET );
222  }
223  if( ! efe ) {
224  efe = m_inputEventFormat.get( name, QUIET );
225  }
226  if( ! efe ) {
227  // No metadata found...
228  return nullptr;
229  }
230 
231  // Return the proxy:
232  const BranchInfo* bi = getBranchInfo( efe->hash() );
233  return bi->m_proxy.get();
234  }
235 
237  const std::string& key ) const {
238 
239  const SG::sgkey_t sgkey = getHash( key );
240  if( ! sgkey ) {
241  return 0;
242  }
243  // return proxy_exact( sgkey );
244 
245  auto proxy = proxy_exact( sgkey );
246  if ( !proxy ) {
247  ::Warning( "xAOD::REvent::proxy",
248  "Can't find BranchInfo for %s.",
249  key.c_str() );
250 
251  }
252  return proxy;
253  }
254 
256 
257  // Get the object describing this branch/object:
258  const BranchInfo* bi = getBranchInfo( sgkey );
259  if( ! bi ) {
260  static SG::SGKeySet missingSGKeys ATLAS_THREAD_SAFE;
261  static mutex_t mutex;
262  guard_t lock(mutex);
263  if( missingSGKeys.emplace( sgkey ).second &&
265  ::Warning( "xAOD::REvent::proxy_exact",
266  "Can't find BranchInfo for %d.",
267  sgkey );
268  }
269  return 0;
270  }
271 
272  // Access its data proxy:
273  SG::DataProxy* proxy = bi->m_proxy.get();
274 
275  // Return the proxy:
276  return proxy;
277  }
278 
280 
281  {
282  // We can only hold the lock (even though it's a shared lock) for
283  // this limited scope because the call to getInputObject below
284  // leads to a recursion and dead-lock if not released immediately.
286 
287  // If the object already exists, return it:
288  auto it = m_branches.find( sgkey );
289  if( it != m_branches.end() ) {
290  return &( it->second );
291  }
292  }
293 
294  // If not, construct it now:
295  BranchInfo bi;
297  if( ! efe ) {
298  // Apparently this key is not known:
299  return nullptr;
300  }
301 
302  // Helper variable(s).
303  static const bool SILENT = true;
304  static const bool METADATA = false;
305 
306  // The name of the requested object.
307  const std::string& name = getName( sgkey );
308  // This is a bit perverse... In order to let the "base class" figure
309  // out the exact type of this object, we ask for it with a REvent
310  // pointer. I use that type because I need something that has a
311  // dictionary, and which should always be available when this code
312  // runs. In the end it doesn't matter that the object can't be
313  // retrieved as that type (of course...), it only matters that it gets
314  // "set up" following these calls.
315  REvent* nc_this = const_cast< REvent* >( this );
316  static const std::type_info& dummy = typeid( REvent );
317  nc_this->getInputObject( name, dummy, SILENT, METADATA );
318  auto itr = m_outputObjects.find( name );
319  if( itr == m_outputObjects.end() ) {
320  itr = m_inputObjects.find( name );
321  if( itr == m_inputObjects.end() ) {
322  // We didn't find this object in the store...
323  return nullptr;
324  }
325  }
326  const RObjectManager* mgr =
327  dynamic_cast< const RObjectManager* >( itr->second );
328  if( ! mgr ) {
329  ::Error( "xAOD::REvent::getBranchInfo",
330  XAOD_MESSAGE( "Internal logic error found" ) );
331  return nullptr;
332  }
333  bi.m_class = mgr->holder()->getClass();
334  // There's no need to check whether this is a "proper" dictionary
335  // at this point, since if REvent is holding on to it, the type
336  // must have a proper compiled dictionary.
337 
338 #ifndef XAOD_STANDALONE
339  // Create a proper proxy for the input branch:
340  SG::TransientAddress* taddr =
341  new SG::TransientAddress( CLID_NULL, efe->branchName(),
342  new GenericAddress() );
343  taddr->setSGKey( sgkey );
344  xAODPrivate::RLoader* loader =
345  new xAODPrivate::RLoader (*nc_this,
346  getName( sgkey ),
347  *bi.m_class->GetTypeInfo());
348  bi.m_proxy.reset( new SG::DataProxy( taddr, loader ) );
349  loader->setProxy (*bi.m_proxy.get());
350 #endif // not XAOD_STANDALONE
351 
352  // Add the branch info to our list:
354  lock.upgrade();
355  auto ret = m_branches.insert( std::make_pair( sgkey, std::move( bi ) ) );
356 
357  // Return a pointer to the branch info:
358  return &( ret.first->second );
359  }
360 
363 
364  const xAOD::EventFormatElement* efe = 0;
365  static const bool QUIET = true;
366  if( m_outputEventFormat ) {
367  efe = m_outputEventFormat->get( sgkey, QUIET );
368  }
369  if( ! efe ) {
370  efe = m_inputEventFormat.get( sgkey, QUIET );
371  }
372  if ( ! efe ) {
373  static SG::SGKeySet missingSGKeys ATLAS_THREAD_SAFE;
374  static mutex_t mutex;
375  guard_t lock(mutex);
376  if( missingSGKeys.emplace( sgkey ).second ) {
378  ::Warning( "xAOD::REvent::getEventFormatElement",
379  "Can't find EventFormatElement for hashed "
380  "SG key %d", sgkey );
381  }
382  return 0;
383  }
384  }
385  return efe;
386  }
387 
397 
399 
400  // Warn the user that the function got called:
401  static std::atomic_flag warningPrinted ATLAS_THREAD_SAFE = ATOMIC_FLAG_INIT;
402  if ( ! warningPrinted.test_and_set() && m_printEventProxyWarnings) {
403  ::Warning( "xAOD::REvent::addToStore",
404  "Function should only be called through an invalid "
405  "ElementLink" );
406  }
407 
408  // Hold on to the proxy with some non-existent, hopefully unique key:
409  const ::TString uniqueKey = ::TString::Format( "NonExistentKey_%lu",
410  m_branches.size() );
411  BranchInfo bi;
412  bi.m_proxy.reset( proxy );
413  lock.upgrade();
414  m_branches.insert( std::make_pair( stringToKey( uniqueKey.Data(),
415  clid ),
416  std::move( bi ) ) );
417 
418  // Return gracefully:
419  return StatusCode::SUCCESS;
420  }
421 
422  std::vector< const SG::DataProxy* > REvent::proxies() const {
423 
425 
426  std::vector< const SG::DataProxy* > ret;
427  for( const auto& p : m_branches ) {
428  const SG::DataProxy* proxy = p.second.m_proxy.get();
429  if( proxy ) {
430  ret.push_back( proxy );
431  }
432  }
433  return ret;
434  }
435 
436  SG::sgkey_t REvent::stringToKey( const std::string& str, CLID ) {
437 
438  return getHash( str );
439  }
440 
441  const std::string* REvent::keyToString( SG::sgkey_t key ) const {
442 
443  return &( getName( key ) );
444  }
445 
446  const std::string* REvent::keyToString( SG::sgkey_t key, CLID& ) const {
447 
448  return &( getName( key ) );
449  }
450 
451  void REvent::registerKey( SG::sgkey_t, const std::string&, CLID ) {
452 
453  return;
454  }
455 
457  const std::string&, bool, bool ) {
458 
459  throw std::runtime_error( "xAOD::REvent::recordObject is not "
460  "implemented" );
461  }
462 
463  const std::string& REvent::name() const {
464 
465  static const std::string NAME = "xAOD::REvent";
466  return NAME;
467  }
468 
469  } // namespace Experimental
470 
471 } // namespace xAOD
SG::IRegisterTransient
Interface for registering a transient object in t2p map.
Definition: IRegisterTransient.h:28
xAODPrivate::RLoader::repSvcType
virtual long repSvcType() const override
Definition: REventProxyDict.cxx:172
common.sgkey
def sgkey(tool)
Definition: common.py:1027
xAOD::Experimental::REvent::m_outputObjects
Object_t m_outputObjects
Collection of all the managed output object.
Definition: REvent.h:494
xAOD::EventFormat_v1::get
const EventFormatElement * get(const std::string &key, bool quiet=false) const
Get the description of a given branch.
Definition: EventFormat_v1.cxx:91
xAOD::Experimental::REvent
Tool for accessing xAOD files outside of Athena, version RNTuple.
Definition: REvent.h:105
get_generator_info.result
result
Definition: get_generator_info.py:21
StateLessPT_NewConfig.proxy
proxy
Definition: StateLessPT_NewConfig.py:407
xAOD::Experimental::REvent::m_branchesMutex
upgrade_mutex_t m_branchesMutex
Definition: REvent.h:532
DataBucketBase
A non-templated base class for DataBucket, allows to access the transient object address as a void*.
Definition: DataBucketBase.h:24
xAODPrivate::RHolderBucket::lock
void lock() override
Lock the held object. A no-op.
Definition: REventProxyDict.cxx:137
xAOD::Experimental::REvent::getOutputObject
void * getOutputObject(SG::sgkey_t key, const std::type_info &ti) override
This function is used by the TVirtualEvent interface to access an output object with a given hashed k...
Definition: REvent.cxx:1707
DataBucketBase.h
xAOD::Experimental::REvent::getBranchInfo
const BranchInfo * getBranchInfo(SG::sgkey_t sgkey) const
Get the object describing one object/branch.
Definition: REventProxyDict.cxx:279
xAOD::Experimental::RObjectManager
Manager for EDM objects created by ROOT.
Definition: RObjectManager.h:43
BeamSpot::mutex
std::mutex mutex
Definition: InDetBeamSpotVertex.cxx:18
xAODPrivate::RHolderBucket::cast
void * cast(CLID, const std::type_info &tinfo, SG::IRegisterTransient *irt, bool isConst) override
Return the object, cast to type.
Definition: REventProxyDict.cxx:126
StateLessPT_NewConfig.Format
Format
Definition: StateLessPT_NewConfig.py:149
skel.it
it
Definition: skel.GENtoEVGEN.py:407
SG::TransientAddress
Definition: TransientAddress.h:32
xAOD
ICaloAffectedTool is abstract interface for tools checking if 4 mom is in calo affected region.
Definition: ICaloAffectedTool.h:24
xAOD::EventFormatElement
Class describing one branch of the ROOT file.
Definition: EventFormatElement.h:39
XAOD_MESSAGE
#define XAOD_MESSAGE(MESSAGE)
Simple macro for printing error/verbose messages.
Definition: Control/xAODRootAccess/xAODRootAccess/tools/Message.h:19
xAODPrivate::RHolderBucket::cast
void * cast(CLID, SG::IRegisterTransient *, bool) override
Return the object, cast to a CLID's type.
Definition: REventProxyDict.cxx:85
python.RatesEmulationExample.lock
lock
Definition: RatesEmulationExample.py:148
xAODPrivate::RHolderBucket::m_key
const std::string m_key
The key of the object.
Definition: REventProxyDict.cxx:141
xAOD::EventFormatElement::branchName
const std::string & branchName() const
Get the branch/key name.
Definition: EventFormatElement.cxx:30
xAOD::EventFormatElement::hash
sgkey_t hash() const
Get the hash belonging to this branch/key.
Definition: EventFormatElement.cxx:48
xAODPrivate::RHolderBucket::object
void * object() override
Return the object held.
Definition: REventProxyDict.cxx:56
xAOD::Experimental::REvent::getEventFormatElement
const xAOD::EventFormatElement * getEventFormatElement(SG::sgkey_t sgkey) const
Get the metadata object for a given "SG key".
Definition: REventProxyDict.cxx:362
BchCleanup.mgr
mgr
Definition: BchCleanup.py:294
xAOD::Experimental::REvent::BranchInfo
Helper struct used by the IProxyDict code.
Definition: REvent.h:522
REvent.h
python.utils.AtlRunQueryDQUtils.p
p
Definition: AtlRunQueryDQUtils.py:209
xAOD::Experimental::REvent::proxies
std::vector< const SG::DataProxy * > proxies() const override
return the list of all current proxies in store
Definition: REventProxyDict.cxx:422
xAOD::Experimental::REvent::getInputObject
const void * getInputObject(SG::sgkey_t key, const std::type_info &ti, bool silent=false) override
Function for retrieving an input object in a non-template way.
Definition: REvent.cxx:1731
event
POOL::TEvent event(POOL::TEvent::kClassAccess)
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
Message.h
xAOD::Experimental::REvent::keyToString
const std::string * keyToString(SG::sgkey_t key) const override
Find the string corresponding to a given key.
Definition: REventProxyDict.cxx:441
xAOD::Experimental::REvent::recordObject
SG::DataProxy * recordObject(SG::DataObjectSharedPtr< DataObject > obj, const std::string &key, bool allowMods, bool returnExisting) override
Record an object in the store.
Definition: REventProxyDict.cxx:456
xAOD::Experimental::REvent::m_inputObjects
Object_t m_inputObjects
Collection of all the managed input objects.
Definition: REvent.h:488
CalibDbCompareRT.dummy
dummy
Definition: CalibDbCompareRT.py:59
xAOD::Experimental::REvent::getHash
SG::sgkey_t getHash(const std::string &key) const override
Function returning the hash describing an object name.
Definition: REvent.cxx:1433
xAODPrivate::RHolderBucket::tinfo
const std::type_info & tinfo() const override
Return the type_info of the stored object.
Definition: REventProxyDict.cxx:79
xAODPrivate::RHolderBucket::m_ti
const std::type_info & m_ti
The type info of the object.
Definition: REventProxyDict.cxx:143
CLID
uint32_t CLID
The Class ID type.
Definition: Event/xAOD/xAODCore/xAODCore/ClassID_traits.h:47
xAODPrivate::RLoader::m_ti
const std::type_info & m_ti
Definition: REventProxyDict.cxx:178
xAOD::Experimental::REvent::m_inputEventFormat
EventFormat m_inputEventFormat
Format of the current input file.
Definition: REvent.h:502
SG::SGKeySet
std::unordered_set< sgkey_t > SGKeySet
A set of sgkey_t values.
Definition: CxxUtils/CxxUtils/sgkey_t.h:97
xAODPrivate::RHolderBucket::cast
void * cast(const std::type_info &tinfo, SG::IRegisterTransient *, bool isConst) override
Return the object, cast to a certain type.
Definition: REventProxyDict.cxx:93
xAOD::Experimental::REvent::REvent
REvent(EAuxMode mode=kUndefinedAccess)
Default constructor.
Definition: REvent.cxx:137
Converter
Definition: Converter.h:27
xAODPrivate::RLoader::m_event
xAOD::Experimental::REvent & m_event
Definition: REventProxyDict.cxx:176
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:240
xAOD::Experimental::REvent::proxy_exact
SG::DataProxy * proxy_exact(SG::sgkey_t sgkey) const override
Get proxy given a hashed key+clid.
Definition: REventProxyDict.cxx:255
xAODPrivate::RLoader
Definition: REventProxyDict.cxx:151
xAODPrivate::RLoader::createObj
virtual StatusCode createObj(IOpaqueAddress *, DataObject *&) override
Definition: REventProxyDict.cxx:183
xAOD::Experimental::REvent::ATLAS_THREAD_SAFE
SG::SGKeyMap< BranchInfo > m_branches ATLAS_THREAD_SAFE
Map from hashed sgkey to BranchInfo.
Definition: REvent.h:535
SG::sgkey_t
uint32_t sgkey_t
Type used for hashed StoreGate key+CLID pairs.
Definition: CxxUtils/CxxUtils/sgkey_t.h:32
threading.h
Threading definitions.
xAODPrivate::RHolderBucket::m_event
xAOD::Experimental::REvent & m_event
The original REvent object.
Definition: REventProxyDict.cxx:145
xAOD::Experimental::REvent::registerKey
void registerKey(SG::sgkey_t key, const std::string &str, CLID clid) override
Remember an additional mapping from key to string/CLID.
Definition: REventProxyDict.cxx:451
xAOD::Experimental::REvent::m_printEventProxyWarnings
Bool_t m_printEventProxyWarnings
Option to silence common warnings that seem to be harmless.
Definition: REvent.h:516
xAODPrivate::RHolderBucket
Helper object for holding something through a THolder.
Definition: REventProxyDict.cxx:46
TransientAddress.h
SG::TransientAddress::setSGKey
void setSGKey(sgkey_t sgkey)
check if it is a transient ID (primary or symLinked):
Definition: TransientAddress.h:238
SG::DataProxy::setConst
void setConst()
Mark this object as const.
Definition: DataProxy.cxx:205
xAODPrivate
Definition: REventProxyDict.cxx:43
THolder.h
xAOD::Experimental::REvent::BranchInfo::m_proxy
std::unique_ptr< SG::DataProxy > m_proxy
Data proxy describing this branch/object.
Definition: REvent.h:524
AthContainers_detail::upgrading_lock
Lock object for taking out upgradable locks.
Definition: threading.h:177
str
Definition: BTagTrackIpAccessor.cxx:11
xAODPrivate::RHolderBucket::relinquish
void relinquish() override
Give up ownership of the bucket's contents. A no-op.
Definition: REventProxyDict.cxx:135
ATLAS_THREAD_SAFE
#define ATLAS_THREAD_SAFE
Definition: checker_macros.h:211
SG::DataObjectSharedPtr
Smart pointer to manage DataObject reference counts.
Definition: DataObjectSharedPtr.h:45
xAOD::Experimental::REvent::m_outputEventFormat
EventFormat * m_outputEventFormat
Format of the current output file.
Definition: REvent.h:504
xAOD::Experimental::REvent::getName
const std::string & getName(const void *obj) const override
Function returning the key describing a known object.
Definition: REvent.cxx:1468
checker_macros.h
Define macros for attributes used to control the static checker.
python.PyAthena.obj
obj
Definition: PyAthena.py:132
SG::DataProxy
Definition: DataProxy.h:45
xAOD::Experimental::REvent::name
const std::string & name() const override
Get the name of the instance.
Definition: REventProxyDict.cxx:463
xAODPrivate::RLoader::RLoader
RLoader(xAOD::Experimental::REvent &event, const std::string &name, const std::type_info &ti)
Definition: REventProxyDict.cxx:153
xAODPrivate::RLoader::m_proxy
SG::DataProxy * m_proxy
Definition: REventProxyDict.cxx:179
xAOD::Experimental::REvent::BranchInfo::m_class
const ::TClass * m_class
Dictionary describing this branch/object.
Definition: REvent.h:526
RObjectManager.h
xAOD::Experimental::REvent::proxy
SG::DataProxy * proxy(const void *const pTransient) const override
get proxy for a given data object address in memory
Definition: REventProxyDict.cxx:208
xAOD::Experimental::REvent::addToStore
StatusCode addToStore(CLID id, SG::DataProxy *proxy) override
Add a new proxy to the store.
Definition: REventProxyDict.cxx:396
xAODPrivate::RLoader::setProxy
void setProxy(SG::DataProxy &proxy)
Definition: REventProxyDict.cxx:165
xAODPrivate::RHolderBucket::RHolderBucket
RHolderBucket(const std::string &key, const std::type_info &ti, xAOD::Experimental::REvent &event)
Constructor with an existing holder.
Definition: REventProxyDict.cxx:50
mapkey::key
key
Definition: TElectronEfficiencyCorrectionTool.cxx:37
xAODPrivate::RLoader::m_name
std::string m_name
Definition: REventProxyDict.cxx:177
DataProxy.h
xAOD::Experimental::REvent::stringToKey
SG::sgkey_t stringToKey(const std::string &str, CLID clid) override
Find the string corresponding to a given key.
Definition: REventProxyDict.cxx:436