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