CLHEP VERSION Reference Documentation
CLHEP Home Page CLHEP Documentation CLHEP Bug Reports |
00001 // $Id: RandPoissonT.cc,v 1.7 2010/06/16 17:24: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() { 00050 } 00051 00052 // 00053 // fire, operator(), and shoot methods: 00054 // 00055 00056 long RandPoissonT::shoot(double xm) { 00057 HepRandomEngine* e = HepRandom::getTheEngine(); 00058 return shoot ( e, xm ); 00059 } // shoot() 00060 00061 double RandPoissonT::operator()() { 00062 return double( fire() ); 00063 } 00064 00065 double RandPoissonT::operator()( double mean ) { 00066 return double( fire( mean ) ); 00067 } 00068 00069 long RandPoissonT::fire(double mean) { 00070 return shoot (getLocalEngine(), mean); 00071 } 00072 00073 long RandPoissonT::fire() { 00074 00075 if ( defaultMean < RandPoissonQ::tableBoundary() ) { 00076 return RandPoissonQ::shoot ( getLocalEngine(), defaultMean ); 00077 } else { 00078 return RandPoisson::shoot(getLocalEngine(), defaultMean); 00079 } 00080 00081 } // fire() 00082 00083 long RandPoissonT::shoot(HepRandomEngine* anEngine, double mean) { 00084 00085 if ( mean < RandPoissonQ::tableBoundary() ) { 00086 return RandPoissonQ::shoot ( anEngine, mean ); 00087 } else { 00088 return RandPoisson::shoot( anEngine, mean ); 00089 } 00090 00091 } // shoot (anEngine, mean) 00092 00093 void RandPoissonT::shootArray(const int size, long* vect, double m) { 00094 int i; 00095 for (i=0; i<size; ++i) 00096 vect[i] = shoot(m); 00097 } 00098 00099 void RandPoissonT::fireArray(const int size, long* vect, double m) { 00100 int i; 00101 for (i=0; i<size; ++i) { 00102 vect[i] = fire( m ); 00103 } 00104 } 00105 00106 void RandPoissonT::fireArray(const int size, long* vect) { 00107 int i; 00108 for (i=0; i<size; ++i) { 00109 vect[i] = fire( defaultMean ); 00110 } 00111 } 00112 00113 00114 std::ostream & RandPoissonT::put ( std::ostream & os ) const { 00115 int pr=os.precision(20); 00116 os << " " << name() << "\n"; 00117 RandPoisson::put(os); 00118 os.precision(pr); 00119 return os; 00120 } 00121 00122 std::istream & RandPoissonT::get ( std::istream & is ) { 00123 std::string inName; 00124 is >> inName; 00125 if (inName != name()) { 00126 is.clear(std::ios::badbit | is.rdstate()); 00127 std::cerr << "Mismatch when expecting to read state of a " 00128 << name() << " distribution\n" 00129 << "Name found was " << inName 00130 << "\nistream is left in the badbit state\n"; 00131 return is; 00132 } 00133 RandPoisson::get(is); 00134 return is; 00135 } 00136 00137 00138 } // namespace CLHEP