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 // G4SPSRandomGenerator 26 // G4SPSRandomGenerator 27 // 27 // 28 // Class Description: 28 // Class Description: 29 // 29 // 30 // Special random number generator used by G4G 30 // Special random number generator used by G4GeneralParticleSource to allow 31 // biasing applied at the lowest level for all 31 // biasing applied at the lowest level for all distributions. 32 // This is a shared class between threads. 32 // This is a shared class between threads. 33 // Only one thread should use the set-methods 33 // Only one thread should use the set-methods here. 34 // Note that this is exactly what is achieved 34 // Note that this is exactly what is achieved using UI commands. 35 // If you use the set methods to set defaults 35 // If you use the set methods to set defaults in your 36 // application take care that only one thread 36 // application take care that only one thread is executing them. 37 // In addition take care of calling these meth 37 // In addition take care of calling these methods before the run is started 38 // Do not use the setters during the event loo 38 // Do not use the setters during the event loop 39 39 40 // Author: Fan Lei, QinetiQ ltd. 40 // Author: Fan Lei, QinetiQ ltd. 41 // Customer: ESA/ESTEC 41 // Customer: ESA/ESTEC 42 // History: 42 // History: 43 // - 05/02/2004, Fan Lei - Created. 43 // - 05/02/2004, Fan Lei - Created. 44 // Based on the G4GeneralParticleSource cl 44 // Based on the G4GeneralParticleSource class 45 // - 06/06/2014, Andrea Dotti 45 // - 06/06/2014, Andrea Dotti 46 // Added a mutex to protect access to shar 46 // Added a mutex to protect access to shared resources (data members). 47 // Getters and Setters are mutex'd but not 47 // Getters and Setters are mutex'd but not the GetRand* methods, 48 // because it is assumed these are called 48 // because it is assumed these are called only during the event loop 49 // during which the status of this class i 49 // during which the status of this class is invariant 50 // ------------------------------------------- 50 // -------------------------------------------------------------------- 51 #ifndef G4SPSRandomGenerator_hh 51 #ifndef G4SPSRandomGenerator_hh 52 #define G4SPSRandomGenerator_hh 1 52 #define G4SPSRandomGenerator_hh 1 53 53 54 #include "G4PhysicsFreeVector.hh" 54 #include "G4PhysicsFreeVector.hh" 55 #include "G4DataInterpolation.hh" 55 #include "G4DataInterpolation.hh" 56 #include "G4ThreeVector.hh" 56 #include "G4ThreeVector.hh" 57 #include "G4Threading.hh" 57 #include "G4Threading.hh" 58 #include "G4Cache.hh" 58 #include "G4Cache.hh" 59 59 60 class G4SPSRandomGenerator 60 class G4SPSRandomGenerator 61 { 61 { 62 public: 62 public: 63 63 64 G4SPSRandomGenerator(); 64 G4SPSRandomGenerator(); 65 // Constructor: initializes variables 65 // Constructor: initializes variables 66 66 67 ~G4SPSRandomGenerator(); 67 ~G4SPSRandomGenerator(); 68 // Destructor 68 // Destructor 69 69 70 // Biasing Methods 70 // Biasing Methods 71 71 72 void SetXBias(const G4ThreeVector&); 72 void SetXBias(const G4ThreeVector&); 73 // Allows the user to re-distribute the 73 // Allows the user to re-distribute the random 74 // numbers used to generate x co-ordinat 74 // numbers used to generate x co-ordinates 75 75 76 void SetYBias(const G4ThreeVector&); 76 void SetYBias(const G4ThreeVector&); 77 // Allows the user to re-distribute the 77 // Allows the user to re-distribute the random 78 // numbers used to generate y co-ordinat 78 // numbers used to generate y co-ordinates 79 79 80 void SetZBias(const G4ThreeVector&); 80 void SetZBias(const G4ThreeVector&); 81 // Allows the user to re-distribute the 81 // Allows the user to re-distribute the random 82 // numbers used to generate z co-ordinat 82 // numbers used to generate z co-ordinates 83 83 84 void SetThetaBias(const G4ThreeVector&); 84 void SetThetaBias(const G4ThreeVector&); 85 // Allows the user to re-distribute the 85 // Allows the user to re-distribute the random 86 // numbers used to generate values of th 86 // numbers used to generate values of theta 87 87 88 void SetPhiBias(const G4ThreeVector&); 88 void SetPhiBias(const G4ThreeVector&); 89 // Allows the user to re-distribute the 89 // Allows the user to re-distribute the random 90 // numbers used to generate values of ph 90 // numbers used to generate values of phi 91 91 92 void SetEnergyBias(const G4ThreeVector&); 92 void SetEnergyBias(const G4ThreeVector&); 93 // Allows the user to re-distribute the ra 93 // Allows the user to re-distribute the random 94 // numbers used to generate the energies 94 // numbers used to generate the energies 95 95 96 void SetPosThetaBias(const G4ThreeVector&) 96 void SetPosThetaBias(const G4ThreeVector&); 97 // Allows the user to re-distribute the 97 // Allows the user to re-distribute the random 98 // numbers used to generate values of th 98 // numbers used to generate values of theta for position distribution 99 99 100 void SetPosPhiBias(const G4ThreeVector&); 100 void SetPosPhiBias(const G4ThreeVector&); 101 // Allows the user to re-distribute the 101 // Allows the user to re-distribute the random 102 // numbers used to generate values of ph 102 // numbers used to generate values of phi for position distribution 103 103 104 G4double GenRandX(); 104 G4double GenRandX(); 105 // Generates the random number for x, wi 105 // Generates the random number for x, with or without biasing 106 106 107 G4double GenRandY(); 107 G4double GenRandY(); 108 // Generates the random number for y, wi 108 // Generates the random number for y, with or without biasing 109 109 110 G4double GenRandZ(); 110 G4double GenRandZ(); 111 // Generates the random number for z, wi 111 // Generates the random number for z, with or without biasing 112 112 113 G4double GenRandTheta(); 113 G4double GenRandTheta(); 114 // Generates the random number for theta 114 // Generates the random number for theta, with or without biasing 115 115 116 G4double GenRandPhi(); 116 G4double GenRandPhi(); 117 // Generates the random number for phi, 117 // Generates the random number for phi, with or without biasing 118 118 119 G4double GenRandEnergy(); 119 G4double GenRandEnergy(); 120 // Generates the random number for energ 120 // Generates the random number for energy, with or without biasing 121 121 122 G4double GenRandPosTheta(); 122 G4double GenRandPosTheta(); 123 // Generates the random number for theta 123 // Generates the random number for theta, with or without biasing 124 // for position distribution 124 // for position distribution 125 125 126 G4double GenRandPosPhi(); 126 G4double GenRandPosPhi(); 127 // Generates the random number for phi, 127 // Generates the random number for phi, with or without biasing 128 // for position distribution 128 // for position distribution 129 129 130 void SetIntensityWeight(G4double weight); 130 void SetIntensityWeight(G4double weight); 131 131 132 G4double GetBiasWeight() const ; 132 G4double GetBiasWeight() const ; 133 // Returns the weight change after biasi 133 // Returns the weight change after biasing 134 134 135 // method to re-set the histograms 135 // method to re-set the histograms 136 void ReSetHist(const G4String&); 136 void ReSetHist(const G4String&); 137 // Resets the histogram for user defined 137 // Resets the histogram for user defined distribution 138 138 139 void SetVerbosity(G4int a); 139 void SetVerbosity(G4int a); 140 // Sets the verbosity level 140 // Sets the verbosity level 141 141 142 private: 142 private: 143 143 144 // Encapsulate in a struct to guarantee th 144 // Encapsulate in a struct to guarantee that correct 145 // initial state is set via constructor 145 // initial state is set via constructor 146 // 146 // 147 struct a_check 147 struct a_check 148 { 148 { 149 G4bool val; 149 G4bool val; 150 a_check() { val = false; } 150 a_check() { val = false; } 151 }; 151 }; 152 152 153 // See .cc for an explanation of this in m 153 // See .cc for an explanation of this in method GenRandX() 154 // 154 // 155 G4Cache<a_check> local_IPDFXBias; 155 G4Cache<a_check> local_IPDFXBias; 156 G4bool XBias, IPDFXBias; 156 G4bool XBias, IPDFXBias; 157 G4PhysicsFreeVector XBiasH; 157 G4PhysicsFreeVector XBiasH; 158 G4PhysicsFreeVector IPDFXBiasH; 158 G4PhysicsFreeVector IPDFXBiasH; 159 G4Cache<a_check> local_IPDFYBias; 159 G4Cache<a_check> local_IPDFYBias; 160 G4bool YBias, IPDFYBias; 160 G4bool YBias, IPDFYBias; 161 G4PhysicsFreeVector YBiasH; 161 G4PhysicsFreeVector YBiasH; 162 G4PhysicsFreeVector IPDFYBiasH; 162 G4PhysicsFreeVector IPDFYBiasH; 163 G4Cache<a_check> local_IPDFZBias; 163 G4Cache<a_check> local_IPDFZBias; 164 G4bool ZBias, IPDFZBias; 164 G4bool ZBias, IPDFZBias; 165 G4PhysicsFreeVector ZBiasH; 165 G4PhysicsFreeVector ZBiasH; 166 G4PhysicsFreeVector IPDFZBiasH; 166 G4PhysicsFreeVector IPDFZBiasH; 167 G4Cache<a_check> local_IPDFThetaBias; 167 G4Cache<a_check> local_IPDFThetaBias; 168 G4bool ThetaBias, IPDFThetaBias; 168 G4bool ThetaBias, IPDFThetaBias; 169 G4PhysicsFreeVector ThetaBiasH; 169 G4PhysicsFreeVector ThetaBiasH; 170 G4PhysicsFreeVector IPDFThetaBiasH; 170 G4PhysicsFreeVector IPDFThetaBiasH; 171 G4Cache<a_check> local_IPDFPhiBias; 171 G4Cache<a_check> local_IPDFPhiBias; 172 G4bool PhiBias, IPDFPhiBias; 172 G4bool PhiBias, IPDFPhiBias; 173 G4PhysicsFreeVector PhiBiasH; 173 G4PhysicsFreeVector PhiBiasH; 174 G4PhysicsFreeVector IPDFPhiBiasH; 174 G4PhysicsFreeVector IPDFPhiBiasH; 175 G4Cache<a_check> local_IPDFEnergyBias; 175 G4Cache<a_check> local_IPDFEnergyBias; 176 G4bool EnergyBias, IPDFEnergyBias; 176 G4bool EnergyBias, IPDFEnergyBias; 177 G4PhysicsFreeVector EnergyBiasH; 177 G4PhysicsFreeVector EnergyBiasH; 178 G4PhysicsFreeVector IPDFEnergyBiasH; 178 G4PhysicsFreeVector IPDFEnergyBiasH; 179 G4Cache<a_check> local_IPDFPosThetaBias; 179 G4Cache<a_check> local_IPDFPosThetaBias; 180 G4bool PosThetaBias, IPDFPosThetaBias; 180 G4bool PosThetaBias, IPDFPosThetaBias; 181 G4PhysicsFreeVector PosThetaBiasH; 181 G4PhysicsFreeVector PosThetaBiasH; 182 G4PhysicsFreeVector IPDFPosThetaBiasH; 182 G4PhysicsFreeVector IPDFPosThetaBiasH; 183 G4Cache<a_check> local_IPDFPosPhiBias; 183 G4Cache<a_check> local_IPDFPosPhiBias; 184 G4bool PosPhiBias, IPDFPosPhiBias; 184 G4bool PosPhiBias, IPDFPosPhiBias; 185 G4PhysicsFreeVector PosPhiBiasH; 185 G4PhysicsFreeVector PosPhiBiasH; 186 G4PhysicsFreeVector IPDFPosPhiBiasH; 186 G4PhysicsFreeVector IPDFPosPhiBiasH; 187 187 188 struct bweights_t 188 struct bweights_t 189 { 189 { 190 G4double w[9]; 190 G4double w[9]; 191 bweights_t(); 191 bweights_t(); 192 G4double& operator[] (const int i); 192 G4double& operator[] (const int i); 193 }; 193 }; 194 G4Cache<bweights_t> bweights; 194 G4Cache<bweights_t> bweights; 195 // record x,y,z,theta,phi,energy,posThet 195 // record x,y,z,theta,phi,energy,posThet,posPhi,intensity weights 196 196 197 G4int verbosityLevel; 197 G4int verbosityLevel; 198 // Verbosity 198 // Verbosity 199 199 200 G4Mutex mutex; 200 G4Mutex mutex; 201 // Protect shared resources 201 // Protect shared resources 202 }; 202 }; 203 203 204 #endif 204 #endif 205 205