168{
169
171
172
173
174
175
176 Trk::TrackingVolume* inDetVolume = nullptr;
177 Trk::TrackingVolume* hgtdVolume = nullptr;
178 Trk::TrackingVolume* caloVolume = nullptr;
179
180
181 Trk::TrackingVolume* highestVolume = nullptr;
182
183#ifdef TRKDETDESCR_MEMUSAGE
184 m_memoryLogger.refresh(getpid());
185 ATH_MSG_INFO(
"[ memory usage ] Start of TrackingGeometry building: " );
187#endif
188
189
191
193
194 std::unique_ptr<Trk::TrackingGeometry> inDetTrackingGeometry =
196
197 if (inDetTrackingGeometry) {
198
200
202
203 inDetVolume = inDetTrackingGeometry->checkoutHighestTrackingVolume();
204
205 highestVolume = inDetVolume;
206 } else
208 }
209
210#ifdef TRKDETDESCR_MEMUSAGE
211 m_memoryLogger.refresh(getpid());
212 ATH_MSG_INFO(
"[ memory usage ] After InDet TrackingGeometry building: " );
214#endif
215
216 }
217
218
219
221 if (inDetVolume)
222 ATH_MSG_VERBOSE(
"HGTD Tracking Geometry is going to be built with enclosed ID." );
223 else
224 ATH_MSG_VERBOSE(
"HGTD Tracking Geometry is going to be built stand-alone." );
225
226 std::unique_ptr<Trk::TrackingGeometry> hgtdTrackingGeometry =
228
229 if (hgtdTrackingGeometry) {
230
233
234 hgtdVolume = hgtdTrackingGeometry->checkoutHighestTrackingVolume();
235
236 highestVolume = hgtdVolume;
237 } else
239 }
240
241#ifdef TRKDETDESCR_MEMUSAGE
242 m_memoryLogger.refresh(getpid());
243 ATH_MSG_INFO(
"[ memory usage ] After Calo TrackingGeometry building: " );
245#endif
246
247 }
248
249
250
252 std::string enclosed = "stand-alone.";
253 if (inDetVolume and hgtdVolume)
254 enclosed = "with encloded ID/HGTD.";
255 else if (inDetVolume or hgtdVolume)
256 enclosed = (inDetVolume) ? "with encloded ID." : "with encloded HGTD.";
257 ATH_MSG_VERBOSE(
"Calorimeter Tracking Geometry is going to be built "<< enclosed );
258
259
260 std::unique_ptr<Trk::TrackingGeometry> caloTrackingGeometry;
261 if (inDetVolume and not hgtdVolume)
263 else
265
266 if (caloTrackingGeometry) {
267
270
271 caloVolume = caloTrackingGeometry->checkoutHighestTrackingVolume();
272
273 highestVolume = caloVolume;
274 } else
276 }
277
278#ifdef TRKDETDESCR_MEMUSAGE
279 m_memoryLogger.refresh(getpid());
280 ATH_MSG_INFO(
"[ memory usage ] After Calo TrackingGeometry building: " );
282#endif
283
284 }
285
286
287
289 std::string enclosed = "stand-alone.";
290 if (inDetVolume and hgtdVolume and caloVolume )
291 enclosed = "with encloded ID/HGTD/Calo.";
292 else if (inDetVolume or hgtdVolume or caloVolume) {
293 if (inDetVolume) {
294 if (hgtdVolume)
295 enclosed = "with encloded ID/HGTD";
296 else if (caloVolume)
297 enclosed = "with encloded ID/Calo";
298 else
299 enclosed = "with encloded ID";
300 } else if (hgtdVolume) {
301 if (caloVolume)
302 enclosed = "with encloded HGTD/Calo";
303 else
304 enclosed = "with encloded HGTD";
305 } else {
306 enclosed = "with encloded Calo";
307 }
308 }
309 ATH_MSG_VERBOSE(
"Muon System Tracking Geometry is going to be built "<< enclosed );
310
311
312 if (inDetVolume and not hgtdVolume and not caloVolume)
314 else if (hgtdVolume and not caloVolume)
316 else
318
319
322
323#ifdef TRKDETDESCR_MEMUSAGE
324 m_memoryLogger.refresh(getpid());
325 ATH_MSG_INFO(
"[ memory usage ] After Muon TrackingGeometry building: " );
327#endif
328
329
331
333
335
336 ATH_MSG_VERBOSE(
"Retrieved with following glue volumes: " << innerGlueVolumes );
337
339
341
343
344
345
346 const Trk::CylinderVolumeBounds* innerVolumeBounds =
dynamic_cast<const Trk::CylinderVolumeBounds*
>(&(highestVolume->
volumeBounds()));
347 if (!innerVolumeBounds)
ATH_MSG_WARNING(
"atlasTrackingGeometry() ... dynamic cast to innerVolumeBounds failed!" );
348 double innerVolumeOuterR = innerVolumeBounds ? innerVolumeBounds->
outerRadius() : 0;
349 double innerVolumeHalflengthZ = innerVolumeBounds ? innerVolumeBounds->
halflengthZ() : 0;
350
351
352
353
354
355
356
357
358
359
360 double innerCylinderSectorHalflengthZ = 0.5*(
m_worldDimension[2] - innerVolumeHalflengthZ);
361 auto innerCylinderSectorBounds = std::make_shared<Trk::CylinderVolumeBounds>(0., innerVolumeOuterR, innerCylinderSectorHalflengthZ);
362
363 double innerCylinderSectorPositionZ = fabs(
m_worldDimension[2]-innerCylinderSectorHalflengthZ);
364
365
366 auto atlasInnerNegativeSectorTransf = std::make_unique<Amg::Transform3D>(
Amg::Translation3D(0.,0.,-innerCylinderSectorPositionZ));
367 Trk::TrackingVolume* atlasInnerNegativeSector = new Trk::TrackingVolume(
368 std::move(atlasInnerNegativeSectorTransf),
369 innerCylinderSectorBounds,
371 nullptr,
372 nullptr,
373 "AtlasInnerNegativeSector");
374
375
376 auto atlasInnerPositiveSectorTransf = std::make_unique<Amg::Transform3D>(
Amg::Translation3D(0.,0.,innerCylinderSectorPositionZ));
377 Trk::TrackingVolume* atlasInnerPositiveSector = new Trk::TrackingVolume(
378 std::move(atlasInnerPositiveSectorTransf),
379 std::make_shared<Trk::CylinderVolumeBounds>(*innerCylinderSectorBounds),
381 nullptr,
382 nullptr,
383 "AtlasInnerPositiveSector");
384
385 ATH_MSG_VERBOSE(
"Inner Negative/Positive Sectors built successfully." );
386
387
388 auto atlasInnerSectorVolumes = std::vector<Trk::TrackingVolume*>{atlasInnerNegativeSector,highestVolume,atlasInnerPositiveSector};
389
393
394
395
396 auto innerSectorBounds =
397 std::make_shared<Trk::CylinderVolumeBounds>(0., innerVolumeOuterR,
m_worldDimension[2]);
398
399 Trk::TrackingVolume* atlasInnerSector = new Trk::TrackingVolume(nullptr,
400 innerSectorBounds,
402 nullptr,
403 std::move(atlasInnerSectorVolumeArray),
404 "AtlasInnerSector");
405
406
407 auto outerSectorBounds =
409 Trk::TrackingVolume* atlasOuterSector = new Trk::TrackingVolume(nullptr,
410 outerSectorBounds,
412 nullptr,
413 nullptr,
414 "AtlasOuterSector");
415
417
418
419 auto atlasVolumes = std::vector<Trk::TrackingVolume*>{atlasInnerSector, atlasOuterSector};
420
423
424
426
427
428 Trk::TrackingVolume* atlasVolume = new Trk::TrackingVolume(nullptr,
429 atlasBounds,
431 nullptr,
432 std::move(atlasVolumeArray),
433 "Atlas");
434
436
437
438
441
444
446
447
448 auto volIter = innerCentralFaceVolumes.begin();
449 auto volIterEnd = innerCentralFaceVolumes.end();
450
451
452 std::vector<Trk::TrackingVolume*> atlasInnerOuterVolumes;
453 atlasInnerOuterVolumes.push_back(atlasInnerNegativeSector);
454 for ( ; volIter != volIterEnd; ++volIter)
455 if (*volIter) atlasInnerOuterVolumes.push_back(*volIter);
456 atlasInnerOuterVolumes.push_back(atlasInnerPositiveSector);
457
460
461 ATH_MSG_VERBOSE(
"Atlas Inner/Outer Sector glued successfully together." );
462
463
465
466
467 ATH_MSG_VERBOSE(
"Atlas TrackingGeometry built with following parameters : ");
468
469
470
472
473#ifdef TRKDETDESCR_MEMUSAGE
474 m_memoryLogger.refresh(getpid());
475 ATH_MSG_INFO(
"[ memory usage ] After Outer Sector TrackingGeometry building: " );
477#endif
478
479 }
480
484 }
485 else ATH_MSG_WARNING(
"atlasTrackingGeometry() ... atlasTrackingGeometry = 0, could not call registerNavigationLevel and propagateMagneticFieldProperties" );
486
487#ifdef TRKDETDESCR_MEMUSAGE
488 m_memoryLogger.refresh(getpid());
489 ATH_MSG_INFO(
"[ memory usage ] End of TrackingGeometry building: " );
491#endif
492
493
496
497
499 }
501}
#define ATH_MSG_VERBOSE(x)
#define ATH_MSG_WARNING(x)
double halflengthZ() const
This method returns the halflengthZ.
double outerRadius() const
This method returns the outer radius.
Material m_worldMaterial
the world material
std::unique_ptr< Trk::TrackingGeometry > atlasTrackingGeometry(const EventContext &ctx, SG::WriteCondHandle< TrackingGeometry > &whandle) const
TrackingGeometry for ATLAS setup.
const std::vector< TrackingVolume * > & glueVolumes(BoundarySurfaceFace)
retrieve them again
const std::string & volumeName() const
Returns the VolumeName - for debug reason, might be depreciated later.
GlueVolumesDescriptor & glueVolumesDescriptor()
const VolumeBounds & volumeBounds() const
returns the volumeBounds()
Eigen::Translation< double, 3 > Translation3D
NavigationLevel
destinguishes an association TrackingGeometry with one for global search