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