Hammer  1.0.0
Helicity Amplitude Module for Matrix Element Reweighting
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
AmplTauEllNuNu.cc
Go to the documentation of this file.
1 ///
2 /// @file AmplTauEllNuNu.cc
3 /// @brief \f$ \tau-> \ell\nu\nu \f$ amplitude
4 ///
5 
6 //**** This file is a part of the HAMMER library
7 //**** Copyright (C) 2016 - 2020 The HAMMER Collaboration
8 //**** HAMMER is licensed under version 3 of the GPL; see COPYING for details
9 //**** Please note the MCnet academic guidelines; see GUIDELINES for details
10 
11 // -*- C++ -*-
13 #include "Hammer/IndexLabels.hh"
14 #include "Hammer/Math/Constants.hh"
15 #include "Hammer/Particle.hh"
16 #include "Hammer/Tools/Pdg.hh"
18 #include <cmath>
19 
20 using namespace std;
21 using namespace complex_literals;
22 
23 namespace Hammer {
24 
25  namespace MD = MultiDimensional;
26 
27  AmplTauEllNuNu::AmplTauEllNuNu() {
28  // Create tensor rank and dimensions
29  vector<IndexType> dims{{2, 2}};
30  string name{"AmplTauEllNuNu"};
31  addProcessSignature(PID::ANTITAU, {PID::NU_TAUBAR, PID::NU_MU, PID::ANTIMUON});
32  addTensor(Tensor{name, MD::makeEmptySparse(dims, {SPIN_NUTAU_REF, SPIN_TAUP})});
33 
34  addProcessSignature(PID::ANTITAU, {PID::NU_TAUBAR, PID::NU_E, PID::POSITRON});
35  addTensor(Tensor{name, MD::makeEmptySparse(dims, {SPIN_NUTAU_REF, SPIN_TAUP})});
36 
37  setSignatureIndex();
38  _multiplicity = 2ul;
39  }
40 
41  void AmplTauEllNuNu::defineSettings() {
42  }
43 
44  void AmplTauEllNuNu::eval(const Particle& parent, const ParticleList& daughters,
45  const ParticleList& references) {
46  // Momenta
47  const FourMomentum& pTau = parent.momentum();
48  const FourMomentum& kNuBarTau = daughters[0].momentum();
49  const FourMomentum& kNuMuon = daughters[1].momentum();
50  const FourMomentum& kMuon = daughters[2].momentum();
51 
52  // Siblings for parent tau case
53  FourMomentum pDmes{1.,0.,0.,0.};
54  FourMomentum kNuTau{1.,0.,0.,1.};
55  if (references.size() >= 2) {
56  pDmes = references[0].momentum();
57  kNuTau = references[1].momentum();
58  }
59  const FourMomentum& pBmes = pDmes + kNuTau + pTau;
60 
61  // kinematic objects
62  const double Mb = pBmes.mass();
63  const double Mb2 = Mb*Mb;
64  const double Md = pDmes.mass();
65  const double Md2 = Md*Md;
66  const double Mt = pTau.mass();
67  const double Mt2 = Mt*Mt;
68  const double Sqq = Mb2 + Md2 - 2. * (pBmes * pDmes);
69  const double sqSqq = sqrt(Sqq);
70  const double Ew = (Mb2 - Md2 + Sqq) / (2 * Mb);
71  const double Pw = sqrt(Ew*Ew - Sqq);
72  const double BNuTau = (pBmes * kNuTau);
73  const double NuTauQ = (pBmes * kNuTau) - (pDmes * kNuTau);
74  const double BQ = Mb2 - (pBmes * pDmes);
75 
76 
77  const double Sqp = 2. * (kMuon * kNuMuon);
78  const double sqSqp = sqrt(Sqp);
79  const double BTau = (pBmes * pTau);
80  const double MuonNuBarTau = (kMuon * kNuBarTau);
81  const double NuMuonNuBarTau = (kNuMuon * kNuBarTau);
82  const double NuMuonNuTau = (kNuMuon * kNuTau);
83  const double NuTauNuBarTau = (kNuTau * kNuBarTau);
84  const double TauNuBarTau = (pTau * kNuBarTau);
85  const double TauNuTau = (pTau * kNuTau);
86  const double BNuBarTau = (pBmes * kNuBarTau);
87  const double epsBDNuTauNuBarTau = epsilon(pBmes, pDmes, kNuTau, kNuBarTau);
88  const double epsNuTauNuBarTauEllonNuMuon = epsilon(kNuTau, kNuBarTau, kMuon, kNuMuon);
89 
90  const double CosTt = -((Ew * (Sqq * BNuTau - NuTauQ * BQ)) / (sqrt(Ew*Ew - Sqq) * NuTauQ * BQ));
91  const double SinTt = sqrt(1. - CosTt*CosTt);
92  const double CscTt = 1. / SinTt;
93 
94  const double CosTW = ((-(Mt2 * NuTauNuBarTau) + TauNuBarTau * TauNuTau) / (TauNuBarTau * TauNuTau));
95  const double SinTW = sqrt(1. - CosTW*CosTW);
96  const double CscTW = 1. / SinTW;
97  const double CosTWHalf = pow((1. + CosTW) / 2., 0.5);
98  const double SinTWHalf = pow((1. - CosTW) / 2., 0.5);
99  const double TanTWHalf = SinTW / (CosTW + 1.);
100 
101  const double CosTm = (2. * (MuonNuBarTau - NuMuonNuBarTau)) / (Mt2 - Sqp);
102  const double SinTm = sqrt(1. - CosTm*CosTm);
103  const double CscTm = 1. / SinTm;
104  const double CosTmHalf = pow((1. + CosTm) / 2., 0.5);
105  // const double SinTmHalf = pow((1. - CosTm) / 2., 0.5);
106 
107  const double CosPtPW = (sqSqq * CscTt * CscTW) / (Mb * Mt * Pw * TauNuBarTau * TauNuTau) *
108  (TauNuTau * (Mt2 * BNuBarTau - BTau * TauNuBarTau) -
109  CosTW * TauNuBarTau * (Mt2 * BNuTau - BTau * TauNuTau));
110  const double SinPtPW = -((sqSqq * CscTt * epsBDNuTauNuBarTau * TanTWHalf) / (Mb * Mt * Pw * NuTauNuBarTau));
111  const complex<double> ExpIPtPW = CosPtPW + 1i * SinPtPW;
112 
113  const double CosPmPW = (CscTm * CscTW) / (Mt * sqSqp * TauNuTau) *
114  (Mt2 * (2 * NuMuonNuTau + (CosTm * CosTW - 1) * TauNuTau) +
115  (1 - CosTW) * (1 + CosTm) * TauNuTau * TauNuBarTau);
116  const double SinPmPW = ((2. * CscTm * epsNuTauNuBarTauEllonNuMuon * TanTWHalf) / (Mt * sqSqp * NuTauNuBarTau));
117  const complex<double> ExpIPmPW = CosPmPW + 1i * SinPmPW;
118 
119  const double TwoSqTwoGfSq = TwoSqTwoGFermi * (sqrt(Mt2 - Sqp));
120 
121  // initialize tensor elements to zero
122  Tensor& t = getTensor();
123  t.clearData();
124 
125  // set tensor elements
126  t.element({0, 0}) = -(Mt * CosTWHalf * SinTm + 2. * ExpIPmPW * sqSqp * pow(CosTmHalf, 2.) * SinTWHalf);
127  t.element({0, 1}) =
128  (2. * ExpIPmPW * sqSqp * pow(CosTmHalf, 2.) * CosTWHalf - Mt * SinTm * SinTWHalf) / (ExpIPtPW);
129  t.element({1, 0}) = (ExpIPtPW)*t.element({0, 0});
130  t.element({1, 1}) = (ExpIPtPW)*t.element({0, 1});
131 
132  t *= TwoSqTwoGfSq;
133  }
134 
135 } // namespace Hammer
TensorData makeEmptySparse(const IndexList &dimensions, const LabelsList &labels)
Tensor indices label definitions.
double mass() const
returns the invariant mass if the invariant mass squared is negative returns
std::vector< Particle > ParticleList
Definition: Particle.fhh:20
Sparse tensor data container.
double epsilon(const FourMomentum &a, const FourMomentum &b, const FourMomentum &c, const FourMomentum &d)
contracts four 4-momenta with an 4D epsilon tensor.
Particle class.
Definition: Particle.hh:30
Multidimensional tensor class with complex numbers as elements.
Definition: Tensor.hh:33
const FourMomentum & momentum() const
Definition: Particle.cc:56
Various numerical constants.
Hammer particle data class.
static constexpr double TwoSqTwoGFermi
Definition: Constants.hh:30
Hammer particle class.
4-momentum class
Definition: FourMomentum.hh:30