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.
EvtVubdGamma.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 
22 
23 #include "EvtGenBase/EvtConst.hh"
24 #include "EvtGenBase/EvtDiLog.hh"
25 #include "EvtGenBase/EvtPatches.hh"
26 
27 #include <math.h>
28 
29 //----------------
30 // Constructors --
31 //----------------
32 
33 EvtVubdGamma::EvtVubdGamma( const double& alphas )
34 {
35  _alphas = alphas;
36 
37  // the range for the delta distribution in p2 is from _epsilon1 to
38  // _epsilon2. It was checked with the single differential formulae
39  // in the paper that these values are small enough to imitate p2 = 0
40  // for the regular terms.
41  // The ()* distributions, however need further treatment. In order to
42  // generate the correct spectrum in z a threshold need to be computed
43  // from the desired value of the coupling alphas. The idea is that
44  // for z=1 p2=0 is not allowed and therefore the part of dGamma proportional
45  // to delta(p2) should go to 0 for z->1.
46  // Using equation (3.1) and (3.2) it is possible to find the correct value
47  // for log(_epsilon3) from this requirement.
48 
49  _epsilon1 = 1e-10;
50  _epsilon2 = 1e-5;
51  if ( alphas > 0 ) {
52  double lne3 = 9. / 16. - 2 * EvtConst::pi * EvtConst::pi / 3. +
53  6 * EvtConst::pi / 4 / alphas;
54  if ( lne3 > 0 )
55  lne3 = -7. / 4. - sqrt( lne3 );
56  else
57  lne3 = -7. / 4.;
58  _epsilon3 = exp( lne3 );
59  } else
60  _epsilon3 = 1;
61 }
62 
63 //-----------
64 // Methods --
65 //-----------
66 
67 double EvtVubdGamma::getdGdxdzdp( const double& x, const double& z,
68  const double& p2 )
69 {
70  // check phase space
71 
72  double xb = ( 1 - x );
73 
74  if ( x < 0 || x > 1 || z < xb || z > ( 1 + xb ) )
75  return 0;
76 
77  double p2min = ( 0 > z - 1. ? 0 : z - 1. );
78  double p2max = ( 1. - x ) * ( z - 1. + x );
79 
80  if ( p2 < p2min || p2 > p2max )
81  return 0;
82 
83  // // check the phase space
84  // return 1.;
85 
86  double dG;
87 
88  if ( p2 > _epsilon1 && p2 < _epsilon2 ) {
89  double W1 = getW1delta( x, z );
90  double W4plus5 = getW4plus5delta( x, z );
91 
92  dG = 12. * delta( p2, p2min, p2max ) *
93  ( ( 1. + xb - z ) * ( z - xb ) * W1 + xb * ( z - xb ) * ( W4plus5 ) );
94  } else {
95  double W1 = getW1nodelta( x, z, p2 );
96  double W2 = getW2nodelta( x, z, p2 );
97  double W3 = getW3nodelta( x, z, p2 );
98  double W4 = getW4nodelta( x, z, p2 );
99  double W5 = getW5nodelta( x, z, p2 );
100 
101  dG = 12. *
102  ( ( 1. + xb - z ) * ( z - xb - p2 ) * W1 + ( 1. - z + p2 ) * W2 +
103  ( xb * ( z - xb ) - p2 ) * ( W3 + W4 + W5 ) );
104  }
105  return dG;
106 }
107 
108 double EvtVubdGamma::delta( const double& x, const double& xmin,
109  const double& xmax )
110 {
111  if ( xmin > 0 || xmax < 0 )
112  return 0.;
113  if ( _epsilon1 < x && x < _epsilon2 )
114  return 1. / ( _epsilon2 - _epsilon1 );
115  return 0.0;
116 }
117 
118 double EvtVubdGamma::getW1delta( const double&, const double& z )
119 {
120  double mz = 1. - z;
121 
122  double lz;
123  if ( z == 1 )
124  lz = -1.;
125  else
126  lz = log( z ) / ( 1. - z );
127 
128  // ddilog_(&z) is actually the dilog of (1-z) in maple,
129  // also in Neuberts paper the limit dilog(1) = pi^2/6 is used
130  // this corresponds to maple's dilog(0), so
131  // I take ddilog_(&mz) where mz=1-z in order to satisfy Neubert's definition
132  // and to compare with Maple the argument in maple should be (1-mz) ...
133 
134  double dl = 4. * EvtDiLog::DiLog( mz ) + 4. * pow( EvtConst::pi, 2 ) / 3.;
135 
136  double w = -( 8. * pow( log( z ), 2 ) - 10. * log( z ) + 2. * lz + dl + 5. ) +
137  ( 8. * log( z ) - 7. ) * log( _epsilon3 ) -
138  2. * pow( log( _epsilon3 ), 2 );
139 
140  return ( 1. + w * _alphas / 3. / EvtConst::pi );
141 }
142 
143 double EvtVubdGamma::getW1nodelta( const double&, const double& z,
144  const double& p2 )
145 {
146  double z2 = z * z;
147  double t2 = 1. - 4. * p2 / z2;
148  double t = sqrt( t2 );
149 
150  double w = 0;
151  if ( p2 > _epsilon2 )
152  w += 4. / p2 * ( log( ( 1. + t ) / ( 1. - t ) ) / t + log( p2 / z2 ) ) +
153  1. - ( 8. - z ) * ( 2. - z ) / z2 / t2 +
154  ( ( 2. - z ) / 2. / z + ( 8. - z ) * ( 2. - z ) / 2. / z2 / t2 ) *
155  log( ( 1. + t ) / ( 1. - t ) ) / t;
156  if ( p2 > _epsilon3 )
157  w += ( 8. * log( z ) - 7. ) / p2 - 4. * log( p2 ) / p2;
158 
159  return w * _alphas / 3. / EvtConst::pi;
160 }
161 
162 double EvtVubdGamma::getW2nodelta( const double&, const double& z,
163  const double& p2 )
164 {
165  double z2 = z * z;
166  double t2 = 1. - 4. * p2 / z2;
167  double t = sqrt( t2 );
168  double w11 = ( 32. - 8. * z + z2 ) / 4. / z / t2;
169 
170  double w = 0;
171  if ( p2 > _epsilon2 )
172  w -= ( z * t2 / 8. + ( 4. - z ) / 4. + w11 / 2. ) *
173  log( ( 1. + t ) / ( 1. - t ) ) / t;
174  if ( p2 > _epsilon2 )
175  w += ( 8. - z ) / 4. + w11;
176 
177  return ( w * _alphas / 3. / EvtConst::pi );
178 }
179 
180 double EvtVubdGamma::getW3nodelta( const double&, const double& z,
181  const double& p2 )
182 {
183  double z2 = z * z;
184  double t2 = 1. - 4. * p2 / z2;
185  double t4 = t2 * t2;
186  double t = sqrt( t2 );
187 
188  double w = 0;
189 
190  if ( p2 > _epsilon2 )
191  w += ( z * t2 / 16. + 5. * ( 4. - z ) / 16. -
192  ( 64. + 56. * z - 7. * z2 ) / 16. / z / t2 +
193  3. * ( 12. - z ) / 16. / t4 ) *
194  log( ( 1. + t ) / ( 1. - t ) ) / t;
195  if ( p2 > _epsilon2 )
196  w += -( 8. - 3. * z ) / 8. + ( 32. + 22. * z - 3. * z2 ) / 4. / z / t2 -
197  3. * ( 12. - z ) / 8. / t4;
198 
199  return ( w * _alphas / 3. / EvtConst::pi );
200 }
201 
202 double EvtVubdGamma::getW4nodelta( const double&, const double& z,
203  const double& p2 )
204 {
205  double z2 = z * z;
206  double t2 = 1. - 4. * p2 / z2;
207  double t4 = t2 * t2;
208  double t = sqrt( t2 );
209 
210  double w = 0;
211 
212  if ( p2 > _epsilon2 )
213  w -= ( ( 8. - 3. * z ) / 4. / z - ( 22. - 3. * z ) / 2. / z / t2 +
214  3. * ( 12. - z ) / 4. / z / t4 ) *
215  log( ( 1. + t ) / ( 1. - t ) ) / t;
216  if ( p2 > _epsilon2 )
217  w += -1. - ( 32. - 5. * z ) / 2. / z / t2 +
218  3. * ( 12. - z ) / 2. / z / t4;
219 
220  return w * _alphas / 3. / EvtConst::pi;
221 }
222 
223 double EvtVubdGamma::getW4plus5delta( const double&, const double& z )
224 {
225  double w = 0;
226 
227  if ( z == 1 )
228  w = -2;
229  else
230  w = 2. * log( z ) / ( 1. - z );
231 
232  return ( w * _alphas / 3. / EvtConst::pi );
233 }
234 
235 double EvtVubdGamma::getW5nodelta( const double&, const double& z,
236  const double& p2 )
237 {
238  double z2 = z * z;
239  double t2 = 1. - 4. * p2 / z2;
240  double t4 = t2 * t2;
241  double t = sqrt( t2 );
242 
243  double w = 0;
244  if ( p2 > _epsilon2 )
245  w += ( 1. / 4. / z - ( 2. - z ) / 2. / z2 / t2 +
246  3. * ( 12. - z ) / 4. / z2 / t4 ) *
247  log( ( 1. + t ) / ( 1. - t ) ) / t;
248  if ( p2 > _epsilon2 )
249  w += -( 8. + z ) / 2. / z2 / t2 - 3. * ( 12. - z ) / 2. / z2 / t4;
250 
251  return ( w * _alphas / 3. / EvtConst::pi );
252 }
double getW2nodelta(const double &x, const double &z, const double &p2)
double delta(const double &x, const double &xmin, const double &xmax)
double _epsilon2
Definition: EvtVubdGamma.hh:86
EvtVubdGamma(const double &alphas)
double getW1nodelta(const double &x, const double &z, const double &p2)
double getW5nodelta(const double &x, const double &z, const double &p2)
double getW1delta(const double &x, const double &z)
double _alphas
Definition: EvtVubdGamma.hh:84
static const double pi
Definition: EvtConst.hh:26
double getW4nodelta(const double &x, const double &z, const double &p2)
EvtComplex exp(const EvtComplex &c)
Definition: EvtComplex.hh:240
double getdGdxdzdp(const double &x, const double &z, const double &p2)
double DiLog(double x)
Definition: EvtDiLog.cpp:31
double getW4plus5delta(const double &x, const double &z)
double _epsilon1
Definition: EvtVubdGamma.hh:85
double _epsilon3
Definition: EvtVubdGamma.hh:87
double getW3nodelta(const double &x, const double &z, const double &p2)