Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/externals/clhep/include/CLHEP/Random/RandomEngine.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 //                        --- HepRandomEngine ---
  6 //                          class header file
  7 // -----------------------------------------------------------------------
  8 // This file is part of Geant4 (simulation toolkit for HEP).
  9 //
 10 // Is the abstract class defining the interface for each random engine. It
 11 // implements the getSeed() and getSeeds() methods which return the initial
 12 // seed value and the initial array of seeds respectively. It defines 7
 13 // pure virtual functions: flat(), flatArray(), setSeed(), setSeeds(),
 14 // saveStatus(), restoreStatus() and showStatus(), which are implemented by
 15 // the concrete random engines each one inheriting from this abstract class.
 16 // Many concrete random engines can be defined and added to the structure,
 17 // simply making them inheriting from HepRandomEngine and defining the six
 18 // functions flat(), flatArray(), setSeed(), setSeeds(), saveStatus(),
 19 // restoreStatus() and showStatus() in such a way that flat() and
 20 // flatArray() return double random values ranging between ]0,1[.
 21 // All the random engines have a default seed value already set but they
 22 // can be instantiated with a different seed value set up by the user.
 23 
 24 // =======================================================================
 25 // Gabriele Cosmo - Created: 5th September 1995
 26 //                - Minor corrections: 31st October 1996
 27 //                - Added methods for engine status: 19th November 1996
 28 //                - Removed default values to setSeed() and
 29 //                  setSeeds() pure virtual methods: 16th Oct 1997
 30 //                - Moved seeds table to HepRandom: 19th Mar 1998
 31 // Ken Smith      - Added conversion operators:  6th Aug 1998
 32 // Mark Fischler  - Added static twoToMinus_xx constants: 11 Sept 1998
 33 // Mark Fischler  - Removed getTableSeeds, which was migrated to HepRandom
 34 //                  in 1998.  10 Feb 2005.
 35 // =======================================================================
 36 
 37 #ifndef HepRandomEngine_h
 38 #define HepRandomEngine_h 1
 39 
 40 #include <iostream>
 41 #include <fstream>
 42 #include <iomanip>
 43 #include <string>
 44 #include <sstream>
 45 #include <vector>
 46 
 47 namespace CLHEP {
 48 
 49 /**
 50  * @author <Gabriele.Cosmo@cern.ch>
 51  * @ingroup random
 52  */
 53 class HepRandomEngine {
 54 
 55 public:
 56 
 57   HepRandomEngine();
 58   virtual ~HepRandomEngine();
 59   // Constructor and destructor
 60 
 61   inline bool operator==(const HepRandomEngine& engine);
 62   inline bool operator!=(const HepRandomEngine& engine);
 63   // Overloaded operators, ==, !=
 64 
 65   virtual double flat() = 0;
 66   // Should return a pseudo random number between 0 and 1 
 67   // (excluding the end points)
 68 
 69   virtual void flatArray(const int size, double* vect) = 0;
 70   // Fills an array "vect" of specified size with flat random values.
 71 
 72   virtual void setSeed(long seed, int) = 0;
 73   // Should initialise the status of the algorithm according to seed.
 74 
 75   virtual void setSeeds(const long * seeds, int) = 0;
 76   // Should initialise the status of the algorithm according to the zero terminated
 77   // array of seeds. It is allowed to ignore one or many seeds in this array.
 78 
 79   virtual void saveStatus( const char filename[] = "Config.conf") const = 0;
 80   // Should save on a file specific to the instantiated engine in use
 81   // the current status.
 82 
 83   virtual void restoreStatus( const char filename[] = "Config.conf" ) = 0;
 84   // Should read from a file (specific to the instantiated engine in use)
 85   // and restore the last saved engine configuration.
 86 
 87   virtual void showStatus() const = 0;
 88   // Should dump the current engine status on the screen.
 89 
 90   virtual std::string name() const = 0;
 91   // Engine name.
 92 
 93   virtual std::ostream & put (std::ostream & os) const;
 94   virtual std::istream & get (std::istream & is);
 95   // Save and restore to/from streams
 96 
 97   static std::string beginTag ( );
 98   virtual std::istream & getState ( std::istream & is );
 99   // Helpers for EngineFactory which restores anonymous engine from istream
100 
101   static HepRandomEngine* newEngine(std::istream & is);
102   // Instantiates on the heap a new engine of type specified by content of is
103 
104   static HepRandomEngine* newEngine(const std::vector<unsigned long> & v);
105   // Instantiates on the heap a new engine of type specified by content of v
106 
107   virtual std::vector<unsigned long> put () const;
108   virtual bool get (const std::vector<unsigned long> & v);
109   virtual bool getState (const std::vector<unsigned long> & v);
110   // Save and restore to/from vectors
111 
112   long getSeed() const { return theSeed; }
113   // Gets the current seed.
114 
115   const long* getSeeds() const { return theSeeds; }
116   // Gets the current array of seeds.
117 
118   virtual operator double();        // Returns same as flat()
119   virtual operator float();         // less precise flat, faster if possible
120   virtual operator unsigned int();     // 32-bit int flat, faster if possible
121 
122   // The above three conversion operators permit one to retrieve a pseudo-
123   // random number as either a double-precision float, a single-precision
124   // float, or a 32-bit unsigned integer. The usage, presuming an object
125   // of the respective engine class "e", is as follows:
126 
127   // Recommended:
128   //    float x;
129   //    x = float( e );
130 
131   // Reasonable:
132   //    x = e;
133 
134   // Works, but bad practice:
135   //    x = 1.5 + e;
136 
137   // Won't compile:
138   //    x = e + 1.5;
139 
140 protected:
141 
142   long theSeed;
143   const long* theSeeds;
144 
145   static  inline double exponent_bit_32();
146   static  inline double mantissa_bit_12();
147   static  inline double mantissa_bit_24();
148   static  inline double mantissa_bit_32();
149   static  inline double twoToMinus_32();
150   static  inline double twoToMinus_48();
151   static  inline double twoToMinus_49();
152   static  inline double twoToMinus_53();
153   static  inline double nearlyTwoToMinus_54();
154 
155   static bool checkFile (std::istream & file, 
156                const std::string & filename, 
157                const std::string & classname, 
158              const std::string & methodname); 
159 
160 };
161 
162 std::ostream & operator<< (std::ostream & os, const HepRandomEngine & e);
163 std::istream & operator>> (std::istream & is, HepRandomEngine & e);
164 
165 template <class IS, class T> 
166 bool possibleKeywordInput (IS & is, const std::string & key, T & t) {
167   std::string firstWord;
168   is >> firstWord;
169   if (firstWord == key) return true;
170   std::istringstream reread(firstWord);
171   reread >> t;
172   return false;
173 }
174 
175 }  // namespace CLHEP
176 
177 #include "CLHEP/Random/RandomEngine.icc"
178 
179 #endif
180