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 86978 2014-11-21 12:08:34Z gcosmo $ 26 // 27 // 27 //-------------------------------------------- 28 //--------------------------------------------------------------------------- 28 // 29 // 29 // ClassName: G4EnergyLossForExtrapolator 30 // ClassName: G4EnergyLossForExtrapolator 30 // 31 // 31 // Description: This class provide calculatio 32 // Description: This class provide calculation of energy loss, fluctuation, 32 // and msc angle 33 // and msc angle 33 // 34 // 34 // Author: 09.12.04 V.Ivanchenko 35 // Author: 09.12.04 V.Ivanchenko 35 // 36 // 36 // Modification: 37 // Modification: 37 // 08-04-05 Rename Propogator -> Extrapolator 38 // 08-04-05 Rename Propogator -> Extrapolator 38 // 16-03-06 Add muon tables 39 // 16-03-06 Add muon tables 39 // 21-03-06 Add verbosity defined in the const 40 // 21-03-06 Add verbosity defined in the constructor and Initialisation 40 // start only when first public metho 41 // start only when first public method is called (V.Ivanchenko) 41 // 03-05-06 Remove unused pointer G4Material* 42 // 03-05-06 Remove unused pointer G4Material* from number of methods (VI) 42 // 28-07-07 Add maxEnergyTransfer for computat 43 // 28-07-07 Add maxEnergyTransfer for computation of energy loss (VI) 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 <vector> 53 #include <CLHEP/Units/PhysicalConstants.h> 54 #include <CLHEP/Units/PhysicalConstants.h> 54 55 55 #include "globals.hh" 56 #include "globals.hh" 56 #include "G4PhysicsTable.hh" 57 #include "G4PhysicsTable.hh" 57 #include "G4TablesForExtrapolator.hh" 58 #include "G4TablesForExtrapolator.hh" 58 #include "G4Log.hh" 59 #include "G4Log.hh" 59 #include "G4Threading.hh" << 60 60 61 class G4ParticleDefinition; 61 class G4ParticleDefinition; 62 class G4Material; 62 class G4Material; 63 class G4MaterialCutsCouple; 63 class G4MaterialCutsCouple; 64 64 65 //....oooOO0OOooo........oooOO0OOooo........oo 65 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 66 66 67 class G4EnergyLossForExtrapolator 67 class G4EnergyLossForExtrapolator 68 { 68 { 69 public: 69 public: 70 70 71 explicit G4EnergyLossForExtrapolator(G4int v << 71 G4EnergyLossForExtrapolator(G4int verb = 1); 72 72 73 ~G4EnergyLossForExtrapolator(); 73 ~G4EnergyLossForExtrapolator(); 74 74 75 void Initialisation(); << 75 G4double ComputeDEDX(G4double kinEnergy, const G4ParticleDefinition*); 76 << 77 G4double ComputeDEDX(G4double kinEnergy, con << 78 const G4Material*); << 79 76 80 G4double ComputeRange(G4double kinEnergy, co << 77 G4double ComputeRange(G4double kinEnergy, const G4ParticleDefinition*); 81 const G4Material*); << 82 78 83 G4double ComputeEnergy(G4double range, const << 79 G4double ComputeEnergy(G4double range, const G4ParticleDefinition*); 84 const G4Material*); << 85 80 86 G4double EnergyAfterStep(G4double kinEnergy, 81 G4double EnergyAfterStep(G4double kinEnergy, G4double step, 87 const G4Material*, const G4ParticleDe 82 const G4Material*, const G4ParticleDefinition*); 88 83 89 G4double EnergyBeforeStep(G4double kinEnergy 84 G4double EnergyBeforeStep(G4double kinEnergy, G4double step, 90 const G4Material*, const G4Par 85 const G4Material*, const G4ParticleDefinition*); 91 86 92 G4double TrueStepLength(G4double kinEnergy, 87 G4double TrueStepLength(G4double kinEnergy, G4double step, 93 const G4Material*, const G4ParticleDef 88 const G4Material*, const G4ParticleDefinition* part); 94 89 95 inline G4double EnergyAfterStep(G4double kin 90 inline G4double EnergyAfterStep(G4double kinEnergy, G4double step, 96 const G4Material*, 91 const G4Material*, 97 const G4Stri 92 const G4String& particleName); 98 93 99 inline G4double EnergyBeforeStep(G4double ki 94 inline G4double EnergyBeforeStep(G4double kinEnergy, G4double step, 100 const G4Material*, 95 const G4Material*, 101 const G4Str 96 const G4String& particleName); 102 97 103 G4double AverageScatteringAngle(G4double kin << 98 inline G4double AverageScatteringAngle(G4double kinEnergy, G4double step, 104 const G4Material*, << 99 const G4Material*, 105 const G4ParticleDefinition* part); << 100 const G4ParticleDefinition* part); 106 101 107 inline G4double AverageScatteringAngle(G4dou 102 inline G4double AverageScatteringAngle(G4double kinEnergy, G4double step, 108 const G4Material*, 103 const G4Material*, 109 const G4String& particleName); 104 const G4String& particleName); 110 105 111 inline G4double ComputeTrueStep(const G4Mate 106 inline G4double ComputeTrueStep(const G4Material*, 112 const G4ParticleDefinition* part, 107 const G4ParticleDefinition* part, 113 G4double kinEnergy, G4double stepLen 108 G4double kinEnergy, G4double stepLength); 114 109 115 G4double EnergyDispersion(G4double kinEnergy << 110 inline G4double EnergyDispersion(G4double kinEnergy, G4double step, 116 const G4Material*, << 111 const G4Material*, 117 const G4ParticleDefinition*); << 112 const G4ParticleDefinition*); 118 113 119 inline G4double EnergyDispersion(G4double ki 114 inline G4double EnergyDispersion(G4double kinEnergy, G4double step, 120 const G4Material*, 115 const G4Material*, 121 const G4Str 116 const G4String& particleName); 122 117 123 inline void SetVerbose(G4int val); 118 inline void SetVerbose(G4int val); 124 119 125 inline void SetMinKinEnergy(G4double); 120 inline void SetMinKinEnergy(G4double); 126 121 127 inline void SetMaxKinEnergy(G4double); 122 inline void SetMaxKinEnergy(G4double); 128 123 129 inline void SetMaxEnergyTransfer(G4double); 124 inline void SetMaxEnergyTransfer(G4double); 130 << 131 // hide assignment operator << 132 G4EnergyLossForExtrapolator & operator= << 133 (const G4EnergyLossForExtrapolator &right) = << 134 G4EnergyLossForExtrapolator(const G4EnergyLo << 135 125 136 private: 126 private: 137 127 >> 128 void Initialisation(); >> 129 >> 130 void BuildTables(); >> 131 138 G4bool SetupKinematics(const G4ParticleDefin 132 G4bool SetupKinematics(const G4ParticleDefinition*, const G4Material*, 139 G4double kinEnergy); 133 G4double kinEnergy); 140 134 141 const G4ParticleDefinition* FindParticle(con 135 const G4ParticleDefinition* FindParticle(const G4String& name); 142 136 143 inline G4double ComputeValue(G4double x, con 137 inline G4double ComputeValue(G4double x, const G4PhysicsTable* table, 144 size_t idxMat); << 138 size_t idx); 145 139 146 inline const G4PhysicsTable* GetPhysicsTable 140 inline const G4PhysicsTable* GetPhysicsTable(ExtTableType type) const; 147 141 148 #ifdef G4MULTITHREADED << 142 // hide assignment operator 149 static G4Mutex extrMutex; << 143 G4EnergyLossForExtrapolator & operator=(const G4EnergyLossForExtrapolator &right); 150 #endif << 144 G4EnergyLossForExtrapolator(const G4EnergyLossForExtrapolator&); 151 static G4TablesForExtrapolator* tables; << 152 145 153 const G4ParticleDefinition* currentParticle << 146 static G4TablesForExtrapolator* tables; 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 147 180 G4bool isMaster = false; << 148 const G4ParticleDefinition* currentParticle; >> 149 const G4ParticleDefinition* electron; >> 150 const G4ParticleDefinition* positron; >> 151 const G4ParticleDefinition* muonPlus; >> 152 const G4ParticleDefinition* muonMinus; >> 153 const G4ParticleDefinition* proton; >> 154 >> 155 G4String currentParticleName; >> 156 >> 157 size_t idxDedxElectron; >> 158 size_t idxDedxPositron; >> 159 size_t idxDedxMuon; >> 160 size_t idxDedxProton; >> 161 size_t idxRangeElectron; >> 162 size_t idxRangePositron; >> 163 size_t idxRangeMuon; >> 164 size_t idxRangeProton; >> 165 size_t idxInvRangeElectron; >> 166 size_t idxInvRangePositron; >> 167 size_t idxInvRangeMuon; >> 168 size_t idxInvRangeProton; >> 169 size_t idxMscElectron; >> 170 >> 171 const G4Material* currentMaterial; >> 172 G4int index; >> 173 >> 174 G4double electronDensity; >> 175 G4double radLength; >> 176 G4double mass; >> 177 G4double charge2; >> 178 G4double kineticEnergy; >> 179 G4double gam; >> 180 G4double bg2; >> 181 G4double beta2; >> 182 G4double tmax; >> 183 >> 184 G4double linLossLimit; >> 185 G4double emin; >> 186 G4double emax; >> 187 G4double maxEnergyTransfer; >> 188 >> 189 G4int nbins; >> 190 G4int nmat; >> 191 G4int verbose; 181 }; 192 }; 182 193 183 //....oooOO0OOooo........oooOO0OOooo........oo 194 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 184 195 185 inline const G4PhysicsTable* 196 inline const G4PhysicsTable* 186 G4EnergyLossForExtrapolator::GetPhysicsTable(E 197 G4EnergyLossForExtrapolator::GetPhysicsTable(ExtTableType type) const 187 { 198 { 188 return tables->GetPhysicsTable(type); 199 return tables->GetPhysicsTable(type); 189 } 200 } 190 201 191 //....oooOO0OOooo........oooOO0OOooo........oo 202 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 192 203 193 inline G4double 204 inline G4double 194 G4EnergyLossForExtrapolator::EnergyAfterStep(G 205 G4EnergyLossForExtrapolator::EnergyAfterStep(G4double kinEnergy, 195 G4double step, 206 G4double step, 196 const G4Material* mat, 207 const G4Material* mat, 197 const G4String& name) 208 const G4String& name) 198 { 209 { 199 return EnergyAfterStep(kinEnergy,step,mat,Fi 210 return EnergyAfterStep(kinEnergy,step,mat,FindParticle(name)); 200 } 211 } 201 212 202 //....oooOO0OOooo........oooOO0OOooo........oo 213 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 203 214 204 inline G4double 215 inline G4double 205 G4EnergyLossForExtrapolator::EnergyBeforeStep( 216 G4EnergyLossForExtrapolator::EnergyBeforeStep(G4double kinEnergy, 206 G4double step, 217 G4double step, 207 const G4Material* mat, 218 const G4Material* mat, 208 const G4String& name) 219 const G4String& name) 209 { 220 { 210 return EnergyBeforeStep(kinEnergy,step,mat,F 221 return EnergyBeforeStep(kinEnergy,step,mat,FindParticle(name)); 211 } 222 } 212 223 213 //....oooOO0OOooo........oooOO0OOooo........oo 224 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 214 225 215 inline G4double 226 inline G4double 216 G4EnergyLossForExtrapolator::AverageScattering 227 G4EnergyLossForExtrapolator::AverageScatteringAngle(G4double kinEnergy, 217 G4double step, 228 G4double step, 218 const G4Material* mat, 229 const G4Material* mat, 219 const G4String& name) 230 const G4String& name) 220 { 231 { 221 return AverageScatteringAngle(kinEnergy,step 232 return AverageScatteringAngle(kinEnergy,step,mat,FindParticle(name)); 222 } 233 } 223 234 224 //....oooOO0OOooo........oooOO0OOooo........oo 235 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 225 236 226 inline G4double 237 inline G4double 227 G4EnergyLossForExtrapolator::EnergyDispersion( 238 G4EnergyLossForExtrapolator::EnergyDispersion(G4double kinEnergy, 228 G4double step, 239 G4double step, 229 const G4Material* mat, 240 const G4Material* mat, 230 const G4String& name) 241 const G4String& name) 231 { 242 { 232 return EnergyDispersion(kinEnergy,step,mat,F 243 return EnergyDispersion(kinEnergy,step,mat,FindParticle(name)); 233 } 244 } 234 245 235 //....oooOO0OOooo........oooOO0OOooo........oo 246 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 236 247 >> 248 inline G4double G4EnergyLossForExtrapolator::AverageScatteringAngle( >> 249 G4double kinEnergy, >> 250 G4double stepLength, >> 251 const G4Material* mat, >> 252 const G4ParticleDefinition* part) >> 253 { >> 254 G4double theta = 0.0; >> 255 if(SetupKinematics(part, mat, kinEnergy)) { >> 256 G4double t = stepLength/radLength; >> 257 G4double y = std::max(0.001, t); >> 258 theta = 19.23*CLHEP::MeV*std::sqrt(charge2*t)*(1.0 + 0.038*G4Log(y)) >> 259 /(beta2*gam*mass); >> 260 } >> 261 return theta; >> 262 } >> 263 >> 264 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... >> 265 237 inline G4double 266 inline G4double 238 G4EnergyLossForExtrapolator::ComputeTrueStep(c 267 G4EnergyLossForExtrapolator::ComputeTrueStep(const G4Material* mat, 239 const G4ParticleDefinition* par 268 const G4ParticleDefinition* part, 240 G4double kinEnergy, 269 G4double kinEnergy, 241 G4double stepLength) 270 G4double stepLength) 242 { 271 { 243 G4double theta = AverageScatteringAngle(kinE 272 G4double theta = AverageScatteringAngle(kinEnergy,stepLength,mat,part); 244 return stepLength*std::sqrt(1.0 + 0.625*thet 273 return stepLength*std::sqrt(1.0 + 0.625*theta*theta); 245 } 274 } 246 275 247 //....oooOO0OOooo........oooOO0OOooo........oo 276 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... >> 277 >> 278 inline G4double >> 279 G4EnergyLossForExtrapolator::EnergyDispersion(G4double kinEnergy, >> 280 G4double stepLength, >> 281 const G4Material* mat, >> 282 const G4ParticleDefinition* part) >> 283 { >> 284 G4double sig2 = 0.0; >> 285 if(SetupKinematics(part, mat, kinEnergy)) { >> 286 G4double step = ComputeTrueStep(mat,part,kinEnergy,stepLength); >> 287 sig2 = (1.0/beta2 - 0.5) >> 288 *CLHEP::twopi_mc2_rcl2*tmax*step*electronDensity*charge2; >> 289 } >> 290 return sig2; >> 291 } >> 292 >> 293 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 248 294 249 inline G4double 295 inline G4double 250 G4EnergyLossForExtrapolator::ComputeValue(G4do 296 G4EnergyLossForExtrapolator::ComputeValue(G4double x, 251 const G4PhysicsTable* table, 297 const G4PhysicsTable* table, 252 size_t idxMat) << 298 size_t idx) 253 { 299 { 254 return (nullptr != table) ? ((*table)[idxMat << 300 G4double res = 0.0; >> 301 if(table) { res = ((*table)[index])->Value(x, idx); } >> 302 return res; 255 } 303 } 256 304 257 //....oooOO0OOooo........oooOO0OOooo........oo 305 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 258 306 259 inline void G4EnergyLossForExtrapolator::SetVe 307 inline void G4EnergyLossForExtrapolator::SetVerbose(G4int val) 260 { 308 { 261 verbose = val; 309 verbose = val; 262 } 310 } 263 311 264 //....oooOO0OOooo........oooOO0OOooo........oo 312 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 265 313 266 inline void G4EnergyLossForExtrapolator::SetMi 314 inline void G4EnergyLossForExtrapolator::SetMinKinEnergy(G4double val) 267 { 315 { 268 emin = val; 316 emin = val; 269 } 317 } 270 318 271 //....oooOO0OOooo........oooOO0OOooo........oo 319 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 272 320 273 inline void G4EnergyLossForExtrapolator::SetMa 321 inline void G4EnergyLossForExtrapolator::SetMaxKinEnergy(G4double val) 274 { 322 { 275 emax = val; 323 emax = val; 276 } 324 } 277 325 278 //....oooOO0OOooo........oooOO0OOooo........oo 326 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 279 327 280 inline void G4EnergyLossForExtrapolator::SetMa 328 inline void G4EnergyLossForExtrapolator::SetMaxEnergyTransfer(G4double val) 281 { 329 { 282 maxEnergyTransfer = val; 330 maxEnergyTransfer = val; 283 } 331 } 284 332 285 //....oooOO0OOooo........oooOO0OOooo........oo 333 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 286 334 287 #endif 335 #endif 288 336 289 337