Logo ROOT   6.30.04
Reference Guide
 All Namespaces Files Pages
TVirtualMCApplication.cxx
Go to the documentation of this file.
1 // @(#)root/vmc:$Id$
2 // Author: Ivana Hrivnacova, 27/03/2002
3 
4 /*************************************************************************
5  * Copyright (C) 2006, Rene Brun and Fons Rademakers. *
6  * Copyright (C) 2002, ALICE Experiment at CERN. *
7  * All rights reserved. *
8  * *
9  * For the licensing terms see $ROOTSYS/LICENSE. *
10  * For the list of contributors see $ROOTSYS/README/CREDITS. *
11  *************************************************************************/
12 
13 #include "TVirtualMCApplication.h"
14 #include "TError.h"
15 #include "TVirtualMC.h"
16 #include "TMCManager.h"
17 
18 /** \class TVirtualMCApplication
19  \ingroup vmc
20 
21 Interface to a user Monte Carlo application.
22 
23 */
24 
25 TMCThreadLocal TVirtualMCApplication *TVirtualMCApplication::fgInstance = nullptr;
26 Bool_t TVirtualMCApplication::fLockMultiThreading = kFALSE;
27 
28 ////////////////////////////////////////////////////////////////////////////////
29 ///
30 /// Standard constructor
31 ///
32 
33 TVirtualMCApplication::TVirtualMCApplication(const char *name, const char *title) : TNamed(name, title)
34 {
35  if (fgInstance) {
36  ::Fatal("TVirtualMCApplication::TVirtualMCApplication", "Attempt to create two instances of singleton.");
37  }
38 
39  // This is set to true if a TMCManager was reuqested.
40  if (fLockMultiThreading) {
41  ::Fatal("TVirtualMCApplication::TVirtualMCApplication", "In multi-engine run ==> multithreading is disabled.");
42  }
43 
44  fgInstance = this;
45  // There cannot be a TVirtualMC since it must have registered to this
46  // TVirtualMCApplication
47  fMC = nullptr;
48  fMCManager = nullptr;
49 }
50 
51 ////////////////////////////////////////////////////////////////////////////////
52 ///
53 /// Default constructor
54 ///
55 
56 TVirtualMCApplication::TVirtualMCApplication() : TNamed()
57 {
58  fgInstance = this;
59  fMC = nullptr;
60  fMCManager = nullptr;
61 }
62 
63 ////////////////////////////////////////////////////////////////////////////////
64 ///
65 /// Destructor
66 ///
67 
68 TVirtualMCApplication::~TVirtualMCApplication()
69 {
70  fgInstance = nullptr;
71  if (fMCManager) {
72  delete fMCManager;
73  }
74 }
75 
76 ////////////////////////////////////////////////////////////////////////////////
77 ///
78 /// Static access method
79 ///
80 
81 TVirtualMCApplication *TVirtualMCApplication::Instance()
82 {
83  return fgInstance;
84 }
85 
86 ////////////////////////////////////////////////////////////////////////////////
87 ///
88 /// For backwards compatibility provide a static GetMC method
89 ///
90 
91 void TVirtualMCApplication::RequestMCManager()
92 {
93  fMCManager = new TMCManager();
94  fMCManager->Register(this);
95  fMCManager->ConnectEnginePointer(&fMC);
96  fLockMultiThreading = kTRUE;
97 }
98 
99 ////////////////////////////////////////////////////////////////////////////////
100 ///
101 /// /// Register the an engine.
102 ///
103 
104 void TVirtualMCApplication::Register(TVirtualMC *mc)
105 {
106  // If there is already a transport engine, fail since only one is allowed.
107  if (fMC && !fMCManager) {
108  Fatal("Register", "Attempt to register a second TVirtualMC which "
109  "is not allowed");
110  }
111  fMC = mc;
112  if (fMCManager) {
113  fMCManager->Register(mc);
114  }
115 }
116 
117 ////////////////////////////////////////////////////////////////////////////////
118 ///
119 /// Return the current transport engine in use
120 ///
121 
122 TVirtualMC *TVirtualMCApplication::GetMC() const
123 {
124  return fMC;
125 }