ATLAS Offline Software
CylinderVolumeCreator.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration
3 */
4 
6 // CylinderVolumeCreator.cxx, (c) ATLAS Detector software
8 
9 //Gaudi
10 #include "GaudiKernel/SystemOfUnits.h"
11 // Trk include
17 #include "TrkSurfaces/DiscBounds.h"
22 #include "TrkGeometry/DiscLayer.h"
23 #include "TrkGeometry/Material.h"
27 // Amg
30 
31 
32 // constructor
33 Trk::CylinderVolumeCreator::CylinderVolumeCreator(const std::string& t, const std::string& n, const IInterface* p)
34 : AthAlgTool(t,n,p),
35  m_layerArrayCreator("Trk::LayerArrayCreator/LayerArrayCreator"),
36  m_trackingVolumeArrayCreator("Trk::TrackingVolumeArrayCreator/TrackingVolumeArrayCreator"),
37  m_trackingVolumeHelper("Trk::TrackingVolumeHelper/TrackingVolumeHelper"),
38  m_passiveLayerThickness(1*Gaudi::Units::mm),
39  m_passiveLayerPhiBins(1),
40  m_passiveLayerRzBins(100)
41 {
42  declareInterface<ITrackingVolumeCreator>(this);
43  // the helper tools
44  declareProperty("LayerArrayCreator", m_layerArrayCreator);
45  declareProperty("TrackingVolumeArrayCreator", m_trackingVolumeArrayCreator);
46  declareProperty("TrackingVolumeHelper", m_trackingVolumeHelper);
47  // the parameters for the passive layers
48  declareProperty("PassiveLayerThickness", m_passiveLayerThickness);
49  declareProperty("PassiveLayerBinsPhi", m_passiveLayerPhiBins);
50  declareProperty("PassiveLayerBinsRZ", m_passiveLayerRzBins);
51 }
52 
53 // destructor
55 = default;
56 
57 
58 // the interface methods
60 {
61 
62  // Retrieve the layer array creator ----------------------------------------------------
63  if (m_layerArrayCreator.retrieve().isFailure())
64  {
65  ATH_MSG_FATAL( "Failed to retrieve tool " << m_layerArrayCreator );
66  return StatusCode::FAILURE;
67  } else
68  ATH_MSG_DEBUG( "Retrieved tool " << m_layerArrayCreator );
69 
70 
71  // Retrieve the volume array creator ----------------------------------------------------
72  if (m_trackingVolumeArrayCreator.retrieve().isFailure())
73  {
74  ATH_MSG_FATAL( "Failed to retrieve tool " << m_trackingVolumeArrayCreator );
75  return StatusCode::FAILURE;
76  } else
77  ATH_MSG_DEBUG( "Retrieved tool " << m_trackingVolumeArrayCreator );
78 
79 
80  // Retrieve the volume array creator ----------------------------------------------------
81  if (m_trackingVolumeHelper.retrieve().isFailure())
82  {
83  ATH_MSG_FATAL( "Failed to retrieve tool " << m_trackingVolumeHelper );
84  return StatusCode::FAILURE;
85  } else
86  ATH_MSG_DEBUG( "Retrieved tool " << m_trackingVolumeHelper );
87 
88  ATH_MSG_DEBUG( "initialize() successful" );
89 
90  return StatusCode::SUCCESS;
91 }
92 
95  const std::vector<Trk::Layer*>& layers,
96  Trk::Material& matprop,
97  Trk::VolumeBounds* volBounds,
99  const std::string& volumeName,
100  Trk::BinningType btype) const
101 
102 {
103 
104  // the final one to build / sensitive Volume / Bounds
105  Trk::TrackingVolume* tVolume = nullptr;
106 
107  // cases are:
108  // (1) volBounds && transform : use both information
109  // (2) volBounds && !transform : centered around 0, but with given bounds
110  // (3) !volBounds && transform : estimate size from layers, use transform
111  // (4) !volBounds && !transform : estimate size & translation from layers
112  Trk::CylinderVolumeBounds* cylinderBounds = nullptr;
113  // this is the implementation of CylinderVolumeCreator
114  if (volBounds) {
115  cylinderBounds = dynamic_cast<Trk::CylinderVolumeBounds*>(volBounds);
116  if (!cylinderBounds){
117  ATH_MSG_WARNING( "[!] Problem: given bounds were not cylindrical - return 0" );
118  return tVolume;
119  }
120  }
121  std::vector<Trk::CylinderLayer*> cylLayers;
122  cylLayers.reserve(layers.size());
123  std::vector<Trk::DiscLayer*> discLayers;
124  discLayers.reserve(layers.size());
125 
126  // the raw data
127  double rMinRaw{0.}, rMaxRaw{0.}, zMinRaw{0.}, zMaxRaw{0.};
128 
129  // check the dimension and fill raw data
130  if (estimateAndCheckDimension(layers,
131  cylinderBounds,
132  transform,
133  cylLayers,
134  discLayers,
135  rMinRaw,rMaxRaw,
136  zMinRaw,zMaxRaw,
137  btype).isFailure()) {
138  ATH_MSG_WARNING( "[!] Problem with given dimensions - return 0 and delete provided objects" );
139  delete volBounds; delete transform;
140  delete cylinderBounds;
141  return tVolume;
142  }
143 
144  // get the zMin/Max
145  double zMin = ( transform ? transform->translation().z() : 0. ) +
146  ( cylinderBounds ? -cylinderBounds->halflengthZ() : 0. );
147  double zMax = ( transform ? transform->translation().z() : 0. ) +
148  ( cylinderBounds ? cylinderBounds->halflengthZ() : 0. );
149 
150  double rMin = 0.;
151  double rMax = 0.;
152 
153  // overrule the zMin/zMax for biequidistant binning
154  if (btype == Trk::biequidistant) {
155  // set rMin/rMax and zMin/zMax
156  zMin = zMinRaw;
157  zMax = zMaxRaw;
158  rMin = rMinRaw;
159  rMax = rMaxRaw;
160  } else {
161  if (!cylinderBounds) {
162  ATH_MSG_WARNING( "[!] No cylindrical bounds given - return 0" );
163  return tVolume;
164  }
165  rMin = cylinderBounds->innerRadius();
166  rMax = cylinderBounds->outerRadius();
167  }
168 
169  ATH_MSG_VERBOSE("Filling the layers into an appropriate layer array");
170  // create the Layer Array
171  Trk::BinnedArray<Trk::Layer>* layerArray = !cylLayers.empty() ?
172  m_layerArrayCreator->cylinderLayerArray(cylLayers,
173  rMin,
174  rMax,
175  btype) :
176  m_layerArrayCreator->discLayerArray(discLayers,
177  zMin,
178  zMax,
179  btype);
180 
181  // finally create the TrackingVolume
182  tVolume = new Trk::TrackingVolume(transform,
183  cylinderBounds,
184  matprop,
185  layerArray,nullptr,
186  volumeName);
187  // screen output
188  ATH_MSG_VERBOSE( "Created cylindrical volume at z-position :" << tVolume->center().z() );
189  ATH_MSG_VERBOSE( " created bounds : " << tVolume->volumeBounds() );
190 
191  // return the constructed TrackingVolume
192  return tVolume;
193 }
194 
197  const std::vector<Trk::Layer*>& layers,
198  Trk::Material& matprop,
199  double rMin,
200  double rMax,
201  double zMin,
202  double zMax,
203  const std::string& volumeName,
204  Trk::BinningType btype) const
205 
206 {
207  // that's what is needed
208  Trk::CylinderVolumeBounds* cBounds = nullptr;
209 
210  // screen output
211  ATH_MSG_VERBOSE("Create cylindrical TrackingVolume '" << volumeName << "'.");
212  ATH_MSG_VERBOSE(" -> with given dimensions of (rMin/rMax/zMin/Max) = "
213  << rMin << " / " << rMax << " / " << zMin << " / " << zMax);
214 
215  // check for consistency
216  if (zMin > zMax || rMin > rMax) {
217  ATH_MSG_WARNING("Inconsistent dimensions given :"
218  << ((zMin > zMax) ? " zMin > zMax (" : " rMin > rMax (")
219  << ((zMin > zMax) ? zMin : rMin) << " > "
220  << ((zMin > zMax) ? zMax : rMax) << " ) - return 0");
221  return nullptr;
222  }
223 
224  // create a Amg::Transform3D and VolumeBounds out of the zMin/zMax
225  double halflengthZ = 0.5 * (zMax - zMin);
226  double zPosition = 0.5 * (zMin + zMax);
227  zPosition = fabs(zPosition) < 0.1 ? 0. : zPosition;
228 
229  // now create the cylinder volume bounds
230  cBounds = rMin > 0.1 ? new Trk::CylinderVolumeBounds(rMin, rMax, halflengthZ)
231  : new Trk::CylinderVolumeBounds(rMax, halflengthZ);
232  // transform
234  (zPosition != 0) ? new Amg::Transform3D : nullptr;
235  if (transform)
236  (*transform) = Amg::Translation3D(0., 0., zPosition);
237 
238  // call to the Bounds/Amg::Translation3D method
239  return createTrackingVolume(
240  layers, matprop, cBounds, transform, volumeName, btype);
241 }
242 
245  double rMin,
246  double rMax,
247  double zMin,
248  double zMax,
249  unsigned int materialLayers,
250  bool cylinder,
251  const std::string& volumeName) const
252 {
253 
254  // screen output
255  ATH_MSG_VERBOSE( "Create cylindrical gap TrackingVolume '" << volumeName << "' with (rMin/rMax/zMin/Max) = ");
256  ATH_MSG_VERBOSE( '\t' << rMin << " / " << rMax << " / " << zMin << " / " << zMax );
257 
258  // assing min/max
259  double min = cylinder ? rMin : zMin;
260  double max = cylinder ? rMax : zMax;
261 
262  // create the layer r/z positions
263  std::vector<double> layerPositions;
264  layerPositions.reserve(materialLayers);
265  if (materialLayers > 1){
266  //double step = cylinder ? (max-min)/(materialLayers-1) : (max-min)/(materialLayers-1);
267  const double step=(max-min)/(materialLayers-1);
268  for (unsigned int il = 0; il < materialLayers; ++il)
269  layerPositions.push_back(min+il*step);
270  } else
271  layerPositions.push_back(0.5*(min+max));
272 
273  // now call the main method
274  return createGapTrackingVolume(matprop,
275  rMin,
276  rMax,
277  zMin,
278  zMax,
279  layerPositions,
280  cylinder,
281  volumeName,
282  (layerPositions.size() == 1 ? Trk::arbitrary : Trk::biequidistant));
283 
284 }
285 
288  Trk::Material& matprop,
289  double rMin,
290  double rMax,
291  double zMin,
292  double zMax,
293  const std::vector<double>& layerPositions,
294  bool cylinder,
295  const std::string& volumeName,
296  BinningType btype) const
297 {
298 
299  // screen output
300  ATH_MSG_VERBOSE("Create cylindrical gap TrackingVolume '"
301  << volumeName << "' with (rMin/rMax/zMin/Max) = ");
302  ATH_MSG_VERBOSE('\t' << rMin << " / " << rMax << " / " << zMin << " / "
303  << zMax);
304 
305  // create the layers
306  std::vector<Trk::Layer*> layers;
307  layers.reserve(layerPositions.size());
308 
309  std::vector<double>::const_iterator layerPropIter = layerPositions.begin();
310  std::vector<double>::const_iterator layerPropEnd = layerPositions.end();
311  for (; layerPropIter != layerPropEnd; ++layerPropIter) {
312  // create cylinder layers
313  if (cylinder) {
314  // take envelopes into account
315  double zMinLayer = zMin;
316  double zMaxLayer = zMax;
317  // create the layer
318  layers.push_back(createCylinderLayer(0.5 * (zMinLayer + zMaxLayer),
319  (*layerPropIter),
320  fabs(0.5 * (zMaxLayer - zMinLayer)),
321  m_passiveLayerThickness,
322  m_passiveLayerPhiBins,
323  m_passiveLayerRzBins));
324 
325  } else {
326  // take the envelopes into account
327  double rMinLayer = rMin;
328  double rMaxLayer = rMax;
329  // create the layer
330  layers.push_back(createDiscLayer((*layerPropIter),
331  rMinLayer,
332  rMaxLayer,
333  m_passiveLayerThickness,
334  m_passiveLayerPhiBins,
335  m_passiveLayerRzBins));
336  }
337  }
338  // now call the createTrackingVolume() method
339  return createTrackingVolume(
340  layers, matprop, rMin, rMax, zMin, zMax, volumeName, btype);
341 }
342 
345  const std::vector<Trk::TrackingVolume*>& volumes,
346  const Trk::Material& matprop,
347  const std::string& volumeName,
348  bool buildBoundaryLayers,
349  bool replaceBoundaryFace) const
350 {
351  // check if you have more than one volume
352  if (volumes.size() <= (unsigned int)1) {
353  ATH_MSG_WARNING("None (only one) TrackingVolume given to create container "
354  "volume (min required: 2) - returning 0 ");
355  return nullptr;
356  }
357 
358  // screen output
359  ATH_MSG_VERBOSE("[start] Creating container volume '"
360  << volumeName << "' with " << volumes.size()
361  << " sub volumes:");
362  // volumes need to be sorted in either r or z - both increasing
363  // set the iterator to the volumes, the first and the end
364  auto firstVolume = volumes.begin();
365  auto lastVolume = volumes.end();
366 
367  for (unsigned int ivol = 0; firstVolume != lastVolume;
368  ++firstVolume, ++ivol) {
369  ATH_MSG_VERBOSE(" - volume ("
370  << ivol << ") is : " << (*firstVolume)->volumeName());
372  " at position : " << Amg::toString((*firstVolume)->center()));
373  ATH_MSG_VERBOSE(" with bounds : " << (*firstVolume)->volumeBounds());
374  }
375 
376  // reset the iterator
377  firstVolume = volumes.begin();
378  --lastVolume; // set to the last volume
379 
380  if (firstVolume == lastVolume) {
381  ATH_MSG_WARNING("Only one TrackingVolume given to create Top level volume "
382  "(min required: 2) - returning 0 ");
383  return nullptr;
384  }
385 
386  // get the bounds
387  const Trk::CylinderVolumeBounds* firstVolumeBounds =
388  dynamic_cast<const Trk::CylinderVolumeBounds*>(
389  &((*firstVolume)->volumeBounds()));
390  const Trk::CylinderVolumeBounds* lastVolumeBounds =
391  dynamic_cast<const Trk::CylinderVolumeBounds*>(
392  &((*lastVolume)->volumeBounds()));
393  // check the dynamic cast
394  if (!firstVolumeBounds || !lastVolumeBounds) {
395  ATH_MSG_WARNING("VolumeBounds given are not of type: "
396  "Trk::CylinderVolumeBounds (required) - returning 0 ");
397  return nullptr;
398  }
399 
400  // check whether it is a r-binned case or a z-binned case
401  bool rCase = fabs(firstVolumeBounds->innerRadius() -
402  lastVolumeBounds->innerRadius()) > 0.1;
403  // fill these ones depending on the rCase though assignment - no parsing at
404  // that stage
405  double zMin = 0.;
406  double zMax = 0.;
407  double rMin = 0.;
408  double rMax = 0.;
409  if (rCase) {
410  zMin = (*firstVolume)->center().z() - firstVolumeBounds->halflengthZ();
411  zMax = (*firstVolume)->center().z() + firstVolumeBounds->halflengthZ();
412  rMin = firstVolumeBounds->innerRadius();
413  rMax = lastVolumeBounds->outerRadius();
414  } else {
415  zMin = (*firstVolume)->center().z() - firstVolumeBounds->halflengthZ();
416  zMax = (*lastVolume)->center().z() + lastVolumeBounds->halflengthZ();
417  rMin = firstVolumeBounds->innerRadius();
418  rMax = firstVolumeBounds->outerRadius();
419  }
420 
421  // estimate the z - position
422  double zPos = 0.5 * (zMin + zMax);
423  // create the HEP transform from the stuff known so far
424  Amg::Transform3D* topVolumeTransform =
425  fabs(zPos) > 0.1 ? new Amg::Transform3D : nullptr;
426  if (topVolumeTransform)
427  (*topVolumeTransform) = Amg::Translation3D(0., 0., zPos);
428  // create the bounds from the information gathered so far
429  Trk::CylinderVolumeBounds* topVolumeBounds =
430  fabs(rMin) > 0.1
431  ? new Trk::CylinderVolumeBounds(rMin, rMax, 0.5 * fabs(zMax - zMin))
432  : new Trk::CylinderVolumeBounds(rMax, 0.5 * fabs(zMax - zMin));
433  // create the volume array to fill in
435  (rCase) ? m_trackingVolumeArrayCreator->cylinderVolumesArrayInR(volumes)
436  : m_trackingVolumeArrayCreator->cylinderVolumesArrayInZ(volumes);
437  if (!volumeArray) {
439  "Creation of TrackingVolume array did not succeed - returning 0 ");
440  delete topVolumeTransform;
441  delete topVolumeBounds;
442  return nullptr;
443  }
444 
445  // we have the bounds and the volume array, create the volume
446  Trk::TrackingVolume* topVolume = new Trk::TrackingVolume(topVolumeTransform,
447  topVolumeBounds,
448  matprop,
449  nullptr,
450  volumeArray,
451  volumeName);
452 
453  // glueing section
454  // --------------------------------------------------------------------------------------
455  if (interGlueTrackingVolume(
456  *topVolume, rCase, buildBoundaryLayers, replaceBoundaryFace)
457  .isFailure()) {
459  "Problem with inter-glueing of TrackingVolumes (needed) - returning 0 ");
460  delete topVolume;
461  return nullptr;
462  }
463 
465  "[ end ] return newly created container : " << topVolume->volumeName());
466 
467  return topVolume;
468 }
469 
473  const std::vector<Trk::Layer*>& layers,
474  Trk::CylinderVolumeBounds*& cylinderVolumeBounds,
476  std::vector<Trk::CylinderLayer*>& cylinderLayers,
477  std::vector<Trk::DiscLayer*>& discLayers,
478  double& rMinClean,
479  double& rMaxClean,
480  double& zMinClean,
481  double& zMaxClean,
482  Trk::BinningType bType) const
483 
484 {
485  // check and bail out if no layers are given
486  if (layers.empty()) {
487  ATH_MSG_VERBOSE( "No layers given, you shouldn't use : "<< type() );
488  return StatusCode::FAILURE;
489  }
490 
491  // some verbose output
492  ATH_MSG_VERBOSE( "Parsing the " << layers.size() << " layers to gather overall dimensions" );
493  if (cylinderVolumeBounds) ATH_MSG_VERBOSE( "Cylinder volume bounds are given." );
494 
495  // prepare for parsing the layers
496  double layerRmin = 10e10;
497  double layerRmax = 0.;
498  double layerZmin = 10e10;
499  double layerZmax = -10e10;
500  bool radial = false;
501 
502  rMinClean = 10e10;
503  rMaxClean = 0.;
504  zMinClean = 10e10;
505  zMaxClean = -10e10;
506 
507  // find out what is there
508  for (auto *const layerIter : layers) {
509  //class is not thread safe due to this
510  // initialize
511  double currentRmin = 0.;
512  double currentRmax = 0.;
513  double currentZmin = 0.;
514  double currentZmax = 0.;
515  // dynamic cast the bounds either to CylinderBounds or DiscBounds
516  const Trk::CylinderBounds* cylBounds =
517  dynamic_cast<const Trk::CylinderBounds*>(&(layerIter->surfaceRepresentation()).bounds());
518  // cylinder bounds
519  if (cylBounds) {
520  radial = true;
521  // fill it into the cylinderLayer vector
522  cylinderLayers.push_back(dynamic_cast<Trk::CylinderLayer*>(layerIter));
523  // get the raw data
524  double currentR = cylBounds->r();
525  double centerZ = (layerIter->surfaceRepresentation()).center().z();
526  // check for min/max in the cylinder bounds case
527  if (bType == Trk::biequidistant){
528  currentRmin = currentR; currentRmax = currentR;
529  } else {
530  currentRmin = currentR-(0.5*(layerIter)->thickness());
531  currentRmax = currentR+(0.5*(layerIter)->thickness());
532  }
533  currentZmin = centerZ - cylBounds->halflengthZ();
534  currentZmax = centerZ + cylBounds->halflengthZ();
535  }
536  // dynamic cast to the DiscBounds
537  const Trk::DiscBounds* discBounds =
538  dynamic_cast<const Trk::DiscBounds*>(&(layerIter->surfaceRepresentation()).bounds());
539  if (discBounds) {
540  // fill it into the discLayer vector
541  discLayers.push_back(dynamic_cast<Trk::DiscLayer*>(layerIter));
542  // check for min/max in the cylinder bounds case
543  double centerZ = (layerIter->surfaceRepresentation()).center().z();
544  currentRmin = discBounds->rMin();
545  currentRmax = discBounds->rMax();
546  if (bType == Trk::biequidistant){
547  currentZmin = centerZ; currentZmax = centerZ;
548  } else {
549  currentZmin = centerZ - (0.5*(layerIter)->thickness());
550  currentZmax = centerZ + (0.5*(layerIter)->thickness());
551  }
552  }
553  // the raw data
554  rMinClean = std::min(rMinClean, currentRmin);
555  rMaxClean = std::max(rMaxClean, currentRmax);
556  zMinClean = std::min(zMinClean, currentZmin);
557  zMaxClean = std::max(zMaxClean, currentZmax);
558  // assign if they overrule the minima/maxima (with layers thicknesses)
559 
560  layerRmin = std::min(layerRmin,currentRmin);
561  layerRmax = std::max(layerRmax, currentRmax);
562  layerZmin = std::min(layerZmin,currentZmin);
563  layerZmax = std::max(layerZmax, currentZmax);
564  }
565 
566  // special for biequidistant binning - navigation layers are added before / after
567  if (bType == Trk::biequidistant){
568  if (radial){
569  double rStepHalf = 0.5*(layerRmax-layerRmin)/(layers.size()-1);
570  layerRmin -= rStepHalf;
571  layerRmax += rStepHalf;
572  } else {
573  double zStepHalf = 0.5*(layerZmax-layerZmin)/(layers.size()-1);
574  layerZmin -= zStepHalf;
575  layerZmax += zStepHalf;
576  }
577  }
578 
579  ATH_MSG_VERBOSE( "Estimate/check CylinderVolumeBounds from/w.r.t. enclosed layers + envelope covers" );
580  // the z from the layers w and w/o envelopes
581  double zEstFromLayerEnv = 0.5*((layerZmax)+(layerZmin));
582  double halflengthFromLayer = 0.5*fabs((layerZmax)-(layerZmin));
583 
584  bool concentric = (zEstFromLayerEnv*zEstFromLayerEnv < 0.001);
585 
586  // no CylinderBounds and Translation given - make it
587  if (!cylinderVolumeBounds && !transform) {
588  // create the CylinderBounds from parsed layer inputs
589  cylinderVolumeBounds = new Trk::CylinderVolumeBounds(layerRmin,layerRmax,halflengthFromLayer);
590  // and the transform
591  transform = concentric ? new Amg::Transform3D : nullptr;
592  if (transform)
593  (*transform) = Amg::Translation3D(0.,0.,zEstFromLayerEnv);
594  } else if (cylinderVolumeBounds && !transform &&!concentric){
596  (*transform) = Amg::Translation3D(0.,0.,zEstFromLayerEnv);
597  }
598  else if (transform && !cylinderVolumeBounds) {
599  // create the CylinderBounds from parsed layer inputs
600  double halflengthFromLayer = 0.5*fabs((layerZmax)-(layerZmin));
601  cylinderVolumeBounds = new Trk::CylinderVolumeBounds(layerRmin,
602  layerRmax,
603  halflengthFromLayer);
604  }
605 
606  ATH_MSG_VERBOSE( " -> dimensions from layers (rMin/rMax/zMin/zMax) = "
607  << layerRmin << " / " << layerRmax << " / " << layerZmin << " / " << layerZmax );
608  double zFromTransform = transform ? transform->translation().z() : 0.;
609  ATH_MSG_VERBOSE( " -> while created bounds are (rMin/rMax/zMin/zMax) = "
610  << cylinderVolumeBounds->innerRadius() << " / " << cylinderVolumeBounds->outerRadius() << " / "
611  << zFromTransform-cylinderVolumeBounds->halflengthZ() << " / " << zFromTransform+cylinderVolumeBounds->halflengthZ() );
612 
613 
614  // both is NOW given --- check it -----------------------------
615  if (cylinderVolumeBounds) {
616  // only check
617  if (zFromTransform-cylinderVolumeBounds->halflengthZ() <= layerZmin &&
618  zFromTransform+cylinderVolumeBounds->halflengthZ() >= layerZmax &&
619  cylinderVolumeBounds->innerRadius() <= layerRmin &&
620  cylinderVolumeBounds->outerRadius() >= layerRmax)
621  return StatusCode::SUCCESS;
622  else {
623  ATH_MSG_WARNING( "Provided layers are not contained by volume ! Bailing out. " );
624  return StatusCode::FAILURE;
625  }
626  ATH_MSG_VERBOSE( "Created/Checked " << *cylinderVolumeBounds );
627  }
628 
629 
630  return StatusCode::SUCCESS;
631 }
632 
633 
635  bool rBinned,
636  bool createBoundaryLayers,
637  bool replaceBoundaryFace) const
638 {
639 
640  ATH_MSG_VERBOSE( "Glue contained TrackingVolumes of container '" << tVolume.volumeName() << "'." );
641 
642  // get the glueVolumes descriptor of the top volume to register the outside volumes
643  Trk::GlueVolumesDescriptor& glueDescr = tVolume.glueVolumesDescriptor();
644 
645  // so far we know that we can do that (private method)
647 
648  // the needed iterators
649  auto tVolIter = volumes.begin();
650  auto tVolFirst = volumes.begin();
651  auto tVolLast = volumes.end(); --tVolLast;
652  auto tVolEnd = volumes.end();
653 
654  // the glue volumes for the description
655  std::vector<Trk::TrackingVolume*> glueVolumesInnerTube;
656  std::vector<Trk::TrackingVolume*> glueVolumesOuterTube;
657  std::vector<Trk::TrackingVolume*> glueVolumesNegativeFace;
658  std::vector<Trk::TrackingVolume*> glueVolumesPositiveFace;
659 
660  // volumes of increasing r
661  if (rBinned) {
662  // loop over the volumes -------------------------------
663  for ( ; tVolIter != tVolEnd; ) {
664  // screen output
665  ATH_MSG_VERBOSE("r-binning: Processing volume '" << (*tVolIter)->volumeName() << "'.");
666  // for the first one
667  if (tVolIter == tVolFirst)
668  addFaceVolumes((**tVolIter),Trk::tubeInnerCover,glueVolumesInnerTube);
669  // add this or the subvolumes to the negativeFace and positiveFace
670  addFaceVolumes((**tVolIter),Trk::negativeFaceXY,glueVolumesNegativeFace);
671  addFaceVolumes((**tVolIter),Trk::positiveFaceXY,glueVolumesPositiveFace);
672  if (tVolIter == tVolLast) {
673  addFaceVolumes((**tVolIter),Trk::tubeOuterCover,glueVolumesOuterTube);
674  ++tVolIter;
675  } else {
676  Trk::TrackingVolume* tVol1 = (*tVolIter);
677  Trk::TrackingVolume* tVol2 = (*(++tVolIter));
678  glueTrackingVolumes(*tVol1,Trk::tubeOuterCover, *tVol2, Trk::tubeInnerCover, createBoundaryLayers, replaceBoundaryFace);
679  }
680  }
681  } else {
682  // volumes in increasing z
683  // loop over the volumes
684  for ( ; tVolIter != tVolEnd; ) {
685  // screen output
686  ATH_MSG_VERBOSE("z-binning: Processing volume '" << (*tVolIter)->volumeName() << "'.");
687  if (tVolIter == tVolFirst)
688  addFaceVolumes((**tVolIter),Trk::negativeFaceXY,glueVolumesNegativeFace);
689  addFaceVolumes((**tVolIter),Trk::tubeInnerCover,glueVolumesInnerTube);
690  addFaceVolumes((**tVolIter),Trk::tubeOuterCover,glueVolumesOuterTube);
691  if (tVolIter == tVolLast) {
692  addFaceVolumes((**tVolIter),Trk::positiveFaceXY,glueVolumesPositiveFace);
693  ++tVolIter;
694  } else {
695  Trk::TrackingVolume* tVol1 = (*tVolIter);
696  Trk::TrackingVolume* tVol2 = (*(++tVolIter));
697  glueTrackingVolumes(*tVol1,Trk::positiveFaceXY,*tVol2,Trk::negativeFaceXY, createBoundaryLayers, replaceBoundaryFace);
698  }
699  }
700  }
701 
702  // register it with the glueVolumeDescriptor
703  glueDescr.registerGlueVolumes(Trk::negativeFaceXY,glueVolumesNegativeFace);
704  glueDescr.registerGlueVolumes(Trk::positiveFaceXY,glueVolumesPositiveFace);
705  glueDescr.registerGlueVolumes(Trk::tubeInnerCover,glueVolumesInnerTube);
706  glueDescr.registerGlueVolumes(Trk::tubeOuterCover,glueVolumesOuterTube);
707 
708  // return success
709  return StatusCode::SUCCESS;
710 }
711 
712 
715  Trk::BoundarySurfaceFace glueFace,
716  std::vector<Trk::TrackingVolume*>& vols) const
717 {
718 
719  ATH_MSG_VERBOSE( "Adding face volumes of face " << glueFace << " for the volume '" << tvol.volumeName() << "'." );
720  // retrieve the gluevolume descriptor
721  Trk::GlueVolumesDescriptor& gvDescriptor = tvol.glueVolumesDescriptor();
722  // if volumes are registered: take them
723  if (!gvDescriptor.glueVolumes(glueFace).empty()) {
724  // get the navigation level subvolumes
725  std::vector<Trk::TrackingVolume*>::const_iterator volIter = gvDescriptor.glueVolumes(glueFace).begin();
726  std::vector<Trk::TrackingVolume*>::const_iterator volEnd = gvDescriptor.glueVolumes(glueFace).end();
727  for ( ; volIter != volEnd; ++volIter){
728  ATH_MSG_VERBOSE( " -> adding volumes : " << (*volIter)->volumeName() );
729  vols.push_back(*volIter);
730  }
731  // screen output
732  ATH_MSG_VERBOSE( vols.size() << " navigation volumes registered as glue volumes." );
733  } else {
734  // the volume itself is on navigation level
735  ATH_MSG_VERBOSE( "Volume is on navigation level." );
736  vols.push_back(&tvol);
737  }
738 }
739 
740 
743  Trk::BoundarySurfaceFace faceOne,
744  Trk::TrackingVolume& tvolTwo,
745  Trk::BoundarySurfaceFace faceTwo,
746  bool createBoundaryLayers,
747  bool replaceBoundaryFace) const
748 {
749 
750  // get the two gluevolume descriptors
751  Trk::GlueVolumesDescriptor& gvDescriptorOne = tvolOne.glueVolumesDescriptor();
752  Trk::GlueVolumesDescriptor& gvDescriptorTwo = tvolTwo.glueVolumesDescriptor();
753 
754  ATH_MSG_VERBOSE( "Glue method called with " << (replaceBoundaryFace ? "joint boundaries." : "individual boundaries." ) );
755 
756  size_t volOneGlueVols = gvDescriptorOne.glueVolumes(faceOne).size();
757  ATH_MSG_VERBOSE( "GlueVolumeDescriptor of volume '" << tvolOne.volumeName() <<"' has "
758  << volOneGlueVols << " @ " << faceOne );
759  size_t volTwoGlueVols = gvDescriptorTwo.glueVolumes(faceTwo).size();
760  ATH_MSG_VERBOSE( "GlueVolumeDescriptor of volume '" << tvolTwo.volumeName() <<"' has "
761  << volTwoGlueVols << " @ " << faceTwo );
762 
763  // they could still be a container though
764  TrackingVolume* glueVolOne = volOneGlueVols ?
765  gvDescriptorOne.glueVolumes(faceOne)[0] : &tvolOne;
766 
767  TrackingVolume* glueVolTwo = volTwoGlueVols ?
768  gvDescriptorTwo.glueVolumes(faceTwo)[0] : &tvolTwo;
769 
770  // check the cases
771  // (i) easy volume to volume
772  if ( volOneGlueVols <= 1 && volTwoGlueVols <= 1) {
773  // now glue it
774  ATH_MSG_VERBOSE( " glue : one[ "<< glueVolOne->volumeName() << " @ " << faceOne
775  << " ]-to-one[ "<< glueVolTwo->volumeName() << " @ " << faceTwo << " ]" );
776  m_trackingVolumeHelper->glueTrackingVolumes(*glueVolOne,
777  faceOne,
778  *glueVolTwo,
779  faceTwo,
780  createBoundaryLayers);
781  } else if (volOneGlueVols <= 1) { // (ii) one -> many
782  ATH_MSG_VERBOSE( " glue : one[ "<< glueVolOne->volumeName() << " @ " << faceOne
783  << " ]-to-many[ "<< tvolTwo.volumeName() << " @ " << faceTwo << " ]" );
784  m_trackingVolumeHelper->glueTrackingVolumes(*glueVolOne,
785  faceOne,
786  gvDescriptorTwo.glueVolumes(faceTwo),
787  faceTwo,
788  createBoundaryLayers,
789  replaceBoundaryFace);
790  } else if (volTwoGlueVols <= 1 ) { // (iii) many -> two
791  ATH_MSG_VERBOSE( " glue : many[ "<< tvolOne.volumeName() << " @ " << faceOne
792  << " ]-to-one[ "<< glueVolTwo->volumeName() << " @ " << faceTwo << " ]" );
793  m_trackingVolumeHelper->glueTrackingVolumes(*glueVolTwo,
794  faceTwo,
795  gvDescriptorOne.glueVolumes(faceOne),
796  faceOne,
797  createBoundaryLayers,
798  replaceBoundaryFace);
799  } else {
800  // (iv) glue array to array
801  ATH_MSG_VERBOSE( " glue : many[ "<< tvolOne.volumeName() << " @ " << faceOne
802  << " ]-to-many[ "<< tvolTwo.volumeName() << " @ " << faceTwo << " ]" );
803  m_trackingVolumeHelper->glueTrackingVolumes(gvDescriptorOne.glueVolumes(faceOne),
804  faceOne,
805  gvDescriptorTwo.glueVolumes(faceTwo),
806  faceTwo,
807  createBoundaryLayers,
808  replaceBoundaryFace);
809  } // end of case (iv)
810 }
811 
813  double r,
814  double halflengthZ,
815  double thickness,
816  int binsPhi,
817  int binsZ) const
818 {
819  ATH_MSG_VERBOSE( "Creating a CylinderLayer at position " << z << " and radius " << r );
820  // prepare the material
821  Trk::LayerMaterialProperties* cylinderMaterial = nullptr;
822  // positioning
823  std::unique_ptr<Amg::Transform3D> transform =
824  (fabs(z) > 0.1) ? std::make_unique<Amg::Transform3D>() : nullptr;
825  if (transform){
826  (*transform) = Amg::Translation3D(0., 0., z);
827  }
828 
829  // z-binning
830  Trk::BinUtility layerBinUtility(binsZ,z-halflengthZ,z+halflengthZ,Trk::open,Trk::binZ);
831  if (binsPhi==1){
832  // the BinUtility for the material
833  // ---------------------> create the layer material
834  cylinderMaterial = new Trk::BinnedLayerMaterial(layerBinUtility);
835  ATH_MSG_VERBOSE( " -> Preparing the binned material with "
836  << binsZ << " bins in Z. ");
837 
838  } else { // break the phi symmetry
839  // update the BinUtility: local position on Cylinder is rPhi, z
840  Trk::BinUtility layerBinUtilityRPhiZ(binsPhi,-r*M_PI,+r*M_PI,Trk::closed,Trk::binRPhi);
841  layerBinUtilityRPhiZ += layerBinUtility;
842  // ---------------------> create the layer material
843  cylinderMaterial = new Trk::BinnedLayerMaterial(layerBinUtilityRPhiZ);
844 
845  ATH_MSG_VERBOSE( " -> Preparing the binned material with "
846  << binsPhi << " / " << binsZ << " bins in R*phi / Z. ");
847  }
848  // bounds
849  Trk::CylinderBounds* cylinderBounds = new Trk::CylinderBounds(r,halflengthZ);
850  // create the cylinder
852  cylinderBounds,
853  *cylinderMaterial,
854  thickness,
855  nullptr, int(Trk::passive)) :
856  new Trk::CylinderLayer(cylinderBounds,
857  *cylinderMaterial,
858  thickness,
859  nullptr, int(Trk::passive)) ;
860  // delete the material
861  delete cylinderMaterial;
862  // and return it
863  return cylinderLayer;
864 }
865 
866 
868  double rMin,
869  double rMax,
870  double thickness,
871  int binsPhi,
872  int binsR) const
873 {
874 
875  ATH_MSG_VERBOSE( "Creating a DiscLayer at position " << z << " and rMin/rMax " << rMin << " / " << rMax);
876 
877  // positioning
878  std::unique_ptr<Amg::Transform3D> transform =
879  fabs(z) > 0.1 ? std::make_unique<Amg::Transform3D>() : nullptr;
880  if (transform)
881  (*transform) = Amg::Translation3D(0.,0.,z);
882  Trk::BinnedLayerMaterial* discMaterial = nullptr;
883 
884  // R is the primary binning for the material
885  Trk::BinUtility layerBinUtility(binsR, rMin, rMax, Trk::open, Trk::binR);
886  if (binsPhi==1) {
887  ATH_MSG_VERBOSE( " -> Preparing the binned material with "
888  << binsR << " bins in R. ");
889  } else {
890  // also binning in phi chosen
891  layerBinUtility += Trk::BinUtility(binsPhi, -M_PI, M_PI, Trk::closed, Trk::binPhi);
892  ATH_MSG_VERBOSE( " -> Preparing the binned material with "
893  << binsPhi << " / " << binsR << " bins in phi / R. ");
894  }
895  // ---------------------> create the layer material
896  discMaterial = new Trk::BinnedLayerMaterial(layerBinUtility);
897  // bounds
898  Trk::DiscBounds* discBounds = new Trk::DiscBounds(rMin,rMax);
899  // create the disc
900  Trk::DiscLayer* discLayer = new Trk::DiscLayer(*transform,
901  discBounds,
902  *discMaterial,
903  thickness,
904  nullptr, int(Trk::passive));
905  // delete the material
906  delete discMaterial;
907  // and return it
908  return discLayer;
909 }
910 
PlotCalibFromCool.il
il
Definition: PlotCalibFromCool.py:381
beamspotman.r
def r
Definition: beamspotman.py:676
Trk::TrackingVolume::glueVolumesDescriptor
GlueVolumesDescriptor & glueVolumesDescriptor()
Definition: TrackingVolume.cxx:1205
Trk::CylinderVolumeCreator::addFaceVolumes
void addFaceVolumes(TrackingVolume &tvol, Trk::BoundarySurfaceFace bsf, std::vector< Trk::TrackingVolume * > &vols) const
Private method - helper method not to duplicate code.
Definition: CylinderVolumeCreator.cxx:714
Trk::CylinderVolumeCreator::~CylinderVolumeCreator
~CylinderVolumeCreator()
Destructor.
Trk::CylinderVolumeCreator::createDiscLayer
DiscLayer * createDiscLayer(double z, double rMin, double rMax, double thickness, int binsPhi, int binsR) const
Private method - helper method to save some code.
Definition: CylinderVolumeCreator.cxx:867
AbstractVolume.h
Trk::CylinderVolumeCreator::createCylinderLayer
CylinderLayer * createCylinderLayer(double z, double r, double halflength, double thickness, int binsPhi, int binsZ) const
Private method - helper method to save some code.
Definition: CylinderVolumeCreator.cxx:812
ATH_MSG_FATAL
#define ATH_MSG_FATAL(x)
Definition: AthMsgStreamMacros.h:34
python.PerfMonSerializer.p
def p
Definition: PerfMonSerializer.py:743
max
#define max(a, b)
Definition: cfImp.cxx:41
DiscBounds.h
Trk::z
@ z
global position (cartesian)
Definition: ParamDefs.h:63
Trk::binZ
@ binZ
Definition: BinningType.h:49
AthCommonDataStore< AthCommonMsg< AlgTool > >::declareProperty
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T > &t)
Definition: AthCommonDataStore.h:145
Trk::CylinderVolumeCreator::CylinderVolumeCreator
CylinderVolumeCreator(const std::string &, const std::string &, const IInterface *)
Constructor.
Definition: CylinderVolumeCreator.cxx:33
BinUtility.h
module_driven_slicing.layers
layers
Definition: module_driven_slicing.py:114
DiscLayer.h
M_PI
#define M_PI
Definition: ActiveFraction.h:11
Trk::CylinderVolumeCreator::initialize
virtual StatusCode initialize() override
AlgTool initialize method.
Definition: CylinderVolumeCreator.cxx:59
Trk::biequidistant
@ biequidistant
Definition: BinningType.h:33
ChangeHistoRange.binsZ
list binsZ
Definition: ChangeHistoRange.py:63
Trk::closed
@ closed
Definition: BinningType.h:41
Trk::positiveFaceXY
@ positiveFaceXY
Definition: BoundarySurfaceFace.h:33
Trk::CylinderVolumeCreator::m_passiveLayerPhiBins
int m_passiveLayerPhiBins
bins in phi for the passive layer
Definition: CylinderVolumeCreator.h:193
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
ITrackingVolumeArrayCreator.h
Trk::CylinderVolumeCreator::m_trackingVolumeArrayCreator
ToolHandle< ITrackingVolumeArrayCreator > m_trackingVolumeArrayCreator
TrackingVolume helper.
Definition: CylinderVolumeCreator.h:188
Trk::CylinderVolumeCreator::estimateAndCheckDimension
StatusCode estimateAndCheckDimension(const std::vector< Layer * > &layers, Trk::CylinderVolumeBounds *&cylBounds, Amg::Transform3D *&translation, std::vector< CylinderLayer * > &cylLayers, std::vector< DiscLayer * > &discLayers, double &rMinClean, double &rMaxClean, double &zMinClean, double &zMaxClean, BinningType bType=arbitrary) const
Private method - it estimates the CylinderBounds and Translation of layers, if given,...
Definition: CylinderVolumeCreator.cxx:472
Trk::BoundarySurfaceFace
BoundarySurfaceFace
Definition: BoundarySurfaceFace.h:31
Trk::DiscBounds::rMax
double rMax() const
This method returns outer radius.
ILayerArrayCreator.h
Trk::passive
@ passive
Definition: Layer.h:48
Trk::arbitrary
@ arbitrary
Definition: BinningType.h:34
Trk::CylinderVolumeCreator::glueTrackingVolumes
void glueTrackingVolumes(TrackingVolume &volumeOne, BoundarySurfaceFace faceOne, TrackingVolume &volumeTwo, BoundarySurfaceFace faceTwo, bool buildBoundaryLayers, bool replaceBoundaryFace=false) const
Private method - glue volume to the other – use trackingVolume helper.
Definition: CylinderVolumeCreator.cxx:742
GeoPrimitives.h
Trk::VolumeBounds
Definition: VolumeBounds.h:45
CylinderVolumeBounds.h
Trk::DiscBounds::rMin
double rMin() const
This method returns inner radius.
Amg::toString
std::string toString(const Translation3D &translation, int precision=4)
GeoPrimitvesToStringConverter.
Definition: GeoPrimitivesToStringConverter.h:40
EventPrimitivesToStringConverter.h
beamspotman.n
n
Definition: beamspotman.py:731
Trk::GlueVolumesDescriptor::registerGlueVolumes
void registerGlueVolumes(BoundarySurfaceFace, std::vector< TrackingVolume * > &)
register the volumes
Definition: GlueVolumesDescriptor.cxx:28
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
Trk::CylinderBounds
Definition: CylinderBounds.h:46
Trk::LayerMaterialProperties
Definition: LayerMaterialProperties.h:62
Trk::CylinderVolumeCreator::createContainerTrackingVolume
virtual TrackingVolume * createContainerTrackingVolume(const std::vector< TrackingVolume * > &volumes, const Material &matprop, const std::string &volumeName="UndefinedVolume", bool buildBoundaryLayers=false, bool replaceBoundaryFace=false) const override final
Definition: CylinderVolumeCreator.cxx:344
Amg::Transform3D
Eigen::Affine3d Transform3D
Definition: GeoPrimitives.h:46
Amg::transform
Amg::Vector3D transform(Amg::Vector3D &v, Amg::Transform3D &tr)
Transform a point from a Trasformation3D.
Definition: GeoPrimitivesHelpers.h:156
Trk::CylinderVolumeBounds::halflengthZ
double halflengthZ() const
This method returns the halflengthZ.
Definition: CylinderVolumeBounds.h:207
Trk::negativeFaceXY
@ negativeFaceXY
Definition: BoundarySurfaceFace.h:32
CylinderLayer.h
Trk::Volume::center
const Amg::Vector3D & center() const
returns the center of the volume
Definition: Volume.h:86
Trk::DiscLayer
Definition: DiscLayer.h:45
BinnedLayerMaterial.h
Trk::BinnedLayerMaterial
Definition: BinnedLayerMaterial.h:33
min
#define min(a, b)
Definition: cfImp.cxx:40
Trk::BinUtility
Definition: BinUtility.h:39
Trk::CylinderLayer
Definition: CylinderLayer.h:43
Athena::Units
Definition: Units.h:45
Trk::CylinderVolumeBounds
Definition: CylinderVolumeBounds.h:70
Trk::TrackingVolume::volumeName
const std::string & volumeName() const
Returns the VolumeName - for debug reason, might be depreciated later.
Trk::CylinderVolumeCreator::createGapTrackingVolume
virtual TrackingVolume * createGapTrackingVolume(Material &matprop, double rMin, double rMax, double zMin, double zMax, unsigned int materialLayers, bool cylinder=true, const std::string &volumeName="UndefinedVolume") const override final
Definition: CylinderVolumeCreator.cxx:244
GlueVolumesDescriptor.h
Trk::GlueVolumesDescriptor::glueVolumes
const std::vector< TrackingVolume * > & glueVolumes(BoundarySurfaceFace)
retrieve them again
Definition: GlueVolumesDescriptor.cxx:40
Trk::CylinderVolumeBounds::outerRadius
double outerRadius() const
This method returns the outer radius.
Definition: CylinderVolumeBounds.h:191
Trk::BinnedArray::arrayObjects
virtual BinnedArraySpan< T *const > arrayObjects()=0
Return all objects of the Array non-const we can still modify the T.
Trk::CylinderVolumeCreator::m_trackingVolumeHelper
ToolHandle< ITrackingVolumeHelper > m_trackingVolumeHelper
Definition: CylinderVolumeCreator.h:190
Trk::GlueVolumesDescriptor
Definition: GlueVolumesDescriptor.h:40
Trk::CylinderVolumeCreator::createTrackingVolume
virtual TrackingVolume * createTrackingVolume(const std::vector< Layer * > &layers, Material &matprop, VolumeBounds *volBounds=0, Amg::Transform3D *transform=0, const std::string &volumeName="UndefinedVolume", BinningType btype=arbitrary) const override final
Definition: CylinderVolumeCreator.cxx:94
Trk::open
@ open
Definition: BinningType.h:40
python.SystemOfUnits.mm
int mm
Definition: SystemOfUnits.py:83
CylinderBounds.h
Trk::binR
@ binR
Definition: BinningType.h:50
TrackingVolume.h
Trk::CylinderVolumeCreator::m_layerArrayCreator
ToolHandle< ILayerArrayCreator > m_layerArrayCreator
< A Tool for coherent LayerArray creation
Definition: CylinderVolumeCreator.h:186
ATH_MSG_WARNING
#define ATH_MSG_WARNING(x)
Definition: AthMsgStreamMacros.h:32
Trk::binRPhi
@ binRPhi
Definition: BinningType.h:52
Trk::CylinderVolumeBounds::innerRadius
double innerRadius() const
This method returns the inner radius.
Definition: CylinderVolumeBounds.h:187
python.CaloScaleNoiseConfig.type
type
Definition: CaloScaleNoiseConfig.py:78
Trk::TrackingVolume::confinedVolumes
const TrackingVolumeArray * confinedVolumes() const
Return the subLayer array.
Amg::Translation3D
Eigen::Translation< double, 3 > Translation3D
Definition: GeoPrimitives.h:44
Trk::Volume::volumeBounds
const VolumeBounds & volumeBounds() const
returns the volumeBounds()
Definition: Volume.h:97
Gaudi
=============================================================================
Definition: CaloGPUClusterAndCellDataMonitorOptions.h:273
LArCellBinning.step
step
Definition: LArCellBinning.py:158
Trk::CylinderVolumeCreator::m_passiveLayerThickness
double m_passiveLayerThickness
thickness of passive layers
Definition: CylinderVolumeCreator.h:192
Trk::CylinderVolumeCreator::m_passiveLayerRzBins
int m_passiveLayerRzBins
bins in r/z for the passive layer
Definition: CylinderVolumeCreator.h:194
Trk::tubeOuterCover
@ tubeOuterCover
Definition: BoundarySurfaceFace.h:40
Trk::Material
Definition: Material.h:116
Trk::tubeInnerCover
@ tubeInnerCover
Definition: BoundarySurfaceFace.h:39
Trk::BinnedArray
Definition: BinnedArray.h:38
CylinderVolumeCreator.h
AthAlgTool
Definition: AthAlgTool.h:26
Trk::TrackingVolume
Definition: TrackingVolume.h:121
Trk::BinnedArraySpan
std::span< T > BinnedArraySpan
Definition: BinnedArray.h:34
Trk::CylinderVolumeCreator::interGlueTrackingVolume
StatusCode interGlueTrackingVolume(TrackingVolume &tVolume, bool rBinned, bool buildBoundaryLayers, bool replaceBoundaryFace=false) const
Private method - interglue all volumes contained by a TrackingVolume and set the outside glue volumes...
Definition: CylinderVolumeCreator.cxx:634
Material.h
Trk::DiscBounds
Definition: DiscBounds.h:44
Trk::CylinderBounds::halflengthZ
double halflengthZ() const
This method returns the halflengthZ.
Trk::CylinderBounds::r
virtual double r() const override final
This method returns the radius.
ITrackingVolumeHelper.h
Trk::binPhi
@ binPhi
Definition: BinningType.h:51