Version: SMASH-1.5
smash Namespace Reference

Namespaces

 anonymous_namespace{configuration.cc}
 
 anonymous_namespace{decaymodes.cc}
 
 anonymous_namespace{oscaroutput.cc}
 
 anonymous_namespace{particletype.cc}
 
 anonymous_namespace{smash.cc}
 
 decaytree
 
 LogArea
 The namespace where log areas are declared.
 
 lowess
 
 pdg
 Constants representing PDG codes.
 
 random
 Namespace random provides functions for random Number Generation.
 
 Test
 
 transit_high_energy
 constants related to transition between low and high collision energies
 
 utf8
 

Classes

class  Action
 Action is the base class for a generic process that takes a number of incoming particles and transforms them into any number of outgoing particles. More...
 
class  ActionFinderInterface
 ActionFinderInterface is the abstract base class for all action finders, i.e. More...
 
class  Actions
 The Actions class abstracts the storage and manipulation of actions. More...
 
class  Angles
 Angles provides a common interface for generating directions: i.e., two angles that should be interpreted as azimuthal and polar angles. More...
 
class  Average
 Calculate an average value incrementally. More...
 
class  BinaryOutputBase
 Base class for SMASH binary output. More...
 
class  BinaryOutputCollisions
 Saves SMASH collision history to binary file. More...
 
class  BinaryOutputParticles
 Writes the particle list at specific times to the binary file. More...
 
class  BoxModus
 BoxModus: Provides a modus for infinite matter calculations. More...
 
class  Clock
 Clock tracks the time in the simulation. More...
 
class  ColliderModus
 ColliderModus: Provides a modus for colliding nuclei. More...
 
class  CollisionBranch
 CollisionBranch is a derivative of ProcessBranch, which is used to represent particular final-state channels in a collision. More...
 
class  Configuration
 Interface to the SMASH configuration files. More...
 
class  CrossSections
 The cross section class assembels everything that is needed to calculate the cross section and returns a list of all possible reactions for the incoming particles at the given energy with the calculated cross sections. More...
 
class  CrosssectionsPhoton
 
class  CrosssectionsPhoton< ComputationMethod::Analytic >
 Class to calculate the cross-section of a meson-meson to meson-photon process. More...
 
class  DecayAction
 DecayAction is a special action which takes one single particle in the initial state and makes it decay into a number of daughter particles (currently two or three). More...
 
class  DecayActionDilepton
 DecayActionDilepton is special action created for particles that can decay into dileptons. More...
 
class  DecayActionsFinder
 A simple decay finder: Just loops through all particles and checks if they can decay during the next timestep. More...
 
class  DecayActionsFinderDilepton
 A dilepton decay finder: Loops through all particles and if they can decay into dileptons, it treats the decays with the shining method. More...
 
class  DecayBranch
 DecayBranch is a derivative of ProcessBranch, which is used to represent decay channels. More...
 
class  DecayModes
 The DecayModes class is used to store and update information about decay branches (i.e. More...
 
class  DecayType
 DecayType is the abstract base class for all decay types. More...
 
class  DeformedNucleus
 DeformedNucleus: Child of nucleus for deformed nuclei. More...
 
class  DensityOnLattice
 A class for time-efficient (time-memory trade-off) calculation of density on the lattice. More...
 
class  DensityParameters
 A class to pre-calculate and store parameters relevant for density calculation. More...
 
class  DisableFloatTraps
 Guard type that safely disables floating point traps for the scope in which it is placed. More...
 
class  EnergyMomentumTensor
 The EnergyMomentumTensor class represents a symmetric positive semi-definite energy-momentum tensor \( T^{\mu \nu}\). More...
 
class  EosTable
 A class to hold, compute and access tabulated EoS. More...
 
struct  ExpansionProperties
 Struct containing the type of the metric and the expansion parameter of the metric. More...
 
class  Experiment
 The main class, where the simulation of an experiment is executed. More...
 
class  ExperimentBase
 Non-template interface to Experiment<Modus>. More...
 
struct  ExperimentParameters
 Helper structure for Experiment. More...
 
struct  FileDeleter
 FileDeleter is the deleter class for std::unique_ptr of std::FILE. More...
 
class  FileLock
 Guard to create a file lock. More...
 
struct  FinalStateCrossSection
 Represent a final-state cross section. More...
 
struct  FormattingHelper
 
class  FourVector
 The FourVector class holds relevant values in Minkowski spacetime with (+, −, −, −) metric signature. More...
 
class  GrandCanThermalizer
 The GrandCanThermalizer class implements the following functionality: More...
 
class  Grid
 Abstracts a list of cells that partition the particles in the experiment into regions of space that can interact / cannot interact. More...
 
class  GridBase
 Base class for Grid to host common functions that do not depend on the GridOptions parameter. More...
 
struct  GslWorkspaceDeleter
 A deleter type for std::unique_ptr to be used with gsl_integration_workspace pointers. More...
 
class  HadronGasEos
 Class to handle the equation of state (EoS) of the hadron gas, consisting of all hadrons included into SMASH. More...
 
struct  HistoryData
 A structure to hold information about the history of the particle, e.g. More...
 
class  I_tot_range
 Range of total isospin for reaction of particle a with particle b. More...
 
struct  Integrand2d
 This is a wrapper for the integrand, so we can pass the limits as well for renormalizing to the unit cube. More...
 
class  Integrator
 A C++ interface for numerical integration in one dimension with the GSL CQUAD integration functions. More...
 
class  Integrator1dMonte
 A C++ interface for numerical integration in one dimension with the GSL Monte-Carlo integration functions. More...
 
class  Integrator2d
 A C++ interface for numerical integration in two dimensions with the GSL Monte-Carlo integration functions. More...
 
class  Integrator2dCuhre
 A C++ interface for numerical integration in two dimensions with the Cuba Cuhre integration function. More...
 
class  InterpolateDataLinear
 Represent a piecewise linear interpolation. More...
 
class  InterpolateDataSpline
 Represent a cubic spline interpolation. More...
 
class  InterpolateLinear
 Represent a linear interpolation. More...
 
class  IsoParticleType
 IsoParticleType is a class to represent isospin multiplets. More...
 
class  KaonNucleonRatios
 Calculate and store isospin ratios for K N -> K Delta reactions. More...
 
struct  Line
 Line consists of a line number and the contents of that line. More...
 
class  ListModus
 ListModus: Provides a modus for running SMASH on an external particle list, for example as an afterburner calculation. More...
 
class  ModusDefault
 Base class for Modus classes that provides default function implementations. More...
 
struct  NeighborLookup
 A strust containing the informations needed to search the neighboring cell. More...
 
class  Nucleus
 A nucleus is a collection of particles that are initialized, before the beginning of the simulation and all have the same velocity. More...
 
class  OscarOutput
 
class  OutputInterface
 Abstraction of generic output. More...
 
struct  OutputParameters
 Helper structure for Experiment to hold output options and parameters. More...
 
struct  pair_hash
 Hash a pair of integers. More...
 
class  ParticleData
 ParticleData contains the dynamic information of a certain particle. More...
 
class  Particles
 The Particles class abstracts the storage and manipulation of particles. More...
 
class  ParticleType
 Particle type contains the static properties of a particle species. More...
 
class  ParticleTypePtr
 A pointer-like interface to global references to ParticleType objects. More...
 
class  PauliBlocker
 A class that stores parameters needed for Pauli blocking, tabulates necessary integrals and computes phase-space density. More...
 
class  PdgCode
 PdgCode stores a Particle Data Group Particle Numbering Scheme particle type number. More...
 
class  Potentials
 A class that stores parameters of potentials, calculates potentials and their gradients. More...
 
struct  PrintParticleListDetailed
 
class  ProcessBranch
 ProcessBranch represents one possible final state of an interaction process. More...
 
class  QuantumNumbers
 A container for storing conserved values. More...
 
class  RectangularLattice
 A container class to hold all the arrays on the lattice and access them. More...
 
class  RenamingFilePtr
 A RAII type to replace std::FILE *. More...
 
class  Result
 The result type returned from integrations, containing the value and an error. More...
 
class  RootOutput
 

SMASH output to ROOT file

SMASH supports ROOT output as an option (see http://root.cern.ch). More...
 
class  ScatterAction
 ScatterAction is a special action which takes two incoming particles and performs a scattering, producing one or more final-state particles. More...
 
class  ScatterActionPhoton
 ScatterActionPhoton is a special action which takes two incoming particles and performs a perturbative electromagnetic scattering. More...
 
class  ScatterActionsFinder
 A simple scatter finder: Just loops through all particles and checks each pair for a collision. More...
 
class  SphereModus
 SphereModus: Provides a modus for expanding matter calculations. More...
 
class  StringProcess
 String excitation processes used in SMASH. More...
 
class  Tabulation
 A class for storing a one-dimensional lookup table of floating-point values. More...
 
class  ThermalizationAction
 ThermalizationAction implements forced thermalization as an Action class. More...
 
class  ThermLatticeNode
 The ThermLatticeNode class is intended to compute thermodynamical quantities in a cell given a set of particles. More...
 
class  ThermodynamicOutput
 Writes the thermodynamic quantities at a specified point versus time. More...
 
class  ThreeBodyDecay
 ThreeBodyDecay represents a decay type with three final-state particles. More...
 
class  ThreeBodyDecayDilepton
 ThreeBodyDecayDilepton represents a decay type with three final-state particles, two of which are leptons. More...
 
class  ThreeVector
 The ThreeVector class represents a physical three-vector \( \vec{x} = (x_1,x_2,x_3)\) with the components \( x_1,x_2,x_3 \). More...
 
class  TimeStampCounter
 A low-overhead timer for benchmarking small regions of code. More...
 
class  TwoBodyDecay
 TwoBodyDecay represents a decay type with two final-state particles. More...
 
class  TwoBodyDecayDilepton
 TwoBodyDecayDilepton represents a decay with a lepton and its antilepton as the final-state particles. More...
 
class  TwoBodyDecaySemistable
 TwoBodyDecaySemistable represents a decay type with two final-state particles, one of which is stable and the other is unstable. More...
 
class  TwoBodyDecayStable
 TwoBodyDecayStable represents a decay type with two stable final-state particles. More...
 
class  TwoBodyDecayUnstable
 TwoBodyDecayUnstable represents a decay type with two unstable final-state particles. More...
 
class  VtkOutput
 SMASH output in a paraview format, intended for simple visualization. More...
 
class  WallCrossActionsFinder
 Finder for wall crossing actions, when using peridic boundary conditons. More...
 
class  WallcrossingAction
 WallcrossingAction is a special action which indicates that a particle has crossed a box wall. More...
 

Typedefs

using SystemTimePoint = std::chrono::time_point< std::chrono::system_clock >
 Type (alias) that is used to store the current time. More...
 
using SystemClock = std::chrono::system_clock
 Type (alias) used to obtain the current time via SystemClock:Now(). More...
 
using SystemTimeSpan = SystemClock::duration
 The time duration type (alias) used for measuring run times. More...
 
typedef RectangularLattice< DensityOnLatticeDensityLattice
 Conveniency typedef for lattice of density. More...
 
using FilePtr = std::unique_ptr< std::FILE, FileDeleter >
 A RAII type to replace std::FILE *. More...
 
using Permutation = std::vector< size_t >
 Represent a permutation. More...
 

Enumerations

enum  ComputationMethod { ComputationMethod::Analytic }
 Calculation method for the cross sections. More...
 
enum  DensityType {
  DensityType::None = 0, DensityType::Hadron = 1, DensityType::Baryon = 2, DensityType::BaryonicIsospin = 3,
  DensityType::Pion = 4
}
 Allows to choose which kind of density to calculate. More...
 
enum  HadronClass {
  HadronClass::Baryon = 0, HadronClass::Antibaryon = 1, HadronClass::PositiveSMeson = 2, HadronClass::NegativeSMeson = 3,
  HadronClass::PositiveQZeroSMeson = 4, HadronClass::NegativeQZeroSMeson = 5, HadronClass::ZeroQZeroSMeson = 6
}
 Specifier to classify the different hadron species according to their quantum numbers. More...
 
enum  GridOptions : char { GridOptions::Normal = 0, GridOptions::PeriodicBoundaries = 1 }
 Identifies the mode of the Grid. More...
 
enum  CellSizeStrategy : char { CellSizeStrategy::Optimal, CellSizeStrategy::Largest }
 Indentifies the strategy of determining the cell size. More...
 
enum  LatticeUpdate { LatticeUpdate::AtOutput = 0, LatticeUpdate::EveryTimestep = 1, LatticeUpdate::EveryFixedInterval = 2 }
 Enumerator option for lattice updates. More...
 
enum  OscarOutputFormat { OscarFormat2013, OscarFormat2013Extended, OscarFormat1999 }
 Selector for the output format of OscarOutput. More...
 
enum  OscarOutputContents { OscarInteractions = 0x001, OscarTimesteps = 0x002, OscarAtEventstart = 0x004, OscarParticlesAtEventend = 0x008 }
 Flags for the Contents template parameter of OscarOutput. More...
 
enum  Parity { Parity::Pos, Parity::Neg }
 Represent the parity of a particle type. More...
 
enum  ProcessType {
  ProcessType::None = 0, ProcessType::Elastic = 1, ProcessType::TwoToOne = 2, ProcessType::TwoToTwo = 3,
  ProcessType::Decay = 5, ProcessType::Wall = 6, ProcessType::Thermalization = 7, ProcessType::StringSoftSingleDiffractiveAX = 41,
  ProcessType::StringSoftSingleDiffractiveXB = 42, ProcessType::StringSoftDoubleDiffractive = 43, ProcessType::StringSoftAnnihilation = 44, ProcessType::StringSoftNonDiffractive = 45,
  ProcessType::StringHard = 46
}
 Process Types are used to identify the type of the process. More...
 
enum  Extrapolation { Extrapolation::Zero = 0, Extrapolation::Const = 1, Extrapolation::Linear = 2 }
 The kind of extrapolation used by the tabulation. More...
 
enum  NeedsToWrap { NeedsToWrap::PlusLength, NeedsToWrap::No, NeedsToWrap::MinusLength }
 The options determining what to do if a particle flies out of the grids PlusLength: Used if a periodic boundary condition is applied and a particle passes through the lower bound of the grid. More...
 

Functions

std::vector< ActionPtr > & operator+= (std::vector< ActionPtr > &lhs, std::vector< ActionPtr > &&rhs)
 Append vector of action pointers. More...
 
std::ostream & operator<< (std::ostream &out, const ActionPtr &action)
 Convenience: dereferences the ActionPtr to Action. More...
 
std::ostream & operator<< (std::ostream &out, const ActionList &actions)
 Writes multiple actions to the out stream. More...
 
template<typename Iterator >
static bool enforce_periodic_boundaries (Iterator begin, const Iterator &end, typename std::iterator_traits< Iterator >::value_type length)
 Enforces periodic boundaries on the given collection of values. More...
 
template<typename Container , typename UnaryPredicate >
bool all_of (Container &&c, UnaryPredicate &&p)
 Convenience wrapper for std::all_of that operates on a complete container. More...
 
template<typename Container , typename UnaryFunction >
UnaryFunction for_each (Container &&c, UnaryFunction &&f)
 Convenience wrapper for std::for_each that operates on a complete container. More...
 
std::ostream & operator<< (std::ostream &out, const Angles &a)
 Creates output for an Angles object in the form "φ: 0.1294, cos ϑ: 0.423". More...
 
template<typename T >
std::pair< std::vector< T >, std::vector< T > > dedup_avg (const std::vector< T > &x, const std::vector< T > &y)
 Remove duplicates from data (x, y) by averaging y. More...
 
double clebsch_gordan (const int j_a, const int j_b, const int j_c, const int m_a, const int m_b, const int m_c)
 Calculate Clebsch-Gordan coefficient \((-1)^{j_a - j_b + m_c} \sqrt{(2 j_c + 1)} \cdot [Wigner 3J symbol] \). More...
 
double isospin_clebsch_gordan_sqr_2to1 (const ParticleType &p_a, const ParticleType &p_b, const ParticleType &Res)
 Calculate the squared isospin Clebsch-Gordan coefficient for two particles p_a and p_b coupling to a resonance Res. More...
 
double isospin_clebsch_gordan_sqr_3to1 (const ParticleType &p_a, const ParticleType &p_b, const ParticleType &p_c, const ParticleType &Res)
 Calculate the squared isospin Clebsch-Gordan coefficient for three particles p_a, p_b and p_c coupling to a resonance Res. More...
 
double isospin_clebsch_gordan_sqr_2to2 (const ParticleType &p_a, const ParticleType &p_b, const ParticleType &p_c, const ParticleType &p_d, const int I=-1)
 Calculate the squared isospin Clebsch-Gordan coefficient for a 2-to-2 reaction A + B -> C + D. More...
 
template<typename T , typename... Args>
std::unique_ptr< T > make_unique (Args &&... args)
 Definition for make_unique Is in C++14's standard library; necessary for older compilers. More...
 
std::ostream & operator<< (std::ostream &os, DensityType dt)
 Create the output operator for the densities. More...
 
double density_factor (const ParticleType &type, DensityType dens_type)
 Get the factor that determines how much a particle contributes to the density type that is computed. More...
 
double smearing_factor_norm (const double two_sigma_sqr)
 Norm of the Gaussian smearing function. More...
 
double smearing_factor_rcut_correction (const double rcut_in_sigma)
 Gaussians used for smearing are cut at radius \(r_{cut} = a \sigma \) for calculation speed-up. More...
 
std::pair< double, ThreeVectorunnormalized_smearing_factor (const ThreeVector &r, const FourVector &p, const double m_inv, const DensityParameters &dens_par, const bool compute_gradient=false)
 Implements gaussian smearing for any quantity. More...
 
std::tuple< double, ThreeVector, ThreeVector, ThreeVectorrho_eckart (const ThreeVector &r, const ParticleList &plist, const DensityParameters &par, DensityType dens_type, bool compute_gradient)
 Calculates Eckart rest frame density and optionally the gradient of the density in an arbitary frame, the curl of the 3-currrent and the time derivative of the 3-current. More...
 
std::tuple< double, ThreeVector, ThreeVector, ThreeVectorrho_eckart (const ThreeVector &r, const Particles &plist, const DensityParameters &par, DensityType dens_type, bool compute_gradient)
 convenience overload of the above (ParticleList -> Particles) More...
 
template<typename T >
void update_lattice (RectangularLattice< T > *lat, const LatticeUpdate update, const DensityType dens_type, const DensityParameters &par, const Particles &particles, const bool compute_gradient=false)
 Updates the contents on the lattice. More...
 
double breit_wigner (double m, double pole, double width)
 Returns a relativistic Breit-Wigner distribution. More...
 
double breit_wigner_nonrel (double m, double pole, double width)
 Returns a non-relativistic Breit-Wigner distribution, which is essentially a Cauchy distribution with half width. More...
 
double cauchy (double x, double pole, double width)
 Returns a Cauchy distribution (sometimes also called Lorentz or non-relativistic Breit-Wigner distribution) with the given parameters. More...
 
double density_integrand (const double energy, const double momentum_sqr, const double temperature)
 Returns the Maxwell-Boltzmann distribution. More...
 
double density_integrand_mass (const double energy, const double momentum_sqr, const double temperature)
 density_integrand_mass - off_equilibrium distribution for massive particles More...
 
double density_integrand_1M_IC (const double energy, const double momentum_sqr, const double temperature)
 density integrand - 1M_IC massless particles for expanding metric initialization, see Bazow:2016oky More...
 
double density_integrand_2M_IC (const double energy, const double momentum_sqr, const double temperature)
 density integrand - 2M_IC massless particles for expanding metric initialization, see Bazow:2016oky More...
 
double juttner_distribution_func (const double momentum_radial, const double mass, const double temperature, const double baryon_chemical_potential, const double lam)
 Relativistic Juttner distribution function. More...
 
double sample_momenta_non_eq_mass (const double temperature, const double mass)
 Samples a momentum via rejection method from the non-equilibrium distribution

\[f=pe^{-\frac{\sqrt{m^2+p^2}}{T_0}}\]

. More...

 
double sample_momenta_1M_IC (const double temperature, const double mass)
 Samples a momentum from the non-equilibrium distribution 1M_IC from Bazow:2016oky More...
 
double sample_momenta_2M_IC (const double temperature, const double mass)
 Samples a momentum from the non-equilibrium distribution 2M_IC from Bazow:2016oky More...
 
double sample_momenta_from_thermal (const double temperature, const double mass)
 Samples a momentum from the Maxwell-Boltzmann (thermal) distribution in a faster way, given by Scott Pratt. More...
 
double sample_momenta_IC_ES (const double temperature)
 Sample momenta according to the momentum distribution in Bazow:2016oky More...
 
std::ostream & operator<< (std::ostream &, const EnergyMomentumTensor &)
 Prints out 4x4 tensor to the output stream. More...
 
EnergyMomentumTensor operator+ (EnergyMomentumTensor a, const EnergyMomentumTensor &b)
 Direct addition operator. More...
 
EnergyMomentumTensor operator- (EnergyMomentumTensor a, const EnergyMomentumTensor &b)
 Direct subtraction operator. More...
 
EnergyMomentumTensor operator* (EnergyMomentumTensor a, const double b)
 Direct multiplication operator. More...
 
EnergyMomentumTensor operator* (const double a, EnergyMomentumTensor b)
 Direct multiplication operator. More...
 
EnergyMomentumTensor operator/ (EnergyMomentumTensor a, const double b)
 Direct division operator. More...
 
template<typename Modus >
std::ostream & operator<< (std::ostream &out, const Experiment< Modus > &e)
 Creates a verbose textual description of the setup of the Experiment. More...
 
ExperimentParameters create_experiment_parameters (Configuration config)
 Gathers all general Experiment parameters. More...
 
const std::string hline (67, '-')
 String representing a horizontal line. More...
 
std::string format_measurements (const Particles &particles, uint64_t scatterings_this_interval, const QuantumNumbers &conserved_initial, SystemTimePoint time_start, double time)
 Generate the tabulated string which will be printed to the screen when SMASH is running. More...
 
void check_interactions_total (uint64_t interactions_total)
 Make sure interactions_total can be represented as a 32-bit integer. More...
 
FilePtr fopen (const bf::path &filename, const std::string &mode)
 Open a file with given mode. More...
 
double blatt_weisskopf_sqr (const double p_ab, const int L)
 
double post_ff_sqr (double m, double M0, double srts0, double L)
 An additional form factor for unstable final states as used in GiBUU, according to M. More...
 
double em_form_factor_ps (PdgCode pdg, double mass)
 
double em_form_factor_sqr_vec (PdgCode pdg, double mass)
 
double form_factor_delta (double m)
 
FourVector operator+ (FourVector a, const FourVector &b)
 add two FourVectors More...
 
FourVector operator- (FourVector a, const FourVector &b)
 subtract two FourVectors More...
 
FourVector operator* (FourVector a, double b)
 multiply a vector with a scalar More...
 
FourVector operator* (double b, FourVector a)
 multiply a vector with a scalar More...
 
FourVector operator/ (FourVector a, const double &b)
 divide a vector by a scalar More...
 
std::ostream & operator<< (std::ostream &os, const FourVector &vec)
 Writes the four components of the vector to the output stream. More...
 
bool enable_float_traps (int)
 Fallback that fails to set the trap. More...
 
void setup_default_float_traps ()
 Setup the floating-point traps used throughout SMASH. More...
 
template<typename F >
void without_float_traps (F &&f)
 Convenience function to create a scope where all floating point traps are disabled. More...
 
std::ostream & operator<< (std::ostream &s, const ThermLatticeNode &node)
 This operator writes all the thermodynamic quantities at a certain position to the file out. More...
 
std::string build_error_string (std::string message, const Line &line)
 Builds a meaningful error message. More...
 
build_vector_< Lineline_parser (const std::string &input)
 Helper function for parsing particles.txt and decaymodes.txt. More...
 
void ensure_all_read (std::istream &input, const Line &line)
 Makes sure that nothing is left to read from this line. More...
 
std::string read_all (std::istream &&input)
 Utility function to read a complete input stream (e.g. More...
 
bool has_crlf_line_ending (const std::string in)
 Check if a line in the string ends with \r\n. More...
 
template<typename T , typename Cmp >
Permutation generate_sort_permutation (std::vector< T > const &v, Cmp compare)
 Calculate the permutations necessary for sorting a vector. More...
 
template<typename T >
std::vector< T > apply_permutation (const std::vector< T > &v, const Permutation &p)
 Apply a permutation to a vector. More...
 
template<typename T >
void check_duplicates (const std::vector< T > &x, const std::string &error_position)
 Check whether two components have the same value in a sorted vector x. More...
 
template<typename T >
size_t find_index (const std::vector< T > &v, T x)
 Find the index in v that corresponds to the last value strictly smaller than x. More...
 
template<int w = 9, int p = w - 3, typename CharT , typename Traits >
std::basic_ostream< CharT, Traits > & field (std::basic_ostream< CharT, Traits > &s)
 Stream modifier to align the next object to a specific width w. More...
 
double center_of_velocity_v (double s, double ma, double mb)
 
double fixed_target_projectile_v (double s, double ma, double mb)
 
template<typename T >
pCM_sqr_from_s (const T s, const T mass_a, const T mass_b) noexcept
 
template<typename T >
pCM_from_s (const T s, const T mass_a, const T mass_b) noexcept
 
template<typename T >
pCM (const T sqrts, const T mass_a, const T mass_b) noexcept
 
template<typename T >
pCM_sqr (const T sqrts, const T mass_a, const T mass_b) noexcept
 
template<typename T >
std::array< T, 2 > get_t_range (const T sqrts, const T m1, const T m2, const T m3, const T m4)
 Get the range of Mandelstam-t values allowed in a particular 2->2 process, see PDG 2014 booklet, eq. More...
 
static void check_energy (double mandelstam_s, double m_sum)
 Helper function for plab_from_s. More...
 
static void check_radicand (double mandelstam_s, double radicand)
 Helper function for plab_from_s. More...
 
double plab_from_s (double mandelstam_s, double mass)
 Convert Mandelstam-s to p_lab in a fixed-target collision. More...
 
double plab_from_s (double mandelstam_s)
 Convert Mandelstam-s to p_lab in a fixed-target collision. More...
 
double plab_from_s (double mandelstam_s, double m_projectile, double m_target)
 Convert Mandelstam-s to p_lab in a fixed-target collision. More...
 
double s_from_Ekin (double e_kin, double m_P, double m_T)
 Convert E_kin to Mandelstam-s for a fixed-target setup, with a projectile of mass m_P and a kinetic energy e_kin and a target of mass m_T at rest. More...
 
double s_from_plab (double plab, double m_P, double m_T)
 Convert p_lab to Mandelstam-s for a fixed-target setup, with a projectile of mass m_P and momentum plab and a target of mass m_T at rest. More...
 
void create_all_loggers (Configuration config)
 Called from main() right after the Configuration object is fully set up to create all logger objects (as defined by LogArea::AreaTuple) with the correct area names and log levels. More...
 
einhard::Loggerretrieve_logger_impl (int id)
 
template<typename LogAreaTag >
einhard::Loggerlogger ()
 
einhard::LogLevel default_loglevel ()
 
void set_default_loglevel (einhard::LogLevel level)
 Set the default log level (what will be returned from subsequent default_loglevel calls). More...
 
template<typename T >
FormattingHelper< T > format (const T &value, const char *unit, int width=-1, int precision=-1)
 Acts as a stream modifier for std::ostream to output an object with an optional suffix string and with a given field width and precision. More...
 
template<typename T >
std::vector< T > smooth (const std::vector< T > &x, const std::vector< T > &y, T span=2./3, size_t iter=3, T delta=0)
 Apply the LOWESS smoother (see the reference below) to the given data (x, y). More...
 
template<typename N >
bool almost_equal (const N x, const N y)
 Checks two numbers for relative approximate equality. More...
 
template<typename N >
bool almost_equal_physics (const N x, const N y)
 Same as smash::almost_equal, but for physical checks like energy-momentum conservation small_number is enough precision-wise. More...
 
std::unique_ptr< OutputInterfacecreate_oscar_output (const std::string &format, const std::string &content, const bf::path &path, const OutputParameters &out_par)
 
double xs_high_energy (double mandelstam_s, bool is_opposite_charge, double ma, double mb, double P, double R1, double R2)
 total hadronic cross sections at high energies parametrized in the 2016 PDG book(http://pdg.lbl.gov/2016/reviews/rpp2016-rev-cross-section-plots.pdf) More...
 
double pp_high_energy (double mandelstam_s)
 pp total cross section at high energies More...
 
double ppbar_high_energy (double mandelstam_s)
 ppbar total cross section at high energies More...
 
double np_high_energy (double mandelstam_s)
 np total cross section at high energies More...
 
double npbar_high_energy (double mandelstam_s)
 npbar total cross section at high energies More...
 
double piplusp_high_energy (double mandelstam_s)
 pi+p total cross section at high energies More...
 
double piminusp_high_energy (double mandelstam_s)
 pi-p total cross section at high energies More...
 
double xs_ppbar_annihilation (double mandelstam_s)
 parametrized cross-section for proton-antiproton annihilation used in the UrQMD model More...
 
double xs_string_hard (double mandelstam_s, double xs_0, double e_0, double lambda_pow)
 Utility function called by specific other parametrizations Parametrized hard scattering cross section (with partonic scattering) This parametrization is a direct fit to cross sections in PYTHIA See Sjostrand:1987su More...
 
double NN_string_hard (double mandelstam_s)
 nucleon-nucleon hard scattering cross section (with partonic scattering) More...
 
double Npi_string_hard (double mandelstam_s)
 nucleon-pion hard scattering cross section (with partonic scattering) More...
 
double pipi_string_hard (double mandelstam_s)
 pion-pion hard scattering cross section (with partonic scattering) More...
 
double piplusp_elastic_high_energy (double mandelstam_s, double m1, double m2)
 pi+p elactic cross section parametrization. More...
 
double piplusp_elastic_AQM (double mandelstam_s, double m1, double m2)
 An overload of piplusp_elastic_high_energy in which the very low part is replaced by a flat 5 mb cross section; used for meson-meson interactions. More...
 
double piplusp_elastic (double mandelstam_s)
 pi+p elastic cross section parametrization, PDG data. More...
 
double piplusp_sigmapluskplus_pdg (double mandelstam_s)
 pi+ p to Sigma+ K+ cross section parametrization, PDG data. More...
 
double piminusp_elastic (double mandelstam_s)
 pi-p elastic cross section parametrization Source: GiBUU:parametrizationBarMes_HighEnergy.f90 More...
 
double piminusp_lambdak0_pdg (double mandelstam_s)
 pi- p -> Lambda K0 cross section parametrization, PDG data. More...
 
double piminusp_sigmaminuskplus_pdg (double mandelstam_s)
 pi- p -> Sigma- K+ cross section parametrization, PDG data. More...
 
double piminusp_sigma0k0_res (double mandelstam_s)
 pi- p -> Sigma0 K0 cross section parametrization, resonance contribution. More...
 
double pp_elastic (double mandelstam_s)
 pp elastic cross section parametrization Source: Weil:2013mya, eq. More...
 
double pp_elastic_high_energy (double mandelstam_s, double m1, double m2)
 pp elastic cross section parametrization, with only the high energy part generalized to all energy regimes (used for AQM) Source: Weil:2013mya, eq. More...
 
double pp_total (double mandelstam_s)
 pp total cross section parametrization Sources: low-p: Cugnon:1996kh highest-p: Buss:2011mx More...
 
double np_elastic (double mandelstam_s)
 np elastic cross section parametrization Source: Weil:2013mya, eq. More...
 
double np_total (double mandelstam_s)
 np total cross section parametrization Sources: low-p: Cugnon:1996kh highest-p: Buss:2011mx More...
 
double ppbar_elastic (double mandelstam_s)
 ppbar elastic cross section parametrization Source: Bass:1998ca More...
 
double ppbar_total (double mandelstam_s)
 ppbar total cross section parametrization Source: Bass:1998ca More...
 
double deuteron_pion_elastic (double mandelstam_s)
 Deuteron pion elastic cross-section [mb] parametrized to fit pi-d elastic scattering data (the data collection was be obtained from SAID data base, gwdac.phys.gwu.edu) More...
 
double deuteron_nucleon_elastic (double mandelstam_s)
 Deuteron nucleon elastic cross-section [mb] parametrized by Oh:2009gx. More...
 
double kplusp_elastic_background (double mandelstam_s)
 K+ p elastic background cross section parametrization. More...
 
double kplusn_elastic_background (double mandelstam_s)
 K+ n elastic background cross section parametrization sigma(K+n->K+n) = sigma(K+n->K0p) = 0.5 * sigma(K+p->K+p) Source: Buss:2011mx, B.3.8. More...
 
double kplusn_k0p (double mandelstam_s)
 K+ n charge exchange cross section parametrization. More...
 
double kminusp_elastic_background (double mandelstam_s)
 K- p elastic background cross section parametrization Source: Buss:2011mx, B.3.9. More...
 
double kminusn_elastic_background (double mandelstam_s)
 K- n elastic background cross section parametrization Source: Buss:2011mx, B.3.9. More...
 
double k0p_elastic_background (double mandelstam_s)
 K0 p elastic background cross section parametrization Source: Buss:2011mx, B.3.9. More...
 
double k0n_elastic_background (double mandelstam_s)
 K0 n elastic background cross section parametrization Source: Buss:2011mx, B.3.9. More...
 
double kbar0p_elastic_background (double mandelstam_s)
 Kbar0 p elastic background cross section parametrization Source: Buss:2011mx, B.3.9. More...
 
double kbar0n_elastic_background (double mandelstam_s)
 Kbar0 n elastic background cross section parametrization Source: Buss:2011mx, B.3.9. More...
 
double kplusp_inelastic_background (double mandelstam_s)
 K+ p inelastic background cross section parametrization Source: Buss:2011mx, B.3.8. More...
 
double kplusn_inelastic_background (double mandelstam_s)
 K+ n inelastic background cross section parametrization Source: Buss:2011mx, B.3.8. More...
 
double kminusp_kbar0n (double mandelstam_s)
 K- p <-> Kbar0 n cross section parametrization. More...
 
double kminusp_piminussigmaplus (double sqrts)
 K- p <-> pi- Sigma+ cross section parametrization Taken from UrQMD (Graef:2014mra). More...
 
double kminusp_piplussigmaminus (double sqrts)
 K- p <-> pi+ Sigma- cross section parametrization Taken from UrQMD (Graef:2014mra). More...
 
double kminusp_pi0sigma0 (double sqrts)
 K- p <-> pi0 Sigma0 cross section parametrization Fit to Landolt-Börnstein instead of UrQMD values. More...
 
double kminusp_pi0lambda (double sqrts)
 K- p <-> pi0 Lambda cross section parametrization Fit to Landolt-Börnstein instead of UrQMD values. More...
 
double kminusn_piminussigma0 (double sqrts)
 K- n <-> pi- Sigma0 cross section parametrization Follow from the parametrization with the same strange product via isospin symmetry. More...
 
double kminusn_pi0sigmaminus (double sqrts)
 K- n <-> pi0 Sigma- cross section parametrization Follow from the parametrization with the same strange product via isospin symmetry. More...
 
double kminusn_piminuslambda (double sqrts)
 K- n <-> pi- Lambda cross section parametrization Follow from the parametrization with the same strange product via isospin symmetry. More...
 
double lambdalambda_ximinusp (double sqrts_sqrts0, double p_N, double p_lambda)
 Lambda Lambda <-> Xi- p cross section parametrization Two hyperon exchange, based on effective model by Feng Li, as in UrQMD (Graef:2014mra). More...
 
double lambdalambda_xi0n (double sqrts_sqrts0, double p_N, double p_lambda)
 Lambda Lambda <-> Xi0 n cross section parametrization Two hyperon exchange, based on effective model by Feng Li, as in UrQMD (Graef:2014mra). More...
 
double lambdasigmaplus_xi0p (double sqrts_sqrts0)
 Lambda Sigma+ <-> Xi0 p cross section parametrization Two hyperon exchange, based on effective model by Feng Li, as in UrQMD (Graef:2014mra). More...
 
double lambdasigmaminus_ximinusn (double sqrts_sqrts0)
 Lambda Sigma- <-> Xi- n cross section parametrization Two hyperon exchange, based on effective model by Feng Li, as in UrQMD (Graef:2014mra). More...
 
double lambdasigma0_ximinusp (double sqrts_sqrts0)
 Lambda Sigma0 <-> Xi- p cross section parametrization Two hyperon exchange, based on effective model by Feng Li, as in UrQMD (Graef:2014mra). More...
 
double lambdasigma0_xi0n (double sqrts_sqrts0)
 Lambda Sigma0 <-> Xi0 n cross section parametrization Two hyperon exchange, based on effective model by Feng Li, as in UrQMD (Graef:2014mra). More...
 
double sigma0sigma0_ximinusp (double sqrts_sqrts0)
 Sigma0 Sigma0 <-> Xi- p cross section parametrization Two hyperon exchange, based on effective model by Feng Li, as in UrQMD (Graef:2014mra). More...
 
double sigma0sigma0_xi0n (double sqrts_sqrts0)
 Sigma0 Sigma0 <-> Xi0 n cross section parametrization Two hyperon exchange, based on effective model by Feng Li, as in UrQMD (Graef:2014mra). More...
 
double sigmaplussigmaminus_xi0p (double sqrts_sqrts0)
 Sigma+ Sigma- <-> Xi0 p cross section parametrization Two hyperon exchange, based on effective model by Feng Li, as in UrQMD (Graef:2014mra). More...
 
double sigma0sigmaminus_ximinusn (double sqrts_sqrts0)
 Sigma0 Sigma- <-> Xi- n cross section parametrization Two hyperon exchange, based on effective model by Feng Li, as in UrQMD (Graef:2014mra). More...
 
double sigmaplussigmaminus_ximinusp (double sqrts_sqrts0)
 Sigma+ Sigma- <-> Xi- p cross section parametrization Two hyperon exchange, based on effective model by Feng Li, as in UrQMD (Graef:2014mra). More...
 
double sigmaplussigmaminus_xi0n (double sqrts_sqrts0)
 Sigma+ Sigma- <-> Xi0 n cross section parametrization Two hyperon exchange, based on effective model by Feng Li, as in UrQMD (Graef:2014mra). More...
 
std::ostream & operator<< (std::ostream &s, const ParticleData &p)
 Writes the state of the particle to the output stream. More...
 
std::ostream & operator<< (std::ostream &out, const ParticleList &particle_list)
 Writes a compact overview over the particles in the particle_list argument to the stream. More...
 
PrintParticleListDetailed detailed (const ParticleList &list)
 Request the ParticleList to be printed in full detail (i.e. More...
 
std::ostream & operator<< (std::ostream &out, const PrintParticleListDetailed &particle_list)
 Writes a detailed overview over the particles in the particle_list argument to the stream. More...
 
Parity operator- (Parity p)
 
Parity operator* (Parity x, Parity y)
 
void operator*= (Parity &x, Parity y)
 
std::istream & operator>> (std::istream &is, PdgCode &code)
 Sets the PDG code from the textual representation in the input stream. More...
 
std::ostream & operator<< (std::ostream &is, const PdgCode &code)
 Writes the textual representation of the PDG code to the output stream. More...
 
bool is_dilepton (const PdgCode pdg1, const PdgCode pdg2)
 
bool has_lepton_pair (const PdgCode pdg1, const PdgCode pdg2, const PdgCode pdg3)
 
constexpr uint64_t pack (int32_t x, int32_t y)
 Pack two int32_t into an uint64_t. More...
 
template<class T >
constexpr T pow_int (const T base, unsigned const exponent)
 Efficient template for calculating integer powers using squaring. More...
 
template<class T >
constexpr T square (const T base)
 Efficient template for calculating the square. More...
 
bool is_string_soft_process (ProcessType p)
 Check if a given process type is a soft string excitation. More...
 
std::ostream & operator<< (std::ostream &os, ProcessType process_type)
 Writes the textual representation of the process_type to the output stream os. More...
 
std::ostream & operator<< (std::ostream &os, const CollisionBranch &cbranch)
 Writes the textual representation of the Collision Branch cbranch to the output stream os. More...
 
double calc_hubble (double time, const ExpansionProperties &metric)
 Calculate the Hubble parameter \(H(t)\), which describes how large the expansion flow is. More...
 
double propagate_straight_line (Particles *particles, double to_time, const std::vector< FourVector > &beam_momentum)
 Propagates the positions of all particles on a straight line to a given moment. More...
 
void expand_space_time (Particles *particles, const ExperimentParameters &parameters, const ExpansionProperties &metric)
 Modifies positions and momentum of all particles to account for space-time deformation. More...
 
void update_momenta (Particles *particles, double dt, const Potentials &pot, RectangularLattice< std::pair< ThreeVector, ThreeVector >> *FB_lat, RectangularLattice< std::pair< ThreeVector, ThreeVector >> *FI3_lat)
 Updates the momenta of all particles at the current time step according to the equations of motion: More...
 
std::string trim (const std::string &s)
 Strip leading and trailing whitespaces. More...
 
void remove_substr (std::string &s, const std::string &p)
 Remove all instances of a substring p in a string s. More...
 
void isoclean (std::string &s)
 Remove ⁺, ⁻, ⁰ from string. More...
 
std::vector< std::string > split (const std::string &s, char delim)
 Split string by delimiter. More...
 
double spec_func_integrand_1res (double resonance_mass, double sqrts, double stable_mass, const ParticleType &type)
 Spectral function integrand for GSL integration, with one resonance in the final state (the second particle is stable). More...
 
double spec_func_integrand_2res (double sqrts, double res_mass_1, double res_mass_2, const ParticleType &t1, const ParticleType &t2)
 Spectral function integrand for GSL integration, with two resonances in the final state. More...
 
std::unique_ptr< Tabulationspectral_integral_semistable (Integrator &integrate, const ParticleType &resonance, const ParticleType &stable, double range)
 Create a table for the spectral integral of a resonance and a stable particle. More...
 
std::unique_ptr< Tabulationspectral_integral_unstable (Integrator2dCuhre &integrate2d, const ParticleType &res1, const ParticleType &res2, double range)
 Create a table for the spectral integral of two resonances. More...
 
std::ostream & operator<< (std::ostream &, const ThreeVector &)
 Writes the three components of the vector to the output stream. More...
 
ThreeVector operator+ (ThreeVector a, const ThreeVector &b)
 
ThreeVector operator- (ThreeVector a, const ThreeVector &b)
 
ThreeVector operator* (ThreeVector a, const double &b)
 multiply a three-vector by constant factor \( b \vec{a} \). More...
 
ThreeVector operator* (const double &a, ThreeVector b)
 multiply a three-vector by constant factor \( a \vec{b} \). More...
 
double operator* (ThreeVector a, const ThreeVector &b)
 
ThreeVector operator/ (ThreeVector a, const double &b)
 divide a three-vector by constant factor \( \vec{a} / b \). More...
 
std::ostream & operator<< (std::ostream &out, const TimeStampCounter &tsc)
 
std::ostream & operator<< (std::ostream &out, const BoxModus &m)
 
static double isospin_clebsch_gordan_2to1 (const ParticleType &p_a, const ParticleType &p_b, const int I_tot, const int I_z)
 Calculate isospin Clebsch-Gordan coefficient for two particles p_a and p_b coupling to a total isospin. More...
 
std::ostream & operator<< (std::ostream &out, const ColliderModus &m)
 
static double detailed_balance_factor_stable (double s, const ParticleType &a, const ParticleType &b, const ParticleType &c, const ParticleType &d)
 Helper function: Calculate the detailed balance factor R such that

\[ R = \sigma(AB \to CD) / \sigma(CD \to AB) \]

where \( A, B, C, D \) are stable. More...

 
static double detailed_balance_factor_RK (double sqrts, double pcm, const ParticleType &a, const ParticleType &b, const ParticleType &c, const ParticleType &d)
 Helper function: Calculate the detailed balance factor R such that

\[ R = \sigma(AB \to CD) / \sigma(CD \to AB) \]

where \(A\) is unstable, \(B\) is a kaon and \(C, D\) are stable. More...

 
static double detailed_balance_factor_RR (double sqrts, double pcm, const ParticleType &a, const ParticleType &b, const ParticleType &c, const ParticleType &d)
 Helper function: Calculate the detailed balance factor R such that

\[ R = \sigma(AB \to CD) / \sigma(CD \to AB) \]

where \(A\) and \(B\) are unstable, and \(C\) and \(D\) are stable. More...

 
static void append_list (CollisionBranchList &main_list, CollisionBranchList in_list, double weight=1.)
 Helper function: Append a list of processes to another (main) list of processes. More...
 
static double sum_xs_of (CollisionBranchList &list)
 Helper function: Sum all cross sections of the given process list. More...
 
static int min_angular_momentum (int s0, int s1, int s2)
 
static int min_angular_momentum (int s0, int s1, int s2, int s3)
 
static double integrand_rho_Manley_1res (double sqrts, double mass, double stable_mass, ParticleTypePtr type, int L)
 
static double integrand_rho_Manley_2res (double sqrts, double m1, double m2, ParticleTypePtr t1, ParticleTypePtr t2, int L)
 
static ParticleTypePtrList & arrange_particles (ParticleTypePtrList &part_types)
 Rearrange the particle list such that the first particle is the stable one. More...
 
static ParticleTypePtrList sort_particles (ParticleTypePtrList part_types)
 sort the particle list More...
 
template<typename T >
std::tuple< double, ThreeVector, ThreeVector, ThreeVectorrho_eckart_impl (const ThreeVector &r, const T &plist, const DensityParameters &par, DensityType dens_type, bool compute_gradient)
 Calculates Eckart rest frame density and optionally the gradient of the density in an arbitary frame, the curl of the 3-currrent and the time derivative of the 3-current. More...
 
static IsoParticleTypetry_find_private (const std::string &name)
 Helper function for IsoParticleType::try_find and friends. More...
 
static std::string multiplet_name (std::string name)
 Construct the name-string for an isospin multiplet from the given name-string for the particle. More...
 
std::ostream & operator<< (std::ostream &out, const ListModus &m)
 
template<int index, int stop = 0>
constexpr std::enable_if<(index==stop), int >::type find_longest_logger_name ()
 
template<int index, int stop = 0, int mid = (index + stop) / 2>
constexpr std::enable_if<(index > stop), int >::type find_longest_logger_name ()
 
template<std::size_t index, int >
std::enable_if<(index==0)>::type create_all_loggers_impl (Configuration &)
 
template<std::size_t index, int longest_name = find_longest_logger_name<index - 1>()>
std::enable_if<(index !=0)>::type create_all_loggers_impl (Configuration &config)
 
std::ostream & operator<< (std::ostream &out, const Nucleus &n)
 
static double piplusp_elastic_pdg (double mandelstam_s)
 
static double piminusp_elastic_pdg (double mandelstam_s)
 
static double kminusp_elastic_pdg (double mandelstam_s)
 
static void initialize (std::unordered_map< std::pair< uint64_t, uint64_t >, double, pair_hash > &ratios)
 Calculate and store isospin ratios for K N -> K Delta reactions. More...
 
std::ostream & operator<< (std::ostream &out, const Particles &particles)
 
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. More...
 
static std::string chargestr (int charge)
 Construct a charge string, given the charge as integer. More...
 
std::ostream & operator<< (std::ostream &out, const ParticleType &type)
 
static double Cugnon_bpp (double plab)
 Computes the B coefficients from the Cugnon parametrization of the angular distribution in elastic pp scattering. More...
 
static double Cugnon_bnp (double plab)
 Computes the B coefficients from the Cugnon parametrization of the angular distribution in elastic np scattering. More...
 
static void deduplicate (std::vector< FinalStateCrossSection > &final_state_xs)
 Deduplicate the final-state cross sections by summing. More...
 
std::ostream & operator<< (std::ostream &out, const SphereModus &m)
 
template<typename Out >
void split (const std::string &s, char delim, Out result)
 Split string by delimiter. More...
 

Variables

constexpr double hbarc = 0.197327053
 GeV <-> fm conversion factor. More...
 
constexpr double fm2_mb = 0.1
 mb <-> fm^2 conversion factor. More...
 
constexpr double gev2_mb = hbarc * hbarc / fm2_mb
 GeV^-2 <-> mb conversion factor. More...
 
constexpr double really_small = 1.0e-6
 Numerical error tolerance. More...
 
constexpr double twopi = 2. * M_PI
 \( 2\pi \). More...
 
constexpr double nuclear_density = 0.168
 Ground state density of symmetric nuclear matter [fm^-3]. More...
 
constexpr double small_number = 1.0e-4
 Physical error tolerance. More...
 
constexpr double nucleon_mass = 0.938
 Nucleon mass in GeV. More...
 
constexpr double pion_mass = 0.138
 Pion mass in GeV. More...
 
constexpr double kaon_mass = 0.494
 Kaon mass in GeV. More...
 
constexpr double omega_mass = 0.783
 omega mass in GeV. More...
 
constexpr double a1_mass = 1.26
 a1 mass in GeV. More...
 
constexpr double delta_mass = 1.232
 Delta mass in GeV. More...
 
constexpr double deuteron_mass = 1.8756
 Deuteron mass in GeV. More...
 
constexpr double fine_structure = 7.2973525698e-3
 Fine-struture constant, approximately 1/137. More...
 
constexpr double maximum_cross_section = 200.
 The maximal cross section (in mb) for which it is guaranteed that all collisions with this cross section will be found. More...
 
constexpr int maximum_rndm_seed_in_pythia = 900000000
 The maximum value of the random seed used in PYTHIA. More...
 
constexpr double minimum_sqrts_pythia_can_handle = 10.0
 Energy in GeV, below which hard reactions via pythia are impossible. More...
 
constexpr std::uint32_t ID_PROCESS_PHOTON
 Process ID for any photon process. More...
 
KaonNucleonRatios kaon_nucleon_ratios
 
const std::initializer_list< double > KMINUSP_ELASTIC_P_LAB
 PDG data on K- p elastic cross section: momentum in lab frame. More...
 
const std::initializer_list< double > KMINUSP_ELASTIC_SIG
 PDG data on K- p elastic cross section: cross section. More...
 
static std::unique_ptr< InterpolateDataLinear< double > > kminusp_elastic_interpolation = nullptr
 An interpolation that gets lazily filled using the KMINUSP_ELASTIC data. More...
 
const std::initializer_list< double > KMINUSP_TOT_PLAB
 PDG data on K- p total cross section: momentum in lab frame. More...
 
const std::initializer_list< double > KMINUSP_TOT_SIG
 PDG data on K- p total cross section: cross section. More...
 
const std::initializer_list< double > KMINUSP_RES_SQRTS
 Center-of-mass energy list for K̅⁻ N⁺ More...
 
const std::initializer_list< double > KMINUSP_RES_SIG
 Elastic K̅⁻ N⁺ cross section contributions from decays. More...
 
static std::unique_ptr< InterpolateDataSplinekminusp_elastic_res_interpolation = nullptr
 An interpolation that gets lazily filled using the KMINUSP_RES data. More...
 
const std::initializer_list< double > KPLUSN_TOT_PLAB
 PDG data on K+ n total cross section: momentum in lab frame. More...
 
const std::initializer_list< double > KPLUSN_TOT_SIG
 PDG data on K+ n total cross section: cross section. More...
 
static std::unique_ptr< InterpolateDataLinear< double > > kplusn_total_interpolation = nullptr
 An interpolation that gets lazily filled using the KPLUSN_TOT data. More...
 
const std::initializer_list< double > KPLUSP_TOT_PLAB
 PDG data on K+ p total cross section: momentum in lab frame. More...
 
const std::initializer_list< double > KPLUSP_TOT_SIG
 PDG data on K+ p total cross section: cross section. More...
 
static std::unique_ptr< InterpolateDataLinear< double > > kplusp_total_interpolation = nullptr
 An interpolation that gets lazily filled using the KPLUSP_TOT data. More...
 
const std::initializer_list< double > PIMINUSP_ELASTIC_P_LAB
 PDG data on pi- p elastic cross section: momentum in lab frame. More...
 
const std::initializer_list< double > PIMINUSP_ELASTIC_SIG
 PDG data on pi- p elastic cross section: cross section. More...
 
static std::unique_ptr< InterpolateDataLinear< double > > piminusp_elastic_interpolation = nullptr
 An interpolation that gets lazily filled using the PIMINUSP_ELASTIC data. More...
 
const std::initializer_list< double > PIMINUSP_LAMBDAK0_P_LAB
 PDG data on pi- p to Lambda K0 cross section: momentum in lab frame. More...
 
const std::initializer_list< double > PIMINUSP_LAMBDAK0_SIG
 PDG data on pi- p to Lambda K0 cross section: cross section. More...
 
static std::unique_ptr< InterpolateDataLinear< double > > piminusp_lambdak0_interpolation = nullptr
 An interpolation that gets lazily filled using the PIMINUSP_LAMBDAK0 data. More...
 
const std::initializer_list< double > PIMINUSP_SIGMAMINUSKPLUS_P_LAB
 PDG data on pi- p to Sigma- K+ cross section: momentum in lab frame. More...
 
const std::initializer_list< double > PIMINUSP_SIGMAMINUSKPLUS_SIG
 PDG data on pi- p to Sigma- K+ cross section: cross section. More...
 
static std::unique_ptr< InterpolateDataLinear< double > > piminusp_sigmaminuskplus_interpolation = nullptr
 An interpolation that gets lazily filled using the PIMINUSP_SIGMAMINUSKPLUS data. More...
 
const std::initializer_list< double > PIMINUSP_SIGMA0K0_RES_SQRTS
 pi- p to Sigma0 K0 cross section: square root s More...
 
const std::initializer_list< double > PIMINUSP_SIGMA0K0_RES_SIG
 pi- p to Sigma0 K0 cross section: cross section More...
 
static std::unique_ptr< InterpolateDataLinear< double > > piminusp_sigma0k0_interpolation = nullptr
 An interpolation that gets lazily filled using the PIMINUSP_SIGMA0K0_RES data. More...
 
const std::initializer_list< double > PIMINUSP_RES_SQRTS
 Center-of-mass energy list for π⁻ N⁺ More...
 
const std::initializer_list< double > PIMINUSP_RES_SIG
 Elastic π⁻ N⁺ cross section contributions from decays. More...
 
static std::unique_ptr< InterpolateDataSplinepiminusp_elastic_res_interpolation = nullptr
 An interpolation that gets lazily filled using the PIMINUSP_RES data. More...
 
const std::initializer_list< double > PIPLUSP_ELASTIC_P_LAB
 PDG data on pi+ p elastic cross section: momentum in lab frame. More...
 
const std::initializer_list< double > PIPLUSP_ELASTIC_SIG
 PDG data on pi+ p elastic cross section: cross section. More...
 
static std::unique_ptr< InterpolateDataLinear< double > > piplusp_elastic_interpolation = nullptr
 An interpolation that gets lazily filled using the PIPLUSP_ELASTIC_SIG data. More...
 
const std::initializer_list< double > PIPLUSP_SIGMAPLUSKPLUS_P_LAB
 PDG data on pi+ p to Sigma+ K+ cross section: momentum in lab frame. More...
 
const std::initializer_list< double > PIPLUSP_SIGMAPLUSKPLUS_SIG
 PDG data on pi+ p to Sigma+ K+ section: cross section. More...
 
static std::unique_ptr< InterpolateDataLinear< double > > piplusp_sigmapluskplus_interpolation = nullptr
 An interpolation that gets lazily filled using the PIPLUSP_SIGMAPLUSKPLUS_SIG data. More...
 
const std::initializer_list< double > PIPLUSP_RES_SQRTS
 Center-of-mass energy list for π⁺ N⁺ More...
 
const std::initializer_list< double > PIPLUSP_RES_SIG
 Elastic π⁺ N⁺ cross section contributions from decays. More...
 
static std::unique_ptr< InterpolateDataSplinepiplusp_elastic_res_interpolation = nullptr
 A null interpolation that gets filled using the PIPLUSP_RES data. More...
 
RectangularLattice< FourVector > * UB_lat_pointer = nullptr
 Pointer to the skyrme potential on the lattice. More...
 
RectangularLattice< FourVector > * UI3_lat_pointer = nullptr
 Pointer to the symmmetry potential on the lattice. More...
 
Potentialspot_pointer = nullptr
 Pointer to a Potential class. More...
 
std::vector< DecayTypePtr > * all_decay_types = nullptr
 Global pointer to the decay types list. More...
 
constexpr int num_tab_pts = 200
 
static Integrator integrate
 
static Integrator2dCuhre integrate2d (1E7)
 
static IsoParticleTypeList iso_type_list
 
static Integrator integrate
 
static Integrator2dCuhre integrate2d
 
static einhard::LogLevel global_default_loglevel = einhard::ALL
 The default logging level is ALL. More...
 
static std::array< einhard::Logger<>, std::tuple_size< LogArea::AreaTuple >::value > global_logger_collection
 An array that stores all pre-configured Logger objects. More...
 

Typedef Documentation

◆ SystemTimePoint

using smash::SystemTimePoint = typedef std::chrono::time_point<std::chrono::system_clock>

Type (alias) that is used to store the current time.

Definition at line 22 of file chrono.h.

◆ SystemClock

using smash::SystemClock = typedef std::chrono::system_clock

Type (alias) used to obtain the current time via SystemClock:Now().

Definition at line 25 of file chrono.h.

◆ SystemTimeSpan

using smash::SystemTimeSpan = typedef SystemClock::duration

The time duration type (alias) used for measuring run times.

Definition at line 28 of file chrono.h.

◆ DensityLattice

Conveniency typedef for lattice of density.

Definition at line 371 of file density.h.

◆ FilePtr

using smash::FilePtr = typedef std::unique_ptr<std::FILE, FileDeleter>

A RAII type to replace std::FILE *.

This is an alias type for std::unique_ptr to automatically free the std::FILE resource after the last reference goes out of scope. It is important to use a custom deleter type, and therefore SMASH code should never use std::unique_ptr directly with std::FILE.

Definition at line 63 of file file.h.

◆ Permutation

using smash::Permutation = typedef std::vector<size_t>

Represent a permutation.

Definition at line 104 of file interpolation.h.

Enumeration Type Documentation

◆ ComputationMethod

Calculation method for the cross sections.

It has only one member at the moment. In the future there will be more options.

Enumerator
Analytic 

Definition at line 21 of file crosssectionsphoton.h.

◆ DensityType

enum smash::DensityType
strong

Allows to choose which kind of density to calculate.

The baryon density is necessary for the Skyrme potential. For the symmetry potential one needs to know the isospin density.

Enumerator
None 
Hadron 
Baryon 
BaryonicIsospin 
Pion 

Definition at line 34 of file density.h.

◆ HadronClass

enum smash::HadronClass
strong

Specifier to classify the different hadron species according to their quantum numbers.

Enumerator
Baryon 

All baryons.

Antibaryon 

All anti-baryons.

PositiveSMeson 

Mesons with strangeness S > 0.

NegativeSMeson 

Mesons with strangeness S < 0.

PositiveQZeroSMeson 

Non-strange mesons (S = 0) with electric cherge Q > 0.

NegativeQZeroSMeson 

Non-strange mesons (S = 0) with electric cherge Q < 0.

ZeroQZeroSMeson 

Neutral non-strange mesons.

Definition at line 143 of file grandcan_thermalizer.h.

143  {
145  Baryon = 0,
147  Antibaryon = 1,
149  PositiveSMeson = 2,
151  NegativeSMeson = 3,
157  ZeroQZeroSMeson = 6,
158 };
Non-strange mesons (S = 0) with electric cherge Q < 0.
Mesons with strangeness S < 0.
Neutral non-strange mesons.
Non-strange mesons (S = 0) with electric cherge Q > 0.
Mesons with strangeness S > 0.

◆ GridOptions

enum smash::GridOptions : char
strong

Identifies the mode of the Grid.

Enumerator
Normal 

Without ghost cells.

PeriodicBoundaries 

With ghost cells for periodic boundaries.

Definition at line 25 of file grid.h.

25  : char {
27  Normal = 0,
30 };
With ghost cells for periodic boundaries.
Without ghost cells.

◆ CellSizeStrategy

enum smash::CellSizeStrategy : char
strong

Indentifies the strategy of determining the cell size.

Enumerator
Optimal 

Look for optimal cell size.

Largest 

Make cells as large as possible.

This means a single cell for normal boundary conditions and 8 cells for periodic boundary conditions.

Definition at line 33 of file grid.h.

33  : char {
35  Optimal,
36 
43  Largest
44 };
Look for optimal cell size.
Make cells as large as possible.

◆ LatticeUpdate

enum smash::LatticeUpdate
strong

Enumerator option for lattice updates.

Updating the lattice is a costly operation and should be performed only if necessary. Possible needs are:

  • output: then it is enough to update lattice just before output,
  • physics: update every time step is unavoidable.
Enumerator
AtOutput 
EveryTimestep 
EveryFixedInterval 

Definition at line 35 of file lattice.h.

◆ Parity

enum smash::Parity
strong

Represent the parity of a particle type.

Enumerator
Pos 

Positive parity.

Neg 

Negative parity.

Definition at line 24 of file particletype.h.

24  {
26  Pos,
28  Neg
29 };
Negative parity.
Positive parity.

◆ ProcessType

enum smash::ProcessType
strong

Process Types are used to identify the type of the process.

Corresponding integer numbers are given explicitly, because they appear in the output.

Enumerator
None 

nothing

Elastic 

elastic scattering: particles remain the same, only momenta change

TwoToOne 

resonance formation (2->1)

TwoToTwo 

2->2 inelastic scattering

Decay 

resonance decays

Wall 

box wall crossing

Thermalization 

forced thermalization, many particles are replaced by a thermalized ensemble

StringSoftSingleDiffractiveAX 

(41-45) soft string excitations.

Here "soft" means that the process does not involve quark or gluon scattering. A string is formed by quark and antiquark, or quark and diquark, in its ends. Then this string decays. Depending on which quark and anti- (or di-)quarks are selected for string formation, the process has one of the following types.single diffractive AB->AX. Both quark and anti-/di-quark taken from B.

StringSoftSingleDiffractiveXB 

single diffractive AB->XB.

Both quark and anti-/di-quark taken from A. It makes sense to distinguish it from AB->AX, because A and B can be particles of different types, for example, a pion and a proton. It matters then, whether the pion creates a string or the proton.

StringSoftDoubleDiffractive 

double diffractive. Two strings are formed, one from A and one from B.

StringSoftAnnihilation 

a special case of baryon-antibaryon annihilation.

One pair qqbar annihilates immediately and then two strings are formed.

StringSoftNonDiffractive 

non-diffractive. Two strings are formed both have ends in A and B.

StringHard 

hard string process involving 2->2 QCD process by PYTHIA.

Here quarks do not simply form a string. They actually scatter on parton level first.

Definition at line 25 of file processbranch.h.

25  {
27  None = 0,
29  Elastic = 1,
31  TwoToOne = 2,
33  TwoToTwo = 3,
35  Decay = 5,
37  Wall = 6,
42  Thermalization = 7,
73  StringHard = 46
74 };
resonance decays
double diffractive. Two strings are formed, one from A and one from B.
a special case of baryon-antibaryon annihilation.
2->2 inelastic scattering
forced thermalization, many particles are replaced by a thermalized ensemble
hard string process involving 2->2 QCD process by PYTHIA.
box wall crossing
resonance formation (2->1)
non-diffractive. Two strings are formed both have ends in A and B.
(41-45) soft string excitations.

◆ Extrapolation

enum smash::Extrapolation
strong

The kind of extrapolation used by the tabulation.

Enumerator
Zero 
Const 
Linear 

Definition at line 24 of file tabulation.h.

◆ NeedsToWrap

enum smash::NeedsToWrap
strong

The options determining what to do if a particle flies out of the grids PlusLength: Used if a periodic boundary condition is applied and a particle passes through the lower bound of the grid.

No: Used if the boundary condition is not periodic. MinusLength: Used if a periodic boundary condition is applied and a particle passes through the upper bound of the grid.

Enumerator
PlusLength 
No 
MinusLength 

Definition at line 309 of file grid.cc.

Function Documentation

◆ operator+=()

std::vector<ActionPtr>& smash::operator+= ( std::vector< ActionPtr > &  lhs,
std::vector< ActionPtr > &&  rhs 
)
inline

Append vector of action pointers.

Parameters
[in]lhsvector of action pointers that is appended to
[in]rhsvector of action pointers that is appended
Returns
vector of action pointers containing lhs and rhs

Definition at line 442 of file action.h.

443  {
444  if (lhs.size() == 0) {
445  lhs = std::move(rhs);
446  } else {
447  lhs.insert(lhs.end(), std::make_move_iterator(rhs.begin()),
448  std::make_move_iterator(rhs.end()));
449  }
450  return lhs;
451 }

◆ enforce_periodic_boundaries()

template<typename Iterator >
static bool smash::enforce_periodic_boundaries ( Iterator  begin,
const Iterator &  end,
typename std::iterator_traits< Iterator >::value_type  length 
)
static

Enforces periodic boundaries on the given collection of values.

The values in an arbitrary container, starting from begin and ending at end, will be checked. If the value is less than 0, length will be added to it. If the value is greater than or equal to length, length will be subtracted from it.

The implementation therefore assumes that the values are at most one length away from the 0 to length range.

Template Parameters
IteratorType of the iterator.
Parameters
beginIterator pointing to the first value to check.
endEnd iterator.
lengthThe length of the valid interval.
Returns
Whether a correction was done.

Definition at line 53 of file algorithms.h.

55  {
56  bool had_to_wrap = false;
57  for (; begin != end; ++begin) {
58  auto &x = *begin;
59  if (x < 0) {
60  had_to_wrap = true;
61  x += length;
62  } else if (x >= length) {
63  had_to_wrap = true;
64  x -= length;
65  }
66  }
67  return had_to_wrap;
68 }
Here is the caller graph for this function:

◆ all_of()

template<typename Container , typename UnaryPredicate >
bool smash::all_of ( Container &&  c,
UnaryPredicate &&  p 
)
inline

Convenience wrapper for std::all_of that operates on a complete container.

Template Parameters
ContainerType of the container.
UnaryPredicateType of the predicate.
Parameters
cA container of elements to examine.
pUnary predicate.
Returns
Whether all elements in c return true when passed to p.

Definition at line 80 of file algorithms.h.

80  {
81  return std::all_of(std::begin(c), std::end(c),
82  std::forward<UnaryPredicate>(p));
83 }
bool all_of(Container &&c, UnaryPredicate &&p)
Convenience wrapper for std::all_of that operates on a complete container.
Definition: algorithms.h:80
constexpr int p
Proton.
Here is the caller graph for this function:

◆ for_each()

template<typename Container , typename UnaryFunction >
UnaryFunction smash::for_each ( Container &&  c,
UnaryFunction &&  f 
)
inline

Convenience wrapper for std::for_each that operates on a complete container.

Template Parameters
ContainerType of the container.
UnaryFunctionType of the function.
Parameters
cA container of elements on which to perform the function f
fA function to apply on all elements of the container c
Returns
The function that was applied to all elements.

Definition at line 96 of file algorithms.h.

96  {
97  return std::for_each(std::begin(c), std::end(c),
98  std::forward<UnaryFunction>(f));
99 }
UnaryFunction for_each(Container &&c, UnaryFunction &&f)
Convenience wrapper for std::for_each that operates on a complete container.
Definition: algorithms.h:96
Here is the caller graph for this function:

◆ dedup_avg()

template<typename T >
std::pair<std::vector<T>, std::vector<T> > smash::dedup_avg ( const std::vector< T > &  x,
const std::vector< T > &  y 
)

Remove duplicates from data (x, y) by averaging y.

Assumes (x, y) is sorted.

Template Parameters
TType of the values (should be floating point).
Parameters
xx-values.
yy-values.
Returns
New x and y values as a pair of vectors.

Definition at line 65 of file average.h.

66  {
67  if (x.size() != y.size()) {
68  std::stringstream ss;
69  ss << "x and y have to be of same size: " << x.size() << " != " << y.size();
70  throw std::runtime_error(ss.str());
71  }
72  if (x.size() < 1) {
73  throw std::runtime_error("x cannot be empty.");
74  }
75  std::vector<T> new_x;
76  new_x.reserve(x.size());
77  std::vector<T> new_y;
78  new_y.reserve(y.size());
79  Average<T> avg;
80  T prev_x = x[0];
81  for (size_t i = 0; i < x.size(); i++) {
82  if (x[i] == prev_x) {
83  avg.add(y[i]);
84  } else {
85  assert(i != 0);
86  new_x.push_back(x[i - 1]);
87  new_y.push_back(avg.average());
88  avg.clear();
89  avg.add(y[i]);
90  prev_x = x[i];
91  }
92  }
93  new_x.push_back(x.back());
94  new_y.push_back(avg.average());
95  return std::make_pair(std::move(new_x), std::move(new_y));
96 }
Here is the call graph for this function:
Here is the caller graph for this function:

◆ clebsch_gordan()

double smash::clebsch_gordan ( const int  j_a,
const int  j_b,
const int  j_c,
const int  m_a,
const int  m_b,
const int  m_c 
)

Calculate Clebsch-Gordan coefficient \((-1)^{j_a - j_b + m_c} \sqrt{(2 j_c + 1)} \cdot [Wigner 3J symbol] \).

Parameters
[in]j_aspin of first particle
[in]j_bspin of second particle
[in]j_cspin of resonance
[in]m_aisospin of first particle
[in]m_bisospin of second particle
[in]m_cisospin of resonance
Returns
Clebsch-Gordan coefficient for coupling of particles a, b and c

Note that the calculation assumes that the spin/isospin values (j/m) have been multiplied by two (in order to be integer).

Definition at line 17 of file clebschgordan.cc.

18  {
19  const double wigner_3j = gsl_sf_coupling_3j(j_a, j_b, j_c, m_a, m_b, -m_c);
20  if (std::abs(wigner_3j) < really_small) {
21  return 0.;
22  }
23  assert((j_a - j_b + m_c) % 2 == 0);
24  const int j = (j_a - j_b + m_c) / 2;
25  double result = std::sqrt(j_c + 1) * wigner_3j;
26  result *= (j % 2 == 0) * 2 - 1; // == (-1)**j
27 
28 #ifndef NDEBUG
29  const auto &log = logger<LogArea::Resonances>();
30  log.debug("CG: ", result, " I1: ", j_a, " I2: ", j_b, " IR: ", j_c,
31  " iz1: ", m_a, " iz2: ", m_b, " izR: ", m_c);
32 #endif
33 
34  return result;
35 }
constexpr double really_small
Numerical error tolerance.
Definition: constants.h:34
Here is the caller graph for this function:

◆ isospin_clebsch_gordan_sqr_2to1()

double smash::isospin_clebsch_gordan_sqr_2to1 ( const ParticleType p_a,
const ParticleType p_b,
const ParticleType Res 
)
inline

Calculate the squared isospin Clebsch-Gordan coefficient for two particles p_a and p_b coupling to a resonance Res.

Parameters
[in]p_aInformation on spin/isospin of particle a
[in]p_bInformation on spin/isospin of particle b
[in]ResInformation on spin/isospin of resonance
Returns
Clebsch-Gordan squared for 2->1 reaction

Definition at line 42 of file clebschgordan.h.

44  {
45  const double cg =
46  clebsch_gordan(p_a.isospin(), p_b.isospin(), Res.isospin(),
47  p_a.isospin3(), p_b.isospin3(), Res.isospin3());
48  return cg * cg;
49 }
double clebsch_gordan(const int j_a, const int j_b, const int j_c, const int m_a, const int m_b, const int m_c)
Calculate Clebsch-Gordan coefficient .
Here is the call graph for this function:
Here is the caller graph for this function:

◆ isospin_clebsch_gordan_sqr_3to1()

double smash::isospin_clebsch_gordan_sqr_3to1 ( const ParticleType p_a,
const ParticleType p_b,
const ParticleType p_c,
const ParticleType Res 
)

Calculate the squared isospin Clebsch-Gordan coefficient for three particles p_a, p_b and p_c coupling to a resonance Res.

Parameters
[in]p_aInformation on spin/isospin of particle a
[in]p_bInformation on spin/isospin of particle b
[in]p_cInformation on spin/isospin of particle c
[in]ResInformation on spin/isospin of resonance
Returns
Clebsch-Gordan squared for 3->1 reaction

Definition at line 52 of file clebschgordan.cc.

55  {
56  // Calculate allowed isospin range for 3->1 reaction I_ab
57  const auto min_I_ab = std::abs(p_a.isospin() - p_b.isospin());
58  const auto max_I_ab = p_a.isospin() + p_b.isospin();
59  std::vector<int> possible_I_ab(max_I_ab - min_I_ab + 1);
60  std::iota(possible_I_ab.begin(), possible_I_ab.end(), min_I_ab);
61  std::vector<int> allowed_I_ab;
62  allowed_I_ab.reserve(possible_I_ab.size());
63  for (const auto Iab : possible_I_ab) {
64  const auto min_I = std::abs(Iab - p_c.isospin());
65  const auto max_I = Iab + p_c.isospin();
66  if (min_I <= Res.isospin() && Res.isospin() <= max_I) {
67  allowed_I_ab.push_back(Iab);
68  }
69  }
70  if (allowed_I_ab.size() != 1) {
71  throw std::runtime_error(
72  "The coupled 3-body isospin state is not uniquely defined for " +
73  Res.name() + " -> " + p_a.name() + " " + p_b.name() + " " + p_c.name());
74  }
75  const auto I_ab = allowed_I_ab[0];
76 
77  const int I_abz = p_a.isospin3() + p_b.isospin3();
78  const double cg = clebsch_gordan(I_ab, p_c.isospin(), Res.isospin(), I_abz,
79  p_c.isospin3(), Res.isospin3()) *
80  clebsch_gordan(p_a.isospin(), p_b.isospin(), I_ab,
81  p_a.isospin3(), p_b.isospin3(), I_abz);
82  return cg * cg;
83 }
double clebsch_gordan(const int j_a, const int j_b, const int j_c, const int m_a, const int m_b, const int m_c)
Calculate Clebsch-Gordan coefficient .
Here is the call graph for this function:
Here is the caller graph for this function:

◆ isospin_clebsch_gordan_sqr_2to2()

double smash::isospin_clebsch_gordan_sqr_2to2 ( const ParticleType p_a,
const ParticleType p_b,
const ParticleType p_c,
const ParticleType p_d,
const int  I = -1 
)

Calculate the squared isospin Clebsch-Gordan coefficient for a 2-to-2 reaction A + B -> C + D.

If a total isospin value I is given (doubled in order to be integer), then only contributions with that total isospin will be counted.

Parameters
[in]p_aInformation on spin/isospin of particle a
[in]p_bInformation on spin/isospin of particle b
[in]p_cInformation on spin/isospin of particle c
[in]p_dInformation on spin/isospin of particle d
[in]Itotal isospin of the reaction
Returns
Clebsch-Gordan squared for 2->2 reaction

Definition at line 85 of file clebschgordan.cc.

88  {
89  const int I_z = p_a.isospin3() + p_b.isospin3();
90 
91  /* Loop over total isospin in allowed range. */
92  double isospin_factor = 0.;
93  for (const int I_tot : I_tot_range(p_a, p_b, p_c, p_d)) {
94  if (I < 0 || I_tot == I) {
95  const double cg_in = isospin_clebsch_gordan_2to1(p_a, p_b, I_tot, I_z);
96  const double cg_out = isospin_clebsch_gordan_2to1(p_c, p_d, I_tot, I_z);
97  isospin_factor = isospin_factor + cg_in * cg_in * cg_out * cg_out;
98  }
99  }
100  return isospin_factor;
101 }
static double isospin_clebsch_gordan_2to1(const ParticleType &p_a, const ParticleType &p_b, const int I_tot, const int I_z)
Calculate isospin Clebsch-Gordan coefficient for two particles p_a and p_b coupling to a total isospi...
Here is the call graph for this function:
Here is the caller graph for this function:

◆ make_unique()

template<typename T , typename... Args>
std::unique_ptr<T> smash::make_unique ( Args &&...  args)
inline

Definition for make_unique Is in C++14's standard library; necessary for older compilers.

See also
http://en.cppreference.com/w/cpp/memory/unique_ptr/make_unique

Definition at line 25 of file cxx14compat.h.

25  {
26  return std::unique_ptr<T>{new T{std::forward<Args>(args)...}};
27 }
Here is the caller graph for this function:

◆ operator<<() [1/11]

std::ostream & smash::operator<< ( std::ostream &  os,
DensityType  dt 
)

Create the output operator for the densities.

Parameters
[out]osOutput operator for the densities
[in]dtType of density (e.g. baryon density)
Returns
An output operator for the densities

Definition at line 145 of file density.cc.

145  {
146  switch (dens_type) {
147  case DensityType::Hadron:
148  os << "hadron density";
149  break;
150  case DensityType::Baryon:
151  os << "baryon density";
152  break;
153  case DensityType::BaryonicIsospin:
154  os << "baryonic isospin density";
155  break;
156  case DensityType::Pion:
157  os << "pion density";
158  break;
159  case DensityType::None:
160  os << "none";
161  break;
162  default:
163  os.setstate(std::ios_base::failbit);
164  }
165  return os;
166 }

◆ density_factor()

double smash::density_factor ( const ParticleType type,
DensityType  dens_type 
)

Get the factor that determines how much a particle contributes to the density type that is computed.

E.g. positive pion contributes with factor 1 to total particle density and with factor 0 to baryon density. Proton contributes with factor 1 to baryon density, anti-proton - with factor -1 to baryon density, and so on.

Parameters
[in]typetype of the particle to be tested
[in]dens_typeThe density type
Returns
The corresponding factor (0 if the particle doesn't contribute at all).

Definition at line 17 of file density.cc.

17  {
18  switch (dens_type) {
19  case DensityType::Hadron:
20  return type.is_hadron() ? 1. : 0.;
21  case DensityType::Baryon:
22  return static_cast<double>(type.baryon_number());
23  case DensityType::BaryonicIsospin:
24  return type.is_baryon() ? type.isospin3_rel() : 0.;
25  case DensityType::Pion:
26  return type.pdgcode().is_pion() ? 1. : 0.;
27  default:
28  return 0.;
29  }
30 }
Here is the call graph for this function:
Here is the caller graph for this function:

◆ smearing_factor_norm()

double smash::smearing_factor_norm ( const double  two_sigma_sqr)
inline

Norm of the Gaussian smearing function.

Parameters
[in]two_sigma_sqr\(2 \sigma^2 \) [fm \(^2\)], \( \sigma \) - width of gaussian smearing
Returns
\( (2 \pi \sigma^2)^{3/2}\) [fm \(^3\)]

Definition at line 72 of file density.h.

72  {
73  const double tmp = two_sigma_sqr * M_PI;
74  return tmp * std::sqrt(tmp);
75 }
Here is the caller graph for this function:

◆ smearing_factor_rcut_correction()

double smash::smearing_factor_rcut_correction ( const double  rcut_in_sigma)
inline

Gaussians used for smearing are cut at radius \(r_{cut} = a \sigma \) for calculation speed-up.

In the limit of \(a \to \infty \) smearing factor is normalized to 1:

\[ \frac{4 \pi}{(2 \pi \sigma^2)^{3/2}} \int_0^{\infty} e^{-r^2/2 \sigma^2} r^2 dr = 1 \]

However, for finite \( a\) integral is less than one:

\[ g(a) \equiv \frac{4 \pi}{(2 \pi \sigma^2)^{3/2}} \int_0^{a \sigma} e^{-r^2/2 \sigma^2} r^2 dr = -\sqrt{\frac{2}{\pi}} a e^{-a^2/2} + Erf[a/\sqrt{2}] \]

This \( g(a) \) is typically close to 1. For example, for \(r_{cut} = 3 \sigma \), and thus \( a=3 \), g(3) = 0.9707; g(4) = 0.9987. The aim of this function is to compensate for this factor.

Parameters
[in]rcut_in_sigma\( a = r_{cut} / \sigma\)
Returns
\( g(a) \)

Definition at line 94 of file density.h.

94  {
95  const double x = rcut_in_sigma / std::sqrt(2.0);
96  return -2.0 / std::sqrt(M_PI) * x * std::exp(-x * x) + std::erf(x);
97 }
Here is the caller graph for this function:

◆ unnormalized_smearing_factor()

std::pair< double, ThreeVector > smash::unnormalized_smearing_factor ( const ThreeVector r,
const FourVector p,
const double  m_inv,
const DensityParameters dens_par,
const bool  compute_gradient = false 
)

Implements gaussian smearing for any quantity.

Computes smearing factor taking Lorentz contraction into account. Integral of unnormalized smearing factor over space should be \( (2 \pi \sigma^2)^{3/2} \). Division over norm is split for efficiency: it is not nice to recalculate the same constant norm at every call.

Parameters
[in]rvector from the particle to the point of interest [fm]
[in]pparticle 4-momentum to account for Lorentz contraction [GeV]
[in]m_invparticle mass, \( (E^2 - p^2)^{-1/2} \) [GeV]
[in]dens_parobject containing precomputed parameters for density calculation.
[in]compute_gradientoption, true - compute gradient, false - no
Returns
(smearing factor, the gradient of the smearing factor or a zero three vector)

Definition at line 32 of file density.cc.

34  {
35  const double r_sqr = r.sqr();
36  // Distance from particle to point of interest > r_cut
37  if (r_sqr > dens_par.r_cut_sqr()) {
38  return std::make_pair(0.0, ThreeVector(0.0, 0.0, 0.0));
39  }
40 
41  const FourVector u = p * m_inv;
42  const double u_r_scalar = r * u.threevec();
43  const double r_rest_sqr = r_sqr + u_r_scalar * u_r_scalar;
44 
45  // Lorentz contracted distance from particle to point of interest > r_cut
46  if (r_rest_sqr > dens_par.r_cut_sqr()) {
47  return std::make_pair(0.0, ThreeVector(0.0, 0.0, 0.0));
48  }
49  const double sf = std::exp(-r_rest_sqr * dens_par.two_sig_sqr_inv()) * u.x0();
50  const ThreeVector sf_grad = compute_gradient
51  ? sf * (r + u.threevec() * u_r_scalar) *
52  dens_par.two_sig_sqr_inv() * 2.0
53  : ThreeVector(0.0, 0.0, 0.0);
54 
55  return std::make_pair(sf, sf_grad);
56 }
constexpr int p
Proton.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ rho_eckart() [1/2]

std::tuple< double, ThreeVector, ThreeVector, ThreeVector > smash::rho_eckart ( const ThreeVector r,
const ParticleList &  plist,
const DensityParameters par,
DensityType  dens_type,
bool  compute_gradient 
)

Calculates Eckart rest frame density and optionally the gradient of the density in an arbitary frame, the curl of the 3-currrent and the time derivative of the 3-current.

\[j^{\mu} = (\sqrt{2\pi} \sigma )^{-3} \sum_{i=1}^N C_i u^{\mu}_i exp \left(- \frac{(\vec r -\vec r_i + \frac{\gamma_i^2}{1 + \gamma_i} \vec \beta_i (\vec \beta_i, \vec r - \vec r_i))^2}{2\sigma^2} \right)\]

\[ \rho^{Eckart} = \sqrt{j^{\mu} j_{\mu}} \]

Here \( C_i \) is a corresponding value of "charge". If baryon current option is selected then \( C_i \) is 1 for baryons, -1 for antibaryons and 0 otherwise. For proton/neutron current \( C_i = 1\) for proton/neutron and 0 otherwise.

To avoid the problems with Eckart frame definition, densities for positive and negative charges, \(\rho_+ \) and \( \rho_-\), are computed separately and result is \(\rho_+ - \rho_-\).

Parameters
[in]rArbitrary space point where 4-current is calculated [fm]
[in]plistList of all particles to be used in \(j^{\mu}\) calculation. If the distance between particle and calculation point r, \( |r-r_i| > r_{cut} \) then particle input to density will be ignored.

Next three values are taken from ExperimentalParameters structure:

Parameters
[in]parSet of parameters packed in one structure. From them the cutting radius r_cut \( r_{cut} / \sigma \), number of test-particles ntest and the gaussian width gs_sigma are needed.
[in]dens_typetype of four-currect to be calculated: baryon, proton or neutron options are currently available
[in]compute_gradienttrue - compute gradient, false - no
Returns
(density in the local Eckart frame [fm$f^{-3}$f], \( \nabla\cdots\rho \) or a 0 3-vector, \( \partial_t \vec j\) or a 0 3-vector, \( \nabla \times \vec j \) or a 0 3-vector).

Definition at line 133 of file density.cc.

136  {
137  return rho_eckart_impl(r, plist, par, dens_type, compute_gradient);
138 }
std::tuple< double, ThreeVector, ThreeVector, ThreeVector > rho_eckart_impl(const ThreeVector &r, const T &plist, const DensityParameters &par, DensityType dens_type, bool compute_gradient)
Calculates Eckart rest frame density and optionally the gradient of the density in an arbitary frame...
Definition: density.cc:60
Here is the call graph for this function:
Here is the caller graph for this function:

◆ rho_eckart() [2/2]

std::tuple< double, ThreeVector, ThreeVector, ThreeVector > smash::rho_eckart ( const ThreeVector r,
const Particles plist,
const DensityParameters par,
DensityType  dens_type,
bool  compute_gradient 
)

convenience overload of the above (ParticleList -> Particles)

Definition at line 139 of file density.cc.

141  {
142  return rho_eckart_impl(r, plist, par, dens_type, compute_gradient);
143 }
std::tuple< double, ThreeVector, ThreeVector, ThreeVector > rho_eckart_impl(const ThreeVector &r, const T &plist, const DensityParameters &par, DensityType dens_type, bool compute_gradient)
Calculates Eckart rest frame density and optionally the gradient of the density in an arbitary frame...
Definition: density.cc:60
Here is the call graph for this function:

◆ update_lattice()

template<typename T >
void smash::update_lattice ( RectangularLattice< T > *  lat,
const LatticeUpdate  update,
const DensityType  dens_type,
const DensityParameters par,
const Particles particles,
const bool  compute_gradient = false 
)

Updates the contents on the lattice.

Parameters
[out]latThe lattice on which the content will be updated
[in]updatetells if called for update at printout or at timestep
[in]dens_typedensity type to be computed on the lattice
[in]para structure containing testparticles number and gaussian smearing parameters.
[in]particlesthe particles vector
[in]compute_gradientWhether to compute the gradients
Template Parameters
TLatticeType

Definition at line 386 of file density.h.

389  {
390  // Do not proceed if lattice does not exists/update not required
391  if (lat == nullptr || lat->when_update() != update) {
392  return;
393  }
394  lat->reset();
395  const double norm_factor = par.norm_factor_sf();
396  for (const auto &part : particles) {
397  const double dens_factor = density_factor(part.type(), dens_type);
398  if (std::abs(dens_factor) < really_small) {
399  continue;
400  }
401  const FourVector p = part.momentum();
402  const double m = p.abs();
403  if (unlikely(m < really_small)) {
404  const auto &log = logger<LogArea::Density>();
405  log.warn("Gaussian smearing is undefined for momentum ", p);
406  continue;
407  }
408  const double m_inv = 1.0 / m;
409 
410  const ThreeVector pos = part.position().threevec();
411  lat->iterate_in_radius(
412  pos, par.r_cut(), [&](T &node, int ix, int iy, int iz) {
413  const ThreeVector r = lat->cell_center(ix, iy, iz);
414  const auto sf = unnormalized_smearing_factor(pos - r, p, m_inv, par,
415  compute_gradient);
416  if (sf.first * norm_factor > really_small) {
417  node.add_particle(part, sf.first * norm_factor * dens_factor);
418  }
419  if (compute_gradient) {
420  node.add_particle_for_derivatives(part, dens_factor,
421  sf.second * norm_factor);
422  }
423  });
424  }
425 }
constexpr double really_small
Numerical error tolerance.
Definition: constants.h:34
double density_factor(const ParticleType &type, DensityType dens_type)
Get the factor that determines how much a particle contributes to the density type that is computed...
Definition: density.cc:17
constexpr int p
Proton.
std::pair< double, ThreeVector > unnormalized_smearing_factor(const ThreeVector &r, const FourVector &p, const double m_inv, const DensityParameters &dens_par, const bool compute_gradient=false)
Implements gaussian smearing for any quantity.
Definition: density.cc:32
#define unlikely(x)
Tell the branch predictor that this expression is likely false.
Definition: macros.h:16
Here is the call graph for this function:
Here is the caller graph for this function:

◆ breit_wigner()

double smash::breit_wigner ( double  m,
double  pole,
double  width 
)

Returns a relativistic Breit-Wigner distribution.

The normalization is such that the integration over \( \sqrt{s} \) from 0 to infinity yields one.

Parameters
[in]mArgument of the Breit-Wigner function (off-shell mass m in GeV)
[in]poleResonance pole mass \( m_0 \) in GeV
[in]widthResonance width \( \Gamma \) in GeV
Returns
\( \frac{2}{\pi} \frac{m^2\Gamma}{(m^2-m_0^2)^2 + m^2\Gamma^2} \)

Definition at line 23 of file distributions.cc.

23  {
24  const double msqr = m * m;
25  const double dmsqr = msqr - pole * pole;
26  return 2. * msqr * width / (M_PI * (dmsqr * dmsqr + msqr * width * width));
27 }
Here is the caller graph for this function:

◆ breit_wigner_nonrel()

double smash::breit_wigner_nonrel ( double  m,
double  pole,
double  width 
)

Returns a non-relativistic Breit-Wigner distribution, which is essentially a Cauchy distribution with half width.

Parameters
[in]mArgument of the Breit-Wigner function (off-shell mass m in GeV)
[in]poleresonance pole mass \( m_0 \) in GeV
[in]widthresonance width \( \Gamma \) in GeV
Returns
\( \frac{\Gamma/2}{\pi ((m-m_0)^2+\Gamma^2/4)}\)

Definition at line 30 of file distributions.cc.

30  {
31  return cauchy(m, pole, width / 2.);
32 }
double cauchy(double x, double pole, double width)
Returns a Cauchy distribution (sometimes also called Lorentz or non-relativistic Breit-Wigner distrib...
Here is the call graph for this function:
Here is the caller graph for this function:

◆ cauchy()

double smash::cauchy ( double  x,
double  pole,
double  width 
)

Returns a Cauchy distribution (sometimes also called Lorentz or non-relativistic Breit-Wigner distribution) with the given parameters.

The normalization is such that integrating over x from -infinity to +infinity yields one.

Parameters
xArgument of the Cauchy function in GeV.
polePole parameter \( m_0 \) of the Cauchy function in GeV, i.e. location of the peak.
widthWidth parameter \( \Gamma \) of the Cauchy function in GeV, determining the sharpness of the peak.
Returns
\( \frac{\Gamma}{\pi ((x-m_0)^2+\Gamma^2)}\)

Definition at line 35 of file distributions.cc.

35  {
36  const double dm = x - pole;
37  return width / (M_PI * (dm * dm + width * width));
38 }
Here is the caller graph for this function:

◆ density_integrand()

double smash::density_integrand ( const double  energy,
const double  momentum_sqr,
const double  temperature 
)

Returns the Maxwell-Boltzmann distribution.

Todo:
rename the following 4 functions to make clear what they are and check if they are actually used
Parameters
[in]energy\(E\) (in GeV)
[in]momentum_sqrsquared \(p\) (in GeV \(^2\))
[in]temperature\(T\) (in GeV)
Returns
\(4\pi p^2 \exp{-\frac{E}{T}}\)

Definition at line 41 of file distributions.cc.

42  {
43  return 4.0 * M_PI * momentum_sqr * exp(-energy / temperature);
44 }

◆ density_integrand_mass()

double smash::density_integrand_mass ( const double  energy,
const double  momentum_sqr,
const double  temperature 
)

density_integrand_mass - off_equilibrium distribution for massive particles

Parameters
[in]energy\(E\) (in GeV)
[in]momentum_sqrsquared \(p\) (in GeV \(^2\))
[in]temperature\(T\) (in GeV)
Returns

\[f=pe^{-\frac{\sqrt{m^2+p^2}}{T_0}}\]

Definition at line 46 of file distributions.cc.

47  {
48  return momentum_sqr * std::sqrt(momentum_sqr) * exp(-energy / temperature);
49 }
Here is the caller graph for this function:

◆ density_integrand_1M_IC()

double smash::density_integrand_1M_IC ( const double  energy,
const double  momentum_sqr,
const double  temperature 
)

density integrand - 1M_IC massless particles for expanding metric initialization, see Bazow:2016oky

Parameters
[in]energy\(E\) (in GeV)
[in]momentum_sqrsquared \(p\) (in GeV \(^2\))
[in]temperature\(T\) (in GeV)
Returns
Value of function 1M_IC

Definition at line 51 of file distributions.cc.

52  {
53  return ((3.0 / 20.0) * (momentum_sqr / (temperature * temperature)) -
54  (6.0 / 5.0) * (energy / temperature) + (14.0 / 5.0)) *
55  exp(-energy / temperature) * momentum_sqr;
56 }
Here is the caller graph for this function:

◆ density_integrand_2M_IC()

double smash::density_integrand_2M_IC ( const double  energy,
const double  momentum_sqr,
const double  temperature 
)

density integrand - 2M_IC massless particles for expanding metric initialization, see Bazow:2016oky

Parameters
[in]energy\(E\) (in GeV)
[in]momentum_sqrsquared \(p\) (in GeV \(^2\))
[in]temperature\(T\) (in GeV)
Returns
Value of function 2M_IC

Definition at line 58 of file distributions.cc.

59  {
60  return (0.75 + 0.125 * (momentum_sqr / (temperature * temperature)) -
61  (1.0 / 30.0) * (momentum_sqr * energy /
62  (temperature * temperature * temperature)) +
63  (1.0 / 480.0) *
64  (momentum_sqr * momentum_sqr /
65  (temperature * temperature * temperature * temperature))) *
66  exp(-energy / temperature) * momentum_sqr;
67 }
Here is the caller graph for this function:

◆ juttner_distribution_func()

double smash::juttner_distribution_func ( const double  momentum_radial,
const double  mass,
const double  temperature,
const double  baryon_chemical_potential,
const double  lam 
)

Relativistic Juttner distribution function.

Parameters
[in]momentum_radial\(|\vec{p}|\) in units of [GeV]
[in]massMass of the particle: in units of [GeV]
[in]temperatureTemperature of the system \(T\) in units of [GeV]
[in]baryon_chemical_potential\(n*\mu_{B}\) default = 0
[in]lam+/-1 or 0 to determine the distribution type lam=0, for Juttner distribution lam=-1, for Bose-Einstein distribution lam=1, for Fermi-Dirac distribution
Returns
Unnormalized probability of relativistic Juttner distribution

Definition at line 69 of file distributions.cc.

72  {
73  return 1.0 /
74  (std::exp((sqrt(momentum_radial * momentum_radial + mass * mass) -
75  baryon_chemical_potential) /
76  temperature) +
77  lam);
78 }

◆ sample_momenta_non_eq_mass()

double smash::sample_momenta_non_eq_mass ( const double  temperature,
const double  mass 
)

Samples a momentum via rejection method from the non-equilibrium distribution

\[f=pe^{-\frac{\sqrt{m^2+p^2}}{T_0}}\]

.

See also
density_integrand_mass
Parameters
[in]temperatureTemperature \(T\) [GeV]
[in]massMass of the particle: \(m = \sqrt{E^2 - p^2}\) [GeV]
Returns
one possible momentum between mass and 50 GeV

Definition at line 80 of file distributions.cc.

80  {
81  const auto &log = logger<LogArea::Distributions>();
82  log.debug("Sample momenta with mass ", mass, " and T ", temperature);
83 
84  /* Calculate range on momentum values to use
85  * ideally 0.0 and as large as possible but we want to be efficient! */
86  const double mom_min = 0.0;
87  const double mom_max =
88  std::sqrt(50. * 50. * temperature * temperature - mass * mass);
89  /* Calculate momentum and energy values that will give
90  * maxima of density_integrand_mass, verified by differentiation */
91  const double p_non_eq_sq =
92  0.5 * (9 * temperature * temperature +
93  temperature *
94  std::sqrt(81 * temperature * temperature + 36 * mass * mass));
95  const double e_non_eq = std::sqrt(p_non_eq_sq + mass * mass);
96  const double probability_max =
97  2. * density_integrand_mass(e_non_eq, p_non_eq_sq, temperature);
98 
99  /* sample by rejection method: (see numerical recipes for more efficient)
100  * random momenta and random probability need to be below the distribution */
101  double energy, momentum_radial, probability;
102  do {
103  // sample uniformly in momentum, DONT sample uniformly in energy!
104  momentum_radial = random::uniform(mom_min, mom_max);
105  // Energy by on-shell condition
106  energy = std::sqrt(momentum_radial * momentum_radial + mass * mass);
107  probability = density_integrand_mass(
108  energy, momentum_radial * momentum_radial, temperature);
109  } while (random::uniform(0., probability_max) > probability);
110 
111  return momentum_radial;
112 }
T uniform(T min, T max)
Definition: random.h:85
double density_integrand_mass(const double energy, const double momentum_sqr, const double temperature)
density_integrand_mass - off_equilibrium distribution for massive particles
Here is the call graph for this function:
Here is the caller graph for this function:

◆ sample_momenta_1M_IC()

double smash::sample_momenta_1M_IC ( const double  temperature,
const double  mass 
)

Samples a momentum from the non-equilibrium distribution 1M_IC from Bazow:2016oky

See also
density_integrand_1M_IC
Parameters
[in]temperatureTemperature \(T\) [GeV]
[in]massMass of the particle: \(m = \sqrt{E^2 - p^2}\) [GeV]
Returns
one possible momentum between mass and 50 GeV

Definition at line 114 of file distributions.cc.

114  {
115  const auto &log = logger<LogArea::Distributions>();
116  log.debug("Sample momenta with mass ", mass, " and T ", temperature);
117  // Maxwell-Boltzmann average E <E>=3T + m * K_1(m/T) / K_2(m/T)
118  double energy_average;
119  if (mass > 0.) {
120  // massive particles
121  const double m_over_T = mass / temperature;
122  energy_average = 3 * temperature + mass * gsl_sf_bessel_K1(m_over_T) /
123  gsl_sf_bessel_Kn(2, m_over_T);
124  } else {
125  // massless particles
126  energy_average = 3 * temperature;
127  }
128  const double momentum_average_sqr =
129  (energy_average - mass) * (energy_average + mass);
130  const double energy_min = mass;
131  const double energy_max = 50. * temperature;
132  /* 16 * the massless peak value to be well above maximum of the
133  * distribution */
134  const double probability_max =
135  16. * density_integrand_1M_IC(energy_average, momentum_average_sqr,
136  temperature);
137 
138  /* sample by rejection method: (see numerical recipes for more efficient)
139  * random momenta and random probability need to be below the distribution */
140  double momentum_radial_sqr, probability;
141  do {
142  double energy = random::uniform(energy_min, energy_max);
143  momentum_radial_sqr = (energy - mass) * (energy + mass);
144  probability =
145  density_integrand_1M_IC(energy, momentum_radial_sqr, temperature);
146  } while (random::uniform(0., probability_max) > probability);
147 
148  return std::sqrt(momentum_radial_sqr);
149 }
double density_integrand_1M_IC(const double energy, const double momentum_sqr, const double temperature)
density integrand - 1M_IC massless particles for expanding metric initialization, see Bazow:2016oky ...
T uniform(T min, T max)
Definition: random.h:85
Here is the call graph for this function:
Here is the caller graph for this function:

◆ sample_momenta_2M_IC()

double smash::sample_momenta_2M_IC ( const double  temperature,
const double  mass 
)

Samples a momentum from the non-equilibrium distribution 2M_IC from Bazow:2016oky

See also
density_integrand_2M_IC
Parameters
[in]temperatureTemperature \(T\) [GeV]
[in]massMass of the particle: \(m = \sqrt{E^2 - p^2}\) [GeV]
Returns
one possible momentum between mass and 50 GeV

Definition at line 151 of file distributions.cc.

151  {
152  const auto &log = logger<LogArea::Distributions>();
153  log.debug("Sample momenta with mass ", mass, " and T ", temperature);
154  /* Maxwell-Boltzmann average E <E>=3T + m * K_1(m/T) / K_2(m/T) */
155  double energy_average;
156  if (mass > 0.) {
157  // massive particles
158  const double m_over_T = mass / temperature;
159  energy_average = 3 * temperature + mass * gsl_sf_bessel_K1(m_over_T) /
160  gsl_sf_bessel_Kn(2, m_over_T);
161  } else {
162  // massless particles
163  energy_average = 3 * temperature;
164  }
165  const double momentum_average_sqr =
166  (energy_average - mass) * (energy_average + mass);
167  const double energy_min = mass;
168  const double energy_max = 50. * temperature;
169  /* 16 * the massless peak value to be well above maximum of the
170  * distribution */
171  const double probability_max =
172  16. * density_integrand_2M_IC(energy_average, momentum_average_sqr,
173  temperature);
174 
175  /* sample by rejection method: (see numerical recipes for more efficient)
176  * random momenta and random probability need to be below the distribution */
177  double momentum_radial_sqr, probability;
178  do {
179  double energy = random::uniform(energy_min, energy_max);
180  momentum_radial_sqr = (energy - mass) * (energy + mass);
181  probability =
182  density_integrand_2M_IC(energy, momentum_radial_sqr, temperature);
183  } while (random::uniform(0., probability_max) > probability);
184 
185  return std::sqrt(momentum_radial_sqr);
186 }
double density_integrand_2M_IC(const double energy, const double momentum_sqr, const double temperature)
density integrand - 2M_IC massless particles for expanding metric initialization, see Bazow:2016oky ...
T uniform(T min, T max)
Definition: random.h:85
Here is the call graph for this function:
Here is the caller graph for this function:

◆ sample_momenta_from_thermal()

double smash::sample_momenta_from_thermal ( const double  temperature,
const double  mass 
)

Samples a momentum from the Maxwell-Boltzmann (thermal) distribution in a faster way, given by Scott Pratt.

Parameters
[in]temperatureTemperature \(T\) [GeV]
[in]massMass of the particle: \(m = \sqrt{E^2 - p^2}\) [GeV]
Returns
one possible momentum

Definition at line 203 of file distributions.cc.

204  {
205  const auto &log = logger<LogArea::Distributions>();
206  log.debug("Sample momenta with mass ", mass, " and T ", temperature);
207  double momentum_radial, energy;
208  // when temperature/mass
209  if (temperature > 0.6 * mass) {
210  while (true) {
211  const double a = -std::log(random::canonical_nonzero());
212  const double b = -std::log(random::canonical_nonzero());
213  const double c = -std::log(random::canonical_nonzero());
214  momentum_radial = temperature * (a + b + c);
215  energy = sqrt(momentum_radial * momentum_radial + mass * mass);
216  if (random::canonical() < exp((momentum_radial - energy) / temperature)) {
217  break;
218  }
219  }
220  } else {
221  while (true) {
222  const double r0 = random::canonical();
223  const double I1 = mass * mass;
224  const double I2 = 2.0 * mass * temperature;
225  const double I3 = 2.0 * temperature * temperature;
226  const double Itot = I1 + I2 + I3;
227  double K;
228  if (r0 < I1 / Itot) {
229  const double r1 = random::canonical_nonzero();
230  K = -temperature * std::log(r1);
231  } else if (r0 < (I1 + I2) / Itot) {
232  const double r1 = random::canonical_nonzero();
233  const double r2 = random::canonical_nonzero();
234  K = -temperature * std::log(r1 * r2);
235  } else {
236  const double r1 = random::canonical_nonzero();
237  const double r2 = random::canonical_nonzero();
238  const double r3 = random::canonical_nonzero();
239  K = -temperature * std::log(r1 * r2 * r3);
240  }
241  energy = K + mass;
242  momentum_radial = sqrt((energy + mass) * (energy - mass));
243  if (random::canonical() < momentum_radial / energy) {
244  break;
245  }
246  }
247  }
248  return momentum_radial;
249 }
T canonical()
Definition: random.h:110
T canonical_nonzero()
Definition: random.h:119
Here is the call graph for this function:
Here is the caller graph for this function:

◆ sample_momenta_IC_ES()

double smash::sample_momenta_IC_ES ( const double  temperature)

Sample momenta according to the momentum distribution in Bazow:2016oky

Parameters
[in]temperatureThe temperature for the distribution [GeV]
Returns
Radial momentum

Definition at line 251 of file distributions.cc.

251  {
252  double momentum_radial;
253  const double a = -std::log(random::canonical_nonzero());
254  const double b = -std::log(random::canonical_nonzero());
255  const double c = -std::log(random::canonical_nonzero());
256  const double d = -std::log(random::canonical_nonzero());
257  momentum_radial = (3.0 / 4.0) * temperature * (a + b + c + d);
258 
259  return momentum_radial;
260 }
T canonical_nonzero()
Definition: random.h:119
Here is the call graph for this function:
Here is the caller graph for this function:

◆ operator+() [1/3]

EnergyMomentumTensor smash::operator+ ( EnergyMomentumTensor  a,
const EnergyMomentumTensor b 
)
inline

Direct addition operator.

Definition at line 162 of file energymomentumtensor.h.

163  {
164  a += b;
165  return a;
166 }

◆ operator-() [1/4]

EnergyMomentumTensor smash::operator- ( EnergyMomentumTensor  a,
const EnergyMomentumTensor b 
)
inline

Direct subtraction operator.

Definition at line 176 of file energymomentumtensor.h.

177  {
178  a -= b;
179  return a;
180 }

◆ operator*() [1/8]

EnergyMomentumTensor smash::operator* ( EnergyMomentumTensor  a,
const double  b 
)
inline

Direct multiplication operator.

Definition at line 189 of file energymomentumtensor.h.

189  {
190  a *= b;
191  return a;
192 }

◆ operator*() [2/8]

EnergyMomentumTensor smash::operator* ( const double  a,
EnergyMomentumTensor  b 
)
inline

Direct multiplication operator.

Definition at line 194 of file energymomentumtensor.h.

194  {
195  b *= a;
196  return b;
197 }

◆ operator/() [1/3]

EnergyMomentumTensor smash::operator/ ( EnergyMomentumTensor  a,
const double  b 
)
inline

Direct division operator.

Definition at line 206 of file energymomentumtensor.h.

206  {
207  a /= b;
208  return a;
209 }

◆ operator<<() [2/11]

template<typename Modus >
std::ostream & smash::operator<< ( std::ostream &  out,
const Experiment< Modus > &  e 
)

Creates a verbose textual description of the setup of the Experiment.

Writes the initial state for the Experiment to the output stream.

It automatically appends the output of the current Modus.

Definition at line 536 of file experiment.h.

536  {
537  out << "End time: " << e.end_time_ << " fm/c\n";
538  out << e.modus_;
539  return out;
540 }

◆ create_experiment_parameters()

ExperimentParameters smash::create_experiment_parameters ( Configuration  config)

Gathers all general Experiment parameters.

Parameters
[in,out]configConfiguration element
Returns
The ExperimentParameters struct filled with values from the Configuration

Definition at line 269 of file experiment.cc.

269  {
270  const auto &log = logger<LogArea::Experiment>();
271  log.trace() << source_location;
272 
273  const int ntest = config.take({"General", "Testparticles"}, 1);
274  if (ntest <= 0) {
275  throw std::invalid_argument("Testparticle number should be positive!");
276  }
277 
278  const std::string modus_chooser = config.take({"General", "Modus"});
279  // remove config maps of unused Modi
280  config["Modi"].remove_all_but(modus_chooser);
281 
282  /* If this Delta_Time option is absent (this can be for timestepless mode)
283  * just assign 1.0 fm/c, reasonable value will be set at event initialization
284  */
285  const double dt = config.take({"General", "Delta_Time"}, 1.);
286  const double t_end = config.read({"General", "End_Time"});
287  const double output_dt = config.take({"Output", "Output_Interval"}, t_end);
288  auto config_coll = config["Collision_Term"];
289  /* Elastic collisions between the nucleons with the square root s
290  * below low_snn_cut are excluded. */
291  const double low_snn_cut =
292  config_coll.take({"Elastic_NN_Cutoff_Sqrts"}, 1.98);
293  const auto proton = ParticleType::try_find(pdg::p);
294  const auto pion = ParticleType::try_find(pdg::pi_z);
295  if (proton && pion &&
296  low_snn_cut > proton->mass() + proton->mass() + pion->mass()) {
297  log.warn("The cut-off should be below the threshold energy",
298  " of the process: NN to NNpi");
299  }
300  const bool potential_affect_threshold =
301  config.take({"Lattice", "Potentials_Affect_Thresholds"}, false);
302  return {{0., dt},
303  {0.0, output_dt},
304  ntest,
305  config.take({"General", "Gaussian_Sigma"}, 1.),
306  config.take({"General", "Gauss_Cutoff_In_Sigma"}, 4.),
307  config_coll.take({"Two_to_One"}, true),
308  config_coll.take({"Included_2to2"}, ReactionsBitSet().set()),
309  config_coll.take({"Strings"}, modus_chooser != "Box"),
310  config_coll.take({"Use_AQM"}, true),
311  config_coll.take({"Strings_with_Probability"}, true),
312  config_coll.take({"NNbar_Treatment"}, NNbarTreatment::Strings),
313  config.has_value({"Output", "Photons"}),
314  low_snn_cut,
315  potential_affect_threshold};
316 }
constexpr int pi_z
π⁰.
#define source_location
Hackery that is required to output the location in the source code where the log statement occurs...
Definition: logging.h:246
std::bitset< 6 > ReactionsBitSet
Container for the 2 to 2 reactions in the code.
Use string fragmentation.
constexpr int p
Proton.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ hline()

const std::string smash::hline ( 67  ,
'-'   
)

String representing a horizontal line.

Here is the caller graph for this function:

◆ format_measurements()

std::string smash::format_measurements ( const Particles particles,
uint64_t  scatterings_this_interval,
const QuantumNumbers conserved_initial,
SystemTimePoint  time_start,
double  time 
)

Generate the tabulated string which will be printed to the screen when SMASH is running.

Parameters
[in]particlesThe interacting particles. Their information will be used to check the conservation of the total energy and momentum. the total number of the particles will be used and printed as well.
[in]scatterings_this_intervalNumber of the scatterings occur within the current timestep.
[in]conserved_initialInitial quantum numbers needed to check the conservations
[in]time_startMoment in the REAL WORLD when SMASH starts to run [s]
[in]timeCurrent moment in SMASH [fm/c]
Returns
'Current time in SMASH [fm/c]', 'Deviation of the energy from the initial value [GeV]', 'Deviation of the momentum from the initial value [GeV]', 'Averaged collisional rate [c/fm]', 'Number of the scatterings occur within the timestep', 'Total particle number', 'Computing time consumed'

Definition at line 318 of file experiment.cc.

321  {
322  const SystemTimeSpan elapsed_seconds = SystemClock::now() - time_start;
323 
324  const QuantumNumbers current_values(particles);
325  const QuantumNumbers difference = conserved_initial - current_values;
326 
327  std::ostringstream ss;
328  // clang-format off
329  ss << field<5> << time << field<11, 3> << difference.momentum().x0()
330  << field<14, 3> << scatterings_this_interval
331  << field<14, 3> << particles.size() << field<12, 3> << elapsed_seconds;
332  // clang-format on
333  return ss.str();
334 }
SystemClock::duration SystemTimeSpan
The time duration type (alias) used for measuring run times.
Definition: chrono.h:28
Here is the call graph for this function:
Here is the caller graph for this function:

◆ check_interactions_total()

void smash::check_interactions_total ( uint64_t  interactions_total)
inline

Make sure interactions_total can be represented as a 32-bit integer.

This is necessary for converting to a id_process. The latter is 32-bit integer, because it is written like this to binary output.

Parameters
[in]interactions_totalTotal interaction number

Definition at line 1516 of file experiment.h.

1516  {
1517  constexpr uint64_t max_uint32 = std::numeric_limits<uint32_t>::max();
1518  if (interactions_total >= max_uint32) {
1519  throw std::runtime_error("Integer overflow in total interaction number!");
1520  }
1521 }
Here is the caller graph for this function:

◆ fopen()

FilePtr smash::fopen ( const bf::path &  filename,
const std::string &  mode 
)

Open a file with given mode.

This wraps std::fopen but uses FileDeleter to automatically close the file.

Parameters
[in]filenamePath to the file.
[in]modeThe mode in which the file should be opened (see std::fopen).
Returns
The constructed FilePtr.

Definition at line 14 of file file.cc.

14  {
15  FilePtr f{std::fopen(filename.c_str(), mode.c_str())};
16  return f;
17 }
FilePtr fopen(const bf::path &filename, const std::string &mode)
Open a file with given mode.
Definition: file.cc:14
std::unique_ptr< std::FILE, FileDeleter > FilePtr
A RAII type to replace std::FILE *.
Definition: file.h:63
Here is the caller graph for this function:

◆ blatt_weisskopf_sqr()

double smash::blatt_weisskopf_sqr ( const double  p_ab,
const int  L 
)
inline
Returns
the squared Blatt-Weisskopf functions, which influence the mass dependence of the decay widths. See e.g. Effenberger:1999wlg, page 28 and https://physique.cuso.ch/fileadmin/physique/document/2015_chung_brfactor1.pdf where the recursive formula used here is given.
Parameters
p_abMomentum of outgoing particles A and B in center-of-mass frame [GeV]
LAngular momentum of outgoing particles A and B.

This is used as a standard form factor for all hadronic decays. Note that all the Blatt-Weisskopf functions approach one for large p_ab and behave like p_ab**L for small p_ab. They are increasing monotonically with p_ab.

Definition at line 33 of file formfactors.h.

33  {
34  if (L == 0) {
35  return 1.;
36  }
37  constexpr double R = 1. / hbarc; /* interaction radius = 1 fm */
38  const double x = p_ab * R;
39  const double x2 = x * x;
40  if (L == 1) {
41  return x2 / (1. + x2);
42  }
43  std::complex<double> g_prevprev(1, 0);
44  std::complex<double> g_prev(1, -x);
45  double numer = x2;
46  for (int l = 1; l < L; l++) {
47  numer *= x2;
48  const auto new_g =
49  static_cast<double>(2 * l + 1) * g_prev - x2 * g_prevprev;
50  g_prevprev = g_prev;
51  g_prev = new_g;
52  }
53  const double denom = std::norm(g_prev);
54  return numer / denom;
55 }
constexpr double hbarc
GeV <-> fm conversion factor.
Definition: constants.h:25
Here is the caller graph for this function:

◆ post_ff_sqr()

double smash::post_ff_sqr ( double  m,
double  M0,
double  srts0,
double  L 
)
inline

An additional form factor for unstable final states as used in GiBUU, according to M.

Post, see eq. (174) in Buss:2011mx or eq. (13) in Post:2003hu.

Parameters
mActual mass of the decaying resonance [GeV].
M0Pole mass of the decaying resonance [GeV].
srts0Threshold of the reaction, i.e. minimum possible sqrt(s) [GeV].
LLambda parameter of the form factor [GeV]. This is a cut-off parameter that can be different for baryons and mesons.
Returns
The squared value of the form factor (dimensionless).

This form factor is equal to one at m=M0 and m=srts0. For decreasing values of L, the form factor results in a stronger and stronger suppression of the high-mass tail (m > M0) and a corresponding enhancement of the low-mass tail (m < M0).

Definition at line 75 of file formfactors.h.

75  {
76  const auto L4 = L * L * L * L;
77  const auto M2 = M0 * M0;
78  const auto s0 = srts0 * srts0;
79  const auto sminus = (s0 - M2) * 0.5;
80  const auto splus = m * m - (s0 + M2) * 0.5;
81  const auto FF = (L4 + sminus * sminus) / (L4 + splus * splus);
82  return FF * FF;
83 }
Here is the caller graph for this function:

◆ em_form_factor_ps()

double smash::em_form_factor_ps ( PdgCode  pdg,
double  mass 
)
inline
Returns
Electromagnetic transition form factor for P → γ e⁺ e⁻, with a pseudoscalar meson P = π⁰,η,η', as a function of the dilepton mass.

For the π⁰ see Landsberg:1986fd. For the η the Lambda parameter is fitted to NA60 data, see Arnaldi:2009aa.

Parameters
pdgPDG code of the decaying meson.
massInvariant dilepton mass [GeV].

Definition at line 97 of file formfactors.h.

97  {
98  switch (pdg.code()) {
99  case pdg::pi_z:
100  return 1. + 5.5 * mass * mass;
101  case pdg::eta: {
102  const double lambda_eta = 0.716;
103  const double m_over_eta = mass / lambda_eta;
104  return 1. / (1. - m_over_eta * m_over_eta);
105  }
106  default: /* η' etc */
107  return 1.; // use QED approximation
108  }
109 }
constexpr int eta
η.
constexpr int pi_z
π⁰.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ em_form_factor_sqr_vec()

double smash::em_form_factor_sqr_vec ( PdgCode  pdg,
double  mass 
)
inline
Returns
Squared electromagnetic transition form factor for V → π⁰ e⁺ e⁻, with a vector meson V = ω,φ, as a function of the dilepton mass.

For the ω, see Bratkovskaya:1996qe.

Parameters
pdgPDG code of the decaying meson.
massInvariant dilepton mass [GeV].

Definition at line 120 of file formfactors.h.

120  {
121  switch (pdg.code()) {
122  case pdg::omega: {
123  constexpr double lambda = 0.65;
124  constexpr double gamma = 0.075;
125  constexpr double lambda_sqr = lambda * lambda;
126  constexpr double gamma_sqr = gamma * gamma;
127  const double tmp = lambda_sqr - mass * mass;
128  const double denom = tmp * tmp + lambda_sqr * gamma_sqr;
129  return lambda_sqr * lambda_sqr / denom;
130  }
131  default: /* φ etc */
132  return 1.; // use QED approximation
133  }
134 }
constexpr int omega
ω.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ form_factor_delta()

double smash::form_factor_delta ( double  m)
inline
Returns
Electromagnetic transition form factor for Delta -> N e+ e- as a function of the dilepton mass m.
Parameters
mInvariant dilepton mass [GeV].

Currently assumed to be constant, normalized at the real-photon point.

Definition at line 144 of file formfactors.h.

144  {
145  SMASH_UNUSED(m);
146  return 3.12;
147 }
#define SMASH_UNUSED(x)
Mark as unused, silencing compiler warnings.
Definition: macros.h:24
Here is the caller graph for this function:

◆ operator+() [2/3]

FourVector smash::operator+ ( FourVector  a,
const FourVector b 
)
inline

add two FourVectors

Parameters
[in]aThe first FourVector to add
[in]bThe second FourVector to add
Returns
\(x^\mu = a^\mu + b^\mu\)

Definition at line 353 of file fourvector.h.

353  {
354  a += b;
355  return a;
356 }

◆ operator-() [2/4]

FourVector smash::operator- ( FourVector  a,
const FourVector b 
)
inline

subtract two FourVectors

Parameters
[in]aThe FourVector from which to subtract
[in]bThe FourVector to subtract
Returns
\(x^\mu = a^\mu - b^\mu\)

Definition at line 374 of file fourvector.h.

374  {
375  a -= b;
376  return a;
377 }

◆ operator*() [3/8]

FourVector smash::operator* ( FourVector  a,
double  b 
)
inline

multiply a vector with a scalar

Parameters
[in]aThe FourVector to multiply
[in]bThe value with which to multiply
Returns
\(x^\mu = b \cdot a^\mu\)

Definition at line 395 of file fourvector.h.

395  {
396  a *= b;
397  return a;
398 }

◆ operator*() [4/8]

FourVector smash::operator* ( double  b,
FourVector  a 
)
inline

multiply a vector with a scalar

Parameters
[in]bThe value with which to multiply
[in]aThe FourVector to multiply
Returns
\(x^\mu = b \cdot a^\mu\)

Definition at line 406 of file fourvector.h.

406  {
407  a *= b;
408  return a;
409 }

◆ operator/() [2/3]

FourVector smash::operator/ ( FourVector  a,
const double &  b 
)
inline

divide a vector by a scalar

Parameters
[in]aThe FourVector to divide
[in]bThe value with which to divide
Returns
\(x^\mu = \frac{1}{b} \cdot a^\mu\)

Definition at line 428 of file fourvector.h.

428  {
429  a /= b;
430  return a;
431 }

◆ enable_float_traps()

bool smash::enable_float_traps ( int  )
inline

Fallback that fails to set the trap.

Definition at line 40 of file fpenvironment.h.

40 { return false; }
Here is the caller graph for this function:

◆ setup_default_float_traps()

void smash::setup_default_float_traps ( )

Setup the floating-point traps used throughout SMASH.

If possible, this function additionally installs a signal handler that prints what kind of condition triggered the trap. This requires POSIX.1-2001 to work.

Definition at line 69 of file fpenvironment.cc.

69  {
70  {
71  const auto &log = logger<LogArea::Fpe>();
72 
73  // pole error occurred in a floating-point operation:
74  if (!enable_float_traps(FE_DIVBYZERO)) {
75  log.warn("Failed to setup trap on pole error.");
76  }
77 
78  // domain error occurred in an earlier floating-point operation:
79  if (!enable_float_traps(FE_INVALID)) {
80  log.warn("Failed to setup trap on domain error.");
81  }
82 
83  /* The result of the earlier floating-point operation was too large to be
84  * representable: */
85  if (!enable_float_traps(FE_OVERFLOW)) {
86  log.warn("Failed to setup trap on overflow.");
87  }
88 
89  /* There's also FE_UNDERFLOW, where the result of the earlier
90  * floating-point operation was subnormal with a loss of precision.
91  * We do not consider this an error by default.
92  * Furthermore, there's FE_INEXACT, but this traps if "rounding was
93  * necessary to store the result of an earlier floating-point
94  * operation". This is common and not really an error condition. */
95  }
96 
97 // Install the signal handler if we have the functionality.
98 #if (defined _POSIX_C_SOURCE && _POSIX_C_SOURCE >= 199309L) || \
99  (defined _XOPEN_SOURCE && _XOPEN_SOURCE) || \
100  (defined _POSIX_SOURCE && _POSIX_SOURCE)
101 /* The missing-fields-initializers warning says that not all fields of this
102  * struct were explicitly initialized. That's exactly what is the intention
103  * here, because then they are default-initialized, which is zero. */
104 #pragma GCC diagnostic ignored "-Wmissing-field-initializers"
105  struct sigaction action = {};
106  action.sa_flags = SA_SIGINFO;
107  action.sa_sigaction = [](int signal, siginfo_t *info, void *) {
108  const auto &log = logger<LogArea::Fpe>();
109  if (signal == SIGFPE) {
110  const char *msg = nullptr;
111  switch (info->si_code) {
112  case FPE_FLTDIV:
113  msg = "Division by Zero (NaN)";
114  break;
115  case FPE_FLTUND:
116  msg = "Underflow (result was subnormal with a loss of precision)";
117  break;
118  case FPE_FLTOVF:
119  msg = "Overflow (result was too large to be representable)";
120  break;
121  case FPE_FLTINV:
122  msg = "Invalid (domain error occurred)";
123  break;
124  case FPE_FLTRES:
125  msg =
126  "Inexact Result (rounding was necessary to store the result of "
127  "an earlier floating-point operation)";
128  break;
129  default:
130  msg = "unknown";
131  break;
132  }
133  log.fatal("Floating point trap was raised: ", msg);
134  } else {
135  log.fatal("Unexpected Signal ", signal,
136  " received in the FPE signal handler. Aborting.");
137  }
138  abort();
139  };
140  sigaction(SIGFPE, &action, nullptr);
141 #endif
142 }
bool enable_float_traps(int)
Fallback that fails to set the trap.
Definition: fpenvironment.h:40
Here is the call graph for this function:
Here is the caller graph for this function:

◆ without_float_traps()

template<typename F >
void smash::without_float_traps ( F &&  f)

Convenience function to create a scope where all floating point traps are disabled.

Example:

// some code where FPEs will trap
// all code up to the closing brace will not trap anymore.
});
// more code where FPEs will trap
Parameters
fA functor (e.g. lambda) that is executed in the cleared floating point environment.
Template Parameters
Ftype of the functor

Definition at line 129 of file fpenvironment.h.

129  {
130  DisableFloatTraps guard;
131  f();
132 }

◆ operator<<() [3/11]

std::ostream & smash::operator<< ( std::ostream &  s,
const ThermLatticeNode node 
)

This operator writes all the thermodynamic quantities at a certain position to the file out.

Parameters
[in]slocation of the output
[in]nodeposition on the lattice, where the output is generated

Definition at line 90 of file grandcan_thermalizer.cc.

90  {
91  return out << "T[mu,0]: " << node.Tmu0() << ", nb: " << node.nb()
92  << ", ns: " << node.ns() << ", v: " << node.v()
93  << ", e: " << node.e() << ", p: " << node.p()
94  << ", T: " << node.T() << ", mub: " << node.mub()
95  << ", mus: " << node.mus();
96 }
Here is the call graph for this function:

◆ build_error_string()

std::string smash::build_error_string ( std::string  message,
const Line line 
)
inline

Builds a meaningful error message.

Takes the message and quotes the Line where the error occurs

Parameters
[in]messageError message
[in]lineLine object containing line number and line content.

Definition at line 42 of file inputfunctions.h.

42  {
43  return message + " (on line " + std::to_string(line.number) + ": \"" +
44  line.text + "\")";
45 }
Here is the caller graph for this function:

◆ line_parser()

std::vector< Line > smash::line_parser ( const std::string &  input)

Helper function for parsing particles.txt and decaymodes.txt.

This function goes through an input stream line by line and removes comments and empty lines. The remaining lines will be returned as a vector of strings and linenumber pairs (Line).

Parameters
[in]inputan lvalue reference to an input stream

Definition at line 20 of file inputfunctions.cc.

20  {
21  const auto &log = logger<LogArea::InputParser>();
22  log.trace() << source_location << input;
23  std::istringstream input_stream(input);
24  std::vector<Line> lines;
25  lines.reserve(50);
26 
27  std::string line;
28  int line_number = 0;
29  while (std::getline(input_stream, line)) {
30  ++line_number;
31  const auto hash_pos = line.find('#');
32  if (hash_pos != std::string::npos) {
33  // Found a comment, remove it from the line and look further
34  line = line.substr(0, hash_pos);
35  }
36  if (line.find_first_not_of(" \t") == std::string::npos) {
37  // Only whitespace (or nothing) on this line. Next, please.
38  continue;
39  }
40  line = trim(line);
41  lines.emplace_back(line_number, std::move(line));
42  line = std::string();
43  }
44  return lines;
45 }
std::string trim(const std::string &s)
Strip leading and trailing whitespaces.
#define source_location
Hackery that is required to output the location in the source code where the log statement occurs...
Definition: logging.h:246
Here is the call graph for this function:
Here is the caller graph for this function:

◆ ensure_all_read()

void smash::ensure_all_read ( std::istream &  input,
const Line line 
)
inline

Makes sure that nothing is left to read from this line.

Definition at line 59 of file inputfunctions.h.

59  { /*{{{*/
60  std::string tmp;
61  input >> tmp;
62  if (!input.eof()) {
63  throw ParticleType::LoadFailure(
64  build_error_string("While loading the Particle data:\nGarbage (" + tmp +
65  ") at the remainder of the line.",
66  line));
67  }
68 } /*}}}*/
std::string build_error_string(std::string message, const Line &line)
Builds a meaningful error message.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ read_all()

std::string smash::read_all ( std::istream &&  input)
inline

Utility function to read a complete input stream (e.g.

file) into one string.

Parameters
[in]inputThe input stream. Since it reads until EOF und thus "uses up the whole input stream" the function takes an rvalue reference to the stream object (just pass a temporary).
Note
There's no slicing here: the actual istream object is a temporary that is not destroyed until read_all returns.

Definition at line 80 of file inputfunctions.h.

80  {
81  return {std::istreambuf_iterator<char>{input},
82  std::istreambuf_iterator<char>{}};
83 }
Here is the caller graph for this function:

◆ has_crlf_line_ending()

bool smash::has_crlf_line_ending ( const std::string  in)
inline

Check if a line in the string ends with \r\n.

This may happen when a file was edited on Windows.

Parameters
[in]inInput string
Returns
True if \r\n was found, else false

Definition at line 91 of file inputfunctions.h.

91  {
92  if (in.find("\r\n") != std::string::npos) {
93  return true;
94  }
95  return false;
96 }
Here is the caller graph for this function:

◆ generate_sort_permutation()

template<typename T , typename Cmp >
Permutation smash::generate_sort_permutation ( std::vector< T > const &  v,
Cmp  compare 
)

Calculate the permutations necessary for sorting a vector.

Template Parameters
CmpType of comparison function.
Parameters
vVector to be sorted.
compareComparison function (see std::sort).
Returns
Vector of indices into the original vector.

Definition at line 115 of file interpolation.h.

115  {
116  Permutation p(v.size());
117  std::iota(p.begin(), p.end(), 0);
118  std::sort(p.begin(), p.end(),
119  [&](size_t i, size_t j) { return compare(v[i], v[j]); });
120  return p;
121 }
std::vector< size_t > Permutation
Represent a permutation.
constexpr int p
Proton.
Here is the caller graph for this function:

◆ apply_permutation()

template<typename T >
std::vector<T> smash::apply_permutation ( const std::vector< T > &  v,
const Permutation p 
)

Apply a permutation to a vector.

Template Parameters
TType of values to be permuted.
Parameters
vVector to be permuted.
pPermutation to be applied.
Returns
Permuted vector.

Definition at line 132 of file interpolation.h.

133  {
134  std::vector<T> copied_v = v;
135  std::transform(p.begin(), p.end(), copied_v.begin(),
136  [&](size_t i) { return v[i]; });
137  return copied_v;
138 }
constexpr int p
Proton.
Here is the caller graph for this function:

◆ check_duplicates()

template<typename T >
void smash::check_duplicates ( const std::vector< T > &  x,
const std::string &  error_position 
)

Check whether two components have the same value in a sorted vector x.

Throws an exception if duplicates are encountered.

Template Parameters
TType of values to be checked for duplicates.
Parameters
xVector to be checked for duplicates.
error_positionString used in the error message, indicating where the error originated.

Definition at line 151 of file interpolation.h.

152  {
153  auto it = std::adjacent_find(x.begin(), x.end());
154  if (it != x.end()) {
155  std::stringstream error_msg;
156  error_msg << error_position << ": Each x value must be unique. \"" << *it
157  << "\" was found twice.";
158  throw std::runtime_error(error_msg.str());
159  }
160 }
Here is the caller graph for this function:

◆ find_index()

template<typename T >
size_t smash::find_index ( const std::vector< T > &  v,
x 
)

Find the index in v that corresponds to the last value strictly smaller than x.

If no such value exists, the first value is returned.

This assumes v is sorted and uses a binary search.

Template Parameters
TType of values to be compared to x.
Parameters
vVector to be searched.
xUpper bound for indexed value.
Returns
Largest index corresponding to value below upper bound.

Example:

std::vector<int> x = { 0, 2, 4, 6, 8, 10 }; find_index(x, 2)

0

find_index(x, 3)

1

Definition at line 198 of file interpolation.h.

198  {
199  const auto it = std::lower_bound(v.begin(), v.end(), x);
200  if (it == v.begin()) {
201  return 0;
202  } else {
203  return it - 1 - v.begin();
204  }
205 }
Here is the caller graph for this function:

◆ center_of_velocity_v()

double smash::center_of_velocity_v ( double  s,
double  ma,
double  mb 
)
inline
Returns
Velocity in the center of velocities frame of two particles given their Mandelstam s and masses
Parameters
[in]sMandelstam s of the collision [GeV^2]
[in]maMass of the first particle [GeV]
[in]mbMass of the second particle [GeV]

Definition at line 26 of file kinematics.h.

26  {
27  const double m_sum = ma + mb;
28  const double m_dif = ma - mb;
29  return std::sqrt((s - m_sum * m_sum) / (s - m_dif * m_dif));
30 }
Here is the caller graph for this function:

◆ fixed_target_projectile_v()

double smash::fixed_target_projectile_v ( double  s,
double  ma,
double  mb 
)
inline
Returns
Velocity of projectile in the fixed target frame given the Mandelstam s of projectile and target and their masses
Parameters
[in]sMandelstam s of the collision [GeV^2]
[in]maMass of the projectile [GeV]
[in]mbMass of the target [GeV]

Definition at line 39 of file kinematics.h.

39  {
40  const double inv_gamma = 2 * ma * mb / (s - ma * ma - mb * mb);
41  return std::sqrt(1.0 - inv_gamma * inv_gamma);
42 }
Here is the caller graph for this function:

◆ pCM_sqr_from_s()

template<typename T >
T smash::pCM_sqr_from_s ( const T  s,
const T  mass_a,
const T  mass_b 
)
noexcept
Returns
The squared center-of-mass momentum of two particles, given s and their masses. [GeV^2]
Parameters
[in]sMandelstam s of the process [GeV^2].
[in]mass_aMass of first particle [GeV].
[in]mass_bMass of second particle [GeV].

Definition at line 52 of file kinematics.h.

52  {
53  const auto mass_a_sqr = mass_a * mass_a;
54  const auto x = s + mass_a_sqr - mass_b * mass_b;
55  return x * x * (T(0.25) / s) - mass_a_sqr;
56 }
Here is the caller graph for this function:

◆ pCM_from_s()

template<typename T >
T smash::pCM_from_s ( const T  s,
const T  mass_a,
const T  mass_b 
)
noexcept
Returns
The center-of-mass momentum of two particles, given s and their masses. [GeV]
Parameters
[in]sMandelstam s of the process [GeV^2].
[in]mass_aMass of first particle [GeV].
[in]mass_bMass of second particle [GeV].

Definition at line 66 of file kinematics.h.

66  {
67  const auto psqr = pCM_sqr_from_s(s, mass_a, mass_b);
68  return psqr > T(0.) ? std::sqrt(psqr) : T(0.);
69 }
T pCM_sqr_from_s(const T s, const T mass_a, const T mass_b) noexcept
Definition: kinematics.h:52
Here is the call graph for this function:
Here is the caller graph for this function:

◆ pCM()

template<typename T >
T smash::pCM ( const T  sqrts,
const T  mass_a,
const T  mass_b 
)
noexcept
Returns
The center-of-mass momentum of two particles, given sqrt(s) and their masses. [GeV]
Parameters
[in]sqrtssqrt(s) of the process [GeV].
[in]mass_aMass of first particle [GeV].
[in]mass_bMass of second particle [GeV].

Definition at line 79 of file kinematics.h.

79  {
80  return pCM_from_s(sqrts * sqrts, mass_a, mass_b);
81 }
T pCM_from_s(const T s, const T mass_a, const T mass_b) noexcept
Definition: kinematics.h:66
Here is the call graph for this function:
Here is the caller graph for this function:

◆ pCM_sqr()

template<typename T >
T smash::pCM_sqr ( const T  sqrts,
const T  mass_a,
const T  mass_b 
)
noexcept
Returns
The squared center-of-mass momentum of two particles, given sqrt(s) and their masses.
Parameters
[in]sqrtssqrt(s) of the process [GeV].
[in]mass_aMass of first particle [GeV].
[in]mass_bMass of second particle [GeV].

Definition at line 91 of file kinematics.h.

91  {
92  return pCM_sqr_from_s(sqrts * sqrts, mass_a, mass_b);
93 }
T pCM_sqr_from_s(const T s, const T mass_a, const T mass_b) noexcept
Definition: kinematics.h:52
Here is the call graph for this function:
Here is the caller graph for this function:

◆ get_t_range()

template<typename T >
std::array<T, 2> smash::get_t_range ( const T  sqrts,
const T  m1,
const T  m2,
const T  m3,
const T  m4 
)

Get the range of Mandelstam-t values allowed in a particular 2->2 process, see PDG 2014 booklet, eq.

(46.34).

Parameters
[in]sqrtssqrt(s) of the process [GeV].
[in]m1Mass of first incoming particle [GeV].
[in]m2Mass of second incoming particle [GeV].
[in]m3Mass of first outgoing particle [GeV].
[in]m4Mass of second outgoing particle [GeV].
Returns
array consisting of {t_min, t_max}

Note that both t_min and t_max are negative, with |t_min| < |t_max|, i.e. t_min > t_max.

Definition at line 109 of file kinematics.h.

110  {
111  const T p_i = pCM(sqrts, m1, m2); // initial-state CM momentum
112  const T p_f = pCM(sqrts, m3, m4); // final-state CM momentum
113  const T sqrt_t0 = (m1 * m1 - m2 * m2 - m3 * m3 + m4 * m4) / (2. * sqrts);
114  const T t0 = sqrt_t0 * sqrt_t0;
115  const T t_min = t0 - (p_i - p_f) * (p_i - p_f);
116  const T t_max = t0 - (p_i + p_f) * (p_i + p_f);
117  assert(t_min >= t_max);
118  return {t_min, t_max};
119 }
T pCM(const T sqrts, const T mass_a, const T mass_b) noexcept
Definition: kinematics.h:79
Here is the call graph for this function:
Here is the caller graph for this function:

◆ check_energy()

static void smash::check_energy ( double  mandelstam_s,
double  m_sum 
)
inlinestatic

Helper function for plab_from_s.

Parameters
[in]mandelstam_sThe Mandelstam variable s [GeV^2]
[in]m_sumSum of masses of target and projectile [GeV] \( m_1 + m_2 \)

Definition at line 127 of file kinematics.h.

127  {
128  if (mandelstam_s < m_sum * m_sum) {
129  std::stringstream err;
130  err << "plab_from_s: s too small: " << mandelstam_s << " < "
131  << m_sum * m_sum;
132  throw std::runtime_error(err.str());
133  }
134 }
Here is the caller graph for this function:

◆ check_radicand()

static void smash::check_radicand ( double  mandelstam_s,
double  radicand 
)
inlinestatic

Helper function for plab_from_s.

Parameters
[in]mandelstam_sThe Mandelstam variable s [GeV^2]
[in]radicand\( (s - (m_1 + m_2)^2) * (s - (m_1 - m_2)^2) \) where \( m_1 \) and \( m_2 \) are masses of incoming particles [GeV^4]

Definition at line 142 of file kinematics.h.

142  {
143  if (radicand < 0) {
144  std::stringstream err;
145  err << "plab_from_s: negative radicand: " << mandelstam_s;
146  throw std::runtime_error(err.str());
147  }
148 }
Here is the caller graph for this function:

◆ plab_from_s() [1/3]

double smash::plab_from_s ( double  mandelstam_s,
double  mass 
)
inline

Convert Mandelstam-s to p_lab in a fixed-target collision.

This assumes both particles have the given mass.

Parameters
[in]mandelstam_sThe Mandelstam variable s [GeV^2]
[in]massMass of projectile and target [GeV]
Returns
Momentum of the projectile in the lab frame [GeV]

Definition at line 157 of file kinematics.h.

157  {
158  const double radicand = mandelstam_s * (mandelstam_s - 4 * mass * mass);
159 #ifndef NDEBUG
160  const double m_sum = 2 * mass;
161  check_energy(mandelstam_s, m_sum);
162  check_radicand(mandelstam_s, radicand);
163 #endif
164  return std::sqrt(radicand) / (2 * mass);
165 }
static void check_energy(double mandelstam_s, double m_sum)
Helper function for plab_from_s.
Definition: kinematics.h:127
static void check_radicand(double mandelstam_s, double radicand)
Helper function for plab_from_s.
Definition: kinematics.h:142
Here is the call graph for this function:
Here is the caller graph for this function:

◆ plab_from_s() [2/3]

double smash::plab_from_s ( double  mandelstam_s)
inline

Convert Mandelstam-s to p_lab in a fixed-target collision.

This assumes both particles have the mass of a nucleon.

Parameters
[in]mandelstam_sThe Mandelstam variable s [GeV^2]
Returns
Momentum of the projectile in the lab frame [GeV]

Definition at line 173 of file kinematics.h.

173  {
174  return plab_from_s(mandelstam_s, nucleon_mass);
175 }
constexpr double nucleon_mass
Nucleon mass in GeV.
Definition: constants.h:52
double plab_from_s(double mandelstam_s, double m_projectile, double m_target)
Convert Mandelstam-s to p_lab in a fixed-target collision.
Definition: kinematics.h:185
Here is the call graph for this function:

◆ plab_from_s() [3/3]

double smash::plab_from_s ( double  mandelstam_s,
double  m_projectile,
double  m_target 
)
inline

Convert Mandelstam-s to p_lab in a fixed-target collision.

The mass of the projectile and the mass of the target have to be given.

Parameters
[in]mandelstam_sthe Mandelstam variable s [GeV^2]
[in]m_projectilemass of the projectile [GeV]
[in]m_targetmass of the target [GeV]
Returns
momentum of the projectile in the lab frame [GeV]

Definition at line 185 of file kinematics.h.

186  {
187  const double m_sum = m_projectile + m_target;
188  const double m_diff = m_projectile - m_target;
189  const double radicand =
190  (mandelstam_s - m_sum * m_sum) * (mandelstam_s - m_diff * m_diff);
191 /* This is equivalent to:
192  * const double radicand
193  * = (mandelstam_s - m_a_sq - m_b_sq) * (mandelstam_s - m_a_sq - m_b_sq)
194  * - 4 * m_a_sq * m_b_sq; */
195 #ifndef NDEBUG
196  check_energy(mandelstam_s, m_sum);
197  check_radicand(mandelstam_s, radicand);
198 #endif
199  return std::sqrt(radicand) / (2 * m_target);
200 }
static void check_energy(double mandelstam_s, double m_sum)
Helper function for plab_from_s.
Definition: kinematics.h:127
static void check_radicand(double mandelstam_s, double radicand)
Helper function for plab_from_s.
Definition: kinematics.h:142
Here is the call graph for this function:

◆ s_from_Ekin()

double smash::s_from_Ekin ( double  e_kin,
double  m_P,
double  m_T 
)
inline

Convert E_kin to Mandelstam-s for a fixed-target setup, with a projectile of mass m_P and a kinetic energy e_kin and a target of mass m_T at rest.

Parameters
[in]e_kinkinetic energy of the projectile in the lab frame [GeV]
[in]m_Pmass of the projectile [GeV]
[in]m_Tmass of the target [GeV]
Returns
The Mandelstam variable s [GeV^2]

Definition at line 211 of file kinematics.h.

211  {
212  return m_P * m_P + m_T * m_T + 2 * m_T * (m_P + e_kin);
213 }
Here is the caller graph for this function:

◆ s_from_plab()

double smash::s_from_plab ( double  plab,
double  m_P,
double  m_T 
)
inline

Convert p_lab to Mandelstam-s for a fixed-target setup, with a projectile of mass m_P and momentum plab and a target of mass m_T at rest.

Parameters
[in]plabMomentum of the projectile in the lab frame [GeV]
[in]m_PMass of the projectile [GeV]
[in]m_TMass of the target [GeV]
Returns
The Mandelstam variable s [GeV^2]

Definition at line 224 of file kinematics.h.

224  {
225  return m_P * m_P + m_T * m_T + 2 * m_T * std::sqrt(m_P * m_P + plab * plab);
226 }
Here is the caller graph for this function:

◆ smooth()

template<typename T >
std::vector<T> smash::smooth ( const std::vector< T > &  x,
const std::vector< T > &  y,
span = 2. / 3,
size_t  iter = 3,
delta = 0 
)

Apply the LOWESS smoother (see the reference below) to the given data (x, y).

Parameters
xx-values.
yy-values.
spanThe smoother span. This gives the proportion of points in the plot which influence the smoothness at each value. Larger values give more smoothness.
iterThe number of robustifying iterations which should be performed. Using smaller values of iter will make lowess run faster.
deltaValues of x which lie within delta of each other replaced by a single value in the output from lowess. For delta = 0, delta will be calculated.
Returns
Smoothed y-values.

References:

  • Cleveland, W. S. (1979) Robust locally weighted regression and smoothing scatterplots. J. Amer. Statist. Assoc. 74, 829-836.
  • Cleveland, W. S. (1981) LOWESS: A program for smoothing scatterplots by robust locally weighted regression. The American Statistician, 35, 54.

Definition at line 289 of file lowess.h.

290  {
291  assert(x.size() == y.size());
292  std::vector<T> result;
293  result.resize(x.size());
294  std::vector<T> rw;
295  rw.resize(x.size());
296  std::vector<T> res;
297  res.resize(x.size());
298  lowess::lowess(&x.front(), &y.front(), x.size(), &result.front(), span, iter,
299  delta, &rw.front(), &res.front());
300  return std::move(result);
301 }
void lowess(const T *x, const T *y, size_t n, T *ys, T span, size_t iter, T delta, T *rw, T *res)
Lowess regression smoother.
Definition: lowess.h:139
Here is the call graph for this function:
Here is the caller graph for this function:

◆ almost_equal()

template<typename N >
bool smash::almost_equal ( const N  x,
const N  y 
)

Checks two numbers for relative approximate equality.

Template Parameters
NNumber type.
Parameters
xLeft-hand side.
yRight-hand side.
Returns
true if the difference between x and y is less than or equal to \(\delta = \)smash::really_small or that times the average of \(|x|\) and \(|y|\):

\[|x - y| \stackrel{?}{\le} \delta \mbox{ or } |x - y| \stackrel{?}{\le} \frac{|x| + |y|}{2} \cdot \delta\]

See also
smash::really_small

Definition at line 42 of file numerics.h.

42  {
43  return (std::abs(x - y) <= N(really_small) ||
44  std::abs(x - y) <=
45  N(0.5 * really_small) * (std::abs(x) + std::abs(y)));
46 }
constexpr double really_small
Numerical error tolerance.
Definition: constants.h:34
Here is the caller graph for this function:

◆ almost_equal_physics()

template<typename N >
bool smash::almost_equal_physics ( const N  x,
const N  y 
)

Same as smash::almost_equal, but for physical checks like energy-momentum conservation small_number is enough precision-wise.

Template Parameters
NNumber type.
Parameters
xLeft-hand side.
yRight-hand side.
Returns
true if the difference between x and y is less than or equal to \(\delta = \)smash::small_number or that times the average of \(|x|\) and \(|y|\):
See also
smash::small_number
smash::almost_equal

Definition at line 62 of file numerics.h.

62  {
63  return (std::abs(x - y) <= N(small_number) ||
64  std::abs(x - y) <=
65  N(0.5 * small_number) * (std::abs(x) + std::abs(y)));
66 }
constexpr double small_number
Physical error tolerance.
Definition: constants.h:45
Here is the caller graph for this function:

◆ xs_high_energy()

double smash::xs_high_energy ( double  mandelstam_s,
bool  is_opposite_charge,
double  ma,
double  mb,
double  P,
double  R1,
double  R2 
)

total hadronic cross sections at high energies parametrized in the 2016 PDG book(http://pdg.lbl.gov/2016/reviews/rpp2016-rev-cross-section-plots.pdf)

This function is a utility function called from specific parametrizations.

Parameters
[in]mandelstam_sthe rest frame total energy squared [GeV^2]
[in]is_opposite_chargewhether the particles being collided have opposite charges
[in]mamass of first particle [GeV]
[in]mbmass of second particle [GeV]
[in]PPomeranchuk's constant term [mb]
[in]R1intensity of the first Regge pole contribution [mb]
[in]R2intensity of the second Regge pole contribution [mb]
Returns
the parametrized cross-section [mb]

Definition at line 30 of file parametrizations.cc.

31  {
32  const double M = 2.1206;
33  const double H = 0.272;
34  const double eta1 = 0.4473;
35  const double eta2 = 0.5486;
36  const double s_sab = mandelstam_s / (ma + mb + M) / (ma + mb + M);
37  double xs =
38  H * std::log(s_sab) * std::log(s_sab) + P + R1 * std::pow(s_sab, -eta1);
39  xs = is_opposite_charge ? xs + R2 * std::pow(s_sab, -eta2)
40  : xs - R2 * std::pow(s_sab, -eta2);
41  return xs;
42 }
STL namespace.
Here is the caller graph for this function:

◆ pp_high_energy()

double smash::pp_high_energy ( double  mandelstam_s)

pp total cross section at high energies

See also
xs_high_energy
Parameters
[in]mandelstam_sthe rest frame total energy squared [GeV^2]
Returns
the parametrized cross-section [mb]

Definition at line 44 of file parametrizations.cc.

44  {
45  return xs_high_energy(mandelstam_s, false, 0.939, 0.939, 34.41, 13.07, 7.394);
46 }
double xs_high_energy(double mandelstam_s, bool is_opposite_charge, double ma, double mb, double P, double R1, double R2)
total hadronic cross sections at high energies parametrized in the 2016 PDG book(http://pdg.lbl.gov/2016/reviews/rpp2016-rev-cross-section-plots.pdf)
Here is the call graph for this function:
Here is the caller graph for this function:

◆ ppbar_high_energy()

double smash::ppbar_high_energy ( double  mandelstam_s)

ppbar total cross section at high energies

See also
xs_high_energy
Parameters
[in]mandelstam_sthe rest frame total energy squared [GeV^2]
Returns
the parametrized cross-section [mb]

Definition at line 48 of file parametrizations.cc.

48  {
49  return xs_high_energy(mandelstam_s, true, 0.939, 0.939, 34.41, 13.07, 7.394);
50 }
double xs_high_energy(double mandelstam_s, bool is_opposite_charge, double ma, double mb, double P, double R1, double R2)
total hadronic cross sections at high energies parametrized in the 2016 PDG book(http://pdg.lbl.gov/2016/reviews/rpp2016-rev-cross-section-plots.pdf)
Here is the call graph for this function:
Here is the caller graph for this function:

◆ np_high_energy()

double smash::np_high_energy ( double  mandelstam_s)

np total cross section at high energies

See also
xs_high_energy
Parameters
[in]mandelstam_sthe rest frame total energy squared [GeV^2]
Returns
the parametrized cross-section [mb]

Definition at line 52 of file parametrizations.cc.

52  {
53  return xs_high_energy(mandelstam_s, false, 0.939, 0.939, 34.41, 12.52, 6.66);
54 }
double xs_high_energy(double mandelstam_s, bool is_opposite_charge, double ma, double mb, double P, double R1, double R2)
total hadronic cross sections at high energies parametrized in the 2016 PDG book(http://pdg.lbl.gov/2016/reviews/rpp2016-rev-cross-section-plots.pdf)
Here is the call graph for this function:
Here is the caller graph for this function:

◆ npbar_high_energy()

double smash::npbar_high_energy ( double  mandelstam_s)

npbar total cross section at high energies

See also
xs_high_energy
Parameters
[in]mandelstam_sthe rest frame total energy squared [GeV^2]
Returns
the parametrized cross-section [mb]

Definition at line 56 of file parametrizations.cc.

56  {
57  return xs_high_energy(mandelstam_s, true, 0.939, 0.939, 34.41, 12.52, 6.66);
58 }
double xs_high_energy(double mandelstam_s, bool is_opposite_charge, double ma, double mb, double P, double R1, double R2)
total hadronic cross sections at high energies parametrized in the 2016 PDG book(http://pdg.lbl.gov/2016/reviews/rpp2016-rev-cross-section-plots.pdf)
Here is the call graph for this function:
Here is the caller graph for this function:

◆ piplusp_high_energy()

double smash::piplusp_high_energy ( double  mandelstam_s)

pi+p total cross section at high energies

See also
xs_high_energy
Parameters
[in]mandelstam_sthe rest frame total energy squared [GeV^2]
Returns
the parametrized cross-section [mb]

Definition at line 60 of file parametrizations.cc.

60  {
61  return xs_high_energy(mandelstam_s, false, 0.939, 0.138, 18.75, 9.56, 1.767);
62 }
double xs_high_energy(double mandelstam_s, bool is_opposite_charge, double ma, double mb, double P, double R1, double R2)
total hadronic cross sections at high energies parametrized in the 2016 PDG book(http://pdg.lbl.gov/2016/reviews/rpp2016-rev-cross-section-plots.pdf)
Here is the call graph for this function:
Here is the caller graph for this function:

◆ piminusp_high_energy()

double smash::piminusp_high_energy ( double  mandelstam_s)

pi-p total cross section at high energies

See also
xs_high_energy
Parameters
[in]mandelstam_sthe rest frame total energy squared [GeV^2]
Returns
the parametrized cross-section [mb]

Definition at line 64 of file parametrizations.cc.

64  {
65  return xs_high_energy(mandelstam_s, true, 0.939, 0.138, 18.75, 9.56, 1.767);
66 }
double xs_high_energy(double mandelstam_s, bool is_opposite_charge, double ma, double mb, double P, double R1, double R2)
total hadronic cross sections at high energies parametrized in the 2016 PDG book(http://pdg.lbl.gov/2016/reviews/rpp2016-rev-cross-section-plots.pdf)
Here is the call graph for this function:
Here is the caller graph for this function:

◆ xs_ppbar_annihilation()

double smash::xs_ppbar_annihilation ( double  mandelstam_s)

parametrized cross-section for proton-antiproton annihilation used in the UrQMD model

Parameters
[in]mandelstam_sthe rest frame total energy squared [GeV^2]
Returns
the parametrized cross-section [mb]

Definition at line 68 of file parametrizations.cc.

68  {
69  const double xs_ref = 120.;
70  const double s_ref = 4. * nucleon_mass * nucleon_mass;
71  const double constant_a = 0.05;
72  const double constant_b = 0.6;
73  const double factor = constant_a * constant_a * s_ref /
74  ((mandelstam_s - s_ref) * (mandelstam_s - s_ref) +
75  constant_a * constant_a * s_ref) +
76  constant_b;
77  return xs_ref * (s_ref / mandelstam_s) * factor;
78 }
constexpr double nucleon_mass
Nucleon mass in GeV.
Definition: constants.h:52
Here is the caller graph for this function:

◆ xs_string_hard()

double smash::xs_string_hard ( double  mandelstam_s,
double  xs_0,
double  e_0,
double  lambda_pow 
)

Utility function called by specific other parametrizations Parametrized hard scattering cross section (with partonic scattering) This parametrization is a direct fit to cross sections in PYTHIA See Sjostrand:1987su

Parameters
[in]mandelstam_sthe rest frame total energy squared [GeV^2]
[in]xs_0a fit parameter [mb]
[in]e_0a fit parameter [GeV]
[in]lambda_powa fit parameter
Returns
the parametrized cross-section [mb]

Definition at line 80 of file parametrizations.cc.

81  {
82  const double sqrts = std::sqrt(mandelstam_s);
83  if (sqrts < e_0) {
84  return 0.;
85  } else {
86  double xs = xs_0 * std::pow(std::log(sqrts / e_0), lambda_pow);
87  return xs;
88  }
89 }
Here is the caller graph for this function:

◆ NN_string_hard()

double smash::NN_string_hard ( double  mandelstam_s)

nucleon-nucleon hard scattering cross section (with partonic scattering)

Parameters
[in]mandelstam_sthe rest frame total energy squared [GeV^2]
Returns
the parametrized cross-section [mb]
See also
xs_string_hard

Definition at line 91 of file parametrizations.cc.

91  {
92  return xs_string_hard(mandelstam_s, 0.087, 4.1, 3.8);
93 }
double xs_string_hard(double mandelstam_s, double xs_0, double e_0, double lambda_pow)
Utility function called by specific other parametrizations Parametrized hard scattering cross section...
Here is the call graph for this function:
Here is the caller graph for this function:

◆ Npi_string_hard()

double smash::Npi_string_hard ( double  mandelstam_s)

nucleon-pion hard scattering cross section (with partonic scattering)

Parameters
[in]mandelstam_sthe rest frame total energy squared [GeV^2]
Returns
the parametrized cross-section [mb]
See also
xs_string_hard

Definition at line 95 of file parametrizations.cc.

95  {
96  return xs_string_hard(mandelstam_s, 0.042, 3.5, 4.2);
97 }
double xs_string_hard(double mandelstam_s, double xs_0, double e_0, double lambda_pow)
Utility function called by specific other parametrizations Parametrized hard scattering cross section...
Here is the call graph for this function:
Here is the caller graph for this function:

◆ pipi_string_hard()

double smash::pipi_string_hard ( double  mandelstam_s)

pion-pion hard scattering cross section (with partonic scattering)

Parameters
[in]mandelstam_sthe rest frame total energy squared [GeV^2]
Returns
the parametrized cross-section [mb]
See also
xs_string_hard

Definition at line 99 of file parametrizations.cc.

99  {
100  return xs_string_hard(mandelstam_s, 0.013, 2.3, 4.7);
101 }
double xs_string_hard(double mandelstam_s, double xs_0, double e_0, double lambda_pow)
Utility function called by specific other parametrizations Parametrized hard scattering cross section...
Here is the call graph for this function:
Here is the caller graph for this function:

◆ piplusp_elastic_high_energy()

double smash::piplusp_elastic_high_energy ( double  mandelstam_s,
double  m1,
double  m2 
)

pi+p elactic cross section parametrization.

Source: GiBUU:parametrizationBarMes_HighEnergy.f90 Elastic contributions from decays are not subtracted, high energy parametrization used at all energies (useful for AQM)

Parameters
[in]mandelstam_sthe rest frame total energy squared [GeV^2]
[in]m1the mass of the first particle [GeV]
[in]m2the mass of the second particle [GeV]
Returns
the parametrized cross-section [mb]

Definition at line 123 of file parametrizations.cc.

123  {
124  const double p_lab = (m1 > m2) ? plab_from_s(mandelstam_s, m2, m1)
125  : plab_from_s(mandelstam_s, m1, m2);
126  const auto logp = std::log(p_lab);
127  return 11.4 * std::pow(p_lab, -0.4) + 0.079 * logp * logp;
128 }
double plab_from_s(double mandelstam_s, double mass)
Convert Mandelstam-s to p_lab in a fixed-target collision.
Definition: kinematics.h:157
Here is the call graph for this function:
Here is the caller graph for this function:

◆ piplusp_elastic_AQM()

double smash::piplusp_elastic_AQM ( double  mandelstam_s,
double  m1,
double  m2 
)

An overload of piplusp_elastic_high_energy in which the very low part is replaced by a flat 5 mb cross section; used for meson-meson interactions.

Parameters
[in]mandelstam_sthe rest frame total energy squared [GeV^2]
[in]m1the mass of the first particle [GeV]
[in]m2the mass of the second particle [GeV]
Returns
the parametrized cross-section [mb]

Definition at line 130 of file parametrizations.cc.

130  {
131  const double p_lab = (m1 > m2) ? plab_from_s(mandelstam_s, m2, m1)
132  : plab_from_s(mandelstam_s, m1, m2);
133  if (p_lab < 3.05) { // the plab from which the param starts to explode
134  return 7.5; // this will be scaled down by 2/3 for meson-meson
135  } else {
136  return piplusp_elastic_high_energy(mandelstam_s, m1, m2);
137  }
138 }
double plab_from_s(double mandelstam_s, double mass)
Convert Mandelstam-s to p_lab in a fixed-target collision.
Definition: kinematics.h:157
double piplusp_elastic_high_energy(double mandelstam_s, double m1, double m2)
pi+p elactic cross section parametrization.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ piplusp_elastic()

double smash::piplusp_elastic ( double  mandelstam_s)

pi+p elastic cross section parametrization, PDG data.

Source: GiBUU:parametrizationBarMes_HighEnergy.f90

The parametrizations of the elastic pion+nucleon cross sections are still under tuning. The parametrizaton is employed to give a non-zero cross section at high energies. To make sure it doesn't affect the cross section at the low energies, I truncate the parametrization at p_lab = 8 GeV, which correspons to square root of s equal to 4 GeV.

Parameters
[in]mandelstam_sthe rest frame total energy squared [GeV^2]
Returns
the parametrized cross-section [mb]

Definition at line 140 of file parametrizations.cc.

140  {
141  double sigma;
142  const double p_lab = plab_from_s(mandelstam_s, pion_mass, nucleon_mass);
143  if (mandelstam_s < 2.25) {
144  sigma = really_small;
145  } else if (mandelstam_s > 4.84) {
146  const auto logp = std::log(p_lab);
147  sigma = 11.4 * std::pow(p_lab, -0.4) + 0.079 * logp * logp;
148  } else {
149  sigma = piplusp_elastic_pdg(mandelstam_s);
150  }
151 
152  // The elastic contributions from decays still need to be subtracted.
153  if (piplusp_elastic_res_interpolation == nullptr) {
154  std::vector<double> x = PIPLUSP_RES_SQRTS;
155  for (auto& i : x) {
156  i = i * i;
157  }
158  std::vector<double> y = PIPLUSP_RES_SIG;
160  make_unique<InterpolateDataSpline>(x, y);
161  }
162  // Interpolation may not be good if sqrts is beyond 2.2 GeV
163  if (mandelstam_s < 4.84) {
164  sigma -= (*piplusp_elastic_res_interpolation)(mandelstam_s);
165  }
166  if (sigma < 0) {
167  sigma = really_small;
168  }
169  return sigma;
170 }
constexpr double really_small
Numerical error tolerance.
Definition: constants.h:34
const std::initializer_list< double > PIPLUSP_RES_SIG
Elastic π⁺ N⁺ cross section contributions from decays.
constexpr double nucleon_mass
Nucleon mass in GeV.
Definition: constants.h:52
double plab_from_s(double mandelstam_s, double mass)
Convert Mandelstam-s to p_lab in a fixed-target collision.
Definition: kinematics.h:157
constexpr double pion_mass
Pion mass in GeV.
Definition: constants.h:59
static double piplusp_elastic_pdg(double mandelstam_s)
const std::initializer_list< double > PIPLUSP_RES_SQRTS
Center-of-mass energy list for π⁺ N⁺
static std::unique_ptr< InterpolateDataSpline > piplusp_elastic_res_interpolation
A null interpolation that gets filled using the PIPLUSP_RES data.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ piplusp_sigmapluskplus_pdg()

double smash::piplusp_sigmapluskplus_pdg ( double  mandelstam_s)

pi+ p to Sigma+ K+ cross section parametrization, PDG data.

The PDG data is smoothed using the LOWESS algorithm. If more than one cross section was given for one p_lab value, the corresponding cross sections are averaged.

Definition at line 177 of file parametrizations.cc.

177  {
178  if (piplusp_sigmapluskplus_interpolation == nullptr) {
179  std::vector<double> x = PIPLUSP_SIGMAPLUSKPLUS_P_LAB;
180  std::vector<double> y = PIPLUSP_SIGMAPLUSKPLUS_SIG;
181  std::vector<double> dedup_x;
182  std::vector<double> dedup_y;
183  std::tie(dedup_x, dedup_y) = dedup_avg(x, y);
184  dedup_y = smooth(dedup_x, dedup_y, 0.2, 5);
186  make_unique<InterpolateDataLinear<double>>(dedup_x, dedup_y);
187  }
188  const double p_lab = plab_from_s(mandelstam_s, pion_mass, nucleon_mass);
189  return (*piplusp_sigmapluskplus_interpolation)(p_lab);
190 }
constexpr double nucleon_mass
Nucleon mass in GeV.
Definition: constants.h:52
const std::initializer_list< double > PIPLUSP_SIGMAPLUSKPLUS_SIG
PDG data on pi+ p to Sigma+ K+ section: cross section.
double plab_from_s(double mandelstam_s, double mass)
Convert Mandelstam-s to p_lab in a fixed-target collision.
Definition: kinematics.h:157
constexpr double pion_mass
Pion mass in GeV.
Definition: constants.h:59
std::pair< std::vector< T >, std::vector< T > > dedup_avg(const std::vector< T > &x, const std::vector< T > &y)
Remove duplicates from data (x, y) by averaging y.
Definition: average.h:65
std::vector< T > smooth(const std::vector< T > &x, const std::vector< T > &y, T span=2./3, size_t iter=3, T delta=0)
Apply the LOWESS smoother (see the reference below) to the given data (x, y).
Definition: lowess.h:289
const std::initializer_list< double > PIPLUSP_SIGMAPLUSKPLUS_P_LAB
PDG data on pi+ p to Sigma+ K+ cross section: momentum in lab frame.
static std::unique_ptr< InterpolateDataLinear< double > > piplusp_sigmapluskplus_interpolation
An interpolation that gets lazily filled using the PIPLUSP_SIGMAPLUSKPLUS_SIG data.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ piminusp_elastic()

double smash::piminusp_elastic ( double  mandelstam_s)

pi-p elastic cross section parametrization Source: GiBUU:parametrizationBarMes_HighEnergy.f90

Parameters
[in]mandelstam_sthe rest frame total energy squared [GeV^2]
Returns
the parametrized cross-section [mb]

Definition at line 212 of file parametrizations.cc.

212  {
213  double sigma;
214  const double p_lab = plab_from_s(mandelstam_s, pion_mass, nucleon_mass);
215  const auto logp = std::log(p_lab);
216  if (mandelstam_s < 1.69) {
217  sigma = really_small;
218  } else if (mandelstam_s > 4.84) {
219  sigma = 1.76 + 11.2 * std::pow(p_lab, -0.64) + 0.043 * logp * logp;
220  } else {
221  sigma = piminusp_elastic_pdg(mandelstam_s);
222  }
223  /* Tune down the elastic cross section when sqrt s is between 1.8 GeV
224  * and 1.97 GeV so that the total cross section can fit the data. The
225  * scaling factor is chosen so that the it's equal to one and its
226  * derivate vanishes at the both ends. The minimum scaling factor in this
227  * region is 0.88-0.12=0.76. */
228  if (mandelstam_s > 3.24 && mandelstam_s < 3.8809) {
229  sigma *= (0.12 * cos(2 * M_PI * (sqrt(mandelstam_s) - 1.8) / (1.97 - 1.8)) +
230  0.88);
231  }
232  // The elastic contributions from decays still need to be subtracted.
233  if (piminusp_elastic_res_interpolation == nullptr) {
234  std::vector<double> x = PIMINUSP_RES_SQRTS;
235  for (auto& i : x) {
236  i = i * i;
237  }
238  std::vector<double> y = PIMINUSP_RES_SIG;
240  make_unique<InterpolateDataSpline>(x, y);
241  }
242  // Interpolation may not be good if sqrts is beyond 2.2 GeV
243  if (mandelstam_s < 4.84) {
244  sigma -= (*piminusp_elastic_res_interpolation)(mandelstam_s);
245  }
246  if (sigma < 0) {
247  sigma = really_small;
248  }
249  return sigma;
250 }
constexpr double really_small
Numerical error tolerance.
Definition: constants.h:34
const std::initializer_list< double > PIMINUSP_RES_SIG
Elastic π⁻ N⁺ cross section contributions from decays.
constexpr double nucleon_mass
Nucleon mass in GeV.
Definition: constants.h:52
const std::initializer_list< double > PIMINUSP_RES_SQRTS
Center-of-mass energy list for π⁻ N⁺
double plab_from_s(double mandelstam_s, double mass)
Convert Mandelstam-s to p_lab in a fixed-target collision.
Definition: kinematics.h:157
constexpr double pion_mass
Pion mass in GeV.
Definition: constants.h:59
static double piminusp_elastic_pdg(double mandelstam_s)
static std::unique_ptr< InterpolateDataSpline > piminusp_elastic_res_interpolation
An interpolation that gets lazily filled using the PIMINUSP_RES data.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ piminusp_lambdak0_pdg()

double smash::piminusp_lambdak0_pdg ( double  mandelstam_s)

pi- p -> Lambda K0 cross section parametrization, PDG data.

The PDG data is smoothed using the LOWESS algorithm. If more than one cross section was given for one p_lab value, the corresponding cross sections are averaged.

Definition at line 257 of file parametrizations.cc.

257  {
258  if (piminusp_lambdak0_interpolation == nullptr) {
259  std::vector<double> x = PIMINUSP_LAMBDAK0_P_LAB;
260  std::vector<double> y = PIMINUSP_LAMBDAK0_SIG;
261  std::vector<double> dedup_x;
262  std::vector<double> dedup_y;
263  std::tie(dedup_x, dedup_y) = dedup_avg(x, y);
264  dedup_y = smooth(dedup_x, dedup_y, 0.2, 6);
266  make_unique<InterpolateDataLinear<double>>(dedup_x, dedup_y);
267  }
268  const double p_lab = plab_from_s(mandelstam_s, pion_mass, nucleon_mass);
269  return (*piminusp_lambdak0_interpolation)(p_lab);
270 }
constexpr double nucleon_mass
Nucleon mass in GeV.
Definition: constants.h:52
const std::initializer_list< double > PIMINUSP_LAMBDAK0_SIG
PDG data on pi- p to Lambda K0 cross section: cross section.
double plab_from_s(double mandelstam_s, double mass)
Convert Mandelstam-s to p_lab in a fixed-target collision.
Definition: kinematics.h:157
constexpr double pion_mass
Pion mass in GeV.
Definition: constants.h:59
std::pair< std::vector< T >, std::vector< T > > dedup_avg(const std::vector< T > &x, const std::vector< T > &y)
Remove duplicates from data (x, y) by averaging y.
Definition: average.h:65
std::vector< T > smooth(const std::vector< T > &x, const std::vector< T > &y, T span=2./3, size_t iter=3, T delta=0)
Apply the LOWESS smoother (see the reference below) to the given data (x, y).
Definition: lowess.h:289
const std::initializer_list< double > PIMINUSP_LAMBDAK0_P_LAB
PDG data on pi- p to Lambda K0 cross section: momentum in lab frame.
static std::unique_ptr< InterpolateDataLinear< double > > piminusp_lambdak0_interpolation
An interpolation that gets lazily filled using the PIMINUSP_LAMBDAK0 data.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ piminusp_sigmaminuskplus_pdg()

double smash::piminusp_sigmaminuskplus_pdg ( double  mandelstam_s)

pi- p -> Sigma- K+ cross section parametrization, PDG data.

The PDG data is smoothed using the LOWESS algorithm. If more than one cross section was given for one p_lab value, the corresponding cross sections are averaged.

Definition at line 277 of file parametrizations.cc.

277  {
279  std::vector<double> x = PIMINUSP_SIGMAMINUSKPLUS_P_LAB;
280  std::vector<double> y = PIMINUSP_SIGMAMINUSKPLUS_SIG;
281  std::vector<double> dedup_x;
282  std::vector<double> dedup_y;
283  std::tie(dedup_x, dedup_y) = dedup_avg(x, y);
284  dedup_y = smooth(dedup_x, dedup_y, 0.2, 6);
286  make_unique<InterpolateDataLinear<double>>(dedup_x, dedup_y);
287  }
288  const double p_lab = plab_from_s(mandelstam_s, pion_mass, nucleon_mass);
290 }
constexpr double nucleon_mass
Nucleon mass in GeV.
Definition: constants.h:52
double plab_from_s(double mandelstam_s, double mass)
Convert Mandelstam-s to p_lab in a fixed-target collision.
Definition: kinematics.h:157
const std::initializer_list< double > PIMINUSP_SIGMAMINUSKPLUS_P_LAB
PDG data on pi- p to Sigma- K+ cross section: momentum in lab frame.
constexpr double pion_mass
Pion mass in GeV.
Definition: constants.h:59
const std::initializer_list< double > PIMINUSP_SIGMAMINUSKPLUS_SIG
PDG data on pi- p to Sigma- K+ cross section: cross section.
std::pair< std::vector< T >, std::vector< T > > dedup_avg(const std::vector< T > &x, const std::vector< T > &y)
Remove duplicates from data (x, y) by averaging y.
Definition: average.h:65
static std::unique_ptr< InterpolateDataLinear< double > > piminusp_sigmaminuskplus_interpolation
An interpolation that gets lazily filled using the PIMINUSP_SIGMAMINUSKPLUS data. ...
std::vector< T > smooth(const std::vector< T > &x, const std::vector< T > &y, T span=2./3, size_t iter=3, T delta=0)
Apply the LOWESS smoother (see the reference below) to the given data (x, y).
Definition: lowess.h:289
Here is the call graph for this function:
Here is the caller graph for this function:

◆ piminusp_sigma0k0_res()

double smash::piminusp_sigma0k0_res ( double  mandelstam_s)

pi- p -> Sigma0 K0 cross section parametrization, resonance contribution.

The data is smoothed using the LOWESS algorithm. If more than one cross section was given for one sqrts value, the corresponding cross sections are averaged.

Definition at line 297 of file parametrizations.cc.

297  {
298  if (piminusp_sigma0k0_interpolation == nullptr) {
299  std::vector<double> x = PIMINUSP_SIGMA0K0_RES_SQRTS;
300  std::vector<double> y = PIMINUSP_SIGMA0K0_RES_SIG;
301  std::vector<double> dedup_x;
302  std::vector<double> dedup_y;
303  std::tie(dedup_x, dedup_y) = dedup_avg(x, y);
304  dedup_y = smooth(dedup_x, dedup_y, 0.03, 6);
306  make_unique<InterpolateDataLinear<double>>(dedup_x, dedup_y);
307  }
308  const double sqrts = sqrt(mandelstam_s);
309  return (*piminusp_sigma0k0_interpolation)(sqrts);
310 }
static std::unique_ptr< InterpolateDataLinear< double > > piminusp_sigma0k0_interpolation
An interpolation that gets lazily filled using the PIMINUSP_SIGMA0K0_RES data.
std::pair< std::vector< T >, std::vector< T > > dedup_avg(const std::vector< T > &x, const std::vector< T > &y)
Remove duplicates from data (x, y) by averaging y.
Definition: average.h:65
std::vector< T > smooth(const std::vector< T > &x, const std::vector< T > &y, T span=2./3, size_t iter=3, T delta=0)
Apply the LOWESS smoother (see the reference below) to the given data (x, y).
Definition: lowess.h:289
const std::initializer_list< double > PIMINUSP_SIGMA0K0_RES_SIG
pi- p to Sigma0 K0 cross section: cross section
const std::initializer_list< double > PIMINUSP_SIGMA0K0_RES_SQRTS
pi- p to Sigma0 K0 cross section: square root s
Here is the call graph for this function:
Here is the caller graph for this function:

◆ pp_elastic()

double smash::pp_elastic ( double  mandelstam_s)

pp elastic cross section parametrization Source: Weil:2013mya, eq.

(44)

Parameters
[in]mandelstam_sthe rest frame total energy squared [GeV^2]
Returns
the parametrized cross-section [mb]

Definition at line 312 of file parametrizations.cc.

312  {
313  const double p_lab = plab_from_s(mandelstam_s);
314  if (p_lab < 0.435) {
315  return 5.12 * nucleon_mass /
316  (mandelstam_s - 4 * nucleon_mass * nucleon_mass) +
317  1.67;
318  } else if (p_lab < 0.8) {
319  return 23.5 + 1000 * pow_int(p_lab - 0.7, 4);
320  } else if (p_lab < 2.0) {
321  return 1250 / (p_lab + 50) - 4 * (p_lab - 1.3) * (p_lab - 1.3);
322  } else if (p_lab < 2.776) {
323  return 77 / (p_lab + 1.5);
324  } else {
325  const auto logp = std::log(p_lab);
326  return 11.9 + 26.9 * std::pow(p_lab, -1.21) + 0.169 * logp * logp -
327  1.85 * logp;
328  }
329 }
constexpr T pow_int(const T base, unsigned const exponent)
Efficient template for calculating integer powers using squaring.
Definition: pow.h:23
constexpr double nucleon_mass
Nucleon mass in GeV.
Definition: constants.h:52
double plab_from_s(double mandelstam_s, double mass)
Convert Mandelstam-s to p_lab in a fixed-target collision.
Definition: kinematics.h:157
Here is the call graph for this function:
Here is the caller graph for this function:

◆ pp_elastic_high_energy()

double smash::pp_elastic_high_energy ( double  mandelstam_s,
double  m1,
double  m2 
)

pp elastic cross section parametrization, with only the high energy part generalized to all energy regimes (used for AQM) Source: Weil:2013mya, eq.

(44)

Parameters
[in]mandelstam_sthe rest frame total energy squared [GeV^2]
[in]m1the mass of the first particle [GeV]
[in]m2the mass of the second particle [GeV]
Returns
the parametrized cross-section [mb]

Definition at line 331 of file parametrizations.cc.

331  {
332  const double p_lab = (m1 > m2) ? plab_from_s(mandelstam_s, m2, m1)
333  : plab_from_s(mandelstam_s, m1, m2);
334  const auto logp = std::log(p_lab);
335  return 11.9 + 26.9 * std::pow(p_lab, -1.21) + 0.169 * logp * logp -
336  1.85 * logp;
337 }
double plab_from_s(double mandelstam_s, double mass)
Convert Mandelstam-s to p_lab in a fixed-target collision.
Definition: kinematics.h:157
Here is the call graph for this function:
Here is the caller graph for this function:

◆ pp_total()

double smash::pp_total ( double  mandelstam_s)

pp total cross section parametrization Sources: low-p: Cugnon:1996kh highest-p: Buss:2011mx

Parameters
[in]mandelstam_sthe rest frame total energy squared [GeV^2]
Returns
the parametrized cross-section [mb]

Definition at line 339 of file parametrizations.cc.

339  {
340  const double p_lab = plab_from_s(mandelstam_s);
341  if (p_lab < 0.4) {
342  return 34 * std::pow(p_lab / 0.4, -2.104);
343  } else if (p_lab < 0.8) {
344  return 23.5 + 1000 * pow_int(p_lab - 0.7, 4);
345  } else if (p_lab < 1.5) {
346  return 23.5 + 24.6 / (1 + std::exp(-(p_lab - 1.2) / 0.1));
347  } else if (p_lab < 5.0) {
348  return 41 + 60 * (p_lab - 0.9) * std::exp(-1.2 * p_lab);
349  } else {
350  const auto logp = std::log(p_lab);
351  return 48.0 + 0.522 * logp * logp - 4.51 * logp;
352  }
353 }
constexpr T pow_int(const T base, unsigned const exponent)
Efficient template for calculating integer powers using squaring.
Definition: pow.h:23
double plab_from_s(double mandelstam_s, double mass)
Convert Mandelstam-s to p_lab in a fixed-target collision.
Definition: kinematics.h:157
Here is the call graph for this function:

◆ np_elastic()

double smash::np_elastic ( double  mandelstam_s)

np elastic cross section parametrization Source: Weil:2013mya, eq.

(45)

Parameters
[in]mandelstam_sthe rest frame total energy squared [GeV^2]
Returns
the parametrized cross-section [mb]

Definition at line 355 of file parametrizations.cc.

355  {
356  const double p_lab = plab_from_s(mandelstam_s);
357  if (p_lab < 0.525) {
358  return 17.05 * nucleon_mass /
359  (mandelstam_s - 4 * nucleon_mass * nucleon_mass) -
360  6.83;
361  } else if (p_lab < 0.8) {
362  return 33 + 196 * std::pow(std::abs(p_lab - 0.95), 2.5);
363  } else if (p_lab < 2.0) {
364  return 31 / std::sqrt(p_lab);
365  } else if (p_lab < 2.776) {
366  return 77 / (p_lab + 1.5);
367  } else {
368  const auto logp = std::log(p_lab);
369  return 11.9 + 26.9 * std::pow(p_lab, -1.21) + 0.169 * logp * logp -
370  1.85 * logp;
371  }
372 }
constexpr double nucleon_mass
Nucleon mass in GeV.
Definition: constants.h:52
double plab_from_s(double mandelstam_s, double mass)
Convert Mandelstam-s to p_lab in a fixed-target collision.
Definition: kinematics.h:157
Here is the call graph for this function:
Here is the caller graph for this function:

◆ np_total()

double smash::np_total ( double  mandelstam_s)

np total cross section parametrization Sources: low-p: Cugnon:1996kh highest-p: Buss:2011mx

Parameters
[in]mandelstam_sthe rest frame total energy squared [GeV^2]
Returns
the parametrized cross-section [mb]

Definition at line 374 of file parametrizations.cc.

374  {
375  const double p_lab = plab_from_s(mandelstam_s);
376  const auto logp = std::log(p_lab);
377  if (p_lab < 0.4) {
378  return 6.3555 * std::pow(p_lab, -3.2481) * std::exp(-0.377 * logp * logp);
379  } else if (p_lab < 1.0) {
380  return 33 + 196 * std::pow(std::abs(p_lab - 0.95), 2.5);
381  } else if (p_lab < 2.0) {
382  return 24.2 + 8.9 * p_lab;
383  } else if (p_lab < 5.0) {
384  return 42;
385  } else {
386  return 48.0 + 0.522 * logp * logp - 4.51 * logp;
387  }
388 }
double plab_from_s(double mandelstam_s, double mass)
Convert Mandelstam-s to p_lab in a fixed-target collision.
Definition: kinematics.h:157
Here is the call graph for this function:

◆ ppbar_elastic()

double smash::ppbar_elastic ( double  mandelstam_s)

ppbar elastic cross section parametrization Source: Bass:1998ca

Parameters
[in]mandelstam_sthe rest frame total energy squared [GeV^2]
Returns
the parametrized cross-section [mb]

Definition at line 390 of file parametrizations.cc.

390  {
391  const double p_lab = plab_from_s(mandelstam_s);
392  if (p_lab < 0.3) {
393  return 78.6;
394  } else if (p_lab < 5.0) {
395  return 31.6 + 18.3 / p_lab - 1.1 / (p_lab * p_lab) - 3.8 * p_lab;
396  } else {
397  const auto logp = std::log(p_lab);
398  return 10.2 + 52.7 * std::pow(p_lab, -1.16) + 0.125 * logp * logp -
399  1.28 * logp;
400  }
401 }
double plab_from_s(double mandelstam_s, double mass)
Convert Mandelstam-s to p_lab in a fixed-target collision.
Definition: kinematics.h:157
Here is the call graph for this function:
Here is the caller graph for this function:

◆ ppbar_total()

double smash::ppbar_total ( double  mandelstam_s)

ppbar total cross section parametrization Source: Bass:1998ca

Parameters
[in]mandelstam_sthe rest frame total energy squared [GeV^2]
Returns
the parametrized cross-section [mb]

Definition at line 403 of file parametrizations.cc.

403  {
404  const double p_lab = plab_from_s(mandelstam_s);
405  if (p_lab < 0.3) {
406  return 271.6 * std::exp(-1.1 * p_lab * p_lab);
407  } else if (p_lab < 5.0) {
408  return 75.0 + 43.1 / p_lab + 2.6 / (p_lab * p_lab) - 3.9 * p_lab;
409  } else {
410  const auto logp = std::log(p_lab);
411  return 38.4 + 77.6 * std::pow(p_lab, -0.64) + 0.26 * logp * logp -
412  1.2 * logp;
413  }
414 }
double plab_from_s(double mandelstam_s, double mass)
Convert Mandelstam-s to p_lab in a fixed-target collision.
Definition: kinematics.h:157
Here is the call graph for this function:
Here is the caller graph for this function:

◆ deuteron_pion_elastic()

double smash::deuteron_pion_elastic ( double  mandelstam_s)

Deuteron pion elastic cross-section [mb] parametrized to fit pi-d elastic scattering data (the data collection was be obtained from SAID data base, gwdac.phys.gwu.edu)

Parameters
[in]mandelstam_sthe rest frame total energy squared [GeV^2]
Returns
the parametrized cross-section [mb]

Definition at line 416 of file parametrizations.cc.

416  {
417  const double tmp = std::sqrt(mandelstam_s) - 2.172;
418  return 4.0 + 0.27 / (tmp * tmp + 0.065 * 0.065);
419 }
Here is the caller graph for this function:

◆ deuteron_nucleon_elastic()

double smash::deuteron_nucleon_elastic ( double  mandelstam_s)

Deuteron nucleon elastic cross-section [mb] parametrized by Oh:2009gx.

Parameters
[in]mandelstam_sthe rest frame total energy squared [GeV^2]
Returns
the parametrized cross-section [mb]

Definition at line 421 of file parametrizations.cc.

421  {
422  const double s = mandelstam_s;
423  return 2500.0 * std::exp(-smash::square(s - 7.93) / 0.003) +
424  600.0 * std::exp(-smash::square(s - 7.93) / 0.1) + 10.0;
425 }
constexpr T square(const T base)
Efficient template for calculating the square.
Definition: pow.h:38
Here is the call graph for this function:
Here is the caller graph for this function:

◆ kplusp_elastic_background()

double smash::kplusp_elastic_background ( double  mandelstam_s)

K+ p elastic background cross section parametrization.

sigma(K+n->K+n) = sigma(K+n->K0p) = 0.5 * sigma(K+p->K+p) Source: Buss:2011mx, B.3.8

Parameters
[in]mandelstam_sthe rest frame total energy squared [GeV^2]
Returns
the parametrized cross-section [mb]

Definition at line 427 of file parametrizations.cc.

427  {
428  constexpr double a0 = 10.508; // mb
429  constexpr double a1 = -3.716; // mb/GeV
430  constexpr double a2 = 1.845; // mb/GeV^2
431  constexpr double a3 = -0.764; // GeV^-1
432  constexpr double a4 = 0.508; // GeV^-2
433 
434  const double p_lab = plab_from_s(mandelstam_s, kaon_mass, nucleon_mass);
435  const double p_lab2 = p_lab * p_lab;
436 
437  return (a0 + a1 * p_lab + a2 * p_lab2) / (1 + a3 * p_lab + a4 * p_lab2);
438 }
constexpr double nucleon_mass
Nucleon mass in GeV.
Definition: constants.h:52
double plab_from_s(double mandelstam_s, double mass)
Convert Mandelstam-s to p_lab in a fixed-target collision.
Definition: kinematics.h:157
constexpr double kaon_mass
Kaon mass in GeV.
Definition: constants.h:66
Here is the call graph for this function:
Here is the caller graph for this function:

◆ kplusn_elastic_background()

double smash::kplusn_elastic_background ( double  mandelstam_s)

K+ n elastic background cross section parametrization sigma(K+n->K+n) = sigma(K+n->K0p) = 0.5 * sigma(K+p->K+p) Source: Buss:2011mx, B.3.8.

Parameters
[in]mandelstam_sthe rest frame total energy squared [GeV^2]
Returns
the parametrized cross-section [mb]

Definition at line 440 of file parametrizations.cc.

440  {
441  return 0.25 * kplusp_elastic_background(mandelstam_s);
442 }
double kplusp_elastic_background(double mandelstam_s)
K+ p elastic background cross section parametrization.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ kplusn_k0p()

double smash::kplusn_k0p ( double  mandelstam_s)

K+ n charge exchange cross section parametrization.

sigma(K+n->K+n) = sigma(K+n->K0p) = 0.5 * sigma(K+p->K+p) Source: Buss:2011mx, B.3.8

Parameters
[in]mandelstam_sthe rest frame total energy squared [GeV^2]
Returns
the parametrized cross-section [mb]

Definition at line 444 of file parametrizations.cc.

444  {
445  return 0.25 * kplusp_elastic_background(mandelstam_s);
446 }
double kplusp_elastic_background(double mandelstam_s)
K+ p elastic background cross section parametrization.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ kminusp_elastic_background()

double smash::kminusp_elastic_background ( double  mandelstam_s)

K- p elastic background cross section parametrization Source: Buss:2011mx, B.3.9.

Parameters
[in]mandelstam_sthe rest frame total energy squared [GeV^2]
Returns
the parametrized cross-section [mb]

Definition at line 468 of file parametrizations.cc.

468  {
469  const double p_lab = plab_from_s(mandelstam_s, kaon_mass, nucleon_mass);
470  double sigma;
471  if (std::sqrt(mandelstam_s) < 1.68) {
472  /* The parametrization here also works for anti-K0 n, Lambda pi0,
473  * Sigma+ pi-, Sigma- pi+, Sigma0 pi0 with different parameters a0, a1, a2.
474  *
475  * The values of the parameters are *not* taken from the source above,
476  * they come from a fit to PDG data. */
477  constexpr double a0 = 186.03567644; // mb GeV^2
478  constexpr double a1 = 0.22002795; // Gev
479  constexpr double a2 = 0.64907116;
480 
481  const double p_i = p_lab;
482  const double p_f = p_lab;
483 
484  const double ratio = a1 * a1 / (a1 * a1 + p_f * p_f);
485  sigma = a0 * p_f / (p_i * mandelstam_s) * std::pow(ratio, a2);
486  } else {
487  sigma = kminusp_elastic_pdg(mandelstam_s);
488  }
489  // The elastic contributions from decays still need to be subtracted.
490  if (kminusp_elastic_res_interpolation == nullptr) {
491  std::vector<double> x = KMINUSP_RES_SQRTS;
492  for (auto& i : x) {
493  i = plab_from_s(i * i, kaon_mass, nucleon_mass);
494  }
495  std::vector<double> y = KMINUSP_RES_SIG;
497  make_unique<InterpolateDataSpline>(x, y);
498  }
499  const auto old_sigma = sigma;
500  sigma -= (*kminusp_elastic_res_interpolation)(p_lab);
501  if (sigma < 0) {
502  std::cout << "NEGATIVE SIGMA: sigma=" << sigma
503  << ", sqrt(s)=" << std::sqrt(mandelstam_s)
504  << ", sig_el_exp=" << old_sigma
505  << ", sig_el_res=" << (*kminusp_elastic_res_interpolation)(p_lab)
506  << std::endl;
507  }
508  assert(sigma >= 0);
509  return sigma;
510 }
constexpr double nucleon_mass
Nucleon mass in GeV.
Definition: constants.h:52
double plab_from_s(double mandelstam_s, double mass)
Convert Mandelstam-s to p_lab in a fixed-target collision.
Definition: kinematics.h:157
static std::unique_ptr< InterpolateDataSpline > kminusp_elastic_res_interpolation
An interpolation that gets lazily filled using the KMINUSP_RES data.
const std::initializer_list< double > KMINUSP_RES_SIG
Elastic K̅⁻ N⁺ cross section contributions from decays.
constexpr double kaon_mass
Kaon mass in GeV.
Definition: constants.h:66
static double kminusp_elastic_pdg(double mandelstam_s)
const std::initializer_list< double > KMINUSP_RES_SQRTS
Center-of-mass energy list for K̅⁻ N⁺
Here is the call graph for this function:
Here is the caller graph for this function:

◆ kminusn_elastic_background()

double smash::kminusn_elastic_background ( double  mandelstam_s)

K- n elastic background cross section parametrization Source: Buss:2011mx, B.3.9.

Parameters
[in]mandelstam_sthe rest frame total energy squared [GeV^2]
Returns
the parametrized cross-section [mb]

Definition at line 512 of file parametrizations.cc.

512 { return 4.0; }
Here is the caller graph for this function:

◆ k0p_elastic_background()

double smash::k0p_elastic_background ( double  mandelstam_s)

K0 p elastic background cross section parametrization Source: Buss:2011mx, B.3.9.

Parameters
[in]mandelstam_sthe rest frame total energy squared [GeV^2]
Returns
the parametrized cross-section [mb]

Definition at line 514 of file parametrizations.cc.

514  {
515  // by isospin symmetry
516  return kplusn_elastic_background(mandelstam_s);
517 }
double kplusn_elastic_background(double mandelstam_s)
K+ n elastic background cross section parametrization sigma(K+n->K+n) = sigma(K+n->K0p) = 0...
Here is the call graph for this function:
Here is the caller graph for this function:

◆ k0n_elastic_background()

double smash::k0n_elastic_background ( double  mandelstam_s)

K0 n elastic background cross section parametrization Source: Buss:2011mx, B.3.9.

Parameters
[in]mandelstam_sthe rest frame total energy squared [GeV^2]
Returns
the parametrized cross-section [mb]

Definition at line 519 of file parametrizations.cc.

519  {
520  // by isospin symmetry
521  return kplusp_elastic_background(mandelstam_s);
522 }
double kplusp_elastic_background(double mandelstam_s)
K+ p elastic background cross section parametrization.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ kbar0p_elastic_background()

double smash::kbar0p_elastic_background ( double  mandelstam_s)

Kbar0 p elastic background cross section parametrization Source: Buss:2011mx, B.3.9.

Parameters
[in]mandelstam_sthe rest frame total energy squared [GeV^2]
Returns
the parametrized cross-section [mb]

Definition at line 524 of file parametrizations.cc.

524  {
525  // by isospin symmetry
526  return kminusn_elastic_background(mandelstam_s);
527 }
double kminusn_elastic_background(double mandelstam_s)
K- n elastic background cross section parametrization Source: Buss:2011mx, B.3.9. ...
Here is the call graph for this function:
Here is the caller graph for this function:

◆ kbar0n_elastic_background()

double smash::kbar0n_elastic_background ( double  mandelstam_s)

Kbar0 n elastic background cross section parametrization Source: Buss:2011mx, B.3.9.

Parameters
[in]mandelstam_sthe rest frame total energy squared [GeV^2]
Returns
the parametrized cross-section [mb]

Definition at line 529 of file parametrizations.cc.

529  {
530  // by isospin symmetry
531  return kminusp_elastic_background(mandelstam_s);
532 }
double kminusp_elastic_background(double mandelstam_s)
K- p elastic background cross section parametrization Source: Buss:2011mx, B.3.9. ...
Here is the call graph for this function:
Here is the caller graph for this function:

◆ kplusp_inelastic_background()

double smash::kplusp_inelastic_background ( double  mandelstam_s)

K+ p inelastic background cross section parametrization Source: Buss:2011mx, B.3.8.

Parameters
[in]mandelstam_sthe rest frame total energy squared [GeV^2]
Returns
the parametrized cross-section [mb]

Definition at line 534 of file parametrizations.cc.

534  {
535  if (kplusp_total_interpolation == nullptr) {
536  std::vector<double> x = KPLUSP_TOT_PLAB;
537  std::vector<double> y = KPLUSP_TOT_SIG;
538  std::vector<double> dedup_x;
539  std::vector<double> dedup_y;
540  std::tie(dedup_x, dedup_y) = dedup_avg(x, y);
541  dedup_y = smooth(dedup_x, dedup_y, 0.1, 5);
543  make_unique<InterpolateDataLinear<double>>(dedup_x, dedup_y);
544  }
545  const double p_lab = plab_from_s(mandelstam_s, kaon_mass, nucleon_mass);
547  mandelstam_s);
548 }
const std::initializer_list< double > KPLUSP_TOT_PLAB
PDG data on K+ p total cross section: momentum in lab frame.
double kplusp_elastic_background(double mandelstam_s)
K+ p elastic background cross section parametrization.
constexpr double nucleon_mass
Nucleon mass in GeV.
Definition: constants.h:52
double plab_from_s(double mandelstam_s, double mass)
Convert Mandelstam-s to p_lab in a fixed-target collision.
Definition: kinematics.h:157
std::pair< std::vector< T >, std::vector< T > > dedup_avg(const std::vector< T > &x, const std::vector< T > &y)
Remove duplicates from data (x, y) by averaging y.
Definition: average.h:65
std::vector< T > smooth(const std::vector< T > &x, const std::vector< T > &y, T span=2./3, size_t iter=3, T delta=0)
Apply the LOWESS smoother (see the reference below) to the given data (x, y).
Definition: lowess.h:289
constexpr double kaon_mass
Kaon mass in GeV.
Definition: constants.h:66
const std::initializer_list< double > KPLUSP_TOT_SIG
PDG data on K+ p total cross section: cross section.
static std::unique_ptr< InterpolateDataLinear< double > > kplusp_total_interpolation
An interpolation that gets lazily filled using the KPLUSP_TOT data.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ kplusn_inelastic_background()

double smash::kplusn_inelastic_background ( double  mandelstam_s)

K+ n inelastic background cross section parametrization Source: Buss:2011mx, B.3.8.

This interpolates the experimental data of the total cross section and subtracts the elastic and charge exchange cross section.

Parameters
[in]mandelstam_sthe rest frame total energy squared [GeV^2]
Returns
the parametrized cross-section [mb]

Definition at line 550 of file parametrizations.cc.

550  {
551  if (kplusn_total_interpolation == nullptr) {
552  std::vector<double> x = KPLUSN_TOT_PLAB;
553  std::vector<double> y = KPLUSN_TOT_SIG;
554  std::vector<double> dedup_x;
555  std::vector<double> dedup_y;
556  std::tie(dedup_x, dedup_y) = dedup_avg(x, y);
557  dedup_y = smooth(dedup_x, dedup_y, 0.05, 5);
559  make_unique<InterpolateDataLinear<double>>(dedup_x, dedup_y);
560  }
561  const double p_lab = plab_from_s(mandelstam_s, kaon_mass, nucleon_mass);
563  mandelstam_s) -
564  kplusn_k0p(mandelstam_s);
565 }
const std::initializer_list< double > KPLUSN_TOT_SIG
PDG data on K+ n total cross section: cross section.
constexpr double nucleon_mass
Nucleon mass in GeV.
Definition: constants.h:52
static std::unique_ptr< InterpolateDataLinear< double > > kplusn_total_interpolation
An interpolation that gets lazily filled using the KPLUSN_TOT data.
double kplusn_k0p(double mandelstam_s)
K+ n charge exchange cross section parametrization.
double plab_from_s(double mandelstam_s, double mass)
Convert Mandelstam-s to p_lab in a fixed-target collision.
Definition: kinematics.h:157
std::pair< std::vector< T >, std::vector< T > > dedup_avg(const std::vector< T > &x, const std::vector< T > &y)
Remove duplicates from data (x, y) by averaging y.
Definition: average.h:65
double kplusn_elastic_background(double mandelstam_s)
K+ n elastic background cross section parametrization sigma(K+n->K+n) = sigma(K+n->K0p) = 0...
std::vector< T > smooth(const std::vector< T > &x, const std::vector< T > &y, T span=2./3, size_t iter=3, T delta=0)
Apply the LOWESS smoother (see the reference below) to the given data (x, y).
Definition: lowess.h:289
constexpr double kaon_mass
Kaon mass in GeV.
Definition: constants.h:66
const std::initializer_list< double > KPLUSN_TOT_PLAB
PDG data on K+ n total cross section: momentum in lab frame.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ kminusp_kbar0n()

double smash::kminusp_kbar0n ( double  mandelstam_s)

K- p <-> Kbar0 n cross section parametrization.

Source: Buss:2011mx, B.3.9

Parameters
[in]mandelstam_sthe rest frame total energy squared [GeV^2]
Returns
the parametrized cross-section [mb]

Definition at line 672 of file parametrizations.cc.

672  {
673  constexpr double a0 = 100; // mb GeV^2
674  constexpr double a1 = 0.15; // GeV
675  constexpr unsigned a2 = 2;
676 
677  const double p_lab = plab_from_s(mandelstam_s, kaon_mass, nucleon_mass);
678  const double p_i = p_lab;
679  const double p_f = p_lab;
680 
681  return a0 * p_f / (p_i * mandelstam_s) *
682  pow_int(a1 * a1 / (a1 * a1 + p_f * p_f), a2);
683 }
constexpr T pow_int(const T base, unsigned const exponent)
Efficient template for calculating integer powers using squaring.
Definition: pow.h:23
constexpr double nucleon_mass
Nucleon mass in GeV.
Definition: constants.h:52
double plab_from_s(double mandelstam_s, double mass)
Convert Mandelstam-s to p_lab in a fixed-target collision.
Definition: kinematics.h:157
constexpr double kaon_mass
Kaon mass in GeV.
Definition: constants.h:66
Here is the call graph for this function:
Here is the caller graph for this function:

◆ kminusp_piminussigmaplus()

double smash::kminusp_piminussigmaplus ( double  sqrts)

K- p <-> pi- Sigma+ cross section parametrization Taken from UrQMD (Graef:2014mra).

Parameters
[in]sqrtsthe rest frame total energy [GeV]
Returns
the parametrized cross-section [mb]

Definition at line 685 of file parametrizations.cc.

685  {
686  return 0.0788265 / smash::square(sqrts - 1.38841);
687 }
constexpr T square(const T base)
Efficient template for calculating the square.
Definition: pow.h:38
Here is the call graph for this function:
Here is the caller graph for this function:

◆ kminusp_piplussigmaminus()

double smash::kminusp_piplussigmaminus ( double  sqrts)

K- p <-> pi+ Sigma- cross section parametrization Taken from UrQMD (Graef:2014mra).

Parameters
[in]sqrtsthe rest frame total energy [GeV]
Returns
the parametrized cross-section [mb]

Definition at line 689 of file parametrizations.cc.

689  {
690  return 0.0196741 / smash::square(sqrts - 1.42318);
691 }
constexpr T square(const T base)
Efficient template for calculating the square.
Definition: pow.h:38
Here is the call graph for this function:
Here is the caller graph for this function:

◆ kminusp_pi0sigma0()

double smash::kminusp_pi0sigma0 ( double  sqrts)

K- p <-> pi0 Sigma0 cross section parametrization Fit to Landolt-Börnstein instead of UrQMD values.

Parameters
[in]sqrtsthe rest frame total energy [GeV]
Returns
the parametrized cross-section [mb]

Definition at line 693 of file parametrizations.cc.

693  {
694  return 0.0403364 / smash::square(sqrts - 1.39830305);
695 }
constexpr T square(const T base)
Efficient template for calculating the square.
Definition: pow.h:38
Here is the call graph for this function:
Here is the caller graph for this function:

◆ kminusp_pi0lambda()

double smash::kminusp_pi0lambda ( double  sqrts)

K- p <-> pi0 Lambda cross section parametrization Fit to Landolt-Börnstein instead of UrQMD values.

Todo:
clarify this
Parameters
[in]sqrtsthe rest frame total energy [GeV]
Returns
the parametrized cross-section [mb]

Definition at line 697 of file parametrizations.cc.

697  {
698  return 0.05932562 / smash::square(sqrts - 1.38786692);
699 }
constexpr T square(const T base)
Efficient template for calculating the square.
Definition: pow.h:38
Here is the call graph for this function:
Here is the caller graph for this function:

◆ kminusn_piminussigma0()

double smash::kminusn_piminussigma0 ( double  sqrts)

K- n <-> pi- Sigma0 cross section parametrization Follow from the parametrization with the same strange product via isospin symmetry.

Parameters
[in]sqrtsthe rest frame total energy [GeV]
Returns
the parametrized cross-section [mb]

Definition at line 701 of file parametrizations.cc.

701  {
702  return kminusp_piminussigmaplus(sqrts) + kminusp_piplussigmaminus(sqrts) -
703  2. * kminusp_pi0sigma0(sqrts);
704 }
double kminusp_piminussigmaplus(double sqrts)
K- p <-> pi- Sigma+ cross section parametrization Taken from UrQMD (Graef:2014mra).
double kminusp_pi0sigma0(double sqrts)
K- p <-> pi0 Sigma0 cross section parametrization Fit to Landolt-Börnstein instead of UrQMD values...
double kminusp_piplussigmaminus(double sqrts)
K- p <-> pi+ Sigma- cross section parametrization Taken from UrQMD (Graef:2014mra).
Here is the call graph for this function:
Here is the caller graph for this function:

◆ kminusn_pi0sigmaminus()

double smash::kminusn_pi0sigmaminus ( double  sqrts)

K- n <-> pi0 Sigma- cross section parametrization Follow from the parametrization with the same strange product via isospin symmetry.

Parameters
[in]sqrtsthe rest frame total energy [GeV]
Returns
the parametrized cross-section [mb]

◆ kminusn_piminuslambda()

double smash::kminusn_piminuslambda ( double  sqrts)

K- n <-> pi- Lambda cross section parametrization Follow from the parametrization with the same strange product via isospin symmetry.

Parameters
[in]sqrtsthe rest frame total energy [GeV]
Returns
the parametrized cross-section [mb]

Definition at line 706 of file parametrizations.cc.

706  {
707  return 2. * kminusp_pi0lambda(sqrts);
708 }
double kminusp_pi0lambda(double sqrts)
K- p <-> pi0 Lambda cross section parametrization Fit to Landolt-Börnstein instead of UrQMD values...
Here is the call graph for this function:
Here is the caller graph for this function:

◆ lambdalambda_ximinusp()

double smash::lambdalambda_ximinusp ( double  sqrts_sqrts0,
double  p_N,
double  p_lambda 
)

Lambda Lambda <-> Xi- p cross section parametrization Two hyperon exchange, based on effective model by Feng Li, as in UrQMD (Graef:2014mra).

Parameters
[in]sqrts_sqrts0the rest frame total energy minus threshold energy [GeV]
[in]p_Nmomentum of outgoing nucleon in center of mass frame [GeV]
[in]p_lambdamomentum of incoming lambda in center of mass frame [GeV]
Returns
the parametrized cross-section [mb]

Definition at line 712 of file parametrizations.cc.

712  {
713  assert(p_lambda != 0);
714  assert(sqrts_sqrts0 >= 0);
715  return 37.15 / 2 * p_N / p_lambda * std::pow(sqrts_sqrts0, -0.16);
716 }
Here is the caller graph for this function:

◆ lambdalambda_xi0n()

double smash::lambdalambda_xi0n ( double  sqrts_sqrts0,
double  p_N,
double  p_lambda 
)

Lambda Lambda <-> Xi0 n cross section parametrization Two hyperon exchange, based on effective model by Feng Li, as in UrQMD (Graef:2014mra).

Parameters
[in]sqrts_sqrts0the rest frame total energy minus threshold energy [GeV]
[in]p_Nmomentum of outgoing nucleon in center of mass frame [GeV]
[in]p_lambdamomentum of incoming lambda in center of mass frame [GeV]
Returns
the parametrized cross-section [mb]

Definition at line 718 of file parametrizations.cc.

718  {
719  return lambdalambda_ximinusp(sqrts_sqrts0, p_N, p_lambda);
720 }
double lambdalambda_ximinusp(double sqrts_sqrts0, double p_N, double p_lambda)
Lambda Lambda <-> Xi- p cross section parametrization Two hyperon exchange, based on effective model ...
Here is the call graph for this function:

◆ lambdasigmaplus_xi0p()

double smash::lambdasigmaplus_xi0p ( double  sqrts_sqrts0)

Lambda Sigma+ <-> Xi0 p cross section parametrization Two hyperon exchange, based on effective model by Feng Li, as in UrQMD (Graef:2014mra).

Parameters
[in]sqrts_sqrts0the rest frame total energy minus threshold energy [GeV]
Returns
the parametrized cross-section [mb]

Definition at line 722 of file parametrizations.cc.

722  {
723  assert(sqrts_sqrts0 >= 0);
724  return 24.3781 * std::pow(sqrts_sqrts0, -0.479);
725 }
Here is the caller graph for this function:

◆ lambdasigmaminus_ximinusn()

double smash::lambdasigmaminus_ximinusn ( double  sqrts_sqrts0)

Lambda Sigma- <-> Xi- n cross section parametrization Two hyperon exchange, based on effective model by Feng Li, as in UrQMD (Graef:2014mra).

Parameters
[in]sqrts_sqrts0the rest frame total energy minus threshold energy [GeV]
Returns
the parametrized cross-section [mb]

Definition at line 727 of file parametrizations.cc.

727  {
728  return lambdasigmaplus_xi0p(sqrts_sqrts0);
729 }
double lambdasigmaplus_xi0p(double sqrts_sqrts0)
Lambda Sigma+ <-> Xi0 p cross section parametrization Two hyperon exchange, based on effective model ...
Here is the call graph for this function:

◆ lambdasigma0_ximinusp()

double smash::lambdasigma0_ximinusp ( double  sqrts_sqrts0)

Lambda Sigma0 <-> Xi- p cross section parametrization Two hyperon exchange, based on effective model by Feng Li, as in UrQMD (Graef:2014mra).

Parameters
[in]sqrts_sqrts0the rest frame total energy minus threshold energy [GeV]
Returns
the parametrized cross-section [mb]

Definition at line 731 of file parametrizations.cc.

731  {
732  assert(sqrts_sqrts0 >= 0);
733  if (sqrts_sqrts0 < 0.03336) {
734  return 6.475 * std::pow(sqrts_sqrts0, -0.4167);
735  } else {
736  return 14.5054 * std::pow(sqrts_sqrts0, -0.1795);
737  }
738 }
Here is the caller graph for this function:

◆ lambdasigma0_xi0n()

double smash::lambdasigma0_xi0n ( double  sqrts_sqrts0)

Lambda Sigma0 <-> Xi0 n cross section parametrization Two hyperon exchange, based on effective model by Feng Li, as in UrQMD (Graef:2014mra).

Parameters
[in]sqrts_sqrts0the rest frame total energy minus threshold energy [GeV]
Returns
the parametrized cross-section [mb]

Definition at line 740 of file parametrizations.cc.

740  {
741  return lambdasigma0_ximinusp(sqrts_sqrts0);
742 }
double lambdasigma0_ximinusp(double sqrts_sqrts0)
Lambda Sigma0 <-> Xi- p cross section parametrization Two hyperon exchange, based on effective model ...
Here is the call graph for this function:

◆ sigma0sigma0_ximinusp()

double smash::sigma0sigma0_ximinusp ( double  sqrts_sqrts0)

Sigma0 Sigma0 <-> Xi- p cross section parametrization Two hyperon exchange, based on effective model by Feng Li, as in UrQMD (Graef:2014mra).

Parameters
[in]sqrts_sqrts0the rest frame total energy minus threshold energy [GeV]
Returns
the parametrized cross-section [mb]

Definition at line 744 of file parametrizations.cc.

744  {
745  assert(sqrts_sqrts0 >= 0);
746  if (sqrts_sqrts0 < 0.09047) {
747  return 5.625 * std::pow(sqrts_sqrts0, -0.318);
748  } else {
749  return 4.174 * std::pow(sqrts_sqrts0, -0.4421);
750  }
751 }
Here is the caller graph for this function:

◆ sigma0sigma0_xi0n()

double smash::sigma0sigma0_xi0n ( double  sqrts_sqrts0)

Sigma0 Sigma0 <-> Xi0 n cross section parametrization Two hyperon exchange, based on effective model by Feng Li, as in UrQMD (Graef:2014mra).

Note that there is a typo in the paper in equation (6): "Lambda Sigma0 -> Xi0 n" should be "Sigma0 Sigma0 -> Xi0 n".

Parameters
[in]sqrts_sqrts0the rest frame total energy minus threshold energy [GeV]
Returns
the parametrized cross-section [mb]

Definition at line 753 of file parametrizations.cc.

753  {
754  return sigma0sigma0_ximinusp(sqrts_sqrts0);
755 }
double sigma0sigma0_ximinusp(double sqrts_sqrts0)
Sigma0 Sigma0 <-> Xi- p cross section parametrization Two hyperon exchange, based on effective model ...
Here is the call graph for this function:

◆ sigmaplussigmaminus_xi0p()

double smash::sigmaplussigmaminus_xi0p ( double  sqrts_sqrts0)

Sigma+ Sigma- <-> Xi0 p cross section parametrization Two hyperon exchange, based on effective model by Feng Li, as in UrQMD (Graef:2014mra).

Parameters
[in]sqrts_sqrts0the rest frame total energy minus threshold energy [GeV]
Returns
the parametrized cross-section [mb]

Definition at line 757 of file parametrizations.cc.

757  {
758  return 4 * sigma0sigma0_ximinusp(sqrts_sqrts0);
759 }
double sigma0sigma0_ximinusp(double sqrts_sqrts0)
Sigma0 Sigma0 <-> Xi- p cross section parametrization Two hyperon exchange, based on effective model ...
Here is the call graph for this function:

◆ sigma0sigmaminus_ximinusn()

double smash::sigma0sigmaminus_ximinusn ( double  sqrts_sqrts0)

Sigma0 Sigma- <-> Xi- n cross section parametrization Two hyperon exchange, based on effective model by Feng Li, as in UrQMD (Graef:2014mra).

Parameters
[in]sqrts_sqrts0the rest frame total energy minus threshold energy [GeV]
Returns
the parametrized cross-section [mb]

Definition at line 761 of file parametrizations.cc.

761  {
762  return 4 * sigma0sigma0_ximinusp(sqrts_sqrts0);
763 }
double sigma0sigma0_ximinusp(double sqrts_sqrts0)
Sigma0 Sigma0 <-> Xi- p cross section parametrization Two hyperon exchange, based on effective model ...
Here is the call graph for this function:

◆ sigmaplussigmaminus_ximinusp()

double smash::sigmaplussigmaminus_ximinusp ( double  sqrts_sqrts0)

Sigma+ Sigma- <-> Xi- p cross section parametrization Two hyperon exchange, based on effective model by Feng Li, as in UrQMD (Graef:2014mra).

Parameters
[in]sqrts_sqrts0the rest frame total energy minus threshold energy [GeV]
Returns
the parametrized cross-section [mb]

Definition at line 765 of file parametrizations.cc.

765  {
766  return 14.194 * std::pow(sqrts_sqrts0, -0.442);
767 }
Here is the caller graph for this function:

◆ sigmaplussigmaminus_xi0n()

double smash::sigmaplussigmaminus_xi0n ( double  sqrts_sqrts0)

Sigma+ Sigma- <-> Xi0 n cross section parametrization Two hyperon exchange, based on effective model by Feng Li, as in UrQMD (Graef:2014mra).

Parameters
[in]sqrts_sqrts0the rest frame total energy minus threshold energy [GeV]
Returns
the parametrized cross-section [mb]

Definition at line 769 of file parametrizations.cc.

769  {
770  return sigmaplussigmaminus_ximinusp(sqrts_sqrts0);
771 }
double sigmaplussigmaminus_ximinusp(double sqrts_sqrts0)
Sigma+ Sigma- <-> Xi- p cross section parametrization Two hyperon exchange, based on effective model ...
Here is the call graph for this function:

◆ operator-() [3/4]

Parity smash::operator- ( Parity  p)
inline
Parameters
pGiven parity.
Returns
Inverted parity.

Definition at line 35 of file particletype.h.

35  {
36  switch (p) {
37  case Parity::Pos:
38  return Parity::Neg;
39  case Parity::Neg:
40  return Parity::Pos;
41  }
42  // This is unreachable and should be optimized away.
43  // It is required to silence a compiler warning.
44  throw std::runtime_error("unreachable");
45 }
constexpr int p
Proton.

◆ operator*() [5/8]

Parity smash::operator* ( Parity  x,
Parity  y 
)
inline
Parameters
xLeft-hand parity
yRight-hand parity
Returns
Product of x and y.

Definition at line 52 of file particletype.h.

52  {
53  if (x == y) {
54  return Parity::Pos;
55  } else {
56  return Parity::Neg;
57  }
58 }

◆ operator*=()

void smash::operator*= ( Parity x,
Parity  y 
)
inline
Parameters
xLeft-hand parity
yRight-hand parity
Returns
Product of x and y.

Definition at line 65 of file particletype.h.

65  {
66  if (x == y) {
67  x = Parity::Pos;
68  } else {
69  x = Parity::Neg;
70  }
71 }

◆ operator>>()

std::istream & smash::operator>> ( std::istream &  is,
PdgCode code 
)

Sets the PDG code from the textual representation in the input stream.

istream >> PdgCode assigns the PDG Code from an istream.

Parameters
[in]isinput string
[out]codePdgCode to be set

Definition at line 14 of file pdgcode.cc.

14  {
15  std::string codestring("");
16  is >> codestring;
17  if (!is) {
18  code = PdgCode::invalid();
19  return is;
20  }
21  try {
22  // set the fields from the string:
23  code.set_from_string(codestring);
24  } catch (PdgCode::InvalidPdgCode&) {
25  is.setstate(std::ios::failbit);
26  code = PdgCode::invalid();
27  }
28  return is;
29 }
constexpr int invalid
Invalid particle.
Here is the call graph for this function:

◆ is_dilepton()

bool smash::is_dilepton ( const PdgCode  pdg1,
const PdgCode  pdg2 
)
inline
Returns
if two given particles represent a lepton pair (e+e- or mu+mu-).

Definition at line 980 of file pdgcode.h.

980  {
981  const auto c1 = pdg1.code();
982  const auto c2 = pdg2.code();
983  const auto min = std::min(c1, c2);
984  const auto max = std::max(c1, c2);
985  return (max == 0x11 && min == -0x11) || (max == 0x13 && min == -0x13);
986 }
Here is the call graph for this function:
Here is the caller graph for this function:

◆ has_lepton_pair()

bool smash::has_lepton_pair ( const PdgCode  pdg1,
const PdgCode  pdg2,
const PdgCode  pdg3 
)
inline
Returns
if two of the three given particles represent a lepton pair (e+e- or mu+mu-).

Definition at line 992 of file pdgcode.h.

993  {
994  return is_dilepton(pdg1, pdg2) || is_dilepton(pdg1, pdg3) ||
995  is_dilepton(pdg2, pdg3);
996 }
bool is_dilepton(const PdgCode pdg1, const PdgCode pdg2)
Definition: pdgcode.h:980
Here is the call graph for this function:
Here is the caller graph for this function:

◆ pack()

constexpr uint64_t smash::pack ( int32_t  x,
int32_t  y 
)

Pack two int32_t into an uint64_t.

This is useful for switch statements on pairs.

Parameters
xFirst integer to be packed.
ySecond integer to be packed.
Returns
Combined integer.

Definition at line 107 of file pdgcode_constants.h.

107  {
108  return (static_cast<uint64_t>(static_cast<uint32_t>(x)) << 32) |
109  static_cast<uint64_t>(static_cast<uint32_t>(y));
110  //^ Casting to an intermediate 32-bit integer is important!
111 }
Here is the caller graph for this function:

◆ pow_int()

template<class T >
constexpr T smash::pow_int ( const T  base,
unsigned const  exponent 
)
inline

Efficient template for calculating integer powers using squaring.

Template Parameters
TType that implements multiplication.
Parameters
[in]base
[in]exponent
Returns
base^exponent

Definition at line 23 of file pow.h.

23  {
24  return (exponent == 0)
25  ? 1
26  : (exponent % 2 == 0)
27  ? pow_int(base, exponent / 2) * pow_int(base, exponent / 2)
28  : base * pow_int(base, exponent - 1);
29 }
constexpr T pow_int(const T base, unsigned const exponent)
Efficient template for calculating integer powers using squaring.
Definition: pow.h:23
Here is the caller graph for this function:

◆ square()

template<class T >
constexpr T smash::square ( const T  base)
inline

Efficient template for calculating the square.

Template Parameters
TType that implements multiplication.
Parameters
[in]basevalue that gets squared
Returns
result of squaring base

Definition at line 38 of file pow.h.

38  {
39  return pow_int(base, 2);
40 }
constexpr T pow_int(const T base, unsigned const exponent)
Efficient template for calculating integer powers using squaring.
Definition: pow.h:23
Here is the call graph for this function:
Here is the caller graph for this function:

◆ is_string_soft_process()

bool smash::is_string_soft_process ( ProcessType  p)

Check if a given process type is a soft string excitation.

Parameters
[in]pThe process type

Definition at line 18 of file processbranch.cc.

18  {
19  return p == ProcessType::StringSoftSingleDiffractiveAX ||
20  p == ProcessType::StringSoftSingleDiffractiveXB ||
21  p == ProcessType::StringSoftDoubleDiffractive ||
22  p == ProcessType::StringSoftAnnihilation ||
23  p == ProcessType::StringSoftNonDiffractive;
24 }
constexpr int p
Proton.
Here is the caller graph for this function:

◆ calc_hubble()

double smash::calc_hubble ( double  time,
const ExpansionProperties metric 
)

Calculate the Hubble parameter \(H(t)\), which describes how large the expansion flow is.

The flow \(\vec v=H(t) \vec x\) Tindall:2016try

Parameters
[in]timetime in the computational frame. [fm]
[in]metricStruct containing the parameters needed to calculate the metric.
Returns
Hubble parameter [fm^ \({-1}\)]

Definition at line 20 of file propagation.cc.

20  {
21  double h; // Hubble parameter
22 
23  switch (metric.mode_) {
25  h = 0.;
26  break;
28  h = metric.b_ / (2 * (metric.b_ * time + 1));
29  break;
31  h = 2 * metric.b_ / (3 * (metric.b_ * time + 1));
32  break;
34  h = metric.b_ * time;
35  break;
36  default:
37  h = 0.;
38  }
39 
40  return h;
41 }
Here is the caller graph for this function:

◆ propagate_straight_line()

double smash::propagate_straight_line ( Particles particles,
double  to_time,
const std::vector< FourVector > &  beam_momentum 
)

Propagates the positions of all particles on a straight line to a given moment.

For each particle, the position is shifted:

\[ \vec x^\prime = \vec x + \vec v \Delta t \]

where \(\vec x\) is the current position, \(\vec v\) its velocity and \(\Delta t\) the duration of this timestep.

Parameters
[out]particlesThe particle list in the event
[in]to_timefinal time [fm]
[in]beam_momentumThis vector of 4-momenta should have non-zero size only if "frozen Fermi motion" is on. The the Fermi momenta are only used for collisions, but not for propagation. In this case beam_momentum is used for propagating the initial nucleons. [GeV]
Returns
dt time interval of propagation which is equal to the difference between the final time and the initial time read from the 4-position of the particle.

Definition at line 43 of file propagation.cc.

44  {
45  const auto &log = logger<LogArea::Propagation>();
46  bool negative_dt_error = false;
47  double dt = 0.0;
48  for (ParticleData &data : *particles) {
49  const double t0 = data.position().x0();
50  dt = to_time - t0;
51  if (dt < 0.0 && !negative_dt_error) {
52  // Print error message once, not for every particle
53  negative_dt_error = true;
54  log.error("propagate_straight_line - negative dt = ", dt);
55  }
56  assert(dt >= 0.0);
57  /* "Frozen Fermi motion": Fermi momenta are only used for collisions,
58  * but not for propagation. This is done to avoid nucleus flying apart
59  * even if potentials are off. Initial nucleons before the first collision
60  * are propagated only according to beam momentum.
61  * Initial nucleons are distinguished by data.id() < the size of
62  * beam_momentum, which is by default zero except for the collider modus
63  * with the fermi motion == frozen.
64  * todo(m. mayer): improve this condition (see comment #11 issue #4213)*/
65  assert(data.id() >= 0);
66  const bool avoid_fermi_motion =
67  (static_cast<uint64_t>(data.id()) <
68  static_cast<uint64_t>(beam_momentum.size())) &&
69  (data.get_history().collisions_per_particle == 0);
70  ThreeVector v;
71  if (avoid_fermi_motion) {
72  const FourVector vbeam = beam_momentum[data.id()];
73  v = vbeam.velocity();
74  } else {
75  v = data.velocity();
76  }
77  const FourVector distance = FourVector(0.0, v * dt);
78  log.debug("Particle ", data, " motion: ", distance);
79  FourVector position = data.position() + distance;
80  position.set_x0(to_time);
81  data.set_4position(position);
82  }
83  return dt;
84 }
Here is the call graph for this function:
Here is the caller graph for this function:

◆ expand_space_time()

void smash::expand_space_time ( Particles particles,
const ExperimentParameters parameters,
const ExpansionProperties metric 
)

Modifies positions and momentum of all particles to account for space-time deformation.

Parameters
[out]particlesAll the particles in the event
[in]parametersA struct containing the parameters from which we extract the time in the computational frame.
[in]metricA struct containing the parameters need to calculate the metric

Definition at line 86 of file propagation.cc.

88  {
89  const auto &log = logger<LogArea::Propagation>();
90  const double dt = parameters.labclock.timestep_duration();
91  for (ParticleData &data : *particles) {
92  // Momentum and position modification to ensure appropriate expansion
93  const double h = calc_hubble(parameters.labclock.current_time(), metric);
94  FourVector delta_mom = FourVector(0.0, h * data.momentum().threevec() * dt);
95  FourVector expan_dist =
96  FourVector(0.0, h * data.position().threevec() * dt);
97 
98  log.debug("Particle ", data, " expansion motion: ", expan_dist);
99  // New position and momentum
100  FourVector position = data.position() + expan_dist;
101  FourVector momentum = data.momentum() - delta_mom;
102 
103  // set the new momentum and position variables
104  data.set_4position(position);
105  data.set_4momentum(momentum);
106  // force the on shell condition to ensure correct energy
107  data.set_4momentum(data.pole_mass(), data.momentum().threevec());
108  }
109 }
double calc_hubble(double time, const ExpansionProperties &metric)
Calculate the Hubble parameter , which describes how large the expansion flow is. ...
Definition: propagation.cc:20
Here is the call graph for this function:
Here is the caller graph for this function:

◆ update_momenta()

void smash::update_momenta ( Particles particles,
double  dt,
const Potentials pot,
RectangularLattice< std::pair< ThreeVector, ThreeVector >> *  FB_lat,
RectangularLattice< std::pair< ThreeVector, ThreeVector >> *  FI3_lat 
)

Updates the momenta of all particles at the current time step according to the equations of motion:

\[ \frac{dp}{dt} = \vec E + \vec v \times \vec B \]

Parameters
[out]particlesThe particle list in the event
[in]dttimestep
[in]potThe potentials in the system
[in]FB_latLattice for the electric and magnetic components of the Skyrme force
[in]FI3_latLattice for the electric and magnetic components of the symmetry force

Definition at line 111 of file propagation.cc.

114  {
115  // Copy particles before propagation to calculate potentials from them
116  const ParticleList plist = particles->copy_to_vector();
117 
118  const auto &log = logger<LogArea::Propagation>();
119  bool possibly_use_lattice =
120  (pot.use_skyrme() ? (FB_lat != nullptr) : true) &&
121  (pot.use_symmetry() ? (FI3_lat != nullptr) : true);
122  std::pair<ThreeVector, ThreeVector> FB, FI3;
123  double min_time_scale = std::numeric_limits<double>::infinity();
124 
125  for (ParticleData &data : *particles) {
126  // Only baryons will be affected by the potentials
127  if (!data.is_baryon()) {
128  continue;
129  }
130  const auto scale = pot.force_scale(data.type());
131  const ThreeVector r = data.position().threevec();
132  /* Lattices can be used for calculation if 1-2 are fulfilled:
133  * 1) Required lattices are not nullptr - possibly_use_lattice
134  * 2) r is not out of required lattices */
135  const bool use_lattice =
136  possibly_use_lattice &&
137  (pot.use_skyrme() ? FB_lat->value_at(r, FB) : true) &&
138  (pot.use_symmetry() ? FI3_lat->value_at(r, FI3) : true);
139  if (!pot.use_skyrme()) {
140  FB = std::make_pair(ThreeVector(0., 0., 0.), ThreeVector(0., 0., 0.));
141  }
142  if (!pot.use_symmetry()) {
143  FI3 = std::make_pair(ThreeVector(0., 0., 0.), ThreeVector(0., 0., 0.));
144  }
145  if (!use_lattice) {
146  const auto tmp = pot.all_forces(r, plist);
147  FB = std::make_pair(std::get<0>(tmp), std::get<1>(tmp));
148  FI3 = std::make_pair(std::get<2>(tmp), std::get<3>(tmp));
149  }
150  const ThreeVector Force =
151  scale.first *
152  (FB.first + data.momentum().velocity().CrossProduct(FB.second)) +
153  scale.second * data.type().isospin3_rel() *
154  (FI3.first + data.momentum().velocity().CrossProduct(FI3.second));
155  log.debug("Update momenta: F [GeV/fm] = ", Force);
156  data.set_4momentum(data.effective_mass(),
157  data.momentum().threevec() + Force * dt);
158 
159  // calculate the time scale of the change in momentum
160  const double Force_abs = Force.abs();
161  if (Force_abs < really_small) {
162  continue;
163  }
164  const double time_scale = data.momentum().x0() / Force_abs;
165  if (time_scale < min_time_scale) {
166  min_time_scale = time_scale;
167  }
168  }
169 
170  // warn if the time step is too big
171  constexpr double safety_factor = 0.1;
172  if (dt > safety_factor * min_time_scale) {
173  log.warn() << "The time step size is too large for an accurate propagation "
174  << "with potentials. Maximum safe value: "
175  << safety_factor * min_time_scale << " fm/c.";
176  }
177 }
constexpr double really_small
Numerical error tolerance.
Definition: constants.h:34
Here is the call graph for this function:
Here is the caller graph for this function:

◆ trim()

std::string smash::trim ( const std::string &  s)

Strip leading and trailing whitespaces.

Parameters
sString to be trimmed.
Returns
Trimmed string.

Definition at line 75 of file stringfunctions.cc.

75  {
76  const auto begin = s.find_first_not_of(" \t\n\r");
77  if (begin == std::string::npos) {
78  return {};
79  }
80  const auto end = s.find_last_not_of(" \t\n\r");
81  return s.substr(begin, end - begin + 1);
82 }
Here is the caller graph for this function:

◆ remove_substr()

void smash::remove_substr ( std::string &  s,
const std::string &  p 
)

Remove all instances of a substring p in a string s.

Parameters
[in,out]sString to be searched and modified.
[in]pSubstring to be removed.

Definition at line 84 of file stringfunctions.cc.

84  {
85  using str = std::string;
86  str::size_type n = p.length();
87  for (str::size_type i = s.find(p); i != str::npos; i = s.find(p)) {
88  s.erase(i, n);
89  }
90 }
constexpr int p
Proton.
constexpr int n
Neutron.
Here is the caller graph for this function:

◆ isoclean()

void smash::isoclean ( std::string &  s)

Remove ⁺, ⁻, ⁰ from string.

Parameters
[in,out]sString to be cleaned.

Definition at line 92 of file stringfunctions.cc.

92  {
93  remove_substr(s, "⁺");
94  remove_substr(s, "⁻");
95  remove_substr(s, "⁰");
96 }
void remove_substr(std::string &s, const std::string &p)
Remove all instances of a substring p in a string s.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ split() [1/2]

std::vector< std::string > smash::split ( const std::string &  s,
char  delim 
)

Split string by delimiter.

Parameters
[in]sString to be split.
[in]delimSplitting delimiter.
Returns
Split string.

Definition at line 120 of file stringfunctions.cc.

120  {
121  std::vector<std::string> elems;
122  split(s, delim, std::back_inserter(elems));
123  return elems;
124 }
void split(const std::string &s, char delim, Out result)
Split string by delimiter.
Here is the caller graph for this function:

◆ spec_func_integrand_1res()

double smash::spec_func_integrand_1res ( double  resonance_mass,
double  sqrts,
double  stable_mass,
const ParticleType type 
)
inline

Spectral function integrand for GSL integration, with one resonance in the final state (the second particle is stable).

The integrand is \( A(m) p_{cm}^f \), where \( m \) is the resonance mass, \( A(m) \) is the spectral function and \( p_{cm}^f \) is the center-of-mass momentum of the final state.

Parameters
[in]resonance_massActual mass of the resonance [GeV].
[in]sqrtsCenter-of-mass Energy, i.e. sqrt of Mandelstam s [GeV].
[in]stable_massMass of the stable particle in the final state [GeV].
[in]typeType of the resonance.
Returns
Value of the integrand.

Definition at line 103 of file tabulation.h.

105  {
106  if (sqrts <= stable_mass + resonance_mass) {
107  return 0.;
108  }
109 
110  /* Integrand is the spectral function weighted by the CM momentum of the
111  * final state. */
112  return type.spectral_function(resonance_mass) *
113  pCM(sqrts, stable_mass, resonance_mass);
114 }
T pCM(const T sqrts, const T mass_a, const T mass_b) noexcept
Definition: kinematics.h:79
Here is the call graph for this function:
Here is the caller graph for this function:

◆ spec_func_integrand_2res()

double smash::spec_func_integrand_2res ( double  sqrts,
double  res_mass_1,
double  res_mass_2,
const ParticleType t1,
const ParticleType t2 
)
inline

Spectral function integrand for GSL integration, with two resonances in the final state.

The integrand is \( A_1(m_1) A_2(m_2) p_{cm}^f \), where \( m_1 \) and \( m_2 \) are the resonance masses, \( A_1 \) and \( A_2 \) are the spectral functions and \( p_{cm}^f \) is the center-of-mass momentum of the final state.

Parameters
[in]sqrtsCenter-of-mass energy, i.e. sqrt of Mandelstam s [GeV].
[in]res_mass_1Actual mass of the first resonance [GeV].
[in]res_mass_2Actual mass of the second resonance [GeV].
[in]t1Type of the first resonance.
[in]t2Type of the second resonance.
Returns
Value of the integrand.

Definition at line 132 of file tabulation.h.

135  {
136  if (sqrts <= res_mass_1 + res_mass_2) {
137  return 0.;
138  }
139 
140  /* Integrand is the product of the spectral function weighted by the
141  * CM momentum of the final state. */
142  return t1.spectral_function(res_mass_1) * t2.spectral_function(res_mass_2) *
143  pCM(sqrts, res_mass_1, res_mass_2);
144 }
T pCM(const T sqrts, const T mass_a, const T mass_b) noexcept
Definition: kinematics.h:79
Here is the call graph for this function:
Here is the caller graph for this function:

◆ spectral_integral_semistable()

std::unique_ptr<Tabulation> smash::spectral_integral_semistable ( Integrator integrate,
const ParticleType resonance,
const ParticleType stable,
double  range 
)
inline

Create a table for the spectral integral of a resonance and a stable particle.

Parameters
[in,out]integrateNumerical integrator.
[in]resonanceType of the resonance particle.
[in]stableType of the stable particle.
[in]rangeDistance between tabulation points [GeV].
Returns
Tabulation of the given integral.

Definition at line 156 of file tabulation.h.

158  {
159  const double m_min = resonance.min_mass_kinematic();
160  const double m_stable = stable.mass();
161  return make_unique<Tabulation>(
162  m_min + m_stable, range, 100, [&](double srts) {
163  return integrate(m_min, srts - m_stable, [&](double m) {
164  return spec_func_integrand_1res(m, srts, m_stable, resonance);
165  });
166  });
167 }
double spec_func_integrand_1res(double resonance_mass, double sqrts, double stable_mass, const ParticleType &type)
Spectral function integrand for GSL integration, with one resonance in the final state (the second pa...
Definition: tabulation.h:103
static Integrator integrate
Definition: decaytype.cc:147
Here is the call graph for this function:
Here is the caller graph for this function:

◆ spectral_integral_unstable()

std::unique_ptr<Tabulation> smash::spectral_integral_unstable ( Integrator2dCuhre integrate2d,
const ParticleType res1,
const ParticleType res2,
double  range 
)
inline

Create a table for the spectral integral of two resonances.

Parameters
[in,out]integrate2dNumerical integrator.
[in]res1Type of the first resonance particle.
[in]res2Type of the second resonance particle.
[in]rangeDistance between tabulation points [GeV].
Returns
Tabulation of the given integral.

Definition at line 178 of file tabulation.h.

180  {
181  const double m1_min = res1.min_mass_kinematic();
182  const double m2_min = res2.min_mass_kinematic();
183  return make_unique<Tabulation>(m1_min + m2_min, range, 100, [&](double srts) {
184  const double m1_max = srts - m2_min;
185  const double m2_max = srts - m1_min;
186  return integrate2d(
187  m1_min, m1_max, m2_min, m2_max, [&](double m1, double m2) {
188  return spec_func_integrand_2res(srts, m1, m2, res1, res2);
189  });
190  });
191 }
static Integrator2dCuhre integrate2d(1E7)
double spec_func_integrand_2res(double sqrts, double res_mass_1, double res_mass_2, const ParticleType &t1, const ParticleType &t2)
Spectral function integrand for GSL integration, with two resonances in the final state...
Definition: tabulation.h:132
Here is the call graph for this function:

◆ operator+() [3/3]

ThreeVector smash::operator+ ( ThreeVector  a,
const ThreeVector b 
)
inline
Returns
sum of two three-vectors \( \vec{a} + \vec{b} \).

Definition at line 180 of file threevector.h.

180  {
181  a += b;
182  return a;
183 }

◆ operator-() [4/4]

ThreeVector smash::operator- ( ThreeVector  a,
const ThreeVector b 
)
inline
Returns
difference between two three-vectors \( \vec{a} - \vec{b} \).

Definition at line 193 of file threevector.h.

193  {
194  a -= b;
195  return a;
196 }

◆ operator*() [6/8]

ThreeVector smash::operator* ( ThreeVector  a,
const double &  b 
)
inline

multiply a three-vector by constant factor \( b \vec{a} \).

Definition at line 206 of file threevector.h.

206  {
207  a *= b;
208  return a;
209 }

◆ operator*() [7/8]

ThreeVector smash::operator* ( const double &  a,
ThreeVector  b 
)
inline

multiply a three-vector by constant factor \( a \vec{b} \).

Definition at line 212 of file threevector.h.

212  {
213  b *= a;
214  return b;
215 }

◆ operator*() [8/8]

double smash::operator* ( ThreeVector  a,
const ThreeVector b 
)
inline
Returns
inner product of two three-vectors \( \vec{a} \cdot \vec{b} \)

Definition at line 221 of file threevector.h.

221  {
222  return a.x1() * b.x1() + a.x2() * b.x2() + a.x3() * b.x3();
223 }
Here is the call graph for this function:

◆ operator/() [3/3]

ThreeVector smash::operator/ ( ThreeVector  a,
const double &  b 
)
inline

divide a three-vector by constant factor \( \vec{a} / b \).

Definition at line 244 of file threevector.h.

244  {
245  a /= b;
246  return a;
247 }

◆ operator<<() [4/11]

std::ostream & smash::operator<< ( std::ostream &  out,
const TimeStampCounter tsc 
)

Definition at line 18 of file tsc.cc.

18  {
19  auto c = tsc.cycles();
20  int blocks[10];
21  int n = 0;
22  for (int digits = std::log10(c); digits > 0; digits -= 3) {
23  blocks[n++] = c % 1000;
24  c /= 1000;
25  }
26  if (n == 0) {
27  return out;
28  }
29  const auto lastFill = out.fill('0');
30  out << blocks[--n];
31  while (n > 0) {
32  out << '\'' << std::setw(3) << blocks[--n];
33  }
34  out.fill(lastFill);
35  return out << " Cycles";
36 }
constexpr int n
Neutron.
Here is the call graph for this function:

◆ operator<<() [5/11]

std::ostream& smash::operator<< ( std::ostream &  out,
const BoxModus m 
)
Parameters
[in]outThe ostream into which to output
[in]mThe BoxModus object to write into out

Definition at line 37 of file boxmodus.cc.

37  {
38  out << "-- Box Modus:\nSize of the box: (" << m.length_ << " fm)³\n";
39  if (m.use_thermal_) {
40  out << "Thermal multiplicities "
41  << "(T = " << m.temperature_ << " GeV, muB = " << m.mub_
42  << " GeV, muS = " << m.mus_ << " GeV)\n";
43  } else {
44  for (const auto &p : m.init_multipl_) {
45  ParticleTypePtr ptype = &ParticleType::find(p.first);
46  out << ptype->name() << " initial multiplicity " << p.second << '\n';
47  }
48  }
49  if (m.initial_condition_ == BoxInitialCondition::PeakedMomenta) {
50  out << "All initial momenta = 3T = " << 3 * m.temperature_ << " GeV\n";
51  } else {
52  out << "Boltzmann momentum distribution with T = " << m.temperature_
53  << " GeV.\n";
54  }
55  return out;
56 }
constexpr int p
Proton.
Here is the call graph for this function:

◆ isospin_clebsch_gordan_2to1()

static double smash::isospin_clebsch_gordan_2to1 ( const ParticleType p_a,
const ParticleType p_b,
const int  I_tot,
const int  I_z 
)
static

Calculate isospin Clebsch-Gordan coefficient for two particles p_a and p_b coupling to a total isospin.

See also
clebsch_gordan for details (I_tot, I_z).
Parameters
[in]p_aInformation of particle type for first particle
[in]p_bInformation of particle type for second particle
[out]I_totTotal isospin of the reaction
[out]I_zTotal isospin 3 component of the reaction

Definition at line 45 of file clebschgordan.cc.

47  {
48  return clebsch_gordan(p_a.isospin(), p_b.isospin(), I_tot, p_a.isospin3(),
49  p_b.isospin3(), I_z);
50 }
double clebsch_gordan(const int j_a, const int j_b, const int j_c, const int m_a, const int m_b, const int m_c)
Calculate Clebsch-Gordan coefficient .
Here is the call graph for this function:
Here is the caller graph for this function:

◆ operator<<() [6/11]

std::ostream& smash::operator<< ( std::ostream &  out,
const ColliderModus m 
)
Parameters
[in]outThe ostream into which to output
[in]mThe ColliderModus object to write into out

Definition at line 423 of file collidermodus.cc.

423  {
424  return out << "-- Collider Modus:\n"
425  << "sqrt(S) (nucleus-nucleus) = "
426  << format(std::sqrt(m.total_s_), "GeV\n")
427  << "sqrt(S) (nucleon-nucleon) = " << format(m.sqrt_s_NN_, "GeV\n")
428  << "Projectile:\n"
429  << *m.projectile_ << "\nTarget:\n"
430  << *m.target_;
431 }
FormattingHelper< T > format(const T &value, const char *unit, int width=-1, int precision=-1)
Acts as a stream modifier for std::ostream to output an object with an optional suffix string and wit...
Definition: logging.h:310
Here is the call graph for this function:

◆ detailed_balance_factor_stable()

static double smash::detailed_balance_factor_stable ( double  s,
const ParticleType a,
const ParticleType b,
const ParticleType c,
const ParticleType d 
)
static

Helper function: Calculate the detailed balance factor R such that

\[ R = \sigma(AB \to CD) / \sigma(CD \to AB) \]

where \( A, B, C, D \) are stable.

Definition at line 28 of file crosssections.cc.

31  {
32  double spin_factor = (c.spin() + 1) * (d.spin() + 1);
33  spin_factor /= (a.spin() + 1) * (b.spin() + 1);
34  double symmetry_factor = (1 + (a == b));
35  symmetry_factor /= (1 + (c == d));
36  const double momentum_factor = pCM_sqr_from_s(s, c.mass(), d.mass()) /
37  pCM_sqr_from_s(s, a.mass(), b.mass());
38  return spin_factor * symmetry_factor * momentum_factor;
39 }
T pCM_sqr_from_s(const T s, const T mass_a, const T mass_b) noexcept
Definition: kinematics.h:52
Here is the call graph for this function:
Here is the caller graph for this function:

◆ detailed_balance_factor_RK()

static double smash::detailed_balance_factor_RK ( double  sqrts,
double  pcm,
const ParticleType a,
const ParticleType b,
const ParticleType c,
const ParticleType d 
)
static

Helper function: Calculate the detailed balance factor R such that

\[ R = \sigma(AB \to CD) / \sigma(CD \to AB) \]

where \(A\) is unstable, \(B\) is a kaon and \(C, D\) are stable.

Definition at line 47 of file crosssections.cc.

51  {
52  assert(!a.is_stable());
53  assert(b.pdgcode().is_kaon());
54  double spin_factor = (c.spin() + 1) * (d.spin() + 1);
55  spin_factor /= (a.spin() + 1) * (b.spin() + 1);
56  double symmetry_factor = (1 + (a == b));
57  symmetry_factor /= (1 + (c == d));
58  const double momentum_factor =
59  pCM_sqr(sqrts, c.mass(), d.mass()) /
60  (pcm * a.iso_multiplet()->get_integral_RK(sqrts));
61  return spin_factor * symmetry_factor * momentum_factor;
62 }
T pCM_sqr(const T sqrts, const T mass_a, const T mass_b) noexcept
Definition: kinematics.h:91
Here is the call graph for this function:
Here is the caller graph for this function:

◆ detailed_balance_factor_RR()

static double smash::detailed_balance_factor_RR ( double  sqrts,
double  pcm,
const ParticleType a,
const ParticleType b,
const ParticleType c,
const ParticleType d 
)
static

Helper function: Calculate the detailed balance factor R such that

\[ R = \sigma(AB \to CD) / \sigma(CD \to AB) \]

where \(A\) and \(B\) are unstable, and \(C\) and \(D\) are stable.

Definition at line 70 of file crosssections.cc.

74  {
75  assert(!a.is_stable());
76  assert(!b.is_stable());
77  double spin_factor = (c.spin() + 1) * (d.spin() + 1);
78  spin_factor /= (a.spin() + 1) * (b.spin() + 1);
79  double symmetry_factor = (1 + (a == b));
80  symmetry_factor /= (1 + (c == d));
81  const double momentum_factor =
82  pCM_sqr(sqrts, c.mass(), d.mass()) /
83  (pcm * a.iso_multiplet()->get_integral_RR(b, sqrts));
84  return spin_factor * symmetry_factor * momentum_factor;
85 }
T pCM_sqr(const T sqrts, const T mass_a, const T mass_b) noexcept
Definition: kinematics.h:91
Here is the call graph for this function:
Here is the caller graph for this function:

◆ append_list()

static void smash::append_list ( CollisionBranchList &  main_list,
CollisionBranchList  in_list,
double  weight = 1. 
)
static

Helper function: Append a list of processes to another (main) list of processes.

Definition at line 91 of file crosssections.cc.

92  {
93  main_list.reserve(main_list.size() + in_list.size());
94  for (auto& proc : in_list) {
95  proc->set_weight(proc->weight() * weight);
96  main_list.emplace_back(std::move(proc));
97  }
98 }
Here is the caller graph for this function:

◆ sum_xs_of()

static double smash::sum_xs_of ( CollisionBranchList &  list)
static

Helper function: Sum all cross sections of the given process list.

Definition at line 104 of file crosssections.cc.

104  {
105  double xs_sum = 0.0;
106  for (auto& proc : list) {
107  xs_sum += proc->weight();
108  }
109  return xs_sum;
110 }
Here is the caller graph for this function:

◆ min_angular_momentum() [1/2]

static int smash::min_angular_momentum ( int  s0,
int  s1,
int  s2 
)
static

Definition at line 138 of file decaymodes.cc.

138  {
139  int min_L = std::min(std::abs(s0 - s1 - s2), std::abs(s0 - s1 + s2));
140  min_L = std::min(min_L, std::abs(s0 + s1 - s2));
141  if (min_L % 2 != 0) {
142  throw std::runtime_error(
143  "min_angular_momentum: sum of spins should be integer");
144  }
145  return min_L / 2.;
146 }
Here is the caller graph for this function:

◆ min_angular_momentum() [2/2]

static int smash::min_angular_momentum ( int  s0,
int  s1,
int  s2,
int  s3 
)
static

Definition at line 148 of file decaymodes.cc.

148  {
149  int min_L =
150  std::min(std::abs(s0 - s1 + s2 + s3), std::abs(s0 + s1 - s2 + s3));
151  min_L = std::min(min_L, std::abs(s0 + s1 + s2 - s3));
152  min_L = std::min(min_L, std::abs(s0 - s1 - s2 + s3));
153  min_L = std::min(min_L, std::abs(s0 - s1 + s2 - s3));
154  min_L = std::min(min_L, std::abs(s0 + s1 - s2 - s3));
155  min_L = std::min(min_L, std::abs(s0 - s1 - s2 - s3));
156  if (min_L % 2 != 0) {
157  throw std::runtime_error(
158  "min_angular_momentum: sum of spins should be integer");
159  }
160  return min_L / 2.;
161 }

◆ integrand_rho_Manley_1res()

static double smash::integrand_rho_Manley_1res ( double  sqrts,
double  mass,
double  stable_mass,
ParticleTypePtr  type,
int  L 
)
static

Definition at line 25 of file decaytype.cc.

27  {
28  if (sqrts <= mass + stable_mass) {
29  return 0.;
30  }
31 
32  /* center-of-mass momentum of final state particles */
33  const double p_f = pCM(sqrts, stable_mass, mass);
34 
35  return p_f / sqrts * blatt_weisskopf_sqr(p_f, L) *
36  type->spectral_function(mass);
37 }
double blatt_weisskopf_sqr(const double p_ab, const int L)
Definition: formfactors.h:33
T pCM(const T sqrts, const T mass_a, const T mass_b) noexcept
Definition: kinematics.h:79
Here is the call graph for this function:
Here is the caller graph for this function:

◆ integrand_rho_Manley_2res()

static double smash::integrand_rho_Manley_2res ( double  sqrts,
double  m1,
double  m2,
ParticleTypePtr  t1,
ParticleTypePtr  t2,
int  L 
)
static

Definition at line 39 of file decaytype.cc.

41  {
42  if (sqrts <= m1 + m2) {
43  return 0.;
44  }
45 
46  /* center-of-mass momentum of final state particles */
47  const double p_f = pCM(sqrts, m1, m2);
48 
49  return p_f / sqrts * blatt_weisskopf_sqr(p_f, L) * t1->spectral_function(m1) *
50  t2->spectral_function(m2);
51 }
double blatt_weisskopf_sqr(const double p_ab, const int L)
Definition: formfactors.h:33
T pCM(const T sqrts, const T mass_a, const T mass_b) noexcept
Definition: kinematics.h:79
Here is the call graph for this function:
Here is the caller graph for this function:

◆ arrange_particles()

static ParticleTypePtrList& smash::arrange_particles ( ParticleTypePtrList &  part_types)
static

Rearrange the particle list such that the first particle is the stable one.

Parameters
[in,out]part_typesParticle list to be rearranged.
Returns
Reference to rearranged particle list.

Definition at line 113 of file decaytype.cc.

113  {
114  if (part_types[1]->is_stable()) {
115  std::swap(part_types[0], part_types[1]);
116  }
117  /* verify that this is really a "semi-stable" decay,
118  * i.e. the first particle is stable and the second unstable */
119  if (!part_types[0]->is_stable() || part_types[1]->is_stable()) {
120  throw std::runtime_error("Error in TwoBodyDecaySemistable constructor: " +
121  part_types[0]->pdgcode().string() + " " +
122  part_types[1]->pdgcode().string());
123  }
124  return part_types;
125 }

◆ sort_particles()

static ParticleTypePtrList smash::sort_particles ( ParticleTypePtrList  part_types)
static

sort the particle list

Definition at line 273 of file decaytype.cc.

273  {
274  std::sort(part_types.begin(), part_types.end());
275  return part_types;
276 }

◆ rho_eckart_impl()

template<typename T >
std::tuple<double, ThreeVector, ThreeVector, ThreeVector> smash::rho_eckart_impl ( const ThreeVector r,
const T &  plist,
const DensityParameters par,
DensityType  dens_type,
bool  compute_gradient 
)

Calculates Eckart rest frame density and optionally the gradient of the density in an arbitary frame, the curl of the 3-currrent and the time derivative of the 3-current.

\[j^{\mu} = (\sqrt{2\pi} \sigma )^{-3} \sum_{i=1}^N C_i u^{\mu}_i exp \left(- \frac{(\vec r -\vec r_i + \frac{\gamma_i^2}{1 + \gamma_i} \vec \beta_i (\vec \beta_i, \vec r - \vec r_i))^2}{2\sigma^2} \right)\]

\[ \rho^{Eckart} = \sqrt{j^{\mu} j_{\mu}} \]

Here \( C_i \) is a corresponding value of "charge". If baryon current option is selected then \( C_i \) is 1 for baryons, -1 for antibaryons and 0 otherwise. For proton/neutron current \( C_i = 1\) for proton/neutron and 0 otherwise.

To avoid the problems with Eckart frame definition, densities for positive and negative charges, \(\rho_+ \) and \( \rho_-\), are computed separately and result is \(\rho_+ - \rho_-\).

Parameters
[in]rArbitrary space point where 4-current is calculated [fm]
[in]plistList of all particles to be used in \(j^{\mu}\) calculation. If the distance between particle and calculation point r, \( |r-r_i| > r_{cut} \) then particle input to density will be ignored.

Next three values are taken from ExperimentalParameters structure:

Parameters
[in]parSet of parameters packed in one structure. From them the cutting radius r_cut \( r_{cut} / \sigma \), number of test-particles ntest and the gaussian width gs_sigma are needed.
[in]dens_typetype of four-currect to be calculated: baryon, proton or neutron options are currently available
[in]compute_gradienttrue - compute gradient, false - no
Returns
(density in the local Eckart frame [fm$f^{-3}$f], \( \nabla\cdots\rho \) or a 0 3-vector, \( \partial_t \vec j\) or a 0 3-vector, \( \nabla \times \vec j \) or a 0 3-vector).

Definition at line 60 of file density.cc.

62  {
63  /* The current density of the positively and negatively charged particles.
64  * Division into positive and negative charges is necessary to avoid
65  * problems with the Eckart frame definition. Example of problem:
66  * get Eckart frame for two identical oppositely flying bunches of
67  * electrons and positrons. For this case jmu = (0, 0, 0, non-zero),
68  * so jmu.abs does not exist and Eckart frame is not defined.
69  * If one takes rho = jmu_pos.abs - jmu_neg.abs, it is still Lorentz-
70  * invariant and gives the right limit in non-relativistic case, but
71  * it gives no such problem. */
72  FourVector jmu_pos, jmu_neg;
73  /* The array of the derivatives of the current density.
74  * The zeroth component is the time derivative,
75  * while the next 3 ones are spacial derivatives. */
76  std::array<FourVector, 4> djmu_dx;
77 
78  for (const auto &p : plist) {
79  const double dens_factor = density_factor(p.type(), dens_type);
80  if (std::abs(dens_factor) < really_small) {
81  continue;
82  }
83  const FourVector mom = p.momentum();
84  const double m = mom.abs();
85  if (m < really_small) {
86  continue;
87  }
88  const double m_inv = 1.0 / m;
89  const auto sf_and_grad = unnormalized_smearing_factor(
90  p.position().threevec() - r, mom, m_inv, par, compute_gradient);
91  if (sf_and_grad.first < really_small) {
92  continue;
93  }
94  const FourVector tmp = mom * (dens_factor / mom.x0());
95  if (dens_factor > 0.) {
96  jmu_pos += tmp * sf_and_grad.first;
97  } else {
98  jmu_neg += tmp * sf_and_grad.first;
99  }
100  if (compute_gradient) {
101  for (int k = 1; k <= 3; k++) {
102  djmu_dx[k] += tmp * sf_and_grad.second[k - 1];
103  djmu_dx[0] -= tmp * sf_and_grad.second[k - 1] * tmp.threevec()[k - 1] /
104  dens_factor;
105  }
106  }
107  }
108 
109  // Eckart density
110  const double rho_eck = (jmu_pos.abs() - jmu_neg.abs()) * par.norm_factor_sf();
111 
112  // $\partial_t \vec j$
113  const ThreeVector dj_dt = compute_gradient
114  ? djmu_dx[0].threevec() * par.norm_factor_sf()
115  : ThreeVector(0.0, 0.0, 0.0);
116 
117  // Gradient of density
118  ThreeVector rho_grad;
119  // Curl of current density
120  ThreeVector j_rot;
121  if (compute_gradient) {
122  j_rot.set_x1(djmu_dx[2].x3() - djmu_dx[3].x2());
123  j_rot.set_x2(djmu_dx[3].x1() - djmu_dx[1].x3());
124  j_rot.set_x3(djmu_dx[1].x2() - djmu_dx[2].x1());
125  j_rot *= par.norm_factor_sf();
126  for (int i = 1; i < 4; i++) {
127  rho_grad[i - 1] += djmu_dx[i].x0() * par.norm_factor_sf();
128  }
129  }
130  return std::make_tuple(rho_eck, rho_grad, dj_dt, j_rot);
131 }
constexpr double really_small
Numerical error tolerance.
Definition: constants.h:34
double density_factor(const ParticleType &type, DensityType dens_type)
Get the factor that determines how much a particle contributes to the density type that is computed...
Definition: density.cc:17
constexpr int p
Proton.
std::pair< double, ThreeVector > unnormalized_smearing_factor(const ThreeVector &r, const FourVector &p, const double m_inv, const DensityParameters &dens_par, const bool compute_gradient=false)
Implements gaussian smearing for any quantity.
Definition: density.cc:32
Here is the call graph for this function:
Here is the caller graph for this function:

◆ try_find_private()

static IsoParticleType* smash::try_find_private ( const std::string &  name)
static

Helper function for IsoParticleType::try_find and friends.

Definition at line 25 of file isoparticletype.cc.

25  {
26  auto found =
27  std::lower_bound(iso_type_list.begin(), iso_type_list.end(), name,
28  [](const IsoParticleType &l, const std::string &r) {
29  return l.name() < r;
30  });
31  if (found == iso_type_list.end() || found->name() != name) {
32  return {}; // The default constructor creates an invalid pointer.
33  }
34  return &*found;
35 }
static IsoParticleTypeList iso_type_list
Here is the caller graph for this function:

◆ multiplet_name()

static std::string smash::multiplet_name ( std::string  name)
static

Construct the name-string for an isospin multiplet from the given name-string for the particle.

Parameters
[in]namename-string of the particle
Returns
the name-string for an isospin multiplet

Definition at line 70 of file isoparticletype.cc.

70  {
71  if (name.find("⁺⁺") != std::string::npos) {
72  return name.substr(0, name.length() - sizeof("⁺⁺") + 1);
73  } else if (name.find("⁺") != std::string::npos) {
74  return name.substr(0, name.length() - sizeof("⁺") + 1);
75  } else if (name.find("⁻⁻") != std::string::npos) {
76  return name.substr(0, name.length() - sizeof("⁻⁻") + 1);
77  } else if (name.find("⁻") != std::string::npos) {
78  return name.substr(0, name.length() - sizeof("⁻") + 1);
79  } else if (name.find("⁰") != std::string::npos) {
80  return name.substr(0, name.length() - sizeof("⁰") + 1);
81  } else {
82  return name;
83  }
84 }
Here is the caller graph for this function:

◆ operator<<() [7/11]

std::ostream& smash::operator<< ( std::ostream &  out,
const ListModus m 
)
Parameters
[in]outThe ostream into which to output
[in]mThe ListModus object to write into out

Definition at line 135 of file listmodus.cc.

135  {
136  out << "-- List Modus\nInput directory for external particle lists:\n"
137  << m.particle_list_file_directory_ << "\n";
138  return out;
139 }

◆ find_longest_logger_name() [1/2]

template<int index, int stop = 0>
constexpr std::enable_if<(index == stop), int>::type smash::find_longest_logger_name ( )

Recursively find the longest logger name at compile time.

Beginning of the recursion.

Template Parameters
indexRecursion index.
stopStopping index.
Returns
Current maximal logger name length.

Definition at line 51 of file logging.cc.

51  {
52  using LogAreaTag = typename std::remove_reference<decltype(
53  std::get<index>(std::declval<LogArea::AreaTuple &>()))>::type;
54  return LogAreaTag::textual_length();
55 }

◆ find_longest_logger_name() [2/2]

template<int index, int stop = 0, int mid = (index + stop) / 2>
constexpr std::enable_if<(index > stop), int>::type smash::find_longest_logger_name ( )

Recursively find the longest logger name at compile time.

All cases except for the beginning of the recursion.

Template Parameters
indexRecursion index.
stopStopping index.
midMiddle index.
Returns
Current maximal logger name length.

Definition at line 70 of file logging.cc.

70  {
71  return find_longest_logger_name<index, mid + 1>() >
72  find_longest_logger_name<mid, stop>()
73  ? find_longest_logger_name<index, mid + 1>()
74  : find_longest_logger_name<mid, stop>();
75 }

◆ create_all_loggers_impl() [1/2]

template<std::size_t index, int >
std::enable_if<(index == 0)>::type smash::create_all_loggers_impl ( Configuration )
inline

Recurse over the log areas in the LogArea::AreaTuple type. Do nothing here to end the recursion (see also below).

Definition at line 83 of file logging.cc.

84  {}
Here is the caller graph for this function:

◆ create_all_loggers_impl() [2/2]

template<std::size_t index, int longest_name = find_longest_logger_name<index - 1>()>
std::enable_if<(index != 0)>::type smash::create_all_loggers_impl ( Configuration config)
inline

Recurse over the log areas in the LogArea::AreaTuple type. (The recursion is ended via the overload above.)

For every entry in the list the corresponding Logger object in global_logger_collection is set up with area name and verbosity.

Template Parameters
indexRecursion index.
longest_nameLength of longest log area name.
Parameters
[in,out]configConfiguration object.

Definition at line 100 of file logging.cc.

101  {
102  using LogAreaTag = typename std::remove_reference<decltype(
103  std::get<index - 1>(std::declval<LogArea::AreaTuple &>()))>::type;
104  static_assert(LogAreaTag::id == index - 1,
105  "The order of types in LogArea::AreaTuple does not match the "
106  "id values in the LogArea types. Please fix! (see top of "
107  "'include/logging.h')");
108  auto &logger = global_logger_collection[LogAreaTag::id];
109  const auto tmp = utf8::fill_both(LogAreaTag::textual(), longest_name);
110  logger.setAreaName(tmp);
112  config.take({LogAreaTag::textual()}, global_default_loglevel));
113  create_all_loggers_impl<index - 1, longest_name>(config);
114 }
void setAreaName(const char *name)
Set an area name.
Definition: einhard.hpp:387
static std::array< einhard::Logger<>, std::tuple_size< LogArea::AreaTuple >::value > global_logger_collection
An array that stores all pre-configured Logger objects.
Definition: logging.cc:33
static einhard::LogLevel global_default_loglevel
The default logging level is ALL.
Definition: logging.cc:20
std::enable_if<(index !=0)>::type create_all_loggers_impl(Configuration &config)
Definition: logging.cc:100
void setVerbosity(LogLevel verbosity) noexcept
Modify the verbosity of the Logger.
Definition: einhard.hpp:535
std::string fill_both(const std::string &s, size_t width, char fill=' ')
Fill string with characters at both sides until the given width is reached.
einhard::Logger & logger()
Definition: logging.h:234
Here is the call graph for this function:

◆ operator<<() [8/11]

std::ostream& smash::operator<< ( std::ostream &  out,
const Nucleus n 
)

Definition at line 474 of file nucleus.cc.

474  {
475  return out << " #particles #testparticles mass [GeV] "
476  "radius [fm] diffusiveness [fm]\n"
477  << format(n.number_of_particles(), nullptr, 12)
478  << format(n.size(), nullptr, 17) << format(n.mass(), nullptr, 13)
479  << format(n.get_nuclear_radius(), nullptr, 14)
480  << format(n.get_diffusiveness(), nullptr, 20);
481 }
FormattingHelper< T > format(const T &value, const char *unit, int width=-1, int precision=-1)
Acts as a stream modifier for std::ostream to output an object with an optional suffix string and wit...
Definition: logging.h:310
constexpr int n
Neutron.
Here is the call graph for this function:

◆ piplusp_elastic_pdg()

static double smash::piplusp_elastic_pdg ( double  mandelstam_s)
static

Definition at line 108 of file parametrizations.cc.

108  {
109  if (piplusp_elastic_interpolation == nullptr) {
110  std::vector<double> x = PIPLUSP_ELASTIC_P_LAB;
111  std::vector<double> y = PIPLUSP_ELASTIC_SIG;
112  std::vector<double> dedup_x;
113  std::vector<double> dedup_y;
114  std::tie(dedup_x, dedup_y) = dedup_avg(x, y);
115  dedup_y = smooth(dedup_x, dedup_y, 0.1, 5);
117  make_unique<InterpolateDataLinear<double>>(dedup_x, dedup_y);
118  }
119  const double p_lab = plab_from_s(mandelstam_s, pion_mass, nucleon_mass);
120  return (*piplusp_elastic_interpolation)(p_lab);
121 }
const std::initializer_list< double > PIPLUSP_ELASTIC_P_LAB
PDG data on pi+ p elastic cross section: momentum in lab frame.
constexpr double nucleon_mass
Nucleon mass in GeV.
Definition: constants.h:52
static std::unique_ptr< InterpolateDataLinear< double > > piplusp_elastic_interpolation
An interpolation that gets lazily filled using the PIPLUSP_ELASTIC_SIG data.
double plab_from_s(double mandelstam_s, double mass)
Convert Mandelstam-s to p_lab in a fixed-target collision.
Definition: kinematics.h:157
constexpr double pion_mass
Pion mass in GeV.
Definition: constants.h:59
std::pair< std::vector< T >, std::vector< T > > dedup_avg(const std::vector< T > &x, const std::vector< T > &y)
Remove duplicates from data (x, y) by averaging y.
Definition: average.h:65
std::vector< T > smooth(const std::vector< T > &x, const std::vector< T > &y, T span=2./3, size_t iter=3, T delta=0)
Apply the LOWESS smoother (see the reference below) to the given data (x, y).
Definition: lowess.h:289
const std::initializer_list< double > PIPLUSP_ELASTIC_SIG
PDG data on pi+ p elastic cross section: cross section.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ piminusp_elastic_pdg()

static double smash::piminusp_elastic_pdg ( double  mandelstam_s)
static

Definition at line 197 of file parametrizations.cc.

197  {
198  if (piminusp_elastic_interpolation == nullptr) {
199  std::vector<double> x = PIMINUSP_ELASTIC_P_LAB;
200  std::vector<double> y = PIMINUSP_ELASTIC_SIG;
201  std::vector<double> dedup_x;
202  std::vector<double> dedup_y;
203  std::tie(dedup_x, dedup_y) = dedup_avg(x, y);
204  dedup_y = smooth(dedup_x, dedup_y, 0.03, 6);
206  make_unique<InterpolateDataLinear<double>>(dedup_x, dedup_y);
207  }
208  const double p_lab = plab_from_s(mandelstam_s, pion_mass, nucleon_mass);
209  return (*piminusp_elastic_interpolation)(p_lab);
210 }
const std::initializer_list< double > PIMINUSP_ELASTIC_P_LAB
PDG data on pi- p elastic cross section: momentum in lab frame.
constexpr double nucleon_mass
Nucleon mass in GeV.
Definition: constants.h:52
double plab_from_s(double mandelstam_s, double mass)
Convert Mandelstam-s to p_lab in a fixed-target collision.
Definition: kinematics.h:157
constexpr double pion_mass
Pion mass in GeV.
Definition: constants.h:59
const std::initializer_list< double > PIMINUSP_ELASTIC_SIG
PDG data on pi- p elastic cross section: cross section.
std::pair< std::vector< T >, std::vector< T > > dedup_avg(const std::vector< T > &x, const std::vector< T > &y)
Remove duplicates from data (x, y) by averaging y.
Definition: average.h:65
std::vector< T > smooth(const std::vector< T > &x, const std::vector< T > &y, T span=2./3, size_t iter=3, T delta=0)
Apply the LOWESS smoother (see the reference below) to the given data (x, y).
Definition: lowess.h:289
static std::unique_ptr< InterpolateDataLinear< double > > piminusp_elastic_interpolation
An interpolation that gets lazily filled using the PIMINUSP_ELASTIC data.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ kminusp_elastic_pdg()

static double smash::kminusp_elastic_pdg ( double  mandelstam_s)
static

Definition at line 453 of file parametrizations.cc.

453  {
454  if (kminusp_elastic_interpolation == nullptr) {
455  std::vector<double> x = KMINUSP_ELASTIC_P_LAB;
456  std::vector<double> y = KMINUSP_ELASTIC_SIG;
457  std::vector<double> dedup_x;
458  std::vector<double> dedup_y;
459  std::tie(dedup_x, dedup_y) = dedup_avg(x, y);
460  dedup_y = smooth(dedup_x, dedup_y, 0.1, 5);
462  make_unique<InterpolateDataLinear<double>>(dedup_x, dedup_y);
463  }
464  const double p_lab = plab_from_s(mandelstam_s, kaon_mass, nucleon_mass);
465  return (*kminusp_elastic_interpolation)(p_lab);
466 }
constexpr double nucleon_mass
Nucleon mass in GeV.
Definition: constants.h:52
double plab_from_s(double mandelstam_s, double mass)
Convert Mandelstam-s to p_lab in a fixed-target collision.
Definition: kinematics.h:157
std::pair< std::vector< T >, std::vector< T > > dedup_avg(const std::vector< T > &x, const std::vector< T > &y)
Remove duplicates from data (x, y) by averaging y.
Definition: average.h:65
std::vector< T > smooth(const std::vector< T > &x, const std::vector< T > &y, T span=2./3, size_t iter=3, T delta=0)
Apply the LOWESS smoother (see the reference below) to the given data (x, y).
Definition: lowess.h:289
constexpr double kaon_mass
Kaon mass in GeV.
Definition: constants.h:66
static std::unique_ptr< InterpolateDataLinear< double > > kminusp_elastic_interpolation
An interpolation that gets lazily filled using the KMINUSP_ELASTIC data.
const std::initializer_list< double > KMINUSP_ELASTIC_P_LAB
PDG data on K- p elastic cross section: momentum in lab frame.
const std::initializer_list< double > KMINUSP_ELASTIC_SIG
PDG data on K- p elastic cross section: cross section.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ initialize()

static void smash::initialize ( std::unordered_map< std::pair< uint64_t, uint64_t >, double, pair_hash > &  ratios)
static

Calculate and store isospin ratios for K N -> K Delta reactions.

See the documentation of KaonNucleonRatios for details.

Parameters
[in]ratiosAn empty map where the ratios for K N -> K Delta reactions are stored.

Definition at line 575 of file parametrizations.cc.

576  {
577  const auto& type_p = ParticleType::find(pdg::p);
578  const auto& type_n = ParticleType::find(pdg::n);
579  const auto& type_K_p = ParticleType::find(pdg::K_p);
580  const auto& type_K_z = ParticleType::find(pdg::K_z);
581  const auto& type_Delta_pp = ParticleType::find(pdg::Delta_pp);
582  const auto& type_Delta_p = ParticleType::find(pdg::Delta_p);
583  const auto& type_Delta_z = ParticleType::find(pdg::Delta_z);
584  const auto& type_Delta_m = ParticleType::find(pdg::Delta_m);
585 
586  /* Store the isospin ratio of the given reaction relative to all other
587  * possible isospin-symmetric reactions. */
588  auto add_to_ratios = [&](const ParticleType& a, const ParticleType& b,
589  const ParticleType& c, const ParticleType& d,
590  double weight_numerator, double weight_other) {
591  assert(weight_numerator + weight_other != 0);
592  const auto key =
593  std::make_pair(pack(a.pdgcode().code(), b.pdgcode().code()),
594  pack(c.pdgcode().code(), d.pdgcode().code()));
595  const double ratio = weight_numerator / (weight_numerator + weight_other);
596  ratios[key] = ratio;
597  };
598 
599  /* All inelastic channels are K N -> K Delta -> K pi N or charge exchange,
600  * with identical cross section, weighted by the isospin factor.
601  *
602  * For charge exchange, the isospin factors are 1,
603  * so they are excluded here. */
604  {
605  const auto weight1 = isospin_clebsch_gordan_sqr_2to2(
606  type_p, type_K_p, type_K_z, type_Delta_pp);
607  const auto weight2 = isospin_clebsch_gordan_sqr_2to2(
608  type_p, type_K_p, type_K_p, type_Delta_p);
609 
610  add_to_ratios(type_p, type_K_p, type_K_z, type_Delta_pp, weight1, weight2);
611  add_to_ratios(type_p, type_K_p, type_K_p, type_Delta_p, weight2, weight1);
612  }
613  {
614  const auto weight1 = isospin_clebsch_gordan_sqr_2to2(
615  type_n, type_K_p, type_K_z, type_Delta_p);
616  const auto weight2 = isospin_clebsch_gordan_sqr_2to2(
617  type_n, type_K_p, type_K_p, type_Delta_z);
618 
619  add_to_ratios(type_n, type_K_p, type_K_z, type_Delta_p, weight1, weight2);
620  add_to_ratios(type_n, type_K_p, type_K_p, type_Delta_z, weight2, weight1);
621  }
622  /* K+ and K0 have the same mass and spin, their cross sections are assumed to
623  * only differ in isospin factors. */
624  {
625  const auto weight1 = isospin_clebsch_gordan_sqr_2to2(
626  type_p, type_K_z, type_K_z, type_Delta_p);
627  const auto weight2 = isospin_clebsch_gordan_sqr_2to2(
628  type_p, type_K_z, type_K_p, type_Delta_z);
629 
630  add_to_ratios(type_p, type_K_z, type_K_z, type_Delta_p, weight1, weight2);
631  add_to_ratios(type_p, type_K_z, type_K_p, type_Delta_z, weight2, weight1);
632  }
633  {
634  const auto weight1 = isospin_clebsch_gordan_sqr_2to2(
635  type_n, type_K_z, type_K_z, type_Delta_z);
636  const auto weight2 = isospin_clebsch_gordan_sqr_2to2(
637  type_n, type_K_z, type_K_p, type_Delta_m);
638 
639  add_to_ratios(type_n, type_K_z, type_K_z, type_Delta_z, weight1, weight2);
640  add_to_ratios(type_n, type_K_z, type_K_p, type_Delta_m, weight2, weight1);
641  }
642 }
constexpr int K_p
K⁺.
constexpr uint64_t pack(int32_t x, int32_t y)
Pack two int32_t into an uint64_t.
constexpr int Delta_m
Δ⁻.
constexpr int Delta_z
Δ⁰.
constexpr int Delta_p
Δ⁺.
constexpr int K_z
K⁰.
constexpr int Delta_pp
Δ⁺⁺.
constexpr int p
Proton.
double isospin_clebsch_gordan_sqr_2to2(const ParticleType &p_a, const ParticleType &p_b, const ParticleType &p_c, const ParticleType &p_d, const int I=-1)
Calculate the squared isospin Clebsch-Gordan coefficient for a 2-to-2 reaction A + B -> C + D...
constexpr int n
Neutron.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ operator<<() [9/11]

std::ostream& smash::operator<< ( std::ostream &  out,
const Particles particles 
)
Parameters
[in]outThe ostream into which to output
[in]particlesThe Particles object to write into out

Definition at line 148 of file particles.cc.

148  {
149  out << particles.size() << " Particles:\n";
150  for (unsigned i = 0; i < particles.data_size_; ++i) {
151  const auto &p = particles.data_[i];
152  if (p.id() < 0) {
153  out << "------ ";
154  } else {
155  out << std::setw(5) << std::setprecision(3) << p.momentum().abs3()
156  << p.type().name();
157  }
158  if ((i & 15) == 0) {
159  out << '\n';
160  }
161  }
162  return out;
163 }
constexpr int p
Proton.
Here is the call graph for this function:

◆ antiname()

static std::string smash::antiname ( const std::string &  name,
PdgCode  code 
)
static

Construct an antiparticle name-string from the given name-string for the particle and its PDG code.

Parameters
[in]namethe name-string of the particle to convert
[in]codethe pdgcode of the particle to convert
Returns
the name-string of the converted antiparticle

Definition at line 147 of file particletype.cc.

147  {
148  std::string basename, charge;
149 
150  if (name.find("⁺⁺") != std::string::npos) {
151  basename = name.substr(0, name.length() - sizeof("⁺⁺") + 1);
152  charge = "⁻⁻";
153  } else if (name.find("⁺") != std::string::npos) {
154  basename = name.substr(0, name.length() - sizeof("⁺") + 1);
155  charge = "⁻";
156  } else if (name.find("⁻⁻") != std::string::npos) {
157  basename = name.substr(0, name.length() - sizeof("⁻⁻") + 1);
158  charge = "⁺⁺";
159  } else if (name.find("⁻") != std::string::npos) {
160  basename = name.substr(0, name.length() - sizeof("⁻") + 1);
161  charge = "⁺";
162  } else if (name.find("⁰") != std::string::npos) {
163  basename = name.substr(0, name.length() - sizeof("⁰") + 1);
164  charge = "⁰";
165  } else {
166  basename = name;
167  charge = "";
168  }
169 
170  // baryons & strange mesons: insert a bar
171  if (code.baryon_number() != 0 || code.strangeness() != 0) {
172  constexpr char bar[] = "\u0305";
173  basename.insert(utf8::sequence_length(basename.begin()), bar);
174  }
175 
176  return basename + charge;
177 }
std::iterator_traits< octet_iterator >::difference_type sequence_length(octet_iterator lead_it)
Given an iterator to the beginning of a UTF-8 sequence, return the length of the next UTF-8 code poin...
Here is the call graph for this function:
Here is the caller graph for this function:

◆ chargestr()

static std::string smash::chargestr ( int  charge)
static

Construct a charge string, given the charge as integer.

Parameters
[in]chargecharge of a particle
Returns
the corresponding string to write out this charge
Exceptions
runtime_errorif the charge is not an integer between -2 and 2

Definition at line 186 of file particletype.cc.

186  {
187  switch (charge) {
188  case 2:
189  return "⁺⁺";
190  case 1:
191  return "⁺";
192  case 0:
193  return "⁰";
194  case -1:
195  return "⁻";
196  case -2:
197  return "⁻⁻";
198  default:
199  throw std::runtime_error("Invalid charge " + std::to_string(charge));
200  }
201 }
Here is the caller graph for this function:

◆ operator<<() [10/11]

std::ostream& smash::operator<< ( std::ostream &  out,
const ParticleType type 
)
Parameters
[out]outThe ostream into which to output
[in]typeThe ParticleType object to write into out

Definition at line 809 of file particletype.cc.

809  {
810  const PdgCode &pdg = type.pdgcode();
811  return out << type.name() << std::setfill(' ') << std::right
812  << "[ mass:" << field<6> << type.mass()
813  << ", width:" << field<6> << type.width_at_pole()
814  << ", PDG:" << field<6> << pdg
815  << ", charge:" << field<3> << pdg.charge()
816  << ", spin:" << field<2> << pdg.spin() << "/2 ]";
817 }
Here is the call graph for this function:

◆ Cugnon_bpp()

static double smash::Cugnon_bpp ( double  plab)
static

Computes the B coefficients from the Cugnon parametrization of the angular distribution in elastic pp scattering.

See equation (8) in Cugnon:1996kh. Note: The original Cugnon parametrization is only applicable for plab < 6 GeV and keeps rising above that. We add an upper limit of b <= 9, in order to be compatible with high-energy data (up to plab ~ 25 GeV).

Parameters
[in]plabLab momentum in GeV.
Returns
Cugnon B coefficient for elatic proton-proton scatterings.

Definition at line 218 of file scatteraction.cc.

218  {
219  if (plab < 2.) {
220  double p8 = pow_int(plab, 8);
221  return 5.5 * p8 / (7.7 + p8);
222  } else {
223  return std::min(9.0, 5.334 + 0.67 * (plab - 2.));
224  }
225 }
constexpr T pow_int(const T base, unsigned const exponent)
Efficient template for calculating integer powers using squaring.
Definition: pow.h:23
Here is the call graph for this function:
Here is the caller graph for this function:

◆ Cugnon_bnp()

static double smash::Cugnon_bnp ( double  plab)
static

Computes the B coefficients from the Cugnon parametrization of the angular distribution in elastic np scattering.

See equation (10) in Cugnon:1996kh.

Parameters
[in]plabLab momentum in GeV.
Returns
Cugnon B coefficient for elastic proton-neutron scatterings.

Definition at line 237 of file scatteraction.cc.

237  {
238  if (plab < 0.225) {
239  return 0.;
240  } else if (plab < 0.6) {
241  return 16.53 * (plab - 0.225);
242  } else if (plab < 1.6) {
243  return -1.63 * plab + 7.16;
244  } else {
245  return Cugnon_bpp(plab);
246  }
247 }
static double Cugnon_bpp(double plab)
Computes the B coefficients from the Cugnon parametrization of the angular distribution in elastic pp...
Here is the call graph for this function:
Here is the caller graph for this function:

◆ deduplicate()

static void smash::deduplicate ( std::vector< FinalStateCrossSection > &  final_state_xs)
static

Deduplicate the final-state cross sections by summing.

Parameters
[in,out]final_state_xsFinal-state cross sections.

Definition at line 718 of file scatteractionsfinder.cc.

718  {
719  std::sort(final_state_xs.begin(), final_state_xs.end(),
720  [](const FinalStateCrossSection& a,
721  const FinalStateCrossSection& b) { return a.name_ < b.name_; });
722  auto current = final_state_xs.begin();
723  while (current != final_state_xs.end()) {
724  auto adjacent = std::adjacent_find(
725  current, final_state_xs.end(),
726  [](const FinalStateCrossSection& a, const FinalStateCrossSection& b) {
727  return a.name_ == b.name_;
728  });
729  current = adjacent;
730  if (adjacent != final_state_xs.end()) {
731  adjacent->cross_section_ += (adjacent + 1)->cross_section_;
732  final_state_xs.erase(adjacent + 1);
733  }
734  }
735 }
Here is the caller graph for this function:

◆ operator<<() [11/11]

std::ostream& smash::operator<< ( std::ostream &  out,
const SphereModus m 
)
Parameters
[in]outThe ostream into which to output
[in]mThe SphereModus object to write into out

Definition at line 150 of file spheremodus.cc.

150  {
151  out << "-- Sphere Modus:\nRadius of the sphere: " << m.radius_ << " fm\n";
152  if (m.use_thermal_) {
153  out << "Thermal multiplicities (T = " << m.sphere_temperature_
154  << " GeV, muB = " << m.mub_ << " GeV, muS = " << m.mus_ << " GeV)\n";
155  } else {
156  for (const auto &p : m.init_multipl_) {
157  ParticleTypePtr ptype = &ParticleType::find(p.first);
158  out << ptype->name() << " initial multiplicity " << p.second << '\n';
159  }
160  }
161  out << "Boltzmann momentum distribution with T = " << m.sphere_temperature_
162  << " GeV.\n";
163  return out;
164 }
constexpr int p
Proton.
Here is the call graph for this function:

◆ split() [2/2]

template<typename Out >
void smash::split ( const std::string &  s,
char  delim,
Out  result 
)

Split string by delimiter.

Parameters
[in]sString to be split.
[in]delimSplitting delimiter.
[out]resultSplit string as iterator.

Necessary for the next function

Definition at line 111 of file stringfunctions.cc.

111  {
112  std::stringstream ss;
113  ss.str(s);
114  std::string item;
115  while (std::getline(ss, item, delim)) {
116  *(result++) = item;
117  }
118 }

Variable Documentation

◆ hbarc

constexpr double smash::hbarc = 0.197327053

GeV <-> fm conversion factor.

Definition at line 25 of file constants.h.

◆ fm2_mb

constexpr double smash::fm2_mb = 0.1

mb <-> fm^2 conversion factor.

Definition at line 28 of file constants.h.

◆ gev2_mb

constexpr double smash::gev2_mb = hbarc * hbarc / fm2_mb

GeV^-2 <-> mb conversion factor.

Definition at line 31 of file constants.h.

◆ really_small

constexpr double smash::really_small = 1.0e-6

Numerical error tolerance.

Definition at line 34 of file constants.h.

◆ twopi

constexpr double smash::twopi = 2. * M_PI

\( 2\pi \).

Definition at line 39 of file constants.h.

◆ nuclear_density

constexpr double smash::nuclear_density = 0.168

Ground state density of symmetric nuclear matter [fm^-3].

Definition at line 42 of file constants.h.

◆ small_number

constexpr double smash::small_number = 1.0e-4

Physical error tolerance.

Definition at line 45 of file constants.h.

◆ nucleon_mass

constexpr double smash::nucleon_mass = 0.938

Nucleon mass in GeV.

Note that this should be the same as in particles.txt.

Definition at line 52 of file constants.h.

◆ pion_mass

constexpr double smash::pion_mass = 0.138

Pion mass in GeV.

Note that this should be the same as in particles.txt.

Definition at line 59 of file constants.h.

◆ kaon_mass

constexpr double smash::kaon_mass = 0.494

Kaon mass in GeV.

Note that this should be the same as in particles.txt.

Definition at line 66 of file constants.h.

◆ omega_mass

constexpr double smash::omega_mass = 0.783

omega mass in GeV.

Note that this should be the same as in particles.txt.

Definition at line 73 of file constants.h.

◆ a1_mass

constexpr double smash::a1_mass = 1.26

a1 mass in GeV.

Note that this should be the same as in particles.txt.

Definition at line 80 of file constants.h.

◆ delta_mass

constexpr double smash::delta_mass = 1.232

Delta mass in GeV.

Note that this should be the same as in particles.txt.

Definition at line 86 of file constants.h.

◆ deuteron_mass

constexpr double smash::deuteron_mass = 1.8756

Deuteron mass in GeV.

Note that this should be the same as in particles.txt.

Definition at line 92 of file constants.h.

◆ fine_structure

constexpr double smash::fine_structure = 7.2973525698e-3

Fine-struture constant, approximately 1/137.

Definition at line 95 of file constants.h.

◆ maximum_cross_section

constexpr double smash::maximum_cross_section = 200.

The maximal cross section (in mb) for which it is guaranteed that all collisions with this cross section will be found.

This means that all particle pairs, where the transverse distance is smaller or equal to \( \sqrt{200mb/\pi} \), will be checked for collions.

This maximum occurs in the Delta peak of the pi+p cross section. The only exception of physical cross sections going above 200 mb are the elastic NN and KN cross sections, which diverge at threshold.

Definition at line 108 of file constants.h.

◆ maximum_rndm_seed_in_pythia

constexpr int smash::maximum_rndm_seed_in_pythia = 900000000

The maximum value of the random seed used in PYTHIA.

Definition at line 113 of file constants.h.

◆ minimum_sqrts_pythia_can_handle

constexpr double smash::minimum_sqrts_pythia_can_handle = 10.0

Energy in GeV, below which hard reactions via pythia are impossible.

This constraint is technical and comes from the pythia model itself. At the same time, physics-wise, hard cross-sections at the low energies are so small, that this constrant is well justified.

Definition at line 121 of file constants.h.

◆ ID_PROCESS_PHOTON

constexpr std::uint32_t smash::ID_PROCESS_PHOTON
Initial value:
=
std::numeric_limits<std::uint32_t>::max()

Process ID for any photon process.

It is chosen such that it will not conflict with any other process.

Definition at line 128 of file constants.h.

◆ kaon_nucleon_ratios

KaonNucleonRatios smash::kaon_nucleon_ratios

Definition at line 670 of file parametrizations.cc.

◆ KMINUSP_ELASTIC_P_LAB

const std::initializer_list<double> smash::KMINUSP_ELASTIC_P_LAB

PDG data on K- p elastic cross section: momentum in lab frame.

Definition at line 20 of file parametrizations_data.h.

◆ KMINUSP_ELASTIC_SIG

const std::initializer_list<double> smash::KMINUSP_ELASTIC_SIG

PDG data on K- p elastic cross section: cross section.

Definition at line 68 of file parametrizations_data.h.

◆ kminusp_elastic_interpolation

std::unique_ptr<InterpolateDataLinear<double> > smash::kminusp_elastic_interpolation = nullptr
static

An interpolation that gets lazily filled using the KMINUSP_ELASTIC data.

Definition at line 107 of file parametrizations_data.h.

◆ KMINUSP_TOT_PLAB

const std::initializer_list<double> smash::KMINUSP_TOT_PLAB

PDG data on K- p total cross section: momentum in lab frame.

Definition at line 110 of file parametrizations_data.h.

◆ KMINUSP_TOT_SIG

const std::initializer_list<double> smash::KMINUSP_TOT_SIG

PDG data on K- p total cross section: cross section.

Definition at line 165 of file parametrizations_data.h.

◆ KMINUSP_RES_SQRTS

const std::initializer_list<double> smash::KMINUSP_RES_SQRTS
Initial value:
= {
1.4355, 1.4530, 1.4730, 1.4929, 1.5129, 1.5329, 1.5529, 1.5729,
1.5929, 1.6128, 1.6328, 1.6528, 1.6728, 1.6928, 1.7127, 1.7327,
1.7527, 1.7727, 1.7927, 1.8127, 1.8326, 1.8526, 1.8726, 1.8926,
1.9126, 1.9325, 1.9525, 1.9725, 1.9925, 2.0125, 2.0325, 2.0524,
2.0724, 2.0924, 2.1124, 2.1324, 2.1523, 2.1723, 2.1923, 2.2123,
2.2323, 2.2523, 2.2722, 2.2922, 2.3122, 2.3322, 2.3522, 2.3721,
2.3921, 2.4121, 2.4321, 2.4521, 2.4721, 2.4920, 2.5120, 2.5320}

Center-of-mass energy list for K̅⁻ N⁺

Definition at line 210 of file parametrizations_data.h.

◆ KMINUSP_RES_SIG

const std::initializer_list<double> smash::KMINUSP_RES_SIG
Initial value:
= {
0.46856081097, 0.68994120313, 1.00475205957, 1.66469547655,
5.63530052434, 4.17372028288, 4.50737036469, 8.00913400697,
0.29205365102, 2.72859364291, 3.30822314603, 4.44740017628,
4.95697831919, 5.05350905117, 4.87562017799, 7.48383422000,
8.29845755438, 9.71940157530, 11.10200040600, 12.00610574630,
10.06137989140, 7.47886042856, 6.11390219499, 5.19531126779,
4.38090191191, 3.95316327084, 3.53446044755, 3.46497827089,
3.63741875589, 3.77762079044, 0.87409952036, 4.19070149234,
4.38097308237, 4.27752586136, 4.12637945445, 3.70027602474,
3.31806303484, 2.88526838044, 2.58141493751, 2.36391939397,
2.18133708906, 1.39193162095, 2.03247269918, 2.00726146262,
2.13817978212, 2.16907178433, 2.08118209913, 1.83166338166,
1.56038155638, 1.27216056674, 1.03167072054, 0.85006416230,
0.39627220898, 0.57172926654, 0.51129452389, 0.44626386026}

Elastic K̅⁻ N⁺ cross section contributions from decays.

These need to be subtracted from the interpolation of the PDG data on elastic cross sections. This data was generated using the SMASH analysis suite and should be updated when strange resonances are changed or added.

Definition at line 226 of file parametrizations_data.h.

◆ kminusp_elastic_res_interpolation

std::unique_ptr<InterpolateDataSpline> smash::kminusp_elastic_res_interpolation = nullptr
static

An interpolation that gets lazily filled using the KMINUSP_RES data.

Definition at line 244 of file parametrizations_data.h.

◆ KPLUSN_TOT_PLAB

const std::initializer_list<double> smash::KPLUSN_TOT_PLAB
Initial value:
= {
0.770, 0.888, 0.939, 0.970, 0.989, 1.040, 1.091, 1.141,
1.191, 1.242, 1.292, 1.300, 1.342, 1.392, 1.440,
1.442, 1.492, 1.550, 1.593, 1.600, 1.643, 1.690, 1.693,
1.700, 1.743, 1.750, 1.793, 1.800, 1.850, 1.893, 1.900,
1.950, 1.970, 1.993, 2.000, 2.050, 2.093, 2.100, 2.150,
2.193, 2.200, 2.260, 2.300, 2.350, 2.393, 2.400, 2.450,
2.500, 2.550, 2.550, 2.600, 2.650, 2.700, 2.750, 2.800,
2.830, 2.850, 2.900, 2.950, 3.000, 3.050, 3.100, 3.150,
3.200, 3.250, 3.300, 6.000, 8.000, 10.000, 12.000, 14.000,
15.000, 16.000, 18.000, 20.000, 20.000, 25.000, 30.000, 35.000,
35.000, 40.000, 45.000, 50.000, 50.000, 50.000, 55.000, 70.000,
100.000, 100.000, 120.000, 150.000, 150.000, 170.000, 200.000, 200.000,
240.000, 280.000, 310.000}

PDG data on K+ n total cross section: momentum in lab frame.

One data point is ignored because it is an outlier and messes up the smoothing.

Definition at line 252 of file parametrizations_data.h.

◆ KPLUSN_TOT_SIG

const std::initializer_list<double> smash::KPLUSN_TOT_SIG
Initial value:
= {
15.50, 16.85, 17.60, 17.80, 18.53, 18.91, 20.61, 21.25, 20.87,
20.26, 19.68, 18.50, 19.32, 19.22, 18.10, 19.07, 18.95, 18.91,
18.79, 18.89, 18.67, 18.50, 18.69, 18.83, 18.88, 18.86, 18.73,
18.53, 18.66, 18.50, 18.69, 18.70, 18.60, 18.55, 18.79, 18.54,
18.67, 18.49, 18.43, 18.40, 18.40, 17.70, 18.27, 18.26, 18.63,
18.09, 18.25, 18.11, 17.10, 18.17, 18.09, 18.02, 18.11, 18.06,
18.01, 17.50, 17.95, 17.85, 17.81, 17.81, 17.83, 17.85, 17.61,
17.61, 17.66, 17.55, 17.50, 17.60, 17.50, 17.60, 17.50, 17.87,
17.40, 17.60, 17.94, 17.70, 17.78, 17.69, 18.29, 18.12, 18.15,
18.30, 18.66, 18.56, 18.02, 18.43, 18.60, 19.04, 18.99, 19.23,
19.63, 19.55, 19.74, 19.72, 19.82, 20.37, 20.61, 20.80}

PDG data on K+ n total cross section: cross section.

One data point is ignored because it is an outlier and messes up the smoothing.

Definition at line 273 of file parametrizations_data.h.

◆ kplusn_total_interpolation

std::unique_ptr<InterpolateDataLinear<double> > smash::kplusn_total_interpolation = nullptr
static

An interpolation that gets lazily filled using the KPLUSN_TOT data.

Definition at line 288 of file parametrizations_data.h.

◆ KPLUSP_TOT_PLAB

const std::initializer_list<double> smash::KPLUSP_TOT_PLAB
Initial value:
= {
0.178, 0.265, 0.321, 0.351, 0.366, 0.405, 0.440, 0.451,
0.475, 0.475, 0.506, 0.522, 0.536, 0.566, 0.569, 0.588,
0.589, 0.592, 0.593, 0.596, 0.618, 0.620, 0.627, 0.643,
0.644, 0.657, 0.668, 0.686, 0.698, 0.713, 0.717, 0.727,
0.757, 0.768, 0.770, 0.786, 0.817, 0.823, 0.846, 0.864,
0.864, 0.881, 0.891, 0.900, 0.904, 0.916, 0.938, 0.942,
0.951, 0.969, 0.969, 0.970, 0.970, 0.985, 0.992, 1.020,
1.029, 1.043, 1.055, 1.060, 1.084, 1.090, 1.094, 1.125,
1.130, 1.140, 1.144, 1.160, 1.170, 1.189, 1.194, 1.207,
1.210, 1.238, 1.245, 1.250, 1.293, 1.295, 1.300, 1.320,
1.345, 1.347, 1.380, 1.395, 1.408, 1.440, 1.445, 1.455,
1.468, 1.480, 1.495, 1.550, 1.563, 1.596, 1.600, 1.646,
1.690, 1.696, 1.700, 1.746, 1.750, 1.796, 1.800, 1.850,
1.896, 1.900, 1.945, 1.950, 1.960, 1.970, 1.996, 2.000,
2.050, 2.096, 2.100, 2.150, 2.196, 2.200, 2.260, 2.300,
2.350, 2.396, 2.400, 2.450, 2.473, 2.500, 2.530, 2.550,
2.550, 2.600, 2.650, 2.700, 2.750, 2.760, 2.800, 2.830,
2.850, 2.900, 2.950, 3.000, 3.050, 3.100, 3.150, 3.200,
3.200, 3.250, 3.250, 3.300, 3.700, 4.000, 4.200, 4.750,
5.000, 5.500, 6.000, 7.000, 7.000, 8.000, 8.200, 8.500,
10.000, 10.000, 10.000, 10.000, 10.900, 11.500, 12.000, 12.500,
13.400, 14.000, 15.000, 15.000, 16.000, 16.000, 16.900, 18.000,
19.000, 20.000, 20.000, 25.000, 30.000, 32.000, 35.000, 35.000,
40.000, 42.500, 45.000, 50.000, 50.000, 50.000, 52.200, 55.000,
70.000, 100.000, 100.000, 100.000, 100.000, 120.000, 147.000, 150.000,
150.000, 170.000, 175.000, 200.000, 200.000, 240.000, 280.000, 310.000}

PDG data on K+ p total cross section: momentum in lab frame.

Definition at line 291 of file parametrizations_data.h.

◆ KPLUSP_TOT_SIG

const std::initializer_list<double> smash::KPLUSP_TOT_SIG
Initial value:
= {
11.40, 13.00, 14.00, 12.20, 13.20, 13.69, 12.81, 16.30, 12.70, 13.58, 13.02,
15.20, 12.09, 13.20, 12.70, 12.60, 16.30, 14.36, 13.05, 13.04, 12.65, 12.91,
12.18, 12.50, 12.88, 12.43, 13.10, 11.25, 12.60, 11.14, 11.10, 12.45, 12.65,
11.65, 13.00, 12.80, 13.20, 12.97, 13.45, 14.07, 13.21, 13.90, 14.39, 13.10,
14.23, 14.20, 14.59, 15.57, 14.95, 15.28, 15.63, 15.40, 15.25, 16.20, 15.97,
16.10, 15.69, 17.39, 16.95, 16.40, 17.04, 17.60, 17.12, 17.55, 18.08, 18.02,
18.09, 17.95, 18.10, 18.06, 18.47, 19.85, 18.58, 18.11, 18.54, 20.71, 18.44,
18.61, 17.90, 19.33, 18.44, 18.27, 18.64, 18.27, 17.97, 18.10, 18.04, 18.20,
17.94, 18.04, 17.93, 17.70, 17.66, 17.75, 17.71, 17.86, 17.50, 17.85, 17.73,
17.80, 17.83, 17.80, 17.98, 17.77, 17.81, 17.79, 17.41, 17.75, 19.40, 16.90,
17.60, 17.63, 17.72, 17.51, 17.56, 17.57, 17.54, 17.60, 17.10, 17.44, 17.52,
17.55, 17.56, 17.48, 17.25, 17.49, 17.47, 17.10, 17.44, 17.50, 17.47, 17.41,
17.41, 17.41, 17.40, 16.70, 17.30, 17.34, 17.30, 17.19, 17.14, 17.08, 17.15,
17.13, 17.13, 17.13, 17.50, 17.14, 21.00, 17.60, 17.10, 21.30, 17.20, 17.90,
17.00, 17.20, 18.40, 17.30, 17.20, 18.70, 17.20, 17.30, 18.80, 17.30, 18.10,
19.00, 17.30, 18.30, 17.50, 17.40, 18.50, 17.31, 17.10, 17.00, 18.80, 17.10,
17.30, 17.50, 17.42, 17.68, 17.72, 18.40, 17.82, 17.80, 18.05, 17.91, 17.88,
18.06, 18.03, 18.37, 18.28, 18.17, 18.52, 18.40, 18.88, 18.70, 18.85, 19.14,
19.52, 19.36, 19.33, 19.64, 18.20, 19.91, 19.84, 20.22, 20.45, 20.67}

PDG data on K+ p total cross section: cross section.

Definition at line 320 of file parametrizations_data.h.

◆ kplusp_total_interpolation

std::unique_ptr<InterpolateDataLinear<double> > smash::kplusp_total_interpolation = nullptr
static

An interpolation that gets lazily filled using the KPLUSP_TOT data.

Definition at line 343 of file parametrizations_data.h.

◆ PIMINUSP_ELASTIC_P_LAB

const std::initializer_list<double> smash::PIMINUSP_ELASTIC_P_LAB
Initial value:
= {
0.09875, 0.14956, 0.21648, 0.21885, 0.22828, 0.24684, 0.25599, 0.26733,
0.27071, 0.2752, 0.29303, 0.29303, 0.33138, 0.33571, 0.33788, 0.35052,
0.378, 0.38261, 0.404, 0.40626, 0.408, 0.42188, 0.427, 0.44888,
0.452, 0.471, 0.49008, 0.49008, 0.49008, 0.509, 0.523, 0.52845,
0.53155, 0.547, 0.54911, 0.54911, 0.556, 0.565, 0.57281, 0.582,
0.586, 0.609, 0.6139, 0.61698, 0.625, 0.64054, 0.657, 0.65793,
0.658, 0.6753, 0.683, 0.687, 0.69061, 0.699, 0.70692, 0.71399,
0.72628, 0.731, 0.73257, 0.74257, 0.75, 0.76189, 0.775, 0.77714,
0.77714, 0.77827, 0.798, 0.82586, 0.83803, 0.848, 0.84954, 0.854,
0.87466, 0.90386, 0.91903, 0.924, 0.95947, 1.03016, 1.106, 1.12339,
1.164, 1.165, 1.174, 1.214, 1.21659, 1.23, 1.25, 1.26,
1.279, 1.323, 1.339, 1.347, 1.355, 1.365, 1.375, 1.385,
1.395, 1.405, 1.415, 1.425, 1.435, 1.445, 1.455, 1.465,
1.475, 1.485, 1.495, 1.497, 1.499, 1.503, 1.5031, 1.509,
1.567, 1.59, 1.6, 1.603, 1.71, 1.85, 2.1, 2.14,
2.26, 2.29, 2.7, 2.75, 2.77, 2.7999, 3., 3.15}

PDG data on pi- p elastic cross section: momentum in lab frame.

Definition at line 346 of file parametrizations_data.h.

◆ PIMINUSP_ELASTIC_SIG

const std::initializer_list<double> smash::PIMINUSP_ELASTIC_SIG
Initial value:
= {
1.847, 2.9, 9.6, 11.3, 12.8, 17., 20.1, 21.4, 22.5,
21.2, 22.5, 18.2, 19.5, 16., 17.4, 15.1, 12.29, 12.4,
10.1, 13.8, 10.41, 11.4, 9., 10.3, 8.9, 9.2, 10.42,
10.9, 10.8, 9.15, 9.8, 11.4, 11.4, 9.99, 13., 13.,
10.24, 10.8, 12.19, 16.2, 11.34, 12.86, 13.71, 13.9, 12.19,
14.8, 13.92, 16.2, 15.32, 16.98, 18.9, 17.07, 18.86, 19.07,
19.95, 20.5, 19.87, 18.9, 16.6, 19.4, 19.91, 18.94, 17.56,
17.19, 17.82, 16.1, 14.91, 15.75, 14.9, 13.2, 14.1, 14.47,
14.4, 14.8, 14.1, 18.8, 18., 18.6, 17.95, 17.7, 13.66,
15.01, 15.73, 12.45, 14.1, 14.6, 13.31, 13.8, 12.8, 13.09,
12.627, 12.987, 12.763, 12.367, 12.852, 12.67, 12.126, 12.972, 12.478,
12.594, 12.532, 11.801, 11.568, 11.413, 11.119, 11.643, 11.368, 11.523,
11.163, 11.69, 10., 10.39, 10.21, 9.65, 9., 9.82, 10.4,
11.1, 9.69, 9.3, 8.91, 8.5, 7.7, 7.2, 7.2, 7.8,
7.57, 6.1}

PDG data on pi- p elastic cross section: cross section.

Definition at line 365 of file parametrizations_data.h.

◆ piminusp_elastic_interpolation

std::unique_ptr<InterpolateDataLinear<double> > smash::piminusp_elastic_interpolation = nullptr
static

An interpolation that gets lazily filled using the PIMINUSP_ELASTIC data.

Definition at line 384 of file parametrizations_data.h.

◆ PIMINUSP_LAMBDAK0_P_LAB

const std::initializer_list<double> smash::PIMINUSP_LAMBDAK0_P_LAB
Initial value:
= {
0.904, 0.91, 0.919, 0.922, 0.926, 0.93, 0.931, 0.942, 0.945, 0.958, 0.964,
0.968, 0.98, 0.98, 0.983, 0.993, 0.997, 1.001, 1.002, 1.007, 1.012, 1.017,
1.02, 1.02, 1.021, 1.022, 1.023, 1.027, 1.031, 1.035, 1.04, 1.04, 1.04,
1.043, 1.048, 1.054, 1.059, 1.065, 1.078, 1.081, 1.091, 1.091, 1.094, 1.095,
1.097, 1.116, 1.129, 1.13, 1.135, 1.144, 1.159, 1.194, 1.223, 1.235, 1.277,
1.287, 1.326, 1.331, 1.332, 1.395, 1.433, 1.455, 1.5, 1.508, 1.515, 1.575,
1.59, 1.6, 1.615, 1.645, 1.69, 1.69, 1.705, 1.775, 1.85, 1.875, 1.94,
1.95, 1.98, 2., 2.05, 2.05, 2.055, 2.115, 2.14, 2.15, 2.235, 2.25,
2.35, 2.375, 2.494, 2.605, 2.7, 2.75, 2.75, 2.86, 3.01, 3.125, 3.21,
3.885, 3.9, 3.95, 4.16, 4.5, 6., 8., 10.}

PDG data on pi- p to Lambda K0 cross section: momentum in lab frame.

Definition at line 387 of file parametrizations_data.h.

◆ PIMINUSP_LAMBDAK0_SIG

const std::initializer_list<double> smash::PIMINUSP_LAMBDAK0_SIG
Initial value:
= {
0.056, 0.122, 0.18, 0.14, 0.227, 0.212, 0.13, 0.3, 0.336, 0.43,
0.427, 0.52, 0.467, 0.45, 0.576, 0.59, 0.652, 0.56, 0.588, 0.634,
0.686, 0.665, 0.67, 0.69, 0.809, 0.675, 0.94, 0.737, 0.734, 0.73,
0.926, 0.59, 0.92, 0.57, 0.568, 0.651, 0.899, 0.64, 0.794, 0.58,
0.82, 0.58, 0.7, 0.68, 0.729, 0.575, 0.592, 0.462, 0.541, 0.64,
0.48, 0.58, 0.46, 0.485, 0.447, 0.25, 0.367, 0.32, 0.29, 0.25,
0.32, 0.29, 0.334, 0.214, 0.22, 0.21, 0.214, 0.238, 0.208, 0.16,
0.199, 0.174, 0.14, 0.13, 0.181, 0.16, 0.185, 0.182, 0.184, 0.15,
0.182, 0.179, 0.11, 0.16, 0.162, 0.192, 0.15, 0.172, 0.174, 0.12,
0.16, 0.106, 0.12, 0.09, 0.09, 0.109, 0.084, 0.094, 0.087, 0.067,
0.058, 0.0644, 0.049, 0.054, 0.038, 0.0221, 0.0157}

PDG data on pi- p to Lambda K0 cross section: cross section.

Definition at line 400 of file parametrizations_data.h.

◆ piminusp_lambdak0_interpolation

std::unique_ptr<InterpolateDataLinear<double> > smash::piminusp_lambdak0_interpolation = nullptr
static

An interpolation that gets lazily filled using the PIMINUSP_LAMBDAK0 data.

Definition at line 415 of file parametrizations_data.h.

◆ PIMINUSP_SIGMAMINUSKPLUS_P_LAB

const std::initializer_list<double> smash::PIMINUSP_SIGMAMINUSKPLUS_P_LAB
Initial value:
= {
1.091, 1.128, 1.17, 1.22, 1.235, 1.284, 1.326, 1.5, 1.59,
1.615, 1.69, 1.69, 1.85, 1.94, 1.95, 1.98, 2.05, 2.14,
2.15, 2.25, 2.35, 2.494, 2.61, 2.7, 2.75, 2.86, 3.,
3.01, 3.13, 3.21, 3.89, 3.95, 4., 4.16}

PDG data on pi- p to Sigma- K+ cross section: momentum in lab frame.

Definition at line 418 of file parametrizations_data.h.

◆ PIMINUSP_SIGMAMINUSKPLUS_SIG

const std::initializer_list<double> smash::PIMINUSP_SIGMAMINUSKPLUS_SIG
Initial value:
= {
0.25, 0.218, 0.231, 0.27, 0.235, 0.209, 0.245, 0.242, 0.262,
0.18, 0.153, 0.19, 0.099, 0.098, 0.099, 0.09, 0.087, 0.069,
0.065, 0.057, 0.053, 0.051, 0.03, 0.031, 0.032, 0.022, 0.015,
0.022, 0.0155, 0.0145, 0.0085, 0.0096, 0.005, 0.0045}

PDG data on pi- p to Sigma- K+ cross section: cross section.

Definition at line 425 of file parametrizations_data.h.

◆ piminusp_sigmaminuskplus_interpolation

std::unique_ptr<InterpolateDataLinear<double> > smash::piminusp_sigmaminuskplus_interpolation = nullptr
static

An interpolation that gets lazily filled using the PIMINUSP_SIGMAMINUSKPLUS data.

Definition at line 436 of file parametrizations_data.h.

◆ PIMINUSP_SIGMA0K0_RES_SQRTS

const std::initializer_list<double> smash::PIMINUSP_SIGMA0K0_RES_SQRTS
Initial value:
= {
1.5, 1.516, 1.532, 1.548, 1.564, 1.58, 1.596, 1.612, 1.628, 1.644, 1.66,
1.676, 1.692, 1.708, 1.724, 1.74, 1.756, 1.772, 1.788, 1.804, 1.82, 1.836,
1.852, 1.868, 1.884, 1.9, 1.916, 1.932, 1.948, 1.964, 1.98, 1.996, 2.012,
2.028, 2.044, 2.06, 2.076, 2.092, 2.108, 2.124, 2.14, 2.156, 2.172, 2.188,
2.204, 2.22, 2.236, 2.252, 2.268, 2.284, 2.3, 2.316, 2.332, 2.348, 2.364,
2.38, 2.396, 2.412, 2.428, 2.444, 2.46, 2.476, 2.492, 2.508, 2.524, 2.54,
2.556, 2.572, 2.588, 2.604, 2.62, 2.636, 2.652, 2.668, 2.684, 2.7, 2.716,
2.732, 2.748, 2.764, 2.78, 2.796, 2.812, 2.828, 2.844, 2.86, 2.876, 2.892,
2.908, 2.924, 2.94, 2.956, 2.972, 2.988, 3.004, 3.02, 3.036, 3.052, 3.068,
3.084, 3.1, 3.116, 3.132, 3.148, 3.164, 3.18}

pi- p to Sigma0 K0 cross section: square root s

Definition at line 439 of file parametrizations_data.h.

◆ PIMINUSP_SIGMA0K0_RES_SIG

const std::initializer_list<double> smash::PIMINUSP_SIGMA0K0_RES_SIG
Initial value:
= {
0., 0., 0., 0., 0., 0.,
0., 0., 0., 0., 0., 0.,
0.0386981, 0.09589789, 0.11956695, 0.11685363, 0.12053117, 0.13208736,
0.14949223, 0.16688579, 0.18830654, 0.20611132, 0.22231072, 0.23099061,
0.23734563, 0.23334048, 0.22794051, 0.21559531, 0.20134617, 0.18763246,
0.1723282, 0.15814744, 0.14757816, 0.13750278, 0.12698656, 0.11719809,
0.11024985, 0.1044732, 0.09623321, 0.09092108, 0.08670191, 0.08147493,
0.0772165, 0.07346243, 0.0719974, 0.06805902, 0.06496733, 0.06264939,
0.05904799, 0.05762721, 0.05588871, 0.05393479, 0.0517673, 0.05165839,
0.05087591, 0.04885535, 0.04730724, 0.04651682, 0.04604065, 0.04529776,
0.04406593, 0.04367817, 0.04230014, 0.04144308, 0.04171145, 0.04073006,
0.03996921, 0.03902337, 0.03939531, 0.03895125, 0.03904553, 0.03816119,
0.03772662, 0.03710955, 0.0361001, 0.03632378, 0.03549849, 0.03549987,
0.03527251, 0.034535, 0.03314715, 0.0335742, 0.03326698, 0.0330181,
0.0324203, 0.03227253, 0.0315376, 0.03065083, 0.03041305, 0.03023753,
0.03008669, 0.02900321, 0.02827017, 0.02805024, 0.02785525, 0.02753706,
0.02692862, 0.02603758, 0.02591122, 0.02537291, 0.02467199, 0.02466657,
0.02370074, 0.02353027, 0.02362089, 0.0230085}

pi- p to Sigma0 K0 cross section: cross section

The experimental data is missing, so the cross section is obtained by running the simulation, and purely contributed by the resonances

Definition at line 457 of file parametrizations_data.h.

◆ piminusp_sigma0k0_interpolation

std::unique_ptr<InterpolateDataLinear<double> > smash::piminusp_sigma0k0_interpolation = nullptr
static

An interpolation that gets lazily filled using the PIMINUSP_SIGMA0K0_RES data.

Definition at line 482 of file parametrizations_data.h.

◆ PIMINUSP_RES_SQRTS

const std::initializer_list<double> smash::PIMINUSP_RES_SQRTS
Initial value:
= {
1.08, 1.10, 1.12, 1.14, 1.16, 1.18, 1.20, 1.22, 1.24, 1.26, 1.28, 1.30,
1.32, 1.34, 1.36, 1.38, 1.40, 1.42, 1.44, 1.46, 1.48, 1.50, 1.52, 1.54,
1.56, 1.58, 1.60, 1.62, 1.64, 1.66, 1.68, 1.70, 1.72, 1.74, 1.76, 1.78,
1.80, 1.82, 1.84, 1.86, 1.88, 1.90, 1.92, 1.94, 1.96, 1.98, 2.00, 2.02,
2.04, 2.06, 2.08, 2.10, 2.12, 2.14, 2.16, 2.18, 2.20}

Center-of-mass energy list for π⁻ N⁺

Definition at line 485 of file parametrizations_data.h.

◆ PIMINUSP_RES_SIG

const std::initializer_list<double> smash::PIMINUSP_RES_SIG
Initial value:
= {
0.132595, 0.40252, 1.178451, 2.760204, 5.730226, 10.782558, 17.245252,
20.786286, 18.877248, 15.375461, 12.793756, 11.279813, 10.825084, 11.051209,
11.562095, 12.129368, 12.290113, 12.228052, 12.286856, 13.229999, 15.355433,
16.217831, 15.047059, 12.962125, 11.616049, 11.523171, 12.685314, 14.757287,
17.408006, 19.193396, 18.636883, 16.105174, 13.008674, 10.569508, 8.845049,
7.695193, 7.042515, 6.526963, 6.296451, 6.16313, 6.006575, 5.891764,
5.694986, 5.432877, 5.117872, 4.64471, 4.184152, 3.679608, 3.128582,
2.56838, 1.975527, 1.434032, 0.958996, 0.554314, 0.243301, 0.0644,
0.}

Elastic π⁻ N⁺ cross section contributions from decays.

These need to be subtracted from the interpolation of the PDG data on elastic cross sections. This data was generated using the SMASH analysis suite and should be updated when nucleon resonances are changed or added.

Definition at line 499 of file parametrizations_data.h.

◆ piminusp_elastic_res_interpolation

std::unique_ptr<InterpolateDataSpline> smash::piminusp_elastic_res_interpolation = nullptr
static

An interpolation that gets lazily filled using the PIMINUSP_RES data.

Definition at line 512 of file parametrizations_data.h.

◆ PIPLUSP_ELASTIC_P_LAB

const std::initializer_list<double> smash::PIPLUSP_ELASTIC_P_LAB
Initial value:
= {
0.09875, 0.13984, 0.14956, 0.33138, 0.378, 0.408, 0.4093, 0.427,
0.42736, 0.453, 0.471, 0.49008, 0.509, 0.5214, 0.53155, 0.547,
0.57281, 0.574, 0.586, 0.5891, 0.59, 0.591, 0.6139, 0.625,
0.625, 0.635, 0.645, 0.645, 0.657, 0.65793, 0.6753, 0.687,
0.698, 0.7, 0.70692, 0.725, 0.72628, 0.72628, 0.752, 0.752,
0.77714, 0.807, 0.809, 0.82, 0.82586, 0.85, 0.895, 0.895,
0.9, 0.91, 0.93926, 0.945, 0.945, 0.995, 0.995, 1.0029,
1.02, 1.04, 1.04, 1.0402, 1.05, 1.12091, 1.12091, 1.195,
1.207, 1.2217, 1.232, 1.375, 1.3925, 1.44384, 1.46, 1.493,
1.5, 1.53, 1.585, 1.585, 1.6, 1.68881, 1.69, 1.77,
1.8, 1.869, 1.9, 1.99, 2., 2.0199, 2.07, 2.077,
2.11, 2.19, 2.3, 2.35, 2.5, 2.77, 2.9, 3.,
3.05, 3.56, 3.63, 3.65, 3.67, 3.9, 4., 5.,
5., 6., 6.8001, 8., 8.04, 8.8, 10.8, 11.7,
12.8, 14.8, 16., 16.2, 16.7, 29., 32.1, 43.,
50., 60., 70., 100., 140., 147., 175., 200.,
250.}

PDG data on pi+ p elastic cross section: momentum in lab frame.

Definition at line 515 of file parametrizations_data.h.

◆ PIPLUSP_ELASTIC_SIG

const std::initializer_list<double> smash::PIPLUSP_ELASTIC_SIG
Initial value:
= {
6.15, 15.8, 20.4, 140.9, 91.6, 71.6, 67.5, 57.3, 60.19, 46.6, 40.8,
38.74, 30.6, 29.6, 30.59, 24.74, 24.31, 28.16, 19.83, 20.4, 20.64, 20.63,
19.55, 15.75, 18.5, 17.2, 14.85, 16.16, 14.71, 15.32, 14.38, 12.2, 12.93,
12.96, 12.17, 11.6, 11.06, 11.5, 10.62, 10.55, 8.82, 9.36, 8.97, 9.1,
8.02, 8.38, 8.37, 8.14, 11.1, 9.3, 11., 10.32, 9.87, 11.7, 11.15,
12.05, 11.1, 12.37, 11.83, 10.3, 12.8, 14.54, 15.3, 14.3, 13.59, 12.6,
12.3, 17.87, 16.5, 19.31, 18.73, 16.68, 13.8, 15.86, 16.7, 16.7, 15.05,
13.04, 13.57, 12.46, 12.3, 11.81, 10.9, 9.84, 10.6, 9.1, 9.52, 9.46,
9.44, 9.15, 8.45, 10.2, 6.9, 7.7, 8.3, 7.84, 7.02, 6.93, 7.07,
6.88, 7.15, 6.5, 6.4, 5.85, 5.79, 5.33, 5.47, 4.9, 4.9, 5.02,
4.75, 4.2, 4.54, 4.46, 4.21, 4.21, 3.98, 3.19, 3.37, 3.16, 3.29,
3.1, 3.35, 3.3, 3.39, 3.24, 3.37, 3.17, 3.3}

PDG data on pi+ p elastic cross section: cross section.

Definition at line 535 of file parametrizations_data.h.

◆ piplusp_elastic_interpolation

std::unique_ptr<InterpolateDataLinear<double> > smash::piplusp_elastic_interpolation = nullptr
static

An interpolation that gets lazily filled using the PIPLUSP_ELASTIC_SIG data.

Definition at line 551 of file parametrizations_data.h.

◆ PIPLUSP_SIGMAPLUSKPLUS_P_LAB

const std::initializer_list<double> smash::PIPLUSP_SIGMAPLUSKPLUS_P_LAB
Initial value:
= {
1.041, 1.105, 1.111, 1.15, 1.157, 1.17, 1.195, 1.206, 1.218, 1.222, 1.265,
1.28, 1.282, 1.328, 1.34, 1.377, 1.39, 1.41, 1.419, 1.43, 1.456, 1.49,
1.508, 1.518, 1.549, 1.55, 1.58, 1.582, 1.614, 1.63, 1.68, 1.687, 1.7,
1.712, 1.76, 1.77, 1.775, 1.808, 1.84, 1.879, 1.906, 1.95, 1.971, 1.997,
2.067, 2.08, 2.099, 2.152, 2.197, 2.241, 2.291, 2.344, 2.379, 2.437, 2.473,
2.77, 3.23, 3.71, 4., 5., 5.5, 7., 10.3, 12., 16.}

PDG data on pi+ p to Sigma+ K+ cross section: momentum in lab frame.

Definition at line 554 of file parametrizations_data.h.

◆ PIPLUSP_SIGMAPLUSKPLUS_SIG

const std::initializer_list<double> smash::PIPLUSP_SIGMAPLUSKPLUS_SIG
Initial value:
= {
0.034, 0.146, 0.144, 0.214, 0.248, 0.205, 0.24, 0.214, 0.242, 0.25,
0.278, 0.34, 0.369, 0.412, 0.4, 0.467, 0.44, 0.49, 0.523, 0.51,
0.662, 0.529, 0.692, 0.545, 0.604, 0.53, 0.53, 0.465, 0.494, 0.47,
0.505, 0.434, 0.47, 0.436, 0.38, 0.415, 0.418, 0.393, 0.405, 0.332,
0.37, 0.31, 0.338, 0.298, 0.3, 0.29, 0.28, 0.273, 0.26, 0.25,
0.23, 0.242, 0.22, 0.217, 0.234, 0.165, 0.168, 0.104, 0.059, 0.059,
0.0297, 0.0371, 0.02, 0.0202, 0.0143}

PDG data on pi+ p to Sigma+ K+ section: cross section.

Definition at line 563 of file parametrizations_data.h.

◆ piplusp_sigmapluskplus_interpolation

std::unique_ptr<InterpolateDataLinear<double> > smash::piplusp_sigmapluskplus_interpolation = nullptr
static

An interpolation that gets lazily filled using the PIPLUSP_SIGMAPLUSKPLUS_SIG data.

Definition at line 577 of file parametrizations_data.h.

◆ PIPLUSP_RES_SQRTS

const std::initializer_list<double> smash::PIPLUSP_RES_SQRTS
Initial value:
= {
1.08, 1.10, 1.12, 1.14, 1.16, 1.18, 1.20, 1.22, 1.24, 1.26, 1.28, 1.30,
1.32, 1.34, 1.36, 1.38, 1.40, 1.42, 1.44, 1.46, 1.48, 1.50, 1.52, 1.54,
1.56, 1.58, 1.60, 1.62, 1.64, 1.66, 1.68, 1.70, 1.72, 1.74, 1.76, 1.78,
1.80, 1.82, 1.84, 1.86, 1.88, 1.90, 1.92, 1.94, 1.96, 1.98, 2.00, 2.02,
2.04, 2.06, 2.08, 2.10, 2.12, 2.14, 2.16, 2.18, 2.20}

Center-of-mass energy list for π⁺ N⁺

Definition at line 580 of file parametrizations_data.h.

◆ PIPLUSP_RES_SIG

const std::initializer_list<double> smash::PIPLUSP_RES_SIG
Initial value:
= {
0.138618, 2.13515, 8.158391, 20.991292, 45.854734, 89.292892,
145.033063, 172.723465, 151.669374, 114.877364, 84.588934, 63.360182,
48.779878, 38.585331, 31.261638, 25.851079, 21.765201, 18.615565,
16.163947, 14.240117, 12.740128, 11.592541, 10.752035, 10.244949,
10.011848, 10.03972, 10.182104, 9.99584, 9.503257, 8.846592,
8.155468, 7.45333, 7.01551, 6.87968, 6.995852, 7.357051,
8.003923, 8.796652, 9.558371, 10.117875, 10.133957, 9.541971,
8.50303, 7.217433, 5.980272, 4.895307, 3.946998, 3.17339,
2.523094, 1.938636, 1.462639, 1.015587, 0.660593, 0.36496,
0.163456, 0.039142, 0.}

Elastic π⁺ N⁺ cross section contributions from decays.

These need to be subtracted from the interpolation of the PDG data on elastic cross sections. This data was generated using the SMASH analysis suite and should be updated when nucleon resonances are changed or added.

Definition at line 594 of file parametrizations_data.h.

◆ piplusp_elastic_res_interpolation

std::unique_ptr<InterpolateDataSpline> smash::piplusp_elastic_res_interpolation = nullptr
static

A null interpolation that gets filled using the PIPLUSP_RES data.

Definition at line 608 of file parametrizations_data.h.

◆ UB_lat_pointer

RectangularLattice< double > * smash::UB_lat_pointer = nullptr

Pointer to the skyrme potential on the lattice.

Definition at line 15 of file potential_globals.cc.

◆ UI3_lat_pointer

RectangularLattice< double > * smash::UI3_lat_pointer = nullptr

Pointer to the symmmetry potential on the lattice.

Definition at line 16 of file potential_globals.cc.

◆ pot_pointer

Potentials * smash::pot_pointer = nullptr

Pointer to a Potential class.

Definition at line 17 of file potential_globals.cc.

◆ all_decay_types

std::vector<DecayTypePtr>* smash::all_decay_types = nullptr

Global pointer to the decay types list.

Definition at line 27 of file decaymodes.cc.

◆ num_tab_pts

constexpr int smash::num_tab_pts = 200

Definition at line 146 of file decaytype.cc.

◆ integrate [1/2]

Integrator smash::integrate
static

Definition at line 147 of file decaytype.cc.

◆ integrate2d [1/2]

Integrator2dCuhre smash::integrate2d(1E7)
static

◆ iso_type_list

IsoParticleTypeList smash::iso_type_list
static

Definition at line 16 of file isoparticletype.cc.

◆ integrate [2/2]

Integrator smash::integrate
static

Definition at line 154 of file isoparticletype.cc.

◆ integrate2d [2/2]

Integrator2dCuhre smash::integrate2d
static

Definition at line 195 of file isoparticletype.cc.

◆ global_default_loglevel

einhard::LogLevel smash::global_default_loglevel = einhard::ALL
static

The default logging level is ALL.

Definition at line 20 of file logging.cc.

◆ global_logger_collection

std::array<einhard::Logger<>, std::tuple_size<LogArea::AreaTuple>::value> smash::global_logger_collection
static

An array that stores all pre-configured Logger objects.

The objects can be accessed via the logger function.

Definition at line 33 of file logging.cc.