Version: SMASH-2.0
smash::ScatterActionMulti Class Reference

#include <scatteractionmulti.h>

ScatterActionMulti is a special action which takes any number of incoming particles and performs a scattering with the use of the stochastic criterion, producing one or more final-state particles.

Definition at line 23 of file scatteractionmulti.h.

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

Classes

class  InvalidScatterActionMulti
 

Public Member Functions

 ScatterActionMulti (const ParticleList &in_plist, double time)
 Construct a ScatterActionMulti object. More...
 
void generate_final_state () override
 Generate the final-state of the multi-particle scattering process. More...
 
double get_total_weight () const override
 Get the total probability for the reaction (scaled with the cross section scaling factors of the incoming particles). More...
 
double get_partial_weight () const override
 Get the partial probability for the chosen channel (scaled with the cross section scaling factors of the incoming particles). More...
 
void add_possible_reactions (double dt, const double gcell_vol, const MultiParticleReactionsBitSet incl_multi)
 Add all possible multi-particle reactions for the given incoming particles. More...
 
const CollisionBranchList & reaction_channels ()
 Get list of possible reaction channels. More...
 
- Public Member Functions inherited from smash::Action
 Action (const ParticleList &in_part, double time)
 Construct an action object with incoming particles and relative time. More...
 
 Action (const ParticleData &in_part, const ParticleData &out_part, double time, ProcessType type)
 Construct an action object with the incoming particles, relative time, and the already known outgoing particles and type of the process. More...
 
 Action (const ParticleList &in_part, const ParticleList &out_part, double absolute_execution_time, ProcessType type)
 Construct an action object with the incoming particles, absolute time, and the already known outgoing particles and type of the process. More...
 
 Action (const Action &)=delete
 Copying is disabled. Use pointers or create a new Action. More...
 
virtual ~Action ()
 Virtual Destructor. More...
 
bool operator< (const Action &rhs) const
 Determine whether one action takes place before another in time. More...
 
virtual ProcessType get_type () const
 Get the process type. More...
 
template<typename Branch >
void add_process (ProcessBranchPtr< Branch > &p, ProcessBranchList< Branch > &subprocesses, double &total_weight)
 Add a new subprocess. More...
 
template<typename Branch >
void add_processes (ProcessBranchList< Branch > pv, ProcessBranchList< Branch > &subprocesses, double &total_weight)
 Add several new subprocesses at once. More...
 
virtual void perform (Particles *particles, uint32_t id_process)
 Actually perform the action, e.g. More...
 
bool is_valid (const Particles &particles) const
 Check whether the action still applies. More...
 
bool is_pauli_blocked (const Particles &particles, const PauliBlocker &p_bl) const
 Check if the action is Pauli-blocked. More...
 
const ParticleList & incoming_particles () const
 Get the list of particles that go into the action. More...
 
void update_incoming (const Particles &particles)
 Update the incoming particles that are stored in this action to the state they have in the global particle list. More...
 
const ParticleList & outgoing_particles () const
 Get the list of particles that resulted from the action. More...
 
double time_of_execution () const
 Get the time at which the action is supposed to be performed. More...
 
virtual void check_conservation (const uint32_t id_process) const
 Check various conservation laws. More...
 
double sqrt_s () const
 Determine the total energy in the center-of-mass frame [GeV]. More...
 
FourVector total_momentum_of_outgoing_particles () const
 Calculate the total kinetic momentum of the outgoing particles. More...
 
FourVector get_interaction_point () const
 Get the interaction point. More...
 
std::pair< FourVector, FourVectorget_potential_at_interaction_point () const
 Get the skyrme and asymmetry potential at the interaction point. More...
 
void set_stochastic_pos_idx ()
 Setter function that stores a random incoming particle index latter used to determine the interaction point. More...
 

Protected Member Functions

void format_debug_output (std::ostream &out) const override
 
- Protected Member Functions inherited from smash::Action
FourVector total_momentum () const
 Sum of 4-momenta of incoming particles. More...
 
template<typename Branch >
const Branch * choose_channel (const ProcessBranchList< Branch > &subprocesses, double total_weight)
 Decide for a particular final-state channel via Monte-Carlo and return it as a ProcessBranch. More...
 
virtual std::pair< double, double > sample_masses (double kinetic_energy_cm) const
 Sample final-state masses in general X->2 processes (thus also fixing the absolute c.o.m. More...
 
virtual void sample_angles (std::pair< double, double > masses, double kinetic_energy_cm)
 Sample final-state momenta in general X->2 processes (here: using an isotropical angular distribution). More...
 
void sample_2body_phasespace ()
 Sample the full 2-body phase-space (masses, momenta, angles) in the center-of-mass frame for the final state particles. More...
 
virtual void sample_3body_phasespace ()
 Sample the full 3-body phase-space (masses, momenta, angles) in the center-of-mass frame for the final state particles. More...
 
void assign_formation_time_to_outgoing_particles ()
 Assign the formation time to the outgoing particles. More...
 

Private Member Functions

void add_reaction (CollisionBranchPtr p)
 Add a new reaction channel. More...
 
void add_reactions (CollisionBranchList pv)
 Add several new reaction channels at once. More...
 
void annihilation ()
 Perform a n->1 annihilation process. More...
 
void three_to_two ()
 Perform a 3->2 process. More...
 
double probability_three_to_one (const ParticleType &type_out, double dt, const double gcell_vol, const int degen_factor=1) const
 Calculate the probability for a 3m-to-1 reaction according to the stochastic collision criterion (e.g. More...
 
double probability_three_to_two (const ParticleType &type_out1, const ParticleType &type_out2, double dt, const double gcell_vol, const double degen_factor=1.0) const
 Calculate the probability for a 3-to-2 reaction according to the stochastic collision criterion (similar to Cassing:2001ds [14]). More...
 
double calculate_I3 (const double sqrts) const
 Calculate the integration necessary for the three-body phase space. More...
 
double react_degen_factor (const int spin_factor_inc, const int spin_degen_out1, const int spin_degen_out2) const
 Determine the spin degeneracy factor ( \(D_{spin}\)) for the 3->2 reaction. More...
 
bool three_different_pions (const ParticleData &data_a, const ParticleData &data_b, const ParticleData &data_c) const
 Check wether the three incoming particles are π⁺,π⁻,π⁰ in any order. More...
 
bool two_pions_eta (const ParticleData &data_a, const ParticleData &data_b, const ParticleData &data_c) const
 Check wether the three incoming particles are π⁺,π⁻,η or π⁰,π⁰,η in any order. More...
 

Private Attributes

double total_probability_
 Total probability of reaction. More...
 
double partial_probability_
 Partial probability of the chosen outgoing channel. More...
 
CollisionBranchList reaction_channels_
 List of possible collisions. More...
 

Additional Inherited Members

- Static Public Member Functions inherited from smash::Action
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 distinguish it) that appears e.g. More...
 
- Protected Attributes inherited from smash::Action
ParticleList incoming_particles_
 List with data of incoming particles. More...
 
ParticleList outgoing_particles_
 Initially this stores only the PDG codes of final-state particles. More...
 
const double time_of_execution_
 Time at which the action is supposed to be performed (absolute time in the lab frame in fm/c). More...
 
ProcessType process_type_
 type of process More...
 
double box_length_ = -1.0
 Box length: needed to determine coordinates of collision correctly in case of collision through the wall. More...
 
int stochastic_position_idx_ = -1
 This stores a randomly-chosen index to an incoming particle. More...
 

Constructor & Destructor Documentation

◆ ScatterActionMulti()

smash::ScatterActionMulti::ScatterActionMulti ( const ParticleList &  in_plist,
double  time 
)

Construct a ScatterActionMulti object.

Parameters
[in]in_plistList of reaction partners
[in]timeTime at which the action is supposed to take place

Definition at line 19 of file scatteractionmulti.cc.

21  : Action(in_plist, time), total_probability_(0.) {}

Member Function Documentation

◆ generate_final_state()

void smash::ScatterActionMulti::generate_final_state ( )
overridevirtual

Generate the final-state of the multi-particle scattering process.

Assign position and momenta to outgoing particles.

Exceptions
InvalidScatterActionMulti

Implements smash::Action.

Definition at line 242 of file scatteractionmulti.cc.

242  {
243  logg[LScatterActionMulti].debug("Incoming particles: ", incoming_particles_);
244 
245  /* Decide for a particular final state. */
246  const CollisionBranch* proc =
247  choose_channel<CollisionBranch>(reaction_channels_, total_probability_);
248  process_type_ = proc->get_type();
249  outgoing_particles_ = proc->particle_list();
250  partial_probability_ = proc->weight();
251 
252  logg[LScatterActionMulti].debug("Chosen channel: ", process_type_,
254 
255  switch (process_type_) {
257  /* n->1 annihilation */
258  annihilation();
259  break;
261  /* 3->2 scattering */
262  three_to_two();
263  break;
264  default:
265  throw InvalidScatterActionMulti(
266  "ScatterActionMulti::generate_final_state: Invalid process type " +
267  std::to_string(static_cast<int>(process_type_)) + " was requested.");
268  }
269 
270  /* The production point of the new particles. */
271  FourVector middle_point = get_interaction_point();
272 
273  for (ParticleData& new_particle : outgoing_particles_) {
274  // Boost to the computational frame
275  new_particle.boost_momentum(
277  /* Set positions of the outgoing particles */
278  new_particle.set_4position(middle_point);
279  }
280 }
Here is the call graph for this function:

◆ get_total_weight()

double smash::ScatterActionMulti::get_total_weight ( ) const
overridevirtual

Get the total probability for the reaction (scaled with the cross section scaling factors of the incoming particles).

Returns
total probability.

Implements smash::Action.

Definition at line 32 of file scatteractionmulti.cc.

32  {
33  double xsec_scaling = 1.0;
34  for (const ParticleData& in_part : incoming_particles_) {
35  xsec_scaling *= in_part.xsec_scaling_factor();
36  }
37  return total_probability_ * xsec_scaling;
38 }

◆ get_partial_weight()

double smash::ScatterActionMulti::get_partial_weight ( ) const
overridevirtual

Get the partial probability for the chosen channel (scaled with the cross section scaling factors of the incoming particles).

Returns
partial probability.

Implements smash::Action.

Definition at line 40 of file scatteractionmulti.cc.

40  {
41  double xsec_scaling = 1.0;
42  for (const ParticleData& in_part : incoming_particles_) {
43  xsec_scaling *= in_part.xsec_scaling_factor();
44  }
45  return partial_probability_ * xsec_scaling;
46 }

◆ add_possible_reactions()

void smash::ScatterActionMulti::add_possible_reactions ( double  dt,
const double  gcell_vol,
const MultiParticleReactionsBitSet  incl_multi 
)

Add all possible multi-particle reactions for the given incoming particles.

Parameters
[in]dttimestep size
[in]gcell_volgcell_vol grid cell volume
[in]incl_multiWhich multi-particle reactions are enabled?

Definition at line 48 of file scatteractionmulti.cc.

50  {
51  // 3 -> m
52  if (incoming_particles_.size() == 3) {
53  // 3 -> 1
54  if (incl_multi[IncludedMultiParticleReactions::Meson_3to1] == 1) {
56  incoming_particles_[2])) {
57  // 3pi -> omega
58  const ParticleTypePtr type_omega = ParticleType::try_find(0x223);
59  if (type_omega) {
60  add_reaction(make_unique<CollisionBranch>(
61  *type_omega,
62  probability_three_to_one(*type_omega, dt, gcell_vol,
63  type_omega->spin_degeneracy()),
65  }
66  // 3pi -> phi
67  const ParticleTypePtr type_phi = ParticleType::try_find(0x333);
68  if (type_phi) {
69  add_reaction(make_unique<CollisionBranch>(
70  *type_phi,
71  probability_three_to_one(*type_phi, dt, gcell_vol,
72  type_phi->spin_degeneracy()),
74  }
76  incoming_particles_[2])) {
77  // eta2pi -> eta-prime
78  const ParticleTypePtr type_eta_prime = ParticleType::try_find(0x331);
79 
80  int sym_factor_in = 1;
81  if (incoming_particles_[0].type() == incoming_particles_[1].type() ||
82  incoming_particles_[1].type() == incoming_particles_[2].type() ||
83  incoming_particles_[2].type() == incoming_particles_[0].type()) {
84  sym_factor_in = 2; // 2 factorial
85  }
86 
87  if (type_eta_prime) {
88  add_reaction(make_unique<CollisionBranch>(
89  *type_eta_prime,
91  *type_eta_prime, dt, gcell_vol,
92  sym_factor_in * type_eta_prime->spin_degeneracy()),
94  }
95  }
96  }
97  // 3 -> 2
98  if (incl_multi[IncludedMultiParticleReactions::Deuteron_3to2] == 1) {
99  const PdgCode pdg_a = incoming_particles_[0].pdgcode();
100  const PdgCode pdg_b = incoming_particles_[1].pdgcode();
101  const PdgCode pdg_c = incoming_particles_[2].pdgcode();
102  const ParticleTypePtr type_deuteron =
104  const ParticleTypePtr type_anti_deuteron =
106 
107  const int spin_factor_inc = pdg_a.spin_degeneracy() *
108  pdg_b.spin_degeneracy() *
109  pdg_c.spin_degeneracy();
110 
111  if (type_deuteron && type_anti_deuteron) {
112  // πpn → πd
113  if ((pdg_a.is_pion() && pdg_b == pdg::p && pdg_c == pdg::n) ||
114  (pdg_a.is_pion() && pdg_b == pdg::n && pdg_c == pdg::p) ||
115  (pdg_a == pdg::p && pdg_b.is_pion() && pdg_c == pdg::n) ||
116  (pdg_a == pdg::n && pdg_b.is_pion() && pdg_c == pdg::p) ||
117  (pdg_a == pdg::p && pdg_b == pdg::n && pdg_c.is_pion()) ||
118  (pdg_a == pdg::n && pdg_b == pdg::p && pdg_c.is_pion())) {
119  // Get type of incoming π
120  ParticleList::iterator it = std::find_if(
122  [](ParticleData x) { return x.is_pion(); });
123  const ParticleType& type_pi = it->type();
124 
125  const double spin_degn =
126  react_degen_factor(spin_factor_inc, type_pi.spin_degeneracy(),
127  type_deuteron->spin_degeneracy());
128 
129  add_reaction(make_unique<CollisionBranch>(
130  type_pi, *type_deuteron,
131  probability_three_to_two(type_pi, *type_deuteron, dt, gcell_vol,
132  spin_degn),
134  }
135 
136  // πp̅n̅ → πd̅
137  if ((pdg_a.is_pion() && pdg_b == -pdg::p && pdg_c == -pdg::n) ||
138  (pdg_a.is_pion() && pdg_b == -pdg::n && pdg_c == -pdg::p) ||
139  (pdg_a == -pdg::p && pdg_b.is_pion() && pdg_c == -pdg::n) ||
140  (pdg_a == -pdg::n && pdg_b.is_pion() && pdg_c == -pdg::p) ||
141  (pdg_a == -pdg::p && pdg_b == -pdg::n && pdg_c.is_pion()) ||
142  (pdg_a == -pdg::n && pdg_b == -pdg::p && pdg_c.is_pion())) {
143  // Get type of incoming π
144  ParticleList::iterator it = std::find_if(
146  [](ParticleData x) { return x.is_pion(); });
147  const ParticleType& type_pi = it->type();
148 
149  const double spin_degn =
150  react_degen_factor(spin_factor_inc, type_pi.spin_degeneracy(),
151  type_anti_deuteron->spin_degeneracy());
152 
153  add_reaction(make_unique<CollisionBranch>(
154  type_pi, *type_anti_deuteron,
155  probability_three_to_two(type_pi, *type_anti_deuteron, dt,
156  gcell_vol, spin_degn),
158  }
159 
160  // Nnp → Nd, N̅np → N̅d
161  if ((pdg_a.is_nucleon() && pdg_b == pdg::p && pdg_c == pdg::n) ||
162  (pdg_a.is_nucleon() && pdg_b == pdg::n && pdg_c == pdg::p) ||
163  (pdg_a == pdg::p && pdg_b.is_nucleon() && pdg_c == pdg::n) ||
164  (pdg_a == pdg::n && pdg_b.is_nucleon() && pdg_c == pdg::p) ||
165  (pdg_a == pdg::p && pdg_b == pdg::n && pdg_c.is_nucleon()) ||
166  (pdg_a == pdg::n && pdg_b == pdg::p && pdg_c.is_nucleon())) {
167  int symmetry_factor = 1; // already true for N̅np → N̅d case
168 
169  ParticleList::iterator it =
170  std::find_if(incoming_particles_.begin(),
171  incoming_particles_.end(), [](ParticleData x) {
172  return x.pdgcode().antiparticle_sign() == -1;
173  });
174  if (it == incoming_particles_.end()) {
175  /* Meaning no anti-N found by find_if,
176  * therefore not N̅np → N̅d, but Nnp → Nd. */
177  symmetry_factor = 2; // for Nnp → Nd (2 factorial)
178  // It is already clear here that we have a double of two N
179  if (pdg_a == pdg_b) {
180  it = incoming_particles_.begin();
181  } else {
182  // If a and b are not the double, then c has to be part of it
183  it = incoming_particles_.begin() + 2;
184  }
185  }
186  const ParticleType& type_N = it->type();
187 
188  const double spin_degn =
189  react_degen_factor(spin_factor_inc, type_N.spin_degeneracy(),
190  type_deuteron->spin_degeneracy());
191 
192  add_reaction(make_unique<CollisionBranch>(
193  type_N, *type_deuteron,
194  probability_three_to_two(type_N, *type_deuteron, dt, gcell_vol,
195  symmetry_factor * spin_degn),
197  }
198 
199  // Np̅n̅ → Nd̅, N̅p̅n̅ → N̅d̅
200  if ((pdg_a.is_nucleon() && pdg_b == -pdg::p && pdg_c == -pdg::n) ||
201  (pdg_a.is_nucleon() && pdg_b == -pdg::n && pdg_c == -pdg::p) ||
202  (pdg_a == -pdg::p && pdg_b.is_nucleon() && pdg_c == -pdg::n) ||
203  (pdg_a == -pdg::n && pdg_b.is_nucleon() && pdg_c == -pdg::p) ||
204  (pdg_a == -pdg::p && pdg_b == -pdg::n && pdg_c.is_nucleon()) ||
205  (pdg_a == -pdg::n && pdg_b == -pdg::p && pdg_c.is_nucleon())) {
206  int symmetry_factor = 1; // already true for Np̅n̅ → Nd̅ case
207 
208  ParticleList::iterator it =
209  std::find_if(incoming_particles_.begin(),
210  incoming_particles_.end(), [](ParticleData x) {
211  return x.pdgcode().antiparticle_sign() == 1;
212  });
213  if (it == incoming_particles_.end()) {
214  /* Meaning no N found by find_if,
215  * therefore not Np̅n̅ → Nd̅, but N̅p̅n̅ → N̅d̅. */
216  symmetry_factor = 2; // for N̅p̅n̅ → N̅d̅ (2 factorial)
217  // It is already clear here that we have a double of two N̅
218  if (pdg_a == pdg_b) {
219  it = incoming_particles_.begin();
220  } else {
221  // If a and b are not the double, then c has to be part of it
222  it = incoming_particles_.begin() + 2;
223  }
224  }
225  const ParticleType& type_N = it->type();
226 
227  const double spin_degn =
228  react_degen_factor(spin_factor_inc, type_N.spin_degeneracy(),
229  type_anti_deuteron->spin_degeneracy());
230 
231  add_reaction(make_unique<CollisionBranch>(
232  type_N, *type_anti_deuteron,
233  probability_three_to_two(type_N, *type_anti_deuteron, dt,
234  gcell_vol, symmetry_factor * spin_degn),
236  }
237  }
238  }
239  }
240 }
Here is the call graph for this function:

◆ reaction_channels()

const CollisionBranchList& smash::ScatterActionMulti::reaction_channels ( )
inline

Get list of possible reaction channels.

Returns
list of possible reaction channels.

Definition at line 72 of file scatteractionmulti.h.

72 { return reaction_channels_; }

◆ format_debug_output()

void smash::ScatterActionMulti::format_debug_output ( std::ostream &  out) const
overrideprotectedvirtual

Writes information about this action to the out stream.

Parameters
[out]outout stream to be written to

Implements smash::Action.

Definition at line 413 of file scatteractionmulti.cc.

413  {
414  out << "MultiParticleScatter of " << incoming_particles_;
415  if (outgoing_particles_.empty()) {
416  out << " (not performed)";
417  } else {
418  out << " to " << outgoing_particles_;
419  }
420 }

◆ add_reaction()

void smash::ScatterActionMulti::add_reaction ( CollisionBranchPtr  p)
private

Add a new reaction channel.

Parameters
[in]pChannel to be added.

Definition at line 23 of file scatteractionmulti.cc.

23  {
24  add_process<CollisionBranch>(p, reaction_channels_, total_probability_);
25 }
Here is the caller graph for this function:

◆ add_reactions()

void smash::ScatterActionMulti::add_reactions ( CollisionBranchList  pv)
private

Add several new reaction channels at once.

Parameters
[in]pvlist of channels to be added.

Definition at line 27 of file scatteractionmulti.cc.

27  {
28  add_processes<CollisionBranch>(std::move(pv), reaction_channels_,
30 }

◆ annihilation()

void smash::ScatterActionMulti::annihilation ( )
private

Perform a n->1 annihilation process.

Exceptions
InvalidScatterActionMulti

Definition at line 355 of file scatteractionmulti.cc.

355  {
356  if (outgoing_particles_.size() != 1) {
357  std::string s =
358  "Annihilation: "
359  "Incorrect number of particles in final state: ";
360  s += std::to_string(outgoing_particles_.size()) + ".";
361  throw InvalidScatterActionMulti(s);
362  }
363  // Set the momentum of the formed particle in its rest frame.
364  outgoing_particles_[0].set_4momentum(
365  total_momentum_of_outgoing_particles().abs(), 0., 0., 0.);
366  // Make sure to assign formation times before boost to the computational frame
368 
369  logg[LScatterActionMulti].debug("Momentum of the new particle: ",
370  outgoing_particles_[0].momentum());
371 }
Here is the call graph for this function:
Here is the caller graph for this function:

◆ three_to_two()

void smash::ScatterActionMulti::three_to_two ( )
private

Perform a 3->2 process.

Definition at line 373 of file scatteractionmulti.cc.

373  {
375  // Make sure to assign formation times before boost to the computational frame
377  logg[LScatterActionMulti].debug("3->2 scattering:", incoming_particles_,
378  " -> ", outgoing_particles_);
379 }
Here is the call graph for this function:
Here is the caller graph for this function:

◆ probability_three_to_one()

double smash::ScatterActionMulti::probability_three_to_one ( const ParticleType type_out,
double  dt,
const double  gcell_vol,
const int  degen_factor = 1 
) const
private

Calculate the probability for a 3m-to-1 reaction according to the stochastic collision criterion (e.g.

Xu:2004mz [53] (Sec.IIB)).

The formula for the probablilty is not taken from a reference, but derived following the same idea as specified e.g. in the paper above.

\[ P_{3\rightarrow 1} = \frac{\Delta t}{(\Delta^3x)^2} \frac{\pi}{4E_1E_2E_3}\frac{\Gamma_{1\rightarrow3}}{\Phi_3} \mathcal{A}(\sqrt{s}),\]

where \(\Phi_3\) represents the 3-body phase space:

\[\Phi_3 = \frac{1}{(2\pi)^3)}\frac{1}{16M^2}I_3.\]

The defintion for the integral \(I_3\) is given in the documentation of calculate_I3(). Degeneracy and symmetry factors are neglected in the formula, since they are treated as input for the function.

Parameters
[in]type_outtype of outgoing particle
[in]dttimestep size
[in]gcell_volgrid cell volume
[in]degen_factordegeneracy factor for reaction (including symmetry factors)
Returns
probabilty for 3-to-1 reaction

Definition at line 309 of file scatteractionmulti.cc.

311  {
312  const double e1 = incoming_particles_[0].momentum().x0();
313  const double e2 = incoming_particles_[1].momentum().x0();
314  const double e3 = incoming_particles_[2].momentum().x0();
315  const double sqrts = sqrt_s();
316 
317  const double gamma_decay = type_out.get_partial_width(
318  sqrts, {&incoming_particles_[0].type(), &incoming_particles_[1].type(),
319  &incoming_particles_[2].type()});
320 
321  const double I_3 = calculate_I3(sqrts);
322  const double ph_sp_3 =
323  1. / (8 * M_PI * M_PI * M_PI) * 1. / (16 * sqrts * sqrts) * I_3;
324 
325  const double spec_f_val = type_out.spectral_function(sqrts);
326 
327  return dt / (gcell_vol * gcell_vol) * M_PI / (4. * e1 * e2 * e3) *
328  gamma_decay / ph_sp_3 * spec_f_val * std::pow(hbarc, 5.0) *
329  degen_factor;
330 }
Here is the call graph for this function:
Here is the caller graph for this function:

◆ probability_three_to_two()

double smash::ScatterActionMulti::probability_three_to_two ( const ParticleType type_out1,
const ParticleType type_out2,
double  dt,
const double  gcell_vol,
const double  degen_factor = 1.0 
) const
private

Calculate the probability for a 3-to-2 reaction according to the stochastic collision criterion (similar to Cassing:2001ds [14]).

\[ P_{3 \rightarrow 2} = \frac{1}{4E_1E_2E_3} \frac{\Delta t}{\Delta^3 x} \frac{\tilde{\lambda}}{\Phi_38\pi s}\sigma_{2 \rightarrow 3},\]

where \(\Phi_3\) represents the 3-body phase space:

\[\Phi_3 = \frac{1}{(2\pi)^3)}\frac{1}{16M^2}I_3.\]

The defintion for the integral \(I_3\) is given in the documentation of calculate_I3(). Degeneracy and symmetry factors are neglected in the formula, since they are treated as input for the function.

Parameters
[in]type_out1type of outgoing particle 1
[in]type_out2type of outgoing particle 1
[in]dttimestep size
[in]gcell_volgrid cell volume
[in]degen_factordegeneracy factor for reaction (including symmetry factors)
Returns
probabilty for 3-to-2 reaction

Definition at line 332 of file scatteractionmulti.cc.

334  {
335  const double e1 = incoming_particles_[0].momentum().x0();
336  const double e2 = incoming_particles_[1].momentum().x0();
337  const double e3 = incoming_particles_[2].momentum().x0();
338  const double m4 = type_out1.mass();
339  const double m5 = type_out2.mass();
340 
341  const double sqrts = sqrt_s();
342  const double xs =
343  CrossSections::two_to_three_xs(type_out1, type_out2, sqrts) / gev2_mb;
344  const double lamb = lambda_tilde(sqrts * sqrts, m4 * m4, m5 * m5);
345 
346  const double I_3 = calculate_I3(sqrts);
347  const double ph_sp_3 =
348  1. / (8 * M_PI * M_PI * M_PI) * 1. / (16 * sqrts * sqrts) * I_3;
349 
350  return dt / (gcell_vol * gcell_vol) * 1. / (4. * e1 * e2 * e3) * lamb /
351  (ph_sp_3 * 8 * M_PI * sqrts * sqrts) * xs * std::pow(hbarc, 5.0) *
352  degen_factor;
353 }
Here is the call graph for this function:
Here is the caller graph for this function:

◆ calculate_I3()

double smash::ScatterActionMulti::calculate_I3 ( const double  sqrts) const
private

Calculate the integration necessary for the three-body phase space.

The defintion for the integral is given by

\[I_3 = \int dm^2_{23}dm^2_{12} = \int^{(M-m_3)^2}_{(m_1+m_2)^2}[m^2_{23, max}- m^2_{23, min}]dm^2_{12}\]

see PDG book (chapter Kinematics) for defintions of variables. The numbered masses reference the incoming particles and \(M\) the mass of the outgoing particles in this case, since we are looking at the backreaction to the 1-to-3 decay.

Parameters
[in]sqrtscenter of mass energy of incoming particles (= mass of outgoing particle)
Returns
result of integral

Definition at line 282 of file scatteractionmulti.cc.

282  {
283  static Integrator integrate;
284  const double m1 = incoming_particles_[0].effective_mass();
285  const double m2 = incoming_particles_[1].effective_mass();
286  const double m3 = incoming_particles_[2].effective_mass();
287  const double lower_bound = (m1 + m2) * (m1 + m2);
288  const double upper_bound = (sqrts - m3) * (sqrts - m3);
289  const auto result = integrate(lower_bound, upper_bound, [&](double m12_sqr) {
290  const double m12 = std::sqrt(m12_sqr);
291  const double e2_star = (m12_sqr - m1 * m1 + m2 * m2) / (2 * m12);
292  const double e3_star = (sqrts * sqrts - m12_sqr - m3 * m3) / (2 * m12);
293  const double m23_sqr_min =
294  (e2_star + e3_star) * (e2_star + e3_star) -
295  std::pow(std::sqrt(e2_star * e2_star - m2 * m2) +
296  std::sqrt(e3_star * e3_star - m3 * m3),
297  2.0);
298  const double m23_sqr_max =
299  (e2_star + e3_star) * (e2_star + e3_star) -
300  std::pow(std::sqrt(e2_star * e2_star - m2 * m2) -
301  std::sqrt(e3_star * e3_star - m3 * m3),
302  2.0);
303  return m23_sqr_max - m23_sqr_min;
304  });
305 
306  return result;
307 }
Here is the caller graph for this function:

◆ react_degen_factor()

double smash::ScatterActionMulti::react_degen_factor ( const int  spin_factor_inc,
const int  spin_degen_out1,
const int  spin_degen_out2 
) const
inlineprivate

Determine the spin degeneracy factor ( \(D_{spin}\)) for the 3->2 reaction.

\[D_{spin} = \frac{(2J_{out1}+1)(2J_{out2}+1)} {(2J_{in1}+1)(2J_{in2}+1)(2J_{in3}+1)}\]

Parameters
[in]spin_factor_incproduct of incoming spin degeneracy (denominator in above expression)
[in]spin_degen_out1degeneracy factor of outgoing particle 1
[in]spin_degen_out2degeneracy factor of outgoing particle 2
Returns
spin degeneracy factor

Definition at line 200 of file scatteractionmulti.h.

202  {
203  return static_cast<double>(spin_degen_out1 * spin_degen_out2) /
204  static_cast<double>(spin_factor_inc);
205  }
Here is the caller graph for this function:

◆ three_different_pions()

bool smash::ScatterActionMulti::three_different_pions ( const ParticleData data_a,
const ParticleData data_b,
const ParticleData data_c 
) const
private

Check wether the three incoming particles are π⁺,π⁻,π⁰ in any order.

Wrapper for unwieldy if statment.

Parameters
[in]data_adata for first incoming particle
[in]data_bdata for second incoming particle
[in]data_cdata for third incoming particle
Returns
true if combination of π⁺,π⁻,π⁰

Definition at line 381 of file scatteractionmulti.cc.

383  {
384  // We want a combination of pi+, pi- and pi0
385  const PdgCode pdg_a = data_a.pdgcode();
386  const PdgCode pdg_b = data_b.pdgcode();
387  const PdgCode pdg_c = data_c.pdgcode();
388 
389  return (pdg_a.is_pion() && pdg_b.is_pion() && pdg_c.is_pion()) &&
390  (pdg_a != pdg_b && pdg_b != pdg_c && pdg_c != pdg_a);
391 }
Here is the call graph for this function:
Here is the caller graph for this function:

◆ two_pions_eta()

bool smash::ScatterActionMulti::two_pions_eta ( const ParticleData data_a,
const ParticleData data_b,
const ParticleData data_c 
) const
private

Check wether the three incoming particles are π⁺,π⁻,η or π⁰,π⁰,η in any order.

Wrapper for unwieldy if statment.

Parameters
[in]data_adata for first incoming particle
[in]data_bdata for second incoming particle
[in]data_cdata for third incoming particle
Returns
true if combination of π⁺,π⁻,η or π⁰,π⁰,η

Definition at line 393 of file scatteractionmulti.cc.

395  {
396  // We want a combination of pi0, pi0 and eta or pi+, pi- and eta
397  const PdgCode pdg_a = data_a.pdgcode();
398  const PdgCode pdg_b = data_b.pdgcode();
399  const PdgCode pdg_c = data_c.pdgcode();
400 
401  return (pdg_a == pdg::pi_z && pdg_b == pdg::pi_z && pdg_c == pdg::eta) ||
402  (pdg_a == pdg::pi_z && pdg_b == pdg::eta && pdg_c == pdg::pi_z) ||
403  (pdg_a == pdg::eta && pdg_b == pdg::pi_z && pdg_c == pdg::pi_z) ||
404 
405  (pdg_a == pdg::eta && pdg_b == pdg::pi_m && pdg_c == pdg::pi_p) ||
406  (pdg_a == pdg::eta && pdg_b == pdg::pi_p && pdg_c == pdg::pi_m) ||
407  (pdg_a == pdg::pi_m && pdg_b == pdg::pi_p && pdg_c == pdg::eta) ||
408  (pdg_a == pdg::pi_m && pdg_b == pdg::eta && pdg_c == pdg::pi_p) ||
409  (pdg_a == pdg::pi_p && pdg_b == pdg::pi_m && pdg_c == pdg::eta) ||
410  (pdg_a == pdg::pi_p && pdg_b == pdg::eta && pdg_c == pdg::pi_m);
411 }
Here is the call graph for this function:
Here is the caller graph for this function:

Member Data Documentation

◆ total_probability_

double smash::ScatterActionMulti::total_probability_
private

Total probability of reaction.

Definition at line 233 of file scatteractionmulti.h.

◆ partial_probability_

double smash::ScatterActionMulti::partial_probability_
private

Partial probability of the chosen outgoing channel.

Definition at line 236 of file scatteractionmulti.h.

◆ reaction_channels_

CollisionBranchList smash::ScatterActionMulti::reaction_channels_
private

List of possible collisions.

Definition at line 239 of file scatteractionmulti.h.


The documentation for this class was generated from the following files:
smash::Action::lambda_tilde
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 ...
Definition: action.h:310
smash::Action::incoming_particles_
ParticleList incoming_particles_
List with data of incoming particles.
Definition: action.h:326
smash::Action::assign_formation_time_to_outgoing_particles
void assign_formation_time_to_outgoing_particles()
Assign the formation time to the outgoing particles.
Definition: action.cc:183
smash::Action::sample_2body_phasespace
void sample_2body_phasespace()
Sample the full 2-body phase-space (masses, momenta, angles) in the center-of-mass frame for the fina...
Definition: action.cc:297
smash::PdgCode::from_decimal
static PdgCode from_decimal(const int pdgcode_decimal)
Construct PDG code from decimal number.
Definition: pdgcode.h:267
smash::ProcessType::MultiParticleThreeToTwo
smash::pdg::eta
constexpr int eta
η.
Definition: pdgcode_constants.h:78
smash::hbarc
constexpr double hbarc
GeV <-> fm conversion factor.
Definition: constants.h:25
smash::gev2_mb
constexpr double gev2_mb
GeV^-2 <-> mb conversion factor.
Definition: constants.h:31
smash::pdg::pi_z
constexpr int pi_z
π⁰.
Definition: pdgcode_constants.h:64
smash::logg
std::array< einhard::Logger<>, std::tuple_size< LogArea::AreaTuple >::value > logg
An array that stores all pre-configured Logger objects.
Definition: logging.cc:39
smash::ScatterActionMulti::probability_three_to_one
double probability_three_to_one(const ParticleType &type_out, double dt, const double gcell_vol, const int degen_factor=1) const
Calculate the probability for a 3m-to-1 reaction according to the stochastic collision criterion (e....
Definition: scatteractionmulti.cc:309
Deuteron_3to2
Definition: forwarddeclarations.h:236
smash::ScatterActionMulti::calculate_I3
double calculate_I3(const double sqrts) const
Calculate the integration necessary for the three-body phase space.
Definition: scatteractionmulti.cc:282
smash::ProcessType::MultiParticleThreeMesonsToOne
multi particle scattering
smash::integrate
static Integrator integrate
Definition: decaytype.cc:144
smash::ScatterActionMulti::add_reaction
void add_reaction(CollisionBranchPtr p)
Add a new reaction channel.
Definition: scatteractionmulti.cc:23
smash::ScatterActionMulti::partial_probability_
double partial_probability_
Partial probability of the chosen outgoing channel.
Definition: scatteractionmulti.h:236
smash::pdg::decimal_antid
constexpr int decimal_antid
Anti-deuteron in decimal digits.
Definition: pdgcode_constants.h:95
smash::Action::process_type_
ProcessType process_type_
type of process
Definition: action.h:343
smash::ScatterActionMulti::react_degen_factor
double react_degen_factor(const int spin_factor_inc, const int spin_degen_out1, const int spin_degen_out2) const
Determine the spin degeneracy factor ( ) for the 3->2 reaction.
Definition: scatteractionmulti.h:200
smash::pdg::decimal_d
constexpr int decimal_d
Deuteron in decimal digits.
Definition: pdgcode_constants.h:93
smash::Action::total_momentum_of_outgoing_particles
FourVector total_momentum_of_outgoing_particles() const
Calculate the total kinetic momentum of the outgoing particles.
Definition: action.cc:152
smash::LScatterActionMulti
static constexpr int LScatterActionMulti
Definition: scatteractionmulti.cc:17
smash::ParticleType::try_find
static const ParticleTypePtr try_find(PdgCode pdgcode)
Returns the ParticleTypePtr for the given pdgcode.
Definition: particletype.cc:89
smash::Action::outgoing_particles_
ParticleList outgoing_particles_
Initially this stores only the PDG codes of final-state particles.
Definition: action.h:334
smash::Action::sqrt_s
double sqrt_s() const
Determine the total energy in the center-of-mass frame [GeV].
Definition: action.h:266
smash::ScatterActionMulti::two_pions_eta
bool two_pions_eta(const ParticleData &data_a, const ParticleData &data_b, const ParticleData &data_c) const
Check wether the three incoming particles are π⁺,π⁻,η or π⁰,π⁰,η in any order.
Definition: scatteractionmulti.cc:393
smash::Action::Action
Action(const ParticleList &in_part, double time)
Construct an action object with incoming particles and relative time.
Definition: action.h:44
smash::Action::get_interaction_point
FourVector get_interaction_point() const
Get the interaction point.
Definition: action.cc:67
smash::pdg::p
constexpr int p
Proton.
Definition: pdgcode_constants.h:28
smash::pdg::n
constexpr int n
Neutron.
Definition: pdgcode_constants.h:30
smash::ScatterActionMulti::total_probability_
double total_probability_
Total probability of reaction.
Definition: scatteractionmulti.h:233
smash::ScatterActionMulti::three_to_two
void three_to_two()
Perform a 3->2 process.
Definition: scatteractionmulti.cc:373
smash::ScatterActionMulti::probability_three_to_two
double probability_three_to_two(const ParticleType &type_out1, const ParticleType &type_out2, double dt, const double gcell_vol, const double degen_factor=1.0) const
Calculate the probability for a 3-to-2 reaction according to the stochastic collision criterion (simi...
Definition: scatteractionmulti.cc:332
smash::pdg::pi_m
constexpr int pi_m
π⁻.
Definition: pdgcode_constants.h:66
smash::ScatterActionMulti::three_different_pions
bool three_different_pions(const ParticleData &data_a, const ParticleData &data_b, const ParticleData &data_c) const
Check wether the three incoming particles are π⁺,π⁻,π⁰ in any order.
Definition: scatteractionmulti.cc:381
smash::pdg::pi_p
constexpr int pi_p
π⁺.
Definition: pdgcode_constants.h:62
Meson_3to1
Definition: forwarddeclarations.h:235
smash::ScatterActionMulti::reaction_channels_
CollisionBranchList reaction_channels_
List of possible collisions.
Definition: scatteractionmulti.h:239
smash::ScatterActionMulti::annihilation
void annihilation()
Perform a n->1 annihilation process.
Definition: scatteractionmulti.cc:355
smash::CrossSections::two_to_three_xs
static double two_to_three_xs(const ParticleType &type_in1, const ParticleType &type_in2, double sqrts)
Determine 2->3 cross section for the scattering of the given particle types.
Definition: crosssections.cc:896