13 #ifndef ROOT_TMCManager
14 #define ROOT_TMCManager
31 class TVirtualMCApplication;
33 class TVirtualMCStack;
34 class TMCManagerStack;
38 friend class TVirtualMCApplication;
45 virtual ~TMCManager();
48 static TMCManager *Instance();
57 void Register(TVirtualMC *engine);
61 void Register(TVirtualMCApplication *application);
64 Int_t NEngines()
const;
67 void GetEngines(std::vector<TVirtualMC *> &engines)
const;
70 TVirtualMC *GetEngine(Int_t
id)
const;
73 Int_t GetEngineId(
const char *name)
const;
76 TVirtualMC *GetCurrentEngine()
const;
79 void ConnectEnginePointer(TVirtualMC **mc);
82 void ConnectEnginePointer(TVirtualMC *&mc);
89 void SetUserStack(TVirtualMCStack *stack);
94 void ForwardTrack(Int_t toBeDone, Int_t trackId, Int_t parentId, TParticle *particle, Int_t engineId);
100 void ForwardTrack(Int_t toBeDone, Int_t trackId, Int_t parentId, TParticle *particle);
103 void TransferTrack(Int_t engineTargetId);
106 void TransferTrack(TVirtualMC *mc);
109 Bool_t RestoreGeometryState(Int_t trackId, Bool_t checkTrackIdRange = kTRUE);
112 Bool_t RestoreGeometryState();
119 template <
typename F>
120 void Apply(F engineLambda)
122 for (
auto &mc : fEngines) {
125 UpdateEnginePointers(mc);
133 template <
typename F>
134 void Init(F initFunction)
136 if (fIsInitializedUser) {
140 for (
auto &mc : fEngines) {
142 UpdateEnginePointers(mc);
145 fIsInitializedUser = kTRUE;
149 void Run(Int_t nEvents);
153 void PrepareNewEvent();
155 Bool_t GetNextEngine();
157 void UpdateEnginePointers(TVirtualMC *mc);
163 #if !defined(__CINT__)
164 static TMCThreadLocal TMCManager *fgInstance;
166 static TMCManager *fgInstance;
170 TVirtualMCApplication *fApplication;
172 TVirtualMC *fCurrentEngine;
174 std::vector<TVirtualMC *> fEngines;
176 std::vector<std::unique_ptr<TMCManagerStack>> fStacks;
178 std::vector<TParticle *> fParticles;
180 std::vector<std::unique_ptr<TMCParticleStatus>> fParticlesStatus;
182 Int_t fTotalNPrimaries;
187 std::vector<TVirtualMC **> fConnectedEnginePointers;
189 TVirtualMCStack *fUserStack;
191 TGeoMCBranchArrayContainer fBranchArrayContainer;
193 Bool_t fIsInitialized;
195 Bool_t fIsInitializedUser;
197 ClassDef(TMCManager, 0)