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
G4DNAMolecularMaterial.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// Author: Mathieu Karamitros
28//
29// We would be very happy hearing from you, send us your feedback! :)
30//
31// In order for Geant4-DNA to be maintained and still open-source,
32// article citations are crucial.
33// If you use Geant4-DNA chemistry and you publish papers about your software,
34// in addition to the general paper on Geant4-DNA:
35//
36// Int. J. Model. Simul. Sci. Comput. 1 (2010) 157–178
37//
38// we would be very happy if you could please also cite the following
39// reference papers on chemistry:
40//
41// J. Comput. Phys. 274 (2014) 841-882
42// Prog. Nucl. Sci. Tec. 2 (2011) 503-508
43
44#ifndef G4DNAMolecularMaterial_HH
45#define G4DNAMolecularMaterial_HH
46
47#include "globals.hh"
48#include "G4ios.hh"
49#include <map>
50#include <vector>
51#include "G4VStateDependent.hh"
52
53class G4Material;
55
56/**
57 * \struct CompareMaterial
58 * \brief Materials can be described as a derivation of existing "parent"
59 * materials in order to alter few of their features, such as density.
60 * \p CompareMaterial compare materials taking into account
61 * their possible "affiliation".
62 */
64{
65 bool operator()(const G4Material* mat1, const G4Material* mat2) const;
66};
67
68using ComponentMap = std::map<const G4Material*, G4double, CompareMaterial>;
69
70/**
71 * \class G4DNAMolecularMaterial
72 * \brief G4DNAMolecularMaterial builds tables of molecular densities for chosen
73 * molecular materials. The class handles homogeneous, composite and
74 * derived materials. A material of interest is labeled as molecular if built
75 * using the number of atoms rather than the mass fractions.
76 *
77 * \details
78 * - Initialization:
79 * G4DNAMolecularMaterial is initialized when
80 * G4ApplicationState == G4State_Idle.
81 * It should be initialized on the master thread and used in read-only mode
82 * during stepping. The singleton is thread-shared.
83 *
84 * - For Developers:
85 * Use GetNumMolPerVolTableFor(molecule) in the concrete implementation of
86 * G4VEmModel::Initialise or G4VProcess::PreparePhysicsTable
87 * at run initialization to retrieve a read-only, thread-safe, table.
88 * The table is then built on the master thread at initialization time and
89 * shared between all threads and models.
90 *
91 * \note A G4material is labeled as molecular if built using the number of atoms
92 *
93 */
94
96{
97public:
99 void Initialize();
100 void Clear();
101
102 virtual G4bool Notify(G4ApplicationState requestedState);
103
104 //----------------------------------------------------------------------------
105
106 /**
107 * \fn const std::vector<G4double>* \
108 * GetDensityTableFor(const G4Material* searchedMaterial) const
109 * \brief Retrieve a table of volumetric mass densities (mass per unit volume)
110 * in the G4 unit system for chosen material.
111 *
112 * @param[in] searchedMaterial
113 * The material which you'd like to retrieve the volumic mass
114 * @pre The \p searchedMaterial used in parameter must be built as a
115 * molecular material, using the number of atoms rather than the density
116 * fractions.
117 * \return
118 * Pointer to a table of molecular densities for the \p searchedMaterial
119 * indexed on the (parent) material index.
120 *
121 */
122 const std::vector<G4double>* GetDensityTableFor(const G4Material*) const;
123
124 /**
125 * \fn const std::vector<G4double>* \
126 * GetNumMolPerVolTableFor(const G4Material* searchedMaterial) const
127 * \brief Retrieve a table of molecular densities (number of molecules per
128 * unit volume) in the G4 unit system for chosen material.
129 *
130 * @param[in] searchedMaterial
131 * The material which you'd like to retrieve the molecular density
132 * @pre The \p searchedMaterial used in parameter must be built as a
133 * molecular material, using the number of atoms rather than the density
134 * fractions.
135 * \return
136 * Pointer to a table of molecular densities for the \p searchedMaterial
137 * indexed on the (parent) material index.
138 */
139 const std::vector<G4double>* GetNumMolPerVolTableFor(const G4Material*) const;
140
141 inline const std::vector<ComponentMap>* GetMassFractionTable() const{
142 return fpCompFractionTable;
143 }
144 inline const std::vector<ComponentMap>* GetDensityTable() const{
145 return fpCompDensityTable;
146 }
147
148 //----------------------------------------------------------------------------
149
151
152 /**
153 * \fn void SetMolecularConfiguration(const G4Material* material, \
154 * G4MolecularConfiguration* molConf)
155 * \brief Associate a molecular configuration to a G4material.
156 *
157 * @param[in] material
158 * Pointer to a G4 material. The material
159 * does not need to be defined as a molecular material.
160 * @param[in] molConf
161 * The molecular configuration corresponding to
162 * the G4 \p material.
163 */
166
167 /**
168 * \fn void SetMolecularConfiguration(const G4Material* material, \
169 * const G4String& molConf)
170 * \brief Associate a molecular configuration to a G4material.
171 *
172 * @param[in] material
173 * Pointer to a G4 material. The material
174 * does not need to be defined as a molecular material.
175 * @param[in] molConf
176 * User ID of the molecular configuration corresponding to
177 * the G4 \p material.
178 */
180 const G4String&);
181
182 /**
183 * \fn void SetMolecularConfiguration(const G4Material* material, \
184 * const G4String& molConf)
185 * \brief Associate a molecular configuration to a G4material.
186 *
187 * @param[in] material
188 * Name of the G4 material. The material
189 * does not need to be defined as a molecular material.
190 * @param[in] molConf
191 * User ID of the molecular configuration corresponding to
192 * the G4 \p material.
193 */
194 void SetMolecularConfiguration(const G4String& materialName,
195 const G4String& molUserIF);
196
197 //----------------------------------------------------------------------------
198
199 /**
200 * \brief Deprecated
201 * \deprecated Will return a G4 fatal exception.
202 * Use instead GetNumMolPerVolTableFor(molecule) at run
203 * initialization to retrieve a read-only, thread-safe, table.
204 * \note A G4material is labeled as molecular if built using
205 * the number of atoms.
206 */
208
209 /**
210 * \brief Deprecated
211 * \deprecated Will return a G4 fatal exception.
212 * Use instead GetNumMolPerVolTableFor(molecule) at run
213 * initialization to retrieve a read-only, thread-safe, table.
214 * \note A G4material is labeled as molecular if built using
215 * the number of atoms.
216 */
218 const G4Material *component,
219 G4double massFraction);
220
221protected:
226 virtual ~G4DNAMolecularMaterial();
227 void Create();
229 void InitializeDensity();
230 void RecordMolecularMaterial(G4Material* parentMaterial,
231 G4Material* molecularMaterial,
232 G4double fraction);
233 void SearchMolecularMaterial(G4Material* parentMaterial,
234 G4Material* material,
235 G4double currentFraction);
236
237 void AddMaterial(const G4Material*, G4double fraction);
238
239 void PrintNotAMolecularMaterial(const char* methodName,
240 const G4Material* lookForMaterial) const;
241
242 // Tables built for all molecular materials at initialization
243 std::vector<ComponentMap>* fpCompFractionTable;
244 std::vector<ComponentMap>* fpCompDensityTable;
245 std::vector<ComponentMap>* fpCompNumMolPerVolTable;
246
247 mutable std::map<const G4Material*, std::vector<G4double>*, CompareMaterial>
249 mutable std::map<const G4Material*, std::vector<G4double>*, CompareMaterial>
251 mutable std::map<const G4Material*, G4bool, CompareMaterial> fWarningPrinted;
252
253 std::map<G4int /*Material ID*/,
255
257 std::size_t fNMaterials;
258};
259
260#endif // G4DNAMolecularMaterial_HH
G4ApplicationState
std::map< const G4Material *, G4double, CompareMaterial > ComponentMap
double G4double
Definition: G4Types.hh:83
bool G4bool
Definition: G4Types.hh:86
int G4int
Definition: G4Types.hh:85
G4DNAMolecularMaterial builds tables of molecular densities for chosen molecular materials....
void SetMolecularConfiguration(const G4Material *, G4MolecularConfiguration *)
Associate a molecular configuration to a G4material.
std::map< const G4Material *, std::vector< G4double > *, CompareMaterial > fAskedDensityTable
void RecordMolecularMaterial(G4Material *parentMaterial, G4Material *molecularMaterial, G4double fraction)
G4MolecularConfiguration * GetMolecularConfiguration(const G4Material *) const
std::map< const G4Material *, G4bool, CompareMaterial > fWarningPrinted
void PrintNotAMolecularMaterial(const char *methodName, const G4Material *lookForMaterial) const
std::map< G4int, G4MolecularConfiguration * > fMaterialToMolecularConf
const std::vector< ComponentMap > * GetDensityTable() const
const std::vector< G4double > * GetNumMolPerVolTableFor(const G4Material *) const
Retrieve a table of molecular densities (number of molecules per unit volume) in the G4 unit system f...
virtual G4bool Notify(G4ApplicationState requestedState)
G4double GetNumMoleculePerVolumeUnitForMaterial(const G4Material *mat)
Deprecated.
std::vector< ComponentMap > * fpCompFractionTable
std::vector< ComponentMap > * fpCompNumMolPerVolTable
static G4DNAMolecularMaterial * Instance()
void AddMaterial(const G4Material *, G4double fraction)
G4double GetNumMolPerVolForComponentInComposite(const G4Material *composite, const G4Material *component, G4double massFraction)
Deprecated.
const std::vector< G4double > * GetDensityTableFor(const G4Material *) const
Retrieve a table of volumetric mass densities (mass per unit volume) in the G4 unit system for chosen...
static G4DNAMolecularMaterial * fInstance
const std::vector< ComponentMap > * GetMassFractionTable() const
void SearchMolecularMaterial(G4Material *parentMaterial, G4Material *material, G4double currentFraction)
std::map< const G4Material *, std::vector< G4double > *, CompareMaterial > fAskedNumPerVolTable
G4DNAMolecularMaterial & operator=(const G4DNAMolecularMaterial &)
std::vector< ComponentMap > * fpCompDensityTable
Materials can be described as a derivation of existing "parent" materials in order to alter few of th...
bool operator()(const G4Material *mat1, const G4Material *mat2) const