Geant4 Cross Reference |
1 // 1 // 2 // ******************************************* 2 // ******************************************************************** 3 // * License and Disclaimer 3 // * License and Disclaimer * 4 // * 4 // * * 5 // * The Geant4 software is copyright of th 5 // * The Geant4 software is copyright of the Copyright Holders of * 6 // * the Geant4 Collaboration. It is provided 6 // * the Geant4 Collaboration. It is provided under the terms and * 7 // * conditions of the Geant4 Software License 7 // * conditions of the Geant4 Software License, included in the file * 8 // * LICENSE and available at http://cern.ch/ 8 // * LICENSE and available at http://cern.ch/geant4/license . These * 9 // * include a list of copyright holders. 9 // * include a list of copyright holders. * 10 // * 10 // * * 11 // * Neither the authors of this software syst 11 // * Neither the authors of this software system, nor their employing * 12 // * institutes,nor the agencies providing fin 12 // * institutes,nor the agencies providing financial support for this * 13 // * work make any representation or warran 13 // * work make any representation or warranty, express or implied, * 14 // * regarding this software system or assum 14 // * regarding this software system or assume any liability for its * 15 // * use. Please see the license in the file 15 // * use. Please see the license in the file LICENSE and URL above * 16 // * for the full disclaimer and the limitatio 16 // * for the full disclaimer and the limitation of liability. * 17 // * 17 // * * 18 // * This code implementation is the result 18 // * This code implementation is the result of the scientific and * 19 // * technical work of the GEANT4 collaboratio 19 // * technical work of the GEANT4 collaboration. * 20 // * By using, copying, modifying or distri 20 // * By using, copying, modifying or distributing the software (or * 21 // * any work based on the software) you ag 21 // * any work based on the software) you agree to acknowledge its * 22 // * use in resulting scientific publicati 22 // * use in resulting scientific publications, and indicate your * 23 // * acceptance of all terms of the Geant4 Sof 23 // * acceptance of all terms of the Geant4 Software license. * 24 // ******************************************* 24 // ******************************************************************** 25 // 25 // 26 // 26 // >> 27 // $Id: G4Poisson.hh,v 1.9 2006/06/29 19:00:44 gunter Exp $ >> 28 // GEANT4 tag $Name: geant4-08-01-patch-01 $ 27 // 29 // 28 // << 30 // 29 // ------------------------------------------- 31 // ------------------------------------------------------------ 30 // GEANT 4 class header file << 32 // GEANT 4 class header file 31 // ------------------------------------------- 33 // ------------------------------------------------------------ 32 // Class description: 34 // Class description: 33 // 35 // 34 // G4Poisson is the C++ implementation of the 36 // G4Poisson is the C++ implementation of the CERNLIB GPOISS algorithm 35 // for the generation of Poisson distributed r 37 // for the generation of Poisson distributed random numbers. It has been 36 // adapted to invoke HepRandom from CLHEP for 38 // adapted to invoke HepRandom from CLHEP for the primary engine generators. 37 // GPOISS is recognized to be a faster algorit 39 // GPOISS is recognized to be a faster algorithm, providing however a less 38 // accurate output, than the algorithm adopted 40 // accurate output, than the algorithm adopted in CLHEP. 39 41 40 // ------------------------------------------- 42 // ------------------------------------------------------------ 41 #ifndef G4POISSON_HH 43 #ifndef G4POISSON_HH 42 #define G4POISSON_HH 44 #define G4POISSON_HH 43 45 44 #include <CLHEP/Units/PhysicalConstants.h> << 46 #include "globals.hh" 45 << 46 #include "G4Exp.hh" << 47 #include "G4Types.hh" << 48 #include "Randomize.hh" 47 #include "Randomize.hh" 49 48 50 inline G4long G4Poisson(G4double mean) 49 inline G4long G4Poisson(G4double mean) 51 { 50 { 52 G4long number = 0; << 51 G4long number = 0; 53 const G4int border = 16; << 52 const G4int border = 16; 54 const G4double limit = 2e9; << 53 G4double limit = 2e9; 55 << 54 56 if(mean <= border) << 55 if(mean <= border) { 57 { << 56 G4double position = CLHEP::RandFlat::shoot(); 58 G4double position = G4UniformRand(); << 57 G4double poissonValue = std::exp(-mean); 59 G4double poissonValue = G4Exp(-mean); << 58 G4double poissonSum = poissonValue; 60 G4double poissonSum = poissonValue; << 59 61 << 60 while(poissonSum <= position) { 62 while(poissonSum <= position) << 61 number++ ; 63 { << 62 poissonValue *= mean/number; 64 ++number; << 65 poissonValue *= mean / number; << 66 poissonSum += poissonValue; 63 poissonSum += poissonValue; 67 } 64 } 68 return number; 65 return number; 69 } // the case of mean <= 16 << 66 } // the case of mean <= 16 70 67 71 G4double t = std::sqrt(-2. * std::log(G4Unif << 68 G4double value, t, y; 72 std::cos(2. * CLHEP::pi * G4Uni << 69 t = std::sqrt(-2*std::log(CLHEP::RandFlat::shoot())); 73 G4double value = mean + t * std::sqrt(mean) << 70 y = twopi*CLHEP::RandFlat::shoot(); 74 if(value < 0.) << 71 t *= std::cos(y); 75 { << 72 value = mean + t*std::sqrt(mean) + 0.5; 76 return 0; << 73 if(value <= 0) {return 0;} 77 } << 74 if(value >= limit) { return G4long(limit);} 78 return (value >= limit) ? G4long(limit) : G4 << 75 return G4long(value); 79 } 76 } 80 77 81 #endif /* G4POISSON_HH */ << 78 #endif /* G4POISSON_HH */ 82 79