]>
Commit | Line | Data |
---|---|---|
c926eee0 | 1 | // $Id$ |
2 | // Category: digits+hits | |
3 | // | |
a6412d9b | 4 | // Author: I. Hrivnacova |
5 | // | |
6 | // Class AliAliSDConstruction | |
7 | // -------------------------- | |
c926eee0 | 8 | // See the class description in the header file. |
9 | ||
10 | #include "AliSDConstruction.h" | |
11 | #include "AliSensitiveDetector.h" | |
12 | #include "AliLegoSensitiveDetector.h" | |
13 | #include "AliGlobals.h" | |
14 | #include "AliRun.h" | |
15 | #include "AliModule.h" | |
16 | ||
17 | #include "TG4GeometryServices.h" | |
18 | ||
19 | #include <G4SDManager.hh> | |
20 | #include <G4LogicalVolume.hh> | |
21 | #include <G4LogicalVolumeStore.hh> | |
22 | ||
23 | #include <TObjArray.h> | |
24 | ||
a6412d9b | 25 | //_____________________________________________________________________________ |
c926eee0 | 26 | AliSDConstruction::AliSDConstruction() |
27 | : TG4VSDConstruction() { | |
28 | // | |
29 | } | |
30 | ||
a6412d9b | 31 | //_____________________________________________________________________________ |
c926eee0 | 32 | AliSDConstruction::~AliSDConstruction() { |
33 | // | |
34 | } | |
35 | ||
36 | // private methods | |
37 | ||
a6412d9b | 38 | //_____________________________________________________________________________ |
c926eee0 | 39 | void AliSDConstruction::InitializeModules() |
40 | { | |
41 | // Initializes AliModules. | |
42 | // --- | |
43 | ||
44 | TObjArray* modules = gAlice->Modules(); | |
45 | TIter next(modules); | |
46 | AliModule* module; | |
47 | while((module = (AliModule*)next())) | |
48 | module->Init(); | |
49 | } | |
50 | ||
a6412d9b | 51 | //_____________________________________________________________________________ |
c926eee0 | 52 | AliModule* AliSDConstruction::FindAliModule(G4LogicalVolume* lv) const |
53 | { | |
54 | // Finds the module containing specified logical volume. | |
55 | // --- | |
56 | ||
57 | // geometry manager | |
58 | TG4GeometryServices* geometryServices = TG4GeometryServices::Instance(); | |
59 | ||
60 | // get g3 volume name | |
a6412d9b | 61 | G4String g3Name = geometryServices->G4ToG3VolumeName(lv->GetName()); |
c926eee0 | 62 | |
63 | // get module name from the map | |
64 | G4String moduleName = geometryServices->GetMapSecond(g3Name); | |
65 | ||
66 | // find module from gAlice | |
67 | AliModule* module = gAlice->GetModule(moduleName); | |
68 | if (!module) { | |
69 | G4String text = "AliSDConstruction::FindAliModule:\n"; | |
70 | text = text + " AliModule " + moduleName; | |
71 | text = text + " (mapped from logical volume " + lv->GetName() + ")\n"; | |
72 | text = text + " has not been found in gAlice."; | |
73 | AliGlobals::Exception(text); | |
74 | } | |
75 | ||
76 | return module; | |
77 | } | |
78 | ||
a6412d9b | 79 | //_____________________________________________________________________________ |
c926eee0 | 80 | void AliSDConstruction::CreateSD(G4LogicalVolume* lv, AliModule* module) const |
81 | { | |
82 | // Creates/retrieves a sensitive detector for the logical volume. | |
83 | // --- | |
84 | ||
85 | TG4GeometryServices* geometryServices = TG4GeometryServices::Instance(); | |
86 | G4SDManager* pSDManager = G4SDManager::GetSDMpointer(); | |
87 | ||
a6412d9b | 88 | G4String lvName = lv->GetName(); |
c926eee0 | 89 | G4String moduleName = module->GetName(); |
90 | G4String sdName = "/Alice/" + moduleName + "/" + lvName; | |
91 | ||
92 | // cut copy number from sdName | |
a6412d9b | 93 | sdName = geometryServices->G4ToG3VolumeName(sdName); |
c926eee0 | 94 | |
95 | // create/retrieve the sensitive detector | |
96 | G4VSensitiveDetector* sd = 0; | |
97 | sd = pSDManager->FindSensitiveDetector(sdName); | |
98 | if (!sd) { | |
99 | AliSensitiveDetector* asd | |
100 | = new AliSensitiveDetector(sdName, module); | |
101 | pSDManager->AddNewDetector(asd); | |
102 | // add verbose | |
103 | G4cout << "Sensitive detector " << sdName << "(" | |
104 | << asd->GetID() << ") has been created." << G4endl; | |
105 | sd = asd; | |
106 | } | |
107 | lv->SetSensitiveDetector(sd); | |
108 | } | |
109 | ||
a6412d9b | 110 | //_____________________________________________________________________________ |
c926eee0 | 111 | void AliSDConstruction::CreateLegoSD(G4LogicalVolume* lv, AliLego* lego) const |
112 | { | |
113 | // Replaces the existing sensitive detector of the logical volume | |
114 | // with the lego sensitive detector. | |
115 | // --- | |
116 | ||
117 | TG4GeometryServices* geometryServices = TG4GeometryServices::Instance(); | |
118 | G4SDManager* pSDManager = G4SDManager::GetSDMpointer(); | |
119 | ||
120 | G4String lvName = lv->GetName(); | |
121 | G4String sdName = "/Alice/lego/" + lvName; | |
122 | ||
123 | // cut copy number from sdName | |
a6412d9b | 124 | sdName = geometryServices->G4ToG3VolumeName(sdName); |
c926eee0 | 125 | |
126 | // retrieve the standard sensitive detector | |
127 | G4VSensitiveDetector* sd = lv->GetSensitiveDetector(); | |
128 | ||
129 | // create/retrieve the lego sensitive detector | |
130 | G4VSensitiveDetector* legoVSD = 0; | |
131 | legoVSD = pSDManager->FindSensitiveDetector(sdName); | |
132 | ||
133 | if (!legoVSD) { | |
134 | AliLegoSensitiveDetector* legoSD | |
135 | = new AliLegoSensitiveDetector(sdName, lego, sd); | |
136 | pSDManager->AddNewDetector(legoSD); | |
137 | // add verbose | |
138 | G4cout << "Lego sensitive detector " << sdName | |
139 | << ") has been created." << G4endl; | |
140 | legoVSD = legoSD; | |
141 | } | |
142 | lv->SetSensitiveDetector(legoVSD); | |
143 | } | |
144 | ||
a6412d9b | 145 | //_____________________________________________________________________________ |
c926eee0 | 146 | void AliSDConstruction::UnsetLegoSD(G4LogicalVolume* lv) const |
147 | { | |
148 | // Replace the lego sensitive detector of the logical volume | |
149 | // with the standard sensitive detector. | |
150 | // --- | |
151 | ||
152 | G4SDManager* pSDManager = G4SDManager::GetSDMpointer(); | |
153 | ||
154 | // get the lego sensitive detector | |
155 | G4VSensitiveDetector* sd = lv->GetSensitiveDetector(); | |
156 | AliLegoSensitiveDetector* legoSD = 0; | |
157 | if (sd) { | |
158 | // check type | |
159 | legoSD = dynamic_cast<AliLegoSensitiveDetector*>(sd); | |
160 | if (!legoSD) { | |
161 | G4String text = "AliSDConstruction::UnsetLego: \n"; | |
162 | text = text + " Wrong sensitive detector type."; | |
163 | AliGlobals::Exception(text); | |
164 | } | |
165 | } | |
166 | ||
167 | // get the standard sensitive detector | |
168 | G4VSensitiveDetector* standardSD = legoSD->GetStandardSD(); | |
169 | ||
170 | // set the standard sensitive detector | |
171 | lv->SetSensitiveDetector(standardSD); | |
172 | } | |
173 | ||
174 | ||
175 | // public methods | |
176 | ||
a6412d9b | 177 | //_____________________________________________________________________________ |
c926eee0 | 178 | void AliSDConstruction::Construct() |
179 | { | |
180 | // Creates sensitive detectors and initialize AliModules. | |
181 | // Sensitive detectors are set to all logical volumes | |
182 | // --- | |
183 | ||
184 | G4LogicalVolumeStore* lvStore = G4LogicalVolumeStore::GetInstance(); | |
185 | G4int nofLV = lvStore->size(); | |
186 | ||
187 | for (G4int i=0; i<nofLV; i++) { | |
188 | G4LogicalVolume* lv = (*lvStore)[i]; | |
189 | AliModule* module = FindAliModule(lv); | |
190 | CreateSD(lv, module); | |
191 | } | |
192 | ||
193 | InitializeModules(); | |
194 | } | |
195 | ||
196 | /* | |
197 | //#include "TG4GeometryManager.h" | |
198 | //#include <G3SensVolVector.hh> | |
199 | ||
200 | void AliSDConstruction::CreateSensitiveDetectors2() | |
201 | { | |
202 | // Creates sensitive detectors. | |
203 | // Sensitive detectors are set only to logical volumes | |
204 | // in G3SensVolVector. | |
205 | // --- | |
206 | ||
207 | G3SensVolVector svVector | |
208 | = TG4GeometryManager::Instance()->GetG3SensVolVector(); | |
209 | ||
210 | G4int nofSV = svVector.entries(); | |
211 | if (nofSV>0) | |
212 | for (G4int isv=0; isv<nofSV; isv++) { | |
213 | G4LogicalVolume* lv = svVector[isv]; | |
214 | AliModule* module = FindAliModule(lv); | |
215 | CreateSD(lv, module); | |
216 | } | |
217 | } | |
218 | */ | |
219 | ||
a6412d9b | 220 | //_____________________________________________________________________________ |
c926eee0 | 221 | void AliSDConstruction::SetLego(AliLego* lego) const |
222 | { | |
223 | // Replaces the existing sensitive detectors | |
224 | // with lego sensitive detectors. | |
225 | // --- | |
226 | ||
227 | if (!lego) { | |
228 | G4String text = "AliSDConstruction::SetLego: \n"; | |
229 | text = text + " No AliLego is defined."; | |
230 | AliGlobals::Warning(text); | |
231 | return; | |
232 | } | |
233 | ||
234 | G4LogicalVolumeStore* lvStore = G4LogicalVolumeStore::GetInstance(); | |
235 | G4int nofLV = lvStore->size(); | |
236 | ||
237 | for (G4int i=0; i<nofLV; i++) { | |
238 | G4LogicalVolume* lv = (*lvStore)[i]; | |
239 | CreateLegoSD(lv, lego); | |
240 | } | |
241 | } | |
242 | ||
a6412d9b | 243 | //_____________________________________________________________________________ |
c926eee0 | 244 | void AliSDConstruction::UnsetLego() const |
245 | { | |
246 | // Replace the lego sensitive detectors | |
247 | // back with standard sensitive detectors. | |
248 | // --- | |
249 | ||
250 | G4SDManager* pSDManager = G4SDManager::GetSDMpointer(); | |
251 | G4LogicalVolumeStore* lvStore = G4LogicalVolumeStore::GetInstance(); | |
252 | G4int nofLV = lvStore->size(); | |
253 | ||
254 | // set back standard sensitive detectors | |
255 | for (G4int i=0; i<nofLV; i++) { | |
256 | G4LogicalVolume* lv = (*lvStore)[i]; | |
257 | UnsetLegoSD(lv); | |
258 | } | |
259 | ||
260 | // The lego sensitive detectors are not deleted here | |
261 | // as there is no way how to unregister them | |
262 | // from G4SDManager | |
263 | } |