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 #ifndef G4NistMaterialBuilder_h 27 #ifndef G4NistMaterialBuilder_h 28 #define G4NistMaterialBuilder_h 1 28 #define G4NistMaterialBuilder_h 1 29 29 30 //-------------------------------------------- 30 //--------------------------------------------------------------------------- 31 // 31 // 32 // ClassName: G4NistMaterialBuilder 32 // ClassName: G4NistMaterialBuilder 33 // 33 // 34 // Description: Utility class to hold and mani 34 // Description: Utility class to hold and manipulate G4Materials 35 // 35 // 36 // Author: V.Ivanchenko 21.11.2004 36 // Author: V.Ivanchenko 21.11.2004 37 // 37 // 38 // Modifications: 38 // Modifications: 39 // 31.10.05 Add chemical effect and gas proper 39 // 31.10.05 Add chemical effect and gas properties (V.Ivanchenko) 40 // 27.02.06 V.Ivanchneko add ConstructNewGasMa 40 // 27.02.06 V.Ivanchneko add ConstructNewGasMaterial 41 // 11.05.06 V.Ivanchneko add warning flag to F 41 // 11.05.06 V.Ivanchneko add warning flag to FindOrBuildMaterial method 42 // 27.07.06 V.Ivanchneko set defaul warning=tr 42 // 27.07.06 V.Ivanchneko set defaul warning=true for FindOrBuildMaterial 43 // 27.07.07 V.Ivanchneko add matIndex vector t 43 // 27.07.07 V.Ivanchneko add matIndex vector to control built materials 44 // 28.07.07 V.Ivanchneko add BuildMaterial met 44 // 28.07.07 V.Ivanchneko add BuildMaterial method using Nist index 45 // 29.04.10 V.Ivanchneko add GetMeanIonisation 45 // 29.04.10 V.Ivanchneko add GetMeanIonisationEnergy method using Nist index 46 // 09.02.12 P.Gumplinger add ConstructNewIdeal 46 // 09.02.12 P.Gumplinger add ConstructNewIdealGasMaterial 47 // 47 // 48 //-------------------------------------------- 48 //---------------------------------------------------------------------------- 49 // 49 // 50 // Class Description: 50 // Class Description: 51 // 51 // 52 // Element data from the NIST DB on Atomic Wei 52 // Element data from the NIST DB on Atomic Weights and Isotope Compositions 53 // http://physics.nist.gov/PhysRefData/Composi 53 // http://physics.nist.gov/PhysRefData/Compositions/index.html 54 // 54 // 55 55 56 #include "G4Material.hh" << 56 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 57 #include "globals.hh" << 58 57 >> 58 #include <vector> 59 #include <CLHEP/Units/PhysicalConstants.h> 59 #include <CLHEP/Units/PhysicalConstants.h> 60 60 61 #include <vector> << 61 #include "globals.hh" >> 62 #include "G4Material.hh" >> 63 #include "G4Threading.hh" >> 64 >> 65 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo...... 62 66 63 class G4NistElementBuilder; 67 class G4NistElementBuilder; 64 68 65 class G4NistMaterialBuilder 69 class G4NistMaterialBuilder 66 { 70 { 67 public: << 71 public: 68 G4NistMaterialBuilder(G4NistElementBuilder*, << 69 << 70 ~G4NistMaterialBuilder() = default; << 71 72 >> 73 G4NistMaterialBuilder(G4NistElementBuilder*, G4int verb=0); >> 74 >> 75 ~G4NistMaterialBuilder(); >> 76 72 // Find or build a G4Material by name, from 77 // Find or build a G4Material by name, from dataBase 73 inline G4Material* FindMaterial(const G4Stri << 78 // 74 G4Material* FindOrBuildMaterial(const G4Stri << 79 inline G4Material* FindMaterial (const G4String& name) const; 75 << 80 G4Material* FindOrBuildMaterial (const G4String& name, >> 81 G4bool warning = true); >> 82 76 // Find or build a simple material via atomi 83 // Find or build a simple material via atomic number >> 84 // 77 inline G4Material* FindSimpleMaterial(G4int 85 inline G4Material* FindSimpleMaterial(G4int Z) const; 78 G4Material* FindOrBuildSimpleMaterial(G4int 86 G4Material* FindOrBuildSimpleMaterial(G4int Z, G4bool warning); 79 87 80 // construct a G4Material from scratch by at 88 // construct a G4Material from scratch by atome count 81 G4Material* ConstructNewMaterial(const G4Str << 89 // 82 const std::vector<G4int>& nbAtoms, G4doubl << 90 G4Material* ConstructNewMaterial (const G4String& name, 83 G4double temp = NTP_Temperature, G4double << 91 const std::vector<G4String>& elm, >> 92 const std::vector<G4int>& nbAtoms, >> 93 G4double dens, >> 94 G4State state = kStateSolid, >> 95 G4double temp = NTP_Temperature, >> 96 G4double pressure = CLHEP::STP_Pressure); 84 97 85 // construct a G4Material from scratch by fr 98 // construct a G4Material from scratch by fraction mass 86 G4Material* ConstructNewMaterial(const G4Str << 99 // 87 const std::vector<G4double>& weight, G4dou << 100 G4Material* ConstructNewMaterial (const G4String& name, 88 G4double temp = NTP_Temperature, G4double << 101 const std::vector<G4String>& elm, >> 102 const std::vector<G4double>& weight, >> 103 G4double dens, >> 104 G4State state = kStateSolid, >> 105 G4double temp = NTP_Temperature, >> 106 G4double pressure = CLHEP::STP_Pressure); >> 107 89 108 90 // construct a gas G4Material from scratch b 109 // construct a gas G4Material from scratch by atome count 91 G4Material* ConstructNewGasMaterial( << 110 // 92 const G4String& name, const G4String& name << 111 G4Material* ConstructNewGasMaterial(const G4String& name, >> 112 const G4String& nameDB, >> 113 G4double temp, G4double pres); 93 114 94 // Construct an ideal gas G4Material from sc 115 // Construct an ideal gas G4Material from scratch by atom count 95 G4Material* ConstructNewIdealGasMaterial(con << 116 // 96 const std::vector<G4int>& nbAtoms, G4doubl << 117 G4Material* ConstructNewIdealGasMaterial(const G4String& name, 97 G4double pressure = CLHEP::STP_Pressure); << 118 const std::vector<G4String>& elm, 98 << 119 const std::vector<G4int>& nbAtoms, >> 120 G4double temp = NTP_Temperature, >> 121 G4double pressure = CLHEP::STP_Pressure); >> 122 99 // verbosity level defined by G4NistManager 123 // verbosity level defined by G4NistManager >> 124 // 100 void SetVerbose(G4int val); 125 void SetVerbose(G4int val); 101 126 102 // cout predefined materials: 127 // cout predefined materials: 103 // "simple" - only pure materials in basic s 128 // "simple" - only pure materials in basic state (Z = 1, ..., 98) 104 // "compound" - NIST compounds 129 // "compound" - NIST compounds 105 // "hep" - HEP materials and compounds 130 // "hep" - HEP materials and compounds 106 // "biochemical" - bio-chemical materials << 131 // "biochemical" - bio-chemical materials 107 // "all" - all 132 // "all" - all >> 133 // 108 void ListMaterials(const G4String&) const; 134 void ListMaterials(const G4String&) const; 109 135 110 // cout lists of predefined materials 136 // cout lists of predefined materials >> 137 // 111 void ListNistSimpleMaterials() const; 138 void ListNistSimpleMaterials() const; 112 void ListNistCompoundMaterials() const; 139 void ListNistCompoundMaterials() const; 113 void ListHepMaterials() const; 140 void ListHepMaterials() const; 114 void ListSpaceMaterials() const; 141 void ListSpaceMaterials() const; 115 void ListBioChemicalMaterials() const; 142 void ListBioChemicalMaterials() const; 116 143 117 // access to the list of names of Geant4 pre 144 // access to the list of names of Geant4 predefined materials >> 145 // 118 const std::vector<G4String>& GetMaterialName 146 const std::vector<G4String>& GetMaterialNames() const; 119 147 120 // access to the NIST mean ionisation potent 148 // access to the NIST mean ionisation potentials and nominal densities >> 149 // 121 inline G4double GetMeanIonisationEnergy(G4in 150 inline G4double GetMeanIonisationEnergy(G4int index) const; 122 inline G4double GetNominalDensity(G4int inde 151 inline G4double GetNominalDensity(G4int index) const; 123 152 124 G4bool operator==(const G4NistMaterialBuilde 153 G4bool operator==(const G4NistMaterialBuilder&) const = delete; 125 G4bool operator!=(const G4NistMaterialBuilde 154 G4bool operator!=(const G4NistMaterialBuilder&) const = delete; 126 G4NistMaterialBuilder(const G4NistMaterialBu 155 G4NistMaterialBuilder(const G4NistMaterialBuilder&) = delete; 127 const G4NistMaterialBuilder& operator=(const 156 const G4NistMaterialBuilder& operator=(const G4NistMaterialBuilder&) = delete; 128 157 129 private: << 158 private: >> 159 130 void Initialise(); 160 void Initialise(); 131 void NistSimpleMaterials(); 161 void NistSimpleMaterials(); 132 void NistCompoundMaterials(); 162 void NistCompoundMaterials(); 133 void NistCompoundMaterials2(); 163 void NistCompoundMaterials2(); 134 void HepAndNuclearMaterials(); 164 void HepAndNuclearMaterials(); 135 void SpaceMaterials(); 165 void SpaceMaterials(); 136 void BioChemicalMaterials(); 166 void BioChemicalMaterials(); 137 167 138 // add parameters of material from NIST DB t 168 // add parameters of material from NIST DB to internal vectors 139 // density in g/cm3, mean ionisation potenti 169 // density in g/cm3, mean ionisation potential in eV 140 // << 170 // 141 void AddMaterial(const G4String& nameMat, G4 << 171 void AddMaterial(const G4String& nameMat, G4double dens, G4int Z=0, 142 G4int ncomp = 1, G4State = kStateSolid, G4 << 172 G4double pot=0.0, G4int ncomp=1, >> 173 G4State=kStateSolid, G4bool stp = true); 143 174 144 void AddGas(const G4String& nameMat, G4doubl 175 void AddGas(const G4String& nameMat, G4double T, G4double P); 145 176 146 void AddElementByWeightFraction(G4int Z, G4d 177 void AddElementByWeightFraction(G4int Z, G4double); 147 void AddElementByAtomCount(G4int Z, G4int); << 178 void AddElementByAtomCount (G4int Z, G4int); 148 179 149 void AddElementByWeightFraction(const G4Stri 180 void AddElementByWeightFraction(const G4String& name, G4double); 150 void AddElementByAtomCount(const G4String& n << 181 void AddElementByAtomCount (const G4String& name, G4int); 151 182 152 // build a G4Material from dataBase 183 // build a G4Material from dataBase 153 G4Material* BuildNistMaterial(const G4String 184 G4Material* BuildNistMaterial(const G4String& matname, G4bool warning); 154 G4Material* BuildMaterial(G4int idx); 185 G4Material* BuildMaterial(G4int idx); 155 186 156 void DumpElm(G4int) const; 187 void DumpElm(G4int) const; 157 void DumpMix(G4int) const; 188 void DumpMix(G4int) const; 158 189 159 private: << 190 private: 160 G4NistElementBuilder* elmBuilder; << 191 >> 192 G4NistElementBuilder* elmBuilder; >> 193 >> 194 G4int verbose; >> 195 G4int nMaterials; >> 196 G4int nComponents; >> 197 G4int nCurrent; >> 198 G4int nElementary; >> 199 G4int nNIST; >> 200 G4int nHEP; >> 201 G4int nSpace; >> 202 >> 203 std::vector<G4String> names; >> 204 std::vector<G4String> chFormulas; >> 205 >> 206 std::vector<G4double> densities; >> 207 std::vector<G4double> ionPotentials; >> 208 std::vector<G4State> states; >> 209 std::vector<G4double> fractions; >> 210 std::vector<G4bool> atomCount; >> 211 std::vector<G4int> components; >> 212 std::vector<G4int> indexes; >> 213 std::vector<G4int> elements; >> 214 std::vector<G4int> matIndex; >> 215 std::vector<G4bool> STP; >> 216 >> 217 std::vector<G4int> idxGas; >> 218 std::vector<G4double> gasTemperature; >> 219 std::vector<G4double> gasPressure; >> 220 >> 221 #ifdef G4MULTITHREADED >> 222 static G4Mutex nistMaterialMutex; >> 223 #endif 161 224 162 G4int verbose; << 163 G4int nMaterials{0}; << 164 G4int nComponents{0}; << 165 G4int nCurrent{0}; << 166 G4int nElementary; << 167 G4int nNIST; << 168 G4int nHEP; << 169 G4int nSpace; << 170 << 171 std::vector<G4String> names; << 172 std::vector<G4String> chFormulas; << 173 << 174 std::vector<G4double> densities; << 175 std::vector<G4double> ionPotentials; << 176 std::vector<G4State> states; << 177 std::vector<G4double> fractions; << 178 std::vector<G4bool> atomCount; << 179 std::vector<G4int> components; << 180 std::vector<G4int> indexes; << 181 std::vector<G4int> elements; << 182 std::vector<G4int> matIndex; << 183 std::vector<G4bool> STP; << 184 << 185 std::vector<G4int> idxGas; << 186 std::vector<G4double> gasTemperature; << 187 std::vector<G4double> gasPressure; << 188 }; 225 }; 189 226 190 inline const std::vector<G4String>& G4NistMate << 227 inline const std::vector<G4String>& >> 228 G4NistMaterialBuilder::GetMaterialNames() const 191 { 229 { 192 return names; 230 return names; 193 } 231 } 194 232 195 inline G4double G4NistMaterialBuilder::GetMean << 233 inline G4double >> 234 G4NistMaterialBuilder::GetMeanIonisationEnergy(G4int index) const 196 { 235 { 197 return (index >= 0 && index < nMaterials) ? << 236 return (index >= 0 && index < nMaterials) ? ionPotentials[index] : 10.0*index; 198 } 237 } 199 238 200 inline G4double G4NistMaterialBuilder::GetNomi << 239 inline G4double >> 240 G4NistMaterialBuilder::GetNominalDensity(G4int index) const 201 { 241 { 202 return (index >= 0 && index < nMaterials) ? 242 return (index >= 0 && index < nMaterials) ? densities[index] : 0.0; 203 } 243 } 204 244 205 inline G4Material* G4NistMaterialBuilder::Find << 245 inline G4Material* >> 246 G4NistMaterialBuilder::FindMaterial(const G4String& name) const 206 { 247 { 207 const G4MaterialTable* theMaterialTable = G4 248 const G4MaterialTable* theMaterialTable = G4Material::GetMaterialTable(); 208 G4Material* ptr = nullptr; 249 G4Material* ptr = nullptr; 209 for (auto& mat : *theMaterialTable) { << 250 for(auto & mat : *theMaterialTable) { 210 if (name == mat->GetName()) { << 251 if(name == mat->GetName()) { 211 ptr = mat; 252 ptr = mat; 212 break; 253 break; 213 } << 254 } 214 } 255 } 215 return ptr; 256 return ptr; 216 } 257 } 217 258 218 inline G4Material* G4NistMaterialBuilder::Find << 259 inline G4Material* >> 260 G4NistMaterialBuilder::FindSimpleMaterial(G4int Z) const 219 { 261 { 220 return (Z > 0 && Z < nElementary) ? FindMate << 262 return (Z>0 && Z<nElementary) ? FindMaterial(names[Z]) : nullptr; 221 } 263 } 222 264 223 #endif 265 #endif 224 266