4 // See the class description in the header file.
6 #include "AliMoreModulesConstruction.h"
7 #include "AliSingleModuleConstruction.h"
8 #include "AliSDManager.h"
10 #include "AliGlobals.h"
12 #include "TG4GeometryManager.h"
14 #include <G4SDManager.hh>
15 #include <G4LogicalVolume.hh>
16 #include <G4LogicalVolumeStore.hh>
18 AliMoreModulesConstruction::AliMoreModulesConstruction() {
20 fSDManager = AliSDManager::Instance();
23 AliMoreModulesConstruction::AliMoreModulesConstruction(
24 const AliMoreModulesConstruction& right)
26 // delete current module constructions
27 fModuleConstructionVector.erase(
28 fModuleConstructionVector.begin(), fModuleConstructionVector.end());
30 // create new module constructions
31 G4int nofModules = right.fModuleConstructionVector.size();
32 for (G4int i=0; i<nofModules; i++) {
33 G4String name = right.fModuleConstructionVector[i]->GetDetName();
34 G4int version = right.fModuleConstructionVector[i]->GetVersion();
35 AliModuleType type = right.fModuleConstructionVector[i]->GetType();
36 AddModule(name, version, type);
39 fSDManager = right.fSDManager;
43 AliMoreModulesConstruction::~AliMoreModulesConstruction()
45 // delete module constructions
46 fModuleConstructionVector.erase(
47 fModuleConstructionVector.begin(), fModuleConstructionVector.end());
52 AliMoreModulesConstruction&
53 AliMoreModulesConstruction::operator=(const AliMoreModulesConstruction& right)
55 // check assignement to self
56 if (this == &right) return *this;
58 // delete current module constructions
59 fModuleConstructionVector.erase(
60 fModuleConstructionVector.begin(), fModuleConstructionVector.end());
62 // create new module constructions
63 G4int nofModules = right.fModuleConstructionVector.size();
64 for (G4int i=0; i<nofModules; i++) {
65 G4String name = right.fModuleConstructionVector[i]->GetDetName();
66 G4int version = right.fModuleConstructionVector[i]->GetVersion();
67 AliModuleType type = right.fModuleConstructionVector[i]->GetType();
68 AddModule(name, version, type);
71 fSDManager = right.fSDManager;
78 void AliMoreModulesConstruction::CreateSensitiveDetectors(
79 G4bool allLVSensitive)
81 // Creates sensitive detectors.
85 CreateSensitiveDetectors1();
87 CreateSensitiveDetectors2();
89 // set static number of logical volumes already processed
90 G4LogicalVolumeStore* pLVStore = G4LogicalVolumeStore::GetInstance();
91 fSDManager->SetNofLVWithSD(pLVStore->entries());
94 void AliMoreModulesConstruction::CreateSensitiveDetectors1()
96 // Creates sensitive detectors.
97 // Sensitive detectors are set to all logical volumes
100 G4LogicalVolumeStore* pLVStore = G4LogicalVolumeStore::GetInstance();
101 G4int nofLV = pLVStore->entries();
103 G4int nofLVWithSD = fSDManager->GetNofLVWithSD();
104 for (G4int i=nofLVWithSD; i<nofLV; i++) {
105 G4LogicalVolume* lv = (*pLVStore)[i];
106 AliModule* module = fSDManager->FindAliModule(lv);
107 fSDManager->CreateSD(lv, module);
111 void AliMoreModulesConstruction::CreateSensitiveDetectors2()
113 // Creates sensitive detectors.
114 // Sensitive detectors are set only to logical volumes
115 // in G3SensVolVector.
118 TG4GeometryManager* pGeometryManager = TG4GeometryManager::Instance();
120 G3SensVolVector pSVVector
121 = pGeometryManager->GetG3SensVolVector();
123 G4int nofSV = pSVVector.entries();
125 for (G4int isv=0; isv<nofSV; isv++) {
126 G4LogicalVolume* lv = pSVVector[isv];
127 AliModule* module = fSDManager->FindAliModule(lv);
128 fSDManager->CreateSD(lv, module);
134 void AliMoreModulesConstruction::AddModule(G4String moduleName, G4int version,
135 AliModuleType moduleType)
137 // Adds module specified by name, version and type.
140 // create module construction
141 AliSingleModuleConstruction* moduleConstruction
142 = new AliSingleModuleConstruction(moduleName, version, moduleType);
144 // add module, module construction to vectors
145 fModuleConstructionVector.push_back(moduleConstruction);
148 void AliMoreModulesConstruction::Configure()
150 // Executes the detectors setup Root macros
151 // (extracted from AliRoot Config.C) and
156 G4int nofModules = fModuleConstructionVector.size();
158 if (nofModules == 0) {
160 "AliMoreModulesConstruction::Construct(): No modules are defined.");
163 for (G4int i=0; i<nofModules; i++)
164 fModuleConstructionVector[i]->Configure();
167 void AliMoreModulesConstruction::Construct()
169 // Constructs geometry.
170 // G3 tables are process for all modules alltogether.
174 G4int nofModules = fModuleConstructionVector.size();
176 if (nofModules == 0) {
178 "AliMoreModulesConstruction::Construct(): No modules are defined.");
181 // get geometry manager
182 TG4GeometryManager* pGeometryManager = TG4GeometryManager::Instance();
184 G4bool allLVSensitive = false;
186 for (i=0; i<nofModules; i++) {
188 // fModuleConstructionVector[i]->Configure();
190 // register module name in the name map
191 AliModule* module = fModuleConstructionVector[i]->GetAliModule();
192 pGeometryManager->SetMapSecond(module->GetName());
194 G4bool readGeometry = fModuleConstructionVector[i]->GetReadGeometry();
195 G4bool writeGeometry = fModuleConstructionVector[i]->GetWriteGeometry();
196 G4String dataFilePath = fModuleConstructionVector[i]->GetDataFilePath();
199 // TG4GeometryManager uses g3tog4 methods for reading
200 // g3calls.dat files - as these methods do not fill name map
201 // they cannot be used for constructing more modules
204 // pGeometryManager->SetWriteGeometry(false);
205 // pGeometryManager->ReadG3Geometry(dataFilePath);
207 G4String text = "AliMoreModulesConstruction::Construct - Limitation:\n";
208 text = text + " Reading g3calls.dat is not implemented.";
209 AliGlobals::Exception(text);
212 // set geometry output stream for this module
213 pGeometryManager->SetWriteGeometry(writeGeometry);
215 pGeometryManager->OpenOutFile(dataFilePath);
217 // create geometry from AliRoot
219 // construct materials
220 module->CreateMaterials();
222 // construct G3 geometry
223 module->CreateGeometry();
226 pGeometryManager->CloseOutFile();
229 // all logical volumes will be made sensitive if any
230 // module requires this
231 if (fModuleConstructionVector[i]->GetAllLVSensitive())
232 allLVSensitive = true;
235 // construct G4 geometry
236 pGeometryManager->CreateG4Geometry();
239 // pGeometryManager->PrintNameMap();
241 // create sensitive detectors
242 CreateSensitiveDetectors(allLVSensitive);
244 for (i=0; i<nofModules; i++) {
245 // set the detector frame (envelope)
246 // (without warning output if enevelope is not defined)
247 fModuleConstructionVector[i]->SetDetFrame(false);
249 // build sensitive detectors table
250 fModuleConstructionVector[i]->GetAliModule()->Init();
252 // construct geometry for display
253 fModuleConstructionVector[i]->GetAliModule()->BuildGeometry();
256 // reset TG4GeometryManager
257 pGeometryManager->ClearG3Tables();
259 // print current total number of logical volumes
260 G4cout << "Current total number of sensitive volumes: "
261 << pGeometryManager->NofVolumes() << G4endl;
263 #ifdef ALICE_VISUALIZE
264 // set visualization attributes
265 for (i=0; i<nofModules; i++) {
266 if (fModuleConstructionVector[i]->GetDetFrame()) {
267 fModuleConstructionVector[i]->SetDetVisibility(true);
268 fModuleConstructionVector[i]->SetDetColour("Yellow");