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