2 #ifndef GAUDIKERNEL_RNDMGENGENERATORS_H
3 #define GAUDIKERNEL_RNDMGENGENERATORS_H
9 #include "GaudiKernel/IRndmGen.h"
10 #include "GaudiKernel/SmartIF.h"
18 template <
class TYPE>
class Generator;
25 friend class Generator<Gauss>;
32 Gauss(
double m,
double s)
33 :
IRndmGen::Param(IID_IRndmGauss), m_mean(m), m_sigma(s) { }
37 double mean()
const {
return m_mean; }
39 double sigma()
const {
return m_sigma; }
41 static const InterfaceID& typeID() {
return IID_IRndmGauss; }
44 return new Gauss(m_mean, m_sigma);
57 :
IRndmGen::Param(IID_IRndmExponential), m_mean(m) { }
59 virtual ~Exponential() { }
61 double mean()
const {
return m_mean; }
63 static const InterfaceID& typeID() {
return IID_IRndmExponential; }
65 virtual IRndmGen::Param* clone()
const {
return new Exponential(m_mean); }
71 friend class Generator<Chi2>;
77 Chi2(
long n_dof) :
IRndmGen::Param(IID_IRndmChi2), m_nDOF(n_dof) { }
81 long nDOF()
const {
return m_nDOF; }
83 static const InterfaceID& typeID() {
return IID_IRndmChi2; }
91 friend class Generator<BreitWigner>;
94 double m_mean, m_gamma;
97 BreitWigner(
double m,
double g)
98 :
IRndmGen::Param(IID_IRndmBreitWigner), m_mean(m), m_gamma(g) { }
100 virtual ~BreitWigner() { }
102 double mean()
const {
return m_mean; }
104 double gamma()
const {
return m_gamma; }
106 static const InterfaceID& typeID() {
return IID_IRndmBreitWigner; }
109 return new BreitWigner(m_mean, m_gamma);
116 friend class Generator<Landau>;
119 double m_mean, m_sigma;
122 Landau(
double m,
double s)
123 :
IRndmGen::Param(IID_IRndmLandau), m_mean(m), m_sigma(s) { }
125 virtual ~Landau() { }
127 double mean()
const {
return m_mean; }
129 double sigma()
const {
return m_sigma; }
131 static const InterfaceID& typeID() {
return IID_IRndmLandau; }
134 return new Landau(m_mean, m_sigma);
142 friend class Generator<BreitWignerCutOff>;
145 double m_mean, m_gamma, m_cut;
148 BreitWignerCutOff(
double m,
double g,
double c)
149 :
IRndmGen::Param(IID_IRndmBreitWignerCutOff),
154 virtual ~BreitWignerCutOff() { }
156 double mean()
const {
return m_mean; }
158 double gamma()
const {
return m_gamma; }
160 double cutOff()
const {
return m_cut; }
162 static const InterfaceID& typeID() {
return IID_IRndmBreitWignerCutOff;}
165 return new BreitWignerCutOff(m_mean, m_gamma, m_cut);
172 friend class Generator<StudentT>;
178 StudentT(
double a) :
IRndmGen::Param(IID_IRndmStudentT), m_aValue(a) { }
180 virtual ~StudentT() { }
182 double aValue()
const {
return m_aValue; }
184 static const InterfaceID& typeID() {
return IID_IRndmStudentT; }
186 virtual IRndmGen::Param* clone()
const {
return new StudentT(m_aValue);}
192 friend class Generator<Gamma>;
200 Gamma(
double k,
double l)
201 :
IRndmGen::Param(IID_IRndmGamma), m_kValue(k), m_lambda(l) { }
205 double kValue()
const {
return m_kValue; }
207 double lambda()
const {
return m_lambda; }
209 static const InterfaceID& typeID() {
return IID_IRndmGamma; }
212 return new Gamma(m_kValue, m_lambda);
220 friend class Generator<Poisson>;
226 Poisson(
double m) :
IRndmGen::Param(IID_IRndmPoisson), m_mean(m) { }
228 virtual ~Poisson() { }
230 double mean()
const {
return m_mean; }
232 static const InterfaceID& typeID() {
return IID_IRndmPoisson; }
245 double m_probability;
248 Binomial(
long n,
double p)
249 :
IRndmGen::Param(IID_IRndmBinomial), m_nEvent(n), m_probability(p) { }
251 virtual ~Binomial() { }
253 long nEvent()
const {
return m_nEvent; }
255 double probability()
const {
return m_probability; }
257 static const InterfaceID& typeID() {
return IID_IRndmBinomial; }
260 return new Binomial(m_nEvent, m_probability);
275 Flat(
double mi,
double ma)
276 :
IRndmGen::Param(IID_IRndmFlat), m_minimum(mi), m_maximum(ma) { }
280 double minimum()
const {
return m_minimum; }
282 double maximum()
const {
return m_maximum; }
284 static const InterfaceID& typeID() {
return IID_IRndmFlat; }
287 return new Flat(m_minimum, m_maximum);
296 Bit() :
IRndmGen::Param(IID_IRndmBit) { }
300 static const InterfaceID& typeID() {
return IID_IRndmBit; }
324 std::vector<double> m_pdf;
326 long m_interpolation;
329 DefinedPdf(
const std::vector<double>& pdf,
long intpol)
330 :
IRndmGen::Param(IID_IRndmDefinedPdf),
332 m_interpolation(intpol) { }
334 virtual ~DefinedPdf() { }
336 std::vector<double>& pdf() {
return m_pdf; }
338 long interpolation()
const {
return m_interpolation; }
340 static const InterfaceID& typeID() {
return IID_IRndmDefinedPdf; }
343 return new DefinedPdf(m_pdf,m_interpolation);
357 GaussianTail(
double a,
double s)
358 :
IRndmGen::Param(IID_IRndmGaussianTail), m_cut(a), m_sigma(s) { }
360 virtual ~GaussianTail() { }
362 double cut()
const {
return m_cut; }
364 double sigma()
const {
return m_sigma; }
366 static const InterfaceID& typeID() {
return IID_IRndmGaussianTail; }
369 return new GaussianTail(m_cut, m_sigma);
397 Numbers(
const Numbers& copy );
404 #if !defined(GAUDI_V22_API) || defined(G22_NEW_SVCLOCATOR)
413 operator bool ()
const {
414 return m_generator != 0;
417 double operator() () {
418 return this->shoot();
422 return this->shoot();
426 if ( 0 != m_generator ) {
427 return m_generator->
shoot();
433 if ( 0 != m_generator ) {
440 #endif // GAUDIKERNEL_RNDMGENGENERATORS_H
Definition of a interface for a generic random number generators.
Random Generator service interface definition Definition of a interface for a service to access rando...
This class is used for returning status codes from appropriate routines.
virtual double shoot() const =0
Single shot returning single random number according to specified distribution.
struct GAUDI_API array
Parametrisation class for redirection array - like implementation.
virtual StatusCode shootArray(std::vector< double > &array, long howmany, long start=0) const =0
Multiple shots returning vector with random number according to specified distribution.