EvtGen
2.2.0
Monte Carlo generator of particle decays, in particular the weak decays of heavy flavour particles such as B mesons.
Toggle main menu visibility
Loading...
Searching...
No Matches
src
EvtGenModels
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
21
#include "
EvtGenModels/EvtVubdGamma.hh
"
22
23
#include "
EvtGenBase/EvtConst.hh
"
24
#include "
EvtGenBase/EvtDiLog.hh
"
25
26
#include <math.h>
27
28
//----------------
29
// Constructors --
30
//----------------
31
32
EvtVubdGamma::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
66
double
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
107
double
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
117
double
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
142
double
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
161
double
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
179
double
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
201
double
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
222
double
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
234
double
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
}
exp
EvtComplex exp(const EvtComplex &c)
Definition
EvtComplex.hh:242
EvtConst.hh
EvtDiLog.hh
EvtVubdGamma.hh
EvtConst::pi
static const double pi
Definition
EvtConst.hh:26
EvtVubdGamma::delta
double delta(const double &x, const double &xmin, const double &xmax)
Definition
EvtVubdGamma.cpp:107
EvtVubdGamma::getdGdxdzdp
double getdGdxdzdp(const double &x, const double &z, const double &p2)
Definition
EvtVubdGamma.cpp:66
EvtVubdGamma::m_alphas
double m_alphas
Definition
EvtVubdGamma.hh:84
EvtVubdGamma::getW2nodelta
double getW2nodelta(const double &x, const double &z, const double &p2)
Definition
EvtVubdGamma.cpp:161
EvtVubdGamma::getW1nodelta
double getW1nodelta(const double &x, const double &z, const double &p2)
Definition
EvtVubdGamma.cpp:142
EvtVubdGamma::getW1delta
double getW1delta(const double &x, const double &z)
Definition
EvtVubdGamma.cpp:117
EvtVubdGamma::getW4plus5delta
double getW4plus5delta(const double &x, const double &z)
Definition
EvtVubdGamma.cpp:222
EvtVubdGamma::m_epsilon1
double m_epsilon1
Definition
EvtVubdGamma.hh:85
EvtVubdGamma::getW3nodelta
double getW3nodelta(const double &x, const double &z, const double &p2)
Definition
EvtVubdGamma.cpp:179
EvtVubdGamma::getW5nodelta
double getW5nodelta(const double &x, const double &z, const double &p2)
Definition
EvtVubdGamma.cpp:234
EvtVubdGamma::m_epsilon3
double m_epsilon3
Definition
EvtVubdGamma.hh:87
EvtVubdGamma::getW4nodelta
double getW4nodelta(const double &x, const double &z, const double &p2)
Definition
EvtVubdGamma.cpp:201
EvtVubdGamma::EvtVubdGamma
EvtVubdGamma(const double &alphas)
Definition
EvtVubdGamma.cpp:32
EvtVubdGamma::m_epsilon2
double m_epsilon2
Definition
EvtVubdGamma.hh:86
EvtDiLog::DiLog
double DiLog(double x)
Definition
EvtDiLog.cpp:31
Generated by
1.17.0