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>
24 #include <boost/filesystem.hpp>
31 using namespace alignment;
32 using namespace timeline;
38 MockDBObj(
double value = 0.) : m_param(value) {}
41 static unsigned short getGlobalUniqueID()
43 static_assert(UID != 0,
"Non-zero UID required");
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}};}
57 class TimeLineTest :
public ::testing::Test {
60 IntraIoVPayloads beamspotRun0 = {
61 {
EventMetaData(0, 0, 0), std::make_shared<GlobalParamSet<BeamSpot>>()}
64 IntraIoVPayloads beamspotRun1 = {
65 {
EventMetaData(0, 1, 0), std::make_shared<GlobalParamSet<BeamSpot>>()}
68 IntraIoVPayloads beamspotRun2 = {
69 {
EventMetaData(0, 2, 0), std::make_shared<GlobalParamSet<BeamSpot>>()},
70 {
EventMetaData(530532, 2, 0), std::make_shared<GlobalParamSet<BeamSpot>>()}
73 IntraIoVPayloads beamspotRun3 = {
74 {
EventMetaData(0, 3, 0), std::make_shared<GlobalParamSet<BeamSpot>>()}
77 IntraIoVPayloads beamspotRun4 = {
78 {
EventMetaData(0, 4, 0), std::make_shared<GlobalParamSet<BeamSpot>>()}
81 PayloadIovBlockRow beamspotRow = {
89 IntraIoVPayloads vxdRun0to2 = {
90 {
EventMetaData(0, 0, 0), std::make_shared<GlobalParamSet<VXDAlignment>>()},
93 IntraIoVPayloads vxdRun3toInf = {
94 {
EventMetaData(0, 3, 0), std::make_shared<GlobalParamSet<VXDAlignment>>()},
97 PayloadIovBlockRow vxdRow = {
103 IntraIoVPayloads cdcBlock = {
104 {
EventMetaData(0, 0, 0), std::make_shared<GlobalParamSet<CDCAlignment>>()}
107 PayloadIovBlockRow cdcRow = {
111 PayloadsTable payloadsTable = {
112 {BeamSpot::getGlobalUniqueID(), beamspotRow},
113 {VXDAlignment::getGlobalUniqueID(), vxdRow},
114 {CDCAlignment::getGlobalUniqueID(), cdcRow}
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};
123 EventHeader eventHeader = {
132 RunHeader runHeader = {
141 TableData tableData = {
147 TimeTable timeTable = std::make_tuple(eventHeader, runHeader, tableData);
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};
153 TableData initTableData = {
159 TimeTable initTimeTable = std::make_tuple(eventHeader, runHeader, initTableData);
165 DataStore::Instance().setInitializeActive(
true);
167 DataStore::Instance().setInitializeActive(
false);
171 auto& c = Conditions::Configuration::getInstance();
172 c.setNewPayloadLocation(
"testPayloads/TestDatabase.txt");
174 GlobalLabel::setCurrentTimeInterval(0);
175 GlobalLabel::clearTimeDependentParamaters();
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);
181 yingZ.registerTimeDependent(4);
186 beamspotX.registerTimeDependent(2);
187 beamspotX.registerTimeDependent(3);
188 beamspotX.registerTimeDependent(4);
190 beamspotZ.registerTimeDependent(1);
191 beamspotZ.registerTimeDependent(2);
192 beamspotZ.registerTimeDependent(3);
193 beamspotZ.registerTimeDependent(4);
194 beamspotZ.registerTimeDependent(5);
199 virtual void TearDown()
201 GlobalLabel::clearTimeDependentParamaters();
202 GlobalLabel::setCurrentTimeInterval(0);
204 boost::filesystem::remove_all(
"testPayloads");
206 DataStore::Instance().reset();
212 TEST_F(TimeLineTest, InitialTimeTable)
215 auto table = makeInitialTimeTable(eventHeader, label);
217 std::vector<int> myrow0 = {0, 1, 1, 1, 1, 1};
218 std::vector<int> myrow1 = {0, 0, 0, 0, 1, 0};
220 TableData myInitTableData = {
225 TimeTable myInitTimeTable = std::make_tuple(eventHeader, runHeader, myInitTableData);
228 EXPECT_EQ(table, myInitTimeTable);
233 TEST_F(TimeLineTest, TimeTable)
235 finalizeTimeTable(initTimeTable);
236 EXPECT_EQ(initTimeTable, timeTable);
238 EXPECT_EQ(getContinuousIndexByTimeID(timeTable, 1, 3), 3);
239 EXPECT_EQ(getContinuousIndexByTimeID(timeTable, 10, 3), 0);
240 EXPECT_EQ(getContinuousIndexByTimeID(timeTable, 27, 3), 0);
245 TEST_F(TimeLineTest, PayloadTable)
248 getPayloadByContinuousIndex(payloadsTable, 1, 3).second->setGlobalParam(42., 0, 1);
249 EXPECT_EQ(getPayloadByContinuousIndex(payloadsTable, 1, 3).second->getGlobalParam(0, 1), 42.);
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));
259 EXPECT_EQ(getPayloadByContinuousIndex(payloadsTable, 10, 0).first,
EventMetaData(0, 0, 0));
260 EXPECT_EQ(getPayloadByContinuousIndex(payloadsTable, 10, 1).first,
EventMetaData(0, 3, 0));
262 EXPECT_EQ(getPayloadByContinuousIndex(payloadsTable, 27, 0).first,
EventMetaData(0, 0, 0));
268 TEST_F(TimeLineTest, TimeTable2PayloadsTable)
270 GlobalParamVector vector({
"BeamSpot",
"VXDAlignment",
"CDCAlignment"});
271 GlobalCalibrationManager::initGlobalVector(vector);
278 ev = gotoNextChangeInRun(timeTable, 10, timeid);
279 EXPECT_EQ(timeid, 0);
283 ev = gotoNextChangeInRun(timeTable, 10, timeid);
284 EXPECT_EQ(timeid, 1);
288 ev = gotoNextChangeInRun(timeTable, 10, timeid);
289 EXPECT_EQ(timeid, 4);
293 ev = gotoNextChangeInRun(timeTable, 10, timeid);
294 EXPECT_EQ(timeid, 5);
299 ev = gotoNextChangeInRun(timeTable, 1, timeid);
300 EXPECT_EQ(timeid, 0);
304 ev = gotoNextChangeInRun(timeTable, 1, timeid);
305 EXPECT_EQ(timeid, 1);
309 ev = gotoNextChangeInRun(timeTable, 1, timeid);
310 EXPECT_EQ(timeid, 3);
314 ev = gotoNextChangeInRun(timeTable, 1, timeid);
315 EXPECT_EQ(timeid, 3);
319 ev = gotoNextChangeInRun(timeTable, 1, timeid);
320 EXPECT_EQ(timeid, 4);
324 ev = gotoNextChangeInRun(timeTable, 1, timeid);
325 EXPECT_EQ(timeid, 5);
331 ev = gotoNextChangeRunWise(timeTable, 1, timeid);
332 EXPECT_EQ(timeid, 0);
336 ev = gotoNextChangeRunWise(timeTable, 1, timeid);
337 EXPECT_EQ(timeid, 1);
341 ev = gotoNextChangeRunWise(timeTable, 1, timeid);
342 EXPECT_EQ(timeid, 3);
346 ev = gotoNextChangeRunWise(timeTable, 1, timeid);
347 EXPECT_EQ(timeid, 3);
351 ev = gotoNextChangeRunWise(timeTable, 1, timeid);
352 EXPECT_EQ(timeid, 4);
356 ev = gotoNextChangeRunWise(timeTable, 1, timeid);
357 EXPECT_EQ(timeid, 5);
363 ev = gotoNextChangeRunWise(timeTable, 10, timeid);
364 EXPECT_EQ(timeid, 3);
366 ev = gotoNextChangeRunWise(timeTable, 10, timeid);
367 EXPECT_EQ(timeid, 3);
371 ev = gotoNextChangeRunWise(timeTable, 10, timeid);
372 EXPECT_EQ(timeid, 5);
378 auto table = TimeIdsTable2PayloadsTable(timeTable, vector);
381 EXPECT_EQ(getPayloadByContinuousIndex(table, 27, 0).first.getExperiment(), getPayloadByContinuousIndex(payloadsTable, 27,
382 0).first.getExperiment());
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());
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());
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());
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());
417 TEST_F(TimeLineTest, GlobalParamTimeLine)
420 GlobalParamVector vector({
"BeamSpot",
"VXDAlignment",
"CDCAlignment"});
421 GlobalCalibrationManager::initGlobalVector(vector);
423 GlobalParamTimeLine timeline(eventHeader, label, vector);
425 timeline.loadFromDB();
427 GlobalLabel::setCurrentTimeInterval(4);
428 auto beamX0 = GlobalLabel::construct<BeamSpot>(0, 1).label();
429 timeline.updateGlobalParam(
GlobalLabel(beamX0), 3.);
431 GlobalLabel::setCurrentTimeInterval(3);
432 auto beamZ = GlobalLabel::construct<BeamSpot>(0, 3).label();
433 auto beamX = GlobalLabel::construct<BeamSpot>(0, 1).label();
435 GlobalLabel::setCurrentTimeInterval(4);
436 auto yingZ = GlobalLabel::construct<VXDAlignment>(
VxdID(1, 0, 0, 1).
getID(), 3).label();
439 timeline.updateGlobalParam(
GlobalLabel(beamZ), 42.);
440 timeline.updateGlobalParam(
GlobalLabel(beamX), 43.);
441 timeline.updateGlobalParam(
GlobalLabel(yingZ), 44.);
443 auto objects = timeline.releaseObjects();
444 EXPECT_EQ(objects.size(), 8);
446 for (
auto iov_obj : objects)
447 Database::Instance().storeData(DataStore::objectName(iov_obj.second->IsA(),
""), iov_obj.second, iov_obj.first);
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());
463 EXPECT_EQ(beam->getIPPosition()[2], 42.);
466 EXPECT_EQ(beam->getIPPosition()[0], 43.);
469 EXPECT_EQ(beam->getIPPosition()[2], 0.);
472 EXPECT_EQ(beam->getIPPosition()[0], 0.);
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());
482 auto beam2 = (
BeamSpot*) file.Get(
"BeamSpot");
484 beam2->getIPPosition().Print();
485 EXPECT_EQ(beam2->getIPPosition()[0], 3.);
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());
497 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.
Class to store and retrieve temporary payloads.
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.
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.
Class to uniquely identify a any structure of the PXD and SVD.
TEST_F(GlobalLabelTest, LargeNumberOfTimeDependentParameters)
Test large number of time-dep params for registration and retrieval.
int getID(const std::vector< double > &breaks, double t)
get id of the time point t
Abstract base class for different kinds of events.