Hammer  1.0.0
Helicity Amplitude Module for Matrix Element Reweighting
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
AmplBDLepNu.cc
Go to the documentation of this file.
1 ///
2 /// @file AmplBDLepNu.cc
3 /// @brief \f$ B \rightarrow D \tau\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  AmplBDLepNu::AmplBDLepNu() {
28  // Create tensor rank and dimensions
29 
30  vector<IndexType> dims{{11, 4, 2, 2, 2}};
31  string name{"AmplBDLepNu"};
32  addProcessSignature(PID::BPLUS, {-PID::D0, PID::NU_TAU, PID::ANTITAU});
34 
35  addProcessSignature(PID::BZERO, {PID::DMINUS, PID::NU_TAU, PID::ANTITAU});
37 
38  addProcessSignature(PID::BPLUS, {-PID::D0, PID::NU_MU, PID::ANTIMUON});
40 
41  addProcessSignature(PID::BZERO, {PID::DMINUS, PID::NU_MU, PID::ANTIMUON});
43 
44  addProcessSignature(PID::BPLUS, {-PID::D0, PID::NU_E, PID::POSITRON});
46 
47  addProcessSignature(PID::BZERO, {PID::DMINUS, PID::NU_E, PID::POSITRON});
49 
50  //bs -> cs
51  addProcessSignature(PID::BS, {PID::DSMINUS, PID::NU_TAU, PID::ANTITAU});
53 
54  addProcessSignature(PID::BS, {PID::DSMINUS, PID::NU_MU, PID::ANTIMUON});
56 
57  addProcessSignature(PID::BS, {PID::DSMINUS, PID::NU_E, PID::POSITRON});
59 
60  setSignatureIndex();
61  }
62 
63  void AmplBDLepNu::eval(const Particle& parent, const ParticleList& daughters,
64  const ParticleList&) {
65  // Momenta
66  const FourMomentum& pBmes = parent.momentum();
67  const FourMomentum& pDmes = daughters[0].momentum();
68  const FourMomentum& kNuTau = daughters[1].momentum();
69  const FourMomentum& pTau = daughters[2].momentum();
70 
71  // kinematic objects
72  const double Mb = pBmes.mass();
73  const double Mb2 = Mb*Mb;
74  const double Md = pDmes.mass();
75  const double Md2 = Md*Md;
76  const double Mt = pTau.mass();
77  const double Sqq = Mb2 + Md2 - 2. * (pBmes * pDmes);
78  const double sqSqq = sqrt(Sqq);
79  const double Ew = (Mb2 - Md2 + Sqq) / (2 * Mb);
80  const double Pw = sqrt(Ew*Ew - Sqq);
81  const double BNuTau = (pBmes * kNuTau);
82  const double NuTauQ = (pBmes * kNuTau) - (pDmes * kNuTau);
83  const double BQ = Mb2 - (pBmes * pDmes);
84 
85  // Helicity Angles
86  const double CosTt = -((Ew * (Sqq * BNuTau - NuTauQ * BQ)) / (sqrt(Ew*Ew - Sqq) * NuTauQ * BQ));
87  const double SinTt = sqrt(1. - CosTt*CosTt);
88  // double CscTt = 1. / SinTt;
89 
90  const double TwoSqTwoGfSq = TwoSqTwoGFermi * sqrt(Sqq - Mt*Mt);
91 
92  // initialize tensor elements to zero
93  Tensor& t = getTensor();
94  t.clearData();
95 
96  // set non-zero tensor elements
97  t.element({0, 1, 0, 0, 0}) = ((-Mb2 + Md2)*Mt)/(2.*Sqq);
98  t.element({0, 2, 0, 0, 0}) = (Mb*Mt*Pw*CosTt)/Sqq;
99  t.element({1, 0, 0, 0, 0}) = 0.5;
100  t.element({3, 0, 0, 0, 0}) = 0.5;
101  t.element({5, 1, 0, 0, 0}) = ((-Mb2 + Md2)*Mt)/(2.*Sqq);
102  t.element({5, 2, 0, 0, 0}) = (Mb*Mt*Pw*CosTt)/Sqq;
103  t.element({7, 1, 0, 0, 0}) = ((-Mb2 + Md2)*Mt)/(2.*Sqq);
104  t.element({7, 2, 0, 0, 0}) = (Mb*Mt*Pw*CosTt)/Sqq;
105  t.element({9, 3, 0, 0, 0}) = -4.*Mb*Pw*CosTt;
106  t.element({0, 2, 0, 0, 1}) = -((Mb*Pw*SinTt)/sqSqq);
107  t.element({5, 2, 0, 0, 1}) = -((Mb*Pw*SinTt)/sqSqq);
108  t.element({7, 2, 0, 0, 1}) = -((Mb*Pw*SinTt)/sqSqq);
109  t.element({9, 3, 0, 0, 1}) = (4.*Mb*Mt*Pw*SinTt)/sqSqq;
110  t.element({6, 2, 1, 1, 0}) = -((Mb*Pw*SinTt)/sqSqq);
111  t.element({8, 2, 1, 1, 0}) = -((Mb*Pw*SinTt)/sqSqq);
112  t.element({10, 3, 1, 1, 0}) = (4.*Mb*Mt*Pw*SinTt)/sqSqq;
113  t.element({2, 0, 1, 1, 1}) = -0.5;
114  t.element({4, 0, 1, 1, 1}) = -0.5;
115  t.element({6, 1, 1, 1, 1}) = ((Mb2 - Md2)*Mt)/(2.*Sqq);
116  t.element({6, 2, 1, 1, 1}) = -((Mb*Mt*Pw*CosTt)/Sqq);
117  t.element({8, 1, 1, 1, 1}) = ((Mb2 - Md2)*Mt)/(2.*Sqq);
118  t.element({8, 2, 1, 1, 1}) = -((Mb*Mt*Pw*CosTt)/Sqq);
119  t.element({10, 3, 1, 1, 1}) = 4.*Mb*Pw*CosTt;
120 
121  t *= TwoSqTwoGfSq;
122  }
123 
124  void AmplBDLepNu::addRefs() const {
125  if(!getSettingsHandler()->checkReference("Ligeti:2016npd")){
126  string ref =
127  "@article{Ligeti:2016npd,\n"
128  " author = \"Ligeti, Zoltan and Papucci, Michele and Robinson, Dean J.\",\n"
129  " title = \"{New Physics in the Visible Final States of $B\\to D^{(*)}\\tau\\nu$}\",\n"
130  " journal = \"JHEP\",\n"
131  " volume = \"01\",\n"
132  " year = \"2017\",\n"
133  " pages = \"083\",\n"
134  " doi = \"10.1007/JHEP01(2017)083\",\n"
135  " eprint = \"1610.02045\",\n"
136  " archivePrefix = \"arXiv\",\n"
137  " primaryClass = \"hep-ph\",\n"
138  " SLACcitation = \"%%CITATION = ARXIV:1610.02045;%%\"\n"
139  "}\n";
140  getSettingsHandler()->addReference("Ligeti:2016npd", ref);
141  }
142  }
143 
144 } // namespace Hammer
TensorData makeEmptySparse(const IndexList &dimensions, const LabelsList &labels)
std::complex< double > & element(const IndexList &indices={})
access an element given its indices
Definition: Tensor.cc:67
amplitude
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.
Particle class.
Definition: Particle.hh:30
Multidimensional tensor class with complex numbers as elements.
Definition: Tensor.hh:33
void clearData()
sets all the elements to 0
Definition: Tensor.cc:229
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