flexiblesusy is hosted by Hepforge, IPPP Durham
FlexibleSUSY
decay_Ah_to_dbard.inc
Go to the documentation of this file.
1template <>
2double CLASSNAME::get_partial_width<PseudoscalarHiggs, bar<DownTypeQuark>::type, DownTypeQuark>(
3 const context_base& context,
4 typename field_indices<PseudoscalarHiggs>::type const& indexIn,
5 typename field_indices<bar<DownTypeQuark>::type>::type const& indexOut1,
6 typename field_indices<DownTypeQuark>::type const& indexOut2)
7{
8 if (indexIn.at(0) < info::number_of_neutral_goldstones) {
9 throw OutOfBoundsError("Error in " + create_process_string<PseudoscalarHiggs,bar<DownTypeQuark>::type, DownTypeQuark>(indexIn, indexOut1, indexOut2) + " decay. Decaying particle is a Goldstone.");
10 }
11
12 // get HQQbar vertex
13 // we don't use amplitude_squared here because we need both this vertex
14 // both with running and pole masses
15 const auto indices = concatenate(indexOut1, indexOut2, indexIn);
16 const auto HQQbarVertexDR = Vertex<bar<DownTypeQuark>::type, DownTypeQuark, PseudoscalarHiggs>::evaluate(indices, context);
17
18 const double mAOS = context.physical_mass<PseudoscalarHiggs>(indexIn);
19 const double flux = 1./(2.*mAOS);
20
21 static constexpr double color_factor = squared_color_generator<PseudoscalarHiggs, bar<DownTypeQuark>::type, DownTypeQuark>();
22
23 if(!boost::range::equal(indexOut1, indexOut2)) {
24 if (!is_zero(HQQbarVertexDR.left()) || !is_zero(HQQbarVertexDR.right())) {
25 const double mdqOS1 = context.physical_mass<DownTypeQuark>(indexOut1);
26 const double mdqOS2 = context.physical_mass<DownTypeQuark>(indexOut2);
27 const auto xOS1 = Sqr(mdqOS1/mAOS);
28 const auto xOS2 = Sqr(mdqOS2/mAOS);
29 const double phase_space = 1./(8.*Pi) * std::sqrt(KallenLambda(1., xOS1, xOS2));
30 return flux * phase_space * color_factor * amplitude_squared<PseudoscalarHiggs, bar<DownTypeQuark>::type, DownTypeQuark>(context, indexIn, indexOut1, indexOut2);
31 }
32 return 0.;
33 }
34
35 const double mdqDR = context.mass<DownTypeQuark>(indexOut1);
36 const double mdqOS = context.physical_mass<DownTypeQuark>(indexOut1);
37 if(is_zero(mdqDR) || is_zero(mdqOS)) {
38 throw std::runtime_error(
39 create_process_string<PseudoscalarHiggs,bar<DownTypeQuark>::type, DownTypeQuark>(indexIn, indexOut1, indexOut2)
40 + ": Down-type quark cannot be massless. Aborting."
41 );
42 }
43 const auto xOS = Sqr(mdqOS/mAOS);
44 const auto xDR = Sqr(mdqDR/mAOS);
45
46 // TODO: add off-shell decays?
47 if (4.*std::max(xDR, xOS) > 1.) {
48 return 0.;
49 }
50
51 const auto betaOS = std::sqrt(1.-4.*xOS);
52 const auto betaDR = std::sqrt(1.-4.*xDR);
53
54 const double phase_spaceDR = 1./(8.*Pi) * std::sqrt(KallenLambda(1., xDR, xDR));
55 const double phase_spaceOS = 1./(8.*Pi) * std::sqrt(KallenLambda(1., xOS, xOS));
56
57 const auto HQQbarVertexDR_P = 0.5*(HQQbarVertexDR.right() - HQQbarVertexDR.left());
58
59 double amp2DR_P = 0;
60 double amp2OS_P = 0;
61 amp2DR_P = Sqr(mAOS) *
62 2*std::norm(HQQbarVertexDR_P);
63 amp2OS_P = Sqr(mAOS) *
64 2*std::norm(HQQbarVertexDR_P) * Sqr(mdqOS / mdqDR);
65
66 const int Nf = number_of_active_flavours(qedqcd, mAOS);
67 if (Nf < 5) {
68 problems.add_warning(
69 create_process_string<PseudoscalarHiggs,bar<DownTypeQuark>::type, DownTypeQuark>(indexIn, indexOut1, indexOut2)
70 + ": Cannot determine the number of active quark flavours. Disabling higher-order corrections."
71 );
72 }
73
74 if (static_cast<int>(flexibledecay_settings.get(FlexibleDecay_settings::include_higher_order_corrections)) > 0 && Nf >= 5) {
75 double alpha_s_red;
76 double Y_conversion = 1.;
77 switch (Nf) {
78 case 5: {
79 auto qedqcd_ = qedqcd;
80 qedqcd_.to(mAOS);
81 alpha_s_red = qedqcd_.displayAlpha(softsusy::ALPHAS)/Pi;
82 Y_conversion = Sqr(qedqcd_.displayDownQuarkRunningMass(indexOut1.at(0))/mdqDR);
83 break;
84 }
85 case 6:
86 alpha_s_red = get_alphas(context)/Pi;
87 break;
88 default:
89 throw std::runtime_error(
90 create_process_string<PseudoscalarHiggs,bar<DownTypeQuark>::type, DownTypeQuark>(indexIn, indexOut1, indexOut2)
91 + ": Cannot determine the number of active quark flavours"
92 );
93 }
94
95 double deltaqq_QCD_DR_P = calc_Deltaqq(alpha_s_red, Nf, flexibledecay_settings);
96
97 // 1L QED correction - eq. 17 in FD paper
98 const double alpha_red = get_alpha(context)/Pi;
99 const double deltaqq_QED_DR = 17./4.*Sqr(DownTypeQuark::electricCharge)*alpha_red;
100
101 deltaqq_QCD_DR_P +=
102 2.*(1. - 6.*xDR)/(1-4.*xDR)*(4./3. - std::log(xDR))*alpha_s_red +
103 4./3.*alpha_s_red*calc_DeltaAh(betaDR);
104
105 const double deltaqq_QCD_OS_P =
106 4./3. * alpha_s_red * calc_DeltaAh(betaOS);
107
108 const double deltaqq_QED_OS_P =
109 alpha_red * Sqr(DownTypeQuark::electricCharge) * calc_DeltaAh(betaOS);
110
111 const auto gbHoVEV_P = HQQbarVertexDR_P/context.mass<DownTypeQuark>(indexOut1);
112 double deltaPhi2_P = 0.;
113 double deltaqq_QCDxQED_DR = 0.;
114
115 if (static_cast<int>(flexibledecay_settings.get(FlexibleDecay_settings::include_higher_order_corrections)) > 1) {
116 deltaqq_QCDxQED_DR =
117 deltaqq_QCDxQED*Sqr(DownTypeQuark::electricCharge)*alpha_red*alpha_s_red;
118 if (!is_zero(gbHoVEV_P)) {
119 const double mtpole = qedqcd.displayPoleMt();
120 const double lt = std::log(Sqr(mAOS/mtpole));
121 const double lq = std::log(xDR);
122 const auto Ahttindices = concatenate(std::array<int, 1> {2}, std::array<int, 1> {2}, indexIn);
123 const auto Ahttbar = Vertex<bar<UpTypeQuark>::type, UpTypeQuark, PseudoscalarHiggs>::evaluate(Ahttindices, context);
124 const auto Ahttbar_P = 0.5*(Ahttbar.right() - Ahttbar.left());
125 const auto gtHoVEV_P = Ahttbar_P/context.mass<UpTypeQuark>({2});
126 deltaPhi2_P = Sqr(alpha_s_red) * std::real(gtHoVEV_P/gbHoVEV_P) * (23/6. - lt + 1.0/6.0*Sqr(lq));
127 }
128 }
129
130 amp2DR_P *= Y_conversion*(1. + deltaqq_QCD_DR_P + deltaqq_QED_DR + deltaqq_QCDxQED_DR + deltaPhi2_P);
131 amp2OS_P *= 1. + deltaqq_QCD_OS_P + deltaqq_QED_OS_P;
132 }
133
134 // low x limit
135 double result_DR =
136 flux * color_factor * phase_spaceDR * amp2DR_P;
137 // high x limit
138 double result_OS =
139 flux * color_factor * phase_spaceOS * amp2OS_P;
140
141 const double result = (1-4.*xOS)*result_DR + 4*xOS*result_OS;
142
143 return result;
144}
bool is_zero(double x) noexcept
Definition: ckm.cpp:30
constexpr T norm(const Complex< T > &z) noexcept
Definition: complex.hpp:66
static constexpr double deltaqq_QCDxQED
double calc_DeltaAh(double b) noexcept
std::string create_process_string(std::array< int, FieldIn::numberOfFieldIndices > const in, std::array< int, FieldOut1::numberOfFieldIndices > const out1, std::array< int, FieldOut2::numberOfFieldIndices > const out2)
Definition: decay.hpp:152
unsigned int number_of_active_flavours(softsusy::QedQcd const &qedqcd, double m) noexcept
double calc_Deltaqq(double alpha_s_red, double Nf, FlexibleDecay_settings const &settings) noexcept
Eq.(2.11) of hep-ph/0503173, 2-loop and higher order.
constexpr std::complex< T > Sqr(const std::complex< T > &a) noexcept
Definition: wrappers.hpp:631
detail::result_of::concatenate< Args... >::type concatenate(Args &&... args)
Definition: concatenate.hpp:87
T KallenLambda(T x, T y, T z) noexcept
Definition: wrappers.hpp:835
Complex< T > log(const Complex< T > &z) noexcept
Definition: complex.hpp:54
static constexpr double Pi
Definition: wrappers.hpp:44
@ ALPHAS
Definition: lowe.h:44