Version: SMASH-1.5
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 270 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 310 of file decaytype.cc.

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 }
std::unique_ptr< Tabulation > tabulation_
Tabulation of the resonance integrals.
Definition: decaytype.h:309
ParticleTypePtrList particle_types_
final-state particles of the decay
Definition: decaytype.h:84
bool has_lepton_pair(const PdgCode pdg1, const PdgCode pdg2, const PdgCode pdg3)
Definition: pdgcode.h:992
constexpr int invalid
Invalid particle.
ThreeBodyDecay(ParticleTypePtrList part_types, int l)
Construct a ThreeBodyDecay.
Definition: decaytype.cc:278
ParticleTypePtr mother_
Type of the mother particle.
Definition: decaytype.h:312
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 337 of file decaytype.cc.

337  {
338  return mother == mother_;
339 }
ParticleTypePtr mother_
Type of the mother particle.
Definition: decaytype.h:312

◆ 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, eq. (30)-(36).

Todo:
{Cite SMASH dilepton paper.}
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, equation (3.8)

see Landsberg:1986fd, equation (3.4)

see Krivoruchenko:2001hs

Definition at line 341 of file decaytype.cc.

344  {
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()) {
360  const ParticleType& photon = ParticleType::find(pdg::photon);
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 }
constexpr int photon
Photon.
constexpr T pow_int(const T base, unsigned const exponent)
Efficient template for calculating integer powers using squaring.
Definition: pow.h:23
constexpr double fine_structure
Fine-struture constant, approximately 1/137.
Definition: constants.h:95
constexpr int Delta_z
Δ⁰.
static const ParticleType & find(PdgCode pdgcode)
Returns the ParticleType object for the given pdgcode.
constexpr int Delta_p
Δ⁺.
double em_form_factor_sqr_vec(PdgCode pdg, double mass)
Definition: formfactors.h:120
double form_factor_delta(double m)
Definition: formfactors.h:144
double em_form_factor_ps(PdgCode pdg, double mass)
Definition: formfactors.h:97
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 428 of file decaytype.cc.

428  {
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 }
double mass() const
Definition: particletype.h:134
std::unique_ptr< Tabulation > tabulation_
Tabulation of the resonance integrals.
Definition: decaytype.h:309
ParticleTypePtrList particle_types_
final-state particles of the decay
Definition: decaytype.h:84
double width_at_pole() const
Definition: particletype.h:140
bool is_stable() const
Definition: particletype.h:226
constexpr int num_tab_pts
Definition: decaytype.cc:146
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
ParticleTypePtr mother_
Type of the mother particle.
Definition: decaytype.h:312
static Integrator integrate
Definition: decaytype.cc:147
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 309 of file decaytype.h.

◆ mother_

ParticleTypePtr smash::ThreeBodyDecayDilepton::mother_
protected

Type of the mother particle.

Definition at line 312 of file decaytype.h.


The documentation for this class was generated from the following files: