Geant4 Cross Reference |
1 // -*- C++ -*- 1 2 // 3 // ------------------------------------------- 4 // Hep Random 5 // --- NonRandomEngine 6 // class implementation file 7 // ------------------------------------------- 8 // M. Fischler - Created 9/30/99 9 // 10 // M. Fischler - Modifications to capture s 11 // are needed to retain sanity when put 12 // Mark Fischler - Methods for distrib. insta 13 // M. Fischler - Initialization of all stat 14 // - at ctor time, to thwart a 15 // M. Fischler - put/get for vectors of ulo 16 // M. Fischler - State-saving using only in 17 // 18 //============================================ 19 20 #include "CLHEP/Random/NonRandomEngine.h" 21 #include "CLHEP/Random/engineIDulong.h" 22 #include "CLHEP/Random/DoubConv.h" 23 #include <cassert> 24 #include <cstdlib> 25 #include <iostream> 26 #include <string> 27 #include <vector> 28 29 namespace CLHEP { 30 31 std::string NonRandomEngine::name() const {ret 32 33 NonRandomEngine::NonRandomEngine() : nextHasBe 34 sequenceHasBeenSet(false), 35 intervalHasBeenSet(false) , 36 nextRando 37 nInSeq(0), 38 randomInterval(0.1) { } 39 40 NonRandomEngine::~NonRandomEngine() { } 41 42 43 void NonRandomEngine::setNextRandom(double r) 44 nextRandom = r; 45 nextHasBeenSet=true; 46 return; 47 } 48 49 void NonRandomEngine::setRandomSequence(double 50 sequence.clear(); 51 for (int i=0; i<n; i++) sequence.push_back(* 52 assert (sequence.size() == (unsigned int)n); 53 nInSeq = 0; 54 sequenceHasBeenSet=true; 55 nextHasBeenSet=false; 56 return; 57 } 58 59 void NonRandomEngine::setRandomInterval(double 60 randomInterval = x; 61 intervalHasBeenSet=true; 62 return; 63 } 64 65 double NonRandomEngine::flat() { 66 67 if (sequenceHasBeenSet) { 68 double v = sequence[nInSeq++]; 69 if (nInSeq >= sequence.size() ) sequenceHa 70 return v; 71 } 72 73 if ( !nextHasBeenSet ) { 74 std::cout 75 << "Attempt to use NonRandomEngine without s 76 exit(1); 77 } 78 79 double a = nextRandom; 80 nextHasBeenSet = false; 81 82 if (intervalHasBeenSet) { 83 nextRandom += randomInterval; 84 if ( nextRandom >= 1 ) nextRandom -= 1.0; 85 nextHasBeenSet = true; 86 } 87 88 return a; 89 } 90 91 92 void NonRandomEngine::flatArray(const int size 93 for (int i = 0; i < size; ++i) { 94 vect[i] = flat(); 95 } 96 } 97 98 std::ostream & NonRandomEngine::put (std::ostr 99 std::string beginMarker = "NonRandomEngine-b 100 os << beginMarker << "\nUvec\n"; 101 std::vector<unsigned long> v = put(); 102 for (unsigned int i=0; i<v.size(); ++i) { 103 os << v[i] << "\n"; 104 } 105 return os; 106 } 107 108 std::vector<unsigned long> NonRandomEngine::pu 109 std::vector<unsigned long> v; 110 v.push_back (engineIDulong<NonRandomEngine>( 111 std::vector<unsigned long> t; 112 v.push_back(static_cast<unsigned long>(nextH 113 v.push_back(static_cast<unsigned long>(seque 114 v.push_back(static_cast<unsigned long>(inter 115 t = DoubConv::dto2longs(nextRandom); 116 v.push_back(t[0]); v.push_back(t[1]); 117 v.push_back(static_cast<unsigned long>(nInSe 118 t = DoubConv::dto2longs(randomInterval); 119 v.push_back(t[0]); v.push_back(t[1]); 120 v.push_back(static_cast<unsigned long>(seque 121 for (unsigned int i=0; i<sequence.size(); ++ 122 t = DoubConv::dto2longs(sequence[i]); 123 v.push_back(t[0]); v.push_back(t[1]); 124 } 125 return v; 126 } 127 128 std::istream & NonRandomEngine::get (std::istr 129 std::string beginMarker = "NonRandomEngine-b 130 is >> beginMarker; 131 if (beginMarker != "NonRandomEngine-begin") 132 is.clear(std::ios::badbit | is.rdstate()); 133 std::cerr << "\nInput mispositioned or" 134 << "\nNonRandomEngine state descriptio 135 << "\nwrong engine type found.\n"; 136 return is; 137 } 138 return getState(is); 139 } 140 141 std::string NonRandomEngine::beginTag ( ) { 142 return "NonRandomEngine-begin"; 143 } 144 145 std::istream & NonRandomEngine::getState (std: 146 if ( possibleKeywordInput ( is, "Uvec", next 147 std::vector<unsigned long> v; 148 unsigned long uu = 99999; 149 unsigned long ssiz = 0; 150 for (unsigned int istart=0; istart < 10; + 151 is >> uu; 152 if (!is) { 153 is.clear(std::ios::badbit | is.rdstate()); 154 std::cout << "istart = " << istart << 155 std::cerr 156 << "\nNonRandomEngine state (vector) descrip 157 << "\ngetState() has failed." 158 << "\nInput stream is probably mispos 159 return is; 160 } 161 v.push_back(uu); 162 if (istart==9) ssiz = uu; 163 } 164 for (unsigned int ivec=0; ivec < 2*ssiz; + 165 is >> uu; 166 if (!is) { 167 is.clear(std::ios::badbit | is.rdstate 168 std::cerr << "\nNonRandomEngine state 169 << "\ngetState() has failed." 170 << "\nInput stream is probably mispos 171 return is; 172 } 173 v.push_back(uu); 174 } 175 getState(v); 176 return (is); 177 } 178 179 // is >> nextHasBeenSet; Removed, encompasse 180 181 std::string endMarker = "NonRandomEngine-e 182 is >> sequenceHasBeenSet >> intervalHasBeenS 183 is >> nextRandom >> nInSeq >> randomInterval 184 unsigned int seqSize; 185 is >> seqSize; 186 sequence.clear(); 187 double x; 188 for (unsigned int i = 0; i < seqSize; ++i) { 189 is >> x; 190 sequence.push_back(x); 191 } 192 is >> endMarker; 193 if (endMarker != "NonRandomEngine-end") { 194 is.clear(std::ios::badbit | is.rdstate()); 195 std::cerr << "\n NonRandomEngine state des 196 << "\nInput stream is probably misposi 197 return is; 198 } 199 return is; 200 } 201 202 bool NonRandomEngine::get (const std::vector<u 203 if ((v[0] & 0xffffffffUL) != engineIDulong<N 204 std::cerr << 205 "\nNonRandomEngine get:state vector has 206 return false; 207 } 208 return getState(v); 209 } 210 211 bool NonRandomEngine::getState (const std::vec 212 unsigned long seqSize = v[9]; 213 if (v.size() != 2*seqSize + 10 ) { 214 std::cerr << 215 "\nNonRandomEngine get:state vector has wro 216 std::cerr << " (length = " << v.size() 217 << "; expected " << 2*seqSize + 218 return false; 219 } 220 std::vector<unsigned long> t(2); 221 nextHasBeenSet = (v[1]!=0); 222 sequenceHasBeenSet = (v[2]!=0); 223 intervalHasBeenSet = (v[3]!=0); 224 t[0] = v[4]; t[1] = v[5]; nextRandom = DoubC 225 nInSeq = (unsigned int)v[6]; 226 t[0] = v[7]; t[1] = v[8]; randomInterval = D 227 sequence.clear(); 228 for (unsigned long i=0; i<seqSize; ++i) { 229 t[0] = v[2*i+10]; t[1] = v[2*i+11]; 230 sequence.push_back(DoubConv::longs2double( 231 } 232 return true; 233 } 234 235 236 } // namespace CLHEP 237 238