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

#include <G4WorkerRunManager.hh>

+ Inheritance diagram for G4WorkerRunManager:

Public Types

using ProfilerConfig = G4ProfilerConfig< G4ProfileType::Run >
 
- Public Types inherited from G4RunManager
enum  RMType { sequentialRM , masterRM , workerRM }
 
using ProfilerConfig = G4ProfilerConfig< G4ProfileType::Run >
 

Public Member Functions

 G4WorkerRunManager ()
 
 ~G4WorkerRunManager ()
 
virtual void InitializeGeometry ()
 
virtual void RunInitialization ()
 
virtual void DoEventLoop (G4int n_event, const char *macroFile=0, G4int n_select=-1)
 
virtual void ProcessOneEvent (G4int i_event)
 
virtual G4EventGenerateEvent (G4int i_event)
 
virtual void RunTermination ()
 
virtual void TerminateEventLoop ()
 
virtual void DoWork ()
 
void SetWorkerThread (G4WorkerThread *wc)
 
virtual void SetUserInitialization (G4VUserPhysicsList *userInit)
 
virtual void SetUserInitialization (G4VUserDetectorConstruction *userInit)
 
virtual void SetUserInitialization (G4VUserActionInitialization *userInit)
 
virtual void SetUserInitialization (G4UserWorkerInitialization *userInit)
 
virtual void SetUserInitialization (G4UserWorkerThreadInitialization *userInit)
 
virtual void SetUserAction (G4UserRunAction *userAction)
 
virtual void SetUserAction (G4VUserPrimaryGeneratorAction *userAction)
 
virtual void SetUserAction (G4UserEventAction *userAction)
 
virtual void SetUserAction (G4UserStackingAction *userAction)
 
virtual void SetUserAction (G4UserTrackingAction *userAction)
 
virtual void SetUserAction (G4UserSteppingAction *userAction)
 
virtual void RestoreRndmEachEvent (G4bool flag)
 
- Public Member Functions inherited from G4RunManager
 G4RunManager ()
 
virtual ~G4RunManager ()
 
 G4RunManager (const G4RunManager &)=delete
 
G4RunManageroperator= (const G4RunManager &)=delete
 
virtual void BeamOn (G4int n_event, const char *macroFile=nullptr, G4int n_select=-1)
 
virtual void Initialize ()
 
virtual void DefineWorldVolume (G4VPhysicalVolume *worldVol, G4bool topologyIsChanged=true)
 
virtual void AbortRun (G4bool softAbort=false)
 
virtual void AbortEvent ()
 
virtual void InitializeGeometry ()
 
virtual void InitializePhysics ()
 
virtual G4bool ConfirmBeamOnCondition ()
 
virtual void RunInitialization ()
 
virtual void DoEventLoop (G4int n_event, const char *macroFile=nullptr, G4int n_select=-1)
 
virtual void RunTermination ()
 
virtual void InitializeEventLoop (G4int n_event, const char *macroFile=nullptr, G4int n_select=-1)
 
virtual void ProcessOneEvent (G4int i_event)
 
virtual void TerminateOneEvent ()
 
virtual void TerminateEventLoop ()
 
virtual G4EventGenerateEvent (G4int i_event)
 
virtual void AnalyzeEvent (G4Event *anEvent)
 
virtual void ConfigureProfilers (const std::vector< std::string > &args={})
 
void ConfigureProfilers (G4int argc, char **argv)
 
virtual void SetNumberOfThreads (G4int)
 
virtual G4int GetNumberOfThreads () const
 
void DumpRegion (const G4String &rname) const
 
void DumpRegion (G4Region *region=nullptr) const
 
void GeometryHasBeenModified (G4bool prop=true)
 
void ReinitializeGeometry (G4bool destroyFirst=false, G4bool prop=true)
 
void PhysicsHasBeenModified ()
 
void CutOffHasBeenModified ()
 
void ReOptimizeMotherOf (G4VPhysicalVolume *)
 
void ReOptimize (G4LogicalVolume *)
 
void SetGeometryToBeOptimized (G4bool vl)
 
G4bool GetGeometryToBeOptimized ()
 
void GeometryDirectlyUpdated (G4bool val=true)
 
virtual void ConstructScoringWorlds ()
 
virtual void rndmSaveThisRun ()
 
virtual void rndmSaveThisEvent ()
 
virtual void RestoreRandomNumberStatus (const G4String &fileN)
 
virtual void RestoreRndmEachEvent (G4bool)
 
virtual void SetUserInitialization (G4VUserDetectorConstruction *userInit)
 
virtual void SetUserInitialization (G4VUserPhysicsList *userInit)
 
virtual void SetUserInitialization (G4VUserActionInitialization *userInit)
 
virtual void SetUserInitialization (G4UserWorkerInitialization *userInit)
 
virtual void SetUserInitialization (G4UserWorkerThreadInitialization *userInit)
 
virtual void SetUserAction (G4UserRunAction *userAction)
 
virtual void SetUserAction (G4VUserPrimaryGeneratorAction *userAction)
 
virtual void SetUserAction (G4UserEventAction *userAction)
 
virtual void SetUserAction (G4UserStackingAction *userAction)
 
virtual void SetUserAction (G4UserTrackingAction *userAction)
 
virtual void SetUserAction (G4UserSteppingAction *userAction)
 
const G4VUserDetectorConstructionGetUserDetectorConstruction () const
 
const G4VUserPhysicsListGetUserPhysicsList () const
 
const G4VUserActionInitializationGetUserActionInitialization () const
 
G4VUserActionInitializationGetNonConstUserActionInitialization () const
 
const G4UserWorkerInitializationGetUserWorkerInitialization () const
 
const G4UserWorkerThreadInitializationGetUserWorkerThreadInitialization () const
 
const G4UserRunActionGetUserRunAction () const
 
const G4VUserPrimaryGeneratorActionGetUserPrimaryGeneratorAction () const
 
const G4UserEventActionGetUserEventAction () const
 
const G4UserStackingActionGetUserStackingAction () const
 
const G4UserTrackingActionGetUserTrackingAction () const
 
const G4UserSteppingActionGetUserSteppingAction () const
 
void SetNumberOfAdditionalWaitingStacks (G4int iAdd)
 
const G4StringGetVersionString () const
 
void SetPrimaryTransformer (G4PrimaryTransformer *pt)
 
void StoreRandomNumberStatusToG4Event (G4int vl)
 
G4int GetFlagRandomNumberStatusToG4Event () const
 
void SetRandomNumberStore (G4bool flag)
 
G4bool GetRandomNumberStore () const
 
void SetRandomNumberStoreDir (const G4String &dir)
 
const G4StringGetRandomNumberStoreDir () const
 
const G4StringGetRandomNumberStatusForThisRun () const
 
const G4StringGetRandomNumberStatusForThisEvent () const
 
void SetRandomNumberStorePerEvent (G4bool flag)
 
G4bool GetRandomNumberStorePerEvent () const
 
void SetVerboseLevel (G4int vl)
 
G4int GetVerboseLevel () const
 
G4int GetPrintProgress ()
 
void SetPrintProgress (G4int i)
 
void SetNumberOfEventsToBeStored (G4int val)
 
const G4RunGetCurrentRun () const
 
G4RunGetNonConstCurrentRun () const
 
const G4EventGetCurrentEvent () const
 
const G4EventGetPreviousEvent (G4int i) const
 
void SetRunIDCounter (G4int i)
 
G4int GetNumberOfParallelWorld () const
 
void SetNumberOfEventsToBeProcessed (G4int val)
 
G4int GetNumberOfEventsToBeProcessed () const
 
G4int GetNumberOfSelectEvents () const
 
const G4StringGetSelectMacro () const
 
void SetDCtable (G4DCtable *DCtbl)
 
RMType GetRunManagerType () const
 

Static Public Member Functions

static G4WorkerRunManagerGetWorkerRunManager ()
 
static G4WorkerRunManagerKernelGetWorkerRunManagerKernel ()
 
- Static Public Member Functions inherited from G4RunManager
static G4RunManagerGetRunManager ()
 
static G4bool IfGeometryHasBeenDestroyed ()
 

Protected Member Functions

virtual void ConstructScoringWorlds ()
 
virtual void StoreRNGStatus (const G4String &filenamePrefix)
 
virtual void rndmSaveThisRun ()
 
virtual void rndmSaveThisEvent ()
 
virtual void MergePartialResults ()
 
- Protected Member Functions inherited from G4RunManager
 G4RunManager (RMType rmType)
 
void CleanUpPreviousEvents ()
 
void CleanUpUnnecessaryEvents (G4int keepNEvents)
 
void StackPreviousEvent (G4Event *anEvent)
 
virtual void StoreRNGStatus (const G4String &filenamePrefix)
 
void UpdateScoring ()
 
virtual void DeleteUserInitializations ()
 

Protected Attributes

G4WorkerThreadworkerContext = nullptr
 
G4bool eventLoopOnGoing = false
 
G4bool runIsSeeded = false
 
G4int nevModulo = -1
 
G4int currEvID = -1
 
G4int luxury = -1
 
G4SeedsQueue seedsQueue
 
G4bool readStatusFromFile = false
 
- Protected Attributes inherited from G4RunManager
G4RunManagerKernelkernel = nullptr
 
G4EventManagereventManager = nullptr
 
G4VUserDetectorConstructionuserDetector = nullptr
 
G4VUserPhysicsListphysicsList = nullptr
 
G4VUserActionInitializationuserActionInitialization = nullptr
 
G4UserWorkerInitializationuserWorkerInitialization = nullptr
 
G4UserWorkerThreadInitializationuserWorkerThreadInitialization = nullptr
 
G4UserRunActionuserRunAction = nullptr
 
G4VUserPrimaryGeneratorActionuserPrimaryGeneratorAction = nullptr
 
G4UserEventActionuserEventAction = nullptr
 
G4UserStackingActionuserStackingAction = nullptr
 
G4UserTrackingActionuserTrackingAction = nullptr
 
G4UserSteppingActionuserSteppingAction = nullptr
 
G4bool geometryInitialized = false
 
G4bool physicsInitialized = false
 
G4bool runAborted = false
 
G4bool initializedAtLeastOnce = false
 
G4bool geometryToBeOptimized = true
 
G4int runIDCounter = 0
 
G4int verboseLevel = 0
 
G4int printModulo = -1
 
G4Timertimer = nullptr
 
G4DCtableDCtable = nullptr
 
G4RuncurrentRun = nullptr
 
G4EventcurrentEvent = nullptr
 
std::list< G4Event * > * previousEvents = nullptr
 
G4int n_perviousEventsToBeStored = 0
 
G4int numberOfEventToBeProcessed = 0
 
G4bool storeRandomNumberStatus = false
 
G4int storeRandomNumberStatusToG4Event = 0
 
G4String randomNumberStatusDir = "./"
 
G4String randomNumberStatusForThisRun = ""
 
G4String randomNumberStatusForThisEvent = ""
 
G4bool rngStatusEventsFlag = false
 
G4VPhysicalVolumecurrentWorld = nullptr
 
G4int nParallelWorlds = 0
 
G4String msgText = " "
 
G4int n_select_msg = -1
 
G4int numberOfEventProcessed = 0
 
G4String selectMacro = ""
 
G4bool fakeRun = false
 
G4bool isScoreNtupleWriter = false
 
G4bool geometryDirectlyUpdated = false
 
RMType runManagerType
 

Additional Inherited Members

- Static Protected Attributes inherited from G4RunManager
static G4RUN_DLL G4bool fGeometryHasBeenDestroyed = false
 

Detailed Description

Definition at line 48 of file G4WorkerRunManager.hh.

Member Typedef Documentation

◆ ProfilerConfig

Constructor & Destructor Documentation

◆ G4WorkerRunManager()

G4WorkerRunManager::G4WorkerRunManager ( )

Definition at line 74 of file G4WorkerRunManager.cc.

76{
77 // This constructor should never be called in non-multithreaded mode
78
79#ifndef G4MULTITHREADED
81 msg << "Geant4 code is compiled without multi-threading support "
82 "(-DG4MULTITHREADED "
83 "is set to off).";
84 msg << " This type of RunManager can only be used in mult-threaded "
85 "applications.";
86 G4Exception("G4WorkerRunManager::G4WorkerRunManager()", "Run0103",
87 FatalException, msg);
88#endif
91 if(masterScM != nullptr)
92 G4ScoringManager::GetScoringManager(); // TLS instance for a worker
93
94 // Properly initialise luxury level for Ranlux* engines...
95 //
96 if(dynamic_cast<const CLHEP::Ranlux64Engine*>(G4Random::getTheEngine()))
97 {
99 dynamic_cast<const CLHEP::Ranlux64Engine*>(G4Random::getTheEngine());
100 luxury = theEngine->getLuxury();
101 }
102 else if(dynamic_cast<const CLHEP::RanluxEngine*>(G4Random::getTheEngine()))
103 {
105 dynamic_cast<const CLHEP::RanluxEngine*>(G4Random::getTheEngine());
106 luxury = theEngine->getLuxury();
107 }
108
110
111#ifdef G4MULTITHREADED
113 if(pVVis != nullptr)
114 {
115 pVVis->SetUpForAThread();
116 visIsSetUp = true;
117 }
118#endif
119}
@ FatalException
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *description)
Definition: G4Exception.cc:59
std::ostringstream G4ExceptionDescription
Definition: G4Exception.hh:40
std::shared_ptr< HepRandomEngine > theEngine
Definition: Random.cc:76
static G4ScoringManager * GetMasterScoringManager()
static G4ParticleTable * GetParticleTable()
void WorkerG4ParticleTable()
static G4ScoringManager * GetScoringManager()
void SetIgnoreCmdNotFound(G4bool val)
Definition: G4UImanager.hh:229
static G4UImanager * GetUIpointer()
Definition: G4UImanager.cc:77
static G4VVisManager * GetConcreteInstance()

◆ ~G4WorkerRunManager()

G4WorkerRunManager::~G4WorkerRunManager ( )

Definition at line 122 of file G4WorkerRunManager.cc.

123{
124 // Delete thread-local data process manager objects
125 if(physicsList)
126 {
127 // physicsList->TerminateWorker();
128 // physicsList->RemoveProcessManager();
129 }
130
131 // Put these pointers to zero: owned by master thread
132 // If not to zero, the base class destructor will attempt to
133 // delete them
134 userDetector = nullptr;
135 userWorkerInitialization = nullptr;
137 userActionInitialization = nullptr;
138 physicsList = nullptr;
139 if(verboseLevel > 1)
140 G4cout << "Destroying WorkerRunManager (" << this << ")" << G4endl;
141}
#define G4endl
Definition: G4ios.hh:57
G4GLOB_DLL std::ostream G4cout
G4UserWorkerInitialization * userWorkerInitialization
G4UserWorkerThreadInitialization * userWorkerThreadInitialization
G4int verboseLevel
G4VUserActionInitialization * userActionInitialization
G4VUserDetectorConstruction * userDetector
G4VUserPhysicsList * physicsList

Member Function Documentation

◆ ConstructScoringWorlds()

void G4WorkerRunManager::ConstructScoringWorlds ( )
protectedvirtual

Reimplemented from G4RunManager.

Definition at line 539 of file G4WorkerRunManager.cc.

540{
541 using MeshShape = G4VScoringMesh::MeshShape;
542
543 // Return if unnecessary
545 if(ScM == nullptr)
546 return;
547 G4int nPar = (G4int)ScM->GetNumberOfMesh();
548 if(nPar < 1)
549 return;
550
551 // Update thread-local G4TransportationManager of all the world volumes
553
555
557
558 for(G4int iw = 0; iw < nPar; ++iw)
559 {
560 G4VScoringMesh* mesh = ScM->GetMesh(iw);
563 G4VPhysicalVolume* pWorld = nullptr;
564 if(mesh->GetShape() != MeshShape::realWorldLogVol)
565 {
567 ->IsWorldExisting(ScM->GetWorldName(iw));
568 if(pWorld == nullptr)
569 {
571 ed << "Mesh name <" << ScM->GetWorldName(iw)
572 << "> is not found in the master thread.";
573 G4Exception("G4WorkerRunManager::ConstructScoringWorlds()", "RUN79001",
574 FatalException, ed);
575 }
576 }
577 if(!(mesh->GetMeshElementLogical()))
578 {
579 G4AutoLock l(&ConstructScoringWorldsMutex);
580 G4VScoringMesh* masterMesh = masterScM->GetMesh(iw);
581 mesh->SetMeshElementLogical(masterMesh->GetMeshElementLogical());
582 l.unlock();
583
584 if(mesh->GetShape() != MeshShape::realWorldLogVol)
585 {
586 G4ParallelWorldProcess* theParallelWorldProcess =
588 if(theParallelWorldProcess != nullptr)
589 {
590 theParallelWorldProcess->SetParallelWorld(ScM->GetWorldName(iw));
591 }
592 else
593 {
594 theParallelWorldProcess =
596 mesh->SetParallelWorldProcess(theParallelWorldProcess);
597 theParallelWorldProcess->SetParallelWorld(ScM->GetWorldName(iw));
598
599 particleIterator->reset();
600 while((*particleIterator)())
601 {
602 G4ParticleDefinition* particle = particleIterator->value();
603 G4ProcessManager* pmanager = particle->GetProcessManager();
604 if(pmanager != nullptr)
605 {
606 pmanager->AddProcess(theParallelWorldProcess);
607 if(theParallelWorldProcess->IsAtRestRequired(particle))
608 {
609 pmanager->SetProcessOrdering(theParallelWorldProcess, idxAtRest,
610 9900);
611 }
612 pmanager->SetProcessOrderingToSecond(theParallelWorldProcess,
614 pmanager->SetProcessOrdering(theParallelWorldProcess, idxPostStep,
615 9900);
616 } // if(pmanager)
617 } // while
618 }
619 theParallelWorldProcess->SetLayeredMaterialFlag(mesh->LayeredMassFlg());
620 }
621 }
622 mesh->WorkerConstruct(pWorld);
623 }
624}
std::vector< G4InuclElementaryParticle >::iterator particleIterator
Definition: G4BigBanger.cc:64
@ idxPostStep
@ idxAtRest
@ idxAlongStep
int G4int
Definition: G4Types.hh:85
void SetLayeredMaterialFlag(G4bool flg=true)
void SetParallelWorld(G4String parallelWorldName)
G4bool IsAtRestRequired(G4ParticleDefinition *)
G4ProcessManager * GetProcessManager() const
G4PTblDicIterator * GetIterator() const
void SetProcessOrdering(G4VProcess *aProcess, G4ProcessVectorDoItIndex idDoIt, G4int ordDoIt=ordDefault)
void SetProcessOrderingToSecond(G4VProcess *aProcess, G4ProcessVectorDoItIndex idDoIt)
G4int AddProcess(G4VProcess *aProcess, G4int ordAtRestDoIt=ordInActive, G4int ordAlongSteptDoIt=ordInActive, G4int ordPostStepDoIt=ordInActive)
G4RunManagerKernel * kernel
static G4RUN_DLL G4bool fGeometryHasBeenDestroyed
G4VScoringMesh * GetMesh(G4int i) const
size_t GetNumberOfMesh() const
G4String GetWorldName(G4int i) const
static G4ScoringManager * GetScoringManagerIfExist()
static G4TransportationManager * GetTransportationManager()
G4VPhysicalVolume * IsWorldExisting(const G4String &worldName)
MeshShape GetShape() const
G4LogicalVolume * GetMeshElementLogical() const
virtual void WorkerConstruct(G4VPhysicalVolume *fWorldPhys)
void GeometryHasBeenDestroyed()
G4ParallelWorldProcess * GetParallelWorldProcess() const
void SetParallelWorldProcess(G4ParallelWorldProcess *proc)
void SetMeshElementLogical(G4LogicalVolume *val)
G4bool LayeredMassFlg()

Referenced by G4WorkerTaskRunManager::DoWork().

◆ DoEventLoop()

void G4WorkerRunManager::DoEventLoop ( G4int  n_event,
const char *  macroFile = 0,
G4int  n_select = -1 
)
virtual

Reimplemented from G4RunManager.

Reimplemented in G4WorkerTaskRunManager.

Definition at line 275 of file G4WorkerRunManager.cc.

277{
278 if(userPrimaryGeneratorAction == nullptr)
279 {
280 G4Exception("G4RunManager::GenerateEvent()", "Run0032", FatalException,
281 "G4VUserPrimaryGeneratorAction is not defined!");
282 }
283
284 // This is the same as in the sequential case, just the for-loop indexes are
285 // different
286 InitializeEventLoop(n_event, macroFile, n_select);
287
288 // Reset random number seeds queue
289 while(seedsQueue.size() > 0)
290 {
291 seedsQueue.pop();
292 }
293 // for each run, worker should receive at least one set of random number
294 // seeds.
295 runIsSeeded = false;
296
297 // Event loop
298 eventLoopOnGoing = true;
299 /////// G4int i_event = workerContext->GetThreadId();
300 G4int i_event = -1;
301 nevModulo = -1;
302 currEvID = -1;
303
304 while(eventLoopOnGoing)
305 {
306 ProcessOneEvent(i_event);
308 {
310 if(runAborted)
311 {
312 eventLoopOnGoing = false;
313 }
314 ////// else
315 ////// {
316 ////// i_event += workerContext->GetNumberThreads();
317 ////// eventLoopOnGoing = i_event<n_event;
318 ////// }
319 }
320 }
321
323}
virtual void InitializeEventLoop(G4int n_event, const char *macroFile=nullptr, G4int n_select=-1)
G4bool runAborted
G4VUserPrimaryGeneratorAction * userPrimaryGeneratorAction
virtual void TerminateOneEvent()
virtual void ProcessOneEvent(G4int i_event)
virtual void TerminateEventLoop()

◆ DoWork()

void G4WorkerRunManager::DoWork ( )
virtual

Reimplemented in G4WorkerTaskRunManager.

Definition at line 810 of file G4WorkerRunManager.cc.

811{
816 {
817 if(nextAction ==
819 // run
820 {
821 // The following code deals with changing materials between runs
822 static G4ThreadLocal G4bool skipInitialization = true;
823 if(skipInitialization)
824 {
825 // re-initialization is not necessary for the first run
826 skipInitialization = false;
827 }
828 else
829 {
830 // ReinitializeGeometry();
832 }
833
834 // Execute UI commands stored in the master UI manager
835 std::vector<G4String> cmds = mrm->GetCommandStack();
836 G4UImanager* uimgr = G4UImanager::GetUIpointer(); // TLS instance
837 for(auto it = cmds.cbegin(); it != cmds.cend(); ++it)
838 {
839 uimgr->ApplyCommand(*it);
840 }
841 // Start this run
842 G4int numevents = mrm->GetNumberOfEventsToBeProcessed();
843 G4String macroFile = mrm->GetSelectMacro();
844 G4int numSelect = mrm->GetNumberOfSelectEvents();
845 if(macroFile == "" || macroFile == " ")
846 {
847 this->BeamOn(numevents);
848 }
849 else
850 {
851 this->BeamOn(numevents, macroFile, numSelect);
852 }
853 }
855 {
856 std::vector<G4String> cmds = mrm->GetCommandStack();
857 G4UImanager* uimgr = G4UImanager::GetUIpointer(); // TLS instance
858 for(auto it = cmds.cbegin(); it != cmds.cend(); ++it)
859 {
860 uimgr->ApplyCommand(*it);
861 }
863 }
864 else
865 {
867 d << "Cannot continue, this worker has been requested an unknown action: "
868 << static_cast<
869 std::underlying_type<G4MTRunManager::WorkerActionRequest>::type>(
870 nextAction);
871 G4Exception("G4WorkerRunManager::DoWork", "Run0104", FatalException, d);
872 }
873
874 // Now wait for master thread to signal new action to be performed
875 nextAction = mrm->ThisWorkerWaitForNextAction();
876 } // No more actions to perform
877
878 return;
879}
bool G4bool
Definition: G4Types.hh:86
virtual WorkerActionRequest ThisWorkerWaitForNextAction()
virtual void ThisWorkerProcessCommandsStackDone()
static G4MTRunManager * GetMasterRunManager()
std::vector< G4String > GetCommandStack()
G4int GetNumberOfEventsToBeProcessed() const
virtual void BeamOn(G4int n_event, const char *macroFile=nullptr, G4int n_select=-1)
const G4String & GetSelectMacro() const
G4int GetNumberOfSelectEvents() const
G4int ApplyCommand(const char *aCommand)
Definition: G4UImanager.cc:495
G4WorkerThread * workerContext
static void UpdateGeometryAndPhysicsVectorFromMaster()
#define G4ThreadLocal
Definition: tls.hh:77

Referenced by G4MTRunManagerKernel::StartThread().

◆ GenerateEvent()

G4Event * G4WorkerRunManager::GenerateEvent ( G4int  i_event)
virtual

Reimplemented from G4RunManager.

Reimplemented in G4WorkerTaskRunManager.

Definition at line 340 of file G4WorkerRunManager.cc.

341{
342 G4Event* anEvent = new G4Event(i_event);
343 G4long s1 = 0;
344 G4long s2 = 0;
345 G4long s3 = 0;
346 G4bool eventHasToBeSeeded = true;
348 {
349 eventHasToBeSeeded = false;
350 }
351
352 if(i_event < 0)
353 {
355 if(nevM == 1)
356 {
358 anEvent, s1, s2, s3, eventHasToBeSeeded);
359 runIsSeeded = true;
360 }
361 else
362 {
363 if(nevModulo <= 0)
364 {
366 anEvent, &seedsQueue, eventHasToBeSeeded);
367 if(nevToDo == 0)
368 {
369 eventLoopOnGoing = false;
370 }
371 else
372 {
373 currEvID = anEvent->GetEventID();
374 nevModulo = nevToDo - 1;
375 }
376 }
377 else
378 {
380 eventHasToBeSeeded = false;
381 anEvent->SetEventID(++currEvID);
382 --nevModulo;
383 }
384 if(eventLoopOnGoing && eventHasToBeSeeded)
385 {
386 s1 = seedsQueue.front();
387 seedsQueue.pop();
388 s2 = seedsQueue.front();
389 seedsQueue.pop();
390 }
391 }
392
394 {
395 delete anEvent;
396 return nullptr;
397 }
398 }
399 else if(eventHasToBeSeeded)
400 {
401 // Need to reseed random number generator
403 s1 = helper->GetSeed(i_event * 2);
404 s2 = helper->GetSeed(i_event * 2 + 1);
405 }
406
407 if(eventHasToBeSeeded)
408 {
409 G4long seeds[3] = { s1, s2, 0 };
410 G4Random::setTheSeeds(seeds, luxury);
411 runIsSeeded = true;
412 }
413
414 // Read from file seed.
415 // Andrea Dotti 4 November 2015
416 // This is required for strong-reproducibility, in MT mode we have that each
417 // thread produces, for each event a status file, we want to do that.
418 // Search a random file with the format run{%d}evt{%d}.rndm
419
420 // This is the filename base constructed from run and event
421 const auto filename = [&] {
422 std::ostringstream os;
423 os << "run" << currentRun->GetRunID() << "evt" << anEvent->GetEventID();
424 return os.str();
425 };
426
427 G4bool RNGstatusReadFromFile = false;
429 {
430 // Build full path of RNG status file for this event
431 std::ostringstream os;
432 os << filename() << ".rndm";
433 const G4String& randomStatusFile = os.str();
434 std::ifstream ifile(randomStatusFile.c_str());
435 if(ifile)
436 { // File valid and readable
437 RNGstatusReadFromFile = true;
438 G4Random::restoreEngineStatus(randomStatusFile.c_str());
439 }
440 }
441
444 {
445 std::ostringstream oss;
446 G4Random::saveFullState(oss);
449 }
450
451 if(storeRandomNumberStatus && !RNGstatusReadFromFile)
452 { // If reading from file, avoid to rewrite the same
453 G4String fileN = "currentEvent";
455 {
456 fileN = filename();
457 }
458 StoreRNGStatus(fileN);
459 }
460
461 if(printModulo > 0 && anEvent->GetEventID() % printModulo == 0)
462 {
463 G4cout << "--> Event " << anEvent->GetEventID() << " starts";
464 if(eventHasToBeSeeded)
465 {
466 G4cout << " with initial seeds (" << s1 << "," << s2 << ")";
467 }
468 G4cout << "." << G4endl;
469 }
471 return anEvent;
472}
long G4long
Definition: G4Types.hh:87
void SetRandomNumberStatus(G4String &st)
Definition: G4Event.hh:90
G4int GetEventID() const
Definition: G4Event.hh:118
void SetEventID(G4int i)
Definition: G4Event.hh:80
static G4int SeedOncePerCommunication()
virtual G4int SetUpNEvents(G4Event *, G4SeedsQueue *seedsQueue, G4bool reseedRequired=true)
virtual G4bool SetUpAnEvent(G4Event *, long &s1, long &s2, long &s3, G4bool reseedRequired=true)
G4int GetEventModulo() const
G4int storeRandomNumberStatusToG4Event
G4Run * currentRun
G4bool rngStatusEventsFlag
G4String randomNumberStatusForThisEvent
G4bool storeRandomNumberStatus
G4int GetRunID() const
Definition: G4Run.hh:78
static G4TemplateRNGHelper< T > * GetInstance()
Definition: G4RNGHelper.cc:42
virtual const T GetSeed(const G4int &sdId)
Definition: G4RNGHelper.hh:64
virtual void GeneratePrimaries(G4Event *anEvent)=0
virtual void StoreRNGStatus(const G4String &filenamePrefix)

Referenced by ProcessOneEvent().

◆ GetWorkerRunManager()

G4WorkerRunManager * G4WorkerRunManager::GetWorkerRunManager ( )
static

◆ GetWorkerRunManagerKernel()

G4WorkerRunManagerKernel * G4WorkerRunManager::GetWorkerRunManagerKernel ( )
static

Definition at line 68 of file G4WorkerRunManager.cc.

69{
71}
static G4WorkerRunManager * GetWorkerRunManager()

◆ InitializeGeometry()

void G4WorkerRunManager::InitializeGeometry ( )
virtual

Reimplemented from G4RunManager.

Definition at line 144 of file G4WorkerRunManager.cc.

145{
146 if(userDetector == nullptr)
147 {
148 G4Exception("G4RunManager::InitializeGeometry", "Run0033", FatalException,
149 "G4VUserDetectorConstruction is not defined!");
150 return;
151 }
153 {
155 }
156
157 // Step1: Get pointer to the physiWorld (note: needs to get the "super
158 // pointer, i.e. the one shared by all threads"
159 G4RunManagerKernel* masterKernel =
161 G4VPhysicalVolume* worldVol = masterKernel->GetCurrentWorld();
162 // Step2:, Call a new "WorkerDefineWorldVolume( pointer from 2-, false);
163 kernel->WorkerDefineWorldVolume(worldVol, false);
165 // Step3: Call user's ConstructSDandField()
168 geometryInitialized = true;
169}
static G4RunManagerKernel * GetMasterRunManagerKernel()
G4VPhysicalVolume * GetCurrentWorld() const
void SetNumberOfParallelWorld(G4int i)
void WorkerDefineWorldVolume(G4VPhysicalVolume *worldVol, G4bool topologyIsChanged=true)
G4int GetNumberOfParallelWorld() const
G4bool geometryInitialized

◆ MergePartialResults()

void G4WorkerRunManager::MergePartialResults ( )
protectedvirtual

Definition at line 475 of file G4WorkerRunManager.cc.

476{
477 // Merge partial results into global run
480 if(ScM != nullptr)
481 mtRM->MergeScores(ScM);
482 mtRM->MergeRun(currentRun);
483}
void MergeRun(const G4Run *localRun)
void MergeScores(const G4ScoringManager *localScoringManager)

Referenced by RunTermination(), and G4WorkerTaskRunManager::RunTermination().

◆ ProcessOneEvent()

void G4WorkerRunManager::ProcessOneEvent ( G4int  i_event)
virtual

Reimplemented from G4RunManager.

Reimplemented in G4WorkerTaskRunManager.

Definition at line 326 of file G4WorkerRunManager.cc.

327{
328 currentEvent = GenerateEvent(i_event);
330 {
336 }
337}
void ProcessOneEvent(G4Event *anEvent)
G4int n_select_msg
G4String msgText
G4EventManager * eventManager
virtual void AnalyzeEvent(G4Event *anEvent)
void UpdateScoring()
G4Event * currentEvent
virtual G4Event * GenerateEvent(G4int i_event)

Referenced by DoEventLoop().

◆ RestoreRndmEachEvent()

virtual void G4WorkerRunManager::RestoreRndmEachEvent ( G4bool  flag)
inlinevirtual

Reimplemented from G4RunManager.

Reimplemented in G4WorkerTaskRunManager.

Definition at line 89 of file G4WorkerRunManager.hh.

89{ readStatusFromFile=flag; }

◆ rndmSaveThisEvent()

void G4WorkerRunManager::rndmSaveThisEvent ( )
protectedvirtual

Reimplemented from G4RunManager.

Definition at line 767 of file G4WorkerRunManager.cc.

768{
769 if(currentEvent == nullptr)
770 {
771 G4cerr << "Warning from G4RunManager::rndmSaveThisEvent():"
772 << " there is no currentEvent available." << G4endl
773 << "Command ignored." << G4endl;
774 return;
775 }
776
778 {
779 G4cerr << "Warning from G4RunManager::rndmSaveThisEvent():"
780 << " Random number engine status is not available." << G4endl
781 << "/random/setSavingFlag command must be issued "
782 << "prior to the start of the run. Command ignored." << G4endl;
783 return;
784 }
785
786 std::ostringstream oos;
787 oos << "G4Worker" << workerContext->GetThreadId() << "_"
788 << "currentEvent.rndm"
789 << "\0";
790 G4String fileIn = randomNumberStatusDir + oos.str();
791
792 std::ostringstream os;
793 os << "run" << currentRun->GetRunID() << "evt" << currentEvent->GetEventID()
794 << ".rndm" << '\0';
795 G4String fileOut = randomNumberStatusDir + os.str();
796
797#ifdef WIN32
798 G4String copCmd = "/control/shell copy " + fileIn + " " + fileOut;
799#else
800 G4String copCmd = "/control/shell cp " + fileIn + " " + fileOut;
801#endif
803 if(verboseLevel > 0)
804 {
805 G4cout << fileIn << " is copied to " << fileOut << G4endl;
806 }
807}
G4GLOB_DLL std::ostream G4cerr
G4String randomNumberStatusDir
G4int GetThreadId() const

◆ rndmSaveThisRun()

void G4WorkerRunManager::rndmSaveThisRun ( )
protectedvirtual

Reimplemented from G4RunManager.

Definition at line 730 of file G4WorkerRunManager.cc.

731{
732 G4int runNumber = 0;
733 if(currentRun != nullptr)
734 runNumber = currentRun->GetRunID();
736 {
737 G4cerr << "Warning from G4RunManager::rndmSaveThisRun():"
738 << " Random number status was not stored prior to this run."
739 << G4endl << "/random/setSavingFlag command must be issued. "
740 << "Command ignored." << G4endl;
741 return;
742 }
743
744 std::ostringstream oos;
745 oos << "G4Worker" << workerContext->GetThreadId() << "_"
746 << "currentRun.rndm"
747 << "\0";
748 G4String fileIn = randomNumberStatusDir + oos.str();
749
750 std::ostringstream os;
751 os << "run" << runNumber << ".rndm" << '\0';
752 G4String fileOut = randomNumberStatusDir + os.str();
753
754#ifdef WIN32
755 G4String copCmd = "/control/shell copy " + fileIn + " " + fileOut;
756#else
757 G4String copCmd = "/control/shell cp " + fileIn + " " + fileOut;
758#endif
760 if(verboseLevel > 0)
761 {
762 G4cout << fileIn << " is copied to " << fileOut << G4endl;
763 }
764}

◆ RunInitialization()

void G4WorkerRunManager::RunInitialization ( )
virtual

Reimplemented from G4RunManager.

Reimplemented in G4WorkerTaskRunManager.

Definition at line 172 of file G4WorkerRunManager.cc.

173{
174#ifdef G4MULTITHREADED
175 if(!visIsSetUp)
176 {
178 if(pVVis != nullptr)
179 {
180 pVVis->SetUpForAThread();
181 visIsSetUp = true;
182 }
183 }
184#endif
185
187 return;
188
189 // Signal this thread can start event loop.
190 // Note this will return only when all threads reach this point
192 if(fakeRun)
193 return;
194
195 const G4UserWorkerInitialization* uwi =
198 delete currentRun;
199 currentRun = nullptr;
200
203 // Call a user hook: this is guaranteed all threads are "synchronized"
204 if(uwi)
205 uwi->WorkerRunStart();
206
207 if(userRunAction)
209 if(currentRun == nullptr)
210 currentRun = new G4Run();
211
214
217 if(fSDM != nullptr)
218 {
220 }
221
223 {
224 auto hce = (fSDM != nullptr) ? fSDM->PrepareNewEvent() : nullptr;
226 delete hce;
227 }
228
229 std::ostringstream oss;
230 G4Random::saveFullState(oss);
233
234 for(G4int i_prev = 0; i_prev < n_perviousEventsToBeStored; ++i_prev)
235 {
236 previousEvents->push_back(nullptr);
237 }
238
239 if(printModulo > 0 || verboseLevel > 0)
240 {
241 G4cout << "### Run " << currentRun->GetRunID()
242 << " starts on worker thread "
244 << G4endl;
245 }
246 if(userRunAction != nullptr)
248
249#if defined(GEANT4_USE_TIMEMORY)
250 workerRunProfiler.reset(new ProfilerConfig(currentRun));
251#endif
252
254 {
256 }
257
259 {
260 G4String fileN = "currentRun";
262 {
263 std::ostringstream os;
264 os << "run" << currentRun->GetRunID();
265 fileN = os.str();
266 }
267 StoreRNGStatus(fileN);
268 }
269
270 runAborted = false;
272}
virtual void ThisWorkerReady()
static G4ParallelWorldProcessStore * GetInstance()
G4bool RunInitialization(G4bool fakeRun=false)
G4bool isScoreNtupleWriter
void CleanUpPreviousEvents()
const G4UserWorkerInitialization * GetUserWorkerInitialization() const
std::list< G4Event * > * previousEvents
G4int numberOfEventProcessed
G4int runIDCounter
G4DCtable * DCtable
G4String randomNumberStatusForThisRun
G4UserRunAction * userRunAction
G4int numberOfEventToBeProcessed
G4int n_perviousEventsToBeStored
Definition: G4Run.hh:49
void SetHCtable(G4HCtable *HCtbl)
Definition: G4Run.hh:107
void SetNumberOfEventToBeProcessed(G4int n_ev)
Definition: G4Run.hh:103
void SetRunID(G4int id)
Definition: G4Run.hh:102
void SetDCtable(G4DCtable *DCtbl)
Definition: G4Run.hh:108
void SetRandomNumberStatus(G4String &st)
Definition: G4Run.hh:109
G4HCofThisEvent * PrepareNewEvent()
Definition: G4SDManager.cc:113
static G4SDManager * GetSDMpointerIfExist()
Definition: G4SDManager.cc:47
G4HCtable * GetHCtable() const
Definition: G4SDManager.hh:101
virtual void BeginOfRunAction(const G4Run *aRun)
virtual G4Run * GenerateRun()
virtual G4bool Book(G4HCofThisEvent *hce)=0
static G4VScoreNtupleWriter * Instance()
virtual void OpenFile()=0
G4ProfilerConfig< G4ProfileType::Run > ProfilerConfig
G4int G4GetThreadId()
Definition: G4Threading.cc:122

◆ RunTermination()

void G4WorkerRunManager::RunTermination ( )
virtual

Reimplemented from G4RunManager.

Reimplemented in G4WorkerTaskRunManager.

Definition at line 486 of file G4WorkerRunManager.cc.

487{
488 if(!fakeRun)
489 {
490#if defined(GEANT4_USE_TIMEMORY)
491 workerRunProfiler.reset();
492#endif
494
495 // Call a user hook: note this is before the next barrier
496 // so threads execute this method asyncrhonouzly
497 //(TerminateRun allows for synch via G4RunAction::EndOfRun)
498 const G4UserWorkerInitialization* uwi =
500 if(uwi != nullptr)
501 uwi->WorkerRunEnd();
502 }
503
505 // Signal this thread has finished envent-loop.
506 // Note this will return only whan all threads reach this point
508}
virtual void ThisWorkerEndEventLoop()
virtual void RunTermination()
virtual void MergePartialResults()

◆ SetUserAction() [1/6]

void G4WorkerRunManager::SetUserAction ( G4UserEventAction userAction)
virtual

Reimplemented from G4RunManager.

Definition at line 691 of file G4WorkerRunManager.cc.

692{
694}
virtual void SetUserAction(G4UserRunAction *userAction)

◆ SetUserAction() [2/6]

void G4WorkerRunManager::SetUserAction ( G4UserRunAction userAction)
virtual

Reimplemented from G4RunManager.

Definition at line 671 of file G4WorkerRunManager.cc.

672{
673 G4RunManager::SetUserAction(userAction);
674 if(userAction != nullptr)
675 userAction->SetMaster(false);
676}
virtual void SetMaster(G4bool val=true)

Referenced by G4RTWorkerInitialization::WorkerRunEnd(), and G4RTWorkerInitialization::WorkerRunStart().

◆ SetUserAction() [3/6]

void G4WorkerRunManager::SetUserAction ( G4UserStackingAction userAction)
virtual

Reimplemented from G4RunManager.

Definition at line 703 of file G4WorkerRunManager.cc.

704{
706}

◆ SetUserAction() [4/6]

void G4WorkerRunManager::SetUserAction ( G4UserSteppingAction userAction)
virtual

Reimplemented from G4RunManager.

Definition at line 715 of file G4WorkerRunManager.cc.

716{
718}

◆ SetUserAction() [5/6]

void G4WorkerRunManager::SetUserAction ( G4UserTrackingAction userAction)
virtual

Reimplemented from G4RunManager.

Definition at line 709 of file G4WorkerRunManager.cc.

710{
712}

◆ SetUserAction() [6/6]

void G4WorkerRunManager::SetUserAction ( G4VUserPrimaryGeneratorAction userAction)
virtual

Reimplemented from G4RunManager.

Definition at line 697 of file G4WorkerRunManager.cc.

698{
700}

◆ SetUserInitialization() [1/5]

void G4WorkerRunManager::SetUserInitialization ( G4UserWorkerInitialization userInit)
virtual

Reimplemented from G4RunManager.

Definition at line 627 of file G4WorkerRunManager.cc.

628{
630 "G4RunManager::SetUserInitialization(G4UserWorkerInitialization*)",
631 "Run0118", FatalException,
632 "This method should be used only with an instance of G4MTRunManager");
633}

◆ SetUserInitialization() [2/5]

void G4WorkerRunManager::SetUserInitialization ( G4UserWorkerThreadInitialization userInit)
virtual

Reimplemented from G4RunManager.

Definition at line 636 of file G4WorkerRunManager.cc.

638{
640 "G4RunManager::SetUserInitialization(G4UserWorkerThreadInitialization*)",
641 "Run0119", FatalException,
642 "This method should be used only with an instance of G4MTRunManager");
643}

◆ SetUserInitialization() [3/5]

void G4WorkerRunManager::SetUserInitialization ( G4VUserActionInitialization userInit)
virtual

Reimplemented from G4RunManager.

Definition at line 646 of file G4WorkerRunManager.cc.

647{
649 "G4RunManager::SetUserInitialization(G4VUserActionInitialization*)",
650 "Run0120", FatalException,
651 "This method should be used only with an instance of G4MTRunManager");
652}

◆ SetUserInitialization() [4/5]

void G4WorkerRunManager::SetUserInitialization ( G4VUserDetectorConstruction userInit)
virtual

Reimplemented from G4RunManager.

Definition at line 655 of file G4WorkerRunManager.cc.

656{
658 "G4RunManager::SetUserInitialization(G4VUserDetectorConstruction*)",
659 "Run0121", FatalException,
660 "This method should be used only with an instance of G4MTRunManager");
661}

◆ SetUserInitialization() [5/5]

void G4WorkerRunManager::SetUserInitialization ( G4VUserPhysicsList userInit)
virtual

Reimplemented from G4RunManager.

Definition at line 664 of file G4WorkerRunManager.cc.

665{
666 pl->InitializeWorker();
668}
virtual void SetUserInitialization(G4VUserDetectorConstruction *userInit)

Referenced by G4MTRunManagerKernel::StartThread().

◆ SetWorkerThread()

void G4WorkerRunManager::SetWorkerThread ( G4WorkerThread wc)
inline

Definition at line 74 of file G4WorkerRunManager.hh.

74{ workerContext = wc; }

Referenced by G4MTRunManagerKernel::StartThread().

◆ StoreRNGStatus()

void G4WorkerRunManager::StoreRNGStatus ( const G4String filenamePrefix)
protectedvirtual

Reimplemented from G4RunManager.

Reimplemented in G4WorkerTaskRunManager.

Definition at line 721 of file G4WorkerRunManager.cc.

722{
723 std::ostringstream os;
724 os << randomNumberStatusDir << "G4Worker" << workerContext->GetThreadId()
725 << "_" << fn << ".rndm";
726 G4Random::saveEngineStatus(os.str().c_str());
727}

Referenced by GenerateEvent(), and RunInitialization().

◆ TerminateEventLoop()

void G4WorkerRunManager::TerminateEventLoop ( )
virtual

Reimplemented from G4RunManager.

Reimplemented in G4WorkerTaskRunManager.

Definition at line 511 of file G4WorkerRunManager.cc.

512{
513 if(verboseLevel > 0 && !fakeRun)
514 {
515 timer->Stop();
516 G4cout << "Thread-local run terminated." << G4endl;
517 G4cout << "Run Summary" << G4endl;
518 if(runAborted)
519 {
520 G4cout << " Run Aborted after " << numberOfEventProcessed
521 << " events processed." << G4endl;
522 }
523 else
524 {
525 G4cout << " Number of events processed : " << numberOfEventProcessed
526 << G4endl;
527 }
528 G4cout << " " << *timer << G4endl;
529 }
530}
G4Timer * timer
void Stop()

Referenced by DoEventLoop().

Member Data Documentation

◆ currEvID

G4int G4WorkerRunManager::currEvID = -1
protected

◆ eventLoopOnGoing

◆ luxury

G4int G4WorkerRunManager::luxury = -1
protected

Definition at line 116 of file G4WorkerRunManager.hh.

Referenced by G4WorkerRunManager(), and GenerateEvent().

◆ nevModulo

G4int G4WorkerRunManager::nevModulo = -1
protected

◆ readStatusFromFile

G4bool G4WorkerRunManager::readStatusFromFile = false
protected

◆ runIsSeeded

G4bool G4WorkerRunManager::runIsSeeded = false
protected

◆ seedsQueue

G4SeedsQueue G4WorkerRunManager::seedsQueue
protected

◆ workerContext


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