Garfield++ v2r0
A toolkit for the detailed simulation of particle detectors based on ionisation measurement in gases and semiconductors
Loading...
Searching...
No Matches
Garfield Namespace Reference

Namespaces

namespace  Magboltz
 
namespace  Numerics
 Collection of numerical routines.
 

Classes

class  AvalancheMC
 
class  AvalancheMicroscopic
 Calculate electron drift lines and avalanches using microscopic tracking. More...
 
class  ComponentAnalyticField
 
class  ComponentAnsys121
 Component for importing and interpolating two-dimensional ANSYS field maps. More...
 
class  ComponentAnsys123
 Component for importing and interpolating two-dimensional ANSYS field maps. More...
 
class  ComponentBase
 Abstract base class for components. More...
 
class  ComponentComsol
 Component for importing and interpolating Comsol field maps. More...
 
class  ComponentConstant
 Component with constant electric field. More...
 
class  ComponentCST
 
class  ComponentElmer
 Component for importing field maps computed by Elmer. More...
 
class  ComponentFieldMap
 Base class for components based on finite-element field maps. More...
 
class  ComponentNeBem2d
 Two-dimensional implementation of the nearly exact Boundary Element Method. More...
 
class  ComponentTcad2d
 Interpolation in a two-dimensional field map created by Sentaurus Device. More...
 
class  ComponentTcad3d
 Interpolation in a three-dimensional field map created by Sentaurus Device. More...
 
class  ComponentUser
 Simple component with electric field given by a user function. More...
 
class  ComponentUserMapBase
 
class  ComponentVoxel
 Component for interpolating field maps stored in a regular mesh. More...
 
class  DriftLineRKF
 
class  GeometryBase
 Abstract base class for geometry classes. More...
 
class  GeometryRoot
 Use a geometry defined using the ROOT TGeo package. More...
 
class  GeometrySimple
 "Native" geometry, using simple shapes. More...
 
class  HeedChamber
 
class  Medium
 Abstract base class for media. More...
 
class  MediumCdTe
 Cadmium-Telluride. More...
 
class  MediumConductor
 Conducting medium. More...
 
class  MediumGaAs
 Gallium-Arsenide. More...
 
class  MediumGas
 Base class for gas media. More...
 
class  MediumMagboltz
 
class  MediumPlastic
 Plastic medium. More...
 
class  MediumSilicon
 Solid crystalline silicon More...
 
class  OpticalData
 Photoabsorption cross-sections for some gases. More...
 
class  PlottingEngine
 Abstract base class for plotting engines. More...
 
class  PlottingEngineRoot
 Definition of styles and color schemes. More...
 
struct  PolygonInfo
 Helper struct for drawing the mesh with ViewFEMesh. More...
 
class  RandomEngine
 Abstract base class for random number generators. More...
 
class  RandomEngineRoot
 ROOT random number generator. More...
 
class  Sensor
 Sensor More...
 
class  Solid
 Abstract base class for solids. More...
 
class  SolidBox
 Box. More...
 
class  SolidSphere
 Sphere. More...
 
class  SolidTube
 Cylindrical tube. More...
 
class  TetrahedralTree
 Helper class for searches in field maps. More...
 
class  Track
 Abstract base class for track generation. More...
 
class  TrackBichsel
 
class  TrackElectron
 Ionization calculation based on MIP program (S. Biagi). More...
 
class  TrackHeed
 Generate tracks using Heed++. More...
 
class  TrackPAI
 Energy loss calculation using the Photoabsorption-Ionisation Model. More...
 
class  TrackSimple
 Generate tracks based on a cluster density given by the user. More...
 
class  TrackSrim
 
struct  Vec3
 
class  ViewCell
 Visualize the "cell" defined in an analytic-field component. More...
 
class  ViewDrift
 Visualize drift lines and tracks. More...
 
class  ViewFEMesh
 Draw the mesh of a field-map component. More...
 
class  ViewField
 Visualize the potential or electric field of a component or sensor. More...
 
class  ViewGeometry
 Visualize a geometry defined using the "native" shapes. More...
 
class  ViewMedium
 Plot transport coefficients as function of electric and magnetic field. More...
 
class  ViewSignal
 Plot the signal computed by a sensor as a ROOT histogram. More...
 

Functions

double InterpolateBinarySearch (const std::vector< double > &x, const std::vector< double > &y, const double x0)
 
double RndmUniform ()
 Draw a random number uniformly distributed in the range [0, 1).
 
double RndmUniformPos ()
 Draw a random number uniformly distributed in the range (0, 1).
 
double RndmGaussian ()
 Draw a Gaussian random variate with mean zero and standard deviation one.
 
double RndmGaussian (const double mu, const double sigma)
 Draw a Gaussian random variate with mean mu and standard deviation sigma.
 
double RndmLorentzian (const double mu, const double gamma)
 
double RndmVoigt (const double mu, const double sigma, const double gamma)
 
double RndmPolya (const double theta)
 Draw a Polya distributed random number.
 
double RndmLandau ()
 Draw a random number from a Landau distribution.
 
double RndmVavilov (const double rkappa, const double beta2)
 Draw a random number from a Vavilov distribution.
 
double RndmHeedWF (const double w, const double f)
 
void RndmDirection (double &dx, double &dy, double &dz, const double length=1.)
 Draw a random (isotropic) direction vector.
 
bool ends_with (std::string s, std::string t)
 
int readInt (std::string s)
 

Variables

PlottingEngineRoot plottingEngine
 
RandomEngineRoot randomEngine
 Random number generator.
 

Function Documentation

◆ ends_with()

bool Garfield::ends_with ( std::string  s,
std::string  t 
)

Definition at line 27 of file ComponentComsol.cc.

27 {
28 return s.size() >= t.size() && s.substr(s.size() - t.size(), t.size()) == t;
29}

Referenced by Garfield::ComponentComsol::Initialise().

◆ InterpolateBinarySearch()

double Garfield::InterpolateBinarySearch ( const std::vector< double > &  x,
const std::vector< double > &  y,
const double  x0 
)
inline

Definition at line 92 of file Numerics.hh.

94 {
95
96 int iLow = 0;
97 int iUp = x.size() - 1;
98 while (iUp - iLow > 1) {
99 const int iM = (iUp + iLow) >> 1;
100 if (x0 >= x[iM]) {
101 iLow = iM;
102 } else {
103 iUp = iM;
104 }
105 }
106 // Linear interpolation.
107 return y[iLow] + (x0 - x[iLow]) * (y[iUp] - y[iLow]) / (x[iUp] - x[iLow]);
108}

◆ readInt()

int Garfield::readInt ( std::string  s)

Definition at line 31 of file ComponentComsol.cc.

31 {
32 std::istringstream iss(s);
33 int ret;
34 iss >> ret;
35 return ret;
36}

Referenced by Garfield::ComponentComsol::Initialise().

◆ RndmDirection()

void Garfield::RndmDirection ( double &  dx,
double &  dy,
double &  dz,
const double  length = 1. 
)

Draw a random (isotropic) direction vector.

Definition at line 106 of file Random.hh.

107 {
108
109 const double phi = TwoPi * RndmUniform();
110 const double ctheta = 2 * RndmUniform() - 1.;
111 const double stheta = sqrt(1. - ctheta * ctheta);
112 dx = length * cos(phi) * stheta;
113 dy = length * sin(phi) * stheta;
114 dz = length * ctheta;
115}
double RndmUniform()
Draw a random number uniformly distributed in the range [0, 1).
Definition: Random.hh:14

Referenced by Garfield::Medium::GetElectronCollision(), Garfield::MediumSilicon::GetElectronCollision(), Garfield::Medium::GetElectronMomentum(), Garfield::MediumSilicon::GetElectronMomentum(), Garfield::TrackBichsel::NewTrack(), Garfield::TrackHeed::NewTrack(), Garfield::TrackPAI::NewTrack(), Garfield::TrackSimple::NewTrack(), Garfield::TrackSrim::NewTrack(), Garfield::TrackHeed::TransportDeltaElectron(), and Garfield::TrackHeed::TransportPhoton().

◆ RndmGaussian() [1/2]

double Garfield::RndmGaussian ( )
inline

Draw a Gaussian random variate with mean zero and standard deviation one.

Definition at line 25 of file Random.hh.

25 {
26
27 static bool cached = false;
28 static double u = 0.;
29 if (cached) {
30 cached = false;
31 return u;
32 }
33 // Box-Muller algorithm
34 u = 2. * RndmUniform() - 1.;
35 double v = 2. * RndmUniform() - 1.;
36 double r2 = u * u + v * v;
37 while (r2 > 1.) {
38 u = 2. * RndmUniform() - 1.;
39 v = 2. * RndmUniform() - 1.;
40 r2 = u * u + v * v;
41 }
42 const double p = sqrt(-2. * log(r2) / r2);
43 u *= p;
44 cached = true;
45 return v * p;
46}
DoubleAc sqrt(const DoubleAc &f)
Definition: DoubleAc.cpp:314

Referenced by Garfield::TrackSrim::NewTrack(), Garfield::TrackSrim::RndmEnergyLoss(), RndmGaussian(), RndmVoigt(), and Heed::rnorm_improved().

◆ RndmGaussian() [2/2]

double Garfield::RndmGaussian ( const double  mu,
const double  sigma 
)
inline

Draw a Gaussian random variate with mean mu and standard deviation sigma.

Definition at line 49 of file Random.hh.

49 {
50
51 return mu + sigma * RndmGaussian();
52}
double RndmGaussian()
Draw a Gaussian random variate with mean zero and standard deviation one.
Definition: Random.hh:25

◆ RndmHeedWF()

double Garfield::RndmHeedWF ( const double  w,
const double  f 
)

Definition at line 659 of file Random.cc.

659 {
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}
DoubleAc pow(const DoubleAc &f, double p)
Definition: DoubleAc.cpp:337

Referenced by Garfield::TrackSrim::NewTrack().

◆ RndmLandau()

double Garfield::RndmLandau ( )

Draw a random number from a Landau distribution.

Definition at line 87 of file Random.cc.

87 {
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}

Referenced by Garfield::TrackSrim::RndmEnergyLoss().

◆ RndmLorentzian()

double Garfield::RndmLorentzian ( const double  mu,
const double  gamma 
)
inline

Draw a Lorentzian random variate with mean mu and half-width at half maximum gamma.

Definition at line 56 of file Random.hh.

56 {
57
58 return mu + gamma * tan(Pi * (RndmUniform() - 0.5));
59}

Referenced by RndmVoigt().

◆ RndmPolya()

double Garfield::RndmPolya ( const double  theta)
inline

Draw a Polya distributed random number.

Definition at line 75 of file Random.hh.

75 {
76
77 // Algorithm from Review of Particle Physics
78 // C. Amsler et al, Phys. Lett. B 667 (2008)
79 if (theta <= 0.) return -log(RndmUniformPos());
80 const double c = 3 * (theta + 1.) - 0.75;
81 double u1, u2, v1, v2, v3;
82 double x;
83 while (1) {
84 u1 = RndmUniformPos();
85 v1 = u1 * (1. - u1);
86 if (v1 == 0.) continue;
87 v2 = (u1 - 0.5) * sqrt(c / v1);
88 x = theta + v2;
89 if (x <= 0.) continue;
90 u2 = RndmUniformPos();
91 v3 = 64 * u2 * u2 * pow(v1, 3);
92 if (v3 <= 1. - 2 * v2 * v2 / x ||
93 log(v3) <= 2 * (theta * log(x / theta) - v2)) {
94 return x / (theta + 1.);
95 }
96 }
97}
double RndmUniformPos()
Draw a random number uniformly distributed in the range (0, 1).
Definition: Random.hh:17

◆ RndmUniform()

◆ RndmUniformPos()

double Garfield::RndmUniformPos ( )
inline

Draw a random number uniformly distributed in the range (0, 1).

Definition at line 17 of file Random.hh.

17 {
18
19 double r = RndmUniform();
20 while (r <= 0.) r = RndmUniform();
21 return r;
22}

Referenced by Garfield::MediumSilicon::ComputeSecondaries(), Garfield::TrackBichsel::GetCluster(), Garfield::TrackSimple::GetCluster(), Garfield::TrackElectron::GetCluster(), Garfield::TrackPAI::GetCluster(), Garfield::MediumMagboltz::GetElectronCollision(), RndmLandau(), and RndmPolya().

◆ RndmVavilov()

double Garfield::RndmVavilov ( const double  rkappa,
const double  beta2 
)

Draw a random number from a Vavilov distribution.

Definition at line 283 of file Random.cc.

283 {
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}
DoubleAc exp(const DoubleAc &f)
Definition: DoubleAc.cpp:377

Referenced by Garfield::TrackSrim::RndmEnergyLoss().

◆ RndmVoigt()

double Garfield::RndmVoigt ( const double  mu,
const double  sigma,
const double  gamma 
)
inline

Draw a random number according to a Voigt function with mean mu. The Voigt function is a convolution of a Gaussian (standard deviation sigma) and a Lorentzian (half width gamma).

Definition at line 65 of file Random.hh.

66 {
67
68 if (sigma <= 0.) return RndmLorentzian(mu, gamma);
69 const double a = gamma / (Sqrt2 * sigma);
70 const double x = RndmLorentzian(0., a) + RndmGaussian(0., 1. / Sqrt2);
71 return mu + x * Sqrt2 * sigma;
72}
double RndmLorentzian(const double mu, const double gamma)
Definition: Random.hh:56

Variable Documentation

◆ plottingEngine

◆ randomEngine

RandomEngineRoot Garfield::randomEngine

Random number generator.

Definition at line 6 of file RandomEngineRoot.cc.

Referenced by main(), and RndmUniform().