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 // G4MicroElecMaterialStructure.cc, 2011/08/29 A.Valentin, M. Raine are with CEA [a] 28 // 2020/05/20 P. Caron, C. Inguimbert are with ONERA [b] 29 // Q. Gibaru is with CEA [a], ONERA [b] and CNES [c] 30 // M. Raine and D. Lambert are with CEA [a] 31 // 32 // A part of this work has been funded by the French space agency(CNES[c]) 33 // [a] CEA, DAM, DIF - 91297 ARPAJON, France 34 // [b] ONERA - DPHY, 2 avenue E.Belin, 31055 Toulouse, France 35 // [c] CNES, 18 av.E.Belin, 31401 Toulouse CEDEX, France 36 // 37 // Based on the following publications 38 // - A.Valentin, M. Raine, 39 // Inelastic cross-sections of low energy electrons in silicon 40 // for the simulation of heavy ion tracks with the Geant4-DNA toolkit, 41 // NSS Conf. Record 2010, pp. 80-85 42 // https://doi.org/10.1109/NSSMIC.2010.5873720 43 // 44 // - A.Valentin, M. Raine, M.Gaillardin, P.Paillet 45 // Geant4 physics processes for microdosimetry simulation: 46 // very low energy electromagnetic models for electrons in Silicon, 47 // https://doi.org/10.1016/j.nimb.2012.06.007 48 // NIM B, vol. 288, pp. 66-73, 2012, part A 49 // heavy ions in Si, NIM B, vol. 287, pp. 124-129, 2012, part B 50 // https://doi.org/10.1016/j.nimb.2012.07.028 51 // 52 // - M. Raine, M. Gaillardin, P. Paillet 53 // Geant4 physics processes for silicon microdosimetry simulation: 54 // Improvements and extension of the energy-range validity up to 10 GeV/nucleon 55 // NIM B, vol. 325, pp. 97-100, 2014 56 // https://doi.org/10.1016/j.nimb.2014.01.014 57 // 58 // - J. Pierron, C. Inguimbert, M. Belhaj, T. Gineste, J. Puech, M. Raine 59 // Electron emission yield for low energy electrons: 60 // Monte Carlo simulation and experimental comparison for Al, Ag, and Si 61 // Journal of Applied Physics 121 (2017) 215107. 62 // https://doi.org/10.1063/1.4984761 63 // 64 // - P. Caron, 65 // Study of Electron-Induced Single-Event Upset in Integrated Memory Devices 66 // PHD, 16th October 2019 67 // 68 // - Q.Gibaru, C.Inguimbert, P.Caron, M.Raine, D.Lambert, J.Puech, 69 // Geant4 physics processes for microdosimetry and secondary electron emission simulation : 70 // Extension of MicroElec to very low energies and new materials 71 // NIM B, 2020, in review. 72 // 73 // 74 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 75 76 #include "G4MicroElecMaterialStructure.hh" 77 #include "G4EnvironmentUtils.hh" 78 #include "G4SystemOfUnits.hh" 79 80 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 81 82 G4MicroElecMaterialStructure::G4MicroElecMaterialStructure(const G4String& matName) 83 { 84 materialName = matName; 85 if (matName == "Vacuum" || matName == "uum") { 86 workFunction = 0; 87 initialEnergy = 0; 88 } 89 else { 90 ReadMaterialFile(); 91 } 92 nLevels = (G4int)energyConstant.size(); 93 } 94 95 96 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 97 void G4MicroElecMaterialStructure::ReadMaterialFile() 98 { 99 const char* path = G4FindDataDir("G4LEDATA"); 100 101 if (materialName[0] == 'G' && materialName[1] == '4') { 102 //in the case the NIST database is used 103 materialName.erase(0, 1); 104 materialName.erase(0, 1); 105 materialName.erase(0, 1); 106 } 107 108 std::ostringstream fileName; 109 fileName << path << "/microelec/Structure/Data_" + materialName + ".dat"; 110 std::ifstream fichier(fileName.str().c_str()); 111 112 int varLength = 0; 113 G4String nameParameter; 114 115 G4String unitName; 116 G4double unitValue; 117 G4double data; 118 G4String filler; 119 G4String type; 120 121 if (fichier) 122 { 123 fichier >> filler >> type; 124 materialName = filler; 125 if (type == "Compound") {isCompound = true; Z = 0; } 126 else { isCompound = false; Z = std::stoi(type); } 127 while(!fichier.eof()) { 128 129 getline(fichier, filler); 130 std::stringstream line(filler); 131 132 if (filler[0] == '#' || filler.empty()) {continue;} 133 134 line >> varLength; 135 line >> nameParameter; 136 line >> unitName; 137 unitValue = ConvertUnit(unitName); 138 139 for (int i = 0; i < varLength; i++) 140 { 141 line >> data; data = data*unitValue; 142 143 if(nameParameter == "WorkFunction") 144 { 145 workFunction = data; 146 } 147 if(nameParameter == "EnergyGap") 148 { 149 energyGap = data; 150 } 151 152 if(nameParameter == "EnergyPeak") 153 { 154 energyConstant.push_back(data); 155 } 156 if(nameParameter == "EnergyLimit") 157 { 158 LimitEnergy.push_back(data); 159 } 160 if(nameParameter == "EADL") 161 { 162 EADL_Enumerator.push_back(data); 163 } 164 165 if (nameParameter == "WeaklyBoundShell") 166 {if (data == 0) { isShellWeaklyBoundVector.push_back(false); } 167 else {isShellWeaklyBoundVector.push_back(true);}} 168 169 if(nameParameter == "WeaklyBoundInitialEnergy") 170 { 171 initialEnergy = data; 172 } 173 174 if(nameParameter == "ShellAtomicNumber") 175 { 176 compoundShellZ.push_back(data); 177 } 178 179 if(nameParameter == "DielectricModelLowEnergyLimit_e") 180 { 181 flimitInelastic[0] = data; 182 } 183 if(nameParameter == "DielectricModelHighEnergyLimit_e") 184 { 185 flimitInelastic[1] = data; 186 } 187 if(nameParameter == "DielectricModelLowEnergyLimit_p") 188 { 189 flimitInelastic[2] = data; 190 } 191 if(nameParameter == "DielectricModelHighEnergyLimit_p") 192 { 193 flimitInelastic[3] = data; 194 } 195 196 if(nameParameter == "ElasticModelLowEnergyLimit") 197 { 198 flimitElastic[0] = data; 199 } 200 if(nameParameter == "ElasticModelHighEnergyLimit") 201 { 202 flimitElastic[1] = data; 203 } 204 } 205 } 206 fichier.close(); // on ferme le fichier 207 } 208 else { 209 G4String str = "file "; 210 str += fileName.str() + " not found!"; 211 G4Exception("G4MicroElecMaterialStructure::ReadMaterialFile", "em0002", FatalException, str); 212 } 213 } 214 215 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 216 217 G4double G4MicroElecMaterialStructure::Energy(G4int level) 218 { 219 return (level >= 0 && level < nLevels) ? energyConstant[level] : 0.0; 220 } 221 222 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 223 224 G4double G4MicroElecMaterialStructure::GetZ(G4int Shell) 225 { 226 if (Shell >= 0 && Shell < nLevels) { 227 if(!isCompound) 228 { 229 return Z; 230 } 231 else 232 { 233 return compoundShellZ[Shell]; 234 } 235 } 236 else 237 { 238 return 0; 239 } 240 } 241 242 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 243 244 G4double G4MicroElecMaterialStructure::ConvertUnit(const G4String& unitName) 245 { 246 G4double unitValue = 0; 247 if(unitName == "meV") 248 { 249 unitValue = 1e-3 * CLHEP::eV; 250 } 251 else if(unitName == "eV") 252 { 253 unitValue = CLHEP::eV; 254 } 255 else if(unitName == "keV") 256 { 257 unitValue = CLHEP::keV; 258 } 259 else if(unitName == "MeV") 260 { 261 unitValue = CLHEP::MeV; 262 } 263 else if(unitName == "noUnit") 264 { 265 unitValue = 1; 266 } 267 268 return unitValue; 269 } 270 271 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 272 273 G4double G4MicroElecMaterialStructure::GetLimitEnergy(G4int level) 274 { 275 G4double E = LimitEnergy[level]; 276 if (IsShellWeaklyBound(level)) { E = energyGap+ initialEnergy; } 277 return E; 278 } 279 280 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 281 282 G4double G4MicroElecMaterialStructure::GetInelasticModelLowLimit(G4int pdg) 283 { 284 G4double res = 0.0; 285 if(pdg == 11) 286 { 287 res = flimitInelastic[0]; 288 } 289 else if(pdg == 2212) 290 { 291 res = flimitInelastic[2]; 292 } 293 return res; 294 } 295 296 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 297 298 G4double G4MicroElecMaterialStructure::GetInelasticModelHighLimit(G4int pdg) 299 { 300 G4double res = 0.0; 301 if(pdg == 11) 302 { 303 res = flimitInelastic[1]; 304 } 305 else if(pdg == 2212) 306 { 307 res = flimitInelastic[3]; 308 } 309 return res; 310 } 311 312 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 313 314 G4bool G4MicroElecMaterialStructure::IsShellWeaklyBound(G4int level) 315 { 316 return isShellWeaklyBoundVector[level]; 317 } 318 319 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 320 321