ACTS
Experiment-independent tracking
Loading...
Searching...
No Matches
landau_distribution.hpp
1// This file is part of the ACTS project.
2//
3// Copyright (C) 2016 CERN for the benefit of the ACTS project
4//
5// This Source Code Form is subject to the terms of the Mozilla Public
6// License, v. 2.0. If a copy of the MPL was not distributed with this
7// file, You can obtain one at https://mozilla.org/MPL/2.0/.
8
9#pragma once
10
11// Project include(s).
12#include "detray/definitions/algebra.hpp"
13#include "detray/definitions/containers.hpp"
14#include "detray/definitions/math.hpp"
15
16// System include(s).
17#include <limits>
18#include <random>
19
20namespace detray {
21
24template <concepts::scalar scalar_t>
26 public:
28 using scalar_type = scalar_t;
29
48 template <typename generator_t>
49 scalar_type operator()(generator_t &generator, const scalar_type location,
50 const scalar_type scale) const {
51 const auto z = std::uniform_real_distribution<scalar_type>()(generator);
52 // LANDAU quantile : algorithm from CERNLIB G110 ranlan
53 // Converted by Rene Brun from CERNLIB routine ranlan(G110),
54 // Moved and adapted to QuantFuncMathCore by B. List 29.4.2010
55 return location + scale * quantile(z);
56 }
57
58 private:
59 scalar_type quantile(const scalar_type z) const {
60 static const darray<double, 982> f{
61 0., 0., 0., 0., 0., -2.244733,
62 -2.204365, -2.168163, -2.135219, -2.104898, -2.076740, -2.050397,
63 -2.025605, -2.002150, -1.979866, -1.958612, -1.938275, -1.918760,
64 -1.899984, -1.881879, -1.864385, -1.847451, -1.831030, -1.815083,
65 -1.799574, -1.784473, -1.769751, -1.755383, -1.741346, -1.727620,
66 -1.714187, -1.701029, -1.688130, -1.675477, -1.663057, -1.650858,
67 -1.638868, -1.627078, -1.615477, -1.604058, -1.592811, -1.581729,
68 -1.570806, -1.560034, -1.549407, -1.538919, -1.528565, -1.518339,
69 -1.508237, -1.498254, -1.488386, -1.478628, -1.468976, -1.459428,
70 -1.449979, -1.440626, -1.431365, -1.422195, -1.413111, -1.404112,
71 -1.395194, -1.386356, -1.377594, -1.368906, -1.360291, -1.351746,
72 -1.343269, -1.334859, -1.326512, -1.318229, -1.310006, -1.301843,
73 -1.293737, -1.285688, -1.277693, -1.269752, -1.261863, -1.254024,
74 -1.246235, -1.238494, -1.230800, -1.223153, -1.215550, -1.207990,
75 -1.200474, -1.192999, -1.185566, -1.178172, -1.170817, -1.163500,
76 -1.156220, -1.148977, -1.141770, -1.134598, -1.127459, -1.120354,
77 -1.113282, -1.106242, -1.099233, -1.092255, -1.085306, -1.078388,
78 -1.071498, -1.064636, -1.057802, -1.050996, -1.044215, -1.037461,
79 -1.030733, -1.024029, -1.017350, -1.010695, -1.004064, -.997456,
80 -.990871, -.984308, -.977767, -.971247, -.964749, -.958271,
81 -.951813, -.945375, -.938957, -.932558, -.926178, -.919816,
82 -.913472, -.907146, -.900838, -.894547, -.888272, -.882014,
83 -.875773, -.869547, -.863337, -.857142, -.850963, -.844798,
84 -.838648, -.832512, -.826390, -.820282, -.814187, -.808106,
85 -.802038, -.795982, -.789940, -.783909, -.777891, -.771884,
86 -.765889, -.759906, -.753934, -.747973, -.742023, -.736084,
87 -.730155, -.724237, -.718328, -.712429, -.706541, -.700661,
88 -.694791, -.688931, -.683079, -.677236, -.671402, -.665576,
89 -.659759, -.653950, -.648149, -.642356, -.636570, -.630793,
90 -.625022, -.619259, -.613503, -.607754, -.602012, -.596276,
91 -.590548, -.584825, -.579109, -.573399, -.567695, -.561997,
92 -.556305, -.550618, -.544937, -.539262, -.533592, -.527926,
93 -.522266, -.516611, -.510961, -.505315, -.499674, -.494037,
94 -.488405, -.482777, -.477153, -.471533, -.465917, -.460305,
95 -.454697, -.449092, -.443491, -.437893, -.432299, -.426707,
96 -.421119, -.415534, -.409951, -.404372, -.398795, -.393221,
97 -.387649, -.382080, -.376513, -.370949, -.365387, -.359826,
98 -.354268, -.348712, -.343157, -.337604, -.332053, -.326503,
99 -.320955, -.315408, -.309863, -.304318, -.298775, -.293233,
100 -.287692, -.282152, -.276613, -.271074, -.265536, -.259999,
101 -.254462, -.248926, -.243389, -.237854, -.232318, -.226783,
102 -.221247, -.215712, -.210176, -.204641, -.199105, -.193568,
103 -.188032, -.182495, -.176957, -.171419, -.165880, -.160341,
104 -.154800, -.149259, -.143717, -.138173, -.132629, -.127083,
105 -.121537, -.115989, -.110439, -.104889, -.099336, -.093782,
106 -.088227, -.082670, -.077111, -.071550, -.065987, -.060423,
107 -.054856, -.049288, -.043717, -.038144, -.032569, -.026991,
108 -.021411, -.015828, -.010243, -.004656, .000934, .006527,
109 .012123, .017722, .023323, .028928, .034535, .040146,
110 .045759, .051376, .056997, .062620, .068247, .073877,
111 .079511, .085149, .090790, .096435, .102083, .107736,
112 .113392, .119052, .124716, .130385, .136057, .141734,
113 .147414, .153100, .158789, .164483, .170181, .175884,
114 .181592, .187304, .193021, .198743, .204469, .210201,
115 .215937, .221678, .227425, .233177, .238933, .244696,
116 .250463, .256236, .262014, .267798, .273587, .279382,
117 .285183, .290989, .296801, .302619, .308443, .314273,
118 .320109, .325951, .331799, .337654, .343515, .349382,
119 .355255, .361135, .367022, .372915, .378815, .384721,
120 .390634, .396554, .402481, .408415, .414356, .420304,
121 .426260, .432222, .438192, .444169, .450153, .456145,
122 .462144, .468151, .474166, .480188, .486218, .492256,
123 .498302, .504356, .510418, .516488, .522566, .528653,
124 .534747, .540850, .546962, .553082, .559210, .565347,
125 .571493, .577648, .583811, .589983, .596164, .602355,
126 .608554, .614762, .620980, .627207, .633444, .639689,
127 .645945, .652210, .658484, .664768, .671062, .677366,
128 .683680, .690004, .696338, .702682, .709036, .715400,
129 .721775, .728160, .734556, .740963, .747379, .753807,
130 .760246, .766695, .773155, .779627, .786109, .792603,
131 .799107, .805624, .812151, .818690, .825241, .831803,
132 .838377, .844962, .851560, .858170, .864791, .871425,
133 .878071, .884729, .891399, .898082, .904778, .911486,
134 .918206, .924940, .931686, .938446, .945218, .952003,
135 .958802, .965614, .972439, .979278, .986130, .992996,
136 .999875, 1.006769, 1.013676, 1.020597, 1.027533, 1.034482,
137 1.041446, 1.048424, 1.055417, 1.062424, 1.069446, 1.076482,
138 1.083534, 1.090600, 1.097681, 1.104778, 1.111889, 1.119016,
139 1.126159, 1.133316, 1.140490, 1.147679, 1.154884, 1.162105,
140 1.169342, 1.176595, 1.183864, 1.191149, 1.198451, 1.205770,
141 1.213105, 1.220457, 1.227826, 1.235211, 1.242614, 1.250034,
142 1.257471, 1.264926, 1.272398, 1.279888, 1.287395, 1.294921,
143 1.302464, 1.310026, 1.317605, 1.325203, 1.332819, 1.340454,
144 1.348108, 1.355780, 1.363472, 1.371182, 1.378912, 1.386660,
145 1.394429, 1.402216, 1.410024, 1.417851, 1.425698, 1.433565,
146 1.441453, 1.449360, 1.457288, 1.465237, 1.473206, 1.481196,
147 1.489208, 1.497240, 1.505293, 1.513368, 1.521465, 1.529583,
148 1.537723, 1.545885, 1.554068, 1.562275, 1.570503, 1.578754,
149 1.587028, 1.595325, 1.603644, 1.611987, 1.620353, 1.628743,
150 1.637156, 1.645593, 1.654053, 1.662538, 1.671047, 1.679581,
151 1.688139, 1.696721, 1.705329, 1.713961, 1.722619, 1.731303,
152 1.740011, 1.748746, 1.757506, 1.766293, 1.775106, 1.783945,
153 1.792810, 1.801703, 1.810623, 1.819569, 1.828543, 1.837545,
154 1.846574, 1.855631, 1.864717, 1.873830, 1.882972, 1.892143,
155 1.901343, 1.910572, 1.919830, 1.929117, 1.938434, 1.947781,
156 1.957158, 1.966566, 1.976004, 1.985473, 1.994972, 2.004503,
157 2.014065, 2.023659, 2.033285, 2.042943, 2.052633, 2.062355,
158 2.072110, 2.081899, 2.091720, 2.101575, 2.111464, 2.121386,
159 2.131343, 2.141334, 2.151360, 2.161421, 2.171517, 2.181648,
160 2.191815, 2.202018, 2.212257, 2.222533, 2.232845, 2.243195,
161 2.253582, 2.264006, 2.274468, 2.284968, 2.295507, 2.306084,
162 2.316701, 2.327356, 2.338051, 2.348786, 2.359562, 2.370377,
163 2.381234, 2.392131, 2.403070, 2.414051, 2.425073, 2.436138,
164 2.447246, 2.458397, 2.469591, 2.480828, 2.492110, 2.503436,
165 2.514807, 2.526222, 2.537684, 2.549190, 2.560743, 2.572343,
166 2.583989, 2.595682, 2.607423, 2.619212, 2.631050, 2.642936,
167 2.654871, 2.666855, 2.678890, 2.690975, 2.703110, 2.715297,
168 2.727535, 2.739825, 2.752168, 2.764563, 2.777012, 2.789514,
169 2.802070, 2.814681, 2.827347, 2.840069, 2.852846, 2.865680,
170 2.878570, 2.891518, 2.904524, 2.917588, 2.930712, 2.943894,
171 2.957136, 2.970439, 2.983802, 2.997227, 3.010714, 3.024263,
172 3.037875, 3.051551, 3.065290, 3.079095, 3.092965, 3.106900,
173 3.120902, 3.134971, 3.149107, 3.163312, 3.177585, 3.191928,
174 3.206340, 3.220824, 3.235378, 3.250005, 3.264704, 3.279477,
175 3.294323, 3.309244, 3.324240, 3.339312, 3.354461, 3.369687,
176 3.384992, 3.400375, 3.415838, 3.431381, 3.447005, 3.462711,
177 3.478500, 3.494372, 3.510328, 3.526370, 3.542497, 3.558711,
178 3.575012, 3.591402, 3.607881, 3.624450, 3.641111, 3.657863,
179 3.674708, 3.691646, 3.708680, 3.725809, 3.743034, 3.760357,
180 3.777779, 3.795300, 3.812921, 3.830645, 3.848470, 3.866400,
181 3.884434, 3.902574, 3.920821, 3.939176, 3.957640, 3.976215,
182 3.994901, 4.013699, 4.032612, 4.051639, 4.070783, 4.090045,
183 4.109425, 4.128925, 4.148547, 4.168292, 4.188160, 4.208154,
184 4.228275, 4.248524, 4.268903, 4.289413, 4.310056, 4.330832,
185 4.351745, 4.372794, 4.393982, 4.415310, 4.436781, 4.458395,
186 4.480154, 4.502060, 4.524114, 4.546319, 4.568676, 4.591187,
187 4.613854, 4.636678, 4.659662, 4.682807, 4.706116, 4.729590,
188 4.753231, 4.777041, 4.801024, 4.825179, 4.849511, 4.874020,
189 4.898710, 4.923582, 4.948639, 4.973883, 4.999316, 5.024942,
190 5.050761, 5.076778, 5.102993, 5.129411, 5.156034, 5.182864,
191 5.209903, 5.237156, 5.264625, 5.292312, 5.320220, 5.348354,
192 5.376714, 5.405306, 5.434131, 5.463193, 5.492496, 5.522042,
193 5.551836, 5.581880, 5.612178, 5.642734, 5.673552, 5.704634,
194 5.735986, 5.767610, 5.799512, 5.831694, 5.864161, 5.896918,
195 5.929968, 5.963316, 5.996967, 6.030925, 6.065194, 6.099780,
196 6.134687, 6.169921, 6.205486, 6.241387, 6.277630, 6.314220,
197 6.351163, 6.388465, 6.426130, 6.464166, 6.502578, 6.541371,
198 6.580553, 6.620130, 6.660109, 6.700495, 6.741297, 6.782520,
199 6.824173, 6.866262, 6.908795, 6.951780, 6.995225, 7.039137,
200 7.083525, 7.128398, 7.173764, 7.219632, 7.266011, 7.312910,
201 7.360339, 7.408308, 7.456827, 7.505905, 7.555554, 7.605785,
202 7.656608, 7.708035, 7.760077, 7.812747, 7.866057, 7.920019,
203 7.974647, 8.029953, 8.085952, 8.142657, 8.200083, 8.258245,
204 8.317158, 8.376837, 8.437300, 8.498562, 8.560641, 8.623554,
205 8.687319, 8.751955, 8.817481, 8.883916, 8.951282, 9.019600,
206 9.088889, 9.159174, 9.230477, 9.302822, 9.376233, 9.450735,
207 9.526355, 9.603118, 9.681054, 9.760191, 9.840558, 9.922186,
208 10.005107, 10.089353, 10.174959, 10.261958, 10.350389, 10.440287,
209 10.531693, 10.624646, 10.719188, 10.815362, 10.913214, 11.012789,
210 11.114137, 11.217307, 11.322352, 11.429325, 11.538283, 11.649285,
211 11.762390, 11.877664, 11.995170, 12.114979, 12.237161, 12.361791,
212 12.488946, 12.618708, 12.751161, 12.886394, 13.024498, 13.165570,
213 13.309711, 13.457026, 13.607625, 13.761625, 13.919145, 14.080314,
214 14.245263, 14.414134, 14.587072, 14.764233, 14.945778, 15.131877,
215 15.322712, 15.518470, 15.719353, 15.925570, 16.137345, 16.354912,
216 16.578520, 16.808433, 17.044929, 17.288305, 17.538873, 17.796967,
217 18.062943, 18.337176, 18.620068, 18.912049, 19.213574, 19.525133,
218 19.847249, 20.180480, 20.525429, 20.882738, 21.253102, 21.637266,
219 22.036036, 22.450278, 22.880933, 23.329017, 23.795634, 24.281981,
220 24.789364, 25.319207, 25.873062, 26.452634, 27.059789, 27.696581,
221 28.365274, 29.068370, 29.808638, 30.589157, 31.413354, 32.285060,
222 33.208568, 34.188705, 35.230920, 36.341388, 37.527131, 38.796172,
223 40.157721, 41.622399, 43.202525, 44.912465, 46.769077, 48.792279,
224 51.005773, 53.437996, 56.123356, 59.103894};
225
226 if (z <= 0) {
227 // @TODO: Is using max OK?
228 return -std::numeric_limits<scalar_type>::max();
229 }
230 if (z >= 1) {
231 return std::numeric_limits<scalar_type>::max();
232 }
233
234 double ranlan = 0.;
235 double u = 0.;
236 double v = 0.;
237 u = 1000. * z;
238 auto k = static_cast<int>(u);
239 u -= static_cast<double>(k);
240 if (k >= 70 && k < 800) {
241 auto i{static_cast<std::size_t>(k)};
242 ranlan = f[i - 1] + u * (f[i] - f[i - 1]);
243 } else if (k >= 7 && k <= 980) {
244 auto i{static_cast<std::size_t>(k)};
245 ranlan = f[i - 1] +
246 u * (f[i] - f[i - 1] -
247 0.25 * (1 - u) * (f[i + 1] - f[i] - f[i - 1] + f[i - 2]));
248 } else if (k < 7) {
249 v = math::log(z);
250 u = 1 / v;
251 ranlan = ((0.99858950 + (3.45213058E1 + 1.70854528E1 * u) * u) /
252 (1. + (3.41760202E1 + 4.01244582 * u) * u)) *
253 (-math::log(-0.91893853 - v) - 1);
254 } else {
255 u = 1 - z;
256 v = u * u;
257 if (z <= 0.999) {
258 ranlan = (1.00060006 + 2.63991156E2 * u + 4.37320068E3 * v) /
259 ((1. + 2.57368075E2 * u + 3.41448018E3 * v) * u);
260 } else {
261 ranlan = (1.00001538 + 6.07514119E3 * u + 7.34266409E5 * v) /
262 ((1. + 6.06511919E3 * u + 6.94021044E5 * v) * u);
263 }
264 }
265 return static_cast<scalar_type>(ranlan);
266 }
267};
268
269} // namespace detray
Landau distribution based on CERNLIB G110 Computer Physics Communications 31(1984) 97—111).
Definition landau_distribution.hpp:25
scalar_type operator()(generator_t &generator, const scalar_type location, const scalar_type scale) const
Generate a random number following a Landau distribution with location parameter mu and scale paramet...
Definition landau_distribution.hpp:49
scalar_t scalar_type
Scalar type used for the distribution parameters and result.
Definition landau_distribution.hpp:28
constexpr double u
atomic mass unit u
Definition Units.hpp:155
Detray include(s).
Definition array_operators.hpp:18
std::array< value_t, kDIM > darray
Fixed-size array container.
Definition containers.hpp:30