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 PPRVersion [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, 0, kStructure);
23 AddDetSwitch(detSwitch);
24 detSwitch = new AliDetSwitch("DIPO", 3, 2, 2, kStructure, false);
25 AddDetSwitch(detSwitch);
26 detSwitch = new AliDetSwitch("FRAME", 2, 1, 1, kStructure, false);
27 AddDetSwitch(detSwitch);
28 detSwitch = new AliDetSwitch("HALL", 1, 0, 0, kStructure);
29 AddDetSwitch(detSwitch);
30 detSwitch = new AliDetSwitch("MAG", 1, 0, 0, kStructure);
31 AddDetSwitch(detSwitch);
32 detSwitch = new AliDetSwitch("PIPE", 4, 0, 0, kStructure);
33 AddDetSwitch(detSwitch);
34 detSwitch = new AliDetSwitch("SHIL", 1, 0, 0, kStructure);
35 AddDetSwitch(detSwitch);
36 detSwitch = new AliDetSwitch("CASTOR", 2, 1, 1);
37 AddDetSwitch(detSwitch);
38 detSwitch = new AliDetSwitch("FMD", 2, 0, 0);
39 AddDetSwitch(detSwitch);
40 detSwitch = new AliDetSwitch("ITS", 10, 7, 7);
41 AddDetSwitch(detSwitch);
42 detSwitch = new AliDetSwitch("MUON", 2, 0, 0);
43 AddDetSwitch(detSwitch);
44 detSwitch = new AliDetSwitch("PHOS", 5, 1, 1);
45 AddDetSwitch(detSwitch);
46 detSwitch = new AliDetSwitch("PMD", 3, 1, 1);
47 AddDetSwitch(detSwitch);
48 detSwitch = new AliDetSwitch("RICH", 3, 1, 1);
49 AddDetSwitch(detSwitch);
50 detSwitch = new AliDetSwitch("START", 2, 1, 1);
51 AddDetSwitch(detSwitch);
52 detSwitch = new AliDetSwitch("TOF", 5, 2, 2, kDetector, false);
53 AddDetSwitch(detSwitch);
54 detSwitch = new AliDetSwitch("TPC", 4, 2, 2);
55 AddDetSwitch(detSwitch);
56 detSwitch = new AliDetSwitch("TRD", 2, 1, 1, kDetector, false);
57 AddDetSwitch(detSwitch);
58 detSwitch = new AliDetSwitch("ZDC", 2, 1, 1, kDetector, false);
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 (??)
168 const G4RWTPtrOrderedVector<AliDetSwitch>& krDetSwitchVector
169 = GetDetSwitchVector();
171 // get switched versions of dependent modules
172 G4int nofDets = krDetSwitchVector.entries();
178 AliDetSwitch* detSwitchFRAME = 0;
179 AliDetSwitch* detSwitchDIPO = 0;
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];
186 if (detName == "DIPO") {
187 verDIPO = krDetSwitchVector[id]->GetSwitchedVersion();
188 detSwitchDIPO = krDetSwitchVector[id];
190 if (detName == "TOF")
191 verTOF = krDetSwitchVector[id]->GetSwitchedVersion();
192 if (detName == "TRD")
193 verTRD = krDetSwitchVector[id]->GetSwitchedVersion();
194 if (detName == "ZDC")
195 verZDC = krDetSwitchVector[id]->GetSwitchedVersion();
198 // check dependencies
199 if (verTRD > -1 && verTOF > -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);
209 else if (verTRD > -1 && verTOF == -1) {
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);
219 else if (verTRD == -1 && verTOF > -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);
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);
240 G4VPhysicalVolume* AliDetConstruction::Construct()
242 // Constructs geometry.
243 // This method is called by G4RunManager in initialization.
246 if (gAlice->Modules()->GetLast() < 0) {
247 // create geometry (including AliModules) according to
248 // the fDetSwitchVector
249 CheckDetDependencies();
253 // create geometry for AliModules
254 // that have been created and registered by gAlice
257 // construct modules geometry
260 return AliSingleModuleConstruction::GetWorld();