126{
127
129
130
131
132
133
134 Trk::TrackingVolume* inDetVolume = nullptr;
135 Trk::TrackingVolume* hgtdVolume = nullptr;
136 Trk::TrackingVolume* caloVolume = nullptr;
137
138
139 Trk::TrackingVolume* highestVolume = nullptr;
140
141#ifdef TRKDETDESCR_MEMUSAGE
142 m_memoryLogger.refresh(getpid());
143 ATH_MSG_INFO(
"[ memory usage ] Start of TrackingGeometry building: " );
145#endif
146
147
149
151
152 std::unique_ptr<Trk::TrackingGeometry> inDetTrackingGeometry =
154
155 if (inDetTrackingGeometry) {
156
158
160
161 inDetVolume = inDetTrackingGeometry->checkoutHighestTrackingVolume();
162
163 highestVolume = inDetVolume;
164 } else
166 }
167
168#ifdef TRKDETDESCR_MEMUSAGE
169 m_memoryLogger.refresh(getpid());
170 ATH_MSG_INFO(
"[ memory usage ] After InDet TrackingGeometry building: " );
172#endif
173
174 }
175
176
177
179 if (inDetVolume)
180 ATH_MSG_VERBOSE(
"HGTD Tracking Geometry is going to be built with enclosed ID." );
181 else
182 ATH_MSG_VERBOSE(
"HGTD Tracking Geometry is going to be built stand-alone." );
183
184 std::unique_ptr<Trk::TrackingGeometry> hgtdTrackingGeometry =
186
187 if (hgtdTrackingGeometry) {
188
191
192 hgtdVolume = hgtdTrackingGeometry->checkoutHighestTrackingVolume();
193
194 highestVolume = hgtdVolume;
195 } else
197 }
198
199#ifdef TRKDETDESCR_MEMUSAGE
200 m_memoryLogger.refresh(getpid());
201 ATH_MSG_INFO(
"[ memory usage ] After Calo TrackingGeometry building: " );
203#endif
204
205 }
206
207
208
210 std::string enclosed = "stand-alone.";
211 if (inDetVolume and hgtdVolume)
212 enclosed = "with encloded ID/HGTD.";
213 else if (inDetVolume or hgtdVolume)
214 enclosed = (inDetVolume) ? "with encloded ID." : "with encloded HGTD.";
215 ATH_MSG_VERBOSE(
"Calorimeter Tracking Geometry is going to be built "<< enclosed );
216
217
218 std::unique_ptr<Trk::TrackingGeometry> caloTrackingGeometry;
219 if (inDetVolume and not hgtdVolume)
221 else
223
224 if (caloTrackingGeometry) {
225
228
229 caloVolume = caloTrackingGeometry->checkoutHighestTrackingVolume();
230
231 highestVolume = caloVolume;
232 } else
234 }
235
236#ifdef TRKDETDESCR_MEMUSAGE
237 m_memoryLogger.refresh(getpid());
238 ATH_MSG_INFO(
"[ memory usage ] After Calo TrackingGeometry building: " );
240#endif
241
242 }
243
244
245
247 std::string enclosed = "stand-alone.";
248 if (inDetVolume and hgtdVolume and caloVolume )
249 enclosed = "with encloded ID/HGTD/Calo.";
250 else if (inDetVolume or hgtdVolume or caloVolume) {
251 if (inDetVolume) {
252 if (hgtdVolume)
253 enclosed = "with encloded ID/HGTD";
254 else if (caloVolume)
255 enclosed = "with encloded ID/Calo";
256 else
257 enclosed = "with encloded ID";
258 } else if (hgtdVolume) {
259 if (caloVolume)
260 enclosed = "with encloded HGTD/Calo";
261 else
262 enclosed = "with encloded HGTD";
263 } else {
264 enclosed = "with encloded Calo";
265 }
266 }
267 ATH_MSG_VERBOSE(
"Muon System Tracking Geometry is going to be built "<< enclosed );
268
269
270 if (inDetVolume and not hgtdVolume and not caloVolume)
272 else if (hgtdVolume and not caloVolume)
274 else
276
277
280
281#ifdef TRKDETDESCR_MEMUSAGE
282 m_memoryLogger.refresh(getpid());
283 ATH_MSG_INFO(
"[ memory usage ] After Muon TrackingGeometry building: " );
285#endif
286
287
289
291
293
294 ATH_MSG_VERBOSE(
"Retrieved with following glue volumes: " << innerGlueVolumes );
295
297
299
301
302
303
304 const Trk::CylinderVolumeBounds* innerVolumeBounds =
dynamic_cast<const Trk::CylinderVolumeBounds*
>(&(highestVolume->
volumeBounds()));
305 if (!innerVolumeBounds)
ATH_MSG_WARNING(
"atlasTrackingGeometry() ... dynamic cast to innerVolumeBounds failed!" );
306 double innerVolumeOuterR = innerVolumeBounds ? innerVolumeBounds->
outerRadius() : 0;
307 double innerVolumeHalflengthZ = innerVolumeBounds ? innerVolumeBounds->
halflengthZ() : 0;
308
309
310
311
312
313
314
315
316
317
318 double innerCylinderSectorHalflengthZ = 0.5*(
m_worldDimension[2] - innerVolumeHalflengthZ);
319 auto innerCylinderSectorBounds = std::make_shared<Trk::CylinderVolumeBounds>(0., innerVolumeOuterR, innerCylinderSectorHalflengthZ);
320
321 double innerCylinderSectorPositionZ = fabs(
m_worldDimension[2]-innerCylinderSectorHalflengthZ);
322
323
324 auto atlasInnerNegativeSectorTransf = std::make_unique<Amg::Transform3D>(
Amg::Translation3D(0.,0.,-innerCylinderSectorPositionZ));
325 Trk::TrackingVolume* atlasInnerNegativeSector = new Trk::TrackingVolume(
326 std::move(atlasInnerNegativeSectorTransf),
327 innerCylinderSectorBounds,
329 nullptr,
330 nullptr,
331 "AtlasInnerNegativeSector");
332
333
334 auto atlasInnerPositiveSectorTransf = std::make_unique<Amg::Transform3D>(
Amg::Translation3D(0.,0.,innerCylinderSectorPositionZ));
335 Trk::TrackingVolume* atlasInnerPositiveSector = new Trk::TrackingVolume(
336 std::move(atlasInnerPositiveSectorTransf),
337 std::make_shared<Trk::CylinderVolumeBounds>(*innerCylinderSectorBounds),
339 nullptr,
340 nullptr,
341 "AtlasInnerPositiveSector");
342
343 ATH_MSG_VERBOSE(
"Inner Negative/Positive Sectors built successfully." );
344
345
346 auto atlasInnerSectorVolumes = std::vector<Trk::TrackingVolume*>{atlasInnerNegativeSector,highestVolume,atlasInnerPositiveSector};
347
351
352
353
354 auto innerSectorBounds =
355 std::make_shared<Trk::CylinderVolumeBounds>(0., innerVolumeOuterR,
m_worldDimension[2]);
356
357 Trk::TrackingVolume* atlasInnerSector = new Trk::TrackingVolume(nullptr,
358 innerSectorBounds,
360 nullptr,
361 std::move(atlasInnerSectorVolumeArray),
362 "AtlasInnerSector");
363
364
365 auto outerSectorBounds =
367 Trk::TrackingVolume* atlasOuterSector = new Trk::TrackingVolume(nullptr,
368 outerSectorBounds,
370 nullptr,
371 nullptr,
372 "AtlasOuterSector");
373
375
376
377 auto atlasVolumes = std::vector<Trk::TrackingVolume*>{atlasInnerSector, atlasOuterSector};
378
381
382
384
385
386 Trk::TrackingVolume* atlasVolume = new Trk::TrackingVolume(nullptr,
387 atlasBounds,
389 nullptr,
390 std::move(atlasVolumeArray),
391 "Atlas");
392
394
395
396
399
402
404
405
406 auto volIter = innerCentralFaceVolumes.begin();
407 auto volIterEnd = innerCentralFaceVolumes.end();
408
409
410 std::vector<Trk::TrackingVolume*> atlasInnerOuterVolumes;
411 atlasInnerOuterVolumes.push_back(atlasInnerNegativeSector);
412 for ( ; volIter != volIterEnd; ++volIter)
413 if (*volIter) atlasInnerOuterVolumes.push_back(*volIter);
414 atlasInnerOuterVolumes.push_back(atlasInnerPositiveSector);
415
418
419 ATH_MSG_VERBOSE(
"Atlas Inner/Outer Sector glued successfully together." );
420
421
423
424
425 ATH_MSG_VERBOSE(
"Atlas TrackingGeometry built with following parameters : ");
426
427
428
430
431#ifdef TRKDETDESCR_MEMUSAGE
432 m_memoryLogger.refresh(getpid());
433 ATH_MSG_INFO(
"[ memory usage ] After Outer Sector TrackingGeometry building: " );
435#endif
436
437 }
438
442 }
443 else ATH_MSG_WARNING(
"atlasTrackingGeometry() ... atlasTrackingGeometry = 0, could not call registerNavigationLevel and propagateMagneticFieldProperties" );
444
445#ifdef TRKDETDESCR_MEMUSAGE
446 m_memoryLogger.refresh(getpid());
447 ATH_MSG_INFO(
"[ memory usage ] End of TrackingGeometry building: " );
449#endif
450
451
454
455
457 }
459}
#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.
Gaudi::Property< bool > m_createWorld
ToolHandle< IGeometryBuilderCond > m_muonGeometryBuilderCond
ToolHandle< ITrackingVolumeHelper > m_trackingVolumeHelper
Material m_worldMaterial
the world material
Gaudi::Property< bool > m_synchronizeLayers
ToolHandle< IGeometryBuilderCond > m_caloGeometryBuilderCond
ToolHandle< IGeometryBuilderCond > m_inDetGeometryBuilderCond
Gaudi::Property< std::vector< double > > m_worldDimension
Gaudi::Property< int > m_navigationLevel
ToolHandle< IGeometryBuilderCond > m_hgtdGeometryBuilderCond
std::unique_ptr< Trk::TrackingGeometry > atlasTrackingGeometry(const EventContext &ctx, SG::WriteCondHandle< TrackingGeometry > &whandle) const
TrackingGeometry for ATLAS setup.
Gaudi::Property< bool > m_compactify
ToolHandle< ITrackingVolumeArrayCreator > m_trackingVolumeArrayCreator
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