flexiblesusy is hosted by Hepforge, IPPP Durham
FlexibleSUSY
decay_H_to_dbard.inc
Go to the documentation of this file.
1template <>
2double CLASSNAME::get_partial_width<Higgs,bar<DownTypeQuark>::type,DownTypeQuark>(
3 const context_base& context,
4 typename field_indices<Higgs>::type const& indexIn,
5 typename field_indices<DownTypeQuark>::type const& indexOut1,
6 typename field_indices<DownTypeQuark>::type const& indexOut2)
7{
8 // get HQQbar vertex
9 // we don't use amplitude_squared here because we need this vertex
10 // both with running and pole masses
11 const auto indices = concatenate(indexOut1, indexOut2, indexIn);
12 const auto HQQbarVertexDR = Vertex<bar<DownTypeQuark>::type, DownTypeQuark, Higgs>::evaluate(indices, context);
13
14 const double mHOS = context.physical_mass<Higgs>(indexIn);
15 const double flux = 1./(2.*mHOS);
16
17 static constexpr double color_factor = squared_color_generator<Higgs,bar<DownTypeQuark>::type,DownTypeQuark>();
18
19 if(!boost::range::equal(indexOut1, indexOut2)) {
20 if (!is_zero(HQQbarVertexDR.left()) || !is_zero(HQQbarVertexDR.right())) {
21 const double mdqOS1 = context.physical_mass<DownTypeQuark>(indexOut1);
22 const double mdqOS2 = context.physical_mass<DownTypeQuark>(indexOut2);
23 const auto xOS1 = Sqr(mdqOS1/mHOS);
24 const auto xOS2 = Sqr(mdqOS2/mHOS);
25 const double phase_space = 1./(8.*Pi) * std::sqrt(KallenLambda(1., xOS1, xOS2));
26 return flux * phase_space * color_factor * amplitude_squared<Higgs, bar<DownTypeQuark>::type, DownTypeQuark>(context, indexIn, indexOut1, indexOut2);
27 }
28 return 0.;
29 }
30
31 const double mdqDR = context.mass<DownTypeQuark>(indexOut1);
32 const double mdqOS = context.physical_mass<DownTypeQuark>(indexOut1);
33 if(is_zero(mdqDR) || is_zero(mdqOS)) {
34 throw std::runtime_error(
35 create_process_string<Higgs,bar<DownTypeQuark>::type, DownTypeQuark>(indexIn, indexOut1, indexOut2)
36 + ": Down-type quark cannot be massless. Aborting."
37 );
38 }
39 const auto xOS = Sqr(mdqOS/mHOS);
40 const auto xDR = Sqr(mdqDR/mHOS);
41
42 // TODO: add off-shell decays?
43 if (4.*std::max(xDR, xOS) > 1.) {
44 return 0.;
45 }
46
47 const auto betaOS = std::sqrt(1.-4.*xOS);
48 const auto betaDR = std::sqrt(1.-4.*xDR);
49
50 const double phase_spaceDR = 1./(8.*Pi) * std::sqrt(KallenLambda(1., xDR, xDR));
51 const double phase_spaceOS = 1./(8.*Pi) * std::sqrt(KallenLambda(1., xOS, xOS));
52
53 const auto HQQbarVertexDR_S = 0.5*(HQQbarVertexDR.left() + HQQbarVertexDR.right());
54 const auto HQQbarVertexDR_P = 0.5*(HQQbarVertexDR.right() - HQQbarVertexDR.left());
55
56 double amp2DR_S = Sqr(mHOS) * Sqr(betaDR) *
57 2*std::norm(HQQbarVertexDR_S);
58 double amp2OS_S = Sqr(mHOS) * Sqr(betaOS) *
59 2*std::norm(HQQbarVertexDR_S) * Sqr(mdqOS / mdqDR);
60
61 double amp2DR_P = 0;
62 double amp2OS_P = 0;
63 if (info::is_CP_violating_Higgs_sector) {
64 amp2DR_P = Sqr(mHOS) *
65 2*std::norm(HQQbarVertexDR_P);
66 amp2OS_P = Sqr(mHOS) *
67 2*std::norm(HQQbarVertexDR_P) * Sqr(mdqOS / mdqDR);
68 }
69
70 const int Nf = number_of_active_flavours(qedqcd, mHOS);
71 if (Nf < 5) {
72 problems.add_warning(
73 create_process_string<Higgs,bar<DownTypeQuark>::type, DownTypeQuark>(indexIn, indexOut1, indexOut2)
74 + ": Cannot determine the number of active quark flavours. Disabling higher-order corrections."
75 );
76 }
77
78 if (static_cast<int>(flexibledecay_settings.get(FlexibleDecay_settings::include_higher_order_corrections)) > 0 && Nf >= 5) {
79 double alpha_s_red;
80 double Y_conversion = 1.;
81 switch (Nf) {
82 case 5: {
83 auto qedqcd_ = qedqcd;
84 qedqcd_.to(mHOS);
85 alpha_s_red = qedqcd_.displayAlpha(softsusy::ALPHAS)/Pi;
86 Y_conversion = Sqr(qedqcd_.displayDownQuarkRunningMass(indexOut1.at(0))/mdqDR);
87 break;
88 }
89 case 6:
90 alpha_s_red = get_alphas(context)/Pi;
91 break;
92 default:
93 throw std::runtime_error(
94 create_process_string<Higgs,bar<DownTypeQuark>::type, DownTypeQuark>(indexIn, indexOut1, indexOut2)
95 + ": Cannot determine the number of active quark flavours"
96 );
97 }
98 double deltaqq_QCD_DR_S = calc_Deltaqq(alpha_s_red, Nf, flexibledecay_settings);
99 double deltaqq_QCD_DR_P = deltaqq_QCD_DR_S;
100
101 // 1L QED correction - eq. 17 in FD paper
102 const double alpha_red = get_alpha(context)/Pi;
103 const double deltaqq_QED_DR = 17./4.*Sqr(DownTypeQuark::electricCharge)*alpha_red;
104
105 deltaqq_QCD_DR_S +=
106 2.*(1. - 10.*xDR)/(1-4.*xDR)*(4./3. - std::log(xDR))*alpha_s_red +
107 4./3.*alpha_s_red*calc_DeltaH(betaDR);
108
109 const double deltaqq_QCD_OS_S =
110 4./3. * alpha_s_red * calc_DeltaH(betaOS);
111
112 const double deltaqq_QED_OS_S =
113 alpha_red * Sqr(DownTypeQuark::electricCharge) * calc_DeltaH(betaOS);
114
115 double deltaPhi2_S = 0.;
116 double deltaqq_QCD_OS_P = 0.;
117 double deltaqq_QED_OS_P = 0.;
118 double deltaPhi2_P = 0.;
119 double deltaqq_QCDxQED_DR = 0.;
120 if (static_cast<int>(flexibledecay_settings.get(FlexibleDecay_settings::include_higher_order_corrections)) > 1) {
121
122 deltaqq_QCDxQED_DR =
123 deltaqq_QCDxQED*Sqr(DownTypeQuark::electricCharge)*alpha_red*alpha_s_red;
124
125 const double mtpole = qedqcd.displayPoleMt();
126 const double lt = std::log(Sqr(mHOS/mtpole));
127 const double lq = std::log(xDR);
128 const auto Httindices = concatenate(std::array<int, 1> {2}, std::array<int, 1> {2}, indexIn);
129 const auto Httbar = Vertex<bar<UpTypeQuark>::type, UpTypeQuark, Higgs>::evaluate(Httindices, context);
130 const auto gbHoVEV = HQQbarVertexDR_S/mdqDR;
131 if (!is_zero(gbHoVEV)) {
132 // eq. 28 of hep-ph/9505358
133 const auto Httbar_S = 0.5*(Httbar.left() + Httbar.right());
134 const auto gtHoVEV = Httbar_S/context.mass<UpTypeQuark>({2});
135 deltaPhi2_S = Sqr(alpha_s_red) * std::real(gtHoVEV/gbHoVEV) * (8/3. - Sqr(Pi/3.) - 2.0/3.0*lt + 1.0/9.0*Sqr(lq));
136 }
137
138 // don't waste time computing it in models without CPV
139 if (info::is_CP_violating_Higgs_sector) {
140
141 deltaqq_QCD_DR_P +=
142 2.*(1. - 6.*xDR)/(1-4.*xDR)*(4./3. - std::log(xDR))*alpha_s_red +
143 4./3.*alpha_s_red*calc_DeltaAh(betaDR);
144
145 deltaqq_QCD_OS_P =
146 4./3. * alpha_s_red * calc_DeltaAh(betaOS);
147
148 deltaqq_QED_OS_P =
149 alpha_red * Sqr(DownTypeQuark::electricCharge) * calc_DeltaAh(betaOS);
150
151 const auto gbHoVEV_P = HQQbarVertexDR_P/mdqDR;
152 if (!is_zero(gbHoVEV_P)) {
153 const auto Httbar_P = 0.5*(Httbar.right() - Httbar.left());
154 const auto gtHoVEV_P = Httbar_P/context.mass<UpTypeQuark>({2});
155 deltaPhi2_P = Sqr(alpha_s_red) * std::real(gtHoVEV_P/gbHoVEV_P) * (23/6. - lt + 1.0/6.0*Sqr(lq));
156 }
157 }
158 }
159
160 amp2DR_S *= Y_conversion*(1. + deltaqq_QCD_DR_S + deltaqq_QED_DR + deltaqq_QCDxQED_DR + deltaPhi2_S);
161 amp2DR_P *= Y_conversion*(1. + deltaqq_QCD_DR_P + deltaqq_QED_DR + deltaqq_QCDxQED_DR + deltaPhi2_P);
162 amp2OS_S *= 1. + deltaqq_QCD_OS_S + deltaqq_QED_OS_S;
163 amp2OS_P *= 1. + deltaqq_QCD_OS_P + deltaqq_QED_OS_P;
164 }
165
166 // low x limit
167 const double result_DR_S =
168 flux * color_factor * phase_spaceDR * amp2DR_S;
169 const double result_DR_P =
170 flux * color_factor * phase_spaceDR * amp2DR_P;
171 // high x limit
172 const double result_OS_S =
173 flux * color_factor * phase_spaceOS * amp2OS_S;
174 const double result_OS_P =
175 flux * color_factor * phase_spaceOS * amp2OS_P;
176
177 const double result_S = (1-4.*xOS)*result_DR_S + 4*xOS*result_OS_S;
178 const double result_P = (1-4.*xOS)*result_DR_P + 4*xOS*result_OS_P;
179
180 return result_S + result_P;
181}
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_DeltaH(double b) noexcept
Eq.(2.6) of hep-ph/0503173.
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