ATLAS Offline Software
AuxStoreBase.cxx
Go to the documentation of this file.
1 // Copyright (C) 2002-2025 CERN for the benefit of the ATLAS collaboration
2 
3 // Local include(s).
5 
8 
9 // Framework include(s).
14 #include "CxxUtils/as_const_ptr.h"
16 
17 // ROOT include(s):
18 #include <TError.h>
19 
20 #include <atomic>
21 
22 namespace xAOD::details {
23 
25  : m_data{mode, topStore} {}
26 
27 AuxStoreBase::~AuxStoreBase() = default;
28 
30 
31  return m_data.m_structMode;
32 }
33 
35 
37  reset();
38 }
39 
40 const std::string& AuxStoreBase::prefix() const {
41 
42  return m_data.m_prefix;
43 }
44 
46 
47  return m_data.m_topStore;
48 }
49 
51 
53  reset();
54 }
55 
56 const void* AuxStoreBase::getData(SG::auxid_t auxid) const {
57 
58  const SG::IAuxTypeVector* v = getVector(auxid);
59  if (v) {
60  return v->toPtr();
61  }
62  return nullptr;
63 }
64 
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 }
105 
107 
108  return m_data.m_auxIDs;
109 }
110 
112 
113  return m_data.m_decorIDs;
114 }
115 
117  std::size_t capacity) {
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 }
192 
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 }
204 
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 }
215 
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 }
244 
247  if (m_data.m_transientStore) {
248  m_data.m_transientStore->lockDecoration(auxid);
249  }
250  m_data.m_decorIDs.erase(auxid);
251 }
252 
253 std::size_t AuxStoreBase::size() const {
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 }
280 
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 }
294 
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 }
307 
308 void* AuxStoreBase::getData(SG::auxid_t auxid, std::size_t size,
309  std::size_t capacity) {
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 }
374 
376 
377  return getAuxIDs();
378 }
379 
380 bool AuxStoreBase::resize(std::size_t size) {
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 }
412 
413 void AuxStoreBase::reserve(std::size_t size) {
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 }
436 
437 void AuxStoreBase::shift(std::size_t pos, std::ptrdiff_t offs) {
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 }
468 
470  const SG::auxid_set_t& ignore_in) {
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 }
518 
519 const void* AuxStoreBase::getIOData(SG::auxid_t auxid) const {
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 }
576 
578 const std::type_info* AuxStoreBase::getIOType(SG::auxid_t auxid) const {
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 }
616 
618 
619  // All the auxiliary decorations handled by this object are considered
620  // dynamic:
621  return getAuxIDs();
622 }
623 
625 void AuxStoreBase::selectAux(const std::set<std::string>& attributes) {
626 
627  guard_t guard(m_mutex1);
629 }
630 
633 
634  // Guard against multi-threaded execution:
635  guard_t guard(m_mutex1);
636  // Leave the calculation up to the internal object:
638 }
639 
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 }
657 
658 } // namespace xAOD::details
xAOD::details
Definition: AuxStoreBase.cxx:22
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
get_generator_info.result
result
Definition: get_generator_info.py:21
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
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()
m_data
std::vector< T > m_data
Definition: TrackTruthMatchingBaseAlg.cxx:660
xAOD::details::AuxStoreBase::selectAux
virtual void selectAux(const std::set< std::string > &attributes)
Select dynamic auxiliary attributes for writing.
Definition: AuxStoreBase.cxx:625
xAOD::details::AuxStoreBase::setTopStore
void setTopStore(bool value=true)
Set whether the object should behave as a "top store" or not.
Definition: AuxStoreBase.cxx:50
SG::ExcStoreLocked
Exception — Attempted to modify auxiliary data in a locked store.
Definition: Control/AthContainers/AthContainers/exceptions.h:183
xAOD::details::AuxStoreBase::clearDecorations
virtual bool clearDecorations() override
Remove the decorations added so far.
Definition: AuxStoreBase.cxx:216
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
exceptions.h
Exceptions that can be thrown from AthContainers.
xAOD::details::AuxStoreBase::EStructMode
EStructMode
"Structural" modes of the object
Definition: AuxStoreBase.h:30
as_const_ptr.h
Helper for getting a const version of a pointer.
xAOD::details::AuxStoreBase::guard_t
AthContainers_detail::lock_guard< mutex_t > guard_t
Guard type for multithreaded synchronisation.
Definition: AuxStoreBase.h:206
xAOD::details::AuxStoreBase::linkedVector
virtual const SG::IAuxTypeVector * linkedVector(SG::auxid_t auxid) const override
Return (const) interface for a linked variable.
Definition: AuxStoreBase.cxx:281
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::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_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
Utils.h
const
bool const RAWDATA *ch2 const
Definition: LArRodBlockPhysicsV0.cxx:560
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::details::AuxStoreBase::structMode
EStructMode structMode() const
Get what structure mode the object was constructed with.
Definition: AuxStoreBase.cxx:29
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
IAuxTypeVector.h
Abstract interface for manipulating vectors of arbitrary types.
xAOD::details::AuxStoreBase::getDynamicAuxIDs
virtual const SG::auxid_set_t & getDynamicAuxIDs() const override
Get the types(names) of variables created dynamically.
Definition: AuxStoreBase.cxx:617
xAOD::details::AuxStoreBase::getWritableAuxIDs
virtual const SG::auxid_set_t & getWritableAuxIDs() const override
Return a set of writable data identifiers.
Definition: AuxStoreBase.cxx:375
SG::AuxTypeRegistry
Handle mappings between names and auxid_t.
Definition: AuxTypeRegistry.h:61
xAOD::details::AuxStoreBase
Common base class for the auxiliary store implementations.
Definition: AuxStoreBase.h:26
python.setupRTTAlg.size
int size
Definition: setupRTTAlg.py:39
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
xAOD::details::AuxStoreBase::~AuxStoreBase
virtual ~AuxStoreBase()
Destructor.
xAOD::details::AuxStoreBase::getDecorIDs
virtual const SG::auxid_set_t & getDecorIDs() const override
Get the types(names) of decorations handled by this container.
Definition: AuxStoreBase.cxx:111
SG::auxid_t
size_t auxid_t
Identifier for a particular aux data item.
Definition: AuxTypes.h:27
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::details::AuxStoreBase::setStructMode
void setStructMode(EStructMode mode)
Set the structure mode of the object to a new value.
Definition: AuxStoreBase.cxx:34
xAOD::details::AuxStoreBase::getIOType
virtual const std::type_info * getIOType(SG::auxid_t auxid) const override
Return the type of the data to be stored for one aux data item.
Definition: AuxStoreBase.cxx:578
AuxStoreBase.h
CxxUtils::ConcurrentBitset::insert
ConcurrentBitset & insert(bit_t bit, bit_t new_nbits=0)
Set a bit to 1.
Message.h
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
xAOD::details::AuxStoreBase::lock
virtual void lock() override
Lock the object, and don't let decorations be added.
Definition: AuxStoreBase.cxx:205
Preparation.mode
mode
Definition: Preparation.py:107
xAOD::details::AuxStoreBase::resize
virtual bool resize(std::size_t size) override
Resize the arrays to a given size.
Definition: AuxStoreBase.cxx:380
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
xAOD::details::AuxStoreBase::AuxStoreBase
AuxStoreBase(bool topStore=true, EStructMode mode=EStructMode::kUndefinedStore)
Constructor.
Definition: AuxStoreBase.cxx:24
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::details::AuxStoreBase::insertMove
virtual bool insertMove(std::size_t pos, SG::IAuxStore &other, const SG::auxid_set_t &ignore) override
Insert contents of another store via move.
Definition: AuxStoreBase.cxx:469
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::details::AuxStoreBase::shift
virtual void shift(std::size_t pos, std::ptrdiff_t offs) override
Shift the contents of the stored arrays.
Definition: AuxStoreBase.cxx:437
SG::IAuxStore
Interface for non-const operations on an auxiliary store.
Definition: IAuxStore.h:48
python.PyAthena.v
v
Definition: PyAthena.py:154
xAOD::details::AuxStoreBase::m_locked
bool m_locked
Is this container locked?
Definition: AuxStoreBase.h:212
xAOD::details::AuxStoreBase::reserve
virtual void reserve(std::size_t size) override
Reserve a given size for the arrays.
Definition: AuxStoreBase.cxx:413
xAOD::details::AuxStoreBase::isTopStore
bool isTopStore() const
Check if the object is a "top store", or not.
Definition: AuxStoreBase.cxx:45
xAOD::details::AuxStoreBase::getDecoration
virtual void * getDecoration(SG::auxid_t auxid, std::size_t size, std::size_t capacity) override
Get a pointer to a given array, creating the array if necessary.
Definition: AuxStoreBase.cxx:116
SG::IAuxTypeVector
Abstract interface for manipulating vectors of arbitrary types.
Definition: IAuxTypeVector.h:42
AuxTypeRegistry.h
Handle mappings between names and auxid_t.
xAOD::details::AuxStoreBase::lockDecoration
virtual void lockDecoration(SG::auxid_t auxid) override
Lock a decoration.
Definition: AuxStoreBase.cxx:246
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::details::AuxStoreBase::m_mutex1
mutex_t m_mutex1
Mutex objects used for multithreaded synchronisation.
Definition: AuxStoreBase.h:214
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
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
checker_macros.h
Define macros for attributes used to control the static checker.
AuxStoreInternal.h
An auxiliary data store that holds data internally.
xAOD::details::AuxStoreBase::isDecoration
virtual bool isDecoration(SG::auxid_t auxid) const override
Test if a variable is a decoration.
Definition: AuxStoreBase.cxx:193
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.