27 namespace MD = MultiDimensional;
29 FFBtoDCLN::FFBtoDCLN() {
31 vector<IndexType> dims = {4};
32 string name{
"FFBtoDCLN"};
35 addProcessSignature(PID::BPLUS, {-PID::D0});
38 addProcessSignature(PID::BZERO, {PID::DMINUS});
42 addProcessSignature(PID::BS, {PID::DSMINUS});
48 void FFBtoDCLN::defineSettings() {
50 setPath(getFFErrPrefixGroup().
get());
53 addSetting<double>(
"a",1.0);
54 addSetting<double>(
"RhoSq",1.186);
55 addSetting<double>(
"G1",1.082);
56 addSetting<double>(
"Delta",1.);
57 addSetting<double>(
"as",0.26);
58 addSetting<double>(
"la",0.48);
59 addSetting<double>(
"mcOnmb",0.29);
63 void FFBtoDCLN::evalAtPSPoint(
const vector<double>& point,
const vector<double>& masses) {
64 Tensor& result = getTensor();
68 MSG_WARNING(
"Warning, Setting have not been defined!");
74 if(masses.size() >= 2) {
80 Mb = this->masses()[0];
81 Mc = this->masses()[1];
83 const double Mb2 = Mb*Mb;
84 const double Mc2 = Mc*Mc;
86 double Sqq = point[0];
89 double w = (Mb2 + Mc2 - Sqq)/(2.*Mb*Mc);
91 if(
isZero(w - 1.0)) w += 1e-6;
92 const double a = *getSetting<double>(
"a");
93 const double zCon = (sqrt(w+1) -
sqrt2*a)/(sqrt(w+1) +
sqrt2*a);
95 const double RhoSq=*getSetting<double>(
"RhoSq");
96 const double G1par=*getSetting<double>(
"G1");
97 const double Delta=*getSetting<double>(
"Delta");
98 const double as = *getSetting<double>(
"as")/
pi;
99 const double LambdaBar = *getSetting<double>(
"la");
100 const double zR = *getSetting<double>(
"mcOnmb");
102 const double rC=Mc/Mb;
105 const double mbMu = Mb - unitres*LambdaBar - Mb*as*(4./3. + log(zR));
106 const double mcMu = Mc - unitres*LambdaBar - Mc*as*(4./3. - log(zR));
109 const double V1wOnV1 = 1. - 8.* RhoSq * zCon + (51. * RhoSq - 10.) * zCon * zCon - (252. * RhoSq - 84.) * zCon * zCon *zCon;
110 const double Fp=((1. + rC)/(2.*sqrt(rC))*V1wOnV1)
112 const double S1wOnV1w = 1 + Delta*(-0.019 + 0.041*(w - 1.) - 0.015*pow(w - 1.,2.));
113 const double Fz = (sqrt(rC)/(1. + rC)*(1+w)*S1wOnV1w*V1wOnV1)
116 const double Fs = Fz*Mb2*(1.-rC*rC)/(mbMu - mcMu);
132 std::unique_ptr<FormFactorBase> FFBtoDCLN::clone(
const std::string& label) {
TensorData makeEmptySparse(const IndexList &dimensions, const LabelsList &labels)
std::complex< double > & element(const IndexList &indices={})
access an element given its indices
Tensor indices label definitions.
static constexpr double sqrt2
Sparse tensor data container.
Multidimensional tensor class with complex numbers as elements.
bool isZero(const std::complex< double > val)
void clearData()
sets all the elements to 0
Various numerical constants.
Hammer particle data class.
static constexpr double pi