Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/externals/clhep/include/CLHEP/Random/RandPoisson.h

Version: [ ReleaseNotes ] [ 1.0 ] [ 1.1 ] [ 2.0 ] [ 3.0 ] [ 3.1 ] [ 3.2 ] [ 4.0 ] [ 4.0.p1 ] [ 4.0.p2 ] [ 4.1 ] [ 4.1.p1 ] [ 5.0 ] [ 5.0.p1 ] [ 5.1 ] [ 5.1.p1 ] [ 5.2 ] [ 5.2.p1 ] [ 5.2.p2 ] [ 6.0 ] [ 6.0.p1 ] [ 6.1 ] [ 6.2 ] [ 6.2.p1 ] [ 6.2.p2 ] [ 7.0 ] [ 7.0.p1 ] [ 7.1 ] [ 7.1.p1 ] [ 8.0 ] [ 8.0.p1 ] [ 8.1 ] [ 8.1.p1 ] [ 8.1.p2 ] [ 8.2 ] [ 8.2.p1 ] [ 8.3 ] [ 8.3.p1 ] [ 8.3.p2 ] [ 9.0 ] [ 9.0.p1 ] [ 9.0.p2 ] [ 9.1 ] [ 9.1.p1 ] [ 9.1.p2 ] [ 9.1.p3 ] [ 9.2 ] [ 9.2.p1 ] [ 9.2.p2 ] [ 9.2.p3 ] [ 9.2.p4 ] [ 9.3 ] [ 9.3.p1 ] [ 9.3.p2 ] [ 9.4 ] [ 9.4.p1 ] [ 9.4.p2 ] [ 9.4.p3 ] [ 9.4.p4 ] [ 9.5 ] [ 9.5.p1 ] [ 9.5.p2 ] [ 9.6 ] [ 9.6.p1 ] [ 9.6.p2 ] [ 9.6.p3 ] [ 9.6.p4 ] [ 10.0 ] [ 10.0.p1 ] [ 10.0.p2 ] [ 10.0.p3 ] [ 10.0.p4 ] [ 10.1 ] [ 10.1.p1 ] [ 10.1.p2 ] [ 10.1.p3 ] [ 10.2 ] [ 10.2.p1 ] [ 10.2.p2 ] [ 10.2.p3 ] [ 10.3 ] [ 10.3.p1 ] [ 10.3.p2 ] [ 10.3.p3 ] [ 10.4 ] [ 10.4.p1 ] [ 10.4.p2 ] [ 10.4.p3 ] [ 10.5 ] [ 10.5.p1 ] [ 10.6 ] [ 10.6.p1 ] [ 10.6.p2 ] [ 10.6.p3 ] [ 10.7 ] [ 10.7.p1 ] [ 10.7.p2 ] [ 10.7.p3 ] [ 10.7.p4 ] [ 11.0 ] [ 11.0.p1 ] [ 11.0.p2 ] [ 11.0.p3, ] [ 11.0.p4 ] [ 11.1 ] [ 11.1.1 ] [ 11.1.2 ] [ 11.1.3 ] [ 11.2 ] [ 11.2.1 ] [ 11.2.2 ] [ 11.3.0 ]

  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"
 33 #include "CLHEP/Utility/thread_local.h"
 34 
 35 namespace CLHEP {
 36 
 37 /**
 38  * @author
 39  * @ingroup random
 40  */
 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 mean=1.0 );
 67 
 68   static  void shootArray ( const int size, long* vect, double mean=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 mean=1.0 );
 74 
 75   static  void shootArray ( HepRandomEngine* anEngine,
 76                             const int size, long* vect, double mean=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 mean );
 83 
 84   void fireArray ( const int size, long* vect );
 85   void fireArray ( const int size, long* vect, double mean);
 86 
 87   double operator()();
 88   double operator()( double mean );
 89   
 90   std::string name() const;
 91   HepRandomEngine & engine();
 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 
113   inline HepRandomEngine* getLocalEngine();
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];
122   static CLHEP_THREAD_LOCAL double oldm_st;
123   static const double meanMax_st;
124 
125 };
126 
127 }  // namespace CLHEP
128 
129 #include "CLHEP/Random/RandPoisson.icc"
130 
131 #endif
132