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 // $Id: G4EnergyLossForExtrapolator.hh,v 1.7 2006/07/21 09:39:02 vnivanch Exp $ >> 27 // GEANT4 tag $Name: geant4-08-01-patch-01 $ 26 // 28 // 27 //-------------------------------------------- 29 //--------------------------------------------------------------------------- 28 // 30 // 29 // ClassName: G4EnergyLossForExtrapolator 31 // ClassName: G4EnergyLossForExtrapolator 30 // 32 // 31 // Description: This class provide calculatio 33 // Description: This class provide calculation of energy loss, fluctuation, 32 // and msc angle 34 // and msc angle 33 // 35 // 34 // Author: 09.12.04 V.Ivanchenko 36 // Author: 09.12.04 V.Ivanchenko 35 // 37 // 36 // Modification: 38 // Modification: 37 // 08-04-05 Rename Propogator -> Extrapolator 39 // 08-04-05 Rename Propogator -> Extrapolator 38 // 16-03-06 Add muon tables 40 // 16-03-06 Add muon tables 39 // 21-03-06 Add verbosity defined in the const 41 // 21-03-06 Add verbosity defined in the constructor and Initialisation 40 // start only when first public metho 42 // start only when first public method is called (V.Ivanchenko) 41 // 03-05-06 Remove unused pointer G4Material* 43 // 03-05-06 Remove unused pointer G4Material* from number of methods (VI) 42 // 28-07-07 Add maxEnergyTransfer for computat << 43 // 44 // 44 //-------------------------------------------- 45 //---------------------------------------------------------------------------- 45 // 46 // 46 47 47 //....oooOO0OOooo........oooOO0OOooo........oo 48 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 48 49 49 #ifndef G4EnergyLossForExtrapolator_h 50 #ifndef G4EnergyLossForExtrapolator_h 50 #define G4EnergyLossForExtrapolator_h 1 51 #define G4EnergyLossForExtrapolator_h 1 51 52 52 #include <vector> << 53 #include <CLHEP/Units/PhysicalConstants.h> << 54 53 55 #include "globals.hh" 54 #include "globals.hh" 56 #include "G4PhysicsTable.hh" 55 #include "G4PhysicsTable.hh" 57 #include "G4TablesForExtrapolator.hh" << 56 #include <vector> 58 #include "G4Log.hh" << 59 #include "G4Threading.hh" << 60 57 61 class G4ParticleDefinition; 58 class G4ParticleDefinition; 62 class G4Material; 59 class G4Material; 63 class G4MaterialCutsCouple; 60 class G4MaterialCutsCouple; >> 61 class G4ProductionCuts; 64 62 65 //....oooOO0OOooo........oooOO0OOooo........oo 63 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 66 64 67 class G4EnergyLossForExtrapolator 65 class G4EnergyLossForExtrapolator 68 { 66 { 69 public: 67 public: >> 68 G4EnergyLossForExtrapolator(G4int verb = 1); 70 69 71 explicit G4EnergyLossForExtrapolator(G4int v << 70 virtual ~G4EnergyLossForExtrapolator(); 72 << 73 ~G4EnergyLossForExtrapolator(); << 74 << 75 void Initialisation(); << 76 << 77 G4double ComputeDEDX(G4double kinEnergy, con << 78 const G4Material*); << 79 << 80 G4double ComputeRange(G4double kinEnergy, co << 81 const G4Material*); << 82 << 83 G4double ComputeEnergy(G4double range, const << 84 const G4Material*); << 85 71 86 G4double EnergyAfterStep(G4double kinEnergy, 72 G4double EnergyAfterStep(G4double kinEnergy, G4double step, 87 const G4Material*, const G4ParticleDe 73 const G4Material*, const G4ParticleDefinition*); 88 74 89 G4double EnergyBeforeStep(G4double kinEnergy << 75 G4double EnergyAfterStep(G4double kinEnergy, G4double step, 90 const G4Material*, const G4Par << 76 const G4Material*, const G4String& particleName); 91 77 92 G4double TrueStepLength(G4double kinEnergy, << 78 G4double EnergyBeforeStep(G4double kinEnergy, G4double step, 93 const G4Material*, const G4ParticleDef << 79 const G4Material*, const G4ParticleDefinition*); 94 80 95 inline G4double EnergyAfterStep(G4double kin << 81 G4double EnergyBeforeStep(G4double kinEnergy, G4double step, 96 const G4Material*, << 82 const G4Material*, const G4String& particleName); 97 const G4Stri << 98 << 99 inline G4double EnergyBeforeStep(G4double ki << 100 const G4Material*, << 101 const G4Str << 102 83 103 G4double AverageScatteringAngle(G4double kin 84 G4double AverageScatteringAngle(G4double kinEnergy, G4double step, 104 const G4Material*, << 85 const G4Material*, const G4ParticleDefinition* part); 105 const G4ParticleDefinition* part); << 106 86 107 inline G4double AverageScatteringAngle(G4dou << 87 G4double AverageScatteringAngle(G4double kinEnergy, G4double step, 108 const G4Material*, << 88 const G4Material*, const G4String& particleName); 109 const G4String& particleName); << 110 << 111 inline G4double ComputeTrueStep(const G4Mate << 112 const G4ParticleDefinition* part, << 113 G4double kinEnergy, G4double stepLen << 114 89 115 G4double EnergyDispersion(G4double kinEnergy 90 G4double EnergyDispersion(G4double kinEnergy, G4double step, 116 const G4Material*, << 91 const G4Material*, const G4ParticleDefinition*); 117 const G4ParticleDefinition*); << 118 92 119 inline G4double EnergyDispersion(G4double ki << 93 G4double EnergyDispersion(G4double kinEnergy, G4double step, 120 const G4Material*, << 94 const G4Material*, const G4String& particleName); 121 const G4Str << 122 << 123 inline void SetVerbose(G4int val); << 124 95 125 inline void SetMinKinEnergy(G4double); << 96 G4double ComputeDEDX(G4double kinEnergy, const G4ParticleDefinition*); 126 97 127 inline void SetMaxKinEnergy(G4double); << 98 G4double ComputeRange(G4double kinEnergy, const G4ParticleDefinition*); 128 99 129 inline void SetMaxEnergyTransfer(G4double); << 100 G4double ComputeEnergy(G4double range, const G4ParticleDefinition*); 130 101 131 // hide assignment operator << 102 void SetVerbose(G4int val); 132 G4EnergyLossForExtrapolator & operator= << 133 (const G4EnergyLossForExtrapolator &right) = << 134 G4EnergyLossForExtrapolator(const G4EnergyLo << 135 103 136 private: 104 private: 137 105 138 G4bool SetupKinematics(const G4ParticleDefin << 106 void Initialisation(); 139 G4double kinEnergy); << 140 107 141 const G4ParticleDefinition* FindParticle(con << 108 G4PhysicsTable* PrepareTable(); 142 109 143 inline G4double ComputeValue(G4double x, con << 110 const G4ParticleDefinition* FindParticle(const G4String& name); 144 size_t idxMat); << 145 111 146 inline const G4PhysicsTable* GetPhysicsTable << 112 G4double ComputeValue(G4double x, const G4PhysicsTable* table); 147 113 148 #ifdef G4MULTITHREADED << 114 void ComputeElectronDEDX(const G4ParticleDefinition* part, G4PhysicsTable* table); 149 static G4Mutex extrMutex; << 150 #endif << 151 static G4TablesForExtrapolator* tables; << 152 << 153 const G4ParticleDefinition* currentParticle << 154 const G4ParticleDefinition* electron = nullp << 155 const G4ParticleDefinition* positron = nullp << 156 const G4ParticleDefinition* muonPlus = nullp << 157 const G4ParticleDefinition* muonMinus= nullp << 158 const G4ParticleDefinition* proton = nullptr << 159 const G4Material* currentMaterial = nullptr; << 160 << 161 G4double electronDensity = 0.0; << 162 G4double radLength = 0.0; << 163 G4double charge2 = 0.0; << 164 G4double kineticEnergy = 0.0; << 165 G4double gam = 1.0; << 166 G4double bg2 = 0.0; << 167 G4double beta2 = 0.0; << 168 G4double tmax = 0.0; << 169 << 170 G4double linLossLimit = 0.01; << 171 G4double emin = 0.0; << 172 G4double emax = 0.0; << 173 G4double maxEnergyTransfer = 0.0; << 174 << 175 size_t index = 0; << 176 size_t nmat = 0; << 177 G4int nbins = 80; << 178 G4int verbose = 0; << 179 115 180 G4bool isMaster = false; << 116 void ComputeMuonDEDX(const G4ParticleDefinition* part, G4PhysicsTable* table); 181 }; << 182 117 183 //....oooOO0OOooo........oooOO0OOooo........oo << 118 void ComputeProtonDEDX(const G4ParticleDefinition* part, G4PhysicsTable* table); 184 119 185 inline const G4PhysicsTable* << 120 G4double ComputeTrueStep(const G4Material*, const G4ParticleDefinition* part, 186 G4EnergyLossForExtrapolator::GetPhysicsTable(E << 121 G4double kinEnergy, G4double stepLength); 187 { << 122 188 return tables->GetPhysicsTable(type); << 123 G4double ComputeScatteringAngle(G4double x); 189 } << 124 >> 125 const G4ParticleDefinition* currentParticle; >> 126 const G4ParticleDefinition* electron; >> 127 const G4ParticleDefinition* positron; >> 128 const G4ParticleDefinition* muonPlus; >> 129 const G4ParticleDefinition* muonMinus; >> 130 const G4ParticleDefinition* proton; >> 131 >> 132 G4ProductionCuts* cuts; >> 133 std::vector<const G4MaterialCutsCouple*> couples; >> 134 >> 135 G4String currentParticleName; >> 136 >> 137 G4PhysicsTable* dedxElectron; >> 138 G4PhysicsTable* dedxPositron; >> 139 G4PhysicsTable* dedxMuon; >> 140 G4PhysicsTable* dedxProton; >> 141 G4PhysicsTable* rangeElectron; >> 142 G4PhysicsTable* rangePositron; >> 143 G4PhysicsTable* rangeMuon; >> 144 G4PhysicsTable* rangeProton; >> 145 G4PhysicsTable* invRangeElectron; >> 146 G4PhysicsTable* invRangePositron; >> 147 G4PhysicsTable* invRangeMuon; >> 148 G4PhysicsTable* invRangeProton; >> 149 >> 150 const G4Material* currentMaterial; >> 151 G4int index; >> 152 G4double electronDensity; >> 153 G4double radLength; >> 154 G4double mass; >> 155 G4double charge2; >> 156 G4double kineticEnergy; >> 157 G4double gam; >> 158 G4double bg2; >> 159 G4double beta2; >> 160 G4double tmax; >> 161 >> 162 G4double linLossLimit; >> 163 G4double emin; >> 164 G4double emax; >> 165 G4int nbins; >> 166 G4int nmat; >> 167 G4int verbose; >> 168 G4bool isInitialised; >> 169 }; 190 170 191 //....oooOO0OOooo........oooOO0OOooo........oo 171 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 192 172 193 inline G4double << 173 inline G4double G4EnergyLossForExtrapolator::EnergyAfterStep(G4double kinEnergy, 194 G4EnergyLossForExtrapolator::EnergyAfterStep(G << 174 G4double step, 195 G4double step, << 175 const G4Material* mat, 196 const G4Material* mat, << 176 const G4String& name) 197 const G4String& name) << 198 { 177 { 199 return EnergyAfterStep(kinEnergy,step,mat,Fi 178 return EnergyAfterStep(kinEnergy,step,mat,FindParticle(name)); 200 } 179 } 201 180 202 //....oooOO0OOooo........oooOO0OOooo........oo 181 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 203 182 204 inline G4double << 183 inline G4double G4EnergyLossForExtrapolator::EnergyBeforeStep(G4double kinEnergy, 205 G4EnergyLossForExtrapolator::EnergyBeforeStep( << 184 G4double step, 206 G4double step, << 185 const G4Material* mat, 207 const G4Material* mat, << 186 const G4String& name) 208 const G4String& name) << 209 { 187 { 210 return EnergyBeforeStep(kinEnergy,step,mat,F 188 return EnergyBeforeStep(kinEnergy,step,mat,FindParticle(name)); 211 } 189 } 212 190 213 //....oooOO0OOooo........oooOO0OOooo........oo 191 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 214 192 215 inline G4double << 193 inline G4double G4EnergyLossForExtrapolator::AverageScatteringAngle(G4double kinEnergy, 216 G4EnergyLossForExtrapolator::AverageScattering << 194 G4double step, 217 G4double step, << 195 const G4Material* mat, 218 const G4Material* mat, << 196 const G4String& name) 219 const G4String& name) << 220 { 197 { 221 return AverageScatteringAngle(kinEnergy,step 198 return AverageScatteringAngle(kinEnergy,step,mat,FindParticle(name)); 222 } 199 } 223 200 224 //....oooOO0OOooo........oooOO0OOooo........oo 201 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 225 202 226 inline G4double << 203 inline G4double G4EnergyLossForExtrapolator::EnergyDispersion(G4double kinEnergy, 227 G4EnergyLossForExtrapolator::EnergyDispersion( << 204 G4double step, 228 G4double step, << 205 const G4Material* mat, 229 const G4Material* mat, << 206 const G4String& name) 230 const G4String& name) << 231 { 207 { 232 return EnergyDispersion(kinEnergy,step,mat,F 208 return EnergyDispersion(kinEnergy,step,mat,FindParticle(name)); 233 } 209 } 234 210 235 //....oooOO0OOooo........oooOO0OOooo........oo 211 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 236 212 237 inline G4double << 213 inline G4double G4EnergyLossForExtrapolator::AverageScatteringAngle(G4double kinEnergy, 238 G4EnergyLossForExtrapolator::ComputeTrueStep(c << 214 G4double stepLength, 239 const G4ParticleDefinition* par << 215 const G4Material* mat, 240 G4double kinEnergy, << 216 const G4ParticleDefinition* part) 241 G4double stepLength) << 242 { << 243 G4double theta = AverageScatteringAngle(kinE << 244 return stepLength*std::sqrt(1.0 + 0.625*thet << 245 } << 246 << 247 //....oooOO0OOooo........oooOO0OOooo........oo << 248 << 249 inline G4double << 250 G4EnergyLossForExtrapolator::ComputeValue(G4do << 251 const G4PhysicsTable* table, << 252 size_t idxMat) << 253 { 217 { 254 return (nullptr != table) ? ((*table)[idxMat << 218 if(!isInitialised) Initialisation(); >> 219 G4double theta = 0.0; >> 220 if(mat && part && kinEnergy > 0.0) { >> 221 G4double step = ComputeTrueStep(mat,part,kinEnergy,stepLength); >> 222 if(step > 0.001*radLength) theta = ComputeScatteringAngle(stepLength); >> 223 } >> 224 return theta; 255 } 225 } 256 226 257 //....oooOO0OOooo........oooOO0OOooo........oo 227 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 258 228 259 inline void G4EnergyLossForExtrapolator::SetVe << 229 inline G4double G4EnergyLossForExtrapolator::ComputeScatteringAngle(G4double x) 260 { 230 { 261 verbose = val; << 231 G4double t = x/radLength; >> 232 return 19.23*MeV*std::sqrt(charge2*t)*(1.0 + 0.038*std::log(t))/(beta2*gam*mass); 262 } 233 } 263 234 264 //....oooOO0OOooo........oooOO0OOooo........oo 235 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 265 << 236 266 inline void G4EnergyLossForExtrapolator::SetMi << 237 inline G4double G4EnergyLossForExtrapolator::EnergyDispersion(G4double kinEnergy, >> 238 G4double stepLength, >> 239 const G4Material* mat, >> 240 const G4ParticleDefinition* part) 267 { 241 { 268 emin = val; << 242 if(!isInitialised) Initialisation(); >> 243 G4double sig2 = 0.0; >> 244 if(mat && part ) { >> 245 G4double step = ComputeTrueStep(mat,part,kinEnergy,stepLength); >> 246 sig2 = (1.0/beta2 - 0.5)* twopi_mc2_rcl2 * tmax*step * electronDensity * charge2; >> 247 } >> 248 return sig2; 269 } 249 } 270 250 271 //....oooOO0OOooo........oooOO0OOooo........oo 251 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 272 252 273 inline void G4EnergyLossForExtrapolator::SetMa << 253 inline G4double G4EnergyLossForExtrapolator::ComputeValue(G4double x, >> 254 const G4PhysicsTable* table) 274 { 255 { 275 emax = val; << 256 G4double res = 0.0; >> 257 bool b; >> 258 res = ((*table)[index])->GetValue(x, b); >> 259 return res; 276 } 260 } 277 261 278 //....oooOO0OOooo........oooOO0OOooo........oo 262 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 279 263 280 inline void G4EnergyLossForExtrapolator::SetMa << 264 inline void G4EnergyLossForExtrapolator::SetVerbose(G4int val) 281 { 265 { 282 maxEnergyTransfer = val; << 266 verbose = val; 283 } 267 } 284 268 285 //....oooOO0OOooo........oooOO0OOooo........oo 269 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 286 270 287 #endif 271 #endif 288 272 289 273