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 // 27 // 28 // Author: Maria Grazia Pia (Maria.Grazia.Pia@ 28 // Author: Maria Grazia Pia (Maria.Grazia.Pia@cern.ch) 29 // 29 // 30 // History: 30 // History: 31 // ----------- 31 // ----------- 32 // 1 Aug 2001 MGP Created 32 // 1 Aug 2001 MGP Created 33 // 33 // 34 // 15 Jul 2009 Nicolas A. Karakatsanis 34 // 15 Jul 2009 Nicolas A. Karakatsanis 35 // 35 // 36 // - LoadNonLogData 36 // - LoadNonLogData method was created to load only the non-logarithmic data from G4EMLOW 37 // dataset. It is 37 // dataset. It is essentially performing the data loading operations as in the past. 38 // 38 // 39 // - LoadData method 39 // - LoadData method was revised in order to calculate the logarithmic values of the data 40 // It retrieves th 40 // It retrieves the data values from the G4EMLOW data files but, then, calculates the 41 // respective log 41 // respective log values and loads them to seperate data structures. 42 // 42 // 43 // - SetLogEnergiesD 43 // - SetLogEnergiesData method was cretaed to set logarithmic values to G4 data vectors. 44 // The EM data set 44 // The EM data sets, initialized this way, contain both non-log and log values. 45 // These initializ 45 // These initialized data sets can enhance the computing performance of data interpolation 46 // operations 46 // operations 47 // 47 // 48 // ------------------------------------------- 48 // ------------------------------------------------------------------- 49 49 50 #include "G4CompositeEMDataSet.hh" 50 #include "G4CompositeEMDataSet.hh" 51 #include "G4EMDataSet.hh" 51 #include "G4EMDataSet.hh" 52 #include "G4VDataSetAlgorithm.hh" 52 #include "G4VDataSetAlgorithm.hh" 53 #include <fstream> 53 #include <fstream> 54 #include <sstream> 54 #include <sstream> 55 55 56 //....oooOO0OOooo........oooOO0OOooo........oo 56 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 57 57 58 G4CompositeEMDataSet::G4CompositeEMDataSet(G4V 58 G4CompositeEMDataSet::G4CompositeEMDataSet(G4VDataSetAlgorithm* argAlgorithm, 59 G4double argUnitEnergies, 59 G4double argUnitEnergies, 60 G4double argUnitData, 60 G4double argUnitData, 61 G4int argMinZ, 61 G4int argMinZ, 62 G4int argMaxZ) 62 G4int argMaxZ) 63 : 63 : 64 algorithm(argAlgorithm), 64 algorithm(argAlgorithm), 65 unitEnergies(argUnitEnergies), 65 unitEnergies(argUnitEnergies), 66 unitData(argUnitData), 66 unitData(argUnitData), 67 minZ(argMinZ), 67 minZ(argMinZ), 68 maxZ(argMaxZ) 68 maxZ(argMaxZ) 69 { 69 { 70 if (algorithm == nullptr) 70 if (algorithm == nullptr) 71 G4Exception("G4CompositeEMDataSet::G4Composi 71 G4Exception("G4CompositeEMDataSet::G4CompositeEMDataSet", 72 "em1003",FatalException,"interpolation 72 "em1003",FatalException,"interpolation == 0"); 73 73 74 } 74 } 75 75 76 //....oooOO0OOooo........oooOO0OOooo........oo 76 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 77 77 78 G4CompositeEMDataSet::~G4CompositeEMDataSet() 78 G4CompositeEMDataSet::~G4CompositeEMDataSet() 79 { 79 { 80 CleanUpComponents(); 80 CleanUpComponents(); 81 if (algorithm) delete algorithm; 81 if (algorithm) delete algorithm; 82 } 82 } 83 //....oooOO0OOooo........oooOO0OOooo........oo 83 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 84 84 85 G4double G4CompositeEMDataSet::FindValue(G4dou 85 G4double G4CompositeEMDataSet::FindValue(G4double argEnergy, G4int argComponentId) const 86 { 86 { 87 const G4VEMDataSet* component(GetComponent(a 87 const G4VEMDataSet* component(GetComponent(argComponentId)); 88 88 89 if (component) return component->FindValue(a 89 if (component) return component->FindValue(argEnergy); 90 90 91 std::ostringstream message; 91 std::ostringstream message; 92 message << "G4CompositeEMDataSet::FindValue 92 message << "G4CompositeEMDataSet::FindValue - component " << argComponentId << " not found"; 93 93 94 G4Exception("G4CompositeEMDataSet::FindValue 94 G4Exception("G4CompositeEMDataSet::FindValue", 95 "em1004",FatalException,message.str(). 95 "em1004",FatalException,message.str().c_str()); 96 96 97 return 0.; 97 return 0.; 98 } 98 } 99 99 100 //....oooOO0OOooo........oooOO0OOooo........oo 100 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 101 101 102 void G4CompositeEMDataSet::PrintData(void) con 102 void G4CompositeEMDataSet::PrintData(void) const 103 { 103 { 104 const G4int n = (G4int)NumberOfComponents(); << 104 const size_t n(NumberOfComponents()); 105 105 106 G4cout << "The data set has " << n << " comp 106 G4cout << "The data set has " << n << " components" << G4endl; 107 G4cout << G4endl; 107 G4cout << G4endl; 108 108 109 G4int i(0); << 109 size_t i(0); 110 110 111 while (i<n) 111 while (i<n) 112 { 112 { 113 G4cout << "--- Component " << i << " --- 113 G4cout << "--- Component " << i << " ---" << G4endl; 114 GetComponent(i)->PrintData(); 114 GetComponent(i)->PrintData(); 115 ++i; << 115 i++; 116 } 116 } 117 } 117 } 118 118 119 //....oooOO0OOooo........oooOO0OOooo........oo 119 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 120 120 121 void G4CompositeEMDataSet::SetEnergiesData(G4D 121 void G4CompositeEMDataSet::SetEnergiesData(G4DataVector* argEnergies, G4DataVector* argData, G4int argComponentId) 122 { 122 { 123 G4VEMDataSet * component(components[argCompo 123 G4VEMDataSet * component(components[argComponentId]); 124 124 125 if (component) 125 if (component) 126 { 126 { 127 component->SetEnergiesData(argEnergies, 127 component->SetEnergiesData(argEnergies, argData, 0); 128 return; 128 return; 129 } 129 } 130 130 131 std::ostringstream message; 131 std::ostringstream message; 132 message << "G4CompositeEMDataSet::SetEnergie 132 message << "G4CompositeEMDataSet::SetEnergiesData - component " << argComponentId << " not found"; 133 133 134 G4Exception("G4CompositeEMDataSet::SetEnergi 134 G4Exception("G4CompositeEMDataSet::SetEnergiesData", 135 "em1004",FatalException,message.str(). 135 "em1004",FatalException,message.str().c_str()); 136 } 136 } 137 137 138 //....oooOO0OOooo........oooOO0OOooo........oo 138 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 139 139 140 void G4CompositeEMDataSet::SetLogEnergiesData( 140 void G4CompositeEMDataSet::SetLogEnergiesData(G4DataVector* argEnergies, 141 141 G4DataVector* argData, 142 142 G4DataVector* argLogEnergies, 143 143 G4DataVector* argLogData, 144 144 G4int argComponentId) 145 { 145 { 146 G4VEMDataSet * component(components[argCompo 146 G4VEMDataSet * component(components[argComponentId]); 147 147 148 if (component) 148 if (component) 149 { 149 { 150 component->SetLogEnergiesData(argEnergie 150 component->SetLogEnergiesData(argEnergies, argData, argLogEnergies, argLogData, 0); 151 return; 151 return; 152 } 152 } 153 153 154 std::ostringstream message; 154 std::ostringstream message; 155 message << "G4CompositeEMDataSet::SetEnergie 155 message << "G4CompositeEMDataSet::SetEnergiesData - component " << argComponentId << " not found"; 156 156 157 G4Exception("G4CompositeEMDataSet::SetLogEne 157 G4Exception("G4CompositeEMDataSet::SetLogEnergiesData", 158 "em1004",FatalException,message.str(). 158 "em1004",FatalException,message.str().c_str()); 159 } 159 } 160 160 161 //....oooOO0OOooo........oooOO0OOooo........oo 161 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 162 162 163 G4bool G4CompositeEMDataSet::LoadData(const G4 163 G4bool G4CompositeEMDataSet::LoadData(const G4String& argFileName) 164 { 164 { 165 CleanUpComponents(); 165 CleanUpComponents(); 166 166 167 for (G4int z(minZ); z<maxZ; ++z) << 167 for (G4int z(minZ); z<maxZ; z++) 168 { 168 { 169 G4VEMDataSet* component = new G4EMDataSe 169 G4VEMDataSet* component = new G4EMDataSet(z, algorithm->Clone(), unitEnergies, unitData); 170 if (!component->LoadData(argFileName)) 170 if (!component->LoadData(argFileName)) 171 { 171 { 172 delete component; 172 delete component; 173 return false; 173 return false; 174 } 174 } 175 AddComponent(component); 175 AddComponent(component); 176 } 176 } 177 return true; 177 return true; 178 } 178 } 179 179 180 //....oooOO0OOooo........oooOO0OOooo........oo 180 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 181 181 182 G4bool G4CompositeEMDataSet::LoadNonLogData(co 182 G4bool G4CompositeEMDataSet::LoadNonLogData(const G4String& argFileName) 183 { 183 { 184 CleanUpComponents(); 184 CleanUpComponents(); 185 185 186 for (G4int z(minZ); z<maxZ; ++z) << 186 for (G4int z(minZ); z<maxZ; z++) 187 { 187 { 188 G4VEMDataSet* component = new G4EMDataSe 188 G4VEMDataSet* component = new G4EMDataSet(z, algorithm->Clone(), unitEnergies, unitData); 189 if (!component->LoadNonLogData(argFileNa 189 if (!component->LoadNonLogData(argFileName)) 190 { 190 { 191 delete component; 191 delete component; 192 return false; 192 return false; 193 } 193 } 194 AddComponent(component); 194 AddComponent(component); 195 } 195 } 196 return true; 196 return true; 197 } 197 } 198 198 199 //....oooOO0OOooo........oooOO0OOooo........oo 199 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 200 200 201 G4bool G4CompositeEMDataSet::SaveData(const G4 201 G4bool G4CompositeEMDataSet::SaveData(const G4String& argFileName) const 202 { 202 { 203 for (G4int z=minZ; z<maxZ; ++z) << 203 for (G4int z=minZ; z<maxZ; z++) 204 { 204 { 205 const G4VEMDataSet* component(GetCompone 205 const G4VEMDataSet* component(GetComponent(z-minZ)); 206 206 207 if (!component) 207 if (!component) 208 { 208 { 209 std::ostringstream message; 209 std::ostringstream message; 210 message << "G4CompositeEMDataSet::SaveData 210 message << "G4CompositeEMDataSet::SaveData - component " << (z-minZ) << " not found"; 211 G4Exception("G4CompositeEMDataSet::S 211 G4Exception("G4CompositeEMDataSet::SaveData", 212 "em1004",FatalException,message.str(). 212 "em1004",FatalException,message.str().c_str()); 213 return false; 213 return false; 214 } 214 } 215 215 216 if (!component->SaveData(argFileName)) 216 if (!component->SaveData(argFileName)) 217 return false; 217 return false; 218 } 218 } 219 219 220 return true; 220 return true; 221 } 221 } 222 222 223 //....oooOO0OOooo........oooOO0OOooo........oo 223 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 224 224 225 void G4CompositeEMDataSet::CleanUpComponents(v 225 void G4CompositeEMDataSet::CleanUpComponents(void) 226 { 226 { 227 while (!components.empty()) 227 while (!components.empty()) 228 { 228 { 229 if (components.back()) 229 if (components.back()) 230 delete components.back(); 230 delete components.back(); 231 components.pop_back(); 231 components.pop_back(); 232 } 232 } 233 } 233 } 234 234 235 //....oooOO0OOooo........oooOO0OOooo........oo 235 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo.... 236 236 237 G4double G4CompositeEMDataSet::RandomSelect(G4 237 G4double G4CompositeEMDataSet::RandomSelect(G4int componentId) const 238 { 238 { 239 G4double value = 0.; 239 G4double value = 0.; 240 if (componentId >= 0 && componentId < (G4int 240 if (componentId >= 0 && componentId < (G4int)components.size()) 241 { 241 { 242 const G4VEMDataSet* dataSet = GetCompone 242 const G4VEMDataSet* dataSet = GetComponent(componentId); 243 value = dataSet->RandomSelect(); 243 value = dataSet->RandomSelect(); 244 } 244 } 245 return value; 245 return value; 246 } 246 } 247 247