Hammer  1.0.0
Helicity Amplitude Module for Matrix Element Reweighting
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
FFLbtoLcBLRSVar.cc
Go to the documentation of this file.
1 ///
2 /// @file FFLbtoLcBLRSVar.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  FFLbtoLcBLRSVar::FFLbtoLcBLRSVar() {
30  // Create tensor rank and dimensions
31  vector<IndexType> dims = {12,5}; // size is _FFErrNames + 1 to include central values in zeroth component
32  setGroup("BLRSVar"); //override BLRS base class FF group setting
33  string name{"FFLbtoLcBLRSVar"};
34 
35  setPrefix("LbtoLc");
36  _FFErrLabel = FF_LBLC_VAR;
37  addProcessSignature(-PID::LAMBDAB, {PID::LAMBDACMINUS});
38  addTensor(Tensor{name, MD::makeEmptySparse(dims, {FF_LBLC, FF_LBLC_VAR})});
39 
40  setSignatureIndex();
41  }
42 
43  void FFLbtoLcBLRSVar::defineSettings() {
44  _FFErrNames = {"delta_z1", "delta_z2", "delta_b1", "delta_b2"};
45  setPath(getFFErrPrefixGroup().get());
46  setUnits("GeV");
47 
48  //1S scheme: mb1S = 4721.5, delta mb-mc = 3400., alpha_s = 26/100
49  addSetting<double>("as",0.26);
50  addSetting<double>("mb1S",4.7215); //GeV
51  addSetting<double>("dmbmc",3.400); //GeV
52  addSetting<double>("mLb",5.620); //GeV
53  addSetting<double>("mLc",2.286); //GeV
54 
55  addSetting<double>("z1",-2.037);
56  addSetting<double>("z2",3.159);
57  addSetting<double>("b1",-0.459); //GeV^2
58  addSetting<double>("b2",-0.390); //GeV^2
59 
60  //correlation matrix and set zero error eigenvectors
61  //Row basis is z1, z2, b1 ,b2
62  vector<vector<double>> sliwmat{ {1., 0., 0., 0.},
63  {0., 1., 0., 0.},
64  {0., 0., 1., 0.},
65  {0., 0., 0., 1.}};
66  addSetting<vector<vector<double>>>("sliwmatrix",sliwmat);
67 
68  for (auto elem : _FFErrNames) {
69  addSetting<double>(elem, 0.);
70  }
71 
72  initialized = true;
73  }
74 
75  void FFLbtoLcBLRSVar::eval(const Particle& parent, const ParticleList& daughters,
76  const ParticleList&) {
77  // Momenta
78  const FourMomentum& pLbmes = parent.momentum();
79  const FourMomentum& pLcmes = daughters[0].momentum();
80  // const FourMomentum& pTau = daughters[2].momentum();
81 
82  // kinematic objects
83  const double Mb = pLbmes.mass();
84  const double Mc = pLcmes.mass();
85  // const double Mt = pTau.mass();
86  const double Sqq = Mb*Mb + Mc*Mc - 2. * (pLbmes * pLcmes);
87 
88  evalAtPSPoint({Sqq}, {Mb, Mc});
89  }
90 
91  void FFLbtoLcBLRSVar::evalAtPSPoint(const vector<double>& point, const vector<double>& masses) {
92  Tensor& result = getTensor();
93  result.clearData();
94 
95  if(!initialized){
96  MSG_WARNING("Warning, Settings have not been defined!");
97  }
98 
99  double Mb = 0.;
100  double Mc = 0.;
101  double unitres = 1.;
102  if(masses.size() >= 2) {
103  Mb = masses[0];
104  Mc = masses[1];
105  unitres = _units;
106  }
107  else {
108  Mb = this->masses()[0];
109  Mc = this->masses()[1];
110  }
111  const double Mb2 = Mb*Mb;
112  const double Mc2 = Mc*Mc;
113 
114  double Sqq = point[0];
115 
116  // const double sqSqq = sqrt(Sqq);
117  double w = (Mb2 + Mc2 - Sqq)/(2.*Mb*Mc);
118  //safety measure if w==1.0
119  if(isZero(w - 1.0)) w += 1e-6;
120  const double wSq = w*w;
121  const double wm1sq = (w-1.)*(w-1.);
122 
123  //Renormalon improvement scheme
124  const double aS = (*getSetting<double>("as"))/pi;
125  const double mb1S = unitres*(*getSetting<double>("mb1S"));
126  const double dmbmc = unitres*(*getSetting<double>("dmbmc"));
127  const double mLb = unitres*(*getSetting<double>("mLb"));
128  const double mLc = unitres*(*getSetting<double>("mLc"));
129  const double mc1S = mb1S - dmbmc;
130  const double mc2 = pow(mc1S,2.);
131 
132 // const double mb = mb1S*(1. + 2.*pow(aS*pi,2.)/9.);
133 // const double mc = mb - dmbmc;
134 // const double la = (mb1S*(mLb - mb) - mc1S*(mLc - mc))/(mb1S - mc1S);
135  const double la1S = (mb1S*(mLb - mb1S) - mc1S*(mLc - mc1S))/(mb1S - mc1S);
136 
137  const double eB0 = la1S/(2.*mb1S);
138  const double eC0 = la1S/(2.*mc1S);
139 // const double eB = la/(2.*mb);
140 // const double eC = la/(2.*mc);
141 
142  //Explicit expansion to O(eps)
143  const double eps = 2.*pow(aS*pi,2.)/9.;
144  const double eB = eB0 + eps*(dmbmc*mc1S - mb1S*mLb + mc1S*mLc)/(mb1S - mc1S)/(2.*mb1S);
145  const double eC = eC0 + eps*((mb1S*(dmbmc*mb1S - mb1S*mLb + mc1S*mLc))/(mc1S*(mb1S - mc1S)))/(2.*mc1S);
146 
147  const double zBC = mc1S/mb1S;
148 
149  //(Sub)leading IW function parameters
150  const double z1 = (*getSetting<double>("z1"));
151  const double z2 = (*getSetting<double>("z2"));
152  const double b1 = unitres*unitres*(*getSetting<double>("b1"));
153  const double b2 = unitres*unitres*(*getSetting<double>("b2"));
154 
155  const vector<vector<double>>& sliwmat = (*getSetting<vector<vector<double>>>("sliwmatrix"));
156 
157  // Leading and sub-leading IW function
158  const double zetaIW = 1. + z1*(w-1) + 0.5*z2*pow(w-1,2.);
159 
160  //QCD correction functions
161  const double Cs = CS(w, zBC);
162  const double Cps = CP(w, zBC);
163  const double Cv1 = CV1(w, zBC);
164  const double Cv2 = CV2(w, zBC);
165  const double Cv3 = CV3(w, zBC);
166  const double Ca1 = CA1(w, zBC);
167  const double Ca2 = CA2(w, zBC);
168  const double Ca3 = CA3(w, zBC);
169  const double Ct1 = CT1(w, zBC);
170  const double Ct2 = CT2(w, zBC);
171  const double Ct3 = CT3(w, zBC);
172  //Derivatives (approx)
173  const double Csp = (CS(w + 1e-6, zBC) - Cs)/1e-6;
174  const double Cpsp = (CP(w + 1e-6, zBC) - Cps)/1e-6;
175  const double Cv1p = (CV1(w + 1e-6, zBC) - Cv1)/1e-6;
176  const double Cv2p = (CV2(w + 1e-6, zBC) - Cv2)/1e-6;
177  const double Cv3p = (CV3(w + 1e-6, zBC) - Cv3)/1e-6;
178  const double Ca1p = (CA1(w + 1e-6, zBC) - Ca1)/1e-6;
179  const double Ca2p = (CA2(w + 1e-6, zBC) - Ca2)/1e-6;
180  const double Ca3p = (CA3(w + 1e-6, zBC) - Ca3)/1e-6;
181  const double Ct1p = (CT1(w + 1e-6, zBC) - Ct1)/1e-6;
182  const double Ct2p = (CT2(w + 1e-6, zBC) - Ct2)/1e-6;
183  const double Ct3p = (CT3(w + 1e-6, zBC) - Ct3)/1e-6;
184 
185  // Create hatted h FFs
186  const double hs = 1 + b1/(4.*mc2) + (eB*(w - 1))/(1 + w) + (eC*(w - 1))/(1 + w) +
187  aS*(Cs + (eB0*(w - 1)*(Cs + 2.*Csp*(1 + w)))/(1 + w) + (eC0*(w - 1)*(Cs + 2.*Csp*(1 + w)))/(1 + w)) ;
188  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))) ;
189  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))) ;
190  const double f2 = b2/(4.*mc2) - (2.*eC)/(1 + w) + aS*(Cv2 + (eC0*(-2.*Cv1 - Cv2 - 2.*Cv3 + Cv2*w
191  + 2.*Cv2p*(-1 + wSq)))/(1 + w) +
192  (eB0*(Cv2*(-1 + 3.*w) + 2.*Cv2p*(-1 + wSq)))/(1 + w)) ;
193  const double f3 = (-2.*eB)/(1 + w) + aS*(Cv3 + (eB0*(-2.*Cv1 - 2.*Cv2 - Cv3 + Cv3*w
194  + 2.*Cv3p*(-1 + wSq)))/(1 + w) +
195  (eC0*(Cv3*(-1 + 3.*w) + 2.*Cv3p*(-1 + wSq)))/(1 + w)) ;
196  const double g1 = 1 + b1/(4.*mc2) + (eB*(w - 1))/(1 + w) + (eC*(w - 1))/(1 + w) +
197  aS*(Ca1 + (eB0*(w - 1)*(Ca1 + 2.*Ca1p*(1 + w)))/(1 + w) + (eC0*(w - 1)*(Ca1 + 2.*Ca1p*(1 + w)))/(1 + w)) ;
198  const double g2 = b2/(4.*mc2) - (2.*eC)/(1 + w) + aS*(Ca2 + (eC0*(-2.*Ca1 + Ca2 - 2.*Ca3 + Ca2*w
199  + 2.*Ca2p*(-1 + wSq)))/(1 + w) +
200  (eB0*(Ca2 + 3.*Ca2*w + 2.*Ca2p*(-1 + wSq)))/(1 + w)) ;
201  const double g3 = (2.*eB)/(1 + w) + aS*(Ca3 + (eB0*(2.*Ca1 - 2.*Ca2 + Ca3 + Ca3*w
202  + 2.*Ca3p*(-1 + wSq)))/(1 + w) +
203  (eC0*(Ca3 + 3.*Ca3*w + 2.*Ca3p*(-1 + wSq)))/(1 + w)) ;
204  const double h1 = 1 + b1/(4.*mc2) + (eB*(w - 1))/(1 + w) + (eC*(w - 1))/(1 + w) +
205  aS*(Ct1 + (eB0*(w - 1)*(Ct1 + 2.*Ct1p*(1 + w)))/(1 + w) + (eC0*(w - 1)*(Ct1 + 2.*Ct1p*(1 + w)))/(1 + w)) ;
206  const double h2 = b2/(4.*mc2) - (2.*eC)/(1 + w) + aS*(Ct2 + (eC0*(-2.*Ct1 + Ct2 - 2.*Ct3 + Ct2*w
207  + 2.*Ct2p*(-1 + wSq)))/(1 + w) +
208  (eB0*(Ct2 + 3.*Ct2*w + 2.*Ct2p*(-1 + wSq)))/(1 + w)) ;
209  const double h3 = (2.*eB)/(1 + w) + aS*(Ct3 + (eB0*(2.*Ct1 - 2.*Ct2 + Ct3 + Ct3*w
210  + 2.*Ct3p*(-1 + wSq)))/(1 + w) +
211  (eC0*(Ct3 + 3.*Ct3*w + 2.*Ct3p*(-1 + wSq)))/(1 + w)) ;
212  const double h4 = aS*((-2.*Ct2*eB0)/(1 + w) + (2.*Ct3*eC0)/(1 + w)) ;
213 
214  // set elements
215  result.element({0, 0}) = hs;
216  result.element({1, 0}) = hp;
217  result.element({2, 0}) = f1;
218  result.element({3, 0}) = f2;
219  result.element({4, 0}) = f3;
220  result.element({5, 0}) = g1;
221  result.element({6, 0}) = g2;
222  result.element({7, 0}) = g3;
223  result.element({8, 0}) = h1;
224  result.element({9, 0}) = h2;
225  result.element({10, 0}) = h3;
226  result.element({11, 0}) = h4;
227 
228  //Now create remaining FF tensor entries
229  //n indexes rows ie FFs; idx indexes the columns that contract with delta
230 
231  //Linearization of hatted FFs
232  vector<vector<double>> FFmat{{(hs*(-1 + w))/zetaIW, (hs*wm1sq)/(2.*zetaIW), 1./(4.*mc2), 0.},
233  {(hp*(-1 + w))/zetaIW, (hp*wm1sq)/(2.*zetaIW), 1./(4.*mc2), -1./(4.*mc2)},
234  {(f1*(-1 + w))/zetaIW, (f1*wm1sq)/(2.*zetaIW), 1./(4.*mc2), -1./(4.*mc2)},
235  {(f2*(-1 + w))/zetaIW, (f2*wm1sq)/(2.*zetaIW), 0., 1./(4.*mc2)},
236  {(f3*(-1 + w))/zetaIW, (f3*wm1sq)/(2.*zetaIW), 0., 0.},
237  {(g1*(-1 + w))/zetaIW, (g1*wm1sq)/(2.*zetaIW), 1./(4.*mc2), 0.},
238  {(g2*(-1 + w))/zetaIW, (g2*wm1sq)/(2.*zetaIW), 0., 1./(4.*mc2)},
239  {(g3*(-1 + w))/zetaIW, (g3*wm1sq)/(2.*zetaIW), 0., 0.},
240  {(h1*(-1 + w))/zetaIW, (h1*wm1sq)/(2.*zetaIW), 1./(4.*mc2), 0.},
241  {(h2*(-1 + w))/zetaIW, (h2*wm1sq)/(2.*zetaIW), 0., 1./(4.*mc2)},
242  {(h3*(-1 + w))/zetaIW, (h3*wm1sq)/(2.*zetaIW), 0., 0.},
243  {(h4*(-1 + w))/zetaIW, (h4*wm1sq)/(2.*zetaIW), 0., 0.}};
244 
245  for(size_t n = 0; n < 12; ++n){
246  auto ni = static_cast<IndexType>(n);
247  for(size_t idx = 0; idx < 4; ++idx){
248  complex<double> entry = 0;
249  auto idxi = static_cast<IndexType>(idx+1u);
250  for(size_t idx1 = 0; idx1 < 4; ++idx1){
251  entry += sliwmat[idx1][idx]*FFmat[n][idx1];
252  }
253  result.element({ni, idxi}) = entry;
254  }
255  }
256 
257 
258  result *= zetaIW;
259 
260  }
261 
262  std::unique_ptr<FormFactorBase> FFLbtoLcBLRSVar::clone(const std::string& label) {
263  MAKE_CLONE(FFLbtoLcBLRSVar, label);
264  }
265 
266 } // namespace Hammer
BLRS form factors
#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.
uint16_t IndexType
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