27 namespace MD = MultiDimensional;
29 FFLbtoLcBLRSVar::FFLbtoLcBLRSVar() {
31 vector<IndexType> dims = {12,5};
33 string name{
"FFLbtoLcBLRSVar"};
37 addProcessSignature(-PID::LAMBDAB, {PID::LAMBDACMINUS});
43 void FFLbtoLcBLRSVar::defineSettings() {
44 _FFErrNames = {
"delta_z1",
"delta_z2",
"delta_b1",
"delta_b2"};
45 setPath(getFFErrPrefixGroup().
get());
49 addSetting<double>(
"as",0.26);
50 addSetting<double>(
"mb1S",4.7215);
51 addSetting<double>(
"dmbmc",3.400);
52 addSetting<double>(
"mLb",5.620);
53 addSetting<double>(
"mLc",2.286);
55 addSetting<double>(
"z1",-2.037);
56 addSetting<double>(
"z2",3.159);
57 addSetting<double>(
"b1",-0.459);
58 addSetting<double>(
"b2",-0.390);
62 vector<vector<double>> sliwmat{ {1., 0., 0., 0.},
66 addSetting<vector<vector<double>>>(
"sliwmatrix",sliwmat);
68 for (
auto elem : _FFErrNames) {
69 addSetting<double>(elem, 0.);
83 const double Mb = pLbmes.
mass();
84 const double Mc = pLcmes.
mass();
86 const double Sqq = Mb*Mb + Mc*Mc - 2. * (pLbmes * pLcmes);
88 evalAtPSPoint({Sqq}, {Mb, Mc});
91 void FFLbtoLcBLRSVar::evalAtPSPoint(
const vector<double>& point,
const vector<double>& masses) {
92 Tensor& result = getTensor();
96 MSG_WARNING(
"Warning, Settings have not been defined!");
102 if(masses.size() >= 2) {
108 Mb = this->masses()[0];
109 Mc = this->masses()[1];
111 const double Mb2 = Mb*Mb;
112 const double Mc2 = Mc*Mc;
114 double Sqq = point[0];
117 double w = (Mb2 + Mc2 - Sqq)/(2.*Mb*Mc);
119 if(
isZero(w - 1.0)) w += 1e-6;
120 const double wSq = w*w;
121 const double wm1sq = (w-1.)*(w-1.);
124 const double aS = (*getSetting<double>(
"as"))/
pi;
125 const double mb1S = unitres*(*getSetting<double>(
"mb1S"));
126 const double dmbmc = unitres*(*getSetting<double>(
"dmbmc"));
127 const double mLb = unitres*(*getSetting<double>(
"mLb"));
128 const double mLc = unitres*(*getSetting<double>(
"mLc"));
129 const double mc1S = mb1S - dmbmc;
130 const double mc2 = pow(mc1S,2.);
135 const double la1S = (mb1S*(mLb - mb1S) - mc1S*(mLc - mc1S))/(mb1S - mc1S);
137 const double eB0 = la1S/(2.*mb1S);
138 const double eC0 = la1S/(2.*mc1S);
143 const double eps = 2.*pow(aS*
pi,2.)/9.;
144 const double eB = eB0 + eps*(dmbmc*mc1S - mb1S*mLb + mc1S*mLc)/(mb1S - mc1S)/(2.*mb1S);
145 const double eC = eC0 + eps*((mb1S*(dmbmc*mb1S - mb1S*mLb + mc1S*mLc))/(mc1S*(mb1S - mc1S)))/(2.*mc1S);
147 const double zBC = mc1S/mb1S;
150 const double z1 = (*getSetting<double>(
"z1"));
151 const double z2 = (*getSetting<double>(
"z2"));
152 const double b1 = unitres*unitres*(*getSetting<double>(
"b1"));
153 const double b2 = unitres*unitres*(*getSetting<double>(
"b2"));
155 const vector<vector<double>>& sliwmat = (*getSetting<vector<vector<double>>>(
"sliwmatrix"));
158 const double zetaIW = 1. + z1*(w-1) + 0.5*z2*pow(w-1,2.);
161 const double Cs = CS(w, zBC);
162 const double Cps = CP(w, zBC);
163 const double Cv1 = CV1(w, zBC);
164 const double Cv2 = CV2(w, zBC);
165 const double Cv3 = CV3(w, zBC);
166 const double Ca1 = CA1(w, zBC);
167 const double Ca2 = CA2(w, zBC);
168 const double Ca3 = CA3(w, zBC);
169 const double Ct1 = CT1(w, zBC);
170 const double Ct2 = CT2(w, zBC);
171 const double Ct3 = CT3(w, zBC);
173 const double Csp = (CS(w + 1e-6, zBC) - Cs)/1e-6;
174 const double Cpsp = (CP(w + 1e-6, zBC) - Cps)/1e-6;
175 const double Cv1p = (CV1(w + 1e-6, zBC) - Cv1)/1e-6;
176 const double Cv2p = (CV2(w + 1e-6, zBC) - Cv2)/1e-6;
177 const double Cv3p = (CV3(w + 1e-6, zBC) - Cv3)/1e-6;
178 const double Ca1p = (CA1(w + 1e-6, zBC) - Ca1)/1e-6;
179 const double Ca2p = (CA2(w + 1e-6, zBC) - Ca2)/1e-6;
180 const double Ca3p = (CA3(w + 1e-6, zBC) - Ca3)/1e-6;
181 const double Ct1p = (CT1(w + 1e-6, zBC) - Ct1)/1e-6;
182 const double Ct2p = (CT2(w + 1e-6, zBC) - Ct2)/1e-6;
183 const double Ct3p = (CT3(w + 1e-6, zBC) - Ct3)/1e-6;
186 const double hs = 1 + b1/(4.*mc2) + (eB*(w - 1))/(1 + w) + (eC*(w - 1))/(1 + w) +
187 aS*(Cs + (eB0*(w - 1)*(Cs + 2.*Csp*(1 + w)))/(1 + w) + (eC0*(w - 1)*(Cs + 2.*Csp*(1 + w)))/(1 + w)) ;
188 const double hp = 1 + eB + eC + b1/(4.*mc2) - b2/(4.*mc2) + aS*(Cps + eB0*(Cps + 2.*Cpsp*(w - 1)) + eC0*(Cps + 2.*Cpsp*(w - 1))) ;
189 const double f1 = 1 + eB + eC + b1/(4.*mc2) - b2/(4.*mc2) + aS*(Cv1 + eB0*(Cv1 + 2.*Cv1p*(w - 1)) + eC0*(Cv1 + 2.*Cv1p*(w - 1))) ;
190 const double f2 = b2/(4.*mc2) - (2.*eC)/(1 + w) + aS*(Cv2 + (eC0*(-2.*Cv1 - Cv2 - 2.*Cv3 + Cv2*w
191 + 2.*Cv2p*(-1 + wSq)))/(1 + w) +
192 (eB0*(Cv2*(-1 + 3.*w) + 2.*Cv2p*(-1 + wSq)))/(1 + w)) ;
193 const double f3 = (-2.*eB)/(1 + w) + aS*(Cv3 + (eB0*(-2.*Cv1 - 2.*Cv2 - Cv3 + Cv3*w
194 + 2.*Cv3p*(-1 + wSq)))/(1 + w) +
195 (eC0*(Cv3*(-1 + 3.*w) + 2.*Cv3p*(-1 + wSq)))/(1 + w)) ;
196 const double g1 = 1 + b1/(4.*mc2) + (eB*(w - 1))/(1 + w) + (eC*(w - 1))/(1 + w) +
197 aS*(Ca1 + (eB0*(w - 1)*(Ca1 + 2.*Ca1p*(1 + w)))/(1 + w) + (eC0*(w - 1)*(Ca1 + 2.*Ca1p*(1 + w)))/(1 + w)) ;
198 const double g2 = b2/(4.*mc2) - (2.*eC)/(1 + w) + aS*(Ca2 + (eC0*(-2.*Ca1 + Ca2 - 2.*Ca3 + Ca2*w
199 + 2.*Ca2p*(-1 + wSq)))/(1 + w) +
200 (eB0*(Ca2 + 3.*Ca2*w + 2.*Ca2p*(-1 + wSq)))/(1 + w)) ;
201 const double g3 = (2.*eB)/(1 + w) + aS*(Ca3 + (eB0*(2.*Ca1 - 2.*Ca2 + Ca3 + Ca3*w
202 + 2.*Ca3p*(-1 + wSq)))/(1 + w) +
203 (eC0*(Ca3 + 3.*Ca3*w + 2.*Ca3p*(-1 + wSq)))/(1 + w)) ;
204 const double h1 = 1 + b1/(4.*mc2) + (eB*(w - 1))/(1 + w) + (eC*(w - 1))/(1 + w) +
205 aS*(Ct1 + (eB0*(w - 1)*(Ct1 + 2.*Ct1p*(1 + w)))/(1 + w) + (eC0*(w - 1)*(Ct1 + 2.*Ct1p*(1 + w)))/(1 + w)) ;
206 const double h2 = b2/(4.*mc2) - (2.*eC)/(1 + w) + aS*(Ct2 + (eC0*(-2.*Ct1 + Ct2 - 2.*Ct3 + Ct2*w
207 + 2.*Ct2p*(-1 + wSq)))/(1 + w) +
208 (eB0*(Ct2 + 3.*Ct2*w + 2.*Ct2p*(-1 + wSq)))/(1 + w)) ;
209 const double h3 = (2.*eB)/(1 + w) + aS*(Ct3 + (eB0*(2.*Ct1 - 2.*Ct2 + Ct3 + Ct3*w
210 + 2.*Ct3p*(-1 + wSq)))/(1 + w) +
211 (eC0*(Ct3 + 3.*Ct3*w + 2.*Ct3p*(-1 + wSq)))/(1 + w)) ;
212 const double h4 = aS*((-2.*Ct2*eB0)/(1 + w) + (2.*Ct3*eC0)/(1 + w)) ;
232 vector<vector<double>> FFmat{{(hs*(-1 + w))/zetaIW, (hs*wm1sq)/(2.*zetaIW), 1./(4.*mc2), 0.},
233 {(hp*(-1 + w))/zetaIW, (hp*wm1sq)/(2.*zetaIW), 1./(4.*mc2), -1./(4.*mc2)},
234 {(f1*(-1 + w))/zetaIW, (f1*wm1sq)/(2.*zetaIW), 1./(4.*mc2), -1./(4.*mc2)},
235 {(f2*(-1 + w))/zetaIW, (f2*wm1sq)/(2.*zetaIW), 0., 1./(4.*mc2)},
236 {(f3*(-1 + w))/zetaIW, (f3*wm1sq)/(2.*zetaIW), 0., 0.},
237 {(g1*(-1 + w))/zetaIW, (g1*wm1sq)/(2.*zetaIW), 1./(4.*mc2), 0.},
238 {(g2*(-1 + w))/zetaIW, (g2*wm1sq)/(2.*zetaIW), 0., 1./(4.*mc2)},
239 {(g3*(-1 + w))/zetaIW, (g3*wm1sq)/(2.*zetaIW), 0., 0.},
240 {(h1*(-1 + w))/zetaIW, (h1*wm1sq)/(2.*zetaIW), 1./(4.*mc2), 0.},
241 {(h2*(-1 + w))/zetaIW, (h2*wm1sq)/(2.*zetaIW), 0., 1./(4.*mc2)},
242 {(h3*(-1 + w))/zetaIW, (h3*wm1sq)/(2.*zetaIW), 0., 0.},
243 {(h4*(-1 + w))/zetaIW, (h4*wm1sq)/(2.*zetaIW), 0., 0.}};
245 for(
size_t n = 0; n < 12; ++n){
247 for(
size_t idx = 0; idx < 4; ++idx){
248 complex<double> entry = 0;
249 auto idxi =
static_cast<IndexType>(idx+1u);
250 for(
size_t idx1 = 0; idx1 < 4; ++idx1){
251 entry += sliwmat[idx1][idx]*FFmat[n][idx1];
253 result.
element({ni, idxi}) = entry;
262 std::unique_ptr<FormFactorBase> FFLbtoLcBLRSVar::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.
double mass() const
returns the invariant mass if the invariant mass squared is negative returns
std::vector< Particle > ParticleList
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
const FourMomentum & momentum() const
Various numerical constants.
Hammer particle data class.
static constexpr double pi