ATLAS Offline Software
Classes | Public Types | Public Member Functions | Static Public Attributes | Protected Types | Protected Member Functions | Protected Attributes | Private Attributes | List of all members
xAOD::RAuxStore Class Referenceabstract

"ROOT @c RNTuple implementation" of IAuxStore More...

#include <RAuxStore.h>

Inheritance diagram for xAOD::RAuxStore:
Collaboration diagram for xAOD::RAuxStore:

Classes

struct  impl
 

Public Types

enum  EStructMode { EStructMode::kUndefinedStore = 0, EStructMode::kContainerStore = 1, EStructMode::kObjectStore = 2 }
 "Structural" modes of the object More...
 

Public Member Functions

 RAuxStore (std::string_view prefix="", bool topStore=true, EStructMode mode=EStructMode::kUndefinedStore)
 Constructor. More...
 
virtual ~RAuxStore ()
 Destructor. More...
 
virtual void setPrefix (std::string_view prefix) override
 Set the object name prefix. More...
 
StatusCode readFrom (ROOT::RNTupleReader &reader)
 Connect the object to an input RNTuple. More...
 
StatusCode writeTo (ROOT::RNTupleWriter &writer)
 Add the variables of the store to an output RNTuple. More...
 
StatusCode getEntry (std::int64_t entry, int getall=0)
 Get entry from the input RNTuple. More...
 
StatusCode commitTo (ROOT::REntry &entry)
 Commit a new entry to the output RNTuple. More...
 
EStructMode structMode () const
 Get what structure mode the object was constructed with. More...
 
void setStructMode (EStructMode mode)
 Set the structure mode of the object to a new value. More...
 
const std::string & prefix () const
 Get the currently configured object name prefix. More...
 
bool isTopStore () const
 Check if the object is a "top store", or not. More...
 
void setTopStore (bool value=true)
 Set whether the object should behave as a "top store" or not. More...
 
virtual void * getData (auxid_t auxid, size_t size, size_t capacity)=0
 Return the data vector for one aux data item. More...
 
virtual const void * getData (SG::auxid_t auxid) const=0
 Pick up the const version from the base class. More...
 
virtual void * getDecoration (auxid_t auxid, size_t size, size_t capacity)=0
 Return the data vector for one aux data decoration item. More...
 
virtual const IAuxTypeVector * linkedVector (SG::auxid_t) const
 Return interface for a linked variable. More...
 
virtual bool resize (size_t sz)=0
 Change the size of all aux data vectors. More...
 
virtual void reserve (size_t sz)=0
 Change the capacity of all aux data vectors. More...
 
virtual void shift (size_t pos, ptrdiff_t offs)=0
 Shift the elements of the container. More...
 
virtual bool insertMove (size_t pos, IAuxStore &other, const SG::auxid_set_t &ignore=SG::auxid_set_t())=0
 Move all elements from other to this store. More...
 
virtual bool setOption (auxid_t, const AuxDataOption &)
 Set an option for a given auxiliary variable. More...
 

Static Public Attributes

static constexpr bool supportsThinning = true
 Mark that this type supports thinning operations. More...
 

Protected Types

using mutex_t = AthContainers_detail::mutex
 Mutex type for multithread synchronization. More...
 
using guard_t = AthContainers_detail::lock_guard< mutex_t >
 Guard type for multithreaded synchronisation. More...
 

Protected Member Functions

bool isAuxIDSelected (SG::auxid_t auxid) const
 Check if an auxiliary variable is selected for ouput writing. More...
 

Protected Attributes

Members m_data
 Member variables of the base class. More...
 

Private Attributes

std::unique_ptr< implm_impl
 Pointer to the internal object. More...
 
AuxSelection m_selection
 Object helping to select which auxiliary variables to write. More...
 
bool m_locked = false
 Is this container locked? More...
 
mutex_t m_mutex1
 Mutex objects used for multithreaded synchronisation. More...
 
mutex_t m_mutex2
 

Functions implementing functionality for @c AuxStoreBase

virtual void reset () override
 Tell the object that all branches will need to be re-read. More...
 
virtual bool hasEntryFor (SG::auxid_t auxid) const override
 Check if a given variable is available from the input. More...
 
virtual StatusCode getEntryFor (SG::auxid_t auxid) override
 Load a single variable from the input. More...
 
virtual bool hasOutput () const override
 Check if an output is being written by the object. More...
 
virtual StatusCode setupInputData (SG::auxid_t auxid) override
 Connect a variable to the input. More...
 
virtual StatusCode setupOutputData (SG::auxid_t auxid) override
 Connect a variable to the output. More...
 
virtual const void * getInputObject (SG::auxid_t auxid) const override
 Get a pointer to an input object, as it is in memory, for getIOData() More...
 
virtual const std::type_info * getInputType (SG::auxid_t auxid) const override
 Get the type of an input object, for getIOType() More...
 

Detailed Description

"ROOT @c RNTuple implementation" of IAuxStore

Author
Mads Lildholdt Hansen mlha2.nosp@m.0@st.nosp@m.udent.nosp@m..aau.nosp@m..dk
Nikolaj Kofod Krogh nkrog.nosp@m.h20@.nosp@m.stude.nosp@m.nt.a.nosp@m.au.dk
Attila Krasznahorkay Attil.nosp@m.a.Kr.nosp@m.aszna.nosp@m.hork.nosp@m.ay@ce.nosp@m.rn.c.nosp@m.h

Definition at line 38 of file RAuxStore.h.

Member Typedef Documentation

◆ guard_t

using xAOD::details::AuxStoreBase::guard_t = AthContainers_detail::lock_guard<mutex_t>
protectedinherited

Guard type for multithreaded synchronisation.

Definition at line 206 of file AuxStoreBase.h.

◆ mutex_t

using xAOD::details::AuxStoreBase::mutex_t = AthContainers_detail::mutex
protectedinherited

Mutex type for multithread synchronization.

Definition at line 204 of file AuxStoreBase.h.

Member Enumeration Documentation

◆ EStructMode

"Structural" modes of the object

Enumerator
kUndefinedStore 

The structure mode is not defined.

kContainerStore 

The object describes an entire container.

kObjectStore 

The object describes a single object.

Definition at line 30 of file AuxStoreBase.h.

30  {
31  kUndefinedStore = 0,
32  kContainerStore = 1,
33  kObjectStore = 2
34  };

Constructor & Destructor Documentation

◆ RAuxStore()

xAOD::RAuxStore::RAuxStore ( std::string_view  prefix = "",
bool  topStore = true,
EStructMode  mode = EStructMode::kUndefinedStore 
)

Constructor.

Definition at line 592 of file RAuxStore.cxx.

593  : details::AuxStoreBase(topStore, mode),
594  m_impl{std::make_unique<impl>(m_data)} {
595 
596  setPrefix(prefix);
597 }

◆ ~RAuxStore()

xAOD::RAuxStore::~RAuxStore ( )
virtualdefault

Destructor.

Member Function Documentation

◆ clearDecorations()

bool xAOD::details::AuxStoreBase::clearDecorations ( )
overridevirtualinherited

Remove the decorations added so far.

Only works for transient decorations.

Implements SG::IConstAuxStore.

Definition at line 216 of file AuxStoreBase.cxx.

216  {
217 
218  // Guard against multi-threaded execution:
219  guard_t guard(m_mutex1);
220 
221  // Clear the transient decorations:
222  bool anycleared = false;
223  if (m_data.m_transientStore) {
224  SG::auxid_set_t old_id_set = m_data.m_transientStore->getAuxIDs();
225 
226  // Clear the decorations from the transient store:
227  anycleared = m_data.m_transientStore->clearDecorations();
228 
229  // Now remove ids that were cleared.
230  if (anycleared) {
231  old_id_set -= m_data.m_transientStore->getAuxIDs();
232  // old_id_set is now the set of ids that were cleared.
233  m_data.m_auxIDs -= old_id_set;
235  }
236  }
237 
238  // The decorations which are going into the output file, are here to stay.
239  // Removing their IDs from the internal set would just cause more problems
240  // in my mind than just leaving them be.
241 
242  return anycleared;
243 }

◆ commitTo()

StatusCode xAOD::RAuxStore::commitTo ( ROOT::REntry &  entry)

Commit a new entry to the output RNTuple.

Definition at line 712 of file RAuxStore.cxx.

712  {
713 
714  assert(m_impl);
715 
716  // Loop through all of the output variables.
717  for (SG::auxid_t id : getSelectedAuxIDs()) {
718  // Now connect the output entry to the variable.
719  const std::string fieldName =
722  void* fieldPtr = const_cast<void*>(getIOData(id));
723  if (fieldPtr) {
724  entry.BindRawPtr(fieldName, fieldPtr);
725  } else {
726  entry.EmplaceNewValue(fieldName);
727  }
728  }
729 
730  // Return gracefully.
731  return StatusCode::SUCCESS;
732 }

◆ getAuxIDs()

const SG::auxid_set_t & xAOD::details::AuxStoreBase::getAuxIDs ( ) const
overridevirtualinherited

Get the types(names) of variables handled by this container.

Implements SG::IConstAuxStore.

Definition at line 106 of file AuxStoreBase.cxx.

106  {
107 
108  return m_data.m_auxIDs;
109 }

◆ getData() [1/4]

virtual void* SG::IAuxStore::getData ( auxid_t  auxid,
size_t  size,
size_t  capacity 
)
pure virtualinherited

Return the data vector for one aux data item.

Parameters
auxidThe identifier of the desired aux data item.
sizeThe current size of the container (in case the data item does not already exist).
capacityThe current capacity of the container (in case the data item does not already exist).

Each aux data item is stored as a vector, with one entry per entry in the owning container. This returns a pointer to the start of the vector.

If the data item does not exist, it should be created and initialized to default values. size and capacity give the size for the new aux data item vector.

If the container is locked, throw an exception.

Implemented in SG::AuxStoreInternal, APRTest::AuxStore, RootAuxDynStore, xAOD::AuxContainerBase, xAOD::ShallowAuxContainer, xAOD::AuxInfoBase, and xAOD::ByteStreamAuxContainer_v1.

◆ getData() [2/4]

const void * xAOD::details::AuxStoreBase::getData ( SG::auxid_t  auxid) const
overridevirtualinherited

Get a pointer to a given array.

Implements SG::IConstAuxStore.

Definition at line 56 of file AuxStoreBase.cxx.

56  {
57 
58  const SG::IAuxTypeVector* v = getVector(auxid);
59  if (v) {
60  return v->toPtr();
61  }
62  return nullptr;
63 }

◆ getData() [3/4]

virtual const void* SG::IConstAuxStore::getData
inherited

Pick up the const version from the base class.

◆ getData() [4/4]

void * xAOD::details::AuxStoreBase::getData ( SG::auxid_t  auxid,
std::size_t  size,
std::size_t  capacity 
)
overridevirtualinherited

Get a pointer to a given array, creating the array if necessary.

Definition at line 308 of file AuxStoreBase.cxx.

309  {
310 
311  // Guard against multi-threaded execution:
312  guard_t guard(m_mutex2);
313 
314  // Remember the size:
315  m_data.m_size = size;
316 
317  // Check if we want to write this variable to the output:
318  if (!(isAuxIDSelected(auxid) && hasOutput())) {
319  // Create the store only when necessary:
320  if (!m_data.m_transientStore) {
321  m_data.m_transientStore = std::make_unique<SG::AuxStoreInternal>(
323  if (m_locked) {
324  m_data.m_transientStore->lock();
325  }
326  }
327  // Let the transient store create the variable:
328  std::size_t nids = m_data.m_transientStore->getAuxIDs().size();
329  void* result = m_data.m_transientStore->getData(auxid, size, capacity);
330  if (result && (nids != m_data.m_transientStore->getAuxIDs().size())) {
331  m_data.m_auxIDs.insert(auxid);
332  }
333  // Return the address in the transient memory:
334  return result;
335  }
336 
337  // If the variable exists already, and this is a locked store, then
338  // we are in trouble.
339  if (m_locked && (auxid < m_data.m_vecs.size()) && m_data.m_vecs[auxid]) {
340  if (!((auxid < m_data.m_isDecoration.size()) &&
341  m_data.m_isDecoration[auxid])) {
342  throw SG::ExcStoreLocked(auxid);
343  }
344  }
345 
346  // Connect this auxiliary variable just to the output:
347  if (setupOutputData(auxid).isFailure()) {
348  ::Error("xAOD::AuxStoreBase::getData",
349  XAOD_MESSAGE("Failed to set up variable %s"),
350  SG::AuxTypeRegistry::instance().getName(auxid).c_str());
351  return nullptr;
352  }
353 
354  // Check whether things make sense:
355  if ((m_data.m_structMode == EStructMode::kObjectStore) && (size != 1)) {
356  ::Error("xAOD::AuxStoreBase::getData",
357  XAOD_MESSAGE("Branch creation requested with:"));
358  ::Error("xAOD::AuxStoreBase::getData", XAOD_MESSAGE(" name = %s"),
359  SG::AuxTypeRegistry::instance().getName(auxid).c_str());
360  ::Error("xAOD::AuxStoreBase::getData", XAOD_MESSAGE(" size = %i"),
361  static_cast<int>(size));
362  ::Error("xAOD::AuxStoreBase::getData",
363  XAOD_MESSAGE(" m_structMode = EStructMode::kObjectStore"));
364  return nullptr;
365  }
366 
367  // Make sure the variable is of the right size:
368  m_data.m_vecs[auxid]->reserve(capacity);
369  m_data.m_vecs[auxid]->resize(size);
370 
371  // Return the object:
372  return m_data.m_vecs[auxid]->toPtr();
373 }

◆ getDecoration() [1/2]

virtual void* SG::IConstAuxStore::getDecoration ( auxid_t  auxid,
size_t  size,
size_t  capacity 
)
pure virtualinherited

Return the data vector for one aux data decoration item.

Parameters
auxidThe identifier of the desired aux data item.
sizeThe current size of the container (in case the data item does not already exist).
capacityThe current capacity of the container (in case the data item does not already exist).

Each aux data item is stored as a vector, with one entry per entry in the owning container. This returns a pointer to the start of the vector.

If the data item does not exist, it then it will be created and initialized with default values. If the container is locked, then the new item will be marked as a decoration. size and capacity give the size for the new aux data item vector.

If the data item already exists, then we return it if either the container is not locked or the item is marked as a decoration. Otherwise we throw an exception.

Implemented in xAOD::EventAuxInfo_v1, xAOD::EventInfoAuxContainer_v1, xAOD::EventAuxInfo_v2, xAOD::EventAuxInfo_v3, RootAuxDynStore, SG::AuxStoreInternal, xAOD::AuxContainerBase, xAOD::ShallowAuxContainer, xAOD::AuxInfoBase, SG::AuxStoreConstMem, and xAOD::ByteStreamAuxContainer_v1.

◆ getDecoration() [2/2]

void * xAOD::details::AuxStoreBase::getDecoration ( SG::auxid_t  auxid,
std::size_t  size,
std::size_t  capacity 
)
overridevirtualinherited

Get a pointer to a given array, creating the array if necessary.

Definition at line 116 of file AuxStoreBase.cxx.

117  {
118 
119  // Guard against multi-threaded execution:
120  guard_t guard(m_mutex1);
121 
122  // Remember the requested size:
123  m_data.m_size = size;
124 
125  // If this is a locked object, deal with it correctly:
126  if (m_locked) {
127  // If the variable exists already and it's a decoration, then let's
128  // give it back.
129  if ((auxid < m_data.m_vecs.size()) && m_data.m_vecs[auxid] &&
130  (auxid < m_data.m_isDecoration.size() &&
131  m_data.m_isDecoration[auxid])) {
132  // Things look okay...
133  m_data.m_vecs[auxid]->reserve(capacity);
134  m_data.m_vecs[auxid]->resize(size);
135  return m_data.m_vecs[auxid]->toPtr();
136  }
137  // If it's in the transient store already, return it from there.
138  // Since in a locked store *everything* is a decoration in the
139  // transient store.
140  if (m_data.m_transientStore &&
141  m_data.m_transientStore->getAuxIDs().test(auxid)) {
142  return m_data.m_transientStore->getDecoration(auxid, size, capacity);
143  }
144  // If we know this auxiliary ID, but it was not found as a decoration
145  // by the previous checks, then we're in trouble.
146  if (m_data.m_auxIDs.test(auxid)) {
147  throw SG::ExcStoreLocked(auxid);
148  }
149  }
150 
151  // Check if we want to write this variable to the output:
152  if (!(isAuxIDSelected(auxid) && hasOutput())) {
153 
154  // Create the store only when necessary:
155  if (!m_data.m_transientStore) {
156  m_data.m_transientStore = std::make_unique<SG::AuxStoreInternal>(
158  if (m_locked) {
159  m_data.m_transientStore->lock();
160  }
161  }
162  // Let the transient store create the decoration:
163  const std::size_t nids = m_data.m_transientStore->getAuxIDs().size();
164  void* result =
165  m_data.m_transientStore->getDecoration(auxid, size, capacity);
166  if (result && (nids != m_data.m_transientStore->getAuxIDs().size())) {
167  if (m_data.m_transientStore->isDecoration(auxid)) {
168  m_data.m_decorIDs.insert(auxid);
169  }
170  std::atomic_thread_fence( std::memory_order_seq_cst );
171  m_data.m_auxIDs.insert(auxid);
172  }
173  // Return the memory address from the transient store:
174  return result;
175  }
176 
177  // Doesn't exist yet. So let's make it:
178  if (m_locked) {
179  // If the container is locked, remember that this is a decoration:
180  if (m_data.m_isDecoration.size() <= auxid) {
181  m_data.m_isDecoration.resize(auxid + 1);
182  }
183  m_data.m_isDecoration[auxid] = true;
184  m_data.m_decorIDs.insert(auxid);
185  std::atomic_thread_fence( std::memory_order_seq_cst );
186  }
187  void* result = getData(auxid, size, capacity);
188 
189  // Return the pointer made by getData(...):
190  return result;
191 }

◆ getDecorIDs()

const SG::auxid_set_t & xAOD::details::AuxStoreBase::getDecorIDs ( ) const
overridevirtualinherited

Get the types(names) of decorations handled by this container.

Implements SG::IConstAuxStore.

Definition at line 111 of file AuxStoreBase.cxx.

111  {
112 
113  return m_data.m_decorIDs;
114 }

◆ getDynamicAuxIDs()

const SG::auxid_set_t & xAOD::details::AuxStoreBase::getDynamicAuxIDs ( ) const
overridevirtualinherited

Get the types(names) of variables created dynamically.

Implements SG::IAuxStoreIO.

Definition at line 617 of file AuxStoreBase.cxx.

617  {
618 
619  // All the auxiliary decorations handled by this object are considered
620  // dynamic:
621  return getAuxIDs();
622 }

◆ getEntry()

StatusCode xAOD::RAuxStore::getEntry ( std::int64_t  entry,
int  getall = 0 
)

Get entry from the input RNTuple.

Definition at line 663 of file RAuxStore.cxx.

663  {
664 
665  assert(m_impl);
666 
667  // Guard against multi-threaded execution:
668  guard_t guard(m_impl->m_mutex);
669 
670  m_impl->m_entry = entry;
671 
672  // Reset the transient store. TEvent::fill() calls this function with
673  // getall==99. When that is happening, we need to keep the transient
674  // store still around. Since the user may want to interact with the
675  // object after it was written out. (And since TEvent::fill() asks for
676  // the transient decorations after calling getEntry(...).)
677  if (m_data.m_transientStore && (getall != 99)) {
678  // Remove the transient auxiliary IDs from the internal list:
679  m_data.m_auxIDs -= m_data.m_transientStore->getAuxIDs();
680  m_data.m_decorIDs -= m_data.m_transientStore->getDecorIDs();
681  // Delete the object:
682  m_data.m_transientStore.reset();
683  }
684 
685  // Now remove the IDs of the decorations that are getting persistified:
686  if (getall != 99) {
687  for (SG::auxid_t auxid = 0; auxid < m_data.m_isDecoration.size(); ++auxid) {
688  if (!m_data.m_isDecoration[auxid]) {
689  continue;
690  }
691  m_data.m_auxIDs.erase(auxid);
692  m_data.m_decorIDs.erase(auxid);
693  }
694  }
695 
696  // If we don't need everything loaded, return now:
697  if (!getall) {
698  return StatusCode::SUCCESS;
699  }
700 
701  // Get all the variables at once:
702  for (auto& field : m_impl->m_fields) {
703  if (field) {
704  RETURN_CHECK("xAOD::RAuxStore::getEntry", field->getEntry(entry));
705  }
706  }
707 
708  // Return gracefully.
709  return StatusCode::SUCCESS;
710 }

◆ getEntryFor()

StatusCode xAOD::RAuxStore::getEntryFor ( SG::auxid_t  auxid)
overrideprivatevirtual

Load a single variable from the input.

Implements xAOD::details::AuxStoreBase.

Definition at line 752 of file RAuxStore.cxx.

752  {
753 
754  // Guard against multi-threaded execution:
755  guard_t guard(m_impl->m_mutex);
756 
757  assert(m_impl);
758  assert(m_impl->m_fields.size() > auxid);
759  assert(m_impl->m_fields[auxid]);
760  RETURN_CHECK("xAOD::RAuxStore::getEntryFor",
761  m_impl->m_fields[auxid]->getEntry(m_impl->m_entry));
762  return StatusCode::SUCCESS;
763 }

◆ getInputObject()

const void * xAOD::RAuxStore::getInputObject ( SG::auxid_t  auxid) const
overrideprivatevirtual

Get a pointer to an input object, as it is in memory, for getIOData()

Implements xAOD::details::AuxStoreBase.

Definition at line 1122 of file RAuxStore.cxx.

1122  {
1123 
1124  assert(m_impl);
1125  assert(m_impl->m_fields.size() > auxid);
1126  assert(m_impl->m_fields[auxid]);
1127  return m_impl->m_fields[auxid]->objectPtr();
1128 }

◆ getInputType()

const std::type_info * xAOD::RAuxStore::getInputType ( SG::auxid_t  auxid) const
overrideprivatevirtual

Get the type of an input object, for getIOType()

Implements xAOD::details::AuxStoreBase.

Definition at line 1130 of file RAuxStore.cxx.

1130  {
1131 
1132  assert(m_impl);
1133  assert(m_impl->m_fields.size() > auxid);
1134  assert(m_impl->m_fields[auxid]);
1135  return m_impl->m_fields[auxid]->typeInfo();
1136 }

◆ getIOData()

const void * xAOD::details::AuxStoreBase::getIOData ( SG::auxid_t  auxid) const
overridevirtualinherited

Get a pointer to the data being stored for one aux data item.

Implements SG::IAuxStoreIO.

Definition at line 519 of file AuxStoreBase.cxx.

519  {
520 
521  // Guard against multi-threaded execution:
522  guard_t guard(m_mutex1);
523 
524  auto this_nc ATLAS_THREAD_SAFE =
525  const_cast<AuxStoreBase*>(this); // locked above
526 
527  // If the variable is coming from the input, and is connected to already.
528  if (hasEntryFor(auxid)) {
529  if (!this_nc->getEntryFor(auxid).isSuccess()) {
530  ::Error("xAOD::AuxStoreBase::getIOData",
531  XAOD_MESSAGE("Couldn't read in variable %s"),
532  SG::AuxTypeRegistry::instance().getName(auxid).c_str());
533  return nullptr;
534  }
535  return getInputObject(auxid);
536  }
537 
538  // Check if it's in the transient store:
539  if (m_data.m_transientStore &&
540  m_data.m_transientStore->getAuxIDs().test(auxid)) {
541  return m_data.m_transientStore->getIOData(auxid);
542  }
543 
544  // If not, try connecting to it now:
545  if (!this_nc->setupInputData(auxid).isSuccess()) {
546  // This is not actually an error condition anymore. We can end up here
547  // when we decorate constant objects coming from the input file, but
548  // on one event we can't set any decorations. For instance when the
549  // input container is empty. In that case the object will still list
550  // the auxiliary ID belonging to that decoration as being available,
551  // but it really isn't.
552  //
553  // Later on it might be needed to tweak the logic of all of this, but
554  // for now just silently returning 0 seems to do the right thing.
555  return nullptr;
556  }
557 
558  // Now we should know this variable:
559  if (!hasEntryFor(auxid)) {
560  ::Fatal("xAOD::AuxStoreBase::getIOData",
561  XAOD_MESSAGE("Internal logic error detected"));
562  return nullptr;
563  }
564 
565  // Make sure that the right payload is in memory:
566  if (!this_nc->getEntryFor(auxid).isSuccess()) {
567  ::Error("xAOD::AuxStoreBase::getIOData",
568  XAOD_MESSAGE("Couldn't read in variable %s"),
569  SG::AuxTypeRegistry::instance().getName(auxid).c_str());
570  return nullptr;
571  }
572 
573  // Return the pointer.
574  return getInputObject(auxid);
575 }

◆ getIOType()

const std::type_info * xAOD::details::AuxStoreBase::getIOType ( SG::auxid_t  auxid) const
overridevirtualinherited

Return the type of the data to be stored for one aux data item.

Implements SG::IAuxStoreIO.

Definition at line 578 of file AuxStoreBase.cxx.

578  {
579 
580  // Guard against multi-threaded execution:
581  guard_t guard(m_mutex1);
582 
583  // If the variable is connected to already:
584  if (hasEntryFor(auxid)) {
585  return getInputType(auxid);
586  }
587 
588  // Check if it's in the transient store:
589  if (m_data.m_transientStore &&
590  m_data.m_transientStore->getAuxIDs().test(auxid)) {
591  return m_data.m_transientStore->getIOType(auxid);
592  }
593 
594  // If not, try connecting to it now:
595  auto this_nc ATLAS_THREAD_SAFE =
596  const_cast<AuxStoreBase*>(this); // locked above
597  if (!this_nc->setupInputData(auxid).isSuccess()) {
598  ::Error("xAOD::AuxStoreBase::getIOType",
599  XAOD_MESSAGE("Couldn't connect to auxiliary variable "
600  "%i %s"),
601  static_cast<int>(auxid),
602  SG::AuxTypeRegistry::instance().getName(auxid).c_str());
603  return nullptr;
604  }
605 
606  // Now we should know this variable:
607  if (!hasEntryFor(auxid)) {
608  ::Fatal("xAOD::AuxStoreBase::getIOType",
609  XAOD_MESSAGE("Internal logic error detected"));
610  return nullptr;
611  }
612 
613  // Return the type info:
614  return getInputType(auxid);
615 }

◆ getSelectedAuxIDs()

SG::auxid_set_t xAOD::details::AuxStoreBase::getSelectedAuxIDs ( ) const
overridevirtualinherited

Get the IDs of the selected aux variables.

Reimplemented from SG::IAuxStoreIO.

Definition at line 632 of file AuxStoreBase.cxx.

632  {
633 
634  // Guard against multi-threaded execution:
635  guard_t guard(m_mutex1);
636  // Leave the calculation up to the internal object:
638 }

◆ getVector()

const SG::IAuxTypeVector * xAOD::details::AuxStoreBase::getVector ( SG::auxid_t  auxid) const
overridevirtualinherited

Return vector interface for one aux data item.

Implements SG::IConstAuxStore.

Definition at line 65 of file AuxStoreBase.cxx.

65  {
66 
67  // Guard against multi-threaded execution:
68  guard_t guard(m_mutex1);
69 
70  // Check if the transient store already handles this variable:
72  (m_data.m_transientStore->getAuxIDs().test(auxid))) {
73  return m_data.m_transientStore->getVector(auxid);
74  }
75 
76  // Access the object through a non-const pointer. This is "safe" because
77  // of the mutex lock above.
78  auto this_nc ATLAS_THREAD_SAFE = const_cast<AuxStoreBase*>(this);
79 
80  // Connect this auxiliary variable both to the input and output
81  // if needed:
82  if ((auxid >= m_data.m_vecs.size()) || (!m_data.m_vecs[auxid])) {
83  if ((!this_nc->setupInputData(auxid).isSuccess()) ||
84  (!this_nc->setupOutputData(auxid).isSuccess())) {
85  return nullptr;
86  }
87  }
88 
89  // Make sure the variable is up to date:
90  if (this_nc->getEntryFor(auxid).isSuccess() == false) {
91  ::Error("xAOD::AuxStoreBase::getVector",
92  XAOD_MESSAGE("Couldn't read in variable %s"),
93  SG::AuxTypeRegistry::instance().getName(auxid).c_str());
94  return nullptr;
95  }
96 
97  // Let the AuxTypeVector object know that the std::vector that it manages
98  // has changed. (This updates the cached span.)
99  SG::IAuxTypeVector* vec = m_data.m_vecs[auxid].get();
100  vec->resize (vec->size());
101 
102  // Return the pointer to the object:
103  return vec;
104 }

◆ getWritableAuxIDs()

const SG::auxid_set_t & xAOD::details::AuxStoreBase::getWritableAuxIDs ( ) const
overridevirtualinherited

Return a set of writable data identifiers.

Implements SG::IAuxStore.

Definition at line 375 of file AuxStoreBase.cxx.

375  {
376 
377  return getAuxIDs();
378 }

◆ hasEntryFor()

bool xAOD::RAuxStore::hasEntryFor ( SG::auxid_t  auxid) const
overrideprivatevirtual

Check if a given variable is available from the input.

Implements xAOD::details::AuxStoreBase.

Definition at line 746 of file RAuxStore.cxx.

746  {
747 
748  assert(m_impl);
749  return ((m_impl->m_fields.size() > auxid) && m_impl->m_fields[auxid]);
750 }

◆ hasOutput()

bool xAOD::RAuxStore::hasOutput ( ) const
overrideprivatevirtual

Check if an output is being written by the object.

Implements xAOD::details::AuxStoreBase.

Definition at line 765 of file RAuxStore.cxx.

765  {
766 
767  assert(m_impl);
768  return (m_impl->m_outTuple != nullptr);
769 }

◆ insertMove() [1/2]

virtual bool SG::IAuxStore::insertMove ( size_t  pos,
IAuxStore other,
const SG::auxid_set_t ignore = SG::auxid_set_t() 
)
pure virtualinherited

Move all elements from other to this store.

Parameters
posThe starting index of the insertion.
otherStore from which to do the move.
ignoreSet of variables that should not be added to the store.

Let len be the size of other. The store will be increased in size by len elements, with the elements at pos being copied to pos+len. Then, for each auxiliary variable, the entire contents of that variable for other will be moved to this store at index pos. This will be done via move semantics if possible; otherwise, it will be done with a copy. Variables present in this store but not in other will have the corresponding elements default-initialized. Variables in other but not in this store will be added unless they are in ignore.

Returns true if it is known that none of the vectors' memory moved, false otherwise.

Implemented in SG::AuxStoreInternal.

◆ insertMove() [2/2]

bool xAOD::details::AuxStoreBase::insertMove ( std::size_t  pos,
SG::IAuxStore other,
const SG::auxid_set_t ignore 
)
overridevirtualinherited

Insert contents of another store via move.

Definition at line 469 of file AuxStoreBase.cxx.

470  {
471  // Guard against multi-threaded execution:
472  guard_t guard(m_mutex1);
473 
474  // A sanity check:
476  ::Error("xAOD::AuxStoreBase::insertMove",
477  XAOD_MESSAGE("Should not have been called for single-object "
478  "store"));
479  return false;
480  }
481 
482  bool nomove = true;
483  std::size_t other_size = other.size();
484 
485  SG::auxid_set_t ignore = ignore_in;
486 
487  for (SG::auxid_t id : m_data.m_auxIDs) {
488  SG::IAuxTypeVector* v_dst = nullptr;
489  if (id < m_data.m_vecs.size()) {
490  v_dst = m_data.m_vecs[id].get();
491  }
492  if (v_dst && !v_dst->isLinked()) {
493  ignore.insert(id);
494  if (other.getData(id)) {
495  void* src_ptr = other.getData(id, other_size, other_size);
496  if (src_ptr) {
497  if (!v_dst->insertMove(pos, src_ptr, 0, other_size, other)) {
498  nomove = false;
499  }
500  }
501  } else {
502  const void* orig = v_dst->toPtr();
503  v_dst->shift(pos, other_size);
504  if (orig != v_dst->toPtr()) {
505  nomove = false;
506  }
507  }
508  }
509  }
510 
511  if (m_data.m_transientStore) {
512  if (!m_data.m_transientStore->insertMove(pos, other, ignore))
513  nomove = false;
514  }
515 
516  return nomove;
517 }

◆ isAuxIDSelected()

bool xAOD::details::AuxStoreBase::isAuxIDSelected ( SG::auxid_t  auxid) const
protectedinherited

Check if an auxiliary variable is selected for ouput writing.

This is a tricky one.

The function can't just rely on getSelectedAuxIDs, as the aux ID received here may be a new ID that the object doesn't yet know about. So we have no other choice but to check this ID explicitly.

@apram auxid The auxiliary ID that should be checked

Returns
true if the variable needs to be written out, false if not

Definition at line 648 of file AuxStoreBase.cxx.

648  {
649 
650  // A temporary object:
651  SG::auxid_set_t auxids;
652  auxids.insert(auxid);
653 
654  // Check if the auxid is returned as a selected ID:
655  return m_selection.getSelectedAuxIDs(auxids).size();
656 }

◆ isDecoration()

bool xAOD::details::AuxStoreBase::isDecoration ( SG::auxid_t  auxid) const
overridevirtualinherited

Test if a variable is a decoration.

Implements SG::IConstAuxStore.

Definition at line 193 of file AuxStoreBase.cxx.

193  {
194  if (m_locked) {
195  if (auxid < m_data.m_isDecoration.size() && m_data.m_isDecoration[auxid]) {
196  return true;
197  }
198  if (m_data.m_transientStore) {
199  return m_data.m_transientStore->isDecoration(auxid);
200  }
201  }
202  return false;
203 }

◆ isTopStore()

bool xAOD::details::AuxStoreBase::isTopStore ( ) const
inherited

Check if the object is a "top store", or not.

Definition at line 45 of file AuxStoreBase.cxx.

45  {
46 
47  return m_data.m_topStore;
48 }

◆ linkedVector() [1/3]

const SG::IAuxTypeVector * xAOD::details::AuxStoreBase::linkedVector ( SG::auxid_t  auxid) const
overridevirtualinherited

Return (const) interface for a linked variable.

Reimplemented from SG::IConstAuxStore.

Definition at line 281 of file AuxStoreBase.cxx.

281  {
283  SG::auxid_t linked_id = r.linkedVariable(auxid);
284  guard_t guard(m_mutex1);
285  if (linked_id < m_data.m_vecs.size()) {
286  return m_data.m_vecs[linked_id].get();
287  }
288  if (m_data.m_transientStore) {
290  ->linkedVector(auxid);
291  }
292  return nullptr;
293 }

◆ linkedVector() [2/3]

SG::IAuxTypeVector * xAOD::details::AuxStoreBase::linkedVector ( SG::auxid_t  auxid)
overridevirtualinherited

Return (non-const) interface for a linked variable.

Reimplemented from SG::IAuxStore.

Definition at line 295 of file AuxStoreBase.cxx.

295  {
297  SG::auxid_t linked_id = r.linkedVariable(auxid);
298  guard_t guard(m_mutex1);
299  if (linked_id < m_data.m_vecs.size()) {
300  return m_data.m_vecs[linked_id].get();
301  }
302  if (m_data.m_transientStore) {
303  return m_data.m_transientStore->linkedVector(auxid);
304  }
305  return nullptr;
306 }

◆ linkedVector() [3/3]

virtual const IAuxTypeVector* SG::IConstAuxStore::linkedVector
inlineinherited

Return interface for a linked variable.

Parameters
auxidThe ID of the parent variable.

If auxid has a linked variable, then return the IAuxTypeVector describing it. Otherwise, return nullptr. May return nullptr unconditionally if this store does not support linked variables.

Definition at line 189 of file IConstAuxStore.h.

190  { return nullptr; }

◆ lock()

void xAOD::details::AuxStoreBase::lock ( )
overridevirtualinherited

Lock the object, and don't let decorations be added.

Implements SG::IConstAuxStore.

Definition at line 205 of file AuxStoreBase.cxx.

205  {
206 
207  // Guard against multi-threaded execution:
208  guard_t guard(m_mutex1);
209 
210  m_locked = true;
211  if (m_data.m_transientStore) {
212  m_data.m_transientStore->lock();
213  }
214 }

◆ lockDecoration()

void xAOD::details::AuxStoreBase::lockDecoration ( SG::auxid_t  auxid)
overridevirtualinherited

Lock a decoration.

Implements SG::IConstAuxStore.

Definition at line 246 of file AuxStoreBase.cxx.

246  {
247  if (m_data.m_transientStore) {
248  m_data.m_transientStore->lockDecoration(auxid);
249  }
250  m_data.m_decorIDs.erase(auxid);
251 }

◆ prefix()

const std::string & xAOD::details::AuxStoreBase::prefix ( ) const
inherited

Get the currently configured object name prefix.

Definition at line 40 of file AuxStoreBase.cxx.

40  {
41 
42  return m_data.m_prefix;
43 }

◆ readFrom()

StatusCode xAOD::RAuxStore::readFrom ( ROOT::RNTupleReader &  reader)

Connect the object to an input RNTuple.

This function is called by the infrastructure to connect the object to an input RNTuple whenever a new input file is opened.

Parameters
readerThe reader object set up by a parent object
Returns
StatusCode::SUCCESS if the function was successful, something else otherwise

Definition at line 615 of file RAuxStore.cxx.

615  {
616 
617  assert(m_impl);
618 
619  // Make sure that everything will be re-read after this:
620  reset();
621 
622  // We will need to check again which branches are available:
623  m_impl->m_missingFields.clear();
624 
625  // Remember the tree:
626  m_impl->m_inTuple = &reader;
627 
628  // Catalogue all the branches:
629  RETURN_CHECK("xAOD::RAuxStore::readFrom", m_impl->scanInputTuple());
630 
631  // Return gracefully.
632  return StatusCode::SUCCESS;
633 }

◆ reserve() [1/2]

virtual void SG::IAuxStore::reserve ( size_t  sz)
pure virtualinherited

Change the capacity of all aux data vectors.

Parameters
szThe new capacity.

This should be called when the capacity of the container changes (by reserve). This should change the capacity for the vectors for all aux data items.

Implemented in SG::AuxStoreInternal, xAOD::AuxContainerBase, xAOD::ShallowAuxContainer, xAOD::AuxInfoBase, and xAOD::ByteStreamAuxContainer_v1.

◆ reserve() [2/2]

void xAOD::details::AuxStoreBase::reserve ( std::size_t  size)
overridevirtualinherited

Reserve a given size for the arrays.

Definition at line 413 of file AuxStoreBase.cxx.

413  {
414 
415  // Guard against multi-threaded execution:
416  guard_t guard(m_mutex1);
417 
418  // A sanity check:
419  if ((m_data.m_structMode == EStructMode::kObjectStore) && (size != 1)) {
420  ::Error("xAOD::AuxStoreBase::reserve",
421  XAOD_MESSAGE("size = %i for single-object store"),
422  static_cast<int>(size));
423  return;
424  }
425 
426  for (auto& v : m_data.m_vecs) {
427  if (v && !v->isLinked()) {
428  v->reserve(size);
429  }
430  }
431 
432  if (m_data.m_transientStore) {
433  m_data.m_transientStore->reserve(size);
434  }
435 }

◆ reset()

void xAOD::RAuxStore::reset ( )
overridevirtual

Tell the object that all branches will need to be re-read.

Implements xAOD::details::AuxStoreBase.

Definition at line 734 of file RAuxStore.cxx.

734  {
735 
736  assert(m_impl);
737 
738  for (auto& field : m_impl->m_fields) {
739  if (field) {
740  field->reset();
741  }
742  }
743  m_impl->m_inputScanned = false;
744 }

◆ resize() [1/2]

virtual bool SG::IAuxStore::resize ( size_t  sz)
pure virtualinherited

Change the size of all aux data vectors.

Parameters
szThe new size.

This should be called when the size of the container changes. This should resize the vectors for all aux data items.

If the size of the container grows, the new elements should be default-initialized; if it shrinks, destructors should be run as appropriate.

Should return true if it is known that none of the data pointers changed (and thus the cache does not need to be cleared), false otherwise.

Implemented in SG::AuxStoreInternal, xAOD::AuxContainerBase, xAOD::ShallowAuxContainer, xAOD::AuxInfoBase, and xAOD::ByteStreamAuxContainer_v1.

◆ resize() [2/2]

bool xAOD::details::AuxStoreBase::resize ( std::size_t  size)
overridevirtualinherited

Resize the arrays to a given size.

Definition at line 380 of file AuxStoreBase.cxx.

380  {
381 
382  // Guard against multi-threaded execution:
383  guard_t guard(m_mutex1);
384 
385  // A sanity check:
386  if ((m_data.m_structMode == EStructMode::kObjectStore) && (size != 1)) {
387  ::Error("xAOD::AuxStoreBase::resize",
388  XAOD_MESSAGE("size = %i for single-object store"),
389  static_cast<int>(size));
390  return false;
391  }
392 
393  // Remember the new size:
394  m_data.m_size = size;
395 
396  bool nomoves = true;
397  for (auto& v : m_data.m_vecs) {
398  if (v && !v->isLinked()) {
399  if (!v->resize(size)) {
400  nomoves = false;
401  }
402  }
403  }
404  if (m_data.m_transientStore) {
405  if (!m_data.m_transientStore->resize(size)) {
406  nomoves = false;
407  }
408  }
409 
410  return nomoves;
411 }

◆ selectAux()

void xAOD::details::AuxStoreBase::selectAux ( const std::set< std::string > &  attributes)
virtualinherited

Select dynamic auxiliary attributes for writing.

Definition at line 625 of file AuxStoreBase.cxx.

625  {
626 
627  guard_t guard(m_mutex1);
629 }

◆ setOption()

virtual bool SG::IAuxStore::setOption ( auxid_t  ,
const AuxDataOption  
)
inlinevirtualinherited

Set an option for a given auxiliary variable.

Parameters
auxidThe identifier of the desired aux data item.
optionThe option to set.

The interpretation of the option depends on the particular representation of the variable.

Returns true if the option setting was successful; false otherwise.

Reimplemented in xAOD::AuxContainerBase, xAOD::AuxInfoBase, and SG::AuxStoreInternal.

Definition at line 173 of file IAuxStore.h.

174  { return false; }

◆ setPrefix()

void xAOD::RAuxStore::setPrefix ( std::string_view  prefix)
overridevirtual

Set the object name prefix.

Implements xAOD::details::AuxStoreBase.

Definition at line 601 of file RAuxStore.cxx.

601  {
602 
605  reset();
606 }

◆ setStructMode()

void xAOD::details::AuxStoreBase::setStructMode ( EStructMode  mode)
inherited

Set the structure mode of the object to a new value.

Definition at line 34 of file AuxStoreBase.cxx.

34  {
35 
37  reset();
38 }

◆ setTopStore()

void xAOD::details::AuxStoreBase::setTopStore ( bool  value = true)
inherited

Set whether the object should behave as a "top store" or not.

Definition at line 50 of file AuxStoreBase.cxx.

50  {
51 
53  reset();
54 }

◆ setupInputData()

StatusCode xAOD::RAuxStore::setupInputData ( SG::auxid_t  auxid)
overrideprivatevirtual

Connect a variable to the input.

This internal function takes care of connecting to an individual (sub-)field in the input file for a given auxiliary variable.

Parameters
auxidThe ID of the variable to connect to
Returns
StatusCode::SUCCESS if the function was successful, something else otherwise

Implements xAOD::details::AuxStoreBase.

Definition at line 778 of file RAuxStore.cxx.

778  {
779 
780  // Return right away if we already know that the field is missing.
781  if ((auxid < m_impl->m_missingFields.size()) &&
782  m_impl->m_missingFields[auxid]) {
783  return StatusCode::RECOVERABLE;
784  }
785 
786  // We may call this function without an input being used. That's not an
787  // error either.
788  if (m_impl->m_inTuple == nullptr) {
789  return StatusCode::RECOVERABLE;
790  }
791 
792  // Make sure the internal storage is large enough:
793  if (m_data.m_vecs.size() <= auxid) {
794  m_data.m_vecs.resize(auxid + 1);
795  }
796  if (m_impl->m_fields.size() <= auxid) {
797  m_impl->m_fields.resize(auxid + 1);
798  }
799 
800  // Check if we need to do anything. Remember, output-only variables don't
801  // have an associated RFieldHandle. To tell the caller that no input is
802  // actually available for the variable (only an output), use a different
803  // return value.
804  if (m_data.m_vecs[auxid]) {
805  return (m_impl->m_fields[auxid] ? StatusCode::SUCCESS
806  : StatusCode::RECOVERABLE);
807  }
808 
809  // Convenience access to the registry.
811 
812  // Get the property name:
813  const std::string statFieldName =
814  std::format("{}{}", m_data.m_prefix, r.getName(auxid));
815  const std::string dynFieldName =
816  std::format("{}{}", m_data.m_dynPrefix, r.getName(auxid));
817 
818  // Check if the field exists:
819  std::string fieldName = statFieldName;
820  ROOT::DescriptorId_t fieldId;
821  if ((fieldId = m_impl->m_inTuple->GetDescriptor().FindFieldId(
822  statFieldName)) == std::numeric_limits<unsigned long>::max()) {
823  if ((fieldId = m_impl->m_inTuple->GetDescriptor().FindFieldId(
824  dynFieldName)) == std::numeric_limits<unsigned long>::max()) {
825  // Remember that the field is missing.
826  if (m_impl->m_missingFields.size() <= auxid) {
827  m_impl->m_missingFields.resize(auxid + 1);
828  }
829  m_impl->m_missingFields[auxid] = true;
830  // The field doesn't exist, but this is not an error per se.
831  // The user may just be calling isAvailable(...) on the variable.
832  return StatusCode::RECOVERABLE;
833  }
834  // We have a dynamic field:
835  fieldName = std::move(dynFieldName);
836  }
837 
838  // Get the object describing this field.
839  const ROOT::RFieldDescriptor& fieldDesc =
840  m_impl->m_inTuple->GetDescriptor().GetFieldDescriptor(fieldId);
841 
842  // Check if it's a "primitive field":
843  const bool primitiveField = Utils::isPrimitiveType(fieldDesc.GetTypeName());
844  // Check if it's a "container field":
845  const bool containerField =
846  (primitiveField ? false : isContainerField(fieldDesc, auxid));
847 
848  // Set the structure mode if it has not been defined externally:
852  }
853 
854  // Check that the branch type makes sense:
855  if ((containerField &&
857  !r.isLinked(auxid)) ||
858  ((!containerField) &&
860  ::Error("xAOD::RAuxStore::setupInputData",
861  XAOD_MESSAGE("Field type and requested structure mode "
862  "differ for field: %s"),
863  fieldName.c_str());
864  return StatusCode::FAILURE;
865  }
866 
867  // Get the property type:
868  const std::type_info* fieldType = nullptr;
869  if (details::isRegisteredType(auxid)) {
870  // Get the type from the auxiliary type registry:
871  fieldType = (containerField ? r.getVecType(auxid) : r.getType(auxid));
872  } else {
873  // Get the type from the input field itself:
874  TClass* clDummy = ::TClass::GetClass(fieldDesc.GetTypeName().c_str());
875  fieldType = (clDummy ? clDummy->GetTypeInfo()
876  : &(Utils::getTypeInfo(fieldDesc.GetTypeName())));
877  }
878  if (!fieldType) {
879  ::Error("xAOD::RAuxStore::setupInputData",
880  XAOD_MESSAGE("Can't read/copy variable %s (%s)"), fieldName.c_str(),
881  fieldDesc.GetTypeName().c_str());
882  return StatusCode::RECOVERABLE;
883  }
884  const TString fieldTypeName = Utils::getTypeName(*fieldType).c_str();
885 
886  // Check if we have the needed dictionary for an object field:
887  ::TClass* fieldClass = nullptr;
888  if (!primitiveField) {
889  // Get the property's class:
890  fieldClass = ::TClass::GetClass(*fieldType, true, true);
891  if (!fieldClass) {
892  fieldClass = ::TClass::GetClass(fieldTypeName);
893  }
894  if (!fieldClass) {
895  ::Error("xAOD::RAuxStore::setupInputData",
896  XAOD_MESSAGE("No dictionary available for class \"%s\""),
897  fieldTypeName.Data());
898  return StatusCode::FAILURE;
899  }
900  }
901 
902  // Create the smart object holding this vector:
903  if (details::isRegisteredType(auxid)) {
904  m_data.m_vecs[auxid] = r.makeVector(auxid, (size_t)0, (size_t)0);
905  if (!containerField) {
906  m_data.m_vecs[auxid]->resize(1);
907  }
908  if (fieldClass &&
909  strncmp(fieldClass->GetName(), "SG::PackedContainer<", 20) == 0) {
910  std::unique_ptr<SG::IAuxTypeVector> packed =
911  m_data.m_vecs[auxid]->toPacked();
912  std::swap(m_data.m_vecs[auxid], packed);
913  }
914  } else {
915  ::Error("xAOD::RAuxStore::setupInputData",
916  XAOD_MESSAGE("Couldn't create in-memory vector for "
917  "variable %s (%i)"),
918  fieldName.c_str(), static_cast<int>(auxid));
919  return StatusCode::FAILURE;
920  }
921 
922  // Access/create the field, and create a field handle object.
923  void* objectPtr = (containerField ? m_data.m_vecs[auxid]->toVector()
924  : m_data.m_vecs[auxid]->toPtr());
925  m_impl->m_fields[auxid] = std::make_unique<RFieldHandle>(
926  m_impl->m_inTuple->GetView<void>(fieldName.c_str(), objectPtr), auxid,
927  m_data.m_prefix, objectPtr, fieldType);
928 
929  // Get the current entry.
930  RETURN_CHECK("xAOD::RAuxStore::setupInputData",
931  m_impl->m_fields[auxid]->getEntry(m_impl->m_entry));
932 
933  // Remember which variable got created:
934  m_data.m_auxIDs.insert(auxid);
935 
936  // Check if we just replaced a generic object:
937  if (details::isRegisteredType(auxid)) {
938  // The name of the variable we just created:
939  const std::string auxname = r.getName(auxid);
940  // Check if there's another variable with this name already:
941  for (SG::auxid_t i = 0; i < m_data.m_vecs.size(); ++i) {
942  // Check if we have this aux ID:
943  if (!m_data.m_vecs[i]) {
944  continue;
945  }
946  // Ingore the object that we *just* created:
947  if (i == auxid) {
948  continue;
949  }
950  // The name of the variable:
951  const std::string testname = r.getName(i);
952  // Check if it has the same name:
953  if (testname != auxname) {
954  continue;
955  }
956  // Check that the other one is a non-registered type:
958  ::Error("xAOD::RAuxStore::setupInputData",
959  XAOD_MESSAGE("Internal logic error!"));
960  continue;
961  }
962  // Okay, we do need to remove this object:
963  m_data.m_vecs[i].reset();
964  m_impl->m_fields[i].reset();
966  }
967  }
968 
969  SG::auxid_t linked_auxid = r.linkedVariable(auxid);
970  if (linked_auxid != SG::null_auxid) {
971  return setupInputData(linked_auxid);
972  }
973 
974  // Return gracefully:
975  return StatusCode::SUCCESS;
976 }

◆ setupOutputData()

StatusCode xAOD::RAuxStore::setupOutputData ( SG::auxid_t  auxid)
overrideprivatevirtual

Connect a variable to the output.

This function is used internally to create an output field with the contents of a single auxiliary variable.

Parameters
auxidThe ID of the variable to create an output field for
Returns
StatusCode::SUCCESS if the function was successful, something else otherwise

Implements xAOD::details::AuxStoreBase.

Definition at line 985 of file RAuxStore.cxx.

985  {
986 
987  assert(m_impl);
988 
989  // Check whether we need to do anything.
990  if (!m_impl->m_outTuple) {
991  return StatusCode::SUCCESS;
992  }
993 
994  // Check if the variable needs to be written out.
995  if (!isAuxIDSelected(auxid)) {
996  return StatusCode::SUCCESS;
997  }
998 
999  // Make sure that containers are large enough:
1000  if (m_data.m_vecs.size() <= auxid) {
1001  m_data.m_vecs.resize(auxid + 1);
1002  }
1003  if (m_impl->m_fieldsWritten.size() <= auxid) {
1004  m_impl->m_fieldsWritten.resize(auxid + 1);
1005  }
1006 
1007  // Check if this auxiliary variable is already in the output:
1008  if (m_impl->m_fieldsWritten[auxid]) {
1009  return StatusCode::SUCCESS;
1010  }
1011 
1012  // After this point, we either succeed with setting up the writing of this
1013  // variable, or the code fails completely. So let's set this flag already,
1014  // as unfortunately we can recursively end up here using the code below.
1015  m_impl->m_fieldsWritten[auxid] = true;
1016 
1017  // The registry:
1019 
1020  // Check if the variable was put into the transient store as a
1021  // decoration, and now needs to be put into the output file:
1022  if ((!m_data.m_vecs[auxid]) && m_data.m_transientStore &&
1023  (m_data.m_transientStore->getAuxIDs().test(auxid))) {
1024 
1025  // Get the variable from the transient store:
1026  const void* pptr = m_data.m_transientStore->getData(auxid);
1027  if (!pptr) {
1028  ::Fatal("xAOD::RAuxStore::setupOutputData",
1029  XAOD_MESSAGE("Internal logic error detected"));
1030  return StatusCode::FAILURE;
1031  }
1032 
1033  // Create the new object:
1034  m_data.m_vecs[auxid] = reg.makeVector(auxid, m_data.m_size, m_data.m_size);
1035  void* ptr = m_data.m_vecs[auxid]->toPtr();
1036  if (!ptr) {
1037  ::Error("xAOD::RAuxStore::setupOutputData",
1038  XAOD_MESSAGE("Couldn't create decoration in memory "
1039  "for writing"));
1040  return StatusCode::FAILURE;
1041  }
1042 
1043  // Get the type of this variable:
1044  const std::type_info* type = reg.getType(auxid);
1045  if (!type) {
1046  ::Error("xAOD::RAuxStore::setupOutputData",
1047  XAOD_MESSAGE("Couldn't get the type of transient "
1048  "variable %i"),
1049  static_cast<int>(auxid));
1050  return StatusCode::FAILURE;
1051  }
1052  // Now get the factory for this variable:
1053  const SG::IAuxTypeVectorFactory* factory = reg.getFactory(auxid);
1054  if (!factory) {
1055  ::Error("xAOD::RAuxStore::setupOutputData",
1056  XAOD_MESSAGE("No factory found for transient variable "
1057  "%i"),
1058  static_cast<int>(auxid));
1059  return StatusCode::FAILURE;
1060  }
1061 
1062  // Mark it as a decoration already, otherwise the copy may fail.
1063  if (m_data.m_isDecoration.size() <= auxid) {
1064  m_data.m_isDecoration.resize(auxid + 1);
1065  }
1066  m_data.m_isDecoration[auxid] = true;
1067 
1068  // Finally, do the copy, and remove the variable from the transient store.
1069  factory->copy(auxid, SG::AuxVectorInterface(*this), 0,
1071  m_data.m_size);
1072  }
1073 
1074  // Check if we know about this variable to be on the input,
1075  // but haven't connected to it yet:
1076  if ((m_data.m_auxIDs.test(auxid)) && (!m_data.m_vecs[auxid]) &&
1077  (!m_impl->m_fields[auxid])) {
1078  RETURN_CHECK("xAOD::RAuxStore::setupOutputData", setupInputData(auxid));
1079  }
1080 
1081  // Check that we know the store's type:
1084  ::Error("xAOD::RAuxStore::setupOutputData",
1085  XAOD_MESSAGE("Structure mode unknown for variable %s"),
1086  reg.getName(auxid).c_str());
1087  return StatusCode::FAILURE;
1088  }
1089 
1090  // Check if the variable exists already in memory:
1091  if (!m_data.m_vecs[auxid]) {
1092  m_data.m_vecs[auxid] = reg.makeVector(auxid, (size_t)0, (size_t)0);
1094  m_data.m_vecs[auxid]->resize(1);
1095  }
1096  }
1097 
1098  // Figure out the type and name of the output field.
1099  const std::string fieldName =
1100  std::format("{}{}", m_data.m_dynPrefix, reg.getName(auxid));
1101  const std::string typeName = SG::normalizedTypeinfoName(
1103  ? reg.getVecType(auxid)
1104  : reg.getType(auxid)));
1105 
1106  // Update the output ntuple's model.
1107  {
1108  auto field = ROOT::RFieldBase::Create(fieldName, typeName).Unwrap();
1109  auto updater = m_impl->m_outTuple->CreateModelUpdater();
1110  updater->BeginUpdate();
1111  updater->AddField(std::move(field));
1112  updater->CommitUpdate();
1113  }
1114 
1115  // Remember that we now handle this variable.
1116  m_data.m_auxIDs.insert(auxid);
1117 
1118  // We were successful:
1119  return StatusCode::SUCCESS;
1120 }

◆ shift() [1/2]

virtual void SG::IAuxStore::shift ( size_t  pos,
ptrdiff_t  offs 
)
pure virtualinherited

Shift the elements of the container.

Parameters
posThe starting index for the shift.
offsThe (signed) amount of the shift.

This operation shifts the elements in the vectors for all aux data items, to implement an insertion or deletion. offs may be either positive or negative.

If offs is positive, then the container is growing. The container size should be increased by offs, the element at pos moved to pos + offs, and similarly for following elements. The elements between pos and pos + offs should be default-initialized.

If offs is negative, then the container is shrinking. The element at pos should be moved to pos + offs, and similarly for following elements. The container should then be shrunk by -offs elements (running destructors as appropriate).

Implemented in SG::AuxStoreInternal, xAOD::AuxContainerBase, xAOD::ShallowAuxContainer, xAOD::AuxInfoBase, and xAOD::ByteStreamAuxContainer_v1.

◆ shift() [2/2]

void xAOD::details::AuxStoreBase::shift ( std::size_t  pos,
std::ptrdiff_t  offs 
)
overridevirtualinherited

Shift the contents of the stored arrays.

Definition at line 437 of file AuxStoreBase.cxx.

437  {
438 
439  // Guard against multi-threaded execution:
440  guard_t guard(m_mutex1);
441 
442  // A sanity check:
444  ::Error("xAOD::AuxStoreBase::shift",
445  XAOD_MESSAGE("Should not have been called for single-object "
446  "store"));
447  return;
448  }
449 
450  // Adjust the size of the container:
451  if ((static_cast<std::size_t>(std::abs(offs)) > m_data.m_size) &&
452  (offs < 0)) {
453  m_data.m_size = 0;
454  } else {
455  m_data.m_size += offs;
456  }
457 
458  for (auto& v : m_data.m_vecs) {
459  if (v && !v->isLinked()) {
460  v->shift(pos, offs);
461  }
462  }
463 
464  if (m_data.m_transientStore) {
465  m_data.m_transientStore->shift(pos, offs);
466  }
467 }

◆ size()

std::size_t xAOD::details::AuxStoreBase::size ( ) const
overridevirtualinherited

Return the number of elements in the store.

Implements SG::IConstAuxStore.

Definition at line 253 of file AuxStoreBase.cxx.

253  {
254 
255  // First, try to find a managed vector in the store:
256  for (SG::auxid_t id : m_data.m_auxIDs) {
257  // Make sure that we are still within the bounds of our vector:
258  if (id >= m_data.m_vecs.size())
259  break;
260  // Skip non-existent or linked objects:
261  if (!m_data.m_vecs[id] || m_data.m_vecs[id]->isLinked()) {
262  continue;
263  }
264  // Ask the vector for its size:
265  const std::size_t size = m_data.m_vecs[id]->size();
266  // Only accept a non-zero size. Not sure why...
267  if (size > 0) {
268  return size;
269  }
270  }
271 
272  // Check if we have a transient store, and get the size from that:
273  if (m_data.m_transientStore) {
274  return m_data.m_transientStore->size();
275  }
276 
277  // Apparently the store is empty:
278  return 0;
279 }

◆ structMode()

auto xAOD::details::AuxStoreBase::structMode ( ) const
inherited

Get what structure mode the object was constructed with.

Definition at line 29 of file AuxStoreBase.cxx.

29  {
30 
31  return m_data.m_structMode;
32 }

◆ writeTo()

StatusCode xAOD::RAuxStore::writeTo ( ROOT::RNTupleWriter &  writer)

Add the variables of the store to an output RNTuple.

This function is called by the infrastructure to connect the object to an output RNTuple.

Parameters
writerThe writer object used for creating an output ntuple
Returns
kTRUE if successful, kFALSE otherwise

Definition at line 641 of file RAuxStore.cxx.

641  {
642 
643  assert(m_impl);
644 
645  // Look for any auxiliary fields that have not been connected to yet.
646  RETURN_CHECK("xAOD::RAuxStore::writeTo", m_impl->scanInputTuple());
647 
648  // Put the object into "output writing" mode.
649  m_impl->m_outTuple = &writer;
650 
651  // Create all the variables that we already know about. Notice that the
652  // code makes a copy of the auxid set on purpose. Because the underlying
653  // AuxSelection object gets modified while doing the for loop.
654  const SG::auxid_set_t selAuxIDs = getSelectedAuxIDs();
655  for (SG::auxid_t id : selAuxIDs) {
656  RETURN_CHECK("xAOD::RAuxStore::writeTo", setupOutputData(id));
657  }
658 
659  // Return gracefully.
660  return StatusCode::SUCCESS;
661 }

Member Data Documentation

◆ m_data

Members xAOD::details::AuxStoreBase::m_data
protectedinherited

Member variables of the base class.

Definition at line 201 of file AuxStoreBase.h.

◆ m_impl

std::unique_ptr<impl> xAOD::RAuxStore::m_impl
private

Pointer to the internal object.

Definition at line 89 of file RAuxStore.h.

◆ m_locked

bool xAOD::details::AuxStoreBase::m_locked = false
privateinherited

Is this container locked?

Definition at line 212 of file AuxStoreBase.h.

◆ m_mutex1

mutex_t xAOD::details::AuxStoreBase::m_mutex1
mutableprivateinherited

Mutex objects used for multithreaded synchronisation.

Definition at line 214 of file AuxStoreBase.h.

◆ m_mutex2

mutex_t xAOD::details::AuxStoreBase::m_mutex2
privateinherited

Definition at line 214 of file AuxStoreBase.h.

◆ m_selection

AuxSelection xAOD::details::AuxStoreBase::m_selection
privateinherited

Object helping to select which auxiliary variables to write.

Definition at line 210 of file AuxStoreBase.h.

◆ supportsThinning

constexpr bool SG::IAuxStore::supportsThinning = true
staticconstexprinherited

Mark that this type supports thinning operations.

See AthContainers/supportsThinning.h and AthenaPoolCnvSvc/T_AthenaPoolCnv.h. Helps guide which pool converter template will be used. If false, the default pool converter will be used rather than the aux store-specific one. Ordinary xAOD type should not touch this, but may be overridden in a derived class to handle certain special cases.

Definition at line 199 of file IAuxStore.h.


The documentation for this class was generated from the following files:
SG::AuxTypeRegistry::getFactory
const IAuxTypeVectorFactory * getFactory(const std::type_info &ti, const std::type_info &ti_alloc)
Return the vector factory for a given vector element type.
Definition: AuxTypeRegistry.cxx:1111
xAOD::details::AuxStoreBase::prefix
const std::string & prefix() const
Get the currently configured object name prefix.
Definition: AuxStoreBase.cxx:40
SG::IAuxTypeVector::shift
virtual bool shift(size_t pos, ptrdiff_t offs)=0
Shift the elements of the vector.
SG::IAuxTypeVector::isLinked
bool isLinked() const
Return true if this variable is linked from another one.
Definition: IAuxTypeVector.h:226
beamspotman.r
def r
Definition: beamspotman.py:672
RETURN_CHECK
#define RETURN_CHECK(CONTEXT, EXP)
Helper macro for checking return codes in a compact form in the code.
Definition: ReturnCheck.h:26
get_generator_info.result
result
Definition: get_generator_info.py:21
vtune_athena.format
format
Definition: vtune_athena.py:14
xAOD::details::AuxStoreBase::Members::m_vecs
std::vector< std::unique_ptr< SG::IAuxTypeVector > > m_vecs
Variables handled currently by the object (indexed by auxiliary ID)
Definition: AuxStoreBase.h:191
xAOD::RAuxStore::setPrefix
virtual void setPrefix(std::string_view prefix) override
Set the object name prefix.
Definition: RAuxStore.cxx:601
SG::AuxTypeRegistry::instance
static AuxTypeRegistry & instance()
Return the singleton registry instance.
Definition: AuxTypeRegistry.cxx:640
xAOD::details::AuxStoreBase::getAuxIDs
virtual const SG::auxid_set_t & getAuxIDs() const override
Get the types(names) of variables handled by this container.
Definition: AuxStoreBase.cxx:106
xAOD::details::AuxStoreBase::getInputType
virtual const std::type_info * getInputType(SG::auxid_t auxid) const =0
Get the type of an input object, for getIOType()
SG::normalizedTypeinfoName
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...
Definition: normalizedTypeinfoName.cxx:120
max
constexpr double max()
Definition: ap_fixedTest.cxx:33
SG::AuxTypeRegistry::getName
std::string getName(SG::auxid_t auxid) const
Return the name of an aux data item.
Definition: AuxTypeRegistry.cxx:882
SG::ExcStoreLocked
Exception — Attempted to modify auxiliary data in a locked store.
Definition: Control/AthContainers/AthContainers/exceptions.h:183
xAOD::details::AuxStoreBase::Members::m_auxIDs
SG::auxid_set_t m_auxIDs
Internal list of auxiliary variable IDs handled currently by the object.
Definition: AuxStoreBase.h:186
xAOD::details::AuxStoreBase::Members::m_transientStore
std::unique_ptr< SG::AuxStoreInternal > m_transientStore
Store for the in-memory-only variables.
Definition: AuxStoreBase.h:183
xAOD::Utils::dynFieldPrefix
std::string dynFieldPrefix(const std::string &key)
This function is used to figure out what to name dynamic auxiliary field coming from a container call...
Definition: Control/xAODRootAccess/Root/Utils.cxx:170
xAOD::other
@ other
Definition: TrackingPrimitives.h:510
athena.value
value
Definition: athena.py:124
xAOD::details::AuxStoreBase::Members::m_size
std::size_t m_size
The current size of the container being described.
Definition: AuxStoreBase.h:193
SG::IAuxTypeVector::insertMove
virtual bool insertMove(size_t pos, void *src, size_t src_pos, size_t src_n, IAuxStore &srcStore)=0
Insert elements into the vector via move semantics.
xAOD::details::AuxStoreBase::hasOutput
virtual bool hasOutput() const =0
Check if an output is being written by the object.
xAOD::details::isRegisteredType
bool isRegisteredType(SG::auxid_t auxid)
Check if the auxiliary variable has a registered type.
Definition: isRegisteredType.cxx:11
XAOD_MESSAGE
#define XAOD_MESSAGE(MESSAGE)
Simple macro for printing error/verbose messages.
Definition: Control/xAODRootAccess/xAODRootAccess/tools/Message.h:19
vec
std::vector< size_t > vec
Definition: CombinationsGeneratorTest.cxx:9
xAOD::Utils::isPrimitiveType
bool isPrimitiveType(std::string_view typeName)
Check if the type name describes a primitive type.
Definition: Control/xAODRootAccess/Root/Utils.cxx:280
ReadOfcFromCool.field
field
Definition: ReadOfcFromCool.py:48
dbg::ptr
void * ptr(T *p)
Definition: SGImplSvc.cxx:74
xAOD::details::AuxStoreBase::hasEntryFor
virtual bool hasEntryFor(SG::auxid_t auxid) const =0
Check if a given variable is available from the input.
xAOD::details::AuxStoreBase::EStructMode::kObjectStore
@ kObjectStore
The object describes a single object.
xAOD::RAuxStore::setupOutputData
virtual StatusCode setupOutputData(SG::auxid_t auxid) override
Connect a variable to the output.
Definition: RAuxStore.cxx:985
xAOD::details::AuxStoreBase::EStructMode::kContainerStore
@ kContainerStore
The object describes an entire container.
python.CaloAddPedShiftConfig.type
type
Definition: CaloAddPedShiftConfig.py:42
CxxUtils::ConcurrentBitset::clear
ConcurrentBitset & clear()
Clear all bits in the set.
xAOD::details::AuxStoreBase::size
virtual std::size_t size() const override
Return the number of elements in the store.
Definition: AuxStoreBase.cxx:253
dumpTruth.getName
getName
Definition: dumpTruth.py:34
xAOD::details::AuxStoreBase::Members::m_decorIDs
SG::auxid_set_t m_decorIDs
Internal list of auxiliary decoration IDs handled currently by the object.
Definition: AuxStoreBase.h:189
SG::AuxTypeRegistry
Handle mappings between names and auxid_t.
Definition: AuxTypeRegistry.h:61
CxxUtils::vec
typename vecDetail::vec_typedef< T, N >::type vec
Define a nice alias for the vectorized type.
Definition: vec.h:207
DiTauMassTools::ignore
void ignore(T &&)
Definition: PhysicsAnalysis/TauID/DiTauMassTools/DiTauMassTools/HelperFunctions.h:58
SG::auxid_t
size_t auxid_t
Identifier for a particular aux data item.
Definition: AuxTypes.h:27
SG::AuxTypeRegistry::getType
const std::type_info * getType(SG::auxid_t auxid) const
Return the type of an aux data item.
Definition: AuxTypeRegistry.cxx:909
H5Utils::internal::packed
H5::CompType packed(H5::CompType in)
Definition: common.cxx:16
CxxUtils::ConcurrentBitset::size
bit_t size() const
Count the number of 1 bits in the set.
xAOD::details::AuxStoreBase::reset
virtual void reset()=0
Reset all (transient) information in the object.
xAOD::details::AuxStoreBase::m_data
Members m_data
Member variables of the base class.
Definition: AuxStoreBase.h:201
xAOD::Utils::getTypeName
std::string getTypeName(const std::type_info &ti)
This function is necessary in order to create type names that ROOT can understand.
Definition: Control/xAODRootAccess/Root/Utils.cxx:354
lumiFormat.i
int i
Definition: lumiFormat.py:85
guard_t
AthContainers_detail::lock_guard< mutex_t > guard_t
Guard type for multithreaded synchronisation.
Definition: EventIProxyDict.cxx:36
CxxUtils::ConcurrentBitset::insert
ConcurrentBitset & insert(bit_t bit, bit_t new_nbits=0)
Set a bit to 1.
SG::IAuxTypeVectorFactory
Interface for factory objects that create vectors.
Definition: IAuxTypeVectorFactory.h:50
taskman.fieldName
fieldName
Definition: taskman.py:489
xAOD::details::AuxStoreBase::m_mutex2
mutex_t m_mutex2
Definition: AuxStoreBase.h:214
xAOD::details::AuxStoreBase::Members::m_prefix
std::string m_prefix
Static prefix for the branch names.
Definition: AuxStoreBase.h:178
xAOD::details::AuxStoreBase::getData
virtual const void * getData(SG::auxid_t auxid) const override
Get a pointer to a given array.
Definition: AuxStoreBase.cxx:56
Preparation.mode
mode
Definition: Preparation.py:107
SG::IAuxTypeVectorFactory::copy
virtual void copy(SG::auxid_t auxid, AuxVectorData &dst, size_t dst_index, const AuxVectorData &src, size_t src_index, size_t n) const =0
Copy elements between vectors.
SG::AuxTypeRegistry::getVecType
const std::type_info * getVecType(SG::auxid_t auxid) const
Return the type of the STL vector used to hold an aux data item.
Definition: AuxTypeRegistry.cxx:937
WriteCalibToCool.swap
swap
Definition: WriteCalibToCool.py:94
xAOD::details::AuxStoreBase::setupOutputData
virtual StatusCode setupOutputData(SG::auxid_t auxid)=0
Connect a variable to the output.
xAOD::details::AuxStoreBase::getSelectedAuxIDs
virtual SG::auxid_set_t getSelectedAuxIDs() const override
Get the IDs of the selected aux variables.
Definition: AuxStoreBase.cxx:632
xAOD::details::AuxStoreBase::getVector
virtual const SG::IAuxTypeVector * getVector(SG::auxid_t auxid) const override
Return vector interface for one aux data item.
Definition: AuxStoreBase.cxx:65
xAOD::details::AuxStoreBase::isAuxIDSelected
bool isAuxIDSelected(SG::auxid_t auxid) const
Check if an auxiliary variable is selected for ouput writing.
Definition: AuxStoreBase.cxx:648
GetAllXsec.entry
list entry
Definition: GetAllXsec.py:132
xAOD::details::AuxStoreBase::AuxStoreBase
AuxStoreBase(bool topStore=true, EStructMode mode=EStructMode::kUndefinedStore)
Constructor.
Definition: AuxStoreBase.cxx:24
SG::AuxTypeRegistry::makeVector
std::unique_ptr< IAuxTypeVector > makeVector(SG::auxid_t auxid, size_t size, size_t capacity) const
Construct a new vector to hold an aux item.
Definition: AuxTypeRegistry.cxx:818
id
SG::auxid_t id
Definition: Control/AthContainers/Root/debug.cxx:239
xAOD::details::AuxStoreBase::Members::m_structMode
EStructMode m_structMode
The "structural" mode of the object.
Definition: AuxStoreBase.h:174
CxxUtils::as_const_ptr
const T * as_const_ptr(const T *p)
Helper for getting a const version of a pointer.
Definition: as_const_ptr.h:32
xAOD::RAuxStore::setupInputData
virtual StatusCode setupInputData(SG::auxid_t auxid) override
Connect a variable to the input.
Definition: RAuxStore.cxx:778
python.LumiBlobConversion.pos
pos
Definition: LumiBlobConversion.py:16
xAOD::details::AuxStoreBase::getInputObject
virtual const void * getInputObject(SG::auxid_t auxid) const =0
Get a pointer to an input object, as it is in memory, for getIOData()
xAOD::Utils::getTypeInfo
const std::type_info & getTypeInfo(EDataType type)
This function is used when reading a primitive branch from an input file without the user explicitly ...
Definition: Control/xAODRootAccess/Root/Utils.cxx:194
python.PyAthena.v
v
Definition: PyAthena.py:154
SG::AuxVectorInterface
Make an AuxVectorData object from either a raw array or an aux store.
Definition: AuxVectorInterface.h:33
xAOD::details::AuxStoreBase::m_locked
bool m_locked
Is this container locked?
Definition: AuxStoreBase.h:212
SG::IAuxTypeVector
Abstract interface for manipulating vectors of arbitrary types.
Definition: IAuxTypeVector.h:42
xAOD::details::AuxStoreBase::getIOData
virtual const void * getIOData(SG::auxid_t auxid) const override
Get a pointer to the data being stored for one aux data item.
Definition: AuxStoreBase.cxx:519
xAOD::RAuxStore::reset
virtual void reset() override
Tell the object that all branches will need to be re-read.
Definition: RAuxStore.cxx:734
xAOD::details::AuxStoreBase::m_mutex1
mutex_t m_mutex1
Mutex objects used for multithreaded synchronisation.
Definition: AuxStoreBase.h:214
xAOD::details::AuxStoreBase::EStructMode::kUndefinedStore
@ kUndefinedStore
The structure mode is not defined.
ReadCalibFromCool.typeName
typeName
Definition: ReadCalibFromCool.py:477
SG::auxid_set_t
A set of aux data identifiers.
Definition: AuxTypes.h:47
ZDCMsg::Fatal
@ Fatal
Definition: ZDCMsg.h:23
ATLAS_THREAD_SAFE
#define ATLAS_THREAD_SAFE
Definition: checker_macros.h:211
xAOD::AuxSelection::selectAux
virtual void selectAux(const std::set< std::string > &attributes)
Select which variables should be written out.
Definition: AuxSelection.cxx:47
xAOD::RAuxStore::m_impl
std::unique_ptr< impl > m_impl
Pointer to the internal object.
Definition: RAuxStore.h:87
collisions.reader
reader
read the goodrunslist xml file(s)
Definition: collisions.py:22
CxxUtils::ConcurrentBitset::erase
ConcurrentBitset & erase(bit_t bit)
Turn off one bit.
xAOD::details::AuxStoreBase::Members::m_isDecoration
std::vector< bool > m_isDecoration
Per variable lock status (indexed by auxiliary ID)
Definition: AuxStoreBase.h:196
xAOD::AuxSelection::getSelectedAuxIDs
virtual SG::auxid_set_t getSelectedAuxIDs(const SG::auxid_set_t &fullset) const
Return which variables were selected to be written out.
Definition: AuxSelection.cxx:62
example.writer
writer
show summary of content
Definition: example.py:36
xAOD::details::AuxStoreBase::Members::m_dynPrefix
std::string m_dynPrefix
Dynamic prefix for the branch names.
Definition: AuxStoreBase.h:180
xAOD::details::AuxStoreBase::Members::m_topStore
bool m_topStore
Flag stating whether this is a "top store".
Definition: AuxStoreBase.h:176
python.TransformConfig.attributes
def attributes(self)
Definition: TransformConfig.py:383
xAOD::details::AuxStoreBase::m_selection
AuxSelection m_selection
Object helping to select which auxiliary variables to write.
Definition: AuxStoreBase.h:210
SG::IAuxTypeVector::toPtr
virtual void * toPtr()=0
Return a pointer to the start of the vector's data.
CxxUtils::ConcurrentBitset::test
bool test(bit_t bit) const
Test to see if a bit is set.