]> git.uio.no Git - u/mrichter/AliRoot.git/blob - AliGeant4/AliDetConstruction.cxx
updated default versions of detectors
[u/mrichter/AliRoot.git] / AliGeant4 / AliDetConstruction.cxx
1 // $Id$
2 // Category: geometry
3 //
4 // See the class description in the header file.
5
6 #include "AliDetConstruction.h"
7 #include "AliSingleModuleConstruction.h"
8 #include "AliDetSwitch.h"
9 #include "AliGlobals.h"
10 #include "AliRun.h"
11 #include "AliModule.h"
12
13 AliDetConstruction::AliDetConstruction()
14   : fTopVolumeName("ALIC")
15 {
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
20
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);  
60 }
61
62 AliDetConstruction::AliDetConstruction(const AliDetConstruction& right)
63   : AliModulesComposition(right)
64 {
65   // AliModuleComposition is protected from copying
66 }  
67
68 AliDetConstruction::~AliDetConstruction() {
69 //
70 }
71
72 // operators
73
74 AliDetConstruction& 
75 AliDetConstruction::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
89 void 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 " 
124            << modName << "v" << modVersion << "." << G4endl;   
125   }
126   
127   // do not process Config.C 
128   // (it was processed when creating modules by gAlice)
129   SetProcessConfigToModules(false);     
130 }
131
132 void 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
159 void 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 (??)
165 // ZDC requires DIPO
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; 
174   G4int verDIPO = -1; 
175   G4int verTOF = -1; 
176   G4int verTRD = -1; 
177   G4int verZDC = -1; 
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];
185     }  
186     if (detName == "DIPO") { 
187       verDIPO = krDetSwitchVector[id]->GetSwitchedVersion();  
188       detSwitchDIPO = krDetSwitchVector[id];
189     }  
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();  
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   }
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   }    
236 }  
237
238 // public methods
239
240 G4VPhysicalVolume* 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