153{
154
156
157
158
159 std::unique_ptr<Trk::TrackingGeometry> inDetTrackingGeometry = nullptr;
160 std::unique_ptr<Trk::TrackingGeometry> caloTrackingGeometry = nullptr;
161
162
163 Trk::TrackingVolume* inDetVolume = nullptr;
164 Trk::TrackingVolume* caloVolume = nullptr;
165
166
167 Trk::TrackingVolume* highestVolume = nullptr;
168
169#ifdef TRKDETDESCR_MEMUSAGE
170 m_memoryLogger.refresh(getpid());
171 ATH_MSG_INFO(
"[ memory usage ] Start of TrackingGeometry building: " );
173#endif
174
175
177
179
181
182 if (inDetTrackingGeometry) {
183
185
187
188 inDetVolume = inDetTrackingGeometry->checkoutHighestTrackingVolume();
189
190 highestVolume = inDetVolume;
191 } else
193 }
194
195#ifdef TRKDETDESCR_MEMUSAGE
196 m_memoryLogger.refresh(getpid());
197 ATH_MSG_INFO(
"[ memory usage ] After InDet TrackingGeometry building: " );
199#endif
200
201 }
202
203
204
206 if (inDetVolume)
207 ATH_MSG_VERBOSE(
"Calorimeter Tracking Geometry is going to be built with enclosed ID." );
208 else
209 ATH_MSG_VERBOSE(
"Calorimeter Tracking Geometry is going to be built stand-alone." );
210
212
213 if (caloTrackingGeometry) {
214
217
218 caloVolume = caloTrackingGeometry->checkoutHighestTrackingVolume();
219
220 highestVolume = caloVolume;
221 } else
223 }
224
225#ifdef TRKDETDESCR_MEMUSAGE
226 m_memoryLogger.refresh(getpid());
227 ATH_MSG_INFO(
"[ memory usage ] After Calo TrackingGeometry building: " );
229#endif
230
231 }
232
233
234
236
237 std::string enclosed = "stand-alone.";
238 if (inDetVolume && caloVolume)
239 enclosed = "with encloded ID/Calo.";
240 else if (inDetVolume || caloVolume)
241 enclosed = (inDetVolume) ? "with encloded ID." : "with encloded Calo.";
242 ATH_MSG_VERBOSE(
"Muon System Tracking Geometry is going to be built "<< enclosed );
243
244 if (inDetVolume && !caloVolume)
246 else
248
249
252
253#ifdef TRKDETDESCR_MEMUSAGE
254 m_memoryLogger.refresh(getpid());
255 ATH_MSG_INFO(
"[ memory usage ] After Muon TrackingGeometry building: " );
257#endif
258
259
261
263
265
266 ATH_MSG_VERBOSE(
"Retrieved with following glue volumes: " << innerGlueVolumes );
267
269
271
273
274
275
276 const Trk::CylinderVolumeBounds* innerVolumeBounds =
dynamic_cast<const Trk::CylinderVolumeBounds*
>(&(highestVolume->
volumeBounds()));
277 if (!innerVolumeBounds)
ATH_MSG_WARNING(
"atlasTrackingGeometry() ... dynamic cast to innerVolumeBounds failed!" );
278 double innerVolumeOuterR = innerVolumeBounds ? innerVolumeBounds->
outerRadius() : 0;
279 double innerVolumeHalflengthZ = innerVolumeBounds ? innerVolumeBounds->
halflengthZ() : 0;
280
281
282
283
284
285
286
287
288
289
290 double innerCylinderSectorHalflengthZ = 0.5*(
m_worldDimension[2] - innerVolumeHalflengthZ);
291 auto innerCylinderSectorBounds =
292 std::make_shared<Trk::CylinderVolumeBounds>(0., innerVolumeOuterR, innerCylinderSectorHalflengthZ);
293
294 double innerCylinderSectorPositionZ = fabs(
m_worldDimension[2]-innerCylinderSectorHalflengthZ);
295
296
297 auto atlasInnerNegativeSectorTransf = std::make_unique<Amg::Transform3D>(
Amg::Translation3D(0.,0.,-innerCylinderSectorPositionZ));
298 Trk::TrackingVolume* atlasInnerNegativeSector = new Trk::TrackingVolume(
299 std::move(atlasInnerNegativeSectorTransf),
300 std::make_shared<Trk::CylinderVolumeBounds>(*innerCylinderSectorBounds),
302 nullptr,
303 nullptr,
304 "AtlasInnerNegativeSector");
305
306
307 auto atlasInnerPositiveSectorTransf = std::make_unique<Amg::Transform3D>(
Amg::Translation3D(0.,0.,innerCylinderSectorPositionZ));
308 Trk::TrackingVolume* atlasInnerPositiveSector = new Trk::TrackingVolume(
309 std::move(atlasInnerPositiveSectorTransf),
310 std::move(innerCylinderSectorBounds),
312 nullptr,
313 nullptr,
314 "AtlasInnerPositiveSector");
315
316 ATH_MSG_VERBOSE(
"Inner Negative/Positive Sectors built successfully." );
317
318
319 auto atlasInnerSectorVolumes = std::vector<Trk::TrackingVolume*>{atlasInnerNegativeSector,highestVolume,atlasInnerPositiveSector};
320
322 std::unique_ptr<Trk::BinnedArray<Trk::TrackingVolume>>
323 atlasInnerSectorVolumeArray =
326 : nullptr;
327
328
329 auto innerSectorBounds =
330 std::make_shared<Trk::CylinderVolumeBounds>(0., innerVolumeOuterR,
m_worldDimension[2]);
331
332 Trk::TrackingVolume* atlasInnerSector = new Trk::TrackingVolume(nullptr,
333 std::move(innerSectorBounds),
335 nullptr,
336 std::move(atlasInnerSectorVolumeArray),
337 "AtlasInnerSector");
338
339
340 auto outerSectorBounds =
342 Trk::TrackingVolume* atlasOuterSector = new Trk::TrackingVolume(nullptr,
343 std::move(outerSectorBounds),
345 nullptr,
346 nullptr,
347 "AtlasOuterSector");
348
350
351
352 auto atlasVolumes = std::vector<Trk::TrackingVolume*>{atlasInnerSector, atlasOuterSector};
353
354 std::unique_ptr<Trk::BinnedArray<Trk::TrackingVolume>>
355 atlasVolumeArray =
358 : nullptr;
359
360
362
363
364 Trk::TrackingVolume* atlasVolume = new Trk::TrackingVolume(nullptr,
365 std::move(atlasBounds),
367 nullptr,
368 std::move(atlasVolumeArray),
369 "Atlas");
370
372
373
374
377
380
382
383
384 auto volIter = innerCentralFaceVolumes.begin();
385 auto volIterEnd = innerCentralFaceVolumes.end();
386
387
388 std::vector<Trk::TrackingVolume*> atlasInnerOuterVolumes;
389 atlasInnerOuterVolumes.push_back(atlasInnerNegativeSector);
390 for (; volIter != volIterEnd; ++volIter) {
391 if (*volIter) {
392 atlasInnerOuterVolumes.push_back(*volIter);
393 }
394 }
395 atlasInnerOuterVolumes.push_back(atlasInnerPositiveSector);
396
399
400 ATH_MSG_VERBOSE(
"Atlas Inner/Outer Sector glued successfully together." );
401
402
404
405
406 ATH_MSG_VERBOSE(
"Atlas TrackingGeometry built with following parameters : ");
407
408
409
411
412#ifdef TRKDETDESCR_MEMUSAGE
413 m_memoryLogger.refresh(getpid());
414 ATH_MSG_INFO(
"[ memory usage ] After Outer Sector TrackingGeometry building: " );
416#endif
417
418 }
419
423 }
424 else ATH_MSG_WARNING(
"atlasTrackingGeometry() ... atlasTrackingGeometry = 0, could not call registerNavigationLevel and propagateMagneticFieldProperties" );
425
426#ifdef TRKDETDESCR_MEMUSAGE
427 m_memoryLogger.refresh(getpid());
428 ATH_MSG_INFO(
"[ memory usage ] End of TrackingGeometry building: " );
430#endif
431
432
435
436
438 }
440}
#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.
std::unique_ptr< TrackingGeometry > atlasTrackingGeometry() const
TrackingGeometry for ATLAS setup.
Material m_worldMaterial
the world material
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