Geant4 9.6.0
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
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// $Id$
28//
29
30//---------------------------------------------------------------------------
31//
32// ClassName: G4Material
33//
34// Description: Contains material properties
35//
36// Class description:
37//
38// Is used to define the material composition of Geant4 volumes.
39// A G4Material is always made of G4Elements. It should has the name,
40// the list of G4Elements, material density, material state, temperature,
41// pressure. Other parameters are optional and may be set by the user code
42// or computed at initialisation.
43//
44// There is several ways to construct G4Material:
45// - from single element;
46// - from a list of components (elements or other materials);
47// - from internal Geant4 database of materials
48//
49// A collection of constituent Elements/Materials should be defined
50// with specified weights by fractional mass or atom counts (only for Elements).
51//
52// Quantities, with physical meaning or not, which are constant in a given
53// material are computed and stored here as Derived data members.
54//
55// The class contains as a private static member the Table of defined
56// materials (an ordered vector of materials).
57//
58// It is strongly not recommended to delete materials in user code.
59// All materials will be deleted automatically at the end of Geant4 session.
60//
61
62//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
63
64// 10-07-96, new data members added by L.Urban
65// 12-12-96, new data members added by L.Urban
66// 20-01-97, aesthetic rearrangement. RadLength calculation modified
67// Data members Zeff and Aeff REMOVED (i.e. passed to the Elements).
68// (local definition of Zeff in DensityEffect and FluctModel...)
69// Vacuum defined as a G4State. Mixture flag removed, M.Maire
70// 29-01-97, State=Vacuum automatically set density=0 in the contructors.
71// Subsequent protections have been put in the calculation of
72// MeanExcEnergy, ShellCorrectionVector, DensityEffect, M.Maire
73// 20-03-97, corrected initialization of pointers, M.Maire
74// 10-06-97, new data member added by V.Grichine (fSandiaPhotoAbsCof)
75// 27-06-97, new function GetElement(int), M.Maire
76// 24-02-98, fFractionVector become fMassFractionVector
77// 28-05-98, kState=kVacuum removed:
78// The vacuum is an ordinary gas vith very low density, M.Maire
79// 12-06-98, new method AddMaterial() allowing mixture of materials, M.Maire
80// 09-07-98, Ionisation parameters removed from the class, M.Maire
81// 04-08-98, new method GetMaterial(materialName), M.Maire
82// 05-10-98, change name: NumDensity -> NbOfAtomsPerVolume
83// 18-11-98, SandiaTable interface modified.
84// 19-07-99, new data member (chemicalFormula) added by V.Ivanchenko
85// 12-03-01, G4bool fImplicitElement (mma)
86// 30-03-01, suppression of the warning message in GetMaterial
87// 17-07-01, migration to STL. M. Verderi.
88// 14-09-01, Suppression of the data member fIndexInTable
89// 31-10-01, new function SetChemicalFormula() (mma)
90// 26-02-02, fIndexInTable renewed
91// 06-08-02, remove constructors with ChemicalFormula (mma)
92// 15-11-05, GetMaterial(materialName, G4bool warning=true)
93// 13-04-12, std::map<G4Material*,G4double> fMatComponents (mma)
94// 21-04-12, fMassOfMolecule (mma)
95
96//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
97
98#ifndef G4MATERIAL_HH
99#define G4MATERIAL_HH 1
100
101#include <vector>
102#include <map>
104
105#include "globals.hh"
106#include "G4ios.hh"
107#include "G4Element.hh"
109#include "G4IonisParamMat.hh"
110#include "G4SandiaTable.hh"
111#include "G4ElementVector.hh"
112#include "G4MaterialTable.hh"
113
115
116//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
117
119{
120public: // with description
121
122 //
123 // Constructor to create a material from single element
124 //
125 G4Material(const G4String& name, //its name
126 G4double z, //atomic number
127 G4double a, //mass of mole
128 G4double density, //density
129 G4State state = kStateUndefined, //solid,gas
130 G4double temp = CLHEP::STP_Temperature, //temperature
131 G4double pressure = CLHEP::STP_Pressure); //pressure
132
133 //
134 // Constructor to create a material from a combination of elements
135 // and/or materials subsequently added via AddElement and/or AddMaterial
136 //
137 G4Material(const G4String& name, //its name
138 G4double density, //density
139 G4int nComponents, //nbOfComponents
140 G4State state = kStateUndefined, //solid,gas
141 G4double temp = CLHEP::STP_Temperature, //temperature
142 G4double pressure = CLHEP::STP_Pressure); //pressure
143
144 //
145 // Constructor to create a material from the base material
146 //
147 G4Material(const G4String& name, //its name
148 G4double density, //density
149 const G4Material* baseMaterial, //base material
150 G4State state = kStateUndefined, //solid,gas
151 G4double temp = CLHEP::STP_Temperature, //temperature
152 G4double pressure = CLHEP::STP_Pressure); //pressure
153
154 //
155 // Add an element, giving number of atoms
156 //
157 void AddElement(G4Element* element, //the element
158 G4int nAtoms); //nb of atoms in
159 // a molecule
160 //
161 // Add an element or material, giving fraction of mass
162 //
163 void AddElement (G4Element* element , //the element
164 G4double fraction); //fractionOfMass
165
166 void AddMaterial(G4Material* material, //the material
167 G4double fraction); //fractionOfMass
168
169
170 virtual ~G4Material();
171
172 inline void SetChemicalFormula (const G4String& chF) {fChemicalFormula=chF;}
173
174 //
175 // retrieval methods
176 //
177 inline const G4String& GetName() const {return fName;}
178 inline const G4String& GetChemicalFormula() const {return fChemicalFormula;}
179 inline G4double GetDensity() const {return fDensity;}
180 inline G4State GetState() const {return fState;}
181 inline G4double GetTemperature() const {return fTemp;}
182 inline G4double GetPressure() const {return fPressure;}
183
184 //number of elements constituing this material:
185 inline size_t GetNumberOfElements() const {return fNumberOfElements;}
186
187 //vector of pointers to elements constituing this material:
188 inline const
189 G4ElementVector* GetElementVector() const {return theElementVector;}
190
191 //vector of fractional mass of each element:
192 inline const
193 G4double* GetFractionVector() const {return fMassFractionVector;}
194
195 //vector of atom count of each element:
196 inline const
197 G4int* GetAtomsVector() const {return fAtomsVector;}
198
199 //return a pointer to an element, given its index in the material:
200 inline const
201 G4Element* GetElement(G4int iel) const {return (*theElementVector)[iel];}
202
203 //vector of nb of atoms per volume of each element in this material:
204 inline const
205 G4double* GetVecNbOfAtomsPerVolume() const {return VecNbOfAtomsPerVolume;}
206 //total number of atoms per volume:
207 inline
208 G4double GetTotNbOfAtomsPerVolume() const {return TotNbOfAtomsPerVolume;}
209 //total number of electrons per volume:
210 inline
211 G4double GetTotNbOfElectPerVolume() const {return TotNbOfElectPerVolume;}
212
213 //obsolete names (5-10-98) see the 2 functions above
214 inline const
215 G4double* GetAtomicNumDensityVector() const {return VecNbOfAtomsPerVolume;}
216 inline G4double GetElectronDensity() const {return TotNbOfElectPerVolume;}
217
218 // Radiation length:
219 inline G4double GetRadlen() const {return fRadlen;}
220
221 // Nuclear interaction length:
222 inline G4double GetNuclearInterLength() const {return fNuclInterLen;}
223
224 // ionisation parameters:
225 inline G4IonisParamMat* GetIonisation() const {return fIonisation;}
226
227 // Sandia table:
228 inline G4SandiaTable* GetSandiaTable() const {return fSandiaTable;}
229
230 // Base material:
231 inline
232 const G4Material* GetBaseMaterial() const {return fBaseMaterial;}
233
234 // material components:
235 inline
236 std::map<G4Material*,G4double> GetMatComponents() const
237 {return fMatComponents;}
238
239 //for chemical compound
240 inline
241 G4double GetMassOfMolecule() const {return fMassOfMolecule;}
242
243 //meaningful only for single material:
244 G4double GetZ() const;
245 G4double GetA() const;
246
247 //the MaterialPropertiesTable (if any) attached to this material:
249 {fMaterialPropertiesTable = anMPT;}
250
252 {return fMaterialPropertiesTable;}
253
254 //the (static) Table of Materials:
255 //
256 static const G4MaterialTable* GetMaterialTable();
257
258 static size_t GetNumberOfMaterials();
259
260 //the index of this material in the Table:
261 inline size_t GetIndex() const {return fIndexInTable;}
262
263 //return pointer to a material, given its name:
264 static G4Material* GetMaterial(const G4String& name, G4bool warning=true);
265
266 //
267 //printing methods
268 //
269 friend std::ostream& operator<<(std::ostream&, G4Material*);
270 friend std::ostream& operator<<(std::ostream&, G4Material&);
271 friend std::ostream& operator<<(std::ostream&, G4MaterialTable);
272
273public: // without description
274
275 G4int operator==(const G4Material&) const;
276 G4int operator!=(const G4Material&) const;
277 G4Material(__void__&);
278 // Fake default constructor for usage restricted to direct object
279 // persistency for clients requiring preallocation of memory for
280 // persistifiable objects.
281
282 inline void SetName (const G4String& name) {fName=name;}
283
284private:
285
286 G4Material(const G4Material&);
287 const G4Material& operator=(const G4Material&);
288
289 void InitializePointers();
290
291 // Header routine for all derived quantities
292 void ComputeDerivedQuantities();
293
294 // Compute Radiation length
295 void ComputeRadiationLength();
296
297 // Compute Nuclear interaction length
298 void ComputeNuclearInterLength();
299
300 // Copy pointers of base material
301 void CopyPointersOfBaseMaterial();
302
303private:
304
305 //
306 // Basic data members ( To define a material)
307 //
308 G4String fName; // Material name
309 G4String fChemicalFormula; // Material chemical formula
310 G4double fDensity; // Material density
311
312 G4State fState; // Material state (determined
313 // internally based on density)
314 G4double fTemp; // Temperature (defaults: STP)
315 G4double fPressure; // Pressure (defaults: STP)
316
317 G4int maxNbComponents; // totalNbOfComponentsInTheMaterial
318 G4int fArrayLength; // the length of fAtomsVector
319 size_t fNumberOfComponents; // Nb of components declared so far
320
321 size_t fNumberOfElements; // Nb of Elements in the material
322 G4ElementVector* theElementVector; // vector of constituent Elements
323 G4bool fImplicitElement; // implicit Element created by this?
324 G4double* fMassFractionVector; // composition by fractional mass
325 G4int* fAtomsVector; // composition by atom count
326
327 G4MaterialPropertiesTable* fMaterialPropertiesTable;
328
329 static
330 G4MaterialTable theMaterialTable; // the material table
331 size_t fIndexInTable; // the position in the table
332
333 //
334 // Derived data members (computed from the basic data members)
335 //
336 // some general atomic properties
337
338 G4double* VecNbOfAtomsPerVolume; // vector of nb of atoms per volume
339 G4double TotNbOfAtomsPerVolume; // total nb of atoms per volume
340 G4double TotNbOfElectPerVolume; // total nb of electrons per volume
341 G4double fRadlen; // Radiation length
342 G4double fNuclInterLen; // Nuclear interaction length
343
344 G4IonisParamMat* fIonisation; // ionisation parameters
345 G4SandiaTable* fSandiaTable; // Sandia table
346
347 // utilities
348 //
349 const G4Material* fBaseMaterial; // Pointer to the base material
350 G4double fMassOfMolecule; // for materials built by atoms count
351 std::map<G4Material*,G4double> fMatComponents; // for composites built via
352 // AddMaterial()
353};
354
355//....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
356
357#endif
std::vector< G4Element * > G4ElementVector
std::vector< G4Material * > G4MaterialTable
G4State
Definition: G4Material.hh:114
@ kStateSolid
Definition: G4Material.hh:114
@ kStateLiquid
Definition: G4Material.hh:114
@ kStateGas
Definition: G4Material.hh:114
@ kStateUndefined
Definition: G4Material.hh:114
double G4double
Definition: G4Types.hh:64
int G4int
Definition: G4Types.hh:66
bool G4bool
Definition: G4Types.hh:67
G4double GetPressure() const
Definition: G4Material.hh:182
void SetName(const G4String &name)
Definition: G4Material.hh:282
G4double GetDensity() const
Definition: G4Material.hh:179
const G4String & GetChemicalFormula() const
Definition: G4Material.hh:178
static const G4MaterialTable * GetMaterialTable()
Definition: G4Material.cc:562
const G4ElementVector * GetElementVector() const
Definition: G4Material.hh:189
const G4Material * GetBaseMaterial() const
Definition: G4Material.hh:232
G4MaterialPropertiesTable * GetMaterialPropertiesTable() const
Definition: G4Material.hh:251
G4double GetTotNbOfAtomsPerVolume() const
Definition: G4Material.hh:208
static size_t GetNumberOfMaterials()
Definition: G4Material.cc:569
G4State GetState() const
Definition: G4Material.hh:180
G4double GetTemperature() const
Definition: G4Material.hh:181
const G4Element * GetElement(G4int iel) const
Definition: G4Material.hh:201
G4double GetZ() const
Definition: G4Material.cc:604
const G4double * GetFractionVector() const
Definition: G4Material.hh:193
G4double GetTotNbOfElectPerVolume() const
Definition: G4Material.hh:211
G4IonisParamMat * GetIonisation() const
Definition: G4Material.hh:225
void AddElement(G4Element *element, G4int nAtoms)
Definition: G4Material.cc:341
virtual ~G4Material()
Definition: G4Material.cc:227
size_t GetNumberOfElements() const
Definition: G4Material.hh:185
const G4double * GetAtomicNumDensityVector() const
Definition: G4Material.hh:215
void SetChemicalFormula(const G4String &chF)
Definition: G4Material.hh:172
const G4int * GetAtomsVector() const
Definition: G4Material.hh:197
G4int operator!=(const G4Material &) const
Definition: G4Material.cc:689
G4double GetA() const
Definition: G4Material.cc:617
G4SandiaTable * GetSandiaTable() const
Definition: G4Material.hh:228
G4double GetElectronDensity() const
Definition: G4Material.hh:216
friend std::ostream & operator<<(std::ostream &, G4Material *)
Definition: G4Material.cc:697
G4double GetRadlen() const
Definition: G4Material.hh:219
G4double GetMassOfMolecule() const
Definition: G4Material.hh:241
const G4double * GetVecNbOfAtomsPerVolume() const
Definition: G4Material.hh:205
G4int operator==(const G4Material &) const
Definition: G4Material.cc:682
void AddMaterial(G4Material *material, G4double fraction)
Definition: G4Material.cc:447
const G4String & GetName() const
Definition: G4Material.hh:177
void SetMaterialPropertiesTable(G4MaterialPropertiesTable *anMPT)
Definition: G4Material.hh:248
size_t GetIndex() const
Definition: G4Material.hh:261
static G4Material * GetMaterial(const G4String &name, G4bool warning=true)
Definition: G4Material.cc:576
std::map< G4Material *, G4double > GetMatComponents() const
Definition: G4Material.hh:236
G4double GetNuclearInterLength() const
Definition: G4Material.hh:222