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 ss;
84 ss << std::setprecision(2) << 100.*WI_violation;
85 WARNING("Warning: Ward identity violated in decay of scalar to massless vectors by " + ss.str() + "% due to higher order effects");
86 }
87 // use res1 since form_factor_21 is not sensitive to the renormalization
88 // scheme in which the Higgs mass is defined
89 return res1;
90 }
91 // use full expression for tree-level decays where one of the form factors might be 0
92 else {
93 const double Refgf21 = Re(form_factor_g * Conj(form_factor_21));
94 const double res3 = 4.*fgSqr + Sqr(m_decay)*Refgf21 + 0.5*Power4(m_decay)*fepsSqr;
95 return res3;
96 }
98
99 const double m_s_sq = Sqr(m_decay);
100 const double m_vec_sq = m_vector_1 <= massless_vector_threshold ? Sqr(m_vector_2) : Sqr(m_vector_1);
101
102 const double fgSqr = AbsSqr(form_factor_g);
103 const double f21Sqr = AbsSqr(form_factor_21);
104 const double fepsSqr = AbsSqr(form_factor_eps);
105 const double prefactor = 0.25*Sqr(m_s_sq - m_vec_sq);
106
108 // use Ward identity to eliminate form_factor_g
109 const double res1 =
110 2.*prefactor*(f21Sqr + fepsSqr);
111 // use Ward identity to eliminate form_factor_21
112 const double res2 =
113 2.*(fgSqr + prefactor*fepsSqr);
114 // compare two results
115 const double WI_violation = std::abs(1. - std::abs(res1/res2));
116 if (WI_violation > 0.1) {
117 std::stringstream ss;
118 ss << std::setprecision(2) << 100.*WI_violation;
119 WARNING("Warning: Ward identity violated in decay of scalar to massless and massive vector by " + ss.str() + "% due to higher order effects");
120 }
121 // use res1 since form_factor_21 is not sensitive to the renormalization
122 // scheme in which the Higgs mass is defined
123 return res1;
124 }
125 // use full expression for tree-level decays where one of the form factors might be 0
126 else {
127 const double res3 =
128 3.*fgSqr + prefactor*(2.*fepsSqr-f21Sqr);
129 return res3;
130 }
131 }
132
133 const double m_s_sq = Sqr(m_decay);
134 const double m_s_4 = Power4(m_decay);
135 const double m_1_sq = Sqr(m_vector_1);
136 const double m_1_4 = Power4(m_vector_1);
137 const double m_2_sq = Sqr(m_vector_2);
138 const double m_2_4 = Power4(m_vector_2);
139
140 const double mgg = 0.25 * AbsSqr(form_factor_g) * (
141 m_s_4 + m_1_4 + m_2_4 + 10. * m_1_sq * m_2_sq
142 - 2. * m_s_sq * (m_1_sq + m_2_sq)) / (m_1_sq * m_2_sq);
143
144 const double m33 = 0.0625 * Sqr(m_s_4 + Sqr(m_1_sq - m_2_sq)
145 - 2. * m_s_sq * (m_1_sq + m_2_sq))
146 * AbsSqr(form_factor_21) / (m_1_sq * m_2_sq);
147
148 const double mepseps = AbsSqr(form_factor_eps) * (
149 0.5 * Sqr(m_s_sq - m_1_sq - m_2_sq) - 2. * m_1_sq * m_2_sq);
150
151 const double mg3 = 0.25 * (m_s_4 * m_s_sq - 3. * m_s_4 * (m_1_sq + m_2_sq)
152 - Sqr(m_1_sq - m_2_sq) * (m_1_sq + m_2_sq)
153 + m_s_sq * (3. * m_1_4 + 2. * m_1_sq * m_2_sq
154 + 3. * m_2_4))
155 * Re(form_factor_g * Conj(form_factor_21)) / (m_1_sq * m_2_sq);
156
157 return mgg + m33 + mepseps + mg3;
158}
159
160Decay_amplitude_SSS operator*(std::complex<double> factor, Decay_amplitude_SSS const& amp2) {
162 amp.m_decay = amp2.m_decay;
163 amp.m_scalar_1 = amp2.m_scalar_1;
164 amp.m_scalar_2 = amp2.m_scalar_2;
165 amp.form_factor = factor * amp2.form_factor;
166 return amp;
167}
168Decay_amplitude_SSS operator*(Decay_amplitude_SSS const& amp2, std::complex<double> factor) {
169 return operator*(factor, amp2);
170}
171
172Decay_amplitude_SSV operator*(std::complex<double> factor, Decay_amplitude_SSV const& amp2) {
174 amp.m_decay = amp2.m_decay;
175 amp.m_scalar = amp2.m_scalar;
176 amp.m_vector = amp2.m_vector;
177 amp.form_factor = factor * amp2.form_factor;
178 return amp;
179}
180Decay_amplitude_SSV operator*(Decay_amplitude_SSV const& amp2, std::complex<double> factor) {
181 return operator*(factor, amp2);
182}
183
184Decay_amplitude_SVV operator* (std::complex<double> factor, Decay_amplitude_SVV const& amp2) {
186 amp.m_decay = amp2.m_decay;
187 amp.m_vector_1 = amp2.m_vector_1;
188 amp.m_vector_2 = amp2.m_vector_2;
190 amp.form_factor_g = factor * amp2.form_factor_g;
191 amp.form_factor_11 = factor * amp2.form_factor_11;
192 amp.form_factor_12 = factor * amp2.form_factor_12;
193 amp.form_factor_21 = factor * amp2.form_factor_21;
194 amp.form_factor_22 = factor * amp2.form_factor_22;
195 amp.form_factor_eps = factor * amp2.form_factor_eps;
196 return amp;
197}
198Decay_amplitude_SVV operator*(Decay_amplitude_SVV const& amp2, std::complex<double> factors) {
199 return operator*(factors, amp2);
200}
201
202Decay_amplitude_SFF operator*(std::complex<double> factor, Decay_amplitude_SFF const& amp2) {
204 amp.m_decay = amp2.m_decay;
205 amp.m_fermion_1 = amp2.m_fermion_1;
206 amp.m_fermion_2 = amp2.m_fermion_2;
207 amp.form_factor_left = factor * amp2.form_factor_left;
208 amp.form_factor_right = factor * amp2.form_factor_right;
209 return amp;
210}
211Decay_amplitude_SFF operator*(Decay_amplitude_SFF const& amp, std::complex<double> factor) {
212 return operator*(factor, amp);
213}
214
216{
217 const double m_in_sq = Sqr(m_decay);
218 const double m_1_sq = Sqr(m_fermion_1);
219 const double m_2_sq = Sqr(m_fermion_2);
220
221 return (m_in_sq - m_1_sq - m_2_sq) *
223 - 4. * m_fermion_1 * m_fermion_2 * Re(
225}
226
228{
229 const double m_in_sq = Sqr(m_decay);
230 const double m_f_sq = Sqr(m_fermion);
231 const double m_s_sq = Sqr(m_scalar);
232
233 return 0.5 * (m_in_sq + m_f_sq - m_s_sq) *
235 + 2. * m_fermion * m_scalar * Re(
237}
238
239// This routine is for decays that we currently do not support and is not used
240// Currently in development for future versions
241// @todo handle massless vectors safely
242// @todo check these expressions, they appear not to agree with SARAH/SPheno
244{
245 const double m_in_sq = Sqr(m_decay);
246 const double m_f_sq = Sqr(m_fermion);
247
249 const double c1 = m_in_sq + m_f_sq;
250 const double c2 = -0.5 * m_in_sq * (m_in_sq + m_f_sq);
251 const double c3 = -4. * m_decay * m_fermion;
252 const double c4 = -m_in_sq * m_fermion;
253 const double c5 = -0.5 * m_decay * (m_in_sq + m_f_sq);
254 const double c6 = -0.5 * m_decay * m_fermion * (m_in_sq + m_f_sq);
255
263 + 2. * c6 * Re(form_factor_p_1 * Conj(form_factor_p_2));
264 }
265
266 const double m_in_4 = Power4(m_decay);
267 const double m_f_4 = Power4(m_fermion);
268 const double m_v_sq = Sqr(m_vector);
269 const double m_v_4 = Power4(m_vector);
270
271 const double c1 = 0.5 * (m_in_4 + m_f_4 + m_f_sq * m_v_sq - 2. * m_v_4
272 + m_in_sq * (m_v_sq - 2. * m_f_sq)) / m_v_sq;
273
274 const double c2 = 0.125 * ((m_in_sq + m_f_sq - m_v_sq) * (
275 m_in_4 + Sqr(m_f_sq - m_v_sq)
276 - 2. * m_in_sq * (m_f_sq + m_v_sq))) / m_v_sq;
277
278 const double c3 = -3. * m_decay * m_fermion;
279
280 const double c4 = 0.25 * (m_fermion * (m_in_4 + Sqr(m_f_sq - m_v_sq)
281 - 2. * m_in_sq * (m_f_sq + m_v_sq)))
282 / m_v_sq;
283
284 const double c5 = 0.25 * (m_decay * (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 c6 = 0.25 * (m_decay * m_fermion * (
289 m_in_4 + Sqr(m_f_sq - m_v_sq) - 2. * m_in_sq * (
290 m_f_sq + m_v_sq))) / m_v_sq;
291
299 + 2. * c6 * Re(form_factor_p_1 * Conj(form_factor_p_2));
300}
301
302} // namespace flexiblesusy
#define WARNING(msg)
Definition: logger.hpp:63
double Re(double x) noexcept
Definition: wrappers.cpp:163
constexpr Complex< T > operator*(const Complex< T > &a, const Complex< T > &b) noexcept
Definition: complex.hpp:120
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:631
int Conj(int x) noexcept
Definition: wrappers.hpp:152
int AbsSqr(int x) noexcept
Definition: wrappers.hpp:86
constexpr Base Power4(Base b) noexcept
Definition: wrappers.hpp:493
std::complex< double > form_factor_left
std::complex< double > form_factor_right
std::complex< double > form_factor_gam_left
std::complex< double > form_factor_p_1
std::complex< double > form_factor_p_2
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
std::complex< double > form_factor
generic amplitude for the decay of a scalar into a scalar and vector
std::complex< double > form_factor
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
std::complex< double > form_factor_g