26 namespace MD = MultiDimensional;
28 FFBtoDISGW2::FFBtoDISGW2() {
30 vector<IndexType> dims = {4};
31 string name{
"FFBtoDISGW2"};
34 addProcessSignature(PID::BPLUS, {-PID::D0});
37 addProcessSignature(PID::BZERO, {PID::DMINUS});
41 addProcessSignature(PID::BS, {PID::DSMINUS});
47 void FFBtoDISGW2::defineSettings() {
49 setPath(getFFErrPrefixGroup().
get());
55 void FFBtoDISGW2::evalAtPSPoint(
const vector<double>& point,
const vector<double>& masses) {
56 Tensor& result = getTensor();
60 MSG_WARNING(
"Warning, Setting have not been defined!");
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;
114 const double mb=Mb/unitres;
115 const double mx=Mc/unitres;
117 const double mup=1.0/(1.0/msq+1.0/msb);
118 const double bbx2=0.5*(bb2+bx2);
119 const double tm=(mb-mx)*(mb-mx);
120 if ( t>tm ) t=0.99*tm;
122 const double mqm = 0.1;
123 const double r2=3.0/(4.0*msb*msq)+3*msd*msd/(2*mbb*mbx*bbx2) +
124 (16.0/(mbb*mbx*(33.0-2.0*nfp)))*
125 log(Getas(mqm,mqm)/Getas(msq,msq));
127 const double f3 = sqrt(mtx/mtb)*pow(sqrt(bx2*bb2)/bbx2,1.5) /
128 ((1.0+r2*(tm-t)/12.0)*(1.0+r2*(tm-t)/12.0));
130 const double ai = -1.0* ( 6.0/( 33.0 - 2.0*nf));
131 const double cji = pow(( Getas( msb,msb ) / Getas( msq,msq ) ),ai);
133 const double zji = msq / msb;
135 const double gammaji = GetGammaji( zji );
136 const double chiji = -1.0 - ( gammaji / ( 1- zji ));
137 const double betaji_fppfm = gammaji - (2.0/3.0)*chiji;
138 const double betaji_fpmfm = gammaji + (2.0/3.0)*chiji;
139 const double rfppfm = cji *(1.0 + betaji_fppfm*Getas( msq,sqrt(msb*msq) )/
pi);
140 const double rfpmfm = cji *(1.0 + betaji_fpmfm*Getas( msq,sqrt(msb*msq) )/
pi);
141 const double f3fppfm = f3*pow(( mbb / mtb ),-0.5)*pow((mbx/mtx),0.5);
142 const double f3fpmfm = f3*pow(( mbb / mtb ),0.5)*pow((mbx/mtx),-0.5);
143 const double fppfm = f3fppfm* rfppfm * ( 2.0 - ( ( mtx/msq)*(1- ( (msd*msq*bb2)
144 /(2.0*mup*mtx*bbx2)))));
145 const double fpmfm = f3fpmfm* rfpmfm * ( mtb/msq) * ( 1 - ( ( msd*msq*bb2)/
146 ( 2.0*mup*mtx*bbx2)));
148 const double fp = (fppfm + fpmfm)/2.0;
149 const double fm = (fppfm - fpmfm)/2.0;
151 const double f0 = (fm/((mb*mb-mx*mx)/t))+fp;
154 const double MbcSqq = pow(mb + mx, 2.) - t;
155 const double fs = fp * MbcSqq / (mb + mx);
160 result.
element({0}) = unitres*fs;
169 std::unique_ptr<FormFactorBase> FFBtoDISGW2::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