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