ECCE @ EIC Software
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
RandGauss.h
Go to the documentation of this file. Or view the newest version in sPHENIX GitHub for file RandGauss.h
1 // -*- C++ -*-
2 //
3 // -----------------------------------------------------------------------
4 // HEP Random
5 // --- RandGauss ---
6 // class header file
7 // -----------------------------------------------------------------------
8 // This file is part of Geant4 (simulation toolkit for HEP).
9 
10 // Class defining methods for shooting gaussian distributed random values,
11 // given a mean (default=0) or specifying also a deviation (default=1).
12 // Gaussian random numbers are generated two at the time, so every
13 // other time shoot is called the number returned is the one generated the
14 // time before.
15 // Default values are used for operator()().
16 
17 // =======================================================================
18 // Gabriele Cosmo - Created: 5th September 1995
19 // - Minor corrections: 31st October 1996
20 // - Added methods to shoot arrays: 28th July 1997
21 // J.Marraffino - Added default arguments as attributes and
22 // operator() with arguments. Introduced method normal()
23 // for computation in fire(): 16th Feb 1998
24 // Gabriele Cosmo - Relocated static data from HepRandom: 5th Jan 1999
25 // M Fischler - put and get to/from streams 12/8/04
26 // =======================================================================
27 
28 #ifndef RandGauss_h
29 #define RandGauss_h 1
30 
31 #include "CLHEP/Random/Random.h"
32 #include "CLHEP/Utility/memory.h"
34 
35 namespace CLHEP {
36 
41 class RandGauss : public HepRandom {
42 
43 public:
44 
45  inline RandGauss ( HepRandomEngine& anEngine, double mean=0.0,
46  double stdDev=1.0 );
47  inline RandGauss ( HepRandomEngine* anEngine, double mean=0.0,
48  double stdDev=1.0 );
49  // These constructors should be used to instantiate a RandGauss
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 RandGauss destructor.
55  // If the engine is passed by reference the corresponding engine object
56  // will not be deleted by the RandGauss destructor.
57 
58  virtual ~RandGauss();
59  // Destructor
60 
61  // Static methods to shoot random values using the static generator
62 
63  static double shoot();
64 
65  static inline double shoot( double mean, double stdDev );
66 
67  static void shootArray ( const int size, double* vect,
68  double mean=0.0, double stdDev=1.0 );
69 
70  // Static methods to shoot random values using a given engine
71  // by-passing the static generator.
72 
73  static double shoot( HepRandomEngine* anEngine );
74 
75  static inline double shoot( HepRandomEngine* anEngine,
76  double mean, double stdDev );
77 
78  static void shootArray ( HepRandomEngine* anEngine, const int size,
79  double* vect, double mean=0.0,
80  double stdDev=1.0 );
81 
82  // Methods using the localEngine to shoot random values, by-passing
83  // the static generator.
84 
85  double fire();
86 
87  inline double fire( double mean, double stdDev );
88 
89  void fireArray ( const int size, double* vect);
90  void fireArray ( const int size, double* vect,
91  double mean, double stdDev );
92 
93  virtual double operator()();
94  virtual double operator()( double mean, double stdDev );
95 
96  std::string name() const;
98 
99  static std::string distributionName() {return "RandGauss";}
100  // Provides the name of this distribution class
101 
102  // Save and restore to/from streams
103 
104  std::ostream & put ( std::ostream & os ) const;
105  std::istream & get ( std::istream & is );
106 
107  // Methods setFlag(false) and setF(false) if invoked in the client
108  // code before shoot/fire will force generation of a new couple of
109  // values.
110 
111  static bool getFlag();
112 
113  static void setFlag( bool val );
114 
115  bool getF() const {return set;}
116 
117  void setF( bool val ) {set = val;}
118 
119  // Methods overriding the base class static saveEngineStatus ones,
120  // by adding extra data so that save in one program, then further gaussians,
121  // will produce the identical sequence to restore in another program, then
122  // generating gaussian randoms there
123 
124  static void saveEngineStatus( const char filename[] = "Config.conf" );
125  // Saves to file the current status of the current engine.
126 
127  static void restoreEngineStatus( const char filename[] = "Config.conf" );
128  // Restores a saved status (if any) for the current engine.
129 
130  static std::ostream& saveFullState ( std::ostream & os );
131  // Saves to stream the state of the engine and cached data.
132 
133  static std::istream& restoreFullState ( std::istream & is );
134  // Restores from stream the state of the engine and cached data.
135 
136  static std::ostream& saveDistState ( std::ostream & os );
137  // Saves to stream the state of the cached data.
138 
139  static std::istream& restoreDistState ( std::istream & is );
140  // Restores from stream the state of the cached data.
141 
142 
143 protected:
144 
145  static double getVal();
146 
147  static void setVal( double nextVal );
148 
149  double normal();
150 
151  double defaultMean;
153 
154  std::shared_ptr<HepRandomEngine> localEngine;
155 
156 private:
157 
158  bool set;
159  double nextGauss;
160 
161  // static data
164 
165 };
166 
167 } // namespace CLHEP
168 
169 #include "CLHEP/Random/RandGauss.icc"
170 
171 #endif