16 #include <boost/bind.hpp>
18 #include <gsl/gsl_sf_zeta.h>
19 #include <gsl/gsl_sf_gegenbauer.h>
22 : SM(SM_i), myF_1(new
F_1()), myF_2(new
F_2())
30 w_GSL = gsl_integration_cquad_workspace_alloc (100);
38 dispersion = SM.getFlavour().getFlagUseDispersionRelation();
39 FixedWCbtos = SM.getFlavour().getFlagFixedWCbtos();
41 #if NFPOLARBASIS_MVGAMMA
43 "a_0T1phi" <<
"a_0A1phi" <<
"a_0Vphi" <<
44 "absh_p" <<
"absh_m" <<
"argh_p" <<
"argh_m" <<
"SU3_breaking_abs" <<
"SU3_breaking_arg";
47 "absh_p" <<
"absh_m" <<
"argh_p" <<
"argh_m";
50 "absh_p" <<
"absh_m" <<
"argh_p" <<
"argh_m";
53 "absh_p" <<
"absh_m" <<
"argh_p" <<
"argh_m";
56 "a_0T1phi" <<
"a_0A1phi" <<
"a_0Vphi" <<
57 "reh_p" <<
"reh_m" <<
"imh_p" <<
"imh_m" <<
"SU3_breaking_abs" <<
"SU3_breaking_arg";
60 "reh_p" <<
"reh_m" <<
"imh_p" <<
"imh_m";
63 "reh_p" <<
"reh_m" <<
"imh_p" <<
"imh_m";
66 "reh_p" <<
"reh_m" <<
"imh_p" <<
"imh_m";
69 std::stringstream out;
71 throw std::runtime_error(
"MVgamma: vector " + out.str() +
" not implemented");
75 mVgammaParameters.clear();
77 "a_0T1phi" <<
"a_0A1phi" <<
"a_0Vphi" <<
78 "r1_1" <<
"r2_1" <<
"deltaC9_1" <<
"phDC9_1" <<
"r1_2" <<
"r2_2" <<
"deltaC9_2" <<
"phDC9_2" <<
"SU3_breaking_abs" <<
"SU3_breaking_arg";
81 "r1_1" <<
"r2_1" <<
"deltaC9_1" <<
"phDC9_1" <<
"r1_2" <<
"r2_2" <<
"deltaC9_2" <<
"phDC9_2";
84 "r1_1" <<
"r2_1" <<
"deltaC9_1" <<
"phDC9_1" <<
"r1_2" <<
"r2_2" <<
"deltaC9_2" <<
"phDC9_2";
87 "r1_1" <<
"r2_1" <<
"deltaC9_1" <<
"phDC9_1" <<
"r1_2" <<
"r2_2" <<
"deltaC9_2" <<
"phDC9_2";
89 std::stringstream out;
91 throw std::runtime_error(
"MVgamma: vector " + out.str() +
" not implemented");
95 if (FixedWCbtos) mVgammaParameters.push_back(
"C7_SM" );
97 SM.initializeMeson(meson);
98 SM.initializeMeson(vectorM);
99 return mVgammaParameters;
104 if (!SM.getFlavour().getUpdateFlag(meson, vectorM,
QCD::NOLEPTON))
return;
108 MM = SM.getMesons(meson).getMass();
110 MV = SM.getMesons(vectorM).getMass();
118 fB = SM.getMesons(meson).getDecayconst();
119 width = SM.getMesons(meson).computeWidth();
125 a_0T1 = SM.getOptionalParameter(
"a_0T1");
126 a_0A1 = SM.getOptionalParameter(
"a_0A1");
127 a_0V = SM.getOptionalParameter(
"a_0V");
128 lambda_t = SM.getCKM().computelamt_s();
129 lambda_u = SM.getCKM().computelamu_s();
134 a_0T1 = SM.getOptionalParameter(
"a_0T1");
135 a_0A1 = SM.getOptionalParameter(
"a_0A1");
136 a_0V = SM.getOptionalParameter(
"a_0V");
137 lambda_t = SM.getCKM().computelamt_s();
138 lambda_u = SM.getCKM().computelamu_s();
143 a_0T1 = SM.getOptionalParameter(
"a_0T1phi");
144 a_0A1 = SM.getOptionalParameter(
"a_0A1phi");
145 a_0V = SM.getOptionalParameter(
"a_0Vphi");
146 lambda_t = SM.getCKM().computelamt_s();
147 lambda_u = SM.getCKM().computelamu_s();
150 SM.getOptionalParameter(
"SU3_breaking_arg"),
true);
153 a_0T1 = SM.getOptionalParameter(
"a_0T1rho");
154 a_0A1 = SM.getOptionalParameter(
"a_0A1rho");
155 a_0V = SM.getOptionalParameter(
"a_0Vrho");
156 lambda_t = SM.getCKM().computelamt_d();
157 lambda_u = SM.getCKM().computelamu_d();
162 a_0T1 = SM.getOptionalParameter(
"a_0T1rho");
163 a_0A1 = SM.getOptionalParameter(
"a_0A1rho");
164 a_0V = SM.getOptionalParameter(
"a_0Vrho");
165 lambda_t = SM.getCKM().computelamt_d();
166 lambda_u = SM.getCKM().computelamu_d();
171 a_0T1 = SM.getOptionalParameter(
"a_0T1omega");
172 a_0A1 = SM.getOptionalParameter(
"a_0A1omega");
173 a_0V = SM.getOptionalParameter(
"a_0Vomega");
174 lambda_t = SM.getCKM().computelamt_d();
175 lambda_u = SM.getCKM().computelamu_d();
180 std::stringstream out;
182 throw std::runtime_error(
"MVgamma: vector " + out.str() +
" not implemented");
185 fpara = SM.getMesons(vectorM).getDecayconst();
186 fperp = SM.getMesons(vectorM).getDecayconst_p();
188 double ms_over_mb = SM.Mrun(
mu_b, SM.getQuarks(
QCD::STRANGE).getMass_scale(),
194 #if NFPOLARBASIS_MVGAMMA
195 h[0] =
gslpp::complex(SM.getOptionalParameter(
"absh_p"), SM.getOptionalParameter(
"argh_p"),
true);
196 h[1] =
gslpp::complex(SM.getOptionalParameter(
"absh_m"), SM.getOptionalParameter(
"argh_m"),
true);
197 h[1] *= 2. * (
Mb /
MM) / (16. * M_PI * M_PI) * (T_1() *
lambda /
MM2) ;
198 h[0] += ms_over_mb *
h[1] ;
209 h[0] =
gslpp::complex(SM.getOptionalParameter(
"reh_p"), SM.getOptionalParameter(
"imh_p"),
false);
210 h[1] =
gslpp::complex(SM.getOptionalParameter(
"reh_m"), SM.getOptionalParameter(
"imh_m"),
false);
211 h[1] *= 2. * (
Mb /
MM) / (16. * M_PI * M_PI) * (T_1() *
lambda /
MM2) ;
212 h[0] += ms_over_mb *
h[1] ;
228 r1_1 = SM.getOptionalParameter(
"r1_1");
229 r1_2 = SM.getOptionalParameter(
"r1_2");
230 r2_1 = SM.getOptionalParameter(
"r2_1");
231 r2_2 = SM.getOptionalParameter(
"r2_2");
232 deltaC9_1 = SM.getOptionalParameter(
"deltaC9_1");
233 deltaC9_2 = SM.getOptionalParameter(
"deltaC9_2");
242 allcoeff = SM.getFlavour().ComputeCoeffBMll(
mu_b,
QCD::MU);
243 allcoeffprime = SM.getFlavour().ComputeCoeffprimeBMll(
mu_b,
QCD::MU);
245 C_1 = (*(allcoeff[
LO]))(0) + (*(allcoeff[
NLO]))(0);
246 C_2 = (*(allcoeff[
LO]))(1) + (*(allcoeff[
NLO]))(1);
247 C_3 = (*(allcoeff[
LO]))(2) + (*(allcoeff[
NLO]))(2);
248 C_4 = (*(allcoeff[
LO]))(3) + (*(allcoeff[
NLO]))(3);
249 C_5 = (*(allcoeff[
LO]))(4) + (*(allcoeff[
NLO]))(4);
250 C_6 = (*(allcoeff[
LO]))(5) + (*(allcoeff[
NLO]))(5);
251 C_8 = (*(allcoeff[
LO]))(7) + (*(allcoeff[
NLO]))(7);
255 C_7 = SM.getOptionalParameter(
"C7_SM") + ((*(allcoeff_noSM[
LO]))(6) + (*(allcoeff_noSM[
NLO]))(6));
257 else C_7 = ((*(allcoeff[
LO]))(6) + (*(allcoeff[
NLO]))(6));
258 C_7p = ms_over_mb * ((*(allcoeffprime[
LO]))(6) + (*(allcoeffprime[
NLO]))(6));
261 C_7p += ms_over_mb * (-C_7 - 1. / 3. *
C_3 - 4 / 9 *
C_4 - 20. / 3. * C_5 - 80. / 9. * C_6);
263 allcoeff = SM.getFlavour().ComputeCoeffsgamma(
mu_b);
264 allcoeffprime = SM.getFlavour().ComputeCoeffprimesgamma(
mu_b);
266 C_1 = (*(allcoeff[
LO]))(0) + (*(allcoeff[
NLO]))(0);
267 C_2 = (*(allcoeff[
LO]))(1) + (*(allcoeff[
NLO]))(1);
268 C_3 = (*(allcoeff[
LO]))(2) + (*(allcoeff[
NLO]))(2);
269 C_4 = (*(allcoeff[
LO]))(3) + (*(allcoeff[
NLO]))(3);
270 C_5 = (*(allcoeff[
LO]))(4) + (*(allcoeff[
NLO]))(4);
271 C_6 = (*(allcoeff[
LO]))(5) + (*(allcoeff[
NLO]))(5);
272 C_8 = (*(allcoeff[
LO]))(7) + (*(allcoeff[
NLO]))(7);
275 allcoeff_noSM = SM.getFlavour().ComputeCoeffsgamma(
mu_b,
true);
276 C_7 = SM.getOptionalParameter(
"C7_SM") + ((*(allcoeff_noSM[
LO]))(6) + (*(allcoeff_noSM[
NLO]))(6));
278 else C_7 = ((*(allcoeff[
LO]))(6) + (*(allcoeff[
NLO]))(6)););
279 C_7p = (*(allcoeffprime[
LO]))(6) + (*(allcoeffprime[
NLO]))(6);
281 C_7p += -ms_over_mb * C_7 - 1. / 3. *
C_3 - 4 / 9 *
C_4 - 20. / 3. * C_5 - 80. / 9. * C_6;
283 DC7_QCDF = deltaC7_QCDF(
false);
284 DC7_QCDF_bar = deltaC7_QCDF(
true);
286 gsl_error_handler_t * old_handler = gsl_set_error_handler_off();
289 if (gsl_integration_cquad(&f_GSL, 0., 1., 1.e-2, 1.e-1, w_GSL, &average, &error, NULL) != 0) T_perp_real = std::numeric_limits<double>::quiet_NaN();
290 T_perp_real = average;
293 if (gsl_integration_cquad(&f_GSL, 0., 1., 1.e-2, 1.e-1, w_GSL, &average, &error, NULL) != 0) T_perp_imag = std::numeric_limits<double>::quiet_NaN();
294 T_perp_imag = average;
296 f_GSL =
convertToGslFunction(boost::bind(&MVgamma::getT_perp_bar_integrand_real, &(*
this), _1));
297 if (gsl_integration_cquad(&f_GSL, 0., 1., 1.e-2, 1.e-1, w_GSL, &average, &error, NULL) != 0) T_perp_bar_real = std::numeric_limits<double>::quiet_NaN();
298 T_perp_bar_real = average;
300 f_GSL =
convertToGslFunction(boost::bind(&MVgamma::getT_perp_bar_integrand_imag, &(*
this), _1));
301 if (gsl_integration_cquad(&f_GSL, 0., 1., 1.e-2, 1.e-1, w_GSL, &average, &error, NULL) != 0) T_perp_bar_imag = std::numeric_limits<double>::quiet_NaN();
302 T_perp_bar_imag = average;
304 gsl_set_error_handler(old_handler);
306 SM.getFlavour().setUpdateFlag(meson, vectorM,
QCD::NOLEPTON,
false);
313 double MVgamma::T_1()
323 #if FULLNLOQCDF_MVGAMMA
335 #if FULLNLOQCDF_MVGAMMA
337 return -alpha_s_mub / (4. * M_PI) * (delta_t -
lambda_u /
lambda_t * delta_u);
339 return -alpha_s_mub / (4. * M_PI) * delta_t;
344 #if FULLNLOQCDF_MVGAMMA
346 return -alpha_s_mub / (4. * M_PI) * (delta_t - (
lambda_u /
lambda_t).conjugate() * delta_u);
348 return -alpha_s_mub / (4. * M_PI) * delta_t;
357 if (meson ==
QCD::B_P) T_u = -3.*C_2;
358 else if (vectorM ==
QCD::PHI) T_t = T_t + 6.*(
C_3 + 10.*C_5);
359 else if (vectorM ==
QCD::RHO) T_u = 4./3.*C_1 + C_2;
361 T_u = -4./3.*C_1 + C_2;
362 T_t = T_t + 6.*2.*(
C_3 + 10.*C_5);
380 if (x == 0.)
return -(M_PI*M_PI/6.);
381 if (x == 1.)
return 0.;
382 else return log((x-1.)/x)*
log(1.-x) - (M_PI*M_PI/6.) +
dilog(x/(x-1.));
385 double MVgamma::phi_V(
double u)
387 return 6.* u * (1. - u) * (1. + SM.getMesons(vectorM).getGegenalpha(0) * gsl_sf_gegenpoly_1(3./2., (2.*u - 1.)) + SM.getMesons(vectorM).getGegenalpha(1) * gsl_sf_gegenpoly_2(3./2., (2.*u - 1.)));
392 double ubar = 1. - u;
404 #if FULLNLOQCDF_MVGAMMA
409 + ed * t_perp_0 * (-
C_3 +
C_4/6. - 16.*C_5 + 8.*C_6/3.));
415 return (alpha_s_mub/(3.*M_PI))*
MM/(2.*
mb_pole)*(eu * t_perp_mc * (-C_1/6. + C_2 + 6.*C_6));
421 return -(alpha_s_mub/(3.*M_PI))*4.*(-1./3.)*C_8/u;
427 gslpp::complex T_amp = N/SM.getMesons(meson).getLambdaM() * phi_V(u) * (T_perp_plus_O8(u) + T_perp_plus_QSS(u, conjugate));
428 #if FULLNLOQCDF_MVGAMMA
429 double ubar = 1. - u;
430 T_amp += N * phi_V(u)/ubar * T_perp_WA_1() + N/SM.getMesons(meson).getLambdaM() *
fpara/
fperp *
MV * T_perp_WA_2(conjugate);
459 std::stringstream out;
461 throw std::runtime_error(
"MVgamma: hel " + out.str() +
" not implemented, can only be 1 (+) or 2 (-)");
529 std::stringstream out;
531 throw std::runtime_error(
"MVgamma: vector " + out.str() +
" not implemented");
537 double MM2 = MM * MM;
541 double lambda = MM2 -
pow(MV, 2.);
544 return ale *
pow(GF * Mb / (4 * M_PI * M_PI), 2.) * MM * lambda / (4. * width) * (HVp.
abs2() + HVm.
abs2() + HVp_bar.
abs2() + HVm_bar.
abs2()) *
t_int;
684 std::stringstream out;
686 throw std::runtime_error(
"MVgamma: vector " + out.str() +
" not implemented");
720 std::stringstream out;
722 throw std::runtime_error(
"MVgamma: vector " + out.str() +
" not implemented");
879 double MM2 = MM * MM;
900 double MM2 = MM * MM;
921 double MM2 = MM * MM;
942 double MM2 = MM * MM;
963 double MM2 = MM * MM;
984 double MM2 = MM * MM;