26 namespace MD = MultiDimensional;
28 FFBtoDstarBLPR::FFBtoDstarBLPR() {
30 vector<IndexType> dims = {8};
31 string name{
"FFBtoDstarBLPR"};
34 addProcessSignature(PID::BPLUS, {-PID::DSTAR});
37 addProcessSignature(PID::BZERO, {PID::DSTARMINUS});
41 addProcessSignature(PID::BS, {PID::DSSTARMINUS});
47 void FFBtoDstarBLPR::defineSettings() {
49 setPath(getFFErrPrefixGroup().
get());
52 addSetting<double>(
"RhoSq",1.24);
53 addSetting<double>(
"a",1.509/
sqrt2);
55 addSetting<double>(
"as",0.26);
56 addSetting<double>(
"mb",4.710);
57 addSetting<double>(
"mc",4.710 - 3.400);
58 addSetting<double>(
"la",0.57115);
60 addSetting<double>(
"ebR/eb",0.861);
61 addSetting<double>(
"ecR/ec",0.822);
63 addSetting<double>(
"chi1p",0.);
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 FFBtoDstarBLPR::evalAtPSPoint(
const vector<double>& point,
const vector<double>& masses) {
76 Tensor& result = getTensor();
80 MSG_WARNING(
"Warning, Setting 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 Mb3 = Mb*Mb*Mb;
97 const double Mc2 = Mc*Mc;
99 double Sqq = point[0];
102 const double sqMbMc = sqrt(Mb*Mc);
103 double w = (Mb2 + Mc2 - Sqq)/(2.*Mb*Mc);
105 if(
isZero(w - 1.0)) w += 1e-6;
108 const double a = *getSetting<double>(
"a");
109 const double zCon = (sqrt(w+1) -
sqrt2*a)/(sqrt(w+1) +
sqrt2*a);
112 const double zBC = (*getSetting<double>(
"mc"))/(*getSetting<double>(
"mb"));
113 const double eb = (*getSetting<double>(
"la"))/(*getSetting<double>(
"mb")*2.);
114 const double ebReb = (*getSetting<double>(
"ebR/eb"));
115 const double ec = (*getSetting<double>(
"la"))/(*getSetting<double>(
"mc")*2.);
116 const double ecRec = (*getSetting<double>(
"ecR/ec"));
117 const double as = (*getSetting<double>(
"as"))/
pi;
120 const double RhoSq = *getSetting<double>(
"RhoSq");
121 const double chi21 = (*getSetting<double>(
"chi21"));
122 const double chi2p = (*getSetting<double>(
"chi2p"));
123 const double chi3p = (*getSetting<double>(
"chi3p"));
124 const double eta1 = (*getSetting<double>(
"eta1"));
125 const double etap = (*getSetting<double>(
"etap"));
128 const double L1 = -4.*(w-1)*(chi21 + (w-1.)*chi2p)+12.*chi3p*(w-1.);
129 const double L2 = -4.*chi3p*(w-1.);
130 const double L3 = 4.*(chi21 + (w-1.)*chi2p);
132 const double L4b = (2.*(eta1 + etap*(w-1.))-1.*ebReb);
135 const double L5c = -ecRec;
137 const double L6c = -2.*(ecRec + (eta1 + etap*(w-1.)))/(w+1.);
140 const double rD = 1867./5280.;
142 const double V21 = 57.0;
143 const double V20 = 7.5 + (*getSetting<double>(
"dV20"));
147 const double Cps = CP(w, zBC);
148 const double Cv1 = CV1(w, zBC);
151 const double Ca1 = CA1(w, zBC);
152 const double Ca2 = CA2(w, zBC);
153 const double Ca3 = CA3(w, zBC);
154 const double Ct1 = CT1(w, zBC);
155 const double Ct2 = CT2(w, zBC);
156 const double Ct3 = CT3(w, zBC);
159 const double w0 = 2*a*a - 1.;
164 Cv1zp = (CV1(w0 + 1e-5, zBC) - Cv1z)/1e-5;
165 Cv2zp = (CV2(w0 + 1e-5, zBC) - Cv2z)/1e-5;
166 Cv3zp = (CV3(w0 + 1e-5, zBC) - Cv3z)/1e-5;
168 Cv1zpp = (Cv1zp - (Cv1z - CV1(w0 - 1e-5, zBC))/1e-5)/1e-5;
169 Cv2zpp = (Cv2zp - (Cv2z - CV2(w0 - 1e-5, zBC))/1e-5)/1e-5;
170 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 Hps = 1.+as*Cps+ec*(L2+L3*(w-1)+L5c-L6c*(w+1))+eb*(L1-L4b);
211 const double Hv = 1.+as*Cv1+ec*(L2-L5c)+eb*(L1-L4b);
212 const double Ha1 = 1.+as*Ca1+ec*(L2-L5c*(w-1)/(w+1))+eb*(L1-L4b*(w-1)/(w+1));
213 const double Ha2 = as*Ca2+ec*(L3+L6c);
214 const double Ha3 = 1.+as*(Ca1+Ca3)+ec*(L2-L3-L5c+L6c)+eb*(L1-L4b);
215 const double Ht1 = 1.+as*(Ct1+0.5*(w-1)*(Ct2-Ct3))+ec*(L2)+eb*(L1);
216 const double Ht2 = 0.5*(w+1)*as*(Ct2+Ct3)+ec*(L5c)-eb*(L4b);
217 const double Ht3 = as*(Ct2)+ec*(L6c-L3);
222 result.
element({0}) = -((Hps * Mc) / sqMbMc);
224 result.
element({1}) = (Ha1 * ((Mb + Mc)*(Mb + Mc) - Sqq)) / (2. * sqMbMc);
226 result.
element({2}) = Hv / (2. * sqMbMc);
228 result.
element({3}) = -(Ha2 * sqrt(Mc / Mb3)) / 2. + Ha3 / (2. * sqMbMc);
230 result.
element({4}) = -(Ha2 * sqrt(Mc / Mb3)) / 2. - Ha3 / (2. * sqMbMc);
232 result.
element({5}) = (Ht3 * Mc) / (2. * pow(Mb * Mc, 1.5));
234 result.
element({6}) = (Ht1 * (Mb - Mc)) / (2. * sqMbMc) - (Ht2 * (Mb + Mc)) / (2. * sqMbMc);
236 result.
element({7}) = (Ht2 * (Mb - Mc)) / (2. * sqMbMc) - (Ht1 * (Mb + Mc)) / (2. * sqMbMc);
242 std::unique_ptr<FormFactorBase> FFBtoDstarBLPR::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