10 #include "G4MTRunManager.hh"
12 #include "G4TiMemory.hh"
13 #include "G4UImanager.hh"
18 TIMEMORY_AUTO_TIMER(
"");
19 if (!userPrimaryGeneratorAction) {
20 G4Exception(
"G4RunManager::GenerateEvent()",
"Run0032", FatalException,
21 "G4VUserPrimaryGeneratorAction is not defined!");
26 InitializeEventLoop(n_event, macroFile, n_select);
29 while (seedsQueue.size() > 0) {
36 eventLoopOnGoing =
true;
42 while (eventLoopOnGoing) {
44 if (eventLoopOnGoing) {
47 eventLoopOnGoing =
false;
62 TIMEMORY_AUTO_TIMER(
"");
63 currentEvent = _SetupRandomNumbers(i_event);
66 if (eventLoopOnGoing) {
68 userPrimaryGeneratorAction->GeneratePrimaries(currentEvent);
73 eventManager->ProcessOneEvent(currentEvent);
77 G4Event *newEvent =
new G4Event(currentEvent->GetEventID());
79 currentEvent = newEvent;
80 userPrimaryGeneratorAction->GeneratePrimaries(currentEvent);
83 AnalyzeEvent(currentEvent);
85 if (currentEvent->GetEventID() < n_select_msg)
86 G4UImanager::GetUIpointer()->ApplyCommand(msgText);
90 G4Event *GGSWorkerRunManager::_SetupRandomNumbers(G4int i_event) {
95 TIMEMORY_AUTO_TIMER(
"");
96 G4Event *anEvent =
new G4Event(i_event);
100 G4bool eventHasToBeSeeded =
true;
101 if (G4MTRunManager::SeedOncePerCommunication() == 1 && runIsSeeded) {
102 eventHasToBeSeeded =
false;
106 G4int nevM = G4MTRunManager::GetMasterRunManager()->GetEventModulo();
108 eventLoopOnGoing = G4MTRunManager::GetMasterRunManager()->SetUpAnEvent(anEvent, s1, s2, s3, eventHasToBeSeeded);
111 if (nevModulo <= 0) {
112 G4int nevToDo = G4MTRunManager::GetMasterRunManager()->SetUpNEvents(anEvent, &seedsQueue, eventHasToBeSeeded);
114 eventLoopOnGoing =
false;
116 currEvID = anEvent->GetEventID();
117 nevModulo = nevToDo - 1;
120 if (G4MTRunManager::SeedOncePerCommunication() > 0)
121 eventHasToBeSeeded =
false;
122 anEvent->SetEventID(++currEvID);
125 if (eventLoopOnGoing && eventHasToBeSeeded) {
126 s1 = seedsQueue.front();
128 s2 = seedsQueue.front();
133 if (!eventLoopOnGoing) {
137 }
else if (eventHasToBeSeeded) {
139 G4RNGHelper *helper = G4RNGHelper::GetInstance();
140 s1 = helper->GetSeed(i_event * 2);
141 s2 = helper->GetSeed(i_event * 2 + 1);
144 if (eventHasToBeSeeded) {
145 long seeds[3] = {s1, s2, 0};
146 G4Random::setTheSeeds(seeds, luxury);
153 if (storeRandomNumberStatusToG4Event == 1 || storeRandomNumberStatusToG4Event == 3) {
154 std::ostringstream oss;
155 G4Random::saveFullState(oss);
156 randomNumberStatusForThisEvent = oss.str();
157 anEvent->SetRandomNumberStatus(randomNumberStatusForThisEvent);
160 if (printModulo > 0 && anEvent->GetEventID() % printModulo == 0) {
161 G4cout <<
"--> Event " << anEvent->GetEventID() <<
" starts";
162 if (eventHasToBeSeeded) {
163 G4cout <<
" with initial seeds (" << s1 <<
"," << s2 <<
")";
165 G4cout <<
"." << G4endl;
void DoEventLoop(G4int n_event, const char *macroFile=0, G4int n_select=-1) override
Run the event loop.
bool IsKilledAndToBeSimulatedAgain(const G4Event *ev)
Checks if the event has been killed and has to be re-simulated.
void HandleEventRngStateFile(int runID, int eventID)
Handles the read/write operations to/from the random generator state file for each event...
void DumpStatus(G4int eventID)
Prints the status of the random number generator.
void ProcessOneEvent(G4int i_event) override
Process a single event.
void BeginOfEventSimulation()
Reset the internal flags at the beginning of event simulation.
void BeginOfEventProcessing()
Method for storing the random engine state and resetting the internal flags at the beginning event ge...