27 #include "GaudiKernel/MsgStream.h"
33 m_enclosingEnvelopeSvc(
"AtlasEnvelopeDefSvc",
n),
34 m_trackingVolumeCreator(
"Trk::CylinderVolumeCreator/CylinderVolumeCreator"),
35 m_indexStaticLayers(true),
36 m_buildBoundaryLayers(true),
37 m_replaceJointBoundaries(true),
38 m_layerBinningType(2),
41 declareInterface<Trk::IGeometryBuilderCond>(
this);
73 return StatusCode::SUCCESS;
80 return StatusCode::SUCCESS;
83 std::unique_ptr<Trk::TrackingGeometry>
85 const EventContext& ctx,
95 double enclosedOuterRadius = 0.;
96 double enclosedInnerRadius = 0.;
105 if (!innerDetectorBounds) std::abort();
107 enclosedInnerSectorHalflength = innerDetectorBounds->
halflengthZ();
108 enclosedOuterRadius = innerDetectorBounds->
outerRadius();
109 enclosedInnerRadius = innerDetectorBounds->
innerRadius();
115 if (std::abs(bounds.second) < enclosedOuterSectorHalflength) {
116 enclosedOuterSectorHalflength = std::abs(bounds.second);
125 if (std::abs(bounds.second) < enclosedInnerSectorHalflength) {
126 enclosedInnerSectorHalflength = std::abs(bounds.second);
131 if (std::abs(bounds.second) == enclosedOuterSectorHalflength) {
132 if (bounds.first>enclosedOuterRadius)
133 enclosedOuterRadius=bounds.first;
139 << enclosedInnerSectorHalflength <<
"/" << enclosedInnerRadius
140 <<
" - " << enclosedOuterSectorHalflength <<
"/"
141 << enclosedOuterRadius);
144 std::vector<Trk::Layer*> negativeLayers;
145 std::vector<Trk::Layer*> positiveLayers;
147 std::unique_ptr<const std::vector<Trk::DiscLayer*> > discLayers =
m_layerBuilder->discLayers(ctx, whandle);
151 float thickness = -9999;
154 if (discLayers && !discLayers->empty()){
156 for (
const auto & discLayer : (*discLayers) ){
158 float zpos = discLayer->surfaceRepresentation().center().z();
160 positiveLayers.push_back(discLayer);
165 thickness =
std::max(thickness,
float(discLayer->thickness()));
168 negativeLayers.push_back(discLayer);
173 float envelope = thickness*0.5;
174 float minZ_HGTD = minZ-envelope;
175 float maxZ_HGTD = maxZ+envelope;
176 float maxZ_HGTDEnclosure = enclosedOuterSectorHalflength;
179 auto materialProperties = std::make_unique<Trk::Material>();
181 float zGapPos = 0.5*(minZ_HGTD+enclosedInnerSectorHalflength);
182 float gapHalfLengthZ = 0.5*(minZ_HGTD-enclosedInnerSectorHalflength);
190 negativeInnerGapBounds,
200 positiveInnerGapBounds,
208 enclosedInnerSectorHalflength);
215 dummyLayers, dummyVolumes,
216 "HGTD::GapVolumes::DummyID");
219 std::vector<Trk::TrackingVolume*> inBufferVolumes;
220 inBufferVolumes.push_back(negativeInnerGapVolume);
221 inBufferVolumes.push_back(innerVol);
222 inBufferVolumes.push_back(positiveInnerGapVolume);
227 "HGTD::Container::EnclosedInnerDetector");
234 enclosedInnerRadius, enclosedOuterRadius,
235 -maxZ_HGTD, -minZ_HGTD,
243 enclosedInnerRadius, enclosedOuterRadius,
244 minZ_HGTD, maxZ_HGTD,
249 ATH_MSG_VERBOSE(
'\t' <<
'\t'<<
"Volumes have been created, now pack them into a triple.");
255 std::vector<Trk::TrackingVolume*> tripleVolumes;
256 tripleVolumes.push_back(negativeVolume);
257 tripleVolumes.push_back(inDetEnclosed);
258 tripleVolumes.push_back(positiveVolume);
279 "HGTD::Gaps::NegativeEnclosure" +
m_layerBuilder->identification());
290 "HGTD::Gaps::PositiveEnclosure" +
m_layerBuilder->identification());
292 std::vector<Trk::TrackingVolume*> enclosedVolumes;
293 enclosedVolumes.push_back(negativeEnclosure);
294 enclosedVolumes.push_back(tripleContainer);
295 enclosedVolumes.push_back(positiveEnclosure);
307 auto hgtdTrackingGeometry = std::make_unique<Trk::TrackingGeometry>(enclosedDetector);
314 return hgtdTrackingGeometry;