58 fCheckTimeIsConsistentWithScheduler =
true;
94 if(fpInstance) fpInstance->Initialize();
101 while ((mol_iterator)())
105 fCounterMap[mol_iterator.
value()];
116 if (fpLastSearch.get() == 0)
118 fpLastSearch.reset(
new Search());
122 if (fpLastSearch->fLowerBoundSet &&
123 fpLastSearch->fLastMoleculeSearched->first == molecule)
127 CounterMapType::iterator mol_it = fCounterMap.find(molecule);
128 fpLastSearch->fLastMoleculeSearched = mol_it;
130 if (mol_it != fCounterMap.end())
132 fpLastSearch->fLowerBoundTime = fpLastSearch->fLastMoleculeSearched->second
134 fpLastSearch->fLowerBoundSet =
true;
138 fpLastSearch->fLowerBoundSet =
false;
145 bool sameTypeOfMolecule)
147 CounterMapType::iterator mol_it = fpLastSearch->fLastMoleculeSearched;
148 if (mol_it == fCounterMap.end())
return 0;
151 if (timeMap.empty())
return 0;
153 NbMoleculeAgainstTime::iterator end_time = timeMap.end();
155 if (sameTypeOfMolecule ==
true)
158 if (fpLastSearch->fLowerBoundSet && fpLastSearch->fLowerBoundTime
163 if (fpLastSearch->fLowerBoundTime->first < time)
165 NbMoleculeAgainstTime::iterator upperToLast = fpLastSearch
169 if (upperToLast == end_time)
171 return fpLastSearch->fLowerBoundTime->second;
174 if (upperToLast->first > time)
176 return fpLastSearch->fLowerBoundTime->second;
191 NbMoleculeAgainstTime::iterator up_time_it = timeMap.upper_bound(time);
193 if (up_time_it == end_time)
195 NbMoleculeAgainstTime::reverse_iterator last_time = timeMap.rbegin();
200 return last_time->second;
206 if (up_time_it == timeMap.begin())
218 fpLastSearch->fLowerBoundTime = up_time_it;
219 fpLastSearch->fLowerBoundSet =
true;
223 return fpLastSearch->fLowerBoundTime->second;
229 G4bool sameTypeOfMolecule = SearchTimeMap(molecule);
230 return SearchUpperBoundTime(time, sameTypeOfMolecule);
241 G4cout <<
"G4MoleculeCounter::AddAMoleculeAtTime : " << molecule->
GetName()
245 CounterMapType::iterator counterMap_i =
246 fCounterMap.find(molecule);
248 if (counterMap_i == fCounterMap.end())
252 fCounterMap[molecule][time] = number;
254 else if (counterMap_i->second.empty())
258 counterMap_i->second[time] = number;
263 NbMoleculeAgainstTime::reverse_iterator end = counterMap_i->second.rbegin();
270 if (end->first <= time ||
275 double newValue = end->second + number;
277 counterMap_i->second[time] = newValue;
288 errMsg <<
"Time of species "
289 << molecule->
GetName() <<
" is "
291 <<
" global time is "
294 G4Exception(
"G4MoleculeCounter::RemoveAMoleculeAtTime",
341 G4cout <<
"G4MoleculeCounter::RemoveAMoleculeAtTime : "
346 if(fCheckTimeIsConsistentWithScheduler)
352 errMsg <<
"Time of species "
353 << molecule->
GetName() <<
" is "
355 <<
" global time is "
358 G4Exception(
"G4MoleculeCounter::RemoveAMoleculeAtTime",
366 if (nbMolPerTime.empty())
371 "You are trying to remove molecule " + molecule->
GetName()
372 +
" from the counter while this kind of molecules has not been registered yet";
373 G4Exception(
"G4MoleculeCounter::RemoveAMoleculeAtTime",
"",
380 NbMoleculeAgainstTime::reverse_iterator it = nbMolPerTime.rbegin();
396 if (it == nbMolPerTime.rend())
406 +
" recorded at the time or even before the time asked";
407 G4Exception(
"G4MoleculeCounter::RemoveAMoleculeAtTime",
"",
455 errMsg <<
"Is time going back?? " << molecule->
GetName()
456 <<
" is being removed at time " <<
G4BestUnit(time,
"Time")
457 <<
" while last recorded time was "
459 G4Exception(
"G4MoleculeCounter::RemoveAMoleculeAtTime",
460 "RETURN_TO_THE_FUTUR",
480 double finalN = it->second - number;
486 errMsg <<
"After removal of " << number <<
" species of "
487 << molecule->
GetName() <<
" the final number at time "
488 <<
G4BestUnit(time,
"Time") <<
" is less than zero and so not valid."
489 <<
" Global time is "
491 <<
". Previous selected time is "
494 G4Exception(
"G4MoleculeCounter::RemoveAMoleculeAtTime",
499 nbMolPerTime[time] = finalN;
513 G4cout <<
"Entering in G4MoleculeCounter::RecordMolecules" <<
G4endl;
516 CounterMapType::iterator it;
519 for(it = fCounterMap.begin(); it != fCounterMap.end(); it++)
521 output->push_back(it->first);
532 CounterMapType::iterator it;
533 CounterMapType::const_iterator ite;
535 NbMoleculeAgainstTime::iterator it2;
536 NbMoleculeAgainstTime::const_iterator ite2;
539 for (it = fCounterMap.begin(), ite = fCounterMap.end(); it != ite; ++it)
542 for (it2 = (it->second).begin(), ite2 = (it->second).end(); it2 != ite2;
546 output->insert(it2->first);
578 CounterMapType::iterator it = fCounterMap.begin();
579 CounterMapType::iterator end = fCounterMap.end();
586 NbMoleculeAgainstTime::iterator it2 = it->second.begin();
587 NbMoleculeAgainstTime::iterator end2 = it->second.end();
589 for(;it2!=end2;++it2)
The pointer G4MolecularConfiguration will be shared by all the molecules having the same molecule def...
void PrintState() const
Display the electronic state of the molecule.
int SearchUpperBoundTime(double time, bool sameTypeOfMolecule)
const G4String & GetName() const
Returns the name of the molecule.
std::ostringstream G4ExceptionDescription
static G4MoleculeCounter * GetMoleculeCounter()
virtual void RemoveAMoleculeAtTime(G4MolecularConfiguration *, G4double time, int number=1)
#define G4BestUnit(a, b)
#define G4_USE_G4BESTUNIT_FOR_VERBOSE 1
stdunique_ptr< std::vector< G4MolecularConfiguration * > > RecordedMolecules
static G4Scheduler * Instance()
G4bool SearchTimeMap(G4MolecularConfiguration *molecule)
int GetNMoleculesAtTime(G4MolecularConfiguration *molecule, double time)
RecordedMolecules GetRecordedMolecules()
G4GLOB_DLL std::ostream G4cout
static G4MoleculeCounter * Instance()
static G4MoleculeTable * Instance()
stdunique_ptr< std::set< G4double > > RecordedTimes
static void Use(G4bool flag=true)
virtual void AddAMoleculeAtTime(G4MolecularConfiguration *, G4double time, int number=1)
G4ConfigurationIterator GetConfigurationIterator()
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *comments)
static G4ThreadLocal double fPrecision
static G4ThreadLocal G4MoleculeCounter * fpInstance
const G4MoleculeDefinition * GetDefinition() const
std::map< G4double, G4int, compDoubleWithPrecision > NbMoleculeAgainstTime
static void InitializeInstance()
RecordedTimes GetRecordedTimes()
static const double picosecond
virtual ~G4MoleculeCounter()
void SetTimeSlice(double)
static void DeleteInstance()