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>
20#include <gtest/gtest.h>
29using namespace alignment;
30using namespace timeline;
36 MockDBObj(
double value = 0.) : m_param(value) {}
39 static unsigned short getGlobalUniqueID()
41 static_assert(UID != 0,
"Non-zero UID required");
45 double getGlobalParam(
unsigned short element,
unsigned short param) {
return m_param;}
47 void setGlobalParam(
double value,
unsigned short element,
unsigned short param) {m_param = value;}
49 std::vector<std::pair<unsigned short, unsigned short>> listGlobalParams() {
return {{0, 0}};}
55 class TimeLineTest :
public ::testing::Test {
58 IntraIoVPayloads beamspotRun0 = {
59 {
EventMetaData(0, 0, 0), std::make_shared<GlobalParamSet<BeamSpot>>()}
62 IntraIoVPayloads beamspotRun1 = {
63 {
EventMetaData(0, 1, 0), std::make_shared<GlobalParamSet<BeamSpot>>()}
66 IntraIoVPayloads beamspotRun2 = {
67 {
EventMetaData(0, 2, 0), std::make_shared<GlobalParamSet<BeamSpot>>()},
68 {
EventMetaData(530532, 2, 0), std::make_shared<GlobalParamSet<BeamSpot>>()}
71 IntraIoVPayloads beamspotRun3 = {
72 {
EventMetaData(0, 3, 0), std::make_shared<GlobalParamSet<BeamSpot>>()}
75 IntraIoVPayloads beamspotRun4 = {
76 {
EventMetaData(0, 4, 0), std::make_shared<GlobalParamSet<BeamSpot>>()}
79 PayloadIovBlockRow beamspotRow = {
87 IntraIoVPayloads vxdRun0to2 = {
88 {
EventMetaData(0, 0, 0), std::make_shared<GlobalParamSet<VXDAlignment>>()},
91 IntraIoVPayloads vxdRun3toInf = {
92 {
EventMetaData(0, 3, 0), std::make_shared<GlobalParamSet<VXDAlignment>>()},
95 PayloadIovBlockRow vxdRow = {
101 IntraIoVPayloads cdcBlock = {
102 {
EventMetaData(0, 0, 0), std::make_shared<GlobalParamSet<CDCAlignment>>()}
105 PayloadIovBlockRow cdcRow = {
109 PayloadsTable payloadsTable = {
115 std::vector<int> head0 = {0, 1, 2, 3, 4, 5};
116 std::vector<int> head1 = {0, 1, 2, 2, 3, 4};
117 std::vector<int> row0 = {0, 1, 2, 3, 4, 5};
118 std::vector<int> row1 = {0, 0, 0, 0, 1, 1};
119 std::vector<int> row2 = {0, 0, 0, 0, 0, 0};
121 EventHeader eventHeader = {
130 RunHeader runHeader = {
139 TableData tableData = {
145 TimeTable timeTable = std::make_tuple(eventHeader, runHeader, tableData);
147 std::vector<int> irow0 = {0, 1, 1, 1, 1, 1};
148 std::vector<int> irow1 = {0, 0, 0, 0, 1, 0};
149 std::vector<int> irow2 = {0, 0, 0, 0, 0, 0};
151 TableData initTableData = {
157 TimeTable initTimeTable = std::make_tuple(eventHeader, runHeader, initTableData);
170 c.setNewPayloadLocation(
"testPayloads/TestDatabase.txt");
175 auto beamspotX = GlobalLabel::construct<BeamSpot>(0, 1);
176 auto beamspotZ = GlobalLabel::construct<BeamSpot>(0, 3);
177 auto yingZ = GlobalLabel::construct<VXDAlignment>(
VxdID(1, 0, 0, 1).
getID(), 3);
179 yingZ.registerTimeDependent(4);
184 beamspotX.registerTimeDependent(2);
185 beamspotX.registerTimeDependent(3);
186 beamspotX.registerTimeDependent(4);
188 beamspotZ.registerTimeDependent(1);
189 beamspotZ.registerTimeDependent(2);
190 beamspotZ.registerTimeDependent(3);
191 beamspotZ.registerTimeDependent(4);
192 beamspotZ.registerTimeDependent(5);
197 virtual void TearDown()
202 std::filesystem::remove_all(
"testPayloads");
210 TEST_F(TimeLineTest, InitialTimeTable)
213 auto table = makeInitialTimeTable(eventHeader, label);
215 std::vector<int> myrow0 = {0, 1, 1, 1, 1, 1};
216 std::vector<int> myrow1 = {0, 0, 0, 0, 1, 0};
218 TableData myInitTableData = {
223 TimeTable myInitTimeTable = std::make_tuple(eventHeader, runHeader, myInitTableData);
226 EXPECT_EQ(table, myInitTimeTable);
231 TEST_F(TimeLineTest, TimeTable)
233 finalizeTimeTable(initTimeTable);
234 EXPECT_EQ(initTimeTable, timeTable);
236 EXPECT_EQ(getContinuousIndexByTimeID(timeTable, 1, 3), 3);
237 EXPECT_EQ(getContinuousIndexByTimeID(timeTable, 10, 3), 0);
238 EXPECT_EQ(getContinuousIndexByTimeID(timeTable, 27, 3), 0);
243 TEST_F(TimeLineTest, PayloadTable)
246 getPayloadByContinuousIndex(payloadsTable, 1, 3).second->setGlobalParam(42., 0, 1);
247 EXPECT_EQ(getPayloadByContinuousIndex(payloadsTable, 1, 3).second->getGlobalParam(0, 1), 42.);
250 EXPECT_EQ(getPayloadByContinuousIndex(payloadsTable, 1, 0).first,
EventMetaData(0, 0, 0));
251 EXPECT_EQ(getPayloadByContinuousIndex(payloadsTable, 1, 1).first,
EventMetaData(0, 1, 0));
252 EXPECT_EQ(getPayloadByContinuousIndex(payloadsTable, 1, 2).first,
EventMetaData(0, 2, 0));
253 EXPECT_EQ(getPayloadByContinuousIndex(payloadsTable, 1, 3).first,
EventMetaData(530532, 2, 0));
254 EXPECT_EQ(getPayloadByContinuousIndex(payloadsTable, 1, 4).first,
EventMetaData(0, 3, 0));
255 EXPECT_EQ(getPayloadByContinuousIndex(payloadsTable, 1, 5).first,
EventMetaData(0, 4, 0));
257 EXPECT_EQ(getPayloadByContinuousIndex(payloadsTable, 10, 0).first,
EventMetaData(0, 0, 0));
258 EXPECT_EQ(getPayloadByContinuousIndex(payloadsTable, 10, 1).first,
EventMetaData(0, 3, 0));
260 EXPECT_EQ(getPayloadByContinuousIndex(payloadsTable, 27, 0).first,
EventMetaData(0, 0, 0));
266 TEST_F(TimeLineTest, TimeTable2PayloadsTable)
268 GlobalParamVector vector({
"BeamSpot",
"VXDAlignment",
"CDCAlignment"});
269 GlobalCalibrationManager::initGlobalVector(vector);
276 ev = gotoNextChangeInRun(timeTable, 10, timeid);
277 EXPECT_EQ(timeid, 0);
281 ev = gotoNextChangeInRun(timeTable, 10, timeid);
282 EXPECT_EQ(timeid, 1);
286 ev = gotoNextChangeInRun(timeTable, 10, timeid);
287 EXPECT_EQ(timeid, 4);
291 ev = gotoNextChangeInRun(timeTable, 10, timeid);
292 EXPECT_EQ(timeid, 5);
297 ev = gotoNextChangeInRun(timeTable, 1, timeid);
298 EXPECT_EQ(timeid, 0);
302 ev = gotoNextChangeInRun(timeTable, 1, timeid);
303 EXPECT_EQ(timeid, 1);
307 ev = gotoNextChangeInRun(timeTable, 1, timeid);
308 EXPECT_EQ(timeid, 3);
312 ev = gotoNextChangeInRun(timeTable, 1, timeid);
313 EXPECT_EQ(timeid, 3);
317 ev = gotoNextChangeInRun(timeTable, 1, timeid);
318 EXPECT_EQ(timeid, 4);
322 ev = gotoNextChangeInRun(timeTable, 1, timeid);
323 EXPECT_EQ(timeid, 5);
329 ev = gotoNextChangeRunWise(timeTable, 1, timeid);
330 EXPECT_EQ(timeid, 0);
334 ev = gotoNextChangeRunWise(timeTable, 1, timeid);
335 EXPECT_EQ(timeid, 1);
339 ev = gotoNextChangeRunWise(timeTable, 1, timeid);
340 EXPECT_EQ(timeid, 3);
344 ev = gotoNextChangeRunWise(timeTable, 1, timeid);
345 EXPECT_EQ(timeid, 3);
349 ev = gotoNextChangeRunWise(timeTable, 1, timeid);
350 EXPECT_EQ(timeid, 4);
354 ev = gotoNextChangeRunWise(timeTable, 1, timeid);
355 EXPECT_EQ(timeid, 5);
361 ev = gotoNextChangeRunWise(timeTable, 10, timeid);
362 EXPECT_EQ(timeid, 3);
364 ev = gotoNextChangeRunWise(timeTable, 10, timeid);
365 EXPECT_EQ(timeid, 3);
369 ev = gotoNextChangeRunWise(timeTable, 10, timeid);
370 EXPECT_EQ(timeid, 5);
376 auto table = TimeIdsTable2PayloadsTable(timeTable, vector);
379 EXPECT_EQ(getPayloadByContinuousIndex(table, 27, 0).first.getExperiment(), getPayloadByContinuousIndex(payloadsTable, 27,
380 0).first.getExperiment());
383 B2INFO(table.at(27).at(0).second.at(0).first.getEvent() <<
" " << table.at(27).at(0).second.at(0).first.getRun() <<
" " << table.at(
384 27).at(0).second.at(0).first.getExperiment());
385 EXPECT_EQ(table.at(27).at(0).second.at(0).first, payloadsTable.at(27).at(0).second.at(0).first);
386 B2INFO(table.at(27).at(0).second.at(0).second->getGlobalUniqueID());
387 EXPECT_EQ(table.at(27).at(0).second.at(0).second->getGlobalUniqueID(),
388 payloadsTable.at(27).at(0).second.at(0).second->getGlobalUniqueID());
390 B2INFO(table.at(10).at(0).second.at(0).first.getEvent() <<
" " << table.at(10).at(0).second.at(0).first.getRun() <<
" " << table.at(
391 10).at(0).second.at(0).first.getExperiment());
392 EXPECT_EQ(table.at(10).at(0).second.at(0).first, payloadsTable.at(10).at(0).second.at(0).first);
393 B2INFO(table.at(10).at(0).second.at(0).second->getGlobalUniqueID());
394 EXPECT_EQ(table.at(10).at(0).second.at(0).second->getGlobalUniqueID(),
395 payloadsTable.at(10).at(0).second.at(0).second->getGlobalUniqueID());
397 B2INFO(table.at(1).at(0).second.at(0).first.getEvent() <<
" " << table.at(1).at(0).second.at(0).first.getRun() <<
" " << table.at(
398 1).at(0).second.at(0).first.getExperiment());
399 EXPECT_EQ(table.at(1).at(0).second.at(0).first, payloadsTable.at(1).at(0).second.at(0).first);
400 B2INFO(table.at(1).at(0).second.at(0).second->getGlobalUniqueID());
401 EXPECT_EQ(table.at(1).at(0).second.at(0).second->getGlobalUniqueID(),
402 payloadsTable.at(1).at(0).second.at(0).second->getGlobalUniqueID());
404 B2INFO(table.at(1).at(2).second.at(1).first.getEvent() <<
" " << table.at(1).at(2).second.at(1).first.getRun() <<
" " << table.at(
405 1).at(2).second.at(1).first.getExperiment());
406 EXPECT_EQ(table.at(1).at(2).second.at(1).first, payloadsTable.at(1).at(2).second.at(1).first);
407 B2INFO(table.at(1).at(2).second.at(1).second->getGlobalUniqueID());
408 EXPECT_EQ(table.at(1).at(2).second.at(1).second->getGlobalUniqueID(),
409 payloadsTable.at(1).at(2).second.at(1).second->getGlobalUniqueID());
415 TEST_F(TimeLineTest, GlobalParamTimeLine)
418 GlobalParamVector vector({
"BeamSpot",
"VXDAlignment",
"CDCAlignment"});
419 GlobalCalibrationManager::initGlobalVector(vector);
421 GlobalParamTimeLine timeline(eventHeader, label, vector);
423 timeline.loadFromDB();
426 auto beamX0 = GlobalLabel::construct<BeamSpot>(0, 1).label();
427 timeline.updateGlobalParam(
GlobalLabel(beamX0), 3.);
430 auto beamZ = GlobalLabel::construct<BeamSpot>(0, 3).label();
431 auto beamX = GlobalLabel::construct<BeamSpot>(0, 1).label();
434 auto yingZ = GlobalLabel::construct<VXDAlignment>(
VxdID(1, 0, 0, 1).
getID(), 3).label();
437 timeline.updateGlobalParam(
GlobalLabel(beamZ), 42.);
438 timeline.updateGlobalParam(
GlobalLabel(beamX), 43.);
439 timeline.updateGlobalParam(
GlobalLabel(yingZ), 44.);
441 auto objects = timeline.releaseObjects();
442 EXPECT_EQ(objects.size(), 8);
444 for (
auto iov_obj : objects)
453 ASSERT_TRUE(payloads.get(eventMetaData, payloadInfo));
454 ASSERT_FALSE(payloadInfo.filename.empty());
455 TFile file(payloadInfo.filename.c_str());
456 ASSERT_TRUE(file.IsOpen());
461 EXPECT_EQ(beam->getIPPosition()[2], 42.);
464 EXPECT_EQ(beam->getIPPosition()[0], 43.);
467 EXPECT_EQ(beam->getIPPosition()[2], 0.);
470 EXPECT_EQ(beam->getIPPosition()[0], 0.);
475 ASSERT_TRUE(payloads.get(eventMetaData, payloadInfo));
476 ASSERT_FALSE(payloadInfo.filename.empty());
477 TFile file(payloadInfo.filename.c_str());
478 ASSERT_TRUE(file.IsOpen());
480 auto beam2 = (
BeamSpot*) file.Get(
"BeamSpot");
482 beam2->getIPPosition().Print();
483 EXPECT_EQ(beam2->getIPPosition()[0], 3.);
488 ASSERT_TRUE(payloads.get(eventMetaData, payloadInfo));
489 ASSERT_FALSE(payloadInfo.filename.empty());
490 TFile file(payloadInfo.filename.c_str());
491 ASSERT_TRUE(file.IsOpen());
495 EXPECT_EQ(vxd->getGlobalParam(
VxdID(1, 0, 0, 1).
getID(), 3), 44.);
This class contains the beam spot position and size modeled as a gaussian distribution in space.
static unsigned short getGlobalUniqueID()
Return unique ID of BeamSpot in global Millepede calibration (1)
static unsigned short getGlobalUniqueID()
Get global unique id.
static Configuration & getInstance()
Get a reference to the instance which will be used when the Database is initialized.
Class to store and retrieve temporary payloads.
static std::string objectName(const TClass *t, const std::string &name)
Return the storage name for an object of the given TClass and name.
static DataStore & Instance()
Instance of singleton Store.
void setInitializeActive(bool active)
Setter for m_initializeActive.
void reset(EDurability durability)
Frees memory occupied by data store items and removes all objects from the map.
Class for handling changing conditions as a function of event number.
Class to convert to/from global labels for Millepede II to/from detector & parameter identificators.
static void clearTimeDependentParamaters()
Forget all previously registered time dependent parameters.
static void setCurrentTimeInterval(gidTYPE time)
Sets current time id.
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.
bool construct(Args &&... params)
Construct an object of type T in this StoreObjPtr, using the provided constructor arguments.
VXD alignment (and maybe some calibration) parameters.
static unsigned short getGlobalUniqueID()
Get global unique id.
Class to uniquely identify a any structure of the PXD and SVD.
static Database & Instance()
Instance of a singleton Database.
bool storeData(const std::string &name, TObject *object, const IntervalOfValidity &iov)
Store an object in the database.
static void reset(bool keepConfig=false)
Reset the database instance.
int getID(const std::vector< double > &breaks, double t)
get id of the time point t
Abstract base class for different kinds of events.