Version: SMASH-1.8
smash::ParticleType Class Reference

#include <particletype.h>

Particle type contains the static properties of a particle species

Before creation of Experiment, SMASH initializes the list of particles (list_all). After construction these values are immutable.

The list of particles is stored in such a way that look up of a ParticleType object (find) for a given PDG code is as efficient as possible ( \(\mathcal O(\log N)\)). This is still not efficient enough to use PdgCode as a substitute for storing information about a particle type, though. Use ParticleTypePtr instead.

Definition at line 97 of file particletype.h.

Collaboration diagram for smash::ParticleType:
[legend]

Classes

struct  LoadFailure
 
struct  PdgNotFoundFailure
 

Public Member Functions

 ParticleType (std::string n, double m, double w, Parity p, PdgCode id)
 Creates a fully initialized ParticleType object. More...
 
 ParticleType (const ParticleType &)=delete
 Copies are not allowed as they break intended use. More...
 
ParticleTypeoperator= (const ParticleType &)=delete
 assignment is not allowed, see copy constructor above More...
 
 ParticleType (ParticleType &&)=default
 move ctors are needed for std::sort More...
 
ParticleTypeoperator= (ParticleType &&)=default
 move ctors are needed for std::sort More...
 
const DecayModesdecay_modes () const
 
const std::string & name () const
 
double mass () const
 
double mass_sqr () const
 
double width_at_pole () const
 
Parity parity () const
 
PdgCode pdgcode () const
 
bool has_antiparticle () const
 
ParticleTypePtr get_antiparticle () const
 
int antiparticle_sign () const
 
int isospin () const
 Returns twice the isospin vector length \(I\). More...
 
int isospin3 () const
 
double isospin3_rel () const
 
IsoParticleTypeiso_multiplet () const
 
int32_t charge () const
 The charge of the particle. More...
 
unsigned int spin () const
 
bool is_hadron () const
 
bool is_lepton () const
 
bool is_baryon () const
 
bool is_meson () const
 
int baryon_number () const
 
int strangeness () const
 
bool is_nucleon () const
 
bool is_Delta () const
 
bool is_rho () const
 
bool is_Nstar () const
 
bool is_Nstar1535 () const
 
bool is_Deltastar () const
 
bool is_stable () const
 
bool is_nucleus () const
 
bool is_deuteron () const
 
bool is_dprime () const
 
double min_mass_kinematic () const
 The minimum mass of the resonance that is kinematically allowed. More...
 
double min_mass_spectral () const
 The minimum mass of the resonance, where the spectral function is non-zero. More...
 
double partial_width (const double m, const DecayBranch *mode) const
 Get the mass-dependent partial decay width of a particle with mass m in a particular decay mode. More...
 
double total_width (const double m) const
 Get the mass-dependent total width of a particle with mass m. More...
 
bool wanted_decaymode (const DecayType &t, WhichDecaymodes wh) const
 Helper Function that containes the if-statement logic that decides if a decay mode is either a hadronic and dilepton decay mode. More...
 
DecayBranchList get_partial_widths (const FourVector p, const ThreeVector x, WhichDecaymodes wh) const
 Get all the mass-dependent partial decay widths of a particle with mass m. More...
 
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 particles. More...
 
double get_partial_in_width (const double m, const ParticleData &p_a, const ParticleData &p_b) const
 Get the mass-dependent partial in-width of a resonance with mass m, decaying into two given daughter particles. More...
 
double spectral_function (double m) const
 Full spectral function \( A(m) = \frac{2}{\pi} N \frac{m^2\Gamma(m)}{(m^2-m_0^2)^2+(m\Gamma(m))^2} \) of the resonance (relativistic Breit-Wigner distribution with mass-dependent width, where N is a normalization factor). More...
 
double spectral_function_no_norm (double m) const
 Full spectral function without normalization factor. More...
 
double spectral_function_const_width (double m) const
 
double spectral_function_simple (double m) const
 This one is the most simple form of the spectral function, using a Cauchy distribution (non-relativistic Breit-Wigner with constant width). More...
 
double sample_resonance_mass (const double mass_stable, const double cms_energy, int L=0) const
 Resonance mass sampling for 2-particle final state with one resonance (type given by 'this') and one stable particle. More...
 
std::pair< double, double > sample_resonance_masses (const ParticleType &t2, const double cms_energy, int L=0) const
 Resonance mass sampling for 2-particle final state with two resonances. More...
 
void dump_width_and_spectral_function () const
 Prints out width and spectral function versus mass to the standard output. More...
 
bool operator== (const ParticleType &rhs) const
 
bool operator!= (const ParticleType &rhs) const
 
bool operator< (const ParticleType &rhs) const
 "Less than" operator for sorting the ParticleType list (by PDG code) More...
 
ParticleTypePtr operator& () const
 Returns an object that acts like a pointer, except that it requires only 2 bytes and inhibits pointer arithmetics. More...
 

Static Public Member Functions

static const ParticleTypeList & list_all ()
 
static ParticleTypePtrList & list_nucleons ()
 
static ParticleTypePtrList & list_anti_nucleons ()
 
static ParticleTypePtrList & list_Deltas ()
 
static ParticleTypePtrList & list_anti_Deltas ()
 
static ParticleTypePtrList & list_baryon_resonances ()
 
static ParticleTypePtrList & list_light_nuclei ()
 
static const ParticleTypePtr try_find (PdgCode pdgcode)
 Returns the ParticleTypePtr for the given pdgcode. More...
 
static const ParticleTypefind (PdgCode pdgcode)
 Returns the ParticleType object for the given pdgcode. More...
 
static bool exists (PdgCode pdgcode)
 
static bool exists (const std::string &name)
 
static void create_type_list (const std::string &particles)
 Initialize the global ParticleType list (list_all) from the given input data. More...
 
static void check_consistency ()
 

Static Public Attributes

static constexpr double width_cutoff = 1e-5
 Decay width cutoff for considering a particle as stable. More...
 

Private Attributes

std::string name_
 name of the particle More...
 
double mass_
 pole mass of the particle More...
 
double width_
 width of the particle More...
 
Parity parity_
 Parity of the particle. More...
 
PdgCode pdgcode_
 PDG Code of the particle. More...
 
double min_mass_kinematic_
 minimum kinematically allowed mass of the particle Mutable, because it is initialized at first call of minimum mass function, so it's logically const, but not physically const, which is a classical case for using mutable. More...
 
double min_mass_spectral_
 minimum mass, where the spectral function is non-zero Mutable, because it is initialized at first call of minimum mass function, so it's logically const, but not physically const, which is a classical case for using mutable. More...
 
double norm_factor_ = -1.
 This normalization factor ensures that the spectral function is normalized to unity, when integrated over its full domain. More...
 
int32_t charge_
 Charge of the particle; filled automatically from pdgcode_. More...
 
int isospin_
 Isospin of the particle; filled automatically from pdgcode_. More...
 
int I3_
 Isospin projection of the particle; filled automatically from pdgcode_. More...
 
IsoParticleTypeiso_multiplet_ = nullptr
 Container for the isospin multiplet information. More...
 
double max_factor1_ = 1.
 Maximum factor for single-res mass sampling, cf. sample_resonance_mass. More...
 
double max_factor2_ = 1.
 Maximum factor for double-res mass sampling, cf. sample_resonance_masses. More...
 

Friends

std::ostream & operator<< (std::ostream &out, const ParticleType &type)
 

Constructor & Destructor Documentation

◆ ParticleType() [1/3]

smash::ParticleType::ParticleType ( std::string  n,
double  m,
double  w,
Parity  p,
PdgCode  id 
)

Creates a fully initialized ParticleType object.

Parameters
[in]nThe name of the particle.
[in]mThe mass of the particle.
[in]wThe width of the particle.
[in]pThe parity of the particle.
[in]idThe PDG code of the particle.
Note
The remaining properties ParticleType provides are derived from the PDG code and therefore cannot be set explicitly (this avoids the chance of introducing inconsistencies).

Definition at line 128 of file particletype.cc.

130  : name_(n),
131  mass_(m),
132  width_(w),
133  parity_(p),
134  pdgcode_(id),
135  min_mass_kinematic_(-1.),
136  min_mass_spectral_(-1.),
138  isospin_(-1),
139  I3_(pdgcode_.isospin3()) {}

◆ ParticleType() [2/3]

smash::ParticleType::ParticleType ( const ParticleType )
delete

Copies are not allowed as they break intended use.

Instead use a const-ref or ParticleTypePtr (as returned from operator&).

◆ ParticleType() [3/3]

smash::ParticleType::ParticleType ( ParticleType &&  )
default

move ctors are needed for std::sort

Member Function Documentation

◆ operator=() [1/2]

ParticleType& smash::ParticleType::operator= ( const ParticleType )
delete

assignment is not allowed, see copy constructor above

◆ operator=() [2/2]

ParticleType& smash::ParticleType::operator= ( ParticleType &&  )
default

move ctors are needed for std::sort

◆ decay_modes()

const DecayModes & smash::ParticleType::decay_modes ( ) const
Returns
the DecayModes object for this particle type.

Definition at line 428 of file particletype.cc.

428  {
429  const auto offset = this - std::addressof(list_all()[0]);
430  const auto &modes = (*DecayModes::all_decay_modes)[offset];
431  assert(is_stable() || !modes.is_empty());
432  return modes;
433 }
Here is the call graph for this function:
Here is the caller graph for this function:

◆ name()

const std::string& smash::ParticleType::name ( ) const
inline
Returns
the name of the particle.

Definition at line 141 of file particletype.h.

141 { return name_; }
Here is the caller graph for this function:

◆ mass()

double smash::ParticleType::mass ( ) const
inline
Returns
the particle pole mass.

Definition at line 144 of file particletype.h.

144 { return mass_; }
Here is the caller graph for this function:

◆ mass_sqr()

double smash::ParticleType::mass_sqr ( ) const
inline
Returns
the squared particle mass.

Definition at line 147 of file particletype.h.

147 { return mass_ * mass_; }

◆ width_at_pole()

double smash::ParticleType::width_at_pole ( ) const
inline
Returns
the particle width (at the mass pole).

Definition at line 150 of file particletype.h.

150 { return width_; }
Here is the caller graph for this function:

◆ parity()

Parity smash::ParticleType::parity ( ) const
inline
Returns
the parity of the particle.

Definition at line 153 of file particletype.h.

153 { return parity_; }
Here is the caller graph for this function:

◆ pdgcode()

PdgCode smash::ParticleType::pdgcode ( ) const
inline
Returns
the PDG code of the particle.

Definition at line 156 of file particletype.h.

156 { return pdgcode_; }
Here is the caller graph for this function:

◆ has_antiparticle()

bool smash::ParticleType::has_antiparticle ( ) const
inline

Returns
whether a particle has a distinct antiparticle (or whether it is its own antiparticle).

Definition at line 159 of file particletype.h.

159 { return pdgcode_.has_antiparticle(); }
Here is the call graph for this function:
Here is the caller graph for this function:

◆ get_antiparticle()

ParticleTypePtr smash::ParticleType::get_antiparticle ( ) const
inline
Returns
a pointer to the corresponding antiparticle ParticleType object.

Definition at line 744 of file particletype.h.

744  {
745  assert(has_antiparticle());
746  return &find(pdgcode_.get_antiparticle());
747 }
Here is the call graph for this function:
Here is the caller graph for this function:

◆ antiparticle_sign()

int smash::ParticleType::antiparticle_sign ( ) const
inline

Returns
-1 for antiparticles and +1 for particles.

Definition at line 165 of file particletype.h.

165 { return pdgcode_.antiparticle_sign(); }
Here is the call graph for this function:
Here is the caller graph for this function:

◆ isospin()

int smash::ParticleType::isospin ( ) const

Returns twice the isospin vector length \(I\).

This returns e.g. 1 for nucleons, 2 for pions and 3 for Deltas. It is always positive.

Definition at line 410 of file particletype.cc.

410  {
411  if (isospin_ < 0) {
414  : 0;
415  }
416  return isospin_;
417 }
Here is the call graph for this function:
Here is the caller graph for this function:

◆ isospin3()

int smash::ParticleType::isospin3 ( ) const
inline

Returns
twice the isospin-3 component \(I_3\).

This is calculated from the sum of net_quark_number of up and down.

Definition at line 176 of file particletype.h.

176 { return I3_; }
Here is the caller graph for this function:

◆ isospin3_rel()

double smash::ParticleType::isospin3_rel ( ) const
inline
Returns
the isospin-3 component relative to the total isospin.

Definition at line 179 of file particletype.h.

179  {
180  unsigned int I = isospin();
181  return (I == 0) ? 0 : static_cast<double>(isospin3()) / I;
182  }
Here is the call graph for this function:
Here is the caller graph for this function:

◆ iso_multiplet()

IsoParticleType* smash::ParticleType::iso_multiplet ( ) const
inline
Returns
a pointer to the Isospin-multiplet of this PDG Code.

Definition at line 185 of file particletype.h.

185 { return iso_multiplet_; }
Here is the caller graph for this function:

◆ charge()

int32_t smash::ParticleType::charge ( ) const
inline

The charge of the particle.

The charge is calculated from the quark content (for hadrons) or basically tabulated; currently leptons, neutrinos and the standard model gauge bosons are known; unknown particles return a charge of 0.

Returns
charge of the particle

Definition at line 188 of file particletype.h.

188 { return charge_; }
Here is the caller graph for this function:

◆ spin()

unsigned int smash::ParticleType::spin ( ) const
inline

Todo:
(oliiny): take care of spin for nuclei
Returns
twice the spin of a particle.

The code is good for hadrons, leptons and spin-1-bosons. It returns 2 (meaning spin=1) for the Higgs, though.

Definition at line 191 of file particletype.h.

191 { return pdgcode_.spin(); }
Here is the call graph for this function:
Here is the caller graph for this function:

◆ is_hadron()

bool smash::ParticleType::is_hadron ( ) const
inline

Returns
true if this is a baryon, antibaryon or meson.

Definition at line 194 of file particletype.h.

194 { return pdgcode_.is_hadron(); }
Here is the call graph for this function:
Here is the caller graph for this function:

◆ is_lepton()

bool smash::ParticleType::is_lepton ( ) const
inline

Returns
true if this is a lepton.

Definition at line 197 of file particletype.h.

197 { return pdgcode_.is_lepton(); }
Here is the call graph for this function:

◆ is_baryon()

bool smash::ParticleType::is_baryon ( ) const
inline

Returns
whether this PDG code identifies a baryon.

Definition at line 200 of file particletype.h.

200 { return pdgcode_.is_baryon(); }
Here is the call graph for this function:
Here is the caller graph for this function:

◆ is_meson()

bool smash::ParticleType::is_meson ( ) const
inline

Returns
whether this PDG code identifies a meson.

Definition at line 203 of file particletype.h.

203 { return pdgcode_.is_meson(); }
Here is the call graph for this function:
Here is the caller graph for this function:

◆ baryon_number()

int smash::ParticleType::baryon_number ( ) const
inline

Returns
the baryon number of the particle.

Definition at line 206 of file particletype.h.

206 { return pdgcode_.baryon_number(); }
Here is the call graph for this function:
Here is the caller graph for this function:

◆ strangeness()

int smash::ParticleType::strangeness ( ) const
inline

Returns
the net number of \(\bar s\) quarks.

For particles with one strange quark, -1 is returned.

Definition at line 209 of file particletype.h.

209 { return pdgcode_.strangeness(); }
Here is the call graph for this function:
Here is the caller graph for this function:

◆ is_nucleon()

bool smash::ParticleType::is_nucleon ( ) const
inline

Returns
whether this is a nucleon/anti-nucleon (p, n, -p, -n)

Definition at line 212 of file particletype.h.

212 { return pdgcode_.is_nucleon(); }
Here is the call graph for this function:
Here is the caller graph for this function:

◆ is_Delta()

bool smash::ParticleType::is_Delta ( ) const
inline

Returns
whether this is a Delta(1232) (with anti-delta)

Definition at line 215 of file particletype.h.

215 { return pdgcode_.is_Delta(); }
Here is the call graph for this function:
Here is the caller graph for this function:

◆ is_rho()

bool smash::ParticleType::is_rho ( ) const
inline

Returns
whether this is a rho meson (rho+/rho0/rho-)

Definition at line 218 of file particletype.h.

218 { return pdgcode_.is_rho(); }
Here is the call graph for this function:
Here is the caller graph for this function:

◆ is_Nstar()

bool smash::ParticleType::is_Nstar ( ) const
inline
Returns
Is this a nucleon resonance (N*)?

Definition at line 221 of file particletype.h.

221  {
222  return is_baryon() && isospin() == 1 && !pdgcode_.is_nucleon() &&
223  pdgcode_.strangeness() == 0 && pdgcode_.charmness() == 0;
224  }
Here is the call graph for this function:
Here is the caller graph for this function:

◆ is_Nstar1535()

bool smash::ParticleType::is_Nstar1535 ( ) const
inline

Returns
whether this is a N*(1535) (+/0)

Definition at line 227 of file particletype.h.

227 { return pdgcode_.is_Nstar1535(); }
Here is the call graph for this function:
Here is the caller graph for this function:

◆ is_Deltastar()

bool smash::ParticleType::is_Deltastar ( ) const
inline
Returns
Is this a Delta resonance (Delta*)?

Definition at line 230 of file particletype.h.

230  {
231  return is_baryon() && isospin() == 3 && !pdgcode_.is_Delta() &&
232  pdgcode_.strangeness() == 0 && pdgcode_.charmness() == 0;
233  }
Here is the call graph for this function:
Here is the caller graph for this function:

◆ is_stable()

bool smash::ParticleType::is_stable ( ) const
inline
Returns
whether the particle is stable

Definition at line 236 of file particletype.h.

236 { return width_ < width_cutoff; }
Here is the caller graph for this function:

◆ is_nucleus()

bool smash::ParticleType::is_nucleus ( ) const
inline
Returns
whether the particle is a nucleus

Definition at line 239 of file particletype.h.

239 { return pdgcode_.is_nucleus(); }
Here is the call graph for this function:
Here is the caller graph for this function:

◆ is_deuteron()

bool smash::ParticleType::is_deuteron ( ) const
inline
Returns
whether the particle is an (anti-)deuteron

Definition at line 242 of file particletype.h.

242 { return pdgcode_.is_deuteron(); }
Here is the call graph for this function:
Here is the caller graph for this function:

◆ is_dprime()

bool smash::ParticleType::is_dprime ( ) const
inline
Returns
whether the particle is an artificial d' resonance

Definition at line 245 of file particletype.h.

245  {
246  return is_nucleus() && std::abs(pdgcode_.get_decimal()) == 1000010021;
247  }
Here is the call graph for this function:
Here is the caller graph for this function:

◆ min_mass_kinematic()

double smash::ParticleType::min_mass_kinematic ( ) const

The minimum mass of the resonance that is kinematically allowed.

Calculate the minimum rest energy the resonance must have for any decay channel to be kinematically available. (In other words, find the smallest sum of final-state particle masses.)

Returns
The minimum mass that a particle of this type can assume, where at least one decay is possible.

Definition at line 360 of file particletype.cc.

360  {
361  if (unlikely(min_mass_kinematic_ < 0.)) {
362  /* If the particle is stable, min. mass is just the mass. */
364  /* Otherwise, find the lowest mass value needed in any decay mode */
365  if (!is_stable()) {
366  for (const auto &mode : decay_modes().decay_mode_list()) {
367  min_mass_kinematic_ = std::min(min_mass_kinematic_, mode->threshold());
368  }
369  }
370  }
371  return min_mass_kinematic_;
372 }
Here is the call graph for this function:
Here is the caller graph for this function:

◆ min_mass_spectral()

double smash::ParticleType::min_mass_spectral ( ) const

The minimum mass of the resonance, where the spectral function is non-zero.

Calculate the the smallest mass where the spectral function still has a contribution. This value can be different from min_mass_kinematic, if the spectral function becomes zero at masses higher than min_mass_kinematic, since the width is put to zero due to the width_cutoff.

The distinction between it and min_mass_kinematic() might be necessary in edge cases, where a reaction is very close to the kinematic threshold or for optimizations.

Returns
The minimum mass that a particle of this type can assume, where the spectral function still has a non-zero value.

Definition at line 374 of file particletype.cc.

374  {
375  if (unlikely(min_mass_spectral_ < 0.)) {
376  /* If the particle is stable or it has a non-zero spectral function value at
377  * the minimum mass that is allowed by kinematics, min_mass_spectral is just
378  * the min_mass_kinetic. */
380  /* Otherwise, find the lowest mass value where spectral function has a
381  * non-zero value by bisection.*/
382  if (!is_stable() &&
384  // find a right bound that has non-zero spectral function for bisection
385  const double m_step = 0.01;
386  double right_bound_bis;
387  for (unsigned int i = 0;; i++) {
388  right_bound_bis = min_mass_kinematic() + m_step * i;
389  if (this->spectral_function(right_bound_bis) > really_small) {
390  break;
391  }
392  }
393  // bisection
394  const double precision = 1E-6;
395  double left_bound_bis = right_bound_bis - m_step;
396  while (right_bound_bis - left_bound_bis > precision) {
397  const double mid = (left_bound_bis + right_bound_bis) / 2.0;
398  if (this->spectral_function(mid) > really_small) {
399  right_bound_bis = mid;
400  } else {
401  left_bound_bis = mid;
402  }
403  }
404  min_mass_spectral_ = right_bound_bis;
405  }
406  }
407  return min_mass_spectral_;
408 }
Here is the call graph for this function:
Here is the caller graph for this function:

◆ partial_width()

double smash::ParticleType::partial_width ( const double  m,
const DecayBranch mode 
) const

Get the mass-dependent partial decay width of a particle with mass m in a particular decay mode.

Parameters
[in]mInvariant mass of the decaying particle.
[in]modeDecay mode to consider.
Returns
the partial width of this specific mode for this mass

Definition at line 419 of file particletype.cc.

420  {
421  if (m < mode->threshold()) {
422  return 0.;
423  }
424  double partial_width_at_pole = width_at_pole() * mode->weight();
425  return mode->type().width(mass(), partial_width_at_pole, m);
426 }
Here is the call graph for this function:
Here is the caller graph for this function:

◆ total_width()

double smash::ParticleType::total_width ( const double  m) const

Get the mass-dependent total width of a particle with mass m.

Parameters
[in]mInvariant mass of the decaying particle.
Returns
the total width for all modes for this mass

Definition at line 435 of file particletype.cc.

435  {
436  double w = 0.;
437  if (is_stable()) {
438  return w;
439  }
440  /* Loop over decay modes and sum up all partial widths. */
441  const auto &modes = decay_modes().decay_mode_list();
442  for (unsigned int i = 0; i < modes.size(); i++) {
443  w = w + partial_width(m, modes[i].get());
444  }
445  if (w < width_cutoff) {
446  return 0.;
447  }
448  return w;
449 }
Here is the call graph for this function:
Here is the caller graph for this function:

◆ wanted_decaymode()

bool smash::ParticleType::wanted_decaymode ( const DecayType t,
WhichDecaymodes  wh 
) const

Helper Function that containes the if-statement logic that decides if a decay mode is either a hadronic and dilepton decay mode.

Parameters
[in]ttype of decay.
[in]whenum that decides which decay modes are wanted.
Returns
true if a decay branch is wanted and false if not.

Definition at line 460 of file particletype.cc.

461  {
462  const auto FinalTypes = t.particle_types();
463  switch (wh) {
464  case WhichDecaymodes::All: {
465  return true;
466  }
468  // No dileptons in final state particles for 2 or 3-body decays
469  return (
470  (t.particle_number() == 2 &&
471  !(is_dilepton(FinalTypes[0]->pdgcode(),
472  FinalTypes[1]->pdgcode()))) ||
473  (t.particle_number() == 3 &&
474  !(has_lepton_pair(FinalTypes[0]->pdgcode(), FinalTypes[1]->pdgcode(),
475  FinalTypes[2]->pdgcode()))));
476  }
478  // Lepton pair in final state particles for 2 or 3-body decays
479  return (
480  (t.particle_number() == 2 &&
481  is_dilepton(FinalTypes[0]->pdgcode(), FinalTypes[1]->pdgcode())) ||
482  (t.particle_number() == 3 &&
483  has_lepton_pair(FinalTypes[0]->pdgcode(), FinalTypes[1]->pdgcode(),
484  FinalTypes[2]->pdgcode())));
485  }
486  default:
487  throw std::runtime_error(
488  "Problem in selecting decaymodes in wanted_decaymode()");
489  }
490 }
Here is the call graph for this function:
Here is the caller graph for this function:

◆ get_partial_widths()

DecayBranchList smash::ParticleType::get_partial_widths ( const FourVector  p,
const ThreeVector  x,
WhichDecaymodes  wh 
) const

Get all the mass-dependent partial decay widths of a particle with mass m.

This function needs to know the 4-momentum and the position of the decaying particle to calculate the square root of s of the final state particles and mass

Parameters
[in]p4-momentum of the decaying particle.
[in]xposition of the decaying particle.
[in]whenum that decides which decaymodes are returned.
Returns
a list of process branches, whose weights correspond to the actual partial widths.

Definition at line 492 of file particletype.cc.

494  {
495  const auto &decay_mode_list = decay_modes().decay_mode_list();
496  if (decay_mode_list.size() == 0 ||
497  (wh == WhichDecaymodes::Hadronic && is_stable())) {
498  return {};
499  }
500  /* Determine whether the decay is affected by the potentials. If it's
501  * affected, read the values of the potentials at the position of the
502  * particle */
503  FourVector UB = FourVector();
504  FourVector UI3 = FourVector();
505  if (UB_lat_pointer != nullptr) {
506  UB_lat_pointer->value_at(x, UB);
507  }
508  if (UI3_lat_pointer != nullptr) {
509  UI3_lat_pointer->value_at(x, UI3);
510  }
511  /* Loop over decay modes and calculate all partial widths. */
512  DecayBranchList partial;
513  partial.reserve(decay_mode_list.size());
514  for (unsigned int i = 0; i < decay_mode_list.size(); i++) {
515  /* Calculate the sqare root s of the final state particles. */
516  const auto FinalTypes = decay_mode_list[i]->type().particle_types();
517  double scale_B = 0.0;
518  double scale_I3 = 0.0;
519  if (pot_pointer != nullptr) {
520  scale_B += pot_pointer->force_scale(*this).first;
521  scale_I3 += pot_pointer->force_scale(*this).second * isospin3_rel();
522  for (const auto finaltype : FinalTypes) {
523  scale_B -= pot_pointer->force_scale(*finaltype).first;
524  scale_I3 -= pot_pointer->force_scale(*finaltype).second *
525  finaltype->isospin3_rel();
526  }
527  }
528  double sqrt_s = (p + UB * scale_B + UI3 * scale_I3).abs();
529 
530  const double w = partial_width(sqrt_s, decay_mode_list[i].get());
531  if (w > 0.) {
532  if (wanted_decaymode(decay_mode_list[i]->type(), wh)) {
533  partial.push_back(
534  make_unique<DecayBranch>(decay_mode_list[i]->type(), w));
535  }
536  }
537  }
538  return partial;
539 }
Here is the call graph for this function:
Here is the caller graph for this function:

◆ get_partial_width()

double smash::ParticleType::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 particles.

Parameters
[in]mInvariant mass of the decaying resonance.
[in]t_aType of first daughter particle.
[in]t_bType of second daughter particle.
Returns
the partial width for this mass and this specific decay channel

Definition at line 541 of file particletype.cc.

542  {
543  /* Get all decay modes. */
544  const auto &decaymodes = decay_modes().decay_mode_list();
545 
546  /* Find the right one(s) and add up corresponding widths. */
547  double w = 0.;
548  for (const auto &mode : decaymodes) {
549  double partial_width_at_pole = width_at_pole() * mode->weight();
550  const ParticleTypePtrList l = {&t_a, &t_b};
551  if (mode->type().has_particles(l)) {
552  w += mode->type().width(mass(), partial_width_at_pole, m);
553  }
554  }
555  return w;
556 }
Here is the call graph for this function:
Here is the caller graph for this function:

◆ get_partial_in_width()

double smash::ParticleType::get_partial_in_width ( const double  m,
const ParticleData p_a,
const ParticleData p_b 
) const

Get the mass-dependent partial in-width of a resonance with mass m, decaying into two given daughter particles.

For stable daughter particles, the in-width equals the 'normal' partial decay width (i.e. the 'out-width').

Parameters
[in]mInvariant mass of the decaying resonance.
[in]p_aFirst daughter particle.
[in]p_bSecond daughter particle.
Returns
the partial in-width for this mass and this specific decay channel

Definition at line 558 of file particletype.cc.

560  {
561  /* Get all decay modes. */
562  const auto &decaymodes = decay_modes().decay_mode_list();
563 
564  /* Find the right one(s) and add up corresponding widths. */
565  double w = 0.;
566  for (const auto &mode : decaymodes) {
567  double partial_width_at_pole = width_at_pole() * mode->weight();
568  const ParticleTypePtrList l = {&p_a.type(), &p_b.type()};
569  if (mode->type().has_particles(l)) {
570  w += mode->type().in_width(mass(), partial_width_at_pole, m,
571  p_a.effective_mass(), p_b.effective_mass());
572  }
573  }
574  return w;
575 }
Here is the call graph for this function:
Here is the caller graph for this function:

◆ spectral_function()

double smash::ParticleType::spectral_function ( double  m) const

Full spectral function \( A(m) = \frac{2}{\pi} N \frac{m^2\Gamma(m)}{(m^2-m_0^2)^2+(m\Gamma(m))^2} \) of the resonance (relativistic Breit-Wigner distribution with mass-dependent width, where N is a normalization factor).

Parameters
[in]mActual off-shell mass of the resonance, where the spectral function is to be evaluated.
Returns
the value of the spectral function for this mass
Note
The normalization factor N ensures that the spectral function is normalized to unity.

Definition at line 577 of file particletype.cc.

577  {
578  if (norm_factor_ < 0.) {
579  /* Initialize the normalization factor
580  * by integrating over the unnormalized spectral function. */
581  static /*thread_local (see #3075)*/ Integrator integrate;
582  const double width = width_at_pole();
583  const double m_pole = mass();
584  // We transform the integral using m = m_min + width_pole * tan(x), to
585  // make it definite and to avoid numerical issues.
586  const double x_min = std::atan((min_mass_kinematic() - m_pole) / width);
587  norm_factor_ = 1. / integrate(x_min, M_PI / 2., [&](double x) {
588  const double tanx = std::tan(x);
589  const double m_x = m_pole + width * tanx;
590  const double jacobian = width * (1.0 + tanx * tanx);
591  return spectral_function_no_norm(m_x) * jacobian;
592  });
593  }
595 }
Here is the call graph for this function:
Here is the caller graph for this function:

◆ spectral_function_no_norm()

double smash::ParticleType::spectral_function_no_norm ( double  m) const

Full spectral function without normalization factor.

See also
spectral_function
Parameters
[in]mActual off-shell mass of the resonance, where the spectral function is to be evaluated.
Returns
the value of the non-normalized spectral function for this mass

Definition at line 597 of file particletype.cc.

597  {
598  /* The spectral function is a relativistic Breit-Wigner function
599  * with mass-dependent width. Here: without normalization factor. */
600  const double resonance_width = total_width(m);
601  if (resonance_width < ParticleType::width_cutoff) {
602  return 0.;
603  }
604  return breit_wigner(m, mass(), resonance_width);
605 }
Here is the call graph for this function:
Here is the caller graph for this function:

◆ spectral_function_const_width()

double smash::ParticleType::spectral_function_const_width ( double  m) const
Todo:
unused The spectral function with a constant width (= width at pole).

It is guaranteed to be normalized to 1, when integrated from 0 to inf.

Definition at line 607 of file particletype.cc.

607  {
608  /* The spectral function is a relativistic Breit-Wigner function.
609  * This variant is using a constant width (evaluated at the pole mass). */
610  const double resonance_width = width_at_pole();
611  if (resonance_width < ParticleType::width_cutoff) {
612  return 0.;
613  }
614  return breit_wigner(m, mass(), resonance_width);
615 }
Here is the call graph for this function:

◆ spectral_function_simple()

double smash::ParticleType::spectral_function_simple ( double  m) const

This one is the most simple form of the spectral function, using a Cauchy distribution (non-relativistic Breit-Wigner with constant width).

It can be integrated analytically, and is normalized to 1 when integrated from -inf to inf.

Parameters
[in]mActual off-shell mass of the resonance, where the spectral function is to be evaluated.
Returns
the Cauchy spectral function at mass m

Definition at line 617 of file particletype.cc.

617  {
618  return breit_wigner_nonrel(m, mass(), width_at_pole());
619 }
Here is the call graph for this function:
Here is the caller graph for this function:

◆ sample_resonance_mass()

double smash::ParticleType::sample_resonance_mass ( const double  mass_stable,
const double  cms_energy,
int  L = 0 
) const

Resonance mass sampling for 2-particle final state with one resonance (type given by 'this') and one stable particle.

Parameters
[in]mass_stableMass of the stable particle.
[in]cms_energycenter-of-mass energy of the 2-particle final state.
[in]Lrelative angular momentum of the final-state particles
Returns
The mass of the resonance particle.

Definition at line 622 of file particletype.cc.

624  {
625  /* largest possible mass: Use 'nextafter' to make sure it is not above the
626  * physical limit by numerical error. */
627  const double max_mass = std::nextafter(cms_energy - mass_stable, 0.);
628 
629  // smallest possible mass to find non-zero spectral function contributions
630  const double min_mass = this->min_mass_spectral();
631 
632  // largest possible cm momentum (from smallest mass)
633  const double pcm_max = pCM(cms_energy, mass_stable, min_mass);
634  const double blw_max = pcm_max * blatt_weisskopf_sqr(pcm_max, L);
635  /* The maximum of the spectral-function ratio 'usually' happens at the
636  * largest mass. However, this is not always the case, therefore we need
637  * and additional fudge factor (determined automatically). Additionally,
638  * a heuristic knowledge is used that usually such mass exist that
639  * spectral_function(m) > spectral_function_simple(m). */
640  const double sf_ratio_max =
641  std::max(1., this->spectral_function(max_mass) /
642  this->spectral_function_simple(max_mass));
643 
644  double mass_res, val;
645  // outer loop: repeat if maximum is too small
646  do {
647  const double q_max = sf_ratio_max * this->max_factor1_;
648  const double max = blw_max * q_max; // maximum value for rejection sampling
649  // inner loop: rejection sampling
650  do {
651  // sample mass from a simple Breit-Wigner (aka Cauchy) distribution
652  mass_res = random::cauchy(this->mass(), this->width_at_pole() / 2.,
653  this->min_mass_spectral(), max_mass);
654  // determine cm momentum for this case
655  const double pcm = pCM(cms_energy, mass_stable, mass_res);
656  const double blw = pcm * blatt_weisskopf_sqr(pcm, L);
657  // determine ratio of full to simple spectral function
658  const double q = this->spectral_function(mass_res) /
659  this->spectral_function_simple(mass_res);
660  val = q * blw;
661  } while (val < random::uniform(0., max));
662 
663  // check that we are using the proper maximum value
664  if (val > max) {
665  logg[LResonances].debug(
666  "maximum is being increased in sample_resonance_mass: ",
667  this->max_factor1_, " ", val / max, " ", this->pdgcode(), " ",
668  mass_stable, " ", cms_energy, " ", mass_res);
669  this->max_factor1_ *= val / max;
670  } else {
671  break; // maximum ok, exit loop
672  }
673  } while (true);
674 
675  return mass_res;
676 }
Here is the call graph for this function:
Here is the caller graph for this function:

◆ sample_resonance_masses()

std::pair< double, double > smash::ParticleType::sample_resonance_masses ( const ParticleType t2,
const double  cms_energy,
int  L = 0 
) const

Resonance mass sampling for 2-particle final state with two resonances.

Parameters
[in]t2Type of the second resonance (the first resonance is given by 'this').
[in]cms_energycenter-of-mass energy of the 2-particle final state.
[in]Lrelative angular momentum of the final-state particles
Returns
The masses of the resonance particles.

Definition at line 679 of file particletype.cc.

680  {
681  const ParticleType &t1 = *this;
682  /* Sample resonance mass from the distribution
683  * used for calculating the cross section. */
684  const double max_mass_1 =
685  std::nextafter(cms_energy - t2.min_mass_spectral(), 0.);
686  const double max_mass_2 =
687  std::nextafter(cms_energy - t1.min_mass_spectral(), 0.);
688  // largest possible cm momentum (from smallest mass)
689  const double pcm_max =
690  pCM(cms_energy, t1.min_mass_spectral(), t2.min_mass_spectral());
691  const double blw_max = pcm_max * blatt_weisskopf_sqr(pcm_max, L);
692 
693  double mass_1, mass_2, val;
694  // outer loop: repeat if maximum is too small
695  do {
696  // maximum value for rejection sampling (determined automatically)
697  const double max = blw_max * t1.max_factor2_;
698  // inner loop: rejection sampling
699  do {
700  // sample mass from a simple Breit-Wigner (aka Cauchy) distribution
701  mass_1 = random::cauchy(t1.mass(), t1.width_at_pole() / 2.,
702  t1.min_mass_spectral(), max_mass_1);
703  mass_2 = random::cauchy(t2.mass(), t2.width_at_pole() / 2.,
704  t2.min_mass_spectral(), max_mass_2);
705  // determine cm momentum for this case
706  const double pcm = pCM(cms_energy, mass_1, mass_2);
707  const double blw = pcm * blatt_weisskopf_sqr(pcm, L);
708  // determine ratios of full to simple spectral function
709  const double q1 =
710  t1.spectral_function(mass_1) / t1.spectral_function_simple(mass_1);
711  const double q2 =
712  t2.spectral_function(mass_2) / t2.spectral_function_simple(mass_2);
713  val = q1 * q2 * blw;
714  } while (val < random::uniform(0., max));
715 
716  if (val > max) {
717  logg[LResonances].debug(
718  "maximum is being increased in sample_resonance_masses: ",
719  t1.max_factor2_, " ", val / max, " ", t1.pdgcode(), " ", t2.pdgcode(),
720  " ", cms_energy, " ", mass_1, " ", mass_2);
721  t1.max_factor2_ *= val / max;
722  } else {
723  break; // maximum ok, exit loop
724  }
725  } while (true);
726 
727  return {mass_1, mass_2};
728 }
Here is the call graph for this function:
Here is the caller graph for this function:

◆ dump_width_and_spectral_function()

void smash::ParticleType::dump_width_and_spectral_function ( ) const

Prints out width and spectral function versus mass to the standard output.

This is useful for debugging and analysis.

Exceptions
ifthe particle type is stable

Definition at line 730 of file particletype.cc.

730  {
731  if (is_stable()) {
732  std::stringstream err;
733  err << "Particle " << *this << " is stable, so it makes no"
734  << " sense to print its spectral function, etc.";
735  throw std::runtime_error(err.str());
736  }
737 
738  double rightmost_pole = 0.0;
739  const auto &decaymodes = decay_modes().decay_mode_list();
740  for (const auto &mode : decaymodes) {
741  double pole_mass_sum = 0.0;
742  for (const ParticleTypePtr p : mode->type().particle_types()) {
743  pole_mass_sum += p->mass();
744  }
745  if (pole_mass_sum > rightmost_pole) {
746  rightmost_pole = pole_mass_sum;
747  }
748  }
749 
750  std::cout << "# mass m[GeV], width w(m) [GeV],"
751  << " spectral function(m^2)*m [GeV^-1] of " << *this << std::endl;
752  constexpr double m_step = 0.02;
753  const double m_min = min_mass_spectral();
754  // An empirical value used to stop the printout. Assumes that spectral
755  // function decays at high mass, which is true for all known resonances.
756  constexpr double spectral_function_threshold = 8.e-3;
757  std::cout << std::fixed << std::setprecision(5);
758  for (unsigned int i = 0;; i++) {
759  const double m = m_min + m_step * i;
760  const double w = total_width(m), sf = spectral_function(m);
761  if (m > rightmost_pole * 2 && sf < spectral_function_threshold) {
762  break;
763  }
764  std::cout << m << " " << w << " " << sf << std::endl;
765  }
766 }
Here is the call graph for this function:
Here is the caller graph for this function:

◆ list_all()

const ParticleTypeList & smash::ParticleType::list_all ( )
static
Returns
a list of all ParticleType objects.
Note
This list is currently sorted, but do not rely on it.
It might make sense to inline this function to optimize runtime performance.

Definition at line 57 of file particletype.cc.

57  {
58  assert(all_particle_types);
59  return *all_particle_types;
60 }
Here is the caller graph for this function:

◆ list_nucleons()

ParticleTypePtrList & smash::ParticleType::list_nucleons ( )
static
Returns
a list of all nucleons (i.e. proton and neutron).

Definition at line 75 of file particletype.cc.

75 { return nucleons_list; }
Here is the caller graph for this function:

◆ list_anti_nucleons()

ParticleTypePtrList & smash::ParticleType::list_anti_nucleons ( )
static
Returns
a list of all anti-nucleons (i.e. anti-proton and anti-neutron).

Definition at line 77 of file particletype.cc.

77  {
78  return anti_nucs_list;
79 }
Here is the caller graph for this function:

◆ list_Deltas()

ParticleTypePtrList & smash::ParticleType::list_Deltas ( )
static
Returns
a list of the Delta(1232) baryons (i.e. all four charge states).

Definition at line 81 of file particletype.cc.

81 { return deltas_list; }
Here is the caller graph for this function:

◆ list_anti_Deltas()

ParticleTypePtrList & smash::ParticleType::list_anti_Deltas ( )
static
Returns
a list of the anti-Delta(1232) baryons (i.e. all four charge states).

Definition at line 83 of file particletype.cc.

83  {
84  return anti_deltas_list;
85 }
Here is the caller graph for this function:

◆ list_baryon_resonances()

ParticleTypePtrList & smash::ParticleType::list_baryon_resonances ( )
static
Returns
a list of all baryon resonances, i.e. unstable baryons (not including antibaryons).

Definition at line 87 of file particletype.cc.

87  {
89 }
Here is the caller graph for this function:

◆ list_light_nuclei()

ParticleTypePtrList & smash::ParticleType::list_light_nuclei ( )
static
Returns
a list of all light nuclei from SMASH particle list. Nucleons are not included into light nuclei by convention.

Definition at line 91 of file particletype.cc.

91  {
92  return light_nuclei_list;
93 }
Here is the caller graph for this function:

◆ try_find()

const ParticleTypePtr smash::ParticleType::try_find ( PdgCode  pdgcode)
static

Returns the ParticleTypePtr for the given pdgcode.

If the particle type is not found, an invalid ParticleTypePtr is returned. You can convert a ParticleTypePtr to a bool to check whether it is valid.

Note
The complexity of the search is \(\mathcal O(\log N)\). Therefore, do not use this function except for user input that selects a particle type. All other internal references for a particle type should use ParticleTypePtr instead.
Parameters
[in]pdgcodethe unique pdg code to try to find
Returns
the ParticleTypePtr that corresponds to this pdg code, or an invalid pointer

Definition at line 95 of file particletype.cc.

95  {
96  const auto found = std::lower_bound(
98  [](const ParticleType &l, const PdgCode &r) { return l.pdgcode() < r; });
99  if (found == all_particle_types->end() || found->pdgcode() != pdgcode) {
100  return {}; // The default constructor creates an invalid pointer.
101  }
102  return &*found;
103 }
Here is the call graph for this function:
Here is the caller graph for this function:

◆ find()

const ParticleType & smash::ParticleType::find ( PdgCode  pdgcode)
static

Returns the ParticleType object for the given pdgcode.

If the particle is not found, a PdgNotFoundFailure is thrown.

Note
The complexity of the search is \(\mathcal O(\log N)\). Therefore, do not use this function except for user input that selects a particle type. All other internal references for a particle type should use ParticleTypePtr instead.
Parameters
[in]pdgcodethe unique pdg code to try to find
Returns
the ParticleTypePtr that corresponds to this pdg code
Exceptions
PdgNotFoundFailurepdgcode not found in available particle types

Definition at line 105 of file particletype.cc.

105  {
106  const auto found = ParticleType::try_find(pdgcode);
107  if (!found) {
108  throw PdgNotFoundFailure("PDG code " + pdgcode.string() + " not found!");
109  }
110  return *found;
111 }
Here is the call graph for this function:
Here is the caller graph for this function:

◆ exists() [1/2]

bool smash::ParticleType::exists ( PdgCode  pdgcode)
static
Parameters
[in]pdgcodethe PdgCode to look for
Returns
whether the ParticleType with the given pdgcode exists.
Note
The complexity of the search is \(\mathcal O(\log N)\).

Definition at line 113 of file particletype.cc.

113  {
114  const auto found = ParticleType::try_find(pdgcode);
115  return found;
116 }
Here is the call graph for this function:
Here is the caller graph for this function:

◆ exists() [2/2]

bool smash::ParticleType::exists ( const std::string &  name)
static
Parameters
[in]namethe name to look for
Returns
whether the ParticleType with the given name exists.
Note
The complexity of the search is \(\mathcal O(N)\).

Definition at line 118 of file particletype.cc.

118  {
119  const auto found =
120  std::find_if(all_particle_types->begin(), all_particle_types->end(),
121  [&](const ParticleType &p) { return p.name() == name; });
122  if (found == all_particle_types->end()) {
123  return false;
124  }
125  return true;
126 }
Here is the call graph for this function:

◆ create_type_list()

void smash::ParticleType::create_type_list ( const std::string &  particles)
static

Initialize the global ParticleType list (list_all) from the given input data.

This function must only be called once (will fail on second invocation).

Parameters
[in]particlesA string that contains the definition of ParticleTypes to be created.
Exceptions
LoadFailureif a line in the particle file could not be read, or if there are duplicates in it
runtime_errorif the mass of of nucleons, kaons and deltas are different from the hardcoded masses, or if this function is called more than once

Definition at line 205 of file particletype.cc.

205  { // {{{
206  static ParticleTypeList type_list;
207  type_list.clear(); // in case LoadFailure was thrown and caught and we should
208  // try again
209  for (const Line &line : line_parser(input)) {
210  std::istringstream lineinput(line.text);
211  std::string name;
212  double mass, width;
213  std::string parity_string;
214  std::vector<std::string> pdgcode_strings;
215  // We expect at most 4 PDG codes per multiplet.
216  pdgcode_strings.reserve(4);
217  lineinput >> name >> mass >> width >> parity_string;
218  Parity parity;
219  bool fail = false;
220  if (parity_string == "+") {
222  } else if (parity_string == "-") {
224  } else {
225  fail = true;
226  }
227  if (lineinput.fail() || fail) {
228  throw ParticleType::LoadFailure(build_error_string(
229  "While loading the ParticleType data:\nFailed to convert the input "
230  "string to the expected data types.",
231  line));
232  }
233  // read additional PDG codes (if present)
234  while (!lineinput.eof()) {
235  pdgcode_strings.push_back("");
236  lineinput >> pdgcode_strings.back();
237  if (lineinput.fail()) {
238  throw ParticleType::LoadFailure(build_error_string(
239  "While loading the ParticleType data:\nFailed to convert the input "
240  "string to the expected data types.",
241  line));
242  }
243  }
244  if (pdgcode_strings.size() < 1) {
245  throw ParticleType::LoadFailure(build_error_string(
246  "While loading the ParticleType data:\nFailed to convert the input "
247  "string due to missing PDG code.",
248  line));
249  }
250  std::vector<PdgCode> pdgcode;
251  pdgcode.resize(pdgcode_strings.size());
252  std::transform(pdgcode_strings.begin(), pdgcode_strings.end(),
253  pdgcode.begin(),
254  [](const std::string &s) { return PdgCode(s); });
255  ensure_all_read(lineinput, line);
256 
257  /* Check if nucleon, kaon, and delta masses are
258  * the same as hardcoded ones, if present */
260  throw std::runtime_error(
261  "Nucleon mass in input file different from 0.938");
262  }
263  if (pdgcode[0].is_kaon() && !almost_equal(mass, kaon_mass)) {
264  throw std::runtime_error("Kaon mass in input file different from 0.494");
265  }
266  if (pdgcode[0].is_Delta() && !almost_equal(mass, delta_mass)) {
267  throw std::runtime_error("Delta mass in input file different from 1.232");
268  }
270  throw std::runtime_error("d mass in input file different from 1.8756");
271  }
272 
273  // add all states to type list
274  for (size_t i = 0; i < pdgcode.size(); i++) {
275  std::string full_name = name;
276  if (pdgcode.size() > 1) {
277  // for multiplets: add charge string to name
278  full_name += chargestr(pdgcode[i].charge());
279  }
280  type_list.emplace_back(full_name, mass, width, parity, pdgcode[i]);
281  logg[LParticleType].debug()
282  << "Setting particle type: " << type_list.back();
283  if (pdgcode[i].has_antiparticle()) {
284  /* add corresponding antiparticle */
285  PdgCode anti = pdgcode[i].get_antiparticle();
286  // For bosons the parity does not change, for fermions it gets inverted.
287  const auto anti_parity = (anti.spin() % 2 == 0) ? parity : -parity;
288  full_name = antiname(full_name, pdgcode[i]);
289  type_list.emplace_back(full_name, mass, width, anti_parity, anti);
290  logg[LParticleType].debug()
291  << "Setting antiparticle type: " << type_list.back();
292  }
293  }
294  }
295  type_list.shrink_to_fit();
296 
297  /* Sort the type list by PDG code. */
298  std::sort(type_list.begin(), type_list.end());
299 
300  /* Look for duplicates. */
301  PdgCode prev_pdg = 0;
302  for (const auto &t : type_list) {
303  if (t.pdgcode() == prev_pdg) {
304  throw ParticleType::LoadFailure("Duplicate PdgCode in particles.txt: " +
305  t.pdgcode().string());
306  }
307  prev_pdg = t.pdgcode();
308  }
309 
310  if (all_particle_types != nullptr) {
311  throw std::runtime_error("Error: Type list was already built!");
312  }
313  all_particle_types = &type_list; // note that type_list is a function-local
314  // static and thus will live on until after
315  // main().
316 
317  // create all isospin multiplets
318  for (const auto &t : type_list) {
320  }
321  // link the multiplets to the types
322  for (auto &t : type_list) {
323  t.iso_multiplet_ = IsoParticleType::find(t);
324  }
325 
326  // Create nucleons/anti-nucleons list
327  if (IsoParticleType::exists("N")) {
328  for (const auto state : IsoParticleType::find("N").get_states()) {
329  nucleons_list.push_back(state);
330  anti_nucs_list.push_back(state->get_antiparticle());
331  }
332  }
333 
334  // Create deltas list
335  if (IsoParticleType::exists("Δ")) {
336  for (const auto state : IsoParticleType::find("Δ").get_states()) {
337  deltas_list.push_back(state);
338  anti_deltas_list.push_back(state->get_antiparticle());
339  }
340  }
341 
342  // Create baryon resonances list
343  for (const ParticleType &type_resonance : ParticleType::list_all()) {
344  /* Only loop over baryon resonances. */
345  if (type_resonance.is_stable() ||
346  type_resonance.pdgcode().baryon_number() != 1) {
347  continue;
348  }
349  baryon_resonances_list.push_back(&type_resonance);
350  baryon_resonances_list.push_back(type_resonance.get_antiparticle());
351  }
352 
353  for (const ParticleType &type : ParticleType::list_all()) {
354  if (type.is_nucleus()) {
355  light_nuclei_list.push_back(&type);
356  }
357  }
358 } /*}}}*/
Here is the call graph for this function:
Here is the caller graph for this function:

◆ operator==()

bool smash::ParticleType::operator== ( const ParticleType rhs) const
inline
Parameters
[in]rhsanother ParticleType to compare to
Returns
whether the two ParticleType objects have the same PDG code.

Definition at line 528 of file particletype.h.

528  {
529  return pdgcode() == rhs.pdgcode();
530  }
Here is the call graph for this function:

◆ operator!=()

bool smash::ParticleType::operator!= ( const ParticleType rhs) const
inline
Parameters
[in]rhsanother ParticleType to compare to
Returns
whether the two ParticleType objects have different PDG codes.

Definition at line 535 of file particletype.h.

535  {
536  return pdgcode() != rhs.pdgcode();
537  }
Here is the call graph for this function:

◆ operator<()

bool smash::ParticleType::operator< ( const ParticleType rhs) const
inline

"Less than" operator for sorting the ParticleType list (by PDG code)

Parameters
[in]rhsanother ParticleType to compare to
Returns
whether the PDG code of rhs is larger than the one from *this

Definition at line 544 of file particletype.h.

544  {
545  return pdgcode() < rhs.pdgcode();
546  }
Here is the call graph for this function:

◆ check_consistency()

void smash::ParticleType::check_consistency ( )
static
Exceptions
runtime_errorif unstable particles have no decay modes

Note that the particles and decay modes have to be initialized, otherwise calling this is undefined behavior.

Definition at line 451 of file particletype.cc.

451  {
452  for (const ParticleType &ptype : ParticleType::list_all()) {
453  if (!ptype.is_stable() && ptype.decay_modes().is_empty()) {
454  throw std::runtime_error("Unstable particle " + ptype.name() +
455  " has no decay chanels!");
456  }
457  }
458 }
Here is the call graph for this function:
Here is the caller graph for this function:

◆ operator&()

ParticleTypePtr smash::ParticleType::operator& ( ) const

Returns an object that acts like a pointer, except that it requires only 2 bytes and inhibits pointer arithmetics.

This is an optimization for creating references to ParticleType objects. With a normal pointer you would require the original object to stay in its place in memory, as otherwise the pointer would dangle. The ParticleTypePtr does not have this problem as it only stores the index of the ParticleType in the global vector of ParticleType objects.

In addition to returning a more efficient reference type, the overload of operator& effectively inhibits passing ParticleType objects by pointer. This is an intended restriction since ParticleType objects should only be passed by const-ref. (You can now pass by ParticleTypePtr instead, but please prefer not to. It might be useful when you want to store a reference inside the function anyway, but that can just as well be done with a const-ref parameter. A ParticleTypePtr can be invalid, a const-ref is always a valid reference semantically.)

Pre-condition:
The operator expects that the ParticleType object is stored in the vector returned by ParticleType::list_all. Therefore, never create new ParticleType objects (that includes copies and moves)!
Note on distributed execution:
At some point we might want to have several copies of the ParticleType vector - on different machines or NUMA nodes. In that case ParticleType::list_all will return the local vector. This operator will continue to work as expected as long as the ParticleType object is an entry of this local vector. The ParticleTypePtr can then be used to communicate a ParticleType over node / NUMA boundaries (an actual pointer would not work, though).
Note
It might make sense to inline this function to optimize runtime performance.
Returns
A pointer-like object referencing this ParticleType object.
See also
ParticleTypePtr

Definition at line 63 of file particletype.cc.

63  {
64  // Calculate the offset via pointer subtraction:
65  const auto offset = this - std::addressof(list_all()[0]);
66  // Since we're using uint16_t for storing the index better be safe than sorry:
67  // The offset must fit into the data type. If this ever fails we got a lot
68  // more particle types than initially expected and you have to increase the
69  // ParticleTypePtr storage to uint32_t.
70  assert(offset >= 0 && offset < 0xffff);
71  // After the assertion above the down-cast to uint16_t is safe:
72  return ParticleTypePtr(static_cast<uint16_t>(offset));
73 }
Here is the call graph for this function:

Member Data Documentation

◆ width_cutoff

constexpr double smash::ParticleType::width_cutoff = 1e-5
staticconstexpr

Decay width cutoff for considering a particle as stable.

We currently regard a particle type as stable if its on-shell width is less than 10 keV. The cutoff is chosen such that the η and the η' are stable.

Definition at line 107 of file particletype.h.

◆ name_

std::string smash::ParticleType::name_
private

name of the particle

Definition at line 606 of file particletype.h.

◆ mass_

double smash::ParticleType::mass_
private

pole mass of the particle

Definition at line 608 of file particletype.h.

◆ width_

double smash::ParticleType::width_
private

width of the particle

Definition at line 610 of file particletype.h.

◆ parity_

Parity smash::ParticleType::parity_
private

Parity of the particle.

Definition at line 612 of file particletype.h.

◆ pdgcode_

PdgCode smash::ParticleType::pdgcode_
private

PDG Code of the particle.

Definition at line 614 of file particletype.h.

◆ min_mass_kinematic_

double smash::ParticleType::min_mass_kinematic_
mutableprivate

minimum kinematically allowed mass of the particle Mutable, because it is initialized at first call of minimum mass function, so it's logically const, but not physically const, which is a classical case for using mutable.

Definition at line 621 of file particletype.h.

◆ min_mass_spectral_

double smash::ParticleType::min_mass_spectral_
mutableprivate

minimum mass, where the spectral function is non-zero Mutable, because it is initialized at first call of minimum mass function, so it's logically const, but not physically const, which is a classical case for using mutable.

Definition at line 628 of file particletype.h.

◆ norm_factor_

double smash::ParticleType::norm_factor_ = -1.
mutableprivate

This normalization factor ensures that the spectral function is normalized to unity, when integrated over its full domain.

Definition at line 631 of file particletype.h.

◆ charge_

int32_t smash::ParticleType::charge_
private

Charge of the particle; filled automatically from pdgcode_.

Definition at line 633 of file particletype.h.

◆ isospin_

int smash::ParticleType::isospin_
mutableprivate

Isospin of the particle; filled automatically from pdgcode_.

Definition at line 635 of file particletype.h.

◆ I3_

int smash::ParticleType::I3_
private

Isospin projection of the particle; filled automatically from pdgcode_.

Definition at line 637 of file particletype.h.

◆ iso_multiplet_

IsoParticleType* smash::ParticleType::iso_multiplet_ = nullptr
private

Container for the isospin multiplet information.

Definition at line 640 of file particletype.h.

◆ max_factor1_

double smash::ParticleType::max_factor1_ = 1.
mutableprivate

Maximum factor for single-res mass sampling, cf. sample_resonance_mass.

Definition at line 643 of file particletype.h.

◆ max_factor2_

double smash::ParticleType::max_factor2_ = 1.
mutableprivate

Maximum factor for double-res mass sampling, cf. sample_resonance_masses.

Definition at line 645 of file particletype.h.


The documentation for this class was generated from the following files:
smash::breit_wigner
double breit_wigner(double m, double pole, double width)
Returns a relativistic Breit-Wigner distribution.
Definition: distributions.cc:24
smash::line_parser
build_vector_< Line > line_parser(const std::string &input)
Helper function for parsing particles.txt and decaymodes.txt.
Definition: inputfunctions.cc:21
smash::PdgCode::get_antiparticle
PdgCode get_antiparticle() const
Construct the antiparticle to a given PDG code.
Definition: pdgcode.h:257
smash::ParticleType::spectral_function_no_norm
double spectral_function_no_norm(double m) const
Full spectral function without normalization factor.
Definition: particletype.cc:597
smash::random::cauchy
T cauchy(T pole, T width, T min, T max)
Draws a random number from a Cauchy distribution (sometimes also called Lorentz or non-relativistic B...
Definition: random.h:307
smash::IsoParticleType::isospin
int isospin() const
Returns twice the total isospin of the multiplet.
Definition: isoparticletype.h:74
smash::ParticleType::width_
double width_
width of the particle
Definition: particletype.h:610
smash::IsoParticleType::find
static const IsoParticleType & find(const std::string &name)
Returns the IsoParticleType object for the given name.
Definition: isoparticletype.cc:62
smash::ParticleType::width_at_pole
double width_at_pole() const
Definition: particletype.h:150
smash::ParticleType::min_mass_spectral
double min_mass_spectral() const
The minimum mass of the resonance, where the spectral function is non-zero.
Definition: particletype.cc:374
smash::ParticleType::wanted_decaymode
bool wanted_decaymode(const DecayType &t, WhichDecaymodes wh) const
Helper Function that containes the if-statement logic that decides if a decay mode is either a hadron...
Definition: particletype.cc:460
smash::build_error_string
std::string build_error_string(std::string message, const Line &line)
Builds a meaningful error message.
Definition: inputfunctions.h:42
smash::anonymous_namespace{particletype.cc}::anti_deltas_list
ParticleTypePtrList anti_deltas_list
Global pointer to the Particle Type list of anti-deltas.
Definition: particletype.cc:50
smash::PdgCode::baryon_number
int baryon_number() const
Definition: pdgcode.h:305
smash::PdgCode::is_nucleon
bool is_nucleon() const
Definition: pdgcode.h:321
smash::DecayModes::decay_mode_list
const DecayBranchList & decay_mode_list() const
Definition: decaymodes.h:63
smash::ensure_all_read
void ensure_all_read(std::istream &input, const Line &line)
Makes sure that nothing is left to read from this line.
Definition: inputfunctions.h:59
smash::Potentials::force_scale
static std::pair< double, int > force_scale(const ParticleType &data)
Evaluates the scaling factor of the forces acting on the particles.
Definition: potentials.cc:164
smash::PdgCode::is_hadron
bool is_hadron() const
Definition: pdgcode.h:294
smash::ParticleType::charge_
int32_t charge_
Charge of the particle; filled automatically from pdgcode_.
Definition: particletype.h:633
smash::PdgCode::spin
unsigned int spin() const
Definition: pdgcode.h:506
smash::PdgCode::is_Delta
bool is_Delta() const
Definition: pdgcode.h:333
unlikely
#define unlikely(x)
Tell the branch predictor that this expression is likely false.
Definition: macros.h:16
smash::WhichDecaymodes::All
All decay mode widths.
smash::anonymous_namespace{particletype.cc}::deltas_list
ParticleTypePtrList deltas_list
Global pointer to the Particle Type list of deltas.
Definition: particletype.cc:48
smash::anonymous_namespace{particletype.cc}::all_particle_types
const ParticleTypeList * all_particle_types
Global pointer to the Particle Type list.
Definition: particletype.cc:42
smash::PdgCode::antiparticle_sign
int antiparticle_sign() const
Definition: pdgcode.h:534
smash::PdgCode::is_lepton
bool is_lepton() const
Definition: pdgcode.h:299
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::PdgCode::is_nucleus
bool is_nucleus() const
Definition: pdgcode.h:288
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:577
smash::ParticleType::is_Delta
bool is_Delta() const
Definition: particletype.h:215
smash::ParticleType::isospin_
int isospin_
Isospin of the particle; filled automatically from pdgcode_.
Definition: particletype.h:635
smash::nucleon_mass
constexpr double nucleon_mass
Nucleon mass in GeV.
Definition: constants.h:55
smash::ParticleType::pdgcode
PdgCode pdgcode() const
Definition: particletype.h:156
smash::ParticleType::name_
std::string name_
name of the particle
Definition: particletype.h:606
smash::PdgCode::is_rho
bool is_rho() const
Definition: pdgcode.h:375
smash::ParticleType::min_mass_kinematic_
double min_mass_kinematic_
minimum kinematically allowed mass of the particle Mutable, because it is initialized at first call o...
Definition: particletype.h:621
smash::logg
std::array< einhard::Logger<>, std::tuple_size< LogArea::AreaTuple >::value > logg
An array that stores all pre-configured Logger objects.
Definition: logging.cc:39
smash::ParticleType::is_baryon
bool is_baryon() const
Definition: particletype.h:200
smash::LResonances
static constexpr int LResonances
Definition: clebschgordan.cc:16
smash::pCM
T pCM(const T sqrts, const T mass_a, const T mass_b) noexcept
Definition: kinematics.h:79
smash::ParticleType::total_width
double total_width(const double m) const
Get the mass-dependent total width of a particle with mass m.
Definition: particletype.cc:435
smash::really_small
constexpr double really_small
Numerical error tolerance.
Definition: constants.h:37
smash::ParticleType::find
static const ParticleType & find(PdgCode pdgcode)
Returns the ParticleType object for the given pdgcode.
Definition: particletype.cc:105
smash::PdgCode::get_decimal
int32_t get_decimal() const
Definition: pdgcode.h:651
smash::ParticleType::has_antiparticle
bool has_antiparticle() const
Definition: particletype.h:159
smash::PdgCode::isospin3
int isospin3() const
Definition: pdgcode.h:406
smash::ParticleType::decay_modes
const DecayModes & decay_modes() const
Definition: particletype.cc:428
smash::UI3_lat_pointer
RectangularLattice< FourVector > * UI3_lat_pointer
Pointer to the symmmetry potential on the lattice.
Definition: potential_globals.cc:16
smash::PdgCode::string
std::string string() const
Definition: pdgcode.h:250
smash::ParticleType::norm_factor_
double norm_factor_
This normalization factor ensures that the spectral function is normalized to unity,...
Definition: particletype.h:631
smash::ParticleType::iso_multiplet_
IsoParticleType * iso_multiplet_
Container for the isospin multiplet information.
Definition: particletype.h:640
smash::integrate
static Integrator integrate
Definition: decaytype.cc:147
smash::LParticleType
static constexpr int LParticleType
Definition: isoparticletype.cc:19
smash::ParticleType::isospin
int isospin() const
Returns twice the isospin vector length .
Definition: particletype.cc:410
smash::ParticleType::I3_
int I3_
Isospin projection of the particle; filled automatically from pdgcode_.
Definition: particletype.h:637
smash::WhichDecaymodes::Hadronic
Ignore dilepton decay modes widths.
smash::PdgCode::charge
int charge() const
The charge of the particle.
Definition: pdgcode.h:467
smash::ParticleType::is_nucleus
bool is_nucleus() const
Definition: particletype.h:239
smash::ParticleType::is_deuteron
bool is_deuteron() const
Definition: particletype.h:242
smash::UB_lat_pointer
RectangularLattice< FourVector > * UB_lat_pointer
Pointer to the skyrme potential on the lattice.
Definition: potential_globals.cc:15
smash::ParticleType::is_stable
bool is_stable() const
Definition: particletype.h:236
smash::IsoParticleType::exists
static bool exists(const std::string &name)
Returns whether the ParticleType with the given pdgcode exists.
Definition: isoparticletype.cc:79
smash::breit_wigner_nonrel
double breit_wigner_nonrel(double m, double pole, double width)
Returns a non-relativistic Breit-Wigner distribution, which is essentially a Cauchy distribution with...
Definition: distributions.cc:31
smash::anonymous_namespace{particletype.cc}::nucleons_list
ParticleTypePtrList nucleons_list
Global pointer to the Particle Type list of nucleons.
Definition: particletype.cc:44
smash::ParticleType::isospin3_rel
double isospin3_rel() const
Definition: particletype.h:179
smash::ParticleType::spectral_function_simple
double spectral_function_simple(double m) const
This one is the most simple form of the spectral function, using a Cauchy distribution (non-relativis...
Definition: particletype.cc:617
smash::ParticleType::name
const std::string & name() const
Definition: particletype.h:141
smash::almost_equal
bool almost_equal(const N x, const N y)
Checks two numbers for relative approximate equality.
Definition: numerics.h:42
smash::anonymous_namespace{particletype.cc}::baryon_resonances_list
ParticleTypePtrList baryon_resonances_list
Global pointer to the Particle Type list of baryon resonances.
Definition: particletype.cc:52
smash::anonymous_namespace{particletype.cc}::light_nuclei_list
ParticleTypePtrList light_nuclei_list
Global pointer to the Particle Type list of light nuclei.
Definition: particletype.cc:54
smash::ParticleType::pdgcode_
PdgCode pdgcode_
PDG Code of the particle.
Definition: particletype.h:614
smash::ParticleType::try_find
static const ParticleTypePtr try_find(PdgCode pdgcode)
Returns the ParticleTypePtr for the given pdgcode.
Definition: particletype.cc:95
smash::ParticleType::ParticleType
ParticleType(std::string n, double m, double w, Parity p, PdgCode id)
Creates a fully initialized ParticleType object.
Definition: particletype.cc:128
smash::ParticleType::parity_
Parity parity_
Parity of the particle.
Definition: particletype.h:612
smash::chargestr
static std::string chargestr(int charge)
Construct a charge string, given the charge as integer.
Definition: particletype.cc:188
smash::antiname
static std::string antiname(const std::string &name, PdgCode code)
Construct an antiparticle name-string from the given name-string for the particle and its PDG code.
Definition: particletype.cc:149
smash::ParticleType::isospin3
int isospin3() const
Definition: particletype.h:176
smash::Parity::Pos
Positive parity.
smash::PdgCode::charmness
int charmness() const
Definition: pdgcode.h:450
smash::ParticleType::partial_width
double partial_width(const double m, const DecayBranch *mode) const
Get the mass-dependent partial decay width of a particle with mass m in a particular decay mode.
Definition: particletype.cc:419
smash::PdgCode::strangeness
int strangeness() const
Definition: pdgcode.h:443
smash::PdgCode::is_deuteron
bool is_deuteron() const
Definition: pdgcode.h:381
smash::has_lepton_pair
bool has_lepton_pair(const PdgCode pdg1, const PdgCode pdg2, const PdgCode pdg3)
Definition: pdgcode.h:992
smash::ParticleType::min_mass_spectral_
double min_mass_spectral_
minimum mass, where the spectral function is non-zero Mutable, because it is initialized at first cal...
Definition: particletype.h:628
smash::delta_mass
constexpr double delta_mass
Delta mass in GeV.
Definition: constants.h:89
smash::ParticleType::max_factor1_
double max_factor1_
Maximum factor for single-res mass sampling, cf. sample_resonance_mass.
Definition: particletype.h:643
smash::Parity
Parity
Represent the parity of a particle type.
Definition: particletype.h:24
smash::pdg::p
constexpr int p
Proton.
Definition: pdgcode_constants.h:28
smash::PdgCode::is_baryon
bool is_baryon() const
Definition: pdgcode.h:315
smash::PdgCode::has_antiparticle
bool has_antiparticle() const
Definition: pdgcode.h:390
smash::random::uniform
T uniform(T min, T max)
Definition: random.h:88
smash::pdg::n
constexpr int n
Neutron.
Definition: pdgcode_constants.h:30
smash::ParticleType::min_mass_kinematic
double min_mass_kinematic() const
The minimum mass of the resonance that is kinematically allowed.
Definition: particletype.cc:360
smash::pot_pointer
Potentials * pot_pointer
Pointer to a Potential class.
Definition: potential_globals.cc:17
smash::ParticleType::mass_
double mass_
pole mass of the particle
Definition: particletype.h:608
smash::deuteron_mass
constexpr double deuteron_mass
Deuteron mass in GeV.
Definition: constants.h:95
smash::WhichDecaymodes::Dileptons
Only return dilepton decays widths.
smash::kaon_mass
constexpr double kaon_mass
Kaon mass in GeV.
Definition: constants.h:69
smash::anonymous_namespace{particletype.cc}::anti_nucs_list
ParticleTypePtrList anti_nucs_list
Global pointer to the Particle Type list of anti-nucleons.
Definition: particletype.cc:46
smash::Parity::Neg
Negative parity.
smash::is_dilepton
bool is_dilepton(const PdgCode pdg1, const PdgCode pdg2)
Definition: pdgcode.h:980
smash::PdgCode::is_Nstar1535
bool is_Nstar1535() const
Definition: pdgcode.h:327
smash::IsoParticleType::get_states
ParticleTypePtrList get_states() const
Returns list of states that form part of the multiplet.
Definition: isoparticletype.h:93
smash::ParticleType::width_cutoff
static constexpr double width_cutoff
Decay width cutoff for considering a particle as stable.
Definition: particletype.h:107
smash::ParticleType::list_all
static const ParticleTypeList & list_all()
Definition: particletype.cc:57
smash::IsoParticleType::create_multiplet
static void create_multiplet(const ParticleType &type)
Add a new multiplet to the global list of IsoParticleTypes, which contains type.
Definition: isoparticletype.cc:161
smash::ParticleType::charge
int32_t charge() const
The charge of the particle.
Definition: particletype.h:188
smash::PdgCode::is_meson
bool is_meson() const
Definition: pdgcode.h:318
smash::ParticleType::parity
Parity parity() const
Definition: particletype.h:153
smash::ParticleType::is_nucleon
bool is_nucleon() const
Definition: particletype.h:212