29#ifndef G4MOLECULECOUNTERMANAGER_HH
30#define G4MOLECULECOUNTERMANAGER_HH 1
55 explicit Private() =
default;
63 G4bool fInstancesRegistered{
false};
64 void RegisterInstance();
83 void InitializeMaster();
84 void InitializeWorker();
139 static std::vector<const G4MoleculeCounterManager*> fWorkerInstances;
142 std::unique_ptr<G4MoleculeCounterManagerMessenger> fpMessenger;
147 static std::atomic<G4bool> fResetCountersBeforeEvent;
148 static std::atomic<G4bool> fResetCountersBeforeRun;
149 static std::atomic<G4bool> fResetMasterCounterWithWorkers;
150 static std::atomic<G4bool> fAccumulateCounterIntoMaster;
152 std::map<G4int, G4VMoleculeCounter*> fCounters{};
153 std::map<G4int, G4VMoleculeReactionCounter*> fReactionCounters{};
176 template<
typename T = G4VMoleculeCounter>
183 template<
typename T = G4VMoleculeReactionCounter>
188 static std::atomic<G4bool> fBeginOfRunTriggered;
196 std::function<
G4int()> idProvider)
201 if (fVerbosity > 0) {
202 G4cout <<
"G4MoleculeCounterManager::RegisterCounter ("
206 if (counter->GetManagedId() >= 0) {
208 description <<
"Trying to add a counter whose id was already altered to be non-negative!\n";
209 description <<
" Id: " << counter->GetManagedId() <<
"\n";
210 description <<
"Name: " << counter->GetName();
215 T*
sp = counter.release();
217 sp->SetManagedId(idProvider());
219 map.emplace(
sp->GetManagedId(), sp);
221 return sp->GetManagedId();
229 static_assert(std::is_base_of<G4VMoleculeCounter, T>::value,
230 "T must be derived from G4VMoleculeCounter!");
232 if (base_ptr ==
nullptr)
return nullptr;
233 const T* ptr =
dynamic_cast<const T*
>(base_ptr);
240 static_assert(std::is_base_of<G4VMoleculeReactionCounter, T>::value,
241 "T must be derived from G4VMoleculeReactionCounter!");
243 if (base_ptr ==
nullptr)
return nullptr;
244 const T* ptr =
dynamic_cast<const T*
>(base_ptr);
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *description)
std::ostringstream G4ExceptionDescription
G4GLOB_DLL std::ostream G4cout
void ActivateReactionCounterAtTimes(G4int, G4double, G4double, G4bool=true, G4bool=true)
G4MoleculeCounterManager(Private)
void BroadcastIgnoreMolecule(const G4MoleculeDefinition *)
void DumpMasterCounters() const
G4int GetVerbosity() const
const T * GetMoleculeReactionCounter(G4int) const
void BroadcastRegisterAllMoleculesAndReactants()
G4bool GetResetCountersBeforeRun() const
void DeregisterAllCounters()
void RecordReaction(const G4DNAMolecularReactionData *, G4double, G4int=1)
void EndOfEventAction(const G4Event *)
void BeginOfRunAction(const G4Run *)
void SetResetMasterCounterWithWorkers(G4bool=true)
void EndOfRunAction(const G4Run *)
void AddMoleculeWithoutTrack(const G4MolecularConfiguration *, G4double, G4int=1)
G4int RegisterCounter(std::unique_ptr< G4VMoleculeCounter >)
G4VMoleculeReactionCounter * GetEditableMoleculeReactionCounter(G4int) const
void SetAccumulateCounterIntoMaster(G4bool=true)
void AddMolecule(const G4Track *, G4double, G4int=1)
void BeginOfEventAction(const G4Event *)
void RemoveMoleculeWithoutTrack(const G4MolecularConfiguration *, G4double, G4int=1)
static G4MoleculeCounterManager * GetInstanceIfExists()
G4VMoleculeCounter * GetEditableMoleculeCounter(G4int) const
G4bool GetResetMasterCounterWithWorkers() const
void AbsorbWorkerManagerCounters(const G4MoleculeCounterManager *=nullptr)
static G4MoleculeCounterManager * Instance()
void ActivateCounterAtTimes(G4int, G4double, G4double, G4bool=true, G4bool=true)
static void DeleteInstance()
G4bool GetAccumulateCounterIntoMaster() const
void NotifyOfStep(const G4Step *)
void SetVerbosity(G4int v)
std::vector< const G4VMoleculeReactionCounter * > GetMoleculeReactionCounters() const
void SetResetCountersBeforeRun(G4bool=true)
G4bool GetIsActive() const
void DumpWorkerCounters() const
G4bool GetResetCountersBeforeEvent() const
~G4MoleculeCounterManager()
void RemoveMolecule(const G4Track *, G4double, G4int=1)
void SetIsActive(G4bool flag)
void SetResetCountersBeforeEvent(G4bool=true)
const T * GetMoleculeCounter(G4int) const
void BroadcastIgnoreReactant(const G4MolecularConfiguration *)
std::vector< const G4VMoleculeCounter * > GetMoleculeCounters() const
#define G4ThreadLocalStatic