Could anyone please tell when & where the function ‘B1ActionInitialization::Build()’ is called?
The action classes (e.g., G4VUserPrimaryGeneratorAction) are instantiated within the function, but it doesn’t look to be called by any other codes in the example. It’s not a constructor, so I believe it’s not invoked by ‘runManager->SetUserInitialization(new B1ActionInitialization())’…
Maybe it’s called by some master process that is triggered by running ’ /run/beamOn’?
It depends if your Geant4 installation is built with support for multithreading or not.
If you run in a non-multithreaded (sequential) mode, it’s invoked exactly by G4RunManager::SetUserInitialization(...).
In the MT mode, it’s B1ActionInitialization::BuildForMaster() that will be called by G4MTRunManager::SetUserInitialization(...). And then, for each created thread B1ActionInitialization::Build() will be called from G4MTRunManagerKernel::StartThread(...).
Thanks anna for the explanation. Just to make sure… did you mean, in a non-multithreaded mode, B1ActionInitialization::Build() is invoked by ‘runManager->SetUserInitialization(new B1ActionInitialization())’ in exampleB1.cc? B1ActionInitialization::Build() is not a constructor, so I thought it should be called explicitly…
Examples are complete, so there is no need to modify them to make them work.
You create B1ActionInitialization (call a constructor) and pass it to runManager (via ::SetUserInitialization(...)) who does all the necessary steps, including calling ::Build(). You can check the source code for G4RunManager::SetUserInitialization(G4VUserActionInitialization*), or check it with gdb (the source code is in the few last lines):
(gdb) b B1ActionInitialization::Build() const
Breakpoint 1 at 0xa9e7: file <G4path>/examples/basic/B1/src/B1ActionInitialization.cc, line 59.
(gdb) r
Starting program: <G4path>/examples/basic/B1/build/exampleB1
[...]
Thread 1 "exampleB1" hit Breakpoint 1, B1ActionInitialization::Build (this=0x555555d7ced0) at <G4path>/examples/basic/B1/src/B1ActionInitialization.cc:59
59 SetUserAction(new B1PrimaryGeneratorAction);
(gdb) bt 3
#0 B1ActionInitialization::Build() const (this=0x555555d7ced0) at <G4path>/examples/basic/B1/src/B1ActionInitialization.cc:59
#1 0x00007ffff6fc5dcf in G4RunManager::SetUserInitialization(G4VUserActionInitialization*) (this=0x55555577fe60, userInit=0x555555d7ced0)
at <G4path>/source/run/src/G4RunManager.cc:911
#2 0x000055555555cb24 in main(int, char**) (argc=1, argv=0x7fffffffdc88) at <G4path>/examples/basic/B1/exampleB1.cc:77
(gdb) fr 1
#1 0x00007ffff6fc5dcf in G4RunManager::SetUserInitialization (this=0x55555577fe60, userInit=0x555555d7ced0) at <G4path>/source/run/src/G4RunManager.cc:911
(gdb) list 909,913
909 void G4RunManager::SetUserInitialization(G4VUserActionInitialization* userInit)
910 {
911 userActionInitialization = userInit;
912 userActionInitialization->Build();
913 }