Version: SMASH-2.0
decaytype.cc
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2015-2020
3  * SMASH Team
4  *
5  * GNU General Public License (GPLv3 or later)
6  */
7 
8 #include "smash/decaytype.h"
9 
10 #include <algorithm>
11 #include <cmath>
12 
13 #include "smash/constants.h"
14 #include "smash/cxx14compat.h"
15 #include "smash/formfactors.h"
16 #include "smash/pow.h"
17 
18 namespace smash {
19 
20 // auxiliary functions
21 
22 static double integrand_rho_Manley_1res(double sqrts, double mass,
23  double stable_mass,
24  ParticleTypePtr type, int L) {
25  if (sqrts <= mass + stable_mass) {
26  return 0.;
27  }
28 
29  /* center-of-mass momentum of final state particles */
30  const double p_f = pCM(sqrts, stable_mass, mass);
31 
32  return p_f / sqrts * blatt_weisskopf_sqr(p_f, L) *
33  type->spectral_function(mass);
34 }
35 
36 static double integrand_rho_Manley_2res(double sqrts, double m1, double m2,
38  int L) {
39  if (sqrts <= m1 + m2) {
40  return 0.;
41  }
42 
43  /* center-of-mass momentum of final state particles */
44  const double p_f = pCM(sqrts, m1, m2);
45 
46  return p_f / sqrts * blatt_weisskopf_sqr(p_f, L) * t1->spectral_function(m1) *
47  t2->spectral_function(m2);
48 }
49 
50 // TwoBodyDecay
51 
52 TwoBodyDecay::TwoBodyDecay(ParticleTypePtrList part_types, int l)
53  : DecayType(part_types, l) {
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()));
58  }
59 }
60 
61 unsigned int TwoBodyDecay::particle_number() const { return 2; }
62 
63 bool TwoBodyDecay::has_particles(ParticleTypePtrList list) const {
64  if (list.size() != particle_number()) {
65  return false;
66  }
67  return (particle_types_[0] == list[0] && particle_types_[1] == list[1]) ||
68  (particle_types_[0] == list[1] && particle_types_[1] == list[0]);
69 }
70 
71 // TwoBodyDecayStable
72 
73 TwoBodyDecayStable::TwoBodyDecayStable(ParticleTypePtrList part_types, int l)
74  : TwoBodyDecay(part_types, l) {
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());
80  }
81 }
82 
83 double TwoBodyDecayStable::rho(double m) const {
84  // Determine momentum of outgoing particles in rest frame of the resonance
85  const double p_ab =
86  pCM(m, particle_types_[0]->mass(), particle_types_[1]->mass());
87  // determine rho(m)
88  return p_ab / m * blatt_weisskopf_sqr(p_ab, L_);
89 }
90 
91 double TwoBodyDecayStable::width(double m0, double G0, double m) const {
92  assert(rho(m0) != 0);
93  return (m <= threshold()) ? 0. : G0 * rho(m) / rho(m0);
94 }
95 
96 double TwoBodyDecayStable::in_width(double m0, double G0, double m, double,
97  double) const {
98  // in-width = out-width
99  return width(m0, G0, m);
100 }
101 
102 // TwoBodyDecaySemistable
103 
110 static ParticleTypePtrList& arrange_particles(ParticleTypePtrList& part_types) {
111  if (part_types[1]->is_stable()) {
112  std::swap(part_types[0], part_types[1]);
113  }
114  /* verify that this is really a "semi-stable" decay,
115  * i.e. the first particle is stable and the second unstable */
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());
120  }
121  return part_types;
122 }
123 
124 TwoBodyDecaySemistable::TwoBodyDecaySemistable(ParticleTypePtrList part_types,
125  int l)
126  : TwoBodyDecay(arrange_particles(part_types), l),
127  Lambda_(get_Lambda()),
128  tabulation_(nullptr) {}
129 
131  // "semi-stable" decays (first daughter is stable and second one unstable)
132  if (particle_types_[1]->baryon_number() != 0) {
133  return 2.; // unstable baryons
134  } else if (particle_types_[1]->pdgcode().is_rho() &&
135  particle_types_[0]->pdgcode().is_pion()) {
136  return 0.8; // ρ+π
137  } else {
138  return 1.6; // other unstable mesons
139  }
140 }
141 
143 constexpr size_t num_tab_pts = 200;
144 static /*thread_local (see #3075)*/ Integrator integrate;
145 
146 double TwoBodyDecaySemistable::rho(double mass) const {
147  if (tabulation_ == nullptr) {
148  /* TODO(weil): Move this lazy init to a global initialization function,
149  * in order to avoid race conditions in multi-threading. */
150  const ParticleTypePtr res = particle_types_[1];
151  const double tabulation_interval = std::max(2., 10. * res->width_at_pole());
152  const double m_stable = particle_types_[0]->mass();
153  const double mres_min = res->min_mass_kinematic();
154 
155  tabulation_ = make_unique<Tabulation>(
156  threshold(), tabulation_interval, num_tab_pts, [&](double sqrts) {
157  const double mres_max = sqrts - m_stable;
158  return integrate(mres_min, mres_max, [&](double m) {
159  return integrand_rho_Manley_1res(sqrts, m, m_stable, res, L_);
160  });
161  });
162  }
163  return tabulation_->get_value_linear(mass);
164 }
165 
166 double TwoBodyDecaySemistable::width(double m0, double G0, double m) const {
167  assert(rho(m0) != 0);
168  return G0 * rho(m) / rho(m0) * post_ff_sqr(m, m0, threshold(), Lambda_);
169 }
170 
171 double TwoBodyDecaySemistable::in_width(double m0, double G0, double m,
172  double m1, double m2) const {
173  assert(rho(m0) != 0);
174  const double p_f = pCM(m, m1, m2);
175 
176  return G0 * p_f * blatt_weisskopf_sqr(p_f, L_) *
177  post_ff_sqr(m, m0, threshold(), Lambda_) / (m * rho(m0));
178 }
179 
180 // TwoBodyDecayUnstable
181 
182 TwoBodyDecayUnstable::TwoBodyDecayUnstable(ParticleTypePtrList part_types,
183  int l)
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());
190  }
191 }
192 
194  // for now: use the same value for all unstable decays (fixed on f₂ → ρ ρ)
195  return 0.6;
196 }
197 
198 static /*thread_local*/ Integrator2d integrate2d(1E7);
199 
200 double TwoBodyDecayUnstable::rho(double mass) const {
201  if (tabulation_ == nullptr) {
202  /* TODO(weil): Move this lazy init to a global initialization function,
203  * in order to avoid race conditions in multi-threading. */
204  const ParticleTypePtr r1 = particle_types_[0];
205  const ParticleTypePtr r2 = particle_types_[1];
206  const double m1_min = r1->min_mass_kinematic();
207  const double m2_min = r2->min_mass_kinematic();
208  const double sum_gamma = r1->width_at_pole() + r2->width_at_pole();
209  const double tab_interval = std::max(2., 10. * sum_gamma);
210 
211  tabulation_ = make_unique<Tabulation>(
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;
215 
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_);
220  })
221  .value();
222  return result;
223  });
224  }
225  return tabulation_->get_value_linear(mass);
226 }
227 
228 double TwoBodyDecayUnstable::width(double m0, double G0, double m) const {
229  return G0 * rho(m) / rho(m0) * post_ff_sqr(m, m0, threshold(), Lambda_);
230 }
231 
232 double TwoBodyDecayUnstable::in_width(double m0, double G0, double m, double m1,
233  double m2) const {
234  const double p_f = pCM(m, m1, m2);
235 
236  return G0 * p_f * blatt_weisskopf_sqr(p_f, L_) *
237  post_ff_sqr(m, m0, threshold(), Lambda_) / (m * rho(m0));
238 }
239 
240 // TwoBodyDecayDilepton
241 
242 TwoBodyDecayDilepton::TwoBodyDecayDilepton(ParticleTypePtrList part_types,
243  int l)
244  : TwoBodyDecayStable(part_types, l) {
245  if (!is_dilepton(particle_types_[0]->pdgcode(),
246  particle_types_[1]->pdgcode())) {
247  throw std::runtime_error(
248  "Error: No dilepton in TwoBodyDecayDilepton constructor: " +
249  part_types[0]->pdgcode().string() + " " +
250  part_types[1]->pdgcode().string());
251  }
252 }
253 
254 double TwoBodyDecayDilepton::width(double m0, double G0, double m) const {
255  if (m <= threshold()) {
256  return 0;
257  } else {
259  const double ml = particle_types_[0]->mass(); // lepton mass
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);
264  }
265 }
266 
267 // ThreeBodyDecay
268 
270 static ParticleTypePtrList sort_particles(ParticleTypePtrList part_types) {
271  std::sort(part_types.begin(), part_types.end());
272  return part_types;
273 }
274 
275 ThreeBodyDecay::ThreeBodyDecay(ParticleTypePtrList part_types, int l)
276  : DecayType(sort_particles(part_types), l) {
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()));
281  }
282 }
283 
284 unsigned int ThreeBodyDecay::particle_number() const { return 3; }
285 
286 bool ThreeBodyDecay::has_particles(ParticleTypePtrList list) const {
287  if (list.size() != particle_number()) {
288  return false;
289  }
290  // compare sorted vectors (particle_types_ is already sorted)
291  std::sort(list.begin(), list.end());
292  return particle_types_[0] == list[0] && particle_types_[1] == list[1] &&
293  particle_types_[2] == list[2];
294 }
295 
296 double ThreeBodyDecay::width(double, double G0, double) const {
297  return G0; // use on-shell width
298 }
299 
300 double ThreeBodyDecay::in_width(double, double G0, double, double,
301  double) const {
302  return G0; // use on-shell width
303 }
304 
305 // ThreeBodyDecayDilepton
306 
308  ParticleTypePtrList part_types,
309  int l)
310  : ThreeBodyDecay(part_types, l), tabulation_(nullptr), mother_(mother) {
311  if (!has_lepton_pair(particle_types_[0]->pdgcode(),
312  particle_types_[1]->pdgcode(),
313  particle_types_[2]->pdgcode())) {
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());
319  }
320 
321  int non_lepton_position = -1;
322  for (int i = 0; i < 3; ++i) {
323  if (!particle_types_[i]->is_lepton()) {
324  non_lepton_position = i;
325  break;
326  }
327  }
328 
329  if (mother->pdgcode() == pdg::invalid || non_lepton_position == -1) {
330  throw std::runtime_error("Error: Unsupported dilepton Dalitz decay!");
331  }
332 }
333 
335  return mother == mother_;
336 }
337 
338 double ThreeBodyDecayDilepton::diff_width(double m_par, double m_l,
339  double m_dil, double m_other,
340  ParticleTypePtr other,
341  ParticleTypePtr t) {
342  // check threshold
343  if (m_par < m_dil + m_other) {
344  return 0;
345  }
346 
347  // abbreviations
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);
354 
355  PdgCode pdg = t->pdgcode();
356  if (pdg.is_meson()) {
358  switch (pdg.spin()) {
359  case 0: /* pseudoscalars: π⁰, η, η' */ {
360  // width for decay into 2γ
361  const double gamma_2g = t->get_partial_width(m_par, {&photon, &photon});
362  double ff = em_form_factor_ps(pdg, m_dil); // form factor
364  return (4. * fine_structure / (3. * M_PI)) * gamma_2g / m_dil *
365  pow_int(1. - m_dil / m_par * m_dil / m_par, 3) * ff * ff *
366  ph_sp_factor;
367  }
368  case 2: /* vectors: ω, φ */ {
369  // width for decay into Pγ with P = π,η
370  const double gamma_pg = t->get_partial_width(m_par, {other, &photon});
371  double ff_sqr =
372  em_form_factor_sqr_vec(pdg, m_dil); // form factor squared
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);
377  if (rad < 0.) {
378  assert(rad > -1E-5);
379  return 0.;
380  } else {
381  return (2. * fine_structure / (3. * M_PI)) * gamma_pg / m_dil *
382  std::pow(rad, 3. / 2.) * ff_sqr * ph_sp_factor;
383  }
384  }
385  default:
386  throw std::runtime_error("Bad meson in ThreeBodyDecayDilepton: " +
387  pdg.string());
388  }
389  } else if (pdg.is_baryon()) {
390  switch (pdg.code()) {
391  case pdg::Delta_p:
392  case -pdg::Delta_p:
393  case pdg::Delta_z:
394  case -pdg::Delta_z: /* Δ⁺, Δ⁰ (and antiparticles) */ {
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;
398  if (rad1 < 0.) {
399  assert(rad1 > -1E-5);
400  return 0.;
401  } else if (rad2 < 0.) {
402  assert(rad2 > -1E-5);
403  return 0.;
404  } else {
405  const double t1 = fine_structure / 16. * (m_par + m_other) *
406  (m_par + m_other) / (m_par_cubed * m_other_sqr) *
407  std::sqrt(rad1);
408  const double t2 = pow_int(std::sqrt(rad2), 3);
409  const double ff = form_factor_delta(m_dil);
410  const double gamma_vi = t1 * t2 * ff * ff;
411  return 2. * fine_structure / (3. * M_PI) * gamma_vi / m_dil *
412  ph_sp_factor;
413  }
414  }
415  default:
416  throw std::runtime_error("Bad baryon in ThreeBodyDecayDilepton: " +
417  pdg.string());
418  }
419  } else {
420  throw std::runtime_error("Non-hadron in ThreeBodyDecayDilepton: " +
421  pdg.string());
422  }
423 }
424 
425 double ThreeBodyDecayDilepton::width(double, double G0, double m) const {
426  if (mother_->is_stable()) {
427  return G0;
428  }
429 
430  if (!tabulation_) {
431  int non_lepton_position = -1;
432  for (int i = 0; i < 3; ++i) {
433  if (!particle_types_[i]->is_lepton()) {
434  non_lepton_position = i;
435  break;
436  }
437  }
438  // lepton mass
439  const double m_l = particle_types_[(non_lepton_position + 1) % 3]->mass();
440  // mass of non-leptonic particle in final state
441  const double m_other = particle_types_[non_lepton_position]->mass();
442 
443  // integrate differential width to obtain partial width
444  double M0 = mother_->mass();
445  double G0tot = mother_->width_at_pole();
446  tabulation_ = make_unique<Tabulation>(
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;
450  if (top < bottom) { // numerical problems at lower bound
451  return 0.;
452  }
453  return integrate(bottom, top,
454  [&](double m_dil) {
455  return diff_width(
456  m_parent, m_l, m_dil, m_other,
457  particle_types_[non_lepton_position], mother_);
458  })
459  .value();
460  });
461  }
462 
463  return tabulation_->get_value_linear(m, Extrapolation::Const);
464 }
465 
466 } // namespace smash
smash::Extrapolation::Const
smash::TwoBodyDecay::TwoBodyDecay
TwoBodyDecay(ParticleTypePtrList part_types, int l)
Construct a TwoBodyDecay.
Definition: decaytype.cc:52
smash
Definition: action.h:24
smash::TwoBodyDecayUnstable::TwoBodyDecayUnstable
TwoBodyDecayUnstable(ParticleTypePtrList part_types, int l)
Construct a TwoBodyDecayUnstable.
Definition: decaytype.cc:182
smash::ThreeBodyDecay::particle_number
unsigned int particle_number() const override
Definition: decaytype.cc:284
smash::fine_structure
constexpr double fine_structure
Fine-struture constant, approximately 1/137.
Definition: constants.h:98
smash::TwoBodyDecay::threshold
double threshold() const
Definition: decaytype.h:105
smash::TwoBodyDecayStable::TwoBodyDecayStable
TwoBodyDecayStable(ParticleTypePtrList part_types, int l)
Construct a TwoBodyDecayStable.
Definition: decaytype.cc:73
smash::ParticleType::width_at_pole
double width_at_pole() const
Definition: particletype.h:150
pow.h
smash::DecayType
DecayType is the abstract base class for all decay types.
Definition: decaytype.h:23
smash::ThreeBodyDecay
ThreeBodyDecay represents a decay type with three final-state particles.
Definition: decaytype.h:286
smash::Integrator2d
A C++ interface for numerical integration in two dimensions with the Cuba Cuhre integration function.
Definition: integrate.h:219
smash::TwoBodyDecay::particle_number
unsigned int particle_number() const override
Definition: decaytype.cc:61
smash::ThreeBodyDecayDilepton::tabulation_
std::unique_ptr< Tabulation > tabulation_
Tabulation of the resonance integrals.
Definition: decaytype.h:348
smash::DecayType::L_
int L_
angular momentum of the decay
Definition: decaytype.h:86
smash::PdgCode::spin
unsigned int spin() const
Definition: pdgcode.h:518
smash::arrange_particles
static ParticleTypePtrList & arrange_particles(ParticleTypePtrList &part_types)
Rearrange the particle list such that the first particle is the stable one.
Definition: decaytype.cc:110
smash::TwoBodyDecayStable::rho
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...
Definition: decaytype.cc:83
smash::em_form_factor_sqr_vec
double em_form_factor_sqr_vec(PdgCode pdg, double mass)
Definition: formfactors.h:120
smash::TwoBodyDecaySemistable::in_width
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...
Definition: decaytype.cc:171
smash::TwoBodyDecayUnstable::get_Lambda
double get_Lambda()
Definition: decaytype.cc:193
cxx14compat.h
smash::TwoBodyDecayUnstable::tabulation_
std::unique_ptr< Tabulation > tabulation_
Tabulation of the resonance integrals.
Definition: decaytype.h:262
smash::TwoBodyDecay::has_particles
bool has_particles(ParticleTypePtrList list) const override
Definition: decaytype.cc:63
smash::form_factor_delta
double form_factor_delta(double m)
Definition: formfactors.h:144
smash::TwoBodyDecaySemistable::get_Lambda
double get_Lambda()
Definition: decaytype.cc:130
smash::ThreeBodyDecay::has_particles
bool has_particles(ParticleTypePtrList list) const override
Definition: decaytype.cc:286
smash::Integrator
A C++ interface for numerical integration in one dimension with the GSL CQUAD integration functions.
Definition: integrate.h:106
smash::integrand_rho_Manley_2res
static double integrand_rho_Manley_2res(double sqrts, double m1, double m2, ParticleTypePtr t1, ParticleTypePtr t2, int L)
Definition: decaytype.cc:36
smash::pdg::Delta_p
constexpr int Delta_p
Δ⁺.
Definition: pdgcode_constants.h:40
smash::blatt_weisskopf_sqr
double blatt_weisskopf_sqr(const double p_ab, const int L)
Definition: formfactors.h:33
smash::ParticleType::mass
double mass() const
Definition: particletype.h:144
smash::TwoBodyDecaySemistable::TwoBodyDecaySemistable
TwoBodyDecaySemistable(ParticleTypePtrList part_types, int l)
Construct a TwoBodyDecaySemistable.
Definition: decaytype.cc:124
smash::ParticleType::spectral_function
double spectral_function(double m) const
Full spectral function of the resonance (relativistic Breit-Wigner distribution with mass-dependent ...
Definition: particletype.cc:570
smash::DecayType::particle_types_
ParticleTypePtrList particle_types_
final-state particles of the decay
Definition: decaytype.h:84
smash::pdg::Delta_z
constexpr int Delta_z
Δ⁰.
Definition: pdgcode_constants.h:42
smash::ThreeBodyDecayDilepton::has_mother
bool has_mother(ParticleTypePtr mother) const override
Definition: decaytype.cc:334
smash::ParticleType::pdgcode
PdgCode pdgcode() const
Definition: particletype.h:156
smash::TwoBodyDecayUnstable::rho
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...
Definition: decaytype.cc:200
smash::pdg::photon
constexpr int photon
Photon.
Definition: pdgcode_constants.h:25
smash::pCM
T pCM(const T sqrts, const T mass_a, const T mass_b) noexcept
Definition: kinematics.h:79
smash::ParticleType::find
static const ParticleType & find(PdgCode pdgcode)
Returns the ParticleType object for the given pdgcode.
Definition: particletype.cc:99
smash::TwoBodyDecayStable::width
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 .
Definition: decaytype.cc:91
smash::TwoBodyDecaySemistable::width
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 ...
Definition: decaytype.cc:166
smash::TwoBodyDecaySemistable::rho
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...
Definition: decaytype.cc:146
smash::PdgCode::string
std::string string() const
Definition: pdgcode.h:250
smash::ParticleTypePtr
Definition: particletype.h:665
smash::ThreeBodyDecay::width
double width(double m0, double G0, double m) const override
Definition: decaytype.cc:296
smash::ThreeBodyDecay::in_width
double in_width(double m0, double G0, double m, double m1, double m2) const override
Definition: decaytype.cc:300
smash::integrate
static Integrator integrate
Definition: decaytype.cc:144
smash::ThreeBodyDecay::ThreeBodyDecay
ThreeBodyDecay(ParticleTypePtrList part_types, int l)
Construct a ThreeBodyDecay.
Definition: decaytype.cc:275
smash::TwoBodyDecayStable::in_width
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...
Definition: decaytype.cc:96
smash::pdg::invalid
constexpr int invalid
Invalid particle.
Definition: pdgcode_constants.h:22
smash::TwoBodyDecayDilepton::TwoBodyDecayDilepton
TwoBodyDecayDilepton(ParticleTypePtrList part_types, int l)
Construct a TwoBodyDecayDilepton.
Definition: decaytype.cc:242
formfactors.h
smash::ParticleType::is_stable
bool is_stable() const
Definition: particletype.h:239
smash::ParticleType
Definition: particletype.h:97
smash::em_form_factor_ps
double em_form_factor_ps(PdgCode pdg, double mass)
Definition: formfactors.h:97
smash::PdgCode
Definition: pdgcode.h:108
smash::ThreeBodyDecayDilepton::mother_
ParticleTypePtr mother_
Type of the mother particle.
Definition: decaytype.h:351
decaytype.h
smash::num_tab_pts
constexpr size_t num_tab_pts
Number of tabulation points.
Definition: decaytype.cc:143
smash::post_ff_sqr
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.
Definition: formfactors.h:75
smash::integrate2d
static Integrator2d integrate2d(1E7)
smash::ParticleType::get_partial_width
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...
Definition: particletype.cc:535
smash::pow_int
constexpr T pow_int(const T base, unsigned const exponent)
Efficient template for calculating integer powers using squaring.
Definition: pow.h:23
smash::TwoBodyDecayStable
TwoBodyDecayStable represents a decay type with two stable final-state particles.
Definition: decaytype.h:130
smash::integrand_rho_Manley_1res
static double integrand_rho_Manley_1res(double sqrts, double mass, double stable_mass, ParticleTypePtr type, int L)
Definition: decaytype.cc:22
smash::has_lepton_pair
bool has_lepton_pair(const PdgCode pdg1, const PdgCode pdg2, const PdgCode pdg3)
Definition: pdgcode.h:1004
constants.h
smash::TwoBodyDecayUnstable::width
double width(double m0, double G0, double m) const override
Definition: decaytype.cc:228
smash::ThreeBodyDecayDilepton::diff_width
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...
Definition: decaytype.cc:338
smash::sort_particles
static ParticleTypePtrList sort_particles(ParticleTypePtrList part_types)
sort the particle list
Definition: decaytype.cc:270
smash::TwoBodyDecay
TwoBodyDecay represents a decay type with two final-state particles.
Definition: decaytype.h:92
smash::ThreeBodyDecayDilepton::width
double width(double m0, double G0, double m) const override
Definition: decaytype.cc:425
smash::PdgCode::is_baryon
bool is_baryon() const
Definition: pdgcode.h:315
smash::ParticleType::min_mass_kinematic
double min_mass_kinematic() const
The minimum mass of the resonance that is kinematically allowed.
Definition: particletype.cc:354
smash::TwoBodyDecaySemistable::Lambda_
double Lambda_
Cut-off parameter Λ for semi-stable decays.
Definition: decaytype.h:226
smash::TwoBodyDecaySemistable::tabulation_
std::unique_ptr< Tabulation > tabulation_
Tabulation of the resonance integrals.
Definition: decaytype.h:229
smash::PdgCode::code
std::int32_t code() const
Definition: pdgcode.h:247
smash::is_dilepton
bool is_dilepton(const PdgCode pdg1, const PdgCode pdg2)
Definition: pdgcode.h:992
smash::TwoBodyDecayUnstable::in_width
double in_width(double m0, double G0, double m, double m1, double m2) const override
Definition: decaytype.cc:232
smash::TwoBodyDecayDilepton::width
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 .
Definition: decaytype.cc:254
smash::PdgCode::is_meson
bool is_meson() const
Definition: pdgcode.h:318
smash::TwoBodyDecayUnstable::Lambda_
double Lambda_
Cut-off parameter Λ for unstable decays.
Definition: decaytype.h:259
smash::ThreeBodyDecayDilepton::ThreeBodyDecayDilepton
ThreeBodyDecayDilepton(ParticleTypePtr mother, ParticleTypePtrList part_types, int l)
Construct a ThreeBodyDecayDilepton.
Definition: decaytype.cc:307