Version: SMASH-1.6
smash::ScatterActionsFinder Class Reference

#include <scatteractionsfinder.h>

A simple scatter finder: Just loops through all particles and checks each pair for a collision.

Definition at line 30 of file scatteractionsfinder.h.

Inheritance diagram for smash::ScatterActionsFinder:
[legend]
Collaboration diagram for smash::ScatterActionsFinder:
[legend]

Public Member Functions

 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. More...
 
ActionList find_actions_in_cell (const ParticleList &search_list, double dt) const override
 Search for all the possible collisions within one cell. More...
 
ActionList find_actions_with_neighbors (const ParticleList &search_list, const ParticleList &neighbors_list, double dt) const override
 Search for all the possible collisions among the neighboring cells. More...
 
ActionList find_actions_with_surrounding_particles (const ParticleList &search_list, const Particles &surrounding_list, double dt) const override
 Search for all the possible secondary collisions between the outgoing particles and the rest. More...
 
ActionList find_final_actions (const Particles &, bool=false) const override
 Find some final collisions at the end of the simulation. More...
 
bool is_constant_elastic_isotropic () const
 If there is only one particle sort, no decays (only elastic scatterings are possible), scatterings are isotropic and cross-section fixed to elastic_parameter_ independently on momenta, then maximal cross-section is elastic_parameter_. More...
 
double max_transverse_distance_sqr (int testparticles) const
 The maximal distance over which particles can interact, related to the number of test particles and the maximal cross section. More...
 
void dump_reactions () const
 Prints out all the 2-> n (n > 1) reactions with non-zero cross-sections between all possible pairs of particle types. More...
 
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) and b(mass = m_b). More...
 
StringProcessget_process_string_ptr ()
 
- Public Member Functions inherited from smash::ActionFinderInterface
virtual ~ActionFinderInterface ()=default
 

Static Public Member Functions

static double collision_time (const ParticleData &p1, const ParticleData &p2)
 Determine the collision time of the two particles. More...
 

Private Member Functions

ActionPtr check_collision (const ParticleData &data_a, const ParticleData &data_b, double dt) const
 Check for a single pair of particles (id_a, id_b) if a collision will happen in the next timestep and create a corresponding Action object in that case. More...
 

Private Attributes

std::unique_ptr< StringProcessstring_process_interface_
 Class that deals with strings, interfacing Pythia. More...
 
const double elastic_parameter_
 Elastic cross section parameter (in mb). More...
 
const int testparticles_
 Number of test particles. More...
 
const bool isotropic_
 Do all collisions isotropically. More...
 
const bool two_to_one_
 Enable 2->1 processes. More...
 
const ReactionsBitSet incl_set_
 List of included 2<->2 reactions. More...
 
const double low_snn_cut_
 Elastic collsions between two nucleons with sqrt_s below low_snn_cut_ are excluded. More...
 
const bool strings_switch_
 Switch to turn off string excitation. More...
 
const bool use_AQM_
 Switch to control whether to use AQM or not. More...
 
const bool strings_with_probability_
 Decide whether to implement string fragmentation based on a probability. More...
 
const NNbarTreatment nnbar_treatment_
 Switch for NNbar reactions. More...
 
const std::vector< bool > & nucleon_has_interacted_
 Parameter to record whether the nucleon has experienced a collision or not. More...
 
const int N_tot_
 Record the total number of the nucleons in the two colliding nuclei. More...
 
const int N_proj_
 Record the number of the nucleons in the projectile. More...
 
const double string_formation_time_
 Parameter for formation time. More...
 

Constructor & Destructor Documentation

smash::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.

Parameters
[in]configConfiguration of smash from which we take: 1) A global elastic cross section [mb]. It will be used regardless of the species of the colliding particles. It won't be used if the value is negative. 2) An option determining whether all the scatterings are isotropic 3) Parameters of the string process
[in]parametersStruct of parameters determining whether to exclude some certain types of scatterings and switching among the methods to treat with the NNbar collisions.
[in]nucleon_has_interactedFlags to record whether an initial nucleon has interacted with another particle not from the same nucleus. The flags are used if we want to exclude the first collisions among the nucleons within the same nucleus.
[in]N_totTotal number of the initial nucleons. This number, as well as the next parameter, will be used to determine whether two intial nucleons are within the same nucleus if we'd like to exclude the first collisions among them.
[in]N_projTotal projectile number

Definition at line 208 of file scatteractionsfinder.cc.

212  config.take({"Collision_Term", "Elastic_Cross_Section"}, -1.)),
213  testparticles_(parameters.testparticles),
214  isotropic_(config.take({"Collision_Term", "Isotropic"}, false)),
215  two_to_one_(parameters.two_to_one),
216  incl_set_(parameters.included_2to2),
217  low_snn_cut_(parameters.low_snn_cut),
218  strings_switch_(parameters.strings_switch),
219  use_AQM_(parameters.use_AQM),
220  strings_with_probability_(parameters.strings_with_probability),
221  nnbar_treatment_(parameters.nnbar_treatment),
222  nucleon_has_interacted_(nucleon_has_interacted),
223  N_tot_(N_tot),
224  N_proj_(N_proj),
225  string_formation_time_(config.take(
226  {"Collision_Term", "String_Parameters", "Formation_Time"}, 1.)) {
228  const auto& log = logger<LogArea::FindScatter>();
229  log.info("Constant elastic isotropic cross-section mode:", " using ",
230  elastic_parameter_, " mb as maximal cross-section.");
231  }
232  if (strings_switch_) {
233  auto subconfig = config["Collision_Term"]["String_Parameters"];
234  string_process_interface_ = make_unique<StringProcess>(
235  subconfig.take({"String_Tension"}, 1.0), string_formation_time_,
236  subconfig.take({"Gluon_Beta"}, 0.5),
237  subconfig.take({"Gluon_Pmin"}, 0.001),
238  subconfig.take({"Quark_Alpha"}, 2.0),
239  subconfig.take({"Quark_Beta"}, 7.0),
240  subconfig.take({"Strange_Supp"}, 0.16),
241  subconfig.take({"Diquark_Supp"}, 0.036),
242  subconfig.take({"Sigma_Perp"}, 0.42),
243  subconfig.take({"StringZ_A_Leading"}, 0.2),
244  subconfig.take({"StringZ_B_Leading"}, 2.0),
245  subconfig.take({"StringZ_A"}, 2.0), subconfig.take({"StringZ_B"}, 0.55),
246  subconfig.take({"String_Sigma_T"}, 0.5),
247  subconfig.take({"Form_Time_Factor"}, 1.0),
248  subconfig.take({"Mass_Dependent_Formation_Times"}, false),
249  subconfig.take({"Prob_proton_to_d_uu"}, 1. / 3.),
250  subconfig.take({"Separate_Fragment_Baryon"}, true),
251  subconfig.take({"Popcorn_Rate"}, 0.15));
252  }
253 }
const int testparticles_
Number of test particles.
const ReactionsBitSet incl_set_
List of included 2<->2 reactions.
bool is_constant_elastic_isotropic() const
If there is only one particle sort, no decays (only elastic scatterings are possible), scatterings are isotropic and cross-section fixed to elastic_parameter_ independently on momenta, then maximal cross-section is elastic_parameter_.
const bool two_to_one_
Enable 2->1 processes.
const double low_snn_cut_
Elastic collsions between two nucleons with sqrt_s below low_snn_cut_ are excluded.
const double string_formation_time_
Parameter for formation time.
const bool strings_with_probability_
Decide whether to implement string fragmentation based on a probability.
const std::vector< bool > & nucleon_has_interacted_
Parameter to record whether the nucleon has experienced a collision or not.
std::unique_ptr< StringProcess > string_process_interface_
Class that deals with strings, interfacing Pythia.
const bool strings_switch_
Switch to turn off string excitation.
const NNbarTreatment nnbar_treatment_
Switch for NNbar reactions.
const bool use_AQM_
Switch to control whether to use AQM or not.
const int N_proj_
Record the number of the nucleons in the projectile.
const bool isotropic_
Do all collisions isotropically.
const int N_tot_
Record the total number of the nucleons in the two colliding nuclei.
const double elastic_parameter_
Elastic cross section parameter (in mb).

Here is the call graph for this function:

Member Function Documentation

static double smash::ScatterActionsFinder::collision_time ( const ParticleData p1,
const ParticleData p2 
)
inlinestatic

Determine the collision time of the two particles.

Time of the closest approach is taken as collision time.

Parameters
[in]p1First incoming particle
[in]p2Second incoming particle
Returns
How long does it take for the two incoming particles to propagate before scattering [fm/c]. It's set equal to -1 if the two particles are not moving relative to each other.

UrQMD collision time in computational frame, see Bass:1998ca (3.28): position of particle 1: \(r_1\) [fm] position of particle 2: \(r_2\) [fm] velocity of particle 1: \(v_1\) velocity of particle 1: \(v_2\)

\[t_{coll} = - (r_1 - r_2) . (v_1 - v_2) / (v_1 - v_2)^2\]

[fm/c]

Definition at line 72 of file scatteractionsfinder.h.

73  {
83  const ThreeVector dv_times_e1e2 =
84  p1.momentum().threevec() * p2.momentum().x0() -
85  p2.momentum().threevec() * p1.momentum().x0();
86  const double dv_times_e1e2_sqr = dv_times_e1e2.sqr();
87  if (dv_times_e1e2_sqr < really_small) {
88  return -1.0;
89  }
90  const ThreeVector dr = p1.position().threevec() - p2.position().threevec();
91  return -(dr * dv_times_e1e2) *
92  (p1.momentum().x0() * p2.momentum().x0() / dv_times_e1e2_sqr);
93  }
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:

ActionList smash::ScatterActionsFinder::find_actions_in_cell ( const ParticleList &  search_list,
double  dt 
) const
overridevirtual

Search for all the possible collisions within one cell.

This function is only used for counting the primary collisions at the beginning of each time step. (Although it's also called afterwards for searching the secondary collisions among the outgoing particles, no new actions will be found since the scattered pairs cannot scatter again.)

Parameters
[in]search_listA list of particles within one cell
[in]dtThe maximum time interval at the current time step [fm/c]
Returns
A list of possible scatter actions

Implements smash::ActionFinderInterface.

Definition at line 335 of file scatteractionsfinder.cc.

336  {
337  std::vector<ActionPtr> actions;
338  for (const ParticleData& p1 : search_list) {
339  for (const ParticleData& p2 : search_list) {
340  if (p1.id() < p2.id()) {
341  // Check if a collision is possible.
342  ActionPtr act = check_collision(p1, p2, dt);
343  if (act) {
344  actions.push_back(std::move(act));
345  }
346  }
347  }
348  }
349  return actions;
350 }
ActionPtr check_collision(const ParticleData &data_a, const ParticleData &data_b, double dt) const
Check for a single pair of particles (id_a, id_b) if a collision will happen in the next timestep and...

Here is the call graph for this function:

Here is the caller graph for this function:

ActionList smash::ScatterActionsFinder::find_actions_with_neighbors ( const ParticleList &  search_list,
const ParticleList &  neighbors_list,
double  dt 
) const
overridevirtual

Search for all the possible collisions among the neighboring cells.

This function is only used for counting the primary collisions at the beginning of each time step.

Parameters
[in]search_listA list of particles within the current cell
[in]neighbors_listA list of particles within the neighboring cell
[in]dtThe maximum time interval at the current time step [fm/c]
Returns
A list of possible scatter actions

Implements smash::ActionFinderInterface.

Definition at line 352 of file scatteractionsfinder.cc.

354  {
355  std::vector<ActionPtr> actions;
356  for (const ParticleData& p1 : search_list) {
357  for (const ParticleData& p2 : neighbors_list) {
358  assert(p1.id() != p2.id());
359  // Check if a collision is possible.
360  ActionPtr act = check_collision(p1, p2, dt);
361  if (act) {
362  actions.push_back(std::move(act));
363  }
364  }
365  }
366  return actions;
367 }
ActionPtr check_collision(const ParticleData &data_a, const ParticleData &data_b, double dt) const
Check for a single pair of particles (id_a, id_b) if a collision will happen in the next timestep and...

Here is the call graph for this function:

Here is the caller graph for this function:

ActionList smash::ScatterActionsFinder::find_actions_with_surrounding_particles ( const ParticleList &  search_list,
const Particles surrounding_list,
double  dt 
) const
overridevirtual

Search for all the possible secondary collisions between the outgoing particles and the rest.

Parameters
[in]search_listA list of particles within the current cell
[in]surrounding_listThe whole particle list
[in]dtThe maximum time interval at the current time step [fm/c]
Returns
A list of possible scatter actions

Implements smash::ActionFinderInterface.

Definition at line 369 of file scatteractionsfinder.cc.

371  {
372  std::vector<ActionPtr> actions;
373  for (const ParticleData& p2 : surrounding_list) {
374  /* don't look for collisions if the particle from the surrounding list is
375  * also in the search list */
376  auto result = std::find_if(
377  search_list.begin(), search_list.end(),
378  [&p2](const ParticleData& p) { return p.id() == p2.id(); });
379  if (result != search_list.end()) {
380  continue;
381  }
382  for (const ParticleData& p1 : search_list) {
383  // Check if a collision is possible.
384  ActionPtr act = check_collision(p1, p2, dt);
385  if (act) {
386  actions.push_back(std::move(act));
387  }
388  }
389  }
390  return actions;
391 }
ActionPtr check_collision(const ParticleData &data_a, const ParticleData &data_b, double dt) const
Check for a single pair of particles (id_a, id_b) if a collision will happen in the next timestep and...
constexpr int p
Proton.

Here is the call graph for this function:

Here is the caller graph for this function:

ActionList smash::ScatterActionsFinder::find_final_actions ( const Particles ,
bool  = false 
) const
inlineoverridevirtual

Find some final collisions at the end of the simulation.

Todo:
Seems to do nothing.

Implements smash::ActionFinderInterface.

Definition at line 140 of file scatteractionsfinder.h.

141  {
142  return ActionList();
143  }
bool smash::ScatterActionsFinder::is_constant_elastic_isotropic ( ) const
inline

If there is only one particle sort, no decays (only elastic scatterings are possible), scatterings are isotropic and cross-section fixed to elastic_parameter_ independently on momenta, then maximal cross-section is elastic_parameter_.

This knowledge can be used for improving performance.

Returns
A boolean indicating whether all the scatterings are elastic and isotropic

Definition at line 155 of file scatteractionsfinder.h.

155  {
156  return ParticleType::list_all().size() == 1 && !two_to_one_ && isotropic_ &&
157  elastic_parameter_ > 0.;
158  }
const bool two_to_one_
Enable 2->1 processes.
static const ParticleTypeList & list_all()
Definition: particletype.cc:55
const bool isotropic_
Do all collisions isotropically.
const double elastic_parameter_
Elastic cross section parameter (in mb).

Here is the call graph for this function:

Here is the caller graph for this function:

double smash::ScatterActionsFinder::max_transverse_distance_sqr ( int  testparticles) const
inline

The maximal distance over which particles can interact, related to the number of test particles and the maximal cross section.

Parameters
[in]testparticlesNumber of test particles.
Returns
Maximal transverse distance squared. [fm \(^{2}\)] Particle pairs whose transverse distance is larger than this are not checked for collisions.

Definition at line 170 of file scatteractionsfinder.h.

170  {
173  testparticles * fm2_mb * M_1_PI;
174  }
bool is_constant_elastic_isotropic() const
If there is only one particle sort, no decays (only elastic scatterings are possible), scatterings are isotropic and cross-section fixed to elastic_parameter_ independently on momenta, then maximal cross-section is elastic_parameter_.
constexpr double fm2_mb
mb <-> fm^2 conversion factor.
Definition: constants.h:28
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:108
const double elastic_parameter_
Elastic cross section parameter (in mb).

Here is the call graph for this function:

Here is the caller graph for this function:

void smash::ScatterActionsFinder::dump_reactions ( ) const

Prints out all the 2-> n (n > 1) reactions with non-zero cross-sections between all possible pairs of particle types.

Definition at line 393 of file scatteractionsfinder.cc.

393  {
394  constexpr double time = 0.0;
395 
396  const size_t N_isotypes = IsoParticleType::list_all().size();
397  const size_t N_pairs = N_isotypes * (N_isotypes - 1) / 2;
398 
399  std::cout << N_isotypes << " iso-particle types." << std::endl;
400  std::cout << "They can make " << N_pairs << " pairs." << std::endl;
401  std::vector<double> momentum_scan_list = {0.1, 0.3, 0.5, 1.0,
402  2.0, 3.0, 5.0, 10.0};
403  for (const IsoParticleType& A_isotype : IsoParticleType::list_all()) {
404  for (const IsoParticleType& B_isotype : IsoParticleType::list_all()) {
405  if (&A_isotype > &B_isotype) {
406  continue;
407  }
408  bool any_nonzero_cs = false;
409  std::vector<std::string> r_list;
410  for (const ParticleTypePtr A_type : A_isotype.get_states()) {
411  for (const ParticleTypePtr B_type : B_isotype.get_states()) {
412  if (A_type > B_type) {
413  continue;
414  }
415  ParticleData A(*A_type), B(*B_type);
416  for (auto mom : momentum_scan_list) {
417  A.set_4momentum(A.pole_mass(), mom, 0.0, 0.0);
418  B.set_4momentum(B.pole_mass(), -mom, 0.0, 0.0);
419  ScatterActionPtr act = make_unique<ScatterAction>(
420  A, B, time, isotropic_, string_formation_time_);
421  if (strings_switch_) {
422  act->set_string_interface(string_process_interface_.get());
423  }
424  act->add_all_scatterings(elastic_parameter_, two_to_one_, incl_set_,
428  const double total_cs = act->cross_section();
429  if (total_cs <= 0.0) {
430  continue;
431  }
432  any_nonzero_cs = true;
433  for (const auto& channel : act->collision_channels()) {
434  const auto type = channel->get_type();
435  std::string r;
436  if (is_string_soft_process(type) ||
437  type == ProcessType::StringHard) {
438  r = A_type->name() + B_type->name() + std::string(" → strings");
439  } else {
440  std::string r_type =
441  (type == ProcessType::Elastic)
442  ? std::string(" (el)")
443  : (channel->get_type() == ProcessType::TwoToTwo)
444  ? std::string(" (inel)")
445  : std::string(" (?)");
446  r = A_type->name() + B_type->name() + std::string(" → ") +
447  channel->particle_types()[0]->name() +
448  channel->particle_types()[1]->name() + r_type;
449  }
450  isoclean(r);
451  r_list.push_back(r);
452  }
453  }
454  }
455  }
456  std::sort(r_list.begin(), r_list.end());
457  r_list.erase(std::unique(r_list.begin(), r_list.end()), r_list.end());
458  if (any_nonzero_cs) {
459  for (auto r : r_list) {
460  std::cout << r;
461  if (r_list.back() != r) {
462  std::cout << ", ";
463  }
464  }
465  std::cout << std::endl;
466  }
467  }
468  }
469 }
const ReactionsBitSet incl_set_
List of included 2<->2 reactions.
bool is_string_soft_process(ProcessType p)
Check if a given process type is a soft string excitation.
const bool two_to_one_
Enable 2->1 processes.
const double low_snn_cut_
Elastic collsions between two nucleons with sqrt_s below low_snn_cut_ are excluded.
const double string_formation_time_
Parameter for formation time.
void isoclean(std::string &s)
Remove ⁺, ⁻, ⁰ from string.
const bool strings_with_probability_
Decide whether to implement string fragmentation based on a probability.
2->2 inelastic scattering
std::unique_ptr< StringProcess > string_process_interface_
Class that deals with strings, interfacing Pythia.
const bool strings_switch_
Switch to turn off string excitation.
elastic scattering: particles remain the same, only momenta change
const NNbarTreatment nnbar_treatment_
Switch for NNbar reactions.
hard string process involving 2->2 QCD process by PYTHIA.
const bool use_AQM_
Switch to control whether to use AQM or not.
const bool isotropic_
Do all collisions isotropically.
const double elastic_parameter_
Elastic cross section parameter (in mb).
static const IsoParticleTypeList & list_all()
Returns a list of all IsoParticleTypes.

Here is the call graph for this function:

Here is the caller graph for this function:

void smash::ScatterActionsFinder::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) and b(mass = m_b).

Parameters
[in]aThe specie of the first incoming particle.
[in]bThe specie of the second incoming particle.
[in]m_aMass of species a [GeV].
[in]m_bMass of species b [GeV].
[in]final_stateWhether the final state cross sections should be printed.
[in]plabOptional momenta in lab frame to be evaluated [GeV]. Ignored if empty.

Definition at line 771 of file scatteractionsfinder.cc.

773  {
774  typedef std::vector<std::pair<double, double>> xs_saver;
775  std::map<std::string, xs_saver> xs_dump;
776  std::map<std::string, double> outgoing_total_mass;
777 
778  ParticleData a_data(a), b_data(b);
779  int n_momentum_points = 200;
780  constexpr double momentum_step = 0.02;
781  /*
782  // Round to output precision.
783  for (auto& p : plab) {
784  p = std::floor((p * 100000) + 0.5) / 100000;
785  }
786  */
787  if (plab.size() > 0) {
788  n_momentum_points = plab.size();
789  // Remove duplicates.
790  std::sort(plab.begin(), plab.end());
791  plab.erase(std::unique(plab.begin(), plab.end()), plab.end());
792  }
793  for (int i = 0; i < n_momentum_points; i++) {
794  double momentum;
795  if (plab.size() > 0) {
796  momentum = pCM_from_s(s_from_plab(plab.at(i), m_a, m_b), m_a, m_b);
797  } else {
798  momentum = momentum_step * (i + 1);
799  }
800  a_data.set_4momentum(m_a, momentum, 0.0, 0.0);
801  b_data.set_4momentum(m_b, -momentum, 0.0, 0.0);
802  const double sqrts = (a_data.momentum() + b_data.momentum()).abs();
803  const ParticleList incoming = {a_data, b_data};
804  ScatterActionPtr act = make_unique<ScatterAction>(
805  a_data, b_data, 0., isotropic_, string_formation_time_);
806  if (strings_switch_) {
807  act->set_string_interface(string_process_interface_.get());
808  }
809  act->add_all_scatterings(elastic_parameter_, two_to_one_, incl_set_,
812  decaytree::Node tree(a.name() + b.name(), act->cross_section(), {&a, &b},
813  {&a, &b}, {&a, &b}, {});
814  const CollisionBranchList& processes = act->collision_channels();
815  for (const auto& process : processes) {
816  const double xs = process->weight();
817  if (xs <= 0.0) {
818  continue;
819  }
820  if (!final_state) {
821  std::stringstream process_description_stream;
822  process_description_stream << *process;
823  const std::string& description = process_description_stream.str();
824  double m_tot = 0.0;
825  for (const auto& ptype : process->particle_types()) {
826  m_tot += ptype->mass();
827  }
828  outgoing_total_mass[description] = m_tot;
829  if (!xs_dump[description].empty() &&
830  std::abs(xs_dump[description].back().first - sqrts) <
831  really_small) {
832  xs_dump[description].back().second += xs;
833  } else {
834  xs_dump[description].push_back(std::make_pair(sqrts, xs));
835  }
836  } else {
837  std::stringstream process_description_stream;
838  process_description_stream << *process;
839  const std::string& description = process_description_stream.str();
840  ParticleTypePtrList initial_particles = {&a, &b};
841  ParticleTypePtrList final_particles = process->particle_types();
842  auto& process_node =
843  tree.add_action(description, xs, std::move(initial_particles),
844  std::move(final_particles));
845  decaytree::add_decays(process_node, sqrts);
846  }
847  }
848  xs_dump["total"].push_back(std::make_pair(sqrts, act->cross_section()));
849  // Total cross-section should be the first in the list -> negative mass
850  outgoing_total_mass["total"] = -1.0;
851  if (final_state) {
852  // tree.print();
853  auto final_state_xs = tree.final_state_cross_sections();
854  deduplicate(final_state_xs);
855  for (const auto& p : final_state_xs) {
856  // Don't print empty columns.
857  //
858  // FIXME(steinberg): The better fix would be to not have them in the
859  // first place.
860  if (p.name_ == "") {
861  continue;
862  }
863  outgoing_total_mass[p.name_] = p.mass_;
864  xs_dump[p.name_].push_back(std::make_pair(sqrts, p.cross_section_));
865  }
866  }
867  }
868 
869  // Nice ordering of channels by summed pole mass of products
870  std::vector<std::string> all_channels;
871  for (const auto channel : xs_dump) {
872  all_channels.push_back(channel.first);
873  }
874  std::sort(all_channels.begin(), all_channels.end(),
875  [&](const std::string& str_a, const std::string& str_b) {
876  return outgoing_total_mass[str_a] < outgoing_total_mass[str_b];
877  });
878 
879  // Print header
880  std::cout << "# Dumping partial " << a.name() << b.name()
881  << " cross-sections in mb, energies in GeV" << std::endl;
882  std::cout << " sqrt_s";
883  // Align everything to 16 unicode characters.
884  // This should be enough for the longest channel name (7 final-state
885  // particles).
886  for (const auto channel : all_channels) {
887  std::cout << utf8::fill_left(channel, 16, ' ');
888  }
889  std::cout << std::endl;
890 
891  // Print out all partial cross-sections in mb
892  for (int i = 0; i < n_momentum_points; i++) {
893  double momentum;
894  if (plab.size() > 0) {
895  momentum = pCM_from_s(s_from_plab(plab.at(i), m_a, m_b), m_a, m_b);
896  } else {
897  momentum = momentum_step * (i + 1);
898  }
899  a_data.set_4momentum(m_a, momentum, 0.0, 0.0);
900  b_data.set_4momentum(m_b, -momentum, 0.0, 0.0);
901  const double sqrts = (a_data.momentum() + b_data.momentum()).abs();
902  std::printf("%9.6f", sqrts);
903  for (const auto channel : all_channels) {
904  const xs_saver energy_and_xs = xs_dump[channel];
905  size_t j = 0;
906  for (; j < energy_and_xs.size() && energy_and_xs[j].first < sqrts; j++) {
907  }
908  double xs = 0.0;
909  if (j < energy_and_xs.size() &&
910  std::abs(energy_and_xs[j].first - sqrts) < really_small) {
911  xs = energy_and_xs[j].second;
912  }
913  std::printf("%16.6f", xs); // Same alignment as in the header.
914  }
915  std::printf("\n");
916  }
917 }
static void add_decays(Node &node, double sqrts)
Add nodes for all decays possible from the given node and all of its children.
static void deduplicate(std::vector< FinalStateCrossSection > &final_state_xs)
Deduplicate the final-state cross sections by summing.
constexpr double really_small
Numerical error tolerance.
Definition: constants.h:34
const ReactionsBitSet incl_set_
List of included 2<->2 reactions.
const bool two_to_one_
Enable 2->1 processes.
const double low_snn_cut_
Elastic collsions between two nucleons with sqrt_s below low_snn_cut_ are excluded.
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.
const double string_formation_time_
Parameter for formation time.
const bool strings_with_probability_
Decide whether to implement string fragmentation based on a probability.
T pCM_from_s(const T s, const T mass_a, const T mass_b) noexcept
Definition: kinematics.h:66
std::unique_ptr< StringProcess > string_process_interface_
Class that deals with strings, interfacing Pythia.
const bool strings_switch_
Switch to turn off 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...
Definition: kinematics.h:224
const NNbarTreatment nnbar_treatment_
Switch for NNbar reactions.
constexpr int p
Proton.
const bool use_AQM_
Switch to control whether to use AQM or not.
const bool isotropic_
Do all collisions isotropically.
const double elastic_parameter_
Elastic cross section parameter (in mb).

Here is the call graph for this function:

Here is the caller graph for this function:

StringProcess* smash::ScatterActionsFinder::get_process_string_ptr ( )
inline
Returns
Pointer to the string process class object. If string is turned off, the null pointer is returned.

Definition at line 203 of file scatteractionsfinder.h.

203  {
204  if (strings_switch_) {
205  return string_process_interface_.get();
206  } else {
207  return NULL;
208  }
209  }
std::unique_ptr< StringProcess > string_process_interface_
Class that deals with strings, interfacing Pythia.
const bool strings_switch_
Switch to turn off string excitation.

Here is the call graph for this function:

ActionPtr smash::ScatterActionsFinder::check_collision ( const ParticleData data_a,
const ParticleData data_b,
double  dt 
) const
private

Check for a single pair of particles (id_a, id_b) if a collision will happen in the next timestep and create a corresponding Action object in that case.

Parameters
[in]data_aFirst incoming particle
[in]data_bSecond incoming particle
[in]dtMaximum time interval within which a collision can happen
Returns
A null pointer if no collision happens or an action which contains the information of the outgoing particles.

Definition at line 255 of file scatteractionsfinder.cc.

257  {
258 #ifndef NDEBUG
259  const auto& log = logger<LogArea::FindScatter>();
260 #endif
261 
262  // just collided with this particle
263  if (data_a.id_process() > 0 && data_a.id_process() == data_b.id_process()) {
264 #ifndef NDEBUG
265  log.debug("Skipping collided particles at time ", data_a.position().x0(),
266  " due to process ", data_a.id_process(), "\n ", data_a,
267  "\n<-> ", data_b);
268 #endif
269  return nullptr;
270  }
271  /* If the two particles
272  * 1) belong to the two colliding nuclei
273  * 2) are within the same nucleus
274  * 3) both of them have never experienced any collisons,
275  * then the collision between them are banned. */
276  assert(data_a.id() >= 0);
277  assert(data_b.id() >= 0);
278  if (data_a.id() < N_tot_ && data_b.id() < N_tot_ &&
279  ((data_a.id() < N_proj_ && data_b.id() < N_proj_) ||
280  (data_a.id() >= N_proj_ && data_b.id() >= N_proj_)) &&
281  !(nucleon_has_interacted_[data_a.id()] ||
282  nucleon_has_interacted_[data_b.id()])) {
283  return nullptr;
284  }
285 
286  // Determine time of collision.
287  const double time_until_collision = collision_time(data_a, data_b);
288 
289  // Check that collision happens in this timestep.
290  if (time_until_collision < 0. || time_until_collision >= dt) {
291  return nullptr;
292  }
293 
294  // Create ScatterAction object.
295  ScatterActionPtr act = make_unique<ScatterAction>(
296  data_a, data_b, time_until_collision, isotropic_, string_formation_time_);
297  if (strings_switch_) {
298  act->set_string_interface(string_process_interface_.get());
299  }
300 
301  const double distance_squared = act->transverse_distance_sqr();
302 
303  // Don't calculate cross section if the particles are very far apart.
304  if (distance_squared >= max_transverse_distance_sqr(testparticles_)) {
305  return nullptr;
306  }
307 
308  // Add various subprocesses.
309  act->add_all_scatterings(elastic_parameter_, two_to_one_, incl_set_,
312 
313  // Cross section for collision criterion
314  double cross_section_criterion = act->cross_section() * fm2_mb * M_1_PI /
315  static_cast<double>(testparticles_);
316  // Take cross section scaling factors into account
317  cross_section_criterion *= data_a.xsec_scaling_factor(time_until_collision);
318  cross_section_criterion *= data_b.xsec_scaling_factor(time_until_collision);
319 
320  // distance criterion according to cross_section
321  if (distance_squared >= cross_section_criterion) {
322  return nullptr;
323  }
324 
325 #ifndef NDEBUG
326  log.debug("particle distance squared: ", distance_squared, "\n ", data_a,
327  "\n<-> ", data_b);
328 #endif
329 
330  // Using std::move here is redundant with newer compilers, but required for
331  // supporting GCC 4.8. Once we drop this support, std::move should be removed.
332  return std::move(act);
333 }
static double collision_time(const ParticleData &p1, const ParticleData &p2)
Determine the collision time of the two particles.
const int testparticles_
Number of test particles.
const ReactionsBitSet incl_set_
List of included 2<->2 reactions.
const bool two_to_one_
Enable 2->1 processes.
const double low_snn_cut_
Elastic collsions between two nucleons with sqrt_s below low_snn_cut_ are excluded.
const double string_formation_time_
Parameter for formation time.
const bool strings_with_probability_
Decide whether to implement string fragmentation based on a probability.
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...
constexpr double fm2_mb
mb <-> fm^2 conversion factor.
Definition: constants.h:28
const std::vector< bool > & nucleon_has_interacted_
Parameter to record whether the nucleon has experienced a collision or not.
std::unique_ptr< StringProcess > string_process_interface_
Class that deals with strings, interfacing Pythia.
const bool strings_switch_
Switch to turn off string excitation.
const NNbarTreatment nnbar_treatment_
Switch for NNbar reactions.
const bool use_AQM_
Switch to control whether to use AQM or not.
const int N_proj_
Record the number of the nucleons in the projectile.
const bool isotropic_
Do all collisions isotropically.
const int N_tot_
Record the total number of the nucleons in the two colliding nuclei.
const double elastic_parameter_
Elastic cross section parameter (in mb).

Here is the call graph for this function:

Here is the caller graph for this function:

Member Data Documentation

std::unique_ptr<StringProcess> smash::ScatterActionsFinder::string_process_interface_
private

Class that deals with strings, interfacing Pythia.

Definition at line 226 of file scatteractionsfinder.h.

const double smash::ScatterActionsFinder::elastic_parameter_
private

Elastic cross section parameter (in mb).

Definition at line 228 of file scatteractionsfinder.h.

const int smash::ScatterActionsFinder::testparticles_
private

Number of test particles.

Definition at line 230 of file scatteractionsfinder.h.

const bool smash::ScatterActionsFinder::isotropic_
private

Do all collisions isotropically.

Definition at line 232 of file scatteractionsfinder.h.

const bool smash::ScatterActionsFinder::two_to_one_
private

Enable 2->1 processes.

Definition at line 234 of file scatteractionsfinder.h.

const ReactionsBitSet smash::ScatterActionsFinder::incl_set_
private

List of included 2<->2 reactions.

Definition at line 236 of file scatteractionsfinder.h.

const double smash::ScatterActionsFinder::low_snn_cut_
private

Elastic collsions between two nucleons with sqrt_s below low_snn_cut_ are excluded.

Definition at line 241 of file scatteractionsfinder.h.

const bool smash::ScatterActionsFinder::strings_switch_
private

Switch to turn off string excitation.

Definition at line 243 of file scatteractionsfinder.h.

const bool smash::ScatterActionsFinder::use_AQM_
private

Switch to control whether to use AQM or not.

Definition at line 245 of file scatteractionsfinder.h.

const bool smash::ScatterActionsFinder::strings_with_probability_
private

Decide whether to implement string fragmentation based on a probability.

Definition at line 247 of file scatteractionsfinder.h.

const NNbarTreatment smash::ScatterActionsFinder::nnbar_treatment_
private

Switch for NNbar reactions.

Definition at line 249 of file scatteractionsfinder.h.

const std::vector<bool>& smash::ScatterActionsFinder::nucleon_has_interacted_
private

Parameter to record whether the nucleon has experienced a collision or not.

Definition at line 254 of file scatteractionsfinder.h.

const int smash::ScatterActionsFinder::N_tot_
private

Record the total number of the nucleons in the two colliding nuclei.

Definition at line 256 of file scatteractionsfinder.h.

const int smash::ScatterActionsFinder::N_proj_
private

Record the number of the nucleons in the projectile.

Definition at line 258 of file scatteractionsfinder.h.

const double smash::ScatterActionsFinder::string_formation_time_
private

Parameter for formation time.

Definition at line 260 of file scatteractionsfinder.h.


The documentation for this class was generated from the following files: