CLHEP VERSION 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.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

Generated on 15 Nov 2012 for CLHEP by  doxygen 1.4.7