]> git.uio.no Git - u/mrichter/AliRoot.git/blame - AliGeant4/AliDetConstruction.cxx
AliTracking/SteppingAction update commented
[u/mrichter/AliRoot.git] / AliGeant4 / AliDetConstruction.cxx
CommitLineData
676fb573 1// $Id$
2// Category: geometry
3//
4// See the class description in the header file.
5
6#include "AliDetConstruction.h"
7#include "AliSingleModuleConstruction.h"
c97337f9 8#include "AliDetSwitch.h"
676fb573 9#include "AliGlobals.h"
10#include "AliRun.h"
11#include "AliModule.h"
12
13AliDetConstruction::AliDetConstruction()
14 : fTopVolumeName("ALIC")
15{
16 // initialize det switch vector:
a168ab9b 17 // moduleName nofVersions defaultVersion PPRVersion [type isStandalone]
e28abd7f 18 // det switch objects are deleted in
19 // tbe base class (AliModulesCompositions) destructor
676fb573 20
21 AliDetSwitch* detSwitch;
a168ab9b 22 detSwitch = new AliDetSwitch("ABSO", 1, 0, 0, kStructure);
676fb573 23 AddDetSwitch(detSwitch);
a168ab9b 24 detSwitch = new AliDetSwitch("DIPO", 3, 2, 2, kStructure, false);
676fb573 25 AddDetSwitch(detSwitch);
a168ab9b 26 detSwitch = new AliDetSwitch("FRAME", 2, 1, 1, kStructure, false);
676fb573 27 AddDetSwitch(detSwitch);
a168ab9b 28 detSwitch = new AliDetSwitch("HALL", 1, 0, 0, kStructure);
676fb573 29 AddDetSwitch(detSwitch);
a168ab9b 30 detSwitch = new AliDetSwitch("MAG", 1, 0, 0, kStructure);
676fb573 31 AddDetSwitch(detSwitch);
a168ab9b 32 detSwitch = new AliDetSwitch("PIPE", 4, 0, 0, kStructure);
676fb573 33 AddDetSwitch(detSwitch);
a168ab9b 34 detSwitch = new AliDetSwitch("SHIL", 1, 0, 0, kStructure);
676fb573 35 AddDetSwitch(detSwitch);
a168ab9b 36 detSwitch = new AliDetSwitch("CASTOR", 2, 1, 1);
676fb573 37 AddDetSwitch(detSwitch);
f8360829 38 detSwitch = new AliDetSwitch("FMD", 2, 0, 0);
676fb573 39 AddDetSwitch(detSwitch);
f8360829 40 detSwitch = new AliDetSwitch("ITS", 10, 7, 7);
676fb573 41 AddDetSwitch(detSwitch);
a168ab9b 42 detSwitch = new AliDetSwitch("MUON", 2, 0, 0);
676fb573 43 AddDetSwitch(detSwitch);
a168ab9b 44 detSwitch = new AliDetSwitch("PHOS", 5, 1, 1);
676fb573 45 AddDetSwitch(detSwitch);
f8360829 46 detSwitch = new AliDetSwitch("PMD", 3, 1, 1);
676fb573 47 AddDetSwitch(detSwitch);
a168ab9b 48 detSwitch = new AliDetSwitch("RICH", 3, 1, 1);
676fb573 49 AddDetSwitch(detSwitch);
a168ab9b 50 detSwitch = new AliDetSwitch("START", 2, 1, 1);
676fb573 51 AddDetSwitch(detSwitch);
f8360829 52 detSwitch = new AliDetSwitch("TOF", 5, 2, 2, kDetector, false);
676fb573 53 AddDetSwitch(detSwitch);
f8360829 54 detSwitch = new AliDetSwitch("TPC", 4, 2, 2);
676fb573 55 AddDetSwitch(detSwitch);
f8360829 56 detSwitch = new AliDetSwitch("TRD", 2, 1, 1, kDetector, false);
676fb573 57 AddDetSwitch(detSwitch);
a168ab9b 58 detSwitch = new AliDetSwitch("ZDC", 2, 1, 1, kDetector, false);
676fb573 59 AddDetSwitch(detSwitch);
60}
61
62AliDetConstruction::AliDetConstruction(const AliDetConstruction& right)
63 : AliModulesComposition(right)
64{
65 // AliModuleComposition is protected from copying
66}
67
68AliDetConstruction::~AliDetConstruction() {
69//
70}
71
72// operators
73
74AliDetConstruction&
75AliDetConstruction::operator=(const AliDetConstruction& right)
76{
77 // check assignement to self
78 if (this == &right) return *this;
79
80 // base class assignement
81 // AliModuleComposition is protected from assigning
82 AliModulesComposition::operator=(right);
83
84 return *this;
85}
86
87// private methods
88
89void AliDetConstruction::BuildDetectors()
90{
91// Create module constructions for AliModules
92// that have been created and registered by gAlice
93// ---
94
95 TObjArray* pDetectors = gAlice->Detectors();
96 TIter next(pDetectors);
97
98 // the first AliModule is expected to be the top volume
99 AliModule *module = (AliModule*)next();
100 if (G4String(module->GetName()) != "BODY") {
101 G4String text = "AliDetConstruction::BuildDetectors():\n";
102 text = text + " Instead of BODY - the first module ";
103 text = text + module->GetName() + " has been found.";
104 AliGlobals::Exception(text);
105 }
106 AddSingleModuleConstruction("BODY", 0, kStructure);
107
108 G4bool first = true;
109 while ((module = (AliModule*)next())) {
110 // register moduleConstruction in fDetSwitchVector
111 // in order to keep availability of /AlDet/list command
112 G4String modName = module->GetName();
113 G4int modVersion = module->IsVersion();
114 if (first)
115 // skip registering of the top volume
116 first = false;
117 else
118 SwitchDetOn(modName, modVersion);
119
120 // all modules will be processed alltogether
121 AddMoreModuleConstruction(modName, modVersion);
122
123 G4cout << "Created module construction for "
5f1d09c5 124 << modName << "v" << modVersion << "." << G4endl;
676fb573 125 }
126
127 // do not process Config.C
128 // (it was processed when creating modules by gAlice)
129 SetProcessConfigToModules(false);
130}
131
132void AliDetConstruction::CreateDetectors()
133{
134// Creates AliModules and their module constructions
135// according to the fDetSwitchVector
136// ---
137
138 // add top volume (AliBODY) construction first
139 AddSingleModuleConstruction("BODY", 0, kStructure);
140
141 // add modules constructions
142 const G4RWTPtrOrderedVector<AliDetSwitch>& krDetSwitchVector
143 = GetDetSwitchVector();
144 for (G4int id=0; id<krDetSwitchVector.entries(); id++)
145 {
146 G4String detName = krDetSwitchVector[id]->GetDetName();
147 G4int version = krDetSwitchVector[id]->GetSwitchedVersion();
148 G4bool isStandalone = krDetSwitchVector[id]->IsStandalone();
149 AliModuleType type = krDetSwitchVector[id]->GetType();
150
151 if (version > -1)
152 if (isStandalone)
153 AddSingleModuleConstruction(detName, version, type);
154 else
155 AddMoreModuleConstruction(detName, version, type);
156 }
157}
158
159void AliDetConstruction::CheckDetDependencies()
160{
161// Checks modules dependencies.
162// Dependent modules FRAME, TOF, TRD
163// TOF always requires FRAMEv1
164// TRD can be built with both (??)
a168ab9b 165// ZDC requires DIPO
676fb573 166// ---
167
168 const G4RWTPtrOrderedVector<AliDetSwitch>& krDetSwitchVector
169 = GetDetSwitchVector();
170
171 // get switched versions of dependent modules
172 G4int nofDets = krDetSwitchVector.entries();
173 G4int verFRAME = -1;
a168ab9b 174 G4int verDIPO = -1;
676fb573 175 G4int verTOF = -1;
176 G4int verTRD = -1;
a168ab9b 177 G4int verZDC = -1;
676fb573 178 AliDetSwitch* detSwitchFRAME = 0;
a168ab9b 179 AliDetSwitch* detSwitchDIPO = 0;
676fb573 180 for (G4int id=0; id<nofDets; id++) {
181 G4String detName = krDetSwitchVector[id]->GetDetName();
182 if (detName == "FRAME") {
183 verFRAME = krDetSwitchVector[id]->GetSwitchedVersion();
184 detSwitchFRAME = krDetSwitchVector[id];
185 }
a168ab9b 186 if (detName == "DIPO") {
187 verDIPO = krDetSwitchVector[id]->GetSwitchedVersion();
188 detSwitchDIPO = krDetSwitchVector[id];
189 }
676fb573 190 if (detName == "TOF")
191 verTOF = krDetSwitchVector[id]->GetSwitchedVersion();
192 if (detName == "TRD")
193 verTRD = krDetSwitchVector[id]->GetSwitchedVersion();
a168ab9b 194 if (detName == "ZDC")
195 verZDC = krDetSwitchVector[id]->GetSwitchedVersion();
676fb573 196 }
197
198 // check dependencies
199 if (verTRD > -1 && verTOF > -1) {
200 // both TRD and TOF
201 if (verFRAME != 1) {
202 detSwitchFRAME->SwitchOn(1);
203 G4String text = "AliDetConstruction::CheckDetDependencies: \n";
204 text = text + " Switched TOF and TRD require FRAME v1.\n";
205 text = text + " The det switch for FRAME has been changed.";
206 AliGlobals::Warning(text);
207 }
208 }
209 else if (verTRD > -1 && verTOF == -1) {
210 // only TRD
211 if (verFRAME < 0) {
212 detSwitchFRAME->SwitchOn(1);
213 G4String text = "AliDetConstruction::CheckDetDependencies: \n";
214 text = text + " Switched TRD require FRAME.\n";
215 text = text + " The det switch for FRAME has been changed.";
216 AliGlobals::Warning(text);
217 }
218 }
219 else if (verTRD == -1 && verTOF > -1) {
220 // only TOF
221 if (verFRAME != 1) {
222 detSwitchFRAME->SwitchOn(1);
223 G4String text = "AliDetConstruction::CheckDetDependencies: \n";
224 text = text + " Switched TOF requires FRAME v1.\n";
225 text = text + " The det switch for FRAME has been changed.";
226 AliGlobals::Warning(text);
227 }
228 }
a168ab9b 229 if (verZDC > 0 && verDIPO == -1) {
230 detSwitchDIPO->SwitchOnDefault();
231 G4String text = "AliDetConstruction::CheckDetDependencies: \n";
232 text = text + " Switched ZDC requires DIPO.\n";
233 text = text + " The det switch for DIPO has been changed.";
234 AliGlobals::Warning(text);
235 }
676fb573 236}
237
238// public methods
239
240G4VPhysicalVolume* AliDetConstruction::Construct()
241{
242// Constructs geometry.
243// This method is called by G4RunManager in initialization.
244// ---
245
246 if (gAlice->Modules()->GetLast() < 0) {
247 // create geometry (including AliModules) according to
248 // the fDetSwitchVector
249 CheckDetDependencies();
250 CreateDetectors();
251 }
252 else {
253 // create geometry for AliModules
254 // that have been created and registered by gAlice
255 BuildDetectors();
256 }
257 // construct modules geometry
258 ConstructModules();
259
260 return AliSingleModuleConstruction::GetWorld();
261}
262