Hammer  1.0.0
Helicity Amplitude Module for Matrix Element Reweighting
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
AmplBDstarDPiLepNu.cc
Go to the documentation of this file.
1 ///
2 /// @file AmplBDstarDPiLepNu.cc
3 /// @brief \f$ B \rightarrow D^* \tau\nu, D^* \rightarrow D \pi \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  AmplBDstarDPiLepNu::AmplBDstarDPiLepNu() {
28  // Create tensor rank and dimensions
29  vector<IndexType> dims{{11, 8, 2, 2, 2}};
30  string name{"AmplBDstarDPiLepNu"};
31  addProcessSignature(PID::BPLUS, {-PID::DSTAR, PID::NU_TAU, PID::ANTITAU}, {-PID::D0, PID::PI0});
33 
34  addProcessSignature(PID::BZERO, {PID::DSTARMINUS, PID::NU_TAU, PID::ANTITAU}, {PID::DMINUS, PID::PI0});
36 
37  addProcessSignature(PID::BZERO, {PID::DSTARMINUS, PID::NU_TAU, PID::ANTITAU}, {-PID::D0, PID::PIMINUS});
39 
40  addProcessSignature(PID::BPLUS, {-PID::DSTAR, PID::NU_MU, PID::ANTIMUON}, {-PID::D0, PID::PI0});
42 
43  addProcessSignature(PID::BZERO, {PID::DSTARMINUS, PID::NU_MU, PID::ANTIMUON}, {PID::DMINUS, PID::PI0});
45 
46  addProcessSignature(PID::BZERO, {PID::DSTARMINUS, PID::NU_MU, PID::ANTIMUON}, {-PID::D0, PID::PIMINUS});
48 
49  addProcessSignature(PID::BPLUS, {-PID::DSTAR, PID::NU_E, PID::POSITRON}, {-PID::D0, PID::PI0});
51 
52  addProcessSignature(PID::BZERO, {PID::DSTARMINUS, PID::NU_E, PID::POSITRON}, {PID::DMINUS, PID::PI0});
54 
55  addProcessSignature(PID::BZERO, {PID::DSTARMINUS, PID::NU_E, PID::POSITRON}, {-PID::D0, PID::PIMINUS});
57 
58  //bs -> cs
59  addProcessSignature(PID::BS, {PID::DSSTARMINUS, PID::NU_TAU, PID::ANTITAU}, {PID::DSMINUS, PID::PI0});
61 
62  addProcessSignature(PID::BS, {PID::DSSTARMINUS, PID::NU_MU, PID::ANTIMUON}, {PID::DSMINUS, PID::PI0});
64 
65  addProcessSignature(PID::BS, {PID::DSSTARMINUS, PID::NU_E, PID::POSITRON}, {PID::DSMINUS, PID::PI0});
67 
68  setSignatureIndex();
69  }
70 
71  void AmplBDstarDPiLepNu::eval(const Particle& parent, const ParticleList& daughters,
72  const ParticleList&) {
73  // Momenta
74  const FourMomentum& pBmes = parent.momentum();
75  const FourMomentum& pDstarmes = daughters[0].momentum();
76  const FourMomentum& kNuTau = daughters[1].momentum();
77  const FourMomentum& pTau = daughters[2].momentum();
78  const FourMomentum& pDmes = daughters[3].momentum();
79  const FourMomentum& pPion = daughters[4].momentum();
80 
81  // kinematic objects
82  const double Mb = pBmes.mass();
83  const double Mb2 = Mb*Mb;
84  const double Mds = pDstarmes.mass();
85  const double Mds2 = Mds*Mds;
86  const double Mt = pTau.mass();
87  const double Md = pDmes.mass();
88  const double Md2 = Md*Md;
89  const double Mp = pPion.mass();
90  const double Mp2 = Mp*Mp;
91  const double Sqq = Mb2 + Mds2 - 2. * (pBmes * pDstarmes);
92  const double sqSqq = sqrt(Sqq);
93  const double Ew = (Mb2 - Mds2 + Sqq) / (2 * Mb);
94  const double Eds = (Mb2 + Mds2 - Sqq) / (2 * Mb);
95  const double Pw = sqrt(Ew*Ew - Sqq);
96  const double Pw2 = Pw*Pw;
97  const double BNuTau = (pBmes * kNuTau);
98  const double NuTauQ = (pBmes * kNuTau) - (pDstarmes * kNuTau);
99  const double BQ = Mb2 - (pBmes * pDstarmes);
100  const double Ed = (Mds2 + Md2 - Mp2) / (2. * Mds);
101  const double Ep = (Mds2 - Md2 + Mp2) / (2. * Mds);
102  const double Pp = sqrt(Ed*Ed - Md2);
103  const double DstarQ = pDstarmes * pBmes - Mds2;
104  const double PionQ = (pPion * pBmes) - (pPion * pDstarmes);
105  // const double PionD = (pPion * pDmes);
106  const double PionNuTau = (pPion * kNuTau);
107  const double TauNuTau = (pTau * kNuTau);
108  const double epsBDPiNuTau = epsilon(pBmes, pDmes, pPion, kNuTau);
109 
110  // Helicity Angles
111  const double CosTe = (Eds * Ep * Ew + Ep * Pw*Pw - Mds * PionQ) / (Mb * Pp * Pw);
112  const double SinTe = sqrt(1. - CosTe*CosTe);
113  // double CosTeHalf = pow((1. + CosTe)/2.,0.5);
114  // double SinTeHalf = pow((1. - CosTe)/2.,0.5);
115  const double CscTe = 1. / SinTe;
116 
117  const double CosTt = -((Ew * (Sqq * BNuTau - NuTauQ * BQ)) / (sqrt(Ew*Ew - Sqq) * NuTauQ * BQ));
118  const double SinTt = sqrt(1. - CosTt*CosTt);
119  const double CscTt = 1. / SinTt;
120  // const double CosTtHalf = pow((1. + CosTt) / 2., 0.5);
121  // const double SinTtHalf = pow((1. - CosTt) / 2., 0.5);
122  const double CosTtHalfSq = (1. + CosTt) / 2.;
123  const double SinTtHalfSq = (1. - CosTt) / 2.;
124 
125  const double CosPePt = -(CscTe * CscTt) / (Mds * Pp * sqSqq * NuTauQ) *
126  (Ep * (Sqq * BNuTau - NuTauQ * BQ) - Mds * (Sqq * PionNuTau - NuTauQ * PionQ) +
127  Pp * CosTe * CosTt * DstarQ * NuTauQ);
128  const double SinPePt = (sqSqq * CscTe * CscTt * epsBDPiNuTau) / (Mb * Pp * Pw * TauNuTau);
129  const complex<double> ExpIPePt = CosPePt + 1i * SinPePt;
130 
131  // Collective Functions
132  const complex<double> Dpl = SinTe * (CosTtHalfSq / ExpIPePt + ExpIPePt * SinTtHalfSq);
133  const complex<double> Dplc = SinTe * (CosTtHalfSq * ExpIPePt + SinTtHalfSq / ExpIPePt);
134  const complex<double> Dmi = SinTe * (CosTtHalfSq / ExpIPePt - ExpIPePt * SinTtHalfSq);
135  const complex<double> Dmic = SinTe * (CosTtHalfSq * ExpIPePt - SinTtHalfSq / ExpIPePt);
136  const complex<double> Dze = CosTe * SinTt;
137 
138  const double Epl = CosTe * CosTt;
139  const double EmiR = SinTe * SinTt * CosPePt;
140  const double EmiI = SinTe * SinTt * SinPePt;
141  const double Eze = CosTe;
142 
143  const double TwoSqTwoGfSqPp = TwoSqTwoGFermi * sqrt(Sqq - Mt*Mt) * Pp;
144 
145  const double gPiOnSqrt2MGam = sqrt(3.*pi*Mds/pow(Pp,3.));
146 
147  // initialize tensor elements to zero
148  Tensor& t = getTensor();
149  t.clearData();
150 
151  // set non-zero tensor elements
152  t.element({0, 1, 0, 0, 0}) = Mt * ((Eze * Mb * Pw)/(Mds * Sqq) - EmiR/sqSqq + (Epl * (-Mb2 + Mds2 + Sqq))/(2. * Mds * Sqq));
153  t.element({0, 2, 0, 0, 0}) = (2i * EmiI * Mb * Mt * Pw)/sqSqq;
154  t.element({0, 3, 0, 0, 0}) = (Eze * Mb * Mt * Pw)/Mds;
155  t.element({0, 4, 0, 0, 0}) = -(Mb * Mt * Pw * ((Eze * (-Mb2 + Mds2))/(Mds * Sqq) + (2. * Epl * Mb * Pw)/(Mds * Sqq)));
156  t.element({1, 0, 0, 0, 0}) = -((Eze * Mb * Pw)/Mds);
157  t.element({3, 0, 0, 0, 0}) = (Eze * Mb * Pw)/Mds;
158  t.element({5, 1, 0, 0, 0}) = -(Mt * ((Eze * Mb * Pw)/(Mds * Sqq) - EmiR/sqSqq + (Epl * (-Mb2 + Mds2 + Sqq))/(2. * Mds * Sqq)));
159  t.element({5, 2, 0, 0, 0}) = (2i * EmiI * Mb * Mt * Pw)/sqSqq;
160  t.element({5, 3, 0, 0, 0}) = -((Eze * Mb * Mt * Pw)/Mds);
161  t.element({5, 4, 0, 0, 0}) = Mb * Mt * Pw * ((Eze * (-Mb2 + Mds2))/(Mds * Sqq) + (2. * Epl * Mb * Pw)/(Mds * Sqq));
162  t.element({7, 1, 0, 0, 0}) = Mt * ((Eze * Mb * Pw)/(Mds * Sqq) - EmiR/sqSqq + (Epl * (-Mb2 + Mds2 + Sqq))/(2. * Mds * Sqq));
163  t.element({7, 2, 0, 0, 0}) = (2i * EmiI * Mb * Mt * Pw)/sqSqq;
164  t.element({7, 3, 0, 0, 0}) = (Eze * Mb * Mt * Pw)/Mds;
165  t.element({7, 4, 0, 0, 0}) = -(Mb * Mt * Pw * ((Eze * (-Mb2 + Mds2))/(Mds * Sqq) + (2. * Epl * Mb * Pw)/(Mds * Sqq)));
166  t.element({9, 5, 0, 0, 0}) = (8. * Epl * Mb2 * Pw2)/Mds;
167  t.element({9, 6, 0, 0, 0}) = -2. * (-2. * EmiR * sqSqq + (Epl * (-Mb2 + Mds2 + Sqq))/Mds);
168  t.element({9, 7, 0, 0, 0}) = 2. * ((Epl * (Mb2 + 3. * Mds2 - Sqq))/Mds + (2. * EmiR * (Mb2 - Mds2))/sqSqq + (4i * EmiI * Mb * Pw)/sqSqq);
169  t.element({0, 1, 0, 0, 1}) = -Dmi - (Dze * (-Mb2 + Mds2 + Sqq))/(2. * Mds * sqSqq);
170  t.element({0, 2, 0, 0, 1}) = -2. * Dpl * Mb * Pw;
171  t.element({0, 4, 0, 0, 1}) = (2. * Dze * Mb2 * Pw2)/(Mds * sqSqq);
172  t.element({5, 1, 0, 0, 1}) = Dmi + (Dze * (-Mb2 + Mds2 + Sqq))/(2. * Mds * sqSqq);
173  t.element({5, 2, 0, 0, 1}) = -2. * Dpl * Mb * Pw;
174  t.element({5, 4, 0, 0, 1}) = (-2. * Dze * Mb2 * Pw2)/(Mds * sqSqq);
175  t.element({7, 1, 0, 0, 1}) = -Dmi - (Dze * (-Mb2 + Mds2 + Sqq))/(2. * Mds * sqSqq);
176  t.element({7, 2, 0, 0, 1}) = -2. * Dpl * Mb * Pw;
177  t.element({7, 4, 0, 0, 1}) = (2. * Dze * Mb2 * Pw2)/(Mds * sqSqq);
178  t.element({9, 5, 0, 0, 1}) = (-8. * Dze * Mb2 * Mt * Pw2)/(Mds * sqSqq);
179  t.element({9, 6, 0, 0, 1}) = 2. * Mt * (2. * Dmi + (Dze * (-Mb2 + Mds2 + Sqq))/(Mds * sqSqq));
180  t.element({9, 7, 0, 0, 1}) = -2. * Mt * ((-2. * Dmi * (Mb2 - Mds2))/Sqq + (4. * Dpl * Mb * Pw)/Sqq + (Dze * (Mb2 + 3. * Mds2 - Sqq))/(Mds * sqSqq));
181  t.element({6, 1, 1, 1, 0}) = Dmic + (Dze * (-Mb2 + Mds2 + Sqq))/(2. * Mds * sqSqq);
182  t.element({6, 2, 1, 1, 0}) = 2. * Dplc * Mb * Pw;
183  t.element({6, 4, 1, 1, 0}) = (-2. * Dze * Mb2 * Pw2)/(Mds * sqSqq);
184  t.element({8, 1, 1, 1, 0}) = -Dmic - (Dze * (-Mb2 + Mds2 + Sqq))/(2. * Mds * sqSqq);
185  t.element({8, 2, 1, 1, 0}) = 2. * Dplc * Mb * Pw;
186  t.element({8, 4, 1, 1, 0}) = (2. * Dze * Mb2 * Pw2)/(Mds * sqSqq);
187  t.element({10, 5, 1, 1, 0}) = (8. * Dze * Mb2 * Mt * Pw2)/(Mds * sqSqq);
188  t.element({10, 6, 1, 1, 0}) = 2. * Mt * (-2. * Dmic - (Dze * (-Mb2 + Mds2 + Sqq))/(Mds * sqSqq));
189  t.element({10, 7, 1, 1, 0}) = 2. * Mt * ((-2. * Dmic * (Mb2 - Mds2))/Sqq + (4. * Dplc * Mb * Pw)/Sqq + (Dze * (Mb2 + 3. * Mds2 - Sqq))/(Mds * sqSqq));
190  t.element({2, 0, 1, 1, 1}) = (Eze * Mb * Pw)/Mds;
191  t.element({4, 0, 1, 1, 1}) = -((Eze * Mb * Pw)/Mds);
192  t.element({6, 1, 1, 1, 1}) = Mt * ((Eze * Mb * Pw)/(Mds * Sqq) - EmiR/sqSqq + (Epl * (-Mb2 + Mds2 + Sqq))/(2. * Mds * Sqq));
193  t.element({6, 2, 1, 1, 1}) = (-2i * EmiI * Mb * Mt * Pw)/sqSqq;
194  t.element({6, 3, 1, 1, 1}) = (Eze * Mb * Mt * Pw)/Mds;
195  t.element({6, 4, 1, 1, 1}) = -(Mb * Mt * Pw * ((Eze * (-Mb2 + Mds2))/(Mds * Sqq) + (2. * Epl * Mb * Pw)/(Mds * Sqq)));
196  t.element({8, 1, 1, 1, 1}) = -(Mt * ((Eze * Mb * Pw)/(Mds * Sqq) - EmiR/sqSqq + (Epl * (-Mb2 + Mds2 + Sqq))/(2. * Mds * Sqq)));
197  t.element({8, 2, 1, 1, 1}) = (-2i * EmiI * Mb * Mt * Pw)/sqSqq;
198  t.element({8, 3, 1, 1, 1}) = -((Eze * Mb * Mt * Pw)/Mds);
199  t.element({8, 4, 1, 1, 1}) = Mb * Mt * Pw * ((Eze * (-Mb2 + Mds2))/(Mds * Sqq) + (2. * Epl * Mb * Pw)/(Mds * Sqq));
200  t.element({10, 5, 1, 1, 1}) = (8. * Epl * Mb2 * Pw2)/Mds;
201  t.element({10, 6, 1, 1, 1}) = -2. * (-2. * EmiR * sqSqq + (Epl * (-Mb2 + Mds2 + Sqq))/Mds);
202  t.element({10, 7, 1, 1, 1}) = 2. * ((Epl * (Mb2 + 3. * Mds2 - Sqq))/Mds + (2. * EmiR * (Mb2 - Mds2))/sqSqq - (4i * EmiI * Mb * Pw)/sqSqq);
203 
204  t *= TwoSqTwoGfSqPp*gPiOnSqrt2MGam;
205  }
206 
207  void AmplBDstarDPiLepNu::addRefs() const {
208  if(!getSettingsHandler()->checkReference("Ligeti:2016npd")){
209  string ref =
210  "@article{Ligeti:2016npd,\n"
211  " author = \"Ligeti, Zoltan and Papucci, Michele and Robinson, Dean J.\",\n"
212  " title = \"{New Physics in the Visible Final States of $B\\to D^{(*)}\\tau\\nu$}\",\n"
213  " journal = \"JHEP\",\n"
214  " volume = \"01\",\n"
215  " year = \"2017\",\n"
216  " pages = \"083\",\n"
217  " doi = \"10.1007/JHEP01(2017)083\",\n"
218  " eprint = \"1610.02045\",\n"
219  " archivePrefix = \"arXiv\",\n"
220  " primaryClass = \"hep-ph\",\n"
221  " SLACcitation = \"%%CITATION = ARXIV:1610.02045;%%\"\n"
222  "}\n";
223  getSettingsHandler()->addReference("Ligeti:2016npd", ref);
224  }
225  }
226 
227 } // 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
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
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
static constexpr double pi
Definition: Constants.hh:21