BOSS 8.0.0
BESIII Offline Software System
Loading...
Searching...
No Matches
EvtDsToEtapipi0.cc
Go to the documentation of this file.
1//--------------------------------------------------------------------------
2// Environment:
3// This software is part of the EvtGen package developed jointly
4// for the BaBar and CLEO collaborations. If you use all or part
5// of it, please give an appropriate acknowledgement.
6//
7// Copyright Information: See EvtGen/COPYRIGHT
8// Copyright (C) 1998 Caltech, UCSB
9//
10// Module: EvtDsToEtapipi0.cc
11//
12// Description: Routine to handle three-body decays of Ds+/Ds-
13//
14// Modification history:
15// Liaoyuan Dong Sun Jun 02 01:23:25 2024 Module created
16//------------------------------------------------------------------------
17#include "EvtDsToEtapipi0.hh"
27#include <fstream>
28#include <stdlib.h>
29#include <string>
30using std::endl;
31
33
34void EvtDsToEtapipi0::getName( std::string& model_name ) { model_name = "DsToEtapipi0"; }
35
37
39 // check that there are 0 arguments
40 checkNArg( 0 );
41 checkNDaug( 3 );
46
47 phi[1] = 0.783116;
48 phi[2] = 2.8811;
49 rho[1] = 1.50567;
50 rho[2] = 0.845892;
51 rho[0] = 1;
52 phi[0] = 0;
53
54 // cout << "DsToEtapipi0 :" << endl;
55 // for (int i=0; i<3; i++) {
56 // cout << i << " rho= " << rho[i] << " phi= " << phi[i] << endl;
57 // }
58
59 mD = 1.86486;
60 mDs = 1.9683;
61 rRes = 3.0;
62 rD = 5.0;
63 metap = 0.95778;
64 mkstr = 0.89594;
65 mk0 = 0.497614;
66 mass_Kaon = 0.49368;
67 mass_Pion = 0.13957;
68 mass_Pi0 = 0.1349766;
69 math_pi = 3.1415926;
70 mrho = 0.77549;
71 Grho = 0.1491;
72 ma0 = 0.980;
73 Ga0 = 0.0756;
74 meta = 0.547862;
75 int GG[4][4] = { { 1, 0, 0, 0 }, { 0, -1, 0, 0 }, { 0, 0, -1, 0 }, { 0, 0, 0, -1 } };
76 for ( int i = 0; i < 4; i++ )
77 {
78 for ( int j = 0; j < 4; j++ ) { G[i][j] = GG[i][j]; }
79 }
80}
81
83
85 /*
86 double maxprob = 0.0;
87 for(int ir=0;ir<=60000000;ir++){
88 p->initializePhaseSpace(getNDaug(),getDaugs());
89 EvtVector4R D1 = p->getDaug(0)->getP4();
90 EvtVector4R D2 = p->getDaug(1)->getP4();
91 EvtVector4R D3 = p->getDaug(2)->getP4();
92
93 double P1[4], P2[4], P3[4];
94 P1[0] = D1.get(0); P1[1] = D1.get(1); P1[2] = D1.get(2); P1[3] = D1.get(3);
95 P2[0] = D2.get(0); P2[1] = D2.get(1); P2[2] = D2.get(2); P2[3] = D2.get(3);
96 P3[0] = D3.get(0); P3[1] = D3.get(1); P3[2] = D3.get(2); P3[3] = D3.get(3);
97
98 double value;
99 value = calDalEva(P1, P2, P3);
100 if(value>maxprob) {
101 maxprob=value;
102 printf("ir = %d, maxprob = %.10f\n", ir, value);
103 }
104 }
105 printf("MAXprob = %.10f\n",maxprob);
106 */
108 EvtVector4R D1 = p->getDaug( 0 )->getP4();
109 EvtVector4R D2 = p->getDaug( 1 )->getP4();
110 EvtVector4R D3 = p->getDaug( 2 )->getP4();
111
112 double P1[4], P2[4], P3[4];
113 P1[0] = D1.get( 0 );
114 P1[1] = D1.get( 1 );
115 P1[2] = D1.get( 2 );
116 P1[3] = D1.get( 3 );
117 P2[0] = D2.get( 0 );
118 P2[1] = D2.get( 1 );
119 P2[2] = D2.get( 2 );
120 P2[3] = D2.get( 3 );
121 P3[0] = D3.get( 0 );
122 P3[1] = D3.get( 1 );
123 P3[2] = D3.get( 2 );
124 P3[3] = D3.get( 3 );
125
126 double value;
127 value = calDalEva( P1, P2, P3 );
128 setProb( value );
129 return;
130}
131
132Double_t EvtDsToEtapipi0::calDalEva( Double_t P1[], Double_t P2[], Double_t P3[] ) {
133 // pi pi0 eta
134 // flag two numbers X, Y, X = spin, Y = is Resonant.
135 TComplex PDF[4], cof, pdf, module;
136 PDF[0] = Spin_factor( P1, P2, P3, 1, 1 );
137 PDF[1] = Spin_factor( P1, P2, P3, 1, 0 );
138 PDF[2] = Spin_factor( P1, P3, P2, 0, 31 ) - Spin_factor( P2, P3, P1, 0, 30 );
139
140 pdf = TComplex( 0, 0 );
141 for ( Int_t i = 0; i < 4; i++ )
142 {
143 cof = TComplex( rho[i] * TMath::Cos( phi[i] ), rho[i] * TMath::Sin( phi[i] ) );
144 pdf += cof * PDF[i];
145 }
146 module = pdf * TComplex::Conjugate( pdf );
147 Double_t value;
148 value = module.Re();
149 return ( value <= 0 ) ? 1e-20 : value;
150}
151
152TComplex EvtDsToEtapipi0::Spin_factor( Double_t P1[], Double_t P2[], Double_t P3[], Int_t spin,
153 Int_t flag ) {
154 // D-> R P3, R->P1 P2
155 // flag 0, non-res, 1, RBW, 30, Flatte for a0^0(980), 31 Flatte for a0^+(980)
156 Double_t R[4], s[3], sp2, sDs, B[2], snk, sck;
157 for ( Int_t i = 0; i < 4; i++ ) { R[i] = P1[i] + P2[i]; }
158 s[0] = SCADot( R, R );
159 s[1] = SCADot( P1, P1 );
160 s[2] = SCADot( P2, P2 );
161 sp2 = SCADot( P3, P3 );
162 sDs = mDs * mDs;
163 snk = mk0 * mk0;
164 sck = mass_Kaon * mass_Kaon;
165 TComplex amp( 0, 0 ), prop;
166 Double_t tmp( 0. );
167 //-----------for prop-------------------------
168 Double_t mass( 0.99 );
169 TComplex ci( 0, 1 );
170 TComplex rhokk, rhopieta;
171 if ( spin == 0 )
172 {
173 if ( flag == 0 ) prop = TComplex::One();
174 if ( flag == 1 ) prop = propagatorRBW( ma0, Ga0, s[0], s[1], s[2], 3.0, 0 );
175 if ( flag == 30 )
176 {
177 rhokk = Flatte_rhoab( s[0], sck, sck );
178 rhopieta = Flatte_rhoab( s[0], s[1], s[2] );
179 prop = 1.0 / ( mass * mass - s[0] - ci * ( 0.341 * rhopieta + 0.341 * 0.892 * rhokk ) );
180 }
181 if ( flag == 31 )
182 {
183 rhokk = Flatte_rhoab( s[0], snk, sck );
184 rhopieta = Flatte_rhoab( s[0], s[1], s[2] );
185 prop = 1.0 / ( mass * mass - s[0] - ci * ( 0.341 * rhopieta + 0.341 * 0.892 * rhokk ) );
186 }
187 amp = prop;
188 }
189 else if ( spin == 1 )
190 {
191 Double_t m_res;
192 if ( flag == 0 )
193 {
194 prop = TComplex::One();
195 m_res = mrho;
196 }
197 if ( flag == 1 )
198 {
199 prop =
200 propagatorRBW( mrho, Grho, s[0], s[1], s[2], 3.0, 1 ); // only rho for res. 1^- term
201 m_res = mrho;
202 }
203 tmp = 0;
204 Double_t T1[4], t1[4];
205 calt1( R, P3, T1 );
206 calt1( P1, P2, t1 );
207 B[0] = barrierNeo( 1, s[0], s[1], s[2], 3.0, m_res ); // spin1 only rho
208 B[1] = barrierNeo( 1, sDs, s[0], sp2, 5.0, 1.9683 );
209 for ( Int_t i = 0; i < 4; i++ ) { tmp += T1[i] * t1[i] * G[i][i]; }
210 amp = tmp * prop * B[0] * B[1];
211 }
212 else if ( spin == 2 )
213 {
214 tmp = 0;
215 Double_t T2[4][4], t2[4][4];
216 calt2( R, P3, T2 );
217 calt2( P1, P2, t2 );
218 B[0] = barrierNeo( 2, s[0], s[1], s[2], 3.0, mrho ); // wait for changed
219 B[1] = barrierNeo( 2, sDs, s[0], sp2, 5.0, 1.9683 );
220 for ( Int_t i = 0; i < 4; i++ )
221 {
222 for ( Int_t j = 0; j < 4; j++ ) { tmp += T2[i][j] * t2[j][i] * G[j][j] * G[i][i]; }
223 }
224 if ( flag == 0 ) prop = TComplex::One();
225 if ( flag == 1 ) prop = propagatorRBW( mrho, Grho, s[0], s[1], s[2], 3.0, 1 );
226 // If D wave res. term is found, please use corresponding mass and width for each
227 // resonance.
228 amp = tmp * prop * B[0] * B[1];
229 }
230 else { cout << "Only S, P, D wave allowed" << endl; }
231 return amp;
232}
233
234void EvtDsToEtapipi0::Com_Multi( double a1[2], double a2[2], double res[2] ) {
235 res[0] = a1[0] * a2[0] - a1[1] * a2[1];
236 res[1] = a1[1] * a2[0] + a1[0] * a2[1];
237}
238void EvtDsToEtapipi0::Com_Divide( double a1[2], double a2[2], double res[2] ) {
239 res[0] = ( a1[0] * a2[0] + a1[1] * a2[1] ) / ( a2[0] * a2[0] + a2[1] * a2[1] );
240 res[1] = ( a1[1] * a2[0] - a1[0] * a2[1] ) / ( a2[0] * a2[0] + a2[1] * a2[1] );
241}
242
243double EvtDsToEtapipi0::SCADot( double a1[4], double a2[4] ) {
244 double _cal = 0.;
245 _cal = a1[0] * a2[0] - a1[1] * a2[1] - a1[2] * a2[2] - a1[3] * a2[3];
246 return _cal;
247}
248double EvtDsToEtapipi0::barrierNeo( int l, double sa, double sb, double sc, double r,
249 double mR ) {
250 double mR2 = mR * mR;
251 double pAB = 0.25 * ( sa + sb - sc ) * ( sa + sb - sc ) / sa - sb;
252 double pR = 0.25 * ( mR2 + sb - sc ) * ( mR2 + sb - sc ) / mR2 - sb;
253 double zAB = pAB * r * r;
254 double zR = pR * r * r;
255 double F = 0.0;
256 if ( l == 0 ) F = 1;
257 if ( l == 1 ) F = sqrt( ( 1 + zR ) / ( 1 + zAB ) );
258 if ( l == 2 ) F = sqrt( ( 9 + 3 * zAB + zAB * zAB ) / ( 9 + 3 * zAB + zAB * zAB ) );
259 return F;
260}
261//------------------spin-------------------------------------------
262void EvtDsToEtapipi0::calt1( double daug1[4], double daug2[4], double t1[4] ) {
263 double p, pq;
264 double pa[4], qa[4];
265 for ( int i = 0; i < 4; i++ )
266 {
267 pa[i] = daug1[i] + daug2[i];
268 qa[i] = daug1[i] - daug2[i];
269 }
270 p = SCADot( pa, pa );
271 pq = SCADot( pa, qa );
272 for ( int i = 0; i < 4; i++ ) { t1[i] = qa[i] - pq / p * pa[i]; }
273}
274void EvtDsToEtapipi0::calt2( double daug1[4], double daug2[4], double t2[4][4] ) {
275 double p, r;
276 double pa[4], t1[4];
277 calt1( daug1, daug2, t1 );
278 r = SCADot( t1, t1 );
279 for ( int i = 0; i < 4; i++ ) { pa[i] = daug1[i] + daug2[i]; }
280 p = SCADot( pa, pa );
281 for ( int i = 0; i < 4; i++ )
282 {
283 for ( int j = 0; j < 4; j++ )
284 { t2[i][j] = t1[i] * t1[j] - 1.0 / 3 * r * ( G[i][j] - pa[i] * pa[j] / p ); }
285 }
286}
287//-------------------prop--------------------------------------------
288double EvtDsToEtapipi0::wid( double mass, double sa, double sb, double sc, double r, int l ) {
289 double widm = 0.;
290 double q = 0.;
291 double q0 = 0.;
292 double sa0 = mass * mass;
293 double m = sqrt( sa );
294 q = ( sa + sb - sc ) * ( sa + sb - sc ) / ( 4 * sa ) - sb;
295 if ( q < 0 ) q = 1e-16;
296 q0 = ( sa0 + sb - sc ) * ( sa0 + sb - sc ) / ( 4 * sa0 ) - sb;
297 if ( q0 < 0 ) q0 = 1e-16;
298 // double F = barrier(l,sa,sb,sc,r);
299 double z = q * r * r;
300 double z0 = q0 * r * r;
301 double F = 0;
302 if ( l == 0 ) F = 1;
303 if ( l == 1 ) F = sqrt( ( 1 + z0 ) / ( 1 + z ) );
304 if ( l == 2 ) F = sqrt( ( 9 + 3 * z0 + z0 * z0 ) / ( 9 + 3 * z + z * z ) );
305 double t = q / q0;
306 widm = pow( t, l + 0.5 ) * mass / m * F * F;
307 return widm;
308}
309
310void EvtDsToEtapipi0::Flatte_rhoab( double sa, double sb, double sc, double rho[2] ) {
311 double q = ( sa + sb - sc ) * ( sa + sb - sc ) / ( 4 * sa ) - sb;
312 double b[2];
313 if ( q > 0 )
314 {
315 rho[0] = 2 * sqrt( q / sa );
316 rho[1] = 0;
317 }
318 else if ( q < 0 )
319 {
320 rho[0] = 0;
321 rho[1] = 2 * sqrt( -q / sa );
322 }
323}
324
325TComplex EvtDsToEtapipi0::Flatte_rhoab( double sa, double sb, double sc ) {
326 double q = ( sa + sb - sc ) * ( sa + sb - sc ) / ( 4 * sa ) - sb;
327 TComplex rho;
328 TComplex ci( 0, 1 );
329 if ( q > 0 ) { rho = 2.0 * sqrt( q / sa ) * ( TComplex::One() ); }
330 if ( q < 0 ) { rho = 2.0 * sqrt( -q / sa ) * ci; }
331 return rho;
332}
333
334TComplex EvtDsToEtapipi0::propagatorRBW( double mass, double width, double sa, double sb,
335 double sc, double r, int l ) {
336 TComplex ci( 0, 1 );
337 TComplex prop =
338 1.0 / ( mass * mass - sa - ci * mass * width * wid( mass, sa, sb, sc, r, l ) );
339 return prop;
340}
double mass
complex< double > TComplex
Definition Dalitz.h:14
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 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)
void decay(EvtParticle *p)
void getName(std::string &name)
virtual ~EvtDsToEtapipi0()
EvtDecayBase * clone()
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
complex_t R(double Q2, double M2, double G, double Mp2, double Mm2)
Definition TUtil.h:22
int t()
Definition t.c:1