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