Version: SMASH-1.8
scatteractionsfinder.h
Go to the documentation of this file.
1 /*
2  *
3  * Copyright (c) 2014-2019
4  * SMASH Team
5  *
6  * GNU General Public License (GPLv3 or later)
7  *
8  */
9 
10 #ifndef SRC_INCLUDE_SCATTERACTIONSFINDER_H_
11 #define SRC_INCLUDE_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 "constants.h"
21 #include "scatteraction.h"
22 
23 namespace smash {
24 
32  public:
58  const ExperimentParameters &parameters,
59  const std::vector<bool> &nucleon_has_interacted,
60  int N_tot, int N_proj);
61 
78  inline double collision_time(
79  const ParticleData &p1, const ParticleData &p2, double dt,
80  const std::vector<FourVector> &beam_momentum) const {
82  return dt * random::uniform(0., 1.);
83  } else {
84  /*
85  * For frozen Fermi motion:
86  * If particles have not yet interacted and are the initial nucleons,
87  * perform action finding with beam momentum instead of Fermi motion
88  * corrected momentum. That is because the particles are propagated with
89  * the beam momentum until they interact.
90  */
91  if (p1.id() < 0 || p2.id() < 0) {
92  throw std::runtime_error("Invalid particle ID for Fermi motion");
93  }
94  const bool p1_has_no_prior_interactions =
95  (static_cast<uint64_t>(p1.id()) < // particle from
96  static_cast<uint64_t>(beam_momentum.size())) && // initial nucleus
98 
99  const bool p2_has_no_prior_interactions =
100  (static_cast<uint64_t>(p2.id()) < // particle from
101  static_cast<uint64_t>(beam_momentum.size())) && // initial nucleus
103 
104  const FourVector p1_mom = (p1_has_no_prior_interactions)
105  ? beam_momentum[p1.id()]
106  : p1.momentum();
107  const FourVector p2_mom = (p2_has_no_prior_interactions)
108  ? beam_momentum[p2.id()]
109  : p2.momentum();
110 
120  const ThreeVector dv_times_e1e2 =
121  p1_mom.threevec() * p2_mom.x0() - p2_mom.threevec() * p1_mom.x0();
122  const double dv_times_e1e2_sqr = dv_times_e1e2.sqr();
123  if (dv_times_e1e2_sqr < really_small) {
124  return -1.0;
125  }
126  const ThreeVector dr =
127  p1.position().threevec() - p2.position().threevec();
128  return -(dr * dv_times_e1e2) *
129  (p1_mom.x0() * p2_mom.x0() / dv_times_e1e2_sqr);
130  }
131  }
132 
147  ActionList find_actions_in_cell(
148  const ParticleList &search_list, double dt, const double cell_vol,
149  const std::vector<FourVector> &beam_momentum) const override;
150 
163  ActionList find_actions_with_neighbors(
164  const ParticleList &search_list, const ParticleList &neighbors_list,
165  double dt, const std::vector<FourVector> &beam_momentum) const override;
166 
179  const ParticleList &search_list, const Particles &surrounding_list,
180  double dt, const std::vector<FourVector> &beam_momentum) const override;
181 
186  ActionList find_final_actions(const Particles & /*search_list*/,
187  bool /*only_res*/ = false) const override {
188  return ActionList();
189  }
190 
201  inline bool is_constant_elastic_isotropic() const {
202  return ParticleType::list_all().size() == 1 && !two_to_one_ && isotropic_ &&
203  elastic_parameter_ > 0.;
204  }
205 
216  double max_transverse_distance_sqr(int testparticles) const {
219  testparticles * fm2_mb * M_1_PI;
220  }
221 
226  void dump_reactions() const;
227 
241  void dump_cross_sections(const ParticleType &a, const ParticleType &b,
242  double m_a, double m_b, bool final_state,
243  std::vector<double> &plab) const;
244 
250  if (strings_switch_) {
251  return string_process_interface_.get();
252  } else {
253  return NULL;
254  }
255  }
256 
257  private:
288  ActionPtr check_collision(const ParticleData &data_a,
289  const ParticleData &data_b, double dt,
290  const std::vector<FourVector> &beam_momentum = {},
291  const double cell_vol = 0.0) const;
292 
294  std::unique_ptr<StringProcess> string_process_interface_;
298  const double elastic_parameter_;
300  const int testparticles_;
302  const bool isotropic_;
304  const bool two_to_one_;
311  const double low_snn_cut_;
313  const bool strings_switch_;
315  const bool use_AQM_;
323  const std::vector<bool> &nucleon_has_interacted_;
325  const int N_tot_;
327  const int N_proj_;
330 };
331 
332 } // namespace smash
333 
334 #endif // SRC_INCLUDE_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:311
smash
Definition: action.h:24
smash::maximum_cross_section
constexpr double maximum_cross_section
The maximal cross section (in mb) for which it is guaranteed that all collisions with this cross sect...
Definition: constants.h:111
smash::ParticleData::momentum
const FourVector & momentum() const
Get the particle's 4-momentum.
Definition: particledata.h:142
smash::ScatterActionsFinder::string_formation_time_
const double string_formation_time_
Parameter for formation time.
Definition: scatteractionsfinder.h:329
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:298
smash::ScatterActionsFinder::string_process_interface_
std::unique_ptr< StringProcess > string_process_interface_
Class that deals with strings, interfacing Pythia.
Definition: scatteractionsfinder.h:294
smash::ParticleData
Definition: particledata.h:52
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:186
smash::ScatterActionsFinder::testparticles_
const int testparticles_
Number of test particles.
Definition: scatteractionsfinder.h:300
smash::ScatterActionsFinder
Definition: scatteractionsfinder.h:31
smash::ParticleData::get_history
HistoryData get_history() const
Get history information.
Definition: particledata.h:123
smash::ScatterActionsFinder::incl_set_
const ReactionsBitSet incl_set_
List of included 2<->2 reactions.
Definition: scatteractionsfinder.h:306
smash::ScatterActionsFinder::find_actions_in_cell
ActionList find_actions_in_cell(const ParticleList &search_list, double dt, const double cell_vol, const std::vector< FourVector > &beam_momentum) const override
Search for all the possible collisions within one cell.
Definition: scatteractionsfinder.cc:414
smash::ScatterActionsFinder::strings_with_probability_
const bool strings_with_probability_
Decide whether to implement string fragmentation based on a probability.
Definition: scatteractionsfinder.h:317
smash::ThreeVector::sqr
double sqr() const
Definition: threevector.h:259
smash::ScatterActionsFinder::two_to_one_
const bool two_to_one_
Enable 2->1 processes.
Definition: scatteractionsfinder.h:304
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:323
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:868
action.h
ReactionsBitSet
std::bitset< 10 > ReactionsBitSet
Container for the 2 to 2 reactions in the code.
Definition: forwarddeclarations.h:226
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:216
smash::really_small
constexpr double really_small
Numerical error tolerance.
Definition: constants.h:37
smash::Configuration
Interface to the SMASH configuration files.
Definition: configuration.h:464
smash::StringProcess
String excitation processes used in SMASH.
Definition: processstring.h:47
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:78
smash::ScatterActionsFinder::nnbar_treatment_
const NNbarTreatment nnbar_treatment_
Switch for NNbar reactions.
Definition: scatteractionsfinder.h:319
CollisionCriterion::Stochastic
Stochastic Criteiron.
smash::ScatterActionsFinder::strings_switch_
const bool strings_switch_
Switch to turn off string excitation.
Definition: scatteractionsfinder.h:313
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:188
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:232
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:201
CollisionCriterion
CollisionCriterion
Criteria used to check collisions.
Definition: forwarddeclarations.h:192
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:432
actionfinderfactory.h
smash::ActionFinderInterface
Definition: actionfinderfactory.h:27
smash::ScatterActionsFinder::isotropic_
const bool isotropic_
Do all collisions isotropically.
Definition: scatteractionsfinder.h:302
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:315
smash::fm2_mb
constexpr double fm2_mb
mb <-> fm^2 conversion factor.
Definition: constants.h:28
constants.h
configuration.h
smash::ExperimentParameters
Helper structure for Experiment.
Definition: experimentparameters.h:23
smash::FourVector
Definition: fourvector.h:33
NNbarTreatment
NNbarTreatment
Treatment of N Nbar Annihilation.
Definition: forwarddeclarations.h:173
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:481
smash::ScatterActionsFinder::N_tot_
const int N_tot_
Record the total number of the nucleons in the two colliding nuclei.
Definition: scatteractionsfinder.h:325
smash::ScatterActionsFinder::check_collision
ActionPtr check_collision(const ParticleData &data_a, const ParticleData &data_b, double dt, const std::vector< FourVector > &beam_momentum={}, const double cell_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:288
smash::ScatterActionsFinder::N_proj_
const int N_proj_
Record the number of the nucleons in the projectile.
Definition: scatteractionsfinder.h:327
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:296
smash::ParticleType::list_all
static const ParticleTypeList & list_all()
Definition: particletype.cc:57
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:453
smash::ScatterActionsFinder::get_process_string_ptr
StringProcess * get_process_string_ptr()
Definition: scatteractionsfinder.h:249