Belle II Software  release-05-02-19
python_datastore.py
1 #!/usr/bin/env python3
2 # -*- coding: utf-8 -*-
3 
4 import basf2
5 from ROOT import Belle2
6 import unittest
7 
8 # @cond internal_test
9 
10 
11 class PythonDataStoreTests(unittest.TestCase):
12 
13  def test_PyStoreObj(self):
14  testObj = Belle2.PyStoreObj("TestObj")
15  persistentObj = Belle2.PyStoreObj("PersistentObj", Belle2.DataStore.c_Persistent)
16  objList = (testObj, persistentObj)
17 
18  nEventObj = len(Belle2.PyStoreObj.list())
19  nPersistentObj = len(Belle2.PyStoreObj.list())
20 
21  for obj in objList:
22  self.assertTrue(not obj)
23  self.assertTrue(not obj.create())
24 
25  # class unknown
26  self.assertTrue(not obj.registerInDataStore())
27 
28  # Object not yet created
29  self.assertTrue(not obj)
30 
31  self.assertEqual(nEventObj, len(Belle2.PyStoreObj.list()))
32  self.assertEqual(nPersistentObj, len(Belle2.PyStoreObj.list(Belle2.DataStore.c_Persistent)))
33 
34  # arrays with explicit class
35  def test_PyStoreObj_with_known_class(self):
36  nEventObj = len(Belle2.PyStoreObj.list())
37  nPersistentObj = len(Belle2.PyStoreObj.list())
38 
39  eventMetaData = Belle2.PyStoreObj("EventMetaData")
40  self.assertTrue(eventMetaData.registerInDataStore())
41 
42  self.assertFalse(eventMetaData.isValid())
43  eventMetaData.create()
44  self.assertTrue(eventMetaData.isValid())
45 
46  # Test direct access to contained object
47  eventMetaData.setExperiment(17)
48 
49  # Retrieve from other module
50  eventMetaData2 = Belle2.PyStoreObj(Belle2.EventMetaData.Class())
51  self.assertTrue(eventMetaData2.isValid())
52  self.assertEqual(17, eventMetaData.getExperiment())
53 
54  # One persistent object was created in the process
55  self.assertEqual(nEventObj + 1, len(Belle2.PyStoreObj.list()))
56  self.assertEqual(nPersistentObj, len(Belle2.PyStoreObj.list(Belle2.DataStore.c_Persistent)))
57 
58  def test_PyStoreArray(self):
59  # arrays
60  arrayList = (Belle2.PyStoreArray("TestArray"),
61  Belle2.PyStoreArray("PersistentArray", Belle2.DataStore.c_Persistent))
62 
63  self.assertEqual(0, len(Belle2.PyStoreArray.list()))
64  self.assertEqual(0, len(Belle2.PyStoreArray.list(Belle2.DataStore.c_Persistent)))
65 
66  for array in arrayList:
67  self.assertTrue(not array)
68  self.assertEqual(0, array.getEntries())
69  self.assertEqual(0, len(array))
70 
71  self.assertTrue(not array[1234])
72  self.assertTrue(not array.appendNew())
73  self.assertEqual(0, len(array))
74 
75  def test_EnumBackwardsCompatibility(self):
76  self.assertEqual(0, Belle2.DataStore.c_Event)
77  self.assertEqual(1, Belle2.DataStore.c_Persistent)
78 
79  # arrays with explicit class
80  def test_PyStoreArray_with_known_class(self):
81  # First module creates and registers two store arrays and a relation
82  array = Belle2.PyStoreArray(Belle2.RelationsObject.Class())
83 
84  self.assertTrue(array.registerInDataStore("RelationsObjects"))
85  self.assertEqual("RelationsObjects", array.getName())
86 
87  otherArray = Belle2.PyStoreArray(Belle2.RelationsObject.Class(), "OtherRelationsObjects")
88 
89  self.assertEqual("OtherRelationsObjects", otherArray.getName())
90  self.assertTrue(otherArray.registerInDataStore())
91 
92  array.registerRelationTo(otherArray)
93 
94  self.assertTrue(array.hasRelationTo(otherArray))
95  self.assertTrue(otherArray.hasRelationFrom(array))
96  self.assertFalse(array.hasRelationFrom(otherArray))
97  self.assertFalse(otherArray.hasRelationTo(array))
98 
99  obj = array.appendNew()
100  self.assertTrue(obj)
101  self.assertEqual(1, len(array))
102  self.assertTrue(array[0])
103 
104  for obj in array:
105  # Valid iterator
106  break
107  else:
108  # Invalid iterator
109  self.assertTrue(False)
110 
111  otherObject = otherArray.appendNew()
112  obj.addRelationTo(otherObject)
113 
114  # Second module requires and reads the store arrays
115 
116  # Arrays can be retrieved like above or by their names only
117  array2 = Belle2.PyStoreArray("RelationsObjects")
118  array2.isRequired()
119  otherArray2 = Belle2.PyStoreArray("OtherRelationsObjects")
120  otherArray2.isRequired()
121 
122  self.assertEqual(1, len(array2))
123  self.assertEqual(1, len(otherArray2))
124 
125  array2.requireRelationTo(otherArray2)
126  obj2 = array2[0]
127  self.assertEqual(obj, obj2)
128 
129  otherObject2 = obj2.getRelated("OtherRelationsObjects")
130  self.assertEqual(otherObject, otherObject2)
131 
132 
133 if __name__ == "__main__":
134  basf2.B2INFO("Following error messages are expected, please ignore.")
135  unittest.main()
136  basf2.B2INFO("Previous errors are expected, please ignore.")
137 
138 # @endcond
Belle2::PyStoreObj::list
static std::vector< std::string > list(DataStore::EDurability durability=DataStore::EDurability::c_Event)
Return list of available objects for given durability.
Definition: PyStoreObj.cc:21
Belle2::PyStoreObj
a (simplified) python wrapper for StoreObjPtr.
Definition: PyStoreObj.h:69
Belle2::PyStoreArray::list
static std::vector< std::string > list(DataStore::EDurability durability=DataStore::EDurability::c_Event)
Return list of available arrays for given durability.
Definition: PyStoreArray.cc:21
Belle2::PyStoreArray
a (simplified) python wrapper for StoreArray.
Definition: PyStoreArray.h:58