Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/processes/electromagnetic/dna/utils/include/G4DNAMolecularMaterial.hh

Version: [ ReleaseNotes ] [ 1.0 ] [ 1.1 ] [ 2.0 ] [ 3.0 ] [ 3.1 ] [ 3.2 ] [ 4.0 ] [ 4.0.p1 ] [ 4.0.p2 ] [ 4.1 ] [ 4.1.p1 ] [ 5.0 ] [ 5.0.p1 ] [ 5.1 ] [ 5.1.p1 ] [ 5.2 ] [ 5.2.p1 ] [ 5.2.p2 ] [ 6.0 ] [ 6.0.p1 ] [ 6.1 ] [ 6.2 ] [ 6.2.p1 ] [ 6.2.p2 ] [ 7.0 ] [ 7.0.p1 ] [ 7.1 ] [ 7.1.p1 ] [ 8.0 ] [ 8.0.p1 ] [ 8.1 ] [ 8.1.p1 ] [ 8.1.p2 ] [ 8.2 ] [ 8.2.p1 ] [ 8.3 ] [ 8.3.p1 ] [ 8.3.p2 ] [ 9.0 ] [ 9.0.p1 ] [ 9.0.p2 ] [ 9.1 ] [ 9.1.p1 ] [ 9.1.p2 ] [ 9.1.p3 ] [ 9.2 ] [ 9.2.p1 ] [ 9.2.p2 ] [ 9.2.p3 ] [ 9.2.p4 ] [ 9.3 ] [ 9.3.p1 ] [ 9.3.p2 ] [ 9.4 ] [ 9.4.p1 ] [ 9.4.p2 ] [ 9.4.p3 ] [ 9.4.p4 ] [ 9.5 ] [ 9.5.p1 ] [ 9.5.p2 ] [ 9.6 ] [ 9.6.p1 ] [ 9.6.p2 ] [ 9.6.p3 ] [ 9.6.p4 ] [ 10.0 ] [ 10.0.p1 ] [ 10.0.p2 ] [ 10.0.p3 ] [ 10.0.p4 ] [ 10.1 ] [ 10.1.p1 ] [ 10.1.p2 ] [ 10.1.p3 ] [ 10.2 ] [ 10.2.p1 ] [ 10.2.p2 ] [ 10.2.p3 ] [ 10.3 ] [ 10.3.p1 ] [ 10.3.p2 ] [ 10.3.p3 ] [ 10.4 ] [ 10.4.p1 ] [ 10.4.p2 ] [ 10.4.p3 ] [ 10.5 ] [ 10.5.p1 ] [ 10.6 ] [ 10.6.p1 ] [ 10.6.p2 ] [ 10.6.p3 ] [ 10.7 ] [ 10.7.p1 ] [ 10.7.p2 ] [ 10.7.p3 ] [ 10.7.p4 ] [ 11.0 ] [ 11.0.p1 ] [ 11.0.p2 ] [ 11.0.p3, ] [ 11.0.p4 ] [ 11.1 ] [ 11.1.1 ] [ 11.1.2 ] [ 11.1.3 ] [ 11.2 ] [ 11.2.1 ] [ 11.2.2 ] [ 11.3.0 ]

  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