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