ATLAS Offline Software
HGTD_TrackingGeometryBuilderCond.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2024 CERN for the benefit of the ATLAS collaboration
3 */
4 
6 // HGTD_TrackingGeometryBuilderCond.cxx, (c) ATLAS Detector software
8 
9 // HGTD
11 // EnvelopeDefinitionService
13 // Trk interfaces
21 #include "TrkGeometry/Material.h"
22 #include "TrkGeometry/DiscLayer.h"
26 //Gaudi
27 #include "GaudiKernel/MsgStream.h"
28 #include <algorithm>
29 
30 // constructor
31 HGTD_TrackingGeometryBuilderCond::HGTD_TrackingGeometryBuilderCond(const std::string& t, const std::string& n, const IInterface* p) :
32  AthAlgTool(t,n,p),
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),
39  m_colorCodeConfig(3)
40 {
41  declareInterface<Trk::IGeometryBuilderCond>(this);
42  // envelope definition service
43  declareProperty("EnvelopeDefinitionSvc", m_enclosingEnvelopeSvc );
44  declareProperty("LayerBuilder", m_layerBuilder);
45  declareProperty("TrackingVolumeCreator", m_trackingVolumeCreator);
46 
47  declareProperty("IndexStaticLayers", m_indexStaticLayers);
48  declareProperty("BuildBoundaryLayers", m_buildBoundaryLayers);
49  declareProperty("ReplaceAllJointBoundaries", m_replaceJointBoundaries);
50  declareProperty("LayerBinningType", m_layerBinningType);
51  declareProperty("ColorCode", m_colorCodeConfig);
52 
53 }
54 
55 // destructor
57 = default;
58 
59 // Athena standard methods
60 // initialize
62 {
63  // retrieve envelope definition service
65 
66  // retrieve the layer provider
67  ATH_CHECK(m_layerBuilder.retrieve());
68 
69  // retrieve the volume creator
71 
72  ATH_MSG_INFO( "initialize() succesful" );
73  return StatusCode::SUCCESS;
74 }
75 
76 // finalize
78 {
79  ATH_MSG_INFO( "finalize() successful" );
80  return StatusCode::SUCCESS;
81 }
82 
83 std::unique_ptr<Trk::TrackingGeometry>
85  const EventContext& ctx,
86  Trk::TrackingVolume* innerVol,
88 
89 {
90 
91  ATH_MSG_VERBOSE( "Starting to build HGTD_TrackingGeometry ..." );
92 
93  // the enclosed input volume (ID)
94  double enclosedInnerSectorHalflength = std::numeric_limits<float>::max();
95  double enclosedOuterRadius = 0.;
96  double enclosedInnerRadius = 0.;
97 
98  if (innerVol) {
99  ATH_MSG_VERBOSE( "Got Inner Detector Volume: " << innerVol->volumeName() );
100  innerVol->screenDump(msg(MSG::VERBOSE));
101 
102  // retrieve dimensions
103  const Trk::CylinderVolumeBounds* innerDetectorBounds
104  = dynamic_cast<const Trk::CylinderVolumeBounds*>(&(innerVol->volumeBounds()));
105  if (!innerDetectorBounds) std::abort();
106 
107  enclosedInnerSectorHalflength = innerDetectorBounds->halflengthZ();
108  enclosedOuterRadius = innerDetectorBounds->outerRadius();
109  enclosedInnerRadius = innerDetectorBounds->innerRadius();
110  }
111 
112  float enclosedOuterSectorHalflength = std::numeric_limits<float>::max();
113  // for the HGTD we only need the first envelope definition
114  for (const auto & bounds : m_enclosingEnvelopeSvc->getCaloRZBoundary()) {
115  if (std::abs(bounds.second) < enclosedOuterSectorHalflength) {
116  enclosedOuterSectorHalflength = std::abs(bounds.second);
117  }
118  }
119 
120  // in case you have no inner volume you need to find the
121  // envelope extensions --> beampipe and HGTD
122  if (not innerVol) {
123  // from the beampipe envelope you get the inner z extension
124  for (const auto & bounds : m_enclosingEnvelopeSvc->getBeamPipeRZBoundary()) {
125  if (std::abs(bounds.second) < enclosedInnerSectorHalflength) {
126  enclosedInnerSectorHalflength = std::abs(bounds.second);
127  }
128  }
129  // from the calo envelope you get the outer radius
130  for (const auto & bounds : m_enclosingEnvelopeSvc->getCaloRZBoundary()) {
131  if (std::abs(bounds.second) == enclosedOuterSectorHalflength) {
132  if (bounds.first>enclosedOuterRadius)
133  enclosedOuterRadius=bounds.first;
134  }
135  }
136  }
137 
138  ATH_MSG_VERBOSE("Got Dimensions Zmin/Rmin - Zmax/Rmax: "
139  << enclosedInnerSectorHalflength << "/" << enclosedInnerRadius
140  << " - " << enclosedOuterSectorHalflength << "/"
141  << enclosedOuterRadius);
142 
143  // prepare the layers
144  std::vector<Trk::Layer*> negativeLayers;
145  std::vector<Trk::Layer*> positiveLayers;
146 
147  std::unique_ptr<const std::vector<Trk::DiscLayer*> > discLayers = m_layerBuilder->discLayers(ctx, whandle);
148 
149  float maxZ = -9999.;
150  float minZ = 9999.;
151  float thickness = -9999;
152 
153  // loop and fill positive and negative Layers
154  if (discLayers && !discLayers->empty()){
155  // loop over and push into the return/cache vector
156  for (const auto & discLayer : (*discLayers) ){
157  // get the center posituion
158  float zpos = discLayer->surfaceRepresentation().center().z();
159  if (zpos > 0) {
160  positiveLayers.push_back(discLayer);
161  // only saving layer info for positive side
162  // as the detector is simmetric
163  maxZ = std::max(maxZ, zpos);
164  minZ = std::min(minZ, zpos);
165  thickness = std::max(thickness, float(discLayer->thickness()));
166  }
167  else {
168  negativeLayers.push_back(discLayer);
169  }
170  }
171  }
172 
173  float envelope = thickness*0.5;
174  float minZ_HGTD = minZ-envelope;
175  float maxZ_HGTD = maxZ+envelope;
176  float maxZ_HGTDEnclosure = enclosedOuterSectorHalflength;
177 
178  // dummy material property
179  auto materialProperties = std::make_unique<Trk::Material>();
180 
181  float zGapPos = 0.5*(minZ_HGTD+enclosedInnerSectorHalflength);
182  float gapHalfLengthZ = 0.5*(minZ_HGTD-enclosedInnerSectorHalflength);
183 
184  // create the gap between the ID and the HGTD endcap volumes
185  Amg::Transform3D* negativeInnerGapTrans = new Amg::Transform3D(Amg::Translation3D(Amg::Vector3D(0.,0.,-zGapPos)));
186  Trk::CylinderVolumeBounds* negativeInnerGapBounds = new Trk::CylinderVolumeBounds(enclosedInnerRadius,enclosedOuterRadius,gapHalfLengthZ);
187 
188  Trk::TrackingVolume * negativeInnerGapVolume =
189  new Trk::TrackingVolume(negativeInnerGapTrans,
190  negativeInnerGapBounds,
191  *materialProperties,
192  nullptr, nullptr,
193  m_layerBuilder->identification()+"::NegativeInnerGap");
194 
195  Amg::Transform3D* positiveInnerGapTrans = new Amg::Transform3D(Amg::Translation3D(Amg::Vector3D(0.,0.,zGapPos)));
196  Trk::CylinderVolumeBounds* positiveInnerGapBounds = new Trk::CylinderVolumeBounds(enclosedInnerRadius,enclosedOuterRadius,gapHalfLengthZ);
197 
198  Trk::TrackingVolume * positiveInnerGapVolume =
199  new Trk::TrackingVolume(positiveInnerGapTrans,
200  positiveInnerGapBounds,
201  *materialProperties,
202  nullptr, nullptr,
203  m_layerBuilder->identification()+"::PositiveInnerGap");
204 
205  // create dummy inner volume if not built already
206  if (not innerVol) {
207  Trk::CylinderVolumeBounds* idBounds = new Trk::CylinderVolumeBounds(enclosedInnerRadius,
208  enclosedInnerSectorHalflength);
209  Amg::Transform3D* idTr = new Amg::Transform3D(Trk::s_idTransform);
210  // dummy objects
211  Trk::LayerArray* dummyLayers = nullptr;
212  Trk::TrackingVolumeArray* dummyVolumes = nullptr;
213 
214  innerVol = new Trk::TrackingVolume(idTr, idBounds, *materialProperties,
215  dummyLayers, dummyVolumes,
216  "HGTD::GapVolumes::DummyID");
217  }
218 
219  std::vector<Trk::TrackingVolume*> inBufferVolumes;
220  inBufferVolumes.push_back(negativeInnerGapVolume);
221  inBufferVolumes.push_back(innerVol);
222  inBufferVolumes.push_back(positiveInnerGapVolume);
223 
224  Trk::TrackingVolume* inDetEnclosed =
225  m_trackingVolumeCreator->createContainerTrackingVolume(inBufferVolumes,
226  *materialProperties,
227  "HGTD::Container::EnclosedInnerDetector");
228 
229  // create the tracking volumes
230  // create the three volumes
231  Trk::TrackingVolume* negativeVolume =
232  m_trackingVolumeCreator->createTrackingVolume(negativeLayers,
233  *materialProperties,
234  enclosedInnerRadius, enclosedOuterRadius,
235  -maxZ_HGTD, -minZ_HGTD,
236  m_layerBuilder->identification()+"::NegativeEndcap",
238 
239 
240  Trk::TrackingVolume* positiveVolume =
241  m_trackingVolumeCreator->createTrackingVolume(positiveLayers,
242  *materialProperties,
243  enclosedInnerRadius, enclosedOuterRadius,
244  minZ_HGTD, maxZ_HGTD,
245  m_layerBuilder->identification()+"::PositiveEndcap",
247 
248  // the base volumes have been created
249  ATH_MSG_VERBOSE('\t' << '\t'<< "Volumes have been created, now pack them into a triple.");
250  negativeVolume->registerColorCode(m_colorCodeConfig);
251  inDetEnclosed->registerColorCode(m_colorCodeConfig);
252  positiveVolume->registerColorCode(m_colorCodeConfig);
253 
254  // pack them together
255  std::vector<Trk::TrackingVolume*> tripleVolumes;
256  tripleVolumes.push_back(negativeVolume);
257  tripleVolumes.push_back(inDetEnclosed);
258  tripleVolumes.push_back(positiveVolume);
259 
260  // create the tiple container
261  Trk::TrackingVolume* tripleContainer =
262  m_trackingVolumeCreator->createContainerTrackingVolume(tripleVolumes,
263  *materialProperties,
264  "HGTD::Containers::" + m_layerBuilder->identification(),
267 
268  ATH_MSG_VERBOSE( '\t' << '\t'<< "Created container volume with bounds: " << tripleContainer->volumeBounds() );
269 
270  // finally create the two endplates: negative
271  Trk::TrackingVolume* negativeEnclosure = m_trackingVolumeCreator->createGapTrackingVolume(
272  *materialProperties,
273  enclosedInnerRadius,
274  enclosedOuterRadius,
275  -maxZ_HGTDEnclosure,
276  -maxZ_HGTD,
277  1,
278  false,
279  "HGTD::Gaps::NegativeEnclosure" + m_layerBuilder->identification());
280 
281  // finally create the two endplates: positive
282  Trk::TrackingVolume* positiveEnclosure = m_trackingVolumeCreator->createGapTrackingVolume(
283  *materialProperties,
284  enclosedInnerRadius,
285  enclosedOuterRadius,
286  maxZ_HGTD,
287  maxZ_HGTDEnclosure,
288  1,
289  false,
290  "HGTD::Gaps::PositiveEnclosure" + m_layerBuilder->identification());
291  // and the final tracking volume
292  std::vector<Trk::TrackingVolume*> enclosedVolumes;
293  enclosedVolumes.push_back(negativeEnclosure);
294  enclosedVolumes.push_back(tripleContainer);
295  enclosedVolumes.push_back(positiveEnclosure);
296 
297  Trk::TrackingVolume* enclosedDetector =
298  m_trackingVolumeCreator->createContainerTrackingVolume(enclosedVolumes,
299  *materialProperties,
300  "HGTD::Detectors::"+m_layerBuilder->identification(),
303 
304  ATH_MSG_VERBOSE( '\t' << '\t'<< "Created enclosed HGTD volume with bounds: " << enclosedDetector->volumeBounds() );
305 
306  // create the TrackingGeometry ------------------------------------------------------
307  auto hgtdTrackingGeometry = std::make_unique<Trk::TrackingGeometry>(enclosedDetector);
308 
309  if (m_indexStaticLayers and hgtdTrackingGeometry)
310  hgtdTrackingGeometry->indexStaticLayers( geometrySignature() );
311  if (msgLvl(MSG::VERBOSE) && hgtdTrackingGeometry)
312  hgtdTrackingGeometry->printVolumeHierarchy(msg(MSG::VERBOSE));
313 
314  return hgtdTrackingGeometry;
315 }
HGTD_TrackingGeometryBuilderCond::m_colorCodeConfig
unsigned int m_colorCodeConfig
Color code for layers.
Definition: HGTD_TrackingGeometryBuilderCond.h:77
python.PerfMonSerializer.p
def p
Definition: PerfMonSerializer.py:743
max
#define max(a, b)
Definition: cfImp.cxx:41
IEnvelopeDefSvc.h
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
HGTD_TrackingGeometryBuilderCond::m_replaceJointBoundaries
bool m_replaceJointBoundaries
run with replacement of all joint boundaries
Definition: HGTD_TrackingGeometryBuilderCond.h:73
AthCommonDataStore< AthCommonMsg< AlgTool > >::declareProperty
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T > &t)
Definition: AthCommonDataStore.h:145
DiscLayer.h
VolumeBounds.h
AthCommonMsg< AlgTool >::msgLvl
bool msgLvl(const MSG::Level lvl) const
Definition: AthCommonMsg.h:30
Trk::BinningType
BinningType
Definition: BinningType.h:31
read_hist_ntuple.t
t
Definition: read_hist_ntuple.py:5
ATH_MSG_VERBOSE
#define ATH_MSG_VERBOSE(x)
Definition: AthMsgStreamMacros.h:28
Trk::TrackingVolume::registerColorCode
void registerColorCode(unsigned int icolor)
Register the color code.
HGTD_TrackingGeometryBuilderCond::initialize
virtual StatusCode initialize() override
AlgTool initailize method.
Definition: HGTD_TrackingGeometryBuilderCond.cxx:61
ILayerArrayCreator.h
HGTD_TrackingGeometryBuilderCond::m_indexStaticLayers
bool m_indexStaticLayers
configurations for the layer builder
Definition: HGTD_TrackingGeometryBuilderCond.h:69
HGTD_TrackingGeometryBuilderCond::m_buildBoundaryLayers
bool m_buildBoundaryLayers
create boundary layers
Definition: HGTD_TrackingGeometryBuilderCond.h:71
GeometryStatics.h
CylinderVolumeBounds.h
beamspotman.n
n
Definition: beamspotman.py:731
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
Amg::Transform3D
Eigen::Affine3d Transform3D
Definition: GeoPrimitives.h:46
ITrackingVolumeCreator.h
HGTD_TrackingGeometryBuilderCond::~HGTD_TrackingGeometryBuilderCond
virtual ~HGTD_TrackingGeometryBuilderCond()
Destructor.
Trk::CylinderVolumeBounds::halflengthZ
double halflengthZ() const
This method returns the halflengthZ.
Definition: CylinderVolumeBounds.h:207
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
HGTD_TrackingGeometryBuilderCond::m_layerBinningType
int m_layerBinningType
binning type for layers
Definition: HGTD_TrackingGeometryBuilderCond.h:75
HGTD_TrackingGeometryBuilderCond::HGTD_TrackingGeometryBuilderCond
HGTD_TrackingGeometryBuilderCond(const std::string &, const std::string &, const IInterface *)
Constructor.
Definition: HGTD_TrackingGeometryBuilderCond.cxx:31
HGTD_TrackingGeometryBuilderCond::m_trackingVolumeCreator
ToolHandle< Trk::ITrackingVolumeCreator > m_trackingVolumeCreator
Helper Tool to create TrackingVolumes.
Definition: HGTD_TrackingGeometryBuilderCond.h:65
HGTD_TrackingGeometryBuilderCond::m_enclosingEnvelopeSvc
ServiceHandle< IEnvelopeDefSvc > m_enclosingEnvelopeSvc
Service to handle the envelope definition.
Definition: HGTD_TrackingGeometryBuilderCond.h:61
min
#define min(a, b)
Definition: cfImp.cxx:40
HGTD_TrackingGeometryBuilderCond::geometrySignature
virtual Trk::GeometrySignature geometrySignature() const override
The unique signature.
Definition: HGTD_TrackingGeometryBuilderCond.h:57
HGTD_TrackingGeometryBuilderCond.h
Trk::CylinderVolumeBounds
Definition: CylinderVolumeBounds.h:70
Trk::TrackingVolume::volumeName
const std::string & volumeName() const
Returns the VolumeName - for debug reason, might be depreciated later.
GlueVolumesDescriptor.h
Trk::CylinderVolumeBounds::outerRadius
double outerRadius() const
This method returns the outer radius.
Definition: CylinderVolumeBounds.h:191
Amg::Vector3D
Eigen::Matrix< double, 3, 1 > Vector3D
Definition: GeoPrimitives.h:47
TrackingVolume.h
HGTD_TrackingGeometryBuilderCond::finalize
virtual StatusCode finalize() override
AlgTool finalize method.
Definition: HGTD_TrackingGeometryBuilderCond.cxx:77
Trk::CylinderVolumeBounds::innerRadius
double innerRadius() const
This method returns the inner radius.
Definition: CylinderVolumeBounds.h:187
Amg::Translation3D
Eigen::Translation< double, 3 > Translation3D
Definition: GeoPrimitives.h:44
AthCommonMsg< AlgTool >::msg
MsgStream & msg() const
Definition: AthCommonMsg.h:24
Trk::Volume::volumeBounds
const VolumeBounds & volumeBounds() const
returns the volumeBounds()
Definition: Volume.h:97
DiscSurface.h
TrackingGeometry.h
python.Constants.VERBOSE
int VERBOSE
Definition: Control/AthenaCommon/python/Constants.py:14
Trk::BinnedArray
Definition: BinnedArray.h:38
AthAlgTool
Definition: AthAlgTool.h:26
Trk::TrackingVolume
Definition: TrackingVolume.h:121
SG::WriteCondHandle
Definition: WriteCondHandle.h:26
HGTD_TrackingGeometryBuilderCond::m_layerBuilder
ToolHandle< Trk::ILayerBuilderCond > m_layerBuilder
Helper tools for the geometry building.
Definition: HGTD_TrackingGeometryBuilderCond.h:63
Material.h
ILayerBuilderCond.h
Trk::TrackingVolume::screenDump
void screenDump(MsgStream &msg) const
Definition: TrackingVolume.cxx:1506
HGTD_TrackingGeometryBuilderCond::trackingGeometry
virtual std::unique_ptr< Trk::TrackingGeometry > trackingGeometry(const EventContext &ctx, Trk::TrackingVolume *innerVol, SG::WriteCondHandle< Trk::TrackingGeometry > &whandle) const override
TrackingGeometry Interface method.
Definition: HGTD_TrackingGeometryBuilderCond.cxx:84