Geant4 Cross Reference |
1 // 2 // ******************************************************************** 3 // * License and Disclaimer * 4 // * * 5 // * The Geant4 software is copyright of the Copyright Holders of * 6 // * the Geant4 Collaboration. It is provided under the terms and * 7 // * conditions of the Geant4 Software License, included in the file * 8 // * LICENSE and available at http://cern.ch/geant4/license . These * 9 // * include a list of copyright holders. * 10 // * * 11 // * Neither the authors of this software system, nor their employing * 12 // * institutes,nor the agencies providing financial support for this * 13 // * work make any representation or warranty, express or implied, * 14 // * regarding this software system or assume any liability for its * 15 // * use. Please see the license in the file LICENSE and URL above * 16 // * for the full disclaimer and the limitation of liability. * 17 // * * 18 // * This code implementation is the result of the scientific and * 19 // * technical work of the GEANT4 collaboration. * 20 // * By using, copying, modifying or distributing the software (or * 21 // * any work based on the software) you agree to acknowledge its * 22 // * use in resulting scientific publications, and indicate your * 23 // * acceptance of all terms of the Geant4 Software license. * 24 // ******************************************************************** 25 // 26 // 27 // G4MicroElecCapture.cc, 28 // 2011/08/29 A.Valentin, M. Raine are with CEA [a] 29 // 2020/05/20 P. Caron, C. Inguimbert are with ONERA [b] 30 // Q. Gibaru is with CEA [a], ONERA [b] and CNES [c] 31 // M. Raine and D. Lambert are with CEA [a] 32 // 33 // A part of this work has been funded by the French space agency(CNES[c]) 34 // [a] CEA, DAM, DIF - 91297 ARPAJON, France 35 // [b] ONERA - DPHY, 2 avenue E.Belin, 31055 Toulouse, France 36 // [c] CNES, 18 av.E.Belin, 31401 Toulouse CEDEX, France 37 // 38 // Based on the following publications 39 // - A.Valentin, M. Raine, 40 // Inelastic cross-sections of low energy electrons in silicon 41 // for the simulation of heavy ion tracks with the Geant4-DNA toolkit, 42 // NSS Conf. Record 2010, pp. 80-85 43 // https://doi.org/10.1109/NSSMIC.2010.5873720 44 // 45 // - A.Valentin, M. Raine, M.Gaillardin, P.Paillet 46 // Geant4 physics processes for microdosimetry simulation: 47 // very low energy electromagnetic models for electrons in Silicon, 48 // https://doi.org/10.1016/j.nimb.2012.06.007 49 // NIM B, vol. 288, pp. 66-73, 2012, part A 50 // heavy ions in Si, NIM B, vol. 287, pp. 124-129, 2012, part B 51 // https://doi.org/10.1016/j.nimb.2012.07.028 52 // 53 // - M. Raine, M. Gaillardin, P. Paillet 54 // Geant4 physics processes for silicon microdosimetry simulation: 55 // Improvements and extension of the energy-range validity up to 10 GeV/nucleon 56 // NIM B, vol. 325, pp. 97-100, 2014 57 // https://doi.org/10.1016/j.nimb.2014.01.014 58 // 59 // - J. Pierron, C. Inguimbert, M. Belhaj, T. Gineste, J. Puech, M. Raine 60 // Electron emission yield for low energy electrons: 61 // Monte Carlo simulation and experimental comparison for Al, Ag, and Si 62 // Journal of Applied Physics 121 (2017) 215107. 63 // https://doi.org/10.1063/1.4984761 64 // 65 // - P. Caron, 66 // Study of Electron-Induced Single-Event Upset in Integrated Memory Devices 67 // PHD, 16th October 2019 68 // 69 // - Q.Gibaru, C.Inguimbert, P.Caron, M.Raine, D.Lambert, J.Puech, 70 // Geant4 physics processes for microdosimetry and secondary electron emission simulation : 71 // Extension of MicroElec to very low energies and new materials 72 // NIM B, 2020, in review. 73 // 74 //---------------------------------------------------------------------------- 75 // 76 // ClassName: G4MicroElecCapture derivated from G4ElectronCapture (V Ivanchenko) 77 // 78 // Description: The process to kill particles to save CPU 79 // 80 // Author: C. Inguimbert 31 january 2022 derivated from G4ElectronCapture (V.Ivanchenko 31 August 2010) 81 // 82 //---------------------------------------------------------------------------- 83 // 84 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 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........oooOO0OOooo........oooOO0OOooo...... 98 99 G4MicroElecCapture::G4MicroElecCapture(const G4String& regName, G4double ekinlim) 100 : G4VDiscreteProcess("MicroElecCapture", fElectromagnetic), kinEnergyThreshold(ekinlim), 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........oooOO0OOooo........oooOO0OOooo...... 112 113 G4MicroElecCapture::~G4MicroElecCapture() 114 { 115 for (auto pos = tableWF.cbegin(); pos != tableWF.cend(); ++pos) 116 { 117 G4MicroElecMaterialStructure* table = pos->second; 118 delete table; 119 } 120 } 121 122 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 123 124 void G4MicroElecCapture::SetKinEnergyLimit(G4double val) 125 { 126 kinEnergyThreshold = val; 127 } 128 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 129 130 void G4MicroElecCapture::BuildPhysicsTable(const G4ParticleDefinition&) 131 { 132 region = (G4RegionStore::GetInstance())->GetRegion(regionName); 133 // if(region && verboseLevel > 0) { 134 G4cout << "### G4MicroElecCapture: Tracking cut E(MeV) = " 135 << kinEnergyThreshold/MeV << " is assigned to " << regionName 136 << G4endl; 137 } 138 139 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 140 141 G4bool G4MicroElecCapture::IsApplicable(const G4ParticleDefinition&) 142 { 143 return true; 144 } 145 146 void G4MicroElecCapture::Initialise() 147 { 148 if (isInitialised) { return; } 149 150 G4ProductionCutsTable* theCoupleTable = G4ProductionCutsTable::GetProductionCutsTable(); 151 G4int numOfCouples = (G4int)theCoupleTable->GetTableSize(); 152 G4cout << numOfCouples << G4endl; 153 154 for (G4int i = 0; i < numOfCouples; ++i) 155 { 156 const G4Material* material = theCoupleTable->GetMaterialCutsCouple(i)->GetMaterial(); 157 158 G4cout << "G4Capture, Material " << i + 1 << " / " 159 << numOfCouples << " : " << material->GetName() << G4endl; 160 if (material->GetName() == "Vacuum") 161 { 162 tableWF[material->GetName()] = 0; 163 continue; 164 } 165 G4String mat = material->GetName(); 166 G4MicroElecMaterialStructure* str = new G4MicroElecMaterialStructure(mat); 167 tableWF[mat] = str; 168 } 169 isInitialised = true; 170 } 171 172 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 173 174 G4VParticleChange* G4MicroElecCapture::PostStepDoIt(const G4Track& aTrack, 175 const G4Step&) 176 { 177 if (!isInitialised) { Initialise(); } 178 179 G4String mat = aTrack.GetMaterial()->GetName(); 180 G4int Ztarget = ((*(aTrack.GetMaterial()->GetElementVector()))[0])->GetZasInt(); 181 G4int Atarget = ((*(aTrack.GetMaterial()->GetElementVector()))[0])->GetAtomicMassAmu(); 182 G4double Nbelements = aTrack.GetMaterial()->GetNumberOfElements(); 183 G4double moleculeMass = aTrack.GetMaterial()->GetMassOfMolecule() / amu; 184 auto FractionMass = aTrack.GetMaterial()->GetFractionVector(); 185 G4int Zinc = aTrack.GetParticleDefinition()->GetAtomicNumber(); 186 G4int Ainc = aTrack.GetParticleDefinition()->GetAtomicMass(); 187 G4String IncPartName = aTrack.GetParticleDefinition()->GetParticleName(); 188 G4double NIEdep = 0.0; 189 190 for (G4int i = 0; i < Nbelements; ++i) 191 { 192 Ztarget = ((*(aTrack.GetMaterial()->GetElementVector()))[i])->GetZasInt(); 193 Atarget = ((*(aTrack.GetMaterial()->GetElementVector()))[i])->GetAtomicMassAmu(); 194 NIEdep = NIEdep + moleculeMass*FractionMass[i] / Atarget*G_Lindhard_Rob(aTrack.GetKineticEnergy(), Zinc, Ainc, Ztarget, Atarget); 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::PostStepGPIL", "em0002", 205 FatalException, str); 206 return nullptr; 207 } 208 else 209 { 210 G4MicroElecMaterialStructure* str = matWF->second; 211 pParticleChange->Initialize(aTrack); 212 pParticleChange->ProposeTrackStatus(fStopAndKill); 213 214 G4double InitE = str->GetEnergyGap() + str->GetInitialEnergy(); 215 216 if (IncPartName == "e-") 217 { 218 // metals = Non ionizing deposited energy = 0.0 219 if (((str->GetEnergyGap()) / eV)<(0.001)) 220 { 221 pParticleChange->ProposeNonIonizingEnergyDeposit(0.0); 222 pParticleChange->ProposeLocalEnergyDeposit(aTrack.GetKineticEnergy()); 223 } 224 else // MicroElec materials Non ionizing deposited energy different from zero 225 { 226 G4int c = (G4int)((aTrack.GetKineticEnergy()) / (InitE)); 227 pParticleChange->ProposeNonIonizingEnergyDeposit(aTrack.GetKineticEnergy() - InitE*c); 228 pParticleChange->ProposeLocalEnergyDeposit(aTrack.GetKineticEnergy()); 229 } 230 } 231 else 232 { 233 if ((IncPartName == "Genericion") || (IncPartName == "alpha") 234 || (IncPartName == "He3") || (IncPartName == "deuteron") 235 || (IncPartName == "triton") || (IncPartName == "proton")) 236 { 237 pParticleChange->ProposeNonIonizingEnergyDeposit(NIEdep); 238 pParticleChange->ProposeLocalEnergyDeposit(aTrack.GetKineticEnergy()); 239 } 240 else 241 { 242 pParticleChange->ProposeNonIonizingEnergyDeposit(0.0); 243 pParticleChange->ProposeLocalEnergyDeposit(aTrack.GetKineticEnergy()); 244 } 245 } 246 } // matWF == tableWF.end()) 247 248 fParticleChange.SetProposedKineticEnergy(0.0); 249 return pParticleChange; 250 } 251 252 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 253 254 G4double G4MicroElecCapture::GetMeanFreePath(const G4Track& aTrack, G4double, 255 G4ForceCondition*) 256 { 257 G4String material = aTrack.GetMaterial()->GetName(); 258 // test particle type in order to applied the capture to both electrons, protons and heavy ions 259 G4double mfp = DBL_MAX; 260 G4double ekin = aTrack.GetKineticEnergy(); 261 262 if (ekin < 500*eV && aTrack.GetParticleDefinition()->GetParticleName() == "e-") 263 { 264 if (material != "G4_ALUMINUM_OXIDE" && material != "G4_SILICON_DIOXIDE" 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 extrime value of G4Exp argument 288 y *= ekin; 289 if (S > 0.0 && y < 100.0) { mfp = G4Exp(y) / S; } 290 } 291 return mfp; 292 } 293 294 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 295 296 G4double G4MicroElecCapture::G_Lindhard_Rob(G4double Trecoil, G4int Zrecoil, G4int Arecoil, G4int Zcible, G4int Acible) 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()->Z23(Zcible) + G4Pow::GetInstance()->Z23(Zrecoil)), 0.5) 308 * (Arecoil + Acible) / Acible; 309 310 // multiplication by 1e6 to change El from eV to MeV 311 G4double e = Trecoil / (El * CLHEP::eV); 312 G4double Fl = (0.0793 * G4Pow::GetInstance()->Z23(Zrecoil) * std::pow(Zcible, 0.5) * std::pow((Arecoil + Acible), 1.5)) 313 / (std::pow((G4Pow::GetInstance()->Z23(Zcible) + G4Pow::GetInstance()->Z23(Zrecoil)), 3. / 4.) * std::pow(Arecoil, 3. / 2.) * std::pow(Acible, 1. / 2.)); 314 315 Lind = 1. / (1 + Fl * (3.4008 * std::pow(e, 1. / 6.) + 0.40244 * std::pow(e, 3. / 4.) + e)); 316 317 // to get the energie that go into displacement 318 Lind = Lind * Trecoil; 319 } 320 return Lind; 321 } 322