Version: SMASH-2.0
decayactiondilepton.cc
Go to the documentation of this file.
1 /*
2  *
3  * Copyright (c) 2014-2019
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  // find the non-lepton particle position
22  int non_lepton_position = -1;
23  for (int i = 0; i < 3; ++i) {
24  if (!(outgoing_particles_[i].type().is_lepton())) {
25  non_lepton_position = i;
26  break;
27  }
28  }
29 
30  if (non_lepton_position == -1) {
31  throw std::runtime_error(
32  "Error in DecayActionDilepton::sample_3body_phasespace.");
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
smash
Definition: action.h:24
smash::Action::incoming_particles_
ParticleList incoming_particles_
List with data of incoming particles.
Definition: action.h:326
smash::DecayActionDilepton::branching_
double branching_
An additional branching factor that is multiplied with the shining weight.
Definition: decayactiondilepton.h:62
smash::DecayAction
Definition: decayaction.h:25
smash::ParticleData
Definition: particledata.h:52
decayactiondilepton.h
smash::ParticleType::mass
double mass() const
Definition: particletype.h:144
smash::Angles::distribute_isotropically
void distribute_isotropically()
Populate the object with a new direction.
Definition: angles.h:188
smash::ParticleData::set_4momentum
void set_4momentum(const FourVector &momentum_vector)
Set the particle's 4-momentum directly.
Definition: particledata.h:158
smash::pCM
T pCM(const T sqrts, const T mass_a, const T mass_b) noexcept
Definition: kinematics.h:79
angles.h
smash::DecayAction::decay_channels_
DecayBranchList decay_channels_
List of possible decays.
Definition: decayaction.h:97
smash::ThreeVector
Definition: threevector.h:31
smash::DecayActionDilepton::DecayActionDilepton
DecayActionDilepton(const ParticleData &p, double time_of_execution, double shining_weight)
Construct a DecayActionDilepton from a particle p.
Definition: decayactiondilepton.cc:16
smash::ParticleData::boost_momentum
void boost_momentum(const ThreeVector &v)
Apply a Lorentz-boost to only the momentum.
Definition: particledata.h:326
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::Action::outgoing_particles_
ParticleList outgoing_particles_
Initially this stores only the PDG codes of final-state particles.
Definition: action.h:334
smash::FourVector::abs
double abs() const
calculate the lorentz invariant absolute value
Definition: fourvector.h:454
smash::Angles::threevec
ThreeVector threevec() const
Definition: angles.h:268
smash::ThreeBodyDecayDilepton::diff_width
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:338
smash::FourVector
Definition: fourvector.h:33
smash::pdg::p
constexpr int p
Proton.
Definition: pdgcode_constants.h:28
smash::Angles
Angles provides a common interface for generating directions: i.e., two angles that should be interpr...
Definition: angles.h:59
smash::random::uniform
T uniform(T min, T max)
Definition: random.h:88
smash::ParticleData::type
const ParticleType & type() const
Get the type of the particle.
Definition: particledata.h:122
smash::DecayActionDilepton::sample_3body_phasespace
void sample_3body_phasespace() override
Sample the full 3-body phase-space (masses, momenta, angles) in the center-of-mass frame for the fina...
Definition: decayactiondilepton.cc:20