ATLAS Offline Software
IAthMetaDataSvc.h
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3 */
4 
5 #ifndef ATHENAKERNEL_IATHMETADATASVC_H
6 #define ATHENAKERNEL_IATHMETADATASVC_H
7 
14 #include "GaudiKernel/INamedInterface.h"
15 #include "AthenaKernel/MetaCont.h"
16 #include "StoreGate/StoreGateSvc.h"
17 
18 #include <string>
19 #include <set>
20 #include <mutex>
21 #include <typeinfo>
22 
28 class IAthMetaDataSvc : virtual public ::INamedInterface {
29 
30 public: // Non-static members
32 
33 
35  virtual StatusCode shmProxy(const std::string& filename) = 0;
36 
38  virtual std::set<std::string> getPerStreamKeysFor(const std::string& key ) const;
39 
40  // ======= Methods for handling metadata objects stored in MetaContainers (EventService)
41  template <typename T, class TKEY>
42  T* tryRetrieve (const TKEY& key) const;
43 
44  template <typename T, class TKEY>
45  const T* tryConstRetrieve(const TKEY& key) const;
46 
48  template <typename T, typename TKEY>
49  StatusCode record(T* p2BRegistered, const TKEY& key);
50 
52  template <typename T, typename TKEY>
53  StatusCode record(std::unique_ptr<T> pUnique, const TKEY& key);
54 
56  template <typename T, typename TKEY>
57  StatusCode remove(const TKEY& key, bool ignoreIfAbsent=false);
58 
60  template <typename T, typename TKEY>
61  bool contains(const TKEY& key);
62 
64  virtual StoreGateSvc* outputDataStore() const = 0;
65 
67  virtual const std::string currentRangeID() const = 0;
68 
70  virtual void recordHook(const std::type_info&) {}
71 
73  virtual void removeHook(const std::type_info&) {}
74 
75 private: // Data
77 };
78 
79 
81 inline std::set<std::string>
82 IAthMetaDataSvc::getPerStreamKeysFor(const std::string& key ) const {
83  return std::set<std::string>( {key} );
84 }
85 
91 template <typename T, class TKEY>
92 T* IAthMetaDataSvc::tryRetrieve (const TKEY& key) const
93 {
94  const MetaCont<T>* container = outputDataStore()->tryRetrieve< MetaCont<T> >(key);
95  if( container ) {
96  return container->get( currentRangeID() );
97  }
98  return nullptr;
99 }
100 
101 template <typename T, class TKEY>
102 const T* IAthMetaDataSvc::tryConstRetrieve (const TKEY& key) const
103 {
104  const MetaCont<T>* container = outputDataStore()->tryRetrieve< MetaCont<T> >(key);
105  if( container ) {
106  return container->get( currentRangeID() );
107  }
108  return nullptr;
109 }
110 
111 template <typename T, typename TKEY>
112 StatusCode IAthMetaDataSvc::record(T* pObject, const TKEY& key)
113 {
114  std::lock_guard lock(m_mutex);
116  StatusCode sc = StatusCode::FAILURE;
117  if( !container ) {
118  auto cont_uptr = std::make_unique< MetaCont<T> >();
119  if( cont_uptr->insert( currentRangeID() , pObject) )
120  sc = outputDataStore()->record( std::move(cont_uptr), key );
121  } else {
122  if (container->insert(currentRangeID(), pObject)) sc = StatusCode::SUCCESS;
123  }
124  if (sc.isSuccess()) recordHook(typeid(T));
125  return sc;
126 }
127 
128 
129 template <typename T, typename TKEY>
130 StatusCode IAthMetaDataSvc::record(std::unique_ptr<T> pUnique, const TKEY& key)
131 {
132  if( this->record( pUnique.get(), key ).isSuccess() ) {
133  (void)pUnique.release();
134  return StatusCode::SUCCESS;
135  }
136  pUnique.reset();
137  return StatusCode::FAILURE;
138 }
139 
140 
141 template <typename T, class TKEY>
142 StatusCode IAthMetaDataSvc::remove(const TKEY& key, bool ignoreIfAbsent)
143 {
144  std::lock_guard lock(m_mutex);
145  // change erase to setting nullptr?
147  if (container && container->erase(currentRangeID())) {
148  if (container->entries() == 0u) removeHook(typeid(T));
149  return StatusCode::SUCCESS;
150  }
151  return ignoreIfAbsent? StatusCode::SUCCESS : StatusCode::FAILURE;
152 }
153 
154 template <typename T, typename TKEY>
155 bool IAthMetaDataSvc::contains(const TKEY& key) {
157  return false;
158  const MetaCont<T>* container =
160  return container && container->valid(currentRangeID());
161 }
162 
163 #endif
StoreGateSvc::record
StatusCode record(T *p2BRegistered, const TKEY &key)
Record an object with a key.
IAthMetaDataSvc
This class provides the interface for MetaDataSvc.
Definition: IAthMetaDataSvc.h:28
IAthMetaDataSvc::getPerStreamKeysFor
virtual std::set< std::string > getPerStreamKeysFor(const std::string &key) const
Get all per-stream Key variants created for in-file metadata object with original key - if none,...
Definition: IAthMetaDataSvc.h:82
IAthMetaDataSvc::contains
bool contains(const TKEY &key)
Check if object is already is already in store.
Definition: IAthMetaDataSvc.h:155
BeamSpot::mutex
std::mutex mutex
Definition: InDetBeamSpotVertex.cxx:18
StoreGateSvc::tryRetrieve
T * tryRetrieve() const
Variant of the above which doesn't print a warning message.
IAthMetaDataSvc::tryConstRetrieve
const T * tryConstRetrieve(const TKEY &key) const
Definition: IAthMetaDataSvc.h:102
MetaCont::get
T * get(const SourceID &sid) const
Definition: MetaCont.h:166
IAthMetaDataSvc::currentRangeID
virtual const std::string currentRangeID() const =0
rangeID for the current EventContext - used to index MetaContainers -
IAthMetaDataSvc::record
StatusCode record(T *p2BRegistered, const TKEY &key)
Record an object with a key.
Definition: IAthMetaDataSvc.h:112
Trk::u
@ u
Enums for curvilinear frames.
Definition: ParamDefs.h:83
AthenaPoolTestRead.sc
sc
Definition: AthenaPoolTestRead.py:27
MetaCont::insert
virtual bool insert(const SourceID &sid, void *obj) override final
Definition: MetaCont.h:118
StoreGateSvc
The Athena Transient Store API.
Definition: StoreGateSvc.h:128
MetaCont
Definition: MetaCont.h:48
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
IAthMetaDataSvc::removeHook
virtual void removeHook(const std::type_info &)
Hook for implementation to react to removing an object.
Definition: IAthMetaDataSvc.h:73
MetaCont::erase
virtual size_t erase(const SourceID &sid) override final
Definition: MetaCont.h:126
MetaCont::valid
virtual bool valid(const SourceID &sid) const override final
Definition: MetaCont.h:142
IAthMetaDataSvc::remove
StatusCode remove(const TKEY &key, bool ignoreIfAbsent=false)
Remove object with this type+key.
Definition: IAthMetaDataSvc.h:142
StoreGateSvc::tryConstRetrieve
const T * tryConstRetrieve() const
IAthMetaDataSvc::recordHook
virtual void recordHook(const std::type_info &)
Hook for implementation to react to recording an object.
Definition: IAthMetaDataSvc.h:70
MetaCont::entries
virtual int entries() const override
Definition: MetaCont.h:193
IAthMetaDataSvc::shmProxy
virtual StatusCode shmProxy(const std::string &filename)=0
used by AthenaPoolCnvSvc
CaloCellTimeCorrFiller.filename
filename
Definition: CaloCellTimeCorrFiller.py:24
IAthMetaDataSvc::tryRetrieve
T * tryRetrieve(const TKEY &key) const
Retrieve an object of type T from MetaDataStore Return 0 if not found.
Definition: IAthMetaDataSvc.h:92
IAthMetaDataSvc::m_mutex
std::mutex m_mutex
Definition: IAthMetaDataSvc.h:76
IAthMetaDataSvc::outputDataStore
virtual StoreGateSvc * outputDataStore() const =0
The output MetaData Store.
IAthMetaDataSvc::DeclareInterfaceID
DeclareInterfaceID(IAthMetaDataSvc, 1, 0)
StoreGateSvc.h
MetaCont.h
TSU::T
unsigned long long T
Definition: L1TopoDataTypes.h:35
mapkey::key
key
Definition: TElectronEfficiencyCorrectionTool.cxx:37