26 namespace MD = MultiDimensional;
28 FFBtoDstarISGW2::FFBtoDstarISGW2() {
30 vector<IndexType> dims = {8};
31 string name{
"FFBtoDstarISGW2"};
34 addProcessSignature(PID::BPLUS, {-PID::DSTAR});
37 addProcessSignature(PID::BZERO, {PID::DSTARMINUS});
41 addProcessSignature(PID::BS, {PID::DSSTARMINUS});
47 void FFBtoDstarISGW2::defineSettings() {
49 setPath(getFFErrPrefixGroup().
get());
55 void FFBtoDstarISGW2::evalAtPSPoint(
const vector<double>& point,
const vector<double>& masses) {
56 Tensor& result = getTensor();
66 if(masses.size() >= 2) {
72 Mb = this->masses()[0];
73 Mc = this->masses()[1];
76 double Sqq = point[0];
77 double t=Sqq/(unitres*unitres);
79 #pragma clang diagnostic push
80 #pragma clang diagnostic ignored "-Wswitch-enum"
82 switch(result.
labels()[0]){
92 mbx=0.75*2.01+0.25*1.87;
104 mbx=0.75*2.11+0.25*1.97;
108 MSG_ERROR(
"Unknown assignments for parametrization " + getFFErrPrefixGroup().
get() +
".");
110 #pragma clang diagnostic pop
112 const double mtb=msb+msd;
113 const double mtx=msq+msd;
115 const double mup=1.0/(1.0/msq+1.0/msb);
116 const double mum=1.0/(1.0/msq-1.0/msb);
117 const double bbx2=0.5*(bb2+bx2);
118 const double mb=Mb/unitres;
119 const double mx=Mc/unitres;
120 const double tm=(mb-mx)*(mb-mx);
121 if ( t > tm ) t = 0.99*tm;
123 const double wt=1.0+(tm-t)/(2.0*mbb*mbx);
124 const double mqm = 0.1;
126 const double r2=3.0/(4.0*msb*msq)+3*msd*msd/(2*mbb*mbx*bbx2) +
127 (16.0/(mbb*mbx*(33.0-2.0*nfp)))*
128 log(Getas(mqm,mqm)/Getas(msq,msq));
129 const double ai = -1.0* ( 6.0/( 33.0 - 2.0*nf));
131 const double cji = pow(( Getas( msb,msb ) / Getas( msq,msq ) ),ai);
132 const double zji = msq / msb;
134 const double gammaji = GetGammaji( zji );
135 const double chiji = -1.0 - ( gammaji / ( 1- zji ));
137 const double betaji_g = (2.0/3.0)+gammaji;
138 const double betaji_f = (-2.0/3.0)+gammaji;
139 const double betaji_appam = -1.0-chiji+(4.0/(3.0*(1.0-zji)))+
140 (2.0*(1+zji)*gammaji/(3.0*(1.0-zji)*(1.0-zji)));
142 const double betaji_apmam = (1.0/3.0)-chiji-(4.0/(3.0*(1.0-zji)))-
143 (2.0*(1+zji)*gammaji/(3.0*(1.0-zji)*(1.0-zji)))+
146 const double r_g = cji*(1+(betaji_g*Getas( msq,sqrt(mb*msq) )/(
pi)));
147 const double r_f = cji*(1+(betaji_f*Getas( msq,sqrt(mb*msq) )/(
pi)));
148 const double r_apmam = cji*(1+(betaji_apmam*Getas( msq,sqrt(mb*msq) )/(
pi)));
151 const double f3=sqrt(mtx/mtb)*pow(sqrt(bx2*bb2)/bbx2,1.5)/
152 ((1.0+r2*(tm-t)/12.0)*(1.0+r2*(tm-t)/12.0));
154 const double f3f=sqrt(mbx*mbb/(mtx*mtb))*f3;
155 const double f3g=sqrt(mtx*mtb/(mbx*mbb))*f3;
156 const double f3appam=sqrt(mtb*mtb*mtb*mbx/(mbb*mbb*mbb*mtx))*f3;
157 const double f3apmam=sqrt(mtx*mtb/(mbx*mbb))*f3;
159 const double f=cf*mtb*(1+wt+msd*(wt-1)/(2*mup))*f3f*r_f;
160 const double g=0.5*(1/msq-msd*bb2/(2*mum*mtx*bbx2))*f3g*r_g;
162 const double appam=cji*(msd*bx2*(1-msd*bx2/(2*mtb*bbx2))/
163 ((1+wt)*msq*msb*bbx2)-
164 betaji_appam*Getas( msq,sqrt(msq*mb) )/
167 const double apmam=-1.0*(mtb/msb-msd*bx2/(2*mup*bbx2)+wt*msd*mtb*bx2*
168 (1-msd*bx2/(2*mtb*bbx2))/((wt+1)*msq*msb*bbx2))*
171 const double ap=0.5*(appam+apmam);
172 const double am=0.5*(appam-apmam);
187 const double MbcSqq = pow(mb + mx, 2.) - t;
188 const double fs = -2 * mx * f / MbcSqq;
197 result.
element({1}) = f*unitres;
199 result.
element({2}) = g/unitres;
201 result.
element({3}) = am/unitres;
203 result.
element({4}) = ap/unitres;
216 std::unique_ptr<FormFactorBase> FFBtoDstarISGW2::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
LabelsList labels() const
get the labels of all the indices at once
Tensor indices label definitions.
Sparse tensor data container.
Multidimensional tensor class with complex numbers as elements.
void clearData()
sets all the elements to 0
Various numerical constants.
Hammer particle data class.
static constexpr double pi