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