10 #ifndef SRC_INCLUDE_SMASH_STRINGPROCESS_H_ 
   11 #define SRC_INCLUDE_SMASH_STRINGPROCESS_H_ 
   19 #include "Pythia8/Pythia.h" 
   26 static constexpr 
int LPythia = LogArea::Pythia::id;
 
   65   std::array<FourVector, 2> 
plab_;
 
   67   std::array<FourVector, 2> 
pcom_;
 
  177   typedef std::map<std::pair<int, int>, std::unique_ptr<Pythia8::Pythia>>
 
  247                 double gluon_beta, 
double gluon_pmin,
 
  248                 double quark_alpha, 
double quark_beta,
 
  249                 double strange_supp, 
double diquark_supp,
 
  250                 double sigma_perp, 
double stringz_a_leading,
 
  251                 double stringz_b_leading, 
double stringz_a,
 
  252                 double stringz_b,  
double string_sigma_T,
 
  253                 double factor_t_form,
 
  254                 bool mass_dependent_formation_times,
 
  255                 double prob_proton_to_d_uu,
 
  256                 bool separate_fragment_baryon, 
double popcorn_rate);
 
  279                            double diquark_supp, 
double popcorn_rate,
 
  280                            double stringz_a, 
double stringz_b,
 
  281                            double string_sigma_T);
 
  294     logg[
LPythia].debug(
"pythia_hadron_ : rndm is initialized with seed ",
 
  312     double sqrts_threshold = 2. * (1. + 1.0e-6);
 
  315     const int pdg_a_mod =
 
  316         (std::abs(pdg_a) > 1000) ? pdg_a : 10 * (std::abs(pdg_a) / 10) + 3;
 
  317     const int pdg_b_mod =
 
  318         (std::abs(pdg_b) > 1000) ? pdg_b : 10 * (std::abs(pdg_b) / 10) + 3;
 
  323     if (sqrt_s < sqrts_threshold) {
 
  324       sqrt_s = sqrts_threshold;
 
  390   void init(
const ParticleList &incoming, 
double tcoll);
 
  400                                      std::array<ThreeVector, 3> &evec_basis);
 
  416       const std::array<std::array<int, 2>, 2> &quarks,
 
  417       const std::array<FourVector, 2> &pstr_com,
 
  418       std::array<double, 2> &m_str,
 
  419       std::array<ThreeVector, 2> &evec_str);
 
  432       const std::array<std::array<int, 2>, 2> &quarks,
 
  433       const std::array<FourVector, 2> &pstr_com,
 
  434       const std::array<double, 2> &m_str,
 
  435       const std::array<ThreeVector, 2> &evec_str,
 
  436       bool flip_string_ends, 
bool separate_fragment_baryon);
 
  506                                       std::array<int, 5> &excess_quark,
 
  507                                       std::array<int, 5> &excess_antiq);
 
  530                            std::array<int, 5> &excess_constituent);
 
  546                                      std::array<int, 5> &nquark_total,
 
  547                                      std::array<int, 5> &nantiq_total);
 
  575       std::array<int, 5> &nquark_total, std::array<int, 5> &nantiq_total,
 
  576       bool sign_constituent,
 
  577       std::array<std::array<int, 5>, 2> &excess_constituent);
 
  607                         std::array<std::array<int, 5>, 2> &excess_quark,
 
  608                         std::array<std::array<int, 5>, 2> &excess_antiq);
 
  648                            std::array<std::array<int, 5>, 2> &excess_quark,
 
  649                            std::array<std::array<int, 5>, 2> &excess_antiq);
 
  676                              Pythia8::Event &event_intermediate,
 
  677                              Pythia8::Event &event_hadronize);
 
  710                                Pythia8::Event &event_intermediate,
 
  711                                Pythia8::Event &event_hadronize);
 
  735                          Pythia8::Event &event_intermediate,
 
  736                          Pythia8::Event &event_hadronize);
 
  755                         Pythia8::Event &event) {
 
  757     for (
int ip = 2; ip < 
event.size() - np_end; ip++) {
 
  758       const double y_quark_current = 
event[ip].y();
 
  759       const double y_quark_forward = 
event[iforward].y();
 
  760       if ((find_forward && y_quark_current > y_quark_forward) ||
 
  761           (!find_forward && y_quark_current < y_quark_forward)) {
 
  806                                        ParticleList &intermediate_particles) {
 
  807     const std::string s = std::to_string(pdgid);
 
  813       intermediate_particles.push_back(new_particle);
 
  826     if (pythia_id == 310 || pythia_id == 130) {
 
  866     return Pythia8::Vec4(mom.
x1(), mom.
x2(), mom.
x3(), energy);
 
  881                              std::array<ThreeVector, 3> &evec_basis) {
 
  882     ThreeVector three_momentum = evec_basis[0] * particle.pz() +
 
  883                                  evec_basis[1] * particle.px() +
 
  884                                  evec_basis[2] * particle.py();
 
  885     return FourVector(particle.e(), three_momentum);
 
  907                       bool separate_fragment_baryon,
 
  908                       ParticleList &intermediate_particles);
 
  947                           bool separate_fragment_baryon,
 
  948                           std::array<ThreeVector, 3> &evec_basis,
 
  949                           double &ppos_string, 
double &pneg_string,
 
  950                           double &QTrx_string_pos, 
double &QTrx_string_neg,
 
  951                           double &QTry_string_pos, 
double &QTry_string_neg,
 
  952                           Pythia8::FlavContainer &flav_string_pos,
 
  953                           Pythia8::FlavContainer &flav_string_neg,
 
  954                           std::vector<int> &pdgid_frag,
 
  955                           std::vector<FourVector> &momentum_frag);
 
  997       bool separate_fragment_hadron,
 
  998       double ppos_string, 
double pneg_string,
 
  999       double mTrn_had_forward, 
double mTrn_had_backward,
 
 1000       double &ppos_had_forward, 
double &ppos_had_backward,
 
 1001       double &pneg_had_forward, 
double &pneg_had_backward);
 
 1012   static double sample_zLund(
double a, 
double b, 
double mTrn);
 
 1033       Pythia8::Event &event_fragments, std::array<ThreeVector, 3> &evec_basis,
 
 1034       double ppos_string, 
double pneg_string,
 
 1035       double QTrx_string, 
double QTry_string,
 
 1036       double QTrx_add_pos, 
double QTry_add_pos,
 
 1037       double QTrx_add_neg, 
double QTry_add_neg);
 
 1050       Pythia8::Event &event, std::array<ThreeVector, 3> &evec_basis,
 
 1051       double factor_yrapid, 
double diff_yrapid) {
 
 1052     Pythia8::Vec4 pvec_string_now = Pythia8::Vec4(0., 0., 0., 0.);
 
 1054     for (
int ipyth = 1; ipyth < 
event.size(); ipyth++) {
 
 1055       if (!event[ipyth].isFinal()) {
 
 1060           event[ipyth].e(), event[ipyth].px(),
 
 1061           event[ipyth].py(), event[ipyth].pz());
 
 1062       const double E_frag = p_frag.
x0();
 
 1063       const double pl_frag = p_frag.
threevec() * evec_basis[0];
 
 1064       const double ppos_frag = (E_frag + pl_frag) * M_SQRT1_2;
 
 1065       const double pneg_frag = (E_frag - pl_frag) * M_SQRT1_2;
 
 1066       const double mTrn_frag = std::sqrt(2. * ppos_frag * pneg_frag);
 
 1068       const double y_frag = 0.5 * std::log(ppos_frag / pneg_frag);
 
 1071       const double y_new_frag = factor_yrapid * y_frag + diff_yrapid;
 
 1073       const double E_new_frag = mTrn_frag * std::cosh(y_new_frag);
 
 1074       const double pl_new_frag = mTrn_frag * std::sinh(y_new_frag);
 
 1076           p_frag.
threevec() + (pl_new_frag - pl_frag) * evec_basis[0];
 
 1077       Pythia8::Vec4 pvec_new_frag = 
set_Vec4(E_new_frag, mom_new_frag);
 
 1078       event[ipyth].p(pvec_new_frag);
 
 1079       pvec_string_now += pvec_new_frag;
 
 1081     event[0].p(pvec_string_now);
 
 1082     event[0].m(pvec_string_now.mCalc());
 
 1101                                          ParticleList& outgoing_particles,
 
 1103                                          double suppression_factor);
 
 1119   static std::pair<int, int> 
find_leading(
int nq1, 
int nq2, ParticleList& list);
 
 1134                                     double suppression_factor);
 
The FourVector class holds relevant values in Minkowski spacetime with (+, −, −, −) metric signature.
 
ThreeVector threevec() const
 
ParticleData contains the dynamic information of a certain particle.
 
void set_4momentum(const FourVector &momentum_vector)
Set the particle's 4-momentum directly.
 
A pointer-like interface to global references to ParticleType objects.
 
static const ParticleTypePtr try_find(PdgCode pdgcode)
Returns the ParticleTypePtr for the given pdgcode.
 
static const ParticleType & find(PdgCode pdgcode)
Returns the ParticleType object for the given pdgcode.
 
PdgCode stores a Particle Data Group Particle Numbering Scheme particle type number.
 
String excitation processes used in SMASH.
 
Pythia8::StringFlav pythia_stringflav_
An object for the flavor selection in string fragmentation in the case of separate fragmentation func...
 
bool remake_kinematics_fragments(Pythia8::Event &event_fragments, std::array< ThreeVector, 3 > &evec_basis, double ppos_string, double pneg_string, double QTrx_string, double QTry_string, double QTrx_add_pos, double QTry_add_pos, double QTrx_add_neg, double QTry_add_neg)
 
bool next_SDiff(bool is_AB_to_AX)
Single-diffractive process is based on single pomeron exchange described in Ingelman:1984ns .
 
pythia_map hard_map_
Map object to contain the different pythia objects.
 
static FourVector reorient(Pythia8::Particle &particle, std::array< ThreeVector, 3 > &evec_basis)
compute the four-momentum properly oriented in the lab frame.
 
void set_pmin_gluon_lightcone(double p_light_cone_min)
set the minimum lightcone momentum scale carried by gluon.
 
Pythia8::SigmaTotal pythia_sigmatot_
An object to compute cross-sections.
 
double pow_fgluon_beta_
parameter  for the gluon distribution function
 
std::map< std::pair< int, int >, std::unique_ptr< Pythia8::Pythia > > pythia_map
Map containing PYTHIA objects for hard string routines.
 
std::array< int, 2 > NpartString_
number of particles fragmented from strings
 
Pythia8::Event event_intermediate_
event record for intermediate partonic state in the hard string routine
 
std::array< PdgCode, 2 > PDGcodes_
PdgCodes of incoming particles.
 
double time_formation_const_
constant proper time in the case of constant formation time [fm]
 
double PNegB_
backward lightcone momentum p^{-} of incoming particle B in CM-frame [GeV]
 
void set_tension_string(double kappa_string)
set the string tension, which is used in append_final_state.
 
void find_junction_leg(bool sign_color, std::vector< int > &col, Pythia8::Event &event_intermediate, Pythia8::Event &event_hadronize)
Identify partons, which are associated with junction legs, from a given PYTHIA event record.
 
double pow_fquark_beta_
parameter  for the quark distribution function
 
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,...
 
static int pdg_map_for_pythia(PdgCode &pdg)
Take pdg code and map onto particle specie which can be handled by PYTHIA.
 
double prob_proton_to_d_uu_
Probability of splitting a nucleon into the quark flavour it has only once and a diquark it has twice...
 
void set_pow_fquark(double alphapow, double betapow)
lightcone momentum fraction of quark is sampled according to probability distribution  in non-diffrac...
 
StringProcess(double string_tension, double time_formation, double gluon_beta, double gluon_pmin, double quark_alpha, double quark_beta, double strange_supp, double diquark_supp, double sigma_perp, double stringz_a_leading, double stringz_b_leading, double stringz_a, double stringz_b, double string_sigma_T, double factor_t_form, bool mass_dependent_formation_times, double prob_proton_to_d_uu, bool separate_fragment_baryon, double popcorn_rate)
Constructor, initializes pythia.
 
FourVector ucomAB_
velocity four vector of the center of mass in the lab frame
 
ThreeVector vcomAB_
velocity three vector of the center of mass in the lab frame
 
bool make_final_state_2strings(const std::array< std::array< int, 2 >, 2 > &quarks, const std::array< FourVector, 2 > &pstr_com, const std::array< double, 2 > &m_str, const std::array< ThreeVector, 2 > &evec_str, bool flip_string_ends, bool separate_fragment_baryon)
Prepare kinematics of two strings, fragment them and append to final_state.
 
void compute_incoming_lightcone_momenta()
compute the lightcone momenta of incoming particles where the longitudinal direction is set to be sam...
 
int fragment_string(int idq1, int idq2, double mString, ThreeVector &evecLong, bool flip_string_ends, bool separate_fragment_baryon, ParticleList &intermediate_particles)
perform string fragmentation to determine species and momenta of hadrons by implementing PYTHIA 8....
 
double popcorn_rate_
popcorn rate
 
double pmin_gluon_lightcone_
the minimum lightcone momentum scale carried by a gluon [GeV]
 
bool splitting_gluon_qqbar(Pythia8::Event &event_intermediate, std::array< int, 5 > &nquark_total, std::array< int, 5 > &nantiq_total, bool sign_constituent, std::array< std::array< int, 5 >, 2 > &excess_constituent)
Take total number of quarks and check if the system has enough constituents that need to be converted...
 
static std::pair< int, int > find_leading(int nq1, int nq2, ParticleList &list)
Find the leading string fragments.
 
double PPosA_
forward lightcone momentum p^{+} of incoming particle A in CM-frame [GeV]
 
double sqrtsAB_
sqrt of Mandelstam variable s of collision [GeV]
 
ParticleList final_state_
final state array which must be accessed after the collision
 
double PNegA_
backward lightcone momentum p^{-} of incoming particle A in CM-frame [GeV]
 
static double sample_zLund(double a, double b, double mTrn)
Sample lightcone momentum fraction according to the LUND fragmentation function.
 
int append_final_state(ParticleList &intermediate_particles, const FourVector &uString, const ThreeVector &evecLong)
compute the formation time and fill the arrays with final-state particles as described in Andersson:1...
 
double soft_t_form_
factor to be multiplied to formation times in soft strings
 
static void make_string_ends(const PdgCode &pdgcode_in, int &idq1, int &idq2, double xi)
make a random selection to determine partonic contents at the string ends.
 
void clear_final_state()
a function that clears the final state particle list which is used for testing mainly
 
std::unique_ptr< Pythia8::Pythia > pythia_hadron_
PYTHIA object used in fragmentation.
 
double massA_
mass of incoming particle A [GeV]
 
void common_setup_pythia(Pythia8::Pythia *pythia_in, double strange_supp, double diquark_supp, double popcorn_rate, double stringz_a, double stringz_b, double string_sigma_T)
Common setup of PYTHIA objects for soft and hard string routines.
 
double PPosB_
forward lightcone momentum p^{+} of incoming particle B in CM-frame [GeV]
 
std::array< ThreeVector, 3 > evecBasisAB_
Orthonormal basis vectors in the center of mass frame, where the 0th one is parallel to momentum of i...
 
int fragment_off_hadron(bool from_forward, bool separate_fragment_baryon, std::array< ThreeVector, 3 > &evec_basis, double &ppos_string, double &pneg_string, double &QTrx_string_pos, double &QTrx_string_neg, double &QTry_string_pos, double &QTry_string_neg, Pythia8::FlavContainer &flav_string_pos, Pythia8::FlavContainer &flav_string_neg, std::vector< int > &pdgid_frag, std::vector< FourVector > &momentum_frag)
Fragment one hadron from a given string configuration if the string mass is above threshold (given by...
 
bool restore_constituent(Pythia8::Event &event_intermediate, std::array< std::array< int, 5 >, 2 > &excess_quark, std::array< std::array< int, 5 >, 2 > &excess_antiq)
Take the intermediate partonic state from PYTHIA event with mapped hadrons and convert constituents i...
 
double string_sigma_T_
transverse momentum spread in string fragmentation
 
ParticleList get_final_state()
a function to get the final state particle list which is called after the collision
 
std::array< double, 3 > cross_sections_diffractive(int pdg_a, int pdg_b, double sqrt_s)
Interface to pythia_sigmatot_ to compute cross-sections of A+B-> different final states Schuler:1993w...
 
static void make_orthonormal_basis(ThreeVector &evec_polar, std::array< ThreeVector, 3 > &evec_basis)
compute three orthonormal basis vectors from unit vector in the longitudinal direction
 
int get_index_forward(bool find_forward, int np_end, Pythia8::Event &event)
Obtain index of the most forward or backward particle in a given PYTHIA event record.
 
static void convert_KaonLS(int &pythia_id)
convert Kaon-L or Kaon-S into K0 or Anti-K0
 
double additional_xsec_supp_
additional cross-section suppression factor to take coherence effect into account.
 
static void assign_all_scaling_factors(int baryon_string, ParticleList &outgoing_particles, const ThreeVector &evecLong, double suppression_factor)
Assign a cross section scaling factor to all outgoing particles.
 
double strange_supp_
strange quark suppression factor
 
std::array< PdgCode, 2 > get_PDGs()
 
static int diquark_from_quarks(int q1, int q2)
Construct diquark from two quarks.
 
bool make_lightcone_final_two(bool separate_fragment_hadron, double ppos_string, double pneg_string, double mTrn_had_forward, double mTrn_had_backward, double &ppos_had_forward, double &ppos_had_backward, double &pneg_had_forward, double &pneg_had_backward)
Determines lightcone momenta of two final hadrons fragmented from a string in the same way as StringF...
 
std::array< FourVector, 2 > get_plab()
 
void replace_constituent(Pythia8::Particle &particle, std::array< int, 5 > &excess_constituent)
Convert a partonic PYTHIA particle into the desired species and update the excess of constituents.
 
double kappa_tension_string_
string tension [GeV/fm]
 
double pow_fquark_alpha_
parameter  for the quark distribution function
 
void shift_rapidity_event(Pythia8::Event &event, std::array< ThreeVector, 3 > &evec_basis, double factor_yrapid, double diff_yrapid)
Shift the momentum rapidity of all particles in a given event record.
 
double stringz_b_leading_
parameter (StringZ:bLund) for the fragmentation function of leading baryon in soft non-diffractive st...
 
static bool append_intermediate_list(int pdgid, FourVector momentum, ParticleList &intermediate_particles)
append new particle from PYTHIA to a specific particle list
 
void set_pow_fgluon(double betapow)
lightcone momentum fraction of gluon is sampled according to probability distribution P(x) = 1/x * (1...
 
bool mass_dependent_formation_times_
Whether the formation time should depend on the mass of the fragment according to Andersson:1983ia  e...
 
double stringz_b_produce_
parameter (StringZ:bLund) for the fragmentation function of other (produced) hadrons in soft non-diff...
 
std::array< FourVector, 2 > get_pcom()
 
bool next_BBbarAnn()
Baryon-antibaryon annihilation process Based on what UrQMD Bass:1998ca , Bleicher:1999xi  does,...
 
int NpartFinal_
total number of final state particles
 
static Pythia8::Vec4 set_Vec4(double energy, const ThreeVector &mom)
Easy setter of Pythia Vec4 from SMASH.
 
void set_sigma_qperp_(double sigma_qperp)
set the average amount of transverse momentum transfer sigma_qperp_.
 
double stringz_a_leading_
parameter (StringZ:aLund) for the fragmentation function of leading baryon in soft non-diffractive st...
 
bool set_mass_and_direction_2strings(const std::array< std::array< int, 2 >, 2 > &quarks, const std::array< FourVector, 2 > &pstr_com, std::array< double, 2 > &m_str, std::array< ThreeVector, 2 > &evec_str)
Determine string masses and directions in which strings are stretched.
 
void init(const ParticleList &incoming, double tcoll)
initialization feed intial particles, time of collision and gamma factor of the center of mass.
 
double sigma_qperp_
Transverse momentum spread of the excited strings.
 
void rearrange_excess(std::array< int, 5 > &nquark_total, std::array< std::array< int, 5 >, 2 > &excess_quark, std::array< std::array< int, 5 >, 2 > &excess_antiq)
Take total number of quarks and check if the system has enough constituents that need to be converted...
 
int get_resonance_from_quark(int idq1, int idq2, double mass)
 
bool next_NDiffHard()
Hard Non-diffractive process is based on PYTHIA 8 with partonic showers and interactions.
 
bool separate_fragment_baryon_
Whether to use a separate fragmentation function for leading baryons.
 
std::array< FourVector, 2 > plab_
momenta of incoming particles in the lab frame [GeV]
 
std::array< FourVector, 2 > pcom_
momenta of incoming particles in the center of mass frame [GeV]
 
double time_collision_
time of collision in the computational frame [fm]
 
int get_hadrontype_from_quark(int idq1, int idq2)
Determines hadron type from valence quark constituents.
 
double diquark_supp_
diquark suppression factor
 
static void find_excess_constituent(PdgCode &pdg_actual, PdgCode &pdg_mapped, std::array< int, 5 > &excess_quark, std::array< int, 5 > &excess_antiq)
Compare the valence quark contents of the actual and mapped hadrons and evaluate how many more consti...
 
double massB_
mass of incoming particle B [GeV]
 
void compose_string_parton(bool find_forward_string, Pythia8::Event &event_intermediate, Pythia8::Event &event_hadronize)
Identify a set of partons, which are connected to form a color-neutral string, from a given PYTHIA ev...
 
void find_total_number_constituent(Pythia8::Event &event_intermediate, std::array< int, 5 > &nquark_total, std::array< int, 5 > &nantiq_total)
Compute how many quarks and antiquarks we have in the system, and update the correspoing arrays with ...
 
double stringz_a_produce_
parameter (StringZ:aLund) for the fragmentation function of other (produced) hadrons in soft non-diff...
 
void init_pythia_hadron_rndm()
Set PYTHIA random seeds to be desired values.
 
static void assign_scaling_factor(int nquark, ParticleData &data, double suppression_factor)
Assign a cross section scaling factor to the given particle.
 
void compose_string_junction(bool &find_forward_string, Pythia8::Event &event_intermediate, Pythia8::Event &event_hadronize)
Identify a set of partons and junction(s), which are connected to form a color-neutral string,...
 
static void quarks_from_diquark(int diquark, int &q1, int &q2, int °_spin)
find two quarks from a diquark.
 
The ThreeVector class represents a physical three-vector  with the components .
 
Collection of useful constants that are known at compile time.
 
std::array< einhard::Logger<>, std::tuple_size< LogArea::AreaTuple >::value > logg
An array that stores all pre-configured Logger objects.
 
T uniform_int(T min, T max)
 
constexpr int maximum_rndm_seed_in_pythia
The maximum value of the random seed used in PYTHIA.
 
static constexpr int LPythia