BOSS 8.0.0
BESIII Offline Software System
Loading...
Searching...
No Matches
EvtDsTophienu.cc
Go to the documentation of this file.
1//--------------------------------------------------------------------------
2// Environment:
3// This software is part of models developed at BES collaboration
4// based on the EvtGen framework. If you use all or part
5// of it, please give an appropriate acknowledgement.
6//
7// Copyright Information: See EvtGen/BesCopyright
8// Copyright (A) 2006 Ping Rong-Gang @IHEP
9//
10// Module: EvtDsTophienu.cc
11// the necessary file: EvtDsTophienu.hh
12//
13// Description: Ds+ -> phi e+ nu, phi -> pi+ pi- pi0
14//
15// Modification history:
16// Liaoyuan Dong May 29 00:41:03 2023 Module created
17//------------------------------------------------------------------------
18#include "EvtDsTophienu.hh"
27#include <stdlib.h>
28
30
31void EvtDsTophienu::getName( std::string& model_name ) { model_name = "DsTophienu"; }
32
34
36 checkNArg( 0 );
37 checkNDaug( 5 ); // Ds+ -> pi+ pi- pi0 e+ nu
38 // 0 -> 1 2 3 4 5
43
44 std::cout << "Initializing EvtDsTophienu" << std::endl;
45 mV = 1.81;
46 mA = 2.61;
47 V_0 = 1.411;
48 A1_0 = 1;
49 A2_0 = 0.788;
50 mV2 = mV * mV;
51 mA2 = mA * mA;
52
53 m_phi = 1.019461; // phi
54 w_phi = 0.004249;
55 m_rho = 0.77526; // rho
56 w_rho = 0.14910;
57 rBW = 3.0;
58 rBW2 = rBW * rBW;
59 mw_phi = m_phi * w_phi;
60 m2_phi = m_phi * m_phi;
61 m2_rho = m_rho * m_rho;
62
63 mDs = 1.9683;
64 m2Ds = mDs * mDs;
65 mpi = 0.13957;
66 m2pi = mpi * mpi;
67 mpi0 = 0.1349766;
68 m2pi0 = mpi0 * mpi0;
69
70 Pi = atan2( 0.0, -1.0 );
71 root2 = sqrt( 2. );
72 root2d3 = sqrt( 2. / 3 );
73 root1d2 = sqrt( 0.5 );
74 root3d2 = sqrt( 1.5 );
75}
76
78
80 /*
81 double maxprob = 0.0;
82 for(int ir=0;ir<=60000000;ir++){
83 p->initializePhaseSpace(getNDaug(),getDaugs());
84 EvtVector4R _pip = p->getDaug(0)->getP4(); // pi+
85 EvtVector4R _pim = p->getDaug(1)->getP4(); // pi-
86 EvtVector4R _pi0 = p->getDaug(2)->getP4(); // pi0
87 EvtVector4R _e = p->getDaug(3)->getP4(); // e+
88 EvtVector4R _nu = p->getDaug(4)->getP4(); // nu
89 int pid = EvtPDL::getStdHep(p->getDaug(3)->getId());
90 int charm;
91 if(pid == -11) charm = 1;
92 else charm = -1;
93 double m2, q2, cosV, cosL, chi, s12, s13, s23, spin_V;
94
95 KinVGen(_pip, _pim, _pi0, _e, _nu, charm, m2, q2, cosV, cosL, chi, s12, s13, s23,
96 spin_V); double _prob = calPDF(m2, q2, cosV, cosL, chi, s12, s13, s23, spin_V);
97 if(_prob>=maxprob) {
98 maxprob=_prob;
99 std::cout << ir << " prob= " << _prob << std::endl;
100 cout << "EvtVector4R pip" << _pip << ";"<< endl;
101 cout << "EvtVector4R pim" << _pim << ";"<< endl;
102 cout << "EvtVector4R pi0" << _pi0 << ";"<< endl;
103 cout << "EvtVector4R e" << _e << ";"<< endl;
104 cout << "EvtVector4R nu" << _nu << ";"<< endl;
105 }
106 }
107 std::cout << "Max!!!!!!!!!!! " << maxprob<< std::endl;
108 */
110 EvtVector4R pip = p->getDaug( 0 )->getP4();
111 EvtVector4R pim = p->getDaug( 1 )->getP4();
112 EvtVector4R pi0 = p->getDaug( 2 )->getP4();
113 EvtVector4R e = p->getDaug( 3 )->getP4();
114 EvtVector4R nu = p->getDaug( 4 )->getP4();
115
116 int pid = EvtPDL::getStdHep( p->getDaug( 3 )->getId() );
117 int charm;
118 if ( pid == -11 ) charm = 1;
119 else charm = -1;
120 double m2, q2, cosV, cosL, chi, s12, s13, s23, spin_V;
121 KinVGen( pip, pim, pi0, e, nu, charm, m2, q2, cosV, cosL, chi, s12, s13, s23, spin_V );
122 double prob = calPDF( m2, q2, cosV, cosL, chi, s12, s13, s23, spin_V );
123 setProb( prob );
124 return;
125}
126
127void EvtDsTophienu::KinVGen( EvtVector4R vp4_pip, EvtVector4R vp4_pim, EvtVector4R vp4_pi0,
128 EvtVector4R vp4_Lep, EvtVector4R vp4_Nu, int charm, double& m2,
129 double& q2, double& cosV, double& cosL, double& chi, double& s12,
130 double& s13, double& s23, double& spin_V ) {
131 EvtVector4R vp4_3pi = vp4_pip + vp4_pim + vp4_pi0;
132 EvtVector4R vp4_rho0 = vp4_pip + vp4_pim;
133 EvtVector4R vp4_rhop = vp4_pip + vp4_pi0;
134 EvtVector4R vp4_rhom = vp4_pim + vp4_pi0;
135 EvtVector4R vp4_W = vp4_Lep + vp4_Nu;
136
137 m2 = vp4_3pi.mass2();
138 q2 = vp4_W.mass2();
139 s12 = vp4_rho0.mass2();
140 s13 = vp4_rhop.mass2();
141 s23 = vp4_rhom.mass2();
142
143 EvtVector4R boost;
144 boost.set( vp4_3pi.get( 0 ), -vp4_3pi.get( 1 ), -vp4_3pi.get( 2 ), -vp4_3pi.get( 3 ) );
145 EvtVector4R vp4_rhob = boostTo( vp4_rho0, boost );
146 cosV = vp4_rhob.dot( vp4_3pi ) / ( vp4_rhob.d3mag() * vp4_3pi.d3mag() );
147
148 EvtVector4R vp4_pipb = boostTo( vp4_pip, boost );
149 EvtVector4R vp4_pimb = boostTo( vp4_pim, boost );
150 EvtVector4R R = vp4_pipb.cross( vp4_pimb );
151 spin_V = R.d3mag(); // sart(|pi+ times pi-|^2)
152
153 boost.set( vp4_W.get( 0 ), -vp4_W.get( 1 ), -vp4_W.get( 2 ), -vp4_W.get( 3 ) );
154 EvtVector4R vp4_Lepp = boostTo( vp4_Lep, boost );
155 cosL = vp4_Lepp.dot( vp4_W ) / ( vp4_Lepp.d3mag() * vp4_W.d3mag() );
156
157 EvtVector4R V = vp4_3pi / vp4_3pi.d3mag();
158 EvtVector4R C = vp4_rhob.cross( V );
159 C /= C.d3mag();
160 EvtVector4R D = vp4_Lepp.cross( V );
161 D /= D.d3mag();
162 double sinx = C.cross( V ).dot( D );
163 double cosx = C.dot( D );
164 chi = sinx > 0 ? acos( cosx ) : -acos( cosx );
165 if ( charm == -1 ) chi = -chi;
166}
167
168double EvtDsTophienu::calPDF( double m2, double q2, double cosV, double cosL, double chi,
169 double s12, double s13, double s23, double spin_V ) {
170 double m = sqrt( m2 );
171 double q = sqrt( q2 );
172 double m12 = sqrt( s12 ); // m(pi+pi-)
173 double m13 = sqrt( s13 ); // m(pi+pi0)
174 double m23 = sqrt( s23 ); // m(pi-pi0)
175 // cout << "m12 = " << m12 << " m13 = " << m13 << " m23 = " << m23 << " m = " << m << " q = "
176 // << q << endl;
177
178 EvtComplex A_rhopi( 0.0, 0.0 );
179 ResonanceV( s12, m12, s13, m13, s23, m23, A_rhopi );
180 double A2_phi = spin_V * spin_V * abs2( A_rhopi ); // Eq.(1)
181 // cout << "spin_V = " << spin_V << "2 = " << spin_V*spin_V << " A_rho = " << abs2(A_rhopi)
182 // << endl;
183
184 EvtComplex f11( 0.0, 0.0 );
185 EvtComplex f21( 0.0, 0.0 );
186 EvtComplex f31( 0.0, 0.0 );
187 ResonanceP( m2, m, q2, q, s12, m12, s13, m13, s23, m23, f11, f21, f31 );
188
189 double cosV2 = cosV * cosV;
190 double sinV = sqrt( 1.0 - cosV2 );
191 double sinV2 = sinV * sinV;
192
193 EvtComplex F1 = f11 * cosV;
194 EvtComplex F2 = f21 * root1d2;
195 EvtComplex F3 = f31 * root1d2;
196 // cout << "F1= " << F1 << abs2(F1) << endl;
197 // cout << "F2= " << F2 << abs2(F2) << endl;
198 // cout << "F3= " << F3 << abs2(F3) << endl;
199
200 double I1 = 0.25 * ( abs2( F1 ) + 1.5 * sinV2 * ( abs2( F2 ) + abs2( F3 ) ) );
201 double I2 = -0.25 * ( abs2( F1 ) - 0.5 * sinV2 * ( abs2( F2 ) + abs2( F3 ) ) );
202 double I3 = -0.25 * ( abs2( F2 ) - abs2( F3 ) ) * sinV2;
203 double I4 = real( conj( F1 ) * F2 ) * sinV * 0.5;
204 double I5 = real( conj( F1 ) * F3 ) * sinV;
205 double I6 = real( conj( F2 ) * F3 ) * sinV2;
206 // cout << "Ix = " << I1 << ", " << I2 << ", " << I3 << ", " << I4 << ", " << I5 << ", " <<
207 // I6 << endl;
208
209 double coschi = cos( chi );
210 double sinchi = sin( chi );
211 double sin2chi = 2.0 * sinchi * coschi;
212 double cos2chi = 1.0 - 2.0 * sinchi * sinchi;
213
214 double sinL = sqrt( 1. - cosL * cosL );
215 double sinL2 = sinL * sinL;
216 double sin2L = 2.0 * sinL * cosL;
217 double cos2L = 1.0 - 2.0 * sinL2;
218
219 double I = A2_phi * ( I1 + I2 * cos2L + I3 * sinL2 * cos2chi + I4 * sin2L * coschi +
220 I5 * sinL * coschi + I6 * cosL );
221 return I;
222}
223
224void EvtDsTophienu::ResonanceV( double s12, double m12, double s13, double m13, double s23,
225 double m23, EvtComplex& A_rhopi ) {
226 double G_rho0 =
227 w_rho / m12 *
228 pow( ( s12 - 4.0 * m2pi0 ) / ( m2_rho - 4.0 * m2pi0 ), 1.5 ); // Gamma(rho0) Eq.(10)
229 double G_rhop =
230 w_rho / m13 *
231 pow( ( s13 - 4.0 * m2pi ) / ( m2_rho - 4.0 * m2pi ), 1.5 ); // Gamma(rho+) Eq.(10)
232 double G_rhom =
233 w_rho / m23 *
234 pow( ( s23 - 4.0 * m2pi ) / ( m2_rho - 4.0 * m2pi ), 1.5 ); // Gamma(rho-) Eq.(10)
235
236 double AA0 = s12 / m2_rho - 1.0;
237 EvtComplex amp0 = EvtComplex( 1.0, 0.0 ) / EvtComplex( AA0, G_rho0 );
238 double AAp = s13 / m2_rho - 1.0;
239 EvtComplex ampp = EvtComplex( 1.0, 0.0 ) / EvtComplex( AAp, G_rhop );
240 double AAm = s23 / m2_rho - 1.0;
241 EvtComplex ampm = EvtComplex( 1.0, 0.0 ) / EvtComplex( AAm, G_rhom );
242
243 A_rhopi = amp0 + ampp + ampm; // Eq.(10)
244}
245
246void EvtDsTophienu::ResonanceP( double m2, double m, double q2, double q, double s12,
247 double m12, double s13, double m13, double s23, double m23,
248 EvtComplex& F11, EvtComplex& F21, EvtComplex& F31 ) {
249 double p_phi = getPStar( m2Ds, m2, q2 );
250 double summDsm = mDs + m;
251 double V = V_0 / ( 1.0 - q2 / ( mV2 ) );
252 double A1 = A1_0 / ( 1.0 - q2 / ( mA2 ) );
253 double A2 = A2_0 / ( 1.0 - q2 / ( mA2 ) );
254 double A = summDsm * A1;
255 double B = 2.0 * mDs * p_phi / summDsm * V;
256
257 // construct the helicity form factor
258 double H0 =
259 0.5 / ( m * q ) *
260 ( ( m2Ds - m2 - q2 ) * summDsm * A1 - 4.0 * ( m2Ds * p_phi * p_phi ) / summDsm * A2 );
261 double Hp = A - B;
262 double Hm = A + B;
263
264 // calculate alpha
265 double pStar0 = getPStar( m2_phi, s12, m2pi0 );
266 // double pStar0 = getPStar(m2_phi, m2_rho, m2pi0);
267 double alpha = sqrt( 3. * Pi * 0.154 / ( pStar0 * w_phi ) );
268
269 double AA = m2_phi - m2;
270
271 // construct BW for phi -> rho0 pi0
272 double F0 = getF1( m2, m, s12, m2pi0 );
273 // double F0 = getF1(m2, m, m2_rho, m2pi0);
274 double width0 = getWidth1( m2, m, s12, m2pi0, w_phi );
275 // double width0 = getWidth1(m2, m, m2_rho, m2pi0, w_phi);
276
277 EvtComplex C0( mw_phi * F0, 0.0 );
278 double BB0 = -m_phi * width0;
279 EvtComplex amp0 = C0 / EvtComplex( AA, BB0 );
280
281 // construct BW for phi -> rho+ pi-
282 double Fp = getF1( m2, m, s13, m2pi );
283 // double Fp = getF1(m2, m, m2_rho, m2pi);
284 double widthp = getWidth1( m2, m, s13, m2pi, w_phi );
285 // double widthp = getWidth1(m2, m, m2_rho, m2pi, w_phi);
286
287 EvtComplex Cp( mw_phi * Fp, 0.0 );
288 double BBp = -m_phi * widthp;
289 EvtComplex ampp = Cp / EvtComplex( AA, BBp );
290
291 // construct BW for phi -> rho- pi+
292 double Fm = getF1( m2, m, s23, m2pi );
293 // double Fm = getF1(m2, m, m2_rho, m2pi);
294 double widthm = getWidth1( m2, m, s23, m2pi, w_phi );
295 // double widthm = getWidth1(m2, m, m2_rho, m2pi, w_phi);
296
297 EvtComplex Cm( mw_phi * Fm, 0.0 );
298 double BBm = -m_phi * widthm;
299 EvtComplex ampm = Cm / EvtComplex( AA, BBm );
300
301 EvtComplex amp = amp0 + ampp + ampm; // Eq. (15)
302
303 double alpham2 = alpha * 2.0;
304 F11 = amp * alpham2 * q * H0 * root2;
305 F21 = amp * alpham2 * q * ( Hp + Hm );
306 F31 = amp * alpham2 * q * ( Hp - Hm );
307}
308
309double EvtDsTophienu::getF1( double sa, double ma, double sb, double sc ) // a -> b + c
310{
311 double pStar = getPStar( sa, sb, sc );
312 double pStar0 = getPStar( m2_phi, sb, sc );
313 double B = 1. / sqrt( 1. + rBW2 * pStar * pStar );
314 double B0 = 1. / sqrt( 1. + rBW2 * pStar0 * pStar0 );
315 double F = pStar / pStar0 * B / B0;
316 return F;
317}
318
319double EvtDsTophienu::getWidth1( double sa, double ma, double sb, double sc, double width0 ) {
320 double pStar = getPStar( sa, sb, sc );
321 double pStar0 = getPStar( m2_phi, sb, sc );
322 double F = getF1( sa, ma, sb, sc );
323 double width = width0 * pStar / pStar0 * m_phi / ma * F * F;
324 return width;
325}
326
327double EvtDsTophienu::getPStar( double s, double s1, double s2 ) {
328 double x = s + s1 - s2;
329 double t = 0.25 * x * x / s - s1;
330 double p;
331 if ( t > 0.0 ) { p = sqrt( t ); }
332 else
333 {
334 // std::cout << " Hello, pstar is less than 0.0" << std::endl;
335 p = sqrt( -t );
336 // p = 0.02;
337 }
338 return p;
339}
Double_t x[10]
Evt3Rank3C conj(const Evt3Rank3C &t2)
double abs2(const EvtComplex &c)
EvtDiracSpinor boostTo(const EvtDiracSpinor &sp, const EvtVector4R p4)
double alpha
XmlRpcServer s
const DifComplex I
****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
***************************************************************************************Pseudo Class RRes *****************************************************************************************Parameters and physical constants **Maarten sept ************************************************************************DOUBLE PRECISION xsmu **************************************************************************PARTICLE DATA all others are from PDG *Only resonances with known widths into electron pairs are sept ************************************************************************C Declarations C
Definition RRes.h:29
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)
EvtDecayBase * clone()
void decay(EvtParticle *p)
void getName(std::string &name)
virtual ~EvtDsTophienu()
static int getStdHep(EvtId id)
Definition EvtPDL.hh:61
EvtId getId() const
const EvtVector4R & getP4() const
EvtParticle * getDaug(int i)
double initializePhaseSpace(int numdaughter, EvtId *daughters, double poleSize=-1., int whichTwo1=0, int whichTwo2=1)
double dot(const EvtVector4R &v2) const
double get(int i) const
EvtVector4R cross(const EvtVector4R &v2)
double d3mag() const
double mass2() const
void set(int i, double d)
double double * m2
Definition qcdloop1.h:83
int t()
Definition t.c:1