Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/externals/clhep/include/CLHEP/Random/RandGeneral.h

Version: [ ReleaseNotes ] [ 1.0 ] [ 1.1 ] [ 2.0 ] [ 3.0 ] [ 3.1 ] [ 3.2 ] [ 4.0 ] [ 4.0.p1 ] [ 4.0.p2 ] [ 4.1 ] [ 4.1.p1 ] [ 5.0 ] [ 5.0.p1 ] [ 5.1 ] [ 5.1.p1 ] [ 5.2 ] [ 5.2.p1 ] [ 5.2.p2 ] [ 6.0 ] [ 6.0.p1 ] [ 6.1 ] [ 6.2 ] [ 6.2.p1 ] [ 6.2.p2 ] [ 7.0 ] [ 7.0.p1 ] [ 7.1 ] [ 7.1.p1 ] [ 8.0 ] [ 8.0.p1 ] [ 8.1 ] [ 8.1.p1 ] [ 8.1.p2 ] [ 8.2 ] [ 8.2.p1 ] [ 8.3 ] [ 8.3.p1 ] [ 8.3.p2 ] [ 9.0 ] [ 9.0.p1 ] [ 9.0.p2 ] [ 9.1 ] [ 9.1.p1 ] [ 9.1.p2 ] [ 9.1.p3 ] [ 9.2 ] [ 9.2.p1 ] [ 9.2.p2 ] [ 9.2.p3 ] [ 9.2.p4 ] [ 9.3 ] [ 9.3.p1 ] [ 9.3.p2 ] [ 9.4 ] [ 9.4.p1 ] [ 9.4.p2 ] [ 9.4.p3 ] [ 9.4.p4 ] [ 9.5 ] [ 9.5.p1 ] [ 9.5.p2 ] [ 9.6 ] [ 9.6.p1 ] [ 9.6.p2 ] [ 9.6.p3 ] [ 9.6.p4 ] [ 10.0 ] [ 10.0.p1 ] [ 10.0.p2 ] [ 10.0.p3 ] [ 10.0.p4 ] [ 10.1 ] [ 10.1.p1 ] [ 10.1.p2 ] [ 10.1.p3 ] [ 10.2 ] [ 10.2.p1 ] [ 10.2.p2 ] [ 10.2.p3 ] [ 10.3 ] [ 10.3.p1 ] [ 10.3.p2 ] [ 10.3.p3 ] [ 10.4 ] [ 10.4.p1 ] [ 10.4.p2 ] [ 10.4.p3 ] [ 10.5 ] [ 10.5.p1 ] [ 10.6 ] [ 10.6.p1 ] [ 10.6.p2 ] [ 10.6.p3 ] [ 10.7 ] [ 10.7.p1 ] [ 10.7.p2 ] [ 10.7.p3 ] [ 10.7.p4 ] [ 11.0 ] [ 11.0.p1 ] [ 11.0.p2 ] [ 11.0.p3, ] [ 11.0.p4 ] [ 11.1 ] [ 11.1.1 ] [ 11.1.2 ] [ 11.1.3 ] [ 11.2 ] [ 11.2.1 ] [ 11.2.2 ] [ 11.3.0 ]

  1 // -*- C++ -*-
  2 //
  3 // -----------------------------------------------------------------------
  4 //                             HEP Random
  5 //                          --- RandGeneral ---
  6 //                          class header file
  7 // -----------------------------------------------------------------------
  8 
  9 // Class defining methods for shooting generally distributed random values,
 10 // given a user-defined probability distribution function.
 11 
 12 // =======================================================================
 13 // S.Magni & G.Pieri  - Created: 29 April 1998 
 14 // G.Cosmo            - Added constructor using default engine from the
 15 //                      static generator: 20 Aug 1998
 16 // S.Magni & G.Pieri  - Added linear interpolation: 24 March 1999
 17 // M. Fischler        - Added private methods that simplify the implementaion
 18 //      prepareTables(), useFlatDistribution(), mapRandom()
 19 //          - Added private variable oneOverNbins.
 20 //              - Made the warning about shoot() not being static a tad
 21 //      more prominent.       14 May 1999 
 22 // M Fischler         - put and get to/from streams 12/15/04
 23 // =======================================================================
 24 
 25 #ifndef RandGeneral_h
 26 #define RandGeneral_h 1
 27 
 28 #include "CLHEP/Random/Random.h"
 29 #include "CLHEP/Utility/memory.h"
 30 #include <vector>
 31 
 32 namespace CLHEP {
 33 
 34 /**
 35  * @author
 36  * @ingroup random
 37  */
 38 class RandGeneral : public HepRandom {
 39 
 40 public:
 41 
 42   RandGeneral ( const double* aProbFunc, 
 43     int theProbSize, 
 44     int IntType=0 );
 45   RandGeneral ( HepRandomEngine& anEngine,
 46                 const double* aProbFunc, 
 47     int theProbSize, 
 48     int IntType=0 );
 49   RandGeneral ( HepRandomEngine* anEngine, 
 50                 const double* aProbFunc, 
 51     int theProbSize, 
 52     int IntType=0 );
 53   // These constructors should be used to instantiate a RandGeneral
 54   // distribution object defining a local engine for it.
 55   // The static generator will be skipped by using the non-static methods
 56   // defined below. In case no engine is specified in the constructor, the
 57   // default engine used by the static generator is applied.
 58   // If the engine is passed by pointer the corresponding engine object
 59   // will be deleted by the RandGeneral destructor.
 60   // If the engine is passed by reference the corresponding engine object
 61   // will not be deleted by the RandGeneral destructor.
 62   // The probability distribution function (Pdf) must be provided by the user
 63   // as an array of positive real number. The array size must also be
 64   // provided. The Pdf doesn't need to be normalized to 1. 
 65   // if IntType = 0 ( default value ) a uniform random number is
 66   // generated using the engine. The uniform number is then transformed
 67   // to the user's distribution using the cumulative probability
 68   // distribution constructed from his histogram. The cumulative
 69   // distribution is inverted using a binary search for the nearest
 70   // bin boundary and a linear interpolation within the
 71   // bin. RandGeneral therefore generates a constant density within
 72   // each bin.
 73   // if IntType = 1 no interpolation is performed and the result is a
 74   // discrete distribution.
 75 
 76   virtual ~RandGeneral();
 77   // Destructor
 78 
 79   // Methods to shoot random values using the static generator
 80   // N.B.: The methods are NOT static since they use nonstatic members
 81   // theIntegralPdf & nBins
 82 
 83   /////////////////////
 84   //       //
 85   // BIG RED WARNING //
 86   //       //
 87   /////////////////////
 88   //
 89   // The above N.B. is telling users that the shoot() methods in this
 90   // class are NOT STATIC.  You cannot do 
 91   //  double x = RandGeneral::shoot();
 92   // It would not make sense to provide a static shoot -- what would 
 93   // the default probability function look like?
 94 
 95   inline double shoot();
 96 
 97   inline void shootArray ( const int size, double* vect);
 98 
 99   //  Methods to shoot random values using a given engine
100   //  by-passing the static generator.
101 
102   double shoot( HepRandomEngine* anEngine );
103 
104   void shootArray ( HepRandomEngine* anEngine, const int size,
105                     double* vect );
106           
107   //  Methods using the localEngine to shoot random values, by-passing
108   //  the static generator.
109 
110   double fire();
111 
112   void fireArray ( const int size, double* vect);
113 
114   double operator()();
115 
116   // Save and restore to/from streams
117   
118   std::ostream & put ( std::ostream & os ) const;
119   std::istream & get ( std::istream & is );
120 
121   std::string name() const;
122   HepRandomEngine & engine();
123 
124   static std::string distributionName() {return "RandGeneral";}  
125   // Provides the name of this distribution class
126   
127 
128 private:
129 
130   std::shared_ptr<HepRandomEngine> localEngine;
131   std::vector<double> theIntegralPdf;
132   int nBins;
133   double oneOverNbins;
134   int InterpolationType;
135 
136   // Private methods to factor out replicated implementation sections
137   void prepareTable(const double* aProbFunc);
138   void useFlatDistribution();
139   double mapRandom(double rand) const;
140 
141 };
142 
143 }  // namespace CLHEP
144 
145 #include "CLHEP/Random/RandGeneral.icc"
146 
147 #endif
148