66 LOG_DEBUG(
"Loading parameter blocks from", src_file.string());
68 apply_lha_prototypes(np);
69 auto src = np->provide_db_as_node();
71 if (block_in_blocks) {
72 for (
auto &bk : src->get_keys()) {
73 auto exp = src->getGroup({bk});
74 for (
auto &group_pair : exp) {
75 auto group = src->getGroup({bk, group_pair.first});
77 auto block = std::make_shared<Block>();
78 block->blockname = bk +
"_" + group_pair.first;
79 for (
auto &vk : group) {
80 const auto& key = vk.first;
81 const auto& val = vk.second;
84 if (!block->has_scale()) {
85 if (std::holds_alternative<double>(val)) {
86 block->set_scale(std::get<double>(val));
87 }
else if (std::holds_alternative<int>(val)) {
88 block->set_scale(
static_cast<double>(std::get<int>(val)));
90 LOG_WARN(
"ParamBlockLoader",
"Non-numeric block scale under ", bk);
96 if (!std::holds_alternative<std::shared_ptr<DBNode>>(val)) {
97 LOG_WARN(
"ParamBlockLoader",
"Unexpected non-node entry under ", bk,
" key ", key,
" — skipping");
101 auto node = std::get<std::shared_ptr<DBNode>>(val);
103 if (!node->contains(
"central_value")) {
104 LOG_ERROR(
"ParamBlockLoader",
"DBNode doesn't have all necessary keys (central_value).");
108 auto value = node->get(
"central_value");
109 if (std::holds_alternative<BlockName>(value)) {
113 scalar_t val_central = node_to_scalar(node);
115 auto stat = node->contains(
"stat_error") ? node->get(
"stat_error") :
DBNode::Value{0.0};
116 auto syst = node->contains(
"syst_error") ? node->get(
"syst_error") :
DBNode::Value{0.0};
118 double stat_d = std::holds_alternative<double>(stat) ? std::get<double>(stat)
119 : std::holds_alternative<int>(stat) ?
static_cast<double>(std::get<int>(stat))
121 double syst_d = std::holds_alternative<double>(syst) ? std::get<double>(syst)
122 : std::holds_alternative<int>(syst) ?
static_cast<double>(std::get<int>(syst))
128 val_central, stat_d, syst_d))
131 if (node->contains(
"scale")) {
132 auto scale = node->get(
"scale");
133 if (std::holds_alternative<double>(scale))
134 block->retrieve(
LhaID(vk.first))->set_scale(std::get<double>(scale));
135 else if (std::holds_alternative<int>(scale))
136 block->retrieve(
LhaID(vk.first))->set_scale(
static_cast<double>(std::get<int>(scale)));
139 if (node->contains(
"bin_low") || node->contains(
"bin_high")) {
140 if (!(node->contains(
"bin_low") && node->contains(
"bin_high")))
141 LOG_ERROR(
"LogicError",
"Missing one end of the binning.");
143 auto bin_low = node->get(
"bin_low");
144 auto bin_high = node->get(
"bin_high");
146 double d_bin_low = value_to_double(bin_low);
147 double d_bin_high = value_to_double(bin_high);
149 block->retrieve(
LhaID(vk.first))->set_bin(std::pair(d_bin_low, d_bin_high));
152 dest->emplace(block->blockname, block);
158 for (
auto &bk : src->get_keys()) {
159 auto block = std::make_shared<Block>();
160 block->blockname = bk;
163 auto group = src->getGroup({bk});
165 for (
auto &vk : group) {
166 const auto& key = vk.first;
167 const auto& val = vk.second;
169 if (key ==
"scale") {
170 if (!block->has_scale()) {
171 if (std::holds_alternative<double>(val)) {
172 block->set_scale(std::get<double>(val));
173 }
else if (std::holds_alternative<int>(val)) {
174 block->set_scale(
static_cast<double>(std::get<int>(val)));
176 LOG_WARN(
"ParamBlockLoader",
"Non-numeric block scale under ", bk);
182 if (!std::holds_alternative<std::shared_ptr<DBNode>>(val)) {
183 LOG_WARN(
"ParamBlockLoader",
"Unexpected non-node entry under ", bk,
" key ", key,
" — skipping");
187 auto node = std::get<std::shared_ptr<DBNode>>(val);
189 if (!node->contains(
"central_value")) {
190 LOG_ERROR(
"ParamBlockLoader",
"DBNode doesn't have all necessary keys (central_value).");
194 auto value = node->get(
"central_value");
195 if (std::holds_alternative<BlockName>(value)) {
199 scalar_t val_central = node_to_scalar(node);
201 auto stat = node->contains(
"stat_error") ? node->get(
"stat_error") :
DBNode::Value{0.0};
202 auto syst = node->contains(
"syst_error") ? node->get(
"syst_error") :
DBNode::Value{0.0};
204 double stat_d = std::holds_alternative<double>(stat) ? std::get<double>(stat)
205 : std::holds_alternative<int>(stat) ?
static_cast<double>(std::get<int>(stat))
207 double syst_d = std::holds_alternative<double>(syst) ? std::get<double>(syst)
208 : std::holds_alternative<int>(syst) ?
static_cast<double>(std::get<int>(syst))
214 val_central, stat_d, syst_d))
217 if (node->contains(
"scale")) {
218 auto scale = node->get(
"scale");
219 if (std::holds_alternative<double>(scale))
220 block->retrieve(
LhaID(vk.first))->set_scale(std::get<double>(scale));
221 else if (std::holds_alternative<int>(scale))
222 block->retrieve(
LhaID(vk.first))->set_scale(
static_cast<double>(std::get<int>(scale)));
225 if (node->contains(
"bin_low") || node->contains(
"bin_high")) {
226 if (!(node->contains(
"bin_low") && node->contains(
"bin_high")))
227 LOG_ERROR(
"LogicError",
"Missing one end of the binning.");
229 auto bin_low = node->get(
"bin_low");
230 auto bin_high = node->get(
"bin_high");
232 double d_bin_low = value_to_double(bin_low);
233 double d_bin_high = value_to_double(bin_high);
235 block->retrieve(
LhaID(vk.first))->set_bin(std::pair(d_bin_low, d_bin_high));
239 dest->emplace(bk, block);
std::variant< BlockName, int, double, bool, std::shared_ptr< DBNode >, std::vector< std::shared_ptr< DBNode > > > Value
Variant type used to store values in the tree.
void add_lha_prototype(BlockName blockName, size_t itemCount=2, size_t valueIdx=1, int scaleIdx=-1, int rgIdx=-1, int binIdx=-1, bool globalScale=false) override
Registers an additional LHA prototype to apply before parsing LHA files.