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