Geant4 Cross Reference |
1 // -*- C++ -*- 1 // -*- C++ -*- 2 // 2 // 3 // ------------------------------------------- 3 // ----------------------------------------------------------------------- 4 // HEP Random 4 // HEP Random 5 // --- RandPoisson --- 5 // --- RandPoisson --- 6 // class header file 6 // class header file 7 // ------------------------------------------- 7 // ----------------------------------------------------------------------- 8 // This file is part of Geant4 (simulation too 8 // This file is part of Geant4 (simulation toolkit for HEP). 9 9 10 // Class defining methods for shooting numbers 10 // Class defining methods for shooting numbers according to the Poisson 11 // distribution, given a mean (Algorithm taken 11 // distribution, given a mean (Algorithm taken from "W.H.Press et al., 12 // Numerical Recipes in C, Second Edition". 12 // Numerical Recipes in C, Second Edition". 13 // Default mean value is set to 1, value used 13 // Default mean value is set to 1, value used for operator()(). 14 14 15 // =========================================== 15 // ======================================================================= 16 // Gabriele Cosmo - Created: 5th September 199 16 // Gabriele Cosmo - Created: 5th September 1995 17 // - Added not static Shoot() m 17 // - Added not static Shoot() method: 17th May 1996 18 // - Algorithm now operates on 18 // - Algorithm now operates on doubles : 31st Oct 1996 19 // - Added methods to shoot arr 19 // - Added methods to shoot arrays: 28th July 1997 20 // J.Marraffino - Added default mean as attr 20 // J.Marraffino - Added default mean as attribute and 21 // operator() with mean: 16th 21 // operator() with mean: 16th Feb 1998 22 // Gabriele Cosmo - Relocated static data from 22 // Gabriele Cosmo - Relocated static data from HepRandom: 5th Jan 1999 23 // M. Fischler - Moved meanMax and defaultM 23 // M. Fischler - Moved meanMax and defaultMean from private to protected 24 // to accomodate derived classes RandPo 24 // to accomodate derived classes RandPoissonQ & RandPoissonT 25 // M Fischler - put and get to/from strea 25 // M Fischler - put and get to/from streams 12/10/04 26 // =========================================== 26 // ======================================================================= 27 27 28 #ifndef RandPoisson_h 28 #ifndef RandPoisson_h 29 #define RandPoisson_h 1 29 #define RandPoisson_h 1 30 30 31 #include "CLHEP/Random/Random.h" 31 #include "CLHEP/Random/Random.h" 32 #include "CLHEP/Utility/memory.h" 32 #include "CLHEP/Utility/memory.h" 33 #include "CLHEP/Utility/thread_local.h" 33 #include "CLHEP/Utility/thread_local.h" 34 34 35 namespace CLHEP { 35 namespace CLHEP { 36 36 37 /** 37 /** 38 * @author 38 * @author 39 * @ingroup random 39 * @ingroup random 40 */ 40 */ 41 class RandPoisson : public HepRandom { 41 class RandPoisson : public HepRandom { 42 42 43 public: 43 public: 44 44 45 inline RandPoisson ( HepRandomEngine& anEngi 45 inline RandPoisson ( HepRandomEngine& anEngine, double a1=1.0 ); 46 inline RandPoisson ( HepRandomEngine* anEngi 46 inline RandPoisson ( HepRandomEngine* anEngine, double a1=1.0 ); 47 // These constructors should be used to inst 47 // These constructors should be used to instantiate a RandPoisson 48 // distribution object defining a local engi 48 // distribution object defining a local engine for it. 49 // The static generator will be skipped usin 49 // The static generator will be skipped using the non-static methods 50 // defined below. 50 // defined below. 51 // If the engine is passed by pointer the co 51 // If the engine is passed by pointer the corresponding engine object 52 // will be deleted by the RandPoisson destru 52 // will be deleted by the RandPoisson destructor. 53 // If the engine is passed by reference the 53 // If the engine is passed by reference the corresponding engine object 54 // will not be deleted by the RandPoisson de 54 // will not be deleted by the RandPoisson destructor. 55 55 56 virtual ~RandPoisson(); 56 virtual ~RandPoisson(); 57 // Destructor 57 // Destructor 58 58 59 // Save and restore to/from streams 59 // Save and restore to/from streams 60 60 61 std::ostream & put ( std::ostream & os ) con 61 std::ostream & put ( std::ostream & os ) const; 62 std::istream & get ( std::istream & is ); 62 std::istream & get ( std::istream & is ); 63 63 64 // Static methods to shoot random values usi 64 // Static methods to shoot random values using the static generator 65 65 66 static long shoot( double mean=1.0 ); << 66 static long shoot( double m=1.0 ); 67 67 68 static void shootArray ( const int size, lo << 68 static void shootArray ( const int size, long* vect, double m=1.0 ); 69 69 70 // Static methods to shoot random values us 70 // Static methods to shoot random values using a given engine 71 // by-passing the static generator. 71 // by-passing the static generator. 72 72 73 static long shoot( HepRandomEngine* anEngin << 73 static long shoot( HepRandomEngine* anEngine, double m=1.0 ); 74 74 75 static void shootArray ( HepRandomEngine* a 75 static void shootArray ( HepRandomEngine* anEngine, 76 const int size, lo << 76 const int size, long* vect, double m=1.0 ); 77 77 78 // Methods using the localEngine to shoot r 78 // Methods using the localEngine to shoot random values, by-passing 79 // the static generator. 79 // the static generator. 80 80 81 long fire(); 81 long fire(); 82 long fire( double mean ); << 82 long fire( double m ); 83 83 84 void fireArray ( const int size, long* vect 84 void fireArray ( const int size, long* vect ); 85 void fireArray ( const int size, long* vect, << 85 void fireArray ( const int size, long* vect, double m); 86 86 87 double operator()(); 87 double operator()(); 88 double operator()( double mean ); << 88 double operator()( double m ); 89 89 90 std::string name() const; 90 std::string name() const; 91 HepRandomEngine & engine(); 91 HepRandomEngine & engine(); 92 92 93 static std::string distributionName() {retur 93 static std::string distributionName() {return "RandPoisson";} 94 // Provides the name of this distribution cl 94 // Provides the name of this distribution class 95 95 96 protected: 96 protected: 97 97 98 double meanMax; 98 double meanMax; 99 double defaultMean; 99 double defaultMean; 100 100 101 static double getOldMean() {return oldm_st; 101 static double getOldMean() {return oldm_st;} 102 102 103 static double getMaxMean() {return meanMax_ 103 static double getMaxMean() {return meanMax_st;} 104 104 105 static void setOldMean( double val ){oldm_s 105 static void setOldMean( double val ){oldm_st = val;} 106 106 107 static double* getPStatus() {return status_ 107 static double* getPStatus() {return status_st;} 108 108 109 static void setPStatus(double sq, double alx 109 static void setPStatus(double sq, double alxm, double g1) { 110 status_st[0] = sq; status_st[1] = alxm; st 110 status_st[0] = sq; status_st[1] = alxm; status_st[2] = g1; 111 } 111 } 112 112 113 inline HepRandomEngine* getLocalEngine(); 113 inline HepRandomEngine* getLocalEngine(); 114 114 115 private: 115 private: 116 116 117 std::shared_ptr<HepRandomEngine> localEngine 117 std::shared_ptr<HepRandomEngine> localEngine; 118 double status[3], oldm; 118 double status[3], oldm; 119 119 120 // static data 120 // static data 121 static CLHEP_THREAD_LOCAL double status_st[3 121 static CLHEP_THREAD_LOCAL double status_st[3]; 122 static CLHEP_THREAD_LOCAL double oldm_st; 122 static CLHEP_THREAD_LOCAL double oldm_st; 123 static const double meanMax_st; 123 static const double meanMax_st; 124 124 125 }; 125 }; 126 126 127 } // namespace CLHEP 127 } // namespace CLHEP 128 128 129 #include "CLHEP/Random/RandPoisson.icc" 129 #include "CLHEP/Random/RandPoisson.icc" 130 130 131 #endif 131 #endif 132 132