Hammer  1.0.0
Helicity Amplitude Module for Matrix Element Reweighting
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
AmplTauPiNu.cc
Go to the documentation of this file.
1 ///
2 /// @file AmplTauPiNu.cc
3 /// @brief \f$ \tau-> \pi\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  AmplTauPiNu::AmplTauPiNu() {
28  // Create tensor rank and dimensions
29  vector<IndexType> dims{{2, 2}};
30  string name{"AmplTauPiNu"};
31  addProcessSignature(PID::ANTITAU, {PID::PIPLUS, PID::NU_TAUBAR});
32  addTensor(Tensor{name, MD::makeEmptySparse(dims, {SPIN_NUTAU_REF, SPIN_TAUP})});
33 
34  setSignatureIndex();
35  _multiplicity = 2ul;
36  }
37 
38  void AmplTauPiNu::defineSettings() {
39  }
40 
41  void AmplTauPiNu::eval(const Particle& parent, const ParticleList& daughters,
42  const ParticleList& references) {
43  // Momenta
44  const FourMomentum& pTau = parent.momentum();
45  const FourMomentum& pPion = daughters[0].momentum();
46  const FourMomentum& kNuBarTau = daughters[1].momentum();
47 
48  // Siblings for parent tau case
49  FourMomentum pDmes{1.,0.,0.,0.};
50  FourMomentum kNuTau{1.,0.,0.,1.};
51  if (references.size() >= 2) {
52  pDmes = references[0].momentum();
53  kNuTau = references[1].momentum();
54  }
55  const FourMomentum& pBmes = pDmes + kNuTau + pTau;
56 
57  // kinematic objects
58  const double Mb = pBmes.mass();
59  const double Mb2 = Mb*Mb;
60  const double Md = pDmes.mass();
61  const double Md2 = Md*Md;
62  const double Mt = pTau.mass();
63  const double Mt2 = Mt*Mt;
64  const double Mp = pPion.mass();
65  const double Mp2 = Mp*Mp;
66  const double Sqq = Mb2 + Md2 - 2. * (pBmes * pDmes);
67  const double sqSqq = sqrt(Sqq);
68  const double Ew = (Mb2 - Md2 + Sqq) / (2 * Mb);
69  const double Pw = sqrt(Ew*Ew - Sqq);
70  const double BNuTau = (pBmes * kNuTau);
71  const double NuTauQ = (pBmes * kNuTau) - (pDmes * kNuTau);
72  const double BQ = Mb2 - (pBmes * pDmes);
73 
74  const double BTau = (pBmes * pTau);
75  const double NuTauNuBarTau = (kNuTau * kNuBarTau);
76  const double TauNuBarTau = (pTau * kNuBarTau);
77  const double TauNuTau = (pTau * kNuTau);
78  const double BNuBarTau = (pBmes * kNuBarTau);
79  const double epsBDNuTauNuBarTau = epsilon(pBmes, pDmes, kNuTau, kNuBarTau);
80 
81  const double CosTt = -((Ew * (Sqq * BNuTau - NuTauQ * BQ)) / (sqrt(Ew*Ew - Sqq) * NuTauQ * BQ));
82  const double SinTt = sqrt(1. - CosTt*CosTt);
83  const double CscTt = 1. / SinTt;
84 
85  const double CosTW = ((-(Mt2 * NuTauNuBarTau) + TauNuBarTau * TauNuTau) / (TauNuBarTau * TauNuTau));
86  const double SinTW = sqrt(1. - CosTW*CosTW);
87  const double CscTW = 1. / SinTW;
88  const double CosTWHalf = pow((1. + CosTW) / 2., 0.5);
89  const double SinTWHalf = pow((1. - CosTW) / 2., 0.5);
90  const double TanTWHalf = SinTW / (CosTW + 1.);
91 
92  const double CosPtPW = (sqSqq * CscTt * CscTW) / (Mb * Mt * Pw * TauNuBarTau * TauNuTau) *
93  (TauNuTau * (Mt2 * BNuBarTau - BTau * TauNuBarTau) -
94  CosTW * TauNuBarTau * (Mt2 * BNuTau - BTau * TauNuTau));
95  const double SinPtPW = -((sqrt(Sqq) * CscTt * epsBDNuTauNuBarTau * TanTWHalf) / (Mb * Mt * Pw * NuTauNuBarTau));
96  const complex<double> ExpIPtPW = CosPtPW + 1i * SinPtPW;
97 
98 
99  const double TwoSqTwoGfSq = 2 * sqrt2 * FPion * GFermi * (sqrt(Mt2 - Mp2)) * Mt;
100 
101  // initialize tensor elements to zero
102  Tensor& t = getTensor();
103  t.clearData();
104 
105  // set tensor elements
106  t.element({0, 0}) = CosTWHalf;
107  t.element({1, 1}) = SinTWHalf;
108  t.element({1, 0}) = (ExpIPtPW)*t.element({0, 0});
109  t.element({0, 1}) = t.element({1, 1}) / (ExpIPtPW);
110 
111  t *= TwoSqTwoGfSq;
112  }
113 
114 } // namespace Hammer
TensorData makeEmptySparse(const IndexList &dimensions, const LabelsList &labels)
static constexpr double GFermi
Definition: Constants.hh:29
Tensor indices label definitions.
static constexpr double FPion
Definition: Constants.hh:31
static constexpr double sqrt2
Definition: Constants.hh:26
double mass() const
returns the invariant mass if the invariant mass squared is negative returns
amplitude
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.
Hammer particle class.
4-momentum class
Definition: FourMomentum.hh:30