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