Loading [MathJax]/extensions/tex2jax.js
ATLAS Offline Software
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
Classes | Public Types | Public Member Functions | Private Member Functions | Private Attributes | List of all members
ActsLayerBuilder Class Reference

#include <ActsLayerBuilder.h>

Inheritance diagram for ActsLayerBuilder:
Collaboration diagram for ActsLayerBuilder:

Classes

struct  Config
 

Public Types

enum  Mode {
  Mode::Undefined, Mode::Pixel, Mode::SCT, Mode::TRT,
  Mode::ITkPixelInner, Mode::ITkPixelOuter, Mode::ITkStrip
}
 
using ElementVector = ActsElementVector
 

Public Member Functions

 ActsLayerBuilder (const Config &cfg, std::unique_ptr< const Acts::Logger > logger=Acts::getDefaultLogger("GMLayBldr", Acts::Logging::INFO))
 Constructor. More...
 
 ~ActsLayerBuilder ()
 Destructor. More...
 
const Acts::LayerVector negativeLayers (const Acts::GeometryContext &gctx) const override
 
const Acts::LayerVector centralLayers (const Acts::GeometryContext &gctx) const override
 
const Acts::LayerVector positiveLayers (const Acts::GeometryContext &gctx) const override
 
void setConfiguration (const Config &cfg)
 Name identification. More...
 
ActsLayerBuilder::Config getConfiguration () const
 get the configuration object More...
 
virtual const std::string & identification () const override
 
void setLogger (std::unique_ptr< const Acts::Logger > logger)
 set logging instance More...
 

Private Member Functions

const Acts::Logger & logger () const
 Private access to the logger. More...
 
std::vector< std::shared_ptr< const ActsDetectorElement > > getDetectorElements () const
 
void buildBarrel (const Acts::GeometryContext &gctx, Acts::LayerVector &layersOutput) const
 
void buildEndcap (const Acts::GeometryContext &gctx, Acts::LayerVector &layersOutput, int type=0) const
 

Private Attributes

Config m_cfg
 configuration object More...
 
std::unique_ptr< const Acts::Logger > m_logger
 logging instance More...
 

Detailed Description

Definition at line 38 of file ActsLayerBuilder.h.

Member Typedef Documentation

◆ ElementVector

Definition at line 45 of file ActsLayerBuilder.h.

Member Enumeration Documentation

◆ Mode

Enumerator
Undefined 
Pixel 
SCT 
TRT 
ITkPixelInner 
ITkPixelOuter 
ITkStrip 

Definition at line 41 of file ActsLayerBuilder.h.

41  {
42  Undefined, Pixel, SCT, TRT, ITkPixelInner, ITkPixelOuter, ITkStrip,
43  };

Constructor & Destructor Documentation

◆ ActsLayerBuilder()

ActsLayerBuilder::ActsLayerBuilder ( const Config cfg,
std::unique_ptr< const Acts::Logger >  logger = Acts::getDefaultLogger("GMLayBldr", Acts::Logging::INFO) 
)

Constructor.

Parameters
cfgis the configuration struct
loggerthe local logging instance

Definition at line 42 of file ActsLayerBuilder.cxx.

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 }

◆ ~ActsLayerBuilder()

ActsLayerBuilder::~ActsLayerBuilder ( )
inline

Destructor.

Definition at line 106 of file ActsLayerBuilder.h.

106 {}

Member Function Documentation

◆ buildBarrel()

void ActsLayerBuilder::buildBarrel ( const Acts::GeometryContext &  gctx,
Acts::LayerVector &  layersOutput 
) const
private

Definition at line 108 of file ActsLayerBuilder.cxx.

109  {
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  double f = 1.0;
285  if (key <= 1) {
286  f = 4.0; // four rows per module
287  } else {
288  f = 2.0; // two rows per module
289  }
290  size_t nBinsPhi = nModPhi / f;
291  size_t nBinsZ = nModZ / f;
292  layer = m_cfg.layerCreator->cylinderLayer(gctx, surfaces, nBinsPhi,
293  nBinsZ, pl, transform,
294  std::move(approachDescriptor));
295  } else if (m_cfg.mode == Mode::ITkPixelInner ||
297  double f = 1.0;
298  if (key == 0) {
299  f = 2.0;
300  }
301  size_t nBinsPhi = nModPhi / f;
302  size_t nBinsZ = nModZ / f;
303  layer = m_cfg.layerCreator->cylinderLayer(gctx, surfaces, nBinsPhi,
304  nBinsZ, pl, transform,
305  std::move(approachDescriptor));
306  } else {
307  layer = m_cfg.layerCreator->cylinderLayer(
308  gctx, surfaces, Acts::equidistant, Acts::equidistant, pl, transform,
309  std::move(approachDescriptor));
310  }
311 
312  layersOutput.push_back(layer);
313  }
314 
315  // check if additional passive layers need to be constructed
316  std::size_t numPassiveLayers = m_cfg.passiveBarrelLayerRadii.size();
317  ACTS_DEBUG("Configured to build " << numPassiveLayers << " passive central layers.");
318  if (numPassiveLayers != 0u) {
319  for (std::size_t icl = 0; icl < numPassiveLayers; ++icl) {
320  ACTS_VERBOSE("- build layer " << icl
321  << " with radius = " << m_cfg.passiveBarrelLayerRadii.at(icl)
322  << " and halfZ = " << m_cfg.passiveBarrelLayerHalflengthZ.at(icl)
323  << " and thickness = " << m_cfg.passiveBarrelLayerThickness.at(icl));
324 
325  // create the boundary
326  auto cBounds = std::make_shared<const Acts::CylinderBounds>(
328 
329  // create the layer
330  std::shared_ptr<Acts::Layer> layer =
331  Acts::CylinderLayer::create(Transform3::Identity(), cBounds, nullptr, m_cfg.passiveBarrelLayerThickness.at(icl));
332 
333  layersOutput.push_back(layer);
334  }
335  }
336 }

◆ buildEndcap()

void ActsLayerBuilder::buildEndcap ( const Acts::GeometryContext &  gctx,
Acts::LayerVector &  layersOutput,
int  type = 0 
) const
private

Definition at line 338 of file ActsLayerBuilder.cxx.

340 {
341  using enum Acts::AxisDirection;
342 
343  ACTS_VERBOSE("Build layers: " << (type < 0 ? "NEGATIVE" : "POSITIVE")
344  << " ENDCAP");
345  std::vector<std::shared_ptr<const ActsDetectorElement>> elements =
347  std::map<std::tuple<int, int, int>, std::vector<const Acts::Surface *>>
348  initialLayers{};
349 
350  for (const auto &element : elements) {
351 
352  IdentityHelper id = element->identityHelper();
353  if (id.bec() * type <= 0) {
354  continue;
355  }
356 
358  if(id.layer_disk() >= 3) continue;
359  }
361  if(id.layer_disk() <= 2) continue;
362  }
363 
364  m_cfg.elementStore->push_back(element);
365 
366  std::tuple<int, int, int> key{id.bec(), id.layer_disk(), id.eta_module()};
367 
368  initialLayers[key].push_back(&element->surface());
369  }
370 
371  ACTS_VERBOSE("Found " << initialLayers.size() << " "
372  << (type < 0 ? "NEGATIVE" : "POSITIVE")
373  << " ENDCAP inital layers");
374 
375  std::vector<Acts::ProtoLayer> protoLayers;
376  protoLayers.reserve(initialLayers.size());
377 
378  for (const auto &[key, surfaces] : initialLayers) {
379  auto &pl = protoLayers.emplace_back(gctx, surfaces);
380  pl.envelope[AxisR] = m_cfg.endcapEnvelopeR;
381  pl.envelope[AxisZ] = m_cfg.endcapEnvelopeZ;
382  }
383 
384  // sort proto layers by their medium z position
385  std::sort(protoLayers.begin(), protoLayers.end(),
386  [type](const Acts::ProtoLayer &a, const Acts::ProtoLayer &b) {
387  double midA = (a.min(AxisZ) + a.max(AxisZ)) / 2.0;
388  double midB = (b.min(AxisZ) + b.max(AxisZ)) / 2.0;
389  if (type < 0) {
390  return midA < midB;
391  } else {
392  return midA > midB;
393  }
394  });
395 
396  auto plPrintZ = [](const auto &pl) -> std::string {
397  std::stringstream ss;
398  double zMid = (pl.min(AxisZ) + pl.max(AxisZ)) / 2.0;
399  ss << " < " << pl.min(AxisZ) << " | " << zMid << " | "
400  << pl.max(AxisZ) << " > ";
401  return ss.str();
402  };
403  if (logger().doPrint(Acts::Logging::VERBOSE)) {
404  for (const auto &pl : protoLayers) {
405 
406  ACTS_VERBOSE(" -> at < zMin | zMid | zMax >: " << plPrintZ(pl));
407 
408  ACTS_VERBOSE(" -> at rMin / rMax: " << pl.min(AxisR) << " / "
409  << pl.max(AxisR));
410  }
411  }
412 
413  std::vector<Acts::ProtoLayer> mergedProtoLayers;
414 
416  mergedProtoLayers.push_back(protoLayers.front());
417  std::vector<const Acts::Surface *> surfaces;
418  for (size_t i = 1; i < protoLayers.size(); i++) {
419  auto &pl = protoLayers[i];
420  auto &pl_prev = mergedProtoLayers.back();
421  // do they intersect?
422  ACTS_VERBOSE("Compare: " << plPrintZ(pl_prev) << " and " << plPrintZ(pl));
423  bool overlap = (pl.min(AxisZ) <= pl_prev.max(AxisZ) &&
424  pl.max(AxisZ) >= pl_prev.min(AxisZ));
425  ACTS_VERBOSE(" -> overlap? " << (overlap ? "yes" : "no"));
426  if (overlap) {
427  ACTS_VERBOSE(" ===> merging");
428  surfaces.clear();
429  surfaces.reserve(pl.surfaces().size() + pl_prev.surfaces().size());
430  surfaces.insert(surfaces.end(), pl.surfaces().begin(),
431  pl.surfaces().end());
432  surfaces.insert(surfaces.end(), pl_prev.surfaces().begin(),
433  pl_prev.surfaces().end());
434  mergedProtoLayers.pop_back();
435  auto &new_pl =
436  mergedProtoLayers.emplace_back(gctx, std::move(surfaces));
437  new_pl.envelope[AxisR] = pl.envelope[AxisR];
438  new_pl.envelope[AxisZ] = pl.envelope[AxisZ];
439  } else {
440  mergedProtoLayers.push_back(std::move(pl));
441  }
442  }
443 
444  ACTS_VERBOSE("" << mergedProtoLayers.size() << " "
445  << (type < 0 ? "NEGATIVE" : "POSITIVE")
446  << " ENDCAP layers remain after merging");
447  } else {
448  mergedProtoLayers = protoLayers;
449  }
450 
451  if (m_cfg.objDebugOutput) {
452  for (size_t i = 0; i < mergedProtoLayers.size(); i++) {
453 
454  std::stringstream ss;
455  ss << "obj/" << m_cfg.mode << "_" << (type < 0 ? "neg" : "pos")
456  << "_disk_" << std::setfill('0') << std::setw(2) << i << ".obj";
457 
458  std::ofstream ofs{ss.str()};
459  Acts::ObjVisualization3D vis{};
460  Acts::ViewConfig vc = Acts::s_viewSensitive;
461  vc.quarterSegments = 200;
462  for (const auto &surface : mergedProtoLayers[i].surfaces()) {
463  Acts::GeometryView3D::drawSurface(vis, *surface, gctx,
464  Acts::Transform3::Identity(), vc);
465  }
466 
467  vis.write(ofs);
468  }
469  }
470 
471  std::vector<std::shared_ptr<const Surface>> ownedSurfaces;
472  for (const auto &pl : mergedProtoLayers) {
473 
474  std::unique_ptr<Acts::ApproachDescriptor> approachDescriptor = nullptr;
475  std::shared_ptr<const Acts::ProtoSurfaceMaterial> materialProxy = nullptr;
476 
477  double layerZ = pl.medium(AxisZ);
478  double layerHalfZ = 0.5 * pl.range(AxisZ);
479  double layerThickness = pl.range(AxisZ);
480 
481  double layerZInner = layerZ - layerHalfZ;
482  double layerZOuter = layerZ + layerHalfZ;
483 
484  if (std::abs(layerZInner) > std::abs(layerZOuter))
485  std::swap(layerZInner, layerZOuter);
486 
487  std::vector<std::shared_ptr<const Acts::Surface>> aSurfaces;
488 
489  Acts::Transform3 transformNominal(Translation3(0., 0., layerZ));
490  Acts::Transform3 transformInner(Translation3(0., 0., layerZInner));
491  Acts::Transform3 transformOuter(Translation3(0., 0., layerZOuter));
492 
493  std::shared_ptr<Acts::DiscSurface> innerBoundary =
494  Acts::Surface::makeShared<Acts::DiscSurface>(
495  transformInner, pl.min(AxisR), pl.max(AxisR));
496  aSurfaces.push_back(innerBoundary);
497 
498  std::shared_ptr<Acts::DiscSurface> nominalSurface =
499  Acts::Surface::makeShared<Acts::DiscSurface>(
500  transformNominal, pl.min(AxisR), pl.max(AxisR));
501  aSurfaces.push_back(nominalSurface);
502 
503  std::shared_ptr<Acts::DiscSurface> outerBoundary =
504  Acts::Surface::makeShared<Acts::DiscSurface>(
505  transformOuter, pl.min(AxisR), pl.max(AxisR));
506  aSurfaces.push_back(outerBoundary);
507 
508  if(layerThickness > 2_mm) {
509  ACTS_VERBOSE("Wide disc layer ("<< layerThickness << ") => adding cylinder like approach surfaces");
510  Acts::Transform3 trf{Translation3{0, 0, layerZ}};
511  auto cylinderInner =
512  Acts::Surface::makeShared<Acts::CylinderSurface>(
513  trf, pl.min(AxisR), layerHalfZ);
514  aSurfaces.push_back(cylinderInner);
515 
516  auto cylinderOuter =
517  Acts::Surface::makeShared<Acts::CylinderSurface>(
518  trf, pl.max(AxisR), layerHalfZ);
519  aSurfaces.push_back(cylinderOuter);
520  }
521 
522 
523  size_t matBinsPhi = m_cfg.endcapMaterialBins.first;
524  size_t matBinsR = m_cfg.endcapMaterialBins.second;
525 
526  Acts::BinUtility materialBinUtil(matBinsPhi, -M_PI, M_PI, Acts::closed,
527  AxisPhi);
528  materialBinUtil +=
529  Acts::BinUtility(matBinsR, pl.min(AxisR), pl.max(AxisR),
530  Acts::open, AxisR, transformNominal);
531 
532  materialProxy =
533  std::make_shared<const Acts::ProtoSurfaceMaterial>(materialBinUtil);
534 
535  ACTS_VERBOSE("[L] Layer is marked to carry support material on Surface ( "
536  "inner=0 / center=1 / outer=2 ) : "
537  << "inner");
538  ACTS_VERBOSE("with binning: [" << matBinsPhi << ", " << matBinsR << "]");
539 
540  ACTS_VERBOSE("Created ApproachSurfaces for disc layer at:");
541  ACTS_VERBOSE(" - inner: Z=" << layerZInner);
542  ACTS_VERBOSE(" - central: Z=" << layerZ);
543  ACTS_VERBOSE(" - outer: Z=" << layerZOuter);
544 
545  // set material on inner
546  innerBoundary->assignSurfaceMaterial(materialProxy);
547 
548 
549  // std::set<int> ringIds;
550  bool isITk = m_cfg.mode == Mode::ITkPixelInner ||
553 
554  std::map<int, std::set<int>> phiModuleByRing;
555 
556  // want to figure out bins in phi
557  for (const auto &srf : pl.surfaces()) {
558  auto elm = dynamic_cast<const ActsDetectorElement *>(
559  srf->associatedDetectorElement());
560  if (elm) {
561  auto id = elm->identityHelper();
562  int ring_number;
563  if(m_cfg.mode == Mode::ITkStrip || !isITk) {
564  ring_number = id.eta_module();
565  }
566  else {
567  ring_number = id.layer_disk();
568  }
569  phiModuleByRing[ring_number].insert(id.phi_module());
570  }
571  }
572  size_t nModPhi = std::numeric_limits<size_t>::max();
573  for(const auto& [ring, phiModules] : phiModuleByRing) {
574  nModPhi = std::min(nModPhi, phiModules.size());
575  }
576 
577  size_t nModR = phiModuleByRing.size();
578 
579  ACTS_VERBOSE("Identifier reports: " << nModPhi << " is lowest for " << nModR
580  << " r-rings");
581 
582  size_t nBinsPhi = nModPhi;
583  size_t nBinsR = nModR;
584 
585  if(!isITk) {
586  // In the ID, the modules in the innermost r-rings are exactly shifted by
587  // one half module width since it's the same number of modules, this gives
588  // binning trouble. Reduce bins by half: about 2 module pairs should be in
589  // each bin. This should be fine.
590  // @TODO: evaluate
591  nBinsPhi /= 2.0;
592  }
593  if(m_cfg.mode == Mode::ITkStrip) {
594  // up to four rows per module
595  nBinsR /= 4.0;
596  }
597 
598  ACTS_VERBOSE("Creating r x phi binned layer with " << nBinsR << " x "
599  << nBinsPhi << " bins");
600 
601 
602  approachDescriptor =
603  std::make_unique<Acts::GenericApproachDescriptor>(aSurfaces);
604 
605  // get ownership of pl surfaces
606  ownedSurfaces.clear();
607  ownedSurfaces.reserve(pl.surfaces().size());
608  std::transform(pl.surfaces().begin(), pl.surfaces().end(),
609  std::back_inserter(ownedSurfaces),
610  [](const auto &s) { return s->getSharedPtr(); });
611 
612  auto layer = m_cfg.layerCreator->discLayer(gctx, ownedSurfaces, nBinsR,
613  nBinsPhi, pl, transformNominal,
614  std::move(approachDescriptor));
615 
616  layersOutput.push_back(layer);
617  }
618 }

◆ centralLayers()

const Acts::LayerVector ActsLayerBuilder::centralLayers ( const Acts::GeometryContext &  gctx) const
override

Definition at line 61 of file ActsLayerBuilder.cxx.

61  {
62  ACTS_VERBOSE("Building central layers");
63  Acts::LayerVector cVector;
64  buildBarrel(gctx, cVector);
65  return cVector;
66 }

◆ getConfiguration()

ActsLayerBuilder::Config ActsLayerBuilder::getConfiguration ( ) const
inline

get the configuration object

Definition at line 132 of file ActsLayerBuilder.h.

133  {
134  return m_cfg;
135  }

◆ getDetectorElements()

std::vector< std::shared_ptr< const ActsDetectorElement > > ActsLayerBuilder::getDetectorElements ( ) const
private

Definition at line 77 of file ActsLayerBuilder.cxx.

77  {
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 
91  InDetDD::SiDetectorElementCollection::const_iterator iter;
92  for (iter = siDetMng->getDetectorElementBegin();
93  iter != siDetMng->getDetectorElementEnd(); ++iter) {
94  const InDetDD::SiDetectorElement *siDetElement =
95  dynamic_cast<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 }

◆ identification()

virtual const std::string& ActsLayerBuilder::identification ( ) const
inlineoverridevirtual

Definition at line 139 of file ActsLayerBuilder.h.

140  {
141  return m_cfg.configurationName;
142  }

◆ logger()

const Acts::Logger& ActsLayerBuilder::logger ( ) const
inlineprivate

Private access to the logger.

Definition at line 154 of file ActsLayerBuilder.h.

155  {
156  return *m_logger;
157  }

◆ negativeLayers()

const Acts::LayerVector ActsLayerBuilder::negativeLayers ( const Acts::GeometryContext &  gctx) const
override

Definition at line 53 of file ActsLayerBuilder.cxx.

53  {
54  ACTS_VERBOSE("Building negative layers");
55  Acts::LayerVector nVector;
56  buildEndcap(gctx, nVector, -1);
57  return nVector;
58 }

◆ positiveLayers()

const Acts::LayerVector ActsLayerBuilder::positiveLayers ( const Acts::GeometryContext &  gctx) const
override

Definition at line 69 of file ActsLayerBuilder.cxx.

69  {
70  ACTS_VERBOSE("Building positive layers");
71  Acts::LayerVector pVector;
72  buildEndcap(gctx, pVector, 1);
73  return pVector;
74 }

◆ setConfiguration()

void ActsLayerBuilder::setConfiguration ( const Config cfg)

Name identification.

set the configuration object

Parameters
cfgis the configuration struct

◆ setLogger()

void ActsLayerBuilder::setLogger ( std::unique_ptr< const Acts::Logger >  logger)

set logging instance

Member Data Documentation

◆ m_cfg

Config ActsLayerBuilder::m_cfg
private

configuration object

Definition at line 150 of file ActsLayerBuilder.h.

◆ m_logger

std::unique_ptr<const Acts::Logger> ActsLayerBuilder::m_logger
private

logging instance

Definition at line 163 of file ActsLayerBuilder.h.


The documentation for this class was generated from the following files:
ActsLayerBuilder::Mode::Undefined
@ Undefined
ActsLayerBuilder::buildEndcap
void buildEndcap(const Acts::GeometryContext &gctx, Acts::LayerVector &layersOutput, int type=0) const
Definition: ActsLayerBuilder.cxx:338
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:154
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
Pixel
Definition: PixelFEUtils.h:16
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
min
constexpr double min()
Definition: ap_fixedTest.cxx:26
module_driven_slicing.layers
layers
Definition: module_driven_slicing.py:114
M_PI
#define M_PI
Definition: ActiveFraction.h:11
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
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
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:150
ActsLayerBuilder::m_logger
std::unique_ptr< const Acts::Logger > m_logger
logging instance
Definition: ActsLayerBuilder.h:163
ActsLayerBuilder::Mode::ITkStrip
@ ITkStrip
TRT
Definition: HitInfo.h:33
ActsLayerBuilder::Config::configurationName
std::string configurationName
string based identification
Definition: ActsLayerBuilder.h:53
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:731
ActsLayerBuilder::Config::doEndcapLayerMerging
bool doEndcapLayerMerging
Definition: ActsLayerBuilder.h:93
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
hist_file_dump.f
f
Definition: hist_file_dump.py:141
ActsDetectorElement
Definition: ActsDetectorElement.h:42
ActsDetectorElement::identityHelper
IdentityHelper identityHelper() const
Definition: ActsDetectorElement.cxx:237
WriteCalibToCool.swap
swap
Definition: WriteCalibToCool.py:94
SCT
Definition: SCT_ChipUtils.h:14
ActsLayerBuilder::Config::endcapEnvelopeZ
std::array< double, 2 > endcapEnvelopeZ
Definition: ActsLayerBuilder.h:70
ActsLayerBuilder::Config::endcapMaterialBins
std::pair< size_t, size_t > endcapMaterialBins
Definition: ActsLayerBuilder.h:86
IdentityHelper::eta_module
int eta_module() const
Definition: IdentityHelper.cxx:73
name
std::string name
Definition: Control/AthContainers/Root/debug.cxx:228
ActsTrk::to_string
std::string to_string(const DetectorType &type)
Definition: GeometryDefs.h:34
plotBeamSpotMon.b
b
Definition: plotBeamSpotMon.py:77
InDetDD::SiDetectorElement
Definition: SiDetectorElement.h:109
WriteCaloSwCorrections.cfg
cfg
Definition: WriteCaloSwCorrections.py:23
Trk::open
@ open
Definition: BinningType.h:40
a
TList * a
Definition: liststreamerinfos.cxx:10
ActsLayerBuilder::Config::layerCreator
std::shared_ptr< const Acts::LayerCreator > layerCreator
Definition: ActsLayerBuilder.h:56
std::sort
void sort(typename std::reverse_iterator< DataModel_detail::iterator< DVL > > beg, typename std::reverse_iterator< DataModel_detail::iterator< DVL > > end, const Compare &comp)
Specialization of sort for DataVector/List.
Definition: DVL_algorithms.h:623
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
ActsLayerBuilder::Config::mng
const InDetDD::SiDetectorManager * mng
Definition: ActsLayerBuilder.h:55
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
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
ActsLayerBuilder::Config::elementStore
std::shared_ptr< ElementVector > elementStore
Definition: ActsLayerBuilder.h:66
mapkey::key
key
Definition: TElectronEfficiencyCorrectionTool.cxx:37