Belle II Software  release-08-01-10
PyStoreObj.cc
1 /**************************************************************************
2  * basf2 (Belle II Analysis Software Framework) *
3  * Author: The Belle II Collaboration *
4  * *
5  * See git log for contributors and copyright holders. *
6  * This file is licensed under LGPL-3.0, see LICENSE.md. *
7  **************************************************************************/
8 #include <framework/pybasf2/PyStoreObj.h>
9 
10 #include <framework/datastore/DataStore.h>
11 #include <framework/datastore/StoreAccessorBase.h>
12 #include <framework/logging/Logger.h>
13 
14 #include <TObject.h>
15 #include <TClass.h>
16 
17 using namespace Belle2;
18 using namespace std;
19 
20 namespace {
21  template<class T>
22  T* replaceNullPtr(T* value, T* fallback)
23  {
24  return value ? value : fallback;
25  }
26 }
27 
28 vector<string> PyStoreObj::list(DataStore::EDurability durability)
29 {
30  return DataStore::Instance().getListOfObjects(TObject::Class(), durability);
31 }
32 
34 {
35  for (const auto& n : list(durability))
36  B2INFO(n);
37 }
38 
39 
40 PyStoreObj::PyStoreObj(const std::string& name,
41  DataStore::EDurability durability):
42  PyStoreObj(replaceNullPtr(DataStore::getTClassFromDefaultObjectName(name),
43  TObject::Class()),
44  /* Default to TObject for unknown class for backwards compatability */
45  name,
46  durability)
47 {
48 }
49 
50 PyStoreObj::PyStoreObj(TClass* objClass,
51  DataStore::EDurability durability) :
52  PyStoreObj(objClass, DataStore::defaultObjectName(objClass), durability)
53 {
54 }
55 
56 PyStoreObj::PyStoreObj(TClass* objClass,
57  const std::string& name,
58  DataStore::EDurability durability) :
59  m_storeAccessor(name, durability, objClass, false)
60 {
61  // Attach if already created
62  attach();
63 }
64 
66 {
67  return registerInDataStore(m_storeAccessor.getName(), storeFlags);
68 }
69 
70 bool PyStoreObj::registerInDataStore(const std::string& name, DataStore::EStoreFlags storeFlags)
71 {
72  if (not hasValidClass()) {
73  B2ERROR("Cannot register PyStoreObj '" << name << "' with unknown TClass. Please supply one to the PyStoreObj constructor.");
74  return false;
75  }
76 
77  bool success = m_storeAccessor.registerInDataStore(name, storeFlags);
78  if (success) attach();
79  return success;
80 }
81 
82 bool PyStoreObj::isRequired(const std::string& name)
83 {
84  return m_storeAccessor.isRequired(name);
85 }
86 
87 bool PyStoreObj::isOptional(const std::string& name)
88 {
89  return m_storeAccessor.isOptional(name);
90 }
91 
92 bool PyStoreObj::isValid() const
93 {
94  return m_storeEntry and m_storeEntry->ptr;
95 }
96 
98 {
99  const TClass* objClass = m_storeAccessor.getClass();
100  return objClass and objClass != TObject::Class();
101 }
102 
103 bool PyStoreObj::create(bool replace)
104 {
105  ensureAttached();
106  if (not m_storeEntry) {
107  // Attaching failed
108  B2ERROR("Cannot create unregistered PyStoreObj.");
109  return false;
110  }
111 
112  // Short cut when an object has been created and no replacement is requested.
113  if (isValid() and not replace) return true;
114 
115  if (not isValid() and not hasValidClass()) {
116  B2ERROR("Cannot create PyStoreObj with unknown TClass.");
117  return false;
118  } else {
119  // StoreObj has been created before or has a valid class
120  // Go ahead and (re)create it
121  return m_storeAccessor.create(replace);
122  }
123 }
124 
126 {
127  if (not m_storeEntry) {
128  attach();
129  if (not m_storeEntry) {
130  B2ERROR("PyStoreObj " << m_storeAccessor.readableName() << " has not been registered!");
131  }
132  }
133 }
134 
135 void PyStoreObj::attach() const
136 {
138 }
139 
140 bool PyStoreObj::assign(TObject* object, bool replace)
141 {
142  return m_storeAccessor.assign(object, replace);
143 }
In the store you can park objects that have to be accessed by various modules.
Definition: DataStore.h:51
EStoreFlags
Flags describing behaviours of objects etc.
Definition: DataStore.h:69
std::vector< std::string > getListOfObjects(const TClass *objClass, EDurability durability) const
Returns a list of names of StoreObjPtr-objects whose class is (or inherits from) objClass.
Definition: DataStore.cc:671
EDurability
Durability types.
Definition: DataStore.h:58
static DataStore & Instance()
Instance of singleton Store.
Definition: DataStore.cc:54
StoreEntry * getEntry(const StoreAccessorBase &accessor)
Check whether an entry with the correct type is registered in the DataStore map and return it.
Definition: DataStore.cc:294
a (simplified) python wrapper for StoreObjPtr.
Definition: PyStoreObj.h:67
StoreAccessorBase m_storeAccessor
Store accessor to retrieve the object.
Definition: PyStoreObj.h:178
static void printList(DataStore::EDurability durability=DataStore::EDurability::c_Event)
Print list of available objects for given durability.
Definition: PyStoreObj.cc:33
PyStoreObj(const std::string &name, DataStore::EDurability durability=DataStore::EDurability::c_Event)
constructor.
Definition: PyStoreObj.cc:40
void ensureAttached() const
Ensure that contained TObject has been attached to a memory location on the DataStore.
Definition: PyStoreObj.cc:125
bool hasValidClass() const
Check whether a TClass for the contained object could be determined.
Definition: PyStoreObj.cc:97
bool isValid() const
Check whether the object was registered and created.
Definition: PyStoreObj.cc:92
bool isRequired(const std::string &name="")
Ensure this object has been registered previously.
Definition: PyStoreObj.cc:82
bool isOptional(const std::string &name="")
Tell the DataStore about an optional input.
Definition: PyStoreObj.cc:87
bool registerInDataStore(DataStore::EStoreFlags storeFlags)
Register the object in the DataStore.
Definition: PyStoreObj.cc:65
bool assign(TObject *object, bool replace=false)
Assign 'object' to the accessor.
Definition: PyStoreObj.cc:140
StoreEntry * m_storeEntry
Pointer to the DataStore entry - serves as an internal cache omitting repeated look up from the DataS...
Definition: PyStoreObj.h:181
static std::vector< std::string > list(DataStore::EDurability durability=DataStore::EDurability::c_Event)
Return list of available objects for given durability.
Definition: PyStoreObj.cc:28
void attach() const
Lookup the store entry and cache a pointer to it.
Definition: PyStoreObj.cc:135
bool create(bool replace=false)
Create default constructed object in the DataStore.
Definition: PyStoreObj.cc:103
bool isRequired(const std::string &name="")
Ensure this array/object has been registered previously.
bool isOptional(const std::string &name="")
Tell the DataStore about an optional input.
const std::string & getName() const
Return name under which the object is saved in the DataStore.
std::string readableName() const
Convert this acessor into a readable string (for messages).
bool assign(TObject *object, bool replace=false)
Assign 'object' to this accessor.
TClass * getClass() const
The underlying object's type.
bool registerInDataStore(DataStore::EStoreFlags storeFlags=DataStore::c_WriteOut)
Register the object/array in the DataStore.
bool create(bool replace=false)
Create a default object in the data store.
Abstract base class for different kinds of events.
TObject * ptr
The pointer to the returned object, either equal to 'object' or null, depending on wether the object ...
Definition: StoreEntry.h:51