Geant4 Cross Reference |
1 // 2 // ******************************************************************** 3 // * License and Disclaimer * 4 // * * 5 // * The Geant4 software is copyright of the Copyright Holders of * 6 // * the Geant4 Collaboration. It is provided under the terms and * 7 // * conditions of the Geant4 Software License, included in the file * 8 // * LICENSE and available at http://cern.ch/geant4/license . These * 9 // * include a list of copyright holders. * 10 // * * 11 // * Neither the authors of this software system, nor their employing * 12 // * institutes,nor the agencies providing financial support for this * 13 // * work make any representation or warranty, express or implied, * 14 // * regarding this software system or assume any liability for its * 15 // * use. Please see the license in the file LICENSE and URL above * 16 // * for the full disclaimer and the limitation of liability. * 17 // * * 18 // * This code implementation is the result of the scientific and * 19 // * technical work of the GEANT4 collaboration. * 20 // * By using, copying, modifying or distributing the software (or * 21 // * any work based on the software) you agree to acknowledge its * 22 // * use in resulting scientific publications, and indicate your * 23 // * acceptance of all terms of the Geant4 Software license. * 24 // ******************************************************************** 25 // 26 // INCL++ intra-nuclear cascade model 27 // Alain Boudard, CEA-Saclay, France 28 // Joseph Cugnon, University of Liege, Belgium 29 // Jean-Christophe David, CEA-Saclay, France 30 // Pekka Kaitaniemi, CEA-Saclay, France, and Helsinki Institute of Physics, Finland 31 // Sylvie Leray, CEA-Saclay, France 32 // Davide Mancusi, CEA-Saclay, France 33 // 34 #define INCLXX_IN_GEANT4_MODE 1 35 36 #include "globals.hh" 37 38 /* 39 * G4INCLRandom.hh 40 * 41 * \date 7 June 2009 42 * \author Pekka Kaitaniemi 43 */ 44 45 #ifndef G4INCLRANDOM_HH_ 46 #define G4INCLRANDOM_HH_ 47 48 #include <iostream> 49 #include <cmath> 50 #include <utility> 51 #include <limits> 52 #include "G4INCLIRandomGenerator.hh" 53 #include "G4INCLThreeVector.hh" 54 #include "G4INCLGlobals.hh" 55 #include "G4INCLConfig.hh" 56 #ifdef INCLXX_IN_GEANT4_MODE 57 #include "Randomize.hh" 58 #endif 59 60 namespace G4INCL { 61 62 namespace Random { 63 /** 64 * Set the random number generator implementation to be used globally by INCL. 65 * 66 * @see G4INCL::IRandomGenerator 67 */ 68 void setGenerator(G4INCL::IRandomGenerator *aGenerator); 69 70 /** 71 * Set the seeds of the current generator. 72 * 73 */ 74 void setSeeds(const SeedVector &sv); 75 76 /** 77 * Get the seeds of the current generator. 78 * 79 */ 80 SeedVector getSeeds(); 81 82 /** 83 * Generate flat distribution of random numbers. 84 */ 85 G4double shoot(); 86 87 /** 88 * Return a random number in the ]0,1] interval 89 */ 90 G4double shoot0(); 91 92 /** 93 * Return a random number in the [0,1[ interval 94 */ 95 G4double shoot1(); 96 97 /** 98 * Return a random integer in the [0,n[ interval 99 */ 100 template<typename T> T shootInteger(T n){ 101 return static_cast<T>(shoot1() * n); 102 } 103 104 /** 105 * Generate random numbers using gaussian distribution. 106 */ 107 G4double gauss(G4double sigma=1.); 108 109 #ifdef INCLXX_IN_GEANT4_MODE 110 /** 111 * Generate random numbers using gaussian distribution to be used only 112 * for correlated pairs 113 */ 114 G4double gaussWithMemory(G4double sigma=1.); 115 #endif 116 117 /** 118 * Generate isotropically-distributed ThreeVectors of given norm. 119 */ 120 ThreeVector normVector(G4double norm=1.); 121 122 /** 123 * Generate ThreeVectors that are uniformly distributed in a sphere of 124 * radius rmax. 125 */ 126 ThreeVector sphereVector(G4double rmax=1.); 127 128 /** \brief Generate Gaussianly-distributed ThreeVectors 129 * 130 * Generate ThreeVectors that are distributed as a three-dimensional 131 * Gaussian of the given sigma. 132 */ 133 ThreeVector gaussVector(G4double sigma=1.); 134 135 /// \brief Generate pairs of correlated Gaussian random numbers 136 std::pair<G4double,G4double> correlatedGaussian(const G4double corrCoeff, const G4double x0=0., const G4double sigma=1.); 137 138 /// \brief Generate pairs of correlated uniform random numbers 139 std::pair<G4double,G4double> correlatedUniform(const G4double corrCoeff); 140 141 /** 142 * Delete the generator 143 */ 144 void deleteGenerator(); 145 146 /** 147 * Check if the generator is initialized. 148 */ 149 G4bool isInitialized(); 150 151 #ifdef INCL_COUNT_RND_CALLS 152 /// \brief Return the number of calls to the RNG 153 unsigned long long getNumberOfCalls(); 154 #endif 155 156 /// \brief Save the status of the random-number generator 157 void saveSeeds(); 158 159 /// \brief Get the saved status of the random-number generator 160 SeedVector getSavedSeeds(); 161 162 /// \brief Initialize generator according to a Config object 163 #ifdef INCLXX_IN_GEANT4_MODE 164 void initialize(Config const * const); 165 #else 166 void initialize(Config const * const theConfig); 167 #endif 168 169 class Adapter { 170 public: 171 using result_type = unsigned long long; 172 173 static constexpr result_type min() { 174 return std::numeric_limits<Adapter::result_type>::min(); 175 } 176 177 static constexpr result_type max() { 178 return std::numeric_limits<Adapter::result_type>::max(); 179 } 180 181 result_type operator()() const { 182 183 #ifdef INCLXX_IN_GEANT4_MODE 184 return G4RandFlat::shootInt(INT_MAX); 185 #else 186 return shootInteger(max()); 187 #endif 188 189 } 190 191 }; 192 193 Adapter const &getAdapter(); 194 } 195 196 } 197 198 #endif /* G4INCLRANDOM_HH_ */ 199