Version: SMASH-2.0
smash::ThreeBodyDecayDilepton Class Reference

#include <decaytype.h>

ThreeBodyDecayDilepton represents a decay type with three final-state particles, two of which are leptons.

Definition at line 308 of file decaytype.h.

Inheritance diagram for smash::ThreeBodyDecayDilepton:
[legend]
Collaboration diagram for smash::ThreeBodyDecayDilepton:
[legend]

Public Member Functions

 ThreeBodyDecayDilepton (ParticleTypePtr mother, ParticleTypePtrList part_types, int l)
 Construct a ThreeBodyDecayDilepton. More...
 
bool has_mother (ParticleTypePtr mother) const override
 
double width (double m0, double G0, double m) const override
 
- Public Member Functions inherited from smash::ThreeBodyDecay
 ThreeBodyDecay (ParticleTypePtrList part_types, int l)
 Construct a ThreeBodyDecay. More...
 
unsigned int particle_number () const override
 
bool has_particles (ParticleTypePtrList list) const override
 
double in_width (double m0, double G0, double m, double m1, double m2) const override
 
- Public Member Functions inherited from smash::DecayType
 DecayType (ParticleTypePtrList part_types, int l)
 Construct a DecayType. More...
 
virtual ~DecayType ()=default
 Virtual Destructor. More...
 
const ParticleTypePtrList & particle_types () const
 
int angular_momentum () const
 

Static Public Member Functions

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 \( d\Gamma / dm \) for a dilepton Dalitz decay, where \( m \) is the invariant mass of the lepton pair. More...
 

Protected Attributes

std::unique_ptr< Tabulationtabulation_
 Tabulation of the resonance integrals. More...
 
ParticleTypePtr mother_
 Type of the mother particle. More...
 
- Protected Attributes inherited from smash::DecayType
ParticleTypePtrList particle_types_
 final-state particles of the decay More...
 
int L_
 angular momentum of the decay More...
 

Constructor & Destructor Documentation

◆ ThreeBodyDecayDilepton()

smash::ThreeBodyDecayDilepton::ThreeBodyDecayDilepton ( ParticleTypePtr  mother,
ParticleTypePtrList  part_types,
int  l 
)

Construct a ThreeBodyDecayDilepton.

Parameters
[in]motherType of the mother particle.
[in]part_typesFinal-state particles of the decay.
[in]lAngular momentum of the decay.
Returns
The constructed object.

Definition at line 307 of file decaytype.cc.

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 }
Here is the call graph for this function:

Member Function Documentation

◆ has_mother()

bool smash::ThreeBodyDecayDilepton::has_mother ( ParticleTypePtr  mother) const
overridevirtual
Returns
if this decay type has the right mother (most decays do not depend on the mother type).
Parameters
[in]motherParticle type to be checked.

Reimplemented from smash::DecayType.

Definition at line 334 of file decaytype.cc.

334  {
335  return mother == mother_;
336 }

◆ diff_width()

double smash::ThreeBodyDecayDilepton::diff_width ( double  m_par,
double  m_l,
double  m_dil,
double  m_other,
ParticleTypePtr  other,
ParticleTypePtr  t 
)
static

Get the mass-differential width \( d\Gamma / dm \) for a dilepton Dalitz decay, where \( m \) is the invariant mass of the lepton pair.

This differential width is used directly for the dilepton shining weights. It is calculated according to Weil:2013mya [51], eq. (30)-(36).

Also see Staudenmaier:2017vtq [47] for a description of dilepton production in SMASH.

Parameters
[in]m_parMass of the parent.
[in]m_lMass of the lepton species.
[in]m_dilInvariant mass of the dilepton pair [GeV].
[in]m_otherMass of the third, non-leptonic, particle.
[in]otherType of the third particle.
[in]tType of the parent particle.
Returns
Mass differential width.

see Landsberg:1986fd [28], equation (3.8)

see Landsberg:1986fd [28], equation (3.4)

see Krivoruchenko:2001hs [26]

Definition at line 338 of file decaytype.cc.

341  {
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()) {
357  const ParticleType& photon = ParticleType::find(pdg::photon);
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 }
Here is the call graph for this function:
Here is the caller graph for this function:

◆ width()

double smash::ThreeBodyDecayDilepton::width ( double  m0,
double  G0,
double  m 
) const
overridevirtual
Returns
the mass-dependent width of the decay.
Parameters
[in]m0Pole mass of the decaying particle [GeV].
[in]G0Partial width at the pole mass [GeV].
[in]mActual mass of the decaying particle [GeV].

Reimplemented from smash::ThreeBodyDecay.

Definition at line 425 of file decaytype.cc.

425  {
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 }
Here is the call graph for this function:

Member Data Documentation

◆ tabulation_

std::unique_ptr<Tabulation> smash::ThreeBodyDecayDilepton::tabulation_
mutableprotected

Tabulation of the resonance integrals.

Definition at line 348 of file decaytype.h.

◆ mother_

ParticleTypePtr smash::ThreeBodyDecayDilepton::mother_
protected

Type of the mother particle.

Definition at line 351 of file decaytype.h.


The documentation for this class was generated from the following files:
smash::Extrapolation::Const
smash::fine_structure
constexpr double fine_structure
Fine-struture constant, approximately 1/137.
Definition: constants.h:98
smash::ParticleType::width_at_pole
double width_at_pole() const
Definition: particletype.h:150
smash::ThreeBodyDecayDilepton::tabulation_
std::unique_ptr< Tabulation > tabulation_
Tabulation of the resonance integrals.
Definition: decaytype.h:348
smash::em_form_factor_sqr_vec
double em_form_factor_sqr_vec(PdgCode pdg, double mass)
Definition: formfactors.h:120
smash::form_factor_delta
double form_factor_delta(double m)
Definition: formfactors.h:144
smash::pdg::Delta_p
constexpr int Delta_p
Δ⁺.
Definition: pdgcode_constants.h:40
smash::ParticleType::mass
double mass() const
Definition: particletype.h:144
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::pdg::photon
constexpr int photon
Photon.
Definition: pdgcode_constants.h:25
smash::ParticleType::find
static const ParticleType & find(PdgCode pdgcode)
Returns the ParticleType object for the given pdgcode.
Definition: particletype.cc:99
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::pdg::invalid
constexpr int invalid
Invalid particle.
Definition: pdgcode_constants.h:22
smash::ParticleType::is_stable
bool is_stable() const
Definition: particletype.h:239
smash::em_form_factor_ps
double em_form_factor_ps(PdgCode pdg, double mass)
Definition: formfactors.h:97
smash::ThreeBodyDecayDilepton::mother_
ParticleTypePtr mother_
Type of the mother particle.
Definition: decaytype.h:351
smash::num_tab_pts
constexpr size_t num_tab_pts
Number of tabulation points.
Definition: decaytype.cc:143
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::has_lepton_pair
bool has_lepton_pair(const PdgCode pdg1, const PdgCode pdg2, const PdgCode pdg3)
Definition: pdgcode.h:1004
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