4 // See the class description in the header file.
6 #include "AliSDManager.h"
7 //#include "AliSDMessenger.h"
8 #include "AliSensitiveDetector.h"
9 #include "AliLegoSensitiveDetector.h"
10 #include "AliGlobals.h"
13 #include "AliModule.h"
15 #include "TG4GeometryManager.h"
17 #include <G3SensVolVector.hh>
18 #include <G4SDManager.hh>
19 #include <G4UImanager.hh>
20 #include <G4LogicalVolume.hh>
21 #include <G4LogicalVolumeStore.hh>
23 AliSDManager* AliSDManager::fgInstance = 0;
25 AliSDManager* AliSDManager::Instance()
27 // Returns the singleton instance.
28 // Creates the instance if it does not exist.
31 if (!fgInstance) new AliSDManager();
36 AliSDManager::AliSDManager() {
38 //fMessenger = new AliSDMessenger(this);
42 AliSDManager::AliSDManager(const AliSDManager& right) {
44 AliGlobals::Exception(
45 "Singleton AliSDManager is protected from copying.");
48 AliSDManager::~AliSDManager()
55 AliSDManager& AliSDManager::operator=(const AliSDManager& right)
57 // check assignement to self
58 if (this == &right) return *this;
60 AliGlobals::Exception(
61 "Singleton AliSDManager is protected from assigning.");
68 void AliSDManager::CreateLegoSD(G4LogicalVolume* lv, AliLego* lego) const
70 // Replaces the existing sensitive detector of the logical volume
71 // with the lego sensitive detector.
74 TG4GeometryManager* pGeometryManager = TG4GeometryManager::Instance();
75 G4SDManager* pSDManager = G4SDManager::GetSDMpointer();
77 G4String lvName = lv->GetName();
78 G4String sdName = "/Alice/lego/" + lvName;
80 // cut copy number from sdName
81 pGeometryManager->G4ToG3VolumeName(sdName);
83 // retrieve the standard sensitive detector
84 G4VSensitiveDetector* sd = lv->GetSensitiveDetector();
86 // create/retrieve the lego sensitive detector
87 G4VSensitiveDetector* legoVSD = 0;
88 legoVSD = pSDManager->FindSensitiveDetector(sdName);
91 AliLegoSensitiveDetector* legoSD
92 = new AliLegoSensitiveDetector(sdName, lego, sd);
93 pSDManager->AddNewDetector(legoSD);
95 G4cout << "Lego sensitive detector " << sdName
96 << ") has been created." << G4endl;
99 lv->SetSensitiveDetector(legoVSD);
102 void AliSDManager::UnsetLegoSD(G4LogicalVolume* lv) const
104 // Replace the lego sensitive detector of the logical volume
105 // with the standard sensitive detector.
108 G4SDManager* pSDManager = G4SDManager::GetSDMpointer();
110 // get the lego sensitive detector
111 G4VSensitiveDetector* sd = lv->GetSensitiveDetector();
112 AliLegoSensitiveDetector* legoSD = 0;
115 legoSD = dynamic_cast<AliLegoSensitiveDetector*>(sd);
117 G4String text = "AliSDManager::UnsetLego: \n";
118 text = text + " Wrong sensitive detector type.";
119 AliGlobals::Exception(text);
123 // get the standard sensitive detector
124 G4VSensitiveDetector* standardSD = legoSD->GetStandardSD();
126 // set the standard sensitive detector
127 lv->SetSensitiveDetector(standardSD);
133 void AliSDManager::CreateSD(G4LogicalVolume* lv, AliModule* module) const
135 // Creates/retrieves a sensitive detector for the logical volume.
138 TG4GeometryManager* pGeometryManager = TG4GeometryManager::Instance();
139 G4SDManager* pSDManager = G4SDManager::GetSDMpointer();
141 G4String lvName = lv->GetName();
143 G4String moduleName = module->GetName();
144 G4String sdName = "/Alice/" + moduleName + "/" + lvName;
146 // cut copy number from sdName
147 pGeometryManager->G4ToG3VolumeName(sdName);
149 // create/retrieve the sensitive detector
150 G4VSensitiveDetector* sd = 0;
151 sd = pSDManager->FindSensitiveDetector(sdName);
153 AliSensitiveDetector* asd
154 = new AliSensitiveDetector(sdName, module);
155 pSDManager->AddNewDetector(asd);
157 G4cout << "Sensitive detector " << sdName << "("
158 << asd->GetID() << ") has been created." << G4endl;
161 lv->SetSensitiveDetector(sd);
164 AliModule* AliSDManager::FindAliModule(G4LogicalVolume* lv) const
166 // Finds the module containing specified logical volume.
170 TG4GeometryManager* pGeometryManager = TG4GeometryManager::Instance();
172 // get g3 volume name
173 G4String g3Name = lv->GetName();
174 pGeometryManager->G4ToG3VolumeName(g3Name);
176 // get module name from the map
177 G4String moduleName = pGeometryManager->GetMapSecond(g3Name);
179 // find module from gAlice
180 AliModule* module = gAlice->GetModule(moduleName);
182 G4String text = "AliSDManager::FindAliModule:\n";
183 text = text + " AliModule " + moduleName;
184 text = text + " (mapped from logical volume " + lv->GetName() + ")\n";
185 text = text + " has not been found in gAlice.";
186 AliGlobals::Exception(text);
192 void AliSDManager::SetLego(AliLego* lego) const
194 // Replaces the existing sensitive detectors
195 // with lego sensitive detectors.
199 G4String text = "AliSDManager::SetLego: \n";
200 text = text + " No AliLego is defined.";
201 AliGlobals::Warning(text);
205 G4LogicalVolumeStore* pLVStore = G4LogicalVolumeStore::GetInstance();
206 G4int nofLV = pLVStore->entries();
208 for (G4int i=0; i<nofLV; i++) {
209 G4LogicalVolume* lv = (*pLVStore)[i];
210 CreateLegoSD(lv, lego);
214 void AliSDManager::UnsetLego() const
216 // Replace the lego sensitive detectors
217 // back with standard sensitive detectors.
220 G4SDManager* pSDManager = G4SDManager::GetSDMpointer();
221 G4LogicalVolumeStore* pLVStore = G4LogicalVolumeStore::GetInstance();
222 G4int nofLV = pLVStore->entries();
224 // set back standard sensitive detectors
225 for (G4int i=0; i<nofLV; i++) {
226 G4LogicalVolume* lv = (*pLVStore)[i];
230 // The lego sensitive detectors are not deleted here
231 // as there is no way how to unregister them