flexiblesusy is hosted by Hepforge, IPPP Durham
FlexibleSUSY
decay_amplitudes.cpp
Go to the documentation of this file.
1// ====================================================================
2// This file is part of FlexibleSUSY.
3//
4// FlexibleSUSY is free software: you can redistribute it and/or modify
5// it under the terms of the GNU General Public License as published
6// by the Free Software Foundation, either version 3 of the License,
7// or (at your option) any later version.
8//
9// FlexibleSUSY is distributed in the hope that it will be useful, but
10// WITHOUT ANY WARRANTY; without even the implied warranty of
11// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12// General Public License for more details.
13//
14// You should have received a copy of the GNU General Public License
15// along with FlexibleSUSY. If not, see
16// <http://www.gnu.org/licenses/>.
17// ====================================================================
18
23#include <iomanip>
24
25#include "decay_amplitudes.hpp"
26#include "wrappers.hpp"
27#include "src/numerics2.hpp"
28
29namespace flexiblesusy {
30
32{
33 return AbsSqr(form_factor);
34}
35
37{
39 // eq. B36 of http://etheses.dur.ac.uk/2301 is incorrect
40 // if the amplitude fullfils the Ward indentity & the vector is physical (i.e. transversal)
41 // then the amplitude is identically 0
42 return 0.;
43 }
44
45 const double m_in_sq = Sqr(m_decay);
46 const double m_s_sq = Sqr(m_scalar);
47 const double m_v_sq = Sqr(m_vector);
48
49 return (Sqr(m_in_sq) + Sqr(m_v_sq - m_s_sq)
50 - 2. * m_in_sq * (m_s_sq + m_v_sq))
51 * AbsSqr(form_factor) / m_v_sq;
52}
53
54// @todo In future versions handle tricky corner cases where e.g. the photon
55// mass is obtained from diagonalisation of a mass matrix and is
56// numerically non-zero. Currently would be treated as a massive vector.
57// @todo Numerically validate decays of generic scalar to two massive on-shell
58// vectors. So far we have not studied an example like this.
60{
62 WARNING("Warning in Decay_amplitude_SVV::square(): decaying particle mass smaller than sum of product masses. Returning 0.");
63 return 0.;
64 }
65
66 // eq. B.38 of http://etheses.dur.ac.uk/2301
69
70 const double fgSqr = AbsSqr(form_factor_g);
71 const double f21Sqr = AbsSqr(form_factor_21);
72 const double fepsSqr = AbsSqr(form_factor_eps);
73
75 // use Ward identity to eliminate form_factor_g
76 const double res1 =
77 0.5*Power4(m_decay)*(f21Sqr + fepsSqr);
78 // use Ward identity to eliminate form_factor_21
79 const double res2 =
80 2.*fgSqr + 0.5*Power4(m_decay)*fepsSqr;
81 const double WI_violation = std::abs(1. - std::abs(res1/res2));
82 if (WI_violation > 0.1) {
83 std::stringstream ss1;
84 ss1 << std::fixed << std::setprecision(0) << 100.*WI_violation;
85 std::stringstream ss2;
86 ss2 << std::fixed << std::setprecision(1) << m_decay;
87 WARNING("Warning: Ward identity violated in decay of scalar with mass " + ss2.str() + " Gev to massless vectors by " + ss1.str() + "% due to higher order effects");
88 }
89 // use res1 since form_factor_21 is not sensitive to the renormalization
90 // scheme in which the Higgs mass is defined
91 return res1;
92 }
93 // use full expression for tree-level decays where one of the form factors might be 0
94 else {
95 const double Refgf21 = Re(form_factor_g * Conj(form_factor_21));
96 const double res3 = 4.*fgSqr + Sqr(m_decay)*Refgf21 + 0.5*Power4(m_decay)*fepsSqr;
97 return res3;
98 }
100
101 const double m_s_sq = Sqr(m_decay);
102 const double m_vec_sq = m_vector_1 <= massless_vector_threshold ? Sqr(m_vector_2) : Sqr(m_vector_1);
103
104 const double fgSqr = AbsSqr(form_factor_g);
105 const double f21Sqr = AbsSqr(form_factor_21);
106 const double fepsSqr = AbsSqr(form_factor_eps);
107 const double prefactor = 0.25*Sqr(m_s_sq - m_vec_sq);
108
110 // use Ward identity to eliminate form_factor_g
111 const double res1 =
112 2.*prefactor*(f21Sqr + fepsSqr);
113 // use Ward identity to eliminate form_factor_21
114 const double res2 =
115 2.*(fgSqr + prefactor*fepsSqr);
116 // compare two results
117 const double WI_violation = std::abs(1. - std::abs(res1/res2));
118 if (WI_violation > 0.1) {
119 std::stringstream ss1;
120 ss1 << std::fixed << std::setprecision(0) << 100.*WI_violation;
121 std::stringstream ss2;
122 ss2 << std::fixed << std::setprecision(1) << m_decay;
123 WARNING("Warning: Ward identity violated in decay of scalar with mass " + ss2.str() + " GeV to massless and massive vector by " + ss1.str() + "% due to higher order effects");
124 }
125 // use res1 since form_factor_21 is not sensitive to the renormalization
126 // scheme in which the Higgs mass is defined
127 return res1;
128 }
129 // use full expression for tree-level decays where one of the form factors might be 0
130 else {
131 const double res3 =
132 3.*fgSqr + prefactor*(2.*fepsSqr-f21Sqr);
133 return res3;
134 }
135 }
136
137 const double m_s_sq = Sqr(m_decay);
138 const double m_s_4 = Power4(m_decay);
139 const double m_1_sq = Sqr(m_vector_1);
140 const double m_1_4 = Power4(m_vector_1);
141 const double m_2_sq = Sqr(m_vector_2);
142 const double m_2_4 = Power4(m_vector_2);
143
144 const double mgg = 0.25 * AbsSqr(form_factor_g) * (
145 m_s_4 + m_1_4 + m_2_4 + 10. * m_1_sq * m_2_sq
146 - 2. * m_s_sq * (m_1_sq + m_2_sq)) / (m_1_sq * m_2_sq);
147
148 const double m33 = 0.0625 * Sqr(m_s_4 + Sqr(m_1_sq - m_2_sq)
149 - 2. * m_s_sq * (m_1_sq + m_2_sq))
150 * AbsSqr(form_factor_21) / (m_1_sq * m_2_sq);
151
152 const double mepseps = AbsSqr(form_factor_eps) * (
153 0.5 * Sqr(m_s_sq - m_1_sq - m_2_sq) - 2. * m_1_sq * m_2_sq);
154
155 const double mg3 = 0.25 * (m_s_4 * m_s_sq - 3. * m_s_4 * (m_1_sq + m_2_sq)
156 - Sqr(m_1_sq - m_2_sq) * (m_1_sq + m_2_sq)
157 + m_s_sq * (3. * m_1_4 + 2. * m_1_sq * m_2_sq
158 + 3. * m_2_4))
159 * Re(form_factor_g * Conj(form_factor_21)) / (m_1_sq * m_2_sq);
160
161 return mgg + m33 + mepseps + mg3;
162}
163
164Decay_amplitude_SSS operator*(std::complex<double> factor, Decay_amplitude_SSS const& amp2) {
166 amp.m_decay = amp2.m_decay;
167 amp.m_scalar_1 = amp2.m_scalar_1;
168 amp.m_scalar_2 = amp2.m_scalar_2;
169 amp.form_factor = factor * amp2.form_factor;
170 return amp;
171}
172Decay_amplitude_SSS operator*(Decay_amplitude_SSS const& amp2, std::complex<double> factor) {
173 return operator*(factor, amp2);
174}
175
176Decay_amplitude_SSV operator*(std::complex<double> factor, Decay_amplitude_SSV const& amp2) {
178 amp.m_decay = amp2.m_decay;
179 amp.m_scalar = amp2.m_scalar;
180 amp.m_vector = amp2.m_vector;
181 amp.form_factor = factor * amp2.form_factor;
182 return amp;
183}
184Decay_amplitude_SSV operator*(Decay_amplitude_SSV const& amp2, std::complex<double> factor) {
185 return operator*(factor, amp2);
186}
187
188Decay_amplitude_SVV operator* (std::complex<double> factor, Decay_amplitude_SVV const& amp2) {
190 amp.m_decay = amp2.m_decay;
191 amp.m_vector_1 = amp2.m_vector_1;
192 amp.m_vector_2 = amp2.m_vector_2;
194 amp.form_factor_g = factor * amp2.form_factor_g;
195 amp.form_factor_11 = factor * amp2.form_factor_11;
196 amp.form_factor_12 = factor * amp2.form_factor_12;
197 amp.form_factor_21 = factor * amp2.form_factor_21;
198 amp.form_factor_22 = factor * amp2.form_factor_22;
199 amp.form_factor_eps = factor * amp2.form_factor_eps;
200 return amp;
201}
202Decay_amplitude_SVV operator*(Decay_amplitude_SVV const& amp2, std::complex<double> factors) {
203 return operator*(factors, amp2);
204}
205
206Decay_amplitude_SFF operator*(std::complex<double> factor, Decay_amplitude_SFF const& amp2) {
208 amp.m_decay = amp2.m_decay;
209 amp.m_fermion_1 = amp2.m_fermion_1;
210 amp.m_fermion_2 = amp2.m_fermion_2;
211 amp.form_factor_left = factor * amp2.form_factor_left;
212 amp.form_factor_right = factor * amp2.form_factor_right;
213 return amp;
214}
215Decay_amplitude_SFF operator*(Decay_amplitude_SFF const& amp, std::complex<double> factor) {
216 return operator*(factor, amp);
217}
218
220{
221 const double m_in_sq = Sqr(m_decay);
222 const double m_1_sq = Sqr(m_fermion_1);
223 const double m_2_sq = Sqr(m_fermion_2);
224
225 return (m_in_sq - m_1_sq - m_2_sq) *
227 - 4. * m_fermion_1 * m_fermion_2 * Re(
229}
230
232{
233 const double m_in_sq = Sqr(m_decay);
234 const double m_f_sq = Sqr(m_fermion);
235 const double m_s_sq = Sqr(m_scalar);
236
237 return 0.5 * (m_in_sq + m_f_sq - m_s_sq) *
239 + 2. * m_fermion * m_scalar * Re(
241}
242
243// This routine is for decays that we currently do not support and is not used
244// Currently in development for future versions
245// @todo handle massless vectors safely
246// @todo check these expressions, they appear not to agree with SARAH/SPheno
248{
249 const double m_in_sq = Sqr(m_decay);
250 const double m_f_sq = Sqr(m_fermion);
251
253 const double c1 = m_in_sq + m_f_sq;
254 const double c2 = -0.5 * m_in_sq * (m_in_sq + m_f_sq);
255 const double c3 = -4. * m_decay * m_fermion;
256 const double c4 = -m_in_sq * m_fermion;
257 const double c5 = -0.5 * m_decay * (m_in_sq + m_f_sq);
258 const double c6 = -0.5 * m_decay * m_fermion * (m_in_sq + m_f_sq);
259
267 + 2. * c6 * Re(form_factor_p_1 * Conj(form_factor_p_2));
268 }
269
270 const double m_in_4 = Power4(m_decay);
271 const double m_f_4 = Power4(m_fermion);
272 const double m_v_sq = Sqr(m_vector);
273 const double m_v_4 = Power4(m_vector);
274
275 const double c1 = 0.5 * (m_in_4 + m_f_4 + m_f_sq * m_v_sq - 2. * m_v_4
276 + m_in_sq * (m_v_sq - 2. * m_f_sq)) / m_v_sq;
277
278 const double c2 = 0.125 * ((m_in_sq + m_f_sq - m_v_sq) * (
279 m_in_4 + Sqr(m_f_sq - m_v_sq)
280 - 2. * m_in_sq * (m_f_sq + m_v_sq))) / m_v_sq;
281
282 const double c3 = -3. * m_decay * m_fermion;
283
284 const double c4 = 0.25 * (m_fermion * (m_in_4 + Sqr(m_f_sq - m_v_sq)
285 - 2. * m_in_sq * (m_f_sq + m_v_sq)))
286 / m_v_sq;
287
288 const double c5 = 0.25 * (m_decay * (m_in_4 + Sqr(m_f_sq - m_v_sq)
289 - 2. * m_in_sq * (m_f_sq + m_v_sq)))
290 / m_v_sq;
291
292 const double c6 = 0.25 * (m_decay * m_fermion * (
293 m_in_4 + Sqr(m_f_sq - m_v_sq) - 2. * m_in_sq * (
294 m_f_sq + m_v_sq))) / m_v_sq;
295
303 + 2. * c6 * Re(form_factor_p_1 * Conj(form_factor_p_2));
304}
305
306} // namespace flexiblesusy
#define WARNING(msg)
Definition logger.hpp:63
std::enable_if_t< std::is_unsigned< T >::value, bool > is_zero(T a, T prec=std::numeric_limits< T >::epsilon()) noexcept
compares a number for being close to zero
Definition numerics2.hpp:46
constexpr std::complex< T > Sqr(const std::complex< T > &a) noexcept
Definition wrappers.hpp:633
int Conj(int x) noexcept
Definition wrappers.hpp:154
int AbsSqr(int x) noexcept
Definition wrappers.hpp:88
constexpr Base Power4(Base b) noexcept
Definition wrappers.hpp:495
Decay_amplitude_SSS operator*(std::complex< double > factor, Decay_amplitude_SSS const &amp2)
std::complex< double > form_factor_left
std::complex< double > form_factor_right
std::complex< double > form_factor_gam_left
std::complex< double > form_factor_gam_right
generic amplitude for the decay of a scalar into two fermions
std::complex< double > form_factor_left
std::complex< double > form_factor_right
generic amplitude for the decay of a scalar into two scalars
generic amplitude for the decay of a scalar into a scalar and vector
generic amplitude for the decay of a scalar into two vectors
std::complex< double > form_factor_21
std::complex< double > form_factor_eps
std::complex< double > form_factor_22
std::complex< double > form_factor_11
std::complex< double > form_factor_12
#define Re
Definition types.h:12