Version: SMASH-1.5
smash::ScatterActionPhoton Class Reference

#include <scatteractionphoton.h>

ScatterActionPhoton is a special action which takes two incoming particles and performs a perturbative electromagnetic scattering.

The final state particles are not further propagated, only written to the output.

Definition at line 27 of file scatteractionphoton.h.

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

Public Types

enum  ReactionType {
  ReactionType::no_reaction, ReactionType::pi_z_pi_p_rho_p, ReactionType::pi_z_pi_m_rho_m, ReactionType::pi_p_rho_z_pi_p,
  ReactionType::pi_m_rho_z_pi_m, ReactionType::pi_m_rho_p_pi_z, ReactionType::pi_p_rho_m_pi_z, ReactionType::pi_z_rho_p_pi_p,
  ReactionType::pi_z_rho_m_pi_m, ReactionType::pi_p_pi_m_rho_z, ReactionType::pi_z_rho_z_pi_z
}
 Enum for encoding the photon process. More...
 

Public Member Functions

 ScatterActionPhoton (const ParticleList &in, const double time, const int n_frac_photons, const double hadronic_cross_section_input)
 Construct a ScatterActionPhoton object. More...
 
void perform_photons (const OutputsList &outputs)
 Create the photon final state and write to output. More...
 
void generate_final_state () override
 Generate the final-state for the photon scatter process. More...
 
double get_total_weight () const override
 Return the weight of the last created photon. More...
 
double hadronic_cross_section () const
 Return the total cross section of the underlying hadronic scattering. More...
 
double sample_out_hadron_mass (const ParticleTypePtr out_type)
 Sample the mass of the outgoing hadron. More...
 
void add_dummy_hadronic_process (double reaction_cross_section)
 Adds one hadronic process with a given cross-section. More...
 
void add_single_process ()
 Add the photonic process. More...
 
- Public Member Functions inherited from smash::ScatterAction
 ScatterAction (const ParticleData &in_part1, const ParticleData &in_part2, double time, bool isotropic=false, double string_formation_time=1.0)
 Construct a ScatterAction object. More...
 
void add_collision (CollisionBranchPtr p)
 Add a new collision channel. More...
 
void add_collisions (CollisionBranchList pv)
 Add several new collision channels at once. More...
 
double transverse_distance_sqr () const
 Calculate the transverse distance of the two incoming particles in their local rest frame. More...
 
double get_partial_weight () const override
 Get the partial cross section of the chosen channel. More...
 
void sample_angles (std::pair< double, double > masses, double kinetic_energy_cm) override
 Sample final-state angles in a 2->2 collision (possibly anisotropic). More...
 
void add_all_scatterings (double elastic_parameter, bool two_to_one, ReactionsBitSet included_2to2, double low_snn_cut, bool strings_switch, bool use_AQM, bool strings_with_probability, NNbarTreatment nnbar_treatment)
 Add all possible scattering subprocesses for this action object. More...
 
const CollisionBranchList & collision_channels ()
 Get list of possible collision channels. More...
 
void set_string_interface (StringProcess *str_proc)
 Set the StringProcess object to be used. More...
 
virtual double cross_section () const
 Get the total cross section of the scattering particles. 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...
 
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...
 

Static Public Member Functions

static ReactionType photon_reaction_type (const ParticleList &in)
 Determine photon process from incoming particles. More...
 
static bool is_photon_reaction (const ParticleList &in)
 Check if particles can undergo an implemented photon process. More...
 
static ParticleTypePtr outgoing_hadron_type (const ParticleList &in)
 Return ParticleTypePtr of hadron in the out channel, given the incoming particles. More...
 
static ParticleTypePtr outgoing_hadron_type (const ReactionType reaction)
 Return ParticleTypePtr of hadron in the out channel, given the ReactionType. More...
 
static bool is_kinematically_possible (const double s_sqrt, const ParticleList &in)
 Check if CM-energy is sufficient to produce hadron in final state. More...
 

Private Types

enum  MediatorType { MediatorType::SUM, MediatorType::PION, MediatorType::OMEGA }
 Compile-time switch for setting the handling of processes which can happen via different mediating particles. More...
 

Private Member Functions

double diff_cross_section (const double t, const double m_rho, MediatorType mediator=default_mediator_) const
 Calculate the differential cross section of photon process. More...
 
double rho_mass () const
 Find the mass of the participating rho-particle. More...
 
CollisionBranchList photon_cross_sections (MediatorType mediator=default_mediator_)
 Computes the total cross section of the photon process. More...
 
std::pair< double, double > diff_cross_section_single (const double t, const double m_rho)
 For processes which can happen via (pi, a1, rho) and omega exchange, return the differential cross section for the (pi, a1, rho) process in the first argument, for the omega process in the second. More...
 
std::pair< double, double > form_factor_single (const double E_photon)
 For processes which can happen via (pi, a1, rho) and omega exchange, return the form factor for the (pi, a1, rho) process in the first argument, for the omega process in the second. More...
 
double form_factor_pion (const double E_photon) const
 Compute the form factor for a process with a pion as the lightest exchange particle. More...
 
double form_factor_omega (const double E_photon) const
 Compute the form factor for a process with a omega as the lightest exchange particle. More...
 
double diff_cross_section_w_ff (const double t, const double m_rho, const double E_photon)
 Compute the differential cross section with form factors included. More...
 

Private Attributes

CollisionBranchList collision_processes_photons_
 Holds the photon branch. More...
 
const ReactionType reac_
 Photonic process as determined from incoming particles. More...
 
const int number_of_fractional_photons_
 Number of photons created for each hadronic scattering, needed for correct weighting. More...
 
const ParticleTypePtr hadron_out_t_
 ParticleTypePtr to the type of the outgoing hadron. More...
 
const double hadron_out_mass_
 Mass of outgoing hadron. More...
 
double weight_ = 0.0
 Weight of the produced photon. More...
 
double cross_section_photons_ = 0.0
 Total cross section of photonic process. More...
 
const double hadronic_cross_section_
 Total hadronic cross section. More...
 

Static Private Attributes

static constexpr MediatorType default_mediator_ = MediatorType::SUM
 Value used for default exchange particle. See MediatorType. More...
 

Additional Inherited Members

- Protected Member Functions inherited from smash::ScatterAction
double mandelstam_s () const
 Determine the Mandelstam s variable,. More...
 
double cm_momentum () const
 Get the momentum of the center of mass of the incoming particles in the calculation frame. More...
 
double cm_momentum_squared () const
 Get the squared momentum of the center of mass of the incoming particles in the calculation frame. More...
 
ThreeVector beta_cm () const
 Get the velocity of the center of mass of the scattering particles in the calculation frame. More...
 
double gamma_cm () const
 Get the gamma factor corresponding to a boost to the center of mass frame of the colliding particles. More...
 
void elastic_scattering ()
 Perform an elastic two-body scattering, i.e. just exchange momentum. More...
 
void inelastic_scattering ()
 Perform an inelastic two-body scattering, i.e. new particles are formed. More...
 
void string_excitation ()
 Todo(ryu): document better - it is not really UrQMD-based, isn't it? Perform the UrQMD-based string excitation and decay. More...
 
void format_debug_output (std::ostream &out) const override
 Writes information about this scatter action to the out stream. More...
 
- 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...
 
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...
 
- Protected Attributes inherited from smash::ScatterAction
CollisionBranchList collision_channels_
 List of possible collisions. More...
 
double total_cross_section_
 Total hadronic cross section. More...
 
double partial_cross_section_
 Partial cross-section to the chosen outgoing channel. More...
 
bool isotropic_ = false
 Do this collision isotropically? More...
 
double string_formation_time_ = 1.0
 Time fragments take to be fully formed in hard string excitation. 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...
 

Member Enumeration Documentation

◆ ReactionType

Enum for encoding the photon process.

It is uniquely determined by the incoming particles. The naming scheme is : Incoming_1__Incoming_2__Outgoing_hadron. The photon is omitted in the naming.

Enumerator
no_reaction 
pi_z_pi_p_rho_p 
pi_z_pi_m_rho_m 
pi_p_rho_z_pi_p 
pi_m_rho_z_pi_m 
pi_m_rho_p_pi_z 
pi_p_rho_m_pi_z 
pi_z_rho_p_pi_p 
pi_z_rho_m_pi_m 
pi_p_pi_m_rho_z 
pi_z_rho_z_pi_z 

Definition at line 112 of file scatteractionphoton.h.

112  {
113  no_reaction,
114  pi_z_pi_p_rho_p,
115  pi_z_pi_m_rho_m,
116  pi_p_rho_z_pi_p,
117  pi_m_rho_z_pi_m,
118  pi_m_rho_p_pi_z,
119  pi_p_rho_m_pi_z,
120  pi_z_rho_p_pi_p,
121  pi_z_rho_m_pi_m,
122  pi_p_pi_m_rho_z,
123  pi_z_rho_z_pi_z
124  };

◆ MediatorType

Compile-time switch for setting the handling of processes which can happen via different mediating particles.

Relevant only for the processes pi0 + rho => pi + y and pi + rho => pi0 + gamma, which both can happen via exchange of (rho, a1, pi) or omega. If MediatorType::SUM is set, the cross section for both processes is added. If MediatorType::PION/ OMEGA is set, only the respective processes are computed.

Enumerator
SUM 
PION 
OMEGA 

Definition at line 215 of file scatteractionphoton.h.

215 { SUM, PION, OMEGA };

Constructor & Destructor Documentation

◆ ScatterActionPhoton()

smash::ScatterActionPhoton::ScatterActionPhoton ( const ParticleList &  in,
const double  time,
const int  n_frac_photons,
const double  hadronic_cross_section_input 
)

Construct a ScatterActionPhoton object.

Parameters
[in]inParticleList of incoming particles.
[in]timeTime relative to underlying hadronic action.
[in]n_frac_photonsNumber of photons to produce for each hadronic scattering.
[in]hadronic_cross_section_inputCross-section of underlying hadronic cross-section.
Returns
The constructed object.

Definition at line 29 of file scatteractionphoton.cc.

32  : ScatterAction(in[0], in[1], time),
34  number_of_fractional_photons_(n_frac_photons),
37  hadronic_cross_section_(hadronic_cross_section_input) {}
static ParticleTypePtr outgoing_hadron_type(const ParticleList &in)
Return ParticleTypePtr of hadron in the out channel, given the incoming particles.
const double hadronic_cross_section_
Total hadronic cross section.
ScatterAction(const ParticleData &in_part1, const ParticleData &in_part2, double time, bool isotropic=false, double string_formation_time=1.0)
Construct a ScatterAction object.
const int number_of_fractional_photons_
Number of photons created for each hadronic scattering, needed for correct weighting.
const ReactionType reac_
Photonic process as determined from incoming particles.
double sample_out_hadron_mass(const ParticleTypePtr out_type)
Sample the mass of the outgoing hadron.
const double hadron_out_mass_
Mass of outgoing hadron.
const ParticleTypePtr hadron_out_t_
ParticleTypePtr to the type of the outgoing hadron.
static ReactionType photon_reaction_type(const ParticleList &in)
Determine photon process from incoming particles.

Member Function Documentation

◆ perform_photons()

void smash::ScatterActionPhoton::perform_photons ( const OutputsList &  outputs)

Create the photon final state and write to output.

Parameters
[in]outputsList of all outputs. Does not have to be a specific photon output, the function will take care of this.

Definition at line 92 of file scatteractionphoton.cc.

92  {
93  for (int i = 0; i < number_of_fractional_photons_; i++) {
95  for (const auto &output : outputs) {
96  if (output->is_photon_output()) {
97  // we do not care about the local density
98  output->at_interaction(*this, 0.0);
99  }
100  }
101  }
102 }
void generate_final_state() override
Generate the final-state for the photon scatter process.
const int number_of_fractional_photons_
Number of photons created for each hadronic scattering, needed for correct weighting.
Here is the call graph for this function:

◆ generate_final_state()

void smash::ScatterActionPhoton::generate_final_state ( )
overridevirtual

Generate the final-state for the photon scatter process.

Generates only one photon / hadron pair

Reimplemented from smash::ScatterAction.

Definition at line 188 of file scatteractionphoton.cc.

188  {
189  // we have only one reaction per incoming particle pair
190  if (collision_processes_photons_.size() != 1) {
191  const auto &log = logger<LogArea::ScatterAction>();
192  log.fatal() << "Problem in ScatterActionPhoton::generate_final_state().\n";
193  throw std::runtime_error("");
194  }
195  auto *proc = collision_processes_photons_[0].get();
196 
197  outgoing_particles_ = proc->particle_list();
198  process_type_ = proc->get_type();
199 
200  FourVector middle_point = get_interaction_point();
201 
202  // t is defined to be the momentum exchanged between the rho meson and the
203  // photon in pi + rho -> pi + photon channel. Therefore,
204  // get_t_range needs to be called with m2 being the rho mass instead of the
205  // pion mass. So, particles 1 and 2 are swapped if necessary.
206 
207  if (!incoming_particles_[0].pdgcode().is_pion()) {
208  std::swap(incoming_particles_[0], incoming_particles_[1]);
209  }
210 
211  // 2->2 inelastic scattering
212  // Sample the particle momenta in CM system
213  const double m1 = incoming_particles_[0].effective_mass();
214  const double m2 = incoming_particles_[1].effective_mass();
215 
216  const double &m_out = hadron_out_mass_;
217 
218  const double s = mandelstam_s();
219  const double sqrts = sqrt_s();
220  std::array<double, 2> mandelstam_t = get_t_range(sqrts, m1, m2, m_out, 0.0);
221  const double t1 = mandelstam_t[1];
222  const double t2 = mandelstam_t[0];
223  const double pcm_in = cm_momentum();
224  const double pcm_out = pCM(sqrts, m_out, 0.0);
225 
226  const double t = random::uniform(t1, t2);
227 
228  double costheta = (t - pow_int(m2, 2) +
229  0.5 * (s + pow_int(m2, 2) - pow_int(m1, 2)) *
230  (s - pow_int(m_out, 2)) / s) /
231  (pcm_in * (s - pow_int(m_out, 2)) / sqrts);
232 
233  // on very rare occasions near the kinematic threshold numerical issues give
234  // unphysical angles.
235  if (costheta > 1 || costheta < -1) {
236  const auto &log = logger<LogArea::ScatterAction>();
237  log.warn() << "Cos(theta)of photon scattering out of physical bounds in "
238  "the following scattering: "
239  << incoming_particles_ << "Clamping to [-1,1].";
240  if (costheta > 1.0)
241  costheta = 1.0;
242  if (costheta < -1.0)
243  costheta = -1.0;
244  }
245  Angles phitheta(random::uniform(0.0, twopi), costheta);
246  outgoing_particles_[0].set_4momentum(hadron_out_mass_,
247  phitheta.threevec() * pcm_out);
248  outgoing_particles_[1].set_4momentum(0.0, -phitheta.threevec() * pcm_out);
249 
250  // Set positions & boost to computational frame.
251  for (ParticleData &new_particle : outgoing_particles_) {
252  new_particle.set_4position(middle_point);
253  new_particle.boost_momentum(-beta_cm());
254  }
255 
256  const double E_Photon = outgoing_particles_[1].momentum()[0];
257 
258  // if rho in final state take already sampled mass (same as m_out). If rho is
259  // incoming take the mass of the incoming particle
260  const double m_rho = rho_mass();
261 
262  // compute the differential cross section with form factor included
263  const double diff_xs = diff_cross_section_w_ff(t, m_rho, E_Photon);
264 
265  // Weighing of the fractional photons
267  weight_ = diff_xs * (t2 - t1) /
269  } else {
270  weight_ = proc->weight() / hadronic_cross_section();
271  }
272  // Photons are not really part of the normal processes, so we have to set a
273  // constant arbitrary number.
274  const auto id_process = ID_PROCESS_PHOTON;
275  Action::check_conservation(id_process);
276 }
FourVector get_interaction_point() const
Get the interaction point.
Definition: action.cc:68
constexpr std::uint32_t ID_PROCESS_PHOTON
Process ID for any photon process.
Definition: constants.h:128
double cm_momentum() const
Get the momentum of the center of mass of the incoming particles in the calculation frame...
double hadronic_cross_section() const
Return the total cross section of the underlying hadronic scattering.
ProcessType process_type_
type of process
Definition: action.h:320
ThreeVector beta_cm() const
Get the velocity of the center of mass of the scattering particles in the calculation frame...
double weight_
Weight of the produced photon.
constexpr T pow_int(const T base, unsigned const exponent)
Efficient template for calculating integer powers using squaring.
Definition: pow.h:23
const int number_of_fractional_photons_
Number of photons created for each hadronic scattering, needed for correct weighting.
CollisionBranchList collision_processes_photons_
Holds the photon branch.
double mandelstam_s() const
Determine the Mandelstam s variable,.
constexpr double twopi
.
Definition: constants.h:39
std::array< T, 2 > get_t_range(const T sqrts, const T m1, const T m2, const T m3, const T m4)
Get the range of Mandelstam-t values allowed in a particular 2->2 process, see PDG 2014 booklet...
Definition: kinematics.h:109
ParticleList outgoing_particles_
Initially this stores only the PDG codes of final-state particles.
Definition: action.h:311
ParticleList incoming_particles_
List with data of incoming particles.
Definition: action.h:303
T uniform(T min, T max)
Definition: random.h:85
const double hadron_out_mass_
Mass of outgoing hadron.
double diff_cross_section_w_ff(const double t, const double m_rho, const double E_photon)
Compute the differential cross section with form factors included.
double rho_mass() const
Find the mass of the participating rho-particle.
T pCM(const T sqrts, const T mass_a, const T mass_b) noexcept
Definition: kinematics.h:79
void check_conservation(const uint32_t id_process) const
Check various conservation laws.
Definition: action.cc:219
double sqrt_s() const
Determine the total energy in the center-of-mass frame [GeV].
Definition: action.h:265
Here is the call graph for this function:
Here is the caller graph for this function:

◆ get_total_weight()

double smash::ScatterActionPhoton::get_total_weight ( ) const
inlineoverridevirtual

Return the weight of the last created photon.

Returns
The total weight.

Reimplemented from smash::ScatterAction.

Definition at line 64 of file scatteractionphoton.h.

64 { return weight_; }
double weight_
Weight of the produced photon.

◆ hadronic_cross_section()

double smash::ScatterActionPhoton::hadronic_cross_section ( ) const
inline

Return the total cross section of the underlying hadronic scattering.

Returns
total cross-section [mb]

Definition at line 71 of file scatteractionphoton.h.

71 { return hadronic_cross_section_; }
const double hadronic_cross_section_
Total hadronic cross section.
Here is the caller graph for this function:

◆ sample_out_hadron_mass()

double smash::ScatterActionPhoton::sample_out_hadron_mass ( const ParticleTypePtr  out_type)

Sample the mass of the outgoing hadron.

Returns the pole mass if particle is stable.

Parameters
[in]out_typeTypePtr of the outgoing hadron.
Returns
Mass of outgoing hadron [GeV]

Definition at line 286 of file scatteractionphoton.cc.

287  {
288  double mass = out_t->mass();
289  const double cms_energy = sqrt_s();
290  if (cms_energy <= out_t->min_mass_kinematic()) {
291  throw InvalidResonanceFormation(
292  "Problem in ScatterActionPhoton::sample_hadron_mass");
293  }
294 
295  if (!out_t->is_stable()) {
296  mass = out_t->sample_resonance_mass(0, cms_energy);
297  }
298 
299  return mass;
300 }
double sqrt_s() const
Determine the total energy in the center-of-mass frame [GeV].
Definition: action.h:265
Here is the call graph for this function:

◆ add_dummy_hadronic_process()

void smash::ScatterActionPhoton::add_dummy_hadronic_process ( double  reaction_cross_section)

Adds one hadronic process with a given cross-section.

The intended use is to add the hadronic cross-section from the already performed hadronic action without recomputing it.

Parameters
[in]reaction_cross_sectionTotal cross-section of underlying hadronic process [mb]

Definition at line 278 of file scatteractionphoton.cc.

279  {
280  CollisionBranchPtr dummy_process = make_unique<CollisionBranch>(
281  incoming_particles_[0].type(), incoming_particles_[1].type(),
282  reaction_cross_section, ProcessType::TwoToTwo);
283  add_collision(std::move(dummy_process));
284 }
void add_collision(CollisionBranchPtr p)
Add a new collision channel.
2->2 inelastic scattering
ParticleList incoming_particles_
List with data of incoming particles.
Definition: action.h:303
Here is the call graph for this function:

◆ add_single_process()

void smash::ScatterActionPhoton::add_single_process ( )
inline

Add the photonic process.

Also compute the total cross section as a side effect.

Definition at line 100 of file scatteractionphoton.h.

100  {
101  add_processes<CollisionBranch>(photon_cross_sections(),
104  }
double cross_section_photons_
Total cross section of photonic process.
CollisionBranchList collision_processes_photons_
Holds the photon branch.
CollisionBranchList photon_cross_sections(MediatorType mediator=default_mediator_)
Computes the total cross section of the photon process.
Here is the call graph for this function:

◆ photon_reaction_type()

ScatterActionPhoton::ReactionType smash::ScatterActionPhoton::photon_reaction_type ( const ParticleList &  in)
static

Determine photon process from incoming particles.

If incoming particles are not part of any implemented photonic process, return no_reaction.

Parameters
[in]inParticleList of incoming particles.
Returns
ReactionType enum-member

Definition at line 39 of file scatteractionphoton.cc.

40  {
41  if (in.size() != 2) {
43  }
44 
45  PdgCode a = in[0].pdgcode();
46  PdgCode b = in[1].pdgcode();
47 
48  // swap so that pion is first and there are less cases to be listed
49  if (!a.is_pion()) {
50  std::swap(a, b);
51  }
52 
53  switch (pack(a.code(), b.code())) {
54  case (pack(pdg::pi_p, pdg::pi_z)):
55  case (pack(pdg::pi_z, pdg::pi_p)):
57 
58  case (pack(pdg::pi_m, pdg::pi_z)):
59  case (pack(pdg::pi_z, pdg::pi_m)):
61 
62  case (pack(pdg::pi_p, pdg::rho_z)):
64 
65  case (pack(pdg::pi_m, pdg::rho_z)):
67 
68  case (pack(pdg::pi_m, pdg::rho_p)):
70 
71  case (pack(pdg::pi_p, pdg::rho_m)):
73 
74  case (pack(pdg::pi_z, pdg::rho_p)):
76 
77  case (pack(pdg::pi_z, pdg::rho_m)):
79 
80  case (pack(pdg::pi_p, pdg::pi_m)):
81  case (pack(pdg::pi_m, pdg::pi_p)):
83 
84  case (pack(pdg::pi_z, pdg::rho_z)):
86 
87  default:
89  }
90 }
constexpr uint64_t pack(int32_t x, int32_t y)
Pack two int32_t into an uint64_t.
constexpr int rho_z
ρ⁰.
constexpr int pi_z
π⁰.
constexpr int rho_p
ρ⁺.
constexpr int pi_p
π⁺.
constexpr int rho_m
ρ⁻.
constexpr int pi_m
π⁻.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ is_photon_reaction()

static bool smash::ScatterActionPhoton::is_photon_reaction ( const ParticleList &  in)
inlinestatic

Check if particles can undergo an implemented photon process.

This function does not check the involved kinematics.

Parameters
[in]inParticleList of incoming particles.
Returns
bool if photon reaction implemented.

Definition at line 145 of file scatteractionphoton.h.

145  {
147  }
static ReactionType photon_reaction_type(const ParticleList &in)
Determine photon process from incoming particles.
Here is the call graph for this function:

◆ outgoing_hadron_type() [1/2]

ParticleTypePtr smash::ScatterActionPhoton::outgoing_hadron_type ( const ParticleList &  in)
static

Return ParticleTypePtr of hadron in the out channel, given the incoming particles.

This function is overloaded since we need the hadron type in different places.

Parameters
[in]inParticleList of incoming particles.
Returns
ParticeTypePtr to hadron in outgoing channel.

Definition at line 150 of file scatteractionphoton.cc.

151  {
152  auto reac = photon_reaction_type(in);
153  return outgoing_hadron_type(reac);
154 }
static ParticleTypePtr outgoing_hadron_type(const ParticleList &in)
Return ParticleTypePtr of hadron in the out channel, given the incoming particles.
static ReactionType photon_reaction_type(const ParticleList &in)
Determine photon process from incoming particles.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ outgoing_hadron_type() [2/2]

ParticleTypePtr smash::ScatterActionPhoton::outgoing_hadron_type ( const ReactionType  reaction)
static

Return ParticleTypePtr of hadron in the out channel, given the ReactionType.

This function is overloaded since we need the hadron type in different places.

Parameters
[in]reactionReactionType, determined from incoming particles.
Returns
ParticeTypePtr to hadron in outgoing channel.

Definition at line 104 of file scatteractionphoton.cc.

105  {
106  static const ParticleTypePtr rho_z_particle_ptr =
108  static const ParticleTypePtr rho_p_particle_ptr =
110  static const ParticleTypePtr rho_m_particle_ptr =
112  static const ParticleTypePtr pi_z_particle_ptr =
114  static const ParticleTypePtr pi_p_particle_ptr =
116  static const ParticleTypePtr pi_m_particle_ptr =
118 
119  switch (reaction) {
121  return rho_p_particle_ptr;
122  break;
124  return rho_m_particle_ptr;
125  break;
127  return rho_z_particle_ptr;
128  break;
129 
132  return pi_p_particle_ptr;
133 
136  return pi_m_particle_ptr;
137 
141  return pi_z_particle_ptr;
142  break;
143  default:
144  // default constructor constructs p with invalid index
145  ParticleTypePtr p{};
146  return p;
147  }
148 }
constexpr int rho_z
ρ⁰.
static const ParticleType & find(PdgCode pdgcode)
Returns the ParticleType object for the given pdgcode.
constexpr int pi_z
π⁰.
constexpr int rho_p
ρ⁺.
constexpr int pi_p
π⁺.
constexpr int rho_m
ρ⁻.
constexpr int p
Proton.
constexpr int pi_m
π⁻.
Here is the call graph for this function:

◆ is_kinematically_possible()

bool smash::ScatterActionPhoton::is_kinematically_possible ( const double  s_sqrt,
const ParticleList &  in 
)
static

Check if CM-energy is sufficient to produce hadron in final state.

Parameters
[in]s_sqrtCM-energy [GeV]
[in]inParticleList of incoming hadrons
Returns
true if particles can be produced.

Definition at line 156 of file scatteractionphoton.cc.

157  {
158  auto reac = photon_reaction_type(in);
159  auto hadron = outgoing_hadron_type(in);
160 
161  if (reac == ReactionType::no_reaction)
162  return false;
163 
166  return false;
167  }
168 
169  // C15 has only s-channel. Make sure that CM-energy is high
170  // enough to produce mediating omega meson
171  if ((reac == ReactionType::pi_m_rho_p_pi_z ||
174  if (s_sqrt < omega_mass) {
175  return false;
176  }
177  }
178 
179  // for all other processes: if cm-energy is not high enough to produce final
180  // state particle reject the collision.
181  if (hadron->is_stable() && s_sqrt < hadron->mass()) {
182  return false;
183  } else {
184  return true;
185  }
186 }
static ParticleTypePtr outgoing_hadron_type(const ParticleList &in)
Return ParticleTypePtr of hadron in the out channel, given the incoming particles.
static constexpr MediatorType default_mediator_
Value used for default exchange particle. See MediatorType.
constexpr double omega_mass
omega mass in GeV.
Definition: constants.h:73
static ReactionType photon_reaction_type(const ParticleList &in)
Determine photon process from incoming particles.
Here is the call graph for this function:

◆ diff_cross_section()

double smash::ScatterActionPhoton::diff_cross_section ( const double  t,
const double  m_rho,
MediatorType  mediator = default_mediator_ 
) const
private

Calculate the differential cross section of photon process.

Formfactors are not included

Parameters
[in]tMandelstam-t [GeV^2].
[in]m_rhoMass of the incoming or outgoing rho-particle [GeV]
[in]mediatorSwitch for determing which mediating particle to use
Returns
Differential cross section. [mb/ \(GeV^2\)]

Definition at line 412 of file scatteractionphoton.cc.

414  {
415  const double s = mandelstam_s();
416  double diff_xsection = 0.0;
417 
418  CrosssectionsPhoton<ComputationMethod::Analytic> xs_object;
419 
420  switch (reac_) {
422  diff_xsection = xs_object.xs_diff_pi_pi_rho0(s, t, m_rho);
423  break;
424 
427  diff_xsection = xs_object.xs_diff_pi_pi0_rho(s, t, m_rho);
428  break;
429 
432  diff_xsection = xs_object.xs_diff_pi_rho0_pi(s, t, m_rho);
433  break;
434 
437  if (mediator == MediatorType::SUM) {
438  diff_xsection =
439  xs_object.xs_diff_pi_rho_pi0_rho_mediated(s, t, m_rho) +
440  xs_object.xs_diff_pi_rho_pi0_omega_mediated(s, t, m_rho);
441  } else if (mediator == MediatorType::OMEGA) {
442  diff_xsection =
443  xs_object.xs_diff_pi_rho_pi0_omega_mediated(s, t, m_rho);
444  } else if (mediator == MediatorType::PION) {
445  diff_xsection = xs_object.xs_diff_pi_rho_pi0_rho_mediated(s, t, m_rho);
446  }
447  break;
448 
451  if (mediator == MediatorType::SUM) {
452  diff_xsection =
453  xs_object.xs_diff_pi0_rho_pi_rho_mediated(s, t, m_rho) +
454  xs_object.xs_diff_pi0_rho_pi_omega_mediated(s, t, m_rho);
455  } else if (mediator == MediatorType::OMEGA) {
456  diff_xsection =
457  xs_object.xs_diff_pi0_rho_pi_omega_mediated(s, t, m_rho);
458  } else if (mediator == MediatorType::PION) {
459  diff_xsection = xs_object.xs_diff_pi0_rho_pi_rho_mediated(s, t, m_rho);
460  }
461  break;
462 
464  diff_xsection = xs_object.xs_diff_pi0_rho0_pi0(s, t, m_rho);
465  break;
467  // never reached
468  break;
469  }
470  return diff_xsection;
471 }
double mandelstam_s() const
Determine the Mandelstam s variable,.
const ReactionType reac_
Photonic process as determined from incoming particles.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ rho_mass()

double smash::ScatterActionPhoton::rho_mass ( ) const
private

Find the mass of the participating rho-particle.

In case of a rho in the incoming channel it is the mass of the incoming rho, in case of an rho in the outgoing channel it is the mass sampled in the constructor. When an rho acts in addition as a mediator, its mass is the same as the incoming / outgoing rho. This function returns the alrady sampled mass or the mass of the incoming rho, depending on the process.

Returns
mass of participating rho [GeV]

Definition at line 302 of file scatteractionphoton.cc.

302  {
303  assert(reac_ != ReactionType::no_reaction);
304  switch (reac_) {
305  // rho in final state. use already sampled mass
309  return hadron_out_mass_;
310  // rho in initial state, use its mass
318  return (incoming_particles_[0].is_rho())
319  ? incoming_particles_[0].effective_mass()
320  : incoming_particles_[1].effective_mass();
322  default:
323  throw std::runtime_error(
324  "Invalid ReactionType in ScatterActionPhoton::rho_mass()");
325  }
326 }
const ReactionType reac_
Photonic process as determined from incoming particles.
ParticleList incoming_particles_
List with data of incoming particles.
Definition: action.h:303
const double hadron_out_mass_
Mass of outgoing hadron.
Here is the caller graph for this function:

◆ photon_cross_sections()

CollisionBranchList smash::ScatterActionPhoton::photon_cross_sections ( MediatorType  mediator = default_mediator_)
private

Computes the total cross section of the photon process.

Parameters
[in]mediatorSwitch for determing which mediating particle to use.
Returns
List of photon reaction branches.

Definition at line 328 of file scatteractionphoton.cc.

329  {
330  CollisionBranchList process_list;
331  CrosssectionsPhoton<ComputationMethod::Analytic> xs_object;
332 
333  static ParticleTypePtr photon_particle = &ParticleType::find(pdg::photon);
334 
335  const double s = mandelstam_s();
336  // the mass of the mediating particle depends on the channel. For an incoming
337  // rho it is the mass of the incoming particle, for an outgoing rho it is the
338  // sampled mass
339  const double m_rho = rho_mass();
340  double xsection = 0.0;
341 
342  switch (reac_) {
344  xsection = xs_object.xs_pi_pi_rho0(s, m_rho);
345  break;
346 
349  xsection = xs_object.xs_pi_pi0_rho(s, m_rho);
350  break;
351 
354  xsection = xs_object.xs_pi_rho0_pi(s, m_rho);
355  break;
356 
359  if (mediator == MediatorType::SUM) {
360  xsection = xs_object.xs_pi_rho_pi0(s, m_rho);
361  break;
362  } else if (mediator == MediatorType::PION) {
363  xsection = xs_object.xs_pi_rho_pi0_rho_mediated(s, m_rho);
364  break;
365  } else if (mediator == MediatorType::OMEGA) {
366  xsection = xs_object.xs_pi_rho_pi0_omega_mediated(s, m_rho);
367  break;
368  } else {
369  throw std::runtime_error("");
370  }
373  if (mediator == MediatorType::SUM) {
374  xsection = xs_object.xs_pi0_rho_pi(s, m_rho);
375  break;
376  } else if (mediator == MediatorType::PION) {
377  xsection = xs_object.xs_pi0_rho_pi_rho_mediated(s, m_rho);
378  break;
379  } else if (mediator == MediatorType::OMEGA) {
380  xsection = xs_object.xs_pi0_rho_pi_omega_mediated(s, m_rho);
381  break;
382  } else {
383  throw std::runtime_error("");
384  }
385 
387  xsection = xs_object.xs_pi0_rho0_pi0(s, m_rho);
388  break;
389 
391  // never reached
392  break;
393  }
394 
395  // Due to numerical reasons it can happen that the calculated cross sections
396  // are negative (approximately -1e-15) if sqrt(s) is close to the threshold
397  // energy. In those cases the cross section is manually set to 0.1 mb, which
398  // is a reasonable value for the processes we are looking at (C14,C15,C16).
399 
400  if (xsection <= 0) {
401  xsection = 0.1;
402  const auto &log = logger<LogArea::ScatterAction>();
403  log.warn("Calculated negative cross section.\nParticles ",
404  incoming_particles_, " mass rho particle: ", m_rho,
405  ", sqrt_s: ", std::sqrt(s));
406  }
407  process_list.push_back(make_unique<CollisionBranch>(
408  *hadron_out_t_, *photon_particle, xsection, ProcessType::TwoToTwo));
409  return process_list;
410 }
constexpr int photon
Photon.
2->2 inelastic scattering
static const ParticleType & find(PdgCode pdgcode)
Returns the ParticleType object for the given pdgcode.
double mandelstam_s() const
Determine the Mandelstam s variable,.
const ReactionType reac_
Photonic process as determined from incoming particles.
ParticleList incoming_particles_
List with data of incoming particles.
Definition: action.h:303
double rho_mass() const
Find the mass of the participating rho-particle.
const ParticleTypePtr hadron_out_t_
ParticleTypePtr to the type of the outgoing hadron.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ diff_cross_section_single()

std::pair< double, double > smash::ScatterActionPhoton::diff_cross_section_single ( const double  t,
const double  m_rho 
)
private

For processes which can happen via (pi, a1, rho) and omega exchange, return the differential cross section for the (pi, a1, rho) process in the first argument, for the omega process in the second.

If only one process exists, both values are the same.

Parameters
[in]tMandelstam-t [GeV^2]
[in]m_rhoMass of the incoming or outgoing rho-particle [GeV]
Returns
diff. cross section for (pi,a1,rho) in the first argument, for omega in the second.

Definition at line 568 of file scatteractionphoton.cc.

569  {
570  const double diff_xs_rho = diff_cross_section(t, m_rho, MediatorType::PION);
571  const double diff_xs_omega =
573 
574  return std::pair<double, double>(diff_xs_rho, diff_xs_omega);
575 }
double diff_cross_section(const double t, const double m_rho, MediatorType mediator=default_mediator_) const
Calculate the differential cross section of photon process.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ form_factor_single()

std::pair< double, double > smash::ScatterActionPhoton::form_factor_single ( const double  E_photon)
private

For processes which can happen via (pi, a1, rho) and omega exchange, return the form factor for the (pi, a1, rho) process in the first argument, for the omega process in the second.

If only one process exists, both values are the same.

Parameters
[in]E_photonEnergy of the photon [GeV]
Returns
Form factor for (pi,a1,rho) in the first argument, for omega in the second.

Definition at line 562 of file scatteractionphoton.cc.

563  {
564  return std::pair<double, double>(form_factor_pion(E_photon),
565  form_factor_omega(E_photon));
566 }
double form_factor_omega(const double E_photon) const
Compute the form factor for a process with a omega as the lightest exchange particle.
double form_factor_pion(const double E_photon) const
Compute the form factor for a process with a pion as the lightest exchange particle.
Here is the call graph for this function:
Here is the caller graph for this function:

◆ form_factor_pion()

double smash::ScatterActionPhoton::form_factor_pion ( const double  E_photon) const
private

Compute the form factor for a process with a pion as the lightest exchange particle.

See wiki for details how form factors are handled.

Parameters
[in]E_photonEnergy of photon [GeV]
Returns
form factor

Definition at line 538 of file scatteractionphoton.cc.

538  {
539  const double Lambda = 1.0;
540  const double Lambda2 = Lambda * Lambda;
541 
542  const double t_ff = 34.5096 * pow(E_photon, 0.737) -
543  67.557 * pow(E_photon, 0.7584) +
544  32.858 * pow(E_photon, 0.7806);
545  const double ff = 2 * Lambda2 / (2 * Lambda2 - t_ff);
546 
547  return ff * ff;
548 }
constexpr int Lambda
Λ.
Here is the caller graph for this function:

◆ form_factor_omega()

double smash::ScatterActionPhoton::form_factor_omega ( const double  E_photon) const
private

Compute the form factor for a process with a omega as the lightest exchange particle.

See wiki for details how form factors are handled.

Parameters
[in]E_photonEnergy of photon [GeV]
Returns
form factor

Definition at line 550 of file scatteractionphoton.cc.

550  {
551  const double Lambda = 1.0;
552  const double Lambda2 = Lambda * Lambda;
553 
554  const double t_ff =
555  -61.595 * pow(E_photon, 0.9979) + 28.592 * pow(E_photon, 1.1579) +
556  37.738 * pow(E_photon, 0.9317) - 5.282 * pow(E_photon, 1.3686);
557  const double ff = 2 * Lambda2 / (2 * Lambda2 - t_ff);
558 
559  return ff * ff;
560 }
constexpr int Lambda
Λ.
Here is the caller graph for this function:

◆ diff_cross_section_w_ff()

double smash::ScatterActionPhoton::diff_cross_section_w_ff ( const double  t,
const double  m_rho,
const double  E_photon 
)
private

Compute the differential cross section with form factors included.

Takes care of correct handling of reactions with multiple processes by reading the default_mediator_ member variable.

Parameters
[in]tMandelstam-t [GeV^2]
[in]m_rhoMass of the incoming or outgoing rho-particle [GeV]
[in]E_photonof outgoing photon [GeV]
Returns
diff. cross section [mb / GeV \(^2\)]

The form factor is assumed to be a hadronic dipole form factor which takes the shape: FF = (2*Lambda^2/(2*Lambda^2 - t))^2 with Lambda = 1.0 GeV. t depends on the lightest possible exchange particle in the different channels. This could either be a pion or an omega meson. For the computation the parametrizations given in (Turbide:2006) are used.

Definition at line 473 of file scatteractionphoton.cc.

475  {
485  /* C12, C13, C15, C16 need special treatment. These processes have identical
486  incoming and outgoing particles, but diffrent mediating particles and
487  hence different form factors. If both channels are added up
488  (MediatorType::SUM), each contribution is corrected by the corresponding
489  form factor.
490  */
491  switch (reac_) {
497  std::pair<double, double> FF = form_factor_single(E_photon);
498  std::pair<double, double> diff_xs = diff_cross_section_single(t, m_rho);
499  const double xs_ff = pow_int(FF.first, 4) * diff_xs.first +
500  pow_int(FF.second, 4) * diff_xs.second;
501  return xs_ff;
502  } else if (default_mediator_ == MediatorType::PION) {
503  const double FF = form_factor_pion(E_photon);
504  const double diff_xs = diff_cross_section(t, m_rho);
505  return pow_int(FF, 4) * diff_xs;
506  } else if (default_mediator_ == MediatorType::OMEGA) {
507  const double FF = form_factor_omega(E_photon);
508  const double diff_xs = diff_cross_section(t, m_rho);
509  return pow_int(FF, 4) * diff_xs;
510  }
511  break;
512  }
518  const double FF = form_factor_pion(E_photon);
519  const double xs = diff_cross_section(t, m_rho);
520  const double xs_ff = pow_int(FF, 4) * xs;
521  return xs_ff;
522  }
523 
525  const double FF = form_factor_omega(E_photon);
526  const double xs = diff_cross_section(t, m_rho);
527  const double xs_ff = pow_int(FF, 4) * xs;
528  return xs_ff;
529  }
530 
532  default:
533  throw std::runtime_error("");
534  return 0;
535  }
536 }
double diff_cross_section(const double t, const double m_rho, MediatorType mediator=default_mediator_) const
Calculate the differential cross section of photon process.
constexpr T pow_int(const T base, unsigned const exponent)
Efficient template for calculating integer powers using squaring.
Definition: pow.h:23
static constexpr MediatorType default_mediator_
Value used for default exchange particle. See MediatorType.
const ReactionType reac_
Photonic process as determined from incoming particles.
double form_factor_omega(const double E_photon) const
Compute the form factor for a process with a omega as the lightest exchange particle.
std::pair< double, double > diff_cross_section_single(const double t, const double m_rho)
For processes which can happen via (pi, a1, rho) and omega exchange, return the differential cross se...
std::pair< double, double > form_factor_single(const double E_photon)
For processes which can happen via (pi, a1, rho) and omega exchange, return the form factor for the (...
double form_factor_pion(const double E_photon) const
Compute the form factor for a process with a pion as the lightest exchange particle.
Here is the call graph for this function:
Here is the caller graph for this function:

Member Data Documentation

◆ collision_processes_photons_

CollisionBranchList smash::ScatterActionPhoton::collision_processes_photons_
private

Holds the photon branch.

As of now, this will always hold only one branch.

Definition at line 188 of file scatteractionphoton.h.

◆ reac_

const ReactionType smash::ScatterActionPhoton::reac_
private

Photonic process as determined from incoming particles.

Definition at line 191 of file scatteractionphoton.h.

◆ number_of_fractional_photons_

const int smash::ScatterActionPhoton::number_of_fractional_photons_
private

Number of photons created for each hadronic scattering, needed for correct weighting.

Note that in generate_final_state() only one photon + hadron is created.

Definition at line 198 of file scatteractionphoton.h.

◆ hadron_out_t_

const ParticleTypePtr smash::ScatterActionPhoton::hadron_out_t_
private

ParticleTypePtr to the type of the outgoing hadron.

Definition at line 201 of file scatteractionphoton.h.

◆ hadron_out_mass_

const double smash::ScatterActionPhoton::hadron_out_mass_
private

Mass of outgoing hadron.

Definition at line 204 of file scatteractionphoton.h.

◆ default_mediator_

constexpr MediatorType smash::ScatterActionPhoton::default_mediator_ = MediatorType::SUM
staticprivate

Value used for default exchange particle. See MediatorType.

Definition at line 217 of file scatteractionphoton.h.

◆ weight_

double smash::ScatterActionPhoton::weight_ = 0.0
private

Weight of the produced photon.

Definition at line 220 of file scatteractionphoton.h.

◆ cross_section_photons_

double smash::ScatterActionPhoton::cross_section_photons_ = 0.0
private

Total cross section of photonic process.

Definition at line 223 of file scatteractionphoton.h.

◆ hadronic_cross_section_

const double smash::ScatterActionPhoton::hadronic_cross_section_
private

Total hadronic cross section.

Definition at line 226 of file scatteractionphoton.h.


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