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