Version: SMASH-3.1
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 98 of file particletype.h.

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_pion () const
 
bool is_kaon () 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_triton () 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)
 Writes all information about the particle type to the output stream. More...
 

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()) {}
double min_mass_spectral_
minimum mass, where the spectral function is non-zero Mutable, because it is initialized at first cal...
Definition: particletype.h:641
int I3_
Isospin projection of the particle; filled automatically from pdgcode_.
Definition: particletype.h:650
Parity parity_
Parity of the particle.
Definition: particletype.h:625
std::string name_
name of the particle
Definition: particletype.h:619
double min_mass_kinematic_
minimum kinematically allowed mass of the particle Mutable, because it is initialized at first call o...
Definition: particletype.h:634
int isospin_
Isospin of the particle; filled automatically from pdgcode_.
Definition: particletype.h:648
double width_
width of the particle
Definition: particletype.h:623
PdgCode pdgcode_
PDG Code of the particle.
Definition: particletype.h:627
int32_t charge_
Charge of the particle; filled automatically from pdgcode_.
Definition: particletype.h:646
double mass_
pole mass of the particle
Definition: particletype.h:621
int isospin3() const
Definition: pdgcode.h:506
int charge() const
The charge of the particle.
Definition: pdgcode.h:567
constexpr int p
Proton.
constexpr int n
Neutron.

◆ 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 432 of file particletype.cc.

432  {
433  const auto offset = this - std::addressof(list_all()[0]);
434  const auto &modes = (*DecayModes::all_decay_modes)[offset];
435  assert(is_stable() || !modes.is_empty());
436  return modes;
437 }
static const ParticleTypeList & list_all()
Definition: particletype.cc:51
bool is_stable() const
Definition: particletype.h:246

◆ name()

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

Definition at line 142 of file particletype.h.

142 { return name_; }

◆ mass()

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

Definition at line 145 of file particletype.h.

145 { return mass_; }

◆ mass_sqr()

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

Definition at line 148 of file particletype.h.

148 { 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 151 of file particletype.h.

151 { return width_; }

◆ parity()

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

Definition at line 154 of file particletype.h.

154 { return parity_; }

◆ pdgcode()

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

Definition at line 157 of file particletype.h.

157 { return pdgcode_; }

◆ 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 160 of file particletype.h.

160 { return pdgcode_.has_antiparticle(); }
bool has_antiparticle() const
Definition: pdgcode.h:490

◆ get_antiparticle()

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

Definition at line 757 of file particletype.h.

757  {
758  assert(has_antiparticle());
759  return &find(pdgcode_.get_antiparticle());
760 }
static const ParticleType & find(PdgCode pdgcode)
Returns the ParticleType object for the given pdgcode.
Definition: particletype.cc:99
bool has_antiparticle() const
Definition: particletype.h:160
PdgCode get_antiparticle() const
Construct the antiparticle to a given PDG code.
Definition: pdgcode.h:332

◆ antiparticle_sign()

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

Returns
-1 for antiparticles and +1 for particles.

Definition at line 166 of file particletype.h.

166 { return pdgcode_.antiparticle_sign(); }
int antiparticle_sign() const
Definition: pdgcode.h:651

◆ 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 414 of file particletype.cc.

414  {
415  if (isospin_ < 0) {
418  : 0;
419  }
420  return isospin_;
421 }
int isospin() const
Returns twice the total isospin of the multiplet.
IsoParticleType * iso_multiplet_
Container for the isospin multiplet information.
Definition: particletype.h:653
bool is_hadron() const
Definition: pdgcode.h:370

◆ 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 177 of file particletype.h.

177 { return I3_; }

◆ isospin3_rel()

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

Definition at line 180 of file particletype.h.

180  {
181  unsigned int I = isospin();
182  return (I == 0) ? 0 : static_cast<double>(isospin3()) / I;
183  }
int isospin3() const
Definition: particletype.h:177
int isospin() const
Returns twice the isospin vector length .

◆ iso_multiplet()

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

Definition at line 186 of file particletype.h.

186 { return iso_multiplet_; }

◆ 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 189 of file particletype.h.

189 { return charge_; }

◆ spin()

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

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.

Exceptions
runtime_errorif a spin of a nucleus is not coded in and has to be guessed

Definition at line 192 of file particletype.h.

192 { return pdgcode_.spin(); }
unsigned int spin() const
Definition: pdgcode.h:608

◆ spin_degeneracy()

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

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

Definition at line 195 of file particletype.h.

195 { return pdgcode_.spin_degeneracy(); }
unsigned int spin_degeneracy() const
Definition: pdgcode.h:644

◆ is_hadron()

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

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

Definition at line 198 of file particletype.h.

198 { return pdgcode_.is_hadron(); }

◆ is_lepton()

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

Returns
true if this is a lepton.

Definition at line 201 of file particletype.h.

201 { return pdgcode_.is_lepton(); }
bool is_lepton() const
Definition: pdgcode.h:375

◆ is_baryon()

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

Returns
whether this PDG code identifies a baryon.

Definition at line 204 of file particletype.h.

204 { return pdgcode_.is_baryon(); }
bool is_baryon() const
Definition: pdgcode.h:391

◆ is_meson()

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

Returns
whether this PDG code identifies a meson.

Definition at line 207 of file particletype.h.

207 { return pdgcode_.is_meson(); }
bool is_meson() const
Definition: pdgcode.h:394

◆ baryon_number()

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

Returns
the baryon number of the particle.

Definition at line 210 of file particletype.h.

210 { return pdgcode_.baryon_number(); }
int baryon_number() const
Definition: pdgcode.h:381

◆ 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 213 of file particletype.h.

213 { return pdgcode_.strangeness(); }
int strangeness() const
Definition: pdgcode.h:543

◆ is_nucleon()

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

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

Definition at line 216 of file particletype.h.

216 { return pdgcode_.is_nucleon(); }
bool is_nucleon() const
Definition: pdgcode.h:397

◆ is_pion()

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

Returns
whether this is a pion (pi+/pi0/pi-)

Definition at line 219 of file particletype.h.

219 { return pdgcode_.is_pion(); }
bool is_pion() const
Definition: pdgcode.h:457

◆ is_kaon()

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

Returns
whether this is a kaon (K+, K-, K0, Kbar0)

Definition at line 222 of file particletype.h.

222 { return pdgcode_.is_kaon(); }
bool is_kaon() const
Definition: pdgcode.h:451

◆ is_Delta()

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

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

Definition at line 225 of file particletype.h.

225 { return pdgcode_.is_Delta(); }
bool is_Delta() const
Definition: pdgcode.h:421

◆ is_rho()

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

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

Definition at line 228 of file particletype.h.

228 { return pdgcode_.is_rho(); }
bool is_rho() const
Definition: pdgcode.h:469

◆ is_Nstar()

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

Definition at line 231 of file particletype.h.

231  {
232  return is_baryon() && isospin() == 1 && !pdgcode_.is_nucleon() &&
233  pdgcode_.strangeness() == 0 && pdgcode_.charmness() == 0;
234  }
bool is_baryon() const
Definition: particletype.h:204
int charmness() const
Definition: pdgcode.h:550

◆ is_Nstar1535()

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

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

Definition at line 237 of file particletype.h.

237 { return pdgcode_.is_Nstar1535(); }
bool is_Nstar1535() const
Definition: pdgcode.h:415

◆ is_Deltastar()

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

Definition at line 240 of file particletype.h.

240  {
241  return is_baryon() && isospin() == 3 && !pdgcode_.is_Delta() &&
242  pdgcode_.strangeness() == 0 && pdgcode_.charmness() == 0;
243  }

◆ is_stable()

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

Definition at line 246 of file particletype.h.

246 { return width_ < width_cutoff; }
static constexpr double width_cutoff
Decay width cutoff for considering a particle as stable.
Definition: particletype.h:108

◆ is_nucleus()

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

Definition at line 249 of file particletype.h.

249 { return pdgcode_.is_nucleus(); }
bool is_nucleus() const
Definition: pdgcode.h:364

◆ is_deuteron()

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

Definition at line 252 of file particletype.h.

252 { return pdgcode_.is_deuteron(); }
bool is_deuteron() const
Definition: pdgcode.h:475

◆ is_triton()

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

Definition at line 255 of file particletype.h.

255 { return pdgcode_.is_triton(); }
bool is_triton() const
Definition: pdgcode.h:481

◆ is_dprime()

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

Definition at line 258 of file particletype.h.

258  {
259  return is_nucleus() && std::abs(pdgcode_.get_decimal()) == 1000010021;
260  }
bool is_nucleus() const
Definition: particletype.h:249
int32_t get_decimal() const
Definition: pdgcode.h:769

◆ 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 364 of file particletype.cc.

364  {
365  if (unlikely(min_mass_kinematic_ < 0.)) {
366  /* If the particle is stable, min. mass is just the mass. */
368  /* Otherwise, find the lowest mass value needed in any decay mode */
369  if (!is_stable()) {
370  for (const auto &mode : decay_modes().decay_mode_list()) {
371  min_mass_kinematic_ = std::min(min_mass_kinematic_, mode->threshold());
372  }
373  }
374  }
375  return min_mass_kinematic_;
376 }
const DecayModes & decay_modes() const
#define unlikely(x)
Tell the branch predictor that this expression is likely false.
Definition: macros.h:16

◆ 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 378 of file particletype.cc.

378  {
379  if (unlikely(min_mass_spectral_ < 0.)) {
380  /* If the particle is stable or it has a non-zero spectral function value at
381  * the minimum mass that is allowed by kinematics, min_mass_spectral is just
382  * the min_mass_kinetic. */
384  /* Otherwise, find the lowest mass value where spectral function has a
385  * non-zero value by bisection.*/
386  if (!is_stable() &&
388  // find a right bound that has non-zero spectral function for bisection
389  const double m_step = 0.01;
390  double right_bound_bis;
391  for (unsigned int i = 0;; i++) {
392  right_bound_bis = min_mass_kinematic() + m_step * i;
393  if (this->spectral_function(right_bound_bis) > really_small) {
394  break;
395  }
396  }
397  // bisection
398  const double precision = 1E-6;
399  double left_bound_bis = right_bound_bis - m_step;
400  while (right_bound_bis - left_bound_bis > precision) {
401  const double mid = (left_bound_bis + right_bound_bis) / 2.0;
402  if (this->spectral_function(mid) > really_small) {
403  right_bound_bis = mid;
404  } else {
405  left_bound_bis = mid;
406  }
407  }
408  min_mass_spectral_ = right_bound_bis;
409  }
410  }
411  return min_mass_spectral_;
412 }
double spectral_function(double m) const
Full spectral function of the resonance (relativistic Breit-Wigner distribution with mass-dependent ...
double min_mass_kinematic() const
The minimum mass of the resonance that is kinematically allowed.
constexpr double really_small
Numerical error tolerance.
Definition: constants.h:37

◆ 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 423 of file particletype.cc.

424  {
425  if (m < mode->threshold()) {
426  return 0.;
427  }
428  double partial_width_at_pole = width_at_pole() * mode->weight();
429  return mode->type().width(mass(), partial_width_at_pole, m);
430 }
double width_at_pole() const
Definition: particletype.h:151
double mass() const
Definition: particletype.h:145

◆ 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 439 of file particletype.cc.

439  {
440  double w = 0.;
441  if (is_stable()) {
442  return w;
443  }
444  /* Loop over decay modes and sum up all partial widths. */
445  const auto &modes = decay_modes().decay_mode_list();
446  for (unsigned int i = 0; i < modes.size(); i++) {
447  w = w + partial_width(m, modes[i].get());
448  }
449  if (w < width_cutoff) {
450  return 0.;
451  }
452  return w;
453 }
const DecayBranchList & decay_mode_list() const
Definition: decaymodes.h:63
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.

◆ 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 471 of file particletype.cc.

472  {
473  switch (wh) {
474  case WhichDecaymodes::All: {
475  return true;
476  }
478  return !t.is_dilepton_decay();
479  }
481  return t.is_dilepton_decay();
482  }
483  default:
484  throw std::runtime_error(
485  "Problem in selecting decaymodes in wanted_decaymode()");
486  }
487 }
@ Hadronic
Ignore dilepton decay modes widths.
@ Dileptons
Only return dilepton decays widths.
@ All
All decay mode widths.

◆ 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 489 of file particletype.cc.

491  {
492  const auto &decay_mode_list = decay_modes().decay_mode_list();
493  /* Determine whether the decay is affected by the potentials. If it's
494  * affected, read the values of the potentials at the position of the
495  * particle */
496  FourVector UB = FourVector();
497  FourVector UI3 = FourVector();
498  if (UB_lat_pointer != nullptr) {
499  UB_lat_pointer->value_at(x, UB);
500  }
501  if (UI3_lat_pointer != nullptr) {
502  UI3_lat_pointer->value_at(x, UI3);
503  }
504  /* Loop over decay modes and calculate all partial widths. */
505  DecayBranchList partial;
506  partial.reserve(decay_mode_list.size());
507  for (unsigned int i = 0; i < decay_mode_list.size(); i++) {
508  /* Calculate the sqare root s of the final state particles. */
509  const auto FinalTypes = decay_mode_list[i]->type().particle_types();
510  double scale_B = 0.0;
511  double scale_I3 = 0.0;
512  if (pot_pointer != nullptr) {
513  scale_B += pot_pointer->force_scale(*this).first;
514  scale_I3 += pot_pointer->force_scale(*this).second * isospin3_rel();
515  for (const auto &finaltype : FinalTypes) {
516  scale_B -= pot_pointer->force_scale(*finaltype).first;
517  scale_I3 -= pot_pointer->force_scale(*finaltype).second *
518  finaltype->isospin3_rel();
519  }
520  }
521  double sqrt_s = (p + UB * scale_B + UI3 * scale_I3).abs();
522 
523  const double w = partial_width(sqrt_s, decay_mode_list[i].get());
524  if (w > 0.) {
525  if (wanted_decaymode(decay_mode_list[i]->type(), wh)) {
526  partial.push_back(
527  std::make_unique<DecayBranch>(decay_mode_list[i]->type(), w));
528  }
529  }
530  }
531  return partial;
532 }
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...
double isospin3_rel() const
Definition: particletype.h:180
static std::pair< double, int > force_scale(const ParticleType &data)
Evaluates the scaling factor of the forces acting on the particles.
Definition: potentials.cc:156
Potentials * pot_pointer
Pointer to a Potential class.
RectangularLattice< FourVector > * UB_lat_pointer
Pointer to the skyrme potential on the lattice.
RectangularLattice< FourVector > * UI3_lat_pointer
Pointer to the symmmetry potential on the lattice.

◆ 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 534 of file particletype.cc.

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

◆ 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 550 of file particletype.cc.

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

◆ 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 569 of file particletype.cc.

569  {
570  if (norm_factor_ < 0.) {
571  /* Initialize the normalization factor
572  * by integrating over the unnormalized spectral function. */
573  static /*thread_local (see #3075)*/ Integrator integrate;
574  const double width = width_at_pole();
575  const double m_pole = mass();
576  // We transform the integral using m = m_min + width_pole * tan(x), to
577  // make it definite and to avoid numerical issues.
578  const double x_min = std::atan((min_mass_kinematic() - m_pole) / width);
579  norm_factor_ = 1. / integrate(x_min, M_PI / 2., [&](double x) {
580  const double tanx = std::tan(x);
581  const double m_x = m_pole + width * tanx;
582  const double jacobian = width * (1.0 + tanx * tanx);
583  return spectral_function_no_norm(m_x) * jacobian;
584  });
585  }
587 }
double spectral_function_no_norm(double m) const
Full spectral function without normalization factor.
double norm_factor_
This normalization factor ensures that the spectral function is normalized to unity,...
Definition: particletype.h:644
static Integrator integrate
Definition: decaytype.cc:143

◆ 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 589 of file particletype.cc.

589  {
590  /* The spectral function is a relativistic Breit-Wigner function
591  * with mass-dependent width. Here: without normalization factor. */
592  const double resonance_width = total_width(m);
593  if (resonance_width < ParticleType::width_cutoff) {
594  return 0.;
595  }
596  return breit_wigner(m, mass(), resonance_width);
597 }
double total_width(const double m) const
Get the mass-dependent total width of a particle with mass m.
double breit_wigner(double m, double pole, double width)
Returns a relativistic Breit-Wigner distribution.

◆ 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 599 of file particletype.cc.

599  {
600  /* The spectral function is a relativistic Breit-Wigner function.
601  * This variant is using a constant width (evaluated at the pole mass). */
602  const double resonance_width = width_at_pole();
603  if (resonance_width < ParticleType::width_cutoff) {
604  return 0.;
605  }
606  return breit_wigner(m, mass(), resonance_width);
607 }

◆ 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 609 of file particletype.cc.

609  {
610  return breit_wigner_nonrel(m, mass(), width_at_pole());
611 }
double breit_wigner_nonrel(double m, double pole, double width)
Returns a non-relativistic Breit-Wigner distribution, which is essentially a Cauchy distribution with...

◆ 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 614 of file particletype.cc.

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

◆ 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 671 of file particletype.cc.

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

◆ 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 722 of file particletype.cc.

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

◆ 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 }
const ParticleTypeList * all_particle_types
Global pointer to the Particle Type list.
Definition: particletype.cc:36

◆ 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; }
ParticleTypePtrList nucleons_list
Global pointer to the Particle Type list of nucleons.
Definition: particletype.cc:38

◆ 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 }
ParticleTypePtrList anti_nucs_list
Global pointer to the Particle Type list of anti-nucleons.
Definition: particletype.cc:40

◆ 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; }
ParticleTypePtrList deltas_list
Global pointer to the Particle Type list of deltas.
Definition: particletype.cc:42

◆ 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 }
ParticleTypePtrList anti_deltas_list
Global pointer to the Particle Type list of anti-deltas.
Definition: particletype.cc:44

◆ 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 }
ParticleTypePtrList baryon_resonances_list
Global pointer to the Particle Type list of baryon resonances.
Definition: particletype.cc:46

◆ 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 }
ParticleTypePtrList light_nuclei_list
Global pointer to the Particle Type list of light nuclei.
Definition: particletype.cc:48

◆ 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 }

◆ 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 }
static const ParticleTypePtr try_find(PdgCode pdgcode)
Returns the ParticleTypePtr for the given pdgcode.
Definition: particletype.cc:89
std::string string() const
Definition: pdgcode.h:325

◆ 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 }

◆ 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 }

◆ 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 provided masses are the same as hardcoded ones, if present
253  throw std::runtime_error("Nucleon mass in input file different from " +
254  std::to_string(nucleon_mass));
255  }
256  if (pdgcode[0].is_pion() && !almost_equal(mass, pion_mass)) {
257  throw std::runtime_error("Pion mass in input file different from " +
258  std::to_string(pion_mass));
259  }
260  if (pdgcode[0].is_kaon() && !almost_equal(mass, kaon_mass)) {
261  throw std::runtime_error("Kaon mass in input file different from " +
262  std::to_string(kaon_mass));
263  }
264  if (pdgcode[0].is_omega() && !almost_equal(mass, omega_mass)) {
265  throw std::runtime_error("Omega mass in input file different from " +
266  std::to_string(omega_mass));
267  }
268  if (pdgcode[0].is_Delta() && !almost_equal(mass, delta_mass)) {
269  throw std::runtime_error("Delta mass in input file different from " +
270  std::to_string(delta_mass));
271  }
273  throw std::runtime_error("Deuteron mass in input file different from " +
274  std::to_string(deuteron_mass));
275  }
276 
277  // add all states to type list
278  for (size_t i = 0; i < pdgcode.size(); i++) {
279  std::string full_name = name;
280  if (pdgcode.size() > 1) {
281  // for multiplets: add charge string to name
282  full_name += chargestr(pdgcode[i].charge());
283  }
284  type_list.emplace_back(full_name, mass, width, parity, pdgcode[i]);
285  logg[LParticleType].debug()
286  << "Setting particle type: " << type_list.back();
287  if (pdgcode[i].has_antiparticle()) {
288  /* add corresponding antiparticle */
289  PdgCode anti = pdgcode[i].get_antiparticle();
290  // For bosons the parity does not change, for fermions it gets inverted.
291  const auto anti_parity = (anti.spin() % 2 == 0) ? parity : -parity;
292  full_name = antiname(full_name, pdgcode[i]);
293  type_list.emplace_back(full_name, mass, width, anti_parity, anti);
294  logg[LParticleType].debug()
295  << "Setting antiparticle type: " << type_list.back();
296  }
297  }
298  }
299  type_list.shrink_to_fit();
300 
301  /* Sort the type list by PDG code. */
302  std::sort(type_list.begin(), type_list.end());
303 
304  /* Look for duplicates. */
305  PdgCode prev_pdg = 0;
306  for (const auto &t : type_list) {
307  if (t.pdgcode() == prev_pdg) {
308  throw ParticleType::LoadFailure("Duplicate PdgCode in particles.txt: " +
309  t.pdgcode().string());
310  }
311  prev_pdg = t.pdgcode();
312  }
313 
314  if (all_particle_types != nullptr) {
315  throw std::runtime_error("Error: Type list was already built!");
316  }
317  all_particle_types = &type_list; // note that type_list is a function-local
318  // static and thus will live on until after
319  // main().
320 
321  // create all isospin multiplets
322  for (const auto &t : type_list) {
324  }
325  // link the multiplets to the types
326  for (auto &t : type_list) {
327  t.iso_multiplet_ = IsoParticleType::find(t);
328  }
329 
330  // Create nucleons/anti-nucleons list
331  if (IsoParticleType::exists("N")) {
332  for (const auto &state : IsoParticleType::find("N").get_states()) {
333  nucleons_list.push_back(state);
334  anti_nucs_list.push_back(state->get_antiparticle());
335  }
336  }
337 
338  // Create deltas list
339  if (IsoParticleType::exists("Δ")) {
340  for (const auto &state : IsoParticleType::find("Δ").get_states()) {
341  deltas_list.push_back(state);
342  anti_deltas_list.push_back(state->get_antiparticle());
343  }
344  }
345 
346  // Create baryon resonances list
347  for (const ParticleType &type_resonance : ParticleType::list_all()) {
348  /* Only loop over baryon resonances. */
349  if (type_resonance.is_stable() ||
350  type_resonance.pdgcode().baryon_number() != 1) {
351  continue;
352  }
353  baryon_resonances_list.push_back(&type_resonance);
354  baryon_resonances_list.push_back(type_resonance.get_antiparticle());
355  }
356 
357  for (const ParticleType &type : ParticleType::list_all()) {
358  if (type.is_nucleus()) {
359  light_nuclei_list.push_back(&type);
360  }
361  }
362 } /*}}}*/
static bool exists(const std::string &name)
Returns whether the ParticleType with the given pdgcode exists.
static const IsoParticleType & find(const std::string &name)
Returns the IsoParticleType object for the given name.
static void create_multiplet(const ParticleType &type)
Add a new multiplet to the global list of IsoParticleTypes, which contains type.
bool is_pion() const
Definition: particletype.h:219
const std::string & name() const
Definition: particletype.h:142
int32_t charge() const
The charge of the particle.
Definition: particletype.h:189
bool is_Delta() const
Definition: particletype.h:225
bool is_nucleon() const
Definition: particletype.h:216
bool is_deuteron() const
Definition: particletype.h:252
bool is_kaon() const
Definition: particletype.h:222
Parity parity() const
Definition: particletype.h:154
constexpr double delta_mass
Delta mass in GeV.
Definition: constants.h:86
void ensure_all_read(std::istream &input, const Line &line)
Makes sure that nothing is left to read from this line.
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.
build_vector_< Line > line_parser(const std::string &input)
Helper function for parsing particles.txt and decaymodes.txt.
Parity
Represent the parity of a particle type.
Definition: particletype.h:25
@ Neg
Negative parity.
@ Pos
Positive parity.
constexpr double deuteron_mass
Deuteron mass in GeV.
Definition: constants.h:92
constexpr double nucleon_mass
Nucleon mass in GeV.
Definition: constants.h:58
constexpr double pion_mass
Pion mass in GeV.
Definition: constants.h:65
std::string build_error_string(std::string message, const Line &line)
Builds a meaningful error message.
constexpr double kaon_mass
Kaon mass in GeV.
Definition: constants.h:72
static std::string chargestr(int charge)
Construct a charge string, given the charge as integer.
bool almost_equal(const N x, const N y)
Checks two numbers for relative approximate equality.
Definition: numerics.h:44
constexpr double omega_mass
omega mass in GeV.
Definition: constants.h:79
static constexpr int LParticleType

◆ 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 540 of file particletype.h.

540  {
541  return pdgcode() == rhs.pdgcode();
542  }

◆ 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 547 of file particletype.h.

547  {
548  return pdgcode() != rhs.pdgcode();
549  }

◆ 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 556 of file particletype.h.

556  {
557  return pdgcode() < rhs.pdgcode();
558  }

◆ check_consistency()

void smash::ParticleType::check_consistency ( )
static
Exceptions
runtime_errorif unstable particles have no decay modes
runtime_errorif fake dibaryon d' is present without d

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

Definition at line 455 of file particletype.cc.

455  {
456  for (const ParticleType &ptype : ParticleType::list_all()) {
457  if (!ptype.is_stable() && ptype.decay_modes().is_empty()) {
458  throw std::runtime_error(
459  "Unstable particle " + ptype.name() +
460  " has no decay chanels! Either add one to it in decaymodes file or "
461  "set it's width to 0 in particles file.");
462  }
463  if (ptype.is_dprime() && !ParticleType::try_find(pdg::deuteron)) {
464  throw std::runtime_error(
465  "d' cannot be used without deuteron. Modify input particles file "
466  "accordingly.");
467  }
468  }
469 }
constexpr int64_t deuteron
Deuteron.

◆ 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 }

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 108 of file particletype.h.

◆ name_

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

name of the particle

Definition at line 619 of file particletype.h.

◆ mass_

double smash::ParticleType::mass_
private

pole mass of the particle

Definition at line 621 of file particletype.h.

◆ width_

double smash::ParticleType::width_
private

width of the particle

Definition at line 623 of file particletype.h.

◆ parity_

Parity smash::ParticleType::parity_
private

Parity of the particle.

Definition at line 625 of file particletype.h.

◆ pdgcode_

PdgCode smash::ParticleType::pdgcode_
private

PDG Code of the particle.

Definition at line 627 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 634 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 641 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 644 of file particletype.h.

◆ charge_

int32_t smash::ParticleType::charge_
private

Charge of the particle; filled automatically from pdgcode_.

Definition at line 646 of file particletype.h.

◆ isospin_

int smash::ParticleType::isospin_
mutableprivate

Isospin of the particle; filled automatically from pdgcode_.

Definition at line 648 of file particletype.h.

◆ I3_

int smash::ParticleType::I3_
private

Isospin projection of the particle; filled automatically from pdgcode_.

Definition at line 650 of file particletype.h.

◆ iso_multiplet_

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

Container for the isospin multiplet information.

Definition at line 653 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 656 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 658 of file particletype.h.


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