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