Geant4 11.1.1
Toolkit for the simulation of the passage of particles through matter
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
G4SPSPosDistribution.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// G4SPSPosDistribution
27//
28// Class Description:
29//
30// To generate the position of a primary vertex according to
31// the defined distribution. This is a shared class between threads.
32// Only one thread should use the set-methods here.
33// Note that this is exactly what is achieved using UI commands.
34// If you use the set methods to set defaults in your application take care
35// that only one thread is executing them.
36// In addition take care of calling these methods before the run is started
37// Do not use these setters during the event loop
38
39// Author: Fan Lei, QinetiQ ltd.
40// Customer: ESA/ESTEC
41// History:
42// - 05/02/2004, Fan Lei, Created.
43// Based on the G4GeneralParticleSource class.
44// - 06/06/2014, Andrea Dotti
45// Added mutex to control access to shared resources (data members).
46// In Getters and Setters, mutex is NOT used in GenerateOne because
47// it is assumed that properties are not changed during event loop.
48// - 13/02/2017, Maxime Chauvin
49// Added surface and volume shape "EllipticCylinder"
50// --------------------------------------------------------------------
51#ifndef G4SPSPosDistribution_hh
52#define G4SPSPosDistribution_hh 1
53
54#include "G4Navigator.hh"
56#include "G4Threading.hh"
57#include "G4Cache.hh"
58
60{
61 public:
62
64 // Constructor: initializes data and instantiates the Navigator class
65
67 // Destructor
68
69 // Methods to create source position dist
70
71 void SetPosDisType(const G4String&);
72 // Allows user to choose Point, Plane, Surface or Volume source
73 // position distributions
74
75 void SetPosDisShape(const G4String&);
76 // Allows the user to choose the particular shape they wish for the
77 // position distribution. Choices are: Square, Circle, Ellipse,
78 // Rectangle, Sphere, Ellipsoid, Cylinder, Parallelepiped
79
80 void SetCentreCoords(const G4ThreeVector&);
81 // Sets the coordinates of the centre of the position distribution
82
83 void SetPosRot1(const G4ThreeVector&);
84 // Used to specify the coordinate system for the position distribution
85 // along with SetPosRot2. Sets the vector x' and need not be a unit vector
86
87 void SetPosRot2(const G4ThreeVector&);
88 // Used in connection with SetPosRot1. This sets a vector in the plane
89 // x'y'. By a series of cross products x', y', z' are generated. Again
90 // need not be a unit vector
91
92 void SetHalfX(G4double);
93 // Sets the half length in x
94
95 void SetHalfY(G4double);
96 // Sets the half length in y
97
98 void SetHalfZ(G4double);
99 // Sets the half length in z
100
101 void SetRadius(G4double);
102 // Sets the radius where appropriate for source distribution shapes
103
104 void SetRadius0(G4double);
105 // Sets the inner radius where appropriate for source distribution shapes
106
108 // Sets the sigma for 1D beam
109
111 // Sets the first sigma for 2D beam
112
114 // Sets the second sigma for 2D beam
115
116 void SetParAlpha(G4double);
117 // Sets the angle Alpha in the Parallelepiped shapes
118
119 void SetParTheta(G4double);
120 // Sets the angle Theta in the Parallelepiped shapes
121
122 void SetParPhi(G4double);
123 // Sets the angle Phi in the Parallelepiped shapes
124
125 void ConfineSourceToVolume(const G4String&);
126 // Used to confine the start positions to a particular volume
127
129 // Sets the biased random number generator
130
131 void SetVerbosity(G4int a);
132 // Sets the verbosity level
133
135 // Generate one random position
136
137 const G4String& GetPosDisType() const;
138 const G4String& GetPosDisShape() const;
139 const G4ThreeVector& GetCentreCoords() const;
140 G4double GetHalfX() const;
141 G4double GetHalfY() const;
142 G4double GetHalfZ() const;
143 G4double GetRadius() const;
144 inline G4double GetRadius0() const { return Radius0; }
145 inline G4double GetParAlpha() const { return ParAlpha; }
146 inline G4double GetParTheta() const { return ParTheta; }
147 inline G4double GetParPhi() const { return ParPhi; }
148 inline const G4ThreeVector& GetRotx() const { return Rotx; }
149 inline const G4ThreeVector& GetRoty() const { return Roty; }
150 inline const G4ThreeVector& GetRotz() const { return Rotz; }
151 inline G4bool GetConfined() const { return Confine; }
152 inline const G4String& GetConfineVolume() const { return VolName; }
153
154 const G4ThreeVector& GetSideRefVec1() const;
155 const G4ThreeVector& GetSideRefVec2() const;
156 const G4ThreeVector& GetSideRefVec3() const;
157 const G4String& GetSourcePosType() const;
158 const G4ThreeVector& GetParticlePos() const;
159
160 private:
161
162 void GenerateRotationMatrices();
163
164 // The following functions generate the source position
165 //
166 void GeneratePointSource(G4ThreeVector& outoutPos);
167 void GeneratePointsInBeam(G4ThreeVector& outoutPos);
168 void GeneratePointsInPlane(G4ThreeVector& outoutPos);
169 void GeneratePointsOnSurface(G4ThreeVector& outputPos);
170 void GeneratePointsInVolume(G4ThreeVector& outputPos);
171
172 G4bool IsSourceConfined(G4ThreeVector& outputPos);
173
174 private:
175
176 // NOTE:
177 // This is a shared resource, however setters that
178 // changes the parameters via UI commands are by design
179 // thread-safe because only one thread will call these methods
180 // See G4GeneralParticleSourceMessenger constructor for an explanation
181 //
182 struct thread_data_t // Caching of some data
183 {
184 G4ThreeVector CSideRefVec1;
185 G4ThreeVector CSideRefVec2;
186 G4ThreeVector CSideRefVec3;
187 G4ThreeVector CParticlePos;
188 thread_data_t();
189 };
190
191 G4String SourcePosType;
192 // Point, Plane, Surface, Volume
193 G4String Shape;
194 // Circle, Square, Rectangle, etc...
195 G4ThreeVector CentreCoords;
196 // Coordinates of centre of input shape
197 G4ThreeVector Rotx, Roty, Rotz;
198 // Unit vectors defining rotation matrix
199 G4double halfx, halfy, halfz;
200 // Half lengths
201 G4double Radius;
202 // Radius for circles or spheres
203 G4double Radius0;
204 // The inner radius of an annulus
205 G4double SR, SX, SY;
206 // Standard deviation in radial, x, y for beam type source
207 G4double ParAlpha, ParTheta, ParPhi;
208 // Angle for Right Parallellepipeds
209 G4bool Confine = false;
210 // If true confines source distribution to VolName
211 G4String VolName;
212 // Volume name
213 G4int verbosityLevel;
214 // Verbosity
215 G4SPSRandomGenerator* PosRndm = nullptr;
216 // Biased random generator
217
218 G4Cache<thread_data_t> ThreadData;
219 G4Mutex a_mutex;
220};
221
222#endif
std::mutex G4Mutex
Definition: G4Threading.hh:81
double G4double
Definition: G4Types.hh:83
bool G4bool
Definition: G4Types.hh:86
int G4int
Definition: G4Types.hh:85
const G4ThreeVector & GetCentreCoords() const
G4double GetParAlpha() const
void SetPosRot2(const G4ThreeVector &)
const G4String & GetConfineVolume() const
void ConfineSourceToVolume(const G4String &)
void SetBiasRndm(G4SPSRandomGenerator *a)
const G4String & GetPosDisType() const
const G4ThreeVector & GetRotx() const
const G4ThreeVector & GetRotz() const
void SetPosDisShape(const G4String &)
const G4ThreeVector & GetParticlePos() const
void SetCentreCoords(const G4ThreeVector &)
const G4String & GetSourcePosType() const
const G4ThreeVector & GetSideRefVec2() const
const G4String & GetPosDisShape() const
const G4ThreeVector & GetSideRefVec3() const
const G4ThreeVector & GetSideRefVec1() const
void SetPosRot1(const G4ThreeVector &)
G4double GetParTheta() const
void SetPosDisType(const G4String &)
const G4ThreeVector & GetRoty() const