9#include <framework/database/HSFCentralMetadataProvider.h>
10#include <framework/database/MetadataProvider.h>
11#include <framework/database/Downloader.h>
12#include <framework/logging/Logger.h>
13#include <framework/utilities/Conversion.h>
15using json = nlohmann::json;
17namespace Belle2::Conditions {
24 const auto result =
get(
"/gtstatus");
27 std::string invalidStates =
"";
28 for (
const auto& info : result) {
29 const std::string status = info.at(
"name");
30 if (not validStates.erase(status)) {
31 if (!invalidStates.empty()) invalidStates +=
", ";
32 invalidStates += status;
35 B2DEBUG(31,
"Infinite IoV value is set to " <<
m_maxIoV);
37 B2DEBUG(31,
"Conditions Database: unusable globaltag states: " << invalidStates);
38 for (
const auto& status : validStates) {
39 B2DEBUG(31,
"Conditions Database: status marked as usable for global tags is not known to the database"
40 <<
LogVar(
"status", status));
43 const auto payloadUrl =
get(
"user_settings/CDB_PAYLOAD_BASE_URL");
50 std::stringstream stream;
54 stream.seekg(0, std::ios::beg);
55 return json::parse(stream);
61 const std::string url =
"/globalTag/" + escaped;
63 const auto gtinfo =
get(url);
64 return gtinfo.at(
"status").at(
"name");
65 }
catch (std::runtime_error& e) {
66 B2WARNING(
"Conditions Database: Cannot download information on global tag. "
67 "Either the database is overloaded or the selected globaltag doesn't exist"
69 }
catch (std::exception& e) {
70 B2WARNING(
"Conditions Database: Problem determining global tag status"
79 const std::string url =
"payloadiovs/?gtName=" + escaped +
80 "&majorIOV=" + std::to_string(exp) +
81 "&minorIOV=" + std::to_string(run) +
84 const auto payloads =
get(url);
85 if (!payloads.is_array())
throw std::runtime_error(
"expected array");
86 for (
const auto& payload : payloads) {
87 if (!payload.is_object())
throw std::runtime_error(
"expected payload object");
89 const long long int experimentHighFromServer = payload.at(
"major_iov_end");
90 const long long int runHighFromServer = payload.at(
"minor_iov_end");
93 const long long int experimentHigh = (experimentHighFromServer ==
m_maxIoV) ? -1 : experimentHighFromServer;
94 const long long int runHigh = (runHighFromServer ==
m_maxIoV) ? -1 : runHighFromServer;
98 const IntervalOfValidity iov{payload.at(
"major_iov"), payload.at(
"minor_iov"),
static_cast<int>(experimentHigh),
static_cast<int>(runHigh)};
99 if (iov.contains(exp, run)) {
101 payload.at(
"payload_type_name"),
103 payload.at(
"payload_url"),
105 payload.at(
"checksum"),
106 iov.getExperimentLow(),
108 iov.getExperimentHigh(),
112 B2DEBUG(31,
"Conditions Database: added payload from new central server"
113 <<
LogVar(
"Payload type name", payload.at(
"payload_type_name"))
114 <<
LogVar(
"url", payload.at(
"payload_url"))
115 <<
LogVar(
"checksum", payload.at(
"checksum")));
119 B2DEBUG(31,
"Conditions Database: fetched " << payloads.size() <<
" payloads for globaltag"
121 }
catch (std::exception& e) {
122 B2WARNING(
"Conditions Database: Problem while fetching the list of payloads"
A class that describes the interval of experiments/runs for which an object in the database is valid.
Class to store variables with their name which were sent to the logging service.
T convertString(const std::string &str)
Converts a string to type T (one of float, double, long double, int, long int, unsigned long int).