Geant4 Cross Reference |
1 // -*- C++ -*- 2 // 3 // ----------------------------------------------------------------------- 4 // HEP Random 5 // --- RandBreitWigner --- 6 // class header file 7 // ----------------------------------------------------------------------- 8 // This file is part of Geant4 (simulation toolkit for HEP). 9 // 10 // Class defining methods for shooting numbers according to the 11 // Breit-Wigner distribution algorithms (plain or mean^2). 12 // Default values are set: mean=1, gamma=.2, cut=1. 13 // Plain algorithm is used for shootArray() and fireArray(). 14 // Plain algorithm with default values is used for operator()(). 15 16 // ======================================================================= 17 // Gabriele Cosmo - Created: 5th September 1995 18 // - Added methods to shoot arrays: 28th July 1997 19 // J.Marraffino - Added default arguments as attributes and 20 // operator() with arguments: 16th Feb 1998 21 // M Fischler - put and get to/from streams 12/10/04 22 // ======================================================================= 23 24 #ifndef RandBreitWigner_h 25 #define RandBreitWigner_h 1 26 27 #include "CLHEP/Random/RandFlat.h" 28 #include "CLHEP/Utility/memory.h" 29 30 namespace CLHEP { 31 32 /** 33 * @author <Gabriele.Cosmo@cern.ch> 34 * @ingroup random 35 */ 36 class RandBreitWigner : public HepRandom { 37 38 public: 39 40 inline RandBreitWigner ( HepRandomEngine& anEngine, double a=1.0, 41 double b=0.2 ); 42 inline RandBreitWigner ( HepRandomEngine* anEngine, double a=1.0, 43 double b=0.2 ); 44 // These constructors should be used to instantiate a RandBreitWigner 45 // distribution object defining a local engine for it. 46 // The static generator will be skipped using the non-static methods 47 // defined below. 48 // If the engine is passed by pointer the corresponding engine object 49 // will be deleted by the RandBreitWigner destructor. 50 // If the engine is passed by reference the corresponding engine object 51 // will not be deleted by the RandBreitWigner destructor. 52 53 virtual ~RandBreitWigner(); 54 // Destructor 55 56 // Static methods to shoot random values using the static generator 57 58 static double shoot( double a=1.0, double b=0.2 ); 59 60 static double shoot( double a, double b, double c ); 61 62 static double shootM2( double a=1.0, double b=0.2 ); 63 64 static double shootM2( double a, double b, double c ); 65 66 static void shootArray ( const int size, double* vect); 67 68 static void shootArray ( const int size, double* vect, 69 double a, double b ); 70 71 static void shootArray ( const int size, double* vect, 72 double a, double b, double c ); 73 74 // Static methods to shoot random values using a given engine 75 // by-passing the static generator. 76 77 static double shoot( HepRandomEngine* anEngine, double a=1.0, 78 double b=0.2 ); 79 static double shoot( HepRandomEngine* anEngine, double a, 80 double b, double c ); 81 static double shootM2( HepRandomEngine* anEngine, double a=1.0, 82 double b=0.2 ); 83 static double shootM2( HepRandomEngine* anEngine, double a, 84 double b, double c ); 85 static void shootArray ( HepRandomEngine* anEngine, 86 const int size, double* vect ); 87 static void shootArray ( HepRandomEngine* anEngine, 88 const int size, double* vect, 89 double a, double b ); 90 static void shootArray ( HepRandomEngine* anEngine, 91 const int size, double* vect, 92 double a, double b, double c ); 93 94 // Methods using the localEngine to shoot random values, by-passing 95 // the static generator. These methods respect distribution parameters 96 // passed by the user at instantiation unless superseded by actual 97 // arguments in the call. 98 99 double fire(); 100 101 double fire( double a, double b ); 102 103 double fire( double a, double b, double c ); 104 105 double fireM2(); 106 107 double fireM2( double a, double b ); 108 109 double fireM2( double a, double b, double c ); 110 111 void fireArray ( const int size, double* vect); 112 113 void fireArray ( const int size, double* vect, 114 double a, double b ); 115 116 void fireArray ( const int size, double* vect, 117 double a, double b, double c ); 118 double operator()(); 119 double operator()( double a, double b ); 120 double operator()( double a, double b, double c ); 121 122 // Save and restore to/from streams 123 124 std::ostream & put ( std::ostream & os ) const; 125 std::istream & get ( std::istream & is ); 126 127 std::string name() const; 128 HepRandomEngine & engine(); 129 130 static std::string distributionName() {return "RandBreitWigner";} 131 // Provides the name of this distribution class 132 133 private: 134 135 std::shared_ptr<HepRandomEngine> localEngine; 136 double defaultA; 137 double defaultB; 138 139 }; 140 141 } // namespace CLHEP 142 143 #include "CLHEP/Random/RandBreitWigner.icc" 144 145 #endif 146