Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/externals/clhep/src/RandGauss.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/RandGauss.cc (Version 11.3.0) and /externals/clhep/src/RandGauss.cc (Version 11.0)


  1 // -*- C++ -*-                                      1 // -*- C++ -*-
  2 //                                                  2 //
  3 // -------------------------------------------      3 // -----------------------------------------------------------------------
  4 //                             HEP Random           4 //                             HEP Random
  5 //                          --- RandGauss ---       5 //                          --- RandGauss ---
  6 //                      class implementation f      6 //                      class implementation file
  7 // -------------------------------------------      7 // -----------------------------------------------------------------------
  8 // This file is part of Geant4 (simulation too      8 // This file is part of Geant4 (simulation toolkit for HEP).
  9                                                     9 
 10 // ===========================================     10 // =======================================================================
 11 // Gabriele Cosmo - Created: 5th September 199     11 // Gabriele Cosmo - Created: 5th September 1995
 12 //                - Added methods to shoot arr     12 //                - Added methods to shoot arrays: 28th July 1997
 13 // J.Marraffino   - Added default arguments as     13 // J.Marraffino   - Added default arguments as attributes and
 14 //                  operator() with arguments.     14 //                  operator() with arguments. Introduced method normal()
 15 //                  for computation in fire():     15 //                  for computation in fire(): 16th Feb 1998
 16 // Gabriele Cosmo - Relocated static data from     16 // Gabriele Cosmo - Relocated static data from HepRandom: 5th Jan 1999
 17 // M Fischler     - Copy constructor should su     17 // M Fischler     - Copy constructor should supply right engine to HepRandom:
 18 //        1/26/00.                                 18 //        1/26/00.
 19 // M Fischler     - Workaround for problem of      19 // M Fischler     - Workaround for problem of non-reproducing saveEngineStatus
 20 //        by saving cached gaussian.  March 20     20 //        by saving cached gaussian.  March 2000.
 21 // M Fischler     - Avoiding hang when file no     21 // M Fischler     - Avoiding hang when file not found in restoreEngineStatus 
 22 //                  12/3/04                        22 //                  12/3/04
 23 // M Fischler     - put and get to/from stream     23 // M Fischler     - put and get to/from streams 12/8/04
 24 // M Fischler     - save and restore dist to s     24 // M Fischler     - save and restore dist to streams 12/20/04
 25 // M Fischler   - put/get to/from streams uses     25 // M Fischler   - put/get to/from streams uses pairs of ulongs when
 26 //        storing doubles avoid problems with      26 //        storing doubles avoid problems with precision.
 27 //        Similarly for saveEngineStatus and R     27 //        Similarly for saveEngineStatus and RestoreEngineStatus
 28 //        and for save/restore distState           28 //        and for save/restore distState
 29 //        Care was taken that old-form output      29 //        Care was taken that old-form output can still be read back.
 30 //      4/14/05                                    30 //      4/14/05
 31 //                                                 31 //              
 32 // ===========================================     32 // =======================================================================
 33                                                    33 
 34 #include "CLHEP/Random/RandGauss.h"                34 #include "CLHEP/Random/RandGauss.h"
 35 #include "CLHEP/Random/DoubConv.h"                 35 #include "CLHEP/Random/DoubConv.h"
 36 #include <cmath>  // for std::log()                36 #include <cmath>  // for std::log()
 37 #include <iostream>                                37 #include <iostream>
 38 #include <string.h> // for strcmp                  38 #include <string.h> // for strcmp
 39 #include <string>                                  39 #include <string>
 40 #include <vector>                                  40 #include <vector>
 41                                                    41 
 42 namespace CLHEP {                                  42 namespace CLHEP {
 43                                                    43 
 44 std::string RandGauss::name() const {return "R     44 std::string RandGauss::name() const {return "RandGauss";}
 45 HepRandomEngine & RandGauss::engine() {return      45 HepRandomEngine & RandGauss::engine() {return *localEngine;}
 46                                                    46 
 47 // Initialisation of static data                   47 // Initialisation of static data
 48 CLHEP_THREAD_LOCAL bool RandGauss::set_st = fa     48 CLHEP_THREAD_LOCAL bool RandGauss::set_st = false;
 49 CLHEP_THREAD_LOCAL double RandGauss::nextGauss     49 CLHEP_THREAD_LOCAL double RandGauss::nextGauss_st = 0.0;
 50                                                    50 
 51 RandGauss::~RandGauss() {                          51 RandGauss::~RandGauss() {
 52 }                                                  52 }
 53                                                    53 
 54 double RandGauss::operator()() {                   54 double RandGauss::operator()() {
 55   return fire( defaultMean, defaultStdDev );       55   return fire( defaultMean, defaultStdDev );
 56 }                                                  56 }
 57                                                    57 
 58 double RandGauss::operator()( double mean, dou     58 double RandGauss::operator()( double mean, double stdDev ) {
 59   return fire( mean, stdDev );                     59   return fire( mean, stdDev );
 60 }                                                  60 }
 61                                                    61 
 62 double RandGauss::shoot()                          62 double RandGauss::shoot()
 63 {                                                  63 {
 64   // Gaussian random numbers are generated two     64   // Gaussian random numbers are generated two at the time, so every other
 65   // time this is called we just return a numb     65   // time this is called we just return a number generated the time before.
 66                                                    66 
 67   if ( getFlag() ) {                               67   if ( getFlag() ) {
 68     setFlag(false);                                68     setFlag(false);
 69     double x = getVal();                           69     double x = getVal();
 70     return x;                                      70     return x; 
 71     // return getVal();                            71     // return getVal();
 72   }                                                72   } 
 73                                                    73 
 74   double r;                                        74   double r;
 75   double v1,v2,fac,val;                            75   double v1,v2,fac,val;
 76   HepRandomEngine* anEngine = HepRandom::getTh     76   HepRandomEngine* anEngine = HepRandom::getTheEngine();
 77                                                    77 
 78   do {                                             78   do {
 79     v1 = 2.0 * anEngine->flat() - 1.0;             79     v1 = 2.0 * anEngine->flat() - 1.0;
 80     v2 = 2.0 * anEngine->flat() - 1.0;             80     v2 = 2.0 * anEngine->flat() - 1.0;
 81     r = v1*v1 + v2*v2;                             81     r = v1*v1 + v2*v2;
 82   } while ( r > 1.0 );                             82   } while ( r > 1.0 );
 83                                                    83 
 84   fac = std::sqrt(-2.0*std::log(r)/r);             84   fac = std::sqrt(-2.0*std::log(r)/r);
 85   val = v1*fac;                                    85   val = v1*fac;
 86   setVal(val);                                     86   setVal(val);
 87   setFlag(true);                                   87   setFlag(true);
 88   return v2*fac;                                   88   return v2*fac;
 89 }                                                  89 }
 90                                                    90 
 91 void RandGauss::shootArray( const int size, do     91 void RandGauss::shootArray( const int size, double* vect,
 92                             double mean, doubl     92                             double mean, double stdDev )
 93 {                                                  93 {
 94   for( double* v = vect; v != vect + size; ++v     94   for( double* v = vect; v != vect + size; ++v )
 95     *v = shoot(mean,stdDev);                       95     *v = shoot(mean,stdDev);
 96 }                                                  96 }
 97                                                    97 
 98 double RandGauss::shoot( HepRandomEngine* anEn     98 double RandGauss::shoot( HepRandomEngine* anEngine )
 99 {                                                  99 {
100   // Gaussian random numbers are generated two    100   // Gaussian random numbers are generated two at the time, so every other
101   // time this is called we just return a numb    101   // time this is called we just return a number generated the time before.
102                                                   102 
103   if ( getFlag() ) {                              103   if ( getFlag() ) {
104     setFlag(false);                               104     setFlag(false);
105     return getVal();                              105     return getVal();
106   }                                               106   }
107                                                   107 
108   double r;                                       108   double r;
109   double v1,v2,fac,val;                           109   double v1,v2,fac,val;
110                                                   110 
111   do {                                            111   do {
112     v1 = 2.0 * anEngine->flat() - 1.0;            112     v1 = 2.0 * anEngine->flat() - 1.0;
113     v2 = 2.0 * anEngine->flat() - 1.0;            113     v2 = 2.0 * anEngine->flat() - 1.0;
114     r = v1*v1 + v2*v2;                            114     r = v1*v1 + v2*v2;
115   } while ( r > 1.0 );                            115   } while ( r > 1.0 );
116                                                   116 
117   fac = std::sqrt( -2.0*std::log(r)/r);           117   fac = std::sqrt( -2.0*std::log(r)/r);
118   val = v1*fac;                                   118   val = v1*fac;
119   setVal(val);                                    119   setVal(val);
120   setFlag(true);                                  120   setFlag(true);
121   return v2*fac;                                  121   return v2*fac;
122 }                                                 122 }
123                                                   123 
124 void RandGauss::shootArray( HepRandomEngine* a    124 void RandGauss::shootArray( HepRandomEngine* anEngine,
125                             const int size, do    125                             const int size, double* vect,
126                             double mean, doubl    126                             double mean, double stdDev )
127 {                                                 127 {
128   for( double* v = vect; v != vect + size; ++v    128   for( double* v = vect; v != vect + size; ++v )
129     *v = shoot(anEngine,mean,stdDev);             129     *v = shoot(anEngine,mean,stdDev);
130 }                                                 130 }
131                                                   131 
132 double RandGauss::normal()                        132 double RandGauss::normal()
133 {                                                 133 {
134   // Gaussian random numbers are generated two    134   // Gaussian random numbers are generated two at the time, so every other
135   // time this is called we just return a numb    135   // time this is called we just return a number generated the time before.
136                                                   136 
137   if ( set ) {                                    137   if ( set ) {
138     set = false;                                  138     set = false;
139     return nextGauss;                             139     return nextGauss;
140   }                                               140   }
141                                                   141 
142   double r;                                       142   double r;
143   double v1,v2,fac,val;                           143   double v1,v2,fac,val;
144                                                   144 
145   do {                                            145   do {
146     v1 = 2.0 * localEngine->flat() - 1.0;         146     v1 = 2.0 * localEngine->flat() - 1.0;
147     v2 = 2.0 * localEngine->flat() - 1.0;         147     v2 = 2.0 * localEngine->flat() - 1.0;
148     r = v1*v1 + v2*v2;                            148     r = v1*v1 + v2*v2;
149   } while ( r > 1.0 );                            149   } while ( r > 1.0 );
150                                                   150 
151   fac = std::sqrt(-2.0*std::log(r)/r);            151   fac = std::sqrt(-2.0*std::log(r)/r);
152   val = v1*fac;                                   152   val = v1*fac;
153   nextGauss = val;                                153   nextGauss = val;
154   set = true;                                     154   set = true;
155   return v2*fac;                                  155   return v2*fac;
156 }                                                 156 }
157                                                   157 
158 void RandGauss::fireArray( const int size, dou    158 void RandGauss::fireArray( const int size, double* vect)
159 {                                                 159 {
160   for( double* v = vect; v != vect + size; ++v    160   for( double* v = vect; v != vect + size; ++v )
161     *v = fire( defaultMean, defaultStdDev );      161     *v = fire( defaultMean, defaultStdDev );
162 }                                                 162 }
163                                                   163 
164 void RandGauss::fireArray( const int size, dou    164 void RandGauss::fireArray( const int size, double* vect,
165                            double mean, double    165                            double mean, double stdDev )
166 {                                                 166 {
167   for( double* v = vect; v != vect + size; ++v    167   for( double* v = vect; v != vect + size; ++v )
168     *v = fire( mean, stdDev );                    168     *v = fire( mean, stdDev );
169 }                                                 169 }
170                                                   170 
171 bool RandGauss::getFlag()                         171 bool RandGauss::getFlag()
172 {                                                 172 {
173   return set_st;                                  173   return set_st;
174 }                                                 174 }
175                                                   175 
176 void RandGauss::setFlag( bool val )               176 void RandGauss::setFlag( bool val )
177 {                                                 177 {
178   set_st = val;                                   178   set_st = val;
179 }                                                 179 }
180                                                   180 
181 double RandGauss::getVal()                        181 double RandGauss::getVal()
182 {                                                 182 {
183   return nextGauss_st;                            183   return nextGauss_st;
184 }                                                 184 }
185                                                   185 
186 void RandGauss::setVal( double nextVal )          186 void RandGauss::setVal( double nextVal )
187 {                                                 187 {
188   nextGauss_st = nextVal;                         188   nextGauss_st = nextVal;
189 }                                                 189 }
190                                                   190 
191 void RandGauss::saveEngineStatus ( const char     191 void RandGauss::saveEngineStatus ( const char filename[] ) {
192                                                   192 
193   // First save the engine status just like th    193   // First save the engine status just like the base class would do:
194   getTheEngine()->saveStatus( filename );         194   getTheEngine()->saveStatus( filename );
195                                                   195 
196   // Now append the cached variate, if any:       196   // Now append the cached variate, if any:
197                                                   197 
198   std::ofstream outfile ( filename, std::ios::    198   std::ofstream outfile ( filename, std::ios::app );
199                                                   199 
200   if ( getFlag() ) {                              200   if ( getFlag() ) {
201     std::vector<unsigned long> t(2);              201     std::vector<unsigned long> t(2);
202     t = DoubConv::dto2longs(getVal());            202     t = DoubConv::dto2longs(getVal());
203     outfile << "RANDGAUSS CACHED_GAUSSIAN: Uve    203     outfile << "RANDGAUSS CACHED_GAUSSIAN: Uvec " 
204       << getVal() << " " << t[0] << " " << t[1    204       << getVal() << " " << t[0] << " " << t[1] << "\n";
205   } else {                                        205   } else {
206     outfile << "RANDGAUSS NO_CACHED_GAUSSIAN:     206     outfile << "RANDGAUSS NO_CACHED_GAUSSIAN: 0 \n" ;
207   }                                               207   }
208                                                   208 
209 } // saveEngineStatus                             209 } // saveEngineStatus
210                                                   210 
211 void RandGauss::restoreEngineStatus( const cha    211 void RandGauss::restoreEngineStatus( const char filename[] ) {
212                                                   212 
213   // First restore the engine status just like    213   // First restore the engine status just like the base class would do:
214   getTheEngine()->restoreStatus( filename );      214   getTheEngine()->restoreStatus( filename );
215                                                   215 
216   // Now find the line describing the cached v    216   // Now find the line describing the cached variate:
217                                                   217 
218   std::ifstream infile ( filename, std::ios::i    218   std::ifstream infile ( filename, std::ios::in );
219   if (!infile) return;                            219   if (!infile) return;
220                                                   220 
221   char inputword[] = "NO_KEYWORD    "; // leav    221   char inputword[] = "NO_KEYWORD    "; // leaves room for 14 characters plus \0
222   while (true) {                                  222   while (true) {
223     infile.width(13);                             223     infile.width(13);
224     infile >> inputword;                          224     infile >> inputword;
225     if (strcmp(inputword,"RANDGAUSS")==0) brea    225     if (strcmp(inputword,"RANDGAUSS")==0) break;
226     if (infile.eof()) break;                      226     if (infile.eof()) break;
227   // If the file ends without the RANDGAUSS li    227   // If the file ends without the RANDGAUSS line, that means this
228   // was a file produced by an earlier version    228   // was a file produced by an earlier version of RandGauss.  We will
229   // replicated the old behavior in that case:    229   // replicated the old behavior in that case:  set_st is cleared.
230   }                                               230   }
231                                                   231 
232   // Then read and use the caching info:          232   // Then read and use the caching info:
233                                                   233 
234   if (strcmp(inputword,"RANDGAUSS")==0) {         234   if (strcmp(inputword,"RANDGAUSS")==0) {
235     char setword[40]; // the longest, staticFi    235     char setword[40]; // the longest, staticFirstUnusedBit: has length 21
236     infile.width(39);                             236     infile.width(39);
237     infile >> setword;  // setword should be C    237     infile >> setword;  // setword should be CACHED_GAUSSIAN:
238     if (strcmp(setword,"CACHED_GAUSSIAN:") ==0    238     if (strcmp(setword,"CACHED_GAUSSIAN:") ==0) {
239       if (possibleKeywordInput(infile, "Uvec",    239       if (possibleKeywordInput(infile, "Uvec", nextGauss_st)) {
240         std::vector<unsigned long> t(2);          240         std::vector<unsigned long> t(2);
241         infile >> nextGauss_st >> t[0] >> t[1]    241         infile >> nextGauss_st >> t[0] >> t[1]; 
242         nextGauss_st = DoubConv::longs2double(    242         nextGauss_st = DoubConv::longs2double(t); 
243       }                                           243       }
244       // is >> nextGauss_st encompassed by pos    244       // is >> nextGauss_st encompassed by possibleKeywordInput
245       setFlag(true);                              245       setFlag(true);
246     } else {                                      246     } else {
247       setFlag(false);                             247       setFlag(false);
248       infile >> nextGauss_st; // because a 0 w    248       infile >> nextGauss_st; // because a 0 will have been output
249     }                                             249     }
250   } else {                                        250   } else {
251     setFlag(false);                               251     setFlag(false);
252   }                                               252   }
253                                                   253 
254 } // restoreEngineStatus                          254 } // restoreEngineStatus
255                                                   255 
256   // Save and restore to/from streams             256   // Save and restore to/from streams
257                                                   257   
258 std::ostream & RandGauss::put ( std::ostream &    258 std::ostream & RandGauss::put ( std::ostream & os ) const {
259   os << name() << "\n";                           259   os << name() << "\n";
260   long prec = os.precision(20);                << 260   int prec = os.precision(20);
261   std::vector<unsigned long> t(2);                261   std::vector<unsigned long> t(2);
262   os << "Uvec\n";                                 262   os << "Uvec\n";
263   t = DoubConv::dto2longs(defaultMean);           263   t = DoubConv::dto2longs(defaultMean);
264   os << defaultMean << " " << t[0] << " " << t    264   os << defaultMean << " " << t[0] << " " << t[1] << "\n";
265   t = DoubConv::dto2longs(defaultStdDev);         265   t = DoubConv::dto2longs(defaultStdDev);
266   os << defaultStdDev << " " << t[0] << " " <<    266   os << defaultStdDev << " " << t[0] << " " << t[1] << "\n";
267   if ( set ) {                                    267   if ( set ) {
268     t = DoubConv::dto2longs(nextGauss);           268     t = DoubConv::dto2longs(nextGauss);
269     os << "nextGauss " << nextGauss << " " <<     269     os << "nextGauss " << nextGauss << " " << t[0] << " " << t[1] << "\n";
270   } else {                                        270   } else {
271     os << "no_cached_nextGauss \n";               271     os << "no_cached_nextGauss \n";
272   }                                               272   }
273   os.precision(prec);                             273   os.precision(prec);
274   return os;                                      274   return os;
275 } // put                                          275 } // put   
276                                                   276 
277 std::istream & RandGauss::get ( std::istream &    277 std::istream & RandGauss::get ( std::istream & is ) {
278   std::string inName;                             278   std::string inName;
279   is >> inName;                                   279   is >> inName;
280   if (inName != name()) {                         280   if (inName != name()) {
281     is.clear(std::ios::badbit | is.rdstate());    281     is.clear(std::ios::badbit | is.rdstate());
282     std::cerr << "Mismatch when expecting to r    282     std::cerr << "Mismatch when expecting to read state of a "
283             << name() << " distribution\n"        283             << name() << " distribution\n"
284         << "Name found was " << inName            284         << "Name found was " << inName
285         << "\nistream is left in the badbit st    285         << "\nistream is left in the badbit state\n";
286     return is;                                    286     return is;
287   }                                               287   }
288   std::string c1;                                 288   std::string c1;
289   std::string c2;                                 289   std::string c2;
290   if (possibleKeywordInput(is, "Uvec", c1)) {     290   if (possibleKeywordInput(is, "Uvec", c1)) {
291     std::vector<unsigned long> t(2);              291     std::vector<unsigned long> t(2);
292     is >> defaultMean >> t[0] >> t[1]; default    292     is >> defaultMean >> t[0] >> t[1]; defaultMean = DoubConv::longs2double(t); 
293     is >> defaultStdDev>>t[0]>>t[1]; defaultSt    293     is >> defaultStdDev>>t[0]>>t[1]; defaultStdDev = DoubConv::longs2double(t); 
294     std::string ng;                               294     std::string ng;
295     is >> ng;                                     295     is >> ng;
296     set = false;                                  296     set = false;
297     if (ng == "nextGauss") {                      297     if (ng == "nextGauss") {
298       is >> nextGauss >> t[0] >> t[1]; nextGau    298       is >> nextGauss >> t[0] >> t[1]; nextGauss = DoubConv::longs2double(t);
299       set = true;                                 299       set = true;
300     }                                             300     }
301     return is;                                    301     return is;
302   }                                               302   }
303   // is >> c1 encompassed by possibleKeywordIn    303   // is >> c1 encompassed by possibleKeywordInput
304   is >> defaultMean >> c2 >> defaultStdDev;       304   is >> defaultMean >> c2 >> defaultStdDev;
305   if ( (!is) || (c1 != "Mean:") || (c2 != "Sig    305   if ( (!is) || (c1 != "Mean:") || (c2 != "Sigma:") ) {
306     std::cerr << "i/o problem while expecting     306     std::cerr << "i/o problem while expecting to read state of a "
307             << name() << " distribution\n"        307             << name() << " distribution\n"
308         << "default mean and/or sigma could no    308         << "default mean and/or sigma could not be read\n";
309     return is;                                    309     return is;
310   }                                               310   }
311   is >> c1 >> c2 >> nextGauss;                    311   is >> c1 >> c2 >> nextGauss;
312   if ( (!is) || (c1 != "RANDGAUSS") ) {           312   if ( (!is) || (c1 != "RANDGAUSS") ) {
313     is.clear(std::ios::badbit | is.rdstate());    313     is.clear(std::ios::badbit | is.rdstate());
314     std::cerr << "Failure when reading caching    314     std::cerr << "Failure when reading caching state of RandGauss\n";
315     return is;                                    315     return is;
316   }                                               316   }
317   if (c2 == "CACHED_GAUSSIAN:") {                 317   if (c2 == "CACHED_GAUSSIAN:") {
318     set = true;                                   318     set = true;
319   } else if (c2 == "NO_CACHED_GAUSSIAN:") {       319   } else if (c2 == "NO_CACHED_GAUSSIAN:") {
320     set = false;                                  320     set = false;  
321   } else {                                        321   } else {
322     is.clear(std::ios::badbit | is.rdstate());    322     is.clear(std::ios::badbit | is.rdstate());
323     std::cerr << "Unexpected caching state key    323     std::cerr << "Unexpected caching state keyword of RandGauss:" << c2
324         << "\nistream is left in the badbit st    324         << "\nistream is left in the badbit state\n";
325   }                                               325   } 
326   return is;                                      326   return is;
327 } // get                                          327 } // get
328                                                   328 
329   // Static save and restore to/from streams      329   // Static save and restore to/from streams
330                                                   330   
331 std::ostream & RandGauss::saveDistState ( std:    331 std::ostream & RandGauss::saveDistState ( std::ostream & os ) {
332   long prec = os.precision(20);                << 332   int prec = os.precision(20);
333   std::vector<unsigned long> t(2);                333   std::vector<unsigned long> t(2);
334   os << distributionName() << "\n";               334   os << distributionName() << "\n";
335   os << "Uvec\n";                                 335   os << "Uvec\n";
336   if ( getFlag() ) {                              336   if ( getFlag() ) {
337     t = DoubConv::dto2longs(getVal());            337     t = DoubConv::dto2longs(getVal());
338     os << "nextGauss_st " << getVal() << " " <    338     os << "nextGauss_st " << getVal() << " " << t[0] << " " << t[1] << "\n";
339   } else {                                        339   } else {
340     os << "no_cached_nextGauss_st \n";            340     os << "no_cached_nextGauss_st \n";
341   }                                               341   }
342   os.precision(prec);                             342   os.precision(prec);
343   return os;                                      343   return os;
344 }                                                 344 }    
345                                                   345 
346 std::istream & RandGauss::restoreDistState ( s    346 std::istream & RandGauss::restoreDistState ( std::istream & is ) {
347   std::string inName;                             347   std::string inName;
348   is >> inName;                                   348   is >> inName;
349   if (inName != distributionName()) {             349   if (inName != distributionName()) {
350     is.clear(std::ios::badbit | is.rdstate());    350     is.clear(std::ios::badbit | is.rdstate());
351     std::cerr << "Mismatch when expecting to r    351     std::cerr << "Mismatch when expecting to read static state of a "
352             << distributionName() << " distrib    352             << distributionName() << " distribution\n"
353         << "Name found was " << inName            353         << "Name found was " << inName
354         << "\nistream is left in the badbit st    354         << "\nistream is left in the badbit state\n";
355     return is;                                    355     return is;
356   }                                               356   }
357   std::string c1;                                 357   std::string c1;
358   std::string c2;                                 358   std::string c2;
359   if (possibleKeywordInput(is, "Uvec", c1)) {     359   if (possibleKeywordInput(is, "Uvec", c1)) {
360     std::vector<unsigned long> t(2);              360     std::vector<unsigned long> t(2);
361     std::string ng;                               361     std::string ng;
362     is >> ng;                                     362     is >> ng;
363     setFlag (false);                              363     setFlag (false);
364     if (ng == "nextGauss_st") {                   364     if (ng == "nextGauss_st") {
365       is >> nextGauss_st >> t[0] >> t[1];         365       is >> nextGauss_st >> t[0] >> t[1]; 
366       nextGauss_st = DoubConv::longs2double(t)    366       nextGauss_st = DoubConv::longs2double(t);
367       setFlag (true);                             367       setFlag (true);
368     }                                             368     }
369     return is;                                    369     return is;
370   }                                               370   }
371   // is >> c1 encompassed by possibleKeywordIn    371   // is >> c1 encompassed by possibleKeywordInput
372   is >> c2 >> nextGauss_st;                       372   is >> c2 >> nextGauss_st;
373   if ( (!is) || (c1 != "RANDGAUSS") ) {           373   if ( (!is) || (c1 != "RANDGAUSS") ) {
374     is.clear(std::ios::badbit | is.rdstate());    374     is.clear(std::ios::badbit | is.rdstate());
375     std::cerr << "Failure when reading caching    375     std::cerr << "Failure when reading caching state of static RandGauss\n";
376     return is;                                    376     return is;
377   }                                               377   }
378   if (c2 == "CACHED_GAUSSIAN:") {                 378   if (c2 == "CACHED_GAUSSIAN:") {
379     setFlag(true);                                379     setFlag(true);
380   } else if (c2 == "NO_CACHED_GAUSSIAN:") {       380   } else if (c2 == "NO_CACHED_GAUSSIAN:") {
381     setFlag(false);                               381     setFlag(false);  
382   } else {                                        382   } else {
383     is.clear(std::ios::badbit | is.rdstate());    383     is.clear(std::ios::badbit | is.rdstate());
384     std::cerr << "Unexpected caching state key    384     std::cerr << "Unexpected caching state keyword of static RandGauss:" << c2
385         << "\nistream is left in the badbit st    385         << "\nistream is left in the badbit state\n";
386   }                                               386   } 
387   return is;                                      387   return is;
388 }                                                 388 } 
389                                                   389 
390 std::ostream & RandGauss::saveFullState ( std:    390 std::ostream & RandGauss::saveFullState ( std::ostream & os ) {
391   HepRandom::saveFullState(os);                   391   HepRandom::saveFullState(os);
392   saveDistState(os);                              392   saveDistState(os);
393   return os;                                      393   return os;
394 }                                                 394 }
395                                                   395   
396 std::istream & RandGauss::restoreFullState ( s    396 std::istream & RandGauss::restoreFullState ( std::istream & is ) {
397   HepRandom::restoreFullState(is);                397   HepRandom::restoreFullState(is);
398   restoreDistState(is);                           398   restoreDistState(is);
399   return is;                                      399   return is;
400 }                                                 400 }
401                                                   401 
402 }  // namespace CLHEP                             402 }  // namespace CLHEP
403                                                   403 
404                                                   404