Belle II Software  release-05-01-25
local_metadata_provider.py
1 #!/usr/bin/env python3
2 
3 import basf2 as b2 # noqa
4 from conditions_db.local_metadata import LocalMetadataProvider
5 from conditions_db import PayloadInformation
6 from b2test_utils import clean_working_directory
7 import ROOT
8 from ROOT import Belle2 # noqa
9 
10 ROOT.gInterpreter.Declare("#include <framework/database/LocalMetadataProvider.h>")
11 
12 
14  """
15  Simple class to obtain all valid payloads matching a given set of names for
16  a given experiment and run and compare the python and the C++
17  implementation.
18  """
19  @staticmethod
20  def create_cpp_metadataprovider(filename, globaltags):
21  """
22  Jump through some hoops to create a C++ instance of the local metadata
23  provider so that we can check the framework implementation and compare
24  it to the python version
25  """
26  states = ROOT.std.set("string")()
27  states.insert("PUBLISHED")
28  tags = ROOT.std.vector("string")()
29  for tag in globaltags:
30  tags.push_back(tag)
31  localcpp = Belle2.Conditions.LocalMetadataProvider(filename, states)
32  localcpp.setTags(tags)
33  return localcpp
34 
35  def __init__(self, filename, globaltag, payloads):
36  """Create the local metadata providers for the given globaltag and payload names"""
37  self._globaltag = globaltag
38  self._payloads = payloads
39  self._localpy = LocalMetadataProvider(filename)
40  self._localcpp = self.create_cpp_metadataprovider(filename, [globaltag])
41 
42  def check(self, exp, run):
43  """Check if the c++ and python version return the same payload revisions
44  If not raise a ValueError, if yes return the list of payloads and their
45  revision valid for the given exp,run"""
46  from_py = [(p.name, p.revision) for p in self._localpy.get_all_iovs(self._globaltag, exp=exp, run=run)
47  if p.name in self._payloads]
48  info = ROOT.std.vector("Belle2::Conditions::PayloadMetadata")()
49  for name in self._payloads:
50  info.push_back(Belle2.Conditions.PayloadMetadata(name, False))
51  self._localcpp.getPayloads(exp, run, info)
52  from_cpp = [(p.name, p.revision) for p in info
53  if p.revision > 0]
54  from_py.sort()
55  from_cpp.sort()
56  if from_py != from_cpp:
57  raise ValueError(f"Payloads not equal: {from_py} != {from_cpp}")
58  return from_py
59 
60 
61 if __name__ == "__main__":
62  with clean_working_directory() as dirname:
63  # so we can easily create multiple globaltags in a local file to check different iovs
64  local = LocalMetadataProvider("testdatabase.sqlite", "overwrite")
65  local.add_globaltag(1, "test1", "PUBLISHED", [
66  PayloadInformation(1, "test", 1, "", "", "", None, (45, 221, 49, -1))
67  ])
68  # check a single run validity
69  local.add_globaltag(2, "test2", "PUBLISHED", [
70  PayloadInformation(1, "test", 1, "", "", "", None, (0, 1, 0, 1))
71  ])
72  # and unlimited runs in same experiment
73  local.add_globaltag(3, "test3", "PUBLISHED", [
74  PayloadInformation(1, "test", 1, "", "", "", None, (1, 1, 1, -1))
75  ])
76  # or also the first run in the next experiment
77  local.add_globaltag(4, "test4", "PUBLISHED", [
78  PayloadInformation(1, "test", 1, "", "", "", None, (1, 1, 2, 0))
79  ])
80  # or an unbound iov
81  local.add_globaltag(5, "test5", "PUBLISHED", [
82  PayloadInformation(1, "test", 1, "", "", "", None, (1, 1, -1, -1))
83  ])
84 
85  comparer = LocalMetadataComparison("testdatabase.sqlite", "test1", ["test"])
86  for exp, run in [(44, 1), (44, 9999), (45, 0), (45, 220), (45, 221), (45, 9999), (46, 0), (46, 221),
87  (49, 0), (49, 9999), (50, 0), (50, 221), (50, 9999)]:
88  valid = [("test", 1)] if (45, 221) <= (exp, run) < (50, 0) else []
89  assert comparer.check(exp, run) == valid, f"Couldn't find payload for {exp},{run}"
90 
91  comparer = LocalMetadataComparison("testdatabase.sqlite", "test2", ["test"])
92  for exp, run in [(0, 0), (0, 1), (0, 2), (0, 9999),
93  (1, 0), (1, 1), (1, 2), (1, 9999), (9999, 9999)]:
94  valid = [("test", 1)] if (exp, run) == (0, 1) else []
95  assert comparer.check(exp, run) == valid, f"Couldn't find payload for {exp},{run}"
96 
97  comparer = LocalMetadataComparison("testdatabase.sqlite", "test3", ["test"])
98  for exp, run in [(0, 0), (0, 1), (0, 2), (0, 9999),
99  (1, 0), (1, 1), (1, 2), (1, 9999),
100  (243, 0), (245, 9999999), (9999, 9999)]:
101  valid = [("test", 1)] if (1, 1) <= (exp, run) < (2, 0) else []
102  assert comparer.check(exp, run) == valid, f"Couldn't find payload for {exp},{run}"
103 
104  comparer = LocalMetadataComparison("testdatabase.sqlite", "test4", ["test"])
105  for exp, run in [(0, 0), (0, 1), (0, 2), (0, 9999),
106  (1, 0), (1, 1), (1, 2), (1, 9999),
107  (243, 0), (245, 9999999), (9999, 9999)]:
108  valid = [("test", 1)] if (1, 1) <= (exp, run) <= (2, 0) else []
109  assert comparer.check(exp, run) == valid, f"Couldn't find payload for {exp},{run}"
110 
111  comparer = LocalMetadataComparison("testdatabase.sqlite", "test5", ["test"])
112  for exp, run in [(0, 0), (0, 1), (0, 2), (0, 9999),
113  (1, 0), (1, 1), (1, 2), (1, 9999),
114  (2, 0), (2, 1), (2, 2), (2, 9999),
115  (243, 0), (245, 9999999), (9999, 9999)]:
116  valid = [("test", 1)] if (1, 1) <= (exp, run) else []
117  assert comparer.check(exp, run) == valid, f"Couldn't find payload for {exp},{run}"
conditions_db.local_metadata
Definition: local_metadata.py:1
local_metadata_provider.LocalMetadataComparison._localcpp
_localcpp
Definition: local_metadata_provider.py:40
local_metadata_provider.LocalMetadataComparison.check
def check(self, exp, run)
Definition: local_metadata_provider.py:42
local_metadata_provider.LocalMetadataComparison._payloads
_payloads
Definition: local_metadata_provider.py:38
Belle2::Conditions::LocalMetadataProvider
Class to obtain metadata of all valid payloads from a local SQLite file instead of the central server...
Definition: LocalMetadataProvider.h:56
local_metadata_provider.LocalMetadataComparison.__init__
def __init__(self, filename, globaltag, payloads)
Definition: local_metadata_provider.py:35
conditions_db.local_metadata.LocalMetadataProvider
Definition: local_metadata.py:12
local_metadata_provider.LocalMetadataComparison
Definition: local_metadata_provider.py:13
Belle2::Conditions::PayloadMetadata
Simple struct to group all information necessary for a single payload.
Definition: PayloadMetadata.h:25
local_metadata_provider.LocalMetadataComparison._localpy
_localpy
Definition: local_metadata_provider.py:39
local_metadata_provider.LocalMetadataComparison._globaltag
_globaltag
Definition: local_metadata_provider.py:37
conditions_db.PayloadInformation
Definition: __init__.py:49
local_metadata_provider.LocalMetadataComparison.create_cpp_metadataprovider
def create_cpp_metadataprovider(filename, globaltags)
Definition: local_metadata_provider.py:20