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 // 28 // Author: Maria Grazia Pia (Maria.Grazia.Pia@ 29 // 30 // History: 31 // ----------- 32 // 1 Aug 2001 MGP Created 33 // 34 // 09.10.01 V.Ivanchenko Add case z=0 35 // 36 // 9 Mar 2008 MGP Cleaned up unread 37 // (Further clean-up 38 // 39 // 15 Jul 2009 Nicolas A. Karakatsanis 40 // 41 // - LoadNonLogData 42 // dataset. It is 43 // 44 // - LoadData method 45 // It retrieves th 46 // respective log 47 // 48 // - SetLogEnergiesD 49 // The EM data set 50 // These initializ 51 // operations 52 // 53 // 54 // ------------------------------------------- 55 56 #include "G4ShellEMDataSet.hh" 57 #include "G4EMDataSet.hh" 58 #include "G4VDataSetAlgorithm.hh" 59 #include <fstream> 60 #include <sstream> 61 62 //....oooOO0OOooo........oooOO0OOooo........oo 63 G4ShellEMDataSet::G4ShellEMDataSet(G4int zeta, 64 G4double eUnit, 65 G4double dataUnit) 66 : 67 algorithm(algo), 68 unitEnergies(eUnit), 69 unitData(dataUnit), 70 z(zeta) 71 { 72 if (algorithm == nullptr) 73 G4Exception("G4ShellEMDataSet::G4ShellEMDa 74 FatalErrorInArgument, "Interpolation == 0" 75 } 76 77 //....oooOO0OOooo........oooOO0OOooo........oo 78 G4ShellEMDataSet::~G4ShellEMDataSet() 79 { 80 CleanUpComponents(); 81 if (algorithm) delete algorithm; 82 } 83 84 //....oooOO0OOooo........oooOO0OOooo........oo 85 G4double G4ShellEMDataSet::FindValue(G4double 86 { 87 // Returns the sum over the shells correspon 88 G4double value = 0.; 89 90 std::vector<G4VEMDataSet *>::const_iterator 91 std::vector<G4VEMDataSet *>::const_iterator 92 93 while (i != end) 94 { 95 value += (*i)->FindValue(energy); 96 i++; 97 } 98 99 return value; 100 } 101 102 //....oooOO0OOooo........oooOO0OOooo........oo 103 104 void G4ShellEMDataSet::PrintData() const 105 { 106 const G4int n = (G4int)NumberOfComponents(); 107 108 G4cout << "The data set has " << n << " comp 109 G4cout << G4endl; 110 111 G4int i = 0; 112 113 while (i < n) 114 { 115 G4cout << "--- Component " << i << " --- 116 GetComponent(i)->PrintData(); 117 ++i; 118 } 119 } 120 121 //....oooOO0OOooo........oooOO0OOooo........oo 122 123 void G4ShellEMDataSet::SetEnergiesData(G4DataV 124 G4DataVector* data, 125 G4int componentId) 126 { 127 G4VEMDataSet* component = components[compone 128 if (component) 129 { 130 component->SetEnergiesData(energies, dat 131 return; 132 } 133 134 G4String msg = "component "; 135 msg += static_cast<char>(componentId); 136 msg += " not found"; 137 138 G4Exception("G4ShellEMDataSet::SetEnergiesDa 139 } 140 141 //....oooOO0OOooo........oooOO0OOooo........oo 142 143 void G4ShellEMDataSet::SetLogEnergiesData(G4Da 144 G4Da 145 G4Da 146 G4Da 147 G4in 148 { 149 G4VEMDataSet* component = components[compone 150 if (component) 151 { 152 component->SetLogEnergiesData(energies, 153 return; 154 } 155 156 G4String msg = "component "; 157 msg += static_cast<char>(componentId); 158 msg += " not found"; 159 G4Exception("G4ShellEMDataSet::SetLogEnergie 160 FatalErrorInArgument ,msg); 161 } 162 163 //....oooOO0OOooo........oooOO0OOooo........oo 164 165 G4bool G4ShellEMDataSet::LoadData(const G4Stri 166 { 167 CleanUpComponents(); 168 169 G4String fullFileName = FullFileName(file); 170 std::ifstream in(fullFileName); 171 172 if (!in.is_open()) 173 { 174 G4String message("Data file \""); 175 message += fullFileName; 176 message += "\" not found"; 177 G4Exception("G4ShellEMDataSet::LoadData( 178 return 0; 179 } 180 181 G4DataVector* orig_shell_energies = 0; 182 G4DataVector* orig_shell_data = 0; 183 G4DataVector* log_shell_energies = 0; 184 G4DataVector* log_shell_data = 0; 185 186 G4double a = 0.; 187 G4int shellIndex = 0; 188 G4int k = 0; 189 G4int nColumns = 2; 190 191 do 192 { 193 in >> a; 194 195 if (a==0.) a=1e-300; 196 197 // The file is organized into four colum 198 // 1st column contains the values of ene 199 // 2nd column contains the corresponding 200 // The file terminates with the pattern: 201 // 202 // 203 if (a == -1) 204 { 205 if ((k%nColumns == 0) && (orig_shell_energ 206 { 207 AddComponent(new G4EMDataSet(shellIndex 208 orig_shell_data, log_shell_energie 209 log_shell_data, algorithm->Clone() 210 unitEnergies, unitData)); 211 orig_shell_energies = 0; 212 orig_shell_data = 0; 213 log_shell_energies = 0; 214 log_shell_data = 0; 215 } 216 } 217 else if (a != -2) 218 { 219 if (orig_shell_energies == 0) 220 { 221 orig_shell_energies = new G4DataVector; 222 orig_shell_data = new G4DataVector; 223 log_shell_energies = new G4DataVe 224 log_shell_data = new G4DataVector 225 } 226 if (k%nColumns == 0) 227 { 228 orig_shell_energies->push_back(a*unitEn 229 log_shell_energies->push_back(std::log1 230 } 231 else if (k%nColumns == 1) 232 { 233 orig_shell_data->push_back(a*unitData); 234 log_shell_data->push_back(std::lo 235 } 236 k++; 237 } 238 else k = 1; 239 } 240 while (a != -2); // End of file 241 242 delete orig_shell_energies; 243 delete orig_shell_data; 244 delete log_shell_energies; 245 delete log_shell_data; 246 247 return true; 248 } 249 250 //....oooOO0OOooo........oooOO0OOooo........oo 251 252 G4bool G4ShellEMDataSet::LoadNonLogData(const 253 { 254 CleanUpComponents(); 255 256 G4String fullFileName = FullFileName(file); 257 std::ifstream in(fullFileName); 258 259 if (!in.is_open()) 260 { 261 G4String message("G4ShellEMDataSet::Load 262 message += fullFileName; 263 message += "\" not found"; 264 G4Exception("G4ShellEMDataSet::LoadNonLo 265 return 0; 266 } 267 268 G4DataVector* orig_shell_energies = 0; 269 G4DataVector* orig_shell_data = 0; 270 271 G4double a = 0.; 272 G4int shellIndex = 0; 273 G4int k = 0; 274 G4int nColumns = 2; 275 276 do 277 { 278 in >> a; 279 // The file is organized into four colum 280 // 1st column contains the values of ene 281 // 2nd column contains the corresponding 282 // The file terminates with the pattern: 283 // 284 // 285 if (a == -1) 286 { 287 if ((k%nColumns == 0) && (orig_shell_energ 288 { 289 AddComponent(new G4EMDataSet(shellIndex 290 orig_shell_data, algorithm->Clone( 291 unitEnergies, unitData)); 292 orig_shell_energies = 0; 293 orig_shell_data = 0; 294 } 295 } 296 else if (a != -2) 297 { 298 if (orig_shell_energies == 0) 299 { 300 orig_shell_energies = new G4DataVector; 301 orig_shell_data = new G4DataVector; 302 } 303 if (k%nColumns == 0) 304 { 305 orig_shell_energies->push_back(a*unitEn 306 } 307 else if (k%nColumns == 1) 308 { 309 orig_shell_data->push_back(a*unitData); 310 } 311 k++; 312 } 313 else k = 1; 314 } 315 while (a != -2); // End of file 316 317 318 delete orig_shell_energies; 319 delete orig_shell_data; 320 321 return true; 322 } 323 324 //....oooOO0OOooo........oooOO0OOooo........oo 325 326 G4bool G4ShellEMDataSet::SaveData(const G4Stri 327 { 328 G4String fullFileName = FullFileName(file); 329 std::ofstream out(fullFileName); 330 331 if (!out.is_open()) 332 { 333 G4String message("Cannot open \""); 334 message += fullFileName; 335 message += "\""; 336 G4Exception("G4EMDataSet::SaveData()","e 337 } 338 339 const G4int n = (G4int)NumberOfComponents(); 340 G4int k = 0; 341 342 while (k < n) 343 { 344 const G4VEMDataSet* component = GetCompo 345 346 if (component) 347 { 348 const G4DataVector& energies = component-> 349 const G4DataVector& data = component->GetD 350 351 G4DataVector::const_iterator i = energies. 352 G4DataVector::const_iterator endI = energi 353 G4DataVector::const_iterator j = data.cbeg 354 355 while (i != endI) 356 { 357 out.precision(10); 358 out.width(15); 359 out.setf(std::ofstream::left); 360 out << ((*i)/unitEnergies) << ' '; 361 362 out.precision(10); 363 out.width(15); 364 out.setf(std::ofstream::left); 365 out << ((*j)/unitData) << std::endl; 366 i++; 367 j++; 368 } 369 } 370 371 out.precision(10); 372 out.width(15); 373 out.setf(std::ofstream::left); 374 out << -1.f << ' '; 375 376 out.precision(10); 377 out.width(15); 378 out.setf(std::ofstream::left); 379 out << -1.f << std::endl; 380 381 k++; 382 } 383 384 out.precision(10); 385 out.width(15); 386 out.setf(std::ofstream::left); 387 out << -2.f << ' '; 388 389 out.precision(10); 390 out.width(15); 391 out.setf(std::ofstream::left); 392 out << -2.f << std::endl; 393 394 return true; 395 } 396 397 //....oooOO0OOooo........oooOO0OOooo........oo 398 399 void G4ShellEMDataSet::CleanUpComponents() 400 { 401 while (!components.empty()) 402 { 403 if (components.back()) delete components 404 components.pop_back(); 405 } 406 } 407 408 //....oooOO0OOooo........oooOO0OOooo........oo 409 410 G4String G4ShellEMDataSet::FullFileName(const 411 { 412 const char* path = G4FindDataDir("G4LEDATA") 413 414 if (!path) 415 { 416 G4Exception("G4ShellEMDataSet::FullFileNam 417 return ""; 418 } 419 420 std::ostringstream fullFileName; 421 422 fullFileName << path << '/' << fileName << z 423 424 return G4String(fullFileName.str().c_str()); 425 } 426