36 isotropic_(config.take({
"Collision_Term",
"Isotropic"},
false)),
37 box_length_(parameters.box_length),
38 string_formation_time_(config.take(
39 {
"Collision_Term",
"String_Parameters",
"Formation_Time"}, 1.)) {
40 if (is_constant_elastic_isotropic()) {
42 "Constant elastic isotropic cross-section mode:",
" using ",
43 finder_parameters_.elastic_parameter,
" mb as maximal cross-section.");
45 if (finder_parameters_.included_multi.any() &&
47 throw std::invalid_argument(
48 "Multi-body reactions (like e.g. 3->1 or 3->2) are only possible with "
51 "criterion. Change your config accordingly.");
54 if (finder_parameters_
61 throw std::invalid_argument(
62 "To prevent double counting it is not possible to enable deuteron 3->2 "
63 "reactions\nand reactions involving the d' at the same time\ni.e. to "
64 "include \"Deuteron_3to2\" in `Multi_Particle_Reactions` and\n "
65 "\"PiDeuteron_to_pidprime\" "
66 "or \"NDeuteron_to_Ndprime\" in `Included_2to2` at the same time.\n"
67 "Change your config accordingly.");
70 if (finder_parameters_
74 throw std::invalid_argument(
75 "Do not use the d' resonance and enable \"Deuteron_3to2\" "
76 "`Multi_Particle_Reactions` at the same time. Either use the direct "
77 "3-to-2 reactions or the d' together with \"PiDeuteron_to_pidprime\" "
78 "and \"NDeuteron_to_Ndprime\" in `Included_2to2`. Otherwise the "
79 "deuteron 3-to-2 reactions would be double counted.");
90 throw std::invalid_argument(
91 "In order to conserve detailed balance, when \"NNbar_5to2\" is "
92 "included in\n`Multi_Particle_Reactions`, the `NNbarTreatment` has to "
93 "be set to \"two to five\" and vice versa.");
98 throw std::invalid_argument(
99 "'NNbar' has to be in the list of allowed 2 to 2 processes "
100 "to enable annihilation to go through resonances");
103 if (finder_parameters_.strings_switch) {
104 auto subconfig = config.extract_sub_configuration(
106 string_process_interface_ = std::make_unique<StringProcess>(
107 subconfig.take({
"String_Tension"}, 1.0), string_formation_time_,
108 subconfig.take({
"Gluon_Beta"}, 0.5),
109 subconfig.take({
"Gluon_Pmin"}, 0.001),
110 subconfig.take({
"Quark_Alpha"}, 2.0),
111 subconfig.take({
"Quark_Beta"}, 7.0),
112 subconfig.take({
"Strange_Supp"}, 0.16),
113 subconfig.take({
"Diquark_Supp"}, 0.036),
114 subconfig.take({
"Sigma_Perp"}, 0.42),
115 subconfig.take({
"StringZ_A_Leading"}, 0.2),
116 subconfig.take({
"StringZ_B_Leading"}, 2.0),
117 subconfig.take({
"StringZ_A"}, 2.0), subconfig.take({
"StringZ_B"}, 0.55),
118 subconfig.take({
"String_Sigma_T"}, 0.5),
119 subconfig.take({
"Form_Time_Factor"}, 1.0),
120 subconfig.take({
"Mass_Dependent_Formation_Times"},
false),
121 subconfig.take({
"Prob_proton_to_d_uu"}, 1. / 3.),
122 subconfig.take({
"Separate_Fragment_Baryon"},
true),
123 subconfig.take({
"Popcorn_Rate"}, 0.15),
124 subconfig.take({
"Use_Monash_Tune"},
125 parameters.use_monash_tune_default.value()));
131 std::pair<double, double> sqrts_range_Npi =
132 config.
take({
"Collision_Term",
"String_Transition",
"Sqrts_Range_Npi"},
134 std::pair<double, double> sqrts_range_NN =
135 config.
take({
"Collision_Term",
"String_Transition",
"Sqrts_Range_NN"},
139 if (sqrts_range_Npi.second < sqrts_range_Npi.first)
140 sqrts_range_Npi.second = sqrts_range_Npi.first;
142 "Lower bound of Sqrts_Range_Npi too small, setting it to mass "
143 "threshold. New range is [",
144 sqrts_range_Npi.first,
',', sqrts_range_Npi.second,
"] GeV");
148 if (sqrts_range_NN.second < sqrts_range_NN.first)
149 sqrts_range_NN.second = sqrts_range_NN.first;
151 "Lower bound of Sqrts_Range_NN too small, setting it to mass "
152 "threshold. New range is [",
153 sqrts_range_NN.first,
',', sqrts_range_NN.second,
"] GeV.");
156 config.
take({
"Collision_Term",
"Elastic_Cross_Section"}, -1.),
159 config.
take({
"Collision_Term",
"Additional_Elastic_Cross_Section"}, 0.0),
167 config.
take({
"Modi",
"Collider",
"Collisions_Within_Nucleus"},
false),
169 config.
take({
"Collision_Term",
"Use_AQM"},
true),
170 config.
take({
"Collision_Term",
"Strings_with_Probability"},
true),
171 config.
take({
"Collision_Term",
"Only_Warn_For_High_Probability"},
false),
173 sqrts_range_Npi, sqrts_range_NN,
174 config.
take({
"Collision_Term",
"String_Transition",
"Sqrts_Lower"},
177 {
"Collision_Term",
"String_Transition",
"Sqrts_Range_Width"},
180 {
"Collision_Term",
"String_Transition",
"PiPi_Offset"},
183 {
"Collision_Term",
"String_Transition",
"KN_Offset"},
189 const std::vector<FourVector>& beam_momentum,
190 const double gcell_vol)
const {
196 assert(data_a.
id() >= 0);
197 assert(data_b.
id() >= 0);
202 bool never_interacted_before =
205 if (in_same_nucleus && never_interacted_before) {
217 const double time_until_collision =
221 if (time_until_collision < 0. || time_until_collision >= dt) {
226 ScatterActionPtr act = std::make_unique<ScatterAction>(
231 act->set_stochastic_pos_idx();
239 const double distance_squared =
241 ? act->transverse_distance_sqr()
243 ? act->cov_transverse_distance_sqr()
256 double xs = act->cross_section() *
fm2_mb /
264 const double v_rel = act->relative_velocity();
267 const double prob = xs * v_rel * dt / gcell_vol;
270 "Stochastic collison criterion parameters (2-particles):\nprob = ",
271 prob,
", xs = ", xs,
", v_rel = ", v_rel,
", dt = ", dt,
272 ", gcell_vol = ", gcell_vol,
276 std::stringstream err;
277 err <<
"Probability larger than 1 for stochastic rates. ( P_22 = " << prob
281 <<
" at sqrts[GeV] = " << act->sqrt_s()
282 <<
" with xs[fm^2]/Ntest = " << xs
283 <<
"\nConsider using smaller timesteps.";
287 throw std::runtime_error(err.str());
293 if (random_no > prob) {
310 const double cross_section_criterion = xs * M_1_PI;
313 if (distance_squared >= cross_section_criterion) {
318 "\n ", data_a,
"\n<-> ", data_b);
325 const ParticleList& plist,
double dt,
const double gcell_vol)
const {
333 bool all_projectile =
335 return data.belongs_to() == BelongsTo::Projectile;
339 return data.belongs_to() == BelongsTo::Target;
343 return data.get_history().collisions_per_particle == 0;
345 if ((all_projectile || all_target) && none_collided) {
361 ScatterActionMultiPtr act =
362 std::make_unique<ScatterActionMulti>(plist, time_until_collision);
364 act->set_stochastic_pos_idx();
373 act->get_total_weight() /
378 std::stringstream err;
379 err <<
"Probability " << prob <<
" larger than 1 for stochastic rates for ";
381 err << data.type().name();
383 err <<
" at sqrts[GeV] = " << act->sqrt_s()
384 <<
"\nConsider using smaller timesteps.";
388 throw std::runtime_error(err.str());
394 if (random_no > prob) {
402 const ParticleList& search_list,
double dt,
const double gcell_vol,
403 const std::vector<FourVector>& beam_momentum)
const {
404 std::vector<ActionPtr> actions;
408 if (p1.id() < p2.id()) {
412 actions.push_back(std::move(act));
422 if (p1.id() < p2.id() && p2.id() < p3.id()) {
426 actions.push_back(std::move(act));
433 if (p1.id() < p2.id() && p2.id() < p3.id() && p3.id() < p4.id()) {
437 actions.push_back(std::move(act));
443 search_list.size() >= 5) {
445 if ((p1.id() < p2.id() && p2.id() < p3.id() &&
446 p3.id() < p4.id() && p4.id() < p5.id()) &&
447 (p1.is_pion() && p2.is_pion() && p3.is_pion() &&
448 p4.is_pion() && p5.is_pion())) {
451 {p1, p2, p3, p4, p5}, dt, gcell_vol);
453 actions.push_back(std::move(act));
467 const ParticleList& search_list,
const ParticleList& neighbors_list,
468 double dt,
const std::vector<FourVector>& beam_momentum)
const {
469 std::vector<ActionPtr> actions;
476 assert(p1.id() != p2.id());
480 actions.push_back(std::move(act));
488 const ParticleList& search_list,
const Particles& surrounding_list,
489 double dt,
const std::vector<FourVector>& beam_momentum)
const {
490 std::vector<ActionPtr> actions;
498 auto result = std::find_if(
499 search_list.begin(), search_list.end(),
501 if (result != search_list.end()) {
508 actions.push_back(std::move(act));
516 constexpr
double time = 0.0;
519 const size_t N_pairs = N_isotypes * (N_isotypes - 1) / 2;
521 std::cout << N_isotypes <<
" iso-particle types." << std::endl;
522 std::cout <<
"They can make " << N_pairs <<
" pairs." << std::endl;
523 std::vector<double> momentum_scan_list = {0.1, 0.3, 0.5, 1.0,
524 2.0, 3.0, 5.0, 10.0};
527 if (&A_isotype > &B_isotype) {
530 bool any_nonzero_cs =
false;
531 std::vector<std::string> r_list;
534 if (A_type > B_type) {
538 for (
auto mom : momentum_scan_list) {
539 A.set_4momentum(A.pole_mass(), mom, 0.0, 0.0);
541 ScatterActionPtr act = std::make_unique<ScatterAction>(
547 const double total_cs = act->cross_section();
548 if (total_cs <= 0.0) {
551 any_nonzero_cs =
true;
552 for (
const auto& channel : act->collision_channels()) {
553 const auto type = channel->get_type();
557 r = A_type->name() + B_type->name() + std::string(
" → strings");
562 ? std::string(
" (inel)")
563 : std::string(
" (?)");
564 r = A_type->name() + B_type->name() + std::string(
" → ") +
565 channel->particle_types()[0]->name() +
566 channel->particle_types()[1]->name() + r_type;
574 std::sort(r_list.begin(), r_list.end());
575 r_list.erase(std::unique(r_list.begin(), r_list.end()), r_list.end());
576 if (any_nonzero_cs) {
577 for (
auto r : r_list) {
579 if (r_list.back() != r) {
583 std::cout << std::endl;
613 namespace decaytree {
661 Node(
const std::string& name,
double weight,
662 ParticleTypePtrList&& initial_particles,
663 ParticleTypePtrList&& final_particles, ParticleTypePtrList&& state,
664 std::vector<Node>&& children)
684 ParticleTypePtrList&& initial_particles,
685 ParticleTypePtrList&& final_particles) {
687 ParticleTypePtrList state(
state_);
688 for (
const auto&
p : initial_particles) {
689 state.erase(std::find(state.begin(), state.end(),
p));
691 for (
const auto&
p : final_particles) {
695 std::sort(state.begin(), state.end(),
697 return a->name() < b->name();
700 Node new_node(name, weight, std::move(initial_particles),
701 std::move(final_particles), std::move(state), {});
702 children_.emplace_back(std::move(new_node));
713 std::vector<FinalStateCrossSection> result;
726 for (uint64_t i = 0; i < depth; i++) {
731 child.print_helper(depth + 1);
747 uint64_t depth, std::vector<FinalStateCrossSection>& result,
748 const std::string& name,
double weight,
749 bool show_intermediate_states =
false)
const {
757 std::string new_name;
760 if (show_intermediate_states) {
762 if (!new_name.empty()) {
770 for (
const auto& s :
state_) {
771 new_name += s->name();
774 if (show_intermediate_states) {
783 child.final_state_cross_sections_helper(depth + 1, result, new_name,
784 weight, show_intermediate_states);
798 const DecayBranchPtr& decay,
799 ParticleTypePtrList& final_state) {
800 std::stringstream name;
801 name <<
"[" << res_name <<
"->";
802 for (
const auto&
p : decay->particle_types()) {
804 final_state.push_back(
p);
828 uint32_t n_unstable = 0;
829 double sqrts_minus_masses = sqrts;
834 sqrts_minus_masses -= ptype->
mass();
837 n_unstable != 0 ? 1. /
static_cast<double>(n_unstable) : 1.;
841 const double sqrts_decay = sqrts_minus_masses + ptype->
mass();
842 bool can_decay =
false;
847 double final_state_mass = 0.;
848 for (
const auto&
p : decay->particle_types()) {
849 final_state_mass +=
p->mass();
851 if (final_state_mass > sqrts_decay) {
856 ParticleTypePtrList parts;
858 auto& new_node = node.
add_action(name, norm * decay->weight(), {ptype},
879 static void deduplicate(std::vector<FinalStateCrossSection>& final_state_xs) {
880 std::sort(final_state_xs.begin(), final_state_xs.end(),
883 auto current = final_state_xs.begin();
884 while (current != final_state_xs.end()) {
885 auto adjacent = std::adjacent_find(
886 current, final_state_xs.end(),
888 return a.name_ == b.name_;
891 if (adjacent != final_state_xs.end()) {
892 adjacent->cross_section_ += (adjacent + 1)->cross_section_;
893 final_state_xs.erase(adjacent + 1);
900 bool final_state, std::vector<double>& plab)
const {
901 typedef std::vector<std::pair<double, double>> xs_saver;
902 std::map<std::string, xs_saver> xs_dump;
903 std::map<std::string, double> outgoing_total_mass;
906 int n_momentum_points = 200;
907 constexpr
double momentum_step = 0.02;
908 if (plab.size() > 0) {
909 n_momentum_points = plab.size();
911 std::sort(plab.begin(), plab.end());
912 plab.erase(std::unique(plab.begin(), plab.end()), plab.end());
914 for (
int i = 0; i < n_momentum_points; i++) {
916 if (plab.size() > 0) {
919 momentum = momentum_step * (i + 1);
921 a_data.set_4momentum(m_a, momentum, 0.0, 0.0);
923 const double sqrts = (a_data.momentum() + b_data.
momentum()).abs();
924 const ParticleList incoming = {a_data, b_data};
925 ScatterActionPtr act = std::make_unique<ScatterAction>(
932 {&a, &b}, {&a, &b}, {});
933 const CollisionBranchList& processes = act->collision_channels();
934 for (
const auto& process : processes) {
935 const double xs = process->weight();
940 std::stringstream process_description_stream;
941 process_description_stream << *process;
942 const std::string& description = process_description_stream.str();
944 for (
const auto& ptype : process->particle_types()) {
945 m_tot += ptype->mass();
947 outgoing_total_mass[description] = m_tot;
948 if (!xs_dump[description].empty() &&
949 std::abs(xs_dump[description].back().first - sqrts) <
951 xs_dump[description].back().second += xs;
953 xs_dump[description].push_back(std::make_pair(sqrts, xs));
956 std::stringstream process_description_stream;
957 process_description_stream << *process;
958 const std::string& description = process_description_stream.str();
959 ParticleTypePtrList initial_particles = {&a, &b};
960 ParticleTypePtrList final_particles = process->particle_types();
962 tree.
add_action(description, xs, std::move(initial_particles),
963 std::move(final_particles));
967 xs_dump[
"total"].push_back(std::make_pair(sqrts, act->cross_section()));
969 outgoing_total_mass[
"total"] = -1.0;
974 for (
const auto&
p : final_state_xs) {
982 outgoing_total_mass[
p.name_] =
p.mass_;
983 xs_dump[
p.name_].push_back(std::make_pair(sqrts,
p.cross_section_));
990 for (
auto it = begin(xs_dump); it != end(xs_dump);) {
992 const xs_saver& xs = (*it).second;
994 for (
const auto&
p : xs) {
998 it = xs_dump.erase(it);
1005 std::vector<std::string> all_channels;
1006 for (
const auto& channel : xs_dump) {
1007 all_channels.push_back(channel.first);
1009 std::sort(all_channels.begin(), all_channels.end(),
1010 [&](
const std::string& str_a,
const std::string& str_b) {
1011 return outgoing_total_mass[str_a] < outgoing_total_mass[str_b];
1015 std::cout <<
"# Dumping partial " << a.
name() << b.
name()
1016 <<
" cross-sections in mb, energies in GeV" << std::endl;
1017 std::cout <<
" sqrt_s";
1021 for (
const auto& channel : all_channels) {
1024 std::cout << std::endl;
1027 for (
int i = 0; i < n_momentum_points; i++) {
1029 if (plab.size() > 0) {
1032 momentum = momentum_step * (i + 1);
1034 a_data.set_4momentum(m_a, momentum, 0.0, 0.0);
1036 const double sqrts = (a_data.momentum() + b_data.
momentum()).abs();
1037 std::printf(
"%9.6f", sqrts);
1038 for (
const auto& channel : all_channels) {
1039 const xs_saver energy_and_xs = xs_dump[channel];
1041 for (; j < energy_and_xs.size() && energy_and_xs[j].first < sqrts; j++) {
1044 if (j < energy_and_xs.size() &&
1045 std::abs(energy_and_xs[j].first - sqrts) <
really_small) {
1046 xs = energy_and_xs[j].second;
1048 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.
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.
@ Stochastic
Stochastic Criteiron.
@ Geometric
(Default) 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.
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 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.