ECCE @ EIC Software
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
RanecuEngine.h
Go to the documentation of this file. Or view the newest version in sPHENIX GitHub for file RanecuEngine.h
1 // -*- C++ -*-
2 //
3 // -----------------------------------------------------------------------
4 // HEP Random
5 // --- RanecuEngine ---
6 // class header file
7 // -----------------------------------------------------------------------
8 // This file is part of Geant4 (simulation toolkit for HEP).
9 //
10 // RANECU Random Engine - algorithm originally written in FORTRAN77
11 // as part of the MATHLIB HEP library.
12 // The initialisation is carried out using a Multiplicative Congruential
13 // generator using formula constants of L'Ecuyer as described in "F.James,
14 // Comp. Phys. Comm. 60 (1990) 329-344".
15 // Seeds are taken from a seed table given an index, the getSeed() method
16 // returns the current index in the seed table, the getSeeds() method
17 // returns a pointer to the couple of seeds stored in the local table of
18 // seeds at the current index.
19 
20 // =======================================================================
21 // Gabriele Cosmo - Created: 2nd February 1996
22 // - Minor corrections: 31st October 1996
23 // - Added methods for engine status: 19th November 1996
24 // - setSeed() now has default dummy argument
25 // set to zero: 11th July 1997
26 // - Added default index to setSeeds(): 16th Oct 1997
27 // J.Marraffino - Added stream operators and related constructor.
28 // Added automatic seed selection from seed table and
29 // engine counter: 16th Feb 1998
30 // Ken Smith - Added conversion operators: 6th Aug 1998
31 // Mark Fischler Methods for distrib. instance save/restore 12/8/04
32 // Mark Fischler methods for anonymous save/restore 12/27/04
33 // =======================================================================
34 
35 #ifndef RanecuEngine_h
36 #define RanecuEngine_h 1
37 
39 
40 namespace CLHEP {
41 
46 class RanecuEngine : public HepRandomEngine {
47 
48 public:
49 
50  RanecuEngine(std::istream& is);
51  RanecuEngine();
52  RanecuEngine(int index);
53  virtual ~RanecuEngine();
54  // Constructors and destructor.
55 
56  double flat();
57  // Returns a pseudo random number between 0 and 1
58  // (excluding the end points)
59 
60  void flatArray (const int size, double* vect);
61  // Fills an array "vect" of specified size with flat random values.
62 
63  void setIndex (long index);
64  // Sets the state of the algorithm according to "index", the position
65  // in the local table of seeds.
66 
67  void setSeed (long index, int dum=0);
68  // Resets the state of the algorithm according to "index", the position
69  // in the static table of seeds stored in HepRandom.
70 
71  void setSeeds (const long* seeds, int index=-1);
72  // Sets the state of the algorithm according to the array of seeds
73  // "seeds" containing two seed values to be stored in the local table at
74  // "index" position.
75 
76  void saveStatus( const char filename[] = "Ranecu.conf" ) const;
77  // Saves on file Ranecu.conf the current engine status.
78 
79  void restoreStatus( const char filename[] = "Ranecu.conf" );
80  // Reads from file Ranecu.conf the last saved engine status
81  // and restores it.
82 
83  void showStatus() const;
84  // Dumps the engine status on the screen.
85 
86  operator double();
87  // Returns same as flat()
88  operator float();
89  // less precise flat, faster if possible
90  operator unsigned int();
91  // 32-bit int flat, faster in this case
92 
93  virtual std::ostream & put (std::ostream & os) const;
94  virtual std::istream & get (std::istream & is);
95  static std::string beginTag ( );
96  virtual std::istream & getState ( std::istream & is );
97 
98  std::string name() const;
99  static std::string engineName() {return "RanecuEngine";}
100 
101  std::vector<unsigned long> put () const;
102  bool get (const std::vector<unsigned long> & v);
103  bool getState (const std::vector<unsigned long> & v);
104 
105 protected:
106 
107  // Suggested L'ecuyer coefficients for portable 32 bits generators.
108 
109  static const int ecuyer_a = 40014;
110  static const int ecuyer_b = 53668;
111  static const int ecuyer_c = 12211;
112  static const int ecuyer_d = 40692;
113  static const int ecuyer_e = 52774;
114  static const int ecuyer_f = 3791;
115  static const int shift1 = 2147483563;
116  static const int shift2 = 2147483399;
117 
118  static const unsigned int VECTOR_STATE_SIZE = 4;
119 
120 private:
121 
122  // private method used to mitigate the effects of using a lookup table
123  void further_randomize (int seq, int col, int index, int modulus);
124 
125  // Members defining the current state of the generator.
126 
127  static const int maxSeq = 215;
128  long table[215][2];
129  int seq;
130 
131 };
132 
133 } // namespace CLHEP
134 
135 #endif