Geant4-11
G4RandomTools.hh
Go to the documentation of this file.
1//
2// ********************************************************************
3// * License and Disclaimer *
4// * *
5// * The Geant4 software is copyright of the Copyright Holders of *
6// * the Geant4 Collaboration. It is provided under the terms and *
7// * conditions of the Geant4 Software License, included in the file *
8// * LICENSE and available at http://cern.ch/geant4/license . These *
9// * include a list of copyright holders. *
10// * *
11// * Neither the authors of this software system, nor their employing *
12// * institutes,nor the agencies providing financial support for this *
13// * work make any representation or warranty, express or implied, *
14// * regarding this software system or assume any liability for its *
15// * use. Please see the license in the file LICENSE and URL above *
16// * for the full disclaimer and the limitation of liability. *
17// * *
18// * This code implementation is the result of the scientific and *
19// * technical work of the GEANT4 collaboration. *
20// * By using, copying, modifying or distributing the software (or *
21// * any work based on the software) you agree to acknowledge its *
22// * use in resulting scientific publications, and indicate your *
23// * acceptance of all terms of the Geant4 Software license. *
24// ********************************************************************
25//
26//
27//
28//
29// ---------------------------------------------------------------------------
30// GEANT 4 class header file
31// ---------------------------------------------------------------------------
32// Class description:
33//
34// Utility functions
35
36// History:
37//
38// 24.08.17 - E.Tcherniaev, added G4RandomRadiusInRing, G4RandomPointInEllipse
39// G4RandomPointOnEllipse, G4RandomPointOnEllipsoid
40// 07.11.08 - P.Gumplinger, based on implementation in G4OpBoundaryProcess
41//
42// ---------------------------------------------------------------------------
43
44#ifndef G4RANDOMTOOLS_HH
45#define G4RANDOMTOOLS_HH
46
48
49#include "G4RandomDirection.hh"
50#include "G4ThreeVector.hh"
51#include "G4TwoVector.hh"
52#include "Randomize.hh"
53#include "globals.hh"
54
55// ---------------------------------------------------------------------------
56// Returns a random lambertian unit vector (rejection sampling)
57//
59{
60 G4ThreeVector vect;
61 G4double ndotv;
62 G4int count = 0;
63 const G4int max_trials = 1024;
64
65 do
66 {
67 ++count;
68 vect = G4RandomDirection();
69 ndotv = normal * vect;
70
71 if(ndotv < 0.0)
72 {
73 vect = -vect;
74 ndotv = -ndotv;
75 }
76
77 } while(!(G4UniformRand() < ndotv) && (count < max_trials));
78
79 return vect;
80}
81
82// ---------------------------------------------------------------------------
83// Chooses a random vector within a plane given by the unit normal
84//
86{
87 G4ThreeVector vec1 = normal.orthogonal();
88 G4ThreeVector vec2 = vec1.cross(normal);
89
91 G4double cosphi = std::cos(phi);
92 G4double sinphi = std::sin(phi);
93
94 return cosphi * vec1 + sinphi * vec2;
95}
96
97// ---------------------------------------------------------------------------
98// Returns a random radius in annular ring
99//
101{
102 if(rmin == rmax)
103 {
104 return rmin;
105 }
107 return (rmin <= 0) ? rmax * std::sqrt(k)
108 : std::sqrt(k * rmax * rmax + (1. - k) * rmin * rmin);
109}
110
111// ---------------------------------------------------------------------------
112// Returns a random point in ellipse (x/a)^2 + (y/b)^2 = 1
113// (rejection sampling)
114//
116{
117 G4double aa = (a * a == 0) ? 0 : 1 / (a * a);
118 G4double bb = (b * b == 0) ? 0 : 1 / (b * b);
119 for(G4int i = 0; i < 1000; ++i)
120 {
121 G4double x = a * (2 * G4UniformRand() - 1);
122 G4double y = b * (2 * G4UniformRand() - 1);
123 if(x * x * aa + y * y * bb <= 1)
124 return G4TwoVector(x, y);
125 }
126 return G4TwoVector(0, 0);
127}
128
129// ---------------------------------------------------------------------------
130// Returns a random point on ellipse (x/a)^2 + (y/b)^2 = 1
131// (rejection sampling)
132//
134{
135 G4double A = std::abs(a);
136 G4double B = std::abs(b);
137 G4double mu_max = std::max(A, B);
138
139 G4double x, y;
140 for(G4int i = 0; i < 1000; ++i)
141 {
143 x = std::cos(phi);
144 y = std::sin(phi);
145 G4double mu = std::sqrt((B * x) * (B * x) + (A * y) * (A * y));
146 if(mu_max * G4UniformRand() <= mu)
147 break;
148 }
149 return G4TwoVector(A * x, B * y);
150}
151
152// ---------------------------------------------------------------------------
153// Returns a random point on ellipsoid (x/a)^2 + (y/b)^2 + (z/c)^2 = 1
154// (rejection sampling)
155//
157 G4double c)
158{
159 G4double A = std::abs(a);
160 G4double B = std::abs(b);
161 G4double C = std::abs(c);
162 G4double mu_max = std::max(std::max(A * B, A * C), B * C);
163
165 for(G4int i = 0; i < 1000; ++i)
166 {
167 p = G4RandomDirection();
168 G4double xbc = p.x() * B * C;
169 G4double yac = p.y() * A * C;
170 G4double zab = p.z() * A * B;
171 G4double mu = std::sqrt(xbc * xbc + yac * yac + zab * zab);
172 if(mu_max * G4UniformRand() <= mu)
173 break;
174 }
175 return G4ThreeVector(A * p.x(), B * p.y(), C * p.z());
176}
177
178#endif /* G4RANDOMTOOLS_HH */
G4double C(G4double temp)
G4double B(G4double temperature)
G4ThreeVector G4RandomDirection()
G4double G4RandomRadiusInRing(G4double rmin, G4double rmax)
G4ThreeVector G4LambertianRand(const G4ThreeVector &normal)
G4ThreeVector G4PlaneVectorRand(const G4ThreeVector &normal)
G4TwoVector G4RandomPointInEllipse(G4double a, G4double b)
G4TwoVector G4RandomPointOnEllipse(G4double a, G4double b)
G4ThreeVector G4RandomPointOnEllipsoid(G4double a, G4double b, G4double c)
CLHEP::Hep3Vector G4ThreeVector
CLHEP::Hep2Vector G4TwoVector
Definition: G4TwoVector.hh:36
double G4double
Definition: G4Types.hh:83
int G4int
Definition: G4Types.hh:85
const G4double A[17]
#define G4UniformRand()
Definition: Randomize.hh:52
double z() const
double x() const
double y() const
Hep3Vector cross(const Hep3Vector &) const
static constexpr double twopi
Definition: SystemOfUnits.h:56
static double normal(HepRandomEngine *eptr)
Definition: RandPoisson.cc:79
T max(const T t1, const T t2)
brief Return the largest of the two arguments