Very tentative function: not yet used.
This simpler hierarchy is as follows: Belle 2 / | | \ Ying Yang Pat Mat ... other sub-detectors / / | / | | \ | \ \ ......... sensors ........
So the hierarchy is as follows: Belle 2 / | | \ Ying Yang Pat Mat ... other sub-detectors / | / | | \ | \ ...... ladders ...... / / | / | | \ | \ \ ......... sensors ........
175 {
176 try {
177 auto& rigidBodyHierarchy = dynamic_cast<RigidBodyHierarchy&>(hierarchy);
178 auto& geo = VXD::GeoCache::getInstance();
179
180 DBObjPtr<VXDAlignment> vxdAlignments;
181 if (s_hierarchyType == c_None) {
182
183 return;
184
185 } else if (s_hierarchyType == c_Flat) {
186 for (auto& sensor : geo.getListOfSensors()) {
187
188
189 if (sensor.getLayerNumber() <= 2 and !s_enablePXD)
190 continue;
191
192 if (sensor.getLayerNumber() > 2 and !s_enableSVD)
193 continue;
194
195 rigidBodyHierarchy.insertTGeoTransform<VXDAlignment, VXDAlignment>(sensor, VxdID(0, 0, 0, 1),
196 geo.getSensorInfo(sensor).getTransformation(true));
197 }
198 } else if (s_hierarchyType == c_HalfShells) {
207
208 for (auto& halfShellPlacement : geo.getHalfShellPlacements()) {
209
210 if (halfShellPlacement.first.getLayerNumber() <= 2 and !s_enablePXD)
211 continue;
212
213 if (halfShellPlacement.first.getLayerNumber() > 2 and !s_enableSVD)
214 continue;
215
216 TGeoHMatrix trafoHalfShell = halfShellPlacement.second;
217 trafoHalfShell *= geo.getTGeoFromRigidBodyParams(
218 vxdAlignments->get(halfShellPlacement.first, VXDAlignment::dU),
219 vxdAlignments->get(halfShellPlacement.first, VXDAlignment::dV),
220 vxdAlignments->get(halfShellPlacement.first, VXDAlignment::dW),
221 vxdAlignments->get(halfShellPlacement.first, VXDAlignment::dAlpha),
222 vxdAlignments->get(halfShellPlacement.first, VXDAlignment::dBeta),
223 vxdAlignments->get(halfShellPlacement.first, VXDAlignment::dGamma)
224 );
225 rigidBodyHierarchy.insertTGeoTransform<VXDAlignment, alignment::EmptyGlobalParamSet>(halfShellPlacement.first, 0, trafoHalfShell);
226
227 for (auto& ladderPlacement : geo.getLadderPlacements(halfShellPlacement.first)) {
228
229 TGeoHMatrix trafoLadder = ladderPlacement.second;
230 trafoLadder *= geo.getTGeoFromRigidBodyParams(
231 vxdAlignments->get(ladderPlacement.first, VXDAlignment::dU),
232 vxdAlignments->get(ladderPlacement.first, VXDAlignment::dV),
233 vxdAlignments->get(ladderPlacement.first, VXDAlignment::dW),
234 vxdAlignments->get(ladderPlacement.first, VXDAlignment::dAlpha),
235 vxdAlignments->get(ladderPlacement.first, VXDAlignment::dBeta),
236 vxdAlignments->get(ladderPlacement.first, VXDAlignment::dGamma)
237 );
238
239
240
241 for (auto& sensorPlacement : geo.getSensorPlacements(ladderPlacement.first)) {
242
243 TGeoHMatrix trafoSensor = sensorPlacement.second;
244 trafoSensor *= geo.getTGeoFromRigidBodyParams(
245 vxdAlignments->get(sensorPlacement.first, VXDAlignment::dU),
246 vxdAlignments->get(sensorPlacement.first, VXDAlignment::dV),
247 vxdAlignments->get(sensorPlacement.first, VXDAlignment::dW),
248 vxdAlignments->get(sensorPlacement.first, VXDAlignment::dAlpha),
249 vxdAlignments->get(sensorPlacement.first, VXDAlignment::dBeta),
250 vxdAlignments->get(sensorPlacement.first, VXDAlignment::dGamma)
251 );
252 rigidBodyHierarchy.insertTGeoTransform<VXDAlignment, VXDAlignment>(sensorPlacement.first, halfShellPlacement.first,
253 trafoLadder * trafoSensor);
254
255
256 }
257 }
258 }
259 } else if (s_hierarchyType == c_Full) {
270
271 for (auto& halfShellPlacement : geo.getHalfShellPlacements()) {
272
273 if (halfShellPlacement.first.getLayerNumber() <= 2 and !s_enablePXD)
274 continue;
275
276 if (halfShellPlacement.first.getLayerNumber() > 2 and !s_enableSVD)
277 continue;
278
279 TGeoHMatrix trafoHalfShell = halfShellPlacement.second;
280 trafoHalfShell *= geo.getTGeoFromRigidBodyParams(
281 vxdAlignments->get(halfShellPlacement.first, VXDAlignment::dU),
282 vxdAlignments->get(halfShellPlacement.first, VXDAlignment::dV),
283 vxdAlignments->get(halfShellPlacement.first, VXDAlignment::dW),
284 vxdAlignments->get(halfShellPlacement.first, VXDAlignment::dAlpha),
285 vxdAlignments->get(halfShellPlacement.first, VXDAlignment::dBeta),
286 vxdAlignments->get(halfShellPlacement.first, VXDAlignment::dGamma)
287 );
288 rigidBodyHierarchy.insertTGeoTransform<VXDAlignment, alignment::EmptyGlobalParamSet>(halfShellPlacement.first, 0, trafoHalfShell);
289
290 for (auto& ladderPlacement : geo.getLadderPlacements(halfShellPlacement.first)) {
291
292 TGeoHMatrix trafoLadder = ladderPlacement.second;
293 trafoLadder *= geo.getTGeoFromRigidBodyParams(
294 vxdAlignments->get(ladderPlacement.first, VXDAlignment::dU),
295 vxdAlignments->get(ladderPlacement.first, VXDAlignment::dV),
296 vxdAlignments->get(ladderPlacement.first, VXDAlignment::dW),
297 vxdAlignments->get(ladderPlacement.first, VXDAlignment::dAlpha),
298 vxdAlignments->get(ladderPlacement.first, VXDAlignment::dBeta),
299 vxdAlignments->get(ladderPlacement.first, VXDAlignment::dGamma)
300 );
301 rigidBodyHierarchy.insertTGeoTransform<VXDAlignment, VXDAlignment>(ladderPlacement.first, halfShellPlacement.first, trafoLadder);
302
303 for (auto& sensorPlacement : geo.getSensorPlacements(ladderPlacement.first)) {
304
305 TGeoHMatrix trafoSensor = sensorPlacement.second;
306 trafoSensor *= geo.getTGeoFromRigidBodyParams(
307 vxdAlignments->get(sensorPlacement.first, VXDAlignment::dU),
308 vxdAlignments->get(sensorPlacement.first, VXDAlignment::dV),
309 vxdAlignments->get(sensorPlacement.first, VXDAlignment::dW),
310 vxdAlignments->get(sensorPlacement.first, VXDAlignment::dAlpha),
311 vxdAlignments->get(sensorPlacement.first, VXDAlignment::dBeta),
312 vxdAlignments->get(sensorPlacement.first, VXDAlignment::dGamma)
313 );
314 rigidBodyHierarchy.insertTGeoTransform<VXDAlignment, VXDAlignment>(sensorPlacement.first, ladderPlacement.first, trafoSensor);
315
316
317 }
318 }
319 }
320 }
321 } catch (const std::bad_cast& e) {
322
323 }
324 }