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(
152 const G4String& moduleName) const
154 // Returns the detector switch with given detector name.
157 DetSwitchConstIterator it;
158 for (it = fDetSwitchVector.begin(); it != fDetSwitchVector.end(); it++)
159 if ((*it)->GetDetName() == moduleName) return *it;
161 G4String text = "AliModulesComposition::GetDetSwitch:\n";
162 text = text + "Wrong detector name for " + moduleName;
163 AliGlobals::Exception(text);
167 //_____________________________________________________________________________
168 void AliModulesComposition::SetReadGeometryToModules(G4bool readGeometry)
170 // Sets readGeometry control to all modules.
173 // single module constructions
174 SingleModuleIterator it;
175 for (it = fModuleConstructionVector.begin();
176 it != fModuleConstructionVector.end(); it++)
177 (*it)->SetReadGeometry(readGeometry);
179 // more modules construction
180 for (G4int i=0; i<fMoreModulesConstruction->GetNofModules(); i++)
181 fMoreModulesConstruction
182 ->GetModuleConstruction(i)->SetReadGeometry(readGeometry);
185 //_____________________________________________________________________________
186 void AliModulesComposition::SetWriteGeometryToModules(G4bool writeGeometry)
188 // Sets writeGeometry control to all modules.
191 // single module constructions
192 SingleModuleIterator it;
193 for (it = fModuleConstructionVector.begin();
194 it != fModuleConstructionVector.end(); it++)
195 (*it)->SetWriteGeometry(writeGeometry);
197 // more modules construction
198 for (G4int i=0; i<fMoreModulesConstruction->GetNofModules(); i++)
199 fMoreModulesConstruction
200 ->GetModuleConstruction(i)->SetWriteGeometry(writeGeometry);
203 //_____________________________________________________________________________
204 void AliModulesComposition::SetProcessConfigToModules(G4bool processConfig)
206 // Sets processConfig control to all modules.
209 // single module constructions
210 SingleModuleIterator it;
211 for (it = fModuleConstructionVector.begin();
212 it != fModuleConstructionVector.end(); it++)
213 (*it)->SetProcessConfig(processConfig);
215 // more modules construction
216 for (G4int i=0; i<fMoreModulesConstruction->GetNofModules(); i++)
217 fMoreModulesConstruction
218 ->GetModuleConstruction(i)->SetProcessConfig(processConfig);
223 //_____________________________________________________________________________
224 void AliModulesComposition::SwitchDetOn(const G4String& moduleNameVer)
226 // Switchs on module specified by name and version.
229 DetSwitchIterator it;
231 if (moduleNameVer == "ALL") {
232 for (it = fDetSwitchVector.begin(); it != fDetSwitchVector.end(); it++)
233 (*it)->SwitchOnDefault();
235 else if (moduleNameVer == "PPR") {
236 for (it = fDetSwitchVector.begin(); it != fDetSwitchVector.end(); it++)
237 (*it)->SwitchOnPPR();
238 AliFiles::Instance()->SetMacroName("ConfigPPR");
240 else if (moduleNameVer == "NONE") {
241 for (it = fDetSwitchVector.begin(); it != fDetSwitchVector.end(); it++)
245 // get version number
246 G4int len = moduleNameVer.length();
247 G4String moduleName = moduleNameVer.substr(0, len-1);
248 G4String version = moduleNameVer.substr(len-1, 1);
249 G4int iVersion = AliGlobals::StringToInt(version);
252 // in case the version number is not provided
253 // the default one is set
254 SwitchDetOnDefault(moduleNameVer);
257 SwitchDetOn(moduleName, iVersion);
261 //_____________________________________________________________________________
262 void AliModulesComposition::SwitchDetOn(const G4String& moduleName,
265 // Switchs on module specified by name and version.
268 GetDetSwitch(moduleName)->SwitchOn(version);
271 //_____________________________________________________________________________
272 void AliModulesComposition::SwitchDetOnDefault(const G4String& moduleName)
274 // Switchs on module specified by name with default version.
277 GetDetSwitch(moduleName)->SwitchOnDefault();
280 //_____________________________________________________________________________
281 void AliModulesComposition::SwitchDetOnPPR(const G4String& moduleName)
283 // Switchs on module specified by name with PPR version.
286 GetDetSwitch(moduleName)->SwitchOnPPR();
289 //_____________________________________________________________________________
290 void AliModulesComposition::SwitchDetOff(const G4String& moduleName)
292 // Switchs off module specified by name.
295 if (moduleName == "ALL") {
296 DetSwitchIterator it;
297 for (it = fDetSwitchVector.begin(); it != fDetSwitchVector.end(); it++)
301 GetDetSwitch(moduleName)->SwitchOff();
304 //_____________________________________________________________________________
305 void AliModulesComposition::PrintSwitchedDets() const
307 // Lists switched detectors.
310 G4String svList = GetSwitchedDetsList();
312 G4cout << "Switched Alice detectors: " << G4endl;
313 G4cout << "--------------------------" << G4endl;
314 G4cout << svList << G4endl;
317 //_____________________________________________________________________________
318 void AliModulesComposition::PrintAvailableDets() const
320 // Lists available detectors.
323 G4String avList = GetAvailableDetsList();
325 G4cout << "Available Alice detectors: " << G4endl;
326 G4cout << "---------------------------" << G4endl;
327 G4cout << avList << G4endl;
330 //_____________________________________________________________________________
331 void AliModulesComposition::PrintMaterials() const
333 // Prints all materials.
336 const G4MaterialTable* matTable = G4Material::GetMaterialTable();
340 //_____________________________________________________________________________
341 void AliModulesComposition::GenerateXMLGeometry() const
343 // Generates XML geometry file from the top volume.
344 // The file name is set according the last switched detector
345 // registered in the det switch vector.
348 G4VPhysicalVolume* world = AliSingleModuleConstruction::GetWorld();
351 // according to last switched detector
353 G4String detVersion = "";
355 for (G4int i=fDetSwitchVector.size()-1; i>=0; i--) {
356 version = fDetSwitchVector[i]->GetSwitchedVersion();
358 detName = fDetSwitchVector[i]->GetDetName();
359 AliGlobals::AppendNumberToString(detVersion,version);
364 = AliFiles::Instance()->GetXMLFilePath(detName, version);
366 // set top volume name
367 G4String topName = world->GetName() + "_comp";
371 TG4XMLGeometryGenerator xml;
372 xml.OpenFile(filePath);
374 // generate materials
375 // not yet implemented
376 // xml.GenerateMaterials(version, "today", "Generated from G4",
377 // "v4", world->GetLogicalVolume());
379 // generate volumes tree
380 xml.GenerateSection(detName, detVersion, "today", "Generated from Geant4",
381 topName, world->GetLogicalVolume());
385 G4cout << "File " << detName << "v" << version << ".xml has been generated."
389 //_____________________________________________________________________________
390 G4String AliModulesComposition::GetSwitchedDetsList() const
392 // Returns list of switched detectors.
395 G4String svList = "";
396 G4int nofSwitchedDets = 0;
397 DetSwitchConstIterator it;
399 for (it = fDetSwitchVector.begin(); it != fDetSwitchVector.end(); it++) {
400 G4int iVersion = (*it)->GetSwitchedVersion();
403 G4String moduleNameVer = (*it)->GetDetName();
404 AliGlobals::AppendNumberToString(moduleNameVer, iVersion);
405 svList += moduleNameVer;
410 if (nofSwitchedDets == fDetSwitchVector.size()) svList = "ALL: " + svList;
411 if (nofSwitchedDets == 0) svList = "NONE";
416 //_____________________________________________________________________________
417 G4String AliModulesComposition::GetAvailableDetsList() const
419 // Returns list of available detectors.
422 G4String svList = "";
423 DetSwitchConstIterator it;
425 for (it = fDetSwitchVector.begin(); it != fDetSwitchVector.end(); it++)
426 for (G4int iv=0; iv<(*it)->GetNofVersions(); iv++) {
427 G4String moduleNameVer = (*it)->GetDetName();
428 AliGlobals::AppendNumberToString(moduleNameVer, iv);
429 svList += moduleNameVer;
436 //_____________________________________________________________________________
437 G4String AliModulesComposition::GetAvailableDetsListWithCommas() const
439 // Returns list of available detectors with commas.
442 G4String svList = "";
444 DetSwitchConstIterator it;
446 for (it = fDetSwitchVector.begin(); it != fDetSwitchVector.end(); it++)
447 for (G4int iv=0; iv<(*it)->GetNofVersions(); iv++) {
448 G4String moduleNameVer = (*it)->GetDetName();
449 AliGlobals::AppendNumberToString(moduleNameVer, iv);
450 svList += moduleNameVer;
451 if (iv < (*it)->GetNofVersions()-1) svList += "/";
452 else if (id++ < fDetSwitchVector.size()-1) svList += ", ";
458 //_____________________________________________________________________________
459 G4String AliModulesComposition::GetDetNamesList() const
461 // Returns list of detector names.
464 G4String svList = "";
465 DetSwitchConstIterator it;
467 for (it = fDetSwitchVector.begin(); it != fDetSwitchVector.end(); it++) {
468 svList += (*it)->GetDetName();
475 //_____________________________________________________________________________
476 G4String AliModulesComposition::GetDetNamesListWithCommas() const
478 // Returns list of detector names with commas.
481 G4String svList = "";
483 DetSwitchConstIterator it;
485 for (it = fDetSwitchVector.begin(); it != fDetSwitchVector.end(); it++) {
486 svList += (*it)->GetDetName();
487 if (id++ < fDetSwitchVector.size()-1) svList += ", ";
493 //_____________________________________________________________________________
494 void AliModulesComposition::SetMagField(G4double fieldValue)
496 // Sets uniform magnetic field to specified value.
499 // create fields if it does not exist
500 if (!fMagneticField) fMagneticField = new AliMagneticField();
503 fMagneticField->SetFieldValue(fieldValue);