CLHEP 2.0.4.7 Reference Documentation
CLHEP Home Page CLHEP Documentation CLHEP Bug Reports |
00001 // $Id: RandPoissonT.cc,v 1.4.4.3 2005/04/15 16:32:53 garren Exp $ 00002 // -*- C++ -*- 00003 // 00004 // ----------------------------------------------------------------------- 00005 // HEP Random 00006 // --- RandPoissonT --- 00007 // class implementation file 00008 // ----------------------------------------------------------------------- 00009 00010 // ======================================================================= 00011 // M. Fischler - Implemented new, much faster table-driven algorithm 00012 // applicable for mu < 100 (Nov 1999), using these as 00013 // implementation of RandPoisson. 00014 // M. Fischler - Moved the table driven algorithms into RandPoissonT (here) 00015 // 1/26/00. 00016 // M. Fischler - Removed mean=100 from the table-driven set, since it 00017 // uses a value just off the end of the table. (April 2004) 00018 // M Fischler - put and get to/from streams 12/15/04 00019 // M Fischler - fireArray using defaultMean 2/10/05 00020 // M Fischler - put/get to/from streams uses pairs of ulongs when 00021 // + storing doubles avoid problems with precision 00022 // -- appears not to need modification, relying on 00023 // RandPoisson::put() instead 4/14/05 00024 // 00025 // ======================================================================= 00026 00027 #include "CLHEP/Random/defs.h" 00028 #include "CLHEP/Random/RandPoissonT.h" 00029 #include "CLHEP/Random/RandPoissonQ.h" 00030 #include "CLHEP/Random/DoubConv.hh" 00031 00032 // 00033 // Constructors and destructors: 00034 // 00035 00036 namespace CLHEP { 00037 00038 std::string RandPoissonT::name() const {return "RandPoissonT";} 00039 HepRandomEngine & RandPoissonT::engine() {return RandPoisson::engine();} 00040 00041 RandPoissonT::RandPoissonT(HepRandomEngine & anEngine, double m ) 00042 : RandPoisson(anEngine, m) 00043 {} 00044 00045 RandPoissonT::RandPoissonT(HepRandomEngine * anEngine, double m ) 00046 : RandPoisson(anEngine, m) 00047 {} 00048 00049 RandPoissonT::RandPoissonT(const RandPoissonT& right) 00050 : RandPoisson(right) 00051 {} 00052 00053 RandPoissonT::~RandPoissonT() { 00054 } 00055 00056 // 00057 // fire, operator(), and shoot methods: 00058 // 00059 00060 long RandPoissonT::shoot(double xm) { 00061 HepRandomEngine* e = HepRandom::getTheEngine(); 00062 return shoot ( e, xm ); 00063 } // shoot() 00064 00065 double RandPoissonT::operator()() { 00066 return double( fire() ); 00067 } 00068 00069 double RandPoissonT::operator()( double mean ) { 00070 return double( fire( mean ) ); 00071 } 00072 00073 long RandPoissonT::fire(double mean) { 00074 return shoot (getLocalEngine(), mean); 00075 } 00076 00077 long RandPoissonT::fire() { 00078 00079 if ( defaultMean < RandPoissonQ::tableBoundary() ) { 00080 return RandPoissonQ::shoot ( getLocalEngine(), defaultMean ); 00081 } else { 00082 return RandPoisson::shoot(getLocalEngine(), defaultMean); 00083 } 00084 00085 } // fire() 00086 00087 long RandPoissonT::shoot(HepRandomEngine* anEngine, double mean) { 00088 00089 if ( mean < RandPoissonQ::tableBoundary() ) { 00090 return RandPoissonQ::shoot ( anEngine, mean ); 00091 } else { 00092 return RandPoisson::shoot( anEngine, mean ); 00093 } 00094 00095 } // shoot (anEngine, mean) 00096 00097 void RandPoissonT::shootArray(const int size, long* vect, double m) { 00098 int i; 00099 for (i=0; i<size; ++i) 00100 vect[i] = shoot(m); 00101 } 00102 00103 void RandPoissonT::fireArray(const int size, long* vect, double m) { 00104 int i; 00105 for (i=0; i<size; ++i) { 00106 vect[i] = fire( m ); 00107 } 00108 } 00109 00110 void RandPoissonT::fireArray(const int size, long* vect) { 00111 int i; 00112 for (i=0; i<size; ++i) { 00113 vect[i] = fire( defaultMean ); 00114 } 00115 } 00116 00117 00118 std::ostream & RandPoissonT::put ( std::ostream & os ) const { 00119 int pr=os.precision(20); 00120 os << " " << name() << "\n"; 00121 RandPoisson::put(os); 00122 os.precision(pr); 00123 return os; 00124 } 00125 00126 std::istream & RandPoissonT::get ( std::istream & is ) { 00127 std::string inName; 00128 is >> inName; 00129 if (inName != name()) { 00130 is.clear(std::ios::badbit | is.rdstate()); 00131 std::cerr << "Mismatch when expecting to read state of a " 00132 << name() << " distribution\n" 00133 << "Name found was " << inName 00134 << "\nistream is left in the badbit state\n"; 00135 return is; 00136 } 00137 RandPoisson::get(is); 00138 return is; 00139 } 00140 00141 00142 } // namespace CLHEP