Hyperiso 1.0.3
Modular flavour-physics calculations, Wilson coefficients and statistical inference
Loading...
Searching...
No Matches
BXsDecay.cpp
Go to the documentation of this file.
1#include "BXsDecay.h"
2
4 cache.alpha_em = (*p)(ParamId{ParameterType::SM, "EW", {1, 1}}, DataType::VALUE);
5 cache.alpha_em_0 = (*p)(ParamId{ParameterType::SM, "EW", {1, 4}}, DataType::VALUE);
6 cache.m_s = (*p)(ParamId{ParameterType::SM, "MASS", 3}, DataType::VALUE);
7 cache.m_c = (*p)(ParamId{ParameterType::SM, "MASS", 4}, DataType::VALUE);
8 cache.m_W = (*p)(ParamId{ParameterType::SM, "MASS", 24}, DataType::VALUE);
9 cache.m_b_mb = (*p)(ParamId{ParameterType::SM, "QCD", {5, 1}}, DataType::VALUE);
10 cache.m_b_kin = (*p)(ParamId{ParameterType::SM, "QCD", {5, 4}}, DataType::VALUE);
11 cache.ckm_factor = std::pow(std::abs(std::conj((*p)(ParamId{ParameterType::SM, "VCKM", {2, 1}}, DataType::VALUE)) * (*p)(ParamId{ParameterType::SM, "VCKM", {2, 2}}, DataType::VALUE) / (*p)(ParamId{ParameterType::SM, "VCKM", {1, 2}}, DataType::VALUE)), 2);
12 cache.mu_b = (*p)(ParamId{ParameterType::WILSON, "B_SCALE", 1}, DataType::VALUE);
13 cache.mu_W = (*p)(ParamId{ParameterType::WILSON, "EW_SCALE", 1}, DataType::VALUE);
14 cache.beta_0 = (*iobs_qcdp).get_constants()->beta[5 - 1][0];
15 cache.alpha_s_mu_b = (*iobs_qcdp)(AlphasConfig(cache.mu_b, MassType::POLE, MassType::POLE));
17 cache.eta = (*iobs_qcdp)(AlphasConfig(cache.mu_W, MassType::POLE, MassType::POLE)) / cache.alpha_s_mu_b;
18 cache.E0 = (*p)(ParamId{ParameterType::DECAY, "B_Xs", 1}, DataType::VALUE);
20 cache.mu_G2 = (*p)(ParamId{ParameterType::DECAY, "B_Xs", 3}, DataType::VALUE);
21 cache.rho_D3= (*p)(ParamId{ParameterType::DECAY, "B_Xs", 4}, DataType::VALUE);
22 cache.rho_LS3= (*p)(ParamId{ParameterType::DECAY, "B_Xs", 5}, DataType::VALUE);
23 cache.lambda_2= (*p)(ParamId{ParameterType::DECAY, "B_Xs", 6}, DataType::VALUE);
24 cache.mu_c= (*p)(ParamId{ParameterType::DECAY, "B_Xs", 7}, DataType::VALUE);
25 cache.z0= (*p)(ParamId{ParameterType::DECAY, "B_Xs", 8}, DataType::VALUE);
26 cache.z1= (*p)(ParamId{ParameterType::DECAY, "B_Xs", 9}, DataType::VALUE);
27 cache.r_msbar_1S = (*iobs_qcdp)(MassConfig(5, cache.mu_W, MassType::MSBAR, MassType::POLE)) / cache.m_b_kin; // mu_W or mu_b ????
28 cache.m_c_mu_c = (*iobs_qcdp)(MassConfig(4, cache.mu_c, MassType::MSBAR, MassType::POLE));
29 cache.m_c_3gev = (*iobs_qcdp)(MassConfig(4, 3.0, MassType::MSBAR, MassType::POLE));
30 cache.z = std::pow(cache.m_c_mu_c / cache.m_b_kin, 2);
31
32 cache.delta = 1. - 2. * cache.E0 / cache.m_b_kin;
33 cache.L_b = 2 * std::log(cache.mu_b / cache.m_b_kin);
34 cache.L_c = 2 * std::log(cache.mu_c / cache.m_c_mu_c);
35 cache.rand_err = (*p)(ParamId{ParameterType::DECAY, "B_Xs", 10}, DataType::VALUE);
36
37 cache.C_b_LO = w_proxy->getAR(WGroup::B, QCDOrder::LO);
38 auto CP_b_LO = w_proxy->getAR(WGroup::BPrime, QCDOrder::LO);
39 cache.C_b_LO.insert(CP_b_LO.begin(), CP_b_LO.end());
40 cache.C_b_NLO = w_proxy->getAR(WGroup::B, QCDOrder::NLO);
42 cache.C_w = w_proxy->getAM(WGroup::B, QCDOrder::LO);
43
44}
45
46double BXsDecay::gen_P00(const std::array<std::array<double, 8>, 8>& K) {
47 double P {0};
50 for (size_t i = 0; i < 8; i++) {
51 for (size_t j = 0; j < 8; j++) {
52 P += std::real(cache.C_b_LO[C_ids[i]] * K[i][j] * std::conj(cache.C_b_LO[C_ids[j]]));
53 P += std::real(cache.C_b_LO[CP_ids[i]] * K[i][j] * std::conj(cache.C_b_LO[CP_ids[j]]));
54 }
55 }
56
57 return P;
58}
59
60double BXsDecay::gen_P01(const std::array<std::array<double, 8>, 8>& K) {
61 double P {0};
63 for (size_t i = 0; i < 8; i++) {
64 for (size_t j = 0; j < 8; j++) {
65 P += std::real(cache.C_b_LO[C_ids[i]] * K[i][j] * std::conj(cache.C_b_NLO[C_ids[j]]));
66 }
67 }
68
69 return 2 * P;
70}
71
72double BXsDecay::a(double z) {
73 if(fpeq(z, 1.)) return 4.0859;
74 if(fpeq(z, 0.)) return 0.;
75 if(std::abs(z) > 0.4) LOG_WARN("The value of z in BXsDecay::a(double z) shouldn't exceed 0.4.");
76
77 double Lz = std::log(z);
78 double Lz2 = Lz * Lz;
79
80 return 16./9.*((5./2.-PI2/3.-3.*ZETA3+(5./2.-3./4.*PI2)*Lz+Lz2/4.+Lz2*Lz/12.)*z
81 +(7./4.+2./3.*PI2-0.5*PI2*Lz-Lz2/4.+Lz2*Lz/12.)*std::pow(z,2)+(-7./6.-PI2/4.+2.*Lz-3./4.*Lz2)*std::pow(z,3)
82 +(457./216.-5./18.*PI2-Lz/72.-5./6.*Lz2)*std::pow(z,4)+(35101./8640.-35./72.*PI2-185./144.*Lz-35./24.*Lz2)*std::pow(z,5)
83 +(67801./8000.-21./20.*PI2-3303./800.*Lz-63./20.*Lz2)*std::pow(z,6));
84}
85
86double BXsDecay::b(double z) {
87 if(fpeq(z, 1.)) return 0.0316;
88 if(fpeq(z, 0.)) return 0.;
89 if(std::abs(z) > 0.4) LOG_WARN("The value of z in BXsDecay::b(double z) shouldn't exceed 0.4.");
90
91 double Lz = std::log(z);
92 double Lz2 = Lz * Lz;
93
94 return -8./9.*((-3.+PI2/6.-Lz)*z-2./3.*PI2*std::pow(z,1.5)+(0.5+PI2-2.*Lz-0.5*Lz2)*z*z
95 +(-25./12.-PI2/9.-19./18.*Lz+2.*Lz2)*z*z*z+(-1376./225.+137./30.*Lz+2.*Lz2+2./3.*PI2)*std::pow(z,4)
96 +(-131317./11760.+887./84.*Lz+5.*Lz2+5./3.*PI2)*std::pow(z, 5)+(-2807617./97200.+16597./540.*Lz+14.*Lz2+14./3.*PI2)*std::pow(z,6));
97}
98
100 if (t < 4) {
101 return -2 * std::pow(std::atan(std::sqrt(t / (4 - t))), 2);
102 }
103 double L = std::log((std::sqrt(t) + sqrt(t - 4)) / 2);
104 return complex_t {-PI2 / 2 + 2 * std::pow(L, 2), -2 * PI * L};
105}
106
107double BXsDecay::phi_22(double z, double delta) {
108 auto i1 = [this, z] (double t) {
109 return (1 - z * t) * std::pow(std::abs(G(t) / t + 0.5), 2);
110 };
111
112 auto i2 = [this, z] (double t) {
113 return std::pow((1 - z * t) * std::abs(G(t) / t + 0.5), 2);
114 };
115
116 double c = (1 - delta) / z;
117 double I1 = integrate(i1, 0, c, 1e-4);
118 double I2 = integrate(i2, c, 1 / z, 1e-4);
119
120 return 16. * z * (delta * I1 + I2) / 27.;
121}
122
123double BXsDecay::phi_27(double z, double delta) {
124 auto i1 = [this] (double t) {
125 return std::real(G(t) + 0.5 * t);
126 };
127
128 auto i2 = [this, z] (double t) {
129 return (1 - z * t) * std::real(G(t) + 0.5 * t);
130 };
131
132 double c = (1 - delta) / z;
133 double I1 = integrate(i1, 0, c, 1e-4);
134 double I2 = integrate(i2, c, 1 / z, 1e-4);
135
136 return -8. * std::pow(z, 2) * (delta * I1 + I2) / 9.;
137}
138
139double BXsDecay::phi_47(double delta) {
140 double d = delta;
141 double phi47A=PI/54.*(3.*sqrt(3.)-PI)+d*d*d/81.-25./108.*d*d+5./54.*d+2./9.*(d*d+2.*d+3.)*pow(atan(sqrt((1.-d)/(3.+d))),2.)-1./3.*(d*d+4.*d+3.)*sqrt((1.-d)/(3.+d))*atan(sqrt((1.-d)/(3.+d)));
142 double phi47B=(34.*d*d+59.*d-18.)/486.*d*d*log(d)/(1.-d)+(433.*d*d*d+429.*d*d-720.*d)/2916.;
143 return phi47A+phi47B;
144}
145double BXsDecay::phi_77(double delta) {
146 double ld = std::log(delta);
147 return -2 * std::pow(ld, 2) / 3 - 7 * ld / 3 - 31. / 9 + 10 * delta / 3 + std::pow(delta, 2) / 3 - 2 * std::pow(delta, 3) / 9 + delta * (delta - 4) * ld / 3;
148}
149
150double BXsDecay::phi_78(double delta) {
151 return 8 * (Li2(1 - delta) - PI2 / 6 - delta * std::log(delta) + 9 * delta / 4 - std::pow(delta, 2) / 4 + std::pow(delta, 3) / 12) / 9;
152}
153
154double BXsDecay::phi_88(double delta) {
155 double u = 1 - delta;
156 double a = delta * (delta + 2) + 4 * std::log(u);
157 double b = 4 * Li2(u) - 2 * PI2 / 3 - delta * (delta + 2) * std::log(delta) + 8 * std::log(u) - 2 * std::pow(delta, 3) / 3 + 3 * std::pow(delta, 2) + 7 * delta;
158 return (-2 * std::log(cache.m_b_kin / cache.m_s) * a + b) / 27;
159}
160
161std::array<std::array<double, 8>, 8> BXsDecay::phi_1(double delta, double z) {
162 std::array<std::array<double, 8>, 8> phi {};
163
164 phi[1][1] = phi_22(z, delta);
165 phi[1][6] = phi_27(z, delta);
166 phi[3][6] = phi_47(delta);
167 phi[6][6] = phi_77(delta);
168 phi[6][7] = phi_78(delta);
169 phi[7][7] = phi_88(delta);
170 phi[0][0] = phi[1][1] / 36.0;
171 phi[0][1] = -phi[1][1] / 3.0;
172 phi[0][6] = -phi[1][6] / 6.0;
173 phi[0][7] = phi[1][6] / 18.0;
174 phi[1][7] = -phi[1][6] / 3.0;
175 phi[3][7] = -phi[3][6] / 3.0;
176 return phi;
177}
178
179std::array<double, 8> BXsDecay::r_1(double z) {
180 std::array<double, 8> r {};
181 double az = a(z);
182 double bz = b(z);
183 double a1 = a(1.0);
184 double b1 = b(1.0);
185 r[0] = 833. / 729 - (az + bz) / 3;
186 r[1] = -1666. / 243 + 2 * (az + bz);
187 r[2] = 2392. / 243 + 8 * PI / (3 * std::sqrt(3)) + 32 * cache.X_b / 9 - a1 + 2 * b1;
188 r[3] = -761. / 729 - 4 * PI / (9 * std::sqrt(3)) - 16 * cache.X_b / 27 + a1 / 6 + 5 * b1 /3 + 2 * bz;
189 r[4] = 56680. / 243 + 32 * PI / (3 * std::sqrt(3)) + 128 * cache.X_b / 9 - 16 * a1 + 32 * b1;
190 r[5] = 5710. / 729 - 16 * PI / (9 * std::sqrt(3)) - 64 * cache.X_b / 27 - 10 * a1 / 3 + 44 * b1 / 3 + 12 * az + 20 * bz;
191 r[6] = -182. / 9 + 8 * PI2 / 9;
192 r[7] = 44. / 9 - 8 * PI2 / 27;
193 return r;
194}
195
196std::array<std::array<double, 8>, 8> BXsDecay::K_1() {
197 std::array<std::array<double, 8>, 8> K {};
198 auto r = r_1(cache.z);
199 auto phi = phi_1(cache.delta, cache.z);
200
201 for (size_t i = 0; i < 8; i++) {
202 for (size_t j = i; j < 8; j++) {
203 K[i][j] = 2. * (1 + kron(i, j)) * phi[i][j];
204 }
205 }
206
207 for (size_t i = 0; i < 6; i++)
208 K[i][6] += r[i] - 0.5 * gamma_i7[i] * cache.L_b;
209
210 K[6][6] += r[6] - gamma_i7[6] * cache.L_b;
211 K[6][7] += r[7] - 0.5 * gamma_i7[7] * cache.L_b;
212
213 for (size_t i = 0; i < 8; i++) {
214 for (size_t j = i; j < 8; j++) {
215 K[j][i] = K[i][j];
216 }
217 }
218
219 return K;
220}
221
222double BXsDecay::F2nf(double z) {
223 if(fpeq(z, 0.)) return 0.;
224
225 return -std::log(1.-z)*std::log(1.-z)/(1.-z)/2.-13./36.*std::log(1.-z)/(1.-z)+(-PI2/18.+85./72.)/(1.-z)+(z*z-3.)/6./(z-1.)*Li2(1.-z)+(z*z-3.)/6./(z-1.)*std::log(1.-z)*std::log(z)-(1.+z)*std::log(1.-z)*std::log(1.-z)/4.-(6.*z*z-25.*z-1.)*std::log(1.-z)/36.+std::log(1.-z)/z/2.-(1.+z)*PI2/36.+(-49.+38.*z*z-55.*z)/72.;
226}
227
228double BXsDecay::r22(double z) {
229 double Lz = std::log(z);
230 double Lz2 = Lz * Lz;
231 double Lz3 = Lz2 * Lz;
232 double Lz4 = Lz2 * Lz2;
233 return 67454./6561.-124./729.*PI2
234 -4./1215.*(11280.-1520.*PI2-171.*pow(PI,4.)-5760.*ZETA3+6840.*Lz-1440.*PI2*Lz-2520.*ZETA3*Lz+120.*Lz2+100.*Lz3-30.*Lz4)*z
235 -64./243.*PI2*(43.-12.*std::log(2.)-3.*Lz)*pow(z,1.5)
236 -2./1215.*(11475.-380.*PI2+96.*pow(PI,4.)+7200.*ZETA3-1110.*Lz-1560.*PI2*Lz+1440.*ZETA3*Lz+990.*Lz2+260.*Lz3-60.*Lz4)*z*z
237 +2240./243.*PI2*pow(z,2.5)
238 -2./2187.*(62471.-2424.*PI2-33264.*ZETA3-19494.*Lz-504.*PI2*Lz-5184.*Lz2+2160.*Lz3)*z*z*z
239 -2464./6075.*PI2*pow(z,3.5)
240 +(-15103841./546750.+7912./3645.*PI2+2368./81.*ZETA3+147038./6075.*Lz+352./243.*PI2*Lz+88./243.*Lz2-512./243.*Lz3)*z*z*z*z;
241}
242
243double BXsDecay::h22(double z, double delta) {
244 return 0.01370+0.3357*delta-0.08668*delta*delta+(0.3575+1.825*delta-0.3743*delta*delta)*sqrt(z)+(-2.306-5.8*delta-6.226*delta*delta)*z+(3.449-0.548*delta+17.27*delta*delta)*pow(z,1.5);
245}
246
247double BXsDecay::h27(double z, double delta)
248{
249 return -0.1755-1.455*delta+1.119*delta*delta+(0.7260-7.23*delta+5.977*delta*delta)*sqrt(z)+(13.79+113.7*delta-100.4*delta*delta)*z+(-145.1-307.1*delta+388.5*delta*delta)*pow(z,1.5)+(475.2+313.*delta-775.8*delta*delta)*z*z+(-509.7-126.1*delta+646.2*delta*delta)*pow(z,2.5);
250}
251
252double BXsDecay::h28(double z, double delta)
253{
254 return 0.02605+0.1679*delta-0.197*delta*delta+(-0.03801+0.6017*delta-0.7558*delta*delta)*sqrt(z)+(2.755-10.03*delta+11.27*delta*delta)*z+(-27.05+68.47*delta-72.51*delta*delta)*pow(z,1.5)+(85.87-289.3*delta+297.7*delta*delta)*z*z+(-91.53+399.8*delta-399.9*delta*delta)*pow(z,2.5);
255}
256
257double BXsDecay::h88(double delta) {
258 return 4./27.*(((1.+0.5*delta)*delta*log(delta)-6.*log(1.-delta)-2.*Li2(1.-delta)+PI2/3.-16./3.*delta-5./3.*delta*delta+delta*delta*delta/9.)*log(cache.m_b_kin/cache.m_s)-2.*Li3(delta)+(5.-2.*log(delta))*(Li2(1.-delta)-PI2/6.)-PI2/12.*delta*(2.+delta)+(0.5*delta+0.25*delta*delta-log(1.-delta))*pow(log(delta),2.)+(151./18.-PI2/3.)*log(1.-delta)+(-53./12.-19./12.*delta+2./9.*delta*delta)*delta*log(delta)+787./72.*delta+227./72.*delta*delta-41./72.*delta*delta*delta);
259}
260
261double BXsDecay::h77(double delta) {
262 auto f = [this] (double z) {
263 return F2nf(z);
264 };
265
266 return 4 * integrate(f, 0, 1 - delta, 1e-3);
267}
268
269std::array<std::array<double, 8>, 8> BXsDecay::phi_2_b0(double delta, double z) {
270 std::array<std::array<double, 8>, 8> phi {};
271 std::array<std::array<double, 8>, 8> phi_ij_1 = phi_1(delta, z);
272
273 phi[1][1] = cache.beta_0 * (phi_ij_1[1][1] * cache.L_b + h22(z, delta));
274 phi[1][6] = cache.beta_0 * (phi_ij_1[1][6] * cache.L_b + h27(z, delta));
275 phi[1][7] = cache.beta_0 * (phi_ij_1[1][7] * cache.L_b + h28(z, delta));
276 phi[6][6] = cache.beta_0 * (phi_ij_1[6][6] * cache.L_b + h77(delta));
277 phi[7][7] = cache.beta_0 * (phi_ij_1[7][7] * cache.L_b + h88(delta));
278 phi[0][0] = phi[1][1] / 36.0;
279 phi[0][1] = -phi[1][1] / 3.0;
280 phi[0][7] = -phi[1][7] / 6.0;
281 return phi;
282}
283
284std::array<double, 8> BXsDecay::r_hat_2(double z) {
285 std::array<double, 8> r {};
286 double Lb = cache.L_b;
287 double Lb2 = Lb * Lb;
288 r[1] = -3. / 2 * r22(z) + 2 * (a(z) + b(z) - 290. / 81.) * Lb - 100. / 81 * Lb2;
289 r[0] = -1. / 6 * r[1];
290 r[6] = -3803. / 54 - 46 * PI2 / 27 + 80 * ZETA3 / 3 + (8 * PI2 / 9 - 98. / 3) * Lb - 16 * Lb2 / 3;
291 r[7] = 1256. / 81 - 64 * PI2 / 81 - 32 * ZETA3 / 9 + (-8 * PI2 / 27 + 188. / 27) * Lb + 8 * Lb2 / 9;
292 return r;
293}
294
295std::array<std::array<double, 8>, 8> BXsDecay::K_2_b0() {
296 std::array<std::array<double, 8>, 8> K {};
297 auto r = r_hat_2(cache.z);
298 auto phi = phi_2_b0(cache.delta, cache.z);
299
300 for (size_t i = 0; i < 8; i++) {
301 for (size_t j = i; j < 8; j++) {
302 K[i][j] = 2. * (1 + kron(i, j)) * phi[i][j];
303 }
304 }
305
306 K[0][6] += cache.beta_0 * r[0];
307 K[1][6] += cache.beta_0 * r[1];
308 K[6][6] += cache.beta_0 * r[6];
309 K[6][7] += cache.beta_0 * r[7];
310
311 for (size_t i = 0; i < 8; i++) {
312 for (size_t j = i; j < 8; j++) {
313 K[j][i] = K[i][j];
314 }
315 }
316
317 return K;
318}
319
320double BXsDecay::F2a(double z) {
321 if(fpeq(z, 0.)) return 0;
322
323 return 0.5*pow(log(1.-z),3.)/(1.-z)+21./8.*pow(log(1.-z),2.)/(1.-z)
324 +(-PI2/6.+271./48.)*log(1.-z)/(1.-z)
325 +(425./96.-PI2/6.-ZETA3/2.)/(1.-z)
326 +(4.*z-4.*z*z+1.+z*z*z)/2./(z-1.)*(Li3(z/(2.-z))-Li3(-z/(2.-z))-2.*Li3(1./(2.-z))+ZETA3/4.)
327 +((z*z*z-2.*z*z+2.*z-3.)/2./(z-1.)*log(1.-z)-(-140.*pow(z,4.)+219.*pow(z,3.)-124.*z*z+28.*z+27.*pow(z,5.)+9.*pow(z,6.)+pow(z,8.)-6.*pow(z,7.)-6.)/12./z/pow(z-1.,3.))*Li2(z-1.)
328 -2.*pow(z-1.,2.)*Li3(z-1.)+((2.*pow(z,3.)-9.*z*z-2.*z+11.)/4./(z-1.)*log(1.-z)-(-27.*z*z+8.*pow(z,6.)-9.+21.*z-3.*z*z*z+64.*pow(z,4.)-46.*pow(z,5.))/12./z/pow(z-1.,3.))*Li2(1.-z)
329 -(-17.*z*z+4.*z+4.*z*z*z+11.)/4./(z-1.)*Li3(1.-z)-(2.*z*z*z+13.-9.*z*z)/4./(z-1.)*Li3(z)+(4.*z-4.*z*z+1.+z*z*z)/6./(z-1.)*pow(log(2.-z),3.)
330 +(-(4.*z-4.*z*z+1.+z*z*z)/2./(z-1.)*pow(log(1.-z),2.)-(-140.*pow(z,4.)+219.*pow(z,3.)-124.*z*z+28.*z+27.*pow(z,5.)+9.*pow(z,6.)+pow(z,8.)-6.*pow(z,7.)-6.)/12./z/pow(z-1.,3.)*log(1.-z) - (4.*z-4.*z*z+1.+z*z*z)/(z-1.)*PI2/12.)*log(2.-z)
331 +(z*z*z-2.*z*z+2.*z+1.)/4./z*pow(log(1.-z),3.)+(pow(z,5.)-3.*pow(z,4.)+5.*pow(z,3.)+7.*z*z+5.*z-9.)/24./z*pow(log(1.-z),2.)
332 +(-(z*z+8.*z-11.)/8./(z-1.)*pow(log(1.-z),2.)-(-27.*z*z+8.*pow(z,6.)-9.+21.*z-3.*z*z*z+64.*pow(z,4.)-46.*pow(z,5.))/12./z/pow(z-1.,3.)*log(1.-z))*log(z)
333 +((-z*z+z-3.)*PI2/12.-(4.*pow(z,5.)+151.*z+2.*pow(z,4.)-48.*z*z-41.*z*z*z-36.)/48./z*(z-1.))*log(1.-z)
334 -(z-2.)*(pow(z,4.)-z*z*z-11.*z*z+13.*z+3.)/z*PI2/72. + (z*z*z-11.*z*z-2.*z+18.)/4./(z-1.)*ZETA3-(8.*pow(z,4.)-244.*z*z*z+175.*z*z+598.*z-569.)/96./(z-1.);
335}
336
337double BXsDecay::F2na(double z) {
338 if(fpeq(z, 0.)) return 0;
339
340 return 11./8.*pow(log(1.-z),2.)/(1.-z)+(PI2/12.+95./144.)*log(1.-z)/(1.-z)+(ZETA3/4.-905./288.+17.*PI2/72.)/(1.-z)
341 -(4.*z-4.*z*z+1.+z*z*z)/4./(z-1.)*(Li3(z/(2.-z))-Li3(-z/(2.-z))-2.*Li3(1./(2.-z))+ZETA3/4.)+pow(z-1.,2.)*Li3(z-1.)
342 +(-(z*z*z-2.*z*z+2.*z-3.)/4./(z-1.)*log(1.-z)+(-140.*pow(z,4.)+219.*z*z*z-124.*z*z+28.*z+27.*pow(z,5.)+9.*pow(z,6.)+pow(z,8.)-6.*pow(z,7.)-6.)/24./z/pow(z-1.,3.))*Li2(z-1.)
343 +(z*(3.-z)/4.*log(1.-z)+(1.+z)*(2.*pow(z,4.)-29.*pow(z,3.)+73.*z*z-57.*z+15.)/24./pow(z-1.,3.))*Li2(1.-z)+(4.*z-4.*z*z+1.+z*z*z)/4./(z-1.)*Li3(z)
344 +(z-3.)*z/2.*Li3(1.-z)-(4.*z-4.*z*z+1.+z*z*z)/12./(z-1.)*pow(log(2.-z),3.)+((4.*z-4.*z*z+1.+z*z*z)/4./(z-1.)*pow(log(1.-z),2.)
345 +(-140.*pow(z,4.)+219.*pow(z,3.)-124.*z*z+28.*z+27.*pow(z,5.)+9.*pow(z,6.)+pow(z,8.)-6.*pow(z,7.)-6.)/24./z/pow(z-1.,3.)*log(1.-z)+(4.*z-4.*z*z+1.+z*z*z)*PI2/24./(z-1.))*log(2.-z)
346 +(1.+z)*(2.*pow(z,4.)-29.*z*z*z+73.*z*z-57.*z+15.)/24./pow(z-1.,3.)*log(1.-z)*log(z)-pow(z-1.,2.)/8.*pow(log(1.-z),3.)-(z+2.)*(z*z*z-5.*z*z+9.*z-35.)/48.*pow(log(1.-z),2.)
347 +((z*z-z+3.)*PI2/24.+(6.*pow(z,5.)+72.-392.*pow(z,3.)+51.*pow(z,4.)+219.*z*z+92.*z)/144./z/(z-1.))*log(1.-z)
348 +(pow(z,5.)-3.*pow(z,4.)-3.*pow(z,3.)+34.*z*z-24.*z+3.)/z*PI2/144.
349 -(z*z*z-10.*z*z+6.*z+7.)/8./(z-1.)*ZETA3+(12.*pow(z,4.)-754.*pow(z,3.)+1191.*z*z+264.*z-761.)/288./(z-1.);
350}
351
352double BXsDecay::phi_77_rem(double delta) {
353 auto f = [this] (double z) {
354 return (16 * F2a(z) + 36 * F2na(z) + 87 * F2nf(z)) / 9.;
355 };
356
357 double phi_77_A = integrate(f, 0, 1 - delta, 1e-3);
358 double ld = std::log(delta);
359 return -4 * phi_77_A - 8 * PI * cache.alpha_s_upsilon * (2 * delta * ld * ld + (4 + delta * (7 + delta * (-2 + delta))) * ld + 7 + delta * (-8. / 3 + delta * (-7 + delta * (4 - 4 * delta / 3)))) / (27 * delta);
360}
361
362std::array<std::array<double, 8>, 8> BXsDecay::K_2_rem(double z) {
363 std::array<std::array<double, 8>, 8> K {};
364 std::array<std::array<double, 8>, 8> K_1 = this->K_1();
365 double L_D = cache.L_b - std::log(z);
366 K[1][1] = std::pow((218. / 243 - 208. * L_D / 81), 2);
367 K[0][0] = K[1][1] / 36.0;
368 K[0][1] = K[1][0] = -K[1][1] / 6.0;
369 K[1][6] = K[6][1] = (218./243.-208./81.*L_D) * K_1[6][6] + (127. / 324. - 35. * L_D / 27) * K_1[6][7] + 2. * (1. - L_D) * (K_1[3][6] - cache.beta_0 * (26. / 81. - 4. * cache.L_b / 27.)) / 3. + L_D * (1150. - 4736. * L_D) / 729. - 1617980. / 19683. + 20060. * ZETA3 / 243. + 1664. * cache.L_c / 81.;
370 K[1][7] = K[7][1] = (218./243.-208./81.*L_D) * K_1[6][7] + (127. / 324. - 35. * L_D / 27) * K_1[7][7] + 2. * (1. - L_D) * K_1[3][7] / 3.;
371 K[0][6] = K[6][0] = -K[1][6] / 6. + (5. / 16. - 3. * L_D / 4.) * K_1[6][7] - 1237. / 729. + 232. * ZETA3 / 27. + L_D * (-20. + 70. * L_D) / 27.;
372 K[0][7] = K[7][0] = -K[1][7] / 6. + (5. / 16. - 3. * L_D / 4.) * K_1[7][7];
373 K[6][6] = (K_1[6][6] - 4. * phi_77(cache.delta) + 2. * std::log(z) / 3.) * K_1[6][6] + L_D * (224. / 27. - 32. * L_D / 9.) - 79.2838955662 + cache.L_b * (256. * PI2 / 27. - 2720. / 9. - 160. * cache.L_b / 3.) + 512. * PI * cache.alpha_s_upsilon / 27. + 4. * phi_77_rem(cache.delta);
374 K[6][7] = K[7][6] = (-50. / 3. + 8. * PI2 / 3. - 2. * L_D / 3.) * K_1[6][7] + L_D * (-112. / 81. + 16. * L_D / 27.) + 364. / 243.;
375 K[7][7] = (-50. / 3. + 8. * PI2 / 3. - 2. * L_D / 3.) * K_1[7][7];
376
377
378 return K;
379}
380
381double BXsDecay::r2_large_z(double z) {
382 return -1666. / 243 + 2 * (104 * std::log(z) + 314) / 81;
383}
384
385double BXsDecay::dr2_dlogz(double z) {
386 double lz = std::log(z);
387 double lz2 = lz * lz;
388 double lz3 = lz2 * lz;
389 return z * (224. / 9 - 112 * PI2 / 27 - 32 * ZETA3 / 3 + (112. / 9 - 8 * PI2 / 3) * lz + 16 * lz2 / 9 + 8 * lz3 / 27 )
390 + std::pow(z, 2) * (128. / 9 - 16 * PI2 / 27 + (64. / 9 - 32 * PI2 / 9) * lz + 8 * lz2 / 9 + 16 * lz3 / 27 )
391 + std::pow(z, 1.5) * ( 16 * PI2 / 9 )
392 + std::pow(z, 3) * (620. / 81 - 56 * PI2 / 27 + 392. / 27 * lz - 56 * lz2 / 3 )
393 + std::pow(z, 4) * (397372. / 6075 - 704 * PI2 / 81 - 18512. / 405 * lz - 704 * lz2 / 27 )
394 + std::pow(z, 5) * (-1199585. / 23814 - 1900 * PI2 / 81 - 82130. / 567 * lz - 1900 * lz2 / 27 )
395 + std::pow(z, 6) * (-17917342. / 91125 - 3248 * PI2 / 45 - 988402. / 2025 * lz - 3248 * lz2 / 15 );
396}
397
398double BXsDecay::r22_large_z(double z) {
399 double lz = std::log(z);
400 return 27650. / 6561 + lz * (112. / 243 + 8 * lz / 9);
401}
402
404 complex_t r21_0 {-1666. / 243, -80 * PI / 81};
405 double r22_0 {67454. / 6561 - 124 * PI2 / 729};
406 double x1 = std::pow(std::abs(cache.C_b_LO[WCoef::C1]), 2) / 36 + std::pow(std::abs(cache.C_b_LO[WCoef::C2]), 2) - std::real(cache.C_b_LO[WCoef::C1] * std::conj(cache.C_b_LO[WCoef::C2])) / 3
407 + std::pow(std::abs(cache.C_b_LO[WCoef::CP1]), 2) / 36 + std::pow(std::abs(cache.C_b_LO[WCoef::CP2]), 2) - std::real(cache.C_b_LO[WCoef::CP1] * std::conj(cache.C_b_LO[WCoef::CP2])) / 3;
408 double x2 = std::real(cache.C_b_LO[WCoef::C7] * std::conj(4019. * cache.C_b_LO[WCoef::C1] / 486. - 1184. * cache.C_b_LO[WCoef::C2] / 81. - 4. * cache.C_b_LO[WCoef::C7] + 4. * cache.C_b_LO[WCoef::C8] / 3.))
409 + std::real(cache.C_b_LO[WCoef::CP7] * std::conj(4019. * cache.C_b_LO[WCoef::CP1] / 486. - 1184. * cache.C_b_LO[WCoef::CP2] / 81. - 4. * cache.C_b_LO[WCoef::CP7] + 4. * cache.C_b_LO[WCoef::CP8] / 3.));
410
411 double phi_77_1 = phi_77(cache.delta);
412 double K1_77 = 4 * phi_77_1 - 182. / 9 + 8 * PI2 / 9 - gamma_i7[6] * cache.L_b;
413 double K77rem_z0 = (K1_77-4.*phi_77_1+2./3.*cache.L_b)*K1_77-587708./729.-628./405.*pow(PI,4.)
414 +32651./729.*PI2+428./27.*PI2*log(2.)+25150./81.*ZETA3-448./9.*cache.L_b*cache.L_b+(80./9.*PI2-2524./9.)*cache.L_b
415 +512./27.*PI*cache.alpha_s_upsilon+4.*phi_77_rem(cache.delta)-8.*(phi_77_1 * cache.L_b + h77(cache.delta))/3.;
416 double x5 = K77rem_z0 * (std::pow(std::abs(cache.C_b_LO[WCoef::C7]), 2) + std::pow(std::abs(cache.C_b_LO[WCoef::CP7]), 2));
417
418
419 auto target = [this, r21_0, r22_0, x1, x2, x5] (double z) {
420 auto K_2 = K_2_rem(z);
421 double y = gen_P00(K_2);
422 // printf("P22rem = %.4e\n", y);
423 double a1 = std::pow(std::abs(r2_large_z(z)), 2) - std::pow(std::abs(r21_0), 2);
424 double a2 = r22_large_z(z) - r22_0;
425 return y - a1 * x1 - a2 * x2 - x5;
426 };
427
428 double a_3_z0 = r2_large_z(cache.z0) - std::real(r21_0);
429 double a_3_z1 = r2_large_z(cache.z1) - std::real(r21_0);
430 double a_4 = 2.*(4./3.-4./81.);
431 double y_0 = target(cache.z0);
432 double y_1 = target(cache.z1);
433
434 double x3 = (y_1 - y_0) / (a_3_z1 - a_3_z0);
435 double x4 = (y_0 * a_3_z1 - y_1 * a_3_z0) / (a_4 * (a_3_z1 - a_3_z0));
436 double Lz = std::log(cache.z);
437 complex_t r_21 = {-1666. / 243 + 2 * (a(cache.z) + b(cache.z)),
438 -80./81.*PI+2.*PI*(16./9.*((4.-PI2/3.+Lz+Lz*Lz)*cache.z/2.+(0.5-PI2/6.-Lz-0.5*Lz*Lz)*cache.z*cache.z+pow(cache.z,3.)+5./9.*pow(cache.z,4.))-8./9.*(-cache.z+(1.-2.*Lz)*cache.z*cache.z+(-10./9.+4./3.*Lz)*pow(cache.z,3.)+pow(cache.z,4.)))};
439
440 return x1 * (std::pow(std::abs(r_21), 2) - std::pow(std::abs(r21_0), 2))
441 + x2 * (r22(cache.z) - r22_0)
442 + x3 * std::real(r_21 - r21_0)
443 + x4 * dr2_dlogz(cache.z)
444 + x5;
445}
446
447double BXsDecay::P() {
448 double p0 = std::pow(std::abs(cache.C_b_LO[WCoef::C7]), 2) + std::pow(std::abs(cache.C_b_LO[WCoef::CP7]), 2);
449 double p11 = 2 * std::real(cache.C_b_LO[WCoef::C7] * std::conj(cache.C_b_NLO[WCoef::C7]));
450 double p12 = std::pow(std::abs(cache.C_b_NLO[WCoef::C7]), 2) + 2 * std::real(cache.C_b_LO[WCoef::C7] * std::conj(cache.C_b_NNLO[WCoef::C7]));
451 double p21 = gen_P00(K_1());
452 double p32 = gen_P01(K_1());
453 double p22 = gen_P00(K_2_b0()) + P22_rem();
454
455 double k = cache.alpha_s_mu_b / (4 * PI);
456 return p0 + k * ((p11 + p21) + k * (p12 + p22 + p32));
457}
458
459double BXsDecay::N() {
460 double Kc = 0.0;
461 for (size_t i = 0; i < a_i.size(); i++)
462 Kc += d_i[i] * std::pow(cache.eta, a_i[i]);
463
464 double Kt = std::real(
465 (cache.C_w[WCoef::C7] + 23. / 36) * std::pow(cache.eta, 4.0 / 23.0)
466 - 8. * (cache.C_w[WCoef::C8] + 1. / 3) * (std::pow(cache.eta, 4.0 / 23.0) - std::pow(cache.eta, 2.0 / 23.0)) / 3.
467 );
468 double eta_factor = std::pow(cache.eta, 6.0 / 23.0) + std::pow(cache.eta, -12.0 / 23.0);
469 return -(Kc + cache.r_msbar_1S * Kt) * eta_factor * cache.lambda_2 / (18 * std::pow(cache.m_c, 2));
470}
471
472double BXsDecay::C2_em(double eta) {
473 return -190 * std::pow(eta, -35. / 23) / 8073 - 359 * std::pow(eta, -17. / 23) / 3105 + 4276 * std::pow(eta, -12. / 23) / 121095
474 + 350531 * std::pow(eta, -9. / 23) / 1009125 + 2 * std::pow(eta, -7. / 23) / 4347 - 5956 * std::pow(eta, 6. / 23) / 15525
475 + 38380 * std::pow(eta, 14. / 23) / 169533 - 748 * std::pow(eta, 16. / 23) / 8625;
476}
477
478double BXsDecay::C8_em(double eta) {
479 return -32 * std::pow(eta, -9. / 23) / 575 + 32 * std::pow(eta, -7. / 23) / 1449 + 640 * std::pow(eta, 14. / 23) / 1449 - 704 * std::pow(eta, 16. / 23) / 1725;
480}
481
483 return (32 * std::pow(eta, -9. / 23) / 75 - 40 * std::pow(eta, -7. / 23) / 69 + 88 * std::pow(eta, 16. / 23) / 575) * cache.C_w[WCoef::C7] + C8_em(eta) * cache.C_w[WCoef::C8] + C2_em(eta);
484}
485
487 double k_SL = 2. * cache.alpha_s_mu_b * std::log(cache.m_W / cache.mu_b) / PI;
488
489 // ASK : check eta or alpha_mub
490 return (2 * std::real(C7_em(cache.eta) * std::conj(cache.C_b_LO[WCoef::C7])) - k_SL * std::pow(std::abs(cache.C_b_LO[WCoef::C7]), 2)) * cache.alpha_em / cache.alpha_s_mu_b;
491}
492
493double BXsDecay::C() {
494 double delta_as = QCDHelper::alpha_s(4.6, MassType::MSBAR) - 0.22;
495 double delta_b = cache.m_b_kin - 4.55;
496 double delta_c = cache.m_c_3gev - 1.0;
497 double rho = std::pow(cache.m_c_3gev / cache.m_b_kin, 2);
498 double g = 1. + rho * (-8. + rho * (-12. * std::log(rho) + rho * (8. - rho)));
499
500
501 return g * (0.849 - 0.92 * delta_as + 0.0596 * delta_b - 0.2237 * delta_c - 0.0167 * cache.mu_G2 - 0.203 * cache.rho_D3 + 0.004 * cache.rho_LS3);
502}
503
505 double p = this->P();
506 double n = this->N();
507 double epsilon_em = this->epsilon_em();
508
509 return cache.BR_B__Xc_e_nu_exp * cache.ckm_factor * 6 * cache.alpha_em_0 / (PI * C()) * (p + n + epsilon_em) * (1 + cache.rand_err);
510}
511
512std::vector<ObservableValue> BXsDecay::compute_observable(Observables obs) {
513 double value;
514 switch (obs) {
516 value = BR_B_Xs_gamma();
517 break;
518 default:
519 LOG_ERROR("IndexError", "Observable", ObservableMapper::str(obs), "doesn't belong to the decay", DecayMapper::str(this->id));
520 }
521
522 return {ObservableValue(ObservableMapper::to_id(obs), value)};
523}
524
525std::vector<ObservableValue> BXsDecay::compute_observable(ObservableId obs) {
527}
Observables
Definition GeneralEnum.h:4
#define LOG_ERROR(type,...)
Macro for logging error messages and terminating the application.
Definition Logger.h:41
#define LOG_WARN(...)
Macro for logging warning messages.
Definition Logger.h:40
std::complex< double > complex_t
Convenience alias for std::complex<double>.
Definition Utils.h:35
double N()
Definition BXsDecay.cpp:459
double h27(double z, double delta)
Definition BXsDecay.cpp:247
double F2nf(double z)
Definition BXsDecay.cpp:222
std::array< std::array< double, 8 >, 8 > K_2_b0()
Definition BXsDecay.cpp:295
double phi_77_rem(double phi_77_int)
Definition BXsDecay.cpp:352
double epsilon_em()
Definition BXsDecay.cpp:486
std::array< double, 8 > r_1(double z)
Definition BXsDecay.cpp:179
double F2a(double z)
Definition BXsDecay.cpp:320
double h28(double z, double delta)
Definition BXsDecay.cpp:252
double F2na(double z)
Definition BXsDecay.cpp:337
double phi_47(double delta)
Definition BXsDecay.cpp:139
double dr2_dlogz(double z)
Definition BXsDecay.cpp:385
double C8_em(double eta)
Definition BXsDecay.cpp:478
std::vector< ObservableValue > compute_observable(Observables obs) override
Compute an observable given a public observable enum.
Definition BXsDecay.cpp:512
double gen_P00(const std::array< std::array< double, 8 >, 8 > &K)
Definition BXsDecay.cpp:46
double P()
Definition BXsDecay.cpp:447
std::array< std::array< double, 8 >, 8 > phi_2_b0(double delta, double z)
Definition BXsDecay.cpp:269
static constexpr std::array< double, 8 > a_i
Definition BXsDecay.h:45
std::array< std::array< double, 8 >, 8 > K_1()
Definition BXsDecay.cpp:196
std::array< double, 8 > r_hat_2(double z)
Definition BXsDecay.cpp:284
double C()
Definition BXsDecay.cpp:493
double h22(double z, double delta)
Definition BXsDecay.cpp:243
double r2_large_z(double z)
Definition BXsDecay.cpp:381
double a(double z)
Definition BXsDecay.cpp:72
double C2_em(double eta)
Definition BXsDecay.cpp:472
complex_t G(double t)
Definition BXsDecay.cpp:99
void load_params() override
Load and cache parameters needed by this decay.
Definition BXsDecay.cpp:3
double phi_77(double delta)
Definition BXsDecay.cpp:145
double h77(double delta)
Definition BXsDecay.cpp:261
double phi_22(double z, double delta)
Definition BXsDecay.cpp:107
double r22(double z)
Definition BXsDecay.cpp:228
std::array< std::array< double, 8 >, 8 > phi_1(double delta, double z)
Definition BXsDecay.cpp:161
double h88(double delta)
Definition BXsDecay.cpp:257
double phi_88(double delta)
Definition BXsDecay.cpp:154
complex_t C7_em(double eta)
Definition BXsDecay.cpp:482
double r22_large_z(double z)
Definition BXsDecay.cpp:398
double phi_78(double delta)
Definition BXsDecay.cpp:150
std::array< std::array< double, 8 >, 8 > K_2_rem(double z)
Definition BXsDecay.cpp:362
static constexpr std::array< double, 8 > gamma_i7
Definition BXsDecay.h:44
double b(double z)
Definition BXsDecay.cpp:86
double gen_P01(const std::array< std::array< double, 8 >, 8 > &K)
Definition BXsDecay.cpp:60
static constexpr std::array< double, 8 > d_i
Definition BXsDecay.h:46
double BR_B_Xs_gamma()
Definition BXsDecay.cpp:504
double phi_27(double z, double delta)
Definition BXsDecay.cpp:123
double P22_rem()
Definition BXsDecay.cpp:403
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.
static double alpha_s(double mu, MassType mass_b_type=MassType::POLE, MassType mass_t_type=MassType::POLE)
Computes the strong coupling constant α_s at scale μ.
Definition QCDHelper.cpp:52
static std::vector< WCoef > get_group(WGroup g)
Returns the list of Wilson coefficients belonging to a WGroup.
constexpr double PI
Definition constants.h:7
constexpr double PI2
Definition constants.h:8
constexpr double ZETA3
Definition constants.h:14
constexpr double g
double integrate(RealValuedFunction f, double l, double u, double prec)
Performs numerical integration of a real-valued function of a real variable.
double Li3(double x)
Computes the trilogarithm function Li3(x).
Definition polylog.cpp:1267
double Li2(double x)
Computes the dilogarithm function Li2(x).
Definition polylog.cpp:1257
scalar_t pow(const scalar_t &base, const scalar_t &exp)
Definition scalar.cpp:75
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.
double I1(double x)
double kron(int x, int y)
Kronecker delta function.
Configuration for evaluating the strong coupling constant .
Definition Configs.h:206
double mu_c
Definition BXsDecay.h:22
double rand_err
Definition BXsDecay.h:28
double E0
Definition BXsDecay.h:18
double beta_0
Definition BXsDecay.h:16
double m_s
Definition BXsDecay.h:13
std::map< WCoef, complex_t > C_b_LO
Definition BXsDecay.h:30
double mu_b
Definition BXsDecay.h:15
double ckm_factor
Definition BXsDecay.h:14
double m_c_mu_c
Definition BXsDecay.h:25
double alpha_s_upsilon
Definition BXsDecay.h:17
std::map< WCoef, complex_t > C_b_NLO
Definition BXsDecay.h:31
double m_c
Definition BXsDecay.h:13
double m_W
Definition BXsDecay.h:13
double BR_B__Xc_e_nu_exp
Definition BXsDecay.h:19
const double X_b
Definition BXsDecay.h:27
double m_b_kin
Definition BXsDecay.h:12
double lambda_2
Definition BXsDecay.h:21
double rho_LS3
Definition BXsDecay.h:20
double m_b_mb
Definition BXsDecay.h:12
double eta
Definition BXsDecay.h:17
double alpha_em_0
Definition BXsDecay.h:11
double m_c_3gev
Definition BXsDecay.h:25
std::map< WCoef, complex_t > C_w
Definition BXsDecay.h:33
double alpha_s_mu_b
Definition BXsDecay.h:17
double delta
Definition BXsDecay.h:24
double L_b
Definition BXsDecay.h:26
double z0
Definition BXsDecay.h:23
double alpha_em
Definition BXsDecay.h:11
double r_msbar_1S
Definition BXsDecay.h:12
double L_c
Definition BXsDecay.h:26
double mu_G2
Definition BXsDecay.h:20
double z1
Definition BXsDecay.h:23
double mu_W
Definition BXsDecay.h:15
double rho_D3
Definition BXsDecay.h:20
std::map< WCoef, complex_t > C_b_NNLO
Definition BXsDecay.h:32
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