27 namespace MD = MultiDimensional;
29 FFBtoDstarBGLVar::FFBtoDstarBGLVar() {
31 vector<IndexType> dims = {8, 11};
33 string name{
"FFBtoDstarBGLVar"};
37 addProcessSignature(PID::BPLUS, {-PID::DSTAR});
40 addProcessSignature(PID::BZERO, {PID::DSTARMINUS});
45 addProcessSignature(PID::BS, {PID::DSSTARMINUS});
51 void FFBtoDstarBGLVar::defineSettings() {
52 _FFErrNames = {
"delta_a0",
"delta_a1",
"delta_a2",
"delta_b0",
"delta_b1",
"delta_b2",
"delta_c1",
"delta_c2",
53 "delta_d0",
"delta_d1"};
54 setPath(getFFErrPrefixGroup().
get());
57 addSetting<double>(
"Vcb", 41.5e-3);
58 addSetting<double>(
"Chim", 3.07e-4);
59 addSetting<double>(
"Chip", 5.280e-4);
60 addSetting<double>(
"ChimL",19.421e-3);
65 vector<double> avec={0.00038,0.026905,0.};
66 vector<double> bvec={0.00055,-0.0020370,0.};
67 vector<double> cvec={-0.000433,0.005353};
69 vector<double> dvec={0.0025,-0.013};
70 addSetting<vector<double>>(
"avec",avec);
71 addSetting<vector<double>>(
"bvec",bvec);
72 addSetting<vector<double>>(
"cvec",cvec);
73 addSetting<vector<double>>(
"dvec",dvec);
75 vector<double> BcStatesf{6.730,6.736,7.135,7.142};
76 vector<double> BcStatesg{6.337,6.899,7.012,7.280};
77 vector<double> BcStatesP1{6.275,6.842,7.250};
78 addSetting<vector<double>>(
"BcStatesf",BcStatesf);
79 addSetting<vector<double>>(
"BcStatesg",BcStatesg);
80 addSetting<vector<double>>(
"BcStatesP1",BcStatesP1);
84 vector<vector<double>> abcdmat{ {1., 0., 0., 0., 0., 0., 0., 0., 0., 0.},
85 {0., 1., 0., 0., 0., 0., 0., 0., 0., 0.},
86 {0., 0., 1., 0., 0., 0., 0., 0., 0., 0.},
87 {0., 0., 0., 1., 0., 0., 0., 0., 0., 0.},
88 {0., 0., 0., 0., 1., 0., 0., 0., 0., 0.},
89 {0., 0., 0., 0., 0., 1., 0., 0., 0., 0.},
90 {0., 0., 0., 0., 0., 0., 1., 0., 0., 0.},
91 {0., 0., 0., 0., 0., 0., 0., 1., 0., 0.},
92 {0., 0., 0., 0., 0., 0., 0., 0., 1., 0.},
93 {0., 0., 0., 0., 0., 0., 0., 0., 0., 1.}};
94 addSetting<vector<vector<double>>>(
"abcdmatrix",abcdmat);
96 for (
auto elem : _FFErrNames) {
97 addSetting<double>(elem, 0.);
103 void FFBtoDstarBGLVar::evalAtPSPoint(
const vector<double>& point,
const vector<double>& masses) {
104 Tensor& result = getTensor();
108 MSG_WARNING(
"Warning, Settings have not been defined!");
114 if(masses.size() >= 2) {
120 Mb = this->masses()[0];
121 Mc = this->masses()[1];
123 const double Sqq = point[0];
124 const double Mb2 = Mb*Mb;
125 const double Mb3 = Mb2*Mb;
126 const double Mc2 = Mc*Mc;
127 const double rC = Mc/Mb;
128 const double rC2 = rC*rC;
129 const double sqrC = sqrt(rC);
131 double w = (Mb2 + Mc2 - Sqq) / (2. * Mb * Mc);
133 if(
isZero(w - 1.0)) w += 1e-6;
134 const double w2 = w*w;
136 const size_t nmax = 4;
137 const double z = (sqrt(w+1) -
sqrt2)/(sqrt(w+1)+
sqrt2);
138 vector<double> zpow{1.};
139 for (
size_t n = 1; n < nmax; ++n){
140 zpow.push_back(zpow[n-1]*z);
143 const vector<double>& ag=(*getSetting<vector<double>>(
"avec"));
144 const vector<double>& af=(*getSetting<vector<double>>(
"bvec"));
145 const vector<double>& aF1=(*getSetting<vector<double>>(
"cvec"));
146 const vector<double>& aP1=(*getSetting<vector<double>>(
"dvec"));
148 const vector<vector<double>>& abcdmat = (*getSetting<vector<vector<double>>>(
"abcdmatrix"));
151 const double etaEWVcb = 1.0066*(*getSetting<double>(
"Vcb"));
152 const double chim=(*getSetting<double>(
"Chim"))/(unitres*unitres);
153 const double chip=(*getSetting<double>(
"Chip"))/(unitres*unitres);
154 const double chimL=(*getSetting<double>(
"ChimL"));
156 const double tp=(Mb+Mc)*(Mb+Mc)/Mb2;
157 const double tm=(Mb-Mc)*(Mb-Mc)/Mb2;
158 const double sqtptm = sqrt(tp - tm);
160 vector<double>& BcStatesf = (*getSetting<vector<double>>(
"BcStatesf"));
161 vector<double>& BcStatesg = (*getSetting<vector<double>>(
"BcStatesg"));
162 vector<double>& BcStatesP1 = (*getSetting<vector<double>>(
"BcStatesP1"));
165 for(
size_t n = 0; n< BcStatesf.size(); ++n){
166 double sqtpBc = sqrt(tp-pow(BcStatesf[n]*unitres/Mb,2));
167 Pf *= ((z-((sqtpBc-sqtptm)/(sqtpBc+sqtptm)))/(1.-z*((sqtpBc-sqtptm)/(sqtpBc+sqtptm))));
173 for(
size_t n = 0; n< BcStatesg.size(); ++n){
174 double sqtpBc = sqrt(tp-pow(BcStatesg[n]*unitres/Mb,2));
175 Pg *= ((z-((sqtpBc-sqtptm)/(sqtpBc+sqtptm)))/(1.-z*((sqtpBc-sqtptm)/(sqtpBc+sqtptm))));
179 for(
size_t n = 0; n< BcStatesP1.size(); ++n){
180 double sqtpBc = sqrt(tp-pow(BcStatesP1[n]*unitres/Mb,2));
181 PP1 *= ((z-((sqtpBc-sqtptm)/(sqtpBc+sqtptm)))/(1.-z*((sqtpBc-sqtptm)/(sqtpBc+sqtptm))));
184 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));
185 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));
186 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));
188 const double phif_0 = 4.*rC*sqrt(nc/chim)/(Mb2*sqrt(3*
pi)*pow(1+2*sqrC+rC,4));
189 const double phiF1_0 = 2.*sqrt(2/(3*
pi))*rC*sqrt(nc/chim)/(Mb3*pow(1+2*sqrC+rC,5));
191 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);
194 for(
size_t n = 0; n< ag.size(); ++n) g += ag[n] * zpow[n];
198 for(
size_t n = 0; n< af.size(); ++n) f += af[n] * zpow[n];
201 double F1=af[0]*(Mb-Mc)*phiF1_0/phif_0;
202 for(
size_t n = 0; n< aF1.size(); ++n) F1 += aF1[n] * zpow[n+1];
207 for(
size_t n = 0; n< aP1.size(); ++n) P1 += aP1[n]*zpow[n];
208 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));
226 result.
element({3,0}) = (Fmf*f + FmF1*F1 + FmP1*P1);
228 result.
element({4,0}) = (Fpf*f + FpF1*F1);
244 double F1entry = abcdmat[3][idx]*(Mb-Mc)*phiF1_0/phif_0/(PF1*phiF1);
246 for(
size_t n = 0; n < 3; ++n){
247 gentry += abcdmat[n][idx]*zpow[n]/(Pg*phig);
248 fentry += abcdmat[n+3][idx]*zpow[n]/(Pf*phif);
250 for(
size_t n = 0; n < 2; ++n){
251 F1entry += abcdmat[n+6][idx]*zpow[n+1]/(PF1*phiF1);
252 P1entry += abcdmat[n+8][idx]*zpow[n]*sqrC/(1+rC)/(PP1*phiP1);
254 double Fmentry = Fmf*fentry + FmF1*F1entry + FmP1*P1entry;
255 double Fpentry = Fpf*fentry + FpF1*F1entry;
259 if(!
isZero(gentry)) { result.
element({2, idxp1}) = gentry/2.; }
260 if(!
isZero(Fmentry)) { result.
element({3, idxp1}) = Fmentry; }
261 if(!
isZero(Fpentry)) { result.
element({4, idxp1}) = Fpentry; }
264 result*=(1./etaEWVcb);
267 unique_ptr<FormFactorBase> FFBtoDstarBGLVar::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
BGL form factors with variations
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