Hyperiso 1.0.3
Modular flavour-physics calculations, Wilson coefficients and statistical inference
Loading...
Searching...
No Matches
test_contour_minuit.cpp
Go to the documentation of this file.
1#include <algorithm>
2#include <cmath>
3#include <cstdlib>
4#include <exception>
5#include <fstream>
6#include <iomanip>
7#include <iostream>
8#include <limits>
9#include <map>
10#include <memory>
11#include <set>
12#include <sstream>
13#include <string>
14#include <tuple>
15#include <unordered_set>
16#include <utility>
17#include <vector>
18
19#include "Include.h"
20#include "ObservableInterface.h"
21
22namespace {
23
24struct ObsRow {
25 std::size_t index;
27 std::string obs_name;
28 bool is_binned;
29 std::string label;
30 std::string experiment;
31};
32
33double nan_value() {
34 return std::numeric_limits<double>::quiet_NaN();
35}
36
37
38bool same_double(double a, double b) {
39 const double scale = std::max(1.0, std::max(std::abs(a), std::abs(b)));
40 return std::abs(a - b) <= 1e-10 * scale;
41}
42
43std::string csv_escape(const std::string& s) {
44 std::string out = "\"";
45 for (char c : s) {
46 if (c == '\"') out += "\"\"";
47 else out += c;
48 }
49 out += "\"";
50 return out;
51}
52
53void write_num(std::ofstream& out, double x) {
54 if (std::isfinite(x)) out << std::setprecision(17) << x;
55 else out << "nan";
56}
57
58std::string resolve_experiment_from_label(const std::string& label,
59 const std::string& requested) {
60 // Évite les erreurs type: label *_Belle mais lookup dans FOBS_DEFAULT.
61 // On laisse explicitement le label décider quand il contient une source.
62 if (label.find("LHCb2025c2") != std::string::npos) return "LHCb2025c2";
63 if (label.find("Belle") != std::string::npos) return "Belle";
64 if (label.find("CMS") != std::string::npos) return "CMS";
65 return requested;
66}
67
68
69std::string flha_key(const BinnedObservableId& id) {
70 const auto parts = id.flha().get_parts();
71 std::ostringstream ss;
72 for (std::size_t i = 0; i < parts.size(); ++i) {
73 if (i != 0) ss << "_";
74 ss << parts[i];
75 }
76 return ss.str();
77}
78
79long flha_observable_code(const BinnedObservableId& id) {
80 const auto parts = id.flha().get_parts();
81 if (parts.size() < 2) return std::numeric_limits<long>::min();
82 // In the FLHA convention used here, parts[0] is the parent PDG id
83 // and parts[1] is the observable code: 1 = BR/dBR, 10 = Gamma/dGamma.
84 return parts[1];
85}
86
87std::string quantity_from_enum_name(const std::string& obs_name) {
88 if (obs_name.find("DBR_DQ2") != std::string::npos) return "dBR/dq2";
89 if (obs_name.find("DGAMMA_DQ2") != std::string::npos) return "dGamma/dq2";
90 return "";
91}
92
93bool flha_code_matches_enum_quantity(const std::string& obs_name, long flha_code) {
94 const std::string q = quantity_from_enum_name(obs_name);
95 if (q == "dBR/dq2") return flha_code == 1;
96 if (q == "dGamma/dq2") return flha_code == 10;
97 return true;
98}
99
100const std::unordered_set<std::string>& known_exp_keys(const std::string& experiment) {
101 if (experiment == "DEFAULT") {
102 static const std::unordered_set<std::string> keys = {
103 "130_1_0_0_0_0_0_0_2_13_-13",
104 "130_1_0_0_0_0_0_0_3_111_14_-14",
105 "310_1_0_0_0_0_0_0_2_13_-13",
106 "321_1_0_0_0_0_0_0_3_211_14_-14",
107 "421_1_0_0_0_0_0_0_2_11_-11",
108 "421_1_0_0_0_0_0_0_2_13_-13",
109 "511_1_0_0_0_0_0_0_2_11_-11",
110 "511_1_0_0_0_0_0_0_2_13_-13",
111 "511_1_0_0_0_0_0_0_2_313_22",
112 "511_1_0_1_1_2_0_0_3_311_13_-13",
113 "511_1_0_9_4_1_0_0_3_313_11_-11",
114 "511_1_11_0_0_12_5_1_3_311_13_-13",
115 "511_1_15_0_0_17_0_0_3_311_13_-13",
116 "511_1_15_0_0_22_0_0_3_311_13_-13",
117 "511_1_17_0_0_22_0_0_3_311_13_-13",
118 "511_1_1_1_1_6_0_0_3_311_13_-13",
119 "511_1_2_0_0_4_0_0_3_311_13_-13",
120 "511_1_4_0_0_6_0_0_3_311_13_-13",
121 "511_1_6_0_0_8_0_0_3_311_13_-13",
122 "511_5_1_1_1_6_0_0_3_313_11_-11",
123 "511_5_1_1_1_7_0_0_3_313_11_-11",
124 "511_9121_0_1_1_1_1_1_3_313_13_-13",
125 "511_9121_1_1_1_6_0_0_3_311_13_-13",
126 "511_9121_1_1_1_6_0_0_3_313_13_-13",
127 "511_931_0_8_4_0_257_3_3_313_11_-11",
128 "511_931_1_1_1_6_0_0_3_313_11_-11",
129 "511_931_1_1_1_7_0_0_3_313_11_-11",
130 "511_9412_0_8_4_0_257_3_3_313_11_-11",
131 "511_9416_0_8_4_0_257_3_3_313_11_-11",
132 "511_942_0_8_4_0_257_3_3_313_11_-11",
133 "511_9511_1_1_1_6_0_0_3_313_11_-11",
134 "511_9511_1_1_1_7_0_0_3_313_11_-11",
135 "511_9512_1_1_1_6_0_0_3_313_11_-11",
136 "511_9512_1_1_1_7_0_0_3_313_11_-11",
137 "511_9513_1_1_1_6_0_0_3_313_11_-11",
138 "511_9513_1_1_1_7_0_0_3_313_11_-11",
139 "511_9524_1_1_1_6_0_0_3_313_11_-11",
140 "511_9524_1_1_1_7_0_0_3_313_11_-11",
141 "511_9525_1_1_1_6_0_0_3_313_11_-11",
142 "511_9525_1_1_1_7_0_0_3_313_11_-11",
143 "511_9526_1_1_1_6_0_0_3_313_11_-11",
144 "511_9526_1_1_1_7_0_0_3_313_11_-11",
145 "511_9528_1_1_1_6_0_0_3_313_11_-11",
146 "511_9528_1_1_1_7_0_0_3_313_11_-11",
147 "511_9533_1_1_1_6_0_0_3_313_11_-11",
148 "511_9533_1_1_1_7_0_0_3_313_11_-11",
149 "511_9534_1_1_1_6_0_0_3_313_11_-11",
150 "511_9534_1_1_1_7_0_0_3_313_11_-11",
151 "511_9535_1_1_1_6_0_0_3_313_11_-11",
152 "511_9535_1_1_1_7_0_0_3_313_11_-11",
153 "511_9537_1_1_1_6_0_0_3_313_11_-11",
154 "511_9537_1_1_1_7_0_0_3_313_11_-11",
155 "511_9538_1_1_1_6_0_0_3_313_11_-11",
156 "511_9538_1_1_1_7_0_0_3_313_11_-11",
157 "511_9539_1_1_1_6_0_0_3_313_11_-11",
158 "511_9539_1_1_1_7_0_0_3_313_11_-11",
159 "5122_1_15_0_0_20_0_0_3_3122_13_-13",
160 "5122_51_15_0_0_20_0_0_3_3122_13_-13",
161 "5122_52_15_0_0_20_0_0_3_3122_13_-13",
162 "5122_53_15_0_0_20_0_0_3_3122_13_-13",
163 "5122_931_15_0_0_20_0_0_3_3122_13_-13",
164 "521_1_0_0_0_0_0_0_2_323_22",
165 "521_1_0_1_1_0_98_2_3_321_13_-13",
166 "521_1_0_1_1_2_0_0_3_323_13_-13",
167 "521_1_11_0_0_11_8_1_3_321_13_-13",
168 "521_1_11_0_0_12_5_1_3_323_13_-13",
169 "521_1_11_8_1_12_5_1_3_321_13_-13",
170 "521_1_15_0_0_16_0_0_3_321_13_-13",
171 "521_1_15_0_0_17_0_0_3_323_13_-13",
172 "521_1_15_0_0_19_0_0_3_323_13_-13",
173 "521_1_15_0_0_22_0_0_3_321_13_-13",
174 "521_1_16_0_0_17_0_0_3_321_13_-13",
175 "521_1_17_0_0_18_0_0_3_321_13_-13",
176 "521_1_17_0_0_19_0_0_3_323_13_-13",
177 "521_1_18_0_0_19_0_0_3_321_13_-13",
178 "521_1_19_0_0_20_0_0_3_321_13_-13",
179 "521_1_1_0_0_6_0_0_3_321_11_-11",
180 "521_1_1_1_1_2_0_0_3_321_13_-13",
181 "521_1_1_1_1_6_0_0_3_321_13_-13",
182 "521_1_1_1_1_6_0_0_3_323_13_-13",
183 "521_1_20_0_0_21_0_0_3_321_13_-13",
184 "521_1_21_0_0_22_0_0_3_321_13_-13",
185 "521_1_2_0_0_3_0_0_3_321_13_-13",
186 "521_1_2_0_0_4_0_0_3_323_13_-13",
187 "521_1_3_0_0_4_0_0_3_321_13_-13",
188 "521_1_4_0_0_5_0_0_3_321_13_-13",
189 "521_1_4_0_0_6_0_0_3_323_13_-13",
190 "521_1_5_0_0_6_0_0_3_321_13_-13",
191 "521_1_6_0_0_7_0_0_3_321_13_-13",
192 "521_1_6_0_0_8_0_0_3_323_13_-13",
193 "521_1_7_0_0_8_0_0_3_321_13_-13",
194 "521_3_0_1_1_0_98_2_3_321_13_-13",
195 "521_3_11_0_0_11_8_1_3_321_13_-13",
196 "521_3_11_8_1_12_5_1_3_321_13_-13",
197 "521_3_15_0_0_16_0_0_3_321_13_-13",
198 "521_3_16_0_0_17_0_0_3_321_13_-13",
199 "521_3_17_0_0_18_0_0_3_321_13_-13",
200 "521_3_18_0_0_19_0_0_3_321_13_-13",
201 "521_3_19_0_0_20_0_0_3_321_13_-13",
202 "521_3_1_1_1_2_0_0_3_321_13_-13",
203 "521_3_20_0_0_21_0_0_3_321_13_-13",
204 "521_3_21_0_0_22_0_0_3_321_13_-13",
205 "521_3_2_0_0_3_0_0_3_321_13_-13",
206 "521_3_3_0_0_4_0_0_3_321_13_-13",
207 "521_3_4_0_0_5_0_0_3_321_13_-13",
208 "521_3_5_0_0_6_0_0_3_321_13_-13",
209 "521_3_6_0_0_7_0_0_3_321_13_-13",
210 "521_3_7_0_0_8_0_0_3_321_13_-13",
211 "521_4_0_0_0_0_0_0_2_323_22",
212 "521_5_0_1_1_0_98_2_3_323_13_-13",
213 "521_5_11_0_0_12_5_1_3_323_13_-13",
214 "521_5_15_0_0_17_0_0_3_323_13_-13",
215 "521_5_15_0_0_19_0_0_3_323_13_-13",
216 "521_5_17_0_0_19_0_0_3_323_13_-13",
217 "521_5_1_1_1_2_5_1_3_323_13_-13",
218 "521_5_1_1_1_6_0_0_3_323_13_-13",
219 "521_5_2_5_1_4_0_0_3_323_13_-13",
220 "521_5_4_0_0_6_0_0_3_323_13_-13",
221 "521_5_6_0_0_8_0_0_3_323_13_-13",
222 "521_9121_0_1_1_1_1_1_3_321_13_-13",
223 "521_9121_0_45_3_6_0_0_3_323_13_-13",
224 "521_9121_1_1_1_6_0_0_3_321_13_-13",
225 "521_931_0_1_1_0_98_2_3_323_13_-13",
226 "521_931_11_0_0_12_5_1_3_323_13_-13",
227 "521_931_15_0_0_17_0_0_3_323_13_-13",
228 "521_931_15_0_0_19_0_0_3_323_13_-13",
229 "521_931_17_0_0_19_0_0_3_323_13_-13",
230 "521_931_1_1_1_2_5_1_3_323_13_-13",
231 "521_931_1_1_1_6_0_0_3_323_13_-13",
232 "521_931_2_5_1_4_0_0_3_323_13_-13",
233 "521_931_4_0_0_6_0_0_3_323_13_-13",
234 "521_931_6_0_0_8_0_0_3_323_13_-13",
235 "521_934_15_0_0_22_0_0_3_321_13_-13",
236 "521_934_1_1_1_6_0_0_3_321_13_-13",
237 "521_9511_0_1_1_0_98_2_3_323_13_-13",
238 "521_9511_11_0_0_12_5_1_3_323_13_-13",
239 "521_9511_15_0_0_17_0_0_3_323_13_-13",
240 "521_9511_15_0_0_19_0_0_3_323_13_-13",
241 "521_9511_17_0_0_19_0_0_3_323_13_-13",
242 "521_9511_1_1_1_2_5_1_3_323_13_-13",
243 "521_9511_1_1_1_6_0_0_3_323_13_-13",
244 "521_9511_2_5_1_4_0_0_3_323_13_-13",
245 "521_9511_4_0_0_6_0_0_3_323_13_-13",
246 "521_9511_6_0_0_8_0_0_3_323_13_-13",
247 "521_9512_0_1_1_0_98_2_3_323_13_-13",
248 "521_9512_11_0_0_12_5_1_3_323_13_-13",
249 "521_9512_15_0_0_17_0_0_3_323_13_-13",
250 "521_9512_15_0_0_19_0_0_3_323_13_-13",
251 "521_9512_17_0_0_19_0_0_3_323_13_-13",
252 "521_9512_1_1_1_2_5_1_3_323_13_-13",
253 "521_9512_1_1_1_6_0_0_3_323_13_-13",
254 "521_9512_2_5_1_4_0_0_3_323_13_-13",
255 "521_9512_4_0_0_6_0_0_3_323_13_-13",
256 "521_9512_6_0_0_8_0_0_3_323_13_-13",
257 "521_9513_0_1_1_0_98_2_3_323_13_-13",
258 "521_9513_11_0_0_12_5_1_3_323_13_-13",
259 "521_9513_15_0_0_17_0_0_3_323_13_-13",
260 "521_9513_15_0_0_19_0_0_3_323_13_-13",
261 "521_9513_17_0_0_19_0_0_3_323_13_-13",
262 "521_9513_1_1_1_2_5_1_3_323_13_-13",
263 "521_9513_1_1_1_6_0_0_3_323_13_-13",
264 "521_9513_2_5_1_4_0_0_3_323_13_-13",
265 "521_9513_4_0_0_6_0_0_3_323_13_-13",
266 "521_9513_6_0_0_8_0_0_3_323_13_-13",
267 "521_9524_0_1_1_0_98_2_3_323_13_-13",
268 "521_9524_11_0_0_12_5_1_3_323_13_-13",
269 "521_9524_15_0_0_17_0_0_3_323_13_-13",
270 "521_9524_15_0_0_19_0_0_3_323_13_-13",
271 "521_9524_17_0_0_19_0_0_3_323_13_-13",
272 "521_9524_1_1_1_2_5_1_3_323_13_-13",
273 "521_9524_1_1_1_6_0_0_3_323_13_-13",
274 "521_9524_2_5_1_4_0_0_3_323_13_-13",
275 "521_9524_4_0_0_6_0_0_3_323_13_-13",
276 "521_9524_6_0_0_8_0_0_3_323_13_-13",
277 "521_9525_0_1_1_0_98_2_3_323_13_-13",
278 "521_9525_11_0_0_12_5_1_3_323_13_-13",
279 "521_9525_15_0_0_17_0_0_3_323_13_-13",
280 "521_9525_15_0_0_19_0_0_3_323_13_-13",
281 "521_9525_17_0_0_19_0_0_3_323_13_-13",
282 "521_9525_1_1_1_2_5_1_3_323_13_-13",
283 "521_9525_1_1_1_6_0_0_3_323_13_-13",
284 "521_9525_2_5_1_4_0_0_3_323_13_-13",
285 "521_9525_4_0_0_6_0_0_3_323_13_-13",
286 "521_9525_6_0_0_8_0_0_3_323_13_-13",
287 "521_9526_0_1_1_0_98_2_3_323_13_-13",
288 "521_9526_11_0_0_12_5_1_3_323_13_-13",
289 "521_9526_15_0_0_17_0_0_3_323_13_-13",
290 "521_9526_15_0_0_19_0_0_3_323_13_-13",
291 "521_9526_17_0_0_19_0_0_3_323_13_-13",
292 "521_9526_1_1_1_2_5_1_3_323_13_-13",
293 "521_9526_1_1_1_6_0_0_3_323_13_-13",
294 "521_9526_2_5_1_4_0_0_3_323_13_-13",
295 "521_9526_4_0_0_6_0_0_3_323_13_-13",
296 "521_9526_6_0_0_8_0_0_3_323_13_-13",
297 "521_9528_0_1_1_0_98_2_3_323_13_-13",
298 "521_9528_11_0_0_12_5_1_3_323_13_-13",
299 "521_9528_15_0_0_17_0_0_3_323_13_-13",
300 "521_9528_15_0_0_19_0_0_3_323_13_-13",
301 "521_9528_17_0_0_19_0_0_3_323_13_-13",
302 "521_9528_1_1_1_2_5_1_3_323_13_-13",
303 "521_9528_1_1_1_6_0_0_3_323_13_-13",
304 "521_9528_2_5_1_4_0_0_3_323_13_-13",
305 "521_9528_4_0_0_6_0_0_3_323_13_-13",
306 "521_9528_6_0_0_8_0_0_3_323_13_-13",
307 "521_9533_0_1_1_0_98_2_3_323_13_-13",
308 "521_9533_11_0_0_12_5_1_3_323_13_-13",
309 "521_9533_15_0_0_17_0_0_3_323_13_-13",
310 "521_9533_15_0_0_19_0_0_3_323_13_-13",
311 "521_9533_17_0_0_19_0_0_3_323_13_-13",
312 "521_9533_1_1_1_2_5_1_3_323_13_-13",
313 "521_9533_1_1_1_6_0_0_3_323_13_-13",
314 "521_9533_2_5_1_4_0_0_3_323_13_-13",
315 "521_9533_4_0_0_6_0_0_3_323_13_-13",
316 "521_9533_6_0_0_8_0_0_3_323_13_-13",
317 "521_9534_0_1_1_0_98_2_3_323_13_-13",
318 "521_9534_11_0_0_12_5_1_3_323_13_-13",
319 "521_9534_15_0_0_17_0_0_3_323_13_-13",
320 "521_9534_15_0_0_19_0_0_3_323_13_-13",
321 "521_9534_17_0_0_19_0_0_3_323_13_-13",
322 "521_9534_1_1_1_2_5_1_3_323_13_-13",
323 "521_9534_1_1_1_6_0_0_3_323_13_-13",
324 "521_9534_2_5_1_4_0_0_3_323_13_-13",
325 "521_9534_4_0_0_6_0_0_3_323_13_-13",
326 "521_9534_6_0_0_8_0_0_3_323_13_-13",
327 "521_9535_0_1_1_0_98_2_3_323_13_-13",
328 "521_9535_11_0_0_12_5_1_3_323_13_-13",
329 "521_9535_15_0_0_17_0_0_3_323_13_-13",
330 "521_9535_15_0_0_19_0_0_3_323_13_-13",
331 "521_9535_17_0_0_19_0_0_3_323_13_-13",
332 "521_9535_1_1_1_2_5_1_3_323_13_-13",
333 "521_9535_1_1_1_6_0_0_3_323_13_-13",
334 "521_9535_2_5_1_4_0_0_3_323_13_-13",
335 "521_9535_4_0_0_6_0_0_3_323_13_-13",
336 "521_9535_6_0_0_8_0_0_3_323_13_-13",
337 "521_9537_0_1_1_0_98_2_3_323_13_-13",
338 "521_9537_11_0_0_12_5_1_3_323_13_-13",
339 "521_9537_15_0_0_17_0_0_3_323_13_-13",
340 "521_9537_15_0_0_19_0_0_3_323_13_-13",
341 "521_9537_17_0_0_19_0_0_3_323_13_-13",
342 "521_9537_1_1_1_2_5_1_3_323_13_-13",
343 "521_9537_1_1_1_6_0_0_3_323_13_-13",
344 "521_9537_2_5_1_4_0_0_3_323_13_-13",
345 "521_9537_4_0_0_6_0_0_3_323_13_-13",
346 "521_9537_6_0_0_8_0_0_3_323_13_-13",
347 "521_9538_0_1_1_0_98_2_3_323_13_-13",
348 "521_9538_11_0_0_12_5_1_3_323_13_-13",
349 "521_9538_15_0_0_17_0_0_3_323_13_-13",
350 "521_9538_15_0_0_19_0_0_3_323_13_-13",
351 "521_9538_17_0_0_19_0_0_3_323_13_-13",
352 "521_9538_1_1_1_2_5_1_3_323_13_-13",
353 "521_9538_1_1_1_6_0_0_3_323_13_-13",
354 "521_9538_2_5_1_4_0_0_3_323_13_-13",
355 "521_9538_4_0_0_6_0_0_3_323_13_-13",
356 "521_9538_6_0_0_8_0_0_3_323_13_-13",
357 "521_9539_0_1_1_0_98_2_3_323_13_-13",
358 "521_9539_11_0_0_12_5_1_3_323_13_-13",
359 "521_9539_15_0_0_17_0_0_3_323_13_-13",
360 "521_9539_15_0_0_19_0_0_3_323_13_-13",
361 "521_9539_17_0_0_19_0_0_3_323_13_-13",
362 "521_9539_1_1_1_2_5_1_3_323_13_-13",
363 "521_9539_1_1_1_6_0_0_3_323_13_-13",
364 "521_9539_2_5_1_4_0_0_3_323_13_-13",
365 "521_9539_4_0_0_6_0_0_3_323_13_-13",
366 "521_9539_6_0_0_8_0_0_3_323_13_-13",
367 "531_-5_0_1_1_0_98_2_3_333_13_-13",
368 "531_-5_11_0_0_12_5_1_3_333_13_-13",
369 "531_-5_15_0_0_18_9_1_3_333_13_-13",
370 "531_-5_1_1_1_4_0_0_3_333_13_-13",
371 "531_-5_1_1_1_6_0_0_3_333_13_-13",
372 "531_-5_4_0_0_6_0_0_3_333_13_-13",
373 "531_-5_6_0_0_8_0_0_3_333_13_-13",
374 "531_-9416_0_9_4_0_2615_4_3_333_11_-11",
375 "531_-9417_0_9_4_0_2615_4_3_333_11_-11",
376 "531_-9535_0_1_1_0_98_2_3_333_13_-13",
377 "531_-9535_11_0_0_12_5_1_3_333_13_-13",
378 "531_-9535_15_0_0_18_9_1_3_333_13_-13",
379 "531_-9535_1_1_1_4_0_0_3_333_13_-13",
380 "531_-9535_1_1_1_6_0_0_3_333_13_-13",
381 "531_-9535_4_0_0_6_0_0_3_333_13_-13",
382 "531_-9535_6_0_0_8_0_0_3_333_13_-13",
383 "531_-9538_0_1_1_0_98_2_3_333_13_-13",
384 "531_-9538_11_0_0_12_5_1_3_333_13_-13",
385 "531_-9538_15_0_0_18_9_1_3_333_13_-13",
386 "531_-9538_1_1_1_4_0_0_3_333_13_-13",
387 "531_-9538_1_1_1_6_0_0_3_333_13_-13",
388 "531_-9538_4_0_0_6_0_0_3_333_13_-13",
389 "531_-9538_6_0_0_8_0_0_3_333_13_-13",
390 "531_-9539_0_1_1_0_98_2_3_333_13_-13",
391 "531_-9539_11_0_0_12_5_1_3_333_13_-13",
392 "531_-9539_15_0_0_18_9_1_3_333_13_-13",
393 "531_-9539_1_1_1_4_0_0_3_333_13_-13",
394 "531_-9539_1_1_1_6_0_0_3_333_13_-13",
395 "531_-9539_4_0_0_6_0_0_3_333_13_-13",
396 "531_-9539_6_0_0_8_0_0_3_333_13_-13",
397 "531_15_0_0_0_0_0_0_2_11_-11",
398 "531_15_0_0_0_0_0_0_2_13_-13",
399 "531_1_0_1_1_0_98_2_3_333_13_-13",
400 "531_1_0_1_1_1_1_1_3_333_11_-11",
401 "531_1_11_0_0_12_5_1_3_333_13_-13",
402 "531_1_15_0_0_17_0_0_3_333_13_-13",
403 "531_1_15_0_0_19_0_0_3_333_11_-11",
404 "531_1_15_0_0_19_0_0_3_333_13_-13",
405 "531_1_17_0_0_19_0_0_3_333_13_-13",
406 "531_1_1_1_1_2_5_1_3_333_13_-13",
407 "531_1_1_1_1_6_0_0_3_333_11_-11",
408 "531_1_1_1_1_6_0_0_3_333_13_-13",
409 "531_1_2_5_1_4_0_0_3_333_13_-13",
410 "531_1_4_0_0_6_0_0_3_333_13_-13",
411 "531_1_6_0_0_8_0_0_3_333_13_-13",
412 "531_9121_0_1_1_1_1_1_3_333_13_-13",
413 "531_9121_15_0_0_19_0_0_3_333_13_-13",
414 "531_9121_1_1_1_6_0_0_3_333_13_-13",
415 "531_931_0_1_1_0_98_2_3_333_13_-13",
416 "531_931_0_9_4_0_2615_4_3_333_11_-11",
417 "531_931_11_0_0_12_5_1_3_333_13_-13",
418 "531_931_15_0_0_18_9_1_3_333_13_-13",
419 "531_931_1_1_1_4_0_0_3_333_13_-13",
420 "531_931_1_1_1_6_0_0_3_333_13_-13",
421 "531_931_4_0_0_6_0_0_3_333_13_-13",
422 "531_931_6_0_0_8_0_0_3_333_13_-13",
423 "531_9412_0_9_4_0_2615_4_3_333_11_-11",
424 "531_9533_0_1_1_0_98_2_3_333_13_-13",
425 "531_9533_11_0_0_12_5_1_3_333_13_-13",
426 "531_9533_15_0_0_18_9_1_3_333_13_-13",
427 "531_9533_1_1_1_4_0_0_3_333_13_-13",
428 "531_9533_1_1_1_6_0_0_3_333_13_-13",
429 "531_9533_4_0_0_6_0_0_3_333_13_-13",
430 "531_9533_6_0_0_8_0_0_3_333_13_-13",
431 "531_9534_0_1_1_0_98_2_3_333_13_-13",
432 "531_9534_11_0_0_12_5_1_3_333_13_-13",
433 "531_9534_15_0_0_18_9_1_3_333_13_-13",
434 "531_9534_1_1_1_4_0_0_3_333_13_-13",
435 "531_9534_1_1_1_6_0_0_3_333_13_-13",
436 "531_9534_4_0_0_6_0_0_3_333_13_-13",
437 "531_9534_6_0_0_8_0_0_3_333_13_-13",
438 "531_9537_0_1_1_0_98_2_3_333_13_-13",
439 "531_9537_11_0_0_12_5_1_3_333_13_-13",
440 "531_9537_15_0_0_18_9_1_3_333_13_-13",
441 "531_9537_1_1_1_4_0_0_3_333_13_-13",
442 "531_9537_1_1_1_6_0_0_3_333_13_-13",
443 "531_9537_4_0_0_6_0_0_3_333_13_-13",
444 "531_9537_6_0_0_8_0_0_3_333_13_-13",
445 "5_1_0_0_0_0_0_0_2_3_22",
446 "5_1_14_2_1_22_0_0_3_3_11_-11",
447 "5_1_14_2_1_22_0_0_3_3_13_-13",
448 "5_1_1_0_0_6_0_0_3_3_11_-11",
449 "5_1_1_0_0_6_0_0_3_3_13_-13"
450 };
451 return keys;
452 }
453 if (experiment == "Belle") {
454 static const std::unordered_set<std::string> keys = {
455 "511_9121_0_1_1_8_0_0_3_313_13_-13",
456 "511_9121_0_45_3_1_1_1_3_313_13_-13",
457 "511_9121_15_0_0_19_0_0_3_313_13_-13",
458 "511_9121_1_1_1_6_0_0_3_313_13_-13",
459 "511_9412_0_8_4_1_12_2_3_313_11_-11",
460 "511_942_0_8_4_1_12_2_3_313_11_-11",
461 "521_9121_0_1_1_4_0_0_3_321_13_-13",
462 "521_9121_10_2_1_12_8_1_3_321_13_-13",
463 "521_9121_14_18_2_22_0_0_3_321_13_-13",
464 "521_9121_1_0_0_6_0_0_3_321_13_-13",
465 "521_9121_4_0_0_8_12_2_3_321_13_-13"
466 };
467 return keys;
468 }
469 if (experiment == "CMS") {
470 static const std::unordered_set<std::string> keys = {
471 "511_931_10_9_2_12_86_2_3_313_13_-13",
472 "511_931_14_18_2_16_0_0_3_313_13_-13",
473 "511_931_1_1_1_2_0_0_3_313_13_-13",
474 "511_931_2_0_0_4_3_1_3_313_13_-13",
475 "511_931_4_3_1_6_0_0_3_313_13_-13",
476 "511_931_6_0_0_8_68_2_3_313_13_-13",
477 "511_9511_10_9_2_12_86_2_3_313_13_-13",
478 "511_9511_14_18_2_16_0_0_3_313_13_-13",
479 "511_9511_1_1_1_2_0_0_3_313_13_-13",
480 "511_9511_2_0_0_4_3_1_3_313_13_-13",
481 "511_9511_4_3_1_6_0_0_3_313_13_-13",
482 "511_9511_6_0_0_8_68_2_3_313_13_-13",
483 "511_9512_10_9_2_12_86_2_3_313_13_-13",
484 "511_9512_14_18_2_16_0_0_3_313_13_-13",
485 "511_9512_1_1_1_2_0_0_3_313_13_-13",
486 "511_9512_2_0_0_4_3_1_3_313_13_-13",
487 "511_9512_4_3_1_6_0_0_3_313_13_-13",
488 "511_9512_6_0_0_8_68_2_3_313_13_-13",
489 "511_9513_10_9_2_12_86_2_3_313_13_-13",
490 "511_9513_14_18_2_16_0_0_3_313_13_-13",
491 "511_9513_1_1_1_2_0_0_3_313_13_-13",
492 "511_9513_2_0_0_4_3_1_3_313_13_-13",
493 "511_9513_4_3_1_6_0_0_3_313_13_-13",
494 "511_9513_6_0_0_8_68_2_3_313_13_-13",
495 "511_9524_10_9_2_12_86_2_3_313_13_-13",
496 "511_9524_14_18_2_16_0_0_3_313_13_-13",
497 "511_9524_1_1_1_2_0_0_3_313_13_-13",
498 "511_9524_2_0_0_4_3_1_3_313_13_-13",
499 "511_9524_4_3_1_6_0_0_3_313_13_-13",
500 "511_9524_6_0_0_8_68_2_3_313_13_-13",
501 "511_9525_10_9_2_12_86_2_3_313_13_-13",
502 "511_9525_14_18_2_16_0_0_3_313_13_-13",
503 "511_9525_1_1_1_2_0_0_3_313_13_-13",
504 "511_9525_2_0_0_4_3_1_3_313_13_-13",
505 "511_9525_4_3_1_6_0_0_3_313_13_-13",
506 "511_9525_6_0_0_8_68_2_3_313_13_-13",
507 "511_9526_10_9_2_12_86_2_3_313_13_-13",
508 "511_9526_14_18_2_16_0_0_3_313_13_-13",
509 "511_9526_1_1_1_2_0_0_3_313_13_-13",
510 "511_9526_2_0_0_4_3_1_3_313_13_-13",
511 "511_9526_4_3_1_6_0_0_3_313_13_-13",
512 "511_9526_6_0_0_8_68_2_3_313_13_-13",
513 "511_9528_10_9_2_12_86_2_3_313_13_-13",
514 "511_9528_14_18_2_16_0_0_3_313_13_-13",
515 "511_9528_1_1_1_2_0_0_3_313_13_-13",
516 "511_9528_2_0_0_4_3_1_3_313_13_-13",
517 "511_9528_4_3_1_6_0_0_3_313_13_-13",
518 "511_9528_6_0_0_8_68_2_3_313_13_-13",
519 "521_1_0_1_1_0_98_2_3_321_13_-13",
520 "521_1_11_0_0_11_8_1_3_321_13_-13",
521 "521_1_11_8_1_12_5_1_3_321_13_-13",
522 "521_1_14_82_2_16_0_0_3_321_13_-13",
523 "521_1_16_0_0_17_0_0_3_321_13_-13",
524 "521_1_17_0_0_18_0_0_3_321_13_-13",
525 "521_1_18_0_0_19_24_2_3_321_13_-13",
526 "521_1_19_24_2_22_9_1_3_321_13_-13",
527 "521_1_1_1_1_2_0_0_3_321_13_-13",
528 "521_1_1_1_1_6_0_0_3_321_13_-13",
529 "521_1_2_0_0_3_0_0_3_321_13_-13",
530 "521_1_3_0_0_4_0_0_3_321_13_-13",
531 "521_1_4_0_0_5_0_0_3_321_13_-13",
532 "521_1_5_0_0_6_0_0_3_321_13_-13",
533 "521_1_6_0_0_7_0_0_3_321_13_-13",
534 "521_1_7_0_0_8_0_0_3_321_13_-13",
535 "521_9121_1_1_1_6_0_0_3_321_13_-13",
536 "521_934_1_0_0_6_0_0_3_321_13_-13"
537 };
538 return keys;
539 }
540 if (experiment == "LHCb2025c2") {
541 static const std::unordered_set<std::string> keys = {
542 "511_1_0_6_2_0_98_2_3_313_13_-13",
543 "511_1_11_0_0_12_5_1_3_313_13_-13",
544 "511_1_15_0_0_17_0_0_3_313_13_-13",
545 "511_1_15_0_0_19_0_0_3_313_13_-13",
546 "511_1_17_0_0_19_0_0_3_313_13_-13",
547 "511_1_1_1_1_2_5_1_3_313_13_-13",
548 "511_1_1_1_1_6_0_0_3_313_13_-13",
549 "511_1_2_5_1_4_0_0_3_313_13_-13",
550 "511_1_4_0_0_6_0_0_3_313_13_-13",
551 "511_1_6_0_0_8_0_0_3_313_13_-13",
552 "511_931_0_6_2_0_98_2_3_313_13_-13",
553 "511_931_11_0_0_12_5_1_3_313_13_-13",
554 "511_931_15_0_0_17_0_0_3_313_13_-13",
555 "511_931_15_0_0_19_0_0_3_313_13_-13",
556 "511_931_17_0_0_19_0_0_3_313_13_-13",
557 "511_931_1_1_1_2_5_1_3_313_13_-13",
558 "511_931_1_1_1_6_0_0_3_313_13_-13",
559 "511_931_2_5_1_4_0_0_3_313_13_-13",
560 "511_931_4_0_0_6_0_0_3_313_13_-13",
561 "511_931_6_0_0_8_0_0_3_313_13_-13",
562 "511_9511_0_6_2_0_98_2_3_313_13_-13",
563 "511_9511_11_0_0_12_5_1_3_313_13_-13",
564 "511_9511_15_0_0_17_0_0_3_313_13_-13",
565 "511_9511_15_0_0_19_0_0_3_313_13_-13",
566 "511_9511_17_0_0_19_0_0_3_313_13_-13",
567 "511_9511_1_1_1_2_5_1_3_313_13_-13",
568 "511_9511_1_1_1_6_0_0_3_313_13_-13",
569 "511_9511_2_5_1_4_0_0_3_313_13_-13",
570 "511_9511_4_0_0_6_0_0_3_313_13_-13",
571 "511_9511_6_0_0_8_0_0_3_313_13_-13",
572 "511_9512_0_6_2_0_98_2_3_313_13_-13",
573 "511_9512_11_0_0_12_5_1_3_313_13_-13",
574 "511_9512_15_0_0_17_0_0_3_313_13_-13",
575 "511_9512_15_0_0_19_0_0_3_313_13_-13",
576 "511_9512_17_0_0_19_0_0_3_313_13_-13",
577 "511_9512_1_1_1_2_5_1_3_313_13_-13",
578 "511_9512_1_1_1_6_0_0_3_313_13_-13",
579 "511_9512_2_5_1_4_0_0_3_313_13_-13",
580 "511_9512_4_0_0_6_0_0_3_313_13_-13",
581 "511_9512_6_0_0_8_0_0_3_313_13_-13",
582 "511_9513_0_6_2_0_98_2_3_313_13_-13",
583 "511_9513_11_0_0_12_5_1_3_313_13_-13",
584 "511_9513_15_0_0_17_0_0_3_313_13_-13",
585 "511_9513_15_0_0_19_0_0_3_313_13_-13",
586 "511_9513_17_0_0_19_0_0_3_313_13_-13",
587 "511_9513_1_1_1_2_5_1_3_313_13_-13",
588 "511_9513_1_1_1_6_0_0_3_313_13_-13",
589 "511_9513_2_5_1_4_0_0_3_313_13_-13",
590 "511_9513_4_0_0_6_0_0_3_313_13_-13",
591 "511_9513_6_0_0_8_0_0_3_313_13_-13",
592 "511_9524_0_6_2_0_98_2_3_313_13_-13",
593 "511_9524_11_0_0_12_5_1_3_313_13_-13",
594 "511_9524_15_0_0_17_0_0_3_313_13_-13",
595 "511_9524_15_0_0_19_0_0_3_313_13_-13",
596 "511_9524_17_0_0_19_0_0_3_313_13_-13",
597 "511_9524_1_1_1_2_5_1_3_313_13_-13",
598 "511_9524_1_1_1_6_0_0_3_313_13_-13",
599 "511_9524_2_5_1_4_0_0_3_313_13_-13",
600 "511_9524_4_0_0_6_0_0_3_313_13_-13",
601 "511_9524_6_0_0_8_0_0_3_313_13_-13",
602 "511_9525_0_6_2_0_98_2_3_313_13_-13",
603 "511_9525_11_0_0_12_5_1_3_313_13_-13",
604 "511_9525_15_0_0_17_0_0_3_313_13_-13",
605 "511_9525_15_0_0_19_0_0_3_313_13_-13",
606 "511_9525_17_0_0_19_0_0_3_313_13_-13",
607 "511_9525_1_1_1_2_5_1_3_313_13_-13",
608 "511_9525_1_1_1_6_0_0_3_313_13_-13",
609 "511_9525_2_5_1_4_0_0_3_313_13_-13",
610 "511_9525_4_0_0_6_0_0_3_313_13_-13",
611 "511_9525_6_0_0_8_0_0_3_313_13_-13",
612 "511_9526_0_6_2_0_98_2_3_313_13_-13",
613 "511_9526_11_0_0_12_5_1_3_313_13_-13",
614 "511_9526_15_0_0_17_0_0_3_313_13_-13",
615 "511_9526_15_0_0_19_0_0_3_313_13_-13",
616 "511_9526_17_0_0_19_0_0_3_313_13_-13",
617 "511_9526_1_1_1_2_5_1_3_313_13_-13",
618 "511_9526_1_1_1_6_0_0_3_313_13_-13",
619 "511_9526_2_5_1_4_0_0_3_313_13_-13",
620 "511_9526_4_0_0_6_0_0_3_313_13_-13",
621 "511_9526_6_0_0_8_0_0_3_313_13_-13",
622 "511_9528_0_6_2_0_98_2_3_313_13_-13",
623 "511_9528_11_0_0_12_5_1_3_313_13_-13",
624 "511_9528_15_0_0_17_0_0_3_313_13_-13",
625 "511_9528_15_0_0_19_0_0_3_313_13_-13",
626 "511_9528_17_0_0_19_0_0_3_313_13_-13",
627 "511_9528_1_1_1_2_5_1_3_313_13_-13",
628 "511_9528_1_1_1_6_0_0_3_313_13_-13",
629 "511_9528_2_5_1_4_0_0_3_313_13_-13",
630 "511_9528_4_0_0_6_0_0_3_313_13_-13",
631 "511_9528_6_0_0_8_0_0_3_313_13_-13",
632 "511_95312_0_6_2_0_98_2_3_313_13_-13",
633 "511_95312_11_0_0_12_5_1_3_313_13_-13",
634 "511_95312_15_0_0_17_0_0_3_313_13_-13",
635 "511_95312_15_0_0_19_0_0_3_313_13_-13",
636 "511_95312_17_0_0_19_0_0_3_313_13_-13",
637 "511_95312_1_1_1_2_5_1_3_313_13_-13",
638 "511_95312_1_1_1_6_0_0_3_313_13_-13",
639 "511_95312_2_5_1_4_0_0_3_313_13_-13",
640 "511_95312_4_0_0_6_0_0_3_313_13_-13",
641 "511_95312_6_0_0_8_0_0_3_313_13_-13",
642 "511_95321_0_6_2_0_98_2_3_313_13_-13",
643 "511_95362_0_6_2_0_98_2_3_313_13_-13"
644 };
645 return keys;
646 }
647 static const std::unordered_set<std::string> empty;
648 return empty;
649}
650
651bool has_exp_key(const std::string& experiment, const std::string& key) {
652 const auto& keys = known_exp_keys(experiment);
653 return keys.find(key) != keys.end();
654}
655
656void push_unique_exp(std::vector<std::string>& out, const std::string& exp) {
657 if (exp.empty()) return;
658 for (const auto& x : out) {
659 if (x == exp) return;
660 }
661 out.push_back(exp);
662}
663
664std::string choose_available_experiment(const ObsRow& row, const std::string& key) {
665 // Priorité : expérience demandée / label, puis les blocs FOBS usuels.
666 // Surtout, on ne tente pas get_exp_value sur une clé absente du bloc.
667 std::vector<std::string> order;
668 push_unique_exp(order, row.experiment);
669 push_unique_exp(order, resolve_experiment_from_label(row.label, ""));
670 push_unique_exp(order, "DEFAULT");
671 push_unique_exp(order, "Belle");
672 push_unique_exp(order, "CMS");
673 push_unique_exp(order, "LHCb2025c2");
674
675 for (const auto& exp : order) {
676 if (has_exp_key(exp, key)) return exp;
677 }
678 return "";
679}
680
681bool find_theory_value(const std::vector<ObservableValue>& values,
682 const ObsRow& row,
683 double& theory) {
684 if (values.empty()) return false;
685
686 if (!row.is_binned) {
687 theory = values.front().value;
688 return true;
689 }
690
691 for (const auto& v : values) {
692 if (!v.bin.has_value()) {
693 continue;
694 }
695 if (same_double(v.bin->first, row.id.p.first) &&
696 same_double(v.bin->second, row.id.p.second)) {
697 theory = v.value;
698 return true;
699 }
700 }
701
702 return false;
703}
704
705double get_exp_value_for_row(std::shared_ptr<ObservableInterface> oint,
706 const ObsRow& row,
707 const std::string& experiment) {
708 if (experiment == "DEFAULT") {
709 return oint->get_exp_value(row.id);
710 }
711 return oint->get_exp_value(ExperimentObs{experiment, row.id});
712}
713
714double get_exp_stat_for_row(std::shared_ptr<ObservableInterface> oint,
715 const ObsRow& row,
716 const std::string& experiment) {
717 if (experiment == "DEFAULT") {
718 return oint->get_exp_uncertainty(row.id, UncertaintyType::STAT);
719 }
720 return oint->get_exp_uncertainty(ExperimentObs{experiment, row.id},
722}
723
724double get_exp_combined_for_row(std::shared_ptr<ObservableInterface> oint,
725 const ObsRow& row,
726 const std::string& experiment) {
727 if (experiment == "DEFAULT") {
728 return oint->get_exp_uncertainty(row.id, UncertaintyType::COMBINED);
729 }
730 return oint->get_exp_uncertainty(ExperimentObs{experiment, row.id},
732}
733
734struct RankedObs {
735 ObsRow row;
736 std::string key;
737 std::string experiment;
738 long flha_code = std::numeric_limits<long>::min();
739 std::string quantity;
740 bool flha_enum_ok = true;
741
742 double theory = nan_value();
743 double exp = nan_value();
744 double stat = nan_value();
745 double combined = nan_value();
746 double syst_from_combined = nan_value();
747 double delta = nan_value();
748 double pull = nan_value();
749 double rel_delta = nan_value();
750 double ratio = nan_value();
751
752 bool theory_ok = false;
753 bool exp_ok = false;
754 bool stat_ok = false;
755 bool combined_ok = false;
756 bool usable = false;
757 std::string error;
758};
759
760std::string fmt_num(double x, int precision = 6) {
761 if (!std::isfinite(x)) return "nan";
762 std::ostringstream ss;
763 const double ax = std::abs(x);
764 if ((ax > 0.0 && ax < 1.0e-3) || ax >= 1.0e4) {
765 ss << std::scientific << std::setprecision(precision) << x;
766 } else {
767 ss << std::fixed << std::setprecision(precision) << x;
768 }
769 return ss.str();
770}
771
772std::string fmt_signed(double x, int precision = 6) {
773 if (!std::isfinite(x)) return "nan";
774 std::ostringstream ss;
775 if (x >= 0.0) ss << "+";
776 ss << fmt_num(x, precision);
777 return ss.str();
778}
779
780void print_ranked_obs_card(const RankedObs& r, std::size_t rank) {
781 std::cout << "\n";
782 std::cout << "======================================================================\n";
783 std::cout << "#" << rank
784 << " |pull|=" << fmt_num(std::abs(r.pull), 3)
785 << " pull=" << fmt_signed(r.pull, 3)
786 << " |delta|=" << fmt_num(std::abs(r.delta), 6)
787 << " th/exp=" << fmt_num(r.ratio, 6) << "\n";
788 std::cout << "----------------------------------------------------------------------\n";
789 std::cout << "label : " << r.row.label << "\n";
790 std::cout << "observable : " << r.row.obs_name << "\n";
791 std::cout << "id/bin : " << r.row.id.str() << "\n";
792 std::cout << "experiment : requested=" << r.row.experiment
793 << ", used=" << r.experiment << "\n";
794 std::cout << "FLHA : key=" << r.key
795 << ", obs_code=";
796 if (r.flha_code == std::numeric_limits<long>::min()) std::cout << "nan";
797 else std::cout << r.flha_code;
798 std::cout << ", enum_quantity=" << (r.quantity.empty() ? "-" : r.quantity)
799 << ", convention_ok=" << (r.flha_enum_ok ? "yes" : "NO") << "\n";
800 std::cout << "values : theory=" << fmt_num(r.theory, 8)
801 << " exp=" << fmt_num(r.exp, 8)
802 << " delta=" << fmt_signed(r.delta, 8) << "\n";
803 std::cout << "uncertainty : stat=" << fmt_num(r.stat, 8)
804 << " combined=" << fmt_num(r.combined, 8)
805 << " syst_est=sqrt(comb^2-stat^2)="
806 << fmt_num(r.syst_from_combined, 8) << "\n";
807 std::cout << "diagnostic : rel_delta=" << fmt_signed(r.rel_delta, 6)
808 << " stat/|exp|="
809 << ((std::isfinite(r.exp) && r.exp != 0.0 && std::isfinite(r.stat))
810 ? fmt_num(r.stat / std::abs(r.exp), 6)
811 : std::string("nan"))
812 << "\n";
813 if (!r.error.empty()) {
814 std::cout << "notes : " << r.error << "\n";
815 }
816}
817
818} // namespace
819
820int main(int argc, char** argv) {
821 const std::size_t top_n =
822 (argc >= 2) ? static_cast<std::size_t>(std::stoul(argv[1])) : 10U;
823
824 try {
825 HyperisoMaster hyp;
826 HyperisoConfig config_hyp;
827 config_hyp.model = Model::SM;
828 hyp.init("lha/si_input.flha", config_hyp);
829
830 auto oint = std::make_shared<ObservableInterface>();
831
832 BKstarllConfig cfg_BKs;
833 cfg_BKs.ff_src = BV_FF_Src::GRvDV;
834 oint->set_decay_config(Decays::B__Kstar_l_l, cfg_BKs);
835 oint->set_bkstarll_threads(24);
836
837 BKstarGammaConfig cfg_BKsgamma;
838 cfg_BKsgamma.ff_src = BV_FF_Src::GRvDV;
839 oint->set_decay_config(Decays::B__Kstar_gamma, cfg_BKsgamma);
840
841 BsPhiConfig cfg_BsPhi;
842 cfg_BsPhi.ff_src = BV_FF_Src::GRvDV;
843 oint->set_decay_config(Decays::Bs__phi_l_l, cfg_BsPhi);
844 oint->set_bsphi_threads(24);
845
846 BKllConfig cfg_BK;
848 oint->set_decay_config(Decays::B__K_l_l, cfg_BK);
849 oint->set_bkll_threads(24);
850
851 using O = Observables;
852 constexpr bool kAddDeps = false;
853
854 std::vector<ObsRow> rows;
855 std::set<Observables> seen_unbinned;
856 std::set<std::tuple<Observables, double, double>> seen_binned;
857
858 auto add_unbinned = [&](Observables obs,
859 const std::string& obs_name,
860 const std::string& label,
861 const std::string& experiment) {
862 if (seen_unbinned.insert(obs).second) {
863 oint->add_observable(ObservableMapper::to_id(obs),
865 kAddDeps);
866 }
867
868 rows.push_back(ObsRow{
869 rows.size() + 1,
871 obs_name,
872 false,
873 label,
874 resolve_experiment_from_label(label, experiment)
875 });
876 };
877
878 auto add_bin = [&](Observables obs,
879 const std::string& obs_name,
880 double q2min,
881 double q2max,
882 const std::string& label,
883 const std::string& experiment) {
884 const auto key = std::make_tuple(obs, q2min, q2max);
885 if (seen_binned.insert(key).second) {
886 oint->add_observable(
887 BinnedObservableId{ObservableMapper::to_id(obs), {q2min, q2max}},
889 kAddDeps
890 );
891 }
892
893 rows.push_back(ObsRow{
894 rows.size() + 1,
895 BinnedObservableId{ObservableMapper::to_id(obs), {q2min, q2max}},
896 obs_name,
897 true,
898 label,
899 resolve_experiment_from_label(label, experiment)
900 });
901 };
902
903#define ADD_UNBINNED(obs, label, experiment) add_unbinned((obs), #obs, (label), (experiment))
904#define ADD_BIN(obs, q2min, q2max, label, experiment) add_bin((obs), #obs, (q2min), (q2max), (label), (experiment))
905
906 ADD_UNBINNED(O::IA_B__KSTAR_GAMMA, "AI_BKstargamma", "DEFAULT"); // 001
907 ADD_UNBINNED(O::BR_B_XS_GAMMA, "BR_BXsgamma", "DEFAULT"); // 002
908 ADD_UNBINNED(O::BR_BS_MUMU_UNTAG, "BRuntag_Bsmumu", "DEFAULT"); // 003
909 ADD_UNBINNED(O::BR_BS_EE_UNTAG, "BRuntag_Bsee", "DEFAULT"); // 004
910 ADD_BIN(O::BR_B__Xs_mu_mu, 1, 6, "BR_BXsmumu_1_6", "DEFAULT"); // 005
911 ADD_BIN(O::BR_B__Xs_mu_mu, 14.2, 22, "BR_BXsmumu_14.2_22", "DEFAULT"); // 006
912 ADD_BIN(O::BR_B__Xs_e_e, 1, 6, "BR_BXsee_1_6", "DEFAULT"); // 007
913 ADD_BIN(O::BR_B__Xs_e_e, 14.2, 22, "BR_BXsee_14.2_22", "DEFAULT"); // 008
914 ADD_UNBINNED(O::BR_B0__KSTAR0_GAMMA, "BR_B0Kstar0gamma", "DEFAULT"); // 009
915 ADD_UNBINNED(O::BR_B__KSTAR_GAMMA, "BR_BKstargamma", "DEFAULT"); // 010
916 ADD_BIN(O::DBR_DQ2_B__KSTAR_MU_MU, 1.1, 6, "dBR/dq2_BKstarmumu_1.1_6", "DEFAULT"); // 011
917 ADD_BIN(O::DBR_DQ2_B__KSTAR_MU_MU, 15, 19, "dBR/dq2_BKstarmumu_15_19", "DEFAULT"); // 012
918 ADD_BIN(O::R_1_B0__KSTAR0_L_L, 0.1, 1.1, "R-1_B0Kstar0ll_0.1_1.1", "DEFAULT"); // 013
919 ADD_BIN(O::R_1_B0__KSTAR0_L_L, 1.1, 6, "R-1_B0Kstar0ll_1.1_6", "DEFAULT"); // 014
920 ADD_BIN(O::R_1_B0__KSTAR0_L_L, 0.045, 1.1, "R-1_B0Kstar0ll_0.045_1.1_Belle", "Belle"); // 015
921 ADD_BIN(O::R_1_B0__KSTAR0_L_L, 1.1, 6, "R-1_B0Kstar0ll_1.1_6_Belle", "Belle"); // 016
922 ADD_BIN(O::R_1_B0__KSTAR0_L_L, 15, 19, "R-1_B0Kstar0ll_15_19_Belle", "Belle"); // 017
923 ADD_BIN(O::DBR_DQ2_B0__K0_MU_MU, 1.1, 6, "dBR/dq2_B0K0mumu_1.1_6", "DEFAULT"); // 018
924 ADD_BIN(O::DBR_DQ2_B0__K0_MU_MU, 15, 22, "dBR/dq2_B0K0mumu_15_22", "DEFAULT"); // 019
925 ADD_BIN(O::DBR_DQ2_B__K_MU_MU, 1.1, 6, "dBR/dq2_BKmumu_1.1_6", "DEFAULT"); // 020
926 ADD_BIN(O::F_H_B__K_MU_MU, 1.1, 6, "FH_BKmumu_1.1_6", "DEFAULT"); // 021
927 ADD_BIN(O::DBR_DQ2_B__K_MU_MU, 15, 22, "dBR/dq2_BKmumu_15_22", "DEFAULT"); // 022
928 ADD_BIN(O::F_H_B__K_MU_MU, 15, 22, "FH_BKmumu_15_22", "DEFAULT"); // 023
929 ADD_BIN(O::R_1_B__K_L_L, 0.1, 1.1, "R-1_BKll_0.1_1.1", "DEFAULT"); // 024
930 ADD_BIN(O::R_1_B__K_L_L, 1.1, 6, "R-1_BKll_1.1_6", "DEFAULT"); // 025
931 ADD_BIN(O::DBR_DQ2_BS__PHI_MU_MU, 0.1, 0.98, "dBR/dq2_Bsphimumu_0.1_0.98", "DEFAULT"); // 026
932 ADD_BIN(O::F_L_BS_PHI_MU_MU, 0.1, 0.98, "FL_Bsphimumu_0.1_0.98", "DEFAULT"); // 027
933 ADD_BIN(O::S_3_BS_PHI_MU_MU, 0.1, 0.98, "S3_Bsphimumu_0.1_0.98", "DEFAULT"); // 028
934 ADD_BIN(O::S_4_BS_PHI_MU_MU, 0.1, 0.98, "S4_Bsphimumu_0.1_0.98", "DEFAULT"); // 029
935 ADD_BIN(O::S_7_BS_PHI_MU_MU, 0.1, 0.98, "S7_Bsphimumu_0.1_0.98", "DEFAULT"); // 030
936 ADD_BIN(O::DBR_DQ2_BS__PHI_MU_MU, 1.1, 2.5, "dBR/dq2_Bsphimumu_1.1_2.5", "DEFAULT"); // 031
937 ADD_BIN(O::DBR_DQ2_BS__PHI_MU_MU, 2.5, 4, "dBR/dq2_Bsphimumu_2.5_4", "DEFAULT"); // 032
938 ADD_BIN(O::F_L_BS_PHI_MU_MU, 1.1, 4, "FL_Bsphimumu_1.1_4", "DEFAULT"); // 033
939 ADD_BIN(O::S_3_BS_PHI_MU_MU, 1.1, 4, "S3_Bsphimumu_1.1_4", "DEFAULT"); // 034
940 ADD_BIN(O::S_4_BS_PHI_MU_MU, 1.1, 4, "S4_Bsphimumu_1.1_4", "DEFAULT"); // 035
941 ADD_BIN(O::S_7_BS_PHI_MU_MU, 1.1, 4, "S7_Bsphimumu_1.1_4", "DEFAULT"); // 036
942 ADD_BIN(O::DBR_DQ2_BS__PHI_MU_MU, 4, 6, "dBR/dq2_Bsphimumu_4_6", "DEFAULT"); // 037
943 ADD_BIN(O::F_L_BS_PHI_MU_MU, 4, 6, "FL_Bsphimumu_4_6", "DEFAULT"); // 038
944 ADD_BIN(O::S_3_BS_PHI_MU_MU, 4, 6, "S3_Bsphimumu_4_6", "DEFAULT"); // 039
945 ADD_BIN(O::S_4_BS_PHI_MU_MU, 4, 6, "S4_Bsphimumu_4_6", "DEFAULT"); // 040
946 ADD_BIN(O::S_7_BS_PHI_MU_MU, 4, 6, "S7_Bsphimumu_4_6", "DEFAULT"); // 041
947 ADD_BIN(O::DBR_DQ2_BS__PHI_MU_MU, 15, 19, "dBR/dq2_Bsphimumu_15_19 // [2026-05-24_01] [WARN] Rejected MC nuisance sample 1 while trying to fill accepted sample 1 of 1000 : MC prediction contains non-finite observable", "DEFAULT"); // 042
948 ADD_BIN(O::F_L_BS_PHI_MU_MU, 15, 18.9, "FL_Bsphimumu_15_18.9", "DEFAULT"); // 043
949 ADD_BIN(O::S_3_BS_PHI_MU_MU, 15, 18.9, "S3_Bsphimumu_15_18.9", "DEFAULT"); // 044
950 ADD_BIN(O::S_4_BS_PHI_MU_MU, 15, 18.9, "S4_Bsphimumu_15_18.9", "DEFAULT"); // 045
951 ADD_BIN(O::S_7_BS_PHI_MU_MU, 15, 18.9, "S7_Bsphimumu_15_18.9", "DEFAULT"); // 046
952 ADD_BIN(O::DBR_DQ2_LAMBDA_B__LAMBDA_MU_MU, 15, 20, "dBR/dq2_LambdabLambdamumu_15_20", "DEFAULT"); // 047
953 ADD_BIN(O::A_FB_L_LAMBDA_B__LAMBDA_MU_MU, 15, 20, "AlFB_LambdabLambdamumu_15_20", "DEFAULT"); // 048
954 ADD_BIN(O::A_FB_H_LAMBDA_B__LAMBDA_MU_MU, 15, 20, "AhFB_LambdabLambdamumu_15_20", "DEFAULT"); // 049
955 ADD_BIN(O::A_FB_LH_LAMBDA_B__LAMBDA_MU_MU, 15, 20, "AlhFB_LambdabLambdamumu_15_20", "DEFAULT"); // 050
956 ADD_BIN(O::F_L_LAMBDA_B__LAMBDA_MU_MU, 15, 20, "FL_LambdabLambdamumu_15_20", "DEFAULT"); // 051
957 ADD_BIN(O::F_L_B__KSTAR_MU_MU, 0.1, 0.98, "FL_BKstarmumu_0.1_0.98", "DEFAULT"); // 052
958 ADD_BIN(O::A_FB_B__KSTAR_MU_MU, 0.1, 0.98, "AFB_BKstarmumu_0.1_0.98", "DEFAULT"); // 053
959 ADD_BIN(O::S_3_B__KSTAR_MU_MU, 0.1, 0.98, "S3_BKstarmumu_0.1_0.98", "DEFAULT"); // 054
960 ADD_BIN(O::S_4_B__KSTAR_MU_MU, 0.1, 0.98, "S4_BKstarmumu_0.1_0.98", "DEFAULT"); // 055
961 ADD_BIN(O::S_5_B__KSTAR_MU_MU, 0.1, 0.98, "S5_BKstarmumu_0.1_0.98", "DEFAULT"); // 056
962 ADD_BIN(O::S_7_B__KSTAR_MU_MU, 0.1, 0.98, "S7_BKstarmumu_0.1_0.98", "DEFAULT"); // 057
963 ADD_BIN(O::S_8_B__KSTAR_MU_MU, 0.1, 0.98, "S8_BKstarmumu_0.1_0.98", "DEFAULT"); // 058
964 ADD_BIN(O::S_9_B__KSTAR_MU_MU, 0.1, 0.98, "S9_BKstarmumu_0.1_0.98", "DEFAULT"); // 059
965 ADD_BIN(O::F_L_B__KSTAR_MU_MU, 1.1, 2.5, "FL_BKstarmumu_1.1_2.5", "DEFAULT"); // 060
966 ADD_BIN(O::A_FB_B__KSTAR_MU_MU, 1.1, 2.5, "AFB_BKstarmumu_1.1_2.5", "DEFAULT"); // 061
967 ADD_BIN(O::S_3_B__KSTAR_MU_MU, 1.1, 2.5, "S3_BKstarmumu_1.1_2.5", "DEFAULT"); // 062
968 ADD_BIN(O::S_4_B__KSTAR_MU_MU, 1.1, 2.5, "S4_BKstarmumu_1.1_2.5", "DEFAULT"); // 063
969 ADD_BIN(O::S_5_B__KSTAR_MU_MU, 1.1, 2.5, "S5_BKstarmumu_1.1_2.5", "DEFAULT"); // 064
970 ADD_BIN(O::S_7_B__KSTAR_MU_MU, 1.1, 2.5, "S7_BKstarmumu_1.1_2.5", "DEFAULT"); // 065
971 ADD_BIN(O::S_8_B__KSTAR_MU_MU, 1.1, 2.5, "S8_BKstarmumu_1.1_2.5", "DEFAULT"); // 066
972 ADD_BIN(O::S_9_B__KSTAR_MU_MU, 1.1, 2.5, "S9_BKstarmumu_1.1_2.5", "DEFAULT"); // 067
973 ADD_BIN(O::F_L_B__KSTAR_MU_MU, 2.5, 4, "FL_BKstarmumu_2.5_4", "DEFAULT"); // 068
974 ADD_BIN(O::A_FB_B__KSTAR_MU_MU, 2.5, 4, "AFB_BKstarmumu_2.5_4", "DEFAULT"); // 069
975 ADD_BIN(O::S_3_B__KSTAR_MU_MU, 2.5, 4, "S3_BKstarmumu_2.5_4", "DEFAULT"); // 070
976 ADD_BIN(O::S_4_B__KSTAR_MU_MU, 2.5, 4, "S4_BKstarmumu_2.5_4", "DEFAULT"); // 071
977 ADD_BIN(O::S_5_B__KSTAR_MU_MU, 2.5, 4, "S5_BKstarmumu_2.5_4", "DEFAULT"); // 072
978 ADD_BIN(O::S_7_B__KSTAR_MU_MU, 2.5, 4, "S7_BKstarmumu_2.5_4", "DEFAULT"); // 073
979 ADD_BIN(O::S_8_B__KSTAR_MU_MU, 2.5, 4, "S8_BKstarmumu_2.5_4", "DEFAULT"); // 074
980 ADD_BIN(O::S_9_B__KSTAR_MU_MU, 2.5, 4, "S9_BKstarmumu_2.5_4", "DEFAULT"); // 075
981 ADD_BIN(O::F_L_B__KSTAR_MU_MU, 4, 6, "FL_BKstarmumu_4_6", "DEFAULT"); // 076
982 ADD_BIN(O::A_FB_B__KSTAR_MU_MU, 4, 6, "AFB_BKstarmumu_4_6", "DEFAULT"); // 077
983 ADD_BIN(O::S_3_B__KSTAR_MU_MU, 4, 6, "S3_BKstarmumu_4_6", "DEFAULT"); // 078
984 ADD_BIN(O::S_4_B__KSTAR_MU_MU, 4, 6, "S4_BKstarmumu_4_6", "DEFAULT"); // 079
985 ADD_BIN(O::S_5_B__KSTAR_MU_MU, 4, 6, "S5_BKstarmumu_4_6", "DEFAULT"); // 080
986 ADD_BIN(O::S_7_B__KSTAR_MU_MU, 4, 6, "S7_BKstarmumu_4_6", "DEFAULT"); // 081
987 ADD_BIN(O::S_8_B__KSTAR_MU_MU, 4, 6, "S8_BKstarmumu_4_6", "DEFAULT"); // 082
988 ADD_BIN(O::S_9_B__KSTAR_MU_MU, 4, 6, "S9_BKstarmumu_4_6", "DEFAULT"); // 083
989 ADD_BIN(O::F_L_B__KSTAR_MU_MU, 15, 17, "FL_BKstarmumu_15_17", "DEFAULT"); // 084
990 ADD_BIN(O::A_FB_B__KSTAR_MU_MU, 15, 17, "AFB_BKstarmumu_15_17", "DEFAULT"); // 085
991 ADD_BIN(O::S_3_B__KSTAR_MU_MU, 15, 17, "S3_BKstarmumu_15_17", "DEFAULT"); // 086
992 ADD_BIN(O::S_4_B__KSTAR_MU_MU, 15, 17, "S4_BKstarmumu_15_17", "DEFAULT"); // 087
993 ADD_BIN(O::S_5_B__KSTAR_MU_MU, 15, 17, "S5_BKstarmumu_15_17", "DEFAULT"); // 088
994 ADD_BIN(O::S_7_B__KSTAR_MU_MU, 15, 17, "S7_BKstarmumu_15_17", "DEFAULT"); // 089
995 ADD_BIN(O::S_8_B__KSTAR_MU_MU, 15, 17, "S8_BKstarmumu_15_17", "DEFAULT"); // 090
996 ADD_BIN(O::S_9_B__KSTAR_MU_MU, 15, 17, "S9_BKstarmumu_15_17", "DEFAULT"); // 091
997 ADD_BIN(O::F_L_B__KSTAR_MU_MU, 17, 19, "FL_BKstarmumu_17_19", "DEFAULT"); // 092
998 ADD_BIN(O::A_FB_B__KSTAR_MU_MU, 17, 19, "AFB_BKstarmumu_17_19", "DEFAULT"); // 093
999 ADD_BIN(O::S_3_B__KSTAR_MU_MU, 17, 19, "S3_BKstarmumu_17_19", "DEFAULT"); // 094
1000 ADD_BIN(O::S_4_B__KSTAR_MU_MU, 17, 19, "S4_BKstarmumu_17_19", "DEFAULT"); // 095
1001 ADD_BIN(O::S_5_B__KSTAR_MU_MU, 17, 19, "S5_BKstarmumu_17_19", "DEFAULT"); // 096
1002 ADD_BIN(O::S_7_B__KSTAR_MU_MU, 17, 19, "S7_BKstarmumu_17_19", "DEFAULT"); // 097
1003 ADD_BIN(O::S_8_B__KSTAR_MU_MU, 17, 19, "S8_BKstarmumu_17_19", "DEFAULT"); // 098
1004 ADD_BIN(O::S_9_B__KSTAR_MU_MU, 17, 19, "S9_BKstarmumu_17_19", "DEFAULT"); // 099
1005 ADD_BIN(O::R_1_B__KSTAR_L_L, 0.045, 6, "R-1_BKstarll_0.045_6", "DEFAULT"); // 100
1006 ADD_BIN(O::R_1_B0__K0_L_L, 1.1, 6, "R-1_B0K0ll_1.1_6", "DEFAULT"); // 101
1007 ADD_BIN(O::R_1_B__K_L_L, 1, 6, "R-1_BKll_1_6_Belle", "Belle"); // 102
1008 ADD_BIN(O::F_H_B__K_MU_MU, 1, 6, "FH_BKmumu_1_6_CMS", "CMS"); // 103
1009 ADD_BIN(O::DBR_DQ2_B0__KSTAR0_E_E, 0.0009, 1, "dBR/dq2_B0Kstar0ee_0.0009_1 //[2026-05-24_01] [WARN] Rejected MC nuisance sample 1 while trying to fill accepted sample 1 of 1000 : MC prediction contains non-finite observable", "DEFAULT"); // 104
1010 ADD_BIN(O::F_L_B0__KSTAR0_E_E, 0.0008, 0.257, "FL_B0Kstar0ee_0.0008_0.257 //Rejected MC nuisance sample 125 while trying to fill accepted sample 1 of 1000 : MC prediction contains non-finite observable", "DEFAULT"); // 105
1011 ADD_BIN(O::A_T_RE_B0__KSTAR0_E_E, 0.0008, 0.257, "ATRe_B0Kstar0ee_0.0008_0.257 //[2026-05-24_01] [WARN] Rejected MC nuisance sample 1 while trying to fill accepted sample 1 of 1000 : MC prediction contains non-finite observable", "DEFAULT"); // 106
1012 ADD_BIN(O::A_T_2_B0__KSTAR0_E_E, 0.0008, 0.257, "AT2_B0Kstar0ee_0.0008_0.257 // [2026-05-24_01] [WARN] Rejected MC nuisance sample 1 while trying to fill accepted sample 1 of 1000 : MC prediction contains non-finite observable", "DEFAULT"); // 107
1013 ADD_BIN(O::DBR_DQ2_B__K_MU_MU, 0.1, 0.98, "dBR/dq2_BKmumu_0.1_0.98_CMS", "CMS"); // 108
1014 ADD_BIN(O::DBR_DQ2_B__K_MU_MU, 1.1, 2, "dBR/dq2_BKmumu_1.1_2_CMS", "CMS"); // 109
1015 ADD_BIN(O::DBR_DQ2_B__K_MU_MU, 2, 3, "dBR/dq2_BKmumu_2_3_CMS", "CMS"); // 110
1016 ADD_BIN(O::DBR_DQ2_B__K_MU_MU, 3, 4, "dBR/dq2_BKmumu_3_4_CMS", "CMS"); // 111
1017 ADD_BIN(O::DBR_DQ2_B__K_MU_MU, 4, 5, "dBR/dq2_BKmumu_4_5_CMS", "CMS"); // 112
1018 ADD_BIN(O::DBR_DQ2_B__K_MU_MU, 5, 6, "dBR/dq2_BKmumu_5_6_CMS", "CMS"); // 113
1019 ADD_BIN(O::DBR_DQ2_B__K_MU_MU, 14.82, 16, "dBR/dq2_BKmumu_14.82_16_CMS", "CMS"); // 114
1020 ADD_BIN(O::DBR_DQ2_B__K_MU_MU, 16, 17, "dBR/dq2_BKmumu_16_17_CMS", "CMS"); // 115
1021 ADD_BIN(O::DBR_DQ2_B__K_MU_MU, 17, 18, "dBR/dq2_BKmumu_17_18_CMS", "CMS"); // 116
1022 ADD_BIN(O::DBR_DQ2_B__K_MU_MU, 18, 19.24, "dBR/dq2_BKmumu_18_19.24_CMS", "CMS"); // 117
1023 ADD_BIN(O::DBR_DQ2_B__K_MU_MU, 19.24, 22.9, "dBR/dq2_BKmumu_19.24_22.9_CMS", "CMS"); // 118
1024 ADD_BIN(O::R_1_B__K_L_L, 1.1, 6, "R-1_BKll_1.1_6_CMS", "CMS"); // 119
1025 ADD_BIN(O::F_L_B0__KSTAR0_MU_MU, 1.1, 2, "FL_B0Kstar0mumu_1.1_2_CMS", "CMS"); // 120
1026 ADD_BIN(O::P_1_B0__KSTAR0_MU_MU, 1.1, 2, "P1_B0Kstar0mumu_1.1_2_CMS", "CMS"); // 121
1027 ADD_BIN(O::P_2_B0__KSTAR0_MU_MU, 1.1, 2, "P2_B0Kstar0mumu_1.1_2_CMS", "CMS"); // 122
1028 ADD_BIN(O::P_3_B0__KSTAR0_MU_MU, 1.1, 2, "P3_B0Kstar0mumu_1.1_2_CMS", "CMS"); // 123
1029 ADD_BIN(O::P_PRIME_4_B0__KSTAR0_MU_MU, 1.1, 2, "P4prime_B0Kstar0mumu_1.1_2_CMS", "CMS"); // 124
1030 ADD_BIN(O::P_PRIME_5_B0__KSTAR0_MU_MU, 1.1, 2, "P5prime_B0Kstar0mumu_1.1_2_CMS", "CMS"); // 125
1031 ADD_BIN(O::P_PRIME_6_B0__KSTAR0_MU_MU, 1.1, 2, "P6prime_B0Kstar0mumu_1.1_2_CMS", "CMS"); // 126
1032 ADD_BIN(O::P_PRIME_8_B0__KSTAR0_MU_MU, 1.1, 2, "P8prime_B0Kstar0mumu_1.1_2_CMS", "CMS"); // 127
1033 ADD_BIN(O::F_L_B0__KSTAR0_MU_MU, 2, 4.3, "FL_B0Kstar0mumu_2_4.3_CMS", "CMS"); // 128
1034 ADD_BIN(O::P_1_B0__KSTAR0_MU_MU, 2, 4.3, "P1_B0Kstar0mumu_2_4.3_CMS", "CMS"); // 129
1035 ADD_BIN(O::P_2_B0__KSTAR0_MU_MU, 2, 4.3, "P2_B0Kstar0mumu_2_4.3_CMS", "CMS"); // 130
1036 ADD_BIN(O::P_3_B0__KSTAR0_MU_MU, 2, 4.3, "P3_B0Kstar0mumu_2_4.3_CMS", "CMS"); // 131
1037 ADD_BIN(O::P_PRIME_4_B0__KSTAR0_MU_MU, 2, 4.3, "P4prime_B0Kstar0mumu_2_4.3_CMS", "CMS"); // 132
1038 ADD_BIN(O::P_PRIME_5_B0__KSTAR0_MU_MU, 2, 4.3, "P5prime_B0Kstar0mumu_2_4.3_CMS", "CMS"); // 133
1039 ADD_BIN(O::P_PRIME_6_B0__KSTAR0_MU_MU, 2, 4.3, "P6prime_B0Kstar0mumu_2_4.3_CMS", "CMS"); // 134
1040 ADD_BIN(O::P_PRIME_8_B0__KSTAR0_MU_MU, 2, 4.3, "P8prime_B0Kstar0mumu_2_4.3_CMS", "CMS"); // 135
1041 ADD_BIN(O::F_L_B0__KSTAR0_MU_MU, 4.3, 6, "FL_B0Kstar0mumu_4.3_6_CMS", "CMS"); // 136
1042 ADD_BIN(O::P_1_B0__KSTAR0_MU_MU, 4.3, 6, "P1_B0Kstar0mumu_4.3_6_CMS", "CMS"); // 137
1043 ADD_BIN(O::P_2_B0__KSTAR0_MU_MU, 4.3, 6, "P2_B0Kstar0mumu_4.3_6_CMS", "CMS"); // 138
1044 ADD_BIN(O::P_3_B0__KSTAR0_MU_MU, 4.3, 6, "P3_B0Kstar0mumu_4.3_6_CMS", "CMS"); // 139
1045 ADD_BIN(O::P_PRIME_4_B0__KSTAR0_MU_MU, 4.3, 6, "P4prime_B0Kstar0mumu_4.3_6_CMS", "CMS"); // 140
1046 ADD_BIN(O::P_PRIME_5_B0__KSTAR0_MU_MU, 4.3, 6, "P5prime_B0Kstar0mumu_4.3_6_CMS", "CMS"); // 141
1047 ADD_BIN(O::P_PRIME_6_B0__KSTAR0_MU_MU, 4.3, 6, "P6prime_B0Kstar0mumu_4.3_6_CMS", "CMS"); // 142
1048 ADD_BIN(O::P_PRIME_8_B0__KSTAR0_MU_MU, 4.3, 6, "P8prime_B0Kstar0mumu_4.3_6_CMS", "CMS"); // 143
1049 ADD_BIN(O::F_L_B0__KSTAR0_MU_MU, 14.18, 16, "FL_B0Kstar0mumu_14.18_16_CMS", "CMS"); // 144
1050 ADD_BIN(O::P_1_B0__KSTAR0_MU_MU, 14.18, 16, "P1_B0Kstar0mumu_14.18_16_CMS", "CMS"); // 145
1051 ADD_BIN(O::P_2_B0__KSTAR0_MU_MU, 14.18, 16, "P2_B0Kstar0mumu_14.18_16_CMS", "CMS"); // 146
1052 ADD_BIN(O::P_3_B0__KSTAR0_MU_MU, 14.18, 16, "P3_B0Kstar0mumu_14.18_16_CMS", "CMS"); // 147
1053 ADD_BIN(O::P_PRIME_4_B0__KSTAR0_MU_MU, 14.18, 16, "P4prime_B0Kstar0mumu_14.18_16_CMS", "CMS"); // 148
1054 ADD_BIN(O::P_PRIME_5_B0__KSTAR0_MU_MU, 14.18, 16, "P5prime_B0Kstar0mumu_14.18_16_CMS", "CMS"); // 149
1055 ADD_BIN(O::P_PRIME_6_B0__KSTAR0_MU_MU, 14.18, 16, "P6prime_B0Kstar0mumu_14.18_16_CMS", "CMS"); // 150
1056 ADD_BIN(O::P_PRIME_8_B0__KSTAR0_MU_MU, 14.18, 16, "P8prime_B0Kstar0mumu_14.18_16_CMS", "CMS"); // 151
1057 ADD_BIN(O::DBR_DQ2_BS__PHI_E_E, 0.1, 1.1, "dBR/dq2_Bsphiee_0.1_1.1", "DEFAULT"); // 152
1058 ADD_BIN(O::DBR_DQ2_BS__PHI_E_E, 1.1, 6, "dBR/dq2_Bsphiee_1.1_6", "DEFAULT"); // 153
1059 ADD_BIN(O::DBR_DQ2_BS__PHI_E_E, 15, 19, "dBR/dq2_Bsphiee_15_19 //[2026-05-24_01] [WARN] Rejected MC nuisance sample 1 while trying to fill accepted sample 1 of 1000 : MC prediction contains non-finite observable", "DEFAULT"); // 154
1060 ADD_BIN(O::R_1_BS__PHI_L_L, 0.1, 1.1, "R-1_Bsphill_0.1_1.1", "DEFAULT"); // 155
1061 ADD_BIN(O::R_1_BS__PHI_L_L, 1.1, 6, "R-1_Bsphill_1.1_6", "DEFAULT"); // 156
1062 ADD_BIN(O::R_1_BS__PHI_L_L, 15, 19, "R-1_Bsphill_15_19 //[2026-05-24_01] [WARN] Rejected MC nuisance sample 1 while trying to fill accepted sample 1 of 1000 : MC prediction contains non-finite observable", "DEFAULT"); // 157
1063 ADD_BIN(O::F_L_BS_PHI_E_E, 0.0009, 0.2615, "FL_Bsphiee_0.0009_0.2615 //[2026-05-24_01] [WARN] Rejected MC nuisance sample 1 while trying to fill accepted sample 1 of 1000 : MC prediction contains non-finite observable", "DEFAULT"); // 158
1064 ADD_BIN(O::A_T_2_BS_PHI_E_E, 0.0009, 0.2615, "AT2_Bsphiee_0.0009_0.2615 //[2026-05-24_01] [WARN] Rejected MC nuisance sample 1 while trying to fill accepted sample 1 of 1000 : MC prediction contains non-finite observable", "DEFAULT"); // 159
1065 ADD_BIN(O::A_T_2_B0__KSTAR0_E_E, 0.0008, 1.12, "AT2_B0Kstar0ee_0.0008_1.12_Belle //[2026-05-24_01] [WARN] Rejected MC nuisance sample 1 while trying to fill accepted sample 1 of 1000 : MC prediction contains non-finite observable", "Belle"); // 160
1066 ADD_BIN(O::F_L_B0__KSTAR0_E_E, 1.1, 6, "FL_B0Kstar0ee_1.1_6", "DEFAULT"); // 161
1067 ADD_BIN(O::P_1_B0__KSTAR0_E_E, 1.1, 6, "P1_B0Kstar0ee_1.1_6", "DEFAULT"); // 162
1068 ADD_BIN(O::P_2_B0__KSTAR0_E_E, 1.1, 6, "P2_B0Kstar0ee_1.1_6", "DEFAULT"); // 163
1069 ADD_BIN(O::P_3_B0__KSTAR0_E_E, 1.1, 6, "P3_B0Kstar0ee_1.1_6", "DEFAULT"); // 164
1070 ADD_BIN(O::P_PRIME_4_B0__KSTAR0_E_E, 1.1, 6, "P4prime_B0Kstar0ee_1.1_6", "DEFAULT"); // 165
1071 ADD_BIN(O::P_PRIME_5_B0__KSTAR0_E_E, 1.1, 6, "P5prime_B0Kstar0ee_1.1_6", "DEFAULT"); // 166
1072 ADD_BIN(O::P_PRIME_6_B0__KSTAR0_E_E, 1.1, 6, "P6prime_B0Kstar0ee_1.1_6", "DEFAULT"); // 167
1073 ADD_BIN(O::P_PRIME_8_B0__KSTAR0_E_E, 1.1, 6, "P8prime_B0Kstar0ee_1.1_6", "DEFAULT"); // 168
1074 ADD_BIN(O::F_L_B0__KSTAR0_MU_MU, 0.06, 0.98, "FL_B0Kstar0mumu_0.06_0.98_LHCb2025c2", "LHCb2025c2"); // 169
1075 ADD_BIN(O::S_2S_B0__KSTAR0_MU_MU, 0.06, 0.98, "S2s_B0Kstar0mumu_0.06_0.98_LHCb2025c2", "LHCb2025c2"); // 170
1076 ADD_BIN(O::S_1C_B0__KSTAR0_MU_MU, 0.06, 0.98, "S1c_B0Kstar0mumu_0.06_0.98_LHCb2025c2", "LHCb2025c2"); // 171
1077 ADD_BIN(O::P_1_B0__KSTAR0_MU_MU, 0.06, 0.98, "P1_B0Kstar0mumu_0.06_0.98_LHCb2025c2", "LHCb2025c2"); // 172
1078 ADD_BIN(O::P_2_B0__KSTAR0_MU_MU, 0.06, 0.98, "P2_B0Kstar0mumu_0.06_0.98_LHCb2025c2", "LHCb2025c2"); // 173
1079 ADD_BIN(O::P_3_B0__KSTAR0_MU_MU, 0.06, 0.98, "P3_B0Kstar0mumu_0.06_0.98_LHCb2025c2", "LHCb2025c2"); // 174
1080 ADD_BIN(O::P_PRIME_4_B0__KSTAR0_MU_MU, 0.06, 0.98, "P4prime_B0Kstar0mumu_0.06_0.98_LHCb2025c2", "LHCb2025c2"); // 175
1081 ADD_BIN(O::P_PRIME_5_B0__KSTAR0_MU_MU, 0.06, 0.98, "P5prime_B0Kstar0mumu_0.06_0.98_LHCb2025c2", "LHCb2025c2"); // 176
1082 ADD_BIN(O::P_PRIME_6_B0__KSTAR0_MU_MU, 0.06, 0.98, "P6prime_B0Kstar0mumu_0.06_0.98_LHCb2025c2", "LHCb2025c2"); // 177
1083 ADD_BIN(O::P_PRIME_8_B0__KSTAR0_MU_MU, 0.06, 0.98, "P8prime_B0Kstar0mumu_0.06_0.98_LHCb2025c2", "LHCb2025c2"); // 178
1084 ADD_BIN(O::S_6C_B0__KSTAR0_MU_MU, 0.06, 0.98, "S6c_B0Kstar0mumu_0.06_0.98_LHCb2025c2", "LHCb2025c2"); // 179
1085 ADD_BIN(O::DBR_DQ2_B0__KSTAR0_MU_MU, 0.06, 0.98, "dBR/dq2_B0Kstar0mumu_0.06_0.98_LHCb2025c2", "LHCb2025c2"); // 180
1086 ADD_BIN(O::F_L_B0__KSTAR0_MU_MU, 1.1, 2.5, "FL_B0Kstar0mumu_1.1_2.5_LHCb2025c2", "LHCb2025c2"); // 181
1087 ADD_BIN(O::S_1C_B0__KSTAR0_MU_MU, 1.1, 2.5, "S1c_B0Kstar0mumu_1.1_2.5_LHCb2025c2", "LHCb2025c2"); // 182
1088 ADD_BIN(O::P_1_B0__KSTAR0_MU_MU, 1.1, 2.5, "P1_B0Kstar0mumu_1.1_2.5_LHCb2025c2", "LHCb2025c2"); // 183
1089 ADD_BIN(O::P_2_B0__KSTAR0_MU_MU, 1.1, 2.5, "P2_B0Kstar0mumu_1.1_2.5_LHCb2025c2", "LHCb2025c2"); // 184
1090 ADD_BIN(O::P_3_B0__KSTAR0_MU_MU, 1.1, 2.5, "P3_B0Kstar0mumu_1.1_2.5_LHCb2025c2", "LHCb2025c2"); // 185
1091 ADD_BIN(O::P_PRIME_4_B0__KSTAR0_MU_MU, 1.1, 2.5, "P4prime_B0Kstar0mumu_1.1_2.5_LHCb2025c2", "LHCb2025c2"); // 186
1092 ADD_BIN(O::P_PRIME_5_B0__KSTAR0_MU_MU, 1.1, 2.5, "P5prime_B0Kstar0mumu_1.1_2.5_LHCb2025c2", "LHCb2025c2"); // 187
1093 ADD_BIN(O::P_PRIME_6_B0__KSTAR0_MU_MU, 1.1, 2.5, "P6prime_B0Kstar0mumu_1.1_2.5_LHCb2025c2", "LHCb2025c2"); // 188
1094 ADD_BIN(O::P_PRIME_8_B0__KSTAR0_MU_MU, 1.1, 2.5, "P8prime_B0Kstar0mumu_1.1_2.5_LHCb2025c2", "LHCb2025c2"); // 189
1095 ADD_BIN(O::DBR_DQ2_B0__KSTAR0_MU_MU, 1.1, 2.5, "dBR/dq2_B0Kstar0mumu_1.1_2.5_LHCb2025c2", "LHCb2025c2"); // 190
1096 ADD_BIN(O::F_L_B0__KSTAR0_MU_MU, 2.5, 4, "FL_B0Kstar0mumu_2.5_4.0_LHCb2025c2", "LHCb2025c2"); // 191
1097 ADD_BIN(O::S_1C_B0__KSTAR0_MU_MU, 2.5, 4, "S1c_B0Kstar0mumu_2.5_4.0_LHCb2025c2", "LHCb2025c2"); // 192
1098 ADD_BIN(O::P_1_B0__KSTAR0_MU_MU, 2.5, 4, "P1_B0Kstar0mumu_2.5_4.0_LHCb2025c2", "LHCb2025c2"); // 193
1099 ADD_BIN(O::P_2_B0__KSTAR0_MU_MU, 2.5, 4, "P2_B0Kstar0mumu_2.5_4.0_LHCb2025c2", "LHCb2025c2"); // 194
1100 ADD_BIN(O::P_3_B0__KSTAR0_MU_MU, 2.5, 4, "P3_B0Kstar0mumu_2.5_4.0_LHCb2025c2", "LHCb2025c2"); // 195
1101 ADD_BIN(O::P_PRIME_4_B0__KSTAR0_MU_MU, 2.5, 4, "P4prime_B0Kstar0mumu_2.5_4.0_LHCb2025c2", "LHCb2025c2"); // 196
1102 ADD_BIN(O::P_PRIME_5_B0__KSTAR0_MU_MU, 2.5, 4, "P5prime_B0Kstar0mumu_2.5_4.0_LHCb2025c2", "LHCb2025c2"); // 197
1103 ADD_BIN(O::P_PRIME_6_B0__KSTAR0_MU_MU, 2.5, 4, "P6prime_B0Kstar0mumu_2.5_4.0_LHCb2025c2", "LHCb2025c2"); // 198
1104 ADD_BIN(O::P_PRIME_8_B0__KSTAR0_MU_MU, 2.5, 4, "P8prime_B0Kstar0mumu_2.5_4.0_LHCb2025c2", "LHCb2025c2"); // 199
1105 ADD_BIN(O::DBR_DQ2_B0__KSTAR0_MU_MU, 2.5, 4, "dBR/dq2_B0Kstar0mumu_2.5_4.0_LHCb2025c2", "LHCb2025c2"); // 200
1106 ADD_BIN(O::F_L_B0__KSTAR0_MU_MU, 4, 6, "FL_B0Kstar0mumu_4.0_6.0_LHCb2025c2", "LHCb2025c2"); // 201
1107 ADD_BIN(O::S_1C_B0__KSTAR0_MU_MU, 4, 6, "S1c_B0Kstar0mumu_4.0_6.0_LHCb2025c2", "LHCb2025c2"); // 202
1108 ADD_BIN(O::P_1_B0__KSTAR0_MU_MU, 4, 6, "P1_B0Kstar0mumu_4.0_6.0_LHCb2025c2", "LHCb2025c2"); // 203
1109 ADD_BIN(O::P_2_B0__KSTAR0_MU_MU, 4, 6, "P2_B0Kstar0mumu_4.0_6.0_LHCb2025c2", "LHCb2025c2"); // 204
1110 ADD_BIN(O::P_3_B0__KSTAR0_MU_MU, 4, 6, "P3_B0Kstar0mumu_4.0_6.0_LHCb2025c2", "LHCb2025c2"); // 205
1111 ADD_BIN(O::P_PRIME_4_B0__KSTAR0_MU_MU, 4, 6, "P4prime_B0Kstar0mumu_4.0_6.0_LHCb2025c2", "LHCb2025c2"); // 206
1112 ADD_BIN(O::P_PRIME_5_B0__KSTAR0_MU_MU, 4, 6, "P5prime_B0Kstar0mumu_4.0_6.0_LHCb2025c2", "LHCb2025c2"); // 207
1113 ADD_BIN(O::P_PRIME_6_B0__KSTAR0_MU_MU, 4, 6, "P6prime_B0Kstar0mumu_4.0_6.0_LHCb2025c2", "LHCb2025c2"); // 208
1114 ADD_BIN(O::P_PRIME_8_B0__KSTAR0_MU_MU, 4, 6, "P8prime_B0Kstar0mumu_4.0_6.0_LHCb2025c2", "LHCb2025c2"); // 209
1115 ADD_BIN(O::DBR_DQ2_B0__KSTAR0_MU_MU, 4, 6, "dBR/dq2_B0Kstar0mumu_4.0_6.0_LHCb2025c2", "LHCb2025c2"); // 210
1116 ADD_BIN(O::F_L_B0__KSTAR0_MU_MU, 15, 17, "FL_B0Kstar0mumu_15.0_17.0_LHCb2025c2", "LHCb2025c2"); // 211
1117 ADD_BIN(O::S_1C_B0__KSTAR0_MU_MU, 15, 17, "S1c_B0Kstar0mumu_15.0_17.0_LHCb2025c2", "LHCb2025c2"); // 212
1118 ADD_BIN(O::P_1_B0__KSTAR0_MU_MU, 15, 17, "P1_B0Kstar0mumu_15.0_17.0_LHCb2025c2", "LHCb2025c2"); // 213
1119 ADD_BIN(O::P_2_B0__KSTAR0_MU_MU, 15, 17, "P2_B0Kstar0mumu_15.0_17.0_LHCb2025c2", "LHCb2025c2"); // 214
1120 ADD_BIN(O::P_3_B0__KSTAR0_MU_MU, 15, 17, "P3_B0Kstar0mumu_15.0_17.0_LHCb2025c2", "LHCb2025c2"); // 215
1121 ADD_BIN(O::P_PRIME_4_B0__KSTAR0_MU_MU, 15, 17, "P4prime_B0Kstar0mumu_15.0_17.0_LHCb2025c2", "LHCb2025c2"); // 216
1122 ADD_BIN(O::P_PRIME_5_B0__KSTAR0_MU_MU, 15, 17, "P5prime_B0Kstar0mumu_15.0_17.0_LHCb2025c2", "LHCb2025c2"); // 217
1123 ADD_BIN(O::P_PRIME_6_B0__KSTAR0_MU_MU, 15, 17, "P6prime_B0Kstar0mumu_15.0_17.0_LHCb2025c2", "LHCb2025c2"); // 218
1124 ADD_BIN(O::P_PRIME_8_B0__KSTAR0_MU_MU, 15, 17, "P8prime_B0Kstar0mumu_15.0_17.0_LHCb2025c2", "LHCb2025c2"); // 219
1125 ADD_BIN(O::DBR_DQ2_B0__KSTAR0_MU_MU, 15, 17, "dBR/dq2_B0Kstar0mumu_15.0_17.0_LHCb2025c2", "LHCb2025c2"); // 220
1126 ADD_BIN(O::F_L_B0__KSTAR0_MU_MU, 17, 19, "FL_B0Kstar0mumu_17.0_19.0_LHCb2025c2", "LHCb2025c2"); // 221
1127 ADD_BIN(O::S_1C_B0__KSTAR0_MU_MU, 17, 19, "S1c_B0Kstar0mumu_17.0_19.0_LHCb2025c2", "LHCb2025c2"); // 222
1128 ADD_BIN(O::P_1_B0__KSTAR0_MU_MU, 17, 19, "P1_B0Kstar0mumu_17.0_19.0_LHCb2025c2", "LHCb2025c2"); // 223
1129 ADD_BIN(O::P_2_B0__KSTAR0_MU_MU, 17, 19, "P2_B0Kstar0mumu_17.0_19.0_LHCb2025c2", "LHCb2025c2"); // 224
1130 ADD_BIN(O::P_3_B0__KSTAR0_MU_MU, 17, 19, "P3_B0Kstar0mumu_17.0_19.0_LHCb2025c2", "LHCb2025c2"); // 225
1131 ADD_BIN(O::P_PRIME_4_B0__KSTAR0_MU_MU, 17, 19, "P4prime_B0Kstar0mumu_17.0_19.0_LHCb2025c2", "LHCb2025c2"); // 226
1132 ADD_BIN(O::P_PRIME_5_B0__KSTAR0_MU_MU, 17, 19, "P5prime_B0Kstar0mumu_17.0_19.0_LHCb2025c2", "LHCb2025c2"); // 227
1133 ADD_BIN(O::P_PRIME_6_B0__KSTAR0_MU_MU, 17, 19, "P6prime_B0Kstar0mumu_17.0_19.0_LHCb2025c2", "LHCb2025c2"); // 228
1134 ADD_BIN(O::P_PRIME_8_B0__KSTAR0_MU_MU, 17, 19, "P8prime_B0Kstar0mumu_17.0_19.0_LHCb2025c2", "LHCb2025c2"); // 229
1135 ADD_BIN(O::DBR_DQ2_B0__KSTAR0_MU_MU, 17, 19, "dBR/dq2_B0Kstar0mumu_17.0_19.0_LHCb2025c2", "LHCb2025c2"); // 230
1136
1137#undef ADD_BIN
1138#undef ADD_UNBINNED
1139
1140 std::cout << "[INFO] Registered rows: " << rows.size() << "\n";
1141 std::cout << "[INFO] Unique unbinned: " << seen_unbinned.size()
1142 << ", unique binned: " << seen_binned.size() << "\n";
1143
1144 const auto all_theory = oint->compute_all();
1145
1146 std::vector<RankedObs> ranked;
1147 ranked.reserve(rows.size());
1148
1149 for (const auto& row : rows) {
1150 RankedObs r;
1151 r.row = row;
1152 r.experiment = row.experiment;
1153 std::ostringstream error;
1154
1155 try {
1156 r.key = flha_key(row.id);
1157 r.flha_code = flha_observable_code(row.id);
1158 r.quantity = quantity_from_enum_name(row.obs_name);
1159 r.flha_enum_ok = flha_code_matches_enum_quantity(row.obs_name, r.flha_code);
1160 if (!r.flha_enum_ok) {
1161 error << "flha_enum_quantity_mismatch:obs=" << row.obs_name
1162 << ",flha_code=" << r.flha_code << ";";
1163 }
1164
1165 const std::string resolved = choose_available_experiment(row, r.key);
1166 if (!resolved.empty()) {
1167 r.experiment = resolved;
1168 } else {
1169 error << "exp_key_not_found_in_known_FOBS_blocks:" << r.key << ";";
1170 }
1171 } catch (const std::exception& e) {
1172 error << "flha_key_exception:" << e.what() << ";";
1173 } catch (...) {
1174 error << "flha_key_unknown_exception;";
1175 }
1176
1177 try {
1178 const auto obs_id = row.id.s;
1179 auto it = all_theory.find(obs_id);
1180 if (it != all_theory.end()) {
1181 r.theory_ok = find_theory_value(it->second, row, r.theory);
1182 }
1183 if (!r.theory_ok) {
1184 error << "theory_not_found_for_bin;";
1185 }
1186 } catch (const std::exception& e) {
1187 error << "theory_exception:" << e.what() << ";";
1188 } catch (...) {
1189 error << "theory_unknown_exception;";
1190 }
1191
1192 if (!r.key.empty() && has_exp_key(r.experiment, r.key)) {
1193 try {
1194 r.exp = get_exp_value_for_row(oint, row, r.experiment);
1195 r.exp_ok = std::isfinite(r.exp);
1196 } catch (const std::exception& e) {
1197 error << "exp_exception:" << e.what() << ";";
1198 } catch (...) {
1199 error << "exp_unknown_exception;";
1200 }
1201
1202 try {
1203 r.stat = get_exp_stat_for_row(oint, row, r.experiment);
1204 r.stat_ok = std::isfinite(r.stat);
1205 } catch (const std::exception& e) {
1206 error << "stat_exception:" << e.what() << ";";
1207 } catch (...) {
1208 error << "stat_unknown_exception;";
1209 }
1210
1211 try {
1212 r.combined = get_exp_combined_for_row(oint, row, r.experiment);
1213 r.combined_ok = std::isfinite(r.combined);
1214 if (r.combined_ok && r.stat_ok) {
1215 const double syst2 = r.combined * r.combined - r.stat * r.stat;
1216 r.syst_from_combined = (syst2 > 0.0) ? std::sqrt(syst2) : 0.0;
1217 }
1218 } catch (const std::exception& e) {
1219 error << "combined_exception:" << e.what() << ";";
1220 } catch (...) {
1221 error << "combined_unknown_exception;";
1222 }
1223 } else {
1224 error << "skip_exp_lookup_missing_key;";
1225 }
1226
1227 if (r.theory_ok && r.exp_ok) {
1228 r.delta = r.theory - r.exp;
1229 if (r.exp != 0.0) {
1230 r.rel_delta = r.delta / r.exp;
1231 r.ratio = r.theory / r.exp;
1232 }
1233 }
1234
1235 if (r.theory_ok && r.exp_ok && r.stat_ok && r.stat > 0.0) {
1236 r.pull = r.delta / r.stat;
1237 r.usable = std::isfinite(r.pull);
1238 }
1239
1240 r.error = error.str();
1241 if (r.usable) {
1242 ranked.push_back(r);
1243 }
1244 }
1245
1246 std::sort(ranked.begin(), ranked.end(), [](const RankedObs& a, const RankedObs& b) {
1247 const double ap = std::abs(a.pull);
1248 const double bp = std::abs(b.pull);
1249 if (ap != bp) return ap > bp;
1250 return std::abs(a.delta) > std::abs(b.delta);
1251 });
1252
1253 const std::size_t n = std::min(top_n, ranked.size());
1254 std::cout << "\n";
1255 std::cout << "########################################################################\n";
1256 std::cout << "# TOP " << n << " largest theory/experiment discrepancies\n";
1257 std::cout << "# Ranking: descending |pull| = |theory - exp| / stat_unc\n";
1258 std::cout << "# Total usable rows: " << ranked.size() << " / " << rows.size() << "\n";
1259 std::cout << "########################################################################\n";
1260
1261 for (std::size_t i = 0; i < n; ++i) {
1262 print_ranked_obs_card(ranked[i], i + 1);
1263 }
1264
1265 std::cout << "\n======================================================================\n";
1266 std::cout << "Compact summary\n";
1267 std::cout << "======================================================================\n";
1268 std::cout << std::left
1269 << std::setw(5) << "rank"
1270 << std::setw(9) << "idx"
1271 << std::setw(14) << "|pull|"
1272 << std::setw(14) << "th/exp"
1273 << std::setw(16) << "delta"
1274 << std::setw(13) << "stat"
1275 << "label\n";
1276 std::cout << std::string(110, '-') << "\n";
1277 for (std::size_t i = 0; i < n; ++i) {
1278 const RankedObs& r = ranked[i];
1279 std::cout << std::left
1280 << std::setw(5) << (i + 1)
1281 << std::setw(9) << r.row.index
1282 << std::setw(14) << fmt_num(std::abs(r.pull), 4)
1283 << std::setw(14) << fmt_num(r.ratio, 4)
1284 << std::setw(16) << fmt_signed(r.delta, 4)
1285 << std::setw(13) << fmt_num(r.stat, 4)
1286 << r.row.label << "\n";
1287 }
1288
1289 // oint->add_observable(BinnedObservableId(ObservableMapper::to_id(Observables::DGAMMA_DQ2_B0__KSTAR0_MU_MU), {17.0, 19.0}), QCDOrder::NNLO, true);
1290
1291 // for (auto&& elem : oint->compute_observable(ObservableMapper::to_id(Observables::DBR_DQ2_B0__KSTAR0_MU_MU)))
1292 // LOG_INFO("[", elem.bin.value().first, ",", elem.bin.value().second, "]", elem.value);
1293
1294 std::cout << "\n[INFO] Done. Pass an integer argument to change the number of printed rows, e.g. ./main_top_obs 20\n";
1295 return 0;
1296
1297 } catch (const std::exception& e) {
1298 std::cerr << "[FATAL] " << e.what() << "\n";
1299 return 1;
1300 } catch (...) {
1301 std::cerr << "[FATAL] Unknown exception\n";
1302 return 1;
1303 }
1304}
Observables
Definition GeneralEnum.h:4
@ B__Kstar_l_l
@ Bs__phi_l_l
@ B__Kstar_gamma
High-level, user-facing entry point to compute flavor observables.
static IdOf< ObservableTag > to_id(Observables e)
Converts an enum value to an IdOf<Tag>.
High-level interface to initialize and monitor the main framework configuration.
void init(const std::string &lhaFile, HyperisoConfig config)
Initializes Hyperiso using a LHA file and a full Config object.
csl::Expr v
Definition sm.h:110
Hash specialization for SymbolId<Tag>.
Definition BlockName.h:353
BP_FF_Src ff_src
Definition BKllDecay.h:142
BV_FF_Src ff_src
Definition BKsllDecay.h:19
Identifies an observable together with a numerical bin.
BV_FF_Src ff_src
Definition BsPhiDecay.h:17
Configuration object controlling model, input flags and optional MARTY resources.
Definition Config.h:24
Model model
Current model.
Definition Config.h:33
#define ADD_UNBINNED(obs, label, experiment)
#define ADD_BIN(obs, q2min, q2max, label, experiment)