Belle II Software  release-05-01-25
timeline.cc
1 /**************************************************************************
2  * BASF2 (Belle Analysis Framework 2) *
3  * Copyright(C) 2019 - Belle II Collaboration *
4  * *
5  * Author: The Belle II Collaboration *
6  * Contributors: Tadeas Bilka *
7  * *
8  * This software is provided "as is" without any warranty. *
9  **************************************************************************/
10 
11 #include <alignment/dbobjects/VXDAlignment.h>
12 #include <alignment/GlobalTimeLine.h>
13 #include <alignment/Manager.h>
14 #include <cdc/dbobjects/CDCAlignment.h>
15 #include <framework/database/Configuration.h>
16 #include <framework/database/Database.h>
17 #include <framework/database/EventDependency.h>
18 #include <framework/dataobjects/EventMetaData.h>
19 #include <vxd/dataobjects/VxdID.h>
20 
21 #include <gtest/gtest.h>
22 
23 #include <TFile.h>
24 
25 #include <boost/filesystem.hpp>
26 
27 #include <iostream>
28 #include <string>
29 
30 using namespace std;
31 using namespace Belle2;
32 using namespace alignment;
33 using namespace timeline;
34 
35 namespace {
36  template<int UID>
37  class MockDBObj {
38  public:
39  MockDBObj(double value = 0.) : m_param(value) {}
40  // ------------- Interface to global Millepede calibration ----------------
42  static unsigned short getGlobalUniqueID()
43  {
44  static_assert(UID != 0, "Non-zero UID required");
45  return UID;
46  }
48  double getGlobalParam(unsigned short element, unsigned short param) {return m_param;}
50  void setGlobalParam(double value, unsigned short element, unsigned short param) {m_param = value;}
52  std::vector<std::pair<unsigned short, unsigned short>> listGlobalParams() {return {{0, 0}};}
53  private:
54  double m_param{0.};
55  };
56 
57 
58  class TimeLineTest : public ::testing::Test {
59  protected:
60 
61  IntraIoVPayloads beamspotRun0 = {
62  {EventMetaData(0, 0, 0), std::make_shared<GlobalParamSet<BeamSpot>>()}
63  };
64 
65  IntraIoVPayloads beamspotRun1 = {
66  {EventMetaData(0, 1, 0), std::make_shared<GlobalParamSet<BeamSpot>>()}
67  };
68 
69  IntraIoVPayloads beamspotRun2 = {
70  {EventMetaData(0, 2, 0), std::make_shared<GlobalParamSet<BeamSpot>>()},
71  {EventMetaData(530532, 2, 0), std::make_shared<GlobalParamSet<BeamSpot>>()}
72  };
73 
74  IntraIoVPayloads beamspotRun3 = {
75  {EventMetaData(0, 3, 0), std::make_shared<GlobalParamSet<BeamSpot>>()}
76  };
77 
78  IntraIoVPayloads beamspotRun4 = {
79  {EventMetaData(0, 4, 0), std::make_shared<GlobalParamSet<BeamSpot>>()}
80  };
81 
82  PayloadIovBlockRow beamspotRow = {
83  {IntervalOfValidity(0, 0, 0, 0), beamspotRun0},
84  {IntervalOfValidity(0, 1, 0, 1), beamspotRun1},
85  {IntervalOfValidity(0, 2, 0, 2), beamspotRun2},
86  {IntervalOfValidity(0, 3, 0, 3), beamspotRun3},
87  {IntervalOfValidity(0, 4, 0, 4), beamspotRun4}
88  };
89 
90  IntraIoVPayloads vxdRun0to2 = {
91  {EventMetaData(0, 0, 0), std::make_shared<GlobalParamSet<VXDAlignment>>()},
92  };
93 
94  IntraIoVPayloads vxdRun3toInf = {
95  {EventMetaData(0, 3, 0), std::make_shared<GlobalParamSet<VXDAlignment>>()},
96  };
97 
98  PayloadIovBlockRow vxdRow = {
99  {IntervalOfValidity(0, 0, 0, 2), vxdRun0to2},
100  {IntervalOfValidity(0, 3, 0, 4), vxdRun3toInf}
101 
102  };
103 
104  IntraIoVPayloads cdcBlock = {
105  {EventMetaData(0, 0, 0), std::make_shared<GlobalParamSet<CDCAlignment>>()}
106 
107  };
108  PayloadIovBlockRow cdcRow = {
109  {IntervalOfValidity(0, 0, 0, 4), cdcBlock}
110  };
111 
112  PayloadsTable payloadsTable = {
113  {BeamSpot::getGlobalUniqueID(), beamspotRow},
114  {VXDAlignment::getGlobalUniqueID(), vxdRow},
115  {CDCAlignment::getGlobalUniqueID(), cdcRow}
116  };
117 
118  std::vector<int> head0 = {0, 1, 2, 3, 4, 5};
119  std::vector<int> head1 = {0, 1, 2, 2, 3, 4};
120  std::vector<int> row0 = {0, 1, 2, 3, 4, 5};
121  std::vector<int> row1 = {0, 0, 0, 0, 1, 1};
122  std::vector<int> row2 = {0, 0, 0, 0, 0, 0};
123 
124  EventHeader eventHeader = {
125  EventMetaData(0, 0, 0),
126  EventMetaData(0, 1, 0),
127  EventMetaData(0, 2, 0),
128  EventMetaData(530532, 2, 0),
129  EventMetaData(0, 3, 0),
130  EventMetaData(0, 4, 0)
131  };
132 
133  RunHeader runHeader = {
134  {0, 0},
135  {0, 1},
136  {0, 2},
137  {0, 2},
138  {0, 3},
139  {0, 4}
140  };
141 
142  TableData tableData = {
143  { 1, row0},
144  {10, row1},
145  {27, row2}
146  };
147 
148  TimeTable timeTable = std::make_tuple(eventHeader, runHeader, tableData);
149 
150  std::vector<int> irow0 = {0, 1, 1, 1, 1, 1};
151  std::vector<int> irow1 = {0, 0, 0, 0, 1, 0};
152  std::vector<int> irow2 = {0, 0, 0, 0, 0, 0};
153 
154  TableData initTableData = {
155  { 1, irow0},
156  {10, irow1},
157  {27, irow2}
158  };
159 
160  TimeTable initTimeTable = std::make_tuple(eventHeader, runHeader, initTableData);
161 
163  virtual void SetUp()
164  {
166  DataStore::Instance().setInitializeActive(true);
167  evtPtr.registerInDataStore();
168  DataStore::Instance().setInitializeActive(false);
169  // Event 0 run 0 exp 0
170  evtPtr.construct(0, 0, 0);
171 
172  auto& c = Conditions::Configuration::getInstance();
173  c.setNewPayloadLocation("testPayloads/TestDatabase.txt");
174 
175  GlobalLabel::setCurrentTimeInterval(0);
176  GlobalLabel::clearTimeDependentParamaters();
177 
178  auto beamspotX = GlobalLabel::construct<BeamSpot>(0, 1);
179  auto beamspotZ = GlobalLabel::construct<BeamSpot>(0, 3);
180  auto yingZ = GlobalLabel::construct<VXDAlignment>(VxdID(1, 0, 0, 1).getID(), 3);
181 
182  yingZ.registerTimeDependent(4);
183 
184  // should be banned:
185  //beamspotX.registerTimeDependent(3);
186  // -> instead:
187  beamspotX.registerTimeDependent(2);
188  beamspotX.registerTimeDependent(3);
189  beamspotX.registerTimeDependent(4);
190 
191  beamspotZ.registerTimeDependent(1);
192  beamspotZ.registerTimeDependent(2);
193  beamspotZ.registerTimeDependent(3);
194  beamspotZ.registerTimeDependent(4);
195  beamspotZ.registerTimeDependent(5);
196 
197  }
198 
200  virtual void TearDown()
201  {
202  GlobalLabel::clearTimeDependentParamaters();
203  GlobalLabel::setCurrentTimeInterval(0);
204 
205  boost::filesystem::remove_all("testPayloads");
206  Database::reset();
207  DataStore::Instance().reset();
208  }
209 
210  };
211 
213  TEST_F(TimeLineTest, InitialTimeTable)
214  {
215  GlobalLabel label;
216  auto table = makeInitialTimeTable(eventHeader, label);
217 
218  std::vector<int> myrow0 = {0, 1, 1, 1, 1, 1};
219  std::vector<int> myrow1 = {0, 0, 0, 0, 1, 0};
220 
221  TableData myInitTableData = {
222  { 1, myrow0},
223  {10, myrow1}
224  };
225 
226  TimeTable myInitTimeTable = std::make_tuple(eventHeader, runHeader, myInitTableData);
227 
228 
229  EXPECT_EQ(table, myInitTimeTable);
230 
231  }
232 
234  TEST_F(TimeLineTest, TimeTable)
235  {
236  finalizeTimeTable(initTimeTable);
237  EXPECT_EQ(initTimeTable, timeTable);
238 
239  EXPECT_EQ(getContinuousIndexByTimeID(timeTable, 1, 3), 3);
240  EXPECT_EQ(getContinuousIndexByTimeID(timeTable, 10, 3), 0);
241  EXPECT_EQ(getContinuousIndexByTimeID(timeTable, 27, 3), 0);
242 
243  }
244 
246  TEST_F(TimeLineTest, PayloadTable)
247  {
248 
249  getPayloadByContinuousIndex(payloadsTable, 1, 3).second->setGlobalParam(42., 0, 1);
250  EXPECT_EQ(getPayloadByContinuousIndex(payloadsTable, 1, 3).second->getGlobalParam(0, 1), 42.);
251 
252 
253  EXPECT_EQ(getPayloadByContinuousIndex(payloadsTable, 1, 0).first, EventMetaData(0, 0, 0));
254  EXPECT_EQ(getPayloadByContinuousIndex(payloadsTable, 1, 1).first, EventMetaData(0, 1, 0));
255  EXPECT_EQ(getPayloadByContinuousIndex(payloadsTable, 1, 2).first, EventMetaData(0, 2, 0));
256  EXPECT_EQ(getPayloadByContinuousIndex(payloadsTable, 1, 3).first, EventMetaData(530532, 2, 0));
257  EXPECT_EQ(getPayloadByContinuousIndex(payloadsTable, 1, 4).first, EventMetaData(0, 3, 0));
258  EXPECT_EQ(getPayloadByContinuousIndex(payloadsTable, 1, 5).first, EventMetaData(0, 4, 0));
259 
260  EXPECT_EQ(getPayloadByContinuousIndex(payloadsTable, 10, 0).first, EventMetaData(0, 0, 0));
261  EXPECT_EQ(getPayloadByContinuousIndex(payloadsTable, 10, 1).first, EventMetaData(0, 3, 0));
262 
263  EXPECT_EQ(getPayloadByContinuousIndex(payloadsTable, 27, 0).first, EventMetaData(0, 0, 0));
264 
265 
266  }
267 
269  TEST_F(TimeLineTest, TimeTable2PayloadsTable)
270  {
271  GlobalParamVector vector({"BeamSpot", "VXDAlignment", "CDCAlignment"});
272  GlobalCalibrationManager::initGlobalVector(vector);
273 
274  int timeid = 0;
275  EventMetaData ev;
276 
277  // vxd
278  timeid = 0;
279  ev = gotoNextChangeInRun(timeTable, 10, timeid);
280  EXPECT_EQ(timeid, 0);
281  EXPECT_EQ(ev, EventMetaData(0, 0, 0));
282 
283  timeid = 1;
284  ev = gotoNextChangeInRun(timeTable, 10, timeid);
285  EXPECT_EQ(timeid, 1);
286  EXPECT_EQ(ev, EventMetaData(0, 1, 0));
287 
288  timeid = 4;
289  ev = gotoNextChangeInRun(timeTable, 10, timeid);
290  EXPECT_EQ(timeid, 4);
291  EXPECT_EQ(ev, EventMetaData(0, 3, 0));
292 
293  timeid = 5;
294  ev = gotoNextChangeInRun(timeTable, 10, timeid);
295  EXPECT_EQ(timeid, 5);
296  EXPECT_EQ(ev, EventMetaData(0, 4, 0));
297 
298  // beam
299  timeid = 0;
300  ev = gotoNextChangeInRun(timeTable, 1, timeid);
301  EXPECT_EQ(timeid, 0);
302  EXPECT_EQ(ev, EventMetaData(0, 0, 0));
303 
304  timeid = 1;
305  ev = gotoNextChangeInRun(timeTable, 1, timeid);
306  EXPECT_EQ(timeid, 1);
307  EXPECT_EQ(ev, EventMetaData(0, 1, 0));
308 
309  timeid = 2;
310  ev = gotoNextChangeInRun(timeTable, 1, timeid);
311  EXPECT_EQ(timeid, 3);
312  EXPECT_EQ(ev, EventMetaData(530532, 2, 0));
313 
314  timeid = 3;
315  ev = gotoNextChangeInRun(timeTable, 1, timeid);
316  EXPECT_EQ(timeid, 3);
317  EXPECT_EQ(ev, EventMetaData(530532, 2, 0));
318 
319  timeid = 4;
320  ev = gotoNextChangeInRun(timeTable, 1, timeid);
321  EXPECT_EQ(timeid, 4);
322  EXPECT_EQ(ev, EventMetaData(0, 3, 0));
323 
324  timeid = 5;
325  ev = gotoNextChangeInRun(timeTable, 1, timeid);
326  EXPECT_EQ(timeid, 5);
327  EXPECT_EQ(ev, EventMetaData(0, 4, 0));
328 
329 
330 
331  timeid = 0;
332  ev = gotoNextChangeRunWise(timeTable, 1, timeid);
333  EXPECT_EQ(timeid, 0);
334  EXPECT_EQ(ev, EventMetaData(0, 1, 0));
335 
336  timeid = 1;
337  ev = gotoNextChangeRunWise(timeTable, 1, timeid);
338  EXPECT_EQ(timeid, 1);
339  EXPECT_EQ(ev, EventMetaData(0, 2, 0));
340 
341  timeid = 2;
342  ev = gotoNextChangeRunWise(timeTable, 1, timeid);
343  EXPECT_EQ(timeid, 3);
344  EXPECT_EQ(ev, EventMetaData(0, 3, 0));
345 
346  timeid = 3;
347  ev = gotoNextChangeRunWise(timeTable, 1, timeid);
348  EXPECT_EQ(timeid, 3);
349  EXPECT_EQ(ev, EventMetaData(0, 3, 0));
350 
351  timeid = 4;
352  ev = gotoNextChangeRunWise(timeTable, 1, timeid);
353  EXPECT_EQ(timeid, 4);
354  EXPECT_EQ(ev, EventMetaData(0, 4, 0));
355 
356  timeid = 5;
357  ev = gotoNextChangeRunWise(timeTable, 1, timeid);
358  EXPECT_EQ(timeid, 5);
359  EXPECT_EQ(ev, EventMetaData(0, 4, 0));
360 
361 
362 
363  timeid = 0;
364  ev = gotoNextChangeRunWise(timeTable, 10, timeid);
365  EXPECT_EQ(timeid, 3);
366  EXPECT_EQ(ev, EventMetaData(0, 3, 0));
367  ev = gotoNextChangeRunWise(timeTable, 10, timeid);
368  EXPECT_EQ(timeid, 3);
369  EXPECT_EQ(ev, EventMetaData(0, 3, 0));
370 
371  timeid = 4;
372  ev = gotoNextChangeRunWise(timeTable, 10, timeid);
373  EXPECT_EQ(timeid, 5);
374  EXPECT_EQ(ev, EventMetaData(0, 4, 0));
375 
376 
377 
378 
379  auto table = TimeIdsTable2PayloadsTable(timeTable, vector);
380 
381 
382  EXPECT_EQ(getPayloadByContinuousIndex(table, 27, 0).first.getExperiment(), getPayloadByContinuousIndex(payloadsTable, 27,
383  0).first.getExperiment());
384 
385 
386  B2INFO(table.at(27).at(0).second.at(0).first.getEvent() << " " << table.at(27).at(0).second.at(0).first.getRun() << " " << table.at(
387  27).at(0).second.at(0).first.getExperiment());
388  EXPECT_EQ(table.at(27).at(0).second.at(0).first, payloadsTable.at(27).at(0).second.at(0).first);
389  B2INFO(table.at(27).at(0).second.at(0).second->getGlobalUniqueID());
390  EXPECT_EQ(table.at(27).at(0).second.at(0).second->getGlobalUniqueID(),
391  payloadsTable.at(27).at(0).second.at(0).second->getGlobalUniqueID());
392 
393  B2INFO(table.at(10).at(0).second.at(0).first.getEvent() << " " << table.at(10).at(0).second.at(0).first.getRun() << " " << table.at(
394  10).at(0).second.at(0).first.getExperiment());
395  EXPECT_EQ(table.at(10).at(0).second.at(0).first, payloadsTable.at(10).at(0).second.at(0).first);
396  B2INFO(table.at(10).at(0).second.at(0).second->getGlobalUniqueID());
397  EXPECT_EQ(table.at(10).at(0).second.at(0).second->getGlobalUniqueID(),
398  payloadsTable.at(10).at(0).second.at(0).second->getGlobalUniqueID());
399 
400  B2INFO(table.at(1).at(0).second.at(0).first.getEvent() << " " << table.at(1).at(0).second.at(0).first.getRun() << " " << table.at(
401  1).at(0).second.at(0).first.getExperiment());
402  EXPECT_EQ(table.at(1).at(0).second.at(0).first, payloadsTable.at(1).at(0).second.at(0).first);
403  B2INFO(table.at(1).at(0).second.at(0).second->getGlobalUniqueID());
404  EXPECT_EQ(table.at(1).at(0).second.at(0).second->getGlobalUniqueID(),
405  payloadsTable.at(1).at(0).second.at(0).second->getGlobalUniqueID());
406 
407  B2INFO(table.at(1).at(2).second.at(1).first.getEvent() << " " << table.at(1).at(2).second.at(1).first.getRun() << " " << table.at(
408  1).at(2).second.at(1).first.getExperiment());
409  EXPECT_EQ(table.at(1).at(2).second.at(1).first, payloadsTable.at(1).at(2).second.at(1).first);
410  B2INFO(table.at(1).at(2).second.at(1).second->getGlobalUniqueID());
411  EXPECT_EQ(table.at(1).at(2).second.at(1).second->getGlobalUniqueID(),
412  payloadsTable.at(1).at(2).second.at(1).second->getGlobalUniqueID());
413 
414 
415  }
416 
418  TEST_F(TimeLineTest, GlobalParamTimeLine)
419  {
420 
421  GlobalParamVector vector({"BeamSpot", "VXDAlignment", "CDCAlignment"});
422  GlobalCalibrationManager::initGlobalVector(vector);
423  GlobalLabel label;
424  GlobalParamTimeLine timeline(eventHeader, label, vector);
425 
426  timeline.loadFromDB();
427 
428  GlobalLabel::setCurrentTimeInterval(4);
429  auto beamX0 = GlobalLabel::construct<BeamSpot>(0, 1).label();
430  timeline.updateGlobalParam(GlobalLabel(beamX0), 3.);
431 
432  GlobalLabel::setCurrentTimeInterval(3);
433  auto beamZ = GlobalLabel::construct<BeamSpot>(0, 3).label();
434  auto beamX = GlobalLabel::construct<BeamSpot>(0, 1).label();
435 
436  GlobalLabel::setCurrentTimeInterval(4);
437  auto yingZ = GlobalLabel::construct<VXDAlignment>(VxdID(1, 0, 0, 1).getID(), 3).label();
438 
439 
440  timeline.updateGlobalParam(GlobalLabel(beamZ), 42.);
441  timeline.updateGlobalParam(GlobalLabel(beamX), 43.);
442  timeline.updateGlobalParam(GlobalLabel(yingZ), 44.);
443 
444  auto objects = timeline.releaseObjects();
445  EXPECT_EQ(objects.size(), 8);
446 
447  for (auto iov_obj : objects)
448  Database::Instance().storeData(DataStore::objectName(iov_obj.second->IsA(), ""), iov_obj.second, iov_obj.first);
449 
450  TFile file("testPayloads/dbstore_EventDependency_rev_1.root");
451  auto evdep = (EventDependency*) file.Get("EventDependency");
452 
453  auto beam = dynamic_cast<BeamSpot*>(evdep->getObject(EventMetaData(530532, 2, 0)));
454  EXPECT_EQ(beam->getIPPosition()[2], 42.);
455 
456  beam = dynamic_cast<BeamSpot*>(evdep->getObject(EventMetaData(530532, 2, 0)));
457  EXPECT_EQ(beam->getIPPosition()[0], 43.);
458 
459  beam = dynamic_cast<BeamSpot*>(evdep->getObject(EventMetaData(530532 - 1, 2, 0)));
460  EXPECT_EQ(beam->getIPPosition()[2], 0.);
461 
462  beam = dynamic_cast<BeamSpot*>(evdep->getObject(EventMetaData(530532 - 1, 2, 0)));
463  EXPECT_EQ(beam->getIPPosition()[0], 0.);
464 
465  file.Close();
466 
467  TFile file2("testPayloads/dbstore_BeamSpot_rev_3.root");
468  auto beam2 = (BeamSpot*) file2.Get("BeamSpot");
469  beam2->getIPPosition().Print();
470  EXPECT_EQ(beam2->getIPPosition()[0], 3.);
471 
472  file2.Close();
473 
474  TFile file3("testPayloads/dbstore_VXDAlignment_rev_2.root");
475  auto vxd = (VXDAlignment*) file3.Get("VXDAlignment");
476  EXPECT_EQ(vxd->getGlobalParam(VxdID(1, 0, 0, 1).getID(), 3), 44.);
477 
478  file3.Close();
479  // --------------------------------------------------------------------
480  }
481 } // namespace
Belle2::IntervalOfValidity
A class that describes the interval of experiments/runs for which an object in the database is valid.
Definition: IntervalOfValidity.h:35
Belle2::VxdID
Class to uniquely identify a any structure of the PXD and SVD.
Definition: VxdID.h:43
Belle2::getID
int getID(const std::vector< double > &breaks, double t)
get id of the time point t
Definition: calibTools.h:71
Belle2::BeamSpot
This class contains the beam spot position and size modeled as a gaussian distribution in space.
Definition: BeamSpot.h:32
Belle2::GlobalLabel
Class to convert to/from global labels for Millepede II to/from detector & parameter identificators.
Definition: GlobalLabel.h:51
Belle2::EventDependency
Class for handling changing conditions as a function of event number.
Definition: EventDependency.h:32
Belle2::StoreObjPtr::construct
bool construct(Args &&... params)
Construct an object of type T in this StoreObjPtr, using the provided constructor arguments.
Definition: StoreObjPtr.h:128
Belle2
Abstract base class for different kinds of events.
Definition: MillepedeAlgorithm.h:19
Belle2::StoreObjPtr
Type-safe access to single objects in the data store.
Definition: ParticleList.h:33
Belle2::TEST_F
TEST_F(GlobalLabelTest, LargeNumberOfTimeDependentParameters)
Test large number of time-dep params for registration and retrieval.
Definition: globalLabel.cc:65
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