Belle II Software  release-05-01-25
globalParam.cc
1 
2 #include <alignment/dbobjects/VXDAlignment.h>
3 #include <alignment/GlobalParam.h>
4 #include <alignment/Manager.h>
5 #include <cdc/dbobjects/CDCTimeZeros.h>
6 #include <cdc/dbobjects/CDCTimeWalks.h>
7 #include <cdc/dbobjects/CDCAlignment.h>
8 #include <cdc/dbobjects/CDCXtRelations.h>
9 #include <framework/dataobjects/EventMetaData.h>
10 #include <klm/dbobjects/bklm/BKLMAlignment.h>
11 #include <klm/dbobjects/eklm/EKLMAlignment.h>
12 
13 #include <gtest/gtest.h>
14 
15 #include <iostream>
16 #include <string>
17 
18 using namespace std;
19 using namespace Belle2;
20 using namespace alignment;
21 
22 namespace {
24 // class MockDBObj : public TObject {
25 // public:
26 // static unsigned short getGlobalUniqueID() { return 1; }
27 // double getGlobalParam(unsigned short element, unsigned short param)
28 // {
29 // if (element != 1)
30 // return 0.;
31 // if (param != 1)
32 // return 0.;
33 //
34 // return m_value;
35 // }
36 // void setGlobalParam(unsigned short element, unsigned short param, double val)
37 // {
38 // if (element != 1)
39 // return;
40 // if (param != 1)
41 // return;
42 // m_value = val;
43 // }
44 // std::vector<std::pair<unsigned short, unsigned short>> listGlobalParams() {return {{1, 1}};}
45 // private:
46 // double m_value {0.};
47 // };
48 
49  class MockDetectorInterface : public IGlobalParamInterface {
50  public:
51  explicit MockDetectorInterface(int id) : m_id(id) {}
52  int hasBeenCalled() { return m_called; }
53  virtual void readFromResult(std::vector<std::tuple<unsigned short, unsigned short, unsigned short, double>>&,
54  GlobalParamVector&) override final
55  {
56  std::cout << " Interface " << m_id << ": called readFromResult()" << std::endl;
57  ++m_called;
58  }
59  private:
60  int m_id { -1};
61  int m_called {0};
62  };
63 
65  class GlobalParamTest : public ::testing::Test {
66  protected:
67 
69  virtual void SetUp()
70  {
71 
72  }
73 
75  virtual void TearDown()
76  {
77 
78  }
79 
80  };
81 
85  TEST_F(GlobalParamTest, GlobalParamComponentsInterfaces)
86  {
87  // Full vector
88  GlobalParamVector gpv;
89  // Vector restricted to BeamSpot
90  GlobalParamVector gpvComp({"BeamSpot"});
91 
92  // Interfaces for testing
93  auto interface1 = new MockDetectorInterface(1);
94  auto interface2 = new MockDetectorInterface(2);
95  auto interface3 = new MockDetectorInterface(3);
96 
97  auto iptr1 = std::shared_ptr<IGlobalParamInterface>(interface1);
98  auto iptr2 = std::shared_ptr<IGlobalParamInterface>(interface2);
99  auto iptr3 = std::shared_ptr<IGlobalParamInterface>(interface3);
100 
101  // Init the vectors with db objects and interfaces (see GlobalCalibrationManager::initGlobalVector(...))
102  for (auto vect : std::vector<GlobalParamVector*>({&gpv, &gpvComp})) {
103  vect->addDBObj<BeamSpot>(iptr1);
104  vect->addDBObj<VXDAlignment>(iptr2);
105  vect->addDBObj<CDCAlignment>(iptr2);
106  vect->addDBObj<CDCTimeZeros>();
107  vect->addDBObj<CDCTimeWalks>();
108  vect->addDBObj<CDCXtRelations>();
109  vect->addDBObj<BKLMAlignment>();
110  vect->addDBObj<EKLMAlignment>();
111 
112  vect->addSubDetectorInterface(iptr3);
113  vect->addSubDetectorInterface(iptr3);
114  vect->addSubDetectorInterface(iptr3);
115  }
116 
117  // First a check, no interface called yet
118  EXPECT_EQ(interface1->hasBeenCalled() , 0);
119  EXPECT_EQ(interface2->hasBeenCalled() , 0);
120  EXPECT_EQ(interface3->hasBeenCalled() , 0);
121 
122  std::vector<std::tuple<unsigned short, unsigned short, unsigned short, double>> emptyResult;
123 
124  // Full vector accepted everything and calls all interfaces
125  gpv.postReadFromResult(emptyResult);
126  EXPECT_EQ(interface1->hasBeenCalled() , 1);
127  EXPECT_EQ(interface2->hasBeenCalled() , 1); // only one more read due to uniqueness
128  EXPECT_EQ(interface3->hasBeenCalled() , 1);
129 
130  // BeamSpot have interface 1 and interface 3 (added for any components configuration)
131  // Interface 2 should not be stored/called in 'gpvComp'
132  gpvComp.postReadFromResult(emptyResult);
133  EXPECT_EQ(interface1->hasBeenCalled() , 2);
134  EXPECT_EQ(interface2->hasBeenCalled() , 1);
135  EXPECT_EQ(interface3->hasBeenCalled() , 2);
136 
137  EXPECT_EQ(gpv.getGlobalParamSet<VXDAlignment>().isConstructed(), false);
138  EXPECT_EQ(gpvComp.getGlobalParamSet<VXDAlignment>().isConstructed(), false);
139  // Construct the DB objects to be able to check pointers to them
140  gpv.construct();
141  gpvComp.construct();
142 
143  // Full vector contains all objects
144  EXPECT_EQ(!!gpv.getDBObj<VXDAlignment>(), true);
145  EXPECT_EQ(!!gpv.getDBObj<BeamSpot>(), true);
146  // BeamSpot global vector should only containt BeamSpot
147  EXPECT_EQ(!!gpvComp.getDBObj<VXDAlignment>(), false);
148  EXPECT_EQ(!!gpvComp.getDBObj<BeamSpot>(), true);
149 
150  // Full vector contains all objects
151  EXPECT_EQ(gpv.getGlobalParamSet<VXDAlignment>().isConstructed(), true);
152  EXPECT_EQ(gpv.getGlobalParamSet<BeamSpot>().isConstructed(), true);
153  // BeamSpot global vector should only containt BeamSpot
154  EXPECT_EQ(gpvComp.getGlobalParamSet<VXDAlignment>().isConstructed(), false);
155  EXPECT_EQ(gpvComp.getGlobalParamSet<BeamSpot>().isConstructed(), true);
156 
157  // Accessing non-existing object will return an empty set
158  EXPECT_EQ(gpvComp.getGlobalParamSet<VXDAlignment>().is<VXDAlignment>(), false);
159  EXPECT_EQ(gpvComp.getGlobalParamSet<VXDAlignment>().is<EmptyGlobalParamSet>(), true);
160  EXPECT_EQ(gpvComp.getGlobalParamSet<VXDAlignment>().empty(), true);
161  EXPECT_EQ(gpvComp.getGlobalParamSet<VXDAlignment>().isConstructed(), false);
162  EXPECT_EQ((bool) gpvComp.getGlobalParamSet<VXDAlignment>(), false);
163 
164  EXPECT_EQ(gpv.getGlobalParamSet<BeamSpot>().is<BeamSpot>(), true);
165  EXPECT_EQ(gpv.getGlobalParamSet<BeamSpot>().is<EmptyGlobalParamSet>(), false);
166  EXPECT_EQ(gpv.getGlobalParamSet<BeamSpot>().empty(), false);
167  EXPECT_EQ(gpv.getGlobalParamSet<BeamSpot>().isConstructed(), true);
168  EXPECT_EQ((bool) gpv.getGlobalParamSet<BeamSpot>(), true);
169 
170 
171  EXPECT_EQ(gpvComp.getGlobalParamSet<EmptyGlobalParamSet>().is<EmptyGlobalParamSet>(), true);
172 
173  // This commented because BeamSpot is not yet in the DB. Instead, for now
174  // test VXDAlignment and once I get to this back, I want to have test for
175  // all supported db objects.
176  /*
177  GlobalParamVector newgpv({"BeamSpot", "CDCAlignment"});
178  GlobalCalibrationManager::initGlobalVector(newgpv);
179 
180  EXPECT_EQ(newgpv.getGlobalParamSet<BeamSpot>().isConstructed(), false);
181  newgpv.construct();
182  EXPECT_EQ(newgpv.getGlobalParamSet<BeamSpot>().isConstructed(), true);
183 
184  newgpv.setGlobalParam(42., BeamSpot::getGlobalUniqueID(), 0, 1);
185  EXPECT_EQ(newgpv.getGlobalParam(BeamSpot::getGlobalUniqueID(), 0, 1), 42.);
186  newgpv.loadFromDB(EventMetaData(1, 0, 0));
187  EXPECT_EQ(newgpv.getGlobalParam(BeamSpot::getGlobalUniqueID(), 0, 1), 0.);
188 
189  newgpv.updateGlobalParam(42., BeamSpot::getGlobalUniqueID(), 0, 1);
190  EXPECT_EQ(newgpv.getGlobalParam(BeamSpot::getGlobalUniqueID(), 0, 1), 42.);
191 
192  newgpv.setGlobalParam(42., CDCAlignment::getGlobalUniqueID(), 0, 1);
193  EXPECT_EQ(newgpv.getGlobalParam(CDCAlignment::getGlobalUniqueID(), 0, 1), 42.);
194  */
195 
196  GlobalParamVector newgpv({"VXDAlignment", "CDCAlignment"});
197  GlobalCalibrationManager::initGlobalVector(newgpv);
198 
199  EXPECT_EQ(newgpv.getGlobalParamSet<VXDAlignment>().isConstructed(), false);
200  newgpv.construct();
201  EXPECT_EQ(newgpv.getGlobalParamSet<VXDAlignment>().isConstructed(), true);
202 
203  newgpv.setGlobalParam(42., VXDAlignment::getGlobalUniqueID(), 0, 1);
204  EXPECT_EQ(newgpv.getGlobalParam(VXDAlignment::getGlobalUniqueID(), 0, 1), 42.);
205  newgpv.loadFromDB(EventMetaData(1, 0, 0));
206  EXPECT_EQ(newgpv.getGlobalParam(VXDAlignment::getGlobalUniqueID(), 0, 1), 0.);
207 
208  newgpv.updateGlobalParam(42., VXDAlignment::getGlobalUniqueID(), 0, 1);
209  EXPECT_EQ(newgpv.getGlobalParam(VXDAlignment::getGlobalUniqueID(), 0, 1), 42.);
210 
211  newgpv.setGlobalParam(42., CDCAlignment::getGlobalUniqueID(), 0, 1);
212  EXPECT_EQ(newgpv.getGlobalParam(CDCAlignment::getGlobalUniqueID(), 0, 1), 42.);
213 
214  }
215 
216 } // namespace
Belle2::CDCXtRelations
Database object for xt-relations.
Definition: CDCXtRelations.h:38
Belle2::CDCTimeWalks
Database object for time-walk.
Definition: CDCTimeWalks.h:35
Belle2::BeamSpot
This class contains the beam spot position and size modeled as a gaussian distribution in space.
Definition: BeamSpot.h:32
Belle2::EKLMAlignment
Class to store EKLM alignment data in the database.
Definition: EKLMAlignment.h:40
Belle2
Abstract base class for different kinds of events.
Definition: MillepedeAlgorithm.h:19
Belle2::CDCTimeZeros
Database object for timing offset (t0).
Definition: CDCTimeZeros.h:36
Belle2::TEST_F
TEST_F(GlobalLabelTest, LargeNumberOfTimeDependentParameters)
Test large number of time-dep params for registration and retrieval.
Definition: globalLabel.cc:65
Belle2::BKLMAlignment
Class to store BKLM alignment data in the database.
Definition: BKLMAlignment.h:40
Belle2::EventMetaData
Store event, run, and experiment numbers.
Definition: EventMetaData.h:43
Belle2::VXDAlignment
VXD alignment (and maybe some calibration) parameters.
Definition: VXDAlignment.h:29
Belle2::CDCAlignment
CDC alignment constants.
Definition: CDCAlignment.h:34