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

Class creating a shallow copy of an existing auxiliary container. More...

#include <ShallowAuxContainer.h>

Inheritance diagram for xAOD::ShallowAuxContainer:
Collaboration diagram for xAOD::ShallowAuxContainer:

Public Types

typedef SG::auxid_t auxid_t
 The aux ID type definition. More...
 
typedef SG::auxid_set_t auxid_set_t
 The aux ID set type definition. More...
 
enum  AuxStoreType { AST_ObjectStore = 0, AST_ContainerStore = 1 }
 Type of the auxiliary store. More...
 

Public Member Functions

 ShallowAuxContainer (bool standalone=false)
 Default constructor. More...
 
 ShallowAuxContainer (const ShallowAuxContainer &parent)
 Copy constructor. More...
 
 ShallowAuxContainer (const DataLink< SG::IConstAuxStore > &parent, bool standalone=false)
 Constructor with a parent object. More...
 
 ~ShallowAuxContainer ()
 Destructor. More...
 
ShallowAuxContaineroperator= (const ShallowAuxContainer &rhs)
 Assignment operator. More...
 
const DataLink< SG::IConstAuxStore > & parent () const
 Get the parent store. More...
 
void setParent (const DataLink< SG::IConstAuxStore > &link)
 Set the parent store. More...
 
bool shallowIO () const
 Check whether only the overriden parameters will be written out or not. More...
 
void setShallowIO (bool value)
 Set whether only the overriden parameters should be written out. More...
 
virtual const void * getData (SG::auxid_t auxid) const=0
 Pick up the const version from the base class. 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...
 
virtual IAuxTypeVector * linkedVector (SG::auxid_t)
 
virtual const IAuxTypeVector * linkedVector (SG::auxid_t) const
 Return interface for a linked variable. More...
 
virtual const IAuxTypeVector * linkedVector (SG::auxid_t) const
 Return interface for a linked variable. More...
 

Static Public Attributes

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

Private Types

typedef AthContainers_detail::recursive_mutex mutex_t
 Mutex for multithread synchronization. More...
 
typedef AthContainers_detail::lock_guard< mutex_tguard_t
 

Private Member Functions

void remakeAuxIDs () const
 

Private Attributes

AuxSelection m_selection
 Dynamic attributes selection implementation. More...
 
SG::IAuxStorem_store
 Internal dynamic auxiliary store object. More...
 
SG::IAuxStoreIOm_storeIO
 The IO interface to the internal auxiliary store. More...
 
bool m_ownsStore
 Flag deciding if the object owns the dynamic store or not. More...
 
bool m_locked
 Flag keeping track of whether this object is locked or not. More...
 
DataLink< SG::IConstAuxStorem_parentLink
 Link to the parent object. More...
 
const SG::IAuxStoreIOm_parentIO
 Optional pointer to the IO interface of the parent object. More...
 
bool m_shallowIO
 Flag for whether to do "shallow IO" or not. More...
 
mutex_t m_mutex
 
auxid_set_t m_auxids ATLAS_THREAD_SAFE
 
auxid_set_t m_decorids ATLAS_THREAD_SAFE
 
bool m_auxidsValid ATLAS_THREAD_SAFE
 
std::string m_name
 Name of the container in memory. Set externally. More...
 

Functions implementing the SG::IAuxStoreHolder interface

virtual SG::IAuxStoregetStore () override
 Get the currently used internal store object. More...
 
virtual const SG::IAuxStoregetStore () const override
 
virtual void setStore (SG::IAuxStore *store) override
 Set a different internal store object. More...
 
virtual AuxStoreType getStoreType () const override
 Return the type of the store object. More...
 

Detailed Description

Class creating a shallow copy of an existing auxiliary container.

During analysis, in order to create objects that override just some of the properties of an original, it's wasteful to make full copies of the objects. Not to mention that the full copies have generally issues with dynamic variables.

The behaviour of this class is that it takes all the properties that it doesn't know about from the parent auxiliary store, but the ones that it has an override for, it provides itself.

The object is persistifiable. The user can choose whether to only write out the variables that were modified wrt. the original container, or possibly all the variables. (In case the original container is not getting written out.)

Author
Attila Krasznahorkay Attil.nosp@m.a.Kr.nosp@m.aszna.nosp@m.hork.nosp@m.ay@ce.nosp@m.rn.c.nosp@m.h
Revision
793737
Date
2017-01-24 21:11:10 +0100 (Tue, 24 Jan 2017)

Definition at line 48 of file ShallowAuxContainer.h.

Member Typedef Documentation

◆ auxid_set_t

The aux ID set type definition.

Definition at line 60 of file ShallowAuxContainer.h.

◆ auxid_t

The aux ID type definition.

Definition at line 58 of file ShallowAuxContainer.h.

◆ guard_t

typedef AthContainers_detail::lock_guard<mutex_t> xAOD::ShallowAuxContainer::guard_t
private

Definition at line 202 of file ShallowAuxContainer.h.

◆ mutex_t

typedef AthContainers_detail::recursive_mutex xAOD::ShallowAuxContainer::mutex_t
private

Mutex for multithread synchronization.

Definition at line 201 of file ShallowAuxContainer.h.

Member Enumeration Documentation

◆ AuxStoreType

Type of the auxiliary store.

In the xAOD EDM we use auxiliary store objects in some cases to describe a single object, and in most cases to describe a container of objects. This enumeration declares which type the object implementing this interface is.

Enumerator
AST_ObjectStore 

The store describes a single object.

AST_ContainerStore 

The store describes a container.

Definition at line 66 of file IAuxStoreHolder.h.

66  {
67  AST_ObjectStore = 0,
69  };

Constructor & Destructor Documentation

◆ ShallowAuxContainer() [1/3]

xAOD::ShallowAuxContainer::ShallowAuxContainer ( bool  standalone = false)

Default constructor.

Parameters
standalonetrue if the store will be used for a standalone object, false for a container

Definition at line 32 of file ShallowAuxContainer.cxx.

33  : m_selection(),
35  m_storeIO( nullptr ), m_ownsStore( true ), m_locked( false ),
36  m_parentLink(), m_parentIO( nullptr ), m_shallowIO( true ),
37  m_auxids (),
38  m_auxidsValid (false),
39  m_name( "UNKNOWN" ) {
40 
41  m_storeIO = dynamic_cast< SG::IAuxStoreIO* >( m_store );
42  }

◆ ShallowAuxContainer() [2/3]

xAOD::ShallowAuxContainer::ShallowAuxContainer ( const ShallowAuxContainer parent)

Copy constructor.

Definition at line 44 of file ShallowAuxContainer.cxx.

46  m_ownsStore( false ),
47  m_auxids (),
48  m_auxidsValid (false)
49  {
50  // Keep the source unmutable during copy
51  guard_t guard( parent.m_mutex );
52  // cppcheck-suppress copyCtorPointerCopying
53  m_store = parent.m_store;
54  m_storeIO = parent.m_storeIO;
55  m_locked = parent.m_locked;
56  m_parentLink = parent.m_parentLink;
57  m_parentIO = parent.m_parentIO;
58  m_shallowIO = parent.m_shallowIO;
59  m_selection = parent.m_selection;
60  m_name = parent.m_name;
61  }

◆ ShallowAuxContainer() [3/3]

xAOD::ShallowAuxContainer::ShallowAuxContainer ( const DataLink< SG::IConstAuxStore > &  parent,
bool  standalone = false 
)

Constructor with a parent object.

Parameters
parentThe parent object to make a shallow copy of
standalonetrue if the store will be used for a standalone object, false for a container

Definition at line 67 of file ShallowAuxContainer.cxx.

70  : m_selection(),
72  m_storeIO( nullptr ), m_ownsStore( true ), m_locked( false ),
73  m_parentLink( parent ), m_parentIO( nullptr ), m_shallowIO( true ),
74  m_auxids (),
75  m_auxidsValid (false),
76  m_name( "UNKNOWN" ) {
77 
78  m_storeIO = dynamic_cast< SG::IAuxStoreIO* >( m_store );
79  m_parentIO = dynamic_cast< const SG::IAuxStoreIO* >( m_parentLink.cptr() );
80  }

◆ ~ShallowAuxContainer()

xAOD::ShallowAuxContainer::~ShallowAuxContainer ( )

Destructor.

Definition at line 82 of file ShallowAuxContainer.cxx.

82  {
83 
84  if( m_ownsStore && m_store ) {
85  delete m_store;
86  }
87  }

Member Function Documentation

◆ clearDecorations()

bool xAOD::ShallowAuxContainer::clearDecorations ( )
overridevirtual

Clear all decorations.

Implements SG::IConstAuxStore.

Definition at line 379 of file ShallowAuxContainer.cxx.

380  {
381  guard_t guard (m_mutex);
382  bool ret = m_store->clearDecorations();
383  if (ret) {
384  remakeAuxIDs();
385  }
386  return ret;
387  }

◆ getAuxIDs()

const ShallowAuxContainer::auxid_set_t & xAOD::ShallowAuxContainer::getAuxIDs ( ) const
overridevirtual

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

Implements SG::IConstAuxStore.

Definition at line 232 of file ShallowAuxContainer.cxx.

232  {
233 
234  guard_t guard( m_mutex );
235  if (!m_auxidsValid) {
236  remakeAuxIDs();
237  }
238  return m_auxids;
239  }

◆ getData() [1/3]

const void * xAOD::ShallowAuxContainer::getData ( auxid_t  auxid) const
overridevirtual

Get a pointer to a given array.

Implements SG::IConstAuxStore.

Definition at line 192 of file ShallowAuxContainer.cxx.

192  {
193 
194  const SG::IAuxTypeVector* v = getVector( auxid );
195  if( v ) {
196  return v->toPtr();
197  }
198  return nullptr;
199  }

◆ getData() [2/3]

void * xAOD::ShallowAuxContainer::getData ( auxid_t  auxid,
size_t  size,
size_t  capacity 
)
overridevirtual

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

Implements SG::IAuxStore.

Definition at line 398 of file ShallowAuxContainer.cxx.

399  {
400 
401  guard_t guard (m_mutex);
402 
403  // Check if we already have this variable by any chance.
404  const void* cptr = m_store->getData( auxid );
405 
406  // Create the variable in the dynamic store:
407  void* ptr = m_store->getData( auxid, size, capacity );
408 
409  remakeAuxIDs();
410 
411  // If in some weird way we already had this variable before, then don't
412  // try to overwrite it with the parent's payload, and finish here already.
413  if( cptr != nullptr ) {
414  return ptr;
415  }
416 
417  // If the parent doesn't have this variable, then we're done already:
418  if( ! m_parentLink.isValid() ) {
419  return ptr;
420  }
421  const void* pptr = m_parentLink->getData( auxid );
422  if( ! pptr ) {
423  return ptr;
424  }
425 
426  // If the variable does exist in the parent, then copy it over to this
427  // store before returning.
428 
429  // Get the registry:
431 
432  // Get the type of this variable:
433  const std::type_info* type = reg.getType( auxid );
434  if( type == nullptr ) {
435  std::ostringstream message;
436  message << "Couldn't find the type of auxiliary ID " << auxid;
437  throw std::runtime_error( message.str() );
438  }
439 
440  // And the allocator type for this variable.
441  const std::type_info* allocType = reg.getAllocType( auxid );
442  if( allocType == nullptr ) {
443  std::ostringstream message;
444  message << "Couldn't find the allocator type of auxiliary ID " << auxid;
445  throw std::runtime_error( message.str() );
446  }
447 
448  // First let's get the vector factory of this variable:
449  const SG::IAuxTypeVectorFactory* factory =
451  if( factory == nullptr ) {
452  std::ostringstream message;
453  message << "Couldn't find a factory for type " << type->name();
454  throw std::runtime_error( message.str() );
455  }
456 
457  // Copy each element of the parent's decoration:
458  factory->copy( auxid,
459  SG::AuxVectorInterface( *this ), 0,
461 
462  // Now we're done:
463  return ptr;
464  }

◆ getData() [3/3]

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

Pick up the const version from the base class.

◆ getDecoration()

void * xAOD::ShallowAuxContainer::getDecoration ( auxid_t  auxid,
size_t  size,
size_t  capacity 
)
overridevirtual

Return the data vector for one aux data decoration item.

Implements SG::IConstAuxStore.

Definition at line 263 of file ShallowAuxContainer.cxx.

265  {
266 
267  guard_t guard( m_mutex );
268 
269  // Check if we already have this variable by any chance.
270  const void* cptr = m_store->getData( auxid );
271 
272  // If the parent has such a variable, then we need to check one more
273  // thing. If it's a decoration on the parent, then we should be allowed
274  // to override it in this (possibly locked) shallow copy. But let's leave
275  // the logic of this up to the parent.
276  if( m_locked && m_parentLink.isValid() &&
277  ( m_parentLink->getAuxIDs().count( auxid ) > 0 ) )
278  {
279  if (!m_parentLink->isDecoration (auxid)) {
280  throw SG::ExcStoreLocked (auxid);
281  }
282  }
283 
284  // If we got this far without any exception, then let the internal store
285  // try to provide the decoration for us:
286  const size_t nids = m_store->getAuxIDs().size();
287  void* result = m_store->getDecoration( auxid, size, capacity );
288  if( result && ( nids != m_store->getAuxIDs().size() ) ) {
289  remakeAuxIDs();
290  }
291 
292  // If we already had this variable before, then don't try to overwrite it
293  // with the parent's payload, and finish here already.
294  if( cptr != nullptr ) {
295  return result;
296  }
297 
298  // If the parent doesn't have this variable, then we're done.
299  if( ! m_parentLink.isValid() ) {
300  return result;
301  }
302  const void* pptr = m_parentLink->getData( auxid );
303  if( pptr == nullptr ) {
304  return result;
305  }
306 
307  // If the variable does exist in the parent, then copy it over to this
308  // store before returning.
309 
310  // Get the registry.
312 
313  // Get the type of this variable.
314  const std::type_info* type = reg.getType( auxid );
315  if( type == nullptr ) {
316  std::ostringstream message;
317  message << "Couldn't find the type of auxiliary ID " << auxid;
318  throw std::runtime_error( message.str() );
319  }
320 
321  // And the allocator type for this variable.
322  const std::type_info* allocType = reg.getAllocType( auxid );
323  if( allocType == nullptr ) {
324  std::ostringstream message;
325  message << "Couldn't find the allocator type of auxiliary ID " << auxid;
326  throw std::runtime_error( message.str() );
327  }
328 
329  // Get the vector factory of this variable.
330  const SG::IAuxTypeVectorFactory* factory =
332  if( factory == nullptr ) {
333  std::ostringstream message;
334  message << "Couldn't find a factory for type " << type->name();
335  throw std::runtime_error( message.str() );
336  }
337 
338  // Copy each element of the parent's decoration.
339  factory->copy( auxid,
340  SG::AuxVectorInterface( *this ), 0,
342 
343  // Now we're done.
344  return result;
345  }

◆ getDecorIDs()

const ShallowAuxContainer::auxid_set_t & xAOD::ShallowAuxContainer::getDecorIDs ( ) const
overridevirtual

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

Implements SG::IConstAuxStore.

Definition at line 242 of file ShallowAuxContainer.cxx.

242  {
243 
244  guard_t guard( m_mutex );
245  if (!m_auxidsValid) {
246  remakeAuxIDs();
247  }
248  return m_decorids;
249  }

◆ getDynamicAuxIDs()

const ShallowAuxContainer::auxid_set_t & xAOD::ShallowAuxContainer::getDynamicAuxIDs ( ) const
overridevirtual

Get the types(names) of variables created dynamically.

Implements SG::IAuxStoreIO.

Definition at line 568 of file ShallowAuxContainer.cxx.

568  {
569 
570  if( m_shallowIO ) {
571  if( m_storeIO ) {
572  return m_store->getAuxIDs();
573  } else {
574  static const auxid_set_t dummy (0);
575  return dummy;
576  }
577  } else {
578  return getAuxIDs();
579  }
580  }

◆ getIOData()

const void * xAOD::ShallowAuxContainer::getIOData ( auxid_t  auxid) const
overridevirtual

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

Implements SG::IAuxStoreIO.

Definition at line 515 of file ShallowAuxContainer.cxx.

515  {
516 
517  guard_t guard (m_mutex);
518  // Do we have it?
519  if( m_storeIO && m_store->getAuxIDs().test (auxid)) {
520  return m_storeIO->getIOData( auxid );
521  }
522 
523  // Do we have a parent that has it?
524  const SG::IAuxStoreIO* parentIO = m_parentIO;
525  if( ( parentIO == nullptr ) && m_parentLink.isValid() ) {
526  parentIO =
527  dynamic_cast< const SG::IAuxStoreIO* >( m_parentLink.cptr() );
528  }
529  if( parentIO ) {
530  return parentIO->getIOData( auxid );
531  }
532 
533  // If not, then where did this variable come from?!?
534  std::cerr << "ERROR xAOD::ShallowAuxContainer::getIOData Unknown "
535  << "variable ("
537  << ") requested" << std::endl;
538  return nullptr;
539  }

◆ getIOType()

const std::type_info * xAOD::ShallowAuxContainer::getIOType ( auxid_t  auxid) const
overridevirtual

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

Implements SG::IAuxStoreIO.

Definition at line 541 of file ShallowAuxContainer.cxx.

541  {
542 
543  guard_t guard (m_mutex);
544  // Do we have it?
545  if( m_storeIO && m_store->getAuxIDs().test (auxid)) {
546  return m_storeIO->getIOType( auxid );
547  }
548 
549  // Do we have a parent that has it?
550  const SG::IAuxStoreIO* parentIO = m_parentIO;
551  if( ( parentIO == nullptr ) && m_parentLink.isValid() ) {
552  parentIO =
553  dynamic_cast< const SG::IAuxStoreIO* >( m_parentLink.cptr() );
554  }
555  if( parentIO ) {
556  return parentIO->getIOType( auxid );
557  }
558 
559  // If not, then where did this variable come from?!?
560  std::cerr << "ERROR xAOD::ShallowAuxContainer::getIOType Unknown "
561  << "variable ("
563  << ") requested" << std::endl;
564  return nullptr;
565  }

◆ getSelectedAuxIDs()

ShallowAuxContainer::auxid_set_t xAOD::ShallowAuxContainer::getSelectedAuxIDs ( ) const
overridevirtual

Get the IDs of the selected dynamic Aux variables (for writing)

Reimplemented from SG::IAuxStoreIO.

Definition at line 583 of file ShallowAuxContainer.cxx.

583  {
584 
585  if( m_shallowIO ) {
586  if( m_storeIO ) {
588  } else {
589  return auxid_set_t();
590  }
591  } else {
593  }
594  }

◆ getStore() [1/2]

const SG::IAuxStore * xAOD::ShallowAuxContainer::getStore ( ) const
overridevirtual

Implements SG::IAuxStoreHolder.

Definition at line 159 of file ShallowAuxContainer.cxx.

160  {
161  return m_store;
162  }

◆ getStore() [2/2]

SG::IAuxStore * xAOD::ShallowAuxContainer::getStore ( )
overridevirtual

Get the currently used internal store object.

Implements SG::IAuxStoreHolder.

Definition at line 154 of file ShallowAuxContainer.cxx.

155  {
156  return m_store;
157  }

◆ getStoreType()

virtual AuxStoreType xAOD::ShallowAuxContainer::getStoreType ( ) const
inlineoverridevirtual

Return the type of the store object.

Implements SG::IAuxStoreHolder.

Reimplemented in xAOD::ShallowAuxInfo.

Definition at line 94 of file ShallowAuxContainer.h.

94 { return AST_ContainerStore; }

◆ getVector()

const SG::IAuxTypeVector * xAOD::ShallowAuxContainer::getVector ( SG::auxid_t  auxid) const
finaloverridevirtual

Return vector interface for one aux data item.

Implements SG::IConstAuxStore.

Definition at line 201 of file ShallowAuxContainer.cxx.

201  {
202 
203  guard_t guard( m_mutex );
204 
205  // Check if we have this variable ourselves. I use getData(...)
206  // instead of getAuxIDs(), as a dynamic store may not have connected
207  // to all the variables yet that it has available...
208  size_t nids = m_store->getAuxIDs().size();
209  const SG::IAuxTypeVector* result = m_store->getVector( auxid );
210  if( result != nullptr && result->toPtr() != nullptr ) {
211  if( nids != m_store->getAuxIDs().size() ) {
212  remakeAuxIDs();
213  }
214  return result;
215  }
216 
217  // If not, then leave it up to the parent object do deal with this:
218  if( m_parentLink.isValid() ) {
219  nids = m_parentLink->getAuxIDs().size();
220  result = m_parentLink->getVector( auxid );
221  if( result && ( nids != m_parentLink->getAuxIDs().size() ) ) {
222  remakeAuxIDs();
223  }
224  return result;
225  }
226 
227  // Apparently the variable wasn't found:
228  return nullptr;
229  }

◆ getWritableAuxIDs()

const ShallowAuxContainer::auxid_set_t & xAOD::ShallowAuxContainer::getWritableAuxIDs ( ) const
overridevirtual

Return a set of writable data identifiers.

Implements SG::IAuxStore.

Definition at line 467 of file ShallowAuxContainer.cxx.

467  {
468 
469  // Only the variables in the dynamic store are writable. Maybe not
470  // even all of those...
471  return m_store->getWritableAuxIDs();
472  }

◆ insertMove() [1/2]

bool xAOD::ShallowAuxContainer::insertMove ( size_t  pos,
IAuxStore &  other,
const SG::auxid_set_t ignore 
)
overridevirtual

Insert contents of another store via move.

Definition at line 498 of file ShallowAuxContainer.cxx.

500  {
501 
502  // Nope, not allowed...
503  throw std::runtime_error( "Trying to call insertMove on a shallow copy "
504  "container" );
505  }

◆ insertMove() [2/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.

◆ isDecoration()

bool xAOD::ShallowAuxContainer::isDecoration ( auxid_t  auxid) const
overridevirtual

Test if a variable is a decoration.

Implements SG::IConstAuxStore.

Definition at line 251 of file ShallowAuxContainer.cxx.

252  {
253  guard_t guard( m_mutex );
254  if (m_parentLink.isValid()) {
255  if (m_parentLink->isDecoration (auxid)) {
256  return true;
257  }
258  }
259  return m_store->isDecoration (auxid);
260  }

◆ linkedVector() [1/3]

virtual IAuxTypeVector* SG::IAuxStore::linkedVector ( SG::auxid_t  )
inlinevirtualinherited

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

Definition at line 187 of file IAuxStore.h.

188  { return nullptr; }

◆ linkedVector() [2/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; }

◆ linkedVector() [3/3]

virtual const IAuxTypeVector* SG::IConstAuxStore::linkedVector ( SG::auxid_t  ) const
inlinevirtualinherited

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.

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

Definition at line 189 of file IConstAuxStore.h.

190  { return nullptr; }

◆ lock()

void xAOD::ShallowAuxContainer::lock ( )
overridevirtual

Lock the container.

Implements ILockable.

Definition at line 349 of file ShallowAuxContainer.cxx.

350  {
351  guard_t guard (m_mutex);
352  m_locked = true;
353  m_store->lock();
354  }

◆ lockDecoration()

void xAOD::ShallowAuxContainer::lockDecoration ( SG::auxid_t  auxid)
overridevirtual

Lock a decoration.

Implements SG::IConstAuxStore.

Definition at line 358 of file ShallowAuxContainer.cxx.

359  {
360  guard_t guard (m_mutex);
361  m_store->lockDecoration (auxid);
362  m_auxidsValid = false;
363  }

◆ name()

const char * xAOD::ShallowAuxContainer::name ( ) const

Get the name of the container instance.

Definition at line 600 of file ShallowAuxContainer.cxx.

600  {
601 
602  return m_name.c_str();
603  }

◆ operator=()

ShallowAuxContainer & xAOD::ShallowAuxContainer::operator= ( const ShallowAuxContainer rhs)

Assignment operator.

Definition at line 90 of file ShallowAuxContainer.cxx.

90  {
91 
92  // Check if anything needs to be done:
93  if( this == &rhs ) {
94  return *this;
95  }
96 
97  // Keep the source unmutable during copy
98  std::scoped_lock lck{m_mutex, rhs.m_mutex};
99 
100  // Clean up if necessary:
101  if( m_ownsStore && m_store ) {
102  delete m_store;
103  m_store = nullptr;
104  }
105 
106  m_selection = rhs.m_selection;
107  m_ownsStore = false;
108  m_store = rhs.m_store;
109  m_storeIO = rhs.m_storeIO;
110  m_locked = rhs.m_locked;
111  m_parentLink = rhs.m_parentLink;
112  m_parentIO = rhs.m_parentIO;
113  m_shallowIO = rhs.m_shallowIO;
114  m_name = rhs.m_name;
115  m_auxids = rhs.m_auxids;
116  m_auxidsValid= rhs.m_auxidsValid;
117 
118  // Return this object:
119  return *this;
120  }

◆ parent()

const DataLink< SG::IConstAuxStore > & xAOD::ShallowAuxContainer::parent ( ) const

Get the parent store.

Definition at line 122 of file ShallowAuxContainer.cxx.

122  {
123 
124  return m_parentLink;
125  }

◆ remakeAuxIDs()

void xAOD::ShallowAuxContainer::remakeAuxIDs ( ) const
private

Definition at line 611 of file ShallowAuxContainer.cxx.

611  {
613  if( m_parentLink.isValid() ) {
614  ids.insert (m_parentLink->getAuxIDs());
615  }
616 
617  auxid_set_t decors = m_store->getDecorIDs();
618  if( m_parentLink.isValid() ) {
619  ids.insert (m_parentLink->getDecorIDs());
620  }
621 
622  m_decorids = std::move(decors);
623  std::atomic_thread_fence( std::memory_order_seq_cst );
624  m_auxids = std::move(ids);
625 
626  m_auxidsValid = true;
627  }

◆ reserve()

void xAOD::ShallowAuxContainer::reserve ( size_t  size)
overridevirtual

Reserve a given size for the arrays.

Implements SG::IAuxStore.

Definition at line 484 of file ShallowAuxContainer.cxx.

484  {
485 
486  // Nope, not allowed...
487  throw std::runtime_error( "Trying to call reserve on a shallow copy "
488  "container" );
489  }

◆ resize()

bool xAOD::ShallowAuxContainer::resize ( size_t  size)
overridevirtual

Resize the arrays to a given size.

Implements SG::IAuxStore.

Definition at line 474 of file ShallowAuxContainer.cxx.

475  {
476  if (size == this->size()) {
477  return false;
478  }
479  // Nope, not allowed...
480  throw std::runtime_error( "Trying to call resize on a shallow copy "
481  "container" );
482  }

◆ setName()

void xAOD::ShallowAuxContainer::setName ( const char name)

Set the name of the container instance.

Definition at line 605 of file ShallowAuxContainer.cxx.

605  {
606 
607  m_name = name;
608  return;
609  }

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

◆ setParent()

void xAOD::ShallowAuxContainer::setParent ( const DataLink< SG::IConstAuxStore > &  link)

Set the parent store.

Definition at line 127 of file ShallowAuxContainer.cxx.

128  {
129 
130  guard_t guard (m_mutex);
131  m_parentLink = link;
132  m_parentIO = dynamic_cast< const SG::IAuxStoreIO* >( m_parentLink.cptr() );
133  m_auxidsValid = false;
134  return;
135  }

◆ setShallowIO()

void xAOD::ShallowAuxContainer::setShallowIO ( bool  value)

Set whether only the overriden parameters should be written out.

Definition at line 142 of file ShallowAuxContainer.cxx.

142  {
143 
144  guard_t guard (m_mutex);
145  m_shallowIO = value;
146  return;
147  }

◆ setStore()

void xAOD::ShallowAuxContainer::setStore ( SG::IAuxStore store)
overridevirtual

Set a different internal store object.

Implements SG::IAuxStoreHolder.

Definition at line 164 of file ShallowAuxContainer.cxx.

164  {
165 
166  // Check if anything needs to be done:
167  guard_t guard (m_mutex);
168  if( store == m_store ) return;
169 
170  if( m_ownsStore && m_store ) {
171  delete m_store;
172  m_store = nullptr;
173  }
174 
175  // Do the assignment:
176  m_store = store;
177  m_storeIO = dynamic_cast< SG::IAuxStoreIO* >( m_store );
178  m_ownsStore = true;
179  m_auxidsValid = false;
180 
181  return;
182  }

◆ shallowIO()

bool xAOD::ShallowAuxContainer::shallowIO ( ) const

Check whether only the overriden parameters will be written out or not.

Definition at line 137 of file ShallowAuxContainer.cxx.

137  {
138 
139  return m_shallowIO;
140  }

◆ shift()

void xAOD::ShallowAuxContainer::shift ( size_t  pos,
ptrdiff_t  offs 
)
overridevirtual

Shift the contents of the stored arrays.

Implements SG::IAuxStore.

Definition at line 491 of file ShallowAuxContainer.cxx.

491  {
492 
493  // Nope, not allowed...
494  throw std::runtime_error( "Trying to call shift on a shallow copy "
495  "container" );
496  }

◆ size()

size_t xAOD::ShallowAuxContainer::size ( ) const
overridevirtual

Get the size of the container.

Implements SG::IConstAuxStore.

Definition at line 365 of file ShallowAuxContainer.cxx.

365  {
366 
367  guard_t guard( m_mutex );
368  size_t sz = m_store->size();
369  if( sz > 0 ) {
370  return sz;
371  }
372  if( m_parentLink.isValid() ) {
373  return m_parentLink->size();
374  }
375  return 0;
376  }

Member Data Documentation

◆ ATLAS_THREAD_SAFE [1/3]

auxid_set_t m_auxids xAOD::ShallowAuxContainer::ATLAS_THREAD_SAFE
mutableprivate

Definition at line 207 of file ShallowAuxContainer.h.

◆ ATLAS_THREAD_SAFE [2/3]

auxid_set_t m_decorids xAOD::ShallowAuxContainer::ATLAS_THREAD_SAFE
mutableprivate

Definition at line 208 of file ShallowAuxContainer.h.

◆ ATLAS_THREAD_SAFE [3/3]

bool m_auxidsValid xAOD::ShallowAuxContainer::ATLAS_THREAD_SAFE
mutableprivate

Definition at line 209 of file ShallowAuxContainer.h.

◆ m_locked

bool xAOD::ShallowAuxContainer::m_locked
private

Flag keeping track of whether this object is locked or not.

Definition at line 191 of file ShallowAuxContainer.h.

◆ m_mutex

mutex_t xAOD::ShallowAuxContainer::m_mutex
mutableprivate

Definition at line 203 of file ShallowAuxContainer.h.

◆ m_name

std::string xAOD::ShallowAuxContainer::m_name
private

Name of the container in memory. Set externally.

Definition at line 212 of file ShallowAuxContainer.h.

◆ m_ownsStore

bool xAOD::ShallowAuxContainer::m_ownsStore
private

Flag deciding if the object owns the dynamic store or not.

Definition at line 189 of file ShallowAuxContainer.h.

◆ m_parentIO

const SG::IAuxStoreIO* xAOD::ShallowAuxContainer::m_parentIO
private

Optional pointer to the IO interface of the parent object.

Definition at line 196 of file ShallowAuxContainer.h.

◆ m_parentLink

DataLink< SG::IConstAuxStore > xAOD::ShallowAuxContainer::m_parentLink
private

Link to the parent object.

Definition at line 194 of file ShallowAuxContainer.h.

◆ m_selection

AuxSelection xAOD::ShallowAuxContainer::m_selection
private

Dynamic attributes selection implementation.

Definition at line 182 of file ShallowAuxContainer.h.

◆ m_shallowIO

bool xAOD::ShallowAuxContainer::m_shallowIO
private

Flag for whether to do "shallow IO" or not.

Definition at line 198 of file ShallowAuxContainer.h.

◆ m_store

SG::IAuxStore* xAOD::ShallowAuxContainer::m_store
private

Internal dynamic auxiliary store object.

Definition at line 185 of file ShallowAuxContainer.h.

◆ m_storeIO

SG::IAuxStoreIO* xAOD::ShallowAuxContainer::m_storeIO
private

The IO interface to the internal auxiliary store.

Definition at line 187 of file ShallowAuxContainer.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
SGTest::store
TestStore store
Definition: TestStore.cxx:23
SG::IConstAuxStore::getData
virtual const void * getData(SG::auxid_t auxid) const =0
Return the data vector for one aux data item.
SG::IConstAuxStore::lockDecoration
virtual void lockDecoration(SG::auxid_t auxid)=0
Lock a decoration.
fitman.sz
sz
Definition: fitman.py:527
get_generator_info.result
result
Definition: get_generator_info.py:21
CxxUtils::ConcurrentBitset::count
bit_t count() const
Count the number of 1 bits in the set.
SG::IConstAuxStore::getVector
virtual const IAuxTypeVector * getVector(SG::auxid_t auxid) const =0
Return vector interface for one aux data item.
L1CaloPhase1Monitoring.standalone
standalone
Definition: L1CaloPhase1Monitoring.py:139
SG::AuxTypeRegistry::instance
static AuxTypeRegistry & instance()
Return the singleton registry instance.
Definition: AuxTypeRegistry.cxx:640
xAOD::ShallowAuxContainer::parent
const DataLink< SG::IConstAuxStore > & parent() const
Get the parent store.
Definition: ShallowAuxContainer.cxx:122
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::ShallowAuxContainer::getVector
virtual const SG::IAuxTypeVector * getVector(SG::auxid_t auxid) const override final
Return vector interface for one aux data item.
Definition: ShallowAuxContainer.cxx:201
SG::AuxTypeRegistry::getAllocType
const std::type_info * getAllocType(SG::auxid_t auxid) const
Return the type of the vector allocator.
Definition: AuxTypeRegistry.cxx:965
athena.value
value
Definition: athena.py:124
xAOD::ShallowAuxContainer::name
const char * name() const
Get the name of the container instance.
Definition: ShallowAuxContainer.cxx:600
dbg::ptr
void * ptr(T *p)
Definition: SGImplSvc.cxx:74
xAOD::ShallowAuxContainer::m_selection
AuxSelection m_selection
Dynamic attributes selection implementation.
Definition: ShallowAuxContainer.h:182
xAOD::ShallowAuxContainer::m_shallowIO
bool m_shallowIO
Flag for whether to do "shallow IO" or not.
Definition: ShallowAuxContainer.h:198
SG::IAuxStoreIO::getIOType
virtual const std::type_info * getIOType(SG::auxid_t auxid) const =0
Return the type of the data to be stored for one aux data item.
xAOD::ShallowAuxContainer::size
virtual size_t size() const override
Get the size of the container.
Definition: ShallowAuxContainer.cxx:365
ReweightUtils.message
message
Definition: ReweightUtils.py:15
SG::IConstAuxStore::size
virtual size_t size() const =0
Return the number of elements in the store.
xAOD::ShallowAuxContainer::m_ownsStore
bool m_ownsStore
Flag deciding if the object owns the dynamic store or not.
Definition: ShallowAuxContainer.h:189
python.CaloAddPedShiftConfig.type
type
Definition: CaloAddPedShiftConfig.py:42
SG::IAuxStoreIO
Interface providing I/O for a generic auxiliary store.
Definition: IAuxStoreIO.h:44
SG::AuxTypeRegistry
Handle mappings between names and auxid_t.
Definition: AuxTypeRegistry.h:61
xAOD::ShallowAuxContainer::m_name
std::string m_name
Name of the container in memory. Set externally.
Definition: ShallowAuxContainer.h:212
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
xAOD::ShallowAuxContainer::m_parentLink
DataLink< SG::IConstAuxStore > m_parentLink
Link to the parent object.
Definition: ShallowAuxContainer.h:194
CxxUtils::ConcurrentBitset::size
bit_t size() const
Count the number of 1 bits in the set.
SG::IConstAuxStore::clearDecorations
virtual bool clearDecorations()=0
Clear all decorations.
xAOD::ShallowAuxContainer::m_mutex
mutex_t m_mutex
Definition: ShallowAuxContainer.h:203
guard_t
AthContainers_detail::lock_guard< mutex_t > guard_t
Guard type for multithreaded synchronisation.
Definition: EventIProxyDict.cxx:36
SG::IAuxTypeVectorFactory
Interface for factory objects that create vectors.
Definition: IAuxTypeVectorFactory.h:50
xAOD::ShallowAuxContainer::m_storeIO
SG::IAuxStoreIO * m_storeIO
The IO interface to the internal auxiliary store.
Definition: ShallowAuxContainer.h:187
CalibDbCompareRT.dummy
dummy
Definition: CalibDbCompareRT.py:59
SG::IConstAuxStore::getDecoration
virtual void * getDecoration(auxid_t auxid, size_t size, size_t capacity)=0
Return the data vector for one aux data decoration item.
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.
xAOD::ShallowAuxContainer::getAuxIDs
virtual const auxid_set_t & getAuxIDs() const override
Get the types(names) of variables handled by this container.
Definition: ShallowAuxContainer.cxx:232
python.subdetectors.mmg.ids
ids
Definition: mmg.py:8
xAOD::ShallowAuxContainer::m_parentIO
const SG::IAuxStoreIO * m_parentIO
Optional pointer to the IO interface of the parent object.
Definition: ShallowAuxContainer.h:196
xAOD::ShallowAuxContainer::m_locked
bool m_locked
Flag keeping track of whether this object is locked or not.
Definition: ShallowAuxContainer.h:191
SG::IAuxStoreIO::getIOData
virtual const void * getIOData(SG::auxid_t auxid) const =0
Return a pointer to the data to be stored for one aux data item.
SG::IAuxStore::getWritableAuxIDs
virtual const SG::auxid_set_t & getWritableAuxIDs() const =0
Return a set of identifiers for writable data items in this store.
SG::IAuxStore
Interface for non-const operations on an auxiliary store.
Definition: IAuxStore.h:48
SG::AuxStoreInternal
An auxiliary data store that holds data internally.
Definition: AuxStoreInternal.h:43
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
SG::IAuxStore::getData
virtual void * getData(auxid_t auxid, size_t size, size_t capacity)=0
Return the data vector for one aux data item.
SG::IAuxTypeVector
Abstract interface for manipulating vectors of arbitrary types.
Definition: IAuxTypeVector.h:42
SG::IConstAuxStore::getDecorIDs
virtual const SG::auxid_set_t & getDecorIDs() const =0
Return a set of identifiers for decorations in this store.
SG::IConstAuxStore::lock
virtual void lock()=0
Lock the container.
xAOD::ShallowAuxContainer::auxid_set_t
SG::auxid_set_t auxid_set_t
The aux ID set type definition.
Definition: ShallowAuxContainer.h:60
xAOD::ShallowAuxContainer::m_store
SG::IAuxStore * m_store
Internal dynamic auxiliary store object.
Definition: ShallowAuxContainer.h:185
SG::IConstAuxStore::isDecoration
virtual bool isDecoration(auxid_t auxid) const =0
Test if a particular variable is tagged as a decoration.
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
SG::IAuxStoreHolder::AST_ObjectStore
@ AST_ObjectStore
The store describes a single object.
Definition: IAuxStoreHolder.h:67
SG::IAuxStoreHolder
Interface for objects taking part in direct ROOT I/O.
Definition: IAuxStoreHolder.h:36
xAOD::ShallowAuxContainer::remakeAuxIDs
void remakeAuxIDs() const
Definition: ShallowAuxContainer.cxx:611
SG::IConstAuxStore::getAuxIDs
virtual const SG::auxid_set_t & getAuxIDs() const =0
Return a set of identifiers for existing data items in this store.
SG::IAuxStoreHolder::AST_ContainerStore
@ AST_ContainerStore
The store describes a container.
Definition: IAuxStoreHolder.h:68
CxxUtils::ConcurrentBitset::test
bool test(bit_t bit) const
Test to see if a bit is set.