Geant4 11.4.0
Toolkit for the simulation of the passage of particles through matter
Loading...
Searching...
No Matches
G4DNAScavengerMaterial Class Reference

#include <G4DNAScavengerMaterial.hh>

Inheritance diagram for G4DNAScavengerMaterial:

Public Types

using NbMoleculeInTime
using MolType = const G4MolecularConfiguration*
using MaterialMap = std::map<MolType, int64_t>
using ReactantList = std::vector<MolType>
using CounterMapType = std::map<MolType, NbMoleculeInTime>

Public Member Functions

 G4DNAScavengerMaterial ()=default
 G4DNAScavengerMaterial (G4VChemistryWorld *)
 ~G4DNAScavengerMaterial () override=default
 G4DNAScavengerMaterial (const G4DNAScavengerMaterial &right)=delete
G4DNAScavengerMaterialoperator= (const G4DNAScavengerMaterial &)=delete
void Initialize ()
void ReduceNumberMoleculePerVolumeUnitForMaterialConf (MolType, G4double)
void AddNumberMoleculePerVolumeUnitForMaterialConf (MolType, G4double)
G4double GetNumberMoleculePerVolumeUnitForMaterialConf (MolType) const
void AddAMoleculeAtTime (MolType, G4double time, const G4ThreeVector *position=nullptr, G4int number=1)
void RemoveAMoleculeAtTime (MolType, G4double time, const G4ThreeVector *position=nullptr, G4int number=1)
void Reset () override
void PrintInfo ()
MaterialMap::iterator end ()
MaterialMap::iterator begin ()
size_t size ()
G4bool find (MolType type)
void SetCounterAgainstTime ()
void SetpH (const G4int &ph)
G4double GetpH ()
std::vector< MolTypeGetScavengerList () const
void Dump ()
int64_t GetNMoleculesAtTime (MolType molecule, G4double time)
G4bool SearchTimeMap (MolType molecule)
int64_t SearchUpperBoundTime (G4double time, G4bool sameTypeOfMolecule)
void ResetEquilibrium ()
G4bool SetEquilibrium (const G4DNAMolecularReactionData *pReaction, G4double time)
G4bool IsEquilibrium (const G4int &reactionType) const
Public Member Functions inherited from G4VScavengerMaterial
 G4VScavengerMaterial ()=default
virtual ~G4VScavengerMaterial ()=default

Detailed Description

Definition at line 42 of file G4DNAScavengerMaterial.hh.

Member Typedef Documentation

◆ CounterMapType

◆ MaterialMap

using G4DNAScavengerMaterial::MaterialMap = std::map<MolType, int64_t>

Definition at line 48 of file G4DNAScavengerMaterial.hh.

◆ MolType

◆ NbMoleculeInTime

Initial value:
std::map<G4double, int64_t, G4::MoleculeCounter::FixedTimeComparer>

Definition at line 45 of file G4DNAScavengerMaterial.hh.

◆ ReactantList

Definition at line 49 of file G4DNAScavengerMaterial.hh.

Constructor & Destructor Documentation

◆ G4DNAScavengerMaterial() [1/3]

G4DNAScavengerMaterial::G4DNAScavengerMaterial ( )
default

◆ G4DNAScavengerMaterial() [2/3]

G4DNAScavengerMaterial::G4DNAScavengerMaterial ( G4VChemistryWorld * pChemistryInfo)
explicit

Definition at line 45 of file G4DNAScavengerMaterial.cc.

46 : fpChemistryInfo(pChemistryInfo), fIsInitialized(false), fCounterAgainstTime(false), fVerbose(0)
47{
48 Initialize();
49}

◆ ~G4DNAScavengerMaterial()

G4DNAScavengerMaterial::~G4DNAScavengerMaterial ( )
overridedefault

◆ G4DNAScavengerMaterial() [3/3]

G4DNAScavengerMaterial::G4DNAScavengerMaterial ( const G4DNAScavengerMaterial & right)
delete

Member Function Documentation

◆ AddAMoleculeAtTime()

void G4DNAScavengerMaterial::AddAMoleculeAtTime ( MolType molecule,
G4double time,
const G4ThreeVector * position = nullptr,
G4int number = 1 )

Definition at line 208 of file G4DNAScavengerMaterial.cc.

210{
211 if (fVerbose != 0) {
212 G4cout << "G4DNAScavengerMaterial::AddAMoleculeAtTime : " << molecule->GetName()
213 << " at time : " << G4BestUnit(time, "Time") << G4endl;
214 }
215
216 auto counterMap_i = fCounterMap.find(molecule);
217
218 if (counterMap_i == fCounterMap.end()) {
219 fCounterMap[molecule][time] = number;
220 }
221 else if (counterMap_i->second.empty()) {
222 counterMap_i->second[time] = number;
223 }
224 else {
225 auto end = counterMap_i->second.rbegin();
226
227 if (end->first <= time
229 G4double newValue = end->second + number;
230 counterMap_i->second[time] = newValue;
231 if (newValue != (floor)(fScavengerTable[molecule])) // protection
232 {
233 G4String errMsg = "You are trying to add wrong molecule : ";
234 G4cout<< " newValue : "<<newValue<<" " << molecule->GetName()
235 << " at time : " << G4BestUnit(time, "Time")
236 << " with number : " << number
237 <<" (floor)(fScavengerTable[molecule]) : "<<(floor)(fScavengerTable[molecule])
238 << " and the final number is not valid." << G4endl;
239 G4Exception("AddAMoleculeAtTime", "", FatalErrorInArgument, errMsg);
240 }
241 }
242 }
243}
@ FatalErrorInArgument
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *description)
#define G4BestUnit(a, b)
double G4double
Definition G4Types.hh:83
#define G4endl
Definition G4ios.hh:67
G4GLOB_DLL std::ostream G4cout
MaterialMap::iterator end()

Referenced by AddNumberMoleculePerVolumeUnitForMaterialConf().

◆ AddNumberMoleculePerVolumeUnitForMaterialConf()

void G4DNAScavengerMaterial::AddNumberMoleculePerVolumeUnitForMaterialConf ( MolType matConf,
G4double time )

Definition at line 125 of file G4DNAScavengerMaterial.cc.

127{
128 // no change these molecules
129
130 if (fH2O == matConf || fH3Op == matConf || // pH has no change
131 fHOm == matConf)
132 {
133 // G4cout<<"moletype : "<<matConf->GetName()<<G4endl;
134 // kobs is already counted these molecule concentrations
135 return;
136 }
137
138 auto it = fScavengerTable.find(matConf);
139 if (it == fScavengerTable.end()) // matConf must be in fScavengerTable
140 {
141 return;
142 }
143 fScavengerTable[matConf]++;
144
145 if (fCounterAgainstTime) {
146 AddAMoleculeAtTime(matConf, time);
147 }
148}
void AddAMoleculeAtTime(MolType, G4double time, const G4ThreeVector *position=nullptr, G4int number=1)

◆ begin()

MaterialMap::iterator G4DNAScavengerMaterial::begin ( )
inline

Definition at line 74 of file G4DNAScavengerMaterial.hh.

74{ return fScavengerTable.begin(); }

Referenced by G4DNAGillespieDirectMethod::CreateEvents().

◆ Dump()

void G4DNAScavengerMaterial::Dump ( )

Definition at line 304 of file G4DNAScavengerMaterial.cc.

305{
306 auto pConfinedBox = fpChemistryInfo->GetChemistryBoundary();
307 auto V = pConfinedBox->Volume();
308 for (const auto& it : fCounterMap) {
309 auto pReactant = it.first;
310
311 G4cout << " --- > For " << pReactant->GetName() << G4endl;
312
313 for (const auto& it2 : it.second) {
314 G4cout << " " << G4BestUnit(it2.first, "Time") << " "
315 << it2.second / (Avogadro * V * 1.0e-6 /*mm3 to L*/) << G4endl;
316 }
317 }
318}

Referenced by PrintInfo(), and RemoveAMoleculeAtTime().

◆ end()

MaterialMap::iterator G4DNAScavengerMaterial::end ( )
inline

Definition at line 73 of file G4DNAScavengerMaterial.hh.

73{ return fScavengerTable.end(); }

Referenced by AddAMoleculeAtTime().

◆ find()

G4bool G4DNAScavengerMaterial::find ( MolType type)
inline

Definition at line 77 of file G4DNAScavengerMaterial.hh.

78 {
79 auto it = fScavengerTable.find(type);
80 if(it != fScavengerTable.end())
81 {
82 return it->second > 0;
83 }
84 return false;
85 }

Referenced by ReduceNumberMoleculePerVolumeUnitForMaterialConf().

◆ GetNMoleculesAtTime()

int64_t G4DNAScavengerMaterial::GetNMoleculesAtTime ( MolType molecule,
G4double time )

Definition at line 320 of file G4DNAScavengerMaterial.cc.

321{
322 if (!fCounterAgainstTime) {
323 G4cout << "fCounterAgainstTime == false" << G4endl;
324 assert(false);
325 }
326
327 G4bool sameTypeOfMolecule = SearchTimeMap(molecule);
328 auto output = SearchUpperBoundTime(time, sameTypeOfMolecule);
329 if (output < 0) {
331 errMsg << "N molecules not valid < 0 : " << molecule->GetName() << " N : " << output << G4endl;
332 G4Exception("G4DNAScavengerMaterial::GetNMoleculesAtTime", "", FatalErrorInArgument, errMsg);
333 }
334 return output;
335}
std::ostringstream G4ExceptionDescription
bool G4bool
Definition G4Types.hh:86
int64_t SearchUpperBoundTime(G4double time, G4bool sameTypeOfMolecule)
G4bool SearchTimeMap(MolType molecule)

◆ GetNumberMoleculePerVolumeUnitForMaterialConf()

G4double G4DNAScavengerMaterial::GetNumberMoleculePerVolumeUnitForMaterialConf ( MolType matConf) const

Definition at line 80 of file G4DNAScavengerMaterial.cc.

81{
82 // no change these molecules
83 if (fH2O == matConf) {
84 return 0;
85 }
86
87 auto iter = fScavengerTable.find(matConf);
88 if (iter == fScavengerTable.end()) {
89 return 0;
90 }
91
92 if (iter->second >= 1) {
93 return (floor)(iter->second);
94 }
95
96 return 0;
97}

◆ GetpH()

G4double G4DNAScavengerMaterial::GetpH ( )

Definition at line 427 of file G4DNAScavengerMaterial.cc.

428{
429 G4double volumeInLiter = fpChemistryInfo->GetChemistryBoundary()->Volume() / liter;
430 G4double Cion = (G4double)fScavengerTable[fH3Op] / (Avogadro * volumeInLiter);
431 G4double pH = std::log10(Cion);
432 // G4cout<<"OH- : "<<fScavengerTable[fHOm]<<" H3O+ : "<<fScavengerTable[fH3Op]<<" pH :
433 // "<<-pH<<G4endl;
434 if (fScavengerTable[fH3Op] < 0) // protect me
435 {
436 G4Exception("G4DNAScavengerMaterial::GetpH()", "G4DNAScavengerMaterial001", JustWarning,
437 "H3O+ < 0");
438 fScavengerTable[fH3Op] = 0;
439 }
440 if (fScavengerTable[fHOm] < 0) // protect me
441 {
442 G4Exception("G4DNAScavengerMaterial::GetpH()", "G4DNAScavengerMaterial001", JustWarning,
443 "HO- < 0");
444 fScavengerTable[fHOm] = 0;
445 }
446 return -pH;
447}
@ JustWarning

◆ GetScavengerList()

std::vector< MolType > G4DNAScavengerMaterial::GetScavengerList ( ) const
inline

Definition at line 91 of file G4DNAScavengerMaterial.hh.

92 {
93 std::vector<MolType> output;
94 for(const auto& it : fScavengerTable)
95 {
96 output.push_back(it.first);
97 }
98 return output;
99 }

◆ Initialize()

void G4DNAScavengerMaterial::Initialize ( )

Definition at line 53 of file G4DNAScavengerMaterial.cc.

54{
55 if (fIsInitialized) {
56 return;
57 }
58
59 if (fpChemistryInfo->size() == 0) {
60 G4cout << "G4DNAScavengerMaterial existed but empty" << G4endl;
61 }
62 Reset();
63
64 fEquilibriumProcesses.emplace(
65 std::make_pair(6, std::make_unique<G4ChemEquilibrium>(6, 10 * CLHEP::us)));//reactionType6 and 10 * us
66 fEquilibriumProcesses.emplace(
67 std::make_pair(7, std::make_unique<G4ChemEquilibrium>(7, 10 * CLHEP::us)));//reactionType6 and 10 * us
68 fEquilibriumProcesses.emplace(
69 std::make_pair(8, std::make_unique<G4ChemEquilibrium>(8, 10 * CLHEP::us)));//reactionType6 and 10 * us
70 for(auto& it : fEquilibriumProcesses)
71 {
72 it.second->Initialize();
73 it.second->SetVerbose(fVerbose);
74 }
75
76 fIsInitialized = true;
77}

Referenced by G4DNAScavengerMaterial().

◆ IsEquilibrium()

G4bool G4DNAScavengerMaterial::IsEquilibrium ( const G4int & reactionType) const

Definition at line 469 of file G4DNAScavengerMaterial.cc.

470{
471 auto reaction = fEquilibriumProcesses.find(reactionType);
472 if(reaction == fEquilibriumProcesses.end())
473 {
474 return true;
475 }else
476 {
477 return (reaction->second->GetEquilibriumStatus());
478 }
479
480}

◆ operator=()

G4DNAScavengerMaterial & G4DNAScavengerMaterial::operator= ( const G4DNAScavengerMaterial & )
delete

◆ PrintInfo()

void G4DNAScavengerMaterial::PrintInfo ( )

Definition at line 150 of file G4DNAScavengerMaterial.cc.

151{
152 auto pConfinedBox = fpChemistryInfo->GetChemistryBoundary();
153 auto iter = fpChemistryInfo->begin();
154 G4cout << "**************************************************************" << G4endl;
155 for (; iter != fpChemistryInfo->end(); iter++) {
156 auto containedConf = iter->first;
157 // auto concentration = iter->second;
158 auto concentration = fScavengerTable[containedConf] / (Avogadro * pConfinedBox->Volume());
159 G4cout << "Scavenger:" << containedConf->GetName() << " : "
160 << concentration / 1.0e-6 /*mm3 to L*/ << " (M) with : "
161 << fScavengerTable[containedConf] << " (molecules)"
162 << "in: " << pConfinedBox->Volume() / (um * um * um) << " (um3)" << G4endl;
163 if (fScavengerTable[containedConf] < 1) {
164 G4cout << "!!!!!!!!!!!!! this molecule has less one molecule for "
165 "considered volume"
166 << G4endl;
167 // assert(false);
168 }
169 if (fVerbose != 0) {
170 Dump();
171 }
172 }
173 G4cout << "**************************************************************" << G4endl;
174}

Referenced by Reset().

◆ ReduceNumberMoleculePerVolumeUnitForMaterialConf()

void G4DNAScavengerMaterial::ReduceNumberMoleculePerVolumeUnitForMaterialConf ( MolType matConf,
G4double time )

Definition at line 99 of file G4DNAScavengerMaterial.cc.

101{
102 // no change these molecules
103 if (fH2O == matConf || fH3Op == matConf || // suppose that pH is not changed during simu
104 fHOm == matConf)
105 {
106 // G4cout<<"moletype : "<<matConf->GetName()<<G4endl;
107 // kobs is already counted these molecule concentrations
108 return;
109 }
110 if (!find(matConf)) // matConf must greater than 0
111 {
112 return;
113 }
114 fScavengerTable[matConf]--;
115 if (fScavengerTable[matConf] < 0) // projection
116 {
117 assert(false);
118 }
119
120 if (fCounterAgainstTime) {
121 RemoveAMoleculeAtTime(matConf, time);
122 }
123}
void RemoveAMoleculeAtTime(MolType, G4double time, const G4ThreeVector *position=nullptr, G4int number=1)

◆ RemoveAMoleculeAtTime()

void G4DNAScavengerMaterial::RemoveAMoleculeAtTime ( MolType pMolecule,
G4double time,
const G4ThreeVector * position = nullptr,
G4int number = 1 )

Definition at line 247 of file G4DNAScavengerMaterial.cc.

249{
250 NbMoleculeInTime& nbMolPerTime = fCounterMap[pMolecule];
251
252 if (fVerbose != 0) {
253 auto it_ = nbMolPerTime.rbegin();
254 G4cout << "G4DNAScavengerMaterial::RemoveAMoleculeAtTime : " << pMolecule->GetName()
255 << " at time : " << G4BestUnit(time, "Time")
256
257 << " form : " << it_->second << G4endl;
258 }
259
260 if (nbMolPerTime.empty()) {
261 Dump();
262 G4String errMsg = "You are trying to remove molecule " +
263 pMolecule->GetName() +
264 " from the counter while this kind of molecules has not "
265 "been registered yet";
266 G4Exception("G4DNAScavengerMaterial::RemoveAMoleculeAtTime", "", FatalErrorInArgument, errMsg);
267
268 return;
269 }
270
271 auto it = nbMolPerTime.rbegin();
272
273 if (it == nbMolPerTime.rend()) {
274 it--;
275
276 G4String errMsg = "There was no " + pMolecule->GetName()
277 + " recorded at the time or even before the time asked";
278 G4Exception("G4DNAScavengerMaterial::RemoveAMoleculeAtTime", "", FatalErrorInArgument, errMsg);
279 }
280
281 G4double finalN = it->second - number;
282 if (finalN < 0) {
283 Dump();
284
285 G4cout << "fScavengerTable : " << pMolecule->GetName() << " : " << (fScavengerTable[pMolecule])
286 << G4endl;
287
289 errMsg << "After removal of " << number << " species of "
290 << " " << it->second << " " << pMolecule->GetName() << " the final number at time "
291 << G4BestUnit(time, "Time") << " is less than zero and so not valid." << G4endl;
292 G4cout << " Global time is " << G4BestUnit(G4Scheduler::Instance()->GetGlobalTime(), "Time")
293 << ". Previous selected time is " << G4BestUnit(it->first, "Time") << G4endl;
294 G4Exception("G4DNAScavengerMaterial::RemoveAMoleculeAtTime", "N_INF_0", FatalException, errMsg);
295 }
296 nbMolPerTime[time] = finalN;
297
298 if (finalN != (floor)(fScavengerTable[pMolecule])) // protection
299 {
300 assert(false);
301 }
302}
@ FatalException
std::map< G4double, int64_t, G4::MoleculeCounter::FixedTimeComparer > NbMoleculeInTime
static G4Scheduler * Instance()

Referenced by ReduceNumberMoleculePerVolumeUnitForMaterialConf().

◆ Reset()

void G4DNAScavengerMaterial::Reset ( )
overridevirtual

Implements G4VScavengerMaterial.

Definition at line 176 of file G4DNAScavengerMaterial.cc.

177{
178 if (fpChemistryInfo == nullptr) {
179 return;
180 }
181
182 if (fpChemistryInfo->size() == 0) {
183 return;
184 }
185
187
188 fScavengerTable.clear();
189 fCounterMap.clear();
190 fpLastSearch.reset(nullptr);
191
192 auto pConfinedBox = fpChemistryInfo->GetChemistryBoundary();
193 auto iter = fpChemistryInfo->begin();
194 for (; iter != fpChemistryInfo->end(); iter++) {
195 auto containedConf = iter->first;
196 auto concentration = iter->second;
197 fScavengerTable[containedConf] = floor(Avogadro * concentration * pConfinedBox->Volume());
198 fCounterMap[containedConf][1 * picosecond] =
199 floor(Avogadro * concentration * pConfinedBox->Volume());
200 }
201 if (fVerbose != 0) {
202 PrintInfo();
203 }
204}

Referenced by Initialize().

◆ ResetEquilibrium()

void G4DNAScavengerMaterial::ResetEquilibrium ( )

Definition at line 461 of file G4DNAScavengerMaterial.cc.

462{
463 for(auto& it : fEquilibriumProcesses)
464 {
465 it.second->Reset();
466 }
467}

Referenced by Reset().

◆ SearchTimeMap()

G4bool G4DNAScavengerMaterial::SearchTimeMap ( MolType molecule)

Definition at line 337 of file G4DNAScavengerMaterial.cc.

338{
339 if (fpLastSearch == nullptr) {
340 fpLastSearch = std::make_unique<Search>();
341 }
342 else {
343 if (fpLastSearch->fLowerBoundSet && fpLastSearch->fLastMoleculeSearched->first == molecule) {
344 return true;
345 }
346 }
347
348 auto mol_it = fCounterMap.find(molecule);
349 fpLastSearch->fLastMoleculeSearched = mol_it;
350
351 if (mol_it != fCounterMap.end()) {
352 fpLastSearch->fLowerBoundTime = fpLastSearch->fLastMoleculeSearched->second.end();
353 fpLastSearch->fLowerBoundSet = true;
354 }
355 else {
356 fpLastSearch->fLowerBoundSet = false;
357 }
358
359 return false;
360}

Referenced by GetNMoleculesAtTime().

◆ SearchUpperBoundTime()

int64_t G4DNAScavengerMaterial::SearchUpperBoundTime ( G4double time,
G4bool sameTypeOfMolecule )

Definition at line 364 of file G4DNAScavengerMaterial.cc.

365{
366 auto mol_it = fpLastSearch->fLastMoleculeSearched;
367 if (mol_it == fCounterMap.end()) {
368 return 0;
369 }
370
371 NbMoleculeInTime& timeMap = mol_it->second;
372 if (timeMap.empty()) {
373 return 0;
374 }
375
376 if (sameTypeOfMolecule) {
377 if (fpLastSearch->fLowerBoundSet && fpLastSearch->fLowerBoundTime != timeMap.end()) {
378 if (fpLastSearch->fLowerBoundTime->first < time) {
379 auto upperToLast = fpLastSearch->fLowerBoundTime;
380 upperToLast++;
381
382 if (upperToLast == timeMap.end()) {
383 return fpLastSearch->fLowerBoundTime->second;
384 }
385
386 if (upperToLast->first > time) {
387 return fpLastSearch->fLowerBoundTime->second;
388 }
389 }
390 }
391 }
392
393 auto up_time_it = timeMap.upper_bound(time);
394
395 if (up_time_it == timeMap.end()) {
396 auto last_time = timeMap.rbegin();
397 return last_time->second;
398 }
399 if (up_time_it == timeMap.begin()) {
400 return 0;
401 }
402
403 up_time_it--;
404
405 fpLastSearch->fLowerBoundTime = up_time_it;
406 fpLastSearch->fLowerBoundSet = true;
407
408 return fpLastSearch->fLowerBoundTime->second;
409}

Referenced by GetNMoleculesAtTime().

◆ SetCounterAgainstTime()

void G4DNAScavengerMaterial::SetCounterAgainstTime ( )
inline

Definition at line 87 of file G4DNAScavengerMaterial.hh.

87{ fCounterAgainstTime = true; }

◆ SetEquilibrium()

G4bool G4DNAScavengerMaterial::SetEquilibrium ( const G4DNAMolecularReactionData * pReaction,
G4double time )

Definition at line 449 of file G4DNAScavengerMaterial.cc.

451{
452 for(auto& it : fEquilibriumProcesses)
453 {
454 it.second->SetGlobalTime(time);
455 it.second->SetEquilibrium(pReaction);
456 if(it.second->IsStatusChanged()) return true;
457 }
458 return false;
459}

◆ SetpH()

void G4DNAScavengerMaterial::SetpH ( const G4int & ph)

Definition at line 420 of file G4DNAScavengerMaterial.cc.

421{
422 auto volume = fpChemistryInfo->GetChemistryBoundary()->Volume();
423 fScavengerTable[fH3Op] = floor(Avogadro * std::pow(10, -ph) * volume / liter);
424 fScavengerTable[fHOm] = floor(Avogadro * std::pow(10, -(14 - ph)) * volume / liter);
425}

◆ size()

size_t G4DNAScavengerMaterial::size ( )
inline

Definition at line 75 of file G4DNAScavengerMaterial.hh.

75{ return fScavengerTable.size(); }

The documentation for this class was generated from the following files: