27 namespace MD = MultiDimensional;
29 FFBtoDBLPR::FFBtoDBLPR() {
31 vector<IndexType> dims = {4};
32 string name{
"FFBtoDBLPR"};
35 addProcessSignature(PID::BPLUS, {-PID::D0});
38 addProcessSignature(PID::BZERO, {PID::DMINUS});
42 addProcessSignature(PID::BS, {PID::DSMINUS});
48 void FFBtoDBLPR::defineSettings() {
50 setPath(getFFErrPrefixGroup().
get());
53 addSetting<double>(
"RhoSq",1.24);
54 addSetting<double>(
"a",1.509/
sqrt2);
56 addSetting<double>(
"as",0.26);
57 addSetting<double>(
"mb",4.710);
58 addSetting<double>(
"mc",4.710 - 3.400);
59 addSetting<double>(
"la",0.57115);
61 addSetting<double>(
"ebR/eb",0.861);
62 addSetting<double>(
"ecR/ec",0.822);
64 addSetting<double>(
"chi21",-0.06);
65 addSetting<double>(
"chi2p",-0.00);
66 addSetting<double>(
"chi3p",0.05);
67 addSetting<double>(
"eta1",0.30);
68 addSetting<double>(
"etap",-0.05);
69 addSetting<double>(
"dV20",0.);
75 void FFBtoDBLPR::evalAtPSPoint(
const vector<double>& point,
const vector<double>& masses) {
76 Tensor& result = getTensor();
80 MSG_WARNING(
"Warning, Settings have not been defined!");
86 if(masses.size() >= 2) {
92 Mb = this->masses()[0];
93 Mc = this->masses()[1];
95 const double Mb2 = Mb*Mb;
96 const double Mc2 = Mc*Mc;
98 double Sqq = point[0];
101 const double sqMbMc = sqrt(Mb*Mc);
102 double w = (Mb2 + Mc2 - Sqq)/(2.*Mb*Mc);
104 if(
isZero(w - 1.0)) w += 1e-6;
107 const double a = *getSetting<double>(
"a");
108 const double zCon = (sqrt(w+1) -
sqrt2*a)/(sqrt(w+1) +
sqrt2*a);
111 const double zBC = (*getSetting<double>(
"mc"))/(*getSetting<double>(
"mb"));
112 const double eb = (*getSetting<double>(
"la"))/(*getSetting<double>(
"mb")*2.);
113 const double ebReb = (*getSetting<double>(
"ebR/eb"));
114 const double ec = (*getSetting<double>(
"la"))/(*getSetting<double>(
"mc")*2.);
115 const double ecRec = (*getSetting<double>(
"ecR/ec"));
116 const double as = (*getSetting<double>(
"as"))/
pi;
119 const double RhoSq = *getSetting<double>(
"RhoSq");
120 const double chi21 = (*getSetting<double>(
"chi21"));
121 const double chi2p = (*getSetting<double>(
"chi2p"));
122 const double chi3p = (*getSetting<double>(
"chi3p"));
123 const double eta1 = (*getSetting<double>(
"eta1"));
124 const double etap = (*getSetting<double>(
"etap"));
127 const double L1 = -4.*(w-1)*(chi21 + (w-1.)*chi2p)+12.*chi3p*(w-1.);
131 const double L4b = (2.*(eta1 + etap*(w-1.))-1.*ebReb);
132 const double L4c = (2.*(eta1 + etap*(w-1.))-1.*ecRec);
139 const double rD = 1867./5280.;
141 const double V21 = 57.0;
142 const double V20 = 7.5 + (*getSetting<double>(
"dV20"));
145 const double Cs = CS(w, zBC);
147 const double Cv1 = CV1(w, zBC);
148 const double Cv2 = CV2(w, zBC);
149 const double Cv3 = CV3(w, zBC);
153 const double Ct1 = CT1(w, zBC);
154 const double Ct2 = CT2(w, zBC);
155 const double Ct3 = CT3(w, zBC);
158 const double w0 = 2*a*a - 1.;
163 Cv1zp = (CV1(w0 + 1e-5, zBC) - Cv1z)/1e-5;
164 Cv2zp = (CV2(w0 + 1e-5, zBC) - Cv2z)/1e-5;
165 Cv3zp = (CV3(w0 + 1e-5, zBC) - Cv3z)/1e-5;
167 Cv1zpp = (Cv1zp - (Cv1z - CV1(w0 - 1e-5, zBC))/1e-5)/1e-5;
168 Cv2zpp = (Cv2zp - (Cv2z - CV2(w0 - 1e-5, zBC))/1e-5)/1e-5;
169 Cv3zpp = (Cv3zp - (Cv3z - CV3(w0 - 1e-5, zBC))/1e-5)/1e-5;
190 const double a2 = a*a;
191 const double a4 = a2*a2;
192 const double a6 = a4*a2;
193 const double Xi = 64*a4*RhoSq - 16*a2 - V21;
194 double xiIW = 1 - 8*a2*RhoSq*zCon + zCon*zCon*(
195 V21*RhoSq - V20 + (eb - ec)*(2*Xi*etap * (1-rD)/(1+rD))
196 + (eb + ec)*(Xi* (12*chi3p - 4*chi21) - 16*((a2-1)*Xi - 16* a4)*chi2p)
197 + as*(Xi*(Cv1zp +(Cv3z + rD*Cv2z)/(1 + rD)) + 2*a2*(Xi - 32*a2)*(Cv3zp + rD*Cv2zp)/(1+rD) - 64*a6*(Cv3zpp + rD*Cv2zpp)/(1+rD) -32*a4*Cv1zpp ));
198 xiIW /= 1 - 8*a2*RhoSq*(1-a)/(1+a) + pow((1-a)/(1+a),2.)*(
199 V21*RhoSq - V20 + (eb - ec)*(2*Xi*etap * (1-rD)/(1+rD))
200 + (eb + ec)*(Xi* (12*chi3p - 4*chi21) - 16*((a2-1)*Xi - 16* a4)*chi2p)
201 + as*(Xi*(Cv1zp +(Cv3z + rD*Cv2z)/(1 + rD)) + 2*a2*(Xi - 32*a2)*(Cv3zp + rD*Cv2zp)/(1+rD) - 64*a6*(Cv3zpp + rD*Cv2zpp)/(1+rD) -32*a4*Cv1zpp ));
207 const double h=xiIW + 2.*(eb+ec)*chi1;
210 const double Hs = 1.+as*Cs + ec*(L1-(L4c*(w-1)/(w+1))) + eb*(L1-(L4b*(w-1)/(w+1)));
211 const double Hp = 1.+as*(Cv1+0.5*(w+1)*(Cv2+Cv3))+(ec+eb)*L1;
212 const double Hm = as*0.5*(w+1)*(Cv2-Cv3)+(ec*L4c-eb*L4b);
213 const double Ht = 1.+as*(Ct1-Ct2+Ct3)+(ec+eb)*(L1) - (ec*L4c+eb*L4b);
218 result.
element({0}) = (Hs * ((Mb + Mc)*(Mb + Mc) - Sqq)) / (2. * sqMbMc);
220 result.
element({1}) = (Hp * ((Mb + Mc)*(Mb + Mc) - Sqq)) / (2. * sqMbMc * (Mb + Mc)) +
221 (Hm * (-(Mb - Mc)*(Mb - Mc) + Sqq)) / (2. * (Mb - Mc) * sqMbMc);
223 result.
element({2}) = (Hm * (-Mb + Mc)) / (2. * sqMbMc) + (Hp * (Mb + Mc)) / (2. * sqMbMc);
225 result.
element({3}) = Ht / (2. * sqMbMc);
231 std::unique_ptr<FormFactorBase> FFBtoDBLPR::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
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