Geant4 VMC Version 6.8
Loading...
Searching...
No Matches
TG4RunManager.cxx
Go to the documentation of this file.
1//------------------------------------------------
2// The Geant4 Virtual Monte Carlo package
3// Copyright (C) 2007 - 2015 Ivana Hrivnacova
4// All rights reserved.
5//
6// For the licensing terms see geant4_vmc/LICENSE.
7// Contact: root-vmc@cern.ch
8//-------------------------------------------------
9
14
15#include "TG4RunManager.h"
17#include "TG4DetConstruction.h"
18#include "TG4EventAction.h"
19#include "TG4G3PhysicsManager.h"
20#include "TG4GeometryManager.h"
21#include "TG4GeometryServices.h"
22#include "TG4Globals.h"
23#include "TG4PhysicsManager.h"
25#include "TG4RegionsManager.h"
26#include "TG4RegionsManager2.h"
27#include "TG4RunConfiguration.h"
28#include "TG4SDConstruction.h"
29#include "TG4SDManager.h"
30#include "TG4SDServices.h"
32#include "TG4StackPopper.h"
33#include "TG4StateManager.h"
34#include "TG4StepManager.h"
35#include "TG4SteppingAction.h"
36#include "TG4TrackManager.h"
37#include "TG4TrackingAction.h"
39
40#include <G4Threading.hh>
41#include <G4Types.hh>
42#ifdef G4MULTITHREADED
43#include <G4MTRunManager.hh>
44#else
45#include <G4RunManager.hh>
46#endif
47
48#include <G4ScoringManager.hh>
49#include <G4VScoringMesh.hh>
50
51#include <G4UIExecutive.hh>
52#include <G4UImanager.hh>
53#include <G4UIsession.hh>
54#include <G4Version.hh>
55#include <Randomize.hh>
56
57#ifdef USE_G4ROOT
58#include <TG4RootNavMgr.h>
59#endif
60
61#include <TGeoManager.h>
62#include <TInterpreter.h>
63#include <TMCManager.h>
64#include <TMCManagerStack.h>
65#include <TROOT.h>
66#include <TRandom.h>
67#include <TRint.h>
68#include <TVirtualMC.h>
69#include <TVirtualMCApplication.h>
70
71namespace
72{
73
74TG4EventAction* GetEventAction()
75{
76 return dynamic_cast<TG4EventAction*>(const_cast<G4UserEventAction*>(
77 G4RunManager::GetRunManager()->GetUserEventAction()));
78}
79
80} // namespace
81
82//_____________________________________________________________________________
85
86//_____________________________________________________________________________
88 TG4RunConfiguration* runConfiguration, int argc, char** argv)
89 : TG4Verbose("runManager"),
90 fRunManager(0),
91 fMessenger(this),
92 fRunConfiguration(runConfiguration),
96 fRootUIOwner(false),
97 fARGC(argc),
98 fARGV(argv),
99 fUseRootRandom(true),
100 fIsMCStackCached(false),
103 fInProcessRun(false)
104{
106
107 if (VerboseLevel() > 1) {
108 G4cout << "TG4RunManager::TG4RunManager " << this << G4endl;
109 }
110
111 if (fgInstance) {
112 TG4Globals::Exception("TG4RunManager", "TG4RunManager",
113 "Cannot create two instances of singleton.");
114 }
115
116 if (!fRunConfiguration) {
117 TG4Globals::Exception("TG4RunManager", "TG4RunManager",
118 "Cannot create instance without runConfiguration.");
119 }
120
121 fgInstance = this;
122
123 // Define fARGV, fARGC if not provided
124 if (fARGC == 0) {
125 fARGC = 1;
126 fARGV = (char**)new char*[fARGC];
127 fARGV[0] = StrDup("undefined");
128 }
129
130 G4bool isMaster = !G4Threading::IsWorkerThread();
131
132 if (isMaster) {
133 fgMasterInstance = this;
134 if (runConfiguration->IsUseOfG4Scoring()) {
135 // activate G4 command-line scoring
136 G4ScoringManager::GetScoringManager();
137 }
138 // create and configure G4 run manager
140 }
141 else {
142 // Get G4 worker run manager
143 fRunManager = G4RunManager::GetRunManager();
144
145 // Clone G4Root navigator if needed
147
148 fRegionsManager = fgMasterInstance->fRegionsManager;
149 fRootUISession = fgMasterInstance->fRootUISession;
150 fGeantUISession = fgMasterInstance->fGeantUISession;
151 }
152
153 if (VerboseLevel() > 1) {
154 G4cout << "TG4RunManager has been created." << this << G4endl;
155 }
156}
157
158//_____________________________________________________________________________
160{
162
163 G4bool isMaster = !G4Threading::IsWorkerThread();
164
165 if (isMaster) {
166 delete fRunConfiguration;
167 delete fRegionsManager;
168 delete fGeantUISession;
169 delete fRunManager;
170 if (fRootUIOwner) delete fRootUISession;
172 }
173 fgInstance = 0;
174}
175
176//
177// private methods
178//
179
180//_____________________________________________________________________________
182{
185
186 // Geometry construction and navigator
187 //
188 if (VerboseLevel() > 1)
189 G4cout << "TG4RunManager::ConfigureRunManager " << this << G4endl;
190
191 TString userGeometry = fRunConfiguration->GetUserGeometry();
192
194 fRunConfiguration->CreateUserRegionConstruction());
195
197 fRunConfiguration->CreateUserPostDetConstruction());
198
199 // Root navigator
200#ifdef USE_G4ROOT
201 TG4RootNavMgr* rootNavMgr = 0;
202 if (userGeometry == "VMCtoRoot" || userGeometry == "Root") {
203 if (!TMCManager::Instance()) {
204
205#if ROOT_VERSION_CODE >= ROOT_VERSION(6, 22, 8)
206 // Set Root default units to TGeo
207 TGeoManager::LockDefaultUnits(false);
208 TGeoManager::SetDefaultUnits(TGeoManager::kRootUnits);
209 TGeoManager::LockDefaultUnits(true);
210#endif
211
212 // Construct geometry via VMC application
214 G4cout << "Running TVirtualMCApplication::ConstructGeometry"
215 << std::endl;
216
218 TVirtualMCApplication::Instance()->ConstructGeometry();
220
221 // Set top volume and close Root geometry if not yet done
222 if (!gGeoManager->IsClosed()) {
223 TGeoVolume* top = (TGeoVolume*)gGeoManager->GetListOfVolumes()->First();
224 gGeoManager->SetTopVolume(top);
225 gGeoManager->CloseGeometry();
226 }
227
228 // Now that we have the ideal geometry, call application misalignment code
230 TVirtualMCApplication::Instance()->MisalignGeometry();
232 }
233 // Pass geometry to G4Root navigator
234 rootNavMgr = TG4RootNavMgr::GetInstance(gGeoManager);
235 }
236#endif
237
238 // G4 run manager
239#ifdef G4MULTITHREADED
240 if (fRunConfiguration->IsMTApplication()) {
241 fRunManager = new G4MTRunManager();
242 fRunManager->SetUserInitialization(new TG4WorkerInitialization());
243 }
244 else {
245 fRunManager = new G4RunManager();
246 }
247#else
248 fRunManager = new G4RunManager();
249#endif
250 if (VerboseLevel() > 1) {
251 G4cout << "G4RunManager has been created." << G4endl;
252 }
253
254 if (userGeometry != "VMCtoRoot" && userGeometry != "Root") {
255 fRunManager->SetUserInitialization(
256 fRunConfiguration->CreateDetectorConstruction());
257 if (VerboseLevel() > 1)
258 G4cout << "CreateDetectorConstruction done." << G4endl;
259 }
260 else {
261#ifdef USE_G4ROOT
262 G4int nthreads = 1;
263#ifdef G4MULTITHREADED
264 if (fRunConfiguration->IsMTApplication()) {
265 nthreads = G4MTRunManager::GetMasterRunManager()->GetNumberOfThreads();
266 }
267#endif
268 rootNavMgr->Initialize(new TG4PostDetConstruction(), nthreads);
269 rootNavMgr->ConnectToG4();
270#else
271 TG4Globals::Exception("TG4RunManager", "ConfigureRunManager",
272 "geomVMCtoRoot and geomRoot options require Geant4 VMC built with "
273 "G4Root.");
274#endif
275 }
276
277 // Other mandatory classes
278 //
279 fRunManager->SetUserInitialization(fRunConfiguration->CreatePhysicsList());
280 if (VerboseLevel() > 1) G4cout << "CreatePhysicsList done." << G4endl;
281
282 // User fast simulation
283 TG4VUserFastSimulation* userFastSimulation =
284 fRunConfiguration->CreateUserFastSimulation();
285 if (userFastSimulation) {
288 userFastSimulation);
289 }
290 else {
291 TG4Globals::Warning("TG4RunManager", "ConfigureRunManager",
292 "TG4SpecialPhysicsList must be instantiated to use fast simulation");
293 }
294 }
295
296 fRunManager->SetUserInitialization(
298 if (VerboseLevel() > 1)
299 G4cout << "Create ActionInitialization done." << G4endl;
300
301 // Regions manager
302 //
303 if (fRunConfiguration->IsSpecialCuts()) {
304 if (fRunConfiguration->IsSpecialCutsOld()) {
306 }
307 else {
309 }
310 }
311
312 if (VerboseLevel() > 1)
313 G4cout << "TG4RunManager::ConfigureRunManager done " << this << G4endl;
314}
315
316//_____________________________________________________________________________
318{
319 // Clone Root navigator for worker thread
320 //
321#ifdef USE_G4ROOT
322 TString userGeometry = fRunConfiguration->GetUserGeometry();
323 if (userGeometry != "VMCtoRoot" && userGeometry != "Root") return;
324
325 if (VerboseLevel() > 1)
326 G4cout << "TG4RunManager::CloneRootNavigatorForWorker " << this << G4endl;
327
328 // Master Root navigator
329 TG4RootNavMgr* masterRootNavMgr = TG4RootNavMgr::GetMasterInstance();
330
331 // Create G4Root navigator on worker
332 TG4RootNavMgr* rootNavMgr = TG4RootNavMgr::GetInstance(*masterRootNavMgr);
333 if (VerboseLevel() > 1)
334 G4cout << "TG4RootNavMgr has been created." << rootNavMgr << G4endl;
335
336 // rootNavMgr->Initialize(new TG4PostDetConstruction());
337 rootNavMgr->ConnectToG4();
338
339 if (VerboseLevel() > 1)
340 G4cout << "TG4RunManager::CloneRootNavigatorForWorker done " << this
341 << G4endl;
342#endif
343}
344
345//_____________________________________________________________________________
347{
349
350 // get Root UI session if it exists
351 fRootUISession = gROOT->GetApplication();
352 if (fRootUISession) {
353 fARGC = fRootUISession->Argc();
354 delete[] fARGV;
355 fARGV = fRootUISession->Argv();
356 }
357
358 // filter out "-splash" from argument list
359 FilterARGV("-splash");
360
361 // create root UI if it does not exist
362 if (!fRootUISession) {
363 // copy only first command line argument (name of program)
364 // (use the same way as in TApplication.cxx)
365 char** argv = 0;
366 if (fARGC > 0) {
367 argv = (char**)new char*[fARGC];
368 }
369
370 // copy command line arguments, can be later accessed via Argc() and Argv()
371 for (int i = 0; i < fARGC; i++) {
372 argv[i] = StrDup(fARGV[i]);
373 }
374
375 fRootUISession = new TRint("rootSession", &fARGC, argv, 0, 0);
376 fRootUIOwner = true;
377 }
378}
379
380//_____________________________________________________________________________
381void TG4RunManager::FilterARGV(const G4String& arg)
382{
385
386 if (fARGC <= 1) return;
387
388 G4bool isArg = false;
389 for (G4int i = 0; i < fARGC; i++) {
390 if (G4String(fARGV[i]) == arg) isArg = true;
391 if (isArg && i + 1 < fARGC) fARGV[i] = fARGV[i + 1];
392 }
393
394 if (isArg) fARGC--;
395}
396
397//_____________________________________________________________________________
399{
402
403 long seeds[10];
404 seeds[0] = gRandom->GetSeed();
405 seeds[1] = gRandom->GetSeed();
406 seeds[2] = 0;
407 CLHEP::HepRandom::setTheSeeds(seeds);
408}
409
410// public methods
411
412//_____________________________________________________________________________
414{
416
417 if (VerboseLevel() > 1)
418 G4cout << "TG4RunManager::Initialize " << this << G4endl;
419
420 // create G4RunManager
421 // ConfigureRunManager();
422
423#if G4VERSION_NUMBER == 1100
424 // Temporary work-around for bug in Cerenkov in Geant4 11.0
425 TG4PhysicsManager::Instance()->StoreCerenkovMaxBetaChangeValue();
426#endif
427
428 // initialize Geant4
429 fRunManager->Initialize();
430
431 // finish geometry
433
434 // initialize SD manager
435 // TG4SDManager::Instance()->Initialize();
436
437 if (VerboseLevel() > 1)
438 G4cout << "TG4RunManager::Initialize done " << this << G4endl;
439}
440
441//_____________________________________________________________________________
443{
446
447 if (VerboseLevel() > 1)
448 G4cout << "TG4RunManager::LateInitialize " << this << G4endl;
449
450 G4bool isMaster = !G4Threading::IsWorkerThread();
451
452 // define particles
454
455 // set user limits
456 if (isMaster) {
458 *TG4G3PhysicsManager::Instance()->GetCutVector(),
459 *TG4G3PhysicsManager::Instance()->GetControlVector());
460
461 // pass info if cut on e+e- pair is activated to stepping action
462 // TO DO LATER - Stepping Action NOT AVAILABLE
463 //((TG4SteppingAction*)fRunManager->GetUserSteppingAction())
464 // ->SetIsPairCut((*TG4G3PhysicsManager::Instance()->GetIsCutVector())[kEplus]);
465
466 // convert tracking cuts in range cuts per regions
467 if (fRunConfiguration->IsSpecialCuts()) {
468 fRegionsManager->DefineRegions();
469 fRegionsManager->UpdateProductionCutsTable();
470 }
471 }
472
473 // activate/inactivate physics processes
476
477 // late initialize SD manager
478 // (needed only if user sets score weight calculator)
479 if (fRunConfiguration->IsUseOfScoreWeighting()) {
480 TG4SDManager::Instance()->LateInitialize(fRunConfiguration->GetScoreWeightCalculator());
481 }
482
483 // late initialize step manager
485
486 // late initialize action classes
487 if (GetEventAction()) {
488 GetEventAction()->LateInitialize();
491 }
492
493 // print statistics
496
497 if (VerboseLevel() > 2) {
499 }
500
501 // set the random number seed
503
504 if (VerboseLevel() > 1)
505 G4cout << "TG4RunManager::LateInitialize done " << this << G4endl;
506}
507
508//_____________________________________________________________________________
510{
512
513 // Do only once
514 if (fIsMCStackCached) return;
515
516 // The VMC stack must be set to MC at this stage !!
517 TVirtualMCStack* mcStack = gMC->GetStack();
518 if (!mcStack) {
520 "TG4RunManager", "CacheMCStack", "VMC stack is not set");
521 return;
522 }
523
524 TMCManagerStack* mcManagerStack = gMC->GetManagerStack();
525 // Set stack to the event actions if they exists
526 // (on worker only if in MT mode)
527 if (GetEventAction()) {
528 GetEventAction()->SetMCStack(mcStack);
532
535 }
536 }
537
538 fIsMCStackCached = true;
539}
540
541//_____________________________________________________________________________
548
549//_____________________________________________________________________________
550void TG4RunManager::ProcessEvent(G4int eventId, G4bool isInterruptible)
551{
553
554 // First, replay what is done in G4RunManager::BeamOn(...) explicitly
556 G4bool cond = fRunManager->ConfirmBeamOnCondition();
557 if (!cond) {
558 TG4Globals::Warning("TG4RunManager", "ProcessEvent",
559 "Bad beam condition in G4RunManager. No event processed.");
560 return;
561 }
562 fRunManager->ConstructScoringWorlds();
563 fRunManager->RunInitialization();
565 }
566 GetEventAction()->SetIsInterruptibleEvent(isInterruptible);
567
568 // Explicitly call the following 2 methods which are otherwise called from
569 // G4RunManager::BeamOn(...)
570 fRunManager->ProcessOneEvent(eventId);
571 fRunManager->TerminateOneEvent();
572}
573
574//_____________________________________________________________________________
575Bool_t TG4RunManager::ProcessRun(G4int nofEvents)
576{
578
579 // Runinit for per-event processing ==> Don't allow for process run.
581 TG4Globals::Warning("TG4RunManager", "ProcessRun",
582 "Current run is terminated first, then the requested run is processed");
583 FinishRun();
584 }
585 fInProcessRun = true;
586 fRunManager->BeamOn(nofEvents);
587 fInProcessRun = false;
588 fNEventsProcessed = nofEvents;
589 return FinishRun();
590}
591
592//_____________________________________________________________________________
594{
596 if (fInProcessRun) {
597 TG4Globals::Warning("TG4RunManager", "FinishRun",
598 "You are processing a run. To stop it, call StopRun()");
599 return false;
600 }
601 else {
603 }
604 }
605 else {
606 fRunManager->RunTermination();
609 }
610 // Pring field statistics
612
613 G4bool result = !TG4SDServices::Instance()->GetIsStopRun();
615
616 if (fRunConfiguration->IsUseOfG4Scoring()) {
617 // Dump all scoring meshes in file
618 auto g4ScoringManager = G4ScoringManager::GetScoringManager();
619 for (std::size_t i = 0; i < g4ScoringManager->GetNumberOfMesh(); ++i) {
620 auto meshName = g4ScoringManager->GetMesh(i)->GetWorldName();
621 auto fileName = meshName + ".txt";
622 g4ScoringManager->DumpAllQuantitiesToFile(meshName, fileName);
623 }
624 }
625
626 return result;
627}
628
629//_____________________________________________________________________________
631{
633
634 if (fGeantUISession) return;
635
636 // create session if it does not exist
637 fGeantUISession = new G4UIExecutive(fARGC, fARGV);
638}
639
640//_____________________________________________________________________________
642{
644
646
647 if (fGeantUISession) {
648 // interactive session
649 G4cout << "Welcome (back) in Geant4" << G4endl;
650 fGeantUISession->GetSession()->SessionStart();
651 G4cout << "Welcome (back) in Root" << G4endl;
652 }
653 else {
654 G4cout << "Geant4 UI not available." << G4endl;
655 }
656}
657
658//_____________________________________________________________________________
660{
662
664 if (fRootUISession) {
665 G4cout << "Welcome (back) in Root" << G4endl;
666 fRootUISession->Run(kTRUE);
667 G4cout << "Welcome (back) in Geant4" << G4endl;
668 }
669}
670
671//_____________________________________________________________________________
672void TG4RunManager::ProcessGeantMacro(G4String macroName)
673{
675
676 G4String command = "/control/execute " + macroName;
677 ProcessGeantCommand(command);
678}
679
680//_____________________________________________________________________________
681void TG4RunManager::ProcessRootMacro(G4String macroName)
682{
684
685 // load macro file
686 G4String macroFile = macroName;
687 macroFile.append(".C");
688 gROOT->LoadMacro(macroFile);
689
690 // execute macro function
691 G4String macroFunction = macroName;
692 macroFunction.append("()");
693 gInterpreter->ProcessLine(macroFunction);
694}
695
696//_____________________________________________________________________________
698{
700
701 G4UImanager* pUI = G4UImanager::GetUIpointer();
702 G4int result = pUI->ApplyCommand(command);
703
704 // From G4UIbatch::ExecCommand():
705 switch (result) {
706 case fCommandSucceeded:
707 break;
708 case fCommandNotFound:
709 G4cerr << "***** COMMAND NOT FOUND <" << command << "> *****" << G4endl;
710 break;
711 case fIllegalApplicationState:
712 G4cerr << "***** Illegal application state <" << command << "> *****"
713 << G4endl;
714 break;
715 default:
716 G4int pn = result % 100;
717 G4cerr << "***** Illegal parameter (" << pn << ") <" << command
718 << "> *****" << G4endl;
719 }
720}
721
722//_____________________________________________________________________________
724{
726
727 gInterpreter->ProcessLine(command);
728}
729
730//_____________________________________________________________________________
738
739//_____________________________________________________________________________
741{
743
744 G4int eventID = fRunManager->GetCurrentEvent()->GetEventID();
745 return eventID;
746}
747
748//_____________________________________________________________________________
750{
753
754 return false;
755}
Definition of the TG4ActionInitialization class.
Definition of the TG4DetConstruction class.
Definition of the TG4EventAction class.
Definition of the TG4G3PhysicsManager class.
Definition of the TG4GeometryManager class.
Definition of the TG4GeometryServices class.
Definition of the TG4Globals class and basic container types.
Definition of the TG4PhysicsManager class.
Definition of the TG4PostDetConstruction class.
Definition of the TG4RegionsManager2 class.
Definition of the TG4RegionsManager class.
Definition of the TG4RunConfiguration class.
Definition of the TG4RunManager.h class.
Definition of the TG4SDConstruction class.
Definition of the TG4SDManager class.
Definition of the TG4SDServices class.
Definition of the TG4SpecialPhysicsList class.
Definition of the TG4StackPopper class.
Definition of the TG4StateManager class.
Definition of the TG4StepManager class.
Definition of the TG4SteppingAction class.
Definition of the TG4TrackManager class.
Definition of the TG4TrackingAction class.
Definition of the TG4WorkerInitialization class.
Action Initialization class (required for MT mode)
Actions at the beginning and the end of event.
static TG4G3PhysicsManager * Instance()
void SetUserPostDetConstruction(TG4VUserPostDetConstruction *userPostDetConstruction)
void SetUserRegionConstruction(TG4VUserRegionConstruction *userRegionConstruction)
static TG4GeometryManager * Instance()
void SetUserLimits(const TG4G3CutVector &cuts, const TG4G3ControlVector &controls) const
void PrintStatistics(G4bool open, G4bool close) const
static TG4GeometryServices * Instance()
static void Warning(const TString &className, const TString &methodName, const TString &text)
static void Exception(const TString &className, const TString &methodName, const TString &text)
static TG4PhysicsManager * Instance()
Manager class for setting VMC cuts in energy in G4 regions.
Manager class for converting VMC cuts in energy in G4 regions.
Takes care of creating Geant4 user action classes using VMC.
Bool_t IsUseOfG4Scoring() const
Geant4 implementation of the TVirtualMC interface methods for access to Geant4 at run level.
void ProcessGeantCommand(G4String command)
void ConfigureRunManager()
G4bool fIsMCStackCached
the flag to cache MC stack only once
G4bool fHasEventByEventInitialization
Flag event-by-event processing.
G4int fNEventsProcessed
Number of events processed in event-by-event mode.
void SetRandomSeed()
picks up random seed from ROOT gRandom and propagates to Geant4
char ** fARGV
argv
Bool_t SecondariesAreOrdered() const
TG4VRegionsManager * fRegionsManager
regions manager
static TG4RunManager * fgMasterInstance
master instance
TApplication * fRootUISession
Root UI.
Int_t CurrentEvent() const
void ProcessRootCommand(G4String command)
static G4ThreadLocal TG4RunManager * fgInstance
thread local instance
G4bool fRootUIOwner
ownership of Root UI
G4RunManager * fRunManager
G4RunManager.
TG4RunManager()
Not implemented.
G4UIExecutive * fGeantUISession
G4 UI.
G4bool fUseRootRandom
the option to use Root random number seed
G4int fARGC
argc
void CloneRootNavigatorForWorker()
TG4RunConfiguration * fRunConfiguration
TG4RunConfiguration.
void ProcessRootMacro(G4String macroName)
void ProcessGeantMacro(G4String macroName)
Bool_t ProcessRun(G4int nofEvents)
TG4RunMessenger fMessenger
messenger
void FilterARGV(const G4String &option)
G4bool fInProcessRun
flag while being in BeamOn
virtual ~TG4RunManager()
static TG4SDManager * Instance()
void LateInitialize(TG4ScoreWeightCalculator swc)
void SetIsStopRun(G4bool stopRun)
void PrintStatistics(G4bool open, G4bool close) const
G4bool GetIsStopRun() const
static TG4SDServices * Instance()
void SetUserFastSimulation(TG4VUserFastSimulation *fastSimulation)
static TG4SpecialPhysicsList * Instance()
static TG4StackPopper * Instance()
void SetMCStack(TVirtualMCStack *mcStack)
void SetNewState(TG4ApplicationState state)
static TG4StateManager * Instance()
static TG4StepManager * Instance()
static TG4SteppingAction * Instance()
void SetMCStack(TVirtualMCStack *mcStack)
static TG4TrackManager * Instance()
void SetMCManagerStack(TMCManagerStack *mcManagerStack)
void SetMCStack(TVirtualMCStack *mcStack)
static TG4TrackingAction * Instance()
The abstract base class which is used to build fast simulation models.
virtual G4int VerboseLevel() const
Definition TG4Verbose.h:78
TG4Verbose(const G4String &cmdName)
Actions at start and end of run on a worker (call in MT mode only)
@ kMisalignGeometry
in MisalignGeometry
@ kConstructGeometry
in ConstructGeometry
@ kNotInApplication
not in VMC application