Version: SMASH-3.1
decayactiondilepton.cc
Go to the documentation of this file.
1 /*
2  *
3  * Copyright (c) 2015-2020,2022
4  * SMASH Team
5  *
6  * GNU General Public License (GPLv3 or later)
7  *
8  */
9 
11 
12 #include "smash/angles.h"
13 
14 namespace smash {
15 
17  double shining_weight)
18  : DecayAction({p}, time), shining_weight_(shining_weight) {}
19 
21  // Only Dalitz decays implemented
22  if (outgoing_particles_.size() != 3) {
23  throw std::runtime_error(
24  "Error in DecayActionDilepton::sample_manybody_phasespace: Incorrrect "
25  "number of outgoing particles in Dalitz decay");
26  }
27  // find the non-lepton particle position
28  int non_lepton_position = -1;
29  for (int i = 0; i < 3; ++i) {
30  if (!(outgoing_particles_[i].type().is_lepton())) {
31  non_lepton_position = i;
32  break;
33  }
34  }
35 
36  if (non_lepton_position == -1) {
37  throw std::runtime_error(
38  "Error in DecayActionDilepton::sample_3body_phasespace: No "
39  "non-leptonic outgoing particle in dilepton Dalitz decay found.");
40  }
41 
42  ParticleData &nl = outgoing_particles_[non_lepton_position];
43  ParticleData &l1 = outgoing_particles_[(non_lepton_position + 1) % 3];
44  ParticleData &l2 = outgoing_particles_[(non_lepton_position + 2) % 3];
45 
46  const double mass_l1 = l1.type().mass(); // (pole) mass of first lepton
47  const double mass_l2 = l2.type().mass(); // (pole) mass of second lepton
48  const double mass_nl = nl.type().mass(); // (pole) mass of non-lepton
49 
50  const double cms_energy = total_momentum_of_outgoing_particles().abs();
51 
52  // randomly select a dilepton mass
53  const double dil_mass =
54  random::uniform(mass_l1 + mass_l2, cms_energy - mass_nl);
55  const double delta_m = cms_energy - mass_nl - mass_l1 - mass_l2;
56 
57  const double diff_width = ThreeBodyDecayDilepton::diff_width(
58  cms_energy, mass_l1, dil_mass, mass_nl, &nl.type(),
59  &incoming_particles_[0].type());
60 
61  /* Branching factor, which corrects the shining weight for the differential
62  * width at a particular dilepton mass. We do an implicit Monte-Carlo
63  * integration over the dilepton mass here, and delta_m is simply the
64  * integration volume. */
65  branching_ = delta_m * diff_width / decay_channels_[0]->weight();
66 
67  // perform decay into non-lepton and virtual photon (dilepton)
68  const double dil_mom = pCM(cms_energy, dil_mass, mass_nl);
69 
70  // Here we assume an isotropic angular distribution.
71  Angles phitheta;
72  phitheta.distribute_isotropically();
73 
74  FourVector dil_4mom(std::sqrt(dil_mass * dil_mass + dil_mom * dil_mom),
75  phitheta.threevec() * dil_mom);
76  nl.set_4momentum(mass_nl, -phitheta.threevec() * dil_mom);
77 
78  // perform decay of virtual photon into two leptons
79  const double mom_lep = pCM(dil_mass, mass_l1, mass_l2);
80 
81  // Here we assume an isotropic angular distribution.
82  phitheta.distribute_isotropically();
83 
84  l1.set_4momentum(mass_l1, phitheta.threevec() * mom_lep);
85  l2.set_4momentum(mass_l2, -phitheta.threevec() * mom_lep);
86 
87  // Boost Dileptons back in parent particle rest frame
88  ThreeVector velocity_CM = dil_4mom.velocity();
89  l1.boost_momentum(-velocity_CM);
90  l2.boost_momentum(-velocity_CM);
91 }
92 
93 } // namespace smash
FourVector total_momentum_of_outgoing_particles() const
Calculate the total kinetic momentum of the outgoing particles.
Definition: action.cc:157
ParticleList outgoing_particles_
Initially this stores only the PDG codes of final-state particles.
Definition: action.h:363
ParticleList incoming_particles_
List with data of incoming particles.
Definition: action.h:355
Angles provides a common interface for generating directions: i.e., two angles that should be interpr...
Definition: angles.h:59
ThreeVector threevec() const
Definition: angles.h:288
void distribute_isotropically()
Populate the object with a new direction.
Definition: angles.h:199
void sample_manybody_phasespace() override
Generates momenta of outgoing dileptons (for Dalitz dilepton decays only).
double branching_
An additional branching factor that is multiplied with the shining weight.
DecayActionDilepton(const ParticleData &p, double time_of_execution, double shining_weight)
Construct a DecayActionDilepton from a particle p.
DecayAction is a special action which takes one single particle in the initial state and makes it dec...
Definition: decayaction.h:25
DecayBranchList decay_channels_
List of possible decays.
Definition: decayaction.h:97
The FourVector class holds relevant values in Minkowski spacetime with (+, −, −, −) metric signature.
Definition: fourvector.h:33
double abs() const
calculate the lorentz invariant absolute value
Definition: fourvector.h:464
ThreeVector velocity() const
Get the velocity (3-vector divided by zero component).
Definition: fourvector.h:333
ParticleData contains the dynamic information of a certain particle.
Definition: particledata.h:58
void set_4momentum(const FourVector &momentum_vector)
Set the particle's 4-momentum directly.
Definition: particledata.h:164
const ParticleType & type() const
Get the type of the particle.
Definition: particledata.h:128
void boost_momentum(const ThreeVector &v)
Apply a Lorentz-boost to only the momentum.
Definition: particledata.h:332
double mass() const
Definition: particletype.h:145
static double diff_width(double m_par, double m_l, double m_dil, double m_other, ParticleTypePtr other, ParticleTypePtr t)
Get the mass-differential width for a dilepton Dalitz decay, where is the invariant mass of the lep...
Definition: decaytype.cc:337
The ThreeVector class represents a physical three-vector with the components .
Definition: threevector.h:31
constexpr int p
Proton.
T uniform(T min, T max)
Definition: random.h:88
Definition: action.h:24
T pCM(const T sqrts, const T mass_a, const T mass_b) noexcept
Definition: kinematics.h:79