evtgen is hosted by Hepforge, IPPP Durham
EvtGen  2.0.0
Monte Carlo generator of particle decays, in particular the weak decays of heavy flavour particles such as B mesons.
EvtWHad.cpp
Go to the documentation of this file.
1 
2 /***********************************************************************
3 * Copyright 1998-2020 CERN for the benefit of the EvtGen authors *
4 * *
5 * This file is part of EvtGen. *
6 * *
7 * EvtGen is free software: you can redistribute it and/or modify *
8 * it under the terms of the GNU General Public License as published by *
9 * the Free Software Foundation, either version 3 of the License, or *
10 * (at your option) any later version. *
11 * *
12 * EvtGen is distributed in the hope that it will be useful, *
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
15 * GNU General Public License for more details. *
16 * *
17 * You should have received a copy of the GNU General Public License *
18 * along with EvtGen. If not, see <https://www.gnu.org/licenses/>. *
19 ***********************************************************************/
20 
21 #include "EvtGenModels/EvtWHad.hh"
22 
23 #include "EvtGenBase/EvtPDL.hh"
25 
26 EvtWHad::EvtWHad() : mRho_(), gamma0_(), cK_( 0 )
27 {
28  // cK coefficients from Eur. Phys. J. C39, 41 (2005), arXiv:hep-ph/0409080 [hep-ph]
29 
30  // rho(770)
31  mRho_.push_back( 0.77511 );
32  gamma0_.push_back( 0.1491 );
33  cK_.push_back( 1.195 );
34 
35  // rho(1450)
36  mRho_.push_back( 1.465 );
37  gamma0_.push_back( 0.400 );
38  cK_.push_back( -0.112 );
39 
40  // rho(1700)
41  mRho_.push_back( 1.72 );
42  gamma0_.push_back( 0.250 ); // rho(1700)
43  cK_.push_back( -0.083 );
44 
45  // rho(2150), PRD 76 092005
46  mRho_.push_back( 2.150 );
47  gamma0_.push_back( 0.310 );
48  cK_.push_back( 0.0 );
49 }
50 
51 EvtComplex EvtWHad::BWKK( double s, int i ) const
52 {
53  double m2 = pow( mRho_[i], 2 );
54  EvtComplex qs = pcm( s );
55  EvtComplex qm = pcm( m2 );
56  if ( abs( qm ) < 1e-10 ) {
57  return 0;
58  }
59 
60  EvtComplex rat = qs / qm;
61  EvtComplex rat3 = rat * rat * rat;
62  if ( abs( s ) < 1e-10 ) {
63  return 0;
64  }
65 
66  EvtComplex gamma = m2 * rat3 * gamma0_[i] / s;
67  EvtComplex I( 0.0, 1.0 );
68 
69  EvtComplex denBW = m2 - s - I * sqrt( s ) * gamma;
70  if ( abs( denBW ) < 1e-10 ) {
71  return 0;
72  }
73 
74  return cK_[i] * m2 / denBW;
75 }
76 
78  const EvtVector4R& pKplus ) const
79 {
80  double s = ( pKS + pKplus ).mass2();
81  EvtComplex f = BWKK( s, 0 ) + BWKK( s, 1 ) + BWKK( s, 2 );
82 
83  return f * ( pKS - pKplus );
84 }
85 
86 EvtComplex EvtWHad::pcm( double s ) const
87 {
88  double mpi2 = pow( 0.140, 2 );
89  if ( abs( s ) < 1e-10 )
90  return 0;
91 
92  double pcm2 = 1.0 - 4.0 * mpi2 / s;
93  EvtComplex result;
94 
95  if ( pcm2 >= 0.0 ) {
96  result = EvtComplex( sqrt( pcm2 ), 0.0 );
97  } else {
98  result = EvtComplex( 0.0, sqrt( -pcm2 ) );
99  }
100 
101  return result;
102 }
103 
104 // =================== W+ -> pi_ current ========================================
105 
107 {
108  return q1;
109 }
110 
111 //====================== W+ -> pi+ pi0 current =========================================
112 
114 {
115  return BWr( q1 + q2 ) * ( q1 - q2 );
116 }
117 
118 //========================= W+ -> pi+ pi+ pi- current ==============================================
119 
121  const EvtVector4R& q3 ) const
122 {
123  EvtVector4R Q = q1 + q2 + q3;
124  EvtVector4R q13 = q1 - q3, q23 = q2 - q3;
125  double Q2 = Q.mass2();
126 
127  return BWa( Q ) * ( q13 - ( Q * ( Q * q13 ) / Q2 ) * BWr( q2 + q3 ) + q23 -
128  ( Q * ( Q * q23 ) / Q2 ) * BWr( q1 + q3 ) );
129 }
130 
131 // ================= W+ -> pi+ pi+ pi- pi- pi+ current with symmetrization ================================
132 
134  const EvtVector4R& q3, const EvtVector4R& q4,
135  const EvtVector4R& q5 ) const
136 {
137  EvtVector4C term1 = JB( q1, q2, q3, q4, q5 );
138  EvtVector4C term2 = JB( q5, q2, q3, q4, q1 );
139  EvtVector4C term3 = JB( q1, q5, q3, q4, q2 );
140  EvtVector4C term4 = JB( q1, q2, q4, q3, q5 );
141  EvtVector4C term5 = JB( q5, q2, q4, q3, q1 );
142  EvtVector4C term6 = JB( q1, q5, q4, q3, q2 );
143 
144  EvtVector4C V = term1 + term2 + term3 + term4 + term5 + term6;
145  return V;
146 }
147 
148 // =========================W+ -> K+ K- pi+ current ==================================================
149 
151  const EvtVector4R& pKminus,
152  const EvtVector4R& pPiPlus ) const
153 {
154  const double mK_892( 0.892 ), gammaK_892( 0.051 );
155  const double mA1( 1.239 ), gammaA1( 0.600 );
156 
157  EvtVector4R q = pKplus + pKminus + pPiPlus;
158  double q2 = q.mass2();
159  EvtVector4R pK = pKminus + pPiPlus;
160  double pK2 = pK.mass2();
161 
162  EvtComplex I( 0.0, 1.0 ), den1, den2;
163 
164  den1 = 1.0 / ( q2 - mA1 * mA1 + I * mA1 * gammaA1 );
165  den2 = 1.0 / ( pK2 - mK_892 * mK_892 + I * mK_892 * gammaK_892 );
166 
167  EvtTensor4C ten = EvtTensor4C::g() -
168  ( 1.0 / q2 ) * EvtGenFunctions::directProd( q, q );
169 
170  EvtVector4C vec = den1 * den2 * ( pKminus - pPiPlus );
171  vec = ten.cont2( vec );
172 
173  return vec;
174 }
175 
176 // hadronic current W+ -> K+ pi+ pi-
177 
179  const EvtVector4R& pPiPlus,
180  const EvtVector4R& pPiMinus ) const
181 {
182  const double cK1p = 0.210709, cK1r = -0.0152997, cK2p = 0.0945309,
183  cK2r = 0.504315;
184  const double mK1_1270 = 1.270, gammaK1_1270 = 0.090, gK1270_Krho = 2.71,
185  gK1270_KsPi = 0.792;
186  const double mK1_1400 = 1.400, gammaK1_1400 = 0.174, gK11400_Krho = 0.254,
187  gK11400_KsPi = 2.509;
188  const double mK_892 = 0.892, gammaK_892 = 0.051, gK892_Kpi = 3.26;
189  const double mRho = 0.770, gammaRho = 0.150, gRho_PiPi = 6.02;
190 
191  EvtVector4R q = pKplus + pPiPlus + pPiMinus;
192  double q2 = q.mass2(), pp2( 0.0 );
193 
194  EvtVector4C curr( 0, 0, 0, 0 ), curr1;
195  EvtComplex I( 0.0, 1.0 ), den1, den2;
196 
197  // W+ -> K1+(1270) -> K+ rho0 -> K+ pi+ pi-
198  den1 = gK1270_Krho /
199  ( q2 - mK1_1270 * mK1_1270 + I * mK1_1270 * gammaK1_1270 );
200  pp2 = ( pPiPlus + pPiMinus ).mass2();
201  den2 = gRho_PiPi / ( pp2 - mRho * mRho + I * mRho * gammaRho );
202  curr1 = ( pPiPlus - pPiMinus ) * den1 * den2;
203  curr = curr + cK1r * curr1;
204 
205  // W+ -> K1+(1270) -> K*(892)0 pi+ -> K+ pi- pi-
206  den1 = gK1270_KsPi /
207  ( q2 - mK1_1270 * mK1_1270 + I * mK1_1270 * gammaK1_1270 );
208  pp2 = ( pKplus + pPiMinus ).mass2();
209  den2 = gK892_Kpi / ( pp2 - mK_892 * mK_892 + I * mK_892 * gammaK_892 );
210  curr1 = ( pKplus - pPiMinus ) * den1 * den2;
211  curr = curr + cK1p * curr1;
212 
213  // W+ -> K1+(1400) -> K+ rho0 -> K+ pi+ pi-
214  den1 = gK11400_Krho /
215  ( q2 - mK1_1400 * mK1_1400 + I * mK1_1400 * gammaK1_1400 );
216  pp2 = ( pPiMinus + pPiPlus ).mass2();
217  den2 = gRho_PiPi / ( pp2 - mRho * mRho + I * mRho * gammaRho );
218  curr1 = ( pPiPlus - pPiMinus ) * den1 * den2;
219  curr = curr + cK2r * curr1;
220 
221  // W+ -> K1+(1400) -> K*(892)0 pi+ -> K+ pi- pi+
222  den1 = gK11400_KsPi /
223  ( q2 - mK1_1400 * mK1_1400 + I * mK1_1400 * gammaK1_1400 );
224  pp2 = ( pKplus + pPiMinus ).mass2();
225  den2 = gK892_Kpi / ( pp2 - mK_892 * mK_892 + I * mK_892 * gammaK_892 );
226  curr1 = ( pKplus - pPiPlus ) * den1 * den2;
227  curr = curr + cK2p * curr1;
228 
229  EvtTensor4C ten = EvtTensor4C::g() -
230  ( 1.0 / q2 ) * EvtGenFunctions::directProd( q, q );
231  curr = ten.cont2( curr );
232 
233  return curr;
234 }
235 
236 // a1 -> pi+ pi+ pi- BW
237 
239 {
240  double _mA1( 1.26 ), _GA1( 0.4 );
241  double _mA1Sq = _mA1 * _mA1;
242  EvtComplex I( 0.0, 1.0 );
243  double Q2 = q.mass2();
244  double GA1 = _GA1 * pi3G( Q2 ) / pi3G( _mA1Sq );
245 
246  EvtComplex denBA1( _mA1Sq - Q2, -1.0 * _mA1 * GA1 );
247 
248  return _mA1Sq / denBA1;
249 }
250 
252 {
253  double mf( 0.8 ), Gf( 0.6 );
254  double mfSq = mf * mf;
255  EvtComplex I( 0.0, 1.0 );
256  double Q2 = q.mass2();
257  return mfSq / ( mfSq - Q2 - I * mf * Gf );
258 }
259 
261 {
262  double _mRho( 0.775 ), _gammaRho( 0.149 ), _mRhopr( 1.364 ),
263  _gammaRhopr( 0.400 ), _beta( -0.108 );
264  double m1 = EvtPDL::getMeanMass( EvtPDL::getId( "pi+" ) ),
265  m2 = EvtPDL::getMeanMass( EvtPDL::getId( "pi+" ) );
266  double mQ2 = q.mass2();
267 
268  double m1Sq = m1 * m1, m2Sq = m2 * m2, m12Sq = m1Sq * m2Sq;
269 
270  // momenta in the rho->pipi decay
271  double dRho = _mRho * _mRho - m1Sq - m2Sq;
272  double pPiRho = ( 1.0 / _mRho ) * sqrt( ( dRho * dRho ) / 4.0 - m12Sq );
273 
274  double dRhopr = _mRhopr * _mRhopr - m1Sq - m2Sq;
275  double pPiRhopr = ( 1.0 / _mRhopr ) *
276  sqrt( ( dRhopr * dRhopr ) / 4.0 - m12Sq );
277 
278  double dQ = mQ2 - m1Sq - m2Sq;
279  double pPiQ = ( 1.0 / sqrt( mQ2 ) ) * sqrt( ( dQ * dQ ) / 4.0 - m12Sq );
280 
281  double gammaRho = _gammaRho * _mRho / sqrt( mQ2 ) *
282  pow( ( pPiQ / pPiRho ), 3 );
283  EvtComplex BRhoDem( _mRho * _mRho - mQ2, -1.0 * _mRho * gammaRho );
284  EvtComplex BRho = _mRho * _mRho / BRhoDem;
285 
286  double gammaRhopr = _gammaRhopr * _mRhopr / sqrt( mQ2 ) *
287  pow( ( pPiQ / pPiRhopr ), 3 );
288  EvtComplex BRhoprDem( _mRhopr * _mRhopr - mQ2, -1.0 * _mRho * gammaRhopr );
289  EvtComplex BRhopr = _mRhopr * _mRhopr / BRhoprDem;
290 
291  return ( BRho + _beta * BRhopr ) / ( 1.0 + _beta );
292 }
293 
294 double EvtWHad::pi3G( double m2 ) const
295 {
296  double mPi = EvtPDL::getMeanMass( EvtPDL::getId( "pi+" ) );
297  double mRho( 0.775 );
298  double val( 0.0 );
299 
300  if ( m2 > ( mRho + mPi ) ) {
301  val = m2 * ( 1.623 + 10.38 / m2 - 9.32 / ( m2 * m2 ) +
302  0.65 / ( m2 * m2 * m2 ) );
303  } else {
304  double t1 = m2 - 9.0 * mPi * mPi;
305  val = 4.1 * pow( t1, 3.0 ) * ( 1.0 - 3.3 * t1 + 5.8 * t1 * t1 );
306  }
307 
308  return val;
309 }
310 
312  const EvtVector4R& p3, const EvtVector4R& p4,
313  const EvtVector4R& p5 ) const
314 {
315  EvtVector4R Qtot = p1 + p2 + p3 + p4 + p5, Qa = p1 + p2 + p3;
316  EvtTensor4C T = ( 1.0 / Qtot.mass2() ) *
317  EvtGenFunctions::directProd( Qtot, Qtot ) -
318  EvtTensor4C::g();
319 
320  EvtVector4R p13 = p1 - p3, p23 = p2 - p3;
321  EvtVector4R V13 = Qa * ( p2 * p13 ) / Qa.mass2() - p13;
322  EvtVector4R V23 = Qa * ( p1 * p23 ) / Qa.mass2() - p23;
323 
324  return BWa( Qtot ) * BWa( Qa ) * BWf( p4 + p5 ) *
325  ( T.cont1( V13 ) * BWr( p1 + p3 ) + T.cont1( V23 ) * BWr( p2 + p3 ) );
326 }
std::vector< double > cK_
Definition: EvtWHad.hh:77
EvtTensor3C directProd(const EvtVector3C &c1, const EvtVector3C &c2)
std::vector< double > mRho_
Definition: EvtWHad.hh:77
EvtVector4C WCurrent(const EvtVector4R &q1) const
Definition: EvtWHad.cpp:106
EvtComplex BWf(const EvtVector4R &q) const
Definition: EvtWHad.cpp:251
static const EvtTensor4C & g()
Definition: EvtTensor4C.cpp:44
EvtComplex BWKK(double s, int i) const
Definition: EvtWHad.cpp:51
EvtComplex pcm(double s) const
Definition: EvtWHad.cpp:86
EvtWHad()
Definition: EvtWHad.cpp:26
EvtVector4C cont2(const EvtVector4C &v4) const
EvtVector4C JB(const EvtVector4R &q1, const EvtVector4R &q2, const EvtVector4R &q3, const EvtVector4R &q4, const EvtVector4R &q5) const
Definition: EvtWHad.cpp:311
static double getMeanMass(EvtId i)
Definition: EvtPDL.cpp:314
EvtVector4C cont1(const EvtVector4C &v4) const
std::vector< double > gamma0_
Definition: EvtWHad.hh:77
EvtComplex BWa(const EvtVector4R &q) const
Definition: EvtWHad.cpp:238
double mass2() const
Definition: EvtVector4R.hh:100
EvtVector4C WCurrent_KPP(const EvtVector4R &pKplus, const EvtVector4R &pPiPlus, const EvtVector4R &pPiMinus) const
Definition: EvtWHad.cpp:178
EvtVector4C WCurrent_KKP(const EvtVector4R &pKplus, const EvtVector4R &pKminus, const EvtVector4R &pPiPlus) const
Definition: EvtWHad.cpp:150
double pi3G(double Q2) const
Definition: EvtWHad.cpp:294
EvtVector4C WCurrent_KSK(const EvtVector4R &pKS, const EvtVector4R &pKplus) const
Definition: EvtWHad.cpp:77
double abs(const EvtComplex &c)
Definition: EvtComplex.hh:201
static EvtId getId(const std::string &name)
Definition: EvtPDL.cpp:287
const EvtComplex I
Definition: EvtBsMuMuKK.cpp:38
EvtComplex BWr(const EvtVector4R &q) const
Definition: EvtWHad.cpp:260