I am trying to run particles from an input beam file.
The necessary messenger command was created for PrimaryGeneratorAction to define file name.
But I can’t understand how to pass an initial argc variable from main to this class.
I have tried runManager->SetUserAction(new PrimaryGeneratorAction(G4String fileName))
but got the next warning due to multithreading:
For multi-threaded version, define G4VUserPrimaryGeneratorAction in G4VUserActionInitialization
in Geant4 MT in each thread a new instamce of PrimaryGenerator is used. I see a following possibilities to read external data on primary particle:
- design a dispature class which will use mutex lock and at each call will provide the next primary event from this file.
- split input file in N imput files (where N equel to number of threads) and each thread should read from defined independent input input file.
- use MT mode with 1 thread only.
I did that.
while (infile >>x >> y >>z>> px>> py>> pz>> id)
y_vec[my_pos] = y;
x_vec[my_pos] = x;
z_vec[my_pos] = z;
The new my_pos value is defined within mutex lock
The question is how to provide the input filename variable from the main .cc file or macros before Run initialization?
Currently, I am modifying it in the source code.