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