]> git.uio.no Git - u/mrichter/AliRoot.git/blame - AliGeant4/AliMoreModulesConstruction.cxx
removed obsolete comments only
[u/mrichter/AliRoot.git] / AliGeant4 / AliMoreModulesConstruction.cxx
CommitLineData
676fb573 1// $Id$
2// Category: geometry
3//
4// See the class description in the header file.
5
6#include "AliMoreModulesConstruction.h"
7#include "AliSingleModuleConstruction.h"
8#include "AliSDManager.h"
9#include "AliSensitiveDetector.h"
10#include "AliModule.h"
11#include "AliRun.h"
12#include "AliGlobals.h"
13
14#include "TG4GeometryManager.h"
15
16#include <G4SDManager.hh>
17#include <G4LogicalVolume.hh>
18#include <G4LogicalVolumeStore.hh>
19
20#include <TROOT.h>
21#include <TCint.h>
22
23AliMoreModulesConstruction::AliMoreModulesConstruction() {
24//
25 fSDManager = AliSDManager::Instance();
26}
27
28AliMoreModulesConstruction::AliMoreModulesConstruction(
29 const AliMoreModulesConstruction& right)
30{
31 // delete current module constructions
32 fModuleConstructionVector.erase(
33 fModuleConstructionVector.begin(), fModuleConstructionVector.end());
34
35 // create new module constructions
36 G4int nofModules = right.fModuleConstructionVector.size();
37 for (G4int i=0; i<nofModules; i++) {
38 G4String name = right.fModuleConstructionVector[i]->GetDetName();
39 G4int version = right.fModuleConstructionVector[i]->GetVersion();
40 AliModuleType type = right.fModuleConstructionVector[i]->GetType();
41 AddModule(name, version, type);
42 }
43
44 fSDManager = right.fSDManager;
45}
46
47
48AliMoreModulesConstruction::~AliMoreModulesConstruction()
49{
50 // delete module constructions
51 fModuleConstructionVector.erase(
52 fModuleConstructionVector.begin(), fModuleConstructionVector.end());
53}
54
55// operators
56
57AliMoreModulesConstruction&
58AliMoreModulesConstruction::operator=(const AliMoreModulesConstruction& right)
59{
60 // check assignement to self
61 if (this == &right) return *this;
62
63 // delete current module constructions
64 fModuleConstructionVector.erase(
65 fModuleConstructionVector.begin(), fModuleConstructionVector.end());
66
67 // create new module constructions
68 G4int nofModules = right.fModuleConstructionVector.size();
69 for (G4int i=0; i<nofModules; i++) {
70 G4String name = right.fModuleConstructionVector[i]->GetDetName();
71 G4int version = right.fModuleConstructionVector[i]->GetVersion();
72 AliModuleType type = right.fModuleConstructionVector[i]->GetType();
73 AddModule(name, version, type);
74 }
75
76 fSDManager = right.fSDManager;
77
78 return *this;
79}
80
81// private methods
82
83void AliMoreModulesConstruction::CreateSensitiveDetectors(
84 G4bool allLVSensitive)
85{
86// Creates sensitive detectors.
87// ---
88
89 if (allLVSensitive)
90 CreateSensitiveDetectors1();
91 else
92 CreateSensitiveDetectors2();
93
94 // set static number of logical volumes already processed
95 G4LogicalVolumeStore* pLVStore = G4LogicalVolumeStore::GetInstance();
96 fSDManager->SetNofLVWithSD(pLVStore->entries());
97}
98
99void AliMoreModulesConstruction::CreateSensitiveDetectors1()
100{
101// Creates sensitive detectors.
102// Sensitive detectors are set to all logical volumes
103// ---
104
105 G4LogicalVolumeStore* pLVStore = G4LogicalVolumeStore::GetInstance();
106 G4int nofLV = pLVStore->entries();
107
108 G4int nofLVWithSD = fSDManager->GetNofLVWithSD();
109 for (G4int i=nofLVWithSD; i<nofLV; i++) {
110 G4LogicalVolume* lv = (*pLVStore)[i];
111 AliModule* module = fSDManager->FindAliModule(lv);
112 fSDManager->CreateSD(lv, module);
113 }
114}
115
116void AliMoreModulesConstruction::CreateSensitiveDetectors2()
117{
118// Creates sensitive detectors.
119// Sensitive detectors are set only to logical volumes
120// in G3SensVolVector.
121// ---
122
123 TG4GeometryManager* pGeometryManager = TG4GeometryManager::Instance();
124
125 G3SensVolVector pSVVector
126 = pGeometryManager->GetG3SensVolVector();
127
128 G4int nofSV = pSVVector.entries();
129 if (nofSV>0)
130 for (G4int isv=0; isv<nofSV; isv++) {
131 G4LogicalVolume* lv = pSVVector[isv];
132 AliModule* module = fSDManager->FindAliModule(lv);
133 fSDManager->CreateSD(lv, module);
134 }
135}
136
137// public methods
138
139void AliMoreModulesConstruction::AddModule(G4String moduleName, G4int version,
140 AliModuleType moduleType)
141{
142// Adds module specified by name, version and type.
143// ---
144
145 // create module construction
146 AliSingleModuleConstruction* moduleConstruction
147 = new AliSingleModuleConstruction(moduleName, version, moduleType);
148
149 // add module, module construction to vectors
150 fModuleConstructionVector.push_back(moduleConstruction);
151}
152
153void AliMoreModulesConstruction::Construct()
154{
155// Constructs geometry.
156// G3 tables are process for all modules alltogether.
157// --
158
159 // number of modules
160 G4int nofModules = fModuleConstructionVector.size();
161
162 if (nofModules == 0) {
163 AliGlobals::Warning(
164 "AliMoreModulesConstruction::Construct(): No modules are defined.");
165 }
166 else {
167 // get geometry manager
168 TG4GeometryManager* pGeometryManager = TG4GeometryManager::Instance();
169
170 G4bool allLVSensitive = false;
171 G4int i;
172 for (i=0; i<nofModules; i++) {
173
174 fModuleConstructionVector[i]->Configure();
175
176 // register module name in the name map
177 AliModule* module = fModuleConstructionVector[i]->GetAliModule();
178 pGeometryManager->SetMapSecond(module->GetName());
179
180 G4bool readGeometry = fModuleConstructionVector[i]->GetReadGeometry();
181 G4bool writeGeometry = fModuleConstructionVector[i]->GetWriteGeometry();
182 G4String dataFilePath = fModuleConstructionVector[i]->GetDataFilePath();
183
184 if (readGeometry) {
185 // create G3 geometry from g3calls.dat
186 pGeometryManager->SetWriteGeometry(false);
187 pGeometryManager->ReadG3Geometry(dataFilePath);
188 }
189 else {
190 // set geometry output stream for this module
191 pGeometryManager->SetWriteGeometry(writeGeometry);
192 if (writeGeometry)
193 pGeometryManager->OpenOutFile(dataFilePath);
194
195 // create geometry from AliRoot
196
197 // construct materials
198 module->CreateMaterials();
199
200 // construct G3 geometry
201 module->CreateGeometry();
202 }
203
204 // all logical volumes will be made sensitive if any
205 // module requires this
206 if (fModuleConstructionVector[i]->GetAllLVSensitive())
207 allLVSensitive = true;
208 }
209
210 // construct G4 geometry
211 pGeometryManager->CreateG4Geometry();
212
213 // print name map
214 // pGeometryManager->PrintNameMap();
215
216 // create sensitive detectors
217 CreateSensitiveDetectors(allLVSensitive);
676fb573 218
219 for (i=0; i<nofModules; i++) {
220 // set the detector frame (envelope)
221 // (without warning output if enevelope is not defined)
222 fModuleConstructionVector[i]->SetDetFrame(false);
223
224 // build sensitive detectors table
225 fModuleConstructionVector[i]->GetAliModule()->Init();
226 }
227
228 // reset TG4GeometryManager
229 pGeometryManager->ClearG3Tables();
230
231 // print current total number of logical volumes
232 G4cout << "Current total number of sensitive volumes: "
233 << pGeometryManager->NofVolumes() << endl;
234
235#ifdef ALICE_VISUALIZE
236 // set visualization attributes
237 for (i=0; i<nofModules; i++) {
238 if (fModuleConstructionVector[i]->GetDetFrame()) {
239 fModuleConstructionVector[i]->SetDetVisibility(true);
240 fModuleConstructionVector[i]->SetDetColour("Yellow");
241 }
242 }
243#endif
244 }
245}