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>
21 #include <gtest/gtest.h>
25 #include <boost/filesystem.hpp>
32 using namespace alignment;
33 using namespace timeline;
39 MockDBObj(
double value = 0.) : m_param(value) {}
42 static unsigned short getGlobalUniqueID()
44 static_assert(UID != 0,
"Non-zero UID required");
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}};}
58 class TimeLineTest :
public ::testing::Test {
61 IntraIoVPayloads beamspotRun0 = {
62 {
EventMetaData(0, 0, 0), std::make_shared<GlobalParamSet<BeamSpot>>()}
65 IntraIoVPayloads beamspotRun1 = {
66 {
EventMetaData(0, 1, 0), std::make_shared<GlobalParamSet<BeamSpot>>()}
69 IntraIoVPayloads beamspotRun2 = {
70 {
EventMetaData(0, 2, 0), std::make_shared<GlobalParamSet<BeamSpot>>()},
71 {
EventMetaData(530532, 2, 0), std::make_shared<GlobalParamSet<BeamSpot>>()}
74 IntraIoVPayloads beamspotRun3 = {
75 {
EventMetaData(0, 3, 0), std::make_shared<GlobalParamSet<BeamSpot>>()}
78 IntraIoVPayloads beamspotRun4 = {
79 {
EventMetaData(0, 4, 0), std::make_shared<GlobalParamSet<BeamSpot>>()}
82 PayloadIovBlockRow beamspotRow = {
90 IntraIoVPayloads vxdRun0to2 = {
91 {
EventMetaData(0, 0, 0), std::make_shared<GlobalParamSet<VXDAlignment>>()},
94 IntraIoVPayloads vxdRun3toInf = {
95 {
EventMetaData(0, 3, 0), std::make_shared<GlobalParamSet<VXDAlignment>>()},
98 PayloadIovBlockRow vxdRow = {
104 IntraIoVPayloads cdcBlock = {
105 {
EventMetaData(0, 0, 0), std::make_shared<GlobalParamSet<CDCAlignment>>()}
108 PayloadIovBlockRow cdcRow = {
112 PayloadsTable payloadsTable = {
113 {BeamSpot::getGlobalUniqueID(), beamspotRow},
114 {VXDAlignment::getGlobalUniqueID(), vxdRow},
115 {CDCAlignment::getGlobalUniqueID(), cdcRow}
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};
124 EventHeader eventHeader = {
133 RunHeader runHeader = {
142 TableData tableData = {
148 TimeTable timeTable = std::make_tuple(eventHeader, runHeader, tableData);
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};
154 TableData initTableData = {
160 TimeTable initTimeTable = std::make_tuple(eventHeader, runHeader, initTableData);
166 DataStore::Instance().setInitializeActive(
true);
167 evtPtr.registerInDataStore();
168 DataStore::Instance().setInitializeActive(
false);
172 auto& c = Conditions::Configuration::getInstance();
173 c.setNewPayloadLocation(
"testPayloads/TestDatabase.txt");
175 GlobalLabel::setCurrentTimeInterval(0);
176 GlobalLabel::clearTimeDependentParamaters();
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);
182 yingZ.registerTimeDependent(4);
187 beamspotX.registerTimeDependent(2);
188 beamspotX.registerTimeDependent(3);
189 beamspotX.registerTimeDependent(4);
191 beamspotZ.registerTimeDependent(1);
192 beamspotZ.registerTimeDependent(2);
193 beamspotZ.registerTimeDependent(3);
194 beamspotZ.registerTimeDependent(4);
195 beamspotZ.registerTimeDependent(5);
200 virtual void TearDown()
202 GlobalLabel::clearTimeDependentParamaters();
203 GlobalLabel::setCurrentTimeInterval(0);
205 boost::filesystem::remove_all(
"testPayloads");
207 DataStore::Instance().reset();
213 TEST_F(TimeLineTest, InitialTimeTable)
216 auto table = makeInitialTimeTable(eventHeader, label);
218 std::vector<int> myrow0 = {0, 1, 1, 1, 1, 1};
219 std::vector<int> myrow1 = {0, 0, 0, 0, 1, 0};
221 TableData myInitTableData = {
226 TimeTable myInitTimeTable = std::make_tuple(eventHeader, runHeader, myInitTableData);
229 EXPECT_EQ(table, myInitTimeTable);
234 TEST_F(TimeLineTest, TimeTable)
236 finalizeTimeTable(initTimeTable);
237 EXPECT_EQ(initTimeTable, timeTable);
239 EXPECT_EQ(getContinuousIndexByTimeID(timeTable, 1, 3), 3);
240 EXPECT_EQ(getContinuousIndexByTimeID(timeTable, 10, 3), 0);
241 EXPECT_EQ(getContinuousIndexByTimeID(timeTable, 27, 3), 0);
246 TEST_F(TimeLineTest, PayloadTable)
249 getPayloadByContinuousIndex(payloadsTable, 1, 3).second->setGlobalParam(42., 0, 1);
250 EXPECT_EQ(getPayloadByContinuousIndex(payloadsTable, 1, 3).second->getGlobalParam(0, 1), 42.);
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));
260 EXPECT_EQ(getPayloadByContinuousIndex(payloadsTable, 10, 0).first,
EventMetaData(0, 0, 0));
261 EXPECT_EQ(getPayloadByContinuousIndex(payloadsTable, 10, 1).first,
EventMetaData(0, 3, 0));
263 EXPECT_EQ(getPayloadByContinuousIndex(payloadsTable, 27, 0).first,
EventMetaData(0, 0, 0));
269 TEST_F(TimeLineTest, TimeTable2PayloadsTable)
271 GlobalParamVector vector({
"BeamSpot",
"VXDAlignment",
"CDCAlignment"});
272 GlobalCalibrationManager::initGlobalVector(vector);
279 ev = gotoNextChangeInRun(timeTable, 10, timeid);
280 EXPECT_EQ(timeid, 0);
284 ev = gotoNextChangeInRun(timeTable, 10, timeid);
285 EXPECT_EQ(timeid, 1);
289 ev = gotoNextChangeInRun(timeTable, 10, timeid);
290 EXPECT_EQ(timeid, 4);
294 ev = gotoNextChangeInRun(timeTable, 10, timeid);
295 EXPECT_EQ(timeid, 5);
300 ev = gotoNextChangeInRun(timeTable, 1, timeid);
301 EXPECT_EQ(timeid, 0);
305 ev = gotoNextChangeInRun(timeTable, 1, timeid);
306 EXPECT_EQ(timeid, 1);
310 ev = gotoNextChangeInRun(timeTable, 1, timeid);
311 EXPECT_EQ(timeid, 3);
315 ev = gotoNextChangeInRun(timeTable, 1, timeid);
316 EXPECT_EQ(timeid, 3);
320 ev = gotoNextChangeInRun(timeTable, 1, timeid);
321 EXPECT_EQ(timeid, 4);
325 ev = gotoNextChangeInRun(timeTable, 1, timeid);
326 EXPECT_EQ(timeid, 5);
332 ev = gotoNextChangeRunWise(timeTable, 1, timeid);
333 EXPECT_EQ(timeid, 0);
337 ev = gotoNextChangeRunWise(timeTable, 1, timeid);
338 EXPECT_EQ(timeid, 1);
342 ev = gotoNextChangeRunWise(timeTable, 1, timeid);
343 EXPECT_EQ(timeid, 3);
347 ev = gotoNextChangeRunWise(timeTable, 1, timeid);
348 EXPECT_EQ(timeid, 3);
352 ev = gotoNextChangeRunWise(timeTable, 1, timeid);
353 EXPECT_EQ(timeid, 4);
357 ev = gotoNextChangeRunWise(timeTable, 1, timeid);
358 EXPECT_EQ(timeid, 5);
364 ev = gotoNextChangeRunWise(timeTable, 10, timeid);
365 EXPECT_EQ(timeid, 3);
367 ev = gotoNextChangeRunWise(timeTable, 10, timeid);
368 EXPECT_EQ(timeid, 3);
372 ev = gotoNextChangeRunWise(timeTable, 10, timeid);
373 EXPECT_EQ(timeid, 5);
379 auto table = TimeIdsTable2PayloadsTable(timeTable, vector);
382 EXPECT_EQ(getPayloadByContinuousIndex(table, 27, 0).first.getExperiment(), getPayloadByContinuousIndex(payloadsTable, 27,
383 0).first.getExperiment());
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());
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());
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());
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());
418 TEST_F(TimeLineTest, GlobalParamTimeLine)
421 GlobalParamVector vector({
"BeamSpot",
"VXDAlignment",
"CDCAlignment"});
422 GlobalCalibrationManager::initGlobalVector(vector);
424 GlobalParamTimeLine timeline(eventHeader, label, vector);
426 timeline.loadFromDB();
428 GlobalLabel::setCurrentTimeInterval(4);
429 auto beamX0 = GlobalLabel::construct<BeamSpot>(0, 1).label();
430 timeline.updateGlobalParam(
GlobalLabel(beamX0), 3.);
432 GlobalLabel::setCurrentTimeInterval(3);
433 auto beamZ = GlobalLabel::construct<BeamSpot>(0, 3).label();
434 auto beamX = GlobalLabel::construct<BeamSpot>(0, 1).label();
436 GlobalLabel::setCurrentTimeInterval(4);
437 auto yingZ = GlobalLabel::construct<VXDAlignment>(
VxdID(1, 0, 0, 1).
getID(), 3).label();
440 timeline.updateGlobalParam(
GlobalLabel(beamZ), 42.);
441 timeline.updateGlobalParam(
GlobalLabel(beamX), 43.);
442 timeline.updateGlobalParam(
GlobalLabel(yingZ), 44.);
444 auto objects = timeline.releaseObjects();
445 EXPECT_EQ(objects.size(), 8);
447 for (
auto iov_obj : objects)
448 Database::Instance().storeData(DataStore::objectName(iov_obj.second->IsA(),
""), iov_obj.second, iov_obj.first);
450 TFile file(
"testPayloads/dbstore_EventDependency_rev_1.root");
454 EXPECT_EQ(beam->getIPPosition()[2], 42.);
457 EXPECT_EQ(beam->getIPPosition()[0], 43.);
460 EXPECT_EQ(beam->getIPPosition()[2], 0.);
463 EXPECT_EQ(beam->getIPPosition()[0], 0.);
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.);
474 TFile file3(
"testPayloads/dbstore_VXDAlignment_rev_2.root");
476 EXPECT_EQ(vxd->getGlobalParam(
VxdID(1, 0, 0, 1).
getID(), 3), 44.);