Geant4 11.1.1
Toolkit for the simulation of the passage of particles through matter
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
G4Material.hh
Go to the documentation of this file.
1//
2// ********************************************************************
3// * License and Disclaimer *
4// * *
5// * The Geant4 software is copyright of the Copyright Holders of *
6// * the Geant4 Collaboration. It is provided under the terms and *
7// * conditions of the Geant4 Software License, included in the file *
8// * LICENSE and available at http://cern.ch/geant4/license . These *
9// * include a list of copyright holders. *
10// * *
11// * Neither the authors of this software system, nor their employing *
12// * institutes,nor the agencies providing financial support for this *
13// * work make any representation or warranty, express or implied, *
14// * regarding this software system or assume any liability for its *
15// * use. Please see the license in the file LICENSE and URL above *
16// * for the full disclaimer and the limitation of liability. *
17// * *
18// * This code implementation is the result of the scientific and *
19// * technical work of the GEANT4 collaboration. *
20// * By using, copying, modifying or distributing the software (or *
21// * any work based on the software) you agree to acknowledge its *
22// * use in resulting scientific publications, and indicate your *
23// * acceptance of all terms of the Geant4 Software license. *
24// ********************************************************************
25//
26//---------------------------------------------------------------------------
27//
28// ClassName: G4Material
29//
30// Description: Contains material properties
31//
32// Class description:
33//
34// Is used to define the material composition of Geant4 volumes.
35// A G4Material is always made of G4Elements. It should has the name,
36// the list of G4Elements, material density, material state, temperature,
37// pressure. Other parameters are optional and may be set by the user code
38// or computed at initialisation.
39//
40// There is several ways to construct G4Material:
41// - from single element;
42// - from a list of components (elements or other materials);
43// - from internal Geant4 database of materials
44//
45// A collection of constituent Elements/Materials should be defined
46// with specified weights by fractional mass or atom counts (only for Elements).
47//
48// Quantities, with physical meaning or not, which are constant in a given
49// material are computed and stored here as Derived data members.
50//
51// The class contains as a private static member the Table of defined
52// materials (an ordered vector of materials).
53//
54// It is strongly not recommended to delete materials in user code.
55// All materials will be deleted automatically at the end of Geant4 session.
56//
57
58//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
59
60// 10-07-96, new data members added by L.Urban
61// 12-12-96, new data members added by L.Urban
62// 20-01-97, aesthetic rearrangement. RadLength calculation modified
63// Data members Zeff and Aeff REMOVED (i.e. passed to the Elements).
64// (local definition of Zeff in DensityEffect and FluctModel...)
65// Vacuum defined as a G4State. Mixture flag removed, M.Maire
66// 29-01-97, State=Vacuum automatically set density=0 in the contructors.
67// Subsequent protections have been put in the calculation of
68// MeanExcEnergy, ShellCorrectionVector, DensityEffect, M.Maire
69// 20-03-97, corrected initialization of pointers, M.Maire
70// 10-06-97, new data member added by V.Grichine (fSandiaPhotoAbsCof)
71// 27-06-97, new function GetElement(int), M.Maire
72// 24-02-98, fFractionVector become fMassFractionVector
73// 28-05-98, kState=kVacuum removed:
74// The vacuum is an ordinary gas vith very low density, M.Maire
75// 12-06-98, new method AddMaterial() allowing mixture of materials, M.Maire
76// 09-07-98, Ionisation parameters removed from the class, M.Maire
77// 04-08-98, new method GetMaterial(materialName), M.Maire
78// 05-10-98, change name: NumDensity -> NbOfAtomsPerVolume
79// 18-11-98, SandiaTable interface modified.
80// 19-07-99, new data member (chemicalFormula) added by V.Ivanchenko
81// 12-03-01, G4bool fImplicitElement (mma)
82// 30-03-01, suppression of the warning message in GetMaterial
83// 17-07-01, migration to STL. M. Verderi.
84// 14-09-01, Suppression of the data member fIndexInTable
85// 31-10-01, new function SetChemicalFormula() (mma)
86// 26-02-02, fIndexInTable renewed
87// 06-08-02, remove constructors with ChemicalFormula (mma)
88// 15-11-05, GetMaterial(materialName, G4bool warning=true)
89// 13-04-12, std::map<G4Material*,G4double> fMatComponents (mma)
90// 21-04-12, fMassOfMolecule (mma)
91
92//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
93
94#ifndef G4MATERIAL_HH
95#define G4MATERIAL_HH 1
96
97#include <vector>
98#include <map>
100
101#include "globals.hh"
102#include "G4ios.hh"
103#include "G4Element.hh"
105#include "G4IonisParamMat.hh"
106#include "G4SandiaTable.hh"
107#include "G4ElementVector.hh"
108#include "G4MaterialTable.hh"
109
111
112static const G4double NTP_Temperature = 293.15*CLHEP::kelvin;
113
114//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
115
117{
118public: // with description
119 //
120 // Constructor to create a material from single element
121 //
122 G4Material(const G4String& name, //its name
123 G4double z, //atomic number
124 G4double a, //mass of mole
125 G4double density, //density
126 G4State state = kStateUndefined, //solid,gas
127 G4double temp = NTP_Temperature, //temperature
128 G4double pressure = CLHEP::STP_Pressure); //pressure
129
130 //
131 // Constructor to create a material from a combination of elements
132 // and/or materials subsequently added via AddElement and/or AddMaterial
133 //
134 G4Material(const G4String& name, //its name
135 G4double density, //density
136 G4int nComponents, //nbOfComponents
137 G4State state = kStateUndefined, //solid,gas
138 G4double temp = NTP_Temperature, //temperature
139 G4double pressure = CLHEP::STP_Pressure); //pressure
140
141 //
142 // Constructor to create a material from the base material
143 //
144 G4Material(const G4String& name, //its name
145 G4double density, //density
146 const G4Material* baseMaterial, //base material
147 G4State state = kStateUndefined, //solid,gas
148 G4double temp = NTP_Temperature, //temperature
149 G4double pressure = CLHEP::STP_Pressure); //pressure
150
151 //
152 // Add an element, giving number of atoms
153 //
154 void AddElementByNumberOfAtoms(const G4Element* elm, G4int nAtoms);
155 inline
156 void AddElement(G4Element* elm, G4int nAtoms)
157 { AddElementByNumberOfAtoms(elm, nAtoms); }
158
159 //
160 // Add an element or material, giving fraction of mass
161 //
162 void AddElementByMassFraction(const G4Element* elm, G4double fraction);
163 inline void AddElement (G4Element* elm, G4double frac)
164 { AddElementByMassFraction(elm, frac); }
165
166 void AddMaterial(G4Material* material, G4double fraction);
167
168 virtual ~G4Material();
169 //
170 // retrieval methods
171 //
172 inline const G4String& GetName() const {return fName;}
173 inline const G4String& GetChemicalFormula() const {return fChemicalFormula;}
174 inline G4double GetFreeElectronDensity() const {return fFreeElecDensity;}
175 inline G4double GetDensity() const {return fDensity;}
176 inline G4State GetState() const {return fState;}
177 inline G4double GetTemperature() const {return fTemp;}
178 inline G4double GetPressure() const {return fPressure;}
179
180 //number of elements constituing this material:
181 inline size_t GetNumberOfElements() const {return fNumberOfElements;}
182
183 //vector of pointers to elements constituing this material:
184 inline const
185 G4ElementVector* GetElementVector() const {return theElementVector;}
186
187 //vector of fractional mass of each element:
188 inline const
189 G4double* GetFractionVector() const {return fMassFractionVector;}
190
191 //vector of atom count of each element:
192 inline const
193 G4int* GetAtomsVector() const {return fAtomsVector;}
194
195 //return a pointer to an element, given its index in the material:
196 inline const
197 G4Element* GetElement(G4int iel) const {return (*theElementVector)[iel];}
198
199 //vector of nb of atoms per volume of each element in this material:
200 inline const
201 G4double* GetVecNbOfAtomsPerVolume() const {return fVecNbOfAtomsPerVolume;}
202 //total number of atoms per volume:
203 inline
204 G4double GetTotNbOfAtomsPerVolume() const {return fTotNbOfAtomsPerVolume;}
205 //total number of electrons per volume:
206 inline
207 G4double GetTotNbOfElectPerVolume() const {return fTotNbOfElectPerVolume;}
208
209 //obsolete names (5-10-98) see the 2 functions above
210 inline const
211 G4double* GetAtomicNumDensityVector() const {return fVecNbOfAtomsPerVolume;}
212 inline G4double GetElectronDensity() const {return fTotNbOfElectPerVolume;}
213
214 // Radiation length:
215 inline G4double GetRadlen() const {return fRadlen;}
216
217 // Nuclear interaction length
218 inline G4double GetNuclearInterLength() const {return fNuclInterLen;}
219
220 // ionisation parameters:
221 inline G4IonisParamMat* GetIonisation() const {return fIonisation;}
222
223 // Sandia table:
224 inline G4SandiaTable* GetSandiaTable() const {return fSandiaTable; }
225
226 // Base material:
227 inline
228 const G4Material* GetBaseMaterial() const {return fBaseMaterial;}
229
230 // material components:
231 inline
232 const std::map<G4Material*,G4double>& GetMatComponents() const
233 {return fMatComponents;}
234
235 // for chemical compound
236 inline G4double GetMassOfMolecule() const {return fMassOfMolecule;}
237
238 void SetChemicalFormula(const G4String& chF);
239
241
243
244 // meaningful only for single material:
245 G4double GetZ() const;
246 G4double GetA() const;
247
248 //the MaterialPropertiesTable (if any) attached to this material:
250
252 {return fMaterialPropertiesTable;}
253
254 //the index of this material in the Table:
255 inline size_t GetIndex() const {return fIndexInTable;}
256
257 // the static Table of Materials:
258 //
260
261 static size_t GetNumberOfMaterials();
262
263 //return pointer to a material, given its name:
264 static G4Material* GetMaterial(const G4String& name, G4bool warning=true);
265
266 //return pointer to a simple material, given its propeties:
267 static G4Material* GetMaterial(G4double z, G4double a, G4double dens);
268
269 //return pointer to a composit material, given its propeties:
270 static G4Material* GetMaterial(size_t nComp, G4double dens);
271
272 //
273 //printing methods
274 //
275 friend std::ostream& operator<<(std::ostream&, const G4Material*);
276 friend std::ostream& operator<<(std::ostream&, const G4Material&);
277 friend std::ostream& operator<<(std::ostream&, const G4MaterialTable&);
278
279 G4Material(__void__&);
280 // Fake default constructor for usage restricted to direct object
281 // persistency for clients requiring preallocation of memory for
282 // persistifiable objects.
283
284 inline void SetName (const G4String& name) {fName=name;}
285
286 virtual G4bool IsExtended() const;
287
288 // operators
289 G4bool operator==(const G4Material&) const = delete;
290 G4bool operator!=(const G4Material&) const = delete;
291 G4Material(const G4Material&) = delete;
292 const G4Material& operator=(const G4Material&) = delete;
293
294private:
295
296 void InitializePointers();
297
298 // Header routine for all derived quantities
299 void ComputeDerivedQuantities();
300
301 // Compute Radiation length
302 void ComputeRadiationLength();
303
304 // Compute Nuclear interaction length
305 void ComputeNuclearInterLength();
306
307 // Copy pointers of base material
308 void CopyPointersOfBaseMaterial();
309
310 void FillVectors();
311
312 G4bool IsLocked();
313
314 static
315 G4MaterialTable theMaterialTable; // the material table
316
317 const G4Material* fBaseMaterial; // Pointer to the base material
318 G4MaterialPropertiesTable* fMaterialPropertiesTable;
319
320 //
321 // General atomic properties defined in constructor or
322 // computed from the basic data members
323 //
324
325 G4ElementVector* theElementVector;// vector of constituent G4Elements
326 G4int* fAtomsVector; // composition by atom count
327 G4double* fMassFractionVector; // composition by fractional mass
328 G4double* fVecNbOfAtomsPerVolume;// number of atoms per volume
329
330 G4IonisParamMat* fIonisation; // ionisation parameters
331 G4SandiaTable* fSandiaTable; // Sandia table
332
333 G4double fDensity; // Material density
334 G4double fFreeElecDensity; // Free electron density
335 G4double fTemp; // Temperature (defaults: STP)
336 G4double fPressure; // Pressure (defaults: STP)
337
338 G4double fTotNbOfAtomsPerVolume; // Total nb of atoms per volume
339 G4double fTotNbOfElectPerVolume; // Total nb of electrons per volume
340 G4double fRadlen; // Radiation length
341 G4double fNuclInterLen; // Nuclear interaction length
342 G4double fMassOfMolecule; // Correct for materials built by atoms count
343
344 G4State fState; // Material state
345 size_t fIndexInTable; // Index in the material table
346 G4int fNumberOfElements; // Number of G4Elements in the material
347
348 // Class members used only at initialisation
349 G4int fNbComponents; // Number of components
350 G4int fIdxComponent; // Index of a new component
351 G4bool fMassFraction; // Flag of the method to add components
352
353 // For composites built
354 std::vector<G4int>* fAtoms = nullptr;
355 std::vector<G4double>* fElmFrac = nullptr;
356 std::vector<const G4Element*>* fElm = nullptr;
357
358 // For composites built via AddMaterial()
359 std::map<G4Material*, G4double> fMatComponents;
360
361 G4String fName; // Material name
362 G4String fChemicalFormula; // Material chemical formula
363};
364
365//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
366
367#endif
std::vector< const G4Element * > G4ElementVector
std::vector< G4Material * > G4MaterialTable
G4State
Definition: G4Material.hh:110
@ kStateSolid
Definition: G4Material.hh:110
@ kStateLiquid
Definition: G4Material.hh:110
@ kStateGas
Definition: G4Material.hh:110
@ kStateUndefined
Definition: G4Material.hh:110
double G4double
Definition: G4Types.hh:83
bool G4bool
Definition: G4Types.hh:86
int G4int
Definition: G4Types.hh:85
G4double GetPressure() const
Definition: G4Material.hh:178
void SetName(const G4String &name)
Definition: G4Material.hh:284
G4double GetDensity() const
Definition: G4Material.hh:175
G4bool operator!=(const G4Material &) const =delete
friend std::ostream & operator<<(std::ostream &, const G4Material *)
Definition: G4Material.cc:773
const G4String & GetChemicalFormula() const
Definition: G4Material.hh:173
const std::map< G4Material *, G4double > & GetMatComponents() const
Definition: G4Material.hh:232
const G4ElementVector * GetElementVector() const
Definition: G4Material.hh:185
const G4Material * GetBaseMaterial() const
Definition: G4Material.hh:228
G4MaterialPropertiesTable * GetMaterialPropertiesTable() const
Definition: G4Material.hh:251
const G4Material & operator=(const G4Material &)=delete
G4double GetTotNbOfAtomsPerVolume() const
Definition: G4Material.hh:204
static size_t GetNumberOfMaterials()
Definition: G4Material.cc:684
G4State GetState() const
Definition: G4Material.hh:176
G4double GetTemperature() const
Definition: G4Material.hh:177
const G4Element * GetElement(G4int iel) const
Definition: G4Material.hh:197
virtual G4bool IsExtended() const
Definition: G4Material.cc:842
G4double GetZ() const
Definition: G4Material.cc:745
const G4double * GetFractionVector() const
Definition: G4Material.hh:189
G4double GetTotNbOfElectPerVolume() const
Definition: G4Material.hh:207
G4IonisParamMat * GetIonisation() const
Definition: G4Material.hh:221
G4double GetFreeElectronDensity() const
Definition: G4Material.hh:174
void AddElement(G4Element *elm, G4int nAtoms)
Definition: G4Material.hh:156
virtual ~G4Material()
Definition: G4Material.cc:238
size_t GetNumberOfElements() const
Definition: G4Material.hh:181
const G4double * GetAtomicNumDensityVector() const
Definition: G4Material.hh:211
void SetChemicalFormula(const G4String &chF)
Definition: G4Material.cc:651
const G4int * GetAtomsVector() const
Definition: G4Material.hh:193
G4double GetA() const
Definition: G4Material.cc:759
G4SandiaTable * GetSandiaTable() const
Definition: G4Material.hh:224
G4bool operator==(const G4Material &) const =delete
void AddElementByNumberOfAtoms(const G4Element *elm, G4int nAtoms)
Definition: G4Material.cc:373
G4double GetElectronDensity() const
Definition: G4Material.hh:212
G4double GetRadlen() const
Definition: G4Material.hh:215
G4double GetMassOfMolecule() const
Definition: G4Material.hh:236
void AddElement(G4Element *elm, G4double frac)
Definition: G4Material.hh:163
const G4double * GetVecNbOfAtomsPerVolume() const
Definition: G4Material.hh:201
static G4MaterialTable * GetMaterialTable()
Definition: G4Material.cc:677
void AddMaterial(G4Material *material, G4double fraction)
Definition: G4Material.cc:515
const G4String & GetName() const
Definition: G4Material.hh:172
void SetMaterialPropertiesTable(G4MaterialPropertiesTable *anMPT)
Definition: G4Material.cc:849
size_t GetIndex() const
Definition: G4Material.hh:255
void SetFreeElectronDensity(G4double val)
Definition: G4Material.cc:658
void AddElementByMassFraction(const G4Element *elm, G4double fraction)
Definition: G4Material.cc:454
static G4Material * GetMaterial(const G4String &name, G4bool warning=true)
Definition: G4Material.cc:691
void ComputeDensityEffectOnFly(G4bool)
Definition: G4Material.cc:665
G4Material(const G4Material &)=delete
G4double GetNuclearInterLength() const
Definition: G4Material.hh:218