Geant4  10.02.p01
StaticRandomStates.cc
Go to the documentation of this file.
1 // $Id:$
2 // -*- C++ -*-
3 //
4 // -----------------------------------------------------------------------
5 // HEP Random
6 // --- StaticRandomStates ---
7 // class implementation file
8 // -----------------------------------------------------------------------
9 //
10 // =======================================================================
11 // Mark Fischler - Created: Dec. 21, 2004
12 // Mark Fischler - Modified restore() to utilize anonymous engine input
13 // to create anonymous restore of the static distributions
14 //
15 // =======================================================================
16 
17 #include "CLHEP/Random/StaticRandomStates.h"
18 #include "CLHEP/Random/RandGauss.h"
19 #include "CLHEP/Random/RandFlat.h"
20 #include <string>
21 #include <sstream>
22 
23 //======================//
24 // //
25 // Maintenance warning: //
26 // //
27 //======================//
28 //
29 // Currently, only two distributions (RandFlat and RandGauss) have cached
30 // distribution state. All such distributions must be saved below, so if
31 // another such distribution is added, this implementation file must be
32 // modified to reflect that.
33 
34 namespace CLHEP {
35 
36 
37 std::ostream & StaticRandomStates::save(std::ostream & os){
38  RandGauss::saveFullState(os);
39  RandFlat::saveDistState(os);
40  return os;
41 }
42 
43 #ifdef NOTYET
44 std::istream & StaticRandomStates::restore(std::istream & is) {
45  RandGauss::restoreFullState(is);
46  RandFlat::restoreDistState(is);
47  return is;
48 }
49 #endif
50 
51 std::istream & StaticRandomStates::restore(std::istream & is) {
52  HepRandomEngine * e = HepRandom::getTheEngine();
53  HepRandomEngine *ne = HepRandomEngine::newEngine(is);
54  if ( !is ) return is;
55  if ( !ne ) return is;
56  if (ne->name() == e->name()) {
57  // Because e has const data members, cannot simply do *e = *ne
58  std::ostringstream os;
59  os << *ne;
60  std::istringstream istst(os.str());
61  istst >> *e;
62  if (!istst) {
63  std::cerr << "???? Unexpected behavior in StaticRandomStates::restore:\n"
64  << "The new engine, which had been input successfully from istream\n"
65  << "has encountered a problem when used to set state of theEngine\n";
66  is.clear(std::ios::badbit | is.rdstate());
67  return is;
68  }
69  } else {
70  HepRandom::setTheEngine(ne);
71  }
72  RandGauss::restoreDistState(is);
73  RandFlat::restoreDistState(is);
74  return is;
75 }
76 
77 } // namespace CLHEP