12#include <EvtGenBase/EvtCPUtil.hh>
13#include <EvtGenBase/EvtTensor4C.hh>
15#include <EvtGenBase/EvtPatches.hh>
18#include <EvtGenBase/EvtParticle.hh>
19#include <EvtGenBase/EvtGenKine.hh>
20#include <EvtGenBase/EvtPDL.hh>
21#include <EvtGenBase/EvtReport.hh>
22#include <EvtGenBase/EvtResonance.hh>
23#include <EvtGenBase/EvtResonance2.hh>
25#include <EvtGenBase/EvtConst.hh>
26#include <EvtGenBase/EvtFlatte.hh>
27#include <EvtGenBase/EvtDecayTable.hh>
29#include <generators/evtgen/EvtGenModelRegister.h>
30#include <generators/evtgen/models/besiii/EvtDsToKKpi.h>
41 EvtDsToKKpi::~EvtDsToKKpi() {}
43 std::string EvtDsToKKpi::getName()
48 EvtDecayBase* EvtDsToKKpi::clone()
50 return new EvtDsToKKpi;
53 void EvtDsToKKpi::init()
57 checkSpinParent(EvtSpinType::SCALAR);
58 checkSpinDaughter(0, EvtSpinType::SCALAR);
59 checkSpinDaughter(1, EvtSpinType::SCALAR);
60 checkSpinDaughter(2, EvtSpinType::SCALAR);
78 mass[1] = 1.019461e+00;
84 width[0] = 4.7400e-02;
85 width[1] = 4.2660e-03;
87 width[3] = 2.7000e-01;
88 width[4] = 1.3500e-01;
89 width[5] = 2.6500e-01;
107 mass_Pi0 = 0.1349768;
112 int GG[4][4] = { {1, 0, 0, 0}, {0, -1, 0, 0}, {0, 0, -1, 0}, {0, 0, 0, -1} };
113 for (
int i = 0; i < 4; i++) {
114 for (
int j = 0; j < 4; j++) {
120 void EvtDsToKKpi::initProbMax()
125 void EvtDsToKKpi::decay(EvtParticle* p)
127 p->initializePhaseSpace(getNDaug(), getDaugs());
128 EvtVector4R D1 = p->getDaug(0)->getP4();
129 EvtVector4R D2 = p->getDaug(1)->getP4();
130 EvtVector4R D3 = p->getDaug(2)->getP4();
131 double P1[4], P2[4], P3[4];
132 P1[1] = D1.get(1); P1[2] = D1.get(2); P1[3] = D1.get(3);
133 P2[1] = D2.get(1); P2[2] = D2.get(2); P2[3] = D2.get(3);
134 P3[1] = D3.get(1); P3[2] = D3.get(2); P3[3] = D3.get(3);
137 int g0[6] = {1, 1, 1, 1, 1, 1};
139 calEvaMy(P1, P2, P3, mass, width, rho, phi, g0, modetype, nstates, value);
144 void EvtDsToKKpi::MIP_LineShape(
double sa,
double pro[2])
146 double m0 = mass[2], cKK = width[2];
147 pro[0] =
sqrt(1 / (((m0 * m0) - sa) * ((m0 * m0) - sa) + (cKK * m0 *
sqrt(1 - 4 * mass_Kaon * mass_Kaon / sa)) * (cKK * m0 *
sqrt(
148 1 - 4 * mass_Kaon * mass_Kaon / sa))));
151 void EvtDsToKKpi::calEvaMy(
double* pKm,
double* pKp,
double* pPi,
double* mass1,
double* width1,
double* amp,
double* phase,
152 int* g0,
int* modetype_param,
int nstates,
double& Result)
154 double pF0_980[4], pPhi1020[4], pKstr[4], pD[4], p23[4];
155 pKp[0] =
sqrt(mass_Kaon * mass_Kaon + pKp[1] * pKp[1] + pKp[2] * pKp[2] + pKp[3] * pKp[3]);
156 pKm[0] =
sqrt(mass_Kaon * mass_Kaon + pKm[1] * pKm[1] + pKm[2] * pKm[2] + pKm[3] * pKm[3]);
157 pPi[0] =
sqrt(mass_Pion * mass_Pion + pPi[1] * pPi[1] + pPi[2] * pPi[2] + pPi[3] * pPi[3]);
158 for (
int u = 0; u < 4; u++) {
159 pF0_980[u] = pKp[u] + pKm[u];
160 pPhi1020[u] = pKp[u] + pKm[u];
161 pKstr[u] = pKm[u] + pPi[u];
162 p23[u] = pKp[u] + pPi[u];
163 pD[u] = pKp[u] + pKm[u] + pPi[u];
165 double cof[2], amp_tmp1[2], amp_tmp[2], amp_PDF[2], PDF[2];
170 double temp_PDF, tmp1;
172 double t1kstr1[4], t1phi1020[4], t1D1[4], t1D2[4];
174 double sD, sF0_980, sF0_1710, sF0_1370, sKp, sKm, sPi, sKstr, sPhi1020, sKstr1430;
175 sF0_980 = SCADot(pF0_980, pF0_980);
178 sKstr = SCADot(pKstr, pKstr);
181 sPhi1020 = SCADot(pPhi1020, pPhi1020);
182 sKp = SCADot(pKp, pKp);
183 sKm = SCADot(pKm, pKm);
184 sPi = SCADot(pPi, pPi);
186 calt1(pKm, pPi, t1kstr1);
187 calt1(pKm, pKp, t1phi1020);
188 calt1(pKstr, pKp, t1D1);
189 calt1(pPhi1020, pPi, t1D2);
191 for (
int i = 0; i < nstates; i++) {
198 cof[0] = amp[i] * cos(phase[i]);
199 cof[1] = amp[i] * sin(phase[i]);
200 if (modetype_param[i] == 13) {
202 double amp_a0[2] = {0};
203 double sa0_980 = sF0_980;
204 MIP_LineShape(sa0_980, pro);
205 B[0] = barrier(0, sa0_980, sKp, sKm, rRes);
207 tmp1 = temp_PDF * B[0];
208 amp_a0[0] = tmp1 * pro[0];
209 amp_a0[1] = tmp1 * pro[1];
210 amp_tmp1[0] = amp_a0[0] ;
211 amp_tmp1[1] = amp_a0[1] ;
212 }
else if (modetype_param[i] == 0) {
220 double sBC = SCADot(p23, p23);
221 if (g0[i] == 1) propagatorRBWNeoKstr892(mass1[i], width1[i], sKstr, sPi, sKm, rRes, 1, pro);
222 B[0] = barrierNeo(1, sKstr, sPi, sKm, rRes, mass1[i]);
223 B[1] = barrierNeoDs(1, sD, sKstr, sKp, rD, mDs, mass1[i]);
224 temp_PDF = (sBC - sPhi1020 + ((sD - sKp) * (sKm - sPi) / (sKstr)));
226 if (g0[i] == 1) propagatorRBW(mass1[i], width1[i], sKstr, sKm, sPi, rRes, 1, pro);
227 B[0] = barrier(1, sKstr, sKm, sPi, rRes);
228 B[1] = barrier(1, sD, sKstr, sKp, rD);
229 for (
int m = 0; m < 4; m++) {
230 for (
int j = 0; j < 4; j++) {
231 temp_PDF += t1D1[m] * t1kstr1[j] * G[m][j];
235 tmp1 = temp_PDF * B[0] * B[1];
236 amp_tmp1[0] = tmp1 * pro[0];
237 amp_tmp1[1] = tmp1 * pro[1];
238 }
else if (modetype_param[i] == 1) {
245 if (g0[i] == 1) propagatorRBWNeo(mass1[i], width1[i], sPhi1020, sKm, sKp, rRes, 1, pro);
246 B[0] = barrierNeo(1, sPhi1020, sKp, sKm, rRes, mass1[i]);
247 B[1] = barrierNeoDs(1, sD, sPhi1020, sPi, rD, mDs, mass1[i]);
248 double sBC = SCADot(p23, p23);
249 temp_PDF = (sKstr - sBC + ((sD - sPi) * (sKp - sKm) / (sKstr)));
251 if (g0[i] == 1) propagatorRBW(mass1[i], width1[i], sPhi1020, sKm, sKp, rRes, 1, pro);
252 B[0] = barrier(1, sPhi1020, sKp, sKm, rRes);
253 B[1] = barrier(1, sD, sPhi1020, sPi, rD);
254 for (
int m = 0; m < 4; m++) {
255 for (
int j = 0; j < 4; j++) {
256 temp_PDF += t1D2[m] * t1phi1020[j] * G[m][j];
261 tmp1 = temp_PDF * B[0] * B[1];
262 amp_tmp1[0] = tmp1 * pro[0];
263 amp_tmp1[1] = tmp1 * pro[1];
264 }
else if (modetype_param[i] == 3) {
266 double sKm2[2] = {sKm, mass_EtaP * mass_EtaP};
267 double sPi2[2] = {sPi, mass_Kaon * mass_Kaon};
268 propagatorKstr1430(mass1[i], sKstr1430, sKm2, sPi2, pro);
269 B[0] = barrier(0, sPhi1020, sKp, sKm, rRes);
271 amp_tmp1[0] = tmp1 * pro[0];
272 amp_tmp1[1] = tmp1 * pro[1];
274 }
else if (modetype_param[i] == 4) {
275 if (g0[i] == 1) propagatorRBWNeo(mass1[i], width1[i], sF0_1710, sKp, sKm, rRes, 0, pro);
280 B[0] = barrier(0, sF0_1710, sKp, sKm, rRes);
282 tmp1 = temp_PDF * B[0];
283 amp_tmp1[0] = tmp1 * pro[0];
284 amp_tmp1[1] = tmp1 * pro[1];
285 }
else if (modetype_param[i] == 5) {
287 if (g0[i] == 1) propagatorRBWNeo(mass1[i], width1[i], sF0_1370, sKp, sKm, rRes, 0, pro);
292 B[0] = barrier(0, sF0_1370, sKp, sKm, rRes);
294 amp_tmp1[0] = tmp1 * pro[0];
295 amp_tmp1[1] = tmp1 * pro[1];
297 amp_tmp[0] = amp_tmp1[0];
298 amp_tmp[1] = amp_tmp1[1];
299 Com_Multi(amp_tmp, cof, amp_PDF);
300 PDF[0] += amp_PDF[0];
301 PDF[1] += amp_PDF[1];
304 double value = PDF[0] * PDF[0] + PDF[1] * PDF[1];
311 void EvtDsToKKpi::Com_Multi(
double a1[2],
double a2[2],
double res[2])
313 res[0] = a1[0] * a2[0] - a1[1] * a2[1];
314 res[1] = a1[1] * a2[0] + a1[0] * a2[1];
316 void EvtDsToKKpi::Com_Divide(
double a1[2],
double a2[2],
double res[2])
318 res[0] = (a1[0] * a2[0] + a1[1] * a2[1]) / (a2[0] * a2[0] + a2[1] * a2[1]);
319 res[1] = (a1[1] * a2[0] - a1[0] * a2[1]) / (a2[0] * a2[0] + a2[1] * a2[1]);
322 double EvtDsToKKpi::SCADot(
double a1[4],
double a2[4])
325 _cal = a1[0] * a2[0] - a1[1] * a2[1] - a1[2] * a2[2] - a1[3] * a2[3];
328 double EvtDsToKKpi::barrier(
int l,
double sa,
double sb,
double sc,
double r)
330 double q = (sa + sb - sc) * (sa + sb - sc) / (4 * sa) - sb;
331 if (q < 0) q = 1e-16;
336 if (l == 1) F =
sqrt(2 * z / (1 + z));
337 if (l == 2) F =
sqrt(13 * z * z / (9 + 3 * z + z * z));
340 double EvtDsToKKpi::barrierNeo(
int l,
double sa,
double sb,
double sc,
double r,
double mR)
342 double pAB = ((sa - sb - sc) * (sa - sb - sc) / 4.0 - (sb * sc)) / sa;
343 double pR = ((mR * mR - sb - sc) * (mR * mR - sb - sc) / 4.0 - (sb * sc)) / (mR * mR);
344 double zAB = pAB * r * r;
345 double zR = pR * r * r;
348 if (l == 1) F =
sqrt((1 + zR) / (1 + zAB));
349 if (l == 2) F =
sqrt((9 + 3 * zAB + zAB * zAB) / (9 + 3 * zAB + zAB * zAB));
352 double EvtDsToKKpi::barrierNeoDs(
int l,
double sa,
double sb,
double sc,
double r,
double mR,
double mb)
354 double pAB = ((sa - sb - sc) * (sa - sb - sc) / 4.0 - (sb * sc)) / sa;
355 double pR = ((sa - mb * mb - sc) * (sa - mb * mb - sc) / 4.0 - (mb * mb * sc)) / (mR * mR);
356 double zAB = pAB * r * r;
357 double zR = pR * r * r;
360 if (l == 1) F =
sqrt((1 + zR) / (1 + zAB));
361 if (l == 2) F =
sqrt((9 + 3 * zAB + zAB * zAB) / (9 + 3 * zAB + zAB * zAB));
365 void EvtDsToKKpi::calt1(
double daug1[4],
double daug2[4],
double t1[4])
369 for (
int i = 0; i < 4; i++) {
370 pa[i] = daug1[i] + daug2[i];
371 qa[i] = daug1[i] - daug2[i];
375 for (
int i = 0; i < 4; i++) {
376 t1[i] = qa[i] - pq / p * pa[i];
379 void EvtDsToKKpi::calt2(
double daug1[4],
double daug2[4],
double t2[4][4])
383 calt1(daug1, daug2, t1);
385 for (
int i = 0; i < 4; i++) {
386 pa[i] = daug1[i] + daug2[i];
389 for (
int i = 0; i < 4; i++) {
390 for (
int j = 0; j < 4; j++) {
391 t2[i][j] = t1[i] * t1[j] - 1.0 / 3 * r * (G[i][j] - pa[i] * pa[j] / p);
396 void EvtDsToKKpi::propagator(
double mass_param,
double width_param,
double sx,
double prop[2])
401 b[0] = mass_param * mass_param - sx;
402 b[1] = -mass_param * width_param;
403 Com_Divide(a, b, prop);
405 double EvtDsToKKpi::wid(
double mass_param,
double sa,
double sb,
double sc,
double r,
int l)
410 double sa0 = mass_param * mass_param;
412 q = (sa + sb - sc) * (sa + sb - sc) / (4 * sa) - sb;
413 if (q < 0) q = 1e-16;
414 q0 = (sa0 + sb - sc) * (sa0 + sb - sc) / (4 * sa0) - sb;
415 if (q0 < 0) q0 = 1e-16;
416 double z = q * r * r;
417 double z0 = q0 * r * r;
420 if (l == 1) F =
sqrt((1 + z0) / (1 + z));
421 if (l == 2) F =
sqrt((9 + 3 * z0 + z0 * z0) / (9 + 3 * z + z * z));
423 widm = pow(t, l + 0.5) * mass_param / m * F * F;
427 void EvtDsToKKpi::Flatte_rhoab(
double sa,
double sb,
double sc,
double rho_param[2])
429 double q = (sa + sb - sc) * (sa + sb - sc) / (4 * sa) - sb;
431 rho_param[0] = 2 *
sqrt(q / sa);
435 rho_param[1] = 2 *
sqrt(-q / sa);
439 void EvtDsToKKpi::propagatorFlatte(
double mass_param,
double width_param __attribute__((unused)),
double sx,
double* sb,
double* sc,
442 double unit[2] = {1.0};
443 double ci[2] = {0, 1};
445 Flatte_rhoab(sx, sb[0], sc[0], rho1);
447 Flatte_rhoab(sx, sb[1], sc[1], rho2);
448 double g1_f980 = 0.165, g2_f980 = 0.69465;
449 double tmp1[2] = {g1_f980, 0};
451 double tmp2[2] = {g2_f980, 0};
453 Com_Multi(tmp1, rho1, tmp11);
454 Com_Multi(tmp2, rho2, tmp22);
455 double tmp3[2] = {tmp11[0] + tmp22[0], tmp11[1] + tmp22[1]};
457 Com_Multi(tmp3, ci, tmp31);
458 double tmp4[2] = {mass_param* mass_param - sx - tmp31[0], -1.0 * tmp3[1]};
459 Com_Divide(unit, tmp4, prop);
461 void EvtDsToKKpi::propagator980(
double mass_param,
double sx,
double* sb,
double* sc,
double prop[2])
463 double unit[2] = {1.0};
464 double ci[2] = {0, 1};
466 Flatte_rhoab(sx, sb[0], sc[0], rho1);
468 Flatte_rhoab(sx, sb[1], sc[1], rho2);
469 double gK_f980 = 0.69466, gPi_f980 = 0.165;
470 double tmp1[2] = {gK_f980, 0};
472 double tmp2[2] = {gPi_f980, 0};
474 Com_Multi(tmp1, rho1, tmp11);
475 Com_Multi(tmp2, rho2, tmp22);
476 double tmp3[2] = {tmp11[0] + tmp22[0], tmp11[1] + tmp22[1]};
478 Com_Multi(tmp3, ci, tmp31);
479 double tmp4[2] = {mass_param* mass_param - sx - tmp31[0], -1.0 * tmp31[1]};
480 Com_Divide(unit, tmp4, prop);
483 void EvtDsToKKpi::propagatora0980(
double mass_param,
double sx,
double* sb,
double* sc,
double prop[2])
485 double unit[2] = {1.0};
486 double ci[2] = {0, 1};
488 Flatte_rhoab(sx, sb[0], sc[0], rho1);
490 Flatte_rhoab(sx, sb[1], sc[1], rho2);
491 double gKK_a980 = 0.892 * 0.341, gPiEta_a980 = 0.341;
492 double tmp1[2] = {gKK_a980, 0};
494 double tmp2[2] = {gPiEta_a980, 0};
496 Com_Multi(tmp1, rho1, tmp11);
497 Com_Multi(tmp2, rho2, tmp22);
498 double tmp3[2] = {tmp11[0] + tmp22[0], tmp11[1] + tmp22[1]};
500 Com_Multi(tmp3, ci, tmp31);
501 double tmp4[2] = {mass_param* mass_param - sx - tmp31[0], -1.0 * tmp31[1]};
502 Com_Divide(unit, tmp4, prop);
505 void EvtDsToKKpi::propagatorKstr1430(
double mass_param,
double sx,
double* sb,
double* sc,
double prop[2])
507 double unit[2] = {1.0};
508 double ci[2] = {0, 1};
510 Flatte_rhoab(sx, sb[0], sc[0], rho1);
512 Flatte_rhoab(sx, sb[1], sc[1], rho2);
513 double gKPi_Kstr1430 = 0.2990, gEtaPK_Kstr1430 = 0.0529;
514 double tmp1[2] = {gKPi_Kstr1430, 0};
516 double tmp2[2] = {gEtaPK_Kstr1430, 0};
518 Com_Multi(tmp1, rho1, tmp11);
519 Com_Multi(tmp2, rho2, tmp22);
520 double tmp3[2] = {tmp11[0] + tmp22[0], tmp11[1] + tmp22[1]};
522 Com_Multi(tmp3, ci, tmp31);
523 double tmp4[2] = {mass_param* mass_param - sx - tmp31[0], -1.0 * tmp31[1]};
524 Com_Divide(unit, tmp4, prop);
527 void EvtDsToKKpi::propagatorRBW(
double mass_param,
double width_param,
double sa,
double sb,
double sc,
double r,
int l,
533 b[0] = mass_param * mass_param - sa;
534 b[1] = -mass_param * width_param * wid(mass_param, sa, sb, sc, r, l);
535 Com_Divide(a, b, prop);
538 void EvtDsToKKpi::propagatorRBWNeo(
double mass_param,
double width_param,
double sa,
double sb,
double sc,
539 double r __attribute__((unused)),
int l,
double prop[2])
544 b[0] = mass_param * mass_param - sa;
545 double tmp1 = (sa - sb - sc);
546 double tmp2 = sb * sc;
547 double pAB =
sqrt((tmp1 * tmp1 / 4.0 - tmp2) / sa);
548 double pR =
sqrt(((mass_param * mass_param - sb - sc) * (mass_param * mass_param - sb - sc) / 4.0 - (sb * sc)) /
549 (mass_param * mass_param));
550 double fR =
sqrt(1.0 + 1.5 * 1.5 * pR * pR) /
sqrt(1.0 + 1.5 * 1.5 * pAB * pAB);
558 double gammaAB = width_param * pow(pAB / pR, power) * (mass_param /
sqrt(sa)) * fR * fR;
559 b[1] = -mass_param * gammaAB;
560 Com_Divide(a, b, prop);
563 void EvtDsToKKpi::propagatorRBWNeoKstr892(
double mass_param,
double width_param,
double sa,
double sb,
double sc,
564 double r __attribute__((unused)),
int l,
double prop[2])
569 b[0] = mass_param * mass_param - sa;
570 double tmp1 = (sa - sb - sc);
571 double tmp2 = sb * sc;
572 double pAB =
sqrt((tmp1 * tmp1 / 4.0 - tmp2) / sa);
573 double pR =
sqrt(((mass_param * mass_param - sb - sc) * (mass_param * mass_param - sb - sc) / 4.0 - (sb * sc)) /
574 (mass_param * mass_param));
575 double fR =
sqrt(1.0 + 1.5 * 1.5 * pR * pR) /
sqrt(1.0 + 1.5 * 1.5 * pAB * pAB);
582 double gammaAB = width_param * pow(pAB / pR, power) * (mass_param /
sqrt(sa)) * fR * fR;
583 b[1] = -mass_param * gammaAB;
584 Com_Divide(a, b, prop);
588 double EvtDsToKKpi::h(
double m,
double q)
590 double h = 2 / math_pi * q / m * log((m + 2 * q) / (2 * mass_Pion));
593 double EvtDsToKKpi::dh(
double mass_param,
double q0)
595 double dh = h(mass_param, q0) * (1.0 / (8 * q0 * q0) - 1.0 / (2 * mass_param * mass_param)) + 1.0 /
596 (2 * math_pi * mass_param * mass_param);
599 double EvtDsToKKpi::f(
double mass_param,
double sx,
double q0,
double q)
602 double f = mass_param * mass_param / (pow(q0, 3)) * (q * q * (h(m, q) - h(mass_param,
603 q0)) + (mass_param * mass_param - sx) * q0 * q0 * dh(mass_param, q0));
606 double EvtDsToKKpi::d(
double mass_param,
double q0)
608 double d = 3.0 / math_pi * mass_Pion * mass_Pion / (q0 * q0) * log((mass_param + 2 * q0) / (2 * mass_Pion)) + mass_param /
610 - (mass_Pion * mass_Pion * mass_param) / (math_pi * pow(q0, 3));
615 void EvtDsToKKpi::propagatorGS(
double mass_param,
double width_param,
double sa,
double sb,
double sc,
double r,
int l,
619 double q = (sa + sb - sc) * (sa + sb - sc) / (4 * sa) - sb;
620 double sa0 = mass_param * mass_param;
621 double q0 = (sa0 + sb - sc) * (sa0 + sb - sc) / (4 * sa0) - sb;
622 if (q < 0) q = 1e-16;
623 if (q0 < 0) q0 = 1e-16;
626 a[0] = 1 + d(mass_param, q0) * width_param / mass_param;
628 b[0] = mass_param * mass_param - sa + width_param * f(mass_param, sa, q0, q);
629 b[1] = -mass_param * width_param * wid(mass_param, sa, sb, sc, r, l);
630 Com_Divide(a, b, prop);
#define B2_EVTGEN_REGISTER_MODEL(classname)
Class to register B2_EVTGEN_REGISTER_MODEL.
double sqrt(double a)
sqrt for double
Abstract base class for different kinds of events.