![]() |
|
|
Generated: 18 Jul 2008 |
00001 // $Id: RndmGenerators.h,v 1.8 2005/07/21 14:35:31 hmd Exp $ 00002 #ifndef GAUDIKERNEL_RNDMGENGENERATORS_H 00003 #define GAUDIKERNEL_RNDMGENGENERATORS_H 00004 00005 // STL include files 00006 #include <vector> 00007 00008 // Framework include files 00009 #include "GaudiKernel/IRndmGen.h" 00010 00011 // Forward declarations 00012 class IRndmGen; 00013 class IRndmGenSvc; 00014 00015 namespace Rndm { 00016 00017 template <class TYPE> class Generator; 00018 00021 class Gauss : public IRndmGen::Param { 00022 protected: 00024 friend class Generator<Gauss>; 00026 double m_mean; 00028 double m_sigma; 00029 public: 00031 Gauss(double m, double s) 00032 : IRndmGen::Param(IID_IRndmGauss), m_mean(m), m_sigma(s) { } 00034 virtual ~Gauss() { } 00036 double mean() const { return m_mean; } 00038 double sigma() const { return m_sigma; } 00040 static const InterfaceID& typeID() { return IID_IRndmGauss; } 00042 virtual IRndmGen::Param* clone() const { 00043 return new Gauss(m_mean, m_sigma); 00044 } 00045 }; 00046 00049 class Exponential : public IRndmGen::Param { 00050 protected: 00052 double m_mean; 00053 public: 00055 Exponential(double m) 00056 : IRndmGen::Param(IID_IRndmExponential), m_mean(m) { } 00058 virtual ~Exponential() { } 00060 double mean() const { return m_mean; } 00062 static const InterfaceID& typeID() { return IID_IRndmExponential; } 00064 virtual IRndmGen::Param* clone() const { return new Exponential(m_mean); } 00065 }; 00066 00069 class Chi2 : public IRndmGen::Param { 00070 friend class Generator<Chi2>; 00071 protected: 00073 long m_nDOF; 00074 public: 00076 Chi2(long n_dof) : IRndmGen::Param(IID_IRndmChi2), m_nDOF(n_dof) { } 00078 virtual ~Chi2() { } 00080 long nDOF() const { return m_nDOF; } 00082 static const InterfaceID& typeID() { return IID_IRndmChi2; } 00084 virtual IRndmGen::Param* clone() const { return new Chi2(m_nDOF); } 00085 }; 00086 00089 class BreitWigner : public IRndmGen::Param { 00090 friend class Generator<BreitWigner>; 00091 protected: 00093 double m_mean, m_gamma; 00094 public: 00096 BreitWigner(double m, double g) 00097 : IRndmGen::Param(IID_IRndmBreitWigner), m_mean(m), m_gamma(g) { } 00099 virtual ~BreitWigner() { } 00101 double mean() const { return m_mean; } 00103 double gamma() const { return m_gamma; } 00105 static const InterfaceID& typeID() { return IID_IRndmBreitWigner; } 00107 virtual IRndmGen::Param* clone() const { 00108 return new BreitWigner(m_mean, m_gamma); 00109 } 00110 }; 00111 00114 class Landau : public IRndmGen::Param { 00115 friend class Generator<Landau>; 00116 protected: 00118 double m_mean, m_sigma; 00119 public: 00121 Landau(double m, double s) 00122 : IRndmGen::Param(IID_IRndmLandau), m_mean(m), m_sigma(s) { } 00124 virtual ~Landau() { } 00126 double mean() const { return m_mean; } 00128 double sigma() const { return m_sigma; } 00130 static const InterfaceID& typeID() { return IID_IRndmLandau; } 00132 virtual IRndmGen::Param* clone() const { 00133 return new Landau(m_mean, m_sigma); 00134 } 00135 }; 00136 00140 class BreitWignerCutOff : public IRndmGen::Param { 00141 friend class Generator<BreitWignerCutOff>; 00142 protected: 00144 double m_mean, m_gamma, m_cut; 00145 public: 00147 BreitWignerCutOff(double m, double g, double c) 00148 : IRndmGen::Param(IID_IRndmBreitWignerCutOff), 00149 m_mean(m), 00150 m_gamma(g), 00151 m_cut(c) { } 00153 virtual ~BreitWignerCutOff() { } 00155 double mean() const { return m_mean; } 00157 double gamma() const { return m_gamma; } 00159 double cutOff() const { return m_cut; } 00161 static const InterfaceID& typeID() { return IID_IRndmBreitWignerCutOff;} 00163 virtual IRndmGen::Param* clone() const { 00164 return new BreitWignerCutOff(m_mean, m_gamma, m_cut); 00165 } 00166 }; 00167 00170 class StudentT : public IRndmGen::Param { 00171 friend class Generator<StudentT>; 00172 protected: 00174 double m_aValue; 00175 public: 00177 StudentT(double a) : IRndmGen::Param(IID_IRndmStudentT), m_aValue(a) { } 00179 virtual ~StudentT() { } 00181 double aValue() const { return m_aValue; } 00183 static const InterfaceID& typeID() { return IID_IRndmStudentT; } 00185 virtual IRndmGen::Param* clone() const { return new StudentT(m_aValue);} 00186 }; 00187 00190 class Gamma : public IRndmGen::Param { 00191 friend class Generator<Gamma>; 00192 protected: 00194 double m_kValue; 00196 double m_lambda; 00197 public: 00199 Gamma(double k, double l) 00200 : IRndmGen::Param(IID_IRndmGamma), m_kValue(k), m_lambda(l) { } 00202 virtual ~Gamma() { } 00204 double kValue() const { return m_kValue; } 00206 double lambda() const { return m_lambda; } 00208 static const InterfaceID& typeID() { return IID_IRndmGamma; } 00210 virtual IRndmGen::Param* clone() const { 00211 return new Gamma(m_kValue, m_lambda); 00212 } 00213 }; 00214 00218 class Poisson : public IRndmGen::Param { 00219 friend class Generator<Poisson>; 00220 protected: 00222 double m_mean; 00223 public: 00225 Poisson(double m) : IRndmGen::Param(IID_IRndmPoisson), m_mean(m) { } 00227 virtual ~Poisson() { } 00229 double mean() const { return m_mean; } 00231 static const InterfaceID& typeID() { return IID_IRndmPoisson; } 00233 virtual IRndmGen::Param* clone() const { return new Poisson(m_mean); } 00234 }; 00235 00239 class Binomial : public IRndmGen::Param { 00240 protected: 00242 long m_nEvent; 00244 double m_probability; 00245 public: 00247 Binomial(long n, double p) 00248 : IRndmGen::Param(IID_IRndmBinomial), m_nEvent(n), m_probability(p) { } 00250 virtual ~Binomial() { } 00252 long nEvent() const { return m_nEvent; } 00254 double probability() const { return m_probability; } 00256 static const InterfaceID& typeID() { return IID_IRndmBinomial; } 00258 virtual IRndmGen::Param* clone() const { 00259 return new Binomial(m_nEvent, m_probability); 00260 } 00261 }; 00262 00266 class Flat : public IRndmGen::Param { 00267 protected: 00269 double m_minimum; 00271 double m_maximum; 00272 public: 00274 Flat(double mi, double ma) 00275 : IRndmGen::Param(IID_IRndmFlat), m_minimum(mi), m_maximum(ma) { } 00277 virtual ~Flat() { } 00279 double minimum() const { return m_minimum; } 00281 double maximum() const { return m_maximum; } 00283 static const InterfaceID& typeID() { return IID_IRndmFlat; } 00285 virtual IRndmGen::Param* clone() const { 00286 return new Flat(m_minimum, m_maximum); 00287 } 00288 }; 00289 00292 class Bit : public IRndmGen::Param { 00293 public: 00295 Bit() : IRndmGen::Param(IID_IRndmBit) { } 00297 virtual ~Bit() { } 00299 static const InterfaceID& typeID() { return IID_IRndmBit; } 00301 virtual IRndmGen::Param* clone() const { return new Bit(); } 00302 }; 00303 00320 class DefinedPdf : public IRndmGen::Param { 00321 protected: 00323 std::vector<double> m_pdf; 00325 long m_interpolation; 00326 public: 00328 DefinedPdf(const std::vector<double>& pdf, long intpol) 00329 : IRndmGen::Param(IID_IRndmDefinedPdf), 00330 m_pdf(pdf), 00331 m_interpolation(intpol) { } 00333 virtual ~DefinedPdf() { } 00335 std::vector<double>& pdf() { return m_pdf; } 00337 long interpolation() const { return m_interpolation; } 00339 static const InterfaceID& typeID() { return IID_IRndmDefinedPdf; } 00341 virtual IRndmGen::Param* clone() const { 00342 return new DefinedPdf(m_pdf,m_interpolation); 00343 } 00344 }; 00345 00348 class GaussianTail : public IRndmGen::Param { 00349 protected: 00351 double m_cut; 00353 double m_sigma; 00354 public: 00356 GaussianTail(double a, double s) 00357 : IRndmGen::Param(IID_IRndmGaussianTail), m_cut(a), m_sigma(s) { } 00359 virtual ~GaussianTail() { } 00361 double cut() const { return m_cut; } 00363 double sigma() const { return m_sigma; } 00365 static const InterfaceID& typeID() { return IID_IRndmGaussianTail; } 00367 virtual IRndmGen::Param* clone() const { 00368 return new GaussianTail(m_cut, m_sigma); 00369 } 00370 }; 00371 00372 00388 class Numbers { 00389 protected: 00391 IRndmGen* m_generator; 00392 public: 00394 Numbers(); 00396 Numbers(const Numbers& copy ); 00398 Numbers(IRndmGenSvc* svc, const IRndmGen::Param& par); 00400 virtual ~Numbers(); 00402 virtual StatusCode initialize(IRndmGenSvc* svc, const IRndmGen::Param& par); 00404 virtual StatusCode finalize(); 00406 operator bool () const { 00407 return m_generator != 0; 00408 } 00410 double operator() () { 00411 return this->shoot(); 00412 } 00414 double pop() { 00415 return this->shoot(); 00416 } 00418 double shoot() { 00419 if ( 0 != m_generator ) { 00420 return m_generator->shoot(); 00421 } 00422 return -1; 00423 } 00425 StatusCode shootArray(std::vector<double>& array, long num, long start=0) { 00426 if ( 0 != m_generator ) { 00427 return m_generator->shootArray(array, num, start); 00428 } 00429 return StatusCode::FAILURE; 00430 } 00431 }; 00432 } 00433 #endif // GAUDIKERNEL_RNDMGENGENERATORS_H