Hammer  1.0.0
Helicity Amplitude Module for Matrix Element Reweighting
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
FFBtoD1BLR.cc
Go to the documentation of this file.
1 ///
2 /// @file FFBtoD1BLR.cc
3 /// @brief \f$ B \rightarrow D_1 \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  FFBtoD1BLR::FFBtoD1BLR() {
29  // Create tensor rank and dimensions
30  vector<IndexType> dims = {8};
31  setGroup("BLR"); //override BLPR base class FF group setting
32  string name{"FFBtoD1BLR"};
33 
34  setPrefix("BtoD**1");
35  addProcessSignature(PID::BPLUS, {-PID::DSSD1});
36  addTensor(Tensor{name, MD::makeEmptySparse(dims, {FF_BDSSD1})});
37 
38  addProcessSignature(PID::BZERO, {PID::DSSD1MINUS});
39  addTensor(Tensor{name, MD::makeEmptySparse(dims, {FF_BDSSD1})});
40 
41  setPrefix("BstoDs**1");
42  addProcessSignature(PID::BS, {PID::DSSDS1MINUS});
43  addTensor(Tensor{name, MD::makeEmptySparse(dims, {FF_BSDSSDS1})});
44 
45  setSignatureIndex();
46  }
47 
48  void FFBtoD1BLR::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>("t1", 0.7);
58  addSetting<double>("tp", -1.6);
59  addSetting<double>("tau1", -0.5);
60  addSetting<double>("tau2", 2.9);
61  addSetting<double>("eta1", 0.);
62  addSetting<double>("eta2", 0.);
63  addSetting<double>("eta3", 0.);
64  addSetting<double>("laB", 0.4);
65  addSetting<double>("laP", 0.8);
66 
67  initialized = true;
68  }
69 
70  void FFBtoD1BLR::evalAtPSPoint(const vector<double>& point, const vector<double>& masses) {
71  Tensor& result = getTensor();
72  result.clearData();
73 
74  if(!initialized){
75  MSG_WARNING("Warning, Setting have not been defined!");
76  }
77 
78  double Mb = 0.;
79  double Mc = 0.;
80  // double unitres = 1.;
81  if(masses.size() >= 2) {
82  Mb = masses[0];
83  Mc = masses[1];
84  //unitres = _units;
85  }
86  else {
87  Mb = this->masses()[0];
88  Mc = this->masses()[1];
89  }
90  const double Mb2 = Mb*Mb;
91  const double Mc2 = Mc*Mc;
92 
93  double Sqq = point[0];
94 
95  // const double sqSqq = sqrt(Sqq);
96  double w = (Mb2 + Mc2 - Sqq)/(2.*Mb*Mc);
97  //safety measure if w==1.0
98  if(isZero(w - 1.0)) w += 1e-6;
99 
100  //BLR parameters
101  const double zBC = (*getSetting<double>("mc"))/(*getSetting<double>("mb"));
102  const double eB = 1./(*getSetting<double>("mb")*2.);
103  const double eC = 1./(*getSetting<double>("mc")*2.);
104  const double as = (*getSetting<double>("as"))/pi;
105  const double t1 = (*getSetting<double>("t1"));
106  const double tp = (*getSetting<double>("tp"));
107  const double tau1 = (*getSetting<double>("tau1"));
108  const double tau2 = (*getSetting<double>("tau2"));
109  const double eta1 = (*getSetting<double>("eta1"));
110  const double eta2 = (*getSetting<double>("eta2"));
111  const double eta3 = (*getSetting<double>("eta3"));
112  const double laB = (*getSetting<double>("laB"));
113  const double laP = (*getSetting<double>("laP"));
114 
115  const double LambdaD32 = -laB + laP*w;
116  const double Fb = laB + laP - tau2 - tau1*(1 + 2*w);
117  const double LOIWtau = t1 + (w-1)*t1*tp;
118 
119  //QCD correction functions
120  const double Cs = CS(w, zBC);
121  // const double Cps = CP(w, zBC);
122  const double Cv1 = CV1(w, zBC);
123  const double Cv2 = CV2(w, zBC);
124  const double Cv3 = CV3(w, zBC);
125  const double Ca1 = CA1(w, zBC);
126  // const double Ca2 = CA2(w, zBC);
127  // const double Ca3 = CA3(w, zBC);
128  const double Ct1 = CT1(w, zBC);
129  const double Ct2 = CT2(w, zBC);
130  const double Ct3 = CT3(w, zBC);
131 
132  //Form factors
133  const double Fsc = (-(eC*(4*LambdaD32 + 2*(1 + w)*(6*eta1 + 2*(w-1)*eta2 - eta3) - 2*(w-1)*((1 + 2*w)*tau1 + tau2))) - 2*(1 + w)*(1 + as*Cs) - 2*(w-1)*eB*Fb)/sqrt(6.);
134  const double Fv1 = (-(eC*(4*(1 + w)*LambdaD32 - (-1 + w*w)*(2*eta1 + 3*eta3 + 3*tau1 - 3*tau2))) + (1 - w*w)*(1 + as*Cv1) - (-1 + w*w)*eB*Fb)/sqrt(6.);
135  const double Fv2 = (-3 - eC*(10*eta1 + 4*(w-1)*eta2 - 5*eta3 + (-1 + 4*w)*tau1 + 5*tau2) - as*(3*Cv1 + 2*(1 + w)*Cv2) - 3*eB*Fb)/sqrt(6.);
136  const double Fv3 = (-2 + w + eC*(4*LambdaD32 - 2*(6 + w)*eta1 - 4*(w-1)*eta2 - (-2 + 3*w)*eta3 + (2 + w)*tau1 + (2 + 3*w)*tau2) - as*((2 - w)*Cv1 + 2*(1 + w)*Cv3) + (2 + w)*eB*Fb)/sqrt(6.);
137  const double Fa = (-(eC*(4*LambdaD32 - (1 + w)*(2*eta1 + 3*eta3) - 3*(w-1)*(tau1 - tau2))) + (-1 - w)*(1 + as*Ca1) - (w-1)*eB*Fb)/sqrt(6.);
138  const double Ft1 = (-(eC*(4*LambdaD32 + (1 + w)*(2*eta1 + 3*eta3) - 3*(w-1)*(tau1 - tau2))) + (1 + w)*(1 + as*(Ct1 + (w-1)*Ct2)) + (w-1)*eB*Fb)/sqrt(6.);
139  const double Ft2 = (-(eC*(4*LambdaD32 - (1 + w)*(2*eta1 + 3*eta3) - 3*(w-1)*(tau1 - tau2))) + (-1 - w)*(1 + as*(Ct1 - (w-1)*Ct3)) + (w-1)*eB*Fb)/sqrt(6.);
140  const double Ft3 = (3 - eC*(-10*eta1 - 4*(w-1)*eta2 + 5*eta3 + (-1 + 4*w)*tau1 + 5*tau2) + as*(3*Ct1 - (2 - w)*Ct2 + 3*Ct3) + 3*eB*Fb)/sqrt(6.);
141 
142 
143  //Set elements
144  result.element({0}) = Fsc;
145  result.element({1}) = Fv1;
146  result.element({2}) = Fv2;
147  result.element({3}) = Fv3;
148  result.element({4}) = Fa;
149  result.element({5}) = Ft1;
150  result.element({6}) = Ft2;
151  result.element({7}) = Ft3;
152 
153  result *= LOIWtau;
154 
155  }
156 
157  std::unique_ptr<FormFactorBase> FFBtoD1BLR::clone(const std::string& label) {
158  MAKE_CLONE(FFBtoD1BLR, label);
159  }
160 
161 } // 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