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", 3, 2, 2, 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", 5, 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", 7, 5, 5);
41 AddDetSwitch(detSwitch);
42 detSwitch = new AliDetSwitch("MUON", 2, 1, 1);
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 for (G4int id=0; id<fDetSwitchVector.entries(); id++)
144 G4String detName = fDetSwitchVector[id]->GetDetName();
145 G4int version = fDetSwitchVector[id]->GetSwitchedVersion();
146 G4bool isStandalone = fDetSwitchVector[id]->IsStandalone();
147 AliModuleType type = fDetSwitchVector[id]->GetType();
151 AddSingleModuleConstruction(detName, version, type);
153 AddMoreModuleConstruction(detName, version, type);
157 void AliDetConstruction::CheckDetDependencies()
159 // Checks modules dependencies.
160 // Dependent modules FRAME, TOF, TRD
161 // TOF always requires FRAMEv1
162 // TRD can be built with both (??)
166 // get switched versions of dependent modules
167 G4int verTOF = GetDetSwitch("TOF")->GetSwitchedVersion();
168 G4int verTRD = GetDetSwitch("TRD")->GetSwitchedVersion();
169 G4int verZDC = GetDetSwitch("ZDC")->GetSwitchedVersion();
170 G4int verFRAME = GetDetSwitch("FRAME")->GetSwitchedVersion();
172 // check dependencies
174 // TOF requires FRAMEv1 - obsolete?
176 GetDetSwitch("FRAME")->SwitchOn(2);
177 G4String text = "AliDetConstruction::CheckDetDependencies: \n";
178 text = text + " Switched TOF requires FRAME v1.\n";
179 text = text + " The det switch for FRAME has been changed.";
180 AliGlobals::Warning(text);
184 // TRD requires FRAME
185 verFRAME = GetDetSwitch("FRAME")->GetSwitchedVersion();
187 GetDetSwitch("FRAME")->SwitchOnDefault();
188 G4String text = "AliDetConstruction::CheckDetDependencies: \n";
189 text = text + " Switched TRD requires FRAME.\n";
190 text = text + " The det switch for FRAME has been changed.";
191 AliGlobals::Warning(text);
195 // ZDC requires PIPE, ABSO, DIPO, SHIL
196 G4int verPIPE = GetDetSwitch("PIPE")->GetSwitchedVersion();
197 G4int verABSO = GetDetSwitch("ABSO")->GetSwitchedVersion();
198 G4int verDIPO = GetDetSwitch("DIPO")->GetSwitchedVersion();
199 G4int verSHIL = GetDetSwitch("SHIL")->GetSwitchedVersion();
200 if ( verPIPE != 1 || verABSO !=0 || verDIPO == -1 || verSHIL == -1) {
201 G4String text = "AliDetConstruction::CheckDetDependencies: \n";
202 text = text + " Switched ZDC requires PIPE, ABSO, DIPO and SHIL.\n";
204 GetDetSwitch("PIPE")->SwitchOnDefault();
205 text = text + " The det switch for PIPE has been changed.\n";
208 GetDetSwitch("ABSO")->SwitchOnDefault();
209 text = text + " The det switch for ABSO has been changed.\n";
212 GetDetSwitch("DIPO")->SwitchOnDefault();
213 text = text + " The det switch for DIPO has been changed.\n";
216 GetDetSwitch("SHIL")->SwitchOnDefault();
217 text = text + " The det switch for SHIL has been changed.";
219 AliGlobals::Warning(text);
226 G4VPhysicalVolume* AliDetConstruction::Construct()
228 // Constructs geometry.
229 // This method is called by G4RunManager in initialization.
232 if (gAlice->Modules()->GetLast() < 0) {
233 // create geometry (including AliModules) according to
234 // the fDetSwitchVector
235 CheckDetDependencies();
239 // create geometry for AliModules
240 // that have been created and registered by gAlice
243 // construct modules geometry
246 return AliSingleModuleConstruction::GetWorld();