Hammer  1.0.0
Helicity Amplitude Module for Matrix Element Reweighting
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
FFBtoD1ISGW2.cc
Go to the documentation of this file.
1 ///
2 /// @file FFBtoD1ISGW2.cc
3 /// @brief \f$ B \rightarrow D_1 \f$ ISGW2 form factors
4 /// @brief Ported directly from EvtGen
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  FFBtoD1ISGW2::FFBtoD1ISGW2() {
30  // Create tensor rank and dimensions
31  vector<IndexType> dims = {8};
32  string name{"FFBtoD1ISGW2"};
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 FFBtoD1ISGW2::defineSettings() {
49  //_FFErrNames = ;
50  setPath(getFFErrPrefixGroup().get());
51  setUnits("GeV");
52 
53  initialized = true;
54  }
55 
56  void FFBtoD1ISGW2::evalAtPSPoint(const vector<double>& point, const vector<double>& masses) {
57  Tensor& result = getTensor();
58  result.clearData();
59 
60  if(!initialized){
61  MSG_WARNING("Warning, Setting have not been defined!");
62  }
63 
64  double Mb = 0.;
65  double Mc = 0.;
66  double unitres = 1.;
67  if(masses.size() >= 2) {
68  Mb = masses[0];
69  Mc = masses[1];
70  unitres = _units;
71  }
72  else {
73  Mb = this->masses()[0];
74  Mc = this->masses()[1];
75  }
76  // const double Mb2 = Mb*Mb;
77  // const double Mc2 = Mc*Mc;
78 
79  double Sqq = point[0];
80  double t=Sqq/(unitres*unitres);
81 
82 #pragma clang diagnostic push
83 #pragma clang diagnostic ignored "-Wswitch-enum"
84  //Ported from EvtGen EvtISGW2FF1P1
85  switch(result.labels()[0]){
86  case FF_BDSSD1:
87  msb=5.2;
88  msd=0.33;
89  bb2=0.431*0.431;
90  mbb=5.31;
91 
92  msq=1.82;
93  bx2=0.33*0.33;
94  mbx=(5.0*2.46+3.0*2.42)/8.0;
95  nfp = 3.0;
96  break;
97  case FF_BSDSSDS1:
98  msb=5.2;
99  msd=0.55;
100  bb2=0.54*0.54;
101  mbb=5.38;
102 
103  msq=1.82;
104  bx2=0.41*0.41;
105  mbx=(5.0*2.61+3.0*2.54)/8.0;
106  nfp = 3.0;
107  break;
108  default:
109  MSG_ERROR("Unknown assignments for parametrization " + getFFErrPrefixGroup().get() + ".");
110  }
111 #pragma clang diagnostic pop
112 
113  const double mtb = msb + msd;
114  const double mtx = msq + msd;
115 
116  const double mb = Mb/unitres;
117  const double mx = Mc/unitres;
118 
119  const double mup=1.0/(1.0/msq+1.0/msb);
120  const double mum=1.0/(1.0/msq-1.0/msb);
121  const double bbx2=0.5*(bb2+bx2);
122  const double tm=(mb-mx)*(mb-mx);
123  if( t > tm ) { t = 0.99*tm; }
124  const double wt=1.0+(tm-t)/(2.0*mbb*mbx);
125 
126  const double mqm = 0.1;
127  const double r2=3.0/(4.0*msb*msq)+3*msd*msd/(2*mbb*mbx*bbx2)+(16.0/(mbb*mbx*(33.0-2.0*nfp)))*log(Getas(mqm,mqm)/Getas(msq,msq));
128 
129  const double f5 = sqrt(mtx/mtb)*pow(sqrt(bx2*bb2)/bbx2,5.0/2.0)/(pow((1.0+r2*(tm-t)/18.0),3.0));
130 
131  const double f5v = f5*pow(( mbb / mtb ),-0.5)*pow((mbx/mtx),-0.5);
132  const double f5r = f5*pow(( mbb / mtb ),0.5)*pow((mbx/mtx),0.5);
133  const double f5sppsm = f5*pow(( mbb / mtb ),-1.5)*pow((mbx/mtx),0.5);
134  const double f5spmsm = f5*pow(( mbb / mtb ),-0.5)*pow((mbx/mtx),-0.5);
135 
136  const double vv = -msd*f5v/(2.0*sqrt(3.0*bb2)*mtx)*((wt+1)/2.0+bb2*mtb/(2.0*msd*msq*msb));
137  const double rr = -2.*mtb*sqrt(bb2/3.0)*f5r*(1.0/msq + mtx*msd*(wt-1)/(2.0*bb2)*((wt+1)/(2.0*msq)-msd*bb2/(2.0*mum*mtx*bbx2)));
138  const double sppsm = -sqrt(3.0)*msd*f5sppsm/(2.0*sqrt(bb2)*mtb)*(1 - msd/(3.0*msq) - msd*bb2/(3.0*bbx2)*(1.0/(2.0*mum)-1.0/mup));
139  const double spmsm = -msd*f5spmsm/(2.0*sqrt(3.0*bb2)*mtx)*((2-wt)*mtx/msq + msd*bb2/bbx2*(1.0/(2.0*mum)-1.0/mup));
140 
141  //FF Basis map
142  const double sqmbmx = sqrt(mb*mx);
143  const double Fv1 = rr/sqmbmx;
144  const double Fv2 = mb*mb*sppsm/sqmbmx;
145  const double Fv3 = spmsm*sqmbmx;
146  const double Fa = 2*vv*sqmbmx;
147 
148  //Set elements
149  result.element({1}) = Fv1;
150  result.element({2}) = Fv2;
151  result.element({3}) = Fv3;
152  result.element({4}) = Fa;
153 
154  }
155 
156  std::unique_ptr<FormFactorBase> FFBtoD1ISGW2::clone(const std::string& label) {
157  MAKE_CLONE(FFBtoD1ISGW2, label);
158  }
159 
160 } // 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
LabelsList labels() const
get the labels of all the indices at once
Definition: Tensor.cc:83
Tensor indices label definitions.
ISGW2 form factors
Sparse tensor data container.
Multidimensional tensor class with complex numbers as elements.
Definition: Tensor.hh:33
void clearData()
sets all the elements to 0
Definition: Tensor.cc:229
Various numerical constants.
Hammer particle data class.
#define MSG_ERROR(x)
Definition: Logging.hh:367
Hammer particle class.
#define MAKE_CLONE(OBJ, LABEL)