Geant4 Cross Reference |
1 // 1 2 // ******************************************* 3 // * License and Disclaimer 4 // * 5 // * The Geant4 software is copyright of th 6 // * the Geant4 Collaboration. It is provided 7 // * conditions of the Geant4 Software License 8 // * LICENSE and available at http://cern.ch/ 9 // * include a list of copyright holders. 10 // * 11 // * Neither the authors of this software syst 12 // * institutes,nor the agencies providing fin 13 // * work make any representation or warran 14 // * regarding this software system or assum 15 // * use. Please see the license in the file 16 // * for the full disclaimer and the limitatio 17 // * 18 // * This code implementation is the result 19 // * technical work of the GEANT4 collaboratio 20 // * By using, copying, modifying or distri 21 // * any work based on the software) you ag 22 // * use in resulting scientific publicati 23 // * acceptance of all terms of the Geant4 Sof 24 // ******************************************* 25 // 26 // 27 // G4MicroElecCapture.cc, 28 // 2011/08/29 A.Valentin, M. R 29 // 2020/05/20 P. Caron, C. Ing 30 // Q. Gibaru is wit 31 // M. Raine and D. 32 // 33 // A part of this work has been funded by the 34 // [a] CEA, DAM, DIF - 91297 ARPAJON, France 35 // [b] ONERA - DPHY, 2 avenue E.Belin, 31055 T 36 // [c] CNES, 18 av.E.Belin, 31401 Toulouse CED 37 // 38 // Based on the following publications 39 // - A.Valentin, M. Raine, 40 // Inelastic cross-sections of low energy el 41 // for the simulation of heavy ion tracks wi 42 // NSS Conf. Record 2010, pp. 80-85 43 // https://doi.org/10.1109/NSSMIC.2010.58737 44 // 45 // - A.Valentin, M. Raine, M.Gaillardin, P.Pai 46 // Geant4 physics processes for microdosimet 47 // very low energy electromagnetic models fo 48 // https://doi.org/10.1016/j.nimb.2012.06.00 49 // NIM B, vol. 288, pp. 66-73, 2012, part A 50 // heavy ions in Si, NIM B, vol. 287, pp. 12 51 // https://doi.org/10.1016/j.nimb.2012.07.02 52 // 53 // - M. Raine, M. Gaillardin, P. Paillet 54 // Geant4 physics processes for silicon micr 55 // Improvements and extension of the energy- 56 // NIM B, vol. 325, pp. 97-100, 2014 57 // https://doi.org/10.1016/j.nimb.2014.01.01 58 // 59 // - J. Pierron, C. Inguimbert, M. Belhaj, T. 60 // Electron emission yield for low energy el 61 // Monte Carlo simulation and experimental c 62 // Journal of Applied Physics 121 (2017) 215 63 // https://doi.org/10.1063/1.4984761 64 // 65 // - P. Caron, 66 // Study of Electron-Induced Single-Event Up 67 // PHD, 16th October 2019 68 // 69 // - Q.Gibaru, C.Inguimbert, P.Caron, M.Raine, 70 // Geant4 physics processes for microdosimet 71 // Extension of MicroElec to very low energi 72 // NIM B, 2020, in review. 73 // 74 //-------------------------------------------- 75 // 76 // ClassName: G4MicroElecCapture derivated fro 77 // 78 // Description: The process to kill particles 79 // 80 // Author: C. Inguimbert 31 january 2022 deriv 81 // 82 //-------------------------------------------- 83 // 84 //....oooOO0OOooo........oooOO0OOooo........oo 85 86 #include "G4MicroElecCapture.hh" 87 #include "G4SystemOfUnits.hh" 88 #include "G4ParticleDefinition.hh" 89 #include "G4Step.hh" 90 #include "G4PhysicalConstants.hh" 91 #include "G4Track.hh" 92 #include "G4Region.hh" 93 #include "G4RegionStore.hh" 94 #include "G4Electron.hh" 95 #include "G4Pow.hh" 96 97 //....oooOO0OOooo........oooOO0OOooo........oo 98 99 G4MicroElecCapture::G4MicroElecCapture(const G 100 : G4VDiscreteProcess("MicroElecCapture", fEl 101 regionName(regName), region(0) 102 { 103 if(regName == "" || regName == "world") 104 { 105 regionName = "DefaultRegionForTheWorld"; 106 } 107 isInitialised = false; 108 pParticleChange = &fParticleChange; 109 } 110 111 //....oooOO0OOooo........oooOO0OOooo........oo 112 113 G4MicroElecCapture::~G4MicroElecCapture() 114 { 115 for (auto pos = tableWF.cbegin(); pos != tab 116 { 117 G4MicroElecMaterialStructure* table = pos- 118 delete table; 119 } 120 } 121 122 //....oooOO0OOooo........oooOO0OOooo........oo 123 124 void G4MicroElecCapture::SetKinEnergyLimit(G4d 125 { 126 kinEnergyThreshold = val; 127 } 128 //....oooOO0OOooo........oooOO0OOooo........oo 129 130 void G4MicroElecCapture::BuildPhysicsTable(con 131 { 132 region = (G4RegionStore::GetInstance())->Get 133 // if(region && verboseLevel > 0) { 134 G4cout << "### G4MicroElecCapture: Tracking 135 << kinEnergyThreshold/MeV << " is ass 136 << G4endl; 137 } 138 139 //....oooOO0OOooo........oooOO0OOooo........oo 140 141 G4bool G4MicroElecCapture::IsApplicable(const 142 { 143 return true; 144 } 145 146 void G4MicroElecCapture::Initialise() 147 { 148 if (isInitialised) { return; } 149 150 G4ProductionCutsTable* theCoupleTable = G4Pr 151 G4int numOfCouples = (G4int)theCoupleTable-> 152 G4cout << numOfCouples << G4endl; 153 154 for (G4int i = 0; i < numOfCouples; ++i) 155 { 156 const G4Material* material = theCoupleTabl 157 158 G4cout << "G4Capture, Material " << i + 1 159 << numOfCouples << " : " << materia 160 if (material->GetName() == "Vacuum") 161 { 162 tableWF[material->GetName()] = 0; 163 continue; 164 } 165 G4String mat = material->GetName(); 166 G4MicroElecMaterialStructure* str = new G4 167 tableWF[mat] = str; 168 } 169 isInitialised = true; 170 } 171 172 //....oooOO0OOooo........oooOO0OOooo........oo 173 174 G4VParticleChange* G4MicroElecCapture::PostSte 175 176 { 177 if (!isInitialised) { Initialise(); } 178 179 G4String mat = aTrack.GetMaterial()->GetName 180 G4int Ztarget = ((*(aTrack.GetMaterial()->Ge 181 G4int Atarget = ((*(aTrack.GetMaterial()->Ge 182 G4double Nbelements = aTrack.GetMaterial()-> 183 G4double moleculeMass = aTrack.GetMaterial() 184 auto FractionMass = aTrack.GetMaterial()->Ge 185 G4int Zinc = aTrack.GetParticleDefinition()- 186 G4int Ainc = aTrack.GetParticleDefinition()- 187 G4String IncPartName = aTrack.GetParticleDef 188 G4double NIEdep = 0.0; 189 190 for (G4int i = 0; i < Nbelements; ++i) 191 { 192 Ztarget = ((*(aTrack.GetMaterial()->GetEle 193 Atarget = ((*(aTrack.GetMaterial()->GetEle 194 NIEdep = NIEdep + moleculeMass*FractionMas 195 } 196 197 WorkFunctionTable::iterator matWF; 198 matWF = tableWF.find(mat); 199 200 if (matWF == tableWF.end()) 201 { 202 G4String str = "Material "; 203 str += mat + " not found!"; 204 G4Exception("G4MicroElecCapture::PostStepG 205 FatalException, str); 206 return nullptr; 207 } 208 else 209 { 210 G4MicroElecMaterialStructure* str = matWF- 211 pParticleChange->Initialize(aTrack); 212 pParticleChange->ProposeTrackStatus(fStopA 213 214 G4double InitE = str->GetEnergyGap() + str 215 216 if (IncPartName == "e-") 217 { 218 // metals = Non ionizing deposited energ 219 if (((str->GetEnergyGap()) / eV)<(0.001) 220 { 221 pParticleChange->ProposeNonIonizingEne 222 pParticleChange->ProposeLocalEnergyDep 223 } 224 else // MicroElec materials Non ionizing 225 { 226 G4int c = (G4int)((aTrack.GetKineticEn 227 pParticleChange->ProposeNonIonizingEne 228 pParticleChange->ProposeLocalEnergyDep 229 } 230 } 231 else 232 { 233 if ((IncPartName == "Genericion") || (In 234 || (IncPartName == "He3") || (IncPartNa 235 || (IncPartName == "triton") || (IncPar 236 { 237 pParticleChange->ProposeNonIonizingEne 238 pParticleChange->ProposeLocalEnergyDep 239 } 240 else 241 { 242 pParticleChange->ProposeNonIonizingEne 243 pParticleChange->ProposeLocalEnergyDep 244 } 245 } 246 } // matWF == tableWF.end()) 247 248 fParticleChange.SetProposedKineticEnergy(0.0 249 return pParticleChange; 250 } 251 252 //....oooOO0OOooo........oooOO0OOooo........oo 253 254 G4double G4MicroElecCapture::GetMeanFreePath(c 255 G 256 { 257 G4String material = aTrack.GetMaterial()->Ge 258 // test particle type in order to applied th 259 G4double mfp = DBL_MAX; 260 G4double ekin = aTrack.GetKineticEnergy(); 261 262 if (ekin < 500*eV && aTrack.GetParticleDefin 263 { 264 if (material != "G4_ALUMINUM_OXIDE" && mat 265 && material != "G4_BORON_NITRIDE") 266 { 267 return DBL_MAX; 268 } 269 G4double S = 0; 270 G4double y = 0; 271 if (material == "G4_ALUMINUM_OXIDE") 272 { 273 S = 1 * (1 / nm); 274 y = 0.25 * (1 / eV); 275 } 276 if (material == "G4_SILICON_DIOXIDE") 277 { 278 S = 0.3 * (1 / nm); 279 y = 0.2 * (1 / eV); 280 } 281 if (material == "G4_BORON_NITRIDE") 282 { 283 S = 0 * (1 / nm); 284 y = 1 * (1 / eV); 285 } 286 287 // VI: added numerical protection against 288 y *= ekin; 289 if (S > 0.0 && y < 100.0) { mfp = G4Exp(y) 290 } 291 return mfp; 292 } 293 294 //....oooOO0OOooo........oooOO0OOooo........oo 295 296 G4double G4MicroElecCapture::G_Lindhard_Rob(G4 297 { 298 G4double Lind =0.0; 299 300 if (Arecoil <= 0 || Zrecoil == 0) 301 { 302 Lind = 0.0; 303 } 304 else 305 { 306 G4double El = 30.724 * Zcible * Zrecoil 307 * std::pow((G4Pow::GetInstance 308 * (Arecoil + Acible) / Acible; 309 310 // multiplication by 1e6 to change El from 311 G4double e = Trecoil / (El * CLHEP::eV); 312 G4double Fl = (0.0793 * G4Pow::GetInstance 313 / (std::pow((G4Pow::GetInstanc 314 315 Lind = 1. / (1 + Fl * (3.4008 * std::pow(e 316 317 // to get the energie that go into displac 318 Lind = Lind * Trecoil; 319 } 320 return Lind; 321 } 322