Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/externals/clhep/src/RanecuEngine.cc

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 ]

Diff markup

Differences between /externals/clhep/src/RanecuEngine.cc (Version 11.3.0) and /externals/clhep/src/RanecuEngine.cc (Version 9.6.p1)


                                                   >>   1 // $Id:$
  1 // -*- C++ -*-                                      2 // -*- C++ -*-
  2 //                                                  3 //
  3 // -------------------------------------------      4 // -----------------------------------------------------------------------
  4 //                             HEP Random           5 //                             HEP Random
  5 //                        --- RanecuEngine ---      6 //                        --- RanecuEngine ---
  6 //                      class implementation f      7 //                      class implementation file
  7 // -------------------------------------------      8 // -----------------------------------------------------------------------
  8 // This file is part of Geant4 (simulation too      9 // This file is part of Geant4 (simulation toolkit for HEP).
  9 //                                                 10 //
 10 // RANECU Random Engine - algorithm originally     11 // RANECU Random Engine - algorithm originally written in FORTRAN77
 11 //                        as part of the MATHL     12 //                        as part of the MATHLIB HEP library.
 12                                                    13 
 13 // ===========================================     14 // =======================================================================
 14 // Gabriele Cosmo - Created - 2nd February 199     15 // Gabriele Cosmo - Created - 2nd February 1996
 15 //                - Minor corrections: 31st Oc     16 //                - Minor corrections: 31st October 1996
 16 //                - Added methods for engine s     17 //                - Added methods for engine status: 19th November 1996
 17 //                - Added abs for setting seed     18 //                - Added abs for setting seed index: 11th July 1997
 18 //                - Modified setSeeds() to han     19 //                - Modified setSeeds() to handle default index: 16th Oct 1997
 19 //                - setSeed() now resets the e     20 //                - setSeed() now resets the engine status to the original
 20 //                  values in the static table     21 //                  values in the static table of HepRandom: 19th Mar 1998
 21 // J.Marraffino   - Added stream operators and     22 // J.Marraffino   - Added stream operators and related constructor.
 22 //                  Added automatic seed selec     23 //                  Added automatic seed selection from seed table and
 23 //                  engine counter: 16th Feb 1     24 //                  engine counter: 16th Feb 1998
 24 // Ken Smith      - Added conversion operators     25 // Ken Smith      - Added conversion operators:  6th Aug 1998
 25 // J. Marraffino  - Remove dependence on hepSt     26 // J. Marraffino  - Remove dependence on hepString class   13 May 1999
 26 // M. Fischler    - Add endl to the end of sav     27 // M. Fischler    - Add endl to the end of saveStatus      10 Apr 2001
 27 // M. Fischler    - In restore, checkFile for      28 // M. Fischler    - In restore, checkFile for file not found    03 Dec 2004
 28 // M. Fischler    - Methods for distrib. insta     29 // M. Fischler    - Methods for distrib. instance save/restore  12/8/04    
 29 // M. Fischler    - split get() into tag valid     30 // M. Fischler    - split get() into tag validation and 
 30 //                  getState() for anonymous r     31 //                  getState() for anonymous restores           12/27/04    
 31 // M. Fischler    - put/get for vectors of ulo     32 // M. Fischler    - put/get for vectors of ulongs   3/14/05
 32 // M. Fischler    - State-saving using only in     33 // M. Fischler    - State-saving using only ints, for portability 4/12/05
 33 // M. Fischler    - Modify ctor and setSeed to     34 // M. Fischler    - Modify ctor and setSeed to utilize all info provided
 34 //                  and avoid coincidence of s     35 //                  and avoid coincidence of same state from different
 35 //                  seeds                          36 //                  seeds                                       6/22/10
 36 //                                                 37 //        
 37 // ===========================================     38 // =======================================================================
 38                                                    39 
 39 #include "CLHEP/Random/Random.h"                   40 #include "CLHEP/Random/Random.h"
 40 #include "CLHEP/Random/RanecuEngine.h"             41 #include "CLHEP/Random/RanecuEngine.h"
 41 #include "CLHEP/Random/engineIDulong.h"            42 #include "CLHEP/Random/engineIDulong.h"
 42 #include "CLHEP/Utility/atomic_int.h"          << 
 43                                                << 
 44 #include <atomic>                              << 
 45 #include <cstdlib>                             << 
 46 #include <cmath>                               << 
 47 #include <iostream>                            << 
 48 #include <string>                              << 
 49 #include <string.h> // for strcmp                  43 #include <string.h> // for strcmp
 50 #include <vector>                              <<  44 #include <cmath>
                                                   >>  45 #include <cstdlib>
 51                                                    46 
 52 namespace CLHEP {                                  47 namespace CLHEP {
 53                                                    48 
 54 namespace {                                    << 
 55   // Number of instances with automatic seed s << 
 56   CLHEP_ATOMIC_INT_TYPE numberOfEngines(0);    << 
 57 }                                              << 
 58                                                << 
 59 static const int MarkerLen = 64; // Enough roo     49 static const int MarkerLen = 64; // Enough room to hold a begin or end marker. 
 60                                                    50 
 61 static const double prec = 4.6566128E-10;          51 static const double prec = 4.6566128E-10;
 62                                                    52 
 63 std::string RanecuEngine::name() const {return     53 std::string RanecuEngine::name() const {return "RanecuEngine";}
 64                                                    54 
 65 void RanecuEngine::further_randomize (int seq1     55 void RanecuEngine::further_randomize (int seq1, int col, int index, int modulus)
 66 {                                                  56 {
 67   table[seq1][col] -= (index&0x3FFFFFFF);          57   table[seq1][col] -= (index&0x3FFFFFFF);
 68   while (table[seq1][col] <= 0) table[seq1][co     58   while (table[seq1][col] <= 0) table[seq1][col] += (modulus-1);
 69 }  // mf 6/22/10                                   59 }  // mf 6/22/10
 70                                                    60 
                                                   >>  61 // Number of instances with automatic seed selection
                                                   >>  62 int RanecuEngine::numEngines = 0;
                                                   >>  63 
 71 RanecuEngine::RanecuEngine()                       64 RanecuEngine::RanecuEngine()
 72 : HepRandomEngine()                                65 : HepRandomEngine()
 73 {                                                  66 {
 74   int numEngines = numberOfEngines++;          << 
 75   int cycle = std::abs(int(numEngines/maxSeq))     67   int cycle = std::abs(int(numEngines/maxSeq));
 76   seq = std::abs(int(numEngines%maxSeq));          68   seq = std::abs(int(numEngines%maxSeq));
 77                                                <<  69   numEngines += 1;
 78   theSeed = seq;                                   70   theSeed = seq;
 79   long mask = ((cycle & 0x007fffff) << 8);         71   long mask = ((cycle & 0x007fffff) << 8);
 80   for (int i=0; i<2; ++i) {                        72   for (int i=0; i<2; ++i) {
 81     for (int j=0; j<maxSeq; ++j) {                 73     for (int j=0; j<maxSeq; ++j) {
 82       HepRandom::getTheTableSeeds(table[j],j);     74       HepRandom::getTheTableSeeds(table[j],j);
 83       table[j][i] ^= mask;                         75       table[j][i] ^= mask;
 84     }                                              76     }
 85   }                                                77   }
 86   theSeeds = &table[seq][0];                       78   theSeeds = &table[seq][0];
 87 }                                                  79 }
 88                                                    80 
 89 RanecuEngine::RanecuEngine(int index)              81 RanecuEngine::RanecuEngine(int index)
 90 : HepRandomEngine()                                82 : HepRandomEngine()
 91 {                                                  83 {
 92   int cycle = std::abs(int(index/maxSeq));         84   int cycle = std::abs(int(index/maxSeq));
 93   seq = std::abs(int(index%maxSeq));               85   seq = std::abs(int(index%maxSeq));
 94   theSeed = seq;                                   86   theSeed = seq;
 95   long mask = ((cycle & 0x000007ff) << 20);        87   long mask = ((cycle & 0x000007ff) << 20);
 96   for (int j=0; j<maxSeq; ++j) {                   88   for (int j=0; j<maxSeq; ++j) {
 97     HepRandom::getTheTableSeeds(table[j],j);       89     HepRandom::getTheTableSeeds(table[j],j);
 98     table[j][0] ^= mask;                           90     table[j][0] ^= mask;
 99     table[j][1] ^= mask;                           91     table[j][1] ^= mask;
100   }                                                92   }
101   theSeeds = &table[seq][0];                       93   theSeeds = &table[seq][0];
102   further_randomize (seq, 0, index, shift1);       94   further_randomize (seq, 0, index, shift1);     // mf 6/22/10
103 }                                                  95 }
104                                                    96 
105 RanecuEngine::RanecuEngine(std::istream& is)       97 RanecuEngine::RanecuEngine(std::istream& is)
106 : HepRandomEngine()                                98 : HepRandomEngine()
107 {                                                  99 {
108    is >> *this;                                   100    is >> *this;
109 }                                                 101 }
110                                                   102 
111 RanecuEngine::~RanecuEngine() {}                  103 RanecuEngine::~RanecuEngine() {}
112                                                   104 
113 void RanecuEngine::setSeed(long index, int dum    105 void RanecuEngine::setSeed(long index, int dum)
114 {                                                 106 {
115   seq = std::abs(int(index%maxSeq));              107   seq = std::abs(int(index%maxSeq));
116   theSeed = seq;                                  108   theSeed = seq;
117   HepRandom::getTheTableSeeds(table[seq],seq);    109   HepRandom::getTheTableSeeds(table[seq],seq);
118   theSeeds = &table[seq][0];                      110   theSeeds = &table[seq][0];
119   further_randomize (seq, 0, (int)index, shift << 111   further_randomize (seq, 0, index, shift1);     // mf 6/22/10
120   further_randomize (seq, 1, dum,   shift2);      112   further_randomize (seq, 1, dum,   shift2);     // mf 6/22/10
121 }                                                 113 }
122                                                   114 
123 void RanecuEngine::setSeeds(const long* seeds,    115 void RanecuEngine::setSeeds(const long* seeds, int pos)
124 {                                                 116 {
125   if (pos != -1) {                                117   if (pos != -1) {
126     seq = std::abs(int(pos%maxSeq));              118     seq = std::abs(int(pos%maxSeq));
127     theSeed = seq;                                119     theSeed = seq;
128   }                                               120   }
129   // only positive seeds are allowed              121   // only positive seeds are allowed
130   table[seq][0] = std::abs(seeds[0])%shift1;      122   table[seq][0] = std::abs(seeds[0])%shift1;
131   table[seq][1] = std::abs(seeds[1])%shift2;      123   table[seq][1] = std::abs(seeds[1])%shift2;
132   theSeeds = &table[seq][0];                      124   theSeeds = &table[seq][0];
133 }                                                 125 }
134                                                   126 
135 void RanecuEngine::setIndex(long index)           127 void RanecuEngine::setIndex(long index)
136 {                                                 128 {
137   seq = std::abs(int(index%maxSeq));              129   seq = std::abs(int(index%maxSeq));
138   theSeed = seq;                                  130   theSeed = seq;
139   theSeeds = &table[seq][0];                      131   theSeeds = &table[seq][0];
140 }                                                 132 }
141                                                   133 
142 void RanecuEngine::saveStatus( const char file    134 void RanecuEngine::saveStatus( const char filename[] ) const
143 {                                                 135 {
144    std::ofstream outFile( filename, std::ios::    136    std::ofstream outFile( filename, std::ios::out ) ;
145                                                   137 
146   if (!outFile.bad()) {                           138   if (!outFile.bad()) {
147     outFile << "Uvec\n";                          139     outFile << "Uvec\n";
148     std::vector<unsigned long> v = put();         140     std::vector<unsigned long> v = put();
149     for (unsigned int i=0; i<v.size(); ++i) {     141     for (unsigned int i=0; i<v.size(); ++i) {
150       outFile << v[i] << "\n";                    142       outFile << v[i] << "\n";
151     }                                             143     }
152   }                                               144   }
153 }                                                 145 }
154                                                   146 
155 void RanecuEngine::restoreStatus( const char f    147 void RanecuEngine::restoreStatus( const char filename[] )
156 {                                                 148 {
157   std::ifstream inFile( filename, std::ios::in    149   std::ifstream inFile( filename, std::ios::in);
158   if (!checkFile ( inFile, filename, engineNam    150   if (!checkFile ( inFile, filename, engineName(), "restoreStatus" )) {
159     std::cerr << "  -- Engine state remains un    151     std::cerr << "  -- Engine state remains unchanged\n";
160     return;                                       152     return;
161   }                                               153   }
162   if ( possibleKeywordInput ( inFile, "Uvec",     154   if ( possibleKeywordInput ( inFile, "Uvec", theSeed ) ) {
163     std::vector<unsigned long> v;                 155     std::vector<unsigned long> v;
164     unsigned long xin;                            156     unsigned long xin;
165     for (unsigned int ivec=0; ivec < VECTOR_ST    157     for (unsigned int ivec=0; ivec < VECTOR_STATE_SIZE; ++ivec) {
166       inFile >> xin;                              158       inFile >> xin;
167       if (!inFile) {                              159       if (!inFile) {
168         inFile.clear(std::ios::badbit | inFile    160         inFile.clear(std::ios::badbit | inFile.rdstate());
169         std::cerr << "\nJamesRandom state (vec    161         std::cerr << "\nJamesRandom state (vector) description improper."
170          << "\nrestoreStatus has failed."         162          << "\nrestoreStatus has failed."
171          << "\nInput stream is probably mispos    163          << "\nInput stream is probably mispositioned now." << std::endl;
172         return;                                   164         return;
173       }                                           165       }
174       v.push_back(xin);                           166       v.push_back(xin);
175     }                                             167     }
176     getState(v);                                  168     getState(v);
177     return;                                       169     return;
178   }                                               170   }
179                                                   171 
180   if (!inFile.bad() && !inFile.eof()) {           172   if (!inFile.bad() && !inFile.eof()) {
181 //     inFile >> theSeed;  removed -- encompas    173 //     inFile >> theSeed;  removed -- encompased by possibleKeywordInput
182      for (int i=0; i<2; ++i)                      174      for (int i=0; i<2; ++i)
183        inFile >> table[theSeed][i];               175        inFile >> table[theSeed][i];
184      seq = int(theSeed);                          176      seq = int(theSeed);
185   }                                               177   }
186 }                                                 178 }
187                                                   179 
188 void RanecuEngine::showStatus() const             180 void RanecuEngine::showStatus() const
189 {                                                 181 {
190    std::cout << std::endl;                        182    std::cout << std::endl;
191    std::cout << "--------- Ranecu engine statu    183    std::cout << "--------- Ranecu engine status ---------" << std::endl;
192    std::cout << " Initial seed (index) = " <<     184    std::cout << " Initial seed (index) = " << theSeed << std::endl;
193    std::cout << " Current couple of seeds = "     185    std::cout << " Current couple of seeds = "
194        << table[theSeed][0] << ", "               186        << table[theSeed][0] << ", "
195        << table[theSeed][1] << std::endl;         187        << table[theSeed][1] << std::endl;
196    std::cout << "-----------------------------    188    std::cout << "----------------------------------------" << std::endl;
197 }                                                 189 }
198                                                   190 
199 double RanecuEngine::flat()                       191 double RanecuEngine::flat()
200 {                                                 192 {
201    const int index = seq;                         193    const int index = seq;
202    long seed1 = table[index][0];                  194    long seed1 = table[index][0];
203    long seed2 = table[index][1];                  195    long seed2 = table[index][1];
204                                                   196 
205    int k1 = (int)(seed1/ecuyer_b);                197    int k1 = (int)(seed1/ecuyer_b);
206    int k2 = (int)(seed2/ecuyer_e);                198    int k2 = (int)(seed2/ecuyer_e);
207                                                   199 
208    seed1 = ecuyer_a*(seed1-k1*ecuyer_b)-k1*ecu    200    seed1 = ecuyer_a*(seed1-k1*ecuyer_b)-k1*ecuyer_c;
209    if (seed1 < 0) seed1 += shift1;                201    if (seed1 < 0) seed1 += shift1;
210    seed2 = ecuyer_d*(seed2-k2*ecuyer_e)-k2*ecu    202    seed2 = ecuyer_d*(seed2-k2*ecuyer_e)-k2*ecuyer_f;
211    if (seed2 < 0) seed2 += shift2;                203    if (seed2 < 0) seed2 += shift2;
212                                                   204 
213    table[index][0] = seed1;                       205    table[index][0] = seed1;
214    table[index][1] = seed2;                       206    table[index][1] = seed2;
215                                                   207 
216    long diff = seed1-seed2;                       208    long diff = seed1-seed2;
217                                                   209 
218    if (diff <= 0) diff += (shift1-1);             210    if (diff <= 0) diff += (shift1-1);
219    return (double)(diff*prec);                    211    return (double)(diff*prec);
220 }                                                 212 }
221                                                   213 
222 void RanecuEngine::flatArray(const int size, d    214 void RanecuEngine::flatArray(const int size, double* vect)
223 {                                                 215 {
224    const int index = seq;                         216    const int index = seq;
225    long seed1 = table[index][0];                  217    long seed1 = table[index][0];
226    long seed2 = table[index][1];                  218    long seed2 = table[index][1];
227    int k1, k2;                                    219    int k1, k2;
228    int i;                                      << 220    register int i;
229                                                   221 
230    for (i=0; i<size; ++i)                         222    for (i=0; i<size; ++i)
231    {                                              223    {
232      k1 = (int)(seed1/ecuyer_b);                  224      k1 = (int)(seed1/ecuyer_b);
233      k2 = (int)(seed2/ecuyer_e);                  225      k2 = (int)(seed2/ecuyer_e);
234                                                   226 
235      seed1 = ecuyer_a*(seed1-k1*ecuyer_b)-k1*e    227      seed1 = ecuyer_a*(seed1-k1*ecuyer_b)-k1*ecuyer_c;
236      if (seed1 < 0) seed1 += shift1;              228      if (seed1 < 0) seed1 += shift1;
237      seed2 = ecuyer_d*(seed2-k2*ecuyer_e)-k2*e    229      seed2 = ecuyer_d*(seed2-k2*ecuyer_e)-k2*ecuyer_f;
238      if (seed2 < 0) seed2 += shift2;              230      if (seed2 < 0) seed2 += shift2;
239                                                   231 
240      long diff = seed1-seed2;                     232      long diff = seed1-seed2;
241      if (diff <= 0) diff += (shift1-1);           233      if (diff <= 0) diff += (shift1-1);
242                                                   234 
243      vect[i] = (double)(diff*prec);               235      vect[i] = (double)(diff*prec);
244    }                                              236    }
245    table[index][0] = seed1;                       237    table[index][0] = seed1;
246    table[index][1] = seed2;                       238    table[index][1] = seed2;
247 }                                              << 
248                                                << 
249 RanecuEngine::operator double() {              << 
250   return flat();                               << 
251 }                                              << 
252                                                << 
253 RanecuEngine::operator float() {               << 
254   return float( flat() );                      << 
255 }                                                 239 }
256                                                   240 
257 RanecuEngine::operator unsigned int() {           241 RanecuEngine::operator unsigned int() {
258    const int index = seq;                         242    const int index = seq;
259    long seed1 = table[index][0];                  243    long seed1 = table[index][0];
260    long seed2 = table[index][1];                  244    long seed2 = table[index][1];
261                                                   245 
262    int k1 = (int)(seed1/ecuyer_b);                246    int k1 = (int)(seed1/ecuyer_b);
263    int k2 = (int)(seed2/ecuyer_e);                247    int k2 = (int)(seed2/ecuyer_e);
264                                                   248 
265    seed1 = ecuyer_a*(seed1-k1*ecuyer_b)-k1*ecu    249    seed1 = ecuyer_a*(seed1-k1*ecuyer_b)-k1*ecuyer_c;
266    if (seed1 < 0) seed1 += shift1;                250    if (seed1 < 0) seed1 += shift1;
267    seed2 = ecuyer_d*(seed2-k2*ecuyer_e)-k2*ecu    251    seed2 = ecuyer_d*(seed2-k2*ecuyer_e)-k2*ecuyer_f;
268    if (seed2 < 0) seed2 += shift2;                252    if (seed2 < 0) seed2 += shift2;
269                                                   253 
270    table[index][0] = seed1;                       254    table[index][0] = seed1;
271    table[index][1] = seed2;                       255    table[index][1] = seed2;
272    long diff = seed1-seed2;                       256    long diff = seed1-seed2;
273    if( diff <= 0 ) diff += (shift1-1);            257    if( diff <= 0 ) diff += (shift1-1);
274                                                   258 
275    return ((diff << 1) | (seed1&1))& 0xfffffff    259    return ((diff << 1) | (seed1&1))& 0xffffffff;
276 }                                                 260 }
277                                                   261 
278 std::ostream & RanecuEngine::put( std::ostream    262 std::ostream & RanecuEngine::put( std::ostream& os ) const
279 {                                                 263 {
280    char beginMarker[] = "RanecuEngine-begin";     264    char beginMarker[] = "RanecuEngine-begin";
281   os << beginMarker << "\nUvec\n";                265   os << beginMarker << "\nUvec\n";
282   std::vector<unsigned long> v = put();           266   std::vector<unsigned long> v = put();
283   for (unsigned int i=0; i<v.size(); ++i) {       267   for (unsigned int i=0; i<v.size(); ++i) {
284      os <<  v[i] <<  "\n";                        268      os <<  v[i] <<  "\n";
285   }                                               269   }
286   return os;                                      270   return os;  
287 }                                                 271 }
288                                                   272 
289 std::vector<unsigned long> RanecuEngine::put (    273 std::vector<unsigned long> RanecuEngine::put () const {
290   std::vector<unsigned long> v;                   274   std::vector<unsigned long> v;
291   v.push_back (engineIDulong<RanecuEngine>());    275   v.push_back (engineIDulong<RanecuEngine>());
292   v.push_back(static_cast<unsigned long>(theSe    276   v.push_back(static_cast<unsigned long>(theSeed));
293   v.push_back(static_cast<unsigned long>(table    277   v.push_back(static_cast<unsigned long>(table[theSeed][0]));
294   v.push_back(static_cast<unsigned long>(table    278   v.push_back(static_cast<unsigned long>(table[theSeed][1]));
295   return v;                                       279   return v;
296 }                                                 280 }
297                                                   281 
298 std::istream & RanecuEngine::get ( std::istrea    282 std::istream & RanecuEngine::get ( std::istream& is )
299 {                                                 283 {
300   char beginMarker [MarkerLen];                   284   char beginMarker [MarkerLen];
301                                                   285 
302   is >> std::ws;                                  286   is >> std::ws;
303   is.width(MarkerLen);  // causes the next rea    287   is.width(MarkerLen);  // causes the next read to the char* to be <=
304       // that many bytes, INCLUDING A TERMINAT    288       // that many bytes, INCLUDING A TERMINATION \0 
305       // (Stroustrup, section 21.3.2)             289       // (Stroustrup, section 21.3.2)
306   is >> beginMarker;                              290   is >> beginMarker;
307   if (strcmp(beginMarker,"RanecuEngine-begin")    291   if (strcmp(beginMarker,"RanecuEngine-begin")) {
308      is.clear(std::ios::badbit | is.rdstate())    292      is.clear(std::ios::badbit | is.rdstate());
309      std::cerr << "\nInput stream mispositione    293      std::cerr << "\nInput stream mispositioned or"
310          << "\nRanecuEngine state description     294          << "\nRanecuEngine state description missing or"
311          << "\nwrong engine type found." << st    295          << "\nwrong engine type found." << std::endl;
312      return is;                                   296      return is;
313    }                                              297    }
314   return getState(is);                            298   return getState(is);
315 }                                                 299 }
316                                                   300 
317 std::string RanecuEngine::beginTag ( )  {         301 std::string RanecuEngine::beginTag ( )  { 
318   return "RanecuEngine-begin";                    302   return "RanecuEngine-begin"; 
319 }                                                 303 }
320                                                   304 
321 std::istream & RanecuEngine::getState ( std::i    305 std::istream & RanecuEngine::getState ( std::istream& is )
322 {                                                 306 {
323   if ( possibleKeywordInput ( is, "Uvec", theS    307   if ( possibleKeywordInput ( is, "Uvec", theSeed ) ) {
324     std::vector<unsigned long> v;                 308     std::vector<unsigned long> v;
325     unsigned long uu;                             309     unsigned long uu;
326     for (unsigned int ivec=0; ivec < VECTOR_ST    310     for (unsigned int ivec=0; ivec < VECTOR_STATE_SIZE; ++ivec) {
327       is >> uu;                                   311       is >> uu;
328       if (!is) {                                  312       if (!is) {
329         is.clear(std::ios::badbit | is.rdstate    313         is.clear(std::ios::badbit | is.rdstate());
330         std::cerr << "\nRanecuEngine state (ve    314         std::cerr << "\nRanecuEngine state (vector) description improper."
331     << "\ngetState() has failed."                 315     << "\ngetState() has failed."
332          << "\nInput stream is probably mispos    316          << "\nInput stream is probably mispositioned now." << std::endl;
333         return is;                                317         return is;
334       }                                           318       }
335       v.push_back(uu);                            319       v.push_back(uu);
336     }                                             320     }
337     getState(v);                                  321     getState(v);
338     return (is);                                  322     return (is);
339   }                                               323   }
340                                                   324 
341 //  is >> theSeed;  Removed, encompassed by po    325 //  is >> theSeed;  Removed, encompassed by possibleKeywordInput()
342   char endMarker   [MarkerLen];                   326   char endMarker   [MarkerLen];
343    for (int i=0; i<2; ++i) {                      327    for (int i=0; i<2; ++i) {
344      is >> table[theSeed][i];                     328      is >> table[theSeed][i];
345    }                                              329    }
346   is >> std::ws;                                  330   is >> std::ws;
347   is.width(MarkerLen);                            331   is.width(MarkerLen);  
348   is >> endMarker;                                332   is >> endMarker;
349   if (strcmp(endMarker,"RanecuEngine-end")) {     333   if (strcmp(endMarker,"RanecuEngine-end")) {
350      is.clear(std::ios::badbit | is.rdstate())    334      is.clear(std::ios::badbit | is.rdstate());
351      std::cerr << "\nRanecuEngine state descri    335      std::cerr << "\nRanecuEngine state description incomplete."
352          << "\nInput stream is probably mispos    336          << "\nInput stream is probably mispositioned now." << std::endl;
353      return is;                                   337      return is;
354    }                                              338    }
355                                                   339 
356    seq = int(theSeed);                            340    seq = int(theSeed);
357    return is;                                     341    return is;
358 }                                                 342 }
359                                                   343 
360 bool RanecuEngine::get (const std::vector<unsi    344 bool RanecuEngine::get (const std::vector<unsigned long> & v) {
361   if ((v[0] & 0xffffffffUL) != engineIDulong<R    345   if ((v[0] & 0xffffffffUL) != engineIDulong<RanecuEngine>()) {
362     std::cerr <<                                  346     std::cerr << 
363       "\nRanecuEngine get:state vector has wro    347       "\nRanecuEngine get:state vector has wrong ID word - state unchanged\n";
364     return false;                                 348     return false;
365   }                                               349   }
366   return getState(v);                             350   return getState(v);
367 }                                                 351 }
368                                                   352 
369 bool RanecuEngine::getState (const std::vector    353 bool RanecuEngine::getState (const std::vector<unsigned long> & v) {
370   if (v.size() != VECTOR_STATE_SIZE ) {           354   if (v.size() != VECTOR_STATE_SIZE ) {
371     std::cerr <<                                  355     std::cerr << 
372       "\nRanecuEngine get:state vector has wro    356       "\nRanecuEngine get:state vector has wrong length - state unchanged\n";
373     return false;                                 357     return false;
374   }                                               358   }
375   theSeed           = v[1];                       359   theSeed           = v[1];
376   table[theSeed][0] = v[2];                       360   table[theSeed][0] = v[2];
377   table[theSeed][1] = v[3];                       361   table[theSeed][1] = v[3];
378   seq = int(theSeed);                             362   seq = int(theSeed);
379   return true;                                    363   return true;
380 }                                                 364 }
381                                                   365 
382                                                   366 
383 }  // namespace CLHEP                             367 }  // namespace CLHEP
384                                                   368