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/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   // std::cerr << "makeAnEngine made " << E::engineName() << "\n"; 
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 }  // namespace CLHEP
00090 

Generated on Mon May 27 17:47:34 2013 for Geant4 by  doxygen 1.4.7