Geant4  10.03.p03
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
RandPoisson.h
Go to the documentation of this file.
1 // $Id:$
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/Random.h"
33 #include "CLHEP/Utility/memory.h"
35 
36 namespace CLHEP {
37 
42 class RandPoisson : public HepRandom {
43 
44 public:
45 
46  inline RandPoisson ( HepRandomEngine& anEngine, double a1=1.0 );
47  inline RandPoisson ( HepRandomEngine* anEngine, double a1=1.0 );
48  // These constructors should be used to instantiate a RandPoisson
49  // distribution object defining a local engine for it.
50  // The static generator will be skipped using the non-static methods
51  // defined below.
52  // If the engine is passed by pointer the corresponding engine object
53  // will be deleted by the RandPoisson destructor.
54  // If the engine is passed by reference the corresponding engine object
55  // will not be deleted by the RandPoisson destructor.
56 
57  virtual ~RandPoisson();
58  // Destructor
59 
60  // Save and restore to/from streams
61 
62  std::ostream & put ( std::ostream & os ) const;
63  std::istream & get ( std::istream & is );
64 
65  // Static methods to shoot random values using the static generator
66 
67  static long shoot( double m=1.0 );
68 
69  static void shootArray ( const int size, long* vect, double m=1.0 );
70 
71  // Static methods to shoot random values using a given engine
72  // by-passing the static generator.
73 
74  static long shoot( HepRandomEngine* anEngine, double m=1.0 );
75 
76  static void shootArray ( HepRandomEngine* anEngine,
77  const int size, long* vect, double m=1.0 );
78 
79  // Methods using the localEngine to shoot random values, by-passing
80  // the static generator.
81 
82  long fire();
83  long fire( double m );
84 
85  void fireArray ( const int size, long* vect );
86  void fireArray ( const int size, long* vect, double m);
87 
88  double operator()();
89  double operator()( double m );
90 
91  std::string name() const;
93 
94  static std::string distributionName() {return "RandPoisson";}
95  // Provides the name of this distribution class
96 
97 protected:
98 
99  double meanMax;
100  double defaultMean;
101 
102  static double getOldMean() {return oldm_st;}
103 
104  static double getMaxMean() {return meanMax_st;}
105 
106  static void setOldMean( double val ){oldm_st = val;}
107 
108  static double* getPStatus() {return status_st;}
109 
110  static void setPStatus(double sq, double alxm, double g1) {
111  status_st[0] = sq; status_st[1] = alxm; status_st[2] = g1;
112  }
113 
115 
116 private:
117 
118  std::shared_ptr<HepRandomEngine> localEngine;
119  double status[3], oldm;
120 
121  // static data
122  static CLHEP_THREAD_LOCAL double status_st[3];
123  static CLHEP_THREAD_LOCAL double oldm_st;
124  static const double meanMax_st;
125 
126 };
127 
128 } // namespace CLHEP
129 
130 #include "CLHEP/Random/RandPoisson.icc"
131 
132 #endif
static constexpr double m
static double * getPStatus()
Definition: RandPoisson.h:108
static void setOldMean(double val)
Definition: RandPoisson.h:106
static long shoot(double m=1.0)
Definition: RandPoisson.cc:91
void fireArray(const int size, long *vect)
Definition: RandPoisson.cc:269
static void setPStatus(double sq, double alxm, double g1)
Definition: RandPoisson.h:110
static std::string distributionName()
Definition: RandPoisson.h:94
HepRandomEngine * getLocalEngine()
std::ostream & put(std::ostream &os) const
Definition: RandPoisson.cc:281
HepRandomEngine & engine()
Definition: RandPoisson.cc:36
static void shootArray(const int size, long *vect, double m=1.0)
Definition: RandPoisson.cc:146
static double getMaxMean()
Definition: RandPoisson.h:104
#define CLHEP_THREAD_LOCAL
Definition: thread_local.h:25
static double getOldMean()
Definition: RandPoisson.h:102
virtual ~RandPoisson()
Definition: RandPoisson.cc:43
RandPoisson(HepRandomEngine &anEngine, double a1=1.0)
std::string name() const
Definition: RandPoisson.cc:35