Geant4 9.6.0
Toolkit for the simulation of the passage of particles through matter
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
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