Geant4-11
G4SPSEneDistribution.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// G4SPSEneDistribution
27//
28// Class Description:
29//
30// To generate the energy of a primary vertex according to the
31// 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
35// care that only one thread is executing them.
36// In addition take care of calling these methods before the run is
37// started. Do not use the 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// - 26/03/2014, Andrew Green.
45// Modification to use STL vectors instead of C-style arrays.
46// Also moved to dynamically allocated memory in the LinearInterpolation(),
47// ExpInterpolation() and LogInterpolation() functions.
48// - 06/06/2014, Andrea Dotti.
49// For thread safety: this is a shared object.
50// Added mutex to control access to shared resources (data members).
51// in Getters and Setters, mutex is NOT used in GenerateOne() because it
52// is assumed that properties are not changed during event loop.
53// - 24/11/2017, Fan Lei
54// Added cutoff power-law distribution option. Implementation is similar
55// to that of the BlackBody one.
56// --------------------------------------------------------------------
57#ifndef G4SPSEneDistribution_hh
58#define G4SPSEneDistribution_hh 1
59
61#include "G4ParticleMomentum.hh"
64#include "G4Threading.hh"
65#include "G4Cache.hh"
66#include <vector>
67
69
71{
72 public:
73
75 // Constructor: initializes variables
77 // Destructor
78
79 void SetEnergyDisType(const G4String&);
80 // Allows the user to choose the energy distribution type.
81 // The arguments are: Mono (mono-energetic), Lin (linear),
82 // Pow (power-law), Exp (exponential), Gauss (gaussian),
83 // Brem (bremsstrahlung), BBody (black-body),
84 // Cdg (cosmic diffuse gamma-ray), User (user-defined),
85 // Arb (arbitrary point-wise), Epn (energy per nucleon)
86
88
89 void SetEmin(G4double);
90 // Sets the minimum energy
91
92 G4double GetEmin() const;
94
95 void SetEmax(G4double);
96 // Sets the maximum energy
97
98 G4double GetEmax() const;
100
102 // Sets energy for mono-energetic distribution
103
104 void SetAlpha(G4double);
105 // Sets alpha for a power-law distribution
106
108
109 void SetTemp(G4double);
110 // Sets Temperature for a Brem or BBody distributions
111
113
114 void SetEzero(G4double);
115 // Sets Ezero for an exponential distribution
116
117 void SetGradient(G4double);
118 // Sets gradient for a linear distribution
119
121 // Sets intercept for a linear distribution
122
123 void UserEnergyHisto(const G4ThreeVector&);
124 // Allows user to defined a histogram for the energy distribution
125
126 void ArbEnergyHisto(const G4ThreeVector&);
127 // Allows the user to define an Arbitrary set of points for the
128 // energy distribution
129
130 void ArbEnergyHistoFile(const G4String&);
131
132 void EpnEnergyHisto(const G4ThreeVector&);
133 // Allows the user to define an Energy per nucleon histogram
134
136 // Allows the user to choose between momentum and energy histograms
137 // for user-defined histograms and arbitrary point-wise spectra.
138 // The default is true (energy)
139
141 // Allows the user to choose between integral and differential
142 // distributions when using the arbitrary point-wise option
143
144 void ArbInterpolate(const G4String&);
145 // Allows the user to specify the type of function to
146 // interpolate the Arbitrary points spectrum with
147
148 const G4String& GetIntType();
149
150 void Calculate();
151 // Controls the calculation of Integral PDF for the Cdg and BBody
152 // distributions
153
155 // Sets the biased random number generator
156
157 void ReSetHist(const G4String&);
158 // Resets the histogram for user defined distribution
159
160 void SetVerbosity(G4int a);
161 // Sets the verbosity level
162
163 G4double GetWeight() const;
164
166 // Mono-energetic energy
167
168 G4double GetSE();
169 // Standard deviation for Gaussian distribution in energy
170
171 G4double Getalpha() const;
172 // Alpha (pow)
173
174 G4double GetEzero() const;
175 // E0 (exp)
176
178 // Temp (bbody,brem)
179
180 G4double Getgrad() const;
181 // Gradient and intercept for linear spectra
182
183 G4double Getcept() const;
184
186
188
190 // Generate one random energy for the specified particle
191
193
195
196 inline void ApplyEnergyWeight(G4bool val) { applyEvergyWeight = val; }
198
199 private:
200
201 void LinearInterpolation();
202 void LogInterpolation();
203 void ExpInterpolation();
204 void SplineInterpolation();
208
209 // The following methods generate energies according
210 // to the spectral parameters defined above
211
217 void GenerateCdgEnergies();
218 void GenUserHistEnergies();
219 void GenEpnHistEnergies();
220 void GenArbPointEnergies(); // NOTE: REQUIRES UPDATE OF DATA MEMBERS
225
226 void ConvertEPNToEnergy();
227 // Converts energy per nucleon to energy
228
229 void BBInitHists();
230 void CPInitHists();
231
232 private: // Non invariant data members become G4Cache
233
234 G4String EnergyDisType; // energy dis type Variable - Mono,Lin,Exp,etc
235 G4double weight; // particle weight //// NOT INVARIANT
236 G4double MonoEnergy; //Mono-energteic energy
237 G4double SE; // Standard deviation for Gaussian distribution in energy
238
239 G4double Emin, Emax; // emin and emax //// NOT INVARIANT
240 G4double alpha, Ezero;// alpha (pow), E0 (exp) //// NOT INVARIANT
241 G4double Temp; // Temp (bbody,brem)
242 G4double biasalpha; // biased power index
243 G4double grad, cept; // gradient and intercept for linear spectra //// NOT INVARIANT
244 G4double prob_norm; // normalisation factor use in calculate the probability
245 G4bool Biased = false; // biased to power-law
246 G4bool EnergySpec = true; // energy spectra, false - momentum spectra
247 G4bool DiffSpec = true; // differential spec, false integral spec
248
249 G4PhysicsFreeVector UDefEnergyH; // energy hist data
251 G4bool IPDFEnergyExist = false, IPDFArbExist = false, Epnflag = false;
252 G4PhysicsFreeVector ArbEnergyH; // Arb x,y histogram
255 G4double CDGhist[3]; // cumulative histo for cdg
256
257 std::vector<G4double>* BBHist = nullptr;
258 std::vector<G4double>* Bbody_x = nullptr;
261
262 // For cutoff power-law
263 //
264 std::vector<G4double>* CPHist = nullptr;
265 std::vector<G4double>* CP_x = nullptr;
268
269 G4String IntType; // Interpolation type
270 G4double* Arb_grad = nullptr;
271 G4double* Arb_cept = nullptr;
273 G4double* Arb_alpha = nullptr;
274 G4double* Arb_Const = nullptr;
276 G4double* Arb_ezero = nullptr;
278
280
282 // Emin and Emax for the whole arb distribution used primarily for debug.
283
285
287
289
291
292 std::vector<G4DataInterpolation*> SplineInt;
293 // Holds Spline stuff required for sampling
295 // Holds a temp Spline used for calculating area
296
297 G4Mutex mutex; // protect access to shared resources
298
299 // Thread local data (non-invariant during event loop).
300 // These are copied from master one at the beginning of
301 // generation of each event
302 //
304 {
314 };
316};
317
318#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
G4double GetProbability(G4double)
G4double GetArbEneWeight(G4double)
G4double GenerateOne(G4ParticleDefinition *)
G4Cache< threadLocal_t > threadLocalData
void ArbInterpolate(const G4String &)
G4PhysicsFreeVector GetUserDefinedEnergyHisto()
G4PhysicsFreeVector IPDFArbEnergyH
const G4String & GetEnergyDisType()
std::vector< G4DataInterpolation * > SplineInt
G4SPSRandomGenerator * eneRndm
G4PhysicsFreeVector ArbEnergyH
void SetEnergyDisType(const G4String &)
G4PhysicsFreeVector IPDFEnergyH
void EpnEnergyHisto(const G4ThreeVector &)
void ArbEnergyHistoFile(const G4String &)
std::vector< G4double > * CPHist
G4bool IfApplyEnergyWeight() const
void ReSetHist(const G4String &)
void InputDifferentialSpectra(G4bool)
G4DataInterpolation * Splinetemp
G4PhysicsFreeVector GetArbEnergyHisto()
std::vector< G4double > * Bbody_x
void SetBiasRndm(G4SPSRandomGenerator *a)
G4PhysicsFreeVector EpnEnergyH
void ApplyEnergyWeight(G4bool val)
std::vector< G4double > * BBHist
const G4String & GetIntType()
void UserEnergyHisto(const G4ThreeVector &)
G4PhysicsFreeVector UDefEnergyH
G4PhysicsFreeVector ZeroPhysVector
void ArbEnergyHisto(const G4ThreeVector &)
std::vector< G4double > * CP_x