Hyperiso 1.0.3
Modular flavour-physics calculations, Wilson coefficients and statistical inference
Loading...
Searching...
No Matches
BDlnuDecay.cpp
Go to the documentation of this file.
1#include "BDlnuDecay.h"
2
4 if (cfg.charge != charge) {
5 cfg.charge = charge;
7 }
8}
9
12
13 cache.G_F = (*p)(ParamId{ParameterType::SM, "SMINPUTS", 2}, DataType::VALUE);
14 cache.m_e = (*p)(ParamId{ParameterType::SM, "MASS", 11}, DataType::VALUE);
15 cache.m_tau = (*p)(ParamId{ParameterType::SM, "MASS", 15}, DataType::VALUE);
16 cache.V11 = (*p)(ParamId{ParameterType::DECAY, "B_Dlnu", 1}, DataType::VALUE);
17 cache.rho_D2 = (*p)(ParamId{ParameterType::DECAY, "B_Dlnu", 2}, DataType::VALUE);
18 cache.Delta= (*p)(ParamId{ParameterType::DECAY, "B_Dlnu", 3}, DataType::VALUE);
19
21}
22
27 cache.C_V_flag = !fpeq(std::abs(cache.C_V), 0.0);
28 cache.C_S_flag = !fpeq(std::abs(cache.C_S), 0.0);
29 cache.C_T_flag = !fpeq(std::abs(cache.C_T), 0.0);
30}
31
33 cache.m_B = (*p)(ParamId{ParameterType::FLAVOR, "FMASS", cfg.charge == BDlnuConfig::B_Charge::B_0 ? 511 : 521}, DataType::VALUE);
34 cache.m_D = (*p)(ParamId{ParameterType::FLAVOR, "FMASS", cfg.charge == BDlnuConfig::B_Charge::B_0 ? 411 : 421}, DataType::VALUE);
35 cache.tau_B = (*p)(ParamId{ParameterType::FLAVOR, "FLIFE", cfg.charge == BDlnuConfig::B_Charge::B_0 ? 511 : 521}, DataType::VALUE);
36 cache.r_D = cache.m_D / cache.m_B;
37 cache.r_e = cache.m_e / cache.m_B;
38 cache.r_tau = cache.m_tau / cache.m_B;
39 double m_b = (*iobs_qcdp)(MassConfig(5, cache.m_B, MassType::MSBAR, MassType::POLE));
40 double m_c = (*iobs_qcdp)(MassConfig(4, cache.m_B, MassType::MSBAR, MassType::POLE));
41 cache.r_qp = (m_b + m_c) / cache.m_B;
42 cache.r_qm = (m_b - m_c) / cache.m_B;
43 cache.w_e = w_max(cache.r_D, cache.r_e);
44 cache.w_tau = w_max(cache.r_D, cache.r_tau);
45 double V_cb2 = std::pow(std::abs((*p)(ParamId{ParameterType::SM, "VCKM", {1, 2}}, DataType::VALUE)), 2);
46 cache.BR_pref = std::pow(cache.G_F * cache.m_B * cache.m_B * cache.V11, 2) * cache.m_D * cache.tau_B * V_cb2 / (96 * PI3 * HBAR);
47 cache.Gamma_p = 0.0;
48 cache.Gamma_m = 0.0;
49}
50
51double BDlnuDecay::t(double w) {
52 return 1 + cache.r_D * (cache.r_D - 2 * w);
53}
54
55double BDlnuDecay::lambda_D(double w) {
56 return 4 * cache.r_D * cache.r_D * (w * w - 1);
57}
58
59double BDlnuDecay::x_l(double rl, double w) {
60 return rl * rl / t(w);
61}
62
63double BDlnuDecay::phi(double rl, double w) {
64 return t(w) * std::sqrt(lambda_D(w)) * std::pow(1 - x_l(rl, w), 2);
65}
66
67double BDlnuDecay::w_max(double rD, double rl) {
68 return (1 + rD * rD - rl * rl) / (2 * rD);
69}
70
71double BDlnuDecay::V_1(double w) {
72 double z = (std::sqrt(1 + w) - RT2) / (std::sqrt(1 + w) + RT2);
73 return 1 + z * (-8 * cache.rho_D2 + z * ((51 * cache.rho_D2 - 10) - z * (252 * cache.rho_D2 - 84)));
74}
75
76double BDlnuDecay::S_1(double w) {
77 double u = w - 1;
78 return V_1(w) * (1 + cache.Delta * (-0.019 + u * (0.041 - 0.015 * u)));
79}
80
81double BDlnuDecay::H_V0(double w) {
82 return std::sqrt(cache.r_D * (w * w - 1) / t(w)) * (1 + cache.r_D) * V_1(w);
83}
84
85double BDlnuDecay::H_Vt(double w) {
86 return std::sqrt(cache.r_D / t(w)) * (1 - cache.r_D) * (1 + w) * S_1(w);
87}
88
89double BDlnuDecay::H_S(double w) {
90 return std::sqrt(cache.r_D) * (1 - cache.r_D) * (1 + w) * S_1(w) / cache.r_qm;
91}
92
93double BDlnuDecay::H_T(double w) {
94 double a = std::sqrt(cache.r_D * (w * w - 1)) * cache.r_qp / (t(w) * (1 + cache.r_D));
95 return -a * (std::pow(1 + cache.r_D, 2) * V_1(w) - 2 * cache.r_D * (1 + w) * S_1(w));
96}
97
98double BDlnuDecay::F_V0_1(double rl, double w_m) {
99 if (!cache.C_V_flag) return 0;
100
101 auto f = [this, rl] (double w) {
102 return phi(rl, w) * std::pow(H_V0(w), 2);
103 };
104
105 return integrate(f, 1, w_m, 1e-3);
106}
107
108double BDlnuDecay::F_V0_2(double rl, double w_m) {
109 if (!cache.C_V_flag) return 0;
110
111 auto f = [this, rl] (double w) {
112 return phi(rl, w) * x_l(rl, w) * std::pow(H_V0(w), 2);
113 };
114
115 return integrate(f, 1, w_m, 1e-3);
116}
117
118double BDlnuDecay::F_Vt(double rl, double w_m) {
119 if (!cache.C_V_flag) return 0;
120
121 auto f = [this, rl] (double w) {
122 return phi(rl, w) * x_l(rl, w) * std::pow(H_Vt(w), 2);
123 };
124
125 return integrate(f, 1, w_m, 1e-3);
126}
127
128double BDlnuDecay::F_S(double rl, double w_m) {
129 if (!cache.C_S_flag) return 0;
130
131 auto f = [this, rl] (double w) {
132 return phi(rl, w) * std::pow(H_S(w), 2);
133 };
134
135 return integrate(f, 1, w_m, 1e-3);
136}
137
138double BDlnuDecay::F_T_1(double rl, double w_m) {
139 if (!cache.C_T_flag) return 0;
140
141 auto f = [this, rl] (double w) {
142 return phi(rl, w) * std::pow(H_T(w), 2);
143 };
144
145 return integrate(f, 1, w_m, 1e-3);
146}
147
148double BDlnuDecay::F_T_2(double rl, double w_m) {
149 if (!cache.C_T_flag) return 0;
150
151 auto f = [this, rl] (double w) {
152 return phi(rl, w) * x_l(rl, w) * std::pow(H_T(w), 2);
153 };
154
155 return integrate(f, 1, w_m, 1e-3);
156}
157
158double BDlnuDecay::G_V0_Vt(double rl, double w_m) {
159 if (!cache.C_V_flag) return 0;
160
161 auto f = [this, rl] (double w) {
162 return phi(rl, w) * x_l(rl, w) * H_V0(w) * H_Vt(w);
163 };
164
165 return integrate(f, 1, w_m, 1e-3);
166}
167
168double BDlnuDecay::G_V0_S(double rl, double w_m) {
169 if (!(cache.C_V_flag && cache.C_S_flag)) return 0;
170
171 auto f = [this, rl] (double w) {
172 return phi(rl, w) * std::sqrt(x_l(rl, w)) * H_V0(w) * H_S(w);
173 };
174
175 return integrate(f, 1, w_m, 1e-3);
176}
177
178double BDlnuDecay::G_V0_T(double rl, double w_m) {
179 if (!(cache.C_V_flag && cache.C_T_flag)) return 0;
180
181 auto f = [this, rl] (double w) {
182 return phi(rl, w) * std::sqrt(x_l(rl, w)) * H_V0(w) * H_T(w);
183 };
184
185 return integrate(f, 1, w_m, 1e-3);
186}
187
188double BDlnuDecay::G_Vt_S(double rl, double w_m) {
189 if (!(cache.C_V_flag && cache.C_S_flag)) return 0;
190
191 auto f = [this, rl] (double w) {
192 return phi(rl, w) * std::sqrt(x_l(rl, w)) * H_Vt(w) * H_S(w);
193 };
194
195 return integrate(f, 1, w_m, 1e-3);
196}
197
198double BDlnuDecay::G_Vt_T(double rl, double w_m) {
199 if (!(cache.C_V_flag && cache.C_T_flag)) return 0;
200
201 auto f = [this, rl] (double w) {
202 return phi(rl, w) * std::sqrt(x_l(rl, w)) * H_Vt(w) * H_T(w);
203 };
204
205 return integrate(f, 1, w_m, 1e-3);
206}
207
208double BDlnuDecay::G_S_T(double rl, double w_m) {
209 if (!(cache.C_S_flag && cache.C_T_flag)) return 0;
210
211 auto f = [this, rl] (double w) {
212 return phi(rl, w) * H_S(w) * H_T(w);
213 };
214
215 return integrate(f, 1, w_m, 1e-3);
216}
217
218double BDlnuDecay::gamma_m(double r_l, double w_m) {
219 double c_vv = std::pow(std::abs(cache.C_V), 2);
220 double c_tt = 16 * std::pow(std::abs(cache.C_T), 2);
221 double c_vt = -8 * std::real(cache.C_V * std::conj(cache.C_T));
222
223 return c_vv * F_V0_1(r_l, w_m) + c_tt * F_T_2(r_l, w_m) + c_vt * G_V0_T(r_l, w_m);
224}
225
226double BDlnuDecay::gamma_p(double r_l, double w_m) {
227 double c_vv = 0.5 * std::pow(std::abs(cache.C_V), 2);
228 double c_ss = 1.5 * std::pow(std::abs(cache.C_S), 2);
229 double c_tt = 8 * std::pow(std::abs(cache.C_T), 2);
230 double c_vs = 3 * std::real(cache.C_V * std::conj(cache.C_S));
231 double c_vt = -4 * std::real(cache.C_V * std::conj(cache.C_T));
232
233 return c_vv * (F_V0_2(r_l, w_m) + 3 * F_Vt(r_l, w_m)) + c_ss * F_S(r_l, w_m) + c_tt * F_T_1(r_l, w_m) + c_vs * G_Vt_S(r_l, w_m) + c_vt * G_V0_T(r_l, w_m);
234}
235
237 if (cache.Gamma_p == 0)
238 cache.Gamma_p = gamma_p(cache.r_tau, cache.w_tau);
239
240 if (cache.Gamma_m == 0)
241 cache.Gamma_m = gamma_m(cache.r_tau, cache.w_tau);
242
243 return cache.BR_pref * (cache.Gamma_p + cache.Gamma_m);
244}
245
247 double c_vv = 1.5 * std::pow(std::abs(cache.C_V), 2);
248 double c_vs = 1.5 * std::real(cache.C_V * std::conj(cache.C_S));
249 double c_vt = -6 * std::real(cache.C_V * std::conj(cache.C_T));
250 double c_st = -6 * std::real(cache.C_S * std::conj(cache.C_T));
251 double b_theta = c_vv * G_V0_Vt(cache.r_tau, cache.w_tau) + c_vs * G_V0_S(cache.r_tau, cache.w_tau) + c_vt * G_Vt_T(cache.r_tau, cache.w_tau) + c_st * G_S_T(cache.r_tau, cache.w_tau);
252
253 if (cache.Gamma_p == 0)
254 cache.Gamma_p = gamma_p(cache.r_tau, cache.w_tau);
255
256 if (cache.Gamma_m == 0)
257 cache.Gamma_m = gamma_m(cache.r_tau, cache.w_tau);
258
259 return b_theta / (cache.Gamma_p + cache.Gamma_m);
260}
261
263 double gamma_e = gamma_p(cache.r_e, cache.w_e) + gamma_m(cache.r_e, cache.w_e);
264
265 if (cache.Gamma_p == 0)
266 cache.Gamma_p = gamma_p(cache.r_tau, cache.w_tau);
267
268 if (cache.Gamma_m == 0)
269 cache.Gamma_m = gamma_m(cache.r_tau, cache.w_tau);
270
271 return (cache.Gamma_p + cache.Gamma_m) / gamma_e;
272}
273
275 if (cache.Gamma_p == 0)
276 cache.Gamma_p = gamma_p(cache.r_tau, cache.w_tau);
277
278 if (cache.Gamma_m == 0)
279 cache.Gamma_m = gamma_m(cache.r_tau, cache.w_tau);
280
281 return (cache.Gamma_p - cache.Gamma_m) / (cache.Gamma_p + cache.Gamma_m);
282}
283
284std::vector<ObservableValue> BDlnuDecay::compute_observable(Observables obs) {
285 double value;
286 switch (obs) {
289 value = BR();
290 break;
293 value = A_FB();
294 break;
295 case Observables::R_D0:
297 value = R_D();
298 break;
301 value = P_tau();
302 break;
305 value = BR();
306 break;
309 value = A_FB();
310 break;
311 case Observables::R_D:
313 value = R_D();
314 break;
317 value = P_tau();
318 break;
319 default:
320 LOG_ERROR("IndexError", "Observable", ObservableMapper::str(obs), "doesn't belong to the decay", DecayMapper::str(this->id));
321 }
322
323 return {ObservableValue(ObservableMapper::to_id(obs), value)};
324}
325
326std::vector<ObservableValue> BDlnuDecay::compute_observable(ObservableId obs) {
328}
Observables
Definition GeneralEnum.h:4
#define LOG_ERROR(type,...)
Macro for logging error messages and terminating the application.
Definition Logger.h:41
double H_V0(double w)
double H_S(double w)
double R_D()
double S_1(double w)
void load_params() override
Load and cache parameters needed by this decay.
double A_FB()
double x_l(double rl, double w)
double F_T_1(double r_l, double w_m)
void fill_wilson_cache()
double F_Vt(double r_l, double w_m)
double F_V0_1(double r_l, double w_m)
double G_V0_T(double r_l, double w_m)
double w_max(double rD, double r_l)
double G_Vt_S(double r_l, double w_m)
double BR()
double phi(double rl, double w)
double V_1(double w)
double G_S_T(double r_l, double w_m)
std::vector< ObservableValue > compute_observable(Observables obs) override
Compute an observable given a public observable enum.
double H_T(double w)
double gamma_p(double r_l, double w_m)
double F_S(double r_l, double w_m)
void load_cfg_dep_params()
double G_Vt_T(double r_l, double w_m)
double F_V0_2(double r_l, double w_m)
double lambda_D(double w)
void set_cfg_flags(BDlnuConfig::B_Charge charge)
Definition BDlnuDecay.cpp:3
double H_Vt(double w)
double F_T_2(double r_l, double w_m)
double G_V0_Vt(double r_l, double w_m)
double G_V0_S(double r_l, double w_m)
double P_tau()
double gamma_m(double r_l, double w_m)
double t(double w)
std::shared_ptr< IObsParameterProxy< ParamId, DataType, std::string, LhaID > > p
Parameter proxy for SM-like quantities used by the decay (may be SM/BSM depending on wiring).
std::shared_ptr< IObsWilsonProxy > w_proxy
Wilson proxy used at compute-time to query coefficients (matching/run).
Definition DecayParent.h:99
static std::optional< Observables > enum_of(const IdOf< ObservableTag > &id)
Attempts to recover the enum value associated with an identifier.
static IdOf< ObservableTag > to_id(Observables e)
Converts an enum value to an IdOf<Tag>.
static std::string str(const IdOf< ObservableTag > &id)
Returns the string representation of an identifier.
constexpr double HBAR
Definition constants.h:23
constexpr double PI3
Definition constants.h:9
constexpr double RT2
Definition constants.h:15
double integrate(RealValuedFunction f, double l, double u, double prec)
Performs numerical integration of a real-valued function of a real variable.
std::enable_if_t< not std::numeric_limits< T >::is_integer, bool > fpeq(T, T, std::size_t n=10)
Compares two floating point numbers with a given precision.
double f(double x)
Wilson special function f depending on x.
B_Charge charge
Definition BDlnuDecay.h:11
complex_t C_T
Definition BDlnuDecay.h:21
complex_t C_S
Definition BDlnuDecay.h:21
complex_t C_V
Definition BDlnuDecay.h:21
Configuration for computing a particle mass at a given scale.
Definition Configs.h:242
Container for a computed observable value, optionally binned.
Composite identifier for a single parameter.
Definition ParamID.h:57