1 #ifndef GAUDIKERNEL_RNDMGENGENERATORS_H
2 #define GAUDIKERNEL_RNDMGENGENERATORS_H
8 #include "GaudiKernel/IRndmGen.h"
9 #include "GaudiKernel/SmartIF.h"
17 template <
class TYPE>
class Generator;
24 friend class Generator<Gauss>;
31 Gauss(
double m,
double s)
32 :
IRndmGen::Param(IID_IRndmGauss), m_mean(m), m_sigma(s) { }
34 ~Gauss()
override =
default;
36 double mean()
const {
return m_mean; }
38 double sigma()
const {
return m_sigma; }
40 static const InterfaceID& typeID() {
return IID_IRndmGauss; }
42 Gauss* clone()
const override {
return new Gauss(m_mean, m_sigma); }
54 :
IRndmGen::Param(IID_IRndmExponential), m_mean(m) { }
56 ~Exponential()
override =
default;
58 double mean()
const {
return m_mean; }
60 static const InterfaceID& typeID() {
return IID_IRndmExponential; }
62 Exponential* clone()
const override {
return new Exponential(m_mean); }
68 friend class Generator<Chi2>;
74 Chi2(
long n_dof) :
IRndmGen::Param(IID_IRndmChi2), m_nDOF(n_dof) { }
76 ~Chi2()
override =
default;
78 long nDOF()
const {
return m_nDOF; }
80 static const InterfaceID& typeID() {
return IID_IRndmChi2; }
82 Chi2* clone()
const override {
return new Chi2(m_nDOF); }
88 friend class Generator<BreitWigner>;
91 double m_mean, m_gamma;
94 BreitWigner(
double m,
double g)
95 :
IRndmGen::Param(IID_IRndmBreitWigner), m_mean(m), m_gamma(g) { }
97 ~BreitWigner()
override =
default;
99 double mean()
const {
return m_mean; }
101 double gamma()
const {
return m_gamma; }
103 static const InterfaceID& typeID() {
return IID_IRndmBreitWigner; }
105 BreitWigner* clone()
const override {
return new BreitWigner(m_mean, m_gamma); }
111 friend class Generator<Landau>;
114 double m_mean, m_sigma;
117 Landau(
double m,
double s)
118 :
IRndmGen::Param(IID_IRndmLandau), m_mean(m), m_sigma(s) { }
120 ~Landau()
override =
default;
122 double mean()
const {
return m_mean; }
124 double sigma()
const {
return m_sigma; }
126 static const InterfaceID& typeID() {
return IID_IRndmLandau; }
128 Landau* clone()
const override {
return new Landau(m_mean, m_sigma); }
135 friend class Generator<BreitWignerCutOff>;
138 double m_mean, m_gamma, m_cut;
141 BreitWignerCutOff(
double m,
double g,
double c)
142 :
IRndmGen::Param(IID_IRndmBreitWignerCutOff),
147 ~BreitWignerCutOff()
override =
default;
149 double mean()
const {
return m_mean; }
151 double gamma()
const {
return m_gamma; }
153 double cutOff()
const {
return m_cut; }
155 static const InterfaceID& typeID() {
return IID_IRndmBreitWignerCutOff;}
157 BreitWignerCutOff* clone()
const override{
return new BreitWignerCutOff(m_mean, m_gamma, m_cut); }
163 friend class Generator<StudentT>;
169 StudentT(
double a) :
IRndmGen::Param(IID_IRndmStudentT), m_aValue(a) { }
171 ~StudentT()
override =
default;
173 double aValue()
const {
return m_aValue; }
175 static const InterfaceID& typeID() {
return IID_IRndmStudentT; }
177 StudentT* clone()
const override {
return new StudentT(m_aValue);}
183 friend class Generator<Gamma>;
191 Gamma(
double k,
double l)
192 :
IRndmGen::Param(IID_IRndmGamma), m_kValue(k), m_lambda(l) { }
194 ~Gamma()
override =
default;
196 double kValue()
const {
return m_kValue; }
198 double lambda()
const {
return m_lambda; }
200 static const InterfaceID& typeID() {
return IID_IRndmGamma; }
202 Gamma* clone()
const override {
return new Gamma(m_kValue, m_lambda); }
209 friend class Generator<Poisson>;
215 Poisson(
double m) :
IRndmGen::Param(IID_IRndmPoisson), m_mean(m) { }
217 ~Poisson()
override =
default;
219 double mean()
const {
return m_mean; }
221 static const InterfaceID& typeID() {
return IID_IRndmPoisson; }
223 Poisson* clone()
const override {
return new Poisson(m_mean); }
234 double m_probability;
237 Binomial(
long n,
double p)
238 :
IRndmGen::Param(IID_IRndmBinomial), m_nEvent(n), m_probability(p) { }
240 ~Binomial()
override =
default;
242 long nEvent()
const {
return m_nEvent; }
244 double probability()
const {
return m_probability; }
246 static const InterfaceID& typeID() {
return IID_IRndmBinomial; }
248 Binomial* clone()
const override {
return new Binomial(m_nEvent, m_probability); }
262 Flat(
double mi,
double ma)
263 :
IRndmGen::Param(IID_IRndmFlat), m_minimum(mi), m_maximum(ma) { }
265 ~Flat()
override =
default;
267 double minimum()
const {
return m_minimum; }
269 double maximum()
const {
return m_maximum; }
271 static const InterfaceID& typeID() {
return IID_IRndmFlat; }
273 Flat* clone()
const override {
return new Flat(m_minimum, m_maximum); }
281 Bit() :
IRndmGen::Param(IID_IRndmBit) { }
283 ~Bit()
override =
default;
285 static const InterfaceID& typeID() {
return IID_IRndmBit; }
287 Bit* clone()
const override {
return new Bit(); }
309 std::vector<double> m_pdf;
311 long m_interpolation;
314 DefinedPdf(
const std::vector<double>& pdf,
long intpol)
315 :
IRndmGen::Param(IID_IRndmDefinedPdf),
317 m_interpolation(intpol) { }
319 ~DefinedPdf()
override =
default;
321 std::vector<double>& pdf() {
return m_pdf; }
323 long interpolation()
const {
return m_interpolation; }
325 static const InterfaceID& typeID() {
return IID_IRndmDefinedPdf; }
327 DefinedPdf* clone()
const override {
return new DefinedPdf(m_pdf,m_interpolation); }
340 GaussianTail(
double a,
double s)
341 :
IRndmGen::Param(IID_IRndmGaussianTail), m_cut(a), m_sigma(s) { }
343 ~GaussianTail()
override =
default;
345 double cut()
const {
return m_cut; }
347 double sigma()
const {
return m_sigma; }
349 static const InterfaceID& typeID() {
return IID_IRndmGaussianTail; }
351 GaussianTail* clone()
const override {
return new GaussianTail(m_cut, m_sigma); }
378 Numbers(
const Numbers& ) =
default;
385 #if !defined(GAUDI_V22_API) || defined(G22_NEW_SVCLOCATOR)
394 operator bool ()
const {
398 double operator() () {
399 return this->shoot();
403 return this->shoot();
407 return m_generator ? m_generator->
shoot()
417 #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.