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 10.0.p2)


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