Garfield++ v2r0
A toolkit for the detailed simulation of particle detectors based on ionisation measurement in gases and semiconductors
Loading...
Searching...
No Matches
Random.cc
Go to the documentation of this file.
1#include <cmath>
2#include <iostream>
3
4#include <TMath.h>
5
6#include "Random.hh"
7
8namespace {
9
10double denlan(const double v) {
11
12 const double p1[5] = {0.4259894875, -0.1249762550, 0.03984243700,
13 -0.006298287635, 0.001511162253};
14 const double q1[5] = {1.0, -0.3388260629, 0.09594393323,
15 -0.01608042283, 0.003778942063};
16
17 const double p2[5] = {0.1788541609, 0.1173957403, 0.01488850518,
18 -0.001394989411, 0.0001283617211};
19 const double q2[5] = {1.0, 0.7428795082, 0.3153932961,
20 0.06694219548, 0.008790609714};
21
22 const double p3[5] = {0.1788544503, 0.09359161662, 0.006325387654,
23 0.00006611667319, -0.000002031049101};
24 const double q3[5] = {1.0, 0.6097809921, 0.2560616665,
25 0.04746722384, 0.006957301675};
26
27 const double p4[5] = {0.9874054407, 118.6723273, 849.2794360,
28 -743.7792444, 427.0262186};
29 const double q4[5] = {1.0, 106.8615961, 337.6496214,
30 2016.712389, 1597.063511};
31
32 const double p5[5] = {1.003675074, 167.5702434, 4789.711289,
33 21217.86767, -22324.94910};
34 const double q5[5] = {1.0, 156.9424537, 3745.310488,
35 9834.698876, 66924.28357};
36
37 const double p6[5] = {1.000827619, 664.9143136, 62972.92665,
38 475554.6998, -5743609.109};
39 const double q6[5] = {1.0, 651.4101098, 56974.73333,
40 165917.4725, -2815759.939};
41
42 const double a1[3] = {0.04166666667, -0.01996527778, 0.02709538966};
43
44 const double a2[2] = {-1.845568670, -4.284640743};
45
46 if (v < -5.5) {
47 const double u = std::exp(v + 1.0);
48 if (u < 1e-10) return 0.0;
49 const double ue = std::exp(-1 / u);
50 const double us = std::sqrt(u);
51 return 0.3989422803 * (ue / us) *
52 (1 + (a1[0] + (a1[1] + a1[2] * u) * u) * u);
53 } else if (v < -1) {
54 const double u = std::exp(-v - 1);
55 return std::exp(-u) * std::sqrt(u) *
56 (p1[0] + (p1[1] + (p1[2] + (p1[3] + p1[4] * v) * v) * v) * v) /
57 (q1[0] + (q1[1] + (q1[2] + (q1[3] + q1[4] * v) * v) * v) * v);
58 } else if (v < 1) {
59 return (p2[0] + (p2[1] + (p2[2] + (p2[3] + p2[4] * v) * v) * v) * v) /
60 (q2[0] + (q2[1] + (q2[2] + (q2[3] + q2[4] * v) * v) * v) * v);
61 } else if (v < 5) {
62 return (p3[0] + (p3[1] + (p3[2] + (p3[3] + p3[4] * v) * v) * v) * v) /
63 (q3[0] + (q3[1] + (q3[2] + (q3[3] + q3[4] * v) * v) * v) * v);
64 } else if (v < 12) {
65 const double u = 1. / v;
66 return u * u *
67 (p4[0] + (p4[1] + (p4[2] + (p4[3] + p4[4] * u) * u) * u) * u) /
68 (q4[0] + (q4[1] + (q4[2] + (q4[3] + q4[4] * u) * u) * u) * u);
69 } else if (v < 50) {
70 const double u = 1. / v;
71 return u * u *
72 (p5[0] + (p5[1] + (p5[2] + (p5[3] + p5[4] * u) * u) * u) * u) /
73 (q5[0] + (q5[1] + (q5[2] + (q5[3] + q5[4] * u) * u) * u) * u);
74 } else if (v < 300) {
75 const double u = 1. / v;
76 return u * u *
77 (p6[0] + (p6[1] + (p6[2] + (p6[3] + p6[4] * u) * u) * u) * u) /
78 (q6[0] + (q6[1] + (q6[2] + (q6[3] + q6[4] * u) * u) * u) * u);
79 } else {
80 const double u = 1. / (v - v * std::log(v) / (v + 1));
81 return u * u * (1 + (a2[0] + a2[1] * u) * u);
82 }
83}
84}
85namespace Garfield {
86
87double RndmLandau() {
88 const double f[] = {
89 0, 0, 0, 0, 0, -2.244733,
90 -2.204365, -2.168163, -2.135219, -2.104898, -2.076740, -2.050397,
91 -2.025605, -2.002150, -1.979866, -1.958612, -1.938275, -1.918760,
92 -1.899984, -1.881879, -1.864385, -1.847451, -1.831030, -1.815083,
93 -1.799574, -1.784473, -1.769751, -1.755383, -1.741346, -1.727620,
94 -1.714187, -1.701029, -1.688130, -1.675477, -1.663057, -1.650858,
95 -1.638868, -1.627078, -1.615477, -1.604058, -1.592811, -1.581729,
96 -1.570806, -1.560034, -1.549407, -1.538919, -1.528565, -1.518339,
97 -1.508237, -1.498254, -1.488386, -1.478628, -1.468976, -1.459428,
98 -1.449979, -1.440626, -1.431365, -1.422195, -1.413111, -1.404112,
99 -1.395194, -1.386356, -1.377594, -1.368906, -1.360291, -1.351746,
100 -1.343269, -1.334859, -1.326512, -1.318229, -1.310006, -1.301843,
101 -1.293737, -1.285688, -1.277693, -1.269752, -1.261863, -1.254024,
102 -1.246235, -1.238494, -1.230800, -1.223153, -1.215550, -1.207990,
103 -1.200474, -1.192999, -1.185566, -1.178172, -1.170817, -1.163500,
104 -1.156220, -1.148977, -1.141770, -1.134598, -1.127459, -1.120354,
105 -1.113282, -1.106242, -1.099233, -1.092255, -1.085306, -1.078388,
106 -1.071498, -1.064636, -1.057802, -1.050996, -1.044215, -1.037461,
107 -1.030733, -1.024029, -1.017350, -1.010695, -1.004064, -.997456,
108 -.990871, -.984308, -.977767, -.971247, -.964749, -.958271,
109 -.951813, -.945375, -.938957, -.932558, -.926178, -.919816,
110 -.913472, -.907146, -.900838, -.894547, -.888272, -.882014,
111 -.875773, -.869547, -.863337, -.857142, -.850963, -.844798,
112 -.838648, -.832512, -.826390, -.820282, -.814187, -.808106,
113 -.802038, -.795982, -.789940, -.783909, -.777891, -.771884,
114 -.765889, -.759906, -.753934, -.747973, -.742023, -.736084,
115 -.730155, -.724237, -.718328, -.712429, -.706541, -.700661,
116 -.694791, -.688931, -.683079, -.677236, -.671402, -.665576,
117 -.659759, -.653950, -.648149, -.642356, -.636570, -.630793,
118 -.625022, -.619259, -.613503, -.607754, -.602012, -.596276,
119 -.590548, -.584825, -.579109, -.573399, -.567695, -.561997,
120 -.556305, -.550618, -.544937, -.539262, -.533592, -.527926,
121 -.522266, -.516611, -.510961, -.505315, -.499674, -.494037,
122 -.488405, -.482777, -.477153, -.471533, -.465917, -.460305,
123 -.454697, -.449092, -.443491, -.437893, -.432299, -.426707,
124 -.421119, -.415534, -.409951, -.404372, -.398795, -.393221,
125 -.387649, -.382080, -.376513, -.370949, -.365387, -.359826,
126 -.354268, -.348712, -.343157, -.337604, -.332053, -.326503,
127 -.320955, -.315408, -.309863, -.304318, -.298775, -.293233,
128 -.287692, -.282152, -.276613, -.271074, -.265536, -.259999,
129 -.254462, -.248926, -.243389, -.237854, -.232318, -.226783,
130 -.221247, -.215712, -.210176, -.204641, -.199105, -.193568,
131 -.188032, -.182495, -.176957, -.171419, -.165880, -.160341,
132 -.154800, -.149259, -.143717, -.138173, -.132629, -.127083,
133 -.121537, -.115989, -.110439, -.104889, -.099336, -.093782,
134 -.088227, -.082670, -.077111, -.071550, -.065987, -.060423,
135 -.054856, -.049288, -.043717, -.038144, -.032569, -.026991,
136 -.021411, -.015828, -.010243, -.004656, .000934, .006527,
137 .012123, .017722, .023323, .028928, .034535, .040146,
138 .045759, .051376, .056997, .062620, .068247, .073877,
139 .079511, .085149, .090790, .096435, .102083, .107736,
140 .113392, .119052, .124716, .130385, .136057, .141734,
141 .147414, .153100, .158789, .164483, .170181, .175884,
142 .181592, .187304, .193021, .198743, .204469, .210201,
143 .215937, .221678, .227425, .233177, .238933, .244696,
144 .250463, .256236, .262014, .267798, .273587, .279382,
145 .285183, .290989, .296801, .302619, .308443, .314273,
146 .320109, .325951, .331799, .337654, .343515, .349382,
147 .355255, .361135, .367022, .372915, .378815, .384721,
148 .390634, .396554, .402481, .408415, .414356, .420304,
149 .426260, .432222, .438192, .444169, .450153, .456145,
150 .462144, .468151, .474166, .480188, .486218, .492256,
151 .498302, .504356, .510418, .516488, .522566, .528653,
152 .534747, .540850, .546962, .553082, .559210, .565347,
153 .571493, .577648, .583811, .589983, .596164, .602355,
154 .608554, .614762, .620980, .627207, .633444, .639689,
155 .645945, .652210, .658484, .664768, .671062, .677366,
156 .683680, .690004, .696338, .702682, .709036, .715400,
157 .721775, .728160, .734556, .740963, .747379, .753807,
158 .760246, .766695, .773155, .779627, .786109, .792603,
159 .799107, .805624, .812151, .818690, .825241, .831803,
160 .838377, .844962, .851560, .858170, .864791, .871425,
161 .878071, .884729, .891399, .898082, .904778, .911486,
162 .918206, .924940, .931686, .938446, .945218, .952003,
163 .958802, .965614, .972439, .979278, .986130, .992996,
164 .999875, 1.006769, 1.013676, 1.020597, 1.027533, 1.034482,
165 1.041446, 1.048424, 1.055417, 1.062424, 1.069446, 1.076482,
166 1.083534, 1.090600, 1.097681, 1.104778, 1.111889, 1.119016,
167 1.126159, 1.133316, 1.140490, 1.147679, 1.154884, 1.162105,
168 1.169342, 1.176595, 1.183864, 1.191149, 1.198451, 1.205770,
169 1.213105, 1.220457, 1.227826, 1.235211, 1.242614, 1.250034,
170 1.257471, 1.264926, 1.272398, 1.279888, 1.287395, 1.294921,
171 1.302464, 1.310026, 1.317605, 1.325203, 1.332819, 1.340454,
172 1.348108, 1.355780, 1.363472, 1.371182, 1.378912, 1.386660,
173 1.394429, 1.402216, 1.410024, 1.417851, 1.425698, 1.433565,
174 1.441453, 1.449360, 1.457288, 1.465237, 1.473206, 1.481196,
175 1.489208, 1.497240, 1.505293, 1.513368, 1.521465, 1.529583,
176 1.537723, 1.545885, 1.554068, 1.562275, 1.570503, 1.578754,
177 1.587028, 1.595325, 1.603644, 1.611987, 1.620353, 1.628743,
178 1.637156, 1.645593, 1.654053, 1.662538, 1.671047, 1.679581,
179 1.688139, 1.696721, 1.705329, 1.713961, 1.722619, 1.731303,
180 1.740011, 1.748746, 1.757506, 1.766293, 1.775106, 1.783945,
181 1.792810, 1.801703, 1.810623, 1.819569, 1.828543, 1.837545,
182 1.846574, 1.855631, 1.864717, 1.873830, 1.882972, 1.892143,
183 1.901343, 1.910572, 1.919830, 1.929117, 1.938434, 1.947781,
184 1.957158, 1.966566, 1.976004, 1.985473, 1.994972, 2.004503,
185 2.014065, 2.023659, 2.033285, 2.042943, 2.052633, 2.062355,
186 2.072110, 2.081899, 2.091720, 2.101575, 2.111464, 2.121386,
187 2.131343, 2.141334, 2.151360, 2.161421, 2.171517, 2.181648,
188 2.191815, 2.202018, 2.212257, 2.222533, 2.232845, 2.243195,
189 2.253582, 2.264006, 2.274468, 2.284968, 2.295507, 2.306084,
190 2.316701, 2.327356, 2.338051, 2.348786, 2.359562, 2.370377,
191 2.381234, 2.392131, 2.403070, 2.414051, 2.425073, 2.436138,
192 2.447246, 2.458397, 2.469591, 2.480828, 2.492110, 2.503436,
193 2.514807, 2.526222, 2.537684, 2.549190, 2.560743, 2.572343,
194 2.583989, 2.595682, 2.607423, 2.619212, 2.631050, 2.642936,
195 2.654871, 2.666855, 2.678890, 2.690975, 2.703110, 2.715297,
196 2.727535, 2.739825, 2.752168, 2.764563, 2.777012, 2.789514,
197 2.802070, 2.814681, 2.827347, 2.840069, 2.852846, 2.865680,
198 2.878570, 2.891518, 2.904524, 2.917588, 2.930712, 2.943894,
199 2.957136, 2.970439, 2.983802, 2.997227, 3.010714, 3.024263,
200 3.037875, 3.051551, 3.065290, 3.079095, 3.092965, 3.106900,
201 3.120902, 3.134971, 3.149107, 3.163312, 3.177585, 3.191928,
202 3.206340, 3.220824, 3.235378, 3.250005, 3.264704, 3.279477,
203 3.294323, 3.309244, 3.324240, 3.339312, 3.354461, 3.369687,
204 3.384992, 3.400375, 3.415838, 3.431381, 3.447005, 3.462711,
205 3.478500, 3.494372, 3.510328, 3.526370, 3.542497, 3.558711,
206 3.575012, 3.591402, 3.607881, 3.624450, 3.641111, 3.657863,
207 3.674708, 3.691646, 3.708680, 3.725809, 3.743034, 3.760357,
208 3.777779, 3.795300, 3.812921, 3.830645, 3.848470, 3.866400,
209 3.884434, 3.902574, 3.920821, 3.939176, 3.957640, 3.976215,
210 3.994901, 4.013699, 4.032612, 4.051639, 4.070783, 4.090045,
211 4.109425, 4.128925, 4.148547, 4.168292, 4.188160, 4.208154,
212 4.228275, 4.248524, 4.268903, 4.289413, 4.310056, 4.330832,
213 4.351745, 4.372794, 4.393982, 4.415310, 4.436781, 4.458395,
214 4.480154, 4.502060, 4.524114, 4.546319, 4.568676, 4.591187,
215 4.613854, 4.636678, 4.659662, 4.682807, 4.706116, 4.729590,
216 4.753231, 4.777041, 4.801024, 4.825179, 4.849511, 4.874020,
217 4.898710, 4.923582, 4.948639, 4.973883, 4.999316, 5.024942,
218 5.050761, 5.076778, 5.102993, 5.129411, 5.156034, 5.182864,
219 5.209903, 5.237156, 5.264625, 5.292312, 5.320220, 5.348354,
220 5.376714, 5.405306, 5.434131, 5.463193, 5.492496, 5.522042,
221 5.551836, 5.581880, 5.612178, 5.642734, 5.673552, 5.704634,
222 5.735986, 5.767610, 5.799512, 5.831694, 5.864161, 5.896918,
223 5.929968, 5.963316, 5.996967, 6.030925, 6.065194, 6.099780,
224 6.134687, 6.169921, 6.205486, 6.241387, 6.277630, 6.314220,
225 6.351163, 6.388465, 6.426130, 6.464166, 6.502578, 6.541371,
226 6.580553, 6.620130, 6.660109, 6.700495, 6.741297, 6.782520,
227 6.824173, 6.866262, 6.908795, 6.951780, 6.995225, 7.039137,
228 7.083525, 7.128398, 7.173764, 7.219632, 7.266011, 7.312910,
229 7.360339, 7.408308, 7.456827, 7.505905, 7.555554, 7.605785,
230 7.656608, 7.708035, 7.760077, 7.812747, 7.866057, 7.920019,
231 7.974647, 8.029953, 8.085952, 8.142657, 8.200083, 8.258245,
232 8.317158, 8.376837, 8.437300, 8.498562, 8.560641, 8.623554,
233 8.687319, 8.751955, 8.817481, 8.883916, 8.951282, 9.019600,
234 9.088889, 9.159174, 9.230477, 9.302822, 9.376233, 9.450735,
235 9.526355, 9.603118, 9.681054, 9.760191, 9.840558, 9.922186,
236 10.005107, 10.089353, 10.174959, 10.261958, 10.350389, 10.440287,
237 10.531693, 10.624646, 10.719188, 10.815362, 10.913214, 11.012789,
238 11.114137, 11.217307, 11.322352, 11.429325, 11.538283, 11.649285,
239 11.762390, 11.877664, 11.995170, 12.114979, 12.237161, 12.361791,
240 12.488946, 12.618708, 12.751161, 12.886394, 13.024498, 13.165570,
241 13.309711, 13.457026, 13.607625, 13.761625, 13.919145, 14.080314,
242 14.245263, 14.414134, 14.587072, 14.764233, 14.945778, 15.131877,
243 15.322712, 15.518470, 15.719353, 15.925570, 16.137345, 16.354912,
244 16.578520, 16.808433, 17.044929, 17.288305, 17.538873, 17.796967,
245 18.062943, 18.337176, 18.620068, 18.912049, 19.213574, 19.525133,
246 19.847249, 20.180480, 20.525429, 20.882738, 21.253102, 21.637266,
247 22.036036, 22.450278, 22.880933, 23.329017, 23.795634, 24.281981,
248 24.789364, 25.319207, 25.873062, 26.452634, 27.059789, 27.696581,
249 28.365274, 29.068370, 29.808638, 30.589157, 31.413354, 32.285060,
250 33.208568, 34.188705, 35.230920, 36.341388, 37.527131, 38.796172,
251 40.157721, 41.622399, 43.202525, 44.912465, 46.769077, 48.792279,
252 51.005773, 53.437996, 56.123356, 59.103894};
253
254 const double x = RndmUniformPos();
255 double u = 1000 * x;
256 int i = u;
257 u = u - i;
258 if (i >= 70 && i <= 800) {
259 return f[i - 1] + u * (f[i] - f[i - 1]);
260 } else if (i >= 7 && i <= 980) {
261 return f[i - 1] +
262 u * (f[i] - f[i - 1] -
263 0.25 * (1 - u) * (f[i + 1] - f[i] - f[i - 1] + f[i - 2]));
264 } else if (i < 7) {
265 const double v = log(x);
266 u = 1. / v;
267 return ((0.99858950 + (3.45213058e1 + 1.70854528e1 * u) * u) /
268 (1 + (3.41760202e1 + 4.01244582 * u) * u)) *
269 (-log(-0.91893853 - v) - 1);
270 } else {
271 u = 1. - x;
272 const double v = u * u;
273 if (x <= 0.999) {
274 return (1.00060006 + 2.63991156e2 * u + 4.37320068e3 * v) /
275 ((1 + 2.57368075e2 * u + 3.41448018e3 * v) * u);
276 } else {
277 return (1.00001538 + 6.07514119e3 * u + 7.34266409e5 * v) /
278 ((1 + 6.06511919e3 * u + 6.94021044e5 * v) * u);
279 }
280 }
281}
282
283double RndmVavilov(const double rkappa, const double beta2) {
284
285 double ran = RndmUniform();
286 const double bkmnx1 = 0.02, bkmny1 = 0.05, bkmnx2 = 0.12, bkmny2 = 0.05,
287 bkmnx3 = 0.22, bkmny3 = 0.05, bkmxx1 = 0.1, bkmxy1 = 1,
288 bkmxx2 = 0.2, bkmxy2 = 1, bkmxx3 = 0.3, bkmxy3 = 1,
289 fbkx1 = 2 / (bkmxx1 - bkmnx1), fbkx2 = 2 / (bkmxx2 - bkmnx2),
290 fbkx3 = 2 / (bkmxx3 - bkmnx3), fbky1 = 2 / (bkmxy1 - bkmny1),
291 fbky2 = 2 / (bkmxy2 - bkmny2), fbky3 = 2 / (bkmxy3 - bkmny3);
292
293 double ac[14] = {0};
294 double hc[9] = {0};
295 double h[9] = {0};
296 double drk[5] = {0};
297 double dsigm[5] = {0};
298 double alfa[5] = {0};
299
300 // dimension ac(0:13),hc(0:8),h(9)
301 // dimension edgec(2:7),fninv(5),drk[5-1],dsigm[5-1],alfa[2:5-1]
302 // dimension u1(13),u2(13),u3(13),u4(12),u5(13),u6(13),u7( 8),u8(13)
303 // dimension v1(12),v2(12),v3(13),v4(12),v5(13),v6(13),v7(11),v8(11)
304 // dimension w1[13-1],w2(11),w3[13-1],w4(13),w5(13),w6(13), w8( 8)
305
306 double fninv[] = {1, 0.5, 0.33333333, 0.25, 0.2};
307
308 double edgec[] = {0, 0.16666667e+0, 0.41666667e-1, 0.83333333e-2,
309 0.13888889e-1, 0.69444444e-2, 0.77160493e-3};
310
311 double u1[] = {0.25850868e+0, 0.32477982e-1, -0.59020496e-2, 0.,
312 0.24880692e-1, 0.47404356e-2, -0.74445130e-3, 0.73225731e-2,
313 0., 0.11668284e-2, 0., -0.15727318e-2,
314 -0.11210142e-2};
315
316 double u2[] = {0.43142611e+0, 0.40797543e-1, -0.91490215e-2, 0.,
317 0.42127077e-1, 0.73167928e-2, -0.14026047e-2, 0.16195241e-1,
318 0.24714789e-2, 0.20751278e-2, 0., -0.25141668e-2,
319 -0.14064022e-2};
320
321 double u3[] = {0.25225955e+0, 0.64820468e-1, -0.23615759e-1, 0.,
322 0.23834176e-1, 0.21624675e-2, -0.26865597e-2, -0.54891384e-2,
323 0.39800522e-2, 0.48447456e-2, -0.89439554e-2, -0.62756944e-2,
324 -0.24655436e-2};
325
326 double u4[] = {0.12593231e+1, -0.20374501e+0, 0.95055662e-1, -0.20771531e-1,
327 -0.46865180e-1, -0.77222986e-2, 0.32241039e-2, 0.89882920e-2,
328 -0.67167236e-2, -0.13049241e-1, 0.18786468e-1, 0.14484097e-1};
329
330 double u5[] = {-0.24864376e-1, -0.10368495e-2, 0.14330117e-2, 0.20052730e-3,
331 0.18751903e-2, 0.12668869e-2, 0.48736023e-3, 0.34850854e-2,
332 0., -0.36597173e-3, 0.19372124e-2, 0.70761825e-3,
333 0.46898375e-3};
334
335 double u6[] = {0.35855696e-1, -0.27542114e-1, 0.12631023e-1, -0.30188807e-2,
336 -0.84479939e-3, 0., 0.45675843e-3, -0.69836141e-2,
337 0.39876546e-2, -0.36055679e-2, 0., 0.15298434e-2,
338 0.19247256e-2};
339
340 double u7[] = {0.10234691e+2, -0.35619655e+1, 0.69387764e+0, -0.14047599e+0,
341 -0.19952390e+1, -0.45679694e+0, 0., 0.50505298e+0};
342
343 double u8[] = {0.21487518e+2, -0.11825253e+2, 0.43133087e+1, -0.14500543e+1,
344 -0.34343169e+1, -0.11063164e+1, -0.21000819e+0, 0.17891643e+1,
345 -0.89601916e+0, 0.39120793e+0, 0.73410606e+0, 0.,
346 -0.32454506e+0};
347
348 double v1[] = {0.27827257e+0, -0.14227603e-2, 0.24848327e-2, 0.,
349 0.45091424e-1, 0.80559636e-2, -0.38974523e-2, 0.,
350 -0.30634124e-2, 0.75633702e-3, 0.54730726e-2, 0.19792507e-2};
351
352 double v2[] = {0.41421789e+0, -0.30061649e-1, 0.52249697e-2, 0.,
353 0.12693873e+0, 0.22999801e-1, -0.86792801e-2, 0.31875584e-1,
354 -0.61757928e-2, 0., 0.19716857e-1, 0.32596742e-2};
355
356 double v3[] = {0.20191056e+0, -0.46831422e-1, 0.96777473e-2, -0.17995317e-2,
357 0.53921588e-1, 0.35068740e-2, -0.12621494e-1, -0.54996531e-2,
358 -0.90029985e-2, 0.34958743e-2, 0.18513506e-1, 0.68332334e-2,
359 -0.12940502e-2};
360
361 double v4[] = {0.13206081e+1, 0.10036618e+0, -0.22015201e-1,
362 0.61667091e-2, -0.14986093e+0, -0.12720568e-1,
363 0.24972042e-1, -0.97751962e-2, 0.26087455e-1,
364 -0.11399062e-1, -0.48282515e-1, -0.98552378e-2};
365
366 double v5[] = {0.16435243e-1, 0.36051400e-1, 0.23036520e-2, -0.61666343e-3,
367 -0.10775802e-1, 0.51476061e-2, 0.56856517e-2, -0.13438433e-1,
368 0., 0., -0.25421507e-2, 0.20169108e-2,
369 -0.15144931e-2};
370
371 double v6[] = {0.33432405e-1, 0.60583916e-2, -0.23381379e-2, 0.83846081e-3,
372 -0.13346861e-1, -0.17402116e-2, 0.21052496e-2, 0.15528195e-2,
373 0.21900670e-2, -0.13202847e-2, -0.45124157e-2, -0.15629454e-2,
374 0.22499176e-3};
375
376 double v7[] = {0.54529572e+1, -0.90906096e+0, 0.86122438e-1, 0.,
377 -0.12218009e+1, -0.32324120e+0, -0.27373591e-1, 0.12173464e+0,
378 0., 0., 0.40917471e-1};
379
380 double v8[] = {0.93841352e+1, -0.16276904e+1, 0.16571423e+0, 0.,
381 -0.18160479e+1, -0.50919193e+0, -0.51384654e-1, 0.21413992e+0,
382 0., 0., 0.66596366e-1};
383
384 double w1[] = {0.29712951e+0, 0.97572934e-2, 0., -0.15291686e-2,
385 0.35707399e-1, 0.96221631e-2, -0.18402821e-2, -0.49821585e-2,
386 0.18831112e-2, 0.43541673e-2, 0.20301312e-2, -0.18723311e-2,
387 -0.73403108e-3};
388
389 double w2[] = {0.40882635e+0, 0.14474912e-1, 0.25023704e-2, -0.37707379e-2,
390 0.18719727e+0, 0.56954987e-1, 0., 0.23020158e-1,
391 0.50574313e-2, 0.94550140e-2, 0.19300232e-1};
392
393 double w3[] = {0.16861629e+0, 0., 0.36317285e-2, -0.43657818e-2,
394 0.30144338e-1, 0.13891826e-1, -0.58030495e-2, -0.38717547e-2,
395 0.85359607e-2, 0.14507659e-1, 0.82387775e-2, -0.10116105e-1,
396 -0.55135670e-2};
397
398 double w4[] = {0.13493891e+1, -0.26863185e-2, -0.35216040e-2, 0.24434909e-1,
399 -0.83447911e-1, -0.48061360e-1, 0.76473951e-2, 0.24494430e-1,
400 -0.16209200e-1, -0.37768479e-1, -0.47890063e-1, 0.17778596e-1,
401 0.13179324e-1};
402
403 double w5[] = {0.10264945e+0, 0.32738857e-1, 0., 0.43608779e-2,
404 -0.43097757e-1, -0.22647176e-2, 0.94531290e-2, -0.12442571e-1,
405 -0.32283517e-2, -0.75640352e-2, -0.88293329e-2, 0.52537299e-2,
406 0.13340546e-2};
407
408 double w6[] = {0.29568177e-1, -0.16300060e-2, -0.21119745e-3, 0.23599053e-2,
409 -0.48515387e-2, -0.40797531e-2, 0.40403265e-3, 0.18200105e-2,
410 -0.14346306e-2, -0.39165276e-2, -0.37432073e-2, 0.19950380e-2,
411 0.12222675e-2};
412
413 double w8[] = {0.66184645e+1, -0.73866379e+0, 0.44693973e-1, 0.,
414 -0.14540925e+1, -0.39529833e+0, -0.44293243e-1, 0.88741049e-1};
415
416 if (rkappa < 0.01 || rkappa > 12) {
417 return 0.;
418 }
419
420 int itype = 0;
421 int npt = 1;
422 if (rkappa >= 0.29) {
423 itype = 1;
424 npt = 100;
425 const double wk = 1. / sqrt(rkappa);
426 ac[0] = (-0.032227 * beta2 - 0.074275) * rkappa +
427 (0.24533 * beta2 + 0.070152) * wk + (-0.55610 * beta2 - 3.1579);
428 ac[8] = (-0.013483 * beta2 - 0.048801) * rkappa +
429 (-1.6921 * beta2 + 8.3656) * wk + (-0.73275 * beta2 - 3.5226);
430 drk[1 - 1] = wk * wk;
431 dsigm[1 - 1] = sqrt(rkappa / (1 - 0.5 * beta2));
432 for (int j = 1; j <= 4; j++) {
433 drk[j + 1 - 1] = drk[1 - 1] * drk[j - 1];
434 dsigm[j + 1 - 1] = dsigm[1 - 1] * dsigm[j - 1];
435 alfa[j + 1 - 1] = (fninv[j - 1] - beta2 * fninv[j + 1 - 1]) * drk[j - 1];
436 }
437 hc[0] = log(rkappa) + beta2 + 1. - Gamma;
438 hc[1] = dsigm[1 - 1];
439 hc[2] = alfa[3 - 1] * dsigm[3 - 1];
440 hc[3] = (3 * alfa[2 - 1] * alfa[2 - 1] + alfa[4 - 1]) * dsigm[4 - 1] - 3;
441 hc[4] = (10 * alfa[2 - 1] * alfa[3 - 1] + alfa[5 - 1]) * dsigm[5 - 1] -
442 10 * hc[2];
443 hc[5] = hc[2] * hc[2];
444 hc[6] = hc[2] * hc[3];
445 hc[7] = hc[2] * hc[5];
446 for (int j = 2; j <= 7; j++) {
447 hc[j] = edgec[j - 1] * hc[j];
448 }
449 hc[8] = 0.39894228 * hc[1];
450 } else if (rkappa >= 0.22) {
451 itype = 2;
452 npt = 150;
453 const double x = 1 + (rkappa - bkmxx3) * fbkx3;
454 const double y = 1 + (sqrt(beta2) - bkmxy3) * fbky3;
455 const double xx = 2 * x;
456 const double yy = 2 * y;
457 const double x2 = xx * x - 1;
458 const double x3 = xx * x2 - x;
459 const double y2 = yy * y - 1;
460 const double y3 = yy * y2 - y;
461 const double xy = x * y;
462 const double p2 = x2 * y;
463 const double p3 = x3 * y;
464 const double q2 = y2 * x;
465 const double q3 = y3 * x;
466 const double pq = x2 * y2;
467 ac[1] = w1[1 - 1] + w1[2 - 1] * x + w1[4 - 1] * x3 + w1[5 - 1] * y +
468 w1[6 - 1] * y2 + w1[7 - 1] * y3 + w1[8 - 1] * xy + w1[9 - 1] * p2 +
469 w1[10 - 1] * p3 + w1[11 - 1] * q2 + w1[12 - 1] * q3 +
470 w1[13 - 1] * pq;
471 ac[2] = w2[1 - 1] + w2[2 - 1] * x + w2[3 - 1] * x2 + w2[4 - 1] * x3 +
472 w2[5 - 1] * y + w2[6 - 1] * y2 + w2[8 - 1] * xy + w2[9 - 1] * p2 +
473 w2[10 - 1] * p3 + w2[11 - 1] * q2;
474 ac[3] = w3[1 - 1] + w3[3 - 1] * x2 + w3[4 - 1] * x3 + w3[5 - 1] * y +
475 w3[6 - 1] * y2 + w3[7 - 1] * y3 + w3[8 - 1] * xy + w3[9 - 1] * p2 +
476 w3[10 - 1] * p3 + w3[11 - 1] * q2 + w3[12 - 1] * q3 +
477 w3[13 - 1] * pq;
478 ac[4] = w4[1 - 1] + w4[2 - 1] * x + w4[3 - 1] * x2 + w4[4 - 1] * x3 +
479 w4[5 - 1] * y + w4[6 - 1] * y2 + w4[7 - 1] * y3 + w4[8 - 1] * xy +
480 w4[9 - 1] * p2 + w4[10 - 1] * p3 + w4[11 - 1] * q2 +
481 w4[12 - 1] * q3 + w4[13 - 1] * pq;
482 ac[5] = w5[1 - 1] + w5[2 - 1] * x + w5[4 - 1] * x3 + w5[5 - 1] * y +
483 w5[6 - 1] * y2 + w5[7 - 1] * y3 + w5[8 - 1] * xy + w5[9 - 1] * p2 +
484 w5[10 - 1] * p3 + w5[11 - 1] * q2 + w5[12 - 1] * q3 +
485 w5[13 - 1] * pq;
486 ac[6] = w6[1 - 1] + w6[2 - 1] * x + w6[3 - 1] * x2 + w6[4 - 1] * x3 +
487 w6[5 - 1] * y + w6[6 - 1] * y2 + w6[7 - 1] * y3 + w6[8 - 1] * xy +
488 w6[9 - 1] * p2 + w6[10 - 1] * p3 + w6[11 - 1] * q2 +
489 w6[12 - 1] * q3 + w6[13 - 1] * pq;
490 ac[8] = w8[1 - 1] + w8[2 - 1] * x + w8[3 - 1] * x2 + w8[5 - 1] * y +
491 w8[6 - 1] * y2 + w8[7 - 1] * y3 + w8[8 - 1] * xy;
492 ac[0] = -3.05;
493 } else if (rkappa >= 0.12) {
494 itype = 3;
495 npt = 200;
496 const double x = 1 + (rkappa - bkmxx2) * fbkx2;
497 const double y = 1 + (sqrt(beta2) - bkmxy2) * fbky2;
498 const double xx = 2 * x;
499 const double yy = 2 * y;
500 const double x2 = xx * x - 1;
501 const double x3 = xx * x2 - x;
502 const double y2 = yy * y - 1;
503 const double y3 = yy * y2 - y;
504 const double xy = x * y;
505 const double p2 = x2 * y;
506 const double p3 = x3 * y;
507 const double q2 = y2 * x;
508 const double q3 = y3 * x;
509 const double pq = x2 * y2;
510 ac[1] = v1[1 - 1] + v1[2 - 1] * x + v1[3 - 1] * x2 + v1[5 - 1] * y +
511 v1[6 - 1] * y2 + v1[7 - 1] * y3 + v1[9 - 1] * p2 + v1[10 - 1] * p3 +
512 v1[11 - 1] * q2 + v1[12 - 1] * q3;
513 ac[2] = v2[1 - 1] + v2[2 - 1] * x + v2[3 - 1] * x2 + v2[5 - 1] * y +
514 v2[6 - 1] * y2 + v2[7 - 1] * y3 + v2[8 - 1] * xy + v2[9 - 1] * p2 +
515 v2[11 - 1] * q2 + v2[12 - 1] * q3;
516 ac[3] = v3[1 - 1] + v3[2 - 1] * x + v3[3 - 1] * x2 + v3[4 - 1] * x3 +
517 v3[5 - 1] * y + v3[6 - 1] * y2 + v3[7 - 1] * y3 + v3[8 - 1] * xy +
518 v3[9 - 1] * p2 + v3[10 - 1] * p3 + v3[11 - 1] * q2 +
519 v3[12 - 1] * q3 + v3[13 - 1] * pq;
520 ac[4] = v4[1 - 1] + v4[2 - 1] * x + v4[3 - 1] * x2 + v4[4 - 1] * x3 +
521 v4[5 - 1] * y + v4[6 - 1] * y2 + v4[7 - 1] * y3 + v4[8 - 1] * xy +
522 v4[9 - 1] * p2 + v4[10 - 1] * p3 + v4[11 - 1] * q2 +
523 v4[12 - 1] * q3;
524 ac[5] = v5[1 - 1] + v5[2 - 1] * x + v5[3 - 1] * x2 + v5[4 - 1] * x3 +
525 v5[5 - 1] * y + v5[6 - 1] * y2 + v5[7 - 1] * y3 + v5[8 - 1] * xy +
526 v5[11 - 1] * q2 + v5[12 - 1] * q3 + v5[13 - 1] * pq;
527 ac[6] = v6[1 - 1] + v6[2 - 1] * x + v6[3 - 1] * x2 + v6[4 - 1] * x3 +
528 v6[5 - 1] * y + v6[6 - 1] * y2 + v6[7 - 1] * y3 + v6[8 - 1] * xy +
529 v6[9 - 1] * p2 + v6[10 - 1] * p3 + v6[11 - 1] * q2 +
530 v6[12 - 1] * q3 + v6[13 - 1] * pq;
531 ac[7] = v7[1 - 1] + v7[2 - 1] * x + v7[3 - 1] * x2 + v7[5 - 1] * y +
532 v7[6 - 1] * y2 + v7[7 - 1] * y3 + v7[8 - 1] * xy + v7[11 - 1] * q2;
533 ac[8] = v8[1 - 1] + v8[2 - 1] * x + v8[3 - 1] * x2 + v8[5 - 1] * y +
534 v8[6 - 1] * y2 + v8[7 - 1] * y3 + v8[8 - 1] * xy + v8[11 - 1] * q2;
535 ac[0] = -3.04;
536 } else {
537 itype = 4;
538 if (rkappa >= 0.02) {
539 itype = 3;
540 }
541 npt = 200;
542 const double x = 1 + (rkappa - bkmxx1) * fbkx1;
543 const double y = 1 + (sqrt(beta2) - bkmxy1) * fbky1;
544 const double xx = 2 * x;
545 const double yy = 2 * y;
546 const double x2 = xx * x - 1;
547 const double x3 = xx * x2 - x;
548 const double y2 = yy * y - 1;
549 const double y3 = yy * y2 - y;
550 const double xy = x * y;
551 const double p2 = x2 * y;
552 const double p3 = x3 * y;
553 const double q2 = y2 * x;
554 const double q3 = y3 * x;
555 const double pq = x2 * y2;
556 if (itype == 3) {
557 ac[1] = u1[1 - 1] + u1[2 - 1] * x + u1[3 - 1] * x2 + u1[5 - 1] * y +
558 u1[6 - 1] * y2 + u1[7 - 1] * y3 + u1[8 - 1] * xy +
559 u1[10 - 1] * p3 + u1[12 - 1] * q3 + u1[13 - 1] * pq;
560 ac[2] = u2[1 - 1] + u2[2 - 1] * x + u2[3 - 1] * x2 + u2[5 - 1] * y +
561 u2[6 - 1] * y2 + u2[7 - 1] * y3 + u2[8 - 1] * xy +
562 u2[9 - 1] * p2 + u2[10 - 1] * p3 + u2[12 - 1] * q3 +
563 u2[13 - 1] * pq;
564 ac[3] = u3[1 - 1] + u3[2 - 1] * x + u3[3 - 1] * x2 + u3[5 - 1] * y +
565 u3[6 - 1] * y2 + u3[7 - 1] * y3 + u3[8 - 1] * xy +
566 u3[9 - 1] * p2 + u3[10 - 1] * p3 + u3[11 - 1] * q2 +
567 u3[12 - 1] * q3 + u3[13 - 1] * pq;
568 ac[4] = u4[1 - 1] + u4[2 - 1] * x + u4[3 - 1] * x2 + u4[4 - 1] * x3 +
569 u4[5 - 1] * y + u4[6 - 1] * y2 + u4[7 - 1] * y3 + u4[8 - 1] * xy +
570 u4[9 - 1] * p2 + u4[10 - 1] * p3 + u4[11 - 1] * q2 +
571 u4[12 - 1] * q3;
572 ac[5] = u5[1 - 1] + u5[2 - 1] * x + u5[3 - 1] * x2 + u5[4 - 1] * x3 +
573 u5[5 - 1] * y + u5[6 - 1] * y2 + u5[7 - 1] * y3 + u5[8 - 1] * xy +
574 u5[10 - 1] * p3 + u5[11 - 1] * q2 + u5[12 - 1] * q3 +
575 u5[13 - 1] * pq;
576 ac[6] = u6[1 - 1] + u6[2 - 1] * x + u6[3 - 1] * x2 + u6[4 - 1] * x3 +
577 u6[5 - 1] * y + u6[7 - 1] * y3 + u6[8 - 1] * xy + u6[9 - 1] * p2 +
578 u6[10 - 1] * p3 + u6[12 - 1] * q3 + u6[13 - 1] * pq;
579 ac[7] = u7[1 - 1] + u7[2 - 1] * x + u7[3 - 1] * x2 + u7[4 - 1] * x3 +
580 u7[5 - 1] * y + u7[6 - 1] * y2 + u7[8 - 1] * xy;
581 }
582 ac[8] = u8[1 - 1] + u8[2 - 1] * x + u8[3 - 1] * x2 + u8[4 - 1] * x3 +
583 u8[5 - 1] * y + u8[6 - 1] * y2 + u8[7 - 1] * y3 + u8[8 - 1] * xy +
584 u8[9 - 1] * p2 + u8[10 - 1] * p3 + u8[11 - 1] * q2 +
585 u8[13 - 1] * pq;
586 ac[0] = -3.03;
587 }
588 ac[9] = (ac[8] - ac[0]) / npt;
589 if (itype == 3) {
590 const double x = (ac[7] - ac[8]) / (ac[7] * ac[8]);
591 const double y = 1 / log(ac[8] / ac[7]);
592 const double p2 = ac[7] * ac[7];
593 ac[11] = p2 * (ac[1] * exp(-ac[2] * (ac[7] + ac[5] * p2) -
594 ac[3] * exp(-ac[4] * (ac[7] + ac[6] * p2))) -
595 0.045 * y / ac[7]) /
596 (1 + x * y * ac[7]);
597 ac[12] = (0.045 + x * ac[11]) * y;
598 }
599 if (itype == 4) {
600 ac[10] = 0.995 / TMath::LandauI(ac[8]);
601 }
602
603 const double t = 2 * ran / ac[9];
604 double rlam = ac[0];
605 double fl = 0.;
606 double fu = 0.;
607 double s = 0;
608 for (int n = 1; n <= npt; n++) {
609 rlam += ac[9];
610 if (itype == 1) {
611 double fn = 1;
612 const double x = (rlam + hc[0]) * hc[1];
613 h[1 - 1] = x;
614 h[2 - 1] = x * x - 1;
615 for (int k = 2; k <= 8; k++) {
616 fn += 1;
617 h[k + 1 - 1] = x * h[k - 1] - fn * h[k - 1 - 1];
618 }
619 double y = 1 + hc[7] * h[9 - 1];
620 for (int k = 2; k <= 6; k++) {
621 y = y + hc[k] * h[k + 1 - 1];
622 }
623 if (y < 0) {
624 fu = 0;
625 } else {
626 fu = hc[8] * exp(-0.5 * x * x) * y;
627 }
628 } else if (itype == 2) {
629 const double x = rlam * rlam;
630 fu = ac[1] * exp(-ac[2] * (rlam + ac[5] * x) -
631 ac[3] * exp(-ac[4] * (rlam + ac[6] * x)));
632 } else if (itype == 3) {
633 if (rlam < ac[7]) {
634 const double x = rlam * rlam;
635 fu = ac[1] * exp(-ac[2] * (rlam + ac[5] * x) -
636 ac[3] * exp(-ac[4] * (rlam + ac[6] * x)));
637 } else {
638 const double x = 1 / rlam;
639 fu = (ac[11] * x + ac[12]) * x;
640 }
641 } else {
642 fu = ac[10] * denlan(rlam);
643 }
644 s = s + fl + fu;
645 if (s > t) {
646 break;
647 }
648 fl = fu;
649 }
650
651 const double s0 = s - fl - fu;
652 double v = rlam - ac[9];
653 if (s > s0) {
654 v += ac[9] * (t - s0) / (s - s0);
655 }
656 return v;
657}
658
659double RndmHeedWF(const double w, const double f) {
660 // RNDHWF - Generates random energies needed to create a single e- in
661 // a gas with asymptotic work function W and Fano factor F,
662 // according to Igor Smirnov's phenomenological model.
663 const double wref = 30.0;
664 const double fref = 0.174;
665 // Check parameters
666 if (w <= 0 || f < 0) {
667 std::cerr << "RndmHeedWF: Work and/or Fano parameter out of range. "
668 << "Returning 0.\n";
669 return 0.;
670 } else if (f == 0) {
671 // Special case of F = 0
672 return w;
673 }
674 // First generate a standardised (W = 30, F = 0.174) random energy.
675 const double x = RndmUniform() * wref * 0.82174;
676 // E = 0 to w/2: p = 0, integral = 0
677 double e;
678 if (x < 0) {
679 std::cerr << "RndmHeedWF: Random number is below the applicable range. "
680 << "Program error. Returning w/2.\n";
681 e = wref / 2;
682 // E = w/2 to w: p = 1, integral = E-w/2
683 } else if (x < wref / 2) {
684 e = wref / 2 + x;
685 // E = w to 3.064 w: p = (w/E)^4, integral = w^4/3 (1/E^3 - 1/w^3)
686 } else if (x < wref * 0.82174) {
687 e = pow(2 * wref * wref * wref * wref / (5 * wref - 6 * x), 1.0 / 3.0);
688 // E > 3.064 w: p = 0, integral = 0
689 } else {
690 std::cerr << "RndmHeedWF: Random number is above applicable range. "
691 << "Program error. Returning 3.064 w.\n";
692 e = 3.064 * wref;
693 }
694 // Scale.
695 return (w / wref) * sqrt(f / fref) * e + w * (1. - sqrt(f / fref));
696}
697}
double RndmHeedWF(const double w, const double f)
Definition: Random.cc:659
double RndmUniform()
Draw a random number uniformly distributed in the range [0, 1).
Definition: Random.hh:14
double RndmVavilov(const double rkappa, const double beta2)
Draw a random number from a Vavilov distribution.
Definition: Random.cc:283
double RndmUniformPos()
Draw a random number uniformly distributed in the range (0, 1).
Definition: Random.hh:17
double RndmLandau()
Draw a random number from a Landau distribution.
Definition: Random.cc:87