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 = {
80 {IntervalOfValidity(0, 0, 0, 0), beamspotRun0},
81 {IntervalOfValidity(0, 1, 0, 1), beamspotRun1},
82 {IntervalOfValidity(0, 2, 0, 2), beamspotRun2},
83 {IntervalOfValidity(0, 3, 0, 3), beamspotRun3},
84 {IntervalOfValidity(0, 4, 0, 4), beamspotRun4}
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 = {
96 {IntervalOfValidity(0, 0, 0, 2), vxdRun0to2},
97 {IntervalOfValidity(0, 3, 0, 4), vxdRun3toInf}
101 IntraIoVPayloads cdcBlock = {
102 {EventMetaData(0, 0, 0), std::make_shared<GlobalParamSet<CDCAlignment>>()}
105 PayloadIovBlockRow cdcRow = {
106 {IntervalOfValidity(0, 0, 0, 4), cdcBlock}
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 = {
122 EventMetaData(0, 0, 0),
123 EventMetaData(0, 1, 0),
124 EventMetaData(0, 2, 0),
125 EventMetaData(530532, 2, 0),
126 EventMetaData(0, 3, 0),
127 EventMetaData(0, 4, 0)
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);
162 StoreObjPtr<EventMetaData> evtPtr;
170 c.setNewPayloadLocation(
"testPayloads/TestDatabase.txt");
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();
427 timeline.updateGlobalParam(
GlobalLabel(beamX0), 3.);
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().Z(), 42.);
464 EXPECT_EQ(beam->getIPPosition().X(), 43.);
467 EXPECT_EQ(beam->getIPPosition().Z(), 0.);
470 EXPECT_EQ(beam->getIPPosition().X(), 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 std::cout <<
"beam2 IP position(" << beam2->getIPPosition().X() <<
", " << beam2->getIPPosition().Y() <<
", " <<
483 beam2->getIPPosition().Z() <<
")" << std::endl;
484 EXPECT_EQ(beam2->getIPPosition().X(), 3.);
489 ASSERT_TRUE(payloads.get(eventMetaData, payloadInfo));
490 ASSERT_FALSE(payloadInfo.filename.empty());
491 TFile file(payloadInfo.filename.c_str());
492 ASSERT_TRUE(file.IsOpen());
496 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.
int label()
Returns encoded Pede label.
static void clearTimeDependentParamaters()
Forget all previously registered time dependent parameters.
static void setCurrentTimeInterval(gidTYPE time)
Sets current time id.
static GlobalLabel construct(gidTYPE element, gidTYPE param)
Construct label for given DB object (template argument) and its element and parameter.
bool registerInDataStore(DataStore::EStoreFlags storeFlags=DataStore::c_WriteOut)
Register the object/array in the DataStore.
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.