CLHEP 2.0.4.7 Reference Documentation
   
CLHEP Home Page     CLHEP Documentation     CLHEP Bug Reports

RandPoissonT.cc

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

Generated on Thu Jul 1 22:02:30 2010 for CLHEP by  doxygen 1.4.7