ECCE @ EIC Software
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
RandPoisson.h
Go to the documentation of this file. Or view the newest version in sPHENIX GitHub for file RandPoisson.h
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"
34 
35 namespace CLHEP {
36 
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 m=1.0 );
67 
68  static void shootArray ( const int size, long* vect, double m=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 m=1.0 );
74 
75  static void shootArray ( HepRandomEngine* anEngine,
76  const int size, long* vect, double m=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 m );
83 
84  void fireArray ( const int size, long* vect );
85  void fireArray ( const int size, long* vect, double m);
86 
87  double operator()();
88  double operator()( double m );
89 
90  std::string name() const;
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 
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];
123  static const double meanMax_st;
124 
125 };
126 
127 } // namespace CLHEP
128 
129 #include "CLHEP/Random/RandPoisson.icc"
130 
131 #endif