114{
115
117
118
119
120 std::unique_ptr<Trk::TrackingGeometry> inDetTrackingGeometry = nullptr;
121 std::unique_ptr<Trk::TrackingGeometry> caloTrackingGeometry = nullptr;
122
123
124 Trk::TrackingVolume* inDetVolume = nullptr;
125 Trk::TrackingVolume* caloVolume = nullptr;
126
127
128 Trk::TrackingVolume* highestVolume = nullptr;
129
130#ifdef TRKDETDESCR_MEMUSAGE
131 m_memoryLogger.refresh(getpid());
132 ATH_MSG_INFO(
"[ memory usage ] Start of TrackingGeometry building: " );
134#endif
135
136
138
140
142
143 if (inDetTrackingGeometry) {
144
146
148
149 inDetVolume = inDetTrackingGeometry->checkoutHighestTrackingVolume();
150
151 highestVolume = inDetVolume;
152 } else
154 }
155
156#ifdef TRKDETDESCR_MEMUSAGE
157 m_memoryLogger.refresh(getpid());
158 ATH_MSG_INFO(
"[ memory usage ] After InDet TrackingGeometry building: " );
160#endif
161
162 }
163
164
165
167 if (inDetVolume)
168 ATH_MSG_VERBOSE(
"Calorimeter Tracking Geometry is going to be built with enclosed ID." );
169 else
170 ATH_MSG_VERBOSE(
"Calorimeter Tracking Geometry is going to be built stand-alone." );
171
173
174 if (caloTrackingGeometry) {
175
178
179 caloVolume = caloTrackingGeometry->checkoutHighestTrackingVolume();
180
181 highestVolume = caloVolume;
182 } else
184 }
185
186#ifdef TRKDETDESCR_MEMUSAGE
187 m_memoryLogger.refresh(getpid());
188 ATH_MSG_INFO(
"[ memory usage ] After Calo TrackingGeometry building: " );
190#endif
191
192 }
193
194
195
197
198 std::string enclosed = "stand-alone.";
199 if (inDetVolume && caloVolume)
200 enclosed = "with encloded ID/Calo.";
201 else if (inDetVolume || caloVolume)
202 enclosed = (inDetVolume) ? "with encloded ID." : "with encloded Calo.";
203 ATH_MSG_VERBOSE(
"Muon System Tracking Geometry is going to be built "<< enclosed );
204
205 if (inDetVolume && !caloVolume)
207 else
209
210
213
214#ifdef TRKDETDESCR_MEMUSAGE
215 m_memoryLogger.refresh(getpid());
216 ATH_MSG_INFO(
"[ memory usage ] After Muon TrackingGeometry building: " );
218#endif
219
220
222
224
226
227 ATH_MSG_VERBOSE(
"Retrieved with following glue volumes: " << innerGlueVolumes );
228
230
232
234
235
236
237 const Trk::CylinderVolumeBounds* innerVolumeBounds =
dynamic_cast<const Trk::CylinderVolumeBounds*
>(&(highestVolume->
volumeBounds()));
238 if (!innerVolumeBounds)
ATH_MSG_WARNING(
"atlasTrackingGeometry() ... dynamic cast to innerVolumeBounds failed!" );
239 double innerVolumeOuterR = innerVolumeBounds ? innerVolumeBounds->
outerRadius() : 0;
240 double innerVolumeHalflengthZ = innerVolumeBounds ? innerVolumeBounds->
halflengthZ() : 0;
241
242
243
244
245
246
247
248
249
250
251 double innerCylinderSectorHalflengthZ = 0.5*(
m_worldDimension[2] - innerVolumeHalflengthZ);
252 auto innerCylinderSectorBounds =
253 std::make_shared<Trk::CylinderVolumeBounds>(0., innerVolumeOuterR, innerCylinderSectorHalflengthZ);
254
255 double innerCylinderSectorPositionZ = fabs(
m_worldDimension[2]-innerCylinderSectorHalflengthZ);
256
257
258 auto atlasInnerNegativeSectorTransf = std::make_unique<Amg::Transform3D>(
Amg::Translation3D(0.,0.,-innerCylinderSectorPositionZ));
259 Trk::TrackingVolume* atlasInnerNegativeSector = new Trk::TrackingVolume(
260 std::move(atlasInnerNegativeSectorTransf),
261 std::make_shared<Trk::CylinderVolumeBounds>(*innerCylinderSectorBounds),
263 nullptr,
264 nullptr,
265 "AtlasInnerNegativeSector");
266
267
268 auto atlasInnerPositiveSectorTransf = std::make_unique<Amg::Transform3D>(
Amg::Translation3D(0.,0.,innerCylinderSectorPositionZ));
269 Trk::TrackingVolume* atlasInnerPositiveSector = new Trk::TrackingVolume(
270 std::move(atlasInnerPositiveSectorTransf),
271 std::move(innerCylinderSectorBounds),
273 nullptr,
274 nullptr,
275 "AtlasInnerPositiveSector");
276
277 ATH_MSG_VERBOSE(
"Inner Negative/Positive Sectors built successfully." );
278
279
280 auto atlasInnerSectorVolumes = std::vector<Trk::TrackingVolume*>{atlasInnerNegativeSector,highestVolume,atlasInnerPositiveSector};
281
283 std::unique_ptr<Trk::BinnedArray<Trk::TrackingVolume>>
284 atlasInnerSectorVolumeArray =
287 : nullptr;
288
289
290 auto innerSectorBounds =
291 std::make_shared<Trk::CylinderVolumeBounds>(0., innerVolumeOuterR,
m_worldDimension[2]);
292
293 Trk::TrackingVolume* atlasInnerSector = new Trk::TrackingVolume(nullptr,
294 std::move(innerSectorBounds),
296 nullptr,
297 std::move(atlasInnerSectorVolumeArray),
298 "AtlasInnerSector");
299
300
301 auto outerSectorBounds =
303 Trk::TrackingVolume* atlasOuterSector = new Trk::TrackingVolume(nullptr,
304 std::move(outerSectorBounds),
306 nullptr,
307 nullptr,
308 "AtlasOuterSector");
309
311
312
313 auto atlasVolumes = std::vector<Trk::TrackingVolume*>{atlasInnerSector, atlasOuterSector};
314
315 std::unique_ptr<Trk::BinnedArray<Trk::TrackingVolume>>
316 atlasVolumeArray =
319 : nullptr;
320
321
323
324
325 Trk::TrackingVolume* atlasVolume = new Trk::TrackingVolume(nullptr,
326 std::move(atlasBounds),
328 nullptr,
329 std::move(atlasVolumeArray),
330 "Atlas");
331
333
334
335
338
341
343
344
345 auto volIter = innerCentralFaceVolumes.begin();
346 auto volIterEnd = innerCentralFaceVolumes.end();
347
348
349 std::vector<Trk::TrackingVolume*> atlasInnerOuterVolumes;
350 atlasInnerOuterVolumes.push_back(atlasInnerNegativeSector);
351 for (; volIter != volIterEnd; ++volIter) {
352 if (*volIter) {
353 atlasInnerOuterVolumes.push_back(*volIter);
354 }
355 }
356 atlasInnerOuterVolumes.push_back(atlasInnerPositiveSector);
357
360
361 ATH_MSG_VERBOSE(
"Atlas Inner/Outer Sector glued successfully together." );
362
363
365
366
367 ATH_MSG_VERBOSE(
"Atlas TrackingGeometry built with following parameters : ");
368
369
370
372
373#ifdef TRKDETDESCR_MEMUSAGE
374 m_memoryLogger.refresh(getpid());
375 ATH_MSG_INFO(
"[ memory usage ] After Outer Sector TrackingGeometry building: " );
377#endif
378
379 }
380
384 }
385 else ATH_MSG_WARNING(
"atlasTrackingGeometry() ... atlasTrackingGeometry = 0, could not call registerNavigationLevel and propagateMagneticFieldProperties" );
386
387#ifdef TRKDETDESCR_MEMUSAGE
388 m_memoryLogger.refresh(getpid());
389 ATH_MSG_INFO(
"[ memory usage ] End of TrackingGeometry building: " );
391#endif
392
393
396
397
399 }
401}
#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.
ToolHandle< ITrackingVolumeHelper > m_trackingVolumeHelper
ToolHandle< IGeometryBuilder > m_muonGeometryBuilder
Gaudi::Property< std::vector< double > > m_worldDimension
ToolHandle< IGeometryBuilder > m_inDetGeometryBuilder
Gaudi::Property< bool > m_createWorld
Gaudi::Property< int > m_navigationLevel
ToolHandle< IGeometryBuilder > m_caloGeometryBuilder
Gaudi::Property< bool > m_synchronizeLayers
Gaudi::Property< bool > m_compactify
std::unique_ptr< TrackingGeometry > atlasTrackingGeometry() const
TrackingGeometry for ATLAS setup.
ToolHandle< ITrackingVolumeArrayCreator > m_trackingVolumeArrayCreator
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