27 namespace MD = MultiDimensional;
29 FFBtoDBGL::FFBtoDBGL() {
31 vector<IndexType> dims = {4};
32 string name{
"FFBtoDBGL"};
35 addProcessSignature(PID::BPLUS, {-PID::D0});
38 addProcessSignature(PID::BZERO, {PID::DMINUS});
42 addProcessSignature(PID::BS, {PID::DSMINUS});
48 void FFBtoDBGL::defineSettings() {
50 setPath(getFFErrPrefixGroup().
get());
54 addSetting<double>(
"ChiT",5.131e-4);
55 addSetting<double>(
"ChiL",6.332e-3);
57 vector<double> apvec={0.01565,-0.0353,-0.043,0.194};
58 vector<double> a0vec={0.07932,-0.214,0.17,-0.958};
59 addSetting<vector<double>>(
"ap",apvec);
60 addSetting<vector<double>>(
"a0",a0vec);
62 vector<double> BcStatesp={6.329, 6.920, 7.020};
63 vector<double> BcStates0={6.716, 7.121};
64 addSetting<vector<double>>(
"BcStatesp",BcStatesp);
65 addSetting<vector<double>>(
"BcStates0",BcStates0);
70 void FFBtoDBGL::evalAtPSPoint(
const vector<double>& point,
const vector<double>& masses) {
71 Tensor& result = getTensor();
75 MSG_WARNING(
"Warning, Settings have not been defined!");
81 if(masses.size() >= 2) {
87 Mb = this->masses()[0];
88 Mc = this->masses()[1];
90 const double Sqq = point[0];
91 const double Mb2 = Mb*Mb;
92 const double Mc2 = Mc*Mc;
93 const double rC = Mc/Mb;
94 const double rC2 = rC*rC;
95 const double sqrC = sqrt(rC);
97 double w = (Mb2 + Mc2 - Sqq) / (2. * Mb * Mc);
99 if(
isZero(w - 1.0)) w += 1e-6;
101 const size_t nmax = 4;
102 const double z = (sqrt(w+1) -
sqrt2)/(sqrt(w+1)+
sqrt2);
103 vector<double> zpow{1.};
104 for (
size_t n = 1; n < nmax; ++n){
105 zpow.push_back(zpow[n-1]*z);
108 const vector<double>& BcStatesp = (*getSetting<vector<double>>(
"BcStatesp"));
109 const vector<double>& BcStates0 = (*getSetting<vector<double>>(
"BcStates0"));
111 const vector<double>& ap = (*getSetting<vector<double>>(
"ap"));
112 const vector<double>& a0 = (*getSetting<vector<double>>(
"a0"));
115 const double chiT=(*getSetting<double>(
"ChiT"))/(unitres*unitres);
116 const double chiL=(*getSetting<double>(
"ChiL"));
117 const double tp=(Mb+Mc)*(Mb+Mc)/Mb2;
118 const double tm=(Mb-Mc)*(Mb-Mc)/Mb2;
119 const double sqtptm = sqrt(tp - tm);
122 for(
size_t n = 0; n< BcStatesp.size(); ++n) {
123 double sqtpBc = sqrt(tp - pow(BcStatesp[n]*unitres/Mb,2));
124 Pp *= ((z-((sqtpBc-sqtptm)/(sqtpBc+sqtptm)))/(1-z*((sqtpBc-sqtptm)/(sqtpBc+sqtptm))));
128 for(
size_t n = 0; n< BcStates0.size(); ++n){
129 double sqtpBc = sqrt(tp-pow(BcStates0[n]*unitres/Mb,2));
130 P0 *= ((z-((sqtpBc-sqtptm)/(sqtpBc+sqtptm)))/(1-z*((sqtpBc-sqtptm)/(sqtpBc+sqtptm))));
133 double phip = 32.*sqrt(nc/(6.*
pi*chiT*Mb2))*rC2*pow(1+z,2)*pow(1-z,0.5)/pow((1+rC)*(1-z)+2*sqrC*(1+z),5);
135 double phi0 = (1-rC2)*8.*sqrt(nc/(8.*
pi*chiL))*rC*(1+z)*pow(1-z,1.5)/pow((1+rC)*(1-z)+2*sqrC*(1+z),4);
138 for(
size_t n = 0; n< ap.size(); ++n) Fp += ap[n] * zpow[n];
142 for(
size_t n = 0; n< a0.size(); ++n) F0 += a0[n] * zpow[n];
157 unique_ptr<FormFactorBase> FFBtoDBGL::clone(
const 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