CGEM BOSS 6.6.5.g
BESIII Offline Software System
Loading...
Searching...
No Matches
EvtTauHadnu.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: EvtTauHadnu.cc
12//
13// Description: The leptonic decay of the tau meson.
14// E.g., tau- -> e- nueb nut
15//
16// Modification history:
17//
18// RYD January 17, 1997 Module created
19//
20//------------------------------------------------------------------------
21//
23#include <stdlib.h>
24#include <iostream>
25#include <string>
27#include "EvtGenBase/EvtPDL.hh"
34using std::endl;
35
37
38void EvtTauHadnu::getName(std::string& model_name){
39
40 model_name="TAUHADNU";
41
42}
43
44
46
47 return new EvtTauHadnu;
48
49}
50
52
53 // check that there are 0 arguments
54
56
57 //the last daughter should be a neutrino
59
60 int i;
61 for ( i=0; i<(getNDaug()-1);i++) {
63 }
64
65 bool validndaug=false;
66
67 if ( getNDaug()==4 ) {
68 //pipinu
69 validndaug=true;
70 checkNArg(7);
71 _beta = getArg(0);
72 _mRho = getArg(1);
73 _gammaRho = getArg(2);
74 _mRhopr = getArg(3);
75 _gammaRhopr = getArg(4);
76 _mA1 = getArg(5);
77 _gammaA1 = getArg(6);
78 }
79 if ( getNDaug()==3 ) {
80 //pipinu
81 validndaug=true;
82 checkNArg(5);
83 _beta = getArg(0);
84 _mRho = getArg(1);
85 _gammaRho = getArg(2);
86 _mRhopr = getArg(3);
87 _gammaRhopr = getArg(4);
88 }
89 if ( getNDaug()==2 ) {
90 //pipinu
91 validndaug=true;
92 checkNArg(0);
93 }
94
95 if ( !validndaug ) {
96 report(ERROR,"EvtGen") << "Have not yet implemented this final state in TAUHADNU model" << endl;
97 report(ERROR,"EvtGen") << "Ndaug="<<getNDaug() << endl;
98 int id;
99 for ( id=0; id<(getNDaug()-1); id++ )
100 report(ERROR,"EvtGen") << "Daug " << id << " "<<EvtPDL::name(getDaug(id)).c_str() << endl;
101
102 }
103
104}
105
107
108 if ( getNDaug()==2 ) setProbMax(90.0);
109 if ( getNDaug()==3 ) setProbMax(2500.0);
110 if ( getNDaug()==4 ) setProbMax(5000.0);
111
112}
113
115
116 static EvtId TAUM=EvtPDL::getId("tau-");
117
118 EvtIdSet thePis("pi+","pi-","pi0");
119 EvtIdSet theKs("K+","K-");
120
122
123 EvtParticle *nut;
124 nut = p->getDaug(getNDaug()-1);
125
126 //get the leptonic current
127 EvtVector4C tau1, tau2;
128
129 if (p->getId()==TAUM) {
130 tau1=EvtLeptonVACurrent(nut->spParentNeutrino(),p->sp(0));
131 tau2=EvtLeptonVACurrent(nut->spParentNeutrino(),p->sp(1));
132 }
133 else{
134 tau1=EvtLeptonVACurrent(p->sp(0),nut->spParentNeutrino());
135 tau2=EvtLeptonVACurrent(p->sp(1),nut->spParentNeutrino());
136 }
137
138 EvtVector4C hadCurr;
139 bool foundHadCurr=false;
140 if ( getNDaug() == 2 ) {
141 hadCurr = p->getDaug(0)->getP4();
142 foundHadCurr=true;
143 }
144 if ( getNDaug() == 3 ) {
145
146 //pi pi nu with rho and rhopr resonance
147 if ( thePis.contains(getDaug(0)) &&
148 thePis.contains(getDaug(1)) ) {
149
150 EvtVector4R q1 = p->getDaug(0)->getP4();
151 EvtVector4R q2 = p->getDaug(1)->getP4();
152
153 hadCurr = Fpi(q1,q2)*(q1-q2);
154
155 foundHadCurr = true;
156 }
157
158 }
159 if ( getNDaug() == 4 ) {
160 if ( thePis.contains(getDaug(0)) &&
161 thePis.contains(getDaug(1)) &&
162 thePis.contains(getDaug(2)) ) {
163 foundHadCurr = true;
164 //figure out which is the different charged pi
165 //want it to be q3
166
167 int diffPi(0),samePi1(0),samePi2(0);
168 if ( getDaug(0) == getDaug(1) ) {diffPi=2; samePi1=0; samePi2=1;}
169 if ( getDaug(0) == getDaug(2) ) {diffPi=1; samePi1=0; samePi2=2;}
170 if ( getDaug(1) == getDaug(2) ) {diffPi=0; samePi1=1; samePi2=2;}
171
172 EvtVector4R q1=p->getDaug(samePi1)->getP4();
173 EvtVector4R q2=p->getDaug(samePi2)->getP4();
174 EvtVector4R q3=p->getDaug(diffPi)->getP4();
175
176 EvtVector4R Q=q1+q2+q3;
177 double qMass2=Q.mass2();
178
179 double GA1=_gammaA1*pi3G(Q.mass2(),samePi1)/pi3G(_mA1*_mA1,samePi1);
180
181 EvtComplex denBA1(_mA1*_mA1 - Q.mass2(),-1.*_mA1*GA1);
182 EvtComplex BA1 = _mA1*_mA1 / denBA1;
183
184 hadCurr = BA1*( (q1-q3) - (Q*(Q*(q1-q3))/qMass2)*Fpi(q2,q3) +
185 (q2-q3) - (Q*(Q*(q2-q3))/qMass2)*Fpi(q1,q3) );
186
187
188 }
189
190
191 }
192
193
194
195 if ( !foundHadCurr ) {
196 report(ERROR,"EvtGen") << "Have not yet implemented this final state in TAUHADNU model" << endl;
197 report(ERROR,"EvtGen") << "Ndaug="<<getNDaug() << endl;
198 int id;
199 for ( id=0; id<(getNDaug()-1); id++ )
200 report(ERROR,"EvtGen") << "Daug " << id << " "<<EvtPDL::name(getDaug(id)).c_str() << endl;
201
202 }
203
204
205 vertex(0,tau1*hadCurr);
206 vertex(1,tau2*hadCurr);
207
208 return;
209
210}
211
212
213double EvtTauHadnu::pi3G(double m2,int dupD) {
214 double mPi= EvtPDL::getMeanMass(getDaug(dupD));
215 if ( m2 > (_mRho+mPi) ) {
216 return m2*(1.623 + 10.38/m2 - 9.32/(m2*m2) + 0.65/(m2*m2*m2));
217 }
218 else {
219 double t1=m2-9.0*mPi*mPi;
220 return 4.1*pow(t1,3.0)*(1.0 - 3.3*t1+5.8*t1*t1);
221 }
222 return 0.;
223}
224
225EvtComplex EvtTauHadnu::Fpi( EvtVector4R q1, EvtVector4R q2) {
226
227 double m1=q1.mass();
228 double m2=q2.mass();
229
230 EvtVector4R Q = q1 + q2;
231 double mQ2= Q*Q;
232
233 // momenta in the rho->pipi decay
234 double dRho= _mRho*_mRho - m1*m1 - m2*m2;
235 double pPiRho = (1.0/_mRho)*sqrt((dRho*dRho)/4.0 - m1*m1*m2*m2);
236
237 double dRhopr= _mRhopr*_mRhopr - m1*m1 - m2*m2;
238 double pPiRhopr = (1.0/_mRhopr)*sqrt((dRhopr*dRhopr)/4.0 - m1*m1*m2*m2);
239
240 double dQ= mQ2 - m1*m1 - m2*m2;
241 double pPiQ = (1.0/sqrt(mQ2))*sqrt((dQ*dQ)/4.0 - m1*m1*m2*m2);
242
243
244 double gammaRho = _gammaRho*_mRho/sqrt(mQ2)*pow((pPiQ/pPiRho),3);
245 EvtComplex BRhoDem(_mRho*_mRho - mQ2,-1.0*_mRho*gammaRho);
246 EvtComplex BRho= _mRho*_mRho / BRhoDem;
247
248 double gammaRhopr = _gammaRhopr*_mRhopr/sqrt(mQ2)*pow((pPiQ/pPiRhopr),3);
249 EvtComplex BRhoprDem(_mRhopr*_mRhopr - mQ2,-1.0*_mRho*gammaRhopr);
250 EvtComplex BRhopr= _mRhopr*_mRhopr / BRhoprDem;
251
252 return (BRho + _beta*BRhopr)/(1+_beta);
253}
254
255
256
257
258
EvtVector4C EvtLeptonVACurrent(const EvtDiracSpinor &d, const EvtDiracSpinor &dp)
ostream & report(Severity severity, const char *facility)
Definition: EvtReport.cc:36
@ ERROR
Definition: EvtReport.hh:49
double mPi
void vertex(const EvtComplex &amp)
Definition: EvtDecayAmp.hh:37
void checkSpinDaughter(int d1, EvtSpinType::spintype sp)
void checkSpinParent(EvtSpinType::spintype sp)
double getArg(int j)
void setProbMax(double prbmx)
EvtId * getDaugs()
Definition: EvtDecayBase.hh:65
void checkNArg(int a1, int a2=-1, int a3=-1, int a4=-1)
EvtId getDaug(int i)
Definition: EvtDecayBase.hh:66
int contains(const EvtId id)
Definition: EvtIdSet.cc:507
Definition: EvtId.hh:27
static double getMeanMass(EvtId i)
Definition: EvtPDL.hh:45
static std::string name(EvtId i)
Definition: EvtPDL.hh:64
static EvtId getId(const std::string &name)
Definition: EvtPDL.cc:287
EvtId getId() const
Definition: EvtParticle.cc:113
virtual EvtDiracSpinor spParentNeutrino() const
Definition: EvtParticle.cc:633
const EvtVector4R & getP4() const
Definition: EvtParticle.cc:121
EvtParticle * getDaug(int i)
Definition: EvtParticle.cc:85
virtual EvtDiracSpinor sp(int) const
Definition: EvtParticle.cc:620
double initializePhaseSpace(int numdaughter, EvtId *daughters, double poleSize=-1., int whichTwo1=0, int whichTwo2=1)
void getName(std::string &name)
Definition: EvtTauHadnu.cc:38
void initProbMax()
Definition: EvtTauHadnu.cc:106
void decay(EvtParticle *p)
Definition: EvtTauHadnu.cc:114
void init()
Definition: EvtTauHadnu.cc:51
EvtDecayBase * clone()
Definition: EvtTauHadnu.cc:45
virtual ~EvtTauHadnu()
Definition: EvtTauHadnu.cc:36
double mass() const
Definition: EvtVector4R.cc:39
double mass2() const
Definition: EvtVector4R.hh:116