BOSS 8.0.0
BESIII Offline Software System
Loading...
Searching...
No Matches
EvtDTopipi0Eta.cc
Go to the documentation of this file.
1//--------------------------------------------------------------------------
2//
3// Environment:
4// This software is part of the EvtGen package developed jointly
5// for the BaBar and CLEO collaborations. If you use all or part
6// of it, please give an appropriate acknowledgement.
7//
8// Copyright Information: See EvtGen/COPYRIGHT
9// Copyright (C) 1998 Caltech, UCSB
10//
11// Module: EvtDTopipi0Eta.cc
12//
13// Description: Routine to handle three-body decays of D0/D0_bar or D+/D-, See BAM-680
14//
15// Modification history:
16//
17// Liaoyuan Dong Dec 11 2022 Module created
18//
19//------------------------------------------------------------------------
20#include "EvtDTopipi0Eta.hh"
29#include <stdlib.h>
30using namespace std;
31
33
34void EvtDTopipi0Eta::getName( std::string& model_name ) { model_name = "DTopipi0Eta"; }
35
37
39 // check that there are 0 arguments
40 checkNArg( 0 );
41 checkNDaug( 3 );
46
47 phi[0] = -3.3276;
48 rho[0] = 0.31478; // rho eta
49 phi[1] = 0.0;
50 rho[1] = 1.0; // a0+ pi0
51 phi[2] = 0.0;
52 rho[2] = -1.0; // a00 pi+
53
54 // cout << "Initializing DTopipi0Eta" << endl;
55 // for (int i=0; i<3; i++) {
56 // cout << i << " rho= " << rho[i] << " phi= " << phi[i] << endl;
57 // }
58 mrho = 0.77511;
59 ma0 = 0.99;
60 Grho = 0.1491;
61 Ga0 = 0.0756;
62
63 const double mk0 = 0.497614;
64 const double mass_Kaon = 0.49368;
65 const double mass_Pion = 0.13957;
66 const double mass_Pi0 = 0.1349766;
67 const double meta = 0.547862;
68 mpi = 0.13957;
69 mD = 1.86966;
70 sD = mD * mD;
71 spi = mpi * mpi;
72 snk = mk0 * mk0;
73 sck = mass_Kaon * mass_Kaon;
74 scpi = mass_Pion * mass_Pion;
75 snpi = mass_Pi0 * mass_Pi0;
76 seta = meta * meta;
77
78 pi = 3.1415926;
79
80 ci = EvtComplex( 0.0, 1.0 );
81 one = EvtComplex( 1.0, 0.0 );
82
83 int GG[4][4] = { { 1, 0, 0, 0 }, { 0, -1, 0, 0 }, { 0, 0, -1, 0 }, { 0, 0, 0, -1 } };
84 for ( int i = 0; i < 4; i++ )
85 {
86 for ( int j = 0; j < 4; j++ ) { G[i][j] = GG[i][j]; }
87 }
88}
89
91
93
94 // This piece of code could in principle be used to calculate maximum
95 // probablity on fly. But as it uses high number of points and model
96 // deals with single final state, we keep hardcoded number for now rather
97 // than adapting code to work here.
98
99 // double maxprob = 0.0;
100 // for(int ir=0;ir<=60000000;ir++){
101 // p->initializePhaseSpace(getNDaug(),getDaugs());
102 // EvtVector4R D1 = p->getDaug(0)->getP4();
103 // EvtVector4R D2 = p->getDaug(1)->getP4();
104 // EvtVector4R D3 = p->getDaug(2)->getP4();
105 //
106 // double P1[4], P2[4], P3[4];
107 // P1[0] = D1.get(0); P1[1] = D1.get(1); P1[2] = D1.get(2); P1[3] = D1.get(3);
108 // P2[0] = D2.get(0); P2[1] = D2.get(1); P2[2] = D2.get(2); P2[3] = D2.get(3);
109 // P3[0] = D3.get(0); P3[1] = D3.get(1); P3[2] = D3.get(2); P3[3] = D3.get(3);
110 //
111 // double value;
112 // value = calDalEva(P1, P2, P3);
113 // if(value>maxprob) {
114 // maxprob=value;
115 // cout << "ir = " << ir << " maxProb= " << value << endl;
116 // }
117 // }
118 // cout << "maxProb = " << maxprob << endl;
119
121 EvtVector4R D1 = p->getDaug( 0 )->getP4();
122 EvtVector4R D2 = p->getDaug( 1 )->getP4();
123 EvtVector4R D3 = p->getDaug( 2 )->getP4();
124
125 double P1[4], P2[4], P3[4];
126 P1[0] = D1.get( 0 );
127 P1[1] = D1.get( 1 );
128 P1[2] = D1.get( 2 );
129 P1[3] = D1.get( 3 );
130 P2[0] = D2.get( 0 );
131 P2[1] = D2.get( 1 );
132 P2[2] = D2.get( 2 );
133 P2[3] = D2.get( 3 );
134 P3[0] = D3.get( 0 );
135 P3[1] = D3.get( 1 );
136 P3[2] = D3.get( 2 );
137 P3[3] = D3.get( 3 );
138
139 double value;
140 value = calDalEva( P1, P2, P3 );
141 setProb( value );
142 return;
143}
144
145double EvtDTopipi0Eta::calDalEva( double P1[], double P2[], double P3[] ) {
146 // pi+ pi0 eta
147 // 0: non-resonance
148 // 1: resonance, RBW
149 // 2: resonance, GS
150 // 3: resonance, Flatte
151 // 4: rho-omega mxing for omega
152 EvtComplex PDF[3];
153 EvtComplex cof, pdf, module;
154 double value;
155 PDF[0] = Spin_factor( P1, P2, P3, 1, 2, mrho, Grho ); // rho+ eta
156 PDF[1] = Spin_factor( P1, P3, P2, 0, 30, ma0, Ga0 ); // a0+ pi0
157 PDF[2] = Spin_factor( P2, P3, P1, 0, 31, ma0, Ga0 ); // a00 pi+
158
159 pdf = EvtComplex( 0.0, 0.0 );
160 for ( int i = 0; i < 3; i++ )
161 {
162 cof = EvtComplex( rho[i] * cos( phi[i] ), rho[i] * sin( phi[i] ) );
163 pdf = pdf + cof * PDF[i];
164 }
165 module = conj( pdf ) * pdf;
166 value = real( module );
167 return ( value <= 0 ) ? 1e-20 : value;
168}
169
170EvtComplex EvtDTopipi0Eta::Spin_factor( double P1[], double P2[], double P3[], int spin,
171 int flag, double mass_R, double width_R ) {
172 // D-> R P3, R->P1 P2, 0: non-resonance 1: resonance, RBW 2: resonance, GS 3: resonance,
173 // Flatte 4: rho-omega mxing for omega
174 double R[4], s[3], sp2, B[2];
175 double tmp;
176 for ( int i = 0; i < 4; i++ ) { R[i] = P1[i] + P2[i]; }
177 s[0] = dot( R, R );
178 s[1] = dot( P1, P1 );
179 s[2] = dot( P2, P2 );
180 sp2 = dot( P3, P3 );
181
182 EvtComplex amp, prop, prop1, prop2;
183 EvtComplex rhokk, rhopieta;
184 if ( spin == 0 )
185 {
186 if ( flag == 0 ) prop = one;
187 if ( flag == 1 ) prop = propagatorRBW( mass_R, width_R, s[0], s[1], s[2], 3.0, 0 );
188 if ( flag == 30 )
189 {
190 rhokk = Flatte_rhoab( s[0], snk, sck );
191 rhopieta = Flatte_rhoab( s[0], scpi, seta );
192 prop =
193 1.0 / ( mass_R * mass_R - s[0] - ci * ( 0.341 * rhopieta + 0.341 * 0.892 * rhokk ) );
194 }
195 if ( flag == 31 )
196 {
197 double qKsK;
198 qKsK = 0.25 * ( s[0] + 3.899750596e-03 ) * ( s[0] + 3.899750596e-03 ) / s[0] -
199 0.497614 * 0.497614;
200 if ( qKsK > 0 ) rhokk = 2.0 * sqrt( qKsK / s[0] ) * one;
201 if ( qKsK < 0 ) rhokk = 2.0 * sqrt( qKsK / s[0] ) * ci;
202 rhopieta = Flatte_rhoab( s[0], snpi, seta );
203 prop =
204 1.0 / ( mass_R * mass_R - s[0] - ci * ( 0.341 * rhopieta + 0.341 * 0.892 * rhokk ) );
205 }
206 amp = prop;
207 }
208 else if ( spin == 1 )
209 {
210 if ( flag == 0 ) { prop = EvtComplex( 1.0, 0.0 ); }
211 if ( flag == 1 ) { prop = propagatorRBW( mass_R, width_R, s[0], s[1], s[2], 3.0, 1 ); }
212 if ( flag == 2 ) { prop = propagatorGS( mass_R, width_R, s[0], s[1], s[2], 3.0, 1 ); }
213 if ( flag == 4 )
214 {
215 prop1 = propagatorGS( mass_R, width_R, s[0], s[1], s[2], 3.0, 1 );
216 prop2 = propagatorRBW( 0.78266, 0.01358, s[0], s[1], s[2], 3.0, 1 );
217 prop = prop1 * prop2;
218 }
219 double T1[4], t1[4];
220 calt1( R, P3, T1 );
221 calt1( P1, P2, t1 );
222 B[0] = barrier( 1, s[0], s[1], s[2], 3.0, mass_R );
223 B[1] = barrier( 1, sD, s[0], sp2, 5.0, mD );
224 tmp = 0.0;
225 for ( int i = 0; i < 4; i++ ) { tmp += T1[i] * t1[i] * G[i][i]; }
226 amp = tmp * prop * B[0] * B[1];
227 }
228 else if ( spin == 2 )
229 {
230 double T2[4][4], t2[4][4];
231 calt2( R, P3, T2 );
232 calt2( P1, P2, t2 );
233 B[0] = barrier( 2, s[0], s[1], s[2], 3.0, mass_R );
234 B[1] = barrier( 2, sD, s[0], sp2, 5.0, mD );
235 tmp = 0.0;
236 for ( int i = 0; i < 4; i++ )
237 {
238 for ( int j = 0; j < 4; j++ ) { tmp += T2[i][j] * t2[j][i] * G[j][j] * G[i][i]; }
239 }
240 if ( flag == 0 ) prop = one;
241 if ( flag == 1 ) prop = propagatorRBW( mass_R, width_R, s[0], s[1], s[2], 3.0, 2 );
242 amp = tmp * prop * B[0] * B[1];
243 }
244 else { cout << "Only S, P, D wave allowed" << endl; }
245 return amp;
246}
247
248double EvtDTopipi0Eta::dot( double* a1, double* a2 ) {
249 double Dot = 0;
250 for ( int i = 0; i != 4; i++ ) { Dot += a1[i] * a2[i] * G[i][i]; }
251 return Dot;
252}
253
254double EvtDTopipi0Eta::Qabcs( double sa, double sb, double sc ) {
255 double Qabcs = ( sa + sb - sc ) * ( sa + sb - sc ) / ( 4 * sa ) - sb;
256 if ( Qabcs < 0 ) Qabcs = 1e-16;
257 return Qabcs;
258}
259
260double EvtDTopipi0Eta::barrier( double l, double sa, double sb, double sc, double r,
261 double mass ) {
262 double sa0 = mass * mass;
263 double q0 = Qabcs( sa0, sb, sc );
264 double z0 = q0 * r * r;
265 double q = Qabcs( sa, sb, sc );
266 q = sqrt( q );
267 double z = q * r;
268 z = z * z;
269 double F = 1;
270 if ( l > 2 ) F = 0;
271 if ( l == 0 ) F = 1;
272 if ( l == 1 ) F = sqrt( ( 1 + z0 ) / ( 1 + z ) );
273 if ( l == 2 ) F = sqrt( ( 9 + 3 * z0 + z0 * z0 ) / ( 9 + 3 * z + z * z ) );
274 return F;
275}
276
277void EvtDTopipi0Eta::calt1( double daug1[], double daug2[], double t1[] ) {
278 double p, pq;
279 double pa[4], qa[4];
280 for ( int i = 0; i != 4; i++ )
281 {
282 pa[i] = daug1[i] + daug2[i];
283 qa[i] = daug1[i] - daug2[i];
284 }
285 p = dot( pa, pa );
286 pq = dot( pa, qa );
287 for ( int i = 0; i != 4; i++ ) { t1[i] = qa[i] - pq / p * pa[i]; }
288}
289
290void EvtDTopipi0Eta::calt2( double daug1[], double daug2[], double t2[][4] ) {
291 double p, r;
292 double pa[4], t1[4];
293 calt1( daug1, daug2, t1 );
294 r = dot( t1, t1 );
295 for ( int i = 0; i != 4; i++ ) { pa[i] = daug1[i] + daug2[i]; }
296 p = dot( pa, pa );
297 for ( int i = 0; i != 4; i++ )
298 {
299 for ( int j = 0; j != 4; j++ )
300 { t2[i][j] = t1[i] * t1[j] - 1.0 / 3 * r * ( G[i][j] - pa[i] * pa[j] / p ); }
301 }
302}
303
304double EvtDTopipi0Eta::wid( double mass, double sa, double sb, double sc, double r, int l ) {
305 double widm( 0. ), q( 0. ), q0( 0. );
306 double sa0 = mass * mass;
307 double m = sqrt( sa );
308 q = Qabcs( sa, sb, sc );
309 q0 = Qabcs( sa0, sb, sc );
310 double z, z0;
311 z = q * r * r;
312 z0 = q0 * r * r;
313 double t = q / q0;
314 double F( 0. );
315 if ( l == 0 ) F = 1;
316 if ( l == 1 ) F = sqrt( ( 1 + z0 ) / ( 1 + z ) );
317 if ( l == 2 ) F = sqrt( ( 9 + 3 * z0 + z0 * z0 ) / ( 9 + 3 * z + z * z ) );
318 widm = pow( t, l + 0.5 ) * mass / m * F * F;
319 return widm;
320}
321
322EvtComplex EvtDTopipi0Eta::propagatorRBW( double mass, double width, double sa, double sb,
323 double sc, double r, int l ) {
324 EvtComplex prop =
325 1.0 / ( mass * mass - sa - ci * mass * width * wid( mass, sa, sb, sc, r, l ) );
326 return prop;
327}
328
329double EvtDTopipi0Eta::h( double m, double q ) {
330 double h = 2.0 / pi * q / m * log( ( m + 2 * q ) / ( 0.13957 + 0.134976 ) );
331 return h;
332}
333
334double EvtDTopipi0Eta::dh( double mass, double q0 ) {
335 double dh = h( mass, q0 ) * ( 1.0 / ( 8 * q0 * q0 ) - 1.0 / ( 2 * mass * mass ) ) +
336 1.0 / ( 2 * pi * mass * mass );
337 return dh;
338}
339
340double EvtDTopipi0Eta::f( double mass, double sx, double q0, double q ) {
341 double m = sqrt( sx );
342 double f = mass * mass / ( pow( q0, 3 ) ) *
343 ( q * q * ( h( m, q ) - h( mass, q0 ) ) +
344 ( mass * mass - sx ) * q0 * q0 * dh( mass, q0 ) );
345 return f;
346}
347
348double EvtDTopipi0Eta::d( double mass, double q0 ) {
349 double cmpi = 0.5 * ( 0.13957 + 0.134976 );
350 double mpi2 = cmpi * cmpi;
351 double d = 3.0 / pi * mpi2 / ( q0 * q0 ) * log( ( mass + 2 * q0 ) / ( 2 * cmpi ) ) +
352 mass / ( 2 * pi * q0 ) - ( mpi2 * mass ) / ( pi * pow( q0, 3 ) );
353 return d;
354}
355
356EvtComplex EvtDTopipi0Eta::propagatorGS( double mass, double width, double sa, double sb,
357 double sc, double r, int l ) {
358 double q = Qabcs( sa, sb, sc );
359 double sa0 = mass * mass;
360 double q0 = Qabcs( sa0, sb, sc );
361 q = sqrt( q );
362 q0 = sqrt( q0 );
363 EvtComplex prop = ( 1 + d( mass, q0 ) * width / mass ) /
364 ( mass * mass - sa + width * f( mass, sa, q0, q ) -
365 ci * mass * width * wid( mass, sa, sb, sc, r, l ) );
366 return prop;
367}
368
369EvtComplex EvtDTopipi0Eta::Flatte_rhoab( double sa, double sb, double sc ) {
370 double q = ( sa + sb - sc ) * ( sa + sb - sc ) / ( 4 * sa ) - sb;
371 EvtComplex rho;
372 if ( q > 0 ) { rho = 2.0 * sqrt( q / sa ) * one; }
373 if ( q < 0 ) { rho = 2.0 * sqrt( -q / sa ) * ci; }
374 return rho;
375}
376
377EvtComplex EvtDTopipi0Eta::propagatorFlatte( double mass, double width, double sx, double* sb,
378 double* sc ) {
379 const double g1sq = 0.5468 * 0.5468;
380 const double g2sq = 0.23 * 0.23;
381 EvtComplex rho1 = Flatte_rhoab( sx, sb[0], sc[0] );
382 EvtComplex rho2 = Flatte_rhoab( sx, sb[1], sc[1] );
383 EvtComplex prop = 1.0 / ( mass * mass - sx - ci * ( g1sq * rho1 + g2sq * rho2 ) );
384 return prop;
385}
double mass
float Dot(vector3 v1, vector3 v2)
const double mass_Pion
double meta
XmlRpcServer s
****INTEGER imax DOUBLE PRECISION m_pi *DOUBLE PRECISION m_amfin DOUBLE PRECISION m_Chfin DOUBLE PRECISION m_Xenph DOUBLE PRECISION m_sinw2 DOUBLE PRECISION m_GFermi DOUBLE PRECISION m_MfinMin DOUBLE PRECISION m_ta2 INTEGER m_out INTEGER m_KeyFSR INTEGER m_KeyQCD *COMMON c_Semalib $ !copy of input $ !CMS energy $ !beam mass $ !final mass $ !beam charge $ !final charge $ !smallest final mass $ !Z mass $ !Z width $ !EW mixing angle $ !Gmu Fermi $ alphaQED at q
Definition KKsem.h:33
virtual ~EvtDTopipi0Eta()
void getName(std::string &name)
EvtDecayBase * clone()
void decay(EvtParticle *p)
void checkSpinDaughter(int d1, EvtSpinType::spintype sp)
void checkSpinParent(EvtSpinType::spintype sp)
void setProbMax(double prbmx)
void checkNDaug(int d1, int d2=-1)
EvtId * getDaugs()
void checkNArg(int a1, int a2=-1, int a3=-1, int a4=-1)
void setProb(double prob)
const EvtVector4R & getP4() const
EvtParticle * getDaug(int i)
double initializePhaseSpace(int numdaughter, EvtId *daughters, double poleSize=-1., int whichTwo1=0, int whichTwo2=1)
double get(int i) const
const double mk0
Definition inclks.cxx:33
complex_t R(double Q2, double M2, double G, double Mp2, double Mm2)
Definition TUtil.h:22
const double mpi2
Definition TConstant.h:28
int t()
Definition t.c:1