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 // G4MicroElecMaterialStructure.cc, 2011/08/29 28 // 2020/05/20 P. Caro 29 // Q. Gibaru is with CEA [a] 30 // M. Raine and D. Lambert 31 // 32 // A part of this work has been funded by the 33 // [a] CEA, DAM, DIF - 91297 ARPAJON, France 34 // [b] ONERA - DPHY, 2 avenue E.Belin, 31055 T 35 // [c] CNES, 18 av.E.Belin, 31401 Toulouse CED 36 // 37 // Based on the following publications 38 // - A.Valentin, M. Raine, 39 // Inelastic cross-sections of low energy e 40 // for the simulation of heavy ion trac 41 // NSS Conf. Record 2010, pp. 80-85 42 // https://doi.org/10.1109/NSSMIC. 43 // 44 // - A.Valentin, M. Raine, M.Gaillardin, 45 // Geant4 physics processes for microdo 46 // very low energy electromagnetic mode 47 // https://doi.org/10.1016/j.nimb. 48 // NIM B, vol. 288, pp. 66-73, 2012, pa 49 // heavy ions in Si, NIM B, vol. 287, p 50 // https://doi.org/10.1016/j.nimb. 51 // 52 // - M. Raine, M. Gaillardin, P. Paillet 53 // Geant4 physics processes for silicon 54 // Improvements and extension of the en 55 // NIM B, vol. 325, pp. 97-100, 2014 56 // https://doi.org/10.1016/j.nimb. 57 // 58 // - J. Pierron, C. Inguimbert, M. Belhaj 59 // Electron emission yield for low ener 60 // Monte Carlo simulation and experimen 61 // Journal of Applied Physics 121 (2017 62 // https://doi.org/10.1063/1.498 63 // 64 // - P. Caron, 65 // Study of Electron-Induced Single-Eve 66 // PHD, 16th October 2019 67 // 68 // - Q.Gibaru, C.Inguimbert, P.Caron, M.Raine 69 // Geant4 physics processes for microdo 70 // Extension of MicroElec to very low e 71 // NIM B, 2020, in review. 72 // 73 // 74 //....oooOO0OOooo........oooOO0OOooo........oo 75 76 #include "G4MicroElecMaterialStructure.hh" 77 #include "G4EnvironmentUtils.hh" 78 #include "G4SystemOfUnits.hh" 79 80 //....oooOO0OOooo........oooOO0OOooo........oo 81 82 G4MicroElecMaterialStructure::G4MicroElecMater 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........oo 97 void G4MicroElecMaterialStructure::ReadMateria 98 { 99 const char* path = G4FindDataDir("G4LEDATA") 100 101 if (materialName[0] == 'G' && materialName[1 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/Da 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 = tr 126 else { isCompound = false; Z = std::stoi 127 while(!fichier.eof()) { 128 129 getline(fichier, filler); 130 std::stringstream line(filler); 131 132 if (filler[0] == '#' || filler.empty()) {con 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) { isShellWeaklyBoundVe 167 else {isShellWeaklyBoundVector.push_back(t 168 169 if(nameParameter == "WeaklyBoundInitia 170 { 171 initialEnergy = data; 172 } 173 174 if(nameParameter == "ShellAtomicNumber 175 { 176 compoundShellZ.push_back(data); 177 } 178 179 if(nameParameter == "DielectricModelLo 180 { 181 flimitInelastic[0] = data; 182 } 183 if(nameParameter == "DielectricModelHi 184 { 185 flimitInelastic[1] = data; 186 } 187 if(nameParameter == "DielectricModelLo 188 { 189 flimitInelastic[2] = data; 190 } 191 if(nameParameter == "DielectricModelHi 192 { 193 flimitInelastic[3] = data; 194 } 195 196 if(nameParameter == "ElasticModelLowEn 197 { 198 flimitElastic[0] = data; 199 } 200 if(nameParameter == "ElasticModelHighE 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: 212 } 213 } 214 215 //....oooOO0OOooo........oooOO0OOooo........oo 216 217 G4double G4MicroElecMaterialStructure::Energy( 218 { 219 return (level >= 0 && level < nLevels) ? ene 220 } 221 222 //....oooOO0OOooo........oooOO0OOooo........oo 223 224 G4double G4MicroElecMaterialStructure::GetZ(G4 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........oo 243 244 G4double G4MicroElecMaterialStructure::Convert 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........oo 272 273 G4double G4MicroElecMaterialStructure::GetLimi 274 { 275 G4double E = LimitEnergy[level]; 276 if (IsShellWeaklyBound(level)) { E = energyG 277 return E; 278 } 279 280 //....oooOO0OOooo........oooOO0OOooo........oo 281 282 G4double G4MicroElecMaterialStructure::GetInel 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........oo 297 298 G4double G4MicroElecMaterialStructure::GetInel 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........oo 313 314 G4bool G4MicroElecMaterialStructure::IsShellWe 315 { 316 return isShellWeaklyBoundVector[level]; 317 } 318 319 //....oooOO0OOooo........oooOO0OOooo........oo 320 321