4 // Author: I. Hrivnacova
6 // Class AliModulesComposition
7 // ---------------------------
8 // See the class description in the header file.
10 #include "AliModulesComposition.h"
11 #include "AliSingleModuleConstruction.h"
12 #include "AliMoreModulesConstruction.h"
13 #include "AliDetSwitch.h"
14 #include "AliMagneticField.h"
15 #include "AliGlobals.h"
18 #include "TG4XMLGeometryGenerator.h"
19 #include "TG4GeometryManager.h"
21 #include <G4Material.hh>
22 #include <G4VPhysicalVolume.hh>
24 //_____________________________________________________________________________
25 AliModulesComposition::AliModulesComposition()
26 : fReadGeometry(false),
27 fWriteGeometry(false),
32 fMoreModulesConstruction = new AliMoreModulesConstruction();
35 //_____________________________________________________________________________
36 AliModulesComposition::AliModulesComposition(const AliModulesComposition& right)
40 AliGlobals::Exception("AliModulesComposition is protected from copying.");
43 //_____________________________________________________________________________
44 AliModulesComposition::~AliModulesComposition() {
46 delete fMoreModulesConstruction;
47 delete fMagneticField;
49 // destroy det switch vector
51 for (it = fDetSwitchVector.begin(); it != fDetSwitchVector.end(); it++)
54 // destroy det construction vector
55 SingleModuleIterator itm;
56 for (itm = fModuleConstructionVector.begin();
57 itm != fModuleConstructionVector.end(); it++)
63 //_____________________________________________________________________________
64 AliModulesComposition&
65 AliModulesComposition::operator=(const AliModulesComposition& right)
67 // check assignement to self
68 if (this == &right) return *this;
70 AliGlobals::Exception("AliModulesComposition is protected from assigning.");
77 //_____________________________________________________________________________
78 void AliModulesComposition::AddDetSwitch(AliDetSwitch* detSwitch)
80 // Adds detSwitch to the detSwitch vector.
83 fDetSwitchVector.push_back(detSwitch);
84 fMessenger.SetCandidates();
87 //_____________________________________________________________________________
88 void AliModulesComposition::AddSingleModuleConstruction(
89 const G4String& name, G4int version,
90 AliModuleType moduleType)
92 // Adds SingleModuleConstruction.
95 fModuleConstructionVector
96 .push_back(new AliSingleModuleConstruction(name, version, moduleType));
99 //_____________________________________________________________________________
100 void AliModulesComposition::AddMoreModuleConstruction(
101 const G4String& name, G4int version,
102 AliModuleType moduleType)
104 // Adds module to MoreModulesConstruction (construction of dependent
108 fMoreModulesConstruction->AddModule(name, version, moduleType);
111 //_____________________________________________________________________________
112 void AliModulesComposition::ConstructModules()
114 // Construct geometry of all modules (both standalone and dependent.)
117 // set common options
118 SetReadGeometryToModules(fReadGeometry);
119 SetWriteGeometryToModules(fWriteGeometry);
121 // configure single modules
122 SingleModuleIterator it;
123 for (it = fModuleConstructionVector.begin();
124 it != fModuleConstructionVector.end(); it++) {
126 (*it)->Configure(*AliFiles::Instance());
127 cout << "Module " << (*it)->GetDetName() << " configured." << endl;
130 // configure dependent modules
131 if (fMoreModulesConstruction->GetNofModules() > 0)
132 fMoreModulesConstruction->Configure(*AliFiles::Instance());
134 // construct single modules
135 for (it = fModuleConstructionVector.begin();
136 it != fModuleConstructionVector.end(); it++) {
138 G4cout << "Module " << (*it)->GetDetName()
139 << " will be constructed now." << G4endl;
143 // construct dependent modules
144 if (fMoreModulesConstruction->GetNofModules() > 0) {
145 G4cout << "Dependent modules will be constructed now." << G4endl;
146 fMoreModulesConstruction->Construct();
150 //_____________________________________________________________________________
151 AliDetSwitch* AliModulesComposition::GetDetSwitch(const G4String& moduleName)
153 // Returns the detector switch with given detector name.
156 DetSwitchIterator it;
157 for (it = fDetSwitchVector.begin(); it != fDetSwitchVector.end(); it++)
158 if ((*it)->GetDetName() == moduleName) return *it;
160 G4String text = "AliModulesComposition::GetDetSwitch:\n";
161 text = text + "Wrong detector name for " + moduleName;
162 AliGlobals::Exception(text);
166 //_____________________________________________________________________________
167 void AliModulesComposition::SetReadGeometryToModules(G4bool readGeometry)
169 // Sets readGeometry control to all modules.
172 // single module constructions
173 SingleModuleIterator it;
174 for (it = fModuleConstructionVector.begin();
175 it != fModuleConstructionVector.end(); it++)
176 (*it)->SetReadGeometry(readGeometry);
178 // more modules construction
179 for (G4int i=0; i<fMoreModulesConstruction->GetNofModules(); i++)
180 fMoreModulesConstruction
181 ->GetModuleConstruction(i)->SetReadGeometry(readGeometry);
184 //_____________________________________________________________________________
185 void AliModulesComposition::SetWriteGeometryToModules(G4bool writeGeometry)
187 // Sets writeGeometry control to all modules.
190 // single module constructions
191 SingleModuleIterator it;
192 for (it = fModuleConstructionVector.begin();
193 it != fModuleConstructionVector.end(); it++)
194 (*it)->SetWriteGeometry(writeGeometry);
196 // more modules construction
197 for (G4int i=0; i<fMoreModulesConstruction->GetNofModules(); i++)
198 fMoreModulesConstruction
199 ->GetModuleConstruction(i)->SetWriteGeometry(writeGeometry);
202 //_____________________________________________________________________________
203 void AliModulesComposition::SetProcessConfigToModules(G4bool processConfig)
205 // Sets processConfig control to all modules.
208 // single module constructions
209 SingleModuleIterator it;
210 for (it = fModuleConstructionVector.begin();
211 it != fModuleConstructionVector.end(); it++)
212 (*it)->SetProcessConfig(processConfig);
214 // more modules construction
215 for (G4int i=0; i<fMoreModulesConstruction->GetNofModules(); i++)
216 fMoreModulesConstruction
217 ->GetModuleConstruction(i)->SetProcessConfig(processConfig);
222 //_____________________________________________________________________________
223 void AliModulesComposition::SwitchDetOn(const G4String& moduleNameVer)
225 // Switchs on module specified by name and version.
228 DetSwitchIterator it;
230 if (moduleNameVer == "ALL") {
231 for (it = fDetSwitchVector.begin(); it != fDetSwitchVector.end(); it++)
232 (*it)->SwitchOnDefault();
234 else if (moduleNameVer == "PPR") {
235 for (it = fDetSwitchVector.begin(); it != fDetSwitchVector.end(); it++)
236 (*it)->SwitchOnPPR();
237 AliFiles::Instance()->SetMacroName("ConfigPPR");
239 else if (moduleNameVer == "NONE") {
240 for (it = fDetSwitchVector.begin(); it != fDetSwitchVector.end(); it++)
244 // get version number
245 G4int len = moduleNameVer.length();
246 G4String moduleName = moduleNameVer.substr(0, len-1);
247 G4String version = moduleNameVer.substr(len-1, 1);
248 G4int iVersion = AliGlobals::StringToInt(version);
251 // in case the version number is not provided
252 // the default one is set
253 SwitchDetOnDefault(moduleNameVer);
256 SwitchDetOn(moduleName, iVersion);
260 //_____________________________________________________________________________
261 void AliModulesComposition::SwitchDetOn(const G4String& moduleName,
264 // Switchs on module specified by name and version.
267 GetDetSwitch(moduleName)->SwitchOn(version);
270 //_____________________________________________________________________________
271 void AliModulesComposition::SwitchDetOnDefault(const G4String& moduleName)
273 // Switchs on module specified by name with default version.
276 GetDetSwitch(moduleName)->SwitchOnDefault();
279 //_____________________________________________________________________________
280 void AliModulesComposition::SwitchDetOnPPR(const G4String& moduleName)
282 // Switchs on module specified by name with PPR version.
285 GetDetSwitch(moduleName)->SwitchOnPPR();
288 //_____________________________________________________________________________
289 void AliModulesComposition::SwitchDetOff(const G4String& moduleName)
291 // Switchs off module specified by name.
294 if (moduleName == "ALL") {
295 DetSwitchIterator it;
296 for (it = fDetSwitchVector.begin(); it != fDetSwitchVector.end(); it++)
300 GetDetSwitch(moduleName)->SwitchOff();
303 //_____________________________________________________________________________
304 void AliModulesComposition::PrintSwitchedDets() const
306 // Lists switched detectors.
309 G4String svList = GetSwitchedDetsList();
311 G4cout << "Switched Alice detectors: " << G4endl;
312 G4cout << "--------------------------" << G4endl;
313 G4cout << svList << G4endl;
316 //_____________________________________________________________________________
317 void AliModulesComposition::PrintAvailableDets() const
319 // Lists available detectors.
322 G4String avList = GetAvailableDetsList();
324 G4cout << "Available Alice detectors: " << G4endl;
325 G4cout << "---------------------------" << G4endl;
326 G4cout << avList << G4endl;
329 //_____________________________________________________________________________
330 void AliModulesComposition::PrintMaterials() const
332 // Prints all materials.
335 const G4MaterialTable* matTable = G4Material::GetMaterialTable();
339 //_____________________________________________________________________________
340 void AliModulesComposition::GenerateXMLGeometry() const
342 // Generates XML geometry file from the top volume.
343 // The file name is set according the last switched detector
344 // registered in the det switch vector.
347 G4VPhysicalVolume* world = AliSingleModuleConstruction::GetWorld();
350 // according to last switched detector
352 G4String detVersion = "";
354 for (G4int i=fDetSwitchVector.size()-1; i>=0; i--) {
355 version = fDetSwitchVector[i]->GetSwitchedVersion();
357 detName = fDetSwitchVector[i]->GetDetName();
358 AliGlobals::AppendNumberToString(detVersion,version);
363 = AliFiles::Instance()->GetXMLFilePath(detName, version);
365 // set top volume name
366 G4String topName = world->GetName() + "_comp";
370 TG4XMLGeometryGenerator xml;
371 xml.OpenFile(filePath);
373 // generate materials
374 // not yet implemented
375 // xml.GenerateMaterials(version, "today", "Generated from G4",
376 // "v4", world->GetLogicalVolume());
378 // generate volumes tree
379 xml.GenerateSection(detName, detVersion, "today", "Generated from Geant4",
380 topName, world->GetLogicalVolume());
384 G4cout << "File " << detName << "v" << version << ".xml has been generated."
388 //_____________________________________________________________________________
389 G4String AliModulesComposition::GetSwitchedDetsList() const
391 // Returns list of switched detectors.
394 G4String svList = "";
395 G4int nofSwitchedDets = 0;
396 DetSwitchConstIterator it;
398 for (it = fDetSwitchVector.begin(); it != fDetSwitchVector.end(); it++) {
399 G4int iVersion = (*it)->GetSwitchedVersion();
402 G4String moduleNameVer = (*it)->GetDetName();
403 AliGlobals::AppendNumberToString(moduleNameVer, iVersion);
404 svList += moduleNameVer;
409 if (nofSwitchedDets == fDetSwitchVector.size()) svList = "ALL: " + svList;
410 if (nofSwitchedDets == 0) svList = "NONE";
415 //_____________________________________________________________________________
416 G4String AliModulesComposition::GetAvailableDetsList() const
418 // Returns list of available detectors.
421 G4String svList = "";
422 DetSwitchConstIterator it;
424 for (it = fDetSwitchVector.begin(); it != fDetSwitchVector.end(); it++)
425 for (G4int iv=0; iv<(*it)->GetNofVersions(); iv++) {
426 G4String moduleNameVer = (*it)->GetDetName();
427 AliGlobals::AppendNumberToString(moduleNameVer, iv);
428 svList += moduleNameVer;
435 //_____________________________________________________________________________
436 G4String AliModulesComposition::GetAvailableDetsListWithCommas() const
438 // Returns list of available detectors with commas.
441 G4String svList = "";
443 DetSwitchConstIterator it;
445 for (it = fDetSwitchVector.begin(); it != fDetSwitchVector.end(); it++)
446 for (G4int iv=0; iv<(*it)->GetNofVersions(); iv++) {
447 G4String moduleNameVer = (*it)->GetDetName();
448 AliGlobals::AppendNumberToString(moduleNameVer, iv);
449 svList += moduleNameVer;
450 if (iv < (*it)->GetNofVersions()-1) svList += "/";
451 else if (id++ < fDetSwitchVector.size()-1) svList += ", ";
457 //_____________________________________________________________________________
458 G4String AliModulesComposition::GetDetNamesList() const
460 // Returns list of detector names.
463 G4String svList = "";
464 DetSwitchConstIterator it;
466 for (it = fDetSwitchVector.begin(); it != fDetSwitchVector.end(); it++) {
467 svList += (*it)->GetDetName();
474 //_____________________________________________________________________________
475 G4String AliModulesComposition::GetDetNamesListWithCommas() const
477 // Returns list of detector names with commas.
480 G4String svList = "";
482 DetSwitchConstIterator it;
484 for (it = fDetSwitchVector.begin(); it != fDetSwitchVector.end(); it++) {
485 svList += (*it)->GetDetName();
486 if (id++ < fDetSwitchVector.size()-1) svList += ", ";
492 //_____________________________________________________________________________
493 void AliModulesComposition::SetMagField(G4double fieldValue)
495 // Sets uniform magnetic field to specified value.
498 // create fields if it does not exist
499 if (!fMagneticField) fMagneticField = new AliMagneticField();
502 fMagneticField->SetFieldValue(fieldValue);