Hammer  1.0.0
Helicity Amplitude Module for Matrix Element Reweighting
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
FFBtoDstarBGL.cc
Go to the documentation of this file.
1 ///
2 /// @file FFBtoDstarBGL.cc
3 /// @brief \f$ B \rightarrow D \f$ BGL form factors
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/Math/Utils.hh"
16 #include "Hammer/Particle.hh"
17 #include "Hammer/Tools/Pdg.hh"
19 #include <cmath>
20 
21 #include <iostream>
22 
23 using namespace std;
24 
25 namespace Hammer {
26 
27  namespace MD = MultiDimensional;
28 
29  FFBtoDstarBGL::FFBtoDstarBGL() {
30  // Create tensor rank and dimensions
31  vector<IndexType> dims = {8};
32  string name{"FFBtoDstarBGL"};
33 
34  setPrefix("BtoD*");
35  addProcessSignature(PID::BPLUS, {-PID::DSTAR});
36  addTensor(Tensor{name, MD::makeEmptySparse(dims, {FF_BDSTAR})});
37 
38  addProcessSignature(PID::BZERO, {PID::DSTARMINUS});
39  addTensor(Tensor{name, MD::makeEmptySparse(dims, {FF_BDSTAR})});
40 
41  setPrefix("BstoDs*");
42  addProcessSignature(PID::BS, {PID::DSSTARMINUS});
43  addTensor(Tensor{name, MD::makeEmptySparse(dims, {FF_BSDSSTAR})});
44 
45  setSignatureIndex();
46  }
47 
48  void FFBtoDstarBGL::defineSettings() {
49  //_FFErrNames = ;
50  setPath(getFFErrPrefixGroup().get());
51  setUnits("GeV");
52 
53  addSetting<double>("Vcb", 41.5e-3);
54  addSetting<double>("Chim", 3.07e-4); //GeV^-2
55  addSetting<double>("Chip", 5.280e-4); //GeV^-2
56  addSetting<double>("ChimL",19.421e-3);
57 
58 // vector<double> avec={0.012,0.7,0.8};
59 // vector<double> bvec={0.01223,-0.054, 0.2};
60 // vector<double> cvec={-0.01,0.12};
61  vector<double> avec={0.00038,0.026905,0.};
62  vector<double> bvec={0.00055,-0.0020370,0.};
63  vector<double> cvec={-0.000433,0.005353};
64  //Made up values
65  vector<double> dvec={0.0025,-0.013};
66  addSetting<vector<double>>("avec",avec);
67  addSetting<vector<double>>("bvec",bvec);
68  addSetting<vector<double>>("cvec",cvec);
69  addSetting<vector<double>>("dvec",dvec);
70 
71  vector<double> BcStatesf{6.730,6.736,7.135,7.142}; //GeV
72  vector<double> BcStatesg{6.337,6.899,7.012,7.280}; //GeV
73  vector<double> BcStatesP1{6.275,6.842,7.250}; //GeV
74  addSetting<vector<double>>("BcStatesf",BcStatesf);
75  addSetting<vector<double>>("BcStatesg",BcStatesg);
76  addSetting<vector<double>>("BcStatesP1",BcStatesP1);
77 
78  initialized = true;
79  }
80 
81  void FFBtoDstarBGL::evalAtPSPoint(const vector<double>& point, const vector<double>& masses) {
82  Tensor& result = getTensor();
83  result.clearData();
84 
85  if(!initialized){
86  MSG_WARNING("Warning, Settings have not been defined!");
87  }
88 
89  double Mb = 0.;
90  double Mc = 0.;
91  double unitres = 1.;
92  if(masses.size() >= 2) {
93  Mb = masses[0];
94  Mc = masses[1];
95  unitres = _units;
96  }
97  else {
98  Mb = this->masses()[0];
99  Mc = this->masses()[1];
100  }
101  const double Sqq = point[0];
102  const double Mb2 = Mb*Mb;
103  const double Mb3 = Mb2*Mb;
104  const double Mc2 = Mc*Mc;
105  const double rC = Mc/Mb;
106  const double rC2 = rC*rC;
107  const double sqrC = sqrt(rC);
108 
109  double w = (Mb2 + Mc2 - Sqq) / (2. * Mb * Mc);
110  //safety measure if w==1.0
111  if(isZero(w - 1.0)) w += 1e-6;
112  const double w2 = w*w;
113 
114  const size_t nmax = 4;
115  const double z = (sqrt(w+1) - sqrt2)/(sqrt(w+1) + sqrt2);
116  vector<double> zpow{1.};
117  for (size_t n = 1; n < nmax; ++n){
118  zpow.push_back(zpow[n-1]*z);
119  }
120 
121  const vector<double>& ag=(*getSetting<vector<double>>("avec"));
122  const vector<double>& af=(*getSetting<vector<double>>("bvec"));
123  const vector<double>& aF1=(*getSetting<vector<double>>("cvec"));
124  const vector<double>& aP1=(*getSetting<vector<double>>("dvec"));
125 
126  const double nc=2.6;
127  const double etaEWVcb = 1.0066*(*getSetting<double>("Vcb"));
128  const double chim = (*getSetting<double>("Chim"))/(unitres*unitres);
129  const double chip = (*getSetting<double>("Chip"))/(unitres*unitres);
130  const double chimL=(*getSetting<double>("ChimL"));
131 
132  const double tp=(Mb+Mc)*(Mb+Mc)/Mb2;
133  const double tm=(Mb-Mc)*(Mb-Mc)/Mb2;
134  const double sqtptm = sqrt(tp - tm);
135 
136  vector<double>& BcStatesf = (*getSetting<vector<double>>("BcStatesf"));
137  vector<double>& BcStatesg = (*getSetting<vector<double>>("BcStatesg"));
138  vector<double>& BcStatesP1 = (*getSetting<vector<double>>("BcStatesP1"));
139 
140  double Pf = 1.;
141  for(size_t n = 0; n< BcStatesf.size(); ++n){
142  double sqtpBc = sqrt(tp-pow(BcStatesf[n]*unitres/Mb,2));
143  Pf *= ((z-((sqtpBc-sqtptm)/(sqtpBc+sqtptm)))/(1.-z*((sqtpBc-sqtptm)/(sqtpBc+sqtptm))));
144  }
145 
146  double PF1 = Pf;
147 
148  double Pg = 1.;
149  for(size_t n = 0; n< BcStatesg.size(); ++n){
150  double sqtpBc = sqrt(tp-pow(BcStatesg[n]*unitres/Mb,2));
151  Pg *= ((z-((sqtpBc-sqtptm)/(sqtpBc+sqtptm)))/(1.-z*((sqtpBc-sqtptm)/(sqtpBc+sqtptm))));
152  }
153 
154  double PP1 = 1.;
155  for(size_t n = 0; n< BcStatesP1.size(); ++n){
156  double sqtpBc = sqrt(tp-pow(BcStatesP1[n]*unitres/Mb,2));
157  PP1 *= ((z-((sqtpBc-sqtptm)/(sqtpBc+sqtptm)))/(1.-z*((sqtpBc-sqtptm)/(sqtpBc+sqtptm))));
158  }
159 
160  const double phig=sqrt(256.*nc/(3*pi*chip))*((rC2*pow(1+z,2)*pow(1-z,-0.5))/pow(((1+rC)*(1-z)+2*sqrC*(1+z)),4));
161  const double phif=(1./Mb2)*sqrt(16.*nc/(3*pi*chim))*((rC*(1+z)*pow(1-z,1.5))/pow(((1+rC)*(1-z)+2*sqrC*(1+z)),4));
162  const double phiF1=(1./Mb3)*sqrt(8.*nc/(3*pi*chim))*((rC*(1+z)*pow(1-z,2.5))/pow(((1+rC)*(1-z)+2*sqrC*(1+z)),5));
163 
164  const double phif_0 = 4.*rC*sqrt(nc/chim)/(Mb2*sqrt(3*pi)*pow(1+2*sqrC+rC,4));
165  const double phiF1_0 = 2.*sqrt(2/(3*pi))*rC*sqrt(nc/chim)/(Mb3*pow(1+2*sqrC+rC,5));
166 
167  const double phiP1=sqrt(nc/(pi*chimL))*((8.*sqrt2*rC2*pow(1+z,2)*pow(1-z,-0.5)))/pow(((1+rC)*(1-z)+2*sqrC*(1+z)),4);
168 
169  double g=0;
170  for(size_t n = 0; n< ag.size(); ++n) g += ag[n] * zpow[n];
171  g /= (Pg*phig);
172 
173  double f=0;
174  for(size_t n = 0; n< af.size(); ++n) f += af[n] * zpow[n];
175  f /= (Pf*phif);
176 
177  double F1=af[0]*(Mb-Mc)*phiF1_0/phif_0;
178  for(size_t n = 0; n< aF1.size(); ++n) F1 += aF1[n] * zpow[n+1];
179  F1 /= (PF1*phiF1);
180 
181  //From 1707.09509 (sqrC/(1+rC) maps from F2)
182  double P1=0;
183  for(size_t n = 0; n< aP1.size(); ++n) P1 += aP1[n]*zpow[n];
184  P1 *= sqrC/((1+rC)*PP1*phiP1);
185 
186 // const double Ha1=f/(sqrt(Mb*Mc)*(1+w));
187 // const double R1=(w+1)*Mb*Mc*(g/f);
188 // const double R2=((w-rC)/(w-1))-((F1)/(Mb*(w-1)*f));
189 // const double R0=P1/Ha1;
190 // const double Fp = (F1 + f*Mb*(rC - w))/(2.*Mb3*rC*(pow(w,2) - 1.));
191 //
192 // // set elements, mapping to amplitude FF basis
193 // // Fs
194 // // result.element({0}) = 0;
195 // // Ff (Ha1*(Mb2*pow(1 + rC,2) - Sqq))/(2.*Mb*sqrC)
196 // result.element({1}) = (Ha1*(Mb2*pow(1 + rC,2) - Sqq))/(2.*Mb*sqrC);
197 // // Fg (Ha1*R1)/(2.*Mb*sqrC) Definition in BGL differs from Manohar, Wise or 1610.02045 by factor of 2
198 // result.element({2}) = (Ha1*R1)/(2.*Mb*sqrC);
199 // // Fm -(Ha1*(R2*(-1 + rC2) - 2*rC*(-1 + R0 + R0*rC - w)))/(2.*Mb*sqrC*(1 + rC2 - 2*rC*w))
200 // result.element({3}) = -(Ha1*(R2*(-1 + rC2) - 2*rC*(-1 + R0 + R0*rC - w)))/(2.*Mb*sqrC*(1 + rC2 - 2*rC*w));
201 // // Fp -(Ha1*R2)/(2.*Mb*sqrC)
202 // result.element({4}) = -(Ha1*R2)/(2.*Mb*sqrC);
203 // // Fzt
204 // // result.element({5}) = 0;
205 // // Fmt
206 // // result.element({6}) = 0;
207 // // Fpt
208 // // result.element({7}) = 0;
209 
210  //Mapping to amplitude FF basis
211  const double Fpf = (rC-w)/(2.*rC*Mb2*(w2 - 1));
212  const double FpF1 = 1./(2.*rC*Mb3*(w2 - 1));
213  const double Fmf = (rC+w)/(2.*rC*Mb2*(w2 - 1));
214  const double FmF1 = 1./(2.*rC*Mb3*(w2 - 1))*(rC2-1)/(1 + rC2 - 2*rC*w);
215  const double FmP1 = sqrC*(rC+1)/(Mb*(1 + rC2 - 2*rC*w));
216 
217  // set elements, mapping to amplitude FF basis
218  // Fs (dim 0)
219  // result.element({0}) = 0;
220  // Ff (dim 1)
221  result.element({1}) = f;
222  // Fg (dim -1) Definition in BGL (hep-ph/9705252) differs from Manohar, Wise or 1610.02045 by factor of 2
223  result.element({2}) = g/2.;
224  // Fm (dim -1)
225  result.element({3}) = (Fmf*f + FmF1*F1 + FmP1*P1);
226  // Fp (dim -1)
227  result.element({4}) = (Fpf*f + FpF1*F1);
228  // Fzt (dim -2)
229  // result.element({5}) = 0;
230  // Fmt (dim 0)
231  // result.element({6}) = 0;
232  // Fpt (dim 0)
233  // result.element({7}) = 0;
234 
235  result*=(1./etaEWVcb);
236  }
237 
238  unique_ptr<FormFactorBase> FFBtoDstarBGL::clone(const string& label) {
239  MAKE_CLONE(FFBtoDstarBGL, label);
240  }
241 
242 } // namespace Hammer
#define MSG_WARNING(x)
Definition: Logging.hh:366
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.
BGL form factors
static constexpr double sqrt2
Definition: Constants.hh:26
Sparse tensor data container.
Multidimensional tensor class with complex numbers as elements.
Definition: Tensor.hh:33
bool isZero(const std::complex< double > val)
Definition: Math/Utils.hh:25
void clearData()
sets all the elements to 0
Definition: Tensor.cc:229
Various numerical constants.
Hammer particle data class.
Hammer particle class.
#define MAKE_CLONE(OBJ, LABEL)
static constexpr double pi
Definition: Constants.hh:21