37 isotropic_(config.take({
"Collision_Term",
"Isotropic"},
false)),
38 box_length_(parameters.box_length),
39 string_formation_time_(config.take(
40 {
"Collision_Term",
"String_Parameters",
"Formation_Time"}, 1.)) {
41 if (is_constant_elastic_isotropic()) {
43 "Constant elastic isotropic cross-section mode:",
" using ",
44 finder_parameters_.elastic_parameter,
" mb as maximal cross-section.");
46 if (finder_parameters_.included_multi.any() &&
48 throw std::invalid_argument(
49 "Multi-body reactions (like e.g. 3->1 or 3->2) are only possible with "
52 "criterion. Change your config accordingly.");
55 if (finder_parameters_
62 throw std::invalid_argument(
63 "To prevent double counting it is not possible to enable deuteron 3->2 "
64 "reactions\nand reactions involving the d' at the same time\ni.e. to "
65 "include \"Deuteron_3to2\" in `Multi_Particle_Reactions` and\n "
66 "\"PiDeuteron_to_pidprime\" "
67 "or \"NDeuteron_to_Ndprime\" in `Included_2to2` at the same time.\n"
68 "Change your config accordingly.");
71 if (finder_parameters_
75 throw std::invalid_argument(
76 "Do not use the d' resonance and enable \"Deuteron_3to2\" "
77 "`Multi_Particle_Reactions` at the same time. Either use the direct "
78 "3-to-2 reactions or the d' together with \"PiDeuteron_to_pidprime\" "
79 "and \"NDeuteron_to_Ndprime\" in `Included_2to2`. Otherwise the "
80 "deuteron 3-to-2 reactions would be double counted.");
91 throw std::invalid_argument(
92 "In order to conserve detailed balance, when \"NNbar_5to2\" is "
93 "included in\n`Multi_Particle_Reactions`, the `NNbarTreatment` has to "
94 "be set to \"two to five\" and vice versa.");
99 throw std::invalid_argument(
100 "'NNbar' has to be in the list of allowed 2 to 2 processes "
101 "to enable annihilation to go through resonances");
104 if (finder_parameters_.strings_switch) {
105 auto subconfig = config.extract_sub_configuration(
107 string_process_interface_ = std::make_unique<StringProcess>(
108 subconfig.take({
"String_Tension"}, 1.0), string_formation_time_,
109 subconfig.take({
"Gluon_Beta"}, 0.5),
110 subconfig.take({
"Gluon_Pmin"}, 0.001),
111 subconfig.take({
"Quark_Alpha"}, 2.0),
112 subconfig.take({
"Quark_Beta"}, 7.0),
113 subconfig.take({
"Strange_Supp"}, 0.16),
114 subconfig.take({
"Diquark_Supp"}, 0.036),
115 subconfig.take({
"Sigma_Perp"}, 0.42),
116 subconfig.take({
"StringZ_A_Leading"}, 0.2),
117 subconfig.take({
"StringZ_B_Leading"}, 2.0),
118 subconfig.take({
"StringZ_A"}, 2.0), subconfig.take({
"StringZ_B"}, 0.55),
119 subconfig.take({
"String_Sigma_T"}, 0.5),
120 subconfig.take({
"Form_Time_Factor"}, 1.0),
121 subconfig.take({
"Mass_Dependent_Formation_Times"},
false),
122 subconfig.take({
"Prob_proton_to_d_uu"}, 1. / 3.),
123 subconfig.take({
"Separate_Fragment_Baryon"},
true),
124 subconfig.take({
"Popcorn_Rate"}, 0.15),
125 subconfig.take({
"Use_Monash_Tune"},
126 parameters.use_monash_tune_default.value()));
132 std::pair<double, double> sqrts_range_Npi =
133 config.
take({
"Collision_Term",
"String_Transition",
"Sqrts_Range_Npi"},
135 std::pair<double, double> sqrts_range_NN =
136 config.
take({
"Collision_Term",
"String_Transition",
"Sqrts_Range_NN"},
140 if (sqrts_range_Npi.second < sqrts_range_Npi.first)
141 sqrts_range_Npi.second = sqrts_range_Npi.first;
143 "Lower bound of Sqrts_Range_Npi too small, setting it to mass "
144 "threshold. New range is [",
145 sqrts_range_Npi.first,
',', sqrts_range_Npi.second,
"] GeV");
149 if (sqrts_range_NN.second < sqrts_range_NN.first)
150 sqrts_range_NN.second = sqrts_range_NN.first;
152 "Lower bound of Sqrts_Range_NN too small, setting it to mass "
153 "threshold. New range is [",
154 sqrts_range_NN.first,
',', sqrts_range_NN.second,
"] GeV.");
157 config.
take({
"Collision_Term",
"Total_Cross_Section_Strategy"},
161 "Evaluating total cross sections from partial processes.");
164 throw std::invalid_argument(
165 "The BottomUp strategy for total cross section evaluation is needed to "
166 "have only elastic interactions, please change the configuration "
170 "Evaluating total cross sections from parametrizations.");
173 "Evaluating total cross sections from parametrizations only for "
174 "measured processes.");
177 config.
take({
"Collision_Term",
"Elastic_Cross_Section"}, -1.),
180 config.
take({
"Collision_Term",
"Additional_Elastic_Cross_Section"}, 0.0),
188 config.
take({
"Modi",
"Collider",
"Collisions_Within_Nucleus"},
false),
190 config.
take({
"Collision_Term",
"Use_AQM"},
true),
191 config.
take({
"Collision_Term",
"Strings_with_Probability"},
true),
192 config.
take({
"Collision_Term",
"Only_Warn_For_High_Probability"},
false),
194 sqrts_range_Npi, sqrts_range_NN,
195 config.
take({
"Collision_Term",
"String_Transition",
"Sqrts_Lower"},
198 {
"Collision_Term",
"String_Transition",
"Sqrts_Range_Width"},
201 {
"Collision_Term",
"String_Transition",
"PiPi_Offset"},
204 {
"Collision_Term",
"String_Transition",
"KN_Offset"},
207 config.
take({
"Collision_Term",
"Pseudoresonance"},
213 const std::vector<FourVector>& beam_momentum,
214 const double gcell_vol)
const {
220 assert(data_a.
id() >= 0);
221 assert(data_b.
id() >= 0);
226 bool never_interacted_before =
229 if (in_same_nucleus && never_interacted_before) {
241 const double time_until_collision =
245 if (time_until_collision < 0. || time_until_collision >= dt) {
260 ScatterActionPtr act = std::make_unique<ScatterAction>(
265 act->set_stochastic_pos_idx();
273 const double distance_squared =
275 ? act->transverse_distance_sqr()
277 ? act->cov_transverse_distance_sqr()
288 if (incoming_parametrized) {
295 double xs = act->cross_section() *
fm2_mb /
303 const double v_rel = act->relative_velocity();
306 const double prob = xs * v_rel * dt / gcell_vol;
309 "Stochastic collison criterion parameters (2-particles):\nprob = ",
310 prob,
", xs = ", xs,
", v_rel = ", v_rel,
", dt = ", dt,
311 ", gcell_vol = ", gcell_vol,
315 std::stringstream err;
316 err <<
"Probability larger than 1 for stochastic rates. ( P_22 = " << prob
320 <<
" at sqrts[GeV] = " << act->sqrt_s()
321 <<
" with xs[fm^2]/Ntest = " << xs
322 <<
"\nConsider using smaller timesteps.";
326 throw std::runtime_error(err.str());
332 if (random_no > prob) {
349 const double cross_section_criterion = xs * M_1_PI;
352 if (distance_squared >= cross_section_criterion) {
357 "\n ", data_a,
"\n<-> ", data_b);
361 if (incoming_parametrized) {
369 const ParticleList& plist,
double dt,
const double gcell_vol)
const {
377 bool all_projectile =
379 return data.belongs_to() == BelongsTo::Projectile;
383 return data.belongs_to() == BelongsTo::Target;
387 return data.get_history().collisions_per_particle == 0;
389 if ((all_projectile || all_target) && none_collided) {
405 ScatterActionMultiPtr act =
406 std::make_unique<ScatterActionMulti>(plist, time_until_collision);
408 act->set_stochastic_pos_idx();
417 act->get_total_weight() /
422 std::stringstream err;
423 err <<
"Probability " << prob <<
" larger than 1 for stochastic rates for ";
425 err << data.type().name();
427 err <<
" at sqrts[GeV] = " << act->sqrt_s()
428 <<
"\nConsider using smaller timesteps.";
432 throw std::runtime_error(err.str());
438 if (random_no > prob) {
446 const ParticleList& search_list,
double dt,
const double gcell_vol,
447 const std::vector<FourVector>& beam_momentum)
const {
448 std::vector<ActionPtr> actions;
452 if (p1.id() < p2.id()) {
456 actions.push_back(std::move(act));
466 if (p1.id() < p2.id() && p2.id() < p3.id()) {
470 actions.push_back(std::move(act));
477 if (p1.id() < p2.id() && p2.id() < p3.id() && p3.id() < p4.id()) {
481 actions.push_back(std::move(act));
487 search_list.size() >= 5) {
489 if ((p1.id() < p2.id() && p2.id() < p3.id() &&
490 p3.id() < p4.id() && p4.id() < p5.id()) &&
491 (p1.is_pion() && p2.is_pion() && p3.is_pion() &&
492 p4.is_pion() && p5.is_pion())) {
495 {p1, p2, p3, p4, p5}, dt, gcell_vol);
497 actions.push_back(std::move(act));
511 const ParticleList& search_list,
const ParticleList& neighbors_list,
512 double dt,
const std::vector<FourVector>& beam_momentum)
const {
513 std::vector<ActionPtr> actions;
520 assert(p1.id() != p2.id());
524 actions.push_back(std::move(act));
532 const ParticleList& search_list,
const Particles& surrounding_list,
533 double dt,
const std::vector<FourVector>& beam_momentum)
const {
534 std::vector<ActionPtr> actions;
542 auto result = std::find_if(
543 search_list.begin(), search_list.end(),
545 if (result != search_list.end()) {
552 actions.push_back(std::move(act));
560 constexpr
double time = 0.0;
563 const size_t N_pairs = N_isotypes * (N_isotypes - 1) / 2;
565 std::cout << N_isotypes <<
" iso-particle types." << std::endl;
566 std::cout <<
"They can make " << N_pairs <<
" pairs." << std::endl;
567 std::vector<double> momentum_scan_list = {0.1, 0.3, 0.5, 1.0,
568 2.0, 3.0, 5.0, 10.0};
571 if (&A_isotype > &B_isotype) {
574 bool any_nonzero_cs =
false;
575 std::vector<std::string> r_list;
578 if (A_type > B_type) {
582 for (
auto mom : momentum_scan_list) {
583 A.set_4momentum(A.pole_mass(), mom, 0.0, 0.0);
585 ScatterActionPtr act = std::make_unique<ScatterAction>(
591 const double total_cs = act->cross_section();
592 if (total_cs <= 0.0) {
595 any_nonzero_cs =
true;
596 for (
const auto& channel : act->collision_channels()) {
597 const auto type = channel->get_type();
601 r = A_type->name() + B_type->name() + std::string(
" → strings");
606 ? std::string(
" (inel)")
607 : std::string(
" (?)");
608 r = A_type->name() + B_type->name() + std::string(
" → ") +
609 channel->particle_types()[0]->name() +
610 channel->particle_types()[1]->name() + r_type;
618 std::sort(r_list.begin(), r_list.end());
619 r_list.erase(std::unique(r_list.begin(), r_list.end()), r_list.end());
620 if (any_nonzero_cs) {
621 for (
auto r : r_list) {
623 if (r_list.back() != r) {
627 std::cout << std::endl;
657 namespace decaytree {
705 Node(
const std::string& name,
double weight,
706 ParticleTypePtrList&& initial_particles,
707 ParticleTypePtrList&& final_particles, ParticleTypePtrList&& state,
708 std::vector<Node>&& children)
728 ParticleTypePtrList&& initial_particles,
729 ParticleTypePtrList&& final_particles) {
731 ParticleTypePtrList state(
state_);
732 for (
const auto&
p : initial_particles) {
733 state.erase(std::find(state.begin(), state.end(),
p));
735 for (
const auto&
p : final_particles) {
739 std::sort(state.begin(), state.end(),
741 return a->name() < b->name();
744 Node new_node(name, weight, std::move(initial_particles),
745 std::move(final_particles), std::move(state), {});
746 children_.emplace_back(std::move(new_node));
757 std::vector<FinalStateCrossSection> result;
770 for (uint64_t i = 0; i < depth; i++) {
775 child.print_helper(depth + 1);
791 uint64_t depth, std::vector<FinalStateCrossSection>& result,
792 const std::string& name,
double weight,
793 bool show_intermediate_states =
false)
const {
801 std::string new_name;
804 if (show_intermediate_states) {
806 if (!new_name.empty()) {
814 for (
const auto& s :
state_) {
815 new_name += s->name();
818 if (show_intermediate_states) {
827 child.final_state_cross_sections_helper(depth + 1, result, new_name,
828 weight, show_intermediate_states);
842 const DecayBranchPtr& decay,
843 ParticleTypePtrList& final_state) {
844 std::stringstream name;
845 name <<
"[" << res_name <<
"->";
846 for (
const auto&
p : decay->particle_types()) {
848 final_state.push_back(
p);
872 uint32_t n_unstable = 0;
873 double sqrts_minus_masses = sqrts;
878 sqrts_minus_masses -= ptype->
mass();
881 n_unstable != 0 ? 1. /
static_cast<double>(n_unstable) : 1.;
885 const double sqrts_decay = sqrts_minus_masses + ptype->
mass();
886 bool can_decay =
false;
891 double final_state_mass = 0.;
892 for (
const auto&
p : decay->particle_types()) {
893 final_state_mass +=
p->mass();
895 if (final_state_mass > sqrts_decay) {
900 ParticleTypePtrList parts;
902 auto& new_node = node.
add_action(name, norm * decay->weight(), {ptype},
923 static void deduplicate(std::vector<FinalStateCrossSection>& final_state_xs) {
924 std::sort(final_state_xs.begin(), final_state_xs.end(),
927 auto current = final_state_xs.begin();
928 while (current != final_state_xs.end()) {
929 auto adjacent = std::adjacent_find(
930 current, final_state_xs.end(),
932 return a.name_ == b.name_;
935 if (adjacent != final_state_xs.end()) {
936 adjacent->cross_section_ += (adjacent + 1)->cross_section_;
937 final_state_xs.erase(adjacent + 1);
944 bool final_state, std::vector<double>& plab)
const {
945 typedef std::vector<std::pair<double, double>> xs_saver;
946 std::map<std::string, xs_saver> xs_dump;
947 std::map<std::string, double> outgoing_total_mass;
950 int n_momentum_points = 200;
951 constexpr
double momentum_step = 0.02;
952 if (plab.size() > 0) {
953 n_momentum_points = plab.size();
955 std::sort(plab.begin(), plab.end());
956 plab.erase(std::unique(plab.begin(), plab.end()), plab.end());
958 for (
int i = 0; i < n_momentum_points; i++) {
960 if (plab.size() > 0) {
963 momentum = momentum_step * (i + 1);
965 a_data.set_4momentum(m_a, momentum, 0.0, 0.0);
967 const double sqrts = (a_data.momentum() + b_data.
momentum()).abs();
968 const ParticleList incoming = {a_data, b_data};
969 ScatterActionPtr act = std::make_unique<ScatterAction>(
976 {&a, &b}, {&a, &b}, {});
977 const CollisionBranchList& processes = act->collision_channels();
978 for (
const auto& process : processes) {
979 const double xs = process->weight();
984 std::stringstream process_description_stream;
985 process_description_stream << *process;
986 const std::string& description = process_description_stream.str();
988 for (
const auto& ptype : process->particle_types()) {
989 m_tot += ptype->mass();
991 outgoing_total_mass[description] = m_tot;
992 if (!xs_dump[description].empty() &&
993 std::abs(xs_dump[description].back().first - sqrts) <
995 xs_dump[description].back().second += xs;
997 xs_dump[description].push_back(std::make_pair(sqrts, xs));
1000 std::stringstream process_description_stream;
1001 process_description_stream << *process;
1002 const std::string& description = process_description_stream.str();
1003 ParticleTypePtrList initial_particles = {&a, &b};
1004 ParticleTypePtrList final_particles = process->particle_types();
1005 auto& process_node =
1006 tree.
add_action(description, xs, std::move(initial_particles),
1007 std::move(final_particles));
1011 xs_dump[
"total"].push_back(std::make_pair(sqrts, act->cross_section()));
1013 outgoing_total_mass[
"total"] = -1.0;
1018 for (
const auto&
p : final_state_xs) {
1023 if (
p.name_ ==
"") {
1026 outgoing_total_mass[
p.name_] =
p.mass_;
1027 xs_dump[
p.name_].push_back(std::make_pair(sqrts,
p.cross_section_));
1034 for (
auto it = begin(xs_dump); it != end(xs_dump);) {
1036 const xs_saver& xs = (*it).second;
1038 for (
const auto&
p : xs) {
1042 it = xs_dump.erase(it);
1049 std::vector<std::string> all_channels;
1050 for (
const auto& channel : xs_dump) {
1051 all_channels.push_back(channel.first);
1053 std::sort(all_channels.begin(), all_channels.end(),
1054 [&](
const std::string& str_a,
const std::string& str_b) {
1055 return outgoing_total_mass[str_a] < outgoing_total_mass[str_b];
1059 std::cout <<
"# Dumping partial " << a.
name() << b.
name()
1060 <<
" cross-sections in mb, energies in GeV" << std::endl;
1061 std::cout <<
" sqrt_s";
1065 for (
const auto& channel : all_channels) {
1068 std::cout << std::endl;
1071 for (
int i = 0; i < n_momentum_points; i++) {
1073 if (plab.size() > 0) {
1076 momentum = momentum_step * (i + 1);
1078 a_data.set_4momentum(m_a, momentum, 0.0, 0.0);
1080 const double sqrts = (a_data.momentum() + b_data.
momentum()).abs();
1081 std::printf(
"%9.6f", sqrts);
1082 for (
const auto& channel : all_channels) {
1083 const xs_saver energy_and_xs = xs_dump[channel];
1085 for (; j < energy_and_xs.size() && energy_and_xs[j].first < sqrts; j++) {
1088 if (j < energy_and_xs.size() &&
1089 std::abs(energy_and_xs[j].first - sqrts) <
really_small) {
1090 xs = energy_and_xs[j].second;
1092 std::printf(
"%16.6f", xs);
Interface to the SMASH configuration files.
Value take(std::initializer_list< const char * > keys)
The default interface for SMASH to read configuration values.
const DecayBranchList & decay_mode_list() const
double abs() const
calculate the lorentz invariant absolute value
IsoParticleType is a class to represent isospin multiplets.
static const IsoParticleTypeList & list_all()
Returns a list of all IsoParticleTypes.
default_type default_value() const
Get the default value of the key.
ParticleData contains the dynamic information of a certain particle.
void set_4momentum(const FourVector &momentum_vector)
Set the particle's 4-momentum directly.
const ParticleType & type() const
Get the type of the particle.
double xsec_scaling_factor(double delta_time=0.) const
Return the cross section scaling factor at a given time.
uint32_t id_process() const
Get the id of the last action.
const FourVector & momentum() const
Get the particle's 4-momentum.
BelongsTo belongs_to() const
Getter for belongs_to label.
int32_t id() const
Get the id of the particle.
HistoryData get_history() const
Get history information.
double pole_mass() const
Get the particle's pole mass ("on-shell").
const FourVector & position() const
Get the particle's position in Minkowski space.
A pointer-like interface to global references to ParticleType objects.
Particle type contains the static properties of a particle species.
const DecayModes & decay_modes() const
static const ParticleTypePtr try_find(PdgCode pdgcode)
Returns the ParticleTypePtr for the given pdgcode.
const std::string & name() const
The Particles class abstracts the storage and manipulation of particles.
PdgCode stores a Particle Data Group Particle Numbering Scheme particle type number.
ScatterActionsFinder(Configuration &config, const ExperimentParameters ¶meters)
Constructor of the finder with the given parameters.
ScatterActionsFinderParameters finder_parameters_
Struct collecting several parameters.
ActionList find_actions_in_cell(const ParticleList &search_list, double dt, const double gcell_vol, const std::vector< FourVector > &beam_momentum) const override
Search for all the possible collisions within one cell.
void dump_cross_sections(const ParticleType &a, const ParticleType &b, double m_a, double m_b, bool final_state, std::vector< double > &plab) const
Print out partial cross-sections of all processes that can occur in the collision of a(mass = m_a) an...
const bool isotropic_
Do all collisions isotropically.
double max_transverse_distance_sqr(int testparticles) const
The maximal distance over which particles can interact in case of the geometric criterion,...
ActionPtr check_collision_two_part(const ParticleData &data_a, const ParticleData &data_b, double dt, const std::vector< FourVector > &beam_momentum={}, const double gcell_vol=0.0) const
Check for a single pair of particles (id_a, id_b) if a collision will happen in the next timestep and...
const double string_formation_time_
Parameter for formation time.
std::unique_ptr< StringProcess > string_process_interface_
Class that deals with strings, interfacing Pythia.
void dump_reactions() const
Prints out all the 2-> n (n > 1) reactions with non-zero cross-sections between all possible pairs of...
ActionPtr check_collision_multi_part(const ParticleList &plist, double dt, const double gcell_vol) const
Check for multiple i.e.
const double box_length_
Box length: needed to determine coordinates of collision correctly in case of collision through the w...
ActionList find_actions_with_surrounding_particles(const ParticleList &search_list, const Particles &surrounding_list, double dt, const std::vector< FourVector > &beam_momentum) const override
Search for all the possible secondary collisions between the outgoing particles and the rest.
ActionList find_actions_with_neighbors(const ParticleList &search_list, const ParticleList &neighbors_list, double dt, const std::vector< FourVector > &beam_momentum) const override
Search for all the possible collisions among the neighboring cells.
double collision_time(const ParticleData &p1, const ParticleData &p2, double dt, const std::vector< FourVector > &beam_momentum) const
Determine the collision time of the two particles.
Collection of useful constants that are known at compile time.
@ TwoToFive
Directly create 5 pions, use with multi-particle reactions.
@ Resonances
Use intermediate Resonances.
@ TopDownMeasured
Mix the two above, using the parametrizations only for measured processes, and summing up partials fo...
@ TopDown
Use parametrizations based on existing data, rescaling with AQM for unmeasured processes.
@ BottomUp
Sum the existing partial contributions.
@ Stochastic
Stochastic Criteiron.
@ Geometric
Geometric criterion.
@ Covariant
Covariant Criterion.
std::array< einhard::Logger<>, std::tuple_size< LogArea::AreaTuple >::value > logg
An array that stores all pre-configured Logger objects.
static std::string make_decay_name(const std::string &res_name, const DecayBranchPtr &decay, ParticleTypePtrList &final_state)
Generate name for decay and update final state.
static void add_decays(Node &node, double sqrts)
Add nodes for all decays possible from the given node and all of its children.
constexpr int64_t dprime
Deuteron-prime resonance.
std::string fill_left(const std::string &s, size_t width, char fill=' ')
Fill string with characters to the left until the given width is reached.
bool parametrization_exists(const PdgCode &pdg_a, const PdgCode &pdg_b)
Checks if supplied codes have existing parametrizations of total cross sections.
ScatterActionsFinderParameters create_finder_parameters(Configuration &config, const ExperimentParameters ¶meters)
Gather all relevant parameters for a ScatterActionsFinder either getting them from an ExperimentParam...
static void deduplicate(std::vector< FinalStateCrossSection > &final_state_xs)
Deduplicate the final-state cross sections by summing.
@ TwoToTwo
See here for a short description.
@ Elastic
See here for a short description.
@ StringHard
See here for a short description.
bool all_of(Container &&c, UnaryPredicate &&p)
Convenience wrapper for std::all_of that operates on a complete container.
constexpr double nucleon_mass
Nucleon mass in GeV.
constexpr double pion_mass
Pion mass in GeV.
T pCM_from_s(const T s, const T mass_a, const T mass_b) noexcept
constexpr double really_small
Numerical error tolerance.
void isoclean(std::string &s)
Remove ⁺, ⁻, ⁰ from string.
static constexpr int LFindScatter
bool is_string_soft_process(ProcessType p)
Check if a given process type is a soft string excitation.
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 pl...
constexpr double fm2_mb
mb <-> fm^2 conversion factor.
Helper structure for Experiment.
const CollisionCriterion coll_crit
Employed collision criterion.
NNbarTreatment nnbar_treatment
This indicates how NN̅ annihilation should be treated; options are to neglect it, make it conserve de...
double maximum_cross_section
The maximal cross section (in mb) for which it is guaranteed that all collisions with this cross sect...
bool strings_switch
This indicates whether string fragmentation is switched on.
const ReactionsBitSet included_2to2
This indicates which two to two reactions are switched off.
double scale_xs
Global factor which all cross sections are scaled with.
bool two_to_one
This indicates whether string fragmentation is switched on.
int testparticles
Number of test-particles.
double low_snn_cut
Elastic collisions between the nucleons with the square root s below low_snn_cut are excluded.
const MultiParticleReactionsBitSet included_multi
This indicates which multi-particle reactions are switched on.
Represent a final-state cross section.
FinalStateCrossSection(const std::string &name, double cross_section, double mass)
Construct a final-state cross section.
std::string name_
Name of the final state.
double cross_section_
Corresponding cross section in mb.
double mass_
Total mass of final state particles.
int32_t collisions_per_particle
Collision counter per particle, zero only for initially present particles.
Helper structure for ScatterActionsFinder.
const bool only_warn_for_high_prob
Switch to turn off throwing an exception for collision probabilities larger than 1.
const int testparticles
Number of test particles.
const bool strings_switch
Indicates whether string fragmentation is switched on.
const TotalCrossSectionStrategy total_xs_strategy
Method used to evaluate total cross sections for collision finding.
const MultiParticleReactionsBitSet included_multi
List of included multi-particle reactions.
const bool allow_collisions_within_nucleus
If particles within the same nucleus are allowed to collide for their first time.
const CollisionCriterion coll_crit
Specifies which collision criterion is used.
Constants related to transition between low and high collision energies.
Node of a decay tree, representing a possible action (2-to-2 or 1-to-2).
std::vector< Node > children_
Possible actions after this action.
void final_state_cross_sections_helper(uint64_t depth, std::vector< FinalStateCrossSection > &result, const std::string &name, double weight, bool show_intermediate_states=false) const
Internal helper function for final_state_cross_sections, to be called recursively to calculate all fi...
ParticleTypePtrList final_particles_
Final-state particle types in this action.
std::vector< FinalStateCrossSection > final_state_cross_sections() const
Node & add_action(const std::string &name, double weight, ParticleTypePtrList &&initial_particles, ParticleTypePtrList &&final_particles)
Add an action to the children of this node.
ParticleTypePtrList initial_particles_
Initial-state particle types in this action.
void print() const
Print the decay tree starting with this node.
void print_helper(uint64_t depth) const
Internal helper function for print, to be called recursively to print all nodes.
double weight_
Weight (cross section or branching ratio).
Node(const Node &)=delete
Cannot be copied.
Node(const std::string &name, double weight, ParticleTypePtrList &&initial_particles, ParticleTypePtrList &&final_particles, ParticleTypePtrList &&state, std::vector< Node > &&children)
Node(Node &&)=default
Move constructor.
ParticleTypePtrList state_
Particle types corresponding to the global state after this action.
std::string name_
Name for printing.