14 #include "Pythia8/Pythia.h"
31 bool isotropic,
double string_formation_time,
33 :
Action({in_part_a, in_part_b}, time),
34 total_cross_section_(0.),
35 isotropic_(isotropic),
36 string_formation_time_(string_formation_time) {
37 box_length_ = box_length;
95 "ScatterAction::generate_final_state: Invalid process type " +
96 std::to_string(
static_cast<int>(
process_type_)) +
" was requested. " +
103 new_particle.boost_momentum(
107 new_particle.set_4position(middle_point);
113 double elastic_parameter,
bool two_to_one,
ReactionsBitSet included_2to2,
115 bool strings_switch,
bool use_AQM,
bool strings_with_probability,
116 NNbarTreatment nnbar_treatment,
double scale_xs,
double additional_el_xs) {
120 elastic_parameter, two_to_one, included_2to2, included_multi, low_snn_cut,
121 strings_switch, use_AQM, strings_with_probability, nnbar_treatment,
133 if (!strings_with_probability &&
158 return (1. / std::sqrt(1.0 -
beta_cm().sqr()));
179 const double lamb =
lambda_tilde(m_s, m1 * m1, m2 * m2);
198 " position difference [fm]: ", pos_diff,
199 ", momentum difference [GeV]: ", mom_diff);
201 const double dp2 = mom_diff.
sqr();
202 const double dr2 = pos_diff.
sqr();
207 const double dpdr = pos_diff * mom_diff;
217 const double result = dr2 - dpdr * dpdr / dp2;
218 return result > 0.0 ? result : 0.0;
227 const double mom_diff_sqr =
229 const double x_sqr = delta_x.
sqr();
237 const double p_a_dot_x = p_a.
momentum().
Dot(delta_x);
238 const double p_b_dot_x = p_b.
momentum().
Dot(delta_x);
243 (p_a_sqr * std::pow(p_b_dot_x, 2) + p_b_sqr * std::pow(p_a_dot_x, 2) -
244 2 * p_a_dot_p_b * p_a_dot_x * p_b_dot_x) /
245 (std::pow(p_a_dot_p_b, 2) - p_a_sqr * p_b_sqr);
246 return b_sqr > 0.0 ? b_sqr : 0.0;
265 return 5.5 * p8 / (7.7 + p8);
267 return std::min(9.0, 5.334 + 0.67 * (plab - 2.));
284 }
else if (plab < 0.6) {
285 return 16.53 * (plab - 0.225);
286 }
else if (plab < 1.6) {
287 return -1.63 * plab + 7.16;
294 double kinetic_energy_cm) {
317 const double mass_a = masses.first;
318 const double mass_b = masses.second;
320 const std::array<double, 2> t_range = get_t_range<double>(
321 kinetic_energy_cm, mass_in_a, mass_in_b, mass_a, mass_b);
327 double mandelstam_s_new = 0.;
343 double bb, a, plab =
plab_from_s(mandelstam_s_new);
350 a = (plab < 0.8) ? 1. : 0.64 / (plab * plab);
360 t = t_range[0] + t_range[1] - t;
364 1. - 2. * (t - t_range[0]) / (t_range[1] - t_range[0]));
377 t = t_range[0] + t_range[1] - t;
380 1. - 2. * (t - t_range[0]) / (t_range[1] - t_range[0]));
384 const std::array<double, 4>
p{1.46434, 5.80311, -6.89358, 1.94302};
385 const double a =
p[0] + mass_a * (
p[1] + mass_a * (
p[2] + mass_a *
p[3]));
389 double t = t_range[0];
394 t = t_range[0] + t_range[1] - t;
397 1. - 2. * (t - t_range[0]) / (t_range[1] - t_range[0]));
410 const double p_f =
pCM(kinetic_energy_cm, mass_a, mass_b);
413 " radial momentum: ", p_f);
453 "resonance_formation: "
454 "Incorrect number of particles in final state: ";
478 out_mom += data.momentum();
481 logg[
LPythia].debug(
"Outgoing momenta string:", out_mom);
496 bool success =
false;
498 const int ntry_max = 10000;
499 while (!success && ntry < ntry_max) {
526 logg[
LPythia].error(
"Unknown string process required.");
530 if (ntry == ntry_max) {
535 bool success_newtry =
false;
551 while (!success_newtry && ntry_new < ntry_max) {
560 if (success_newtry) {
564 if (!success_newtry) {
585 out <<
" (not performed)";
Action is the base class for a generic process that takes a number of incoming particles and transfor...
void sample_2body_phasespace()
Sample the full 2-body phase-space (masses, momenta, angles) in the center-of-mass frame for the fina...
FourVector total_momentum_of_outgoing_particles() const
Calculate the total kinetic momentum of the outgoing particles.
void assign_formation_time_to_outgoing_particles()
Assign the formation time to the outgoing particles.
std::pair< FourVector, FourVector > get_potential_at_interaction_point() const
Get the skyrme and asymmetry potential at the interaction point.
ParticleList outgoing_particles_
Initially this stores only the PDG codes of final-state particles.
FourVector total_momentum() const
Sum of 4-momenta of incoming particles.
virtual void sample_manybody_phasespace()
Sample the full n-body phase-space (masses, momenta, angles) in the center-of-mass frame for the fina...
const double time_of_execution_
Time at which the action is supposed to be performed (absolute time in the lab frame in fm/c).
const ParticleList & incoming_particles() const
Get the list of particles that go into the action.
double sqrt_s() const
Determine the total energy in the center-of-mass frame [GeV].
ParticleList incoming_particles_
List with data of incoming particles.
FourVector get_interaction_point() const
Get the interaction point.
static double lambda_tilde(double a, double b, double c)
Little helper function that calculates the lambda function (sometimes written with a tilde to better ...
ProcessType process_type_
type of process
Angles provides a common interface for generating directions: i.e., two angles that should be interpr...
ThreeVector threevec() const
void distribute_isotropically()
Populate the object with a new direction.
CollisionBranch is a derivative of ProcessBranch, which is used to represent particular final-state c...
ProcessType get_type() const override
The cross section class assembels everything that is needed to calculate the cross section and return...
double string_probability(bool strings_switch, bool use_transition_probability, bool use_AQM, bool treat_nnbar_with_strings) const
double high_energy() const
Determine the parametrized total cross section at high energies for the given collision,...
CollisionBranchList string_excitation(double total_string_xs, StringProcess *string_process, bool use_AQM) const
Determine the cross section for string excitations, which is given by the difference between the para...
CollisionBranchList generate_collision_list(double elastic_parameter, bool two_to_one_switch, ReactionsBitSet included_2to2, MultiParticleReactionsBitSet included_multi, double low_snn_cut, bool strings_switch, bool use_AQM, bool strings_with_probability, NNbarTreatment nnbar_treatment, StringProcess *string_process, double scale_xs, double additional_el_xs) const
Generate a list of all possible collisions between the incoming particles with the given c....
Guard type that safely disables floating point traps for the scope in which it is placed.
The FourVector class holds relevant values in Minkowski spacetime with (+, −, −, −) metric signature.
double sqr() const
calculate the square of the vector (which is a scalar)
ThreeVector threevec() const
double Dot(const FourVector &a) const
calculate the scalar product with another four-vector
ThreeVector velocity() const
Get the velocity (3-vector divided by zero component).
ParticleData contains the dynamic information of a certain particle.
PdgCode pdgcode() const
Get the pdgcode of the 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.
const FourVector & momentum() const
Get the particle's 4-momentum.
void boost(const ThreeVector &v)
Apply a full Lorentz boost of momentum and position.
const FourVector & position() const
Get the particle's position in Minkowski space.
int32_t charge() const
The charge of the particle.
bool is_Deltastar() const
PdgCode stores a Particle Data Group Particle Numbering Scheme particle type number.
int antiparticle_sign() const
int baryon_number() const
ParticleList particle_list() const
Thrown when ScatterAction is called to perform with unknown ProcessType.
bool isotropic_
Do this collision isotropically?
void add_collision(CollisionBranchPtr p)
Add a new collision channel.
void resonance_formation()
Perform a 2->1 resonance-formation process.
ThreeVector beta_cm() const
Get the velocity of the center of mass of the scattering/incoming particles in the calculation frame.
double partial_cross_section_
Partial cross-section to the chosen outgoing channel.
double relative_velocity() const
Get the relative velocity of the two incoming particles.
double mandelstam_s() const
Determine the Mandelstam s variable,.
double get_partial_weight() const override
Get the partial cross section of the chosen channel.
StringProcess * string_process_
Pointer to interface class for strings.
void create_string_final_state()
Creates the final states for string-processes after they are performed.
double cm_momentum_squared() const
Get the squared momentum of the center of mass of the incoming particles in the calculation frame.
void generate_final_state() override
Generate the final-state of the scattering process.
void two_to_many_scattering()
Perform an inelastic two-to-many-body scattering (more than 2)
double get_total_weight() const override
Get the total cross section of scattering particles.
void string_excitation()
Todo(ryu): document better - it is not really UrQMD-based, isn't it? Perform the UrQMD-based string e...
void elastic_scattering()
Perform an elastic two-body scattering, i.e. just exchange momentum.
void inelastic_scattering()
Perform an inelastic two-body scattering, i.e. new particles are formed.
ScatterAction(const ParticleData &in_part1, const ParticleData &in_part2, double time, bool isotropic=false, double string_formation_time=1.0, double box_length=-1.0)
Construct a ScatterAction object.
void sample_angles(std::pair< double, double > masses, double kinetic_energy_cm) override
Sample final-state angles in a 2->2 collision (possibly anisotropic).
void add_collisions(CollisionBranchList pv)
Add several new collision channels at once.
double total_cross_section_
Total hadronic cross section.
double gamma_cm() const
Get the gamma factor corresponding to a boost to the center of mass frame of the colliding particles.
double cm_momentum() const
Get the momentum of the center of mass of the incoming particles in the calculation frame.
double cov_transverse_distance_sqr() const
Calculate the transverse distance of the two incoming particles in their local rest frame written in ...
void add_all_scatterings(double elastic_parameter, bool two_to_one, ReactionsBitSet included_2to2, MultiParticleReactionsBitSet included_multi, double low_snn_cut, bool strings_switch, bool use_AQM, bool strings_with_probability, NNbarTreatment nnbar_treatment, double scale_xs, double additional_el_xs)
Add all possible scattering subprocesses for this action object.
virtual double cross_section() const
Get the total cross section of the scattering particles.
CollisionBranchList collision_channels_
List of possible collisions.
double transverse_distance_sqr() const
Calculate the transverse distance of the two incoming particles in their local rest frame.
bool next_SDiff(bool is_AB_to_AX)
Single-diffractive process is based on single pomeron exchange described in Ingelman:1984ns .
bool next_NDiffSoft()
Soft Non-diffractive process is modelled in accordance with dual-topological approach Capella:1978ig ...
bool next_DDiff()
Double-diffractive process ( A + B -> X + X ) is similar to the single-diffractive process,...
ParticleList get_final_state()
a function to get the final state particle list which is called after the collision
bool next_BBbarAnn()
Baryon-antibaryon annihilation process Based on what UrQMD Bass:1998ca , Bleicher:1999xi does,...
void init(const ParticleList &incoming, double tcoll)
initialization feed intial particles, time of collision and gamma factor of the center of mass.
bool next_NDiffHard()
Hard Non-diffractive process is based on PYTHIA 8 with partonic showers and interactions.
The ThreeVector class represents a physical three-vector with the components .
void rotate_z_axis_to(ThreeVector &r)
Rotate the z-axis onto the vector r.
Collection of useful constants that are known at compile time.
std::bitset< 10 > ReactionsBitSet
Container for the 2 to 2 reactions in the code.
NNbarTreatment
Treatment of N Nbar Annihilation.
@ Strings
Use string fragmentation.
std::bitset< 4 > MultiParticleReactionsBitSet
Container for the n to m reactions in the code.
std::array< einhard::Logger<>, std::tuple_size< LogArea::AreaTuple >::value > logg
An array that stores all pre-configured Logger objects.
void format_debug_output(std::ostream &out) const override
Writes information about this scatter action to the out stream.
T power(T n, T xMin, T xMax)
Draws a random number according to a power-law distribution ~ x^n.
T expo(T A, T x1, T x2)
Draws a random number x from an exponential distribution exp(A*x), where A is assumed to be positive,...
double plab_from_s(double mandelstam_s, double mass)
Convert Mandelstam-s to p_lab in a fixed-target collision.
static double Cugnon_bnp(double plab)
Computes the B coefficients from the Cugnon parametrization of the angular distribution in elastic np...
T pCM(const T sqrts, const T mass_a, const T mass_b) noexcept
T pCM_sqr(const T sqrts, const T mass_a, const T mass_b) noexcept
@ FailedString
Soft String NNbar annihilation process can fail by lack of energy.
@ TwoToOne
resonance formation (2->1)
@ StringSoftDoubleDiffractive
double diffractive. Two strings are formed, one from A and one from B.
@ TwoToFive
2->5 scattering
@ StringSoftSingleDiffractiveXB
single diffractive AB->XB.
@ TwoToTwo
2->2 inelastic scattering
@ Elastic
elastic scattering: particles remain the same, only momenta change
@ TwoToFour
2->4 scattering
@ StringSoftAnnihilation
a special case of baryon-antibaryon annihilation.
@ StringSoftNonDiffractive
non-diffractive. Two strings are formed both have ends in A and B.
@ StringSoftSingleDiffractiveAX
(41-45) soft string excitations.
@ StringHard
hard string process involving 2->2 QCD process by PYTHIA.
@ TwoToThree
2->3 scattering
constexpr double nucleon_mass
Nucleon mass in GeV.
constexpr T pow_int(const T base, unsigned const exponent)
Efficient template for calculating integer powers using squaring.
T pCM_from_s(const T s, const T mass_a, const T mass_b) noexcept
constexpr double really_small
Numerical error tolerance.
static constexpr int LScatterAction
static constexpr int LPythia
bool is_string_soft_process(ProcessType p)
Check if a given process type is a soft string excitation.
static double Cugnon_bpp(double plab)
Computes the B coefficients from the Cugnon parametrization of the angular distribution in elastic pp...