Geant4 Cross Reference |
1 // 1 // 2 // ******************************************* 2 // ******************************************************************** 3 // * License and Disclaimer << 3 // * DISCLAIMER * 4 // * 4 // * * 5 // * The Geant4 software is copyright of th << 5 // * The following disclaimer summarizes all the specific disclaimers * 6 // * the Geant4 Collaboration. It is provided << 6 // * of contributors to this software. The specific disclaimers,which * 7 // * conditions of the Geant4 Software License << 7 // * govern, are listed with their locations in: * 8 // * LICENSE and available at http://cern.ch/ << 8 // * http://cern.ch/geant4/license * 9 // * include a list of copyright holders. << 10 // * 9 // * * 11 // * Neither the authors of this software syst 10 // * Neither the authors of this software system, nor their employing * 12 // * institutes,nor the agencies providing fin 11 // * institutes,nor the agencies providing financial support for this * 13 // * work make any representation or warran 12 // * work make any representation or warranty, express or implied, * 14 // * regarding this software system or assum 13 // * regarding this software system or assume any liability for its * 15 // * use. Please see the license in the file << 14 // * use. * 16 // * for the full disclaimer and the limitatio << 17 // * 15 // * * 18 // * This code implementation is the result << 16 // * This code implementation is the intellectual property of the * 19 // * technical work of the GEANT4 collaboratio << 17 // * GEANT4 collaboration. * 20 // * By using, copying, modifying or distri << 18 // * By copying, distributing or modifying the Program (or any work * 21 // * any work based on the software) you ag << 19 // * based on the Program) you indicate your acceptance of this * 22 // * use in resulting scientific publicati << 20 // * statement, and all its terms. * 23 // * acceptance of all terms of the Geant4 Sof << 24 // ******************************************* 21 // ******************************************************************** 25 // 22 // >> 23 // $Id: G4EmCorrections.hh,v 1.3 2005/02/26 22:01:20 vnivanch Exp $ >> 24 // GEANT4 tag $Name: geant4-08-00-patch-01 $ 26 // 25 // 27 // ------------------------------------------- 26 // ------------------------------------------------------------------- 28 // 27 // 29 // GEANT4 Class header file 28 // GEANT4 Class header file 30 // 29 // 31 // 30 // 32 // File name: G4EmCorrections 31 // File name: G4EmCorrections 33 // 32 // 34 // Author: Vladimir Ivanchenko 33 // Author: Vladimir Ivanchenko 35 // 34 // 36 // Creation date: 13.01.2005 35 // Creation date: 13.01.2005 37 // 36 // 38 // Modifications: 37 // Modifications: 39 // 28.04.2006 General cleanup, add finite size << 38 // 40 // 13.05.2006 Add corrections for ion stopping << 41 // 20.05.2008 Removed Finite Size correction ( << 42 // 12.09.2008 Added inlined interfaces to effe << 43 // 19.04.2012 Fix reproducibility problem (A.R << 44 // 39 // 45 // Class Description: 40 // Class Description: 46 // 41 // 47 // This class provides calculation of EM corre << 42 // This class provides calculation of EM corrections to ionisation 48 // 43 // 49 44 50 // ------------------------------------------- 45 // ------------------------------------------------------------------- 51 // 46 // 52 47 53 #ifndef G4EmCorrections_h 48 #ifndef G4EmCorrections_h 54 #define G4EmCorrections_h 1 49 #define G4EmCorrections_h 1 55 50 56 #include "globals.hh" 51 #include "globals.hh" >> 52 #include "G4AtomicShells.hh" 57 #include "G4ionEffectiveCharge.hh" 53 #include "G4ionEffectiveCharge.hh" 58 #include "G4Material.hh" << 59 #include "G4ParticleDefinition.hh" << 60 54 61 class G4VEmModel; << 55 class G4Material; 62 class G4PhysicsVector; << 56 class G4ParticleDefinition; 63 class G4IonTable; << 64 class G4MaterialCutsCouple; << 65 class G4PhysicsFreeVector; << 66 class G4Pow; << 67 57 68 class G4EmCorrections << 58 class G4EmCorrections 69 { 59 { 70 60 71 public: 61 public: 72 62 73 explicit G4EmCorrections(G4int verb); << 63 G4EmCorrections(); 74 << 75 ~G4EmCorrections(); << 76 << 77 G4double HighOrderCorrections(const G4Partic << 78 const G4Materi << 79 const G4double << 80 const G4double << 81 << 82 G4double IonHighOrderCorrections(const G4Par << 83 const G4Mat << 84 const G4dou << 85 << 86 G4double ComputeIonCorrections(const G4Parti << 87 const G4Mater << 88 const G4doubl << 89 << 90 G4double IonBarkasCorrection(const G4Particl << 91 const G4Materia << 92 const G4double << 93 << 94 G4double Bethe(const G4ParticleDefinition*, << 95 const G4Material*, << 96 const G4double kineticEnergy) << 97 << 98 G4double SpinCorrection(const G4ParticleDefi << 99 const G4Material*, << 100 const G4double kinet << 101 << 102 G4double KShellCorrection(const G4ParticleDe << 103 const G4Material*, << 104 const G4double kin << 105 << 106 G4double LShellCorrection(const G4ParticleDe << 107 const G4Material*, << 108 const G4double kin << 109 << 110 G4double ShellCorrection(const G4ParticleDef << 111 const G4Material*, << 112 const G4double kine << 113 << 114 G4double ShellCorrectionSTD(const G4Particle << 115 const G4Material << 116 const G4double k << 117 << 118 G4double DensityCorrection(const G4ParticleD << 119 const G4Material* << 120 const G4double ki << 121 << 122 G4double BarkasCorrection(const G4ParticleDe << 123 const G4Material*, << 124 const G4double kin << 125 const G4bool isIni << 126 << 127 G4double BlochCorrection(const G4ParticleDef << 128 const G4Material*, << 129 const G4double kine << 130 const G4bool isInit << 131 << 132 G4double MottCorrection(const G4ParticleDefi << 133 const G4Material*, << 134 const G4double kinet << 135 const G4bool isIniti << 136 << 137 void AddStoppingData(const G4int Z, const G4 << 138 const G4String& materia << 139 G4PhysicsVector* dVecto << 140 << 141 void InitialiseForNewRun(); << 142 << 143 // effective charge correction using stoppin << 144 G4double EffectiveChargeCorrection(const G4P << 145 const G4M << 146 const G4d << 147 << 148 // effective charge of an ion << 149 inline G4double GetParticleCharge(const G4Pa << 150 const G4Ma << 151 const G4do << 152 << 153 inline << 154 G4double EffectiveChargeSquareRatio(const G4 << 155 const G4 << 156 const G4 << 157 << 158 // ionisation models for ions << 159 inline void SetIonisationModels(G4VEmModel* << 160 G4VEmModel* << 161 64 162 inline G4int GetNumberOfStoppingVectors() co << 65 virtual ~G4EmCorrections(); 163 66 164 inline void SetVerbose(G4int verb); << 67 G4double HighOrderCorrections(const G4ParticleDefinition* p, 165 << 68 const G4Material* material, 166 // hide assignment operator << 69 G4double kineticEnergy); 167 G4EmCorrections & operator=(const G4EmCorrec << 70 168 G4EmCorrections(const G4EmCorrections&) = de << 71 G4double Bethe(const G4ParticleDefinition* p, >> 72 const G4Material* material, >> 73 G4double kineticEnergy); >> 74 >> 75 G4double SpinCorrection(const G4ParticleDefinition* p, >> 76 const G4Material* material, >> 77 G4double kineticEnergy); >> 78 >> 79 G4double KShellCorrection(const G4ParticleDefinition* p, >> 80 const G4Material* material, >> 81 G4double kineticEnergy); >> 82 >> 83 G4double LShellCorrection(const G4ParticleDefinition* p, >> 84 const G4Material* material, >> 85 G4double kineticEnergy); >> 86 >> 87 G4double ShellCorrection(const G4ParticleDefinition* p, >> 88 const G4Material* material, >> 89 G4double kineticEnergy); >> 90 >> 91 G4double ShellCorrectionSTD(const G4ParticleDefinition* p, >> 92 const G4Material* material, >> 93 G4double kineticEnergy); >> 94 >> 95 G4double DensityCorrection(const G4ParticleDefinition* p, >> 96 const G4Material* material, >> 97 G4double kineticEnergy); >> 98 >> 99 G4double BarkasCorrection(const G4ParticleDefinition* p, >> 100 const G4Material* material, >> 101 G4double kineticEnergy); >> 102 >> 103 G4double BlochCorrection(const G4ParticleDefinition* p, >> 104 const G4Material* material, >> 105 G4double kineticEnergy); >> 106 >> 107 G4double MottCorrection(const G4ParticleDefinition* p, >> 108 const G4Material* material, >> 109 G4double kineticEnergy); >> 110 >> 111 G4double NuclearDEDX(const G4ParticleDefinition* p, >> 112 const G4Material* material, >> 113 G4double kineticEnergy, >> 114 G4bool fluct = true); 169 115 170 private: 116 private: 171 117 172 void Initialise(); 118 void Initialise(); 173 119 174 void BuildCorrectionVector(); << 120 G4double KShell(G4double theta, G4double eta); 175 121 176 void SetupKinematics(const G4ParticleDefinit << 122 G4double LShell(G4double theta, G4double eta); 177 const G4Material*, << 178 const G4double kineticE << 179 << 180 G4double KShell(const G4double theta, const << 181 << 182 G4double LShell(const G4double theta, const << 183 << 184 G4int Index(const G4double x, const G4double << 185 << 186 G4double Value(const G4double xv, const G4do << 187 const G4double y1, const G4do << 188 << 189 G4double Value2(const G4double xv, const G4d << 190 const G4double x1, const G4d << 191 const G4double y1, const G4d << 192 const G4double z11, const G4 << 193 const G4double z12, const G4double z22) << 194 << 195 G4Pow* g4calc; << 196 G4IonTable* ionTable; << 197 << 198 const G4ParticleDefinition* particle = nullp << 199 const G4ParticleDefinition* curParticle = nu << 200 const G4Material* material = nullptr; << 201 const G4Material* curMaterial = nullptr; << 202 const G4ElementVector* theElementVector = nu << 203 const G4double* atomDensity = nullptr; << 204 << 205 G4PhysicsVector* curVector = nullptr; << 206 << 207 G4VEmModel* ionLEModel = nullptr; << 208 G4VEmModel* ionHEModel = nullptr; << 209 << 210 G4double kinEnergy = 0.0; << 211 G4double mass = 0.0; << 212 G4double massFactor = 1.0; << 213 G4double tau = 0.0; << 214 G4double gamma = 1.0; << 215 G4double bg2 = 0.0; << 216 G4double beta2 = 0.0; << 217 G4double beta = 0.0; << 218 G4double ba2 = 0.0; << 219 G4double tmax = 0.0; << 220 G4double charge = 0.0; << 221 G4double q2 = 0.0; << 222 G4double eth; << 223 G4double eCorrMin; << 224 G4double eCorrMax; << 225 << 226 std::size_t ncouples = 0; << 227 std::size_t idxBarkas = 0; << 228 G4int nK = 20; << 229 G4int nL = 26; << 230 G4int nEtaK = 29; << 231 G4int nEtaL = 28; << 232 G4int nbinCorr = 52; << 233 G4int numberOfElements = 0; << 234 << 235 // Ion stopping data << 236 G4int nIons = 0; << 237 G4int idx = 0; << 238 G4int currentZ = 0; << 239 << 240 G4int verbose; << 241 G4bool isInitializer = false; << 242 << 243 std::vector<G4int> Zion; << 244 std::vector<G4int> Aion; << 245 std::vector<G4String> materialName; << 246 std::vector<const G4ParticleDefinition*> ion << 247 << 248 std::map< G4int, std::vector<G4double> > thc << 249 << 250 std::vector<const G4Material*> currmat; << 251 std::vector<const G4Material*> materialList; << 252 std::vector<G4PhysicsVector*> stopData; << 253 << 254 G4ionEffectiveCharge effCharge; << 255 << 256 static const G4double ZD[11]; << 257 static const G4double UK[20]; << 258 static const G4double VK[20]; << 259 static G4double ZK[20]; << 260 static const G4double Eta[29]; << 261 static G4double CK[20][29]; << 262 static G4double CL[26][28]; << 263 static const G4double UL[26]; << 264 static G4double VL[26]; << 265 << 266 static G4double sWmaxBarkas; << 267 static G4PhysicsFreeVector* sBarkasCorr; << 268 static G4PhysicsFreeVector* sThetaK; << 269 static G4PhysicsFreeVector* sThetaL; << 270 }; << 271 123 272 inline G4int << 124 G4int Index(G4double x, G4double* y, G4int n); 273 G4EmCorrections::Index(const G4double x, const << 274 { << 275 G4int iddd = n-1; << 276 // Loop checking, 03-Aug-2015, Vladimir Ivan << 277 do {--iddd;} while (iddd>0 && x<y[iddd]); << 278 return iddd; << 279 } << 280 125 281 inline G4double G4EmCorrections::Value(const G << 126 G4double Value(G4double xv, G4double x1, G4double x2, G4double y1, G4double y2); 282 const G << 283 const G << 284 { << 285 return y1 + (y2 - y1)*(xv - x1)/(x2 - x1); << 286 } << 287 127 288 inline G4double G4EmCorrections::Value2(const << 128 G4double Value2(G4double xv, G4double yv, G4double x1, G4double x2, 289 const << 129 G4double y1, G4double y2, 290 const << 130 G4double z11, G4double z21, G4double z12, G4double z22); 291 const << 292 const << 293 { << 294 return ( z11*(x2-xv)*(y2-yv) + z22*(xv-x1)*( << 295 z12*(x2-xv)*(yv-y1) + z21*(xv-x1)*(y2-yv) << 296 / ((x2-x1)*(y2-y1)); << 297 } << 298 131 299 inline void << 132 G4double NuclearStoppingPower(G4double e, G4double z1, G4double z2, 300 G4EmCorrections::SetIonisationModels(G4VEmMode << 133 G4double m1, G4double m2); 301 { << 302 if(nullptr != mod1) { ionLEModel = mod1; } << 303 if(nullptr != mod2) { ionHEModel = mod2; } << 304 } << 305 134 306 inline G4int G4EmCorrections::GetNumberOfStopp << 135 // hide assignment operator 307 { << 136 G4EmCorrections & operator=(const G4EmCorrections &right); 308 return nIons; << 137 G4EmCorrections(const G4EmCorrections&); 309 } << 138 >> 139 G4double engBarkas[47]; >> 140 G4double corBarkas[47]; >> 141 G4double e[104]; >> 142 G4double a[104]; >> 143 G4double theZieglerFactor; >> 144 G4double alpha2; >> 145 G4bool lossFlucFlag; >> 146 >> 147 G4int nK; >> 148 G4int nL; >> 149 G4int nEtaK; >> 150 G4int nEtaL; >> 151 >> 152 G4double COSEB[14]; >> 153 G4double COSXI[14]; >> 154 G4double ZD[11]; >> 155 >> 156 G4double TheK[20]; >> 157 G4double SK[20]; >> 158 G4double TK[20]; >> 159 G4double UK[20]; >> 160 G4double VK[20]; >> 161 G4double ZK[20]; >> 162 >> 163 G4double TheL[26]; >> 164 G4double SL[26]; >> 165 G4double TL[26]; >> 166 G4double UL[26]; >> 167 G4double VL[26]; >> 168 >> 169 G4double Eta[29]; >> 170 G4double CK[20][29]; >> 171 G4double CL[26][28]; >> 172 G4double HM[53]; >> 173 G4double HN[31]; >> 174 G4double MSH[93]; >> 175 G4double TAU[93]; >> 176 >> 177 G4AtomicShells shells; >> 178 G4ionEffectiveCharge effCharge; >> 179 }; 310 180 311 inline G4double << 181 inline G4int G4EmCorrections::Index(G4double x, G4double* y, G4int n) 312 G4EmCorrections::GetParticleCharge(const G4Par << 313 const G4Mat << 314 const G4dou << 315 { 182 { 316 return effCharge.EffectiveCharge(p,mat,kinet << 183 G4int idx = n-1; >> 184 do {idx--;} while (idx>0 && x<y[idx]); >> 185 return idx; 317 } 186 } 318 187 319 inline G4double << 188 inline G4double G4EmCorrections::Value(G4double xv, G4double x1, G4double x2, 320 G4EmCorrections::EffectiveChargeSquareRatio(co << 189 G4double y1, G4double y2) 321 co << 322 co << 323 { 190 { 324 return effCharge.EffectiveChargeSquareRatio( << 191 return y1 + (y2 - y1)*(xv - x1)/(x2 - x1); 325 } 192 } 326 193 327 inline void G4EmCorrections::SetVerbose(G4int << 194 inline G4double G4EmCorrections::Value2(G4double xv, G4double yv, G4double x1, G4double x2, >> 195 G4double y1, G4double y2, >> 196 G4double z11, G4double z21, G4double z12, G4double z22) 328 { 197 { 329 verbose = verb; << 198 return (z11*(x2-xv)*(y2-yv) + z22*(xv-x1)*(yv-y1) + >> 199 0.5*(z12*((x2-xv)*(yv-y1)+(xv-x1)*(y2-yv))+z21*((xv-x1)*(y2-yv)+(yv-y1)*(x2-xv)))) >> 200 / ((x2-x1)*(y2-y1)); 330 } 201 } 331 202 332 //....oooOO0OOooo........oooOO0OOooo........oo 203 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 333 204 334 #endif 205 #endif 335 206