]>
Commit | Line | Data |
---|---|---|
1 | // $Id$ | |
2 | // Category: geometry | |
3 | // | |
4 | // Author: I. Hrivnacova | |
5 | // | |
6 | // Class AliDetConstruction | |
7 | // ------------------------ | |
8 | // See the class description in the header file. | |
9 | ||
10 | #include "AliDetConstruction.h" | |
11 | #include "AliDetSwitch.h" | |
12 | #include "AliLVTree.h" | |
13 | #include "AliGlobals.h" | |
14 | #include "AliFiles.h" | |
15 | #include "AliRun.h" | |
16 | #include "AliModule.h" | |
17 | ||
18 | #include "TG4XMLGeometryGenerator.h" | |
19 | #include "TG4GeometryServices.h" | |
20 | ||
21 | #include <G4VPhysicalVolume.hh> | |
22 | ||
23 | //_____________________________________________________________________________ | |
24 | AliDetConstruction::AliDetConstruction() | |
25 | : AliModulesComposition() | |
26 | { | |
27 | // initialize det switch vector: | |
28 | // moduleName nofVersions defaultVersion [type] | |
29 | // det switch objects are deleted in fDetSwitchVector destructor | |
30 | ||
31 | fDetSwitchVector.Add(new AliDetSwitch("MAG", 1, 0, kStructure)); | |
32 | fDetSwitchVector.Add(new AliDetSwitch("ABSO", 1, 0, kStructure)); | |
33 | fDetSwitchVector.Add(new AliDetSwitch("DIPO", 3, 2, kStructure)); | |
34 | fDetSwitchVector.Add(new AliDetSwitch("FRAME", 3, 2, kStructure)); | |
35 | fDetSwitchVector.Add(new AliDetSwitch("HALL", 1, 0, kStructure)); | |
36 | fDetSwitchVector.Add(new AliDetSwitch("PIPE", 5, 0, kStructure)); | |
37 | fDetSwitchVector.Add(new AliDetSwitch("SHIL", 2, 1, kStructure)); | |
38 | fDetSwitchVector.Add(new AliDetSwitch("CASTOR", 2, 1)); | |
39 | fDetSwitchVector.Add(new AliDetSwitch("FMD", 2, 1)); | |
40 | fDetSwitchVector.Add(new AliDetSwitch("ITS", 7, 5)); | |
41 | fDetSwitchVector.Add(new AliDetSwitch("MUON", 2, 1)); | |
42 | fDetSwitchVector.Add(new AliDetSwitch("PHOS", 2, 1)); | |
43 | fDetSwitchVector.Add(new AliDetSwitch("PMD", 3, 1)); | |
44 | fDetSwitchVector.Add(new AliDetSwitch("RICH", 3, 1)); | |
45 | fDetSwitchVector.Add(new AliDetSwitch("START", 2, 1)); | |
46 | fDetSwitchVector.Add(new AliDetSwitch("TOF", 5, 2)); | |
47 | fDetSwitchVector.Add(new AliDetSwitch("TPC", 4, 2)); | |
48 | fDetSwitchVector.Add(new AliDetSwitch("TRD", 2, 1)); | |
49 | fDetSwitchVector.Add(new AliDetSwitch("ZDC", 3, 2)); | |
50 | ||
51 | // update messenger | |
52 | fDetSwitchVector.UpdateMessenger(); | |
53 | ||
54 | // instantiate LVtree browser | |
55 | AliLVTree::Instance(); | |
56 | } | |
57 | ||
58 | //_____________________________________________________________________________ | |
59 | AliDetConstruction::AliDetConstruction(const AliDetConstruction& right) | |
60 | : AliModulesComposition(right) | |
61 | { | |
62 | // AliModuleComposition is protected from copying | |
63 | } | |
64 | ||
65 | //_____________________________________________________________________________ | |
66 | AliDetConstruction::~AliDetConstruction() | |
67 | { | |
68 | // delete LVtree browser | |
69 | delete AliLVTree::Instance(); | |
70 | } | |
71 | ||
72 | // operators | |
73 | ||
74 | //_____________________________________________________________________________ | |
75 | AliDetConstruction& | |
76 | AliDetConstruction::operator=(const AliDetConstruction& right) | |
77 | { | |
78 | // check assignement to self | |
79 | if (this == &right) return *this; | |
80 | ||
81 | // base class assignement | |
82 | // AliModuleComposition is protected from assigning | |
83 | AliModulesComposition::operator=(right); | |
84 | ||
85 | return *this; | |
86 | } | |
87 | ||
88 | // private methods | |
89 | ||
90 | //_____________________________________________________________________________ | |
91 | void AliDetConstruction::BuildDetectors() | |
92 | { | |
93 | // Create module constructions for AliModules | |
94 | // that have been created and registered by gAlice | |
95 | // --- | |
96 | ||
97 | TObjArray* pDetectors = gAlice->Detectors(); | |
98 | TIter next(pDetectors); | |
99 | ||
100 | // the first AliModule is expected to be the top volume | |
101 | AliModule *module = (AliModule*)next(); | |
102 | if (G4String(module->GetName()) != "BODY") { | |
103 | G4String text = "AliDetConstruction::BuildDetectors():\n"; | |
104 | text = text + " Instead of BODY - the first module "; | |
105 | text = text + module->GetName() + " has been found."; | |
106 | AliGlobals::Exception(text); | |
107 | } | |
108 | AddModule("BODY", 0, kStructure); | |
109 | ||
110 | G4bool first = true; | |
111 | while ((module = (AliModule*)next())) { | |
112 | ||
113 | // register moduleConstruction in fDetSwitchVector | |
114 | // in order to keep availability of /aliDet/list command | |
115 | G4String modName = module->GetName(); | |
116 | G4int modVersion = module->IsVersion(); | |
117 | if (first) | |
118 | // skip registering of the top volume | |
119 | first = false; | |
120 | else | |
121 | fDetSwitchVector.SwitchDetOn(modName, modVersion); | |
122 | ||
123 | // all modules will be processed alltogether | |
124 | AddModule(modName, modVersion, fDetSwitchVector.GetDetSwitch(modName)->GetType()); | |
125 | ||
126 | if (VerboseLevel() > 0) { | |
127 | G4cout << "Created module construction for " | |
128 | << modName << "v" << modVersion << "." << G4endl; | |
129 | } | |
130 | } | |
131 | ||
132 | // do not process Config.C | |
133 | // (it was processed when creating modules by gAlice) | |
134 | SetProcessConfigToModules(false); | |
135 | } | |
136 | ||
137 | //_____________________________________________________________________________ | |
138 | void AliDetConstruction::CreateDetectors() | |
139 | { | |
140 | // Creates AliModules and their module constructions | |
141 | // according to the fDetSwitchVector | |
142 | // --- | |
143 | ||
144 | // add top volume (AliBODY) construction first | |
145 | AddModule("BODY", 0, kStructure); | |
146 | ||
147 | // add modules constructions | |
148 | for (G4int i=0; i<fDetSwitchVector.GetSize(); i++) | |
149 | { | |
150 | AliDetSwitch* detSwitch = fDetSwitchVector.GetDetSwitch(i); | |
151 | G4String detName = detSwitch->GetDetName(); | |
152 | G4int version = detSwitch->GetSwitchedVersion(); | |
153 | AliModuleType type = detSwitch->GetType(); | |
154 | ||
155 | if (version > -1) | |
156 | AddModule(detName, version, type); | |
157 | } | |
158 | } | |
159 | ||
160 | //_____________________________________________________________________________ | |
161 | void AliDetConstruction::CheckDependence(const G4String& master, | |
162 | const G4String& slave) | |
163 | { | |
164 | // Checks modules dependence. | |
165 | // If master is switch on and slave off, the default version | |
166 | // of slave is switched on and a warning is issued. | |
167 | // --- | |
168 | ||
169 | AliDetSwitch* masterSwitch = fDetSwitchVector.GetDetSwitch(master); | |
170 | AliDetSwitch* slaveSwitch = fDetSwitchVector.GetDetSwitch(slave); | |
171 | ||
172 | if ( masterSwitch->GetSwitchedVersion() > -1 && | |
173 | slaveSwitch->GetSwitchedVersion() < 0 ) { | |
174 | ||
175 | slaveSwitch->SwitchOnDefault(); | |
176 | ||
177 | // warning | |
178 | G4String text = "AliDetConstruction::CheckDetDependence: \n"; | |
179 | text = text + " Switched " + master + " requires " + slave + ".\n"; | |
180 | text = text + " The det switch for " + slave + " has been changed."; | |
181 | AliGlobals::Warning(text); | |
182 | } | |
183 | } | |
184 | ||
185 | //_____________________________________________________________________________ | |
186 | void AliDetConstruction::CheckDetDependencies() | |
187 | { | |
188 | // Checks modules dependencies. | |
189 | // --- | |
190 | ||
191 | CheckDependence("MUON", "DIPO"); | |
192 | CheckDependence("TOF", "FRAME"); | |
193 | CheckDependence("TRD", "FRAME"); | |
194 | CheckDependence("ZDC", "PIPE"); | |
195 | CheckDependence("ZDC", "ABSO"); | |
196 | CheckDependence("ZDC", "DIPO"); | |
197 | CheckDependence("ZDC", "SHIL"); | |
198 | } | |
199 | ||
200 | // public methods | |
201 | ||
202 | //_____________________________________________________________________________ | |
203 | G4VPhysicalVolume* AliDetConstruction::Construct() | |
204 | { | |
205 | // Constructs geometry. | |
206 | // This method is called by G4RunManager in initialization. | |
207 | // --- | |
208 | ||
209 | if (gAlice->Modules()->GetLast() < 0) { | |
210 | // create geometry (including AliModules) according to | |
211 | // the fDetSwitchVector | |
212 | CheckDetDependencies(); | |
213 | CreateDetectors(); | |
214 | } | |
215 | else { | |
216 | // create geometry for AliModules | |
217 | // that have been created and registered by gAlice | |
218 | BuildDetectors(); | |
219 | } | |
220 | // construct modules geometry | |
221 | ConstructModules(); | |
222 | ||
223 | return TG4GeometryServices::Instance()->GetWorld(); | |
224 | } | |
225 | ||
226 | //_____________________________________________________________________________ | |
227 | void AliDetConstruction::GenerateXMLGeometry() const | |
228 | { | |
229 | // Generates XML geometry file from the top volume. | |
230 | // The file name is set according the last switched detector | |
231 | // registered in the det switch vector. | |
232 | // --- | |
233 | ||
234 | G4VPhysicalVolume* world = TG4GeometryServices::Instance()->GetWorld(); | |
235 | ||
236 | // XML filename | |
237 | // according to last switched detector | |
238 | G4String detName; | |
239 | G4String detVersion = ""; | |
240 | G4int version = -1; | |
241 | for (G4int i=fDetSwitchVector.GetSize()-1; i>=0; i--) { | |
242 | version = fDetSwitchVector.GetDetSwitch(i)->GetSwitchedVersion(); | |
243 | if (version > -1) { | |
244 | detName = fDetSwitchVector.GetDetSwitch(i)->GetDetName(); | |
245 | AliGlobals::AppendNumberToString(detVersion,version); | |
246 | break; | |
247 | } | |
248 | } | |
249 | G4String filePath | |
250 | = AliFiles::Instance()->GetXMLFilePath(detName, version); | |
251 | ||
252 | // set top volume name | |
253 | G4String topName = world->GetName() + "_comp"; | |
254 | ||
255 | // generate XML | |
256 | ||
257 | TG4XMLGeometryGenerator xml; | |
258 | xml.OpenFile(filePath); | |
259 | ||
260 | // generate materials | |
261 | // not implemented | |
262 | // xml.GenerateMaterials(version, "today", "Generated from G4", | |
263 | // "v4", world->GetLogicalVolume()); | |
264 | ||
265 | // generate volumes tree | |
266 | xml.GenerateSection(detName, detVersion, "today", "Generated from Geant4", | |
267 | topName, world->GetLogicalVolume()); | |
268 | xml.CloseFile(); | |
269 | ||
270 | if (VerboseLevel() > 0) { | |
271 | G4cout << "File " << detName << "v" << version << ".xml has been generated." | |
272 | << G4endl; | |
273 | } | |
274 | } | |
275 |