GGEMS  1.1
GPU GEant4-based Monte Carlo Simulations
GGEMSMaterialsDatabaseManager.hh
Go to the documentation of this file.
1 #ifndef GUARD_GGEMS_MATERIALS_GGEMSMATERIALSDATABASEMANAGER_HH
2 #define GUARD_GGEMS_MATERIALS_GGEMSMATERIALSDATABASEMANAGER_HH
3 
4 // ************************************************************************
5 // * This file is part of GGEMS. *
6 // * *
7 // * GGEMS is free software: you can redistribute it and/or modify *
8 // * it under the terms of the GNU General Public License as published by *
9 // * the Free Software Foundation, either version 3 of the License, or *
10 // * (at your option) any later version. *
11 // * *
12 // * GGEMS is distributed in the hope that it will be useful, *
13 // * but WITHOUT ANY WARRANTY; without even the implied warranty of *
14 // * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
15 // * GNU General Public License for more details. *
16 // * *
17 // * You should have received a copy of the GNU General Public License *
18 // * along with GGEMS. If not, see <https://www.gnu.org/licenses/>. *
19 // * *
20 // ************************************************************************
21 
34 #ifdef _MSC_VER
35 #pragma warning(disable: 4251) // Deleting warning exporting STL members!!!
36 #endif
37 
38 #include <vector>
39 #include <unordered_map>
40 
42 
50 struct GGEMS_EXPORT GGEMSChemicalElement
51 {
57 };
58 
63 struct GGEMS_EXPORT GGEMSSingleMaterial
64 {
65  std::vector<std::string> chemical_element_name_;
66  std::vector<GGfloat> mixture_f_;
69 };
70 
71 typedef std::unordered_map<std::string, GGEMSChemicalElement> ChemicalElementUMap;
72 typedef std::unordered_map<std::string, GGEMSSingleMaterial> MaterialUMap;
79 {
80  private:
85 
90 
91  public:
98  {
99  static GGEMSMaterialsDatabaseManager instance;
100  return instance;
101  }
102 
109 
116 
123 
130 
136  void SetMaterialsDatabase(std::string const& filename);
137 
142  void PrintAvailableChemicalElements(void) const;
143 
148  void PrintAvailableMaterials(void) const;
149 
155  inline bool IsReady(void) const
156  {
157  if (materials_.empty()) return false;
158  else return true;
159  }
160 
167  inline GGEMSSingleMaterial GetMaterial(std::string const& material_name) const
168  {
169  MaterialUMap::const_iterator iter = materials_.find(material_name);
170 
171  // Checking if the material exists
172  if (iter == materials_.end()) {
173  std::ostringstream oss(std::ostringstream::out);
174  oss << "Material '" << material_name << "' not found in the database!!!" << std::endl;
175  GGEMSMisc::ThrowException("GGEMSMaterialsDatabaseManager", "GetMaterial", oss.str());
176  }
177 
178  return iter->second;
179  };
180 
187  inline GGEMSChemicalElement GetChemicalElement(std::string const& chemical_element_name) const
188  {
189  ChemicalElementUMap::const_iterator iter = chemical_elements_.find(chemical_element_name);
190 
191  // Checking if the material exists
192  if (iter == chemical_elements_.end()) {
193  std::ostringstream oss(std::ostringstream::out);
194  oss << "Chemical element '" << chemical_element_name << "' not found in the database!!!" << std::endl;
195  GGEMSMisc::ThrowException("GGEMSMaterialsDatabaseManager", "GetChemicalElement", oss.str());
196  }
197 
198  return iter->second;
199  };
200 
207  GGfloat GetRadiationLength(std::string const& material) const;
208 
216  inline GGfloat GetAtomicNumberDensity(std::string const& material, GGsize const& index) const
217  {
218  // Getting the material
219  GGEMSSingleMaterial const& single_material = GetMaterial(material);
220 
221  // Getting the specific chemical element
222  GGEMSChemicalElement const& chemical_element = GetChemicalElement(single_material.chemical_element_name_[index]);
223 
224  // return the atomic number density, the number could be higher than float!!! Double is used
225  GGdouble tmp_value_double = static_cast<GGdouble>(AVOGADRO) / chemical_element.molar_mass_M_ * single_material.density_ * single_material.mixture_f_[index];
226  return static_cast<GGfloat>(tmp_value_double);
227  }
228 
233  void Clean(void);
234 
235  private:
241  void LoadMaterialsDatabase(std::string const& filename);
242 
247  void LoadChemicalElements(void);
248 
259  void AddChemicalElements(std::string const& element_name, GGuchar const& element_Z, GGfloat const& element_M, GGfloat const& element_I, GGchar const& state, GGint const& index_density_correction);
260 
261  private:
264 };
265 
272 
279 extern "C" GGEMS_EXPORT void set_materials_ggems_materials_manager(GGEMSMaterialsDatabaseManager* ggems_materials_manager, char const* filename);
280 
286 extern "C" GGEMS_EXPORT void print_available_chemical_elements_ggems_materials_manager(GGEMSMaterialsDatabaseManager* ggems_materials_manager);
287 
293 extern "C" GGEMS_EXPORT void print_available_materials_ggems_materials_manager(GGEMSMaterialsDatabaseManager* ggems_materials_manager);
294 
295 #endif // End of GUARD_GGEMS_PHYSICS_GGEMSMATERIALSDATABASEMANAGER_HH
GGEMSChemicalElement::mean_excitation_energy_I_
GGfloat mean_excitation_energy_I_
Definition: GGEMSMaterialsDatabaseManager.hh:54
GGEMSConstants.hh
Different namespaces storing constants useful for GGEMS.
GGEMSMaterialsDatabaseManager::GGEMSMaterialsDatabaseManager
GGEMSMaterialsDatabaseManager(GGEMSMaterialsDatabaseManager const &&material_manager)=delete
Avoid copy of the class by rvalue reference.
GGEMSMaterialsDatabaseManager::operator=
GGEMSMaterialsDatabaseManager & operator=(GGEMSMaterialsDatabaseManager const &&material_manager)=delete
Avoid copy of the class by rvalue reference.
GGEMSSingleMaterial
GGEMS structure managing a specific material.
Definition: GGEMSMaterialsDatabaseManager.hh:64
ChemicalElementUMap
std::unordered_map< std::string, GGEMSChemicalElement > ChemicalElementUMap
Definition: GGEMSMaterialsDatabaseManager.hh:71
GGEMSMaterialsDatabaseManager::operator=
GGEMSMaterialsDatabaseManager & operator=(GGEMSMaterialsDatabaseManager const &material_manager)=delete
Avoid assignement of the class by reference.
GGchar
#define GGchar
Definition: GGEMSTypes.hh:196
GGEMSChemicalElement::state_
GGchar state_
Definition: GGEMSMaterialsDatabaseManager.hh:55
GGEMSSingleMaterial::chemical_element_name_
std::vector< std::string > chemical_element_name_
Definition: GGEMSMaterialsDatabaseManager.hh:65
GGEMSChemicalElement::molar_mass_M_
GGfloat molar_mass_M_
Definition: GGEMSMaterialsDatabaseManager.hh:53
SOLID
__constant GGchar SOLID
Definition: GGEMSMaterialsDatabaseManager.hh:43
GGsize
#define GGsize
Definition: GGEMSTypes.hh:252
GGint
#define GGint
Definition: GGEMSTypes.hh:224
GGEMSMaterialsDatabaseManager::IsReady
bool IsReady(void) const
check if the material manager is ready
Definition: GGEMSMaterialsDatabaseManager.hh:155
GAS
__constant GGchar GAS
Definition: GGEMSMaterialsDatabaseManager.hh:44
__constant
#define __constant
__constant is known for OpenCL, but for C++ we define __constant as a constexpr
Definition: GGEMSSystemOfUnits.hh:43
GGEMSMaterialsDatabaseManager::GGEMSMaterialsDatabaseManager
GGEMSMaterialsDatabaseManager(GGEMSMaterialsDatabaseManager const &material_manager)=delete
Avoid copy of the class by reference.
GGEMSMaterialsDatabaseManager::GetInstance
static GGEMSMaterialsDatabaseManager & GetInstance(void)
Create at first time the Singleton.
Definition: GGEMSMaterialsDatabaseManager.hh:97
get_instance_materials_manager
GGEMSMaterialsDatabaseManager * get_instance_materials_manager(void)
Get the GGEMSMaterialsDatabaseManager pointer for python user.
Definition: GGEMSMaterialsDatabaseManager.cc:378
GGEMSSingleMaterial::density_
GGfloat density_
Definition: GGEMSMaterialsDatabaseManager.hh:67
GGEMSSingleMaterial::mixture_f_
std::vector< GGfloat > mixture_f_
Definition: GGEMSMaterialsDatabaseManager.hh:66
GGEMSMaterialsDatabaseManager::materials_
MaterialUMap materials_
Definition: GGEMSMaterialsDatabaseManager.hh:262
GGEMSMaterialsDatabaseManager::GetAtomicNumberDensity
GGfloat GetAtomicNumberDensity(std::string const &material, GGsize const &index) const
Compute the atomic number density of an element in a material.
Definition: GGEMSMaterialsDatabaseManager.hh:216
GGEMSChemicalElement
GGEMS structure managing a specific chemical element.
Definition: GGEMSMaterialsDatabaseManager.hh:51
set_materials_ggems_materials_manager
void set_materials_ggems_materials_manager(GGEMSMaterialsDatabaseManager *ggems_materials_manager, char const *filename)
enter the material database to GGEMS
Definition: GGEMSMaterialsDatabaseManager.cc:387
GGEMSChemicalElement::index_density_correction_
GGint index_density_correction_
Definition: GGEMSMaterialsDatabaseManager.hh:52
GGEMSMaterialsDatabaseManager::GetChemicalElement
GGEMSChemicalElement GetChemicalElement(std::string const &chemical_element_name) const
get the chemical element
Definition: GGEMSMaterialsDatabaseManager.hh:187
GGdouble
#define GGdouble
Definition: GGEMSTypes.hh:280
GGuchar
#define GGuchar
Definition: GGEMSTypes.hh:203
GGEMSChemicalElement::atomic_number_Z_
GGuchar atomic_number_Z_
Definition: GGEMSMaterialsDatabaseManager.hh:56
print_available_materials_ggems_materials_manager
void print_available_materials_ggems_materials_manager(GGEMSMaterialsDatabaseManager *ggems_materials_manager)
print all available materials
Definition: GGEMSMaterialsDatabaseManager.cc:405
AVOGADRO
__constant GGfloat AVOGADRO
Definition: GGEMSConstants.hh:43
print_available_chemical_elements_ggems_materials_manager
void print_available_chemical_elements_ggems_materials_manager(GGEMSMaterialsDatabaseManager *ggems_materials_manager)
print all available chemical elements
Definition: GGEMSMaterialsDatabaseManager.cc:396
GGEMSSingleMaterial::nb_elements_
GGsize nb_elements_
Definition: GGEMSMaterialsDatabaseManager.hh:68
GGEMSMaterialsDatabaseManager
GGEMS class managing the material database.
Definition: GGEMSMaterialsDatabaseManager.hh:79
MaterialUMap
std::unordered_map< std::string, GGEMSSingleMaterial > MaterialUMap
Definition: GGEMSMaterialsDatabaseManager.hh:72
GGEMSMaterialsDatabaseManager::GetMaterial
GGEMSSingleMaterial GetMaterial(std::string const &material_name) const
get the material
Definition: GGEMSMaterialsDatabaseManager.hh:167
GGEMSMisc::ThrowException
void ThrowException(std::string const &class_name, std::string const &method_name, std::string const &message)
Throw a C++ exception.
Definition: GGEMSTools.cc:61
GGEMSMaterialsDatabaseManager::chemical_elements_
ChemicalElementUMap chemical_elements_
Definition: GGEMSMaterialsDatabaseManager.hh:263
GGfloat
#define GGfloat
Definition: GGEMSTypes.hh:273