ECCE @ EIC Software
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
G4Material.hh
Go to the documentation of this file. Or view the newest version in sPHENIX GitHub for file G4Material.hh
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 #include "G4Threading.hh"
110 
112 
113 static const G4double NTP_Temperature = 293.15*CLHEP::kelvin;
114 
115 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
116 
118 {
119 public: // with description
120  //
121  // Constructor to create a material from single element
122  //
123  G4Material(const G4String& name, //its name
124  G4double z, //atomic number
125  G4double a, //mass of mole
126  G4double density, //density
127  G4State state = kStateUndefined, //solid,gas
128  G4double temp = NTP_Temperature, //temperature
129  G4double pressure = CLHEP::STP_Pressure); //pressure
130 
131  //
132  // Constructor to create a material from a combination of elements
133  // and/or materials subsequently added via AddElement and/or AddMaterial
134  //
135  G4Material(const G4String& name, //its name
136  G4double density, //density
137  G4int nComponents, //nbOfComponents
138  G4State state = kStateUndefined, //solid,gas
139  G4double temp = NTP_Temperature, //temperature
140  G4double pressure = CLHEP::STP_Pressure); //pressure
141 
142  //
143  // Constructor to create a material from the base material
144  //
145  G4Material(const G4String& name, //its name
146  G4double density, //density
147  const G4Material* baseMaterial, //base material
148  G4State state = kStateUndefined, //solid,gas
149  G4double temp = NTP_Temperature, //temperature
150  G4double pressure = CLHEP::STP_Pressure); //pressure
151 
152  //
153  // Add an element, giving number of atoms
154  //
155  void AddElement(G4Element* element, //the element
156  G4int nAtoms); //nb of atoms in
157  // a molecule
158  //
159  // Add an element or material, giving fraction of mass
160  //
161  void AddElement (G4Element* element , //the element
162  G4double fraction); //fractionOfMass
163 
164  void AddMaterial(G4Material* material, //the material
165  G4double fraction); //fractionOfMass
166 
167  virtual ~G4Material();
168  //
169  // retrieval methods
170  //
171  inline const G4String& GetName() const {return fName;}
172  inline const G4String& GetChemicalFormula() const {return fChemicalFormula;}
174  inline G4double GetDensity() const {return fDensity;}
175  inline G4State GetState() const {return fState;}
176  inline G4double GetTemperature() const {return fTemp;}
177  inline G4double GetPressure() const {return fPressure;}
178 
179  //number of elements constituing this material:
180  inline size_t GetNumberOfElements() const {return fNumberOfElements;}
181 
182  //vector of pointers to elements constituing this material:
183  inline const
185 
186  //vector of fractional mass of each element:
187  inline const
189 
190  //vector of atom count of each element:
191  inline const
192  G4int* GetAtomsVector() const {return fAtomsVector;}
193 
194  //return a pointer to an element, given its index in the material:
195  inline const
196  G4Element* GetElement(G4int iel) const {return (*theElementVector)[iel];}
197 
198  //vector of nb of atoms per volume of each element in this material:
199  inline const
201  //total number of atoms per volume:
202  inline
204  //total number of electrons per volume:
205  inline
207 
208  //obsolete names (5-10-98) see the 2 functions above
209  inline const
212 
213  // Radiation length:
214  inline G4double GetRadlen() const {return fRadlen;}
215 
216  // Nuclear interaction length
218 
219  // ionisation parameters:
220  inline G4IonisParamMat* GetIonisation() const {return fIonisation;}
221 
222  // Sandia table:
223  inline G4SandiaTable* GetSandiaTable() const {return fSandiaTable; }
224 
225  // Base material:
226  inline
227  const G4Material* GetBaseMaterial() const {return fBaseMaterial;}
228 
229  // material components:
230  inline
231  const std::map<G4Material*,G4double>& GetMatComponents() const
232  {return fMatComponents;}
233 
234  // for chemical compound
235  inline G4double GetMassOfMolecule() const {return fMassOfMolecule;}
236 
237  void SetChemicalFormula(const G4String& chF);
238 
240 
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 
251  {return fMaterialPropertiesTable;}
252 
253  //the index of this material in the Table:
254  inline size_t GetIndex() const {return fIndexInTable;}
255 
256  // the static Table of Materials:
257  //
259 
260  static size_t GetNumberOfMaterials();
261 
262  //return pointer to a material, given its name:
263  static G4Material* GetMaterial(const G4String& name, G4bool warning=true);
264 
265  //return pointer to a simple material, given its propeties:
266  static G4Material* GetMaterial(G4double z, G4double a, G4double dens);
267 
268  //return pointer to a composit material, given its propeties:
269  static G4Material* GetMaterial(size_t nComp, G4double dens);
270 
271  //
272  //printing methods
273  //
274  friend std::ostream& operator<<(std::ostream&, const G4Material*);
275  friend std::ostream& operator<<(std::ostream&, const G4Material&);
276  friend std::ostream& operator<<(std::ostream&, G4MaterialTable);
277 
278  G4Material(__void__&);
279  // Fake default constructor for usage restricted to direct object
280  // persistency for clients requiring preallocation of memory for
281  // persistifiable objects.
282 
283  inline void SetName (const G4String& name) {fName=name;}
284 
285  virtual G4bool IsExtended() const;
286 
287 private:
288 
289  // operators
290  G4bool operator==(const G4Material&) const;
291  G4bool operator!=(const G4Material&) const;
292  G4Material(const G4Material&);
293  const G4Material& operator=(const G4Material&);
294 
295  void InitializePointers();
296 
297  // Header routine for all derived quantities
299 
300  // Compute Radiation length
301  void ComputeRadiationLength();
302 
303  // Compute Nuclear interaction length
305 
306  // Copy pointers of base material
308 
309 private:
310 
311  const G4Material* fBaseMaterial; // Pointer to the base material
313 
314  G4ElementVector* theElementVector; // vector of constituent Elements
315  G4double* fMassFractionVector; // composition by fractional mass
316  G4int* fAtomsVector; // composition by atom count
317 
318  static
319  G4MaterialTable theMaterialTable; // the material table
320 
321  //
322  // Derived data members (computed from the basic data members)
323  //
324  // some general atomic properties
325 
326  G4double* fVecNbOfAtomsPerVolume; // vector of nb of atoms per volume
327 
328  G4IonisParamMat* fIonisation; // ionisation parameters
329  G4SandiaTable* fSandiaTable; // Sandia table
330 
331  G4double fDensity; // Material density
332  G4double fFreeElecDensity; // Free electron density
333  G4double fTemp; // Temperature (defaults: STP)
334  G4double fPressure; // Pressure (defaults: STP)
335 
336  G4double fTotNbOfAtomsPerVolume; // total nb of atoms per volume
337  G4double fTotNbOfElectPerVolume; // total nb of electrons per volume
338  G4double fRadlen; // Radiation length
339  G4double fNuclInterLen; // Nuclear interaction length
340  G4double fMassOfMolecule; // for materials built by atoms count
341 
342  G4State fState; // Material state (determined
343  // internally based on density)
344  size_t fIndexInTable; // the position in the material table
345 
346  G4int maxNbComponents; // totalNbOfComponentsInTheMaterial
347  G4int fArrayLength; // the length of fAtomsVector
348  G4int fNumberOfComponents; // Nb of components declared so far
349 
350  G4int fNumberOfElements; // Nb of Elements in the material
351 
352  std::map<G4Material*,G4double> fMatComponents; // for composites built via
353  // AddMaterial()
354 
355  G4String fName; // Material name
356  G4String fChemicalFormula; // Material chemical formula
357 
358 #ifdef G4MULTITHREADED
359  static G4Mutex materialMutex;
360 #endif
361 };
362 
363 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
364 
365 #endif