 |
Version: SMASH-2.0
|
|
Go to the documentation of this file.
25 if (sqrts <= mass + stable_mass) {
30 const double p_f =
pCM(sqrts, stable_mass, mass);
39 if (sqrts <= m1 + m2) {
44 const double p_f =
pCM(sqrts, m1, m2);
54 if (part_types.size() != 2) {
55 throw std::runtime_error(
56 "Wrong number of particles in TwoBodyDecay constructor: " +
57 std::to_string(part_types.size()));
75 if (!(part_types[0]->is_stable() && part_types[1]->is_stable())) {
76 throw std::runtime_error(
77 "Error: Unstable particle in TwoBodyDecayStable constructor: " +
78 part_types[0]->pdgcode().
string() +
" " +
79 part_types[1]->pdgcode().
string());
99 return width(m0, G0, m);
111 if (part_types[1]->is_stable()) {
112 std::swap(part_types[0], part_types[1]);
116 if (!part_types[0]->is_stable() || part_types[1]->is_stable()) {
117 throw std::runtime_error(
"Error in TwoBodyDecaySemistable constructor: " +
118 part_types[0]->pdgcode().
string() +
" " +
119 part_types[1]->pdgcode().
string());
127 Lambda_(get_Lambda()),
128 tabulation_(nullptr) {}
151 const double tabulation_interval = std::max(2., 10. * res->
width_at_pole());
157 const double mres_max = sqrts - m_stable;
158 return integrate(mres_min, mres_max, [&](
double m) {
167 assert(
rho(m0) != 0);
172 double m1,
double m2)
const {
173 assert(
rho(m0) != 0);
174 const double p_f =
pCM(m, m1, m2);
184 :
TwoBodyDecay(part_types, l), Lambda_(get_Lambda()), tabulation_(nullptr) {
185 if (part_types[0]->is_stable() || part_types[1]->is_stable()) {
186 throw std::runtime_error(
187 "Error: Stable particle in TwoBodyDecayUnstable constructor: " +
188 part_types[0]->pdgcode().
string() +
" " +
189 part_types[1]->pdgcode().
string());
209 const double tab_interval = std::max(2., 10. * sum_gamma);
212 m1_min + m2_min, tab_interval,
num_tab_pts, [&](
double sqrts) {
213 const double m1_max = sqrts - m2_min;
214 const double m2_max = sqrts - m1_min;
216 const double result =
integrate2d(m1_min, m1_max, m2_min, m2_max,
217 [&](
double m1,
double m2) {
219 sqrts, m1, m2, r1, r2,
L_);
234 const double p_f =
pCM(m, m1, m2);
247 throw std::runtime_error(
248 "Error: No dilepton in TwoBodyDecayDilepton constructor: " +
249 part_types[0]->pdgcode().
string() +
" " +
250 part_types[1]->pdgcode().
string());
260 const double ml_to_m_sqr = (ml / m) * (ml / m);
261 const double m0_to_m_cubed = (m0 / m) * (m0 / m) * (m0 / m);
262 return G0 * m0_to_m_cubed * std::sqrt(1. - 4. * ml_to_m_sqr) *
263 (1. + 2. * ml_to_m_sqr);
271 std::sort(part_types.begin(), part_types.end());
277 if (part_types.size() != 3) {
278 throw std::runtime_error(
279 "Wrong number of particles in ThreeBodyDecay constructor: " +
280 std::to_string(part_types.size()));
291 std::sort(list.begin(), list.end());
308 ParticleTypePtrList part_types,
310 :
ThreeBodyDecay(part_types, l), tabulation_(nullptr), mother_(mother) {
314 throw std::runtime_error(
315 "Error: No dilepton in ThreeBodyDecayDilepton constructor: " +
316 part_types[0]->pdgcode().
string() +
" " +
317 part_types[1]->pdgcode().
string() +
" " +
318 part_types[2]->pdgcode().
string());
321 int non_lepton_position = -1;
322 for (
int i = 0; i < 3; ++i) {
324 non_lepton_position = i;
330 throw std::runtime_error(
"Error: Unsupported dilepton Dalitz decay!");
339 double m_dil,
double m_other,
343 if (m_par < m_dil + m_other) {
348 const double m_dil_sqr = m_dil * m_dil;
349 const double m_par_sqr = m_par * m_par;
350 const double m_par_cubed = m_par * m_par * m_par;
351 const double m_other_sqr = m_other * m_other;
352 const double ph_sp_factor = std::sqrt(1. - 4. * m_l * m_l / m_dil_sqr) *
353 (1. + 2. * m_l * m_l / m_dil_sqr);
358 switch (pdg.
spin()) {
365 pow_int(1. - m_dil / m_par * m_dil / m_par, 3) * ff * ff *
374 const double n1 = m_par_sqr - m_other_sqr;
375 const double rad =
pow_int(1. + m_dil_sqr / n1, 2) -
376 4. * m_par_sqr * m_dil_sqr / (n1 * n1);
382 std::pow(rad, 3. / 2.) * ff_sqr * ph_sp_factor;
386 throw std::runtime_error(
"Bad meson in ThreeBodyDecayDilepton: " +
390 switch (pdg.
code()) {
396 const double rad1 = (m_par + m_other) * (m_par + m_other) - m_dil_sqr;
397 const double rad2 = (m_par - m_other) * (m_par - m_other) - m_dil_sqr;
399 assert(rad1 > -1E-5);
401 }
else if (rad2 < 0.) {
402 assert(rad2 > -1E-5);
406 (m_par + m_other) / (m_par_cubed * m_other_sqr) *
408 const double t2 =
pow_int(std::sqrt(rad2), 3);
410 const double gamma_vi = t1 * t2 * ff * ff;
416 throw std::runtime_error(
"Bad baryon in ThreeBodyDecayDilepton: " +
420 throw std::runtime_error(
"Non-hadron in ThreeBodyDecayDilepton: " +
431 int non_lepton_position = -1;
432 for (
int i = 0; i < 3; ++i) {
434 non_lepton_position = i;
439 const double m_l =
particle_types_[(non_lepton_position + 1) % 3]->mass();
447 m_other + 2 * m_l, M0 + 10 * G0tot,
num_tab_pts, [&](
double m_parent) {
448 const double bottom = 2 * m_l;
449 const double top = m_parent - m_other;
456 m_parent, m_l, m_dil, m_other,
TwoBodyDecay(ParticleTypePtrList part_types, int l)
Construct a TwoBodyDecay.
TwoBodyDecayUnstable(ParticleTypePtrList part_types, int l)
Construct a TwoBodyDecayUnstable.
unsigned int particle_number() const override
constexpr double fine_structure
Fine-struture constant, approximately 1/137.
TwoBodyDecayStable(ParticleTypePtrList part_types, int l)
Construct a TwoBodyDecayStable.
double width_at_pole() const
DecayType is the abstract base class for all decay types.
ThreeBodyDecay represents a decay type with three final-state particles.
A C++ interface for numerical integration in two dimensions with the Cuba Cuhre integration function.
unsigned int particle_number() const override
std::unique_ptr< Tabulation > tabulation_
Tabulation of the resonance integrals.
int L_
angular momentum of the decay
unsigned int spin() const
static ParticleTypePtrList & arrange_particles(ParticleTypePtrList &part_types)
Rearrange the particle list such that the first particle is the stable one.
double rho(double m) const override
This is a virtual helper method which is used to write the width as Gamma(m) = Gamma_0 * rho(m) / rho...
double em_form_factor_sqr_vec(PdgCode pdg, double mass)
double in_width(double m0, double G0, double m, double m1, double m2) const override
Get the mass-dependent in-width for a resonance formation process from one stable and one unstable pa...
std::unique_ptr< Tabulation > tabulation_
Tabulation of the resonance integrals.
bool has_particles(ParticleTypePtrList list) const override
double form_factor_delta(double m)
bool has_particles(ParticleTypePtrList list) const override
A C++ interface for numerical integration in one dimension with the GSL CQUAD integration functions.
static double integrand_rho_Manley_2res(double sqrts, double m1, double m2, ParticleTypePtr t1, ParticleTypePtr t2, int L)
double blatt_weisskopf_sqr(const double p_ab, const int L)
TwoBodyDecaySemistable(ParticleTypePtrList part_types, int l)
Construct a TwoBodyDecaySemistable.
double spectral_function(double m) const
Full spectral function of the resonance (relativistic Breit-Wigner distribution with mass-dependent ...
ParticleTypePtrList particle_types_
final-state particles of the decay
bool has_mother(ParticleTypePtr mother) const override
double rho(double m) const override
This is a virtual helper method which is used to write the width as Gamma(m) = Gamma_0 * rho(m) / rho...
constexpr int photon
Photon.
T pCM(const T sqrts, const T mass_a, const T mass_b) noexcept
static const ParticleType & find(PdgCode pdgcode)
Returns the ParticleType object for the given pdgcode.
double width(double m0, double G0, double m) const override
Get the mass-dependent width of a two-body decay into stable particles according to Manley:1992yb .
double width(double m0, double G0, double m) const override
Get the mass-dependent width of a two-body decay into one stable and one unstable particle according ...
double rho(double m) const override
This is a virtual helper method which is used to write the width as Gamma(m) = Gamma_0 * rho(m) / rho...
std::string string() const
double width(double m0, double G0, double m) const override
double in_width(double m0, double G0, double m, double m1, double m2) const override
static Integrator integrate
ThreeBodyDecay(ParticleTypePtrList part_types, int l)
Construct a ThreeBodyDecay.
double in_width(double m0, double G0, double m, double m1, double m2) const override
Get the mass-dependent in-width for a resonance formation process from two stable particles according...
constexpr int invalid
Invalid particle.
TwoBodyDecayDilepton(ParticleTypePtrList part_types, int l)
Construct a TwoBodyDecayDilepton.
double em_form_factor_ps(PdgCode pdg, double mass)
ParticleTypePtr mother_
Type of the mother particle.
constexpr size_t num_tab_pts
Number of tabulation points.
double post_ff_sqr(double m, double M0, double srts0, double L)
An additional form factor for unstable final states as used in GiBUU, according to M.
static Integrator2d integrate2d(1E7)
double get_partial_width(const double m, const ParticleTypePtrList dlist) const
Get the mass-dependent partial width of a resonance with mass m, decaying into two given daughter par...
constexpr T pow_int(const T base, unsigned const exponent)
Efficient template for calculating integer powers using squaring.
TwoBodyDecayStable represents a decay type with two stable final-state particles.
static double integrand_rho_Manley_1res(double sqrts, double mass, double stable_mass, ParticleTypePtr type, int L)
bool has_lepton_pair(const PdgCode pdg1, const PdgCode pdg2, const PdgCode pdg3)
double width(double m0, double G0, double m) const override
static double diff_width(double m_par, double m_l, double m_dil, double m_other, ParticleTypePtr other, ParticleTypePtr t)
Get the mass-differential width for a dilepton Dalitz decay, where is the invariant mass of the lep...
static ParticleTypePtrList sort_particles(ParticleTypePtrList part_types)
sort the particle list
TwoBodyDecay represents a decay type with two final-state particles.
double width(double m0, double G0, double m) const override
double min_mass_kinematic() const
The minimum mass of the resonance that is kinematically allowed.
double Lambda_
Cut-off parameter Λ for semi-stable decays.
std::unique_ptr< Tabulation > tabulation_
Tabulation of the resonance integrals.
std::int32_t code() const
bool is_dilepton(const PdgCode pdg1, const PdgCode pdg2)
double in_width(double m0, double G0, double m, double m1, double m2) const override
double width(double m0, double G0, double m) const override
Get the mass-dependent width of a two-body decay into stable particles according to Manley:1992yb .
double Lambda_
Cut-off parameter Λ for unstable decays.
ThreeBodyDecayDilepton(ParticleTypePtr mother, ParticleTypePtrList part_types, int l)
Construct a ThreeBodyDecayDilepton.