Version: SMASH-1.6
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(
33  "Error in DecayActionDilepton::sample_3body_phasespace.");
34  }
35 
36  ParticleData &nl = outgoing_particles_[non_lepton_position];
37  ParticleData &l1 = outgoing_particles_[(non_lepton_position + 1) % 3];
38  ParticleData &l2 = outgoing_particles_[(non_lepton_position + 2) % 3];
39 
40  const double mass_l1 = l1.type().mass(); // (pole) mass of first lepton
41  const double mass_l2 = l2.type().mass(); // (pole) mass of second lepton
42  const double mass_nl = nl.type().mass(); // (pole) mass of non-lepton
43 
44  const double cms_energy = total_momentum_of_outgoing_particles().abs();
45 
46  // randomly select a dilepton mass
47  const double dil_mass =
48  random::uniform(mass_l1 + mass_l2, cms_energy - mass_nl);
49  const double delta_m = cms_energy - mass_nl - mass_l1 - mass_l2;
50 
51  const double diff_width = ThreeBodyDecayDilepton::diff_width(
52  cms_energy, mass_l1, dil_mass, mass_nl, &nl.type(),
53  &incoming_particles_[0].type());
54 
55  /* Branching factor, which corrects the shining weight for the differential
56  * width at a particular dilepton mass. We do an implicit Monte-Carlo
57  * integration over the dilepton mass here, and delta_m is simply the
58  * integration volume. */
59  branching_ = delta_m * diff_width / decay_channels_[0]->weight();
60 
61  // perform decay into non-lepton and virtual photon (dilepton)
62  const double dil_mom = pCM(cms_energy, dil_mass, mass_nl);
63 
64  // Here we assume an isotropic angular distribution.
65  Angles phitheta;
66  phitheta.distribute_isotropically();
67 
68  FourVector dil_4mom(std::sqrt(dil_mass * dil_mass + dil_mom * dil_mom),
69  phitheta.threevec() * dil_mom);
70  nl.set_4momentum(mass_nl, -phitheta.threevec() * dil_mom);
71 
72  // perform decay of virtual photon into two leptons
73  const double mom_lep = pCM(dil_mass, mass_l1, mass_l2);
74 
75  // Here we assume an isotropic angular distribution.
76  phitheta.distribute_isotropically();
77 
78  l1.set_4momentum(mass_l1, phitheta.threevec() * mom_lep);
79  l2.set_4momentum(mass_l2, -phitheta.threevec() * mom_lep);
80 
81  // Boost Dileptons back in parent particle rest frame
82  ThreeVector velocity_CM = dil_4mom.velocity();
83  l1.boost_momentum(-velocity_CM);
84  l2.boost_momentum(-velocity_CM);
85 }
86 
87 } // namespace smash
The ThreeVector class represents a physical three-vector with the components .
Definition: threevector.h:30
double abs() const
calculate the lorentz invariant absolute value
Definition: fourvector.h:441
DecayBranchList decay_channels_
List of possible decays.
Definition: decayaction.h:97
FourVector total_momentum_of_outgoing_particles() const
Calculate the total kinetic momentum of the outgoing particles.
Definition: action.cc:123
ThreeVector threevec() const
Definition: angles.h:268
double mass() const
Definition: particletype.h:144
void sample_3body_phasespace() override
Sample the full 3-body phase-space (masses, momenta, angles) in the center-of-mass frame for the fina...
ParticleList outgoing_particles_
Initially this stores only the PDG codes of final-state particles.
Definition: action.h:311
const double shining_weight_
The shining weight is a weight you apply to every dilepton decay.
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
T uniform(T min, T max)
Definition: random.h:88
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
const ParticleType & type() const
Get the type of the particle.
Definition: particledata.h:109
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.
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
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