Version: SMASH-2.0
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
 
unsigned int spin_degeneracy () 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 ParticleTypePtrList dlist) 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 122 of file particletype.cc.

124  : name_(n),
125  mass_(m),
126  width_(w),
127  parity_(p),
128  pdgcode_(id),
129  min_mass_kinematic_(-1.),
130  min_mass_spectral_(-1.),
132  isospin_(-1),
133  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 422 of file particletype.cc.

422  {
423  const auto offset = this - std::addressof(list_all()[0]);
424  const auto &modes = (*DecayModes::all_decay_modes)[offset];
425  assert(is_stable() || !modes.is_empty());
426  return modes;
427 }
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 746 of file particletype.h.

746  {
747  assert(has_antiparticle());
748  return &find(pdgcode_.get_antiparticle());
749 }
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 404 of file particletype.cc.

404  {
405  if (isospin_ < 0) {
408  : 0;
409  }
410  return isospin_;
411 }
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:

◆ spin_degeneracy()

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

Returns
the spin degeneracy \(2s + 1\) of a particle.

Definition at line 194 of file particletype.h.

194 { return pdgcode_.spin_degeneracy(); }
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 197 of file particletype.h.

197 { 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 200 of file particletype.h.

200 { 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 203 of file particletype.h.

203 { 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 206 of file particletype.h.

206 { 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 209 of file particletype.h.

209 { 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 212 of file particletype.h.

212 { 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 215 of file particletype.h.

215 { 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 218 of file particletype.h.

218 { 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 221 of file particletype.h.

221 { 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 224 of file particletype.h.

224  {
225  return is_baryon() && isospin() == 1 && !pdgcode_.is_nucleon() &&
226  pdgcode_.strangeness() == 0 && pdgcode_.charmness() == 0;
227  }
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 230 of file particletype.h.

230 { 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 233 of file particletype.h.

233  {
234  return is_baryon() && isospin() == 3 && !pdgcode_.is_Delta() &&
235  pdgcode_.strangeness() == 0 && pdgcode_.charmness() == 0;
236  }
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 239 of file particletype.h.

239 { 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 242 of file particletype.h.

242 { 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 245 of file particletype.h.

245 { 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 248 of file particletype.h.

248  {
249  return is_nucleus() && std::abs(pdgcode_.get_decimal()) == 1000010021;
250  }
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 354 of file particletype.cc.

354  {
355  if (unlikely(min_mass_kinematic_ < 0.)) {
356  /* If the particle is stable, min. mass is just the mass. */
358  /* Otherwise, find the lowest mass value needed in any decay mode */
359  if (!is_stable()) {
360  for (const auto &mode : decay_modes().decay_mode_list()) {
361  min_mass_kinematic_ = std::min(min_mass_kinematic_, mode->threshold());
362  }
363  }
364  }
365  return min_mass_kinematic_;
366 }
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 368 of file particletype.cc.

368  {
369  if (unlikely(min_mass_spectral_ < 0.)) {
370  /* If the particle is stable or it has a non-zero spectral function value at
371  * the minimum mass that is allowed by kinematics, min_mass_spectral is just
372  * the min_mass_kinetic. */
374  /* Otherwise, find the lowest mass value where spectral function has a
375  * non-zero value by bisection.*/
376  if (!is_stable() &&
378  // find a right bound that has non-zero spectral function for bisection
379  const double m_step = 0.01;
380  double right_bound_bis;
381  for (unsigned int i = 0;; i++) {
382  right_bound_bis = min_mass_kinematic() + m_step * i;
383  if (this->spectral_function(right_bound_bis) > really_small) {
384  break;
385  }
386  }
387  // bisection
388  const double precision = 1E-6;
389  double left_bound_bis = right_bound_bis - m_step;
390  while (right_bound_bis - left_bound_bis > precision) {
391  const double mid = (left_bound_bis + right_bound_bis) / 2.0;
392  if (this->spectral_function(mid) > really_small) {
393  right_bound_bis = mid;
394  } else {
395  left_bound_bis = mid;
396  }
397  }
398  min_mass_spectral_ = right_bound_bis;
399  }
400  }
401  return min_mass_spectral_;
402 }
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 413 of file particletype.cc.

414  {
415  if (m < mode->threshold()) {
416  return 0.;
417  }
418  double partial_width_at_pole = width_at_pole() * mode->weight();
419  return mode->type().width(mass(), partial_width_at_pole, m);
420 }
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 429 of file particletype.cc.

429  {
430  double w = 0.;
431  if (is_stable()) {
432  return w;
433  }
434  /* Loop over decay modes and sum up all partial widths. */
435  const auto &modes = decay_modes().decay_mode_list();
436  for (unsigned int i = 0; i < modes.size(); i++) {
437  w = w + partial_width(m, modes[i].get());
438  }
439  if (w < width_cutoff) {
440  return 0.;
441  }
442  return w;
443 }
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 454 of file particletype.cc.

455  {
456  const auto FinalTypes = t.particle_types();
457  switch (wh) {
458  case WhichDecaymodes::All: {
459  return true;
460  }
462  // No dileptons in final state particles for 2 or 3-body decays
463  return (
464  (t.particle_number() == 2 &&
465  !(is_dilepton(FinalTypes[0]->pdgcode(),
466  FinalTypes[1]->pdgcode()))) ||
467  (t.particle_number() == 3 &&
468  !(has_lepton_pair(FinalTypes[0]->pdgcode(), FinalTypes[1]->pdgcode(),
469  FinalTypes[2]->pdgcode()))));
470  }
472  // Lepton pair in final state particles for 2 or 3-body decays
473  return (
474  (t.particle_number() == 2 &&
475  is_dilepton(FinalTypes[0]->pdgcode(), FinalTypes[1]->pdgcode())) ||
476  (t.particle_number() == 3 &&
477  has_lepton_pair(FinalTypes[0]->pdgcode(), FinalTypes[1]->pdgcode(),
478  FinalTypes[2]->pdgcode())));
479  }
480  default:
481  throw std::runtime_error(
482  "Problem in selecting decaymodes in wanted_decaymode()");
483  }
484 }
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 486 of file particletype.cc.

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

Definition at line 535 of file particletype.cc.

536  {
537  /* Get all decay modes. */
538  const auto &decaymodes = decay_modes().decay_mode_list();
539 
540  /* Find the right one(s) and add up corresponding widths. */
541  double w = 0.;
542  for (const auto &mode : decaymodes) {
543  double partial_width_at_pole = width_at_pole() * mode->weight();
544  if (mode->type().has_particles(dlist)) {
545  w += mode->type().width(mass(), partial_width_at_pole, m);
546  }
547  }
548  return w;
549 }
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 551 of file particletype.cc.

553  {
554  /* Get all decay modes. */
555  const auto &decaymodes = decay_modes().decay_mode_list();
556 
557  /* Find the right one(s) and add up corresponding widths. */
558  double w = 0.;
559  for (const auto &mode : decaymodes) {
560  double partial_width_at_pole = width_at_pole() * mode->weight();
561  const ParticleTypePtrList l = {&p_a.type(), &p_b.type()};
562  if (mode->type().has_particles(l)) {
563  w += mode->type().in_width(mass(), partial_width_at_pole, m,
564  p_a.effective_mass(), p_b.effective_mass());
565  }
566  }
567  return w;
568 }
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 570 of file particletype.cc.

570  {
571  if (norm_factor_ < 0.) {
572  /* Initialize the normalization factor
573  * by integrating over the unnormalized spectral function. */
574  static /*thread_local (see #3075)*/ Integrator integrate;
575  const double width = width_at_pole();
576  const double m_pole = mass();
577  // We transform the integral using m = m_min + width_pole * tan(x), to
578  // make it definite and to avoid numerical issues.
579  const double x_min = std::atan((min_mass_kinematic() - m_pole) / width);
580  norm_factor_ = 1. / integrate(x_min, M_PI / 2., [&](double x) {
581  const double tanx = std::tan(x);
582  const double m_x = m_pole + width * tanx;
583  const double jacobian = width * (1.0 + tanx * tanx);
584  return spectral_function_no_norm(m_x) * jacobian;
585  });
586  }
588 }
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 590 of file particletype.cc.

590  {
591  /* The spectral function is a relativistic Breit-Wigner function
592  * with mass-dependent width. Here: without normalization factor. */
593  const double resonance_width = total_width(m);
594  if (resonance_width < ParticleType::width_cutoff) {
595  return 0.;
596  }
597  return breit_wigner(m, mass(), resonance_width);
598 }
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 600 of file particletype.cc.

600  {
601  /* The spectral function is a relativistic Breit-Wigner function.
602  * This variant is using a constant width (evaluated at the pole mass). */
603  const double resonance_width = width_at_pole();
604  if (resonance_width < ParticleType::width_cutoff) {
605  return 0.;
606  }
607  return breit_wigner(m, mass(), resonance_width);
608 }
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 610 of file particletype.cc.

610  {
611  return breit_wigner_nonrel(m, mass(), width_at_pole());
612 }
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 615 of file particletype.cc.

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

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

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

51  {
52  assert(all_particle_types);
53  return *all_particle_types;
54 }
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 69 of file particletype.cc.

69 { 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 71 of file particletype.cc.

71  {
72  return anti_nucs_list;
73 }
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 75 of file particletype.cc.

75 { 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 77 of file particletype.cc.

77  {
78  return anti_deltas_list;
79 }
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 81 of file particletype.cc.

81  {
83 }
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 85 of file particletype.cc.

85  {
86  return light_nuclei_list;
87 }
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 89 of file particletype.cc.

89  {
90  const auto found = std::lower_bound(
92  [](const ParticleType &l, const PdgCode &r) { return l.pdgcode() < r; });
93  if (found == all_particle_types->end() || found->pdgcode() != pdgcode) {
94  return {}; // The default constructor creates an invalid pointer.
95  }
96  return &*found;
97 }
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 99 of file particletype.cc.

99  {
100  const auto found = ParticleType::try_find(pdgcode);
101  if (!found) {
102  throw PdgNotFoundFailure("PDG code " + pdgcode.string() + " not found!");
103  }
104  return *found;
105 }
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 107 of file particletype.cc.

107  {
108  const auto found = ParticleType::try_find(pdgcode);
109  return found;
110 }
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 112 of file particletype.cc.

112  {
113  const auto found =
114  std::find_if(all_particle_types->begin(), all_particle_types->end(),
115  [&](const ParticleType &p) { return p.name() == name; });
116  if (found == all_particle_types->end()) {
117  return false;
118  }
119  return true;
120 }
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 199 of file particletype.cc.

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

530  {
531  return pdgcode() == rhs.pdgcode();
532  }
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 537 of file particletype.h.

537  {
538  return pdgcode() != rhs.pdgcode();
539  }
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 546 of file particletype.h.

546  {
547  return pdgcode() < rhs.pdgcode();
548  }
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 445 of file particletype.cc.

445  {
446  for (const ParticleType &ptype : ParticleType::list_all()) {
447  if (!ptype.is_stable() && ptype.decay_modes().is_empty()) {
448  throw std::runtime_error("Unstable particle " + ptype.name() +
449  " has no decay chanels!");
450  }
451  }
452 }
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 57 of file particletype.cc.

57  {
58  // Calculate the offset via pointer subtraction:
59  const auto offset = this - std::addressof(list_all()[0]);
60  // Since we're using uint16_t for storing the index better be safe than sorry:
61  // The offset must fit into the data type. If this ever fails we got a lot
62  // more particle types than initially expected and you have to increase the
63  // ParticleTypePtr storage to uint32_t.
64  assert(offset >= 0 && offset < 0xffff);
65  // After the assertion above the down-cast to uint16_t is safe:
66  return ParticleTypePtr(static_cast<uint16_t>(offset));
67 }
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 608 of file particletype.h.

◆ mass_

double smash::ParticleType::mass_
private

pole mass of the particle

Definition at line 610 of file particletype.h.

◆ width_

double smash::ParticleType::width_
private

width of the particle

Definition at line 612 of file particletype.h.

◆ parity_

Parity smash::ParticleType::parity_
private

Parity of the particle.

Definition at line 614 of file particletype.h.

◆ pdgcode_

PdgCode smash::ParticleType::pdgcode_
private

PDG Code of the particle.

Definition at line 616 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 623 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 630 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 633 of file particletype.h.

◆ charge_

int32_t smash::ParticleType::charge_
private

Charge of the particle; filled automatically from pdgcode_.

Definition at line 635 of file particletype.h.

◆ isospin_

int smash::ParticleType::isospin_
mutableprivate

Isospin of the particle; filled automatically from pdgcode_.

Definition at line 637 of file particletype.h.

◆ I3_

int smash::ParticleType::I3_
private

Isospin projection of the particle; filled automatically from pdgcode_.

Definition at line 639 of file particletype.h.

◆ iso_multiplet_

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

Container for the isospin multiplet information.

Definition at line 642 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 645 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 647 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:590
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:75
smash::ParticleType::width_
double width_
width of the particle
Definition: particletype.h:612
smash::IsoParticleType::find
static const IsoParticleType & find(const std::string &name)
Returns the IsoParticleType object for the given name.
Definition: isoparticletype.cc:61
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:368
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:454
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:44
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:635
smash::PdgCode::spin
unsigned int spin() const
Definition: pdgcode.h:518
smash::PdgCode::spin_degeneracy
unsigned int spin_degeneracy() const
Definition: pdgcode.h:539
smash::PdgCode::is_Delta
bool is_Delta() const
Definition: pdgcode.h:345
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:42
smash::anonymous_namespace{particletype.cc}::all_particle_types
const ParticleTypeList * all_particle_types
Global pointer to the Particle Type list.
Definition: particletype.cc:36
smash::PdgCode::antiparticle_sign
int antiparticle_sign() const
Definition: pdgcode.h:546
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:570
smash::ParticleType::is_Delta
bool is_Delta() const
Definition: particletype.h:218
smash::ParticleType::isospin_
int isospin_
Isospin of the particle; filled automatically from pdgcode_.
Definition: particletype.h:637
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:608
smash::PdgCode::is_rho
bool is_rho() const
Definition: pdgcode.h:387
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:623
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:203
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:429
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:99
smash::PdgCode::get_decimal
int32_t get_decimal() const
Definition: pdgcode.h:663
smash::ParticleType::has_antiparticle
bool has_antiparticle() const
Definition: particletype.h:159
smash::PdgCode::isospin3
int isospin3() const
Definition: pdgcode.h:418
smash::ParticleType::decay_modes
const DecayModes & decay_modes() const
Definition: particletype.cc:422
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:633
smash::ParticleType::iso_multiplet_
IsoParticleType * iso_multiplet_
Container for the isospin multiplet information.
Definition: particletype.h:642
smash::integrate
static Integrator integrate
Definition: decaytype.cc:144
smash::LParticleType
static constexpr int LParticleType
Definition: isoparticletype.cc:18
smash::ParticleType::isospin
int isospin() const
Returns twice the isospin vector length .
Definition: particletype.cc:404
smash::ParticleType::I3_
int I3_
Isospin projection of the particle; filled automatically from pdgcode_.
Definition: particletype.h:639
smash::WhichDecaymodes::Hadronic
Ignore dilepton decay modes widths.
smash::PdgCode::charge
int charge() const
The charge of the particle.
Definition: pdgcode.h:479
smash::ParticleType::is_nucleus
bool is_nucleus() const
Definition: particletype.h:242
smash::ParticleType::is_deuteron
bool is_deuteron() const
Definition: particletype.h:245
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:239
smash::IsoParticleType::exists
static bool exists(const std::string &name)
Returns whether the ParticleType with the given pdgcode exists.
Definition: isoparticletype.cc:78
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:38
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:610
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:46
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:48
smash::ParticleType::pdgcode_
PdgCode pdgcode_
PDG Code of the particle.
Definition: particletype.h:616
smash::ParticleType::try_find
static const ParticleTypePtr try_find(PdgCode pdgcode)
Returns the ParticleTypePtr for the given pdgcode.
Definition: particletype.cc:89
smash::ParticleType::ParticleType
ParticleType(std::string n, double m, double w, Parity p, PdgCode id)
Creates a fully initialized ParticleType object.
Definition: particletype.cc:122
smash::ParticleType::parity_
Parity parity_
Parity of the particle.
Definition: particletype.h:614
smash::chargestr
static std::string chargestr(int charge)
Construct a charge string, given the charge as integer.
Definition: particletype.cc:182
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:143
smash::ParticleType::isospin3
int isospin3() const
Definition: particletype.h:176
smash::Parity::Pos
Positive parity.
smash::PdgCode::charmness
int charmness() const
Definition: pdgcode.h:462
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:413
smash::PdgCode::strangeness
int strangeness() const
Definition: pdgcode.h:455
smash::PdgCode::is_deuteron
bool is_deuteron() const
Definition: pdgcode.h:393
smash::has_lepton_pair
bool has_lepton_pair(const PdgCode pdg1, const PdgCode pdg2, const PdgCode pdg3)
Definition: pdgcode.h:1004
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:630
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:645
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:402
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:354
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:610
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:40
smash::Parity::Neg
Negative parity.
smash::is_dilepton
bool is_dilepton(const PdgCode pdg1, const PdgCode pdg2)
Definition: pdgcode.h:992
smash::PdgCode::is_Nstar1535
bool is_Nstar1535() const
Definition: pdgcode.h:339
smash::IsoParticleType::get_states
ParticleTypePtrList get_states() const
Returns list of states that form part of the multiplet.
Definition: isoparticletype.h:94
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:51
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:160
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:215