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