27 namespace MD = MultiDimensional;
29 FFBtoD1ISGW2::FFBtoD1ISGW2() {
31 vector<IndexType> dims = {8};
32 string name{
"FFBtoD1ISGW2"};
35 addProcessSignature(PID::BPLUS, {-PID::DSSD1});
38 addProcessSignature(PID::BZERO, {PID::DSSD1MINUS});
41 setPrefix(
"BstoDs**1");
42 addProcessSignature(PID::BS, {PID::DSSDS1MINUS});
48 void FFBtoD1ISGW2::defineSettings() {
50 setPath(getFFErrPrefixGroup().
get());
56 void FFBtoD1ISGW2::evalAtPSPoint(
const vector<double>& point,
const vector<double>& masses) {
57 Tensor& result = getTensor();
61 MSG_WARNING(
"Warning, Setting have not been defined!");
67 if(masses.size() >= 2) {
73 Mb = this->masses()[0];
74 Mc = this->masses()[1];
79 double Sqq = point[0];
80 double t=Sqq/(unitres*unitres);
82 #pragma clang diagnostic push
83 #pragma clang diagnostic ignored "-Wswitch-enum"
85 switch(result.
labels()[0]){
94 mbx=(5.0*2.46+3.0*2.42)/8.0;
105 mbx=(5.0*2.61+3.0*2.54)/8.0;
109 MSG_ERROR(
"Unknown assignments for parametrization " + getFFErrPrefixGroup().
get() +
".");
111 #pragma clang diagnostic pop
113 const double mtb = msb + msd;
114 const double mtx = msq + msd;
116 const double mb = Mb/unitres;
117 const double mx = Mc/unitres;
119 const double mup=1.0/(1.0/msq+1.0/msb);
120 const double mum=1.0/(1.0/msq-1.0/msb);
121 const double bbx2=0.5*(bb2+bx2);
122 const double tm=(mb-mx)*(mb-mx);
123 if( t > tm ) { t = 0.99*tm; }
124 const double wt=1.0+(tm-t)/(2.0*mbb*mbx);
126 const double mqm = 0.1;
127 const double r2=3.0/(4.0*msb*msq)+3*msd*msd/(2*mbb*mbx*bbx2)+(16.0/(mbb*mbx*(33.0-2.0*nfp)))*log(Getas(mqm,mqm)/Getas(msq,msq));
129 const double f5 = sqrt(mtx/mtb)*pow(sqrt(bx2*bb2)/bbx2,5.0/2.0)/(pow((1.0+r2*(tm-t)/18.0),3.0));
131 const double f5v = f5*pow(( mbb / mtb ),-0.5)*pow((mbx/mtx),-0.5);
132 const double f5r = f5*pow(( mbb / mtb ),0.5)*pow((mbx/mtx),0.5);
133 const double f5sppsm = f5*pow(( mbb / mtb ),-1.5)*pow((mbx/mtx),0.5);
134 const double f5spmsm = f5*pow(( mbb / mtb ),-0.5)*pow((mbx/mtx),-0.5);
136 const double vv = -msd*f5v/(2.0*sqrt(3.0*bb2)*mtx)*((wt+1)/2.0+bb2*mtb/(2.0*msd*msq*msb));
137 const double rr = -2.*mtb*sqrt(bb2/3.0)*f5r*(1.0/msq + mtx*msd*(wt-1)/(2.0*bb2)*((wt+1)/(2.0*msq)-msd*bb2/(2.0*mum*mtx*bbx2)));
138 const double sppsm = -sqrt(3.0)*msd*f5sppsm/(2.0*sqrt(bb2)*mtb)*(1 - msd/(3.0*msq) - msd*bb2/(3.0*bbx2)*(1.0/(2.0*mum)-1.0/mup));
139 const double spmsm = -msd*f5spmsm/(2.0*sqrt(3.0*bb2)*mtx)*((2-wt)*mtx/msq + msd*bb2/bbx2*(1.0/(2.0*mum)-1.0/mup));
142 const double sqmbmx = sqrt(mb*mx);
143 const double Fv1 = rr/sqmbmx;
144 const double Fv2 = mb*mb*sppsm/sqmbmx;
145 const double Fv3 = spmsm*sqmbmx;
146 const double Fa = 2*vv*sqmbmx;
156 std::unique_ptr<FormFactorBase> FFBtoD1ISGW2::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.