CLHEP VERSION Reference Documentation
   
CLHEP Home Page     CLHEP Documentation     CLHEP Bug Reports

EngineFactory.cc

Go to the documentation of this file.
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 

Generated on 15 Nov 2012 for CLHEP by  doxygen 1.4.7