Geant4 Cross Reference |
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 53 class G4Material; 54 class G4MolecularConfiguration; 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 */ 63 struct CompareMaterial 64 { 65 bool operator()(const G4Material* mat1, const G4Material* mat2) const; 66 }; 67 68 using 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 95 class G4DNAMolecularMaterial: public G4VStateDependent 96 { 97 public: 98 G4DNAMolecularMaterial(const G4DNAMolecularMaterial& right) = delete; 99 G4DNAMolecularMaterial& operator=(const G4DNAMolecularMaterial&) = delete; 100 101 static G4DNAMolecularMaterial* Instance(); 102 void Initialize(); 103 void Clear(); 104 105 G4bool Notify(G4ApplicationState requestedState) override; 106 107 //---------------------------------------------------------------------------- 108 109 /** 110 * \fn const std::vector<G4double>* \ 111 * GetDensityTableFor(const G4Material* searchedMaterial) const 112 * \brief Retrieve a table of volumetric mass densities (mass per unit volume) 113 * in the G4 unit system for chosen material. 114 * 115 * @param[in] searchedMaterial 116 * The material which you'd like to retrieve the volumic mass 117 * @pre The \p searchedMaterial used in parameter must be built as a 118 * molecular material, using the number of atoms rather than the density 119 * fractions. 120 * \return 121 * Pointer to a table of molecular densities for the \p searchedMaterial 122 * indexed on the (parent) material index. 123 * 124 */ 125 const std::vector<G4double>* GetDensityTableFor(const G4Material*) const; 126 127 /** 128 * \fn const std::vector<G4double>* \ 129 * GetNumMolPerVolTableFor(const G4Material* searchedMaterial) const 130 * \brief Retrieve a table of molecular densities (number of molecules per 131 * unit volume) in the G4 unit system for chosen material. 132 * 133 * @param[in] searchedMaterial 134 * The material which you'd like to retrieve the molecular density 135 * @pre The \p searchedMaterial used in parameter must be built as a 136 * molecular material, using the number of atoms rather than the density 137 * fractions. 138 * \return 139 * Pointer to a table of molecular densities for the \p searchedMaterial 140 * indexed on the (parent) material index. 141 */ 142 const std::vector<G4double>* GetNumMolPerVolTableFor(const G4Material*) const; 143 144 inline const std::vector<ComponentMap>* GetMassFractionTable() const{ 145 return fpCompFractionTable; 146 } 147 inline const std::vector<ComponentMap>* GetDensityTable() const{ 148 return fpCompDensityTable; 149 } 150 151 //---------------------------------------------------------------------------- 152 153 G4MolecularConfiguration* GetMolecularConfiguration(const G4Material*) const; 154 155 /** 156 * \fn void SetMolecularConfiguration(const G4Material* material, \ 157 * G4MolecularConfiguration* molConf) 158 * \brief Associate a molecular configuration to a G4material. 159 * 160 * @param[in] material 161 * Pointer to a G4 material. The material 162 * does not need to be defined as a molecular material. 163 * @param[in] molConf 164 * The molecular configuration corresponding to 165 * the G4 \p material. 166 */ 167 void SetMolecularConfiguration(const G4Material*, 168 G4MolecularConfiguration*); 169 170 /** 171 * \fn void SetMolecularConfiguration(const G4Material* material, \ 172 * const G4String& molConf) 173 * \brief Associate a molecular configuration to a G4material. 174 * 175 * @param[in] material 176 * Pointer to a G4 material. The material 177 * does not need to be defined as a molecular material. 178 * @param[in] molConf 179 * User ID of the molecular configuration corresponding to 180 * the G4 \p material. 181 */ 182 void SetMolecularConfiguration(const G4Material*, 183 const G4String&); 184 185 /** 186 * \fn void SetMolecularConfiguration(const G4Material* material, \ 187 * const G4String& molConf) 188 * \brief Associate a molecular configuration to a G4material. 189 * 190 * @param[in] material 191 * Name of the G4 material. The material 192 * does not need to be defined as a molecular material. 193 * @param[in] molConf 194 * User ID of the molecular configuration corresponding to 195 * the G4 \p material. 196 */ 197 void SetMolecularConfiguration(const G4String& materialName, 198 const G4String& molUserIF); 199 200 //---------------------------------------------------------------------------- 201 202 /** 203 * \brief Deprecated 204 * \deprecated Will return a G4 fatal exception. 205 * Use instead GetNumMolPerVolTableFor(molecule) at run 206 * initialization to retrieve a read-only, thread-safe, table. 207 * \note A G4material is labeled as molecular if built using 208 * the number of atoms. 209 */ 210 G4double GetNumMoleculePerVolumeUnitForMaterial(const G4Material *mat); 211 212 /** 213 * \brief Deprecated 214 * \deprecated Will return a G4 fatal exception. 215 * Use instead GetNumMolPerVolTableFor(molecule) at run 216 * initialization to retrieve a read-only, thread-safe, table. 217 * \note A G4material is labeled as molecular if built using 218 * the number of atoms. 219 */ 220 G4double GetNumMolPerVolForComponentInComposite(const G4Material *composite, 221 const G4Material *component, 222 G4double massFraction); 223 224 protected: 225 static G4DNAMolecularMaterial* fInstance; 226 G4DNAMolecularMaterial(); 227 ~G4DNAMolecularMaterial() override; 228 void Create(); 229 void InitializeNumMolPerVol(); 230 void InitializeDensity(); 231 void RecordMolecularMaterial(G4Material* parentMaterial, 232 G4Material* molecularMaterial, 233 G4double fraction); 234 void SearchMolecularMaterial(G4Material* parentMaterial, 235 G4Material* material, 236 G4double currentFraction); 237 238 void AddMaterial(const G4Material*, G4double fraction); 239 240 void PrintNotAMolecularMaterial(const char* methodName, 241 const G4Material* lookForMaterial) const; 242 243 // Tables built for all molecular materials at initialization 244 std::vector<ComponentMap>* fpCompFractionTable; 245 std::vector<ComponentMap>* fpCompDensityTable; 246 std::vector<ComponentMap>* fpCompNumMolPerVolTable; 247 248 mutable std::map<const G4Material*, std::vector<G4double>*, CompareMaterial> 249 fAskedDensityTable; 250 mutable std::map<const G4Material*, std::vector<G4double>*, CompareMaterial> 251 fAskedNumPerVolTable; 252 mutable std::map<const G4Material*, G4bool, CompareMaterial> fWarningPrinted; 253 254 std::map<G4int /*Material ID*/, 255 G4MolecularConfiguration*> fMaterialToMolecularConf; 256 257 G4bool fIsInitialized; 258 std::size_t fNMaterials; 259 }; 260 261 #endif // G4DNAMolecularMaterial_HH 262