00001
00002 #ifndef GAUDIKERNEL_RNDMGENGENERATORS_H
00003 #define GAUDIKERNEL_RNDMGENGENERATORS_H
00004
00005
00006 #include <vector>
00007
00008
00009 #include "GaudiKernel/IRndmGen.h"
00010 #include "GaudiKernel/SmartIF.h"
00011
00012
00013 class IRndmGen;
00014 class IRndmGenSvc;
00015
00016 namespace Rndm {
00017
00018 template <class TYPE> class Generator;
00019
00022 class GAUDI_API Gauss: public IRndmGen::Param {
00023 protected:
00025 friend class Generator<Gauss>;
00027 double m_mean;
00029 double m_sigma;
00030 public:
00032 Gauss(double m, double s)
00033 : IRndmGen::Param(IID_IRndmGauss), m_mean(m), m_sigma(s) { }
00035 virtual ~Gauss() { }
00037 double mean() const { return m_mean; }
00039 double sigma() const { return m_sigma; }
00041 static const InterfaceID& typeID() { return IID_IRndmGauss; }
00043 virtual IRndmGen::Param* clone() const {
00044 return new Gauss(m_mean, m_sigma);
00045 }
00046 };
00047
00050 class GAUDI_API Exponential: public IRndmGen::Param {
00051 protected:
00053 double m_mean;
00054 public:
00056 Exponential(double m)
00057 : IRndmGen::Param(IID_IRndmExponential), m_mean(m) { }
00059 virtual ~Exponential() { }
00061 double mean() const { return m_mean; }
00063 static const InterfaceID& typeID() { return IID_IRndmExponential; }
00065 virtual IRndmGen::Param* clone() const { return new Exponential(m_mean); }
00066 };
00067
00070 class GAUDI_API Chi2: public IRndmGen::Param {
00071 friend class Generator<Chi2>;
00072 protected:
00074 long m_nDOF;
00075 public:
00077 Chi2(long n_dof) : IRndmGen::Param(IID_IRndmChi2), m_nDOF(n_dof) { }
00079 virtual ~Chi2() { }
00081 long nDOF() const { return m_nDOF; }
00083 static const InterfaceID& typeID() { return IID_IRndmChi2; }
00085 virtual IRndmGen::Param* clone() const { return new Chi2(m_nDOF); }
00086 };
00087
00090 class GAUDI_API BreitWigner : public IRndmGen::Param {
00091 friend class Generator<BreitWigner>;
00092 protected:
00094 double m_mean, m_gamma;
00095 public:
00097 BreitWigner(double m, double g)
00098 : IRndmGen::Param(IID_IRndmBreitWigner), m_mean(m), m_gamma(g) { }
00100 virtual ~BreitWigner() { }
00102 double mean() const { return m_mean; }
00104 double gamma() const { return m_gamma; }
00106 static const InterfaceID& typeID() { return IID_IRndmBreitWigner; }
00108 virtual IRndmGen::Param* clone() const {
00109 return new BreitWigner(m_mean, m_gamma);
00110 }
00111 };
00112
00115 class GAUDI_API Landau : public IRndmGen::Param {
00116 friend class Generator<Landau>;
00117 protected:
00119 double m_mean, m_sigma;
00120 public:
00122 Landau(double m, double s)
00123 : IRndmGen::Param(IID_IRndmLandau), m_mean(m), m_sigma(s) { }
00125 virtual ~Landau() { }
00127 double mean() const { return m_mean; }
00129 double sigma() const { return m_sigma; }
00131 static const InterfaceID& typeID() { return IID_IRndmLandau; }
00133 virtual IRndmGen::Param* clone() const {
00134 return new Landau(m_mean, m_sigma);
00135 }
00136 };
00137
00141 class GAUDI_API BreitWignerCutOff : public IRndmGen::Param {
00142 friend class Generator<BreitWignerCutOff>;
00143 protected:
00145 double m_mean, m_gamma, m_cut;
00146 public:
00148 BreitWignerCutOff(double m, double g, double c)
00149 : IRndmGen::Param(IID_IRndmBreitWignerCutOff),
00150 m_mean(m),
00151 m_gamma(g),
00152 m_cut(c) { }
00154 virtual ~BreitWignerCutOff() { }
00156 double mean() const { return m_mean; }
00158 double gamma() const { return m_gamma; }
00160 double cutOff() const { return m_cut; }
00162 static const InterfaceID& typeID() { return IID_IRndmBreitWignerCutOff;}
00164 virtual IRndmGen::Param* clone() const {
00165 return new BreitWignerCutOff(m_mean, m_gamma, m_cut);
00166 }
00167 };
00168
00171 class GAUDI_API StudentT: public IRndmGen::Param {
00172 friend class Generator<StudentT>;
00173 protected:
00175 double m_aValue;
00176 public:
00178 StudentT(double a) : IRndmGen::Param(IID_IRndmStudentT), m_aValue(a) { }
00180 virtual ~StudentT() { }
00182 double aValue() const { return m_aValue; }
00184 static const InterfaceID& typeID() { return IID_IRndmStudentT; }
00186 virtual IRndmGen::Param* clone() const { return new StudentT(m_aValue);}
00187 };
00188
00191 class GAUDI_API Gamma: public IRndmGen::Param {
00192 friend class Generator<Gamma>;
00193 protected:
00195 double m_kValue;
00197 double m_lambda;
00198 public:
00200 Gamma(double k, double l)
00201 : IRndmGen::Param(IID_IRndmGamma), m_kValue(k), m_lambda(l) { }
00203 virtual ~Gamma() { }
00205 double kValue() const { return m_kValue; }
00207 double lambda() const { return m_lambda; }
00209 static const InterfaceID& typeID() { return IID_IRndmGamma; }
00211 virtual IRndmGen::Param* clone() const {
00212 return new Gamma(m_kValue, m_lambda);
00213 }
00214 };
00215
00219 class GAUDI_API Poisson: public IRndmGen::Param {
00220 friend class Generator<Poisson>;
00221 protected:
00223 double m_mean;
00224 public:
00226 Poisson(double m) : IRndmGen::Param(IID_IRndmPoisson), m_mean(m) { }
00228 virtual ~Poisson() { }
00230 double mean() const { return m_mean; }
00232 static const InterfaceID& typeID() { return IID_IRndmPoisson; }
00234 virtual IRndmGen::Param* clone() const { return new Poisson(m_mean); }
00235 };
00236
00240 class GAUDI_API Binomial: public IRndmGen::Param {
00241 protected:
00243 long m_nEvent;
00245 double m_probability;
00246 public:
00248 Binomial(long n, double p)
00249 : IRndmGen::Param(IID_IRndmBinomial), m_nEvent(n), m_probability(p) { }
00251 virtual ~Binomial() { }
00253 long nEvent() const { return m_nEvent; }
00255 double probability() const { return m_probability; }
00257 static const InterfaceID& typeID() { return IID_IRndmBinomial; }
00259 virtual IRndmGen::Param* clone() const {
00260 return new Binomial(m_nEvent, m_probability);
00261 }
00262 };
00263
00267 class GAUDI_API Flat: public IRndmGen::Param {
00268 protected:
00270 double m_minimum;
00272 double m_maximum;
00273 public:
00275 Flat(double mi, double ma)
00276 : IRndmGen::Param(IID_IRndmFlat), m_minimum(mi), m_maximum(ma) { }
00278 virtual ~Flat() { }
00280 double minimum() const { return m_minimum; }
00282 double maximum() const { return m_maximum; }
00284 static const InterfaceID& typeID() { return IID_IRndmFlat; }
00286 virtual IRndmGen::Param* clone() const {
00287 return new Flat(m_minimum, m_maximum);
00288 }
00289 };
00290
00293 class GAUDI_API Bit: public IRndmGen::Param {
00294 public:
00296 Bit() : IRndmGen::Param(IID_IRndmBit) { }
00298 virtual ~Bit() { }
00300 static const InterfaceID& typeID() { return IID_IRndmBit; }
00302 virtual IRndmGen::Param* clone() const { return new Bit(); }
00303 };
00304
00321 class GAUDI_API DefinedPdf: public IRndmGen::Param {
00322 protected:
00324 std::vector<double> m_pdf;
00326 long m_interpolation;
00327 public:
00329 DefinedPdf(const std::vector<double>& pdf, long intpol)
00330 : IRndmGen::Param(IID_IRndmDefinedPdf),
00331 m_pdf(pdf),
00332 m_interpolation(intpol) { }
00334 virtual ~DefinedPdf() { }
00336 std::vector<double>& pdf() { return m_pdf; }
00338 long interpolation() const { return m_interpolation; }
00340 static const InterfaceID& typeID() { return IID_IRndmDefinedPdf; }
00342 virtual IRndmGen::Param* clone() const {
00343 return new DefinedPdf(m_pdf,m_interpolation);
00344 }
00345 };
00346
00349 class GAUDI_API GaussianTail: public IRndmGen::Param {
00350 protected:
00352 double m_cut;
00354 double m_sigma;
00355 public:
00357 GaussianTail(double a, double s)
00358 : IRndmGen::Param(IID_IRndmGaussianTail), m_cut(a), m_sigma(s) { }
00360 virtual ~GaussianTail() { }
00362 double cut() const { return m_cut; }
00364 double sigma() const { return m_sigma; }
00366 static const InterfaceID& typeID() { return IID_IRndmGaussianTail; }
00368 virtual IRndmGen::Param* clone() const {
00369 return new GaussianTail(m_cut, m_sigma);
00370 }
00371 };
00372
00373
00389 class GAUDI_API Numbers {
00390 protected:
00392 IRndmGen* m_generator;
00393 public:
00395 Numbers();
00397 Numbers(const Numbers& copy );
00399 Numbers(const SmartIF<IRndmGenSvc>& svc, const IRndmGen::Param& par);
00401 virtual ~Numbers();
00403 virtual StatusCode initialize(const SmartIF<IRndmGenSvc>& svc, const IRndmGen::Param& par);
00404 #if !defined(GAUDI_V22_API) || defined(G22_NEW_SVCLOCATOR)
00406 Numbers(IRndmGenSvc* svc, const IRndmGen::Param& par);
00408 virtual StatusCode initialize(IRndmGenSvc* svc, const IRndmGen::Param& par);
00409 #endif
00411 virtual StatusCode finalize();
00413 operator bool () const {
00414 return m_generator != 0;
00415 }
00417 double operator() () {
00418 return this->shoot();
00419 }
00421 double pop() {
00422 return this->shoot();
00423 }
00425 double shoot() {
00426 if ( 0 != m_generator ) {
00427 return m_generator->shoot();
00428 }
00429 return -1;
00430 }
00432 StatusCode shootArray(std::vector<double>& array, long num, long start=0) {
00433 if ( 0 != m_generator ) {
00434 return m_generator->shootArray(array, num, start);
00435 }
00436 return StatusCode::FAILURE;
00437 }
00438 };
00439 }
00440 #endif // GAUDIKERNEL_RNDMGENGENERATORS_H