Hammer  1.0.0
Helicity Amplitude Module for Matrix Element Reweighting
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
FFLbtoLcPCR.cc
Go to the documentation of this file.
1 ///
2 /// @file FFLbtoLcPCR.cc
3 /// @brief \f$ \Lambda_b \rightarrow Lambda_c \f$ PCR 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  FFLbtoLcPCR::FFLbtoLcPCR() {
30  // Create tensor rank and dimensions
31  vector<IndexType> dims = {12};
32  string name{"FFLbtoLcPCR"};
33 
34  setPrefix("LbtoLc");
35  addProcessSignature(-PID::LAMBDAB, {PID::LAMBDACMINUS});
36  addTensor(Tensor{name, MD::makeEmptySparse(dims, {FF_LBLC})});
37 
38  setSignatureIndex();
39  }
40 
41  void FFLbtoLcPCR::defineSettings() {
42  //_FFErrNames = ;
43  setPath(getFFErrPrefixGroup().get());
44  setUnits("GeV");
45 
46  addSetting<double>("mQ",5.28);
47  addSetting<double>("mq",1.89);
48  addSetting<double>("md",0.40);
49  addSetting<double>("aL",0.59);
50  addSetting<double>("aLp",0.55);
51  addSetting<double>("k2",1.0);
52 
53  initialized = true;
54  }
55 
56  void FFLbtoLcPCR::eval(const Particle& parent, const ParticleList& daughters,
57  const ParticleList&) {
58  // Momenta
59  const FourMomentum& pLbmes = parent.momentum();
60  const FourMomentum& pLcmes = daughters[0].momentum();
61  // const FourMomentum& pTau = daughters[2].momentum();
62 
63  // kinematic objects
64  const double Mb = pLbmes.mass();
65  const double Mc = pLcmes.mass();
66  const double Sqq = Mb*Mb + Mc*Mc - 2. * (pLbmes * pLcmes);
67 
68  evalAtPSPoint({Sqq}, {Mb, Mc});
69  }
70 
71  void FFLbtoLcPCR::evalAtPSPoint(const vector<double>& point, const vector<double>& masses) {
72  Tensor& result = getTensor();
73  result.clearData();
74 
75  if(!initialized){
76  MSG_WARNING("Warning, Settings have not been defined!");
77  }
78 
79  double Mb = 0.;
80  double Mc = 0.;
81  // double unitres = 1.;
82  if(masses.size() >= 2) {
83  Mb = masses[0];
84  Mc = masses[1];
85  // unitres = _units;
86  }
87  else {
88  Mb = this->masses()[0];
89  Mc = this->masses()[1];
90  }
91  const double Mb2 = Mb*Mb;
92  const double Mc2 = Mc*Mc;
93 
94  double Sqq = point[0];
95 
96  // const double sqSqq = sqrt(Sqq);
97  double w = (Mb2 + Mc2 - Sqq)/(2.*Mb*Mc);
98  //safety measure if w==1.0
99  if(isZero(w - 1.0)) w += 1e-6;
100 
101  //Parameters
102  const double mQ = (*getSetting<double>("mQ"));
103  const double mq = (*getSetting<double>("mq"));
104  const double md = (*getSetting<double>("md"));
105  const double aL = (*getSetting<double>("aL"));
106  const double aLp = (*getSetting<double>("aLp"));
107  const double k2 = (*getSetting<double>("k2"));
108 
109  const double aL2 = aL*aL;
110  const double aLp2 = aLp*aLp;
111  const double aLLp2 = 0.5*(aL2+aLp2);
112  const double rho2 = 3.*md*md/(2.*k2*aLLp2);
113 
114  const double IH = pow(aL*aLp/aLLp2, 1.5)*exp(-rho2*(w*w-1.));
115 
116  // set elements f_123 and g_123
117  result.element({2}) = 1. + (md/aLLp2)*((aLp2/mq)+(aL2/mQ));
118  result.element({3}) = -((md/mq)*(aLp2/aLLp2) - aL2*aLp2/(4.*aLLp2*mq*mQ));
119  result.element({4}) = -md*aL2/(mQ*aLLp2);
120  result.element({5}) = 1. - (aL2*aLp2)/(12.*aLLp2*mq*mQ);
121  result.element({6}) = -(md*aLp2/(mq*aLLp2) + (aL2*aLp2)/(12.*aLLp2*mq*mQ)*(1.+12.*md*md/aLLp2));
122  result.element({7}) = md*aL2/(mQ*aLLp2) + md*md*aL2*aLp2/(mq*mQ*aLLp2*aLLp2);
123 
124  result *= IH;
125 
126  }
127 
128  std::unique_ptr<FormFactorBase> FFLbtoLcPCR::clone(const std::string& label) {
129  MAKE_CLONE(FFLbtoLcPCR, label);
130  }
131 
132 } // 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.
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.
PCR form factors
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