Hammer  1.0.0
Helicity Amplitude Module for Matrix Element Reweighting
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
FFLbtoLcBLRS.cc
Go to the documentation of this file.
1 ///
2 /// @file FFLbtoLcBLRS.cc
3 /// @brief \f$ \Lambda_b \rightarrow Lambda_c \f$ BLRS 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  FFLbtoLcBLRS::FFLbtoLcBLRS() {
30  // Create tensor rank and dimensions
31  vector<IndexType> dims = {12};
32  setGroup("BLRS"); //override BLPR base class FF group setting
33  string name{"FFLbtoLcBLRS"};
34 
35  setPrefix("LbtoLc");
36  addProcessSignature(-PID::LAMBDAB, {PID::LAMBDACMINUS});
37  addTensor(Tensor{name, MD::makeEmptySparse(dims, {FF_LBLC})});
38 
39  setSignatureIndex();
40  }
41 
42  void FFLbtoLcBLRS::defineSettings() {
43  //_FFErrNames = ;
44  setPath(getFFErrPrefixGroup().get());
45  setUnits("GeV");
46 
47  //1S scheme: mb1S = 4721.5, delta mb-mc = 3400, alpha_s = 26/100
48  addSetting<double>("as",0.26);
49  addSetting<double>("mb1S",4.7215); //GeV
50  addSetting<double>("dmbmc",3.400); //GeV
51  addSetting<double>("mLb",5.620); //GeV
52  addSetting<double>("mLc",2.286); //GeV
53 
54  addSetting<double>("z1",-2.037);
55  addSetting<double>("z2",3.159);
56  addSetting<double>("b1",-0.459); //GeV^2
57  addSetting<double>("b2",-0.390); //GeV^2
58 
59  initialized = true;
60  }
61 
62  void FFLbtoLcBLRS::eval(const Particle& parent, const ParticleList& daughters,
63  const ParticleList&) {
64  // Momenta
65  const FourMomentum& pLbmes = parent.momentum();
66  const FourMomentum& pLcmes = daughters[0].momentum();
67  // const FourMomentum& pTau = daughters[2].momentum();
68 
69  // kinematic objects
70  const double Mb = pLbmes.mass();
71  const double Mc = pLcmes.mass();
72  // const double Mt = pTau.mass();
73  const double Sqq = Mb*Mb + Mc*Mc - 2. * (pLbmes * pLcmes);
74 
75  evalAtPSPoint({Sqq}, {Mb, Mc});
76  }
77 
78  void FFLbtoLcBLRS::evalAtPSPoint(const vector<double>& point, const vector<double>& masses) {
79  Tensor& result = getTensor();
80  result.clearData();
81 
82  if(!initialized){
83  MSG_WARNING("Warning, Settings have not been defined!");
84  }
85 
86  double Mb = 0.;
87  double Mc = 0.;
88  double unitres = 1.;
89  if(masses.size() >= 2) {
90  Mb = masses[0];
91  Mc = masses[1];
92  unitres = _units;
93  }
94  else {
95  Mb = this->masses()[0];
96  Mc = this->masses()[1];
97  }
98  const double Mb2 = Mb*Mb;
99  const double Mc2 = Mc*Mc;
100 
101  double Sqq = point[0];
102 
103  // const double sqSqq = sqrt(Sqq);
104  double w = (Mb2 + Mc2 - Sqq)/(2.*Mb*Mc);
105  //safety measure if w==1.0
106  if(isZero(w - 1.0)) w += 1e-6;
107  const double wSq = w*w;
108 
109  //Renormalon improvement scheme
110  const double aS = (*getSetting<double>("as"))/pi;
111  const double mb1S = unitres*(*getSetting<double>("mb1S"));
112  const double dmbmc = unitres*(*getSetting<double>("dmbmc"));
113  const double mLb = unitres*(*getSetting<double>("mLb"));
114  const double mLc = unitres*(*getSetting<double>("mLc"));
115  const double mc1S = mb1S - dmbmc;
116  const double mc2 = pow(mc1S,2.);
117 
118 // const double mb = mb1S*(1. + 2.*pow(aS*pi,2.)/9.);
119 // const double mc = mb - dmbmc;
120 // const double la = (mb1S*(mLb - mb) - mc1S*(mLc - mc))/(mb1S - mc1S);
121  const double la1S = (mb1S*(mLb - mb1S) - mc1S*(mLc - mc1S))/(mb1S - mc1S);
122 
123  const double eB0 = la1S/(2.*mb1S);
124  const double eC0 = la1S/(2.*mc1S);
125 // const double eB = la/(2.*mb);
126 // const double eC = la/(2.*mc);
127 
128  //Explicit expansion to O(eps)
129  const double eps = 2.*pow(aS*pi,2.)/9.;
130  const double eB = eB0 + eps*(dmbmc*mc1S - mb1S*mLb + mc1S*mLc)/(mb1S - mc1S)/(2.*mb1S);
131  const double eC = eC0 + eps*((mb1S*(dmbmc*mb1S - mb1S*mLb + mc1S*mLc))/(mc1S*(mb1S - mc1S)))/(2.*mc1S);
132 
133  const double zBC = mc1S/mb1S;
134 
135  //(Sub)leading IW function parameters
136  const double z1 = (*getSetting<double>("z1"));
137  const double z2 = (*getSetting<double>("z2"));
138  const double b1 = unitres*unitres*(*getSetting<double>("b1"));
139  const double b2 = unitres*unitres*(*getSetting<double>("b2"));
140 
141 
142  // Leading and sub-leading IW function
143  const double zetaIW = 1. + z1*(w-1) + 0.5*z2*pow(w-1,2.);
144 
145  //QCD correction functions
146  const double Cs = CS(w, zBC);
147  const double Cps = CP(w, zBC);
148  const double Cv1 = CV1(w, zBC);
149  const double Cv2 = CV2(w, zBC);
150  const double Cv3 = CV3(w, zBC);
151  const double Ca1 = CA1(w, zBC);
152  const double Ca2 = CA2(w, zBC);
153  const double Ca3 = CA3(w, zBC);
154  const double Ct1 = CT1(w, zBC);
155  const double Ct2 = CT2(w, zBC);
156  const double Ct3 = CT3(w, zBC);
157  //Derivatives (approx)
158  const double Csp = (CS(w + 1e-6, zBC) - Cs)/1e-6;
159  const double Cpsp = (CP(w + 1e-6, zBC) - Cps)/1e-6;
160  const double Cv1p = (CV1(w + 1e-6, zBC) - Cv1)/1e-6;
161  const double Cv2p = (CV2(w + 1e-6, zBC) - Cv2)/1e-6;
162  const double Cv3p = (CV3(w + 1e-6, zBC) - Cv3)/1e-6;
163  const double Ca1p = (CA1(w + 1e-6, zBC) - Ca1)/1e-6;
164  const double Ca2p = (CA2(w + 1e-6, zBC) - Ca2)/1e-6;
165  const double Ca3p = (CA3(w + 1e-6, zBC) - Ca3)/1e-6;
166  const double Ct1p = (CT1(w + 1e-6, zBC) - Ct1)/1e-6;
167  const double Ct2p = (CT2(w + 1e-6, zBC) - Ct2)/1e-6;
168  const double Ct3p = (CT3(w + 1e-6, zBC) - Ct3)/1e-6;
169 
170  // Create hatted h FFs
171  const double hs = 1 + b1/(4.*mc2) + (eB*(w - 1))/(1 + w) + (eC*(w - 1))/(1 + w) +
172  aS*(Cs + (eB0*(w - 1)*(Cs + 2.*Csp*(1 + w)))/(1 + w) + (eC0*(w - 1)*(Cs + 2.*Csp*(1 + w)))/(1 + w)) ;
173  const double hp = 1 + eB + eC + b1/(4.*mc2) - b2/(4.*mc2) + aS*(Cps + eB0*(Cps + 2.*Cpsp*(w - 1)) + eC0*(Cps + 2.*Cpsp*(w - 1))) ;
174  const double f1 = 1 + eB + eC + b1/(4.*mc2) - b2/(4.*mc2) + aS*(Cv1 + eB0*(Cv1 + 2.*Cv1p*(w - 1)) + eC0*(Cv1 + 2.*Cv1p*(w - 1))) ;
175  const double f2 = b2/(4.*mc2) - (2.*eC)/(1 + w) + aS*(Cv2 + (eC0*(-2.*Cv1 - Cv2 - 2.*Cv3 + Cv2*w
176  + 2.*Cv2p*(-1 + wSq)))/(1 + w) +
177  (eB0*(Cv2*(-1 + 3.*w) + 2.*Cv2p*(-1 + wSq)))/(1 + w)) ;
178  const double f3 = (-2.*eB)/(1 + w) + aS*(Cv3 + (eB0*(-2.*Cv1 - 2.*Cv2 - Cv3 + Cv3*w
179  + 2.*Cv3p*(-1 + wSq)))/(1 + w) +
180  (eC0*(Cv3*(-1 + 3.*w) + 2.*Cv3p*(-1 + wSq)))/(1 + w)) ;
181  const double g1 = 1 + b1/(4.*mc2) + (eB*(w - 1))/(1 + w) + (eC*(w - 1))/(1 + w) +
182  aS*(Ca1 + (eB0*(w - 1)*(Ca1 + 2.*Ca1p*(1 + w)))/(1 + w) + (eC0*(w - 1)*(Ca1 + 2.*Ca1p*(1 + w)))/(1 + w)) ;
183  const double g2 = b2/(4.*mc2) - (2.*eC)/(1 + w) + aS*(Ca2 + (eC0*(-2.*Ca1 + Ca2 - 2.*Ca3 + Ca2*w
184  + 2.*Ca2p*(-1 + wSq)))/(1 + w) +
185  (eB0*(Ca2 + 3.*Ca2*w + 2.*Ca2p*(-1 + wSq)))/(1 + w)) ;
186  const double g3 = (2.*eB)/(1 + w) + aS*(Ca3 + (eB0*(2.*Ca1 - 2.*Ca2 + Ca3 + Ca3*w
187  + 2.*Ca3p*(-1 + wSq)))/(1 + w) +
188  (eC0*(Ca3 + 3.*Ca3*w + 2.*Ca3p*(-1 + wSq)))/(1 + w)) ;
189  const double h1 = 1 + b1/(4.*mc2) + (eB*(w - 1))/(1 + w) + (eC*(w - 1))/(1 + w) +
190  aS*(Ct1 + (eB0*(w - 1)*(Ct1 + 2.*Ct1p*(1 + w)))/(1 + w) + (eC0*(w - 1)*(Ct1 + 2.*Ct1p*(1 + w)))/(1 + w)) ;
191  const double h2 = b2/(4.*mc2) - (2.*eC)/(1 + w) + aS*(Ct2 + (eC0*(-2.*Ct1 + Ct2 - 2.*Ct3 + Ct2*w
192  + 2.*Ct2p*(-1 + wSq)))/(1 + w) +
193  (eB0*(Ct2 + 3.*Ct2*w + 2.*Ct2p*(-1 + wSq)))/(1 + w)) ;
194  const double h3 = (2.*eB)/(1 + w) + aS*(Ct3 + (eB0*(2.*Ct1 - 2.*Ct2 + Ct3 + Ct3*w
195  + 2.*Ct3p*(-1 + wSq)))/(1 + w) +
196  (eC0*(Ct3 + 3.*Ct3*w + 2.*Ct3p*(-1 + wSq)))/(1 + w)) ;
197  const double h4 = aS*((-2.*Ct2*eB0)/(1 + w) + (2.*Ct3*eC0)/(1 + w)) ;
198 
199  // set elements
200  result.element({0}) = hs;
201  result.element({1}) = hp;
202  result.element({2}) = f1;
203  result.element({3}) = f2;
204  result.element({4}) = f3;
205  result.element({5}) = g1;
206  result.element({6}) = g2;
207  result.element({7}) = g3;
208  result.element({8}) = h1;
209  result.element({9}) = h2;
210  result.element({10}) = h3;
211  result.element({11}) = h4;
212 
213  result *= zetaIW;
214 
215  }
216 
217  std::unique_ptr<FormFactorBase> FFLbtoLcBLRS::clone(const std::string& label) {
218  MAKE_CLONE(FFLbtoLcBLRS, label);
219  }
220 
221 } // 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.
BLRS form factors
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.
Particle class.
Definition: Particle.hh:30
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
const FourMomentum & momentum() const
Definition: Particle.cc:56
Various numerical constants.
Hammer particle data class.
Hammer particle class.
#define MAKE_CLONE(OBJ, LABEL)
4-momentum class
Definition: FourMomentum.hh:30
static constexpr double pi
Definition: Constants.hh:21