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