Hyperiso 1.0.3
Modular flavour-physics calculations, Wilson coefficients and statistical inference
Loading...
Searching...
No Matches
test_contour_BKstarmumu.cpp
Go to the documentation of this file.
1#include <chrono>
2#include <fstream>
3#include <iomanip>
4#include <iostream>
5#include <map>
6#include <memory>
7#include <set>
8#include <string>
9#include <tuple>
10#include <utility>
11#include <vector>
12
13#include "StatisticManager.h"
14#include "ObservableInterface.h"
17#include "StatParameterProxy.h"
20#include "FitAbstraction.h"
21#include "NuisanceReader.h"
23#include "BlockProxy.h"
24
25namespace {
26
27using Path = std::vector<std::pair<double, double>>;
28
29void print_fit_result(const FitResultWithMaps& fit) {
30 std::cout << std::setprecision(17);
31 std::cout << "fit_ok = " << fit.fit_ok << "\n";
32 std::cout << "ell_hat = " << fit.ell_hat << "\n";
33
34 std::cout << "\np_hat:\n";
35 for (const auto& [pid, val] : fit.p_hat) {
36 std::cout << " " << fit_app::to_string_any(pid) << " = " << val << "\n";
37 }
38
39 std::cout << "\neta_hat:\n";
40 for (const auto& [pid, val] : fit.eta_hat) {
41 std::cout << " " << fit_app::to_string_any(pid) << " = " << val << "\n";
42 }
43
44 std::cout << "\np_hat_std:\n";
45 for (const auto& [pid, val] : fit.p_hat_std) {
46 std::cout << " " << fit_app::to_string_any(pid) << " = " << val << "\n";
47 }
48
49 std::cout << "\np_correlations:\n";
50 for (const auto& [pi, row] : fit.p_correlations) {
51 for (const auto& [pj, corr] : row) {
52 std::cout << " corr(" << fit_app::to_string_any(pi)
53 << ", " << fit_app::to_string_any(pj)
54 << ") = " << corr << "\n";
55 }
56 }
57}
58
59void save_bestfit_csv(const std::string& path, const FitResultWithMaps& fit) {
60 std::ofstream out(path);
61 out << "name,value,error\n";
62
63 for (const auto& [pid, val] : fit.p_hat) {
64 double err = 0.0;
65 auto it = fit.p_hat_std.find(pid);
66 if (it != fit.p_hat_std.end()) {
67 err = it->second;
68 }
69
70 out << fit_app::to_string_any(pid) << ","
71 << std::setprecision(17) << val << ","
72 << err << "\n";
73 }
74}
75
76void save_contour_csv(const std::string& path,
77 const std::string& xname,
78 const std::string& yname,
79 const std::set<Path>& contour68,
80 const std::set<Path>& contour95) {
81 std::ofstream out(path);
82 out << "# x=" << xname << "\n";
83 out << "# y=" << yname << "\n";
84 out << "cl,path_id,x,y\n";
85
86 std::size_t path_id = 0;
87 for (const auto& path_pts : contour68) {
88 for (const auto& p : path_pts) {
89 out << "0.683," << path_id << ","
90 << std::setprecision(17) << p.first << ","
91 << p.second << "\n";
92 }
93 ++path_id;
94 }
95
96 path_id = 0;
97 for (const auto& path_pts : contour95) {
98 for (const auto& p : path_pts) {
99 out << "0.95," << path_id << ","
100 << std::setprecision(17) << p.first << ","
101 << p.second << "\n";
102 }
103 ++path_id;
104 }
105}
106
107}
108
109int main() {
110 using namespace fit_app;
111 // Logger::getInstance()->setLevel(Logger::LogLevel::VERBOSE);
112 HyperisoMaster hyp;
113 HyperisoConfig config_hyp;
114 config_hyp.model = Model::SM;
115 hyp.init("lha/si_input.flha", config_hyp);
116
117
118
119 // BlockProxy().log_block(ParameterType::DECAY, "B_Xsll");
120
121 auto oint = std::make_shared<ObservableInterface>();
122 // ============================================================
123 // Observables: STRICTEMENT ceux du fichier "Texte collé(7).txt"
124 // ============================================================
125
126 BKstarllConfig cfg_BKs;
127 cfg_BKs.ff_src = BV_FF_Src::GRvDV;
128 oint->set_decay_config(Decays::B__Kstar_l_l, cfg_BKs);
129 oint->set_bkstarll_threads(30);
130
131 BKstarGammaConfig cfg_BKsgamma;
132 cfg_BKsgamma.ff_src = BV_FF_Src::GRvDV;
133 oint->set_decay_config(Decays::B__Kstar_gamma, cfg_BKsgamma);
134
135 BsPhiConfig cfg_BsPhi;
136 cfg_BsPhi.ff_src = BV_FF_Src::GRvDV;
137 oint->set_decay_config(Decays::Bs__phi_l_l, cfg_BsPhi);
138 oint->set_bsphi_threads(30);
139
140 BKllConfig cfg_BK;
142 oint->set_decay_config(Decays::B__K_l_l, cfg_BK);
143 oint->set_bkll_threads(30);
144
145 using O = Observables;
146 constexpr bool kAddDeps = false;
147
148 std::set<Observables> seen_unbinned;
149 std::set<std::tuple<Observables, double, double>> seen_binned;
150 std::set<ExperimentObs> selected_exp_obs;
151
152 auto add_unbinned = [&](Observables obs) {
153 if (!seen_unbinned.insert(obs).second) return;
154 oint->add_observable(
157 kAddDeps
158 );
159 };
160
161 auto add_bin = [&](Observables obs, double q2min, double q2max) {
162 auto key = std::make_tuple(obs, q2min, q2max);
163 if (!seen_binned.insert(key).second) return;
164 oint->add_observable(
165 BinnedObservableId{ObservableMapper::to_id(obs), {q2min, q2max}},
167 kAddDeps
168 );
169 };
170
171 auto add_exp_unbinned = [&](const std::string& experiment, Observables obs) {
172 BinnedObservableId bid{ObservableMapper::to_id(obs), {0.0, 0.0}};
173 add_unbinned(obs);
174 selected_exp_obs.insert(ExperimentObs{experiment, bid});
175 };
176
177 auto add_exp_bin = [&](const std::string& experiment, Observables obs,
178 double q2min, double q2max) {
179 BinnedObservableId bid{ObservableMapper::to_id(obs), {q2min, q2max}};
180 add_bin(obs, q2min, q2max);
181 selected_exp_obs.insert(ExperimentObs{experiment, bid});
182 };
183
184 // add_exp_unbinned("DEFAULT", O::IA_B__KSTAR_GAMMA); // 001 AI_BKstargamma
185 // add_exp_unbinned("DEFAULT", O::BR_B_XS_GAMMA); // 002 BR_BXsgamma
186 // add_exp_unbinned("DEFAULT", O::BR_BS_MUMU_UNTAG); // 003 BRuntag_Bsmumu
187 // add_exp_unbinned("DEFAULT", O::BR_BS_EE_UNTAG); // 004 BRuntag_Bsee
188 // add_exp_bin("DEFAULT", O::BR_B__Xs_mu_mu, 1, 6); // 005 BR_BXsmumu_1_6
189 // add_exp_bin("DEFAULT", O::BR_B__Xs_mu_mu, 14.2, 22); // 006 BR_BXsmumu_14.2_22
190 // add_exp_bin("DEFAULT", O::BR_B__Xs_e_e, 1, 6); // 007 BR_BXsee_1_6
191 // add_exp_bin("DEFAULT", O::BR_B__Xs_e_e, 14.2, 22); // 008 BR_BXsee_14.2_22
192 // add_exp_unbinned("DEFAULT", O::BR_B0__KSTAR0_GAMMA); // 009 BR_B0Kstar0gamma
193 // add_exp_unbinned("DEFAULT", O::BR_B__KSTAR_GAMMA); // 010 BR_BKstargamma
194 // add_exp_bin("DEFAULT", O::DBR_DQ2_B__KSTAR_MU_MU, 1.1, 6); // 011 dGamma/dq2_BKstarmumu_1.1_6
195 // add_exp_bin("DEFAULT", O::DBR_DQ2_B__KSTAR_MU_MU, 15, 19); // 012 dGamma/dq2_BKstarmumu_15_19
196 // add_exp_bin("DEFAULT", O::R_1_B0__KSTAR0_L_L, 0.1, 1.1); // 013 R-1_B0Kstar0ll_0.1_1.1
197 // add_exp_bin("DEFAULT", O::R_1_B0__KSTAR0_L_L, 1.1, 6); // 014 R-1_B0Kstar0ll_1.1_6
198 // add_exp_bin("Belle", O::R_1_B0__KSTAR0_L_L, 0.045, 1.1); // 015 R-1_B0Kstar0ll_0.045_1.1_Belle
199 // add_exp_bin("Belle", O::R_1_B0__KSTAR0_L_L, 1.1, 6); // 016 R-1_B0Kstar0ll_1.1_6_Belle
200 // add_exp_bin("Belle", O::R_1_B0__KSTAR0_L_L, 15, 19); // 017 R-1_B0Kstar0ll_15_19_Belle
201 // add_exp_bin("DEFAULT", O::DBR_DQ2_B0__K0_MU_MU, 1.1, 6); // 018 dGamma/dq2_B0K0mumu_1.1_6
202 // add_exp_bin("DEFAULT", O::DBR_DQ2_B0__K0_MU_MU, 15, 22); // 019 dGamma/dq2_B0K0mumu_15_22
203 // add_exp_bin("DEFAULT", O::DBR_DQ2_B__K_MU_MU, 1.1, 6); // 020 dGamma/dq2_BKmumu_1.1_6
204 // add_exp_bin("DEFAULT", O::F_H_B__K_MU_MU, 1.1, 6); // 021 FH_BKmumu_1.1_6
205 // add_exp_bin("DEFAULT", O::DBR_DQ2_B__K_MU_MU, 15, 22); // 022 dGamma/dq2_BKmumu_15_22
206 // add_exp_bin("DEFAULT", O::F_H_B__K_MU_MU, 15, 22); // 023 FH_BKmumu_15_22
207 // add_exp_bin("DEFAULT", O::R_1_B__K_L_L, 0.1, 1.1); // 024 R-1_BKll_0.1_1.1
208 // add_exp_bin("DEFAULT", O::R_1_B__K_L_L, 1.1, 6); // 025 R-1_BKll_1.1_6
209 // add_exp_bin("DEFAULT", O::DBR_DQ2_BS__PHI_MU_MU, 0.1, 0.98); // 026 dGamma/dq2_Bsphimumu_0.1_0.98
210 // add_exp_bin("DEFAULT", O::F_L_BS_PHI_MU_MU, 0.1, 0.98); // 027 FL_Bsphimumu_0.1_0.98
211 // add_exp_bin("DEFAULT", O::S_3_BS_PHI_MU_MU, 0.1, 0.98); // 028 S3_Bsphimumu_0.1_0.98
212 // add_exp_bin("DEFAULT", O::S_4_BS_PHI_MU_MU, 0.1, 0.98); // 029 S4_Bsphimumu_0.1_0.98
213 // add_exp_bin("DEFAULT", O::S_7_BS_PHI_MU_MU, 0.1, 0.98); // 030 S7_Bsphimumu_0.1_0.98
214 // add_exp_bin("DEFAULT", O::DBR_DQ2_BS__PHI_MU_MU, 1.1, 2.5); // 031 dGamma/dq2_Bsphimumu_1.1_2.5
215 // add_exp_bin("DEFAULT", O::DBR_DQ2_BS__PHI_MU_MU, 2.5, 4); // 032 dGamma/dq2_Bsphimumu_2.5_4
216 // add_exp_bin("DEFAULT", O::F_L_BS_PHI_MU_MU, 1.1, 4); // 033 FL_Bsphimumu_1.1_4
217 // add_exp_bin("DEFAULT", O::S_3_BS_PHI_MU_MU, 1.1, 4); // 034 S3_Bsphimumu_1.1_4
218 // add_exp_bin("DEFAULT", O::S_4_BS_PHI_MU_MU, 1.1, 4); // 035 S4_Bsphimumu_1.1_4
219 // add_exp_bin("DEFAULT", O::S_7_BS_PHI_MU_MU, 1.1, 4); // 036 S7_Bsphimumu_1.1_4
220 // add_exp_bin("DEFAULT", O::DBR_DQ2_BS__PHI_MU_MU, 4, 6); // 037 dGamma/dq2_Bsphimumu_4_6
221 // add_exp_bin("DEFAULT", O::F_L_BS_PHI_MU_MU, 4, 6); // 038 FL_Bsphimumu_4_6
222 // add_exp_bin("DEFAULT", O::S_3_BS_PHI_MU_MU, 4, 6); // 039 S3_Bsphimumu_4_6
223 // add_exp_bin("DEFAULT", O::S_4_BS_PHI_MU_MU, 4, 6); // 040 S4_Bsphimumu_4_6
224 // add_exp_bin("DEFAULT", O::S_7_BS_PHI_MU_MU, 4, 6); // 041 S7_Bsphimumu_4_6
225 // add_exp_bin("DEFAULT", O::DBR_DQ2_BS__PHI_MU_MU, 15, 19); // 042 dGamma/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
226 // add_exp_bin("DEFAULT", O::F_L_BS_PHI_MU_MU, 15, 18.9); // 043 FL_Bsphimumu_15_18.9
227 // add_exp_bin("DEFAULT", O::S_3_BS_PHI_MU_MU, 15, 18.9); // 044 S3_Bsphimumu_15_18.9
228 // add_exp_bin("DEFAULT", O::S_4_BS_PHI_MU_MU, 15, 18.9); // 045 S4_Bsphimumu_15_18.9
229 // add_exp_bin("DEFAULT", O::S_7_BS_PHI_MU_MU, 15, 18.9); // 046 S7_Bsphimumu_15_18.9
230 // add_exp_bin("DEFAULT", O::DBR_DQ2_LAMBDA_B__LAMBDA_MU_MU, 15, 20); // 047 dGamma/dq2_LambdabLambdamumu_15_20
231 // add_exp_bin("DEFAULT", O::A_FB_L_LAMBDA_B__LAMBDA_MU_MU, 15, 20); // 048 AlFB_LambdabLambdamumu_15_20
232 // add_exp_bin("DEFAULT", O::A_FB_H_LAMBDA_B__LAMBDA_MU_MU, 15, 20); // 049 AhFB_LambdabLambdamumu_15_20
233 // add_exp_bin("DEFAULT", O::A_FB_LH_LAMBDA_B__LAMBDA_MU_MU, 15, 20); // 050 AlhFB_LambdabLambdamumu_15_20
234 // add_exp_bin("DEFAULT", O::F_L_LAMBDA_B__LAMBDA_MU_MU, 15, 20); // 051 FL_LambdabLambdamumu_15_20
235 // add_exp_bin("DEFAULT", O::F_L_B__KSTAR_MU_MU, 0.1, 0.98); // 052 FL_BKstarmumu_0.1_0.98
236 // add_exp_bin("DEFAULT", O::A_FB_B__KSTAR_MU_MU, 0.1, 0.98); // 053 AFB_BKstarmumu_0.1_0.98
237 // add_exp_bin("DEFAULT", O::S_3_B__KSTAR_MU_MU, 0.1, 0.98); // 054 S3_BKstarmumu_0.1_0.98
238 // add_exp_bin("DEFAULT", O::S_4_B__KSTAR_MU_MU, 0.1, 0.98); // 055 S4_BKstarmumu_0.1_0.98
239 // add_exp_bin("DEFAULT", O::S_5_B__KSTAR_MU_MU, 0.1, 0.98); // 056 S5_BKstarmumu_0.1_0.98
240 // add_exp_bin("DEFAULT", O::S_7_B__KSTAR_MU_MU, 0.1, 0.98); // 057 S7_BKstarmumu_0.1_0.98
241 // add_exp_bin("DEFAULT", O::S_8_B__KSTAR_MU_MU, 0.1, 0.98); // 058 S8_BKstarmumu_0.1_0.98
242 // add_exp_bin("DEFAULT", O::S_9_B__KSTAR_MU_MU, 0.1, 0.98); // 059 S9_BKstarmumu_0.1_0.98
243 // add_exp_bin("DEFAULT", O::F_L_B__KSTAR_MU_MU, 1.1, 2.5); // 060 FL_BKstarmumu_1.1_2.5
244 // add_exp_bin("DEFAULT", O::A_FB_B__KSTAR_MU_MU, 1.1, 2.5); // 061 AFB_BKstarmumu_1.1_2.5
245 // add_exp_bin("DEFAULT", O::S_3_B__KSTAR_MU_MU, 1.1, 2.5); // 062 S3_BKstarmumu_1.1_2.5
246 // add_exp_bin("DEFAULT", O::S_4_B__KSTAR_MU_MU, 1.1, 2.5); // 063 S4_BKstarmumu_1.1_2.5
247 // add_exp_bin("DEFAULT", O::S_5_B__KSTAR_MU_MU, 1.1, 2.5); // 064 S5_BKstarmumu_1.1_2.5
248 // add_exp_bin("DEFAULT", O::S_7_B__KSTAR_MU_MU, 1.1, 2.5); // 065 S7_BKstarmumu_1.1_2.5
249 // add_exp_bin("DEFAULT", O::S_8_B__KSTAR_MU_MU, 1.1, 2.5); // 066 S8_BKstarmumu_1.1_2.5
250 // add_exp_bin("DEFAULT", O::S_9_B__KSTAR_MU_MU, 1.1, 2.5); // 067 S9_BKstarmumu_1.1_2.5
251 // add_exp_bin("DEFAULT", O::F_L_B__KSTAR_MU_MU, 2.5, 4); // 068 FL_BKstarmumu_2.5_4
252 // add_exp_bin("DEFAULT", O::A_FB_B__KSTAR_MU_MU, 2.5, 4); // 069 AFB_BKstarmumu_2.5_4
253 // add_exp_bin("DEFAULT", O::S_3_B__KSTAR_MU_MU, 2.5, 4); // 070 S3_BKstarmumu_2.5_4
254 // add_exp_bin("DEFAULT", O::S_4_B__KSTAR_MU_MU, 2.5, 4); // 071 S4_BKstarmumu_2.5_4
255 // add_exp_bin("DEFAULT", O::S_5_B__KSTAR_MU_MU, 2.5, 4); // 072 S5_BKstarmumu_2.5_4
256 // add_exp_bin("DEFAULT", O::S_7_B__KSTAR_MU_MU, 2.5, 4); // 073 S7_BKstarmumu_2.5_4
257 // add_exp_bin("DEFAULT", O::S_8_B__KSTAR_MU_MU, 2.5, 4); // 074 S8_BKstarmumu_2.5_4
258 // add_exp_bin("DEFAULT", O::S_9_B__KSTAR_MU_MU, 2.5, 4); // 075 S9_BKstarmumu_2.5_4
259 // add_exp_bin("DEFAULT", O::F_L_B__KSTAR_MU_MU, 4, 6); // 076 FL_BKstarmumu_4_6
260 // add_exp_bin("DEFAULT", O::A_FB_B__KSTAR_MU_MU, 4, 6); // 077 AFB_BKstarmumu_4_6
261 // add_exp_bin("DEFAULT", O::S_3_B__KSTAR_MU_MU, 4, 6); // 078 S3_BKstarmumu_4_6
262 // add_exp_bin("DEFAULT", O::S_4_B__KSTAR_MU_MU, 4, 6); // 079 S4_BKstarmumu_4_6
263 // add_exp_bin("DEFAULT", O::S_5_B__KSTAR_MU_MU, 4, 6); // 080 S5_BKstarmumu_4_6
264 // add_exp_bin("DEFAULT", O::S_7_B__KSTAR_MU_MU, 4, 6); // 081 S7_BKstarmumu_4_6
265 // add_exp_bin("DEFAULT", O::S_8_B__KSTAR_MU_MU, 4, 6); // 082 S8_BKstarmumu_4_6
266 // add_exp_bin("DEFAULT", O::S_9_B__KSTAR_MU_MU, 4, 6); // 083 S9_BKstarmumu_4_6
267 // add_exp_bin("DEFAULT", O::F_L_B__KSTAR_MU_MU, 15, 17); // 084 FL_BKstarmumu_15_17
268 // add_exp_bin("DEFAULT", O::A_FB_B__KSTAR_MU_MU, 15, 17); // 085 AFB_BKstarmumu_15_17
269 // add_exp_bin("DEFAULT", O::S_3_B__KSTAR_MU_MU, 15, 17); // 086 S3_BKstarmumu_15_17
270 // add_exp_bin("DEFAULT", O::S_4_B__KSTAR_MU_MU, 15, 17); // 087 S4_BKstarmumu_15_17
271 // add_exp_bin("DEFAULT", O::S_5_B__KSTAR_MU_MU, 15, 17); // 088 S5_BKstarmumu_15_17
272 // add_exp_bin("DEFAULT", O::S_7_B__KSTAR_MU_MU, 15, 17); // 089 S7_BKstarmumu_15_17
273 // add_exp_bin("DEFAULT", O::S_8_B__KSTAR_MU_MU, 15, 17); // 090 S8_BKstarmumu_15_17
274 // add_exp_bin("DEFAULT", O::S_9_B__KSTAR_MU_MU, 15, 17); // 091 S9_BKstarmumu_15_17
275 // add_exp_bin("DEFAULT", O::F_L_B__KSTAR_MU_MU, 17, 19); // 092 FL_BKstarmumu_17_19
276 // add_exp_bin("DEFAULT", O::A_FB_B__KSTAR_MU_MU, 17, 19); // 093 AFB_BKstarmumu_17_19
277 // add_exp_bin("DEFAULT", O::S_3_B__KSTAR_MU_MU, 17, 19); // 094 S3_BKstarmumu_17_19
278 // add_exp_bin("DEFAULT", O::S_4_B__KSTAR_MU_MU, 17, 19); // 095 S4_BKstarmumu_17_19
279 // add_exp_bin("DEFAULT", O::S_5_B__KSTAR_MU_MU, 17, 19); // 096 S5_BKstarmumu_17_19
280 // add_exp_bin("DEFAULT", O::S_7_B__KSTAR_MU_MU, 17, 19); // 097 S7_BKstarmumu_17_19
281 // add_exp_bin("DEFAULT", O::S_8_B__KSTAR_MU_MU, 17, 19); // 098 S8_BKstarmumu_17_19
282 // add_exp_bin("DEFAULT", O::S_9_B__KSTAR_MU_MU, 17, 19); // 099 S9_BKstarmumu_17_19
283 // add_exp_bin("DEFAULT", O::R_1_B__KSTAR_L_L, 0.045, 6); // 100 R-1_BKstarll_0.045_6
284 // add_exp_bin("DEFAULT", O::R_1_B0__K0_L_L, 1.1, 6); // 101 R-1_B0K0ll_1.1_6
285 // add_exp_bin("Belle", O::R_1_B__K_L_L, 1, 6); // 102 R-1_BKll_1_6_Belle
286 // add_exp_bin("CMS", O::F_H_B__K_MU_MU, 1, 6); // 103 FH_BKmumu_1_6_CMS
287
288
289 // add_exp_bin("DEFAULT", O::DBR_DQ2_B0__KSTAR0_E_E, 0.0009, 1); // 104 dGamma/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
290 // add_exp_bin("DEFAULT", O::F_L_B0__KSTAR0_E_E, 0.0008, 0.257); // 105 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
291 // add_exp_bin("DEFAULT", O::A_T_RE_B0__KSTAR0_E_E, 0.0008, 0.257); // 106 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
292 // add_exp_bin("DEFAULT", O::A_T_2_B0__KSTAR0_E_E, 0.0008, 0.257); // 107 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
293 // add_exp_bin("CMS", O::DBR_DQ2_B__K_MU_MU, 0.1, 0.98); // 108 dGamma/dq2_BKmumu_0.1_0.98_CMS
294 // add_exp_bin("CMS", O::DBR_DQ2_B__K_MU_MU, 1.1, 2); // 109 dGamma/dq2_BKmumu_1.1_2_CMS
295 // add_exp_bin("CMS", O::DBR_DQ2_B__K_MU_MU, 2, 3); // 110 dGamma/dq2_BKmumu_2_3_CMS
296 // add_exp_bin("CMS", O::DBR_DQ2_B__K_MU_MU, 3, 4); // 111 dGamma/dq2_BKmumu_3_4_CMS
297 // add_exp_bin("CMS", O::DBR_DQ2_B__K_MU_MU, 4, 5); // 112 dGamma/dq2_BKmumu_4_5_CMS
298 // add_exp_bin("CMS", O::DBR_DQ2_B__K_MU_MU, 5, 6); // 113 dGamma/dq2_BKmumu_5_6_CMS
299 // add_exp_bin("CMS", O::DBR_DQ2_B__K_MU_MU, 14.82, 16); // 114 dGamma/dq2_BKmumu_14.82_16_CMS
300 // add_exp_bin("CMS", O::DBR_DQ2_B__K_MU_MU, 16, 17); // 115 dGamma/dq2_BKmumu_16_17_CMS
301 // add_exp_bin("CMS", O::DBR_DQ2_B__K_MU_MU, 17, 18); // 116 dGamma/dq2_BKmumu_17_18_CMS
302 // add_exp_bin("CMS", O::DBR_DQ2_B__K_MU_MU, 18, 19.24); // 117 dGamma/dq2_BKmumu_18_19.24_CMS
303 // add_exp_bin("CMS", O::DBR_DQ2_B__K_MU_MU, 19.24, 22.9); // 118 dGamma/dq2_BKmumu_19.24_22.9_CMS
304
305 //FIRST STOP
306 // add_exp_bin("CMS", O::R_1_B__K_L_L, 1.1, 6); // 119 R-1_BKll_1.1_6_CMS
307 add_exp_bin("CMS", O::F_L_B0__KSTAR0_MU_MU, 1.1, 2); // 120 FL_B0Kstar0mumu_1.1_2_CMS
308 add_exp_bin("CMS", O::P_1_B0__KSTAR0_MU_MU, 1.1, 2); // 121 P1_B0Kstar0mumu_1.1_2_CMS
309 add_exp_bin("CMS", O::P_2_B0__KSTAR0_MU_MU, 1.1, 2); // 122 P2_B0Kstar0mumu_1.1_2_CMS
310 add_exp_bin("CMS", O::P_3_B0__KSTAR0_MU_MU, 1.1, 2); // 123 P3_B0Kstar0mumu_1.1_2_CMS
311 add_exp_bin("CMS", O::P_PRIME_4_B0__KSTAR0_MU_MU, 1.1, 2); // 124 P4prime_B0Kstar0mumu_1.1_2_CMS
312 add_exp_bin("CMS", O::P_PRIME_5_B0__KSTAR0_MU_MU, 1.1, 2); // 125 P5prime_B0Kstar0mumu_1.1_2_CMS
313 add_exp_bin("CMS", O::P_PRIME_6_B0__KSTAR0_MU_MU, 1.1, 2); // 126 P6prime_B0Kstar0mumu_1.1_2_CMS
314 add_exp_bin("CMS", O::P_PRIME_8_B0__KSTAR0_MU_MU, 1.1, 2); // 127 P8prime_B0Kstar0mumu_1.1_2_CMS
315 add_exp_bin("CMS", O::F_L_B0__KSTAR0_MU_MU, 2, 4.3); // 128 FL_B0Kstar0mumu_2_4.3_CMS
316 add_exp_bin("CMS", O::P_1_B0__KSTAR0_MU_MU, 2, 4.3); // 129 P1_B0Kstar0mumu_2_4.3_CMS
317 add_exp_bin("CMS", O::P_2_B0__KSTAR0_MU_MU, 2, 4.3); // 130 P2_B0Kstar0mumu_2_4.3_CMS
318 add_exp_bin("CMS", O::P_3_B0__KSTAR0_MU_MU, 2, 4.3); // 131 P3_B0Kstar0mumu_2_4.3_CMS
319 add_exp_bin("CMS", O::P_PRIME_4_B0__KSTAR0_MU_MU, 2, 4.3); // 132 P4prime_B0Kstar0mumu_2_4.3_CMS
320 add_exp_bin("CMS", O::P_PRIME_5_B0__KSTAR0_MU_MU, 2, 4.3); // 133 P5prime_B0Kstar0mumu_2_4.3_CMS
321 add_exp_bin("CMS", O::P_PRIME_6_B0__KSTAR0_MU_MU, 2, 4.3); // 134 P6prime_B0Kstar0mumu_2_4.3_CMS
322 add_exp_bin("CMS", O::P_PRIME_8_B0__KSTAR0_MU_MU, 2, 4.3); // 135 P8prime_B0Kstar0mumu_2_4.3_CMS
323 add_exp_bin("CMS", O::F_L_B0__KSTAR0_MU_MU, 4.3, 6); // 136 FL_B0Kstar0mumu_4.3_6_CMS
324 add_exp_bin("CMS", O::P_1_B0__KSTAR0_MU_MU, 4.3, 6); // 137 P1_B0Kstar0mumu_4.3_6_CMS
325 add_exp_bin("CMS", O::P_2_B0__KSTAR0_MU_MU, 4.3, 6); // 138 P2_B0Kstar0mumu_4.3_6_CMS
326 add_exp_bin("CMS", O::P_3_B0__KSTAR0_MU_MU, 4.3, 6); // 139 P3_B0Kstar0mumu_4.3_6_CMS
327 add_exp_bin("CMS", O::P_PRIME_4_B0__KSTAR0_MU_MU, 4.3, 6); // 140 P4prime_B0Kstar0mumu_4.3_6_CMS
328 add_exp_bin("CMS", O::P_PRIME_5_B0__KSTAR0_MU_MU, 4.3, 6); // 141 P5prime_B0Kstar0mumu_4.3_6_CMS
329 add_exp_bin("CMS", O::P_PRIME_6_B0__KSTAR0_MU_MU, 4.3, 6); // 142 P6prime_B0Kstar0mumu_4.3_6_CMS
330 add_exp_bin("CMS", O::P_PRIME_8_B0__KSTAR0_MU_MU, 4.3, 6); // 143 P8prime_B0Kstar0mumu_4.3_6_CMS
331 add_exp_bin("CMS", O::F_L_B0__KSTAR0_MU_MU, 14.18, 16); // 144 FL_B0Kstar0mumu_14.18_16_CMS
332 add_exp_bin("CMS", O::P_1_B0__KSTAR0_MU_MU, 14.18, 16); // 145 P1_B0Kstar0mumu_14.18_16_CMS
333 add_exp_bin("CMS", O::P_2_B0__KSTAR0_MU_MU, 14.18, 16); // 146 P2_B0Kstar0mumu_14.18_16_CMS
334 add_exp_bin("CMS", O::P_3_B0__KSTAR0_MU_MU, 14.18, 16); // 147 P3_B0Kstar0mumu_14.18_16_CMS
335 add_exp_bin("CMS", O::P_PRIME_4_B0__KSTAR0_MU_MU, 14.18, 16); // 148 P4prime_B0Kstar0mumu_14.18_16_CMS
336 add_exp_bin("CMS", O::P_PRIME_5_B0__KSTAR0_MU_MU, 14.18, 16); // 149 P5prime_B0Kstar0mumu_14.18_16_CMS
337 add_exp_bin("CMS", O::P_PRIME_6_B0__KSTAR0_MU_MU, 14.18, 16); // 150 P6prime_B0Kstar0mumu_14.18_16_CMS
338 add_exp_bin("CMS", O::P_PRIME_8_B0__KSTAR0_MU_MU, 14.18, 16); // 151 P8prime_B0Kstar0mumu_14.18_16_CMS
339 // add_exp_bin("DEFAULT", O::DBR_DQ2_BS__PHI_E_E, 0.1, 1.1); // 152 dGamma/dq2_Bsphiee_0.1_1.1
340 // add_exp_bin("DEFAULT", O::DBR_DQ2_BS__PHI_E_E, 1.1, 6); // 153 dGamma/dq2_Bsphiee_1.1_6
341 // add_exp_bin("DEFAULT", O::DBR_DQ2_BS__PHI_E_E, 15, 19); // 154 dGamma/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
342 // add_exp_bin("DEFAULT", O::R_1_BS__PHI_L_L, 0.1, 1.1); // 155 R-1_Bsphill_0.1_1.1
343 // add_exp_bin("DEFAULT", O::R_1_BS__PHI_L_L, 1.1, 6); // 156 R-1_Bsphill_1.1_6
344 // add_exp_bin("DEFAULT", O::R_1_BS__PHI_L_L, 15, 19); // 157 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
345 // add_exp_bin("DEFAULT", O::F_L_BS_PHI_E_E, 0.0009, 0.2615); // 158 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
346 // add_exp_bin("DEFAULT", O::A_T_2_BS_PHI_E_E, 0.0009, 0.2615); // 159 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
347 // add_exp_bin("Belle", O::A_T_2_B0__KSTAR0_E_E, 0.0008, 1.12); // 160 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
348 // add_exp_bin("DEFAULT", O::F_L_B0__KSTAR0_E_E, 1.1, 6); // 161 FL_B0Kstar0ee_1.1_6
349 // add_exp_bin("DEFAULT", O::P_1_B0__KSTAR0_E_E, 1.1, 6); // 162 P1_B0Kstar0ee_1.1_6
350 // add_exp_bin("DEFAULT", O::P_2_B0__KSTAR0_E_E, 1.1, 6); // 163 P2_B0Kstar0ee_1.1_6
351 // add_exp_bin("DEFAULT", O::P_3_B0__KSTAR0_E_E, 1.1, 6); // 164 P3_B0Kstar0ee_1.1_6
352 // add_exp_bin("DEFAULT", O::P_PRIME_4_B0__KSTAR0_E_E, 1.1, 6); // 165 P4prime_B0Kstar0ee_1.1_6
353 // add_exp_bin("DEFAULT", O::P_PRIME_5_B0__KSTAR0_E_E, 1.1, 6); // 166 P5prime_B0Kstar0ee_1.1_6
354 // add_exp_bin("DEFAULT", O::P_PRIME_6_B0__KSTAR0_E_E, 1.1, 6); // 167 P6prime_B0Kstar0ee_1.1_6
355 // add_exp_bin("DEFAULT", O::P_PRIME_8_B0__KSTAR0_E_E, 1.1, 6); // 168 P8prime_B0Kstar0ee_1.1_6
356 // add_exp_bin("LHCb2025c2", O::F_L_B0__KSTAR0_MU_MU, 0.06, 0.98); // 169 FL_B0Kstar0mumu_0.06_0.98_LHCb2025c2
357 // add_exp_bin("LHCb2025c2", O::S_2S_B0__KSTAR0_MU_MU, 0.06, 0.98); // 170 S2s_B0Kstar0mumu_0.06_0.98_LHCb2025c2
358 // add_exp_bin("LHCb2025c2", O::S_1C_B0__KSTAR0_MU_MU, 0.06, 0.98); // 171 S1c_B0Kstar0mumu_0.06_0.98_LHCb2025c2
359 // add_exp_bin("LHCb2025c2", O::P_1_B0__KSTAR0_MU_MU, 0.06, 0.98); // 172 P1_B0Kstar0mumu_0.06_0.98_LHCb2025c2
360 // add_exp_bin("LHCb2025c2", O::P_2_B0__KSTAR0_MU_MU, 0.06, 0.98); // 173 P2_B0Kstar0mumu_0.06_0.98_LHCb2025c2
361 // add_exp_bin("LHCb2025c2", O::P_3_B0__KSTAR0_MU_MU, 0.06, 0.98); // 174 P3_B0Kstar0mumu_0.06_0.98_LHCb2025c2
362 // add_exp_bin("LHCb2025c2", O::P_PRIME_4_B0__KSTAR0_MU_MU, 0.06, 0.98); // 175 P4prime_B0Kstar0mumu_0.06_0.98_LHCb2025c2
363 // add_exp_bin("LHCb2025c2", O::P_PRIME_5_B0__KSTAR0_MU_MU, 0.06, 0.98); // 176 P5prime_B0Kstar0mumu_0.06_0.98_LHCb2025c2
364 // add_exp_bin("LHCb2025c2", O::P_PRIME_6_B0__KSTAR0_MU_MU, 0.06, 0.98); // 177 P6prime_B0Kstar0mumu_0.06_0.98_LHCb2025c2
365 // add_exp_bin("LHCb2025c2", O::P_PRIME_8_B0__KSTAR0_MU_MU, 0.06, 0.98); // 178 P8prime_B0Kstar0mumu_0.06_0.98_LHCb2025c2
366 // add_exp_bin("LHCb2025c2", O::S_6C_B0__KSTAR0_MU_MU, 0.06, 0.98); // 179 S6c_B0Kstar0mumu_0.06_0.98_LHCb2025c2
367 // add_exp_bin("LHCb2025c2", O::DBR_DQ2_B0__KSTAR0_MU_MU, 0.06, 0.98); // 180 dGamma/dq2_B0Kstar0mumu_0.06_0.98_LHCb2025c2
368 // add_exp_bin("LHCb2025c2", O::F_L_B0__KSTAR0_MU_MU, 1.1, 2.5); // 181 FL_B0Kstar0mumu_1.1_2.5_LHCb2025c2
369 // add_exp_bin("LHCb2025c2", O::S_1C_B0__KSTAR0_MU_MU, 1.1, 2.5); // 182 S1c_B0Kstar0mumu_1.1_2.5_LHCb2025c2
370 // add_exp_bin("LHCb2025c2", O::P_1_B0__KSTAR0_MU_MU, 1.1, 2.5); // 183 P1_B0Kstar0mumu_1.1_2.5_LHCb2025c2
371 // add_exp_bin("LHCb2025c2", O::P_2_B0__KSTAR0_MU_MU, 1.1, 2.5); // 184 P2_B0Kstar0mumu_1.1_2.5_LHCb2025c2
372 // add_exp_bin("LHCb2025c2", O::P_3_B0__KSTAR0_MU_MU, 1.1, 2.5); // 185 P3_B0Kstar0mumu_1.1_2.5_LHCb2025c2
373 // add_exp_bin("LHCb2025c2", O::P_PRIME_4_B0__KSTAR0_MU_MU, 1.1, 2.5); // 186 P4prime_B0Kstar0mumu_1.1_2.5_LHCb2025c2
374 // add_exp_bin("LHCb2025c2", O::P_PRIME_5_B0__KSTAR0_MU_MU, 1.1, 2.5); // 187 P5prime_B0Kstar0mumu_1.1_2.5_LHCb2025c2
375 // add_exp_bin("LHCb2025c2", O::P_PRIME_6_B0__KSTAR0_MU_MU, 1.1, 2.5); // 188 P6prime_B0Kstar0mumu_1.1_2.5_LHCb2025c2
376 // add_exp_bin("LHCb2025c2", O::P_PRIME_8_B0__KSTAR0_MU_MU, 1.1, 2.5); // 189 P8prime_B0Kstar0mumu_1.1_2.5_LHCb2025c2
377 // add_exp_bin("LHCb2025c2", O::DBR_DQ2_B0__KSTAR0_MU_MU, 1.1, 2.5); // 190 dGamma/dq2_B0Kstar0mumu_1.1_2.5_LHCb2025c2
378 // add_exp_bin("LHCb2025c2", O::F_L_B0__KSTAR0_MU_MU, 2.5, 4); // 191 FL_B0Kstar0mumu_2.5_4.0_LHCb2025c2
379 // add_exp_bin("LHCb2025c2", O::S_1C_B0__KSTAR0_MU_MU, 2.5, 4); // 192 S1c_B0Kstar0mumu_2.5_4.0_LHCb2025c2
380 // add_exp_bin("LHCb2025c2", O::P_1_B0__KSTAR0_MU_MU, 2.5, 4); // 193 P1_B0Kstar0mumu_2.5_4.0_LHCb2025c2
381 // add_exp_bin("LHCb2025c2", O::P_2_B0__KSTAR0_MU_MU, 2.5, 4); // 194 P2_B0Kstar0mumu_2.5_4.0_LHCb2025c2
382 // add_exp_bin("LHCb2025c2", O::P_3_B0__KSTAR0_MU_MU, 2.5, 4); // 195 P3_B0Kstar0mumu_2.5_4.0_LHCb2025c2
383 // add_exp_bin("LHCb2025c2", O::P_PRIME_4_B0__KSTAR0_MU_MU, 2.5, 4); // 196 P4prime_B0Kstar0mumu_2.5_4.0_LHCb2025c2
384 // add_exp_bin("LHCb2025c2", O::P_PRIME_5_B0__KSTAR0_MU_MU, 2.5, 4); // 197 P5prime_B0Kstar0mumu_2.5_4.0_LHCb2025c2
385 // add_exp_bin("LHCb2025c2", O::P_PRIME_6_B0__KSTAR0_MU_MU, 2.5, 4); // 198 P6prime_B0Kstar0mumu_2.5_4.0_LHCb2025c2
386 // add_exp_bin("LHCb2025c2", O::P_PRIME_8_B0__KSTAR0_MU_MU, 2.5, 4); // 199 P8prime_B0Kstar0mumu_2.5_4.0_LHCb2025c2
387 // add_exp_bin("LHCb2025c2", O::DBR_DQ2_B0__KSTAR0_MU_MU, 2.5, 4); // 200 dGamma/dq2_B0Kstar0mumu_2.5_4.0_LHCb2025c2
388 // add_exp_bin("LHCb2025c2", O::F_L_B0__KSTAR0_MU_MU, 4, 6); // 201 FL_B0Kstar0mumu_4.0_6.0_LHCb2025c2
389 // add_exp_bin("LHCb2025c2", O::S_1C_B0__KSTAR0_MU_MU, 4, 6); // 202 S1c_B0Kstar0mumu_4.0_6.0_LHCb2025c2
390 // add_exp_bin("LHCb2025c2", O::P_1_B0__KSTAR0_MU_MU, 4, 6); // 203 P1_B0Kstar0mumu_4.0_6.0_LHCb2025c2
391 // add_exp_bin("LHCb2025c2", O::P_2_B0__KSTAR0_MU_MU, 4, 6); // 204 P2_B0Kstar0mumu_4.0_6.0_LHCb2025c2
392 // add_exp_bin("LHCb2025c2", O::P_3_B0__KSTAR0_MU_MU, 4, 6); // 205 P3_B0Kstar0mumu_4.0_6.0_LHCb2025c2
393 // add_exp_bin("LHCb2025c2", O::P_PRIME_4_B0__KSTAR0_MU_MU, 4, 6); // 206 P4prime_B0Kstar0mumu_4.0_6.0_LHCb2025c2
394 // add_exp_bin("LHCb2025c2", O::P_PRIME_5_B0__KSTAR0_MU_MU, 4, 6); // 207 P5prime_B0Kstar0mumu_4.0_6.0_LHCb2025c2
395 // add_exp_bin("LHCb2025c2", O::P_PRIME_6_B0__KSTAR0_MU_MU, 4, 6); // 208 P6prime_B0Kstar0mumu_4.0_6.0_LHCb2025c2
396 // add_exp_bin("LHCb2025c2", O::P_PRIME_8_B0__KSTAR0_MU_MU, 4, 6); // 209 P8prime_B0Kstar0mumu_4.0_6.0_LHCb2025c2
397 // add_exp_bin("LHCb2025c2", O::DBR_DQ2_B0__KSTAR0_MU_MU, 4, 6); // 210 dGamma/dq2_B0Kstar0mumu_4.0_6.0_LHCb2025c2
398 // add_exp_bin("LHCb2025c2", O::F_L_B0__KSTAR0_MU_MU, 15, 17); // 211 FL_B0Kstar0mumu_15.0_17.0_LHCb2025c2
399 // add_exp_bin("LHCb2025c2", O::S_1C_B0__KSTAR0_MU_MU, 15, 17); // 212 S1c_B0Kstar0mumu_15.0_17.0_LHCb2025c2
400 // add_exp_bin("LHCb2025c2", O::P_1_B0__KSTAR0_MU_MU, 15, 17); // 213 P1_B0Kstar0mumu_15.0_17.0_LHCb2025c2
401 // add_exp_bin("LHCb2025c2", O::P_2_B0__KSTAR0_MU_MU, 15, 17); // 214 P2_B0Kstar0mumu_15.0_17.0_LHCb2025c2
402 // add_exp_bin("LHCb2025c2", O::P_3_B0__KSTAR0_MU_MU, 15, 17); // 215 P3_B0Kstar0mumu_15.0_17.0_LHCb2025c2
403 // add_exp_bin("LHCb2025c2", O::P_PRIME_4_B0__KSTAR0_MU_MU, 15, 17); // 216 P4prime_B0Kstar0mumu_15.0_17.0_LHCb2025c2
404 // add_exp_bin("LHCb2025c2", O::P_PRIME_5_B0__KSTAR0_MU_MU, 15, 17); // 217 P5prime_B0Kstar0mumu_15.0_17.0_LHCb2025c2
405 // add_exp_bin("LHCb2025c2", O::P_PRIME_6_B0__KSTAR0_MU_MU, 15, 17); // 218 P6prime_B0Kstar0mumu_15.0_17.0_LHCb2025c2
406 // add_exp_bin("LHCb2025c2", O::P_PRIME_8_B0__KSTAR0_MU_MU, 15, 17); // 219 P8prime_B0Kstar0mumu_15.0_17.0_LHCb2025c2
407 // add_exp_bin("LHCb2025c2", O::DBR_DQ2_B0__KSTAR0_MU_MU, 15, 17); // 220 dGamma/dq2_B0Kstar0mumu_15.0_17.0_LHCb2025c2
408 // add_exp_bin("LHCb2025c2", O::F_L_B0__KSTAR0_MU_MU, 17, 19); // 221 FL_B0Kstar0mumu_17.0_19.0_LHCb2025c2
409 // add_exp_bin("LHCb2025c2", O::S_1C_B0__KSTAR0_MU_MU, 17, 19); // 222 S1c_B0Kstar0mumu_17.0_19.0_LHCb2025c2
410 // add_exp_bin("LHCb2025c2", O::P_1_B0__KSTAR0_MU_MU, 17, 19); // 223 P1_B0Kstar0mumu_17.0_19.0_LHCb2025c2
411 // add_exp_bin("LHCb2025c2", O::P_2_B0__KSTAR0_MU_MU, 17, 19); // 224 P2_B0Kstar0mumu_17.0_19.0_LHCb2025c2
412 // add_exp_bin("LHCb2025c2", O::P_3_B0__KSTAR0_MU_MU, 17, 19); // 225 P3_B0Kstar0mumu_17.0_19.0_LHCb2025c2
413 // add_exp_bin("LHCb2025c2", O::P_PRIME_4_B0__KSTAR0_MU_MU, 17, 19); // 226 P4prime_B0Kstar0mumu_17.0_19.0_LHCb2025c2
414 // add_exp_bin("LHCb2025c2", O::P_PRIME_5_B0__KSTAR0_MU_MU, 17, 19); // 227 P5prime_B0Kstar0mumu_17.0_19.0_LHCb2025c2
415 // add_exp_bin("LHCb2025c2", O::P_PRIME_6_B0__KSTAR0_MU_MU, 17, 19); // 228 P6prime_B0Kstar0mumu_17.0_19.0_LHCb2025c2
416 // add_exp_bin("LHCb2025c2", O::P_PRIME_8_B0__KSTAR0_MU_MU, 17, 19); // 229 P8prime_B0Kstar0mumu_17.0_19.0_LHCb2025c2
417 // add_exp_bin("LHCb2025c2", O::DBR_DQ2_B0__KSTAR0_MU_MU, 17, 19); // 230 dGamma/dq2_B0Kstar0mumu_17.0_19.0_LHCb2025c2
418
419 std::shared_ptr<IStatParamOptimizerProxy> spop = std::make_shared<StatParamOptimizerProxy>();
420 auto model = std::make_shared<ObservableInterfaceProxy>(oint, spop);
421
422 // LOG_INFO(oint->compute_observable(Observables::IA_B__KSTAR_GAMMA)[0].value);
423 // LOG_INFO(oint->get_exp_value(Observables::IA_B__KSTAR_GAMMA));
424 // LOG_INFO(oint->compute_observable(Observables::BR_B_XS_GAMMA)[0].value);
425 // LOG_INFO(oint->compute_observable(Observables::BR_BS_EE_UNTAG)[0].value);
426 // LOG_INFO(oint->compute_observable(Observables::BR_BS_MUMU_UNTAG)[0].value);
427 // LOG_INFO(oint->compute_observable(Observables::BR_B__Xs_mu_mu)[0].value);
428 // LOG_INFO(oint->compute_observable(Observables::BR_B__Xs_mu_mu)[1].value);
429 // LOG_INFO(oint->compute_observable(Observables::BR_B__Xs_e_e)[0].value);
430 // LOG_INFO(oint->compute_observable(Observables::BR_B__Xs_e_e)[1].value);
431 // LOG_INFO(oint->compute_observable(Observables::BR_B0__KSTAR0_GAMMA)[0].value);
432 // LOG_INFO(oint->compute_observable(Observables::BR_B__KSTAR_GAMMA)[0].value);
433 // LOG_INFO(oint->compute_observable(Observables::DBR_DQ2_B__KSTAR_MU_MU)[0].value);
434 // LOG_INFO(oint->compute_observable(Observables::DBR_DQ2_B__KSTAR_MU_MU)[1].value);
435
436 // exit(0);
437
438 StatisticConfig config;
440 ParamId{ParameterType::WILSON, "SCALE_NUIS", 1}
442
444 ParamId{ParameterType::WILSON, "SCALE_NUIS", 2}
449 config.advanced.MLE_max_iter = 120000;
450 config.advanced.MLE_tol = 0.01;
451 config.advanced.MLE_trace_first_evals = true;
452 config.advanced.MLE_trace_max_evals = 20;
454 config.MC_draws = 100;
456 config.print_mc_config = false;
457 config.MC_threads=30;
458 const std::string had_bsm_block =
460 + "__BSM_INTERMEDIATE";
461
462 const std::string had_bsm_block2 =
464 + "__BSM_INTERMEDIATE";
465
466 const std::string had_bsm_block3 =
468 + "__BSM_INTERMEDIATE";
469
470
471 std::vector<ParamId> p_specs = {
474 // ParamId{ParameterType::WILSON, had_bsm_block, WCoefMapper::flha_full(WCoef::C7, QCDOrder::LO, ContributionType::BSM)},
475 // ParamId{ParameterType::WILSON, had_bsm_block, WCoefMapper::flha_full(WCoef::C8, QCDOrder::LO, ContributionType::BSM)},
476 // ParamId{ParameterType::WILSON, had_bsm_block2, WCoefMapper::flha_full(WCoef::CQ1, QCDOrder::LO, ContributionType::BSM)},
477 // ParamId{ParameterType::WILSON, had_bsm_block2, WCoefMapper::flha_full(WCoef::CQ2, QCDOrder::LO, ContributionType::BSM)},
478 // ParamId{ParameterType::WILSON, had_bsm_block3, WCoefMapper::flha_full(WCoef::CP9, QCDOrder::LO, ContributionType::BSM)},
479 // ParamId{ParameterType::WILSON, had_bsm_block3, WCoefMapper::flha_full(WCoef::CP10, QCDOrder::LO, ContributionType::BSM)},
480 };
481
482
483 std::shared_ptr<INuisancePathsProvider> npp = std::make_shared<DefaultNuisancePathsProvider>();
484
485 StatisticManager stat(
486 config,
487 model,
488 std::make_shared<StatCorrelationProxy>(),
489 std::make_shared<StatParameterProxy>(),
490 std::make_shared<StatParamSourcesProxy>(),
491 std::make_shared<StatDependencyPruner>(),
492 std::make_shared<NuisanceReader>(npp),
493 spop
494 );
495 // std::set<std::string> exp = {"CMS", "LHCb2025c2"};
496 std::set<std::string> exp = {"DEFAULT", "Belle", "CMS", "LHCb2025c2"};
497 // std::set<std::string> exp = {"LHCb2020"};
498 // std::set<std::string> exp = {"LHCb2025c2"};
499 // std::set<std::string> exp = {"CMS"};
500 // std::set<std::string> exp = {"CMS", "LHCb2020"};
501 stat.select_experiments(exp);
502 stat.select_experiment_observables(selected_exp_obs);
503
504 std::map<std::string, std::size_t> selected_exp_counts;
505 for (const auto& exp_obs : selected_exp_obs) {
506 selected_exp_counts[exp_obs.experiment]++;
507 }
508 std::cout << "[FIT] Requested explicit experimental observables = "
509 << selected_exp_obs.size() << "\n";
510 for (const auto& [experiment, count] : selected_exp_counts) {
511 std::cout << "[FIT] " << experiment << " : " << count << "\n";
512 }
513
514 auto t2 = std::chrono::steady_clock::now();
515 FitResultWithMaps fit = stat.compute_MLE(p_specs);
516 auto t3 = std::chrono::steady_clock::now();
517
518 std::cout << "\nMLE done in "
519 << std::chrono::duration_cast<std::chrono::milliseconds>(t3 - t2).count()
520 << " ms\n\n";
521
522 if (!fit.fit_ok) {
523 std::cerr << "[ERROR] MLE fit failed.\n";
524 return 5;
525 }
526
527 print_fit_result(fit);
528 save_bestfit_csv("bestfit.csv", fit);
529 std::cout << "[INFO] Wrote bestfit.csv\n";
530
531 const ParamId p1 = p_specs[0];
532 const ParamId p2 = p_specs[1];
533
534 // std::array<double, 4> bounds = {-20, 20, -20, 20};
535 std::array<double, 4> bounds = {
536 -3.0, 2.0,
537 -2.5, 2.5
538 };
539
540 auto trace = std::make_shared<std::ofstream>("contour_trace.csv");
541 (*trace) << "type,level,path_id,point_id,x,y,n_paths,n_points,elapsed_s,message\n";
542
543 ContourOptions opt;
548 opt.resolution = 50;
549
550 opt.on_progress = [trace](const ContourProgressEvent& ev) {
551 if (!trace || !(*trace)) return;
552
553 const char* type_str = "";
554 switch (ev.type) {
555 case ContourProgressEventType::Started: type_str = "started"; break;
556 case ContourProgressEventType::PathPoint: type_str = "point"; break;
557 case ContourProgressEventType::PathFinished: type_str = "path_finished"; break;
558 case ContourProgressEventType::Finished: type_str = "finished"; break;
559 case ContourProgressEventType::Failed: type_str = "failed"; break;
560 }
561
562 (*trace)
563 << type_str << ","
564 << ev.level << ","
565 << ev.path_id << ","
566 << ev.point_id << ","
567 << ev.x << ","
568 << ev.y << ","
569 << ev.n_paths << ","
570 << ev.n_points << ","
571 << ev.elapsed_seconds << ","
572 << "\"" << ev.message << "\"\n";
573
574 trace->flush();
575 };
576
577 auto t4 = std::chrono::steady_clock::now();
578 auto c68 = stat.confidence_contour(p1, p2, 1, bounds, opt);
579 auto t5 = std::chrono::steady_clock::now();
580
581 std::cout << "\nContour done in "
582 << std::chrono::duration_cast<std::chrono::milliseconds>(t5 - t4).count()
583 << " ms\n\n";
584
585 std::cout << "[INFO] contour 68% paths = " << c68.level << "\n";
586
587 save_contour_csv(
588 "contours_BKsmumu_ang.csv",
591 c68.paths,
592 {}
593 );
594 std::cout << "[INFO] Wrote contours.csv\n";
595
596 return 0;
597}
Facade combining block existence/logging (BlockProvider) and block listing (APIAdapter).
@ AMS
Adaptive/marching-squares contour extractor.
@ MINUIT
Minuit contour extractor.
@ FREE_PROJECTION
Fix selected axes and profile all remaining parameters.
@ Started
Contour computation has started.
@ PathPoint
A new point on a contour path is available.
@ Finished
Contour computation finished normally.
@ PathFinished
A contour path has been completed.
@ Failed
Contour computation failed and no valid result was produced.
Default nuisance-configuration path provider.
Observables
Definition GeneralEnum.h:4
@ B__Kstar_l_l
@ Bs__phi_l_l
@ B__Kstar_gamma
@ FLAT
Uniform (flat) marginal on a finite interval.
Concrete reader for nuisance-parameter definition files.
Adapter from ObservableInterface to the statistical model interface.
High-level, user-facing entry point to compute flavor observables.
Concrete statistical proxy forwarding correlation queries to CorrelationProvider.
Statistics-layer adapter over the core DependencyPruner service.
Statistics-layer adapter for retrieving leaf parameter sources.
Statistics-layer proxy for read-only access to parameters and observables.
High-level orchestration of statistical uncertainty propagation, likelihood construction and fit scan...
@ CHI2_MC_COVARIANCE
Fast chi-square likelihood using MC theory covariance plus experimental covariance.
static IdOf< ObservableTag > to_id(Observables e)
Converts an enum value to an IdOf<Tag>.
static std::string str(const WGroupId &gid, ScaleType s, WilsonBasis b=WilsonBasis::B_STANDARD)
Builds a composite block name using a WGroupId, scale and basis.
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.
Coordinates statistical inputs, nuisance distributions, MLE fits and contour/scan computations.
void select_experiments(const std::set< std::string > &experiments)
Restricts subsequent statistics to the provided set of experiment names.
void select_experiment_observables(const std::set< ExperimentObs > &observables)
Restricts subsequent statistics to an explicit list of experimental measurements.
Contour confidence_contour(ParamId p1, ParamId p2, double z, std::array< double, 4 > bounds, ContourOptions options)
Computes a two-dimensional confidence contour for the last successful MLE.
FitResultWithMaps compute_MLE(const std::vector< ParamId > &p_specs)
Computes the maximum-likelihood fit for a selected set of fit parameters.
static LhaID flha_full(WCoef e, QCDOrder q, ContributionType c)
std::vector< Point > Path
Definition contour.h:16
std::string to_string_any(const T &x)
double chi2_covariance_ridge_abs
Absolute diagonal ridge used before inverting chi-square covariance matrices.
bool MLE_trace_first_evals
Enables debug tracing of the first likelihood evaluations.
double MLE_tol
Minimizer tolerance passed to the backend.
int nuisance_sensitivity_contexts
Number of contexts tested by sensitivity pruning; negative disables the check.
double chi2_covariance_ridge_rel
Relative diagonal ridge used before inverting chi-square covariance matrices.
std::map< ParamId, MarginalType > override_nuisance_marginals
Per-parameter overrides for nuisance marginal laws.
std::size_t MLE_max_iter
Maximum number of minimizer function calls/iterations.
double nuisance_sensitivity_abs_cutoff
Absolute observable shift required to keep a nuisance.
std::size_t MLE_trace_max_evals
Maximum number of likelihood evaluations printed when tracing is enabled.
StatisticLikelihoodMode likelihood_mode
Likelihood mode used by compute_MLE().
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
Runtime options controlling 2D contour computation.
Definition Fit.h:93
ContourProgressCallback on_progress
Definition Fit.h:110
std::size_t resolution
Definition Fit.h:107
ContourAlgorithm primary_contour_method
Definition Fit.h:101
ProfilingMethod profiling_method
Definition Fit.h:95
ProfileBackend profile_backend
Definition Fit.h:98
std::optional< ContourAlgorithm > fallback_contour_method
Definition Fit.h:104
Payload passed to contour progress callbacks.
User-facing MLE result keyed by physics parameter identifiers.
std::map< ParamId, double > p_hat_std
Profiled standard deviations of fitted parameters.
double ell_hat
Minimum negative log-likelihood value.
bool fit_ok
True when the fit returned a usable parameter estimate.
Configuration object controlling model, input flags and optional MARTY resources.
Definition Config.h:24
Model model
Current model.
Definition Config.h:33
Composite identifier for a single parameter.
Definition ParamID.h:57
bool print_mc_config
Print nuisance candidates and retained MC marginal configuration.
AdvancedStatisticConfig advanced
Advanced fit/pruning/covariance configuration.
std::size_t MC_draws
Number of accepted MC draws used for uncertainty propagation.
std::size_t MC_threads
Number of worker threads used by MC propagation.