30 #include "CLHEP/Random/RandFlat.h"
31 #include "CLHEP/Random/DoubConv.h"
36 const int RandFlat::MSBBits= 15;
37 const unsigned long RandFlat::MSB= 1ul<<RandFlat::MSBBits;
38 CLHEP_THREAD_LOCAL
unsigned long RandFlat::staticRandomInt= 0;
39 CLHEP_THREAD_LOCAL
unsigned long RandFlat::staticFirstUnusedBit= 0;
44 RandFlat::~RandFlat() {
47 double RandFlat::operator()() {
48 return fire( defaultA, defaultB );
51 double RandFlat::operator()(
double w ) {
55 double RandFlat::operator()(
double a,
double b ) {
60 return HepRandom::getTheEngine()->flat();
63 void RandFlat::shootArray(
const int size,
double* vect) {
64 HepRandom::getTheEngine()->flatArray(size,vect);
67 void RandFlat::shootArray(
const int size,
double* vect,
68 double lx,
double dx )
72 for (i=0; i<size; ++i)
73 vect[i] =
shoot(lx,dx);
76 void RandFlat::shootArray( HepRandomEngine* anEngine,
77 const int size,
double* vect,
78 double lx,
double dx )
82 for (i=0; i<size; ++i)
83 vect[i] =
shoot(anEngine,lx,dx);
86 void RandFlat::fireArray(
const int size,
double* vect)
90 for (i=0; i<size; ++i)
91 vect[i] = fire( defaultA, defaultB );
94 void RandFlat::fireArray(
const int size,
double* vect,
95 double lx,
double dx )
99 for (i=0; i<size; ++i)
100 vect[i] = fire( lx, dx );
103 void RandFlat::saveEngineStatus (
const char filename[] ) {
106 getTheEngine()->saveStatus( filename );
110 std::ofstream outfile ( filename, std::ios::app );
112 outfile <<
"RANDFLAT staticRandomInt: " << staticRandomInt
113 <<
" staticFirstUnusedBit: " << staticFirstUnusedBit <<
"\n";
118 void RandFlat::restoreEngineStatus(
const char filename[] ) {
121 getTheEngine()->restoreStatus( filename );
125 std::ifstream infile ( filename, std::ios::in );
127 char inputword[] =
"NO_KEYWORD ";
131 if (strcmp(inputword,
"RANDFLAT")==0)
break;
132 if (infile.eof())
break;
141 if (strcmp(inputword,
"RANDFLAT")==0) {
146 infile >> staticRandomInt;
150 infile >> staticFirstUnusedBit;
155 std::ostream & RandFlat::put ( std::ostream & os )
const {
156 int pr=os.precision(20);
157 std::vector<unsigned long> t(2);
158 os <<
" " <<
name() <<
"\n";
159 os <<
"Uvec" <<
"\n";
160 os << randomInt <<
" " << firstUnusedBit <<
"\n";
161 t = DoubConv::dto2longs(defaultWidth);
162 os << defaultWidth <<
" " << t[0] <<
" " << t[1] <<
"\n";
163 t = DoubConv::dto2longs(defaultA);
164 os << defaultA <<
" " << t[0] <<
" " << t[1] <<
"\n";
165 t = DoubConv::dto2longs(defaultB);
166 os << defaultB <<
" " << t[0] <<
" " << t[1] <<
"\n";
171 std::istream & RandFlat::get ( std::istream & is ) {
174 if (inName !=
name()) {
175 is.clear(std::ios::badbit | is.rdstate());
176 std::cerr <<
"Mismatch when expecting to read state of a "
177 <<
name() <<
" distribution\n"
178 <<
"Name found was " << inName
179 <<
"\nistream is left in the badbit state\n";
182 if (possibleKeywordInput(is,
"Uvec", randomInt)) {
183 std::vector<unsigned long> t(2);
184 is >> randomInt >> firstUnusedBit;
185 is >> defaultWidth >>t[0]>>t[1]; defaultWidth = DoubConv::longs2double(t);
186 is >> defaultA >> t[0] >> t[1]; defaultA = DoubConv::longs2double(t);
187 is >> defaultB >> t[0] >> t[1]; defaultB = DoubConv::longs2double(t);
189 is.clear(std::ios::badbit | is.rdstate());
190 std::cerr <<
"\nRandFlat input failed"
191 <<
"\nInput stream is probably mispositioned now." << std::endl;
197 is >> firstUnusedBit;
198 is >> defaultWidth >> defaultA >> defaultB;
202 std::ostream & RandFlat::saveDistState ( std::ostream & os ) {
203 os << distributionName() <<
"\n";
204 int prec = os.precision(20);
205 os <<
"RANDFLAT staticRandomInt: " << staticRandomInt
206 <<
" staticFirstUnusedBit: " << staticFirstUnusedBit <<
"\n";
211 std::istream & RandFlat::restoreDistState ( std::istream & is ) {
214 if (inName != distributionName()) {
215 is.clear(std::ios::badbit | is.rdstate());
216 std::cerr <<
"Mismatch when expecting to read static state of a "
217 << distributionName() <<
" distribution\n"
218 <<
"Name found was " << inName
219 <<
"\nistream is left in the badbit state\n";
226 if (keyword!=
"RANDFLAT") {
227 is.clear(std::ios::badbit | is.rdstate());
228 std::cerr <<
"Mismatch when expecting to read RANDFLAT bit cache info: "
232 is >> c1 >> staticRandomInt >> c2 >> staticFirstUnusedBit;
236 std::ostream & RandFlat::saveFullState ( std::ostream & os ) {
237 HepRandom::saveFullState(os);
242 std::istream & RandFlat::restoreFullState ( std::istream & is ) {
243 HepRandom::restoreFullState(is);
244 restoreDistState(is);
ThreeVector shoot(const G4int Ap, const G4int Af)
static c2_factory< G4double > c2
static int engine(pchar, pchar, double &, pchar &, const dic_type &)