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