4 // See the class description in the header file.
6 #include "AliDetConstruction.h"
7 #include "AliSingleModuleConstruction.h"
8 #include "AliDetSwitch.h"
9 #include "AliGlobals.h"
11 #include "AliModule.h"
13 AliDetConstruction::AliDetConstruction()
14 : fTopVolumeName("ALIC")
16 // initialize det switch vector:
17 // moduleName nofVersions defaultVersion [type isStandalone]
18 // det switch objects are deleted in
19 // tbe base class (AliModulesCompositions) destructor
21 AliDetSwitch* detSwitch;
22 detSwitch = new AliDetSwitch("ABSO", 1, 0, kStructure);
23 AddDetSwitch(detSwitch);
24 detSwitch = new AliDetSwitch("DIPO", 3, 2, kStructure);
25 AddDetSwitch(detSwitch);
26 detSwitch = new AliDetSwitch("FRAME", 2, 1, kStructure, false);
27 AddDetSwitch(detSwitch);
28 detSwitch = new AliDetSwitch("HALL", 1, 0, kStructure);
29 AddDetSwitch(detSwitch);
30 detSwitch = new AliDetSwitch("MAG", 1, 0, kStructure);
31 AddDetSwitch(detSwitch);
32 detSwitch = new AliDetSwitch("PIPE", 4, 0, kStructure);
33 AddDetSwitch(detSwitch);
34 detSwitch = new AliDetSwitch("SHIL", 1, 0, kStructure);
35 AddDetSwitch(detSwitch);
36 detSwitch = new AliDetSwitch("CASTOR", 2, 1);
37 AddDetSwitch(detSwitch);
38 detSwitch = new AliDetSwitch("FMD", 2, 1);
39 AddDetSwitch(detSwitch);
40 detSwitch = new AliDetSwitch("ITS", 6, 5);
41 AddDetSwitch(detSwitch);
42 detSwitch = new AliDetSwitch("MUON", 2, 0);
43 AddDetSwitch(detSwitch);
44 detSwitch = new AliDetSwitch("PHOS", 5, 1);
45 AddDetSwitch(detSwitch);
46 detSwitch = new AliDetSwitch("PMD", 3, 0);
47 AddDetSwitch(detSwitch);
48 detSwitch = new AliDetSwitch("RICH", 3, 1);
49 AddDetSwitch(detSwitch);
50 detSwitch = new AliDetSwitch("START", 2, 0);
51 AddDetSwitch(detSwitch);
52 detSwitch = new AliDetSwitch("TOF", 5, 1, kDetector, false);
53 AddDetSwitch(detSwitch);
54 detSwitch = new AliDetSwitch("TPC", 4, 1);
55 AddDetSwitch(detSwitch);
56 detSwitch = new AliDetSwitch("TRD", 2, 0, kDetector, false);
57 AddDetSwitch(detSwitch);
58 detSwitch = new AliDetSwitch("ZDC", 2, 1);
59 AddDetSwitch(detSwitch);
62 AliDetConstruction::AliDetConstruction(const AliDetConstruction& right)
63 : AliModulesComposition(right)
65 // AliModuleComposition is protected from copying
68 AliDetConstruction::~AliDetConstruction() {
75 AliDetConstruction::operator=(const AliDetConstruction& right)
77 // check assignement to self
78 if (this == &right) return *this;
80 // base class assignement
81 // AliModuleComposition is protected from assigning
82 AliModulesComposition::operator=(right);
89 void AliDetConstruction::BuildDetectors()
91 // Create module constructions for AliModules
92 // that have been created and registered by gAlice
95 TObjArray* pDetectors = gAlice->Detectors();
96 TIter next(pDetectors);
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);
106 AddSingleModuleConstruction("BODY", 0, kStructure);
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();
115 // skip registering of the top volume
118 SwitchDetOn(modName, modVersion);
120 // all modules will be processed alltogether
121 AddMoreModuleConstruction(modName, modVersion);
123 G4cout << "Created module construction for "
124 << modName << "v" << modVersion << "." << G4endl;
127 // do not process Config.C
128 // (it was processed when creating modules by gAlice)
129 SetProcessConfigToModules(false);
132 void AliDetConstruction::CreateDetectors()
134 // Creates AliModules and their module constructions
135 // according to the fDetSwitchVector
138 // add top volume (AliBODY) construction first
139 AddSingleModuleConstruction("BODY", 0, kStructure);
141 // add modules constructions
142 const G4RWTPtrOrderedVector<AliDetSwitch>& krDetSwitchVector
143 = GetDetSwitchVector();
144 for (G4int id=0; id<krDetSwitchVector.entries(); id++)
146 G4String detName = krDetSwitchVector[id]->GetDetName();
147 G4int version = krDetSwitchVector[id]->GetSwitchedVersion();
148 G4bool isStandalone = krDetSwitchVector[id]->IsStandalone();
149 AliModuleType type = krDetSwitchVector[id]->GetType();
153 AddSingleModuleConstruction(detName, version, type);
155 AddMoreModuleConstruction(detName, version, type);
159 void AliDetConstruction::CheckDetDependencies()
161 // Checks modules dependencies.
162 // Dependent modules FRAME, TOF, TRD
163 // TOF always requires FRAMEv1
164 // TRD can be built with both (??)
167 const G4RWTPtrOrderedVector<AliDetSwitch>& krDetSwitchVector
168 = GetDetSwitchVector();
170 // get switched versions of dependent modules
171 G4int nofDets = krDetSwitchVector.entries();
175 AliDetSwitch* detSwitchFRAME = 0;
176 for (G4int id=0; id<nofDets; id++) {
177 G4String detName = krDetSwitchVector[id]->GetDetName();
178 if (detName == "FRAME") {
179 verFRAME = krDetSwitchVector[id]->GetSwitchedVersion();
180 detSwitchFRAME = krDetSwitchVector[id];
182 if (detName == "TOF")
183 verTOF = krDetSwitchVector[id]->GetSwitchedVersion();
184 if (detName == "TRD")
185 verTRD = krDetSwitchVector[id]->GetSwitchedVersion();
188 // check dependencies
189 if (verTRD > -1 && verTOF > -1) {
192 detSwitchFRAME->SwitchOn(1);
193 G4String text = "AliDetConstruction::CheckDetDependencies: \n";
194 text = text + " Switched TOF and TRD require FRAME v1.\n";
195 text = text + " The det switch for FRAME has been changed.";
196 AliGlobals::Warning(text);
199 else if (verTRD > -1 && verTOF == -1) {
202 detSwitchFRAME->SwitchOn(1);
203 G4String text = "AliDetConstruction::CheckDetDependencies: \n";
204 text = text + " Switched TRD require FRAME.\n";
205 text = text + " The det switch for FRAME has been changed.";
206 AliGlobals::Warning(text);
209 else if (verTRD == -1 && verTOF > -1) {
212 detSwitchFRAME->SwitchOn(1);
213 G4String text = "AliDetConstruction::CheckDetDependencies: \n";
214 text = text + " Switched TOF requires FRAME v1.\n";
215 text = text + " The det switch for FRAME has been changed.";
216 AliGlobals::Warning(text);
223 G4VPhysicalVolume* AliDetConstruction::Construct()
225 // Constructs geometry.
226 // This method is called by G4RunManager in initialization.
229 if (gAlice->Modules()->GetLast() < 0) {
230 // create geometry (including AliModules) according to
231 // the fDetSwitchVector
232 CheckDetDependencies();
236 // create geometry for AliModules
237 // that have been created and registered by gAlice
240 // construct modules geometry
243 return AliSingleModuleConstruction::GetWorld();