File indexing completed on 2026-09-16 09:10:19
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027 #ifndef G4DNASCAVENGERMATERIAL_HH
0028 #define G4DNASCAVENGERMATERIAL_HH
0029 #include "globals.hh"
0030 #include "G4ios.hh"
0031 #include <map>
0032 #include <vector>
0033 #include "G4VMoleculeCounterInternalBase.hh"
0034 #include "G4VScavengerMaterial.hh"
0035 #include "G4MoleculeTable.hh"
0036 #include "G4ChemEquilibrium.hh"
0037
0038 class G4Material;
0039 class G4MolecularConfiguration;
0040 class G4VChemistryWorld;
0041
0042 class G4DNAScavengerMaterial : public G4VScavengerMaterial
0043 {
0044 public:
0045 using NbMoleculeInTime =
0046 std::map<G4double, int64_t, G4::MoleculeCounter::FixedTimeComparer>;
0047 using MolType = const G4MolecularConfiguration*;
0048 using MaterialMap = std::map<MolType, int64_t>;
0049 using ReactantList = std::vector<MolType>;
0050 using CounterMapType = std::map<MolType, NbMoleculeInTime>;
0051 G4DNAScavengerMaterial() = default;
0052 explicit G4DNAScavengerMaterial(G4VChemistryWorld*);
0053 ~G4DNAScavengerMaterial() override = default;
0054 G4DNAScavengerMaterial(const G4DNAScavengerMaterial& right) = delete;
0055 G4DNAScavengerMaterial& operator=(const G4DNAScavengerMaterial&) = delete;
0056 void Initialize();
0057
0058 void ReduceNumberMoleculePerVolumeUnitForMaterialConf(MolType, G4double);
0059 void AddNumberMoleculePerVolumeUnitForMaterialConf(MolType, G4double);
0060 G4double GetNumberMoleculePerVolumeUnitForMaterialConf(MolType) const;
0061
0062 void AddAMoleculeAtTime(MolType, G4double time,
0063 const G4ThreeVector* position = nullptr,
0064 G4int number = 1);
0065 void RemoveAMoleculeAtTime(MolType, G4double time,
0066 const G4ThreeVector* position = nullptr,
0067 G4int number = 1);
0068
0069 void Reset() override;
0070
0071 void PrintInfo();
0072
0073 MaterialMap::iterator end() { return fScavengerTable.end(); }
0074 MaterialMap::iterator begin() { return fScavengerTable.begin(); }
0075 size_t size() { return fScavengerTable.size(); }
0076
0077 G4bool find(MolType type)
0078 {
0079 auto it = fScavengerTable.find(type);
0080 if(it != fScavengerTable.end())
0081 {
0082 return it->second > 0;
0083 }
0084 return false;
0085 }
0086
0087 void SetCounterAgainstTime() { fCounterAgainstTime = true; }
0088 void SetpH(const G4int& ph);
0089 G4double GetpH();
0090
0091 std::vector<MolType> GetScavengerList() const
0092 {
0093 std::vector<MolType> output;
0094 for(const auto& it : fScavengerTable)
0095 {
0096 output.push_back(it.first);
0097 }
0098 return output;
0099 }
0100
0101 void Dump();
0102 int64_t GetNMoleculesAtTime(MolType molecule, G4double time);
0103 G4bool SearchTimeMap(MolType molecule);
0104 int64_t SearchUpperBoundTime(G4double time, G4bool sameTypeOfMolecule);
0105 void ResetEquilibrium();
0106 G4bool SetEquilibrium(const G4DNAMolecularReactionData* pReaction,
0107 G4double time);
0108 G4bool IsEquilibrium(const G4int& reactionType) const;
0109
0110 private:
0111 G4VChemistryWorld* fpChemistryInfo = nullptr;
0112 G4bool fIsInitialized;
0113 MaterialMap fScavengerTable;
0114 CounterMapType fCounterMap;
0115 G4bool fCounterAgainstTime;
0116 G4int fVerbose;
0117 MolType fH3Op = G4MoleculeTable::Instance()->GetConfiguration("H3Op(B)");
0118 MolType fH2O = G4MoleculeTable::Instance()->GetConfiguration("H2O");
0119 MolType fHOm = G4MoleculeTable::Instance()->GetConfiguration("OHm(B)");
0120 struct Search
0121 {
0122 Search() { fLowerBoundSet = false; }
0123 CounterMapType::iterator fLastMoleculeSearched;
0124 NbMoleculeInTime::iterator fLowerBoundTime;
0125 G4bool fLowerBoundSet;
0126 };
0127
0128 std::unique_ptr<Search> fpLastSearch;
0129 void WaterEquilibrium();
0130
0131 std::map<G4int,std::unique_ptr<G4ChemEquilibrium>> fEquilibriumProcesses;
0132 };
0133 #endif