Hammer  1.0.0
Helicity Amplitude Module for Matrix Element Reweighting
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
FFBtoDstarCLN.cc
Go to the documentation of this file.
1 ///
2 /// @file FFBtoDstarCLN.cc
3 /// @brief \f$ B \rightarrow D^* \f$ CLN form factors
4 /// @brief Ported from EvtGen HQET2
5 ///
6 
7 //**** This file is a part of the HAMMER library
8 //**** Copyright (C) 2016 - 2020 The HAMMER Collaboration
9 //**** HAMMER is licensed under version 3 of the GPL; see COPYING for details
10 //**** Please note the MCnet academic guidelines; see GUIDELINES for details
11 
12 // -*- C++ -*-
14 #include "Hammer/IndexLabels.hh"
15 #include "Hammer/Math/Constants.hh"
16 #include "Hammer/Math/Utils.hh"
17 #include "Hammer/Particle.hh"
18 #include "Hammer/Tools/Pdg.hh"
20 #include <cmath>
21 #include <iostream>
22 
23 using namespace std;
24 
25 namespace Hammer {
26 
27  namespace MD = MultiDimensional;
28 
29  FFBtoDstarCLN::FFBtoDstarCLN() {
30  // Create tensor rank and dimensions
31  vector<IndexType> dims = {8};
32  string name{"FFBtoDstarCLN"};
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 FFBtoDstarCLN::defineSettings() {
49  //_FFErrNames = ;
50  setPath(getFFErrPrefixGroup().get());
51  setUnits("GeV");
52 
53  addSetting<double>("a",1.0); //zero recoil expansion
54  addSetting<double>("RhoSq",1.207);
55  addSetting<double>("F1",0.908);
56  addSetting<double>("R1",1.401);
57  addSetting<double>("R2",0.854);
58  addSetting<double>("R0",1.15);
59  addSetting<double>("as",0.26); //mbmc scale
60  addSetting<double>("la",0.48); //CLN
61  addSetting<double>("mcOnmb",0.29); //CLN
62  initialized = true;
63  }
64 
65  void FFBtoDstarCLN::evalAtPSPoint(const vector<double>& point, const vector<double>& masses) {
66  Tensor& result = getTensor();
67  result.clearData();
68 
69  if(!initialized){
70  MSG_WARNING("Warning, Setting have not been defined!");
71  }
72 
73  double Mb = 0.;
74  double Mc = 0.;
75  double unitres = 1.;
76  if(masses.size() >= 2) {
77  Mb = masses[0];
78  Mc = masses[1];
79  unitres = _units;
80  }
81  else {
82  Mb = this->masses()[0];
83  Mc = this->masses()[1];
84  }
85  const double Mb2 = Mb*Mb;
86  const double Mc2 = Mc*Mc;
87 
88  double Sqq = point[0];
89 
90  // const double sqMbMc = sqrt(Mb*Mc);
91  double w = (Mb2 + Mc2 - Sqq)/(2.*Mb*Mc);
92  //safety measure if w==1.0
93  if(isZero(w - 1.0)) w += 1e-6;
94  const double a = *getSetting<double>("a");
95  const double zCon = (sqrt(w+1) - sqrt2*a)/(sqrt(w+1) + sqrt2*a);
96 
97  const double RhoSq=*getSetting<double>("RhoSq");
98  const double R0par=*getSetting<double>("R0");
99  const double R1par=*getSetting<double>("R1");
100  const double R2par=*getSetting<double>("R2");
101  const double F1par=*getSetting<double>("F1");
102  const double as = *getSetting<double>("as")/pi;
103  const double LambdaBar = *getSetting<double>("la");
104  const double zR = *getSetting<double>("mcOnmb");
105 
106  const double rC=Mc/Mb;
107  const double rC2 = rC*rC;
108 
109  //MSbar masses
110  const double mbMu = Mb - unitres*LambdaBar - Mb*as*(4./3. + log(zR));
111  const double mcMu = Mc - unitres*LambdaBar - Mc*as*(4./3. - log(zR));
112 
113  //define the variables
114  const double Ha1= F1par*(1. - 8.* RhoSq * zCon +
115  (53. * RhoSq - 15.) * pow(zCon, 2.)
116  - (231. * RhoSq - 91.) * pow(zCon, 3.));
117  const double R0 = R0par - 0.11 * (w - 1.) + 0.01 * pow(w - 1., 2.);
118  const double R1 = R1par - 0.12 * (w - 1.) + 0.05 * pow(w - 1., 2.);
119  const double R2 = R2par + 0.11 * (w - 1.) - 0.06 * pow(w - 1., 2.);
120 
121  const double Ff = (Ha1*(Mb2*pow(1 + rC,2) - Sqq))/(2.*Mb*sqrt(rC));
122  const double Fg = (Ha1*R1)/(2.*Mb*sqrt(rC));
123  const double Fm = -(Ha1*(R2*(-1 + rC2) - 2*rC*(-1 + R0 + R0*rC - w)))/(2.*Mb*sqrt(rC)*(1 + rC2 - 2*rC*w));
124  const double Fp = -(Ha1*R2)/(2.*Mb*sqrt(rC));
125  //Pseudoscalar check!
126  const double Fps = -(Ff + Mb2*(Fp*(1-rC2) + Fm*(1 + rC2 - 2*rC*w)))/(mbMu + mcMu);
127 
128  // set elements, mapping to amplitude FF basis
129  // Fps
130  result.element({0}) = Fps;
131  // Ff
132  result.element({1}) = Ff;
133  // Fg
134  result.element({2}) = Fg;
135  // Fm
136  result.element({3}) = Fm;
137  // Fp
138  result.element({4}) = Fp;
139  // Fzt
140  // result.element({5}) = 0;
141  // Fmt
142  // result.element({6}) = 0;
143  // Fpt
144  // result.element({7}) = 0;
145 
146  }
147 
148  std::unique_ptr<FormFactorBase> FFBtoDstarCLN::clone(const std::string& label) {
149  MAKE_CLONE(FFBtoDstarCLN, label);
150  }
151 
152 } // 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.
static constexpr double sqrt2
Definition: Constants.hh:26
Sparse tensor data container.
CLN form factors
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