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"
12 #include "AliModule.h"
14 #include "TG4GeometryServices.h"
16 #include <G4SDManager.hh>
17 #include <G4LogicalVolume.hh>
18 #include <G4LogicalVolumeStore.hh>
20 AliSDManager* AliSDManager::fgInstance = 0;
22 AliSDManager* AliSDManager::Instance()
24 // Returns the singleton instance.
25 // Creates the instance if it does not exist.
28 if (!fgInstance) new AliSDManager();
33 AliSDManager::AliSDManager()
37 //fMessenger = new AliSDMessenger(this);
41 AliSDManager::AliSDManager(const AliSDManager& right) {
43 AliGlobals::Exception(
44 "Singleton AliSDManager is protected from copying.");
47 AliSDManager::~AliSDManager()
54 AliSDManager& AliSDManager::operator=(const AliSDManager& right)
56 // check assignement to self
57 if (this == &right) return *this;
59 AliGlobals::Exception(
60 "Singleton AliSDManager is protected from assigning.");
67 void AliSDManager::CreateLegoSD(G4LogicalVolume* lv, AliLego* lego) const
69 // Replaces the existing sensitive detector of the logical volume
70 // with the lego sensitive detector.
73 TG4GeometryServices* geometryServices = TG4GeometryServices::Instance();
74 G4SDManager* pSDManager = G4SDManager::GetSDMpointer();
76 G4String lvName = lv->GetName();
77 G4String sdName = "/Alice/lego/" + lvName;
79 // cut copy number from sdName
80 geometryServices->G4ToG3VolumeName(sdName);
82 // retrieve the standard sensitive detector
83 G4VSensitiveDetector* sd = lv->GetSensitiveDetector();
85 // create/retrieve the lego sensitive detector
86 G4VSensitiveDetector* legoVSD = 0;
87 legoVSD = pSDManager->FindSensitiveDetector(sdName);
90 AliLegoSensitiveDetector* legoSD
91 = new AliLegoSensitiveDetector(sdName, lego, sd);
92 pSDManager->AddNewDetector(legoSD);
94 G4cout << "Lego sensitive detector " << sdName
95 << ") has been created." << G4endl;
98 lv->SetSensitiveDetector(legoVSD);
101 void AliSDManager::UnsetLegoSD(G4LogicalVolume* lv) const
103 // Replace the lego sensitive detector of the logical volume
104 // with the standard sensitive detector.
107 G4SDManager* pSDManager = G4SDManager::GetSDMpointer();
109 // get the lego sensitive detector
110 G4VSensitiveDetector* sd = lv->GetSensitiveDetector();
111 AliLegoSensitiveDetector* legoSD = 0;
114 legoSD = dynamic_cast<AliLegoSensitiveDetector*>(sd);
116 G4String text = "AliSDManager::UnsetLego: \n";
117 text = text + " Wrong sensitive detector type.";
118 AliGlobals::Exception(text);
122 // get the standard sensitive detector
123 G4VSensitiveDetector* standardSD = legoSD->GetStandardSD();
125 // set the standard sensitive detector
126 lv->SetSensitiveDetector(standardSD);
132 void AliSDManager::CreateSD(G4LogicalVolume* lv, AliModule* module) const
134 // Creates/retrieves a sensitive detector for the logical volume.
137 TG4GeometryServices* geometryServices = TG4GeometryServices::Instance();
138 G4SDManager* pSDManager = G4SDManager::GetSDMpointer();
140 G4String lvName = lv->GetName();
142 G4String moduleName = module->GetName();
143 G4String sdName = "/Alice/" + moduleName + "/" + lvName;
145 // cut copy number from sdName
146 geometryServices->G4ToG3VolumeName(sdName);
148 // create/retrieve the sensitive detector
149 G4VSensitiveDetector* sd = 0;
150 sd = pSDManager->FindSensitiveDetector(sdName);
152 AliSensitiveDetector* asd
153 = new AliSensitiveDetector(sdName, module);
154 pSDManager->AddNewDetector(asd);
156 G4cout << "Sensitive detector " << sdName << "("
157 << asd->GetID() << ") has been created." << G4endl;
160 lv->SetSensitiveDetector(sd);
163 AliModule* AliSDManager::FindAliModule(G4LogicalVolume* lv) const
165 // Finds the module containing specified logical volume.
169 TG4GeometryServices* geometryServices = TG4GeometryServices::Instance();
171 // get g3 volume name
172 G4String g3Name = lv->GetName();
173 geometryServices->G4ToG3VolumeName(g3Name);
175 // get module name from the map
176 G4String moduleName = geometryServices->GetMapSecond(g3Name);
178 // find module from gAlice
179 AliModule* module = gAlice->GetModule(moduleName);
181 G4String text = "AliSDManager::FindAliModule:\n";
182 text = text + " AliModule " + moduleName;
183 text = text + " (mapped from logical volume " + lv->GetName() + ")\n";
184 text = text + " has not been found in gAlice.";
185 AliGlobals::Exception(text);
191 void AliSDManager::SetLego(AliLego* lego) const
193 // Replaces the existing sensitive detectors
194 // with lego sensitive detectors.
198 G4String text = "AliSDManager::SetLego: \n";
199 text = text + " No AliLego is defined.";
200 AliGlobals::Warning(text);
204 G4LogicalVolumeStore* pLVStore = G4LogicalVolumeStore::GetInstance();
205 G4int nofLV = pLVStore->entries();
207 for (G4int i=0; i<nofLV; i++) {
208 G4LogicalVolume* lv = (*pLVStore)[i];
209 CreateLegoSD(lv, lego);
213 void AliSDManager::UnsetLego() const
215 // Replace the lego sensitive detectors
216 // back with standard sensitive detectors.
219 G4SDManager* pSDManager = G4SDManager::GetSDMpointer();
220 G4LogicalVolumeStore* pLVStore = G4LogicalVolumeStore::GetInstance();
221 G4int nofLV = pLVStore->entries();
223 // set back standard sensitive detectors
224 for (G4int i=0; i<nofLV; i++) {
225 G4LogicalVolume* lv = (*pLVStore)[i];
229 // The lego sensitive detectors are not deleted here
230 // as there is no way how to unregister them