ATLAS Offline Software
ActsLayerBuilder.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
3 */
4 // ATHENA
8 
9 // PACKAGE
12 
13 // ACTS
14 #include "Acts/Definitions/Algebra.hpp"
15 #include "Acts/Definitions/Units.hpp"
16 #include "Acts/Geometry/ApproachDescriptor.hpp"
17 #include "Acts/Geometry/GenericApproachDescriptor.hpp"
18 #include "Acts/Geometry/GeometryContext.hpp"
19 #include "Acts/Geometry/CylinderLayer.hpp"
20 #include "Acts/Geometry/LayerCreator.hpp"
21 #include "Acts/Geometry/ProtoLayer.hpp"
22 #include "Acts/Material/ProtoSurfaceMaterial.hpp"
23 #include "Acts/Surfaces/CylinderSurface.hpp"
24 #include "Acts/Surfaces/DiscSurface.hpp"
25 #include "Acts/Utilities/BinningType.hpp"
26 #include "Acts/Surfaces/AnnulusBounds.hpp"
27 #include "Acts/Surfaces/SurfaceArray.hpp"
28 #include "Acts/Visualization/GeometryView3D.hpp"
29 #include "Acts/Visualization/ObjVisualization3D.hpp"
30 #include "Acts/Utilities/AxisDefinitions.hpp"
31 
32 #include <iterator>
33 #include <unordered_map>
34 #include <fstream>
35 
36 using Acts::Surface;
37 using Acts::Transform3;
38 using Acts::Translation3;
39 
40 using namespace Acts::UnitLiterals;
41 
43  std::unique_ptr<const Acts::Logger> logger)
44  : m_cfg (cfg),
45  m_logger(std::move(logger))
46 {
47  if(m_cfg.mode == Mode::Undefined) {
48  throw std::invalid_argument("ALB mode is undefined");
49  }
50 }
51 
52 const Acts::LayerVector
53 ActsLayerBuilder::negativeLayers(const Acts::GeometryContext &gctx) const {
54  ACTS_VERBOSE("Building negative layers");
55  Acts::LayerVector nVector;
56  buildEndcap(gctx, nVector, -1);
57  return nVector;
58 }
59 
60 const Acts::LayerVector
61 ActsLayerBuilder::centralLayers(const Acts::GeometryContext &gctx) const {
62  ACTS_VERBOSE("Building central layers");
63  Acts::LayerVector cVector;
64  buildBarrel(gctx, cVector);
65  return cVector;
66 }
67 
68 const Acts::LayerVector
69 ActsLayerBuilder::positiveLayers(const Acts::GeometryContext &gctx) const {
70  ACTS_VERBOSE("Building positive layers");
71  Acts::LayerVector pVector;
72  buildEndcap(gctx, pVector, 1);
73  return pVector;
74 }
75 
76 std::vector<std::shared_ptr<const ActsDetectorElement>>
78  ACTS_VERBOSE("Retrieving detector elements from detector manager");
79  if (m_cfg.mng == nullptr) {
80  ACTS_ERROR("Manager is null");
81  throw std::runtime_error{"Detector manager is null"};
82  }
83  auto siDetMng = static_cast<const InDetDD::SiDetectorManager *>(m_cfg.mng);
84  ACTS_VERBOSE("Detector manager has "
85  << std::distance(siDetMng->getDetectorElementBegin(),
86  siDetMng->getDetectorElementEnd())
87  << " elements");
88 
89  std::vector<std::shared_ptr<const ActsDetectorElement>> elements;
90 
92  for (iter = siDetMng->getDetectorElementBegin();
93  iter != siDetMng->getDetectorElementEnd(); ++iter) {
94  const InDetDD::SiDetectorElement *siDetElement =
95  dynamic_cast<const InDetDD::SiDetectorElement *>(*iter);
96  if (siDetElement == nullptr) {
97  ACTS_ERROR("Detector element was nullptr");
98  throw std::runtime_error{"Corrupt detector element collection"};
99  }
100  elements.push_back(
101  std::make_shared<const ActsDetectorElement>(*siDetElement));
102  }
103  ACTS_VERBOSE("Retrieved " << elements.size() << " elements");
104 
105  return elements;
106 }
107 
108 void ActsLayerBuilder::buildBarrel(const Acts::GeometryContext &gctx,
109  Acts::LayerVector &layersOutput) const {
110  using enum Acts::AxisDirection;
111 
112  ACTS_VERBOSE("Build layers: BARREL");
113  std::vector<std::shared_ptr<const ActsDetectorElement>> elements =
115 
116  std::map<int, std::vector<std::shared_ptr<const Acts::Surface>>> layers{};
117 
118  for (const auto &element : elements) {
119 
120  IdentityHelper id = element->identityHelper();
121  if (id.bec() != 0)
122  continue;
123 
125  if(id.layer_disk() >= 2) continue;
126  }
128  if(id.layer_disk() <= 1) continue;
129  }
130 
131  m_cfg.elementStore->push_back(element);
132 
133  int elementLayer;
134  elementLayer = id.layer_disk();
135 
136  layers[elementLayer].push_back(element->surface().getSharedPtr());
137  }
138 
139 
140  if (m_cfg.objDebugOutput) {
141  std::string lab;
142  for (auto &[key, layerSurfaces] : layers) {
143 
144  std::stringstream name;
145 
146 
147 
148  name << "obj/" << m_cfg.mode << "_brl_" << std::setfill('0') << std::setw(2)
149  << std::to_string(key) + "_bec"
150  << ".obj";
151 
152  std::ofstream ofs{name.str()};
153  Acts::ObjVisualization3D vis{};
154  Acts::ViewConfig vc = Acts::s_viewSensitive;
155  vc.quarterSegments = 200;
156  for (const auto &surface : layerSurfaces) {
157  Acts::GeometryView3D::drawSurface(vis, *surface, gctx,
158  Acts::Transform3::Identity(), vc);
159  }
160 
161  vis.write(ofs);
162  }
163  }
164 
165  ACTS_VERBOSE("Found " << layers.size() << " barrel layers");
166  // pre loop for more concise output. only do if we actually print it
167  if (logger().doPrint(Acts::Logging::VERBOSE)) {
168  size_t n = 1;
169  for (const auto &[key, surfaces] : layers) {
170  Acts::ProtoLayer pl(gctx, surfaces);
171  ACTS_VERBOSE("Layer #" << n << " with layerKey: (" << key << ")");
172  ACTS_VERBOSE(" -> at rMin / rMax: " << pl.min(AxisR) << " / "
173  << pl.max(AxisR));
174  ACTS_VERBOSE(" -> at zMin / zMax: " << pl.min(AxisZ) << " / "
175  << pl.max(AxisZ));
176 
177  n++;
178  }
179  }
180 
181  for (const auto &[key, surfaces] : layers) {
182 
183  std::unique_ptr<Acts::ApproachDescriptor> approachDescriptor = nullptr;
184  std::shared_ptr<const Acts::ProtoSurfaceMaterial> materialProxy = nullptr;
185 
186  // layers and extent are determined, build actual layer
187  Acts::ProtoLayer pl(gctx, surfaces);
188  pl.envelope[AxisR] = m_cfg.barrelEnvelopeR;
189  pl.envelope[AxisZ] = m_cfg.barrelEnvelopeZ;
190 
191  double layerZ = pl.medium(AxisZ, true);
192  double layerHalfZ = 0.5 * pl.range(AxisZ);
193 
194  Acts::Transform3 transform(Translation3(0., 0., -layerZ));
195  // set up approach descriptor
196 
197  std::shared_ptr<Acts::CylinderSurface> innerBoundary =
198  Acts::Surface::makeShared<Acts::CylinderSurface>(
199  transform, pl.min(AxisR), layerHalfZ);
200 
201  std::shared_ptr<Acts::CylinderSurface> outerBoundary =
202  Acts::Surface::makeShared<Acts::CylinderSurface>(
203  transform, pl.max(AxisR), layerHalfZ);
204 
205  std::shared_ptr<Acts::CylinderSurface> centralSurface =
206  Acts::Surface::makeShared<Acts::CylinderSurface>(
207  transform, (pl.min(AxisR) + pl.max(AxisR)) / 2.,
208  layerHalfZ);
209 
210  size_t binsPhi = m_cfg.barrelMaterialBins.first;
211  size_t binsZ = m_cfg.barrelMaterialBins.second;
212 
213  Acts::BinUtility materialBinUtil(binsPhi, -M_PI, M_PI, Acts::closed,
214  AxisPhi);
215  materialBinUtil += Acts::BinUtility(binsZ, -layerHalfZ, layerHalfZ,
216  Acts::open, AxisZ, transform);
217 
218  materialProxy =
219  std::make_shared<const Acts::ProtoSurfaceMaterial>(materialBinUtil);
220 
221  ACTS_VERBOSE("[L] Layer is marked to carry support material on Surface ( "
222  "inner=0 / center=1 / outer=2 ) : "
223  << "inner");
224  ACTS_VERBOSE("with binning: [" << binsPhi << ", " << binsZ << "]");
225 
226  ACTS_VERBOSE("Created ApproachSurfaces for cylinder layer at:");
227  ACTS_VERBOSE(" - inner: R=" << pl.min(AxisR));
228  ACTS_VERBOSE(" - central: R=" << (pl.min(AxisR) + pl.max(AxisR)) /
229  2.);
230  ACTS_VERBOSE(" - outer: R=" << pl.max(AxisR));
231 
232  // set material on inner
233  innerBoundary->assignSurfaceMaterial(materialProxy);
234 
235  std::vector<std::shared_ptr<const Acts::Surface>> aSurfaces;
236  aSurfaces.push_back(std::move(innerBoundary));
237  aSurfaces.push_back(std::move(centralSurface));
238  aSurfaces.push_back(std::move(outerBoundary));
239 
240  approachDescriptor =
241  std::make_unique<Acts::GenericApproachDescriptor>(std::move(aSurfaces));
242 
243  // count the number of relevant modules in each direction
244  auto phiEqual = [this](const Acts::Surface &a,
245  const Acts::Surface &b) {
246  Acts::GeometryContext gctx; // unused in matcher
247  return m_cfg.surfaceMatcher(gctx, AxisPhi, &a, &b);
248  };
249 
250  auto zEqual = [this](const Acts::Surface &a,
251  const Acts::Surface &b) {
252  Acts::GeometryContext gctx; // unused in matcher
253  return m_cfg.surfaceMatcher(gctx, AxisZ, &a, &b);
254  };
255 
256  // Work around issue with clang10 --- it doesn't allow
257  // listing surfaces directly in the capture list.
258  auto& xsurfaces = surfaces;
259  auto countKey = [&xsurfaces](auto equal) -> size_t {
260  std::vector<const Acts::Surface *> keySurfaces;
261  for (const auto &surface : xsurfaces) {
262  bool exists = false;
263  for (const auto* existing : keySurfaces) {
264  if (equal(*surface, *existing)) {
265  exists = true;
266  break;
267  }
268  }
269  if (!exists) {
270  keySurfaces.push_back(surface.get());
271  }
272  }
273  return keySurfaces.size();
274  };
275 
276  size_t nModPhi = countKey(phiEqual);
277  size_t nModZ = countKey(zEqual);
278 
279  ACTS_VERBOSE("Found " << nModPhi << " modules in phi " << nModZ
280  << " modules in z");
281 
282  std::shared_ptr<Acts::Layer> layer;
283  if (m_cfg.mode == Mode::ITkStrip) {
284  size_t nBinsPhi = nModPhi * m_cfg.numberOfBinsFactor;
285  size_t nBinsZ = nModZ * m_cfg.numberOfBinsFactor;
286  layer = m_cfg.layerCreator->cylinderLayer(gctx, surfaces, nBinsPhi,
287  nBinsZ, pl, transform,
288  std::move(approachDescriptor));
289  } else if (m_cfg.mode == Mode::ITkPixelInner ||
291  size_t nBinsPhi = nModPhi * m_cfg.numberOfBinsFactor;
292  size_t nBinsZ = nModZ * m_cfg.numberOfBinsFactor;
293 
294  // Special treatment to allow
295  // for larger bins at high-eta and potentially avoid missing innermost hits
296  // for tracks at shallow angles
297  if (m_cfg.mode == Mode::ITkPixelInner && key==0 ) {
298  nBinsZ = nModZ * m_cfg.numberOfInnermostLayerBinsFactor;
299  }
300 
301  layer = m_cfg.layerCreator->cylinderLayer(gctx, surfaces, nBinsPhi,
302  nBinsZ, pl, transform,
303  std::move(approachDescriptor));
304  } else {
305  layer = m_cfg.layerCreator->cylinderLayer(
306  gctx, surfaces, Acts::equidistant, Acts::equidistant, pl, transform,
307  std::move(approachDescriptor));
308  }
309 
310  layersOutput.push_back(layer);
311  }
312 
313  // check if additional passive layers need to be constructed
314  std::size_t numPassiveLayers = m_cfg.passiveBarrelLayerRadii.size();
315  ACTS_DEBUG("Configured to build " << numPassiveLayers << " passive central layers.");
316  if (numPassiveLayers != 0u) {
317  for (std::size_t icl = 0; icl < numPassiveLayers; ++icl) {
318  ACTS_VERBOSE("- build layer " << icl
319  << " with radius = " << m_cfg.passiveBarrelLayerRadii.at(icl)
320  << " and halfZ = " << m_cfg.passiveBarrelLayerHalflengthZ.at(icl)
321  << " and thickness = " << m_cfg.passiveBarrelLayerThickness.at(icl));
322 
323  // create the boundary
324  auto cBounds = std::make_shared<const Acts::CylinderBounds>(
326 
327  // create the layer
328  std::shared_ptr<Acts::Layer> layer =
329  Acts::CylinderLayer::create(Transform3::Identity(), cBounds, nullptr, m_cfg.passiveBarrelLayerThickness.at(icl));
330 
331  layersOutput.push_back(layer);
332  }
333  }
334 }
335 
336 void ActsLayerBuilder::buildEndcap(const Acts::GeometryContext &gctx,
337  Acts::LayerVector &layersOutput, int type) const
338 {
339  using enum Acts::AxisDirection;
340 
341  ACTS_VERBOSE("Build layers: " << (type < 0 ? "NEGATIVE" : "POSITIVE")
342  << " ENDCAP");
343  std::vector<std::shared_ptr<const ActsDetectorElement>> elements =
345  std::map<std::tuple<int, int, int>, std::vector<const Acts::Surface *>>
346  initialLayers{};
347 
348  for (const auto &element : elements) {
349 
350  IdentityHelper id = element->identityHelper();
351  if (id.bec() * type <= 0) {
352  continue;
353  }
354 
356  if(id.layer_disk() >= 3) continue;
357  }
359  if(id.layer_disk() <= 2) continue;
360  }
361 
362  m_cfg.elementStore->push_back(element);
363 
364  std::tuple<int, int, int> key{id.bec(), id.layer_disk(), id.eta_module()};
365 
366  initialLayers[key].push_back(&element->surface());
367  }
368 
369  ACTS_VERBOSE("Found " << initialLayers.size() << " "
370  << (type < 0 ? "NEGATIVE" : "POSITIVE")
371  << " ENDCAP inital layers");
372 
373  std::vector<Acts::ProtoLayer> protoLayers;
374  protoLayers.reserve(initialLayers.size());
375 
376  for (const auto &[key, surfaces] : initialLayers) {
377  auto &pl = protoLayers.emplace_back(gctx, surfaces);
378  pl.envelope[AxisR] = m_cfg.endcapEnvelopeR;
379  pl.envelope[AxisZ] = m_cfg.endcapEnvelopeZ;
380  }
381 
382  // sort proto layers by their medium z position
383  std::sort(protoLayers.begin(), protoLayers.end(),
384  [type](const Acts::ProtoLayer &a, const Acts::ProtoLayer &b) {
385  double midA = (a.min(AxisZ) + a.max(AxisZ)) / 2.0;
386  double midB = (b.min(AxisZ) + b.max(AxisZ)) / 2.0;
387  if (type < 0) {
388  return midA < midB;
389  } else {
390  return midA > midB;
391  }
392  });
393 
394  auto plPrintZ = [](const auto &pl) -> std::string {
395  std::stringstream ss;
396  double zMid = (pl.min(AxisZ) + pl.max(AxisZ)) / 2.0;
397  ss << " < " << pl.min(AxisZ) << " | " << zMid << " | "
398  << pl.max(AxisZ) << " > ";
399  return ss.str();
400  };
401  if (logger().doPrint(Acts::Logging::VERBOSE)) {
402  for (const auto &pl : protoLayers) {
403 
404  ACTS_VERBOSE(" -> at < zMin | zMid | zMax >: " << plPrintZ(pl));
405 
406  ACTS_VERBOSE(" -> at rMin / rMax: " << pl.min(AxisR) << " / "
407  << pl.max(AxisR));
408  }
409  }
410 
411  std::vector<Acts::ProtoLayer> mergedProtoLayers;
412 
413  if (m_cfg.doEndcapLayerMerging) {
414  mergedProtoLayers.push_back(protoLayers.front());
415  std::vector<const Acts::Surface *> surfaces;
416  for (size_t i = 1; i < protoLayers.size(); i++) {
417  auto &pl = protoLayers[i];
418  auto &pl_prev = mergedProtoLayers.back();
419  // do they intersect?
420  ACTS_VERBOSE("Compare: " << plPrintZ(pl_prev) << " and " << plPrintZ(pl));
421  bool overlap = (pl.min(AxisZ) <= pl_prev.max(AxisZ) &&
422  pl.max(AxisZ) >= pl_prev.min(AxisZ));
423  ACTS_VERBOSE(" -> overlap? " << (overlap ? "yes" : "no"));
424  if (overlap) {
425  ACTS_VERBOSE(" ===> merging");
426  surfaces.clear();
427  surfaces.reserve(pl.surfaces().size() + pl_prev.surfaces().size());
428  surfaces.insert(surfaces.end(), pl.surfaces().begin(),
429  pl.surfaces().end());
430  surfaces.insert(surfaces.end(), pl_prev.surfaces().begin(),
431  pl_prev.surfaces().end());
432  mergedProtoLayers.pop_back();
433  auto &new_pl =
434  mergedProtoLayers.emplace_back(gctx, std::move(surfaces));
435  new_pl.envelope[AxisR] = pl.envelope[AxisR];
436  new_pl.envelope[AxisZ] = pl.envelope[AxisZ];
437  } else {
438  mergedProtoLayers.push_back(std::move(pl));
439  }
440  }
441 
442  ACTS_VERBOSE("" << mergedProtoLayers.size() << " "
443  << (type < 0 ? "NEGATIVE" : "POSITIVE")
444  << " ENDCAP layers remain after merging");
445  } else {
446  mergedProtoLayers = protoLayers;
447  }
448 
449  if (m_cfg.objDebugOutput) {
450  for (size_t i = 0; i < mergedProtoLayers.size(); i++) {
451 
452  std::stringstream ss;
453  ss << "obj/" << m_cfg.mode << "_" << (type < 0 ? "neg" : "pos")
454  << "_disk_" << std::setfill('0') << std::setw(2) << i << ".obj";
455 
456  std::ofstream ofs{ss.str()};
457  Acts::ObjVisualization3D vis{};
458  Acts::ViewConfig vc = Acts::s_viewSensitive;
459  vc.quarterSegments = 200;
460  for (const auto &surface : mergedProtoLayers[i].surfaces()) {
461  Acts::GeometryView3D::drawSurface(vis, *surface, gctx,
462  Acts::Transform3::Identity(), vc);
463  }
464 
465  vis.write(ofs);
466  }
467  }
468 
469  std::vector<std::shared_ptr<const Surface>> ownedSurfaces;
470  for (const auto &pl : mergedProtoLayers) {
471 
472  std::unique_ptr<Acts::ApproachDescriptor> approachDescriptor = nullptr;
473  std::shared_ptr<const Acts::ProtoSurfaceMaterial> materialProxy = nullptr;
474 
475  double layerZ = pl.medium(AxisZ);
476  double layerHalfZ = 0.5 * pl.range(AxisZ);
477  double layerThickness = pl.range(AxisZ);
478 
479  double layerZInner = layerZ - layerHalfZ;
480  double layerZOuter = layerZ + layerHalfZ;
481 
482  if (std::abs(layerZInner) > std::abs(layerZOuter))
483  std::swap(layerZInner, layerZOuter);
484 
485  std::vector<std::shared_ptr<const Acts::Surface>> aSurfaces;
486 
487  Acts::Transform3 transformNominal(Translation3(0., 0., layerZ));
488  Acts::Transform3 transformInner(Translation3(0., 0., layerZInner));
489  Acts::Transform3 transformOuter(Translation3(0., 0., layerZOuter));
490 
491  std::shared_ptr<Acts::DiscSurface> innerBoundary =
492  Acts::Surface::makeShared<Acts::DiscSurface>(
493  transformInner, pl.min(AxisR), pl.max(AxisR));
494  aSurfaces.push_back(innerBoundary);
495 
496  std::shared_ptr<Acts::DiscSurface> nominalSurface =
497  Acts::Surface::makeShared<Acts::DiscSurface>(
498  transformNominal, pl.min(AxisR), pl.max(AxisR));
499  aSurfaces.push_back(nominalSurface);
500 
501  std::shared_ptr<Acts::DiscSurface> outerBoundary =
502  Acts::Surface::makeShared<Acts::DiscSurface>(
503  transformOuter, pl.min(AxisR), pl.max(AxisR));
504  aSurfaces.push_back(outerBoundary);
505 
506  if(layerThickness > 2_mm) {
507  ACTS_VERBOSE("Wide disc layer ("<< layerThickness << ") => adding cylinder like approach surfaces");
508  Acts::Transform3 trf{Translation3{0, 0, layerZ}};
509  auto cylinderInner =
510  Acts::Surface::makeShared<Acts::CylinderSurface>(
511  trf, pl.min(AxisR), layerHalfZ);
512  aSurfaces.push_back(cylinderInner);
513 
514  auto cylinderOuter =
515  Acts::Surface::makeShared<Acts::CylinderSurface>(
516  trf, pl.max(AxisR), layerHalfZ);
517  aSurfaces.push_back(cylinderOuter);
518  }
519 
520 
521  size_t matBinsPhi = m_cfg.endcapMaterialBins.first;
522  size_t matBinsR = m_cfg.endcapMaterialBins.second;
523 
524  Acts::BinUtility materialBinUtil(matBinsPhi, -M_PI, M_PI, Acts::closed,
525  AxisPhi);
526  materialBinUtil +=
527  Acts::BinUtility(matBinsR, pl.min(AxisR), pl.max(AxisR),
528  Acts::open, AxisR, transformNominal);
529 
530  materialProxy =
531  std::make_shared<const Acts::ProtoSurfaceMaterial>(materialBinUtil);
532 
533  ACTS_VERBOSE("[L] Layer is marked to carry support material on Surface ( "
534  "inner=0 / center=1 / outer=2 ) : "
535  << "inner");
536  ACTS_VERBOSE("with binning: [" << matBinsPhi << ", " << matBinsR << "]");
537 
538  ACTS_VERBOSE("Created ApproachSurfaces for disc layer at:");
539  ACTS_VERBOSE(" - inner: Z=" << layerZInner);
540  ACTS_VERBOSE(" - central: Z=" << layerZ);
541  ACTS_VERBOSE(" - outer: Z=" << layerZOuter);
542 
543  // set material on inner
544  innerBoundary->assignSurfaceMaterial(materialProxy);
545 
546 
547  // std::set<int> ringIds;
548  bool isITk = m_cfg.mode == Mode::ITkPixelInner ||
549  m_cfg.mode == Mode::ITkPixelOuter ||
550  m_cfg.mode == Mode::ITkStrip;
551 
552  std::map<int, std::set<int>> phiModuleByRing;
553 
554  // want to figure out bins in phi
555  for (const auto &srf : pl.surfaces()) {
556  auto elm = dynamic_cast<const ActsDetectorElement *>(
557  srf->associatedDetectorElement());
558  if (elm) {
559  auto id = elm->identityHelper();
560  int ring_number;
561  if(m_cfg.mode == Mode::ITkStrip || !isITk) {
562  ring_number = id.eta_module();
563  }
564  else {
565  ring_number = id.layer_disk();
566  }
567  phiModuleByRing[ring_number].insert(id.phi_module());
568  }
569  }
570  size_t nModPhi = std::numeric_limits<size_t>::max();
571  for(const auto& [ring, phiModules] : phiModuleByRing) {
572  nModPhi = std::min(nModPhi, phiModules.size());
573  }
574 
575  size_t nModR = phiModuleByRing.size();
576 
577  ACTS_VERBOSE("Identifier reports: " << nModPhi << " is lowest for " << nModR
578  << " r-rings");
579 
580  size_t nBinsPhi = nModPhi * m_cfg.numberOfBinsFactor;
581  size_t nBinsR = nModR * m_cfg.numberOfBinsFactor;
582 
583  ACTS_VERBOSE("Creating r x phi binned layer with " << nBinsR << " x "
584  << nBinsPhi << " bins");
585 
586 
587  approachDescriptor =
588  std::make_unique<Acts::GenericApproachDescriptor>(aSurfaces);
589 
590  // get ownership of pl surfaces
591  ownedSurfaces.clear();
592  ownedSurfaces.reserve(pl.surfaces().size());
593  std::transform(pl.surfaces().begin(), pl.surfaces().end(),
594  std::back_inserter(ownedSurfaces),
595  [](const auto &s) { return s->getSharedPtr(); });
596 
597  auto layer = m_cfg.layerCreator->discLayer(gctx, ownedSurfaces, nBinsR,
598  nBinsPhi, pl, Transform3::Identity(),
599  std::move(approachDescriptor));
600 
601  layersOutput.push_back(layer);
602  }
603 }
604 
605 std::ostream& operator<<(std::ostream& os, const ActsLayerBuilder::Mode& mode) {
606 
608  switch(mode) {
609  case Mode::Undefined:
610  os << "Undefined";
611  break;
612  case Mode::Pixel:
613  os << "Pixel";
614  break;
615  case Mode::SCT:
616  os << "SCT";
617  break;
618  case Mode::TRT:
619  os << "TRT";
620  break;
621  case Mode::ITkPixelInner:
622  os << "ITkPixelInner";
623  break;
624  case Mode::ITkPixelOuter:
625  os << "ITkPixelOuter";
626  break;
627  case Mode::ITkStrip:
628  os << "ITkStrip";
629  break;
630  }
631 
632  return os;
633 }
operator<<
std::ostream & operator<<(std::ostream &os, const ActsLayerBuilder::Mode &mode)
Definition: ActsLayerBuilder.cxx:605
ActsLayerBuilder::Mode::Undefined
@ Undefined
ActsLayerBuilder::buildEndcap
void buildEndcap(const Acts::GeometryContext &gctx, Acts::LayerVector &layersOutput, int type=0) const
Definition: ActsLayerBuilder.cxx:336
createLinkingScheme.iter
iter
Definition: createLinkingScheme.py:62
TRT
@ TRT
Definition: RegSelEnums.h:26
DataModel_detail::const_iterator
Const iterator class for DataVector/DataList.
Definition: DVLIterator.h:82
Undefined
@ Undefined
Definition: MaterialTypes.h:8
ActsLayerBuilder::logger
const Acts::Logger & logger() const
Private access to the logger.
Definition: ActsLayerBuilder.h:163
ActsLayerBuilder::centralLayers
const Acts::LayerVector centralLayers(const Acts::GeometryContext &gctx) const override
Definition: ActsLayerBuilder.cxx:61
PowhegControl_ttHplus_NLO.ss
ss
Definition: PowhegControl_ttHplus_NLO.py:83
ActsLayerBuilder::Mode::ITkPixelOuter
@ ITkPixelOuter
Trk::equidistant
@ equidistant
Definition: BinningType.h:32
ActsLayerBuilder::Config::objDebugOutput
bool objDebugOutput
Definition: ActsLayerBuilder.h:95
ActsLayerBuilder::Mode::ITkPixelInner
@ ITkPixelInner
ActsLayerBuilder::Config::mode
Mode mode
Definition: ActsLayerBuilder.h:54
ParticleGun_SamplingFraction.bec
int bec
Definition: ParticleGun_SamplingFraction.py:89
ActsLayerBuilder::Config::passiveBarrelLayerRadii
std::vector< float > passiveBarrelLayerRadii
the specifications for building additional passive cylinders in the barrel region: for each cylinder ...
Definition: ActsLayerBuilder.h:82
max
constexpr double max()
Definition: ap_fixedTest.cxx:33
IdentityHelper.h
min
constexpr double min()
Definition: ap_fixedTest.cxx:26
module_driven_slicing.layers
layers
Definition: module_driven_slicing.py:113
M_PI
#define M_PI
Definition: ActiveFraction.h:11
ActsLayerBuilder::negativeLayers
const Acts::LayerVector negativeLayers(const Acts::GeometryContext &gctx) const override
Definition: ActsLayerBuilder.cxx:53
ChangeHistoRange.binsZ
list binsZ
Definition: ChangeHistoRange.py:63
Trk::closed
@ closed
Definition: BinningType.h:41
ActsLayerBuilder::buildBarrel
void buildBarrel(const Acts::GeometryContext &gctx, Acts::LayerVector &layersOutput) const
Definition: ActsLayerBuilder.cxx:108
MuonR4::to_string
std::string to_string(const SectorProjector proj)
Definition: MsTrackSeeder.cxx:66
ActsLayerBuilder::Config::numberOfInnermostLayerBinsFactor
double numberOfInnermostLayerBinsFactor
Special treatment for the innermost pixel layer to have more control on bin size to account for shall...
Definition: ActsLayerBuilder.h:103
ActsLayerBuilder::Config::endcapEnvelopeR
std::array< double, 2 > endcapEnvelopeR
Definition: ActsLayerBuilder.h:68
ActsLayerBuilder::getDetectorElements
std::vector< std::shared_ptr< const ActsDetectorElement > > getDetectorElements() const
Definition: ActsLayerBuilder.cxx:77
ActsLayerBuilder::Config
Definition: ActsLayerBuilder.h:51
ActsLayerBuilder::positiveLayers
const Acts::LayerVector positiveLayers(const Acts::GeometryContext &gctx) const override
Definition: ActsLayerBuilder.cxx:69
Trk::u
@ u
Enums for curvilinear frames.
Definition: ParamDefs.h:77
ActsLayerBuilder::Config::passiveBarrelLayerThickness
std::vector< float > passiveBarrelLayerThickness
Definition: ActsLayerBuilder.h:84
python.CaloAddPedShiftConfig.type
type
Definition: CaloAddPedShiftConfig.py:42
ActsLayerBuilder::Config::barrelEnvelopeR
std::array< double, 2 > barrelEnvelopeR
Definition: ActsLayerBuilder.h:73
CxxUtils::fpcompare::equal
bool equal(double a, double b)
Compare two FP numbers, working around x87 precision issues.
Definition: fpcompare.h:114
ActsLayerBuilder::m_cfg
Config m_cfg
configuration object
Definition: ActsLayerBuilder.h:159
ActsLayerBuilder::Mode::ITkStrip
@ ITkStrip
DetType::Pixel
@ Pixel
Definition: DetType.h:13
ActsLayerBuilder.h
ActsLayerBuilder::Config::barrelEnvelopeZ
std::array< double, 2 > barrelEnvelopeZ
Definition: ActsLayerBuilder.h:75
lumiFormat.i
int i
Definition: lumiFormat.py:85
ActsLayerBuilder::Config::passiveBarrelLayerHalflengthZ
std::vector< float > passiveBarrelLayerHalflengthZ
Definition: ActsLayerBuilder.h:83
beamspotman.n
n
Definition: beamspotman.py:727
TRT::Hit::layer
@ layer
Definition: HitInfo.h:79
ActsLayerBuilder::Config::barrelMaterialBins
std::pair< size_t, size_t > barrelMaterialBins
Definition: ActsLayerBuilder.h:87
Amg::transform
Amg::Vector3D transform(Amg::Vector3D &v, Amg::Transform3D &tr)
Transform a point from a Trasformation3D.
Definition: GeoPrimitivesHelpers.h:156
Preparation.mode
mode
Definition: Preparation.py:107
ActsDetectorElement
Definition: ActsDetectorElement.h:44
ActsDetectorElement::identityHelper
IdentityHelper identityHelper() const
Definition: ActsDetectorElement.cxx:239
WriteCalibToCool.swap
swap
Definition: WriteCalibToCool.py:94
ReadFromCoolCompare.os
os
Definition: ReadFromCoolCompare.py:231
ActsLayerBuilder::Config::endcapEnvelopeZ
std::array< double, 2 > endcapEnvelopeZ
Definition: ActsLayerBuilder.h:70
IdentityHelper::eta_module
int eta_module() const
Definition: IdentityHelper.cxx:73
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:240
plotBeamSpotMon.b
b
Definition: plotBeamSpotMon.py:76
EventContainers::Mode
Mode
Definition: IdentifiableContainerBase.h:13
InDetDD::SiDetectorElement
Definition: SiDetectorElement.h:109
WriteCaloSwCorrections.cfg
cfg
Definition: WriteCaloSwCorrections.py:23
SiDetectorElementCollection.h
SiDetectorElement.h
Trk::open
@ open
Definition: BinningType.h:40
ActsLayerBuilder::Mode
Mode
Definition: ActsLayerBuilder.h:41
a
TList * a
Definition: liststreamerinfos.cxx:10
ActsLayerBuilder::Config::layerCreator
std::shared_ptr< const Acts::LayerCreator > layerCreator
Definition: ActsLayerBuilder.h:56
ActsLayerBuilder::Config::surfaceMatcher
std::function< bool(const Acts::GeometryContext &, Acts::AxisDirection, const Acts::Surface *, const Acts::Surface *)> surfaceMatcher
Definition: ActsLayerBuilder.h:91
InDetDD::SiDetectorManager
Definition: SiDetectorManager.h:60
python.SystemOfUnits.s
float s
Definition: SystemOfUnits.py:147
ActsLayerBuilder::Config::mng
const InDetDD::SiDetectorManager * mng
Definition: ActsLayerBuilder.h:55
ActsLayerBuilder::Config::numberOfBinsFactor
double numberOfBinsFactor
controls how many bins are created for the sensitive surface grid.
Definition: ActsLayerBuilder.h:100
SiDetectorManager.h
python.Constants.VERBOSE
int VERBOSE
Definition: Control/AthenaCommon/python/Constants.py:13
python.dummyaccess.exists
def exists(filename)
Definition: dummyaccess.py:9
CaloLCW_tf.trf
trf
Definition: CaloLCW_tf.py:20
IdentityHelper
Definition: IdentityHelper.h:14
ActsLayerBuilder::ActsLayerBuilder
ActsLayerBuilder(const Config &cfg, std::unique_ptr< const Acts::Logger > logger=Acts::getDefaultLogger("GMLayBldr", Acts::Logging::INFO))
Constructor.
Definition: ActsLayerBuilder.cxx:42
Amg::distance
float distance(const Amg::Vector3D &p1, const Amg::Vector3D &p2)
calculates the distance between two point in 3D space
Definition: GeoPrimitivesHelpers.h:54
python.iconfTool.gui.pad.logger
logger
Definition: pad.py:14
ActsLayerBuilder::Config::elementStore
std::shared_ptr< ElementVector > elementStore
Definition: ActsLayerBuilder.h:66
SCT
@ SCT
Definition: RegSelEnums.h:25
mapkey::key
key
Definition: TElectronEfficiencyCorrectionTool.cxx:37