27 namespace MD = MultiDimensional;
29 FFBtoDstarBGL::FFBtoDstarBGL() {
31 vector<IndexType> dims = {8};
32 string name{
"FFBtoDstarBGL"};
35 addProcessSignature(PID::BPLUS, {-PID::DSTAR});
38 addProcessSignature(PID::BZERO, {PID::DSTARMINUS});
42 addProcessSignature(PID::BS, {PID::DSSTARMINUS});
48 void FFBtoDstarBGL::defineSettings() {
50 setPath(getFFErrPrefixGroup().
get());
53 addSetting<double>(
"Vcb", 41.5e-3);
54 addSetting<double>(
"Chim", 3.07e-4);
55 addSetting<double>(
"Chip", 5.280e-4);
56 addSetting<double>(
"ChimL",19.421e-3);
61 vector<double> avec={0.00038,0.026905,0.};
62 vector<double> bvec={0.00055,-0.0020370,0.};
63 vector<double> cvec={-0.000433,0.005353};
65 vector<double> dvec={0.0025,-0.013};
66 addSetting<vector<double>>(
"avec",avec);
67 addSetting<vector<double>>(
"bvec",bvec);
68 addSetting<vector<double>>(
"cvec",cvec);
69 addSetting<vector<double>>(
"dvec",dvec);
71 vector<double> BcStatesf{6.730,6.736,7.135,7.142};
72 vector<double> BcStatesg{6.337,6.899,7.012,7.280};
73 vector<double> BcStatesP1{6.275,6.842,7.250};
74 addSetting<vector<double>>(
"BcStatesf",BcStatesf);
75 addSetting<vector<double>>(
"BcStatesg",BcStatesg);
76 addSetting<vector<double>>(
"BcStatesP1",BcStatesP1);
81 void FFBtoDstarBGL::evalAtPSPoint(
const vector<double>& point,
const vector<double>& masses) {
82 Tensor& result = getTensor();
86 MSG_WARNING(
"Warning, Settings have not been defined!");
92 if(masses.size() >= 2) {
98 Mb = this->masses()[0];
99 Mc = this->masses()[1];
101 const double Sqq = point[0];
102 const double Mb2 = Mb*Mb;
103 const double Mb3 = Mb2*Mb;
104 const double Mc2 = Mc*Mc;
105 const double rC = Mc/Mb;
106 const double rC2 = rC*rC;
107 const double sqrC = sqrt(rC);
109 double w = (Mb2 + Mc2 - Sqq) / (2. * Mb * Mc);
111 if(
isZero(w - 1.0)) w += 1e-6;
112 const double w2 = w*w;
114 const size_t nmax = 4;
115 const double z = (sqrt(w+1) -
sqrt2)/(sqrt(w+1) +
sqrt2);
116 vector<double> zpow{1.};
117 for (
size_t n = 1; n < nmax; ++n){
118 zpow.push_back(zpow[n-1]*z);
121 const vector<double>& ag=(*getSetting<vector<double>>(
"avec"));
122 const vector<double>& af=(*getSetting<vector<double>>(
"bvec"));
123 const vector<double>& aF1=(*getSetting<vector<double>>(
"cvec"));
124 const vector<double>& aP1=(*getSetting<vector<double>>(
"dvec"));
127 const double etaEWVcb = 1.0066*(*getSetting<double>(
"Vcb"));
128 const double chim = (*getSetting<double>(
"Chim"))/(unitres*unitres);
129 const double chip = (*getSetting<double>(
"Chip"))/(unitres*unitres);
130 const double chimL=(*getSetting<double>(
"ChimL"));
132 const double tp=(Mb+Mc)*(Mb+Mc)/Mb2;
133 const double tm=(Mb-Mc)*(Mb-Mc)/Mb2;
134 const double sqtptm = sqrt(tp - tm);
136 vector<double>& BcStatesf = (*getSetting<vector<double>>(
"BcStatesf"));
137 vector<double>& BcStatesg = (*getSetting<vector<double>>(
"BcStatesg"));
138 vector<double>& BcStatesP1 = (*getSetting<vector<double>>(
"BcStatesP1"));
141 for(
size_t n = 0; n< BcStatesf.size(); ++n){
142 double sqtpBc = sqrt(tp-pow(BcStatesf[n]*unitres/Mb,2));
143 Pf *= ((z-((sqtpBc-sqtptm)/(sqtpBc+sqtptm)))/(1.-z*((sqtpBc-sqtptm)/(sqtpBc+sqtptm))));
149 for(
size_t n = 0; n< BcStatesg.size(); ++n){
150 double sqtpBc = sqrt(tp-pow(BcStatesg[n]*unitres/Mb,2));
151 Pg *= ((z-((sqtpBc-sqtptm)/(sqtpBc+sqtptm)))/(1.-z*((sqtpBc-sqtptm)/(sqtpBc+sqtptm))));
155 for(
size_t n = 0; n< BcStatesP1.size(); ++n){
156 double sqtpBc = sqrt(tp-pow(BcStatesP1[n]*unitres/Mb,2));
157 PP1 *= ((z-((sqtpBc-sqtptm)/(sqtpBc+sqtptm)))/(1.-z*((sqtpBc-sqtptm)/(sqtpBc+sqtptm))));
160 const double phig=sqrt(256.*nc/(3*
pi*chip))*((rC2*pow(1+z,2)*pow(1-z,-0.5))/pow(((1+rC)*(1-z)+2*sqrC*(1+z)),4));
161 const double phif=(1./Mb2)*sqrt(16.*nc/(3*
pi*chim))*((rC*(1+z)*pow(1-z,1.5))/pow(((1+rC)*(1-z)+2*sqrC*(1+z)),4));
162 const double phiF1=(1./Mb3)*sqrt(8.*nc/(3*
pi*chim))*((rC*(1+z)*pow(1-z,2.5))/pow(((1+rC)*(1-z)+2*sqrC*(1+z)),5));
164 const double phif_0 = 4.*rC*sqrt(nc/chim)/(Mb2*sqrt(3*
pi)*pow(1+2*sqrC+rC,4));
165 const double phiF1_0 = 2.*sqrt(2/(3*
pi))*rC*sqrt(nc/chim)/(Mb3*pow(1+2*sqrC+rC,5));
167 const double phiP1=sqrt(nc/(
pi*chimL))*((8.*
sqrt2*rC2*pow(1+z,2)*pow(1-z,-0.5)))/pow(((1+rC)*(1-z)+2*sqrC*(1+z)),4);
170 for(
size_t n = 0; n< ag.size(); ++n) g += ag[n] * zpow[n];
174 for(
size_t n = 0; n< af.size(); ++n) f += af[n] * zpow[n];
177 double F1=af[0]*(Mb-Mc)*phiF1_0/phif_0;
178 for(
size_t n = 0; n< aF1.size(); ++n) F1 += aF1[n] * zpow[n+1];
183 for(
size_t n = 0; n< aP1.size(); ++n) P1 += aP1[n]*zpow[n];
184 P1 *= sqrC/((1+rC)*PP1*phiP1);
211 const double Fpf = (rC-w)/(2.*rC*Mb2*(w2 - 1));
212 const double FpF1 = 1./(2.*rC*Mb3*(w2 - 1));
213 const double Fmf = (rC+w)/(2.*rC*Mb2*(w2 - 1));
214 const double FmF1 = 1./(2.*rC*Mb3*(w2 - 1))*(rC2-1)/(1 + rC2 - 2*rC*w);
215 const double FmP1 = sqrC*(rC+1)/(Mb*(1 + rC2 - 2*rC*w));
225 result.
element({3}) = (Fmf*f + FmF1*F1 + FmP1*P1);
227 result.
element({4}) = (Fpf*f + FpF1*F1);
235 result*=(1./etaEWVcb);
238 unique_ptr<FormFactorBase> FFBtoDstarBGL::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