Geant4 Cross Reference |
>> 1 // $Id:$ 1 // -*- C++ -*- 2 // -*- C++ -*- 2 // 3 // 3 // ------------------------------------------- 4 // ----------------------------------------------------------------------- 4 // HEP Random 5 // HEP Random 5 // --- RandPoisson --- 6 // --- RandPoisson --- 6 // class header file 7 // class header file 7 // ------------------------------------------- 8 // ----------------------------------------------------------------------- 8 // This file is part of Geant4 (simulation too 9 // This file is part of Geant4 (simulation toolkit for HEP). 9 10 10 // Class defining methods for shooting numbers 11 // Class defining methods for shooting numbers according to the Poisson 11 // distribution, given a mean (Algorithm taken 12 // distribution, given a mean (Algorithm taken from "W.H.Press et al., 12 // Numerical Recipes in C, Second Edition". 13 // Numerical Recipes in C, Second Edition". 13 // Default mean value is set to 1, value used 14 // Default mean value is set to 1, value used for operator()(). 14 15 15 // =========================================== 16 // ======================================================================= 16 // Gabriele Cosmo - Created: 5th September 199 17 // Gabriele Cosmo - Created: 5th September 1995 17 // - Added not static Shoot() m 18 // - Added not static Shoot() method: 17th May 1996 18 // - Algorithm now operates on 19 // - Algorithm now operates on doubles : 31st Oct 1996 19 // - Added methods to shoot arr 20 // - Added methods to shoot arrays: 28th July 1997 20 // J.Marraffino - Added default mean as attr 21 // J.Marraffino - Added default mean as attribute and 21 // operator() with mean: 16th 22 // operator() with mean: 16th Feb 1998 22 // Gabriele Cosmo - Relocated static data from 23 // Gabriele Cosmo - Relocated static data from HepRandom: 5th Jan 1999 23 // M. Fischler - Moved meanMax and defaultM 24 // M. Fischler - Moved meanMax and defaultMean from private to protected 24 // to accomodate derived classes RandPo 25 // to accomodate derived classes RandPoissonQ & RandPoissonT 25 // M Fischler - put and get to/from strea 26 // M Fischler - put and get to/from streams 12/10/04 26 // =========================================== 27 // ======================================================================= 27 28 28 #ifndef RandPoisson_h 29 #ifndef RandPoisson_h 29 #define RandPoisson_h 1 30 #define RandPoisson_h 1 30 31 31 #include "CLHEP/Random/Random.h" 32 #include "CLHEP/Random/Random.h" 32 #include "CLHEP/Utility/memory.h" 33 #include "CLHEP/Utility/memory.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 m=1.0 ); 46 inline RandPoisson ( HepRandomEngine* anEngi << 46 inline RandPoisson ( HepRandomEngine* anEngine, double m=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 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 double status_st[3]; 122 static CLHEP_THREAD_LOCAL double oldm_st; << 122 static 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