flexiblesusy is hosted by Hepforge, IPPP Durham
FlexibleSUSY
decay_amplitudes.hpp
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
19#ifndef DECAY_AMPLITUDES_SRC_H
20#define DECAY_AMPLITUDES_SRC_H
21
22#include <complex>
23#include <limits>
24
25#include "cxx_qft/fields.hpp"
26
27namespace flexiblesusy {
28
34 double m_decay {0.};
35 double m_scalar_1 {0.};
36 double m_scalar_2 {0.};
37 std::complex<double> form_factor {0.};
38
39 double square() const;
42 return *this;
43 }
44};
45Decay_amplitude_SSS operator*(std::complex<double>, Decay_amplitude_SSS const&);
46Decay_amplitude_SSS operator*(Decay_amplitude_SSS const&, std::complex<double>);
47
53 double m_decay {0.};
54 double m_scalar {0.};
55 double m_vector {0.};
57 std::complex<double> form_factor {0.};
58
59 double square() const;
62 return *this;
63 }
64};
65Decay_amplitude_SSV operator*(std::complex<double>, Decay_amplitude_SSV const&);
66Decay_amplitude_SSV operator*(Decay_amplitude_SSV const&, std::complex<double>);
67
73 double m_decay {0.};
74 double m_vector_1 {0.};
75 double m_vector_2 {0.};
77 std::complex<double> form_factor_g {0.};
78 std::complex<double> form_factor_11 {0.};
79 std::complex<double> form_factor_12 {0.};
80 std::complex<double> form_factor_21 {0.};
81 std::complex<double> form_factor_22 {0.};
82 std::complex<double> form_factor_eps {0.};
83
84 double square() const;
92 return *this;
93 }
94};
95Decay_amplitude_SVV operator*(std::complex<double>, Decay_amplitude_SVV const&);
96Decay_amplitude_SVV operator*(Decay_amplitude_SVV const&, std::complex<double>);
97
103 double m_decay {0.};
104 double m_fermion_1 {0.};
105 double m_fermion_2 {0.};
106 std::complex<double> form_factor_left {0.};
107 std::complex<double> form_factor_right {0.};
108
109 double square() const;
113 return *this;
114 }
115};
116Decay_amplitude_SFF operator*(std::complex<double>, Decay_amplitude_SFF const&);
117Decay_amplitude_SFF operator*(Decay_amplitude_SFF const&, std::complex<double>);
118
124 double m_decay {0.};
125 double m_fermion {0.};
126 double m_scalar {0.};
127 std::complex<double> form_factor_left {0.};
128 std::complex<double> form_factor_right {0.};
129
130 double square() const;
134 return *this;
135 }
136};
139
145 double m_decay {0.};
146 double m_fermion {0.};
147 double m_vector {0.};
149 std::complex<double> form_factor_gam_left {0.};
150 std::complex<double> form_factor_gam_right {0.};
151 std::complex<double> form_factor_p_1 {0.};
152 std::complex<double> form_factor_p_2 {0.};
153
154 double square() const;
160 return *this;
161 }
162};
165
166template <typename Amplitude>
167double square_amplitude(const Amplitude& a)
168{
169 return a.square();
170}
171
172namespace detail {
173
174template <class Field_in, class Field_out_1, class Field_out_2,
175 class Amplitude_type = void>
177// @ModelName@_cxx_diagrams::fields::
178template <class Field_in, class Field_out_1, class Field_out_2>
180 Field_in, Field_out_1, Field_out_2,
181 std::enable_if_t<cxx_diagrams::fields::is_scalar<Field_in>::value &&
182 cxx_diagrams::fields::is_scalar<Field_out_1>::value &&
183 cxx_diagrams::fields::is_scalar<Field_out_2>::value>> {
185};
186
187template <class Field_in, class Field_out_1, class Field_out_2>
189 Field_in, Field_out_1, Field_out_2,
190 std::enable_if_t<cxx_diagrams::fields::is_scalar<Field_in>::value &&
191 cxx_diagrams::fields::is_scalar<Field_out_1>::value &&
192 cxx_diagrams::fields::is_vector<Field_out_2>::value>> {
194};
195
196template <class Field_in, class Field_out_1, class Field_out_2>
198 Field_in, Field_out_1, Field_out_2,
199 std::enable_if_t<cxx_diagrams::fields::is_scalar<Field_in>::value &&
200 cxx_diagrams::fields::is_vector<Field_out_1>::value &&
201 cxx_diagrams::fields::is_scalar<Field_out_2>::value>> {
203};
204
205template <class Field_in, class Field_out_1, class Field_out_2>
207 Field_in, Field_out_1, Field_out_2,
208 std::enable_if_t<cxx_diagrams::fields::is_scalar<Field_in>::value &&
209 cxx_diagrams::fields::is_vector<Field_out_1>::value &&
210 cxx_diagrams::fields::is_vector<Field_out_2>::value>> {
212};
213
214template <class Field_in, class Field_out_1, class Field_out_2>
216 Field_in, Field_out_1, Field_out_2,
217 std::enable_if_t<cxx_diagrams::fields::is_scalar<Field_in>::value &&
218 cxx_diagrams::fields::is_fermion<Field_out_1>::value &&
219 cxx_diagrams::fields::is_fermion<Field_out_2>::value>> {
221};
222
223template <class Field_in, class Field_out_1, class Field_out_2>
225 Field_in, Field_out_1, Field_out_2,
226 std::enable_if_t<cxx_diagrams::fields::is_fermion<Field_in>::value &&
227 cxx_diagrams::fields::is_fermion<Field_out_1>::value &&
228 cxx_diagrams::fields::is_scalar<Field_out_2>::value>> {
230};
231
232template <class Field_in, class Field_out_1, class Field_out_2>
234 Field_in, Field_out_1, Field_out_2,
235 std::enable_if_t<cxx_diagrams::fields::is_fermion<Field_in>::value &&
236 cxx_diagrams::fields::is_scalar<Field_out_1>::value &&
237 cxx_diagrams::fields::is_fermion<Field_out_2>::value>> {
239};
240
241template <class Field_in, class Field_out_1, class Field_out_2>
243 Field_in, Field_out_1, Field_out_2,
244 std::enable_if_t<cxx_diagrams::fields::is_fermion<Field_in>::value &&
245 cxx_diagrams::fields::is_fermion<Field_out_1>::value &&
246 cxx_diagrams::fields::is_vector<Field_out_2>::value>> {
248};
249
250template <class Field_in, class Field_out_1, class Field_out_2>
252 Field_in, Field_out_1, Field_out_2,
253 std::enable_if_t<cxx_diagrams::fields::is_fermion<Field_in>::value &&
254 cxx_diagrams::fields::is_vector<Field_out_1>::value &&
255 cxx_diagrams::fields::is_fermion<Field_out_2>::value>> {
257};
258
259} // namespace detail
260
265template <class... Fields>
267 using type =
269 sizeof...(Fields) == 3,
271};
272
273}
274
275#endif
const Real epsilon
Definition: mathdefs.hpp:18
constexpr Complex< T > operator*(const Complex< T > &a, const Complex< T > &b) noexcept
Definition: complex.hpp:120
double square_amplitude(const Amplitude &a)
typename std::enable_if< B, T >::type enable_if_t
Definition: json.hpp:3095
generic amplitude for the decay of a fermion into a fermion and scalar
Decay_amplitude_FFS operator+=(Decay_amplitude_FFS const &amp)
std::complex< double > form_factor_left
std::complex< double > form_factor_right
generic amplitude for the decay of a fermion into a fermion and vector
std::complex< double > form_factor_gam_left
std::complex< double > form_factor_p_1
Decay_amplitude_FFV operator+=(Decay_amplitude_FFV const &amp)
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
Decay_amplitude_SFF operator+=(Decay_amplitude_SFF const &amp)
generic amplitude for the decay of a scalar into two scalars
std::complex< double > form_factor
Decay_amplitude_SSS operator+=(Decay_amplitude_SSS const &amp)
generic amplitude for the decay of a scalar into a scalar and vector
Decay_amplitude_SSV operator+=(Decay_amplitude_SSV const &amp)
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
Decay_amplitude_SVV operator+=(Decay_amplitude_SVV const &amp)
std::complex< double > form_factor_11
std::complex< double > form_factor_12
std::complex< double > form_factor_g
helper class to determine amplitude type for a given set of fields
std::enable_if_t< sizeof...(Fields)==3, typename detail::Two_body_decay_amplitude_type< Fields... >::type > type