Hammer  1.0.0
Helicity Amplitude Module for Matrix Element Reweighting
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
FFBtoD0starBLR.cc
Go to the documentation of this file.
1 ///
2 /// @file FFBtoD0starBLR.cc
3 /// @brief \f$ B \rightarrow D_0^* \f$ BLR 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 #include <iostream>
21 
22 using namespace std;
23 
24 namespace Hammer {
25 
26  namespace MD = MultiDimensional;
27 
28  FFBtoD0starBLR::FFBtoD0starBLR() {
29  // Create tensor rank and dimensions
30  vector<IndexType> dims = {4};
31  setGroup("BLR"); //override BLPR base class FF group setting
32  string name{"FFBtoD0starBLR"};
33 
34  setPrefix("BtoD**0*");
35  addProcessSignature(PID::BPLUS, {-PID::DSSD0STAR});
36  addTensor(Tensor{name, MD::makeEmptySparse(dims, {FF_BDSSD0STAR})});
37 
38  addProcessSignature(PID::BZERO, {PID::DSSD0STARMINUS});
39  addTensor(Tensor{name, MD::makeEmptySparse(dims, {FF_BDSSD0STAR})});
40 
41  setPrefix("BstoDs**0*");
42  addProcessSignature(PID::BS, {PID::DSSDS0STARMINUS});
43  addTensor(Tensor{name, MD::makeEmptySparse(dims, {FF_BSDSSDS0STAR})});
44 
45  setSignatureIndex();
46  }
47 
48  void FFBtoD0starBLR::defineSettings() {
49  //_FFErrNames = ;
50  setPath(getFFErrPrefixGroup().get());
51  setUnits("GeV");
52 
53  //1S scheme: mb1S = 4710, mbBar = 5313, lambda1 = -3 10^5 MeV^2, delta mb-mc = 3400, alpha_s = 26/100
54  addSetting<double>("as",0.26);
55  addSetting<double>("mb",4.710);
56  addSetting<double>("mc",4.710 - 3.400);
57  addSetting<double>("zt1", 0.7);
58  addSetting<double>("ztp", 0.2);
59  addSetting<double>("zeta1", 0.6);
60  addSetting<double>("chi1", 0.);
61  addSetting<double>("chi2", 0.);
62  addSetting<double>("laB", 0.4);
63  addSetting<double>("laS", 0.76);
64 
65  initialized = true;
66  }
67 
68  void FFBtoD0starBLR::evalAtPSPoint(const vector<double>& point, const vector<double>& masses) {
69  Tensor& result = getTensor();
70  result.clearData();
71 
72  if(!initialized){
73  MSG_WARNING("Warning, Setting have not been defined!");
74  }
75 
76  double Mb = 0.;
77  double Mc = 0.;
78  // double unitres = 1.;
79  if(masses.size() >= 2) {
80  Mb = masses[0];
81  Mc = masses[1];
82  //unitres = _units;
83  }
84  else {
85  Mb = this->masses()[0];
86  Mc = this->masses()[1];
87  }
88  const double Mb2 = Mb*Mb;
89  const double Mc2 = Mc*Mc;
90 
91  double Sqq = point[0];
92 
93  // const double sqSqq = sqrt(Sqq);
94  double w = (Mb2 + Mc2 - Sqq)/(2.*Mb*Mc);
95  //safety measure if w==1.0
96  if(isZero(w - 1.0)) w += 1e-6;
97 
98  //BLR parameters
99  const double zBC = (*getSetting<double>("mc"))/(*getSetting<double>("mb"));
100  const double eB = 1./(*getSetting<double>("mb")*2.);
101  const double eC = 1./(*getSetting<double>("mc")*2.);
102  const double as = (*getSetting<double>("as"))/pi;
103  const double zt1 = (*getSetting<double>("zt1"));
104  const double ztp = (*getSetting<double>("ztp"));
105  const double zeta1 = (*getSetting<double>("zeta1"));
106  const double chi1 = (*getSetting<double>("chi1"));
107  const double chi2 = (*getSetting<double>("chi2"));
108  const double laB = (*getSetting<double>("laB"));
109  const double laS = (*getSetting<double>("laS"));
110 
111  const double LambdaD12 = -laB + laS*w;
112  const double Gb = (-(laB*(2 + w)) + laS*(1 + 2*w))/(1 + w) - 2*(w-1)*zeta1;
113  const double LOIWzeta = zt1 + (w-1)*zt1*ztp;
114 
115  //QCD correction functions
116  // const double Cs = CS(w, zBC);
117  const double Cps = CP(w, zBC);
118  // const double Cv1 = CV1(w, zBC);
119  // const double Cv2 = CV2(w, zBC);
120  // const double Cv3 = CV3(w, zBC);
121  const double Ca1 = CA1(w, zBC);
122  const double Ca2 = CA2(w, zBC);
123  const double Ca3 = CA3(w, zBC);
124  const double Ct1 = CT1(w, zBC);
125  // const double Ct2 = CT2(w, zBC);
126  // const double Ct3 = CT3(w, zBC);
127 
128  //Form factors
129  const double gps = eC*(3*LambdaD12 - 2*(-1 + w*w)*zeta1 + (w-1)*(6*chi1 - 2*(1 + w)*chi2)) + (w-1)*(1 + as*Cps) - (1 + w)*eB*Gb;
130  const double gp = -(eC*((3*LambdaD12)/(1 + w) - 2*(w-1)*zeta1)) + ((w-1)*as*(Ca2 + Ca3))/2. - eB*Gb;
131  const double gm = 1 + eC*(6*chi1 - 2*(1 + w)*chi2) + as*(Ca1 + ((w-1)*(Ca2 - Ca3))/2.);
132  const double gt = 1 + eC*((3*LambdaD12)/(1 + w) - 2*(w-1)*zeta1 + 6*chi1 - 2*(1 + w)*chi2) + as*Ct1 - eB*Gb;
133 
134 
135  //Set elements
136  result.element({0}) = gps;
137  result.element({1}) = gp;
138  result.element({2}) = gm;
139  result.element({3}) = gt;
140 
141  result *= LOIWzeta;
142 
143  }
144 
145  std::unique_ptr<FormFactorBase> FFBtoD0starBLR::clone(const std::string& label) {
146  MAKE_CLONE(FFBtoD0starBLR, label);
147  }
148 
149 } // 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.
Sparse tensor data container.
BLR 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