00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014 #include "CLHEP/Random/EngineFactory.h"
00015 #include "CLHEP/Random/DualRand.h"
00016 #include "CLHEP/Random/JamesRandom.h"
00017 #include "CLHEP/Random/MTwistEngine.h"
00018 #include "CLHEP/Random/RanecuEngine.h"
00019 #include "CLHEP/Random/Ranlux64Engine.h"
00020 #include "CLHEP/Random/RanluxEngine.h"
00021 #include "CLHEP/Random/RanshiEngine.h"
00022 #include "CLHEP/Random/NonRandomEngine.h"
00023 #include "CLHEP/Random/engineIDulong.h"
00024 #include <iostream>
00025 #include <string>
00026
00027 namespace CLHEP {
00028
00029 template<class E>
00030 static HepRandomEngine*
00031 makeAnEngine (const std::string & tag,
00032 std::istream & is) {
00033 if ( tag != E::beginTag() ) return 0;
00034 HepRandomEngine* eptr = new E;
00035 eptr->getState(is);
00036 if (!is) return 0;
00037 return eptr;
00038 }
00039
00040 template<class E>
00041 static HepRandomEngine*
00042 makeAnEngine (const std::vector<unsigned long> & v) {
00043 if ( (v[0] & 0xffffffffUL) != engineIDulong<E>() ) return 0;
00044 HepRandomEngine* eptr = new E;
00045 bool success = eptr->getState(v);
00046 if (!success) return 0;
00047
00048 return eptr;
00049 }
00050
00051 HepRandomEngine* EngineFactory::newEngine(std::istream& is) {
00052 HepRandomEngine* eptr;
00053 std::string tag;
00054 is >> tag;
00055 eptr = makeAnEngine <HepJamesRandom> (tag, is); if (eptr) return eptr;
00056 eptr = makeAnEngine <RanecuEngine> (tag, is); if (eptr) return eptr;
00057 eptr = makeAnEngine <Ranlux64Engine> (tag, is); if (eptr) return eptr;
00058 eptr = makeAnEngine <MTwistEngine> (tag, is); if (eptr) return eptr;
00059 eptr = makeAnEngine <DualRand> (tag, is); if (eptr) return eptr;
00060 eptr = makeAnEngine <RanluxEngine> (tag, is); if (eptr) return eptr;
00061 eptr = makeAnEngine <RanshiEngine> (tag, is); if (eptr) return eptr;
00062 eptr = makeAnEngine <NonRandomEngine> (tag, is); if (eptr) return eptr;
00063 is.clear(std::ios::badbit | is.rdstate());
00064 std::cerr <<
00065 "Input mispositioned or bad in reading anonymous engine\n"
00066 << "\nBegin-tag read was: " << tag
00067 << "\nInput stream is probably fouled up\n";
00068 return eptr;
00069 }
00070
00071 HepRandomEngine*
00072 EngineFactory::newEngine(std::vector<unsigned long> const & v) {
00073 HepRandomEngine* eptr;
00074 eptr = makeAnEngine <HepJamesRandom> (v); if (eptr) return eptr;
00075 eptr = makeAnEngine <RanecuEngine> (v); if (eptr) return eptr;
00076 eptr = makeAnEngine <Ranlux64Engine> (v); if (eptr) return eptr;
00077 eptr = makeAnEngine <MTwistEngine> (v); if (eptr) return eptr;
00078 eptr = makeAnEngine <DualRand> (v); if (eptr) return eptr;
00079 eptr = makeAnEngine <RanluxEngine> (v); if (eptr) return eptr;
00080 eptr = makeAnEngine <RanshiEngine> (v); if (eptr) return eptr;
00081 eptr = makeAnEngine <NonRandomEngine> (v); if (eptr) return eptr;
00082 std::cerr <<
00083 "Cannot correctly get anonymous engine from vector\n"
00084 << "First unsigned long was: " << v[0]
00085 << " Vector size was: " << v.size() <<"\n";
00086 return eptr;
00087 }
00088
00089 }
00090