54 fCheckTimeIsConsistentWithScheduler =
true;
75 while ((mol_iterator)())
77 if(IsRegistered(mol_iterator.
value()->GetDefinition()) ==
false)
84 fCounterMap[mol_iterator.
value()];
99 if (fpLastSearch.get() == 0)
101 fpLastSearch.reset(
new Search());
105 if (fpLastSearch->fLowerBoundSet &&
106 fpLastSearch->fLastMoleculeSearched->first == molecule)
110 CounterMapType::iterator mol_it = fCounterMap.find(molecule);
111 fpLastSearch->fLastMoleculeSearched = mol_it;
113 if (mol_it != fCounterMap.end())
115 fpLastSearch->fLowerBoundTime = fpLastSearch->fLastMoleculeSearched->second
117 fpLastSearch->fLowerBoundSet =
true;
121 fpLastSearch->fLowerBoundSet =
false;
130 bool sameTypeOfMolecule)
132 CounterMapType::iterator mol_it = fpLastSearch->fLastMoleculeSearched;
133 if (mol_it == fCounterMap.end())
return 0;
136 if (timeMap.empty())
return 0;
138 NbMoleculeAgainstTime::iterator end_time = timeMap.end();
140 if (sameTypeOfMolecule ==
true)
143 if (fpLastSearch->fLowerBoundSet && fpLastSearch->fLowerBoundTime
146 if (fpLastSearch->fLowerBoundTime->first < time)
148 NbMoleculeAgainstTime::iterator upperToLast = fpLastSearch
152 if (upperToLast == end_time)
154 return fpLastSearch->fLowerBoundTime->second;
157 if (upperToLast->first > time)
159 return fpLastSearch->fLowerBoundTime->second;
172 NbMoleculeAgainstTime::iterator up_time_it = timeMap.upper_bound(time);
174 if (up_time_it == end_time)
176 NbMoleculeAgainstTime::reverse_iterator last_time = timeMap.rbegin();
180 return last_time->second;
186 if (up_time_it == timeMap.begin())
198 fpLastSearch->fLowerBoundTime = up_time_it;
199 fpLastSearch->fLowerBoundSet =
true;
203 return fpLastSearch->fLowerBoundTime->second;
211 G4bool sameTypeOfMolecule = SearchTimeMap(molecule);
212 return SearchUpperBoundTime(time, sameTypeOfMolecule);
225 G4cout <<
"G4MoleculeCounter::AddAMoleculeAtTime : " << molecule->
GetName()
229 CounterMapType::iterator counterMap_i =
230 fCounterMap.find(molecule);
232 if (counterMap_i == fCounterMap.end()){
233 fCounterMap[molecule][time] = number;
235 else if (counterMap_i->second.empty()){
236 counterMap_i->second[time] = number;
239 NbMoleculeAgainstTime::reverse_iterator end = counterMap_i->second.rbegin();
241 if (end->first <= time ||
246 double newValue = end->second + number;
247 counterMap_i->second[time] = newValue;
255 errMsg <<
"Time of species "
256 << molecule->
GetName() <<
" is "
258 <<
" global time is "
261 G4Exception(
"G4MoleculeCounter::RemoveAMoleculeAtTime",
281 G4cout <<
"G4MoleculeCounter::RemoveAMoleculeAtTime : "
286 if(fCheckTimeIsConsistentWithScheduler)
292 errMsg <<
"Time of species "
293 << molecule->
GetName() <<
" is "
295 <<
" global time is "
298 G4Exception(
"G4MoleculeCounter::RemoveAMoleculeAtTime",
306 if (nbMolPerTime.empty())
311 "You are trying to remove molecule " + molecule->
GetName()
312 +
" from the counter while this kind of molecules has not been registered yet";
313 G4Exception(
"G4MoleculeCounter::RemoveAMoleculeAtTime",
"",
320 NbMoleculeAgainstTime::reverse_iterator it = nbMolPerTime.rbegin();
322 if (it == nbMolPerTime.rend()){
326 +
" recorded at the time or even before the time asked";
327 G4Exception(
"G4MoleculeCounter::RemoveAMoleculeAtTime",
"",
334 errMsg <<
"Is time going back?? " << molecule->
GetName()
335 <<
" is being removed at time " <<
G4BestUnit(time,
"Time")
336 <<
" while last recorded time was "
338 G4Exception(
"G4MoleculeCounter::RemoveAMoleculeAtTime",
339 "RETURN_TO_THE_FUTUR",
344 double finalN = it->second - number;
349 errMsg <<
"After removal of " << number <<
" species of "
350 << molecule->
GetName() <<
" the final number at time "
351 <<
G4BestUnit(time,
"Time") <<
" is less than zero and so not valid."
352 <<
" Global time is "
354 <<
". Previous selected time is "
357 G4Exception(
"G4MoleculeCounter::RemoveAMoleculeAtTime",
362 nbMolPerTime[time] = finalN;
372 G4cout <<
"Entering in G4MoleculeCounter::RecordMolecules" <<
G4endl;
375 CounterMapType::iterator it;
378 for(it = fCounterMap.begin(); it != fCounterMap.end(); it++)
380 output->push_back(it->first);
393 CounterMapType::iterator it;
394 CounterMapType::const_iterator ite;
396 NbMoleculeAgainstTime::iterator it2;
397 NbMoleculeAgainstTime::const_iterator ite2;
400 for (it = fCounterMap.begin(), ite = fCounterMap.end(); it != ite; ++it)
403 for (it2 = (it->second).begin(), ite2 = (it->second).end(); it2 != ite2;
407 output->insert(it2->first);
442 CounterMapType::iterator it = fCounterMap.begin();
443 CounterMapType::iterator end = fCounterMap.end();
450 NbMoleculeAgainstTime::iterator it2 = it->second.begin();
451 NbMoleculeAgainstTime::iterator end2 = it->second.end();
453 for(;it2!=end2;++it2)
456 <<
" " << it2->second <<
G4endl;
static G4MoleculeTable * Instance()
void AddAMoleculeAtTime(G4MolecularConfiguration *, G4double time, const G4ThreeVector *position=nullptr, int number=1) override
const G4MoleculeDefinition * GetDefinition() const
std::ostringstream G4ExceptionDescription
static G4MoleculeCounter * Instance()
G4ConfigurationIterator GetConfigurationIterator()
RecordedMolecules GetRecordedMolecules()
virtual ~G4MoleculeCounter()
int SearchUpperBoundTime(double time, bool sameTypeOfMolecule)
std::unique_ptr< std::set< G4double > > RecordedTimes
void RemoveAMoleculeAtTime(G4MolecularConfiguration *, G4double time, const G4ThreeVector *position=nullptr, int number=1) override
std::map< G4double, G4int, compDoubleWithPrecision > NbMoleculeAgainstTime
static G4ThreadLocal double fPrecision
void SetTimeSlice(double)
#define G4BestUnit(a, b)
#define G4_USE_G4BESTUNIT_FOR_VERBOSE 1
RecordedTimes GetRecordedTimes()
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *description)
G4bool SearchTimeMap(G4MolecularConfiguration *molecule)
G4GLOB_DLL std::ostream G4cout
std::unique_ptr< std::vector< G4MolecularConfiguration * > > RecordedMolecules
static constexpr double picosecond
const G4String & GetName() const
static G4Scheduler * Instance()
void Initialize() override
int GetNMoleculesAtTime(G4MolecularConfiguration *molecule, double time)