Version: SMASH-2.0
scatteractionsfinder.h
Go to the documentation of this file.
1 /*
2  *
3  * Copyright (c) 2014-2020
4  * SMASH Team
5  *
6  * GNU General Public License (GPLv3 or later)
7  *
8  */
9 
10 #ifndef SRC_INCLUDE_SMASH_SCATTERACTIONSFINDER_H_
11 #define SRC_INCLUDE_SMASH_SCATTERACTIONSFINDER_H_
12 
13 #include <memory>
14 #include <set>
15 #include <vector>
16 
17 #include "action.h"
18 #include "actionfinderfactory.h"
19 #include "configuration.h"
20 #include "scatteraction.h"
21 
22 namespace smash {
23 
31  public:
57  const ExperimentParameters &parameters,
58  const std::vector<bool> &nucleon_has_interacted,
59  int N_tot, int N_proj);
60 
77  inline double collision_time(
78  const ParticleData &p1, const ParticleData &p2, double dt,
79  const std::vector<FourVector> &beam_momentum) const {
81  return dt * random::uniform(0., 1.);
82  } else {
83  /*
84  * For frozen Fermi motion:
85  * If particles have not yet interacted and are the initial nucleons,
86  * perform action finding with beam momentum instead of Fermi motion
87  * corrected momentum. That is because the particles are propagated with
88  * the beam momentum until they interact.
89  */
90  if (p1.id() < 0 || p2.id() < 0) {
91  throw std::runtime_error("Invalid particle ID for Fermi motion");
92  }
93  const bool p1_has_no_prior_interactions =
94  (static_cast<uint64_t>(p1.id()) < // particle from
95  static_cast<uint64_t>(beam_momentum.size())) && // initial nucleus
97 
98  const bool p2_has_no_prior_interactions =
99  (static_cast<uint64_t>(p2.id()) < // particle from
100  static_cast<uint64_t>(beam_momentum.size())) && // initial nucleus
102 
103  const FourVector p1_mom = (p1_has_no_prior_interactions)
104  ? beam_momentum[p1.id()]
105  : p1.momentum();
106  const FourVector p2_mom = (p2_has_no_prior_interactions)
107  ? beam_momentum[p2.id()]
108  : p2.momentum();
116  const FourVector delta_x = p1.position() - p2.position();
117  const double p1_sqr = p1_mom.sqr();
118  const double p2_sqr = p2_mom.sqr();
119  const double p1_dot_x = p1_mom.Dot(delta_x);
120  const double p2_dot_x = p2_mom.Dot(delta_x);
121  const double p1_dot_p2 = p1_mom.Dot(p2_mom);
122  const double denominator = std::pow(p1_dot_p2, 2) - p1_sqr * p2_sqr;
123 
124  const double time_1 = (p2_sqr * p1_dot_x - p1_dot_p2 * p2_dot_x) *
125  p1_mom.x0() / denominator;
126  const double time_2 = -(p1_sqr * p2_dot_x - p1_dot_p2 * p1_dot_x) *
127  p2_mom.x0() / denominator;
128  return (time_1 + time_2) / 2;
129  } else {
139  const ThreeVector dv_times_e1e2 =
140  p1_mom.threevec() * p2_mom.x0() - p2_mom.threevec() * p1_mom.x0();
141  const double dv_times_e1e2_sqr = dv_times_e1e2.sqr();
142  if (dv_times_e1e2_sqr < really_small) {
143  return -1.0;
144  }
145  const ThreeVector dr =
146  p1.position().threevec() - p2.position().threevec();
147  return -(dr * dv_times_e1e2) *
148  (p1_mom.x0() * p2_mom.x0() / dv_times_e1e2_sqr);
149  }
150  }
151  }
152 
167  ActionList find_actions_in_cell(
168  const ParticleList &search_list, double dt, const double gcell_vol,
169  const std::vector<FourVector> &beam_momentum) const override;
170 
183  ActionList find_actions_with_neighbors(
184  const ParticleList &search_list, const ParticleList &neighbors_list,
185  double dt, const std::vector<FourVector> &beam_momentum) const override;
186 
199  const ParticleList &search_list, const Particles &surrounding_list,
200  double dt, const std::vector<FourVector> &beam_momentum) const override;
201 
206  ActionList find_final_actions(const Particles & /*search_list*/,
207  bool /*only_res*/ = false) const override {
208  return ActionList();
209  }
210 
221  inline bool is_constant_elastic_isotropic() const {
222  return ParticleType::list_all().size() == 1 && !two_to_one_ && isotropic_ &&
223  elastic_parameter_ > 0.;
224  }
225 
236  double max_transverse_distance_sqr(int testparticles) const {
239  testparticles * fm2_mb * M_1_PI;
240  }
241 
246  void dump_reactions() const;
247 
261  void dump_cross_sections(const ParticleType &a, const ParticleType &b,
262  double m_a, double m_b, bool final_state,
263  std::vector<double> &plab) const;
264 
270  if (strings_switch_) {
271  return string_process_interface_.get();
272  } else {
273  return NULL;
274  }
275  }
276 
277  private:
306  ActionPtr check_collision_two_part(
307  const ParticleData &data_a, const ParticleData &data_b, double dt,
308  const std::vector<FourVector> &beam_momentum = {},
309  const double gcell_vol = 0.0) const;
310 
326  ActionPtr check_collision_multi_part(const ParticleList &plist, double dt,
327  const double gcell_vol) const;
328 
330  std::unique_ptr<StringProcess> string_process_interface_;
334  const double elastic_parameter_;
336  const int testparticles_;
338  const bool isotropic_;
340  const bool two_to_one_;
346  const double scale_xs_;
348  const double additional_el_xs_;
353  const double low_snn_cut_;
355  const bool strings_switch_;
357  const bool use_AQM_;
367  const double box_length_;
371  const std::vector<bool> &nucleon_has_interacted_;
373  const int N_tot_;
375  const int N_proj_;
386 };
387 
388 } // namespace smash
389 
390 #endif // SRC_INCLUDE_SMASH_SCATTERACTIONSFINDER_H_
smash::ScatterActionsFinder::low_snn_cut_
const double low_snn_cut_
Elastic collsions between two nucleons with sqrt_s below low_snn_cut_ are excluded.
Definition: scatteractionsfinder.h:353
smash
Definition: action.h:24
smash::FourVector::Dot
double Dot(const FourVector &a) const
calculate the scalar product with another four-vector
Definition: fourvector.h:446
smash::ParticleData::momentum
const FourVector & momentum() const
Get the particle's 4-momentum.
Definition: particledata.h:152
smash::ScatterActionsFinder::string_formation_time_
const double string_formation_time_
Parameter for formation time.
Definition: scatteractionsfinder.h:377
smash::HistoryData::collisions_per_particle
int32_t collisions_per_particle
Collision counter per particle, zero only for initially present particles.
Definition: particledata.h:26
smash::ScatterActionsFinder::elastic_parameter_
const double elastic_parameter_
Elastic cross section parameter (in mb).
Definition: scatteractionsfinder.h:334
smash::ScatterActionsFinder::string_process_interface_
std::unique_ptr< StringProcess > string_process_interface_
Class that deals with strings, interfacing Pythia.
Definition: scatteractionsfinder.h:330
smash::ParticleData
Definition: particledata.h:52
smash::ScatterActionsFinder::additional_el_xs_
const double additional_el_xs_
Additional constant elastic cross section.
Definition: scatteractionsfinder.h:348
smash::ParticleData::id
int32_t id() const
Get the id of the particle.
Definition: particledata.h:70
smash::ScatterActionsFinder::find_final_actions
ActionList find_final_actions(const Particles &, bool=false) const override
Find some final collisions at the end of the simulation.
Definition: scatteractionsfinder.h:206
smash::ScatterActionsFinder::testparticles_
const int testparticles_
Number of test particles.
Definition: scatteractionsfinder.h:336
smash::ScatterActionsFinder
Definition: scatteractionsfinder.h:30
smash::ParticleData::get_history
HistoryData get_history() const
Get history information.
Definition: particledata.h:133
smash::ScatterActionsFinder::incl_set_
const ReactionsBitSet incl_set_
List of included 2<->2 reactions.
Definition: scatteractionsfinder.h:342
smash::FourVector::sqr
double sqr() const
calculate the square of the vector (which is a scalar)
Definition: fourvector.h:450
smash::ScatterActionsFinder::strings_with_probability_
const bool strings_with_probability_
Decide whether to implement string fragmentation based on a probability.
Definition: scatteractionsfinder.h:359
smash::ThreeVector::sqr
double sqr() const
Definition: threevector.h:259
smash::ScatterActionsFinder::check_collision_multi_part
ActionPtr check_collision_multi_part(const ParticleList &plist, double dt, const double gcell_vol) const
Check for multiple i.e.
Definition: scatteractionsfinder.cc:503
smash::ScatterActionsFinder::two_to_one_
const bool two_to_one_
Enable 2->1 processes.
Definition: scatteractionsfinder.h:340
smash::ScatterActionsFinder::nucleon_has_interacted_
const std::vector< bool > & nucleon_has_interacted_
Parameter to record whether the nucleon has experienced a collision or not.
Definition: scatteractionsfinder.h:371
smash::ScatterActionsFinder::dump_cross_sections
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...
Definition: scatteractionsfinder.cc:1042
action.h
ReactionsBitSet
std::bitset< 10 > ReactionsBitSet
Container for the 2 to 2 reactions in the code.
Definition: forwarddeclarations.h:231
smash::ScatterActionsFinder::max_transverse_distance_sqr
double max_transverse_distance_sqr(int testparticles) const
The maximal distance over which particles can interact, related to the number of test particles and t...
Definition: scatteractionsfinder.h:236
smash::really_small
constexpr double really_small
Numerical error tolerance.
Definition: constants.h:37
smash::ScatterActionsFinder::incl_multi_set_
const MultiParticleReactionsBitSet incl_multi_set_
List of included multi-particle reactions.
Definition: scatteractionsfinder.h:344
smash::Configuration
Interface to the SMASH configuration files.
Definition: configuration.h:464
MultiParticleReactionsBitSet
std::bitset< 2 > MultiParticleReactionsBitSet
Container for the 2 to 2 reactions in the code.
Definition: forwarddeclarations.h:240
smash::StringProcess
String excitation processes used in SMASH.
Definition: stringprocess.h:45
smash::ThreeVector
Definition: threevector.h:31
smash::ScatterActionsFinder::collision_time
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.
Definition: scatteractionsfinder.h:77
smash::ScatterActionsFinder::nnbar_treatment_
const NNbarTreatment nnbar_treatment_
Switch for NNbar reactions.
Definition: scatteractionsfinder.h:361
CollisionCriterion::Stochastic
Stochastic Criteiron.
CollisionCriterion::Covariant
Covariant Criterion.
smash::ScatterActionsFinder::strings_switch_
const bool strings_switch_
Switch to turn off string excitation.
Definition: scatteractionsfinder.h:355
smash::FourVector::x0
double x0() const
Definition: fourvector.h:303
smash::ParticleData::position
const FourVector & position() const
Get the particle's position in Minkowski space.
Definition: particledata.h:198
smash::ParticleType
Definition: particletype.h:97
smash::ScatterActionsFinder::ScatterActionsFinder
ScatterActionsFinder(Configuration config, const ExperimentParameters &parameters, const std::vector< bool > &nucleon_has_interacted, int N_tot, int N_proj)
Constructor of the finder with the given parameters.
Definition: scatteractionsfinder.cc:296
smash::ScatterActionsFinder::find_actions_in_cell
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.
Definition: scatteractionsfinder.cc:573
smash::ScatterActionsFinder::is_constant_elastic_isotropic
bool is_constant_elastic_isotropic() const
If there is only one particle sort, no decays (only elastic scatterings are possible),...
Definition: scatteractionsfinder.h:221
smash::ScatterActionsFinder::only_warn_for_high_prob_
const bool only_warn_for_high_prob_
Switch to turn off throwing an exception for collision probabilities larger than 1.
Definition: scatteractionsfinder.h:385
CollisionCriterion
CollisionCriterion
Criteria used to check collisions.
Definition: forwarddeclarations.h:195
smash::ScatterActionsFinder::find_actions_with_neighbors
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.
Definition: scatteractionsfinder.cc:605
actionfinderfactory.h
smash::ActionFinderInterface
Definition: actionfinderfactory.h:27
smash::ScatterActionsFinder::maximum_cross_section_
const double maximum_cross_section_
Definition: scatteractionsfinder.h:379
smash::ScatterActionsFinder::isotropic_
const bool isotropic_
Do all collisions isotropically.
Definition: scatteractionsfinder.h:338
smash::ScatterActionsFinder::check_collision_two_part
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...
Definition: scatteractionsfinder.cc:371
smash::Particles
Definition: particles.h:33
smash::ScatterActionsFinder::use_AQM_
const bool use_AQM_
Switch to control whether to use AQM or not.
Definition: scatteractionsfinder.h:357
smash::fm2_mb
constexpr double fm2_mb
mb <-> fm^2 conversion factor.
Definition: constants.h:28
configuration.h
smash::ExperimentParameters
Helper structure for Experiment.
Definition: experimentparameters.h:24
smash::FourVector
Definition: fourvector.h:33
smash::ScatterActionsFinder::scale_xs_
const double scale_xs_
Factor by which all (partial) cross sections are scaled.
Definition: scatteractionsfinder.h:346
NNbarTreatment
NNbarTreatment
Treatment of N Nbar Annihilation.
Definition: forwarddeclarations.h:176
smash::random::uniform
T uniform(T min, T max)
Definition: random.h:88
smash::ScatterActionsFinder::dump_reactions
void dump_reactions() const
Prints out all the 2-> n (n > 1) reactions with non-zero cross-sections between all possible pairs of...
Definition: scatteractionsfinder.cc:654
smash::ScatterActionsFinder::N_tot_
const int N_tot_
Record the total number of the nucleons in the two colliding nuclei.
Definition: scatteractionsfinder.h:373
smash::ScatterActionsFinder::N_proj_
const int N_proj_
Record the number of the nucleons in the projectile.
Definition: scatteractionsfinder.h:375
scatteraction.h
smash::FourVector::threevec
ThreeVector threevec() const
Definition: fourvector.h:319
smash::ScatterActionsFinder::coll_crit_
const CollisionCriterion coll_crit_
Specifies which collision criterion is used.
Definition: scatteractionsfinder.h:332
smash::ParticleType::list_all
static const ParticleTypeList & list_all()
Definition: particletype.cc:51
smash::ScatterActionsFinder::find_actions_with_surrounding_particles
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.
Definition: scatteractionsfinder.cc:626
smash::ScatterActionsFinder::get_process_string_ptr
StringProcess * get_process_string_ptr()
Definition: scatteractionsfinder.h:269
smash::ScatterActionsFinder::box_length_
const double box_length_
Box length: needed to determine coordinates of collision correctly in case of collision through the w...
Definition: scatteractionsfinder.h:367