flexiblesusy is hosted by Hepforge, IPPP Durham
FlexibleSUSY
decay_Ah_to_ubaru.inc
Go to the documentation of this file.
1template <>
2double CLASSNAME::get_partial_width<PseudoscalarHiggs, bar<UpTypeQuark>::type, UpTypeQuark>(
3 const context_base& context,
4 typename field_indices<PseudoscalarHiggs>::type const& indexIn,
5 typename field_indices<UpTypeQuark>::type const& indexOut1,
6 typename field_indices<UpTypeQuark>::type const& indexOut2)
7{
8 if (indexIn.at(0) < info::number_of_neutral_goldstones) {
9 throw OutOfBoundsError("Error in " + create_process_string<PseudoscalarHiggs,bar<UpTypeQuark>::type, UpTypeQuark>(indexIn, indexOut1, indexOut2) + " decay. Decaying particle is a Goldstone.");
10 }
11
12 // get AhQQbar 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 AhQQbarVertexDR = Vertex<bar<UpTypeQuark>::type, UpTypeQuark, PseudoscalarHiggs>::evaluate(indices, context);
17
18 const double mAhOS = context.physical_mass<PseudoscalarHiggs>(indexIn);
19 const double flux = 1./(2.*mAhOS);
20
21 static constexpr double color_factor = squared_color_generator<PseudoscalarHiggs, bar<UpTypeQuark>::type, UpTypeQuark>();
22
23 // flavour-violating decay
24 if(!boost::range::equal(indexOut1, indexOut2)) {
25 const double muqOS1 = context.physical_mass<UpTypeQuark>(indexOut1);
26 const double muqOS2 = context.physical_mass<UpTypeQuark>(indexOut2);
27 if (mAhOS > muqOS1 + muqOS2 && (!is_zero(AhQQbarVertexDR.left()) || !is_zero(AhQQbarVertexDR.right()))) {
28 const auto xOS1 = Sqr(muqOS1/mAhOS);
29 const auto xOS2 = Sqr(muqOS2/mAhOS);
30 const double phase_space = 1./(8.*Pi) * std::sqrt(KallenLambda(1., xOS1, xOS2));
31 return flux * phase_space * color_factor * amplitude_squared<PseudoscalarHiggs, bar<UpTypeQuark>::type, UpTypeQuark>(context, indexIn, indexOut1, indexOut2);
32 }
33 return 0.;
34 }
35
36 const double muqDR = context.mass<UpTypeQuark>(indexOut1);
37 const double muqOS = context.physical_mass<UpTypeQuark>(indexOut1);
38 if(is_zero(muqDR) || is_zero(muqOS)) {
39 throw std::runtime_error(
40 create_process_string<PseudoscalarHiggs,bar<UpTypeQuark>::type, UpTypeQuark>(indexIn, indexOut1, indexOut2)
41 + ": Up-type quark cannot be massless. Aborting."
42 );
43 }
44 const auto xOS = Sqr(muqOS/mAhOS);
45 const auto xDR = Sqr(muqDR/mAhOS);
46
47 double result = 0.;
48
49 const auto AhQQbarVertexDR_P = 0.5*(AhQQbarVertexDR.right() - AhQQbarVertexDR.left());
50
51 const double phase_spaceOS = 1./(8.*Pi) * std::sqrt(KallenLambda(1., xOS, xOS));
52
53 // off-shell decay
54 if (4.*std::max(xDR, xOS) > 1.) {
55 }
56 else {
57 const auto betaOS = std::sqrt(1.-4.*xOS);
58 const auto betaDR = std::sqrt(1.-4.*xDR);
59
60 const double phase_spaceDR = 1./(8.*Pi) * std::sqrt(KallenLambda(1., xDR, xDR));
61
62 double amp2DR_P = 0;
63 double amp2OS_P = 0;
64 amp2DR_P = Sqr(mAhOS) *
65 2*std::norm(AhQQbarVertexDR_P);
66 amp2OS_P = Sqr(mAhOS) *
67 2*std::norm(AhQQbarVertexDR_P) * Sqr(muqOS / muqDR);
68
69 const int Nf = number_of_active_flavours(qedqcd, mAhOS);
70 if (Nf < 5) {
71 problems.add_warning(
72 create_process_string<PseudoscalarHiggs,bar<UpTypeQuark>::type, UpTypeQuark>(indexIn, indexOut1, indexOut2)
73 + ": Cannot determine the number of active quark flavours. Disabling higher-order corrections."
74 );
75 }
76
77 if (static_cast<int>(flexibledecay_settings.get(FlexibleDecay_settings::include_higher_order_corrections)) > 0 && Nf >= 5) {
78 double alpha_s_red;
79 double Y_conversion = 1.;
80 switch (Nf) {
81 case 5: {
82 auto qedqcd_ = qedqcd;
83 qedqcd_.to(mAhOS);
84 alpha_s_red = qedqcd_.displayAlpha(softsusy::ALPHAS)/Pi;
85 Y_conversion = Sqr(qedqcd_.displayUpQuarkRunningMass(indexOut1.at(0))/muqDR);
86 break;
87 }
88 case 6:
89 alpha_s_red = get_alphas(context)/Pi;
90 break;
91 default:
92 throw std::runtime_error(
93 create_process_string<PseudoscalarHiggs,bar<UpTypeQuark>::type, UpTypeQuark>(indexIn, indexOut1, indexOut2)
94 + ": Cannot determine the number of active quark flavours"
95 );
96 }
97 double deltaqq_QCD_DR_P =
98 calc_Deltaqq(alpha_s_red, Nf, flexibledecay_settings)
99 + 2.*(1. - 6.*xDR)/(1-4.*xDR)*(4./3. - std::log(xDR))*alpha_s_red
100 + 4./3.*alpha_s_red*calc_DeltaAh(betaDR);
101
102 // 1L QED correction - eq. 17 in FD paper
103 const double alpha_red = get_alpha(context)/Pi;
104 const double deltaqq_QED_DR = 17./4.*Sqr(UpTypeQuark::electricCharge)*alpha_red;
105
106 const double deltaqq_QCD_OS_P =
107 4./3. * alpha_s_red * calc_DeltaAh(betaOS);
108
109 const double deltaqq_QED_OS_P =
110 alpha_red * Sqr(UpTypeQuark::electricCharge) * calc_DeltaAh(betaOS);
111
112 double deltaqq_QCDxQED_DR = 0.;
113 double deltaPhi2_P = 0.;
114 if (static_cast<int>(flexibledecay_settings.get(FlexibleDecay_settings::include_higher_order_corrections)) > 1) {
115 deltaqq_QCDxQED_DR =
116 deltaqq_QCDxQED*Sqr(UpTypeQuark::electricCharge)*alpha_red*alpha_s_red;
117 if ((indexOut1.at(0) < 2 || indexOut2.at(0) < 2)) {
118 const double mtpole = qedqcd.displayPoleMt();
119 const double lt = std::log(Sqr(mAhOS/mtpole));
120 const double lq = std::log(xDR);
121 // eq. 28 of hep-ph/9505358
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 CSuu = AhQQbarVertexDR_P/context.mass<UpTypeQuark>(indexOut1);
125 if (!is_zero(CSuu)) {
126 const auto Ahttbar_P = 0.5*(Ahttbar.right() - Ahttbar.left());
127 const auto CStu = Ahttbar_P/context.mass<Fu>({2});
128 deltaPhi2_P = Sqr(alpha_s_red) * std::real(CStu/CSuu) * (23/6. - lt + 1.0/6.0*Sqr(lq));
129 }
130 }
131 }
132
133 amp2DR_P *= Y_conversion*(1. + deltaqq_QCD_DR_P + deltaqq_QED_DR + deltaqq_QCDxQED_DR + deltaPhi2_P);
134 amp2OS_P *= 1. + deltaqq_QCD_OS_P + deltaqq_QED_OS_P;
135 }
136
137 // low x limit
138 double result_DR =
139 flux * color_factor * phase_spaceDR * amp2DR_P;
140 // high x limit
141 double result_OS =
142 flux * color_factor * phase_spaceOS * amp2OS_P;
143
144 result = (1-4.*xOS)*result_DR + 4*xOS*result_OS;
145 }
146
147 if (flexibledecay_settings.get(FlexibleDecay_settings::call_higgstools) != 0 ||
148 flexibledecay_settings.get(FlexibleDecay_settings::call_lilith) != 0 ||
149 flexibledecay_settings.get(FlexibleDecay_settings::calculate_normalized_effc) != 0
150 ) {
151 const double remove_normalization = flux*phase_spaceOS*2*Sqr(mAhOS);
152 neutral_higgs_effc.add_coupling(field_as_string<PseudoscalarHiggs>(indexIn),
153 {
154 boost::hana::unpack(bar<UpTypeQuark>::pdgids, _to_array<bar<UpTypeQuark>::numberOfGenerations>).at(indexOut1.at(0)),
155 boost::hana::unpack(UpTypeQuark::pdgids, _to_array<UpTypeQuark::numberOfGenerations>).at(indexOut2.at(0))
156 },
157 std::pair<std::string, std::complex<double>> {
158 field_as_string<PseudoscalarHiggs>(indexIn) + "-" + field_as_string<bar<UpTypeQuark>::type>(indexOut1) + "-" + field_as_string<UpTypeQuark>(indexOut2),
159 // if the decay is not kinematically allowed return the tree-level coupling,
160 // otherwise a sqrt of a partial width
161 4.*std::max(xDR, xOS) > 1. ? std::imag(AhQQbarVertexDR_P)*1i : std::sqrt(result/remove_normalization)*1i
162 },
163 result
164 );
165 }
166
167 return result;
168}
bool is_zero(double x) noexcept
Definition ckm.cpp:30
double calc_DeltaAh(double b) noexcept
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:633
detail::result_of::concatenate< Args... >::type concatenate(Args &&... args)
T KallenLambda(T x, T y, T z) noexcept
Definition wrappers.hpp:837
@ ALPHAS
Definition lowe.h:44