11 #include <alignment/GlobalTimeLine.h>
13 #include <alignment/Manager.h>
14 #include <framework/core/PyObjConvUtils.h>
15 #include <framework/database/EventDependency.h>
25 EventMetaData gotoNextChangeRunWise(TimeTable& timeTable,
int uid,
int& timeid)
27 auto& row = std::get<TableData>(timeTable).at(uid);
29 auto lastIntervalStartEvent = std::get<EventHeader>(timeTable).at(row.size() - 1);
31 if (timeid >=
int(row.size())) {
32 return lastIntervalStartEvent;
35 auto cell = row.at(timeid);
36 auto cellRun = std::get<RunHeader>(timeTable).at(timeid);
37 for (
long unsigned int iCol = timeid + 1; iCol < row.size(); ++iCol) {
38 if (row.at(iCol) != cell && std::get<RunHeader>(timeTable).at(iCol) != cellRun) {
40 return std::get<EventHeader>(timeTable).at(iCol);
44 timeid = row.size() - 1;
46 return lastIntervalStartEvent;
49 EventMetaData gotoNextChangeInRun(TimeTable& timeTable,
int uid,
int& timeid)
51 auto& row = std::get<TableData>(timeTable).at(uid);
52 auto cell = row.at(timeid);
53 auto cellRun = std::get<RunHeader>(timeTable).at(timeid);
54 for (
long unsigned int iCol = timeid + 1; iCol < row.size(); ++iCol) {
55 if (std::get<RunHeader>(timeTable).at(iCol) != cellRun) {
57 return std::get<EventHeader>(timeTable).at(iCol - 1);
59 if (row.at(iCol) != cell) {
61 return std::get<EventHeader>(timeTable).at(iCol);
64 return std::get<EventHeader>(timeTable).at(timeid);
67 PayloadsTable TimeIdsTable2PayloadsTable(TimeTable& timeTable,
const GlobalParamVector& vector)
69 PayloadsTable payloadsTable;
71 for (
auto& uid_obj : vector.getGlobalParamSets()) {
72 auto uid = uid_obj.first;
73 auto& obj = uid_obj.second;
75 payloadsTable[uid] = {};
77 if (std::get<TableData>(timeTable).find(uid) == std::get<TableData>(timeTable).end()) {
78 auto firstEvent = std::get<EventHeader>(timeTable).at(0);
81 auto iov = IntervalOfValidity(firstEvent.getExperiment(), firstEvent.getRun(), -1, -1);
82 auto objCopy = std::shared_ptr<GlobalParamSetAccess>(obj->clone());
83 payloadsTable[uid].push_back({ iov, {{firstEvent, objCopy}} });
89 for (; iCol < int(std::get<EventHeader>(timeTable).size()); ++iCol) {
90 auto event = std::get<EventHeader>(timeTable).at(iCol);
91 auto exprun = std::get<RunHeader>(timeTable).at(iCol);
92 auto exp = exprun.first;
93 auto run = exprun.second;
97 auto objCopy = std::shared_ptr<GlobalParamSetAccess>(obj->clone());
98 IntraIoVPayloads intraRunEntries;
99 intraRunEntries.push_back({event, objCopy});
101 auto lastEvent = event;
102 for (; iCol < int(std::get<EventHeader>(timeTable).size());) {
103 auto nextEvent = gotoNextChangeInRun(timeTable, uid, iCol);
104 if (nextEvent != lastEvent) {
105 auto objIntraRunCopy = std::shared_ptr<GlobalParamSetAccess>(obj->clone());
106 intraRunEntries.push_back({nextEvent, objIntraRunCopy});
107 lastEvent = nextEvent;
114 auto endEvent = gotoNextChangeRunWise(timeTable, uid, iCol);
115 int endExp = endEvent.getExperiment();
117 int endRun = std::max(0, endEvent.getRun() - 1);
119 if (iCol ==
static_cast<int>(std::get<EventHeader>(timeTable).size()) - 1) {
124 payloadsTable[uid].push_back({IntervalOfValidity(exp, run, endExp, endRun), intraRunEntries});
130 return payloadsTable;
133 TimeTable makeInitialTimeTable(std::vector< EventMetaData > events, GlobalLabel& label)
136 std::vector<int> nullRow(events.size(), 0);
139 std::get<EventHeader>(table) = events;
143 for (
auto event : events) {
144 runs.push_back({
event.getExperiment(), event.getRun()});
146 std::get<RunHeader>(table) = runs;
148 for (
auto& eidpid_intervals : label.getTimeIntervals()) {
149 auto uid = GlobalLabel(eidpid_intervals.first).getUniqueId();
150 if (std::get<TableData>(table).find(uid) == std::get<TableData>(table).end()) {
151 std::get<TableData>(table)[uid] = nullRow;
153 unsigned int lastTime = 0;
154 for (
long unsigned int timeid = 0; timeid < events.size(); ++timeid) {
155 if (lastTime != eidpid_intervals.second.get(timeid)) {
156 std::get<TableData>(table)[uid][timeid] = 1;
165 void finalizeTimeTable(TimeTable& table)
167 for (
auto& row : std::get<TableData>(table)) {
168 auto& cells = row.second;
171 for (
long unsigned int iCell = 0; iCell < cells.size(); ++iCell) {
172 auto cell = cells.at(iCell);
175 B2FATAL(
"First cell (index 0) has to be zero (time id for const objects or 1st instance of time-dep objects) for each row.");
179 if (cell != 0 && cell != 1) {
180 B2FATAL(
"In initial time table, only cells with 0 (=no change of object at beginning of cell) or 1 (object can change at beginning of this cell) are allowed");
186 cells.at(iCell) = currIndex;
191 std::pair< EventMetaData, std::shared_ptr< GlobalParamSetAccess > > getPayloadByContinuousIndex(PayloadsTable& payloadsTable,
192 int uid,
long unsigned int index)
194 auto& row = payloadsTable.at(uid);
196 long unsigned int currentIndex = 0;
197 for (
long unsigned int iIovBlock = 0; iIovBlock < row.size(); ++iIovBlock) {
198 if (currentIndex + row.at(iIovBlock).second.size() > index) {
199 return row.at(iIovBlock).second.at(index - currentIndex);
201 currentIndex += row.at(iIovBlock).second.size();
204 return {EventMetaData(), {}};
207 int getContinuousIndexByTimeID(
const TimeTable& timeTable,
int uid,
int timeid)
211 if (std::get<TableData>(timeTable).find(uid) == std::get<TableData>(timeTable).end())
213 if (timeid >=
int(std::get<TableData>(timeTable).at(uid).size()))
214 return std::get<TableData>(timeTable).at(uid).size() - 1;
216 auto cIndex = std::get<TableData>(timeTable).at(uid)[timeid];
223 const GlobalParamVector& vector) : timeTable(makeInitialTimeTable(events, label))
225 finalizeTimeTable(timeTable);
226 payloadsTable = TimeIdsTable2PayloadsTable(timeTable, vector);
230 void GlobalParamTimeLine::loadFromDB()
232 std::map<std::tuple<int, int, int>, std::vector<std::shared_ptr<GlobalParamSetAccess>>> eventPayloads{};
233 for (
auto& row : payloadsTable) {
234 for (
auto& iovBlock : row.second) {
235 for (
auto& payload : iovBlock.second) {
236 auto eventTuple = std::make_tuple((
int)payload.first.getExperiment(), (
int)payload.first.getRun(), (
int)payload.first.getEvent());
237 auto iter_and_inserted = eventPayloads.insert(
238 {eventTuple, std::vector<std::shared_ptr<GlobalParamSetAccess>>()}
240 iter_and_inserted.first->second.push_back(payload.second);
244 for (
auto event_payloads : eventPayloads) {
245 auto event = EventMetaData(std::get<2>(event_payloads.first), std::get<1>(event_payloads.first), std::get<0>(event_payloads.first));
248 for (
auto& payload : event_payloads.second) {
249 payload->loadFromDBObjPtr();
254 void GlobalParamTimeLine::updateGlobalParam(GlobalLabel label,
double correction,
bool resetParam)
256 auto timeid = label.getTimeId();
257 auto eov = label.getEndOfValidity();
258 auto uid = label.getUniqueId();
260 std::set<int> payloadIndices;
263 for (
int i = timeid; i < std::min(eov + 1, int(std::get<EventHeader>(timeTable).size())); ++i) {
264 payloadIndices.insert(getContinuousIndexByTimeID(timeTable, uid, i));
267 for (
auto payloadIndex : payloadIndices) {
268 auto payload = getPayloadByContinuousIndex(payloadsTable, label.getUniqueId(), payloadIndex).second;
272 payload->setGlobalParam(correction, label.getElementId(), label.getParameterId());
274 payload->updateGlobalParam(correction, label.getElementId(), label.getParameterId());
281 std::vector< std::pair< IntervalOfValidity, TObject* > > GlobalParamTimeLine::releaseObjects()
283 std::vector<std::pair<IntervalOfValidity, TObject*>> result;
285 for (
auto& row : payloadsTable) {
286 for (
auto& iovBlock : row.second) {
287 auto iov = iovBlock.first;
288 auto obj = iovBlock.second.at(0).second->releaseObject();
291 if (iovBlock.second.size() == 1) {
293 result.push_back({iov, obj});
304 for (
long unsigned int iObj = 1; iObj < iovBlock.second.size(); ++iObj) {
305 auto nextEvent = iovBlock.second.at(iObj).first.getEvent();
306 auto nextObj = iovBlock.second.at(iObj).second->releaseObject();
309 payloads->add(nextEvent, nextObj);
312 result.push_back({iov, payloads});
319 std::vector< EventMetaData > setupTimedepGlobalLabels(PyObject* config)
321 boost::python::handle<> handle(boost::python::borrowed(config));
322 boost::python::list configList(handle);
324 std::vector< std::tuple< std::vector< int >, std::vector< std::tuple< int, int, int > > > >());
325 return setupTimedepGlobalLabels(newConfig);
330 std::vector<EventMetaData> setupTimedepGlobalLabels(
331 std::vector< std::tuple< std::vector< int >, std::vector< std::tuple< int, int, int > > > >& config)
333 std::vector< std::tuple< std::set< int >, std::set< std::tuple< int, int, int > > > > myConfig = {};
334 std::set<std::tuple<int, int, int>> events;
335 for (
auto& params_events : config) {
336 auto myRow = std::make_tuple(std::set<int>(), std::set<std::tuple< int, int, int>>());
338 for (
auto& param : std::get<0>(params_events))
339 std::get<0>(myRow).insert(param);
340 for (
auto& event : std::get<1>(params_events)) {
343 std::get<1>(myRow).insert(std::make_tuple(std::get<2>(event), std::get<1>(event), std::get<0>(event)));
346 for (
auto& event : std::get<1>(params_events)) {
347 int eventNum = std::get<0>(event);
348 int runNum = std::get<1>(event);
349 int expNum = std::get<2>(event);
352 auto emd = std::make_tuple(expNum, runNum, eventNum);
361 auto firstEventThisRun = std::make_tuple(expNum, runNum, 0);
362 auto firstEventNextRun = std::make_tuple(expNum, runNum + 1, 0);
364 events.insert(firstEventThisRun);
365 events.insert(firstEventNextRun);
367 std::get<1>(myRow).insert(firstEventThisRun);
368 std::get<1>(myRow).insert(firstEventNextRun);
371 myConfig.push_back(myRow);
374 std::vector<EventMetaData> eventsVect;
375 std::map<std::tuple<int, int, int>,
int> eventIndices;
378 for (
auto& event : events) {
380 eventIndices[event] = eventsVect.size();
381 eventsVect.push_back(EventMetaData(std::get<2>(event), std::get<1>(event), std::get<0>(event)));
386 for (
auto& params_events : myConfig) {
387 for (
auto& param : std::get<0>(params_events)) {
388 GlobalLabel label(param);
390 for (
auto& event : std::get<1>(params_events)) {
391 auto eventIndex = eventIndices[event];
393 label.registerTimeDependent(eventIndex);