Hammer  1.0.0
Helicity Amplitude Module for Matrix Element Reweighting
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
AmplBD0starLepNu.cc
Go to the documentation of this file.
1 ///
2 /// @file AmplBD0starLepNu.cc
3 /// @brief \f$ B \rightarrow D_0^* \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  AmplBD0starLepNu::AmplBD0starLepNu() {
28  // Create tensor rank and dimensions
29  vector<IndexType> dims{{11, 4, 2, 2, 2}};
30  string name{"AmplBD0starLepNu"};
31  addProcessSignature(PID::BPLUS, {-PID::DSSD0STAR, PID::NU_TAU, PID::ANTITAU});
33 
34  addProcessSignature(PID::BZERO, {PID::DSSD0STARMINUS, PID::NU_TAU, PID::ANTITAU});
36 
37  addProcessSignature(PID::BPLUS, {-PID::DSSD0STAR, PID::NU_MU, PID::ANTIMUON});
39 
40  addProcessSignature(PID::BZERO, {PID::DSSD0STARMINUS, PID::NU_MU, PID::ANTIMUON});
42 
43  addProcessSignature(PID::BPLUS, {-PID::DSSD0STAR, PID::NU_E, PID::POSITRON});
45 
46  addProcessSignature(PID::BZERO, {PID::DSSD0STARMINUS, PID::NU_E, PID::POSITRON});
48 
49  //bs -> cs
50  addProcessSignature(PID::BS, {PID::DSSDS0STARMINUS, PID::NU_TAU, PID::ANTITAU});
52 
53  addProcessSignature(PID::BS, {PID::DSSDS0STARMINUS, PID::NU_MU, PID::ANTIMUON});
55 
56  addProcessSignature(PID::BS, {PID::DSSDS0STARMINUS, PID::NU_E, PID::POSITRON});
58 
59  setSignatureIndex();
60  }
61 
62  void AmplBD0starLepNu::eval(const Particle& parent, const ParticleList& daughters,
63  const ParticleList&) {
64  // Momenta
65  const FourMomentum& pBmes = parent.momentum();
66  const FourMomentum& pD0starmes = daughters[0].momentum();
67  const FourMomentum& kNuTau = daughters[1].momentum();
68  const FourMomentum& pTau = daughters[2].momentum();
69 
70  // kinematic objects
71  const double Mb = pBmes.mass();
72  const double Mb2 = Mb*Mb;
73  const double Mc = pD0starmes.mass();
74  const double Mc2 = Mc*Mc;
75  const double Mt = pTau.mass();
76  const double Mt2 = Mt*Mt;
77  const double Sqq = Mb2 + Mc2 - 2. * (pBmes * pD0starmes);
78  // const double sqSqq = sqrt(Sqq);
79  const double Ew = (Mb2 - Mc2 + Sqq) / (2 * Mb);
80  const double BNuTau = (pBmes * kNuTau);
81  const double NuTauQ = (pBmes * kNuTau) - (pD0starmes * kNuTau);
82  const double BQ = Mb2 - (pBmes * pD0starmes);
83 
84  const double w = (Mb2 + Mc2 - Sqq)/(2 * Mb * Mc);
85  const double rC = Mc/Mb;
86  const double rt = Mt/Mb;
87 
88  const double mSqq = Sqq/Mb2;
89  const double w2m1 = w*w - 1;
90  const double Sqw2m1 = sqrt(w2m1);
91  // const double SqmSqq = sqrt(mSqq);
92  const double Sqw2m1OnmSqq = sqrt(w2m1/mSqq);
93  const double SqmSqqw2m1 = sqrt(mSqq*w2m1);
94  // const double w2m132 = pow(w2m1,1.5);
95 
96  // Helicity Angles
97  const double CosTt = -((Ew * (Sqq * BNuTau - NuTauQ * BQ)) / (sqrt(Ew*Ew - Sqq) * NuTauQ * BQ));
98  const double SinTt = sqrt(1. - CosTt*CosTt);
99  // const double CosTtHalfSq = (1. + CosTt) / 2.;
100  // const double SinTtHalfSq = (1. - CosTt) / 2.;
101 
102  const double prefactor = 2*sqrt2*GFermi*sqrt(Mb*Mc)*sqrt(Sqq - Mt2);
103 
104  // initialize tensor elements to zero
105  Tensor& t = getTensor();
106  t.clearData();
107 
108  // set non-zero tensor elements
109  // NB: Amplitudes include additional D0star phase, defined wrt D0star spin!
110  t.element({0,1,0,0,0}) = -(rt*((rC - 1)*(1 + w) + CosTt*(1 + rC)*Sqw2m1))/(2.*mSqq);
111  t.element({0,2,0,0,0}) = -(rt*((1 + rC)*(w - 1) + CosTt*(rC - 1)*Sqw2m1))/(2.*mSqq);
112  t.element({1,0,0,0,0}) = -0.5;
113  t.element({3,0,0,0,0}) = 0.5;
114  t.element({5,1,0,0,0}) = (rt*((rC - 1)*(1 + w) + CosTt*(1 + rC)*Sqw2m1))/(2.*mSqq);
115  t.element({5,2,0,0,0}) = (rt*((1 + rC)*(w - 1) + CosTt*(rC - 1)*Sqw2m1))/(2.*mSqq);
116  t.element({7,1,0,0,0}) = -(rt*((rC - 1)*(1 + w) + CosTt*(1 + rC)*Sqw2m1))/(2.*mSqq);
117  t.element({7,2,0,0,0}) = -(rt*((1 + rC)*(w - 1) + CosTt*(rC - 1)*Sqw2m1))/(2.*mSqq);
118  t.element({9,3,0,0,0}) = 2.*CosTt*Sqw2m1;
119  t.element({0,1,0,0,1}) = ((1 + rC)*SinTt*Sqw2m1OnmSqq)/2.;
120  t.element({0,2,0,0,1}) = ((rC - 1)*SinTt*Sqw2m1OnmSqq)/2.;
121  t.element({5,1,0,0,1}) = -((1 + rC)*SinTt*Sqw2m1OnmSqq)/2.;
122  t.element({5,2,0,0,1}) = -((rC - 1)*SinTt*Sqw2m1OnmSqq)/2.;
123  t.element({7,1,0,0,1}) = ((1 + rC)*SinTt*Sqw2m1OnmSqq)/2.;
124  t.element({7,2,0,0,1}) = ((rC - 1)*SinTt*Sqw2m1OnmSqq)/2.;
125  t.element({9,3,0,0,1}) = -2.*rt*SinTt*Sqw2m1OnmSqq;
126  t.element({6,1,1,1,0}) = -((1 + rC)*SinTt*SqmSqqw2m1)/(2.*mSqq);
127  t.element({6,2,1,1,0}) = -((rC - 1)*SinTt*SqmSqqw2m1)/(2.*mSqq);
128  t.element({8,1,1,1,0}) = ((1 + rC)*SinTt*SqmSqqw2m1)/(2.*mSqq);
129  t.element({8,2,1,1,0}) = ((rC - 1)*SinTt*SqmSqqw2m1)/(2.*mSqq);
130  t.element({10,3,1,1,0}) = 2.*rt*SinTt*Sqw2m1OnmSqq;
131  t.element({2,0,1,1,1}) = 0.5;
132  t.element({4,0,1,1,1}) = -0.5;
133  t.element({6,1,1,1,1}) = -(rt*((rC - 1)*(1 + w) + CosTt*(1 + rC)*Sqw2m1))/(2.*mSqq);
134  t.element({6,2,1,1,1}) = -(rt*((1 + rC)*(w - 1) + CosTt*(rC - 1)*Sqw2m1))/(2.*mSqq);
135  t.element({8,1,1,1,1}) = (rt*((rC - 1)*(1 + w) + CosTt*(1 + rC)*Sqw2m1))/(2.*mSqq);
136  t.element({8,2,1,1,1}) = (rt*((1 + rC)*(w - 1) + CosTt*(rC - 1)*Sqw2m1))/(2.*mSqq);
137  t.element({10,3,1,1,1}) = 2.*CosTt*Sqw2m1;
138 
139  t *= prefactor;
140  }
141 
142  void AmplBD0starLepNu::addRefs() const {
143  if(!getSettingsHandler()->checkReference("Bernlochner:2017jxt")){
144  string ref =
145  "@article{Bernlochner:2017jxt,\n"
146  " author = \"Bernlochner, Florian U. and Ligeti, Zoltan and Robinson, Dean J.\",\n"
147  " title = \"{Model independent analysis of semileptonic $B$ decays to $D^{**}$ for arbitrary new physics}\",\n"
148  " journal = \"Phys. Rev.\",\n"
149  " volume = \"D97\",\n"
150  " year = \"2018\",\n"
151  " number = \"7\",\n"
152  " pages = \"075011\",\n"
153  " doi = \"10.1103/PhysRevD.97.075011\",\n"
154  " eprint = \"1711.03110\",\n"
155  " archivePrefix = \"arXiv\",\n"
156  " primaryClass = \"hep-ph\",\n"
157  " SLACcitation = \"%%CITATION = ARXIV:1711.03110;%%\"\n"
158  "}\n";
159  getSettingsHandler()->addReference("Bernlochner:2017jxt", ref);
160  }
161  }
162 
163 } // 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
static constexpr double GFermi
Definition: Constants.hh:29
Tensor indices label definitions.
static constexpr double sqrt2
Definition: Constants.hh:26
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.
Hammer particle class.
Main class.
Definition: Hammer.hh:45
4-momentum class
Definition: FourMomentum.hh:30