9#include <EvtGenBase/EvtPatches.hh>
10#include <EvtGenBase/EvtParticle.hh>
11#include <EvtGenBase/EvtGenKine.hh>
12#include <EvtGenBase/EvtPDL.hh>
13#include <EvtGenBase/EvtReport.hh>
14#include <EvtGenBase/EvtVector4R.hh>
15#include <EvtGenBase/EvtComplex.hh>
16#include <EvtGenBase/EvtDecayTable.hh>
19#include <generators/evtgen/EvtGenModelRegister.h>
20#include <generators/evtgen/models/besiii/EvtD0TopipiEta.h>
32 EvtD0TopipiEta::~EvtD0TopipiEta() {}
34 std::string EvtD0TopipiEta::getName()
39 EvtDecayBase* EvtD0TopipiEta::clone()
41 return new EvtD0TopipiEta;
44 void EvtD0TopipiEta::init()
49 checkSpinParent(EvtSpinType::SCALAR);
50 checkSpinDaughter(0, EvtSpinType::SCALAR);
51 checkSpinDaughter(1, EvtSpinType::SCALAR);
52 checkSpinDaughter(2, EvtSpinType::SCALAR);
54 phi[0] = 0; rho[0] = 1;
55 phi[1] = -0.98109; rho[1] = -0.02447;
56 phi[2] = 0.71358; rho[2] = 1.0848;
57 phi[3] = -0.83115; rho[3] = 2.6444;
58 phi[4] = -0.058521; rho[4] = 7.0274;
65 const double mk0 = 0.497614;
66 const double mass_Kaon = 0.49368;
67 const double mass_Pion = 0.13957;
68 const double mass_Pi0 = 0.1349766;
69 const double meta = 0.547862;
75 sck = mass_Kaon * mass_Kaon;
76 scpi = mass_Pion * mass_Pion;
77 snpi = mass_Pi0 * mass_Pi0;
82 ci = EvtComplex(0.0, 1.0);
83 one = EvtComplex(1.0, 0.0);
85 int GG[4][4] = { {1, 0, 0, 0}, {0, -1, 0, 0}, {0, 0, -1, 0}, {0, 0, 0, -1} };
86 for (
int i = 0; i < 4; i++) {
87 for (
int j = 0; j < 4; j++) {
95 void EvtD0TopipiEta::initProbMax()
100 void EvtD0TopipiEta::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();
132 double P1[4], P2[4], P3[4];
133 P1[0] = D1.get(0); P1[1] = D1.get(1); P1[2] = D1.get(2); P1[3] = D1.get(3);
134 P2[0] = D2.get(0); P2[1] = D2.get(1); P2[2] = D2.get(2); P2[3] = D2.get(3);
135 P3[0] = D3.get(0); P3[1] = D3.get(1); P3[2] = D3.get(2); P3[3] = D3.get(3);
138 value = calDalEva(P1, P2, P3);
144 double EvtD0TopipiEta::calDalEva(
double P1[],
double P2[],
double P3[])
153 EvtComplex cof, pdf, module;
155 PDF[0] = Spin_factor(P1, P2, P3, 1, 2, mrho, Grho);
156 PDF[1] = Spin_factor(P1, P2, P3, 1, 4, mrho, Grho);
157 PDF[2] = Spin_factor(P1, P3, P2, 0, 3, ma0, Ga0);
158 PDF[3] = Spin_factor(P2, P3, P1, 0, 3, ma0, Ga0);
159 PDF[4] = Spin_factor(P2, P3, P1, 2, 0, 1.698, 0.265);
161 pdf = EvtComplex(0.0, 0.0);
162 for (
int i = 0; i < 5; i++) {
163 cof = EvtComplex(rho[i] * cos(phi[i]), rho[i] * sin(phi[i]));
164 pdf = pdf + cof * PDF[i];
166 module = conj(pdf) * pdf;
167 value = real(module);
168 return (value <= 0) ? 1e-20 : value;
171 EvtComplex EvtD0TopipiEta::Spin_factor(
double P1[],
double P2[],
double P3[],
int spin,
int flag,
double mass_R,
double width_R)
174 double R[4], s[3], sp2, B[2];
176 for (
int i = 0; i < 4; i++) {
177 R[i] = P1[i] + P2[i];
184 EvtComplex amp, prop, prop1, prop2;
187 EvtComplex rhokk, rhopieta;
189 if (flag == 0) prop = one;
190 if (flag == 1) prop = propagatorRBW(mass_R, width_R, s[0], s[1], s[2], 3.0, 0);
192 rhokk = Flatte_rhoab(s[0], snk, sck);
193 rhopieta = Flatte_rhoab(s[0], scpi, seta);
194 prop = 1.0 / (mass_R * mass_R - s[0] - ci * (0.341 * rhopieta + 0.341 * 0.892 * rhokk));
197 }
else if (spin == 1) {
199 prop = EvtComplex(1.0, 0.0);
202 prop = propagatorRBW(mass_R, width_R, s[0], s[1], s[2], 3.0, 1);
205 prop = propagatorGS(mass_R, width_R, s[0], s[1], s[2], 3.0, 1);
208 prop1 = propagatorGS(mass_R, width_R, s[0], s[1], s[2], 3.0, 1);
209 prop2 = propagatorRBW(0.78266, 0.01358, s[0], s[1], s[2], 3.0, 1);
210 prop = prop1 * prop2;
215 B[0] = barrier(1, s[0], s[1], s[2], 3.0, mass_R);
216 B[1] = barrier(1, sD, s[0], sp2, 5.0, mD);
218 for (
int i = 0; i < 4; i++) {
219 tmp += T1[i] * t1[i] * G[i][i];
221 amp = tmp * prop * B[0] * B[1];
222 }
else if (spin == 2) {
223 double T2[4][4], t2[4][4];
226 B[0] = barrier(2, s[0], s[1], s[2], 3.0, mass_R);
227 B[1] = barrier(2, sD, s[0], sp2, 5.0, mD);
229 for (
int i = 0; i < 4; i++) {
230 for (
int j = 0; j < 4; j++) {
231 tmp += T2[i][j] * t2[j][i] * G[j][j] * G[i][i];
234 if (flag == 0) prop = one;
235 if (flag == 1) prop = propagatorRBW(mass_R, width_R, s[0], s[1], s[2], 3.0, 2);
236 amp = tmp * prop * B[0] * B[1];
241 double EvtD0TopipiEta::dot(
double* a1,
double* a2)
244 for (
int i = 0; i != 4; i++) {
245 Dot += a1[i] * a2[i] * G[i][i];
250 double EvtD0TopipiEta::Qabcs(
double sa,
double sb,
double sc)
252 double Qabcs = (sa + sb - sc) * (sa + sb - sc) / (4 * sa) - sb;
253 if (Qabcs < 0) Qabcs = 1e-16;
257 double EvtD0TopipiEta::barrier(
double l,
double sa,
double sb,
double sc,
double r,
double mass)
259 double sa0 = mass * mass;
260 double q0 = Qabcs(sa0, sb, sc);
261 double z0 = q0 * r * r;
262 double q = Qabcs(sa, sb, sc);
269 if (l == 1) F =
sqrt((1 + z0) / (1 + z));
270 if (l == 2) F =
sqrt((9 + 3 * z0 + z0 * z0) / (9 + 3 * z + z * z));
274 void EvtD0TopipiEta::calt1(
double daug1[],
double daug2[],
double t1[])
278 for (
int i = 0; i != 4; i++) {
279 pa[i] = daug1[i] + daug2[i];
280 qa[i] = daug1[i] - daug2[i];
284 for (
int i = 0; i != 4; i++) {
285 t1[i] = qa[i] - pq / p * pa[i];
289 void EvtD0TopipiEta::calt2(
double daug1[],
double daug2[],
double t2[][4])
293 calt1(daug1, daug2, t1);
295 for (
int i = 0; i != 4; i++) {
296 pa[i] = daug1[i] + daug2[i];
299 for (
int i = 0; i != 4; i++) {
300 for (
int j = 0; j != 4; j++) {
301 t2[i][j] = t1[i] * t1[j] - 1.0 / 3 * r * (G[i][j] - pa[i] * pa[j] / p);
306 double EvtD0TopipiEta::wid(
double mass,
double sa,
double sb,
double sc,
double r,
int l)
308 double widm(0.), q(0.), q0(0.);
309 double sa0 = mass * mass;
311 q = Qabcs(sa, sb, sc);
312 q0 = Qabcs(sa0, sb, sc);
319 if (l == 1) F =
sqrt((1 + z0) / (1 + z));
320 if (l == 2) F =
sqrt((9 + 3 * z0 + z0 * z0) / (9 + 3 * z + z * z));
321 widm = pow(t, l + 0.5) * mass / m * F * F;
325 EvtComplex EvtD0TopipiEta::propagatorRBW(
double mass,
double width,
double sa,
double sb,
double sc,
double r,
int l)
327 EvtComplex prop = 1.0 / (mass * mass - sa - ci * mass * width * wid(mass, sa, sb, sc, r, l));
331 double EvtD0TopipiEta::h(
double m,
double q)
334 h = 2 / pi * q / m * log((m + 2 * q) / (2 * mpi));
338 double EvtD0TopipiEta::dh(
double mass,
double q0)
340 double dh = h(mass, q0) * (1.0 / (8 * q0 * q0) - 1.0 / (2 * mass * mass)) + 1.0 / (2 * pi * mass * mass);
344 double EvtD0TopipiEta::f(
double mass,
double sx,
double q0,
double q)
347 double f = mass * mass / (pow(q0, 3)) * (q * q * (h(m, q) - h(mass, q0)) + (mass * mass - sx) * q0 * q0 * dh(mass, q0));
351 double EvtD0TopipiEta::d(
double mass,
double q0)
353 double d = 3.0 / pi * spi / (q0 * q0) * log((mass + 2 * q0) / (2 * mpi)) + mass / (2 * pi * q0) - (spi * mass) / (pi * pow(q0, 3));
357 EvtComplex EvtD0TopipiEta::propagatorGS(
double mass,
double width,
double sa,
double sb,
double sc,
double r,
int l)
359 double q = Qabcs(sa, sb, sc);
360 double sa0 = mass * mass;
361 double q0 = Qabcs(sa0, sb, sc);
364 EvtComplex prop = (1 + d(mass, q0) * width / mass) / (mass * mass - sa + width * f(mass, sa, q0, q) - ci * mass * width * wid(mass,
369 EvtComplex EvtD0TopipiEta::Flatte_rhoab(
double sa,
double sb,
double sc)
371 double q = (sa + sb - sc) * (sa + sb - sc) / (4 * sa) - sb;
374 rhoo = 2.0 *
sqrt(q / sa) * one;
377 rhoo = 2.0 *
sqrt(-q / sa) * ci;
382 EvtComplex EvtD0TopipiEta::propagatorFlatte(
double mass,
double width,
double sx,
double* sb,
double* sc)
385 const double g1sq = 0.5468 * 0.5468;
386 const double g2sq = 0.23 * 0.23;
387 EvtComplex rho1 = Flatte_rhoab(sx, sb[0], sc[0]);
388 EvtComplex rho2 = Flatte_rhoab(sx, sb[1], sc[1]);
389 EvtComplex prop = 1.0 / (mass * mass - sx - ci * (g1sq * rho1 + g2sq * rho2));
#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.