ATLAS Offline Software
Loading...
Searching...
No Matches
ActsLayerBuilder Class Reference

#include <ActsLayerBuilder.h>

Inheritance diagram for ActsLayerBuilder:
Collaboration diagram for ActsLayerBuilder:

Classes

struct  Config
 nested configuration struct for steering of the layer builder More...

Public Types

enum class  Mode {
  Undefined , Pixel , SCT , TRT ,
  ITkPixelInner , ITkPixelOuter , 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.
 ~ActsLayerBuilder ()
 Destructor.
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.
const ActsLayerBuilder::Config & getConfiguration () const
 get the configuration object
virtual const std::string & identification () const override
void setLogger (std::unique_ptr< const Acts::Logger > logger)
 set logging instance

Private Member Functions

const Acts::Logger & logger () const
 Private access to the logger.
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
std::unique_ptr< const Acts::Logger > m_logger
 logging instance

Detailed Description

Definition at line 44 of file ActsLayerBuilder.h.

Member Typedef Documentation

◆ ElementVector

Member Enumeration Documentation

◆ Mode

enum class ActsLayerBuilder::Mode
strong
Enumerator
Undefined 
Pixel 
SCT 
TRT 
ITkPixelInner 
ITkPixelOuter 
ITkStrip 

Definition at line 47 of file ActsLayerBuilder.h.

47 {
48 Undefined, Pixel, SCT, TRT, ITkPixelInner, ITkPixelOuter, ITkStrip,
49 };
@ Undefined
@ TRT
Definition RegSelEnums.h:26
@ SCT
Definition RegSelEnums.h:25
@ Pixel
Definition DetType.h:13

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 45 of file ActsLayerBuilder.cxx.

47 : m_cfg (cfg),
48 m_logger(std::move(logger))
49{
50 if(m_cfg.mode == Mode::Undefined) {
51 throw std::invalid_argument("ALB mode is undefined");
52 }
53}
std::unique_ptr< const Acts::Logger > m_logger
logging instance
const Acts::Logger & logger() const
Private access to the logger.
Config m_cfg
configuration object

◆ ~ActsLayerBuilder()

ActsLayerBuilder::~ActsLayerBuilder ( )
inline

Destructor.

Definition at line 131 of file ActsLayerBuilder.h.

131{}

Member Function Documentation

◆ buildBarrel()

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

Definition at line 111 of file ActsLayerBuilder.cxx.

112 {
113 using enum Acts::AxisDirection;
114
115 ACTS_VERBOSE("Build layers: BARREL");
116 std::vector<std::shared_ptr<const ActsDetectorElement>> elements =
118
119 std::map<int, std::vector<std::shared_ptr<const Acts::Surface>>> layers{};
120
121 for (const auto &element : elements) {
122
123 IdentityHelper id = element->identityHelper();
124 if (id.bec() != 0)
125 continue;
126
127 if(m_cfg.mode == Mode::ITkPixelInner) {
128 if(id.layer_disk() >= 2) continue;
129 }
130 if(m_cfg.mode == Mode::ITkPixelOuter) {
131 if(id.layer_disk() <= 1) continue;
132 }
133
134 m_cfg.elementStore->push_back(element);
135
136 int elementLayer;
137 elementLayer = id.layer_disk();
138
139 layers[elementLayer].push_back(element->surface().getSharedPtr());
140 }
141
142
143 if (m_cfg.objDebugOutput) {
144 std::string lab;
145 for (auto &[key, layerSurfaces] : layers) {
146
147 std::stringstream name;
148
149
150
151 name << "obj/" << m_cfg.mode << "_brl_" << std::setfill('0') << std::setw(2)
152 << std::to_string(key) + "_bec"
153 << ".obj";
154
155 std::ofstream ofs{name.str()};
156 Acts::ObjVisualization3D vis{};
157 Acts::ViewConfig vc = Acts::s_viewSensitive;
158 vc.quarterSegments = 200;
159 for (const auto &surface : layerSurfaces) {
160 Acts::GeometryView3D::drawSurface(vis, *surface, gctx,
161 Acts::Transform3::Identity(), vc);
162 }
163
164 vis.write(ofs);
165 }
166 }
167
168 ACTS_VERBOSE("Found " << layers.size() << " barrel layers");
169 // pre loop for more concise output. only do if we actually print it
170 if (logger().doPrint(Acts::Logging::VERBOSE)) {
171 size_t n = 1;
172 for (const auto &[key, surfaces] : layers) {
173 Acts::ProtoLayer pl(gctx, surfaces);
174 ACTS_VERBOSE("Layer #" << n << " with layerKey: (" << key << ")");
175 ACTS_VERBOSE(" -> at rMin / rMax: " << pl.min(AxisR) << " / "
176 << pl.max(AxisR));
177 ACTS_VERBOSE(" -> at zMin / zMax: " << pl.min(AxisZ) << " / "
178 << pl.max(AxisZ));
179
180 n++;
181 }
182 }
183
184 for (const auto &[key, surfaces] : layers) {
185
186 std::unique_ptr<Acts::ApproachDescriptor> approachDescriptor = nullptr;
187 std::shared_ptr<const Acts::ProtoSurfaceMaterial> materialProxy = nullptr;
188
189 // layers and extent are determined, build actual layer
190 Acts::ProtoLayer pl(gctx, surfaces);
191 pl.envelope[AxisR] = m_cfg.barrelEnvelopeR;
192 pl.envelope[AxisZ] = m_cfg.barrelEnvelopeZ;
193
194 double layerZ = pl.medium(AxisZ, true);
195 double layerHalfZ = 0.5 * pl.range(AxisZ);
196
197 Acts::Transform3 transform(Translation3(0., 0., -layerZ));
198 // set up approach descriptor
199
200 std::shared_ptr<Acts::CylinderSurface> innerBoundary =
201 Acts::Surface::makeShared<Acts::CylinderSurface>(
202 transform, pl.min(AxisR), layerHalfZ);
203
204 std::shared_ptr<Acts::CylinderSurface> outerBoundary =
205 Acts::Surface::makeShared<Acts::CylinderSurface>(
206 transform, pl.max(AxisR), layerHalfZ);
207
208 std::shared_ptr<Acts::CylinderSurface> centralSurface =
209 Acts::Surface::makeShared<Acts::CylinderSurface>(
210 transform, (pl.min(AxisR) + pl.max(AxisR)) / 2.,
211 layerHalfZ);
212
213 size_t binsPhi = m_cfg.barrelMaterialBins.first;
214 size_t binsZ = m_cfg.barrelMaterialBins.second;
215
216 Acts::BinUtility materialBinUtil(binsPhi, -M_PI, M_PI, Acts::closed,
217 AxisPhi);
218 materialBinUtil += Acts::BinUtility(binsZ, -layerHalfZ, layerHalfZ,
219 Acts::open, AxisZ, transform);
220
221 materialProxy =
222 std::make_shared<const Acts::ProtoSurfaceMaterial>(materialBinUtil);
223
224 ACTS_VERBOSE("[L] Layer is marked to carry support material on Surface ( "
225 "inner=0 / center=1 / outer=2 ) : "
226 << "inner");
227 ACTS_VERBOSE("with binning: [" << binsPhi << ", " << binsZ << "]");
228
229 ACTS_VERBOSE("Created ApproachSurfaces for cylinder layer at:");
230 ACTS_VERBOSE(" - inner: R=" << pl.min(AxisR));
231 ACTS_VERBOSE(" - central: R=" << (pl.min(AxisR) + pl.max(AxisR)) /
232 2.);
233 ACTS_VERBOSE(" - outer: R=" << pl.max(AxisR));
234
235 // set material on inner
236 innerBoundary->assignSurfaceMaterial(materialProxy);
237
238 std::vector<std::shared_ptr<const Acts::Surface>> aSurfaces;
239 aSurfaces.push_back(std::move(innerBoundary));
240 aSurfaces.push_back(std::move(centralSurface));
241 aSurfaces.push_back(std::move(outerBoundary));
242
243 approachDescriptor =
244 std::make_unique<Acts::GenericApproachDescriptor>(std::move(aSurfaces));
245
246 // count the number of relevant modules in each direction
247 auto phiEqual = [this](const Acts::Surface &a,
248 const Acts::Surface &b) {
249 Acts::GeometryContext context = Acts::GeometryContext::dangerouslyDefaultConstruct(); // unused in matcher
250 return m_cfg.surfaceMatcher(context, AxisPhi, &a, &b);
251 };
252
253 auto zEqual = [this](const Acts::Surface &a,
254 const Acts::Surface &b) {
255 Acts::GeometryContext thisContext = Acts::GeometryContext::dangerouslyDefaultConstruct(); // unused in matcher
256 return m_cfg.surfaceMatcher(thisContext, AxisZ, &a, &b);
257 };
258
259 // Work around issue with clang10 --- it doesn't allow
260 // listing surfaces directly in the capture list.
261 auto& xsurfaces = surfaces;
262 auto countKey = [&xsurfaces](auto equal) -> size_t {
263 std::vector<const Acts::Surface *> keySurfaces;
264 for (const auto &surface : xsurfaces) {
265 bool exists = false;
266 for (const auto* existing : keySurfaces) {
267 if (equal(*surface, *existing)) {
268 exists = true;
269 break;
270 }
271 }
272 if (!exists) {
273 keySurfaces.push_back(surface.get());
274 }
275 }
276 return keySurfaces.size();
277 };
278
279 size_t nModPhi = countKey(phiEqual);
280 size_t nModZ = countKey(zEqual);
281
282 ACTS_VERBOSE("Found " << nModPhi << " modules in phi " << nModZ
283 << " modules in z");
284
285 std::shared_ptr<Acts::Layer> layer;
286 if (m_cfg.mode == Mode::ITkStrip || m_cfg.mode == Mode::ITkPixelInner ||
287 m_cfg.mode == Mode::ITkPixelOuter) {
288 size_t nBinsPhi = nModPhi * m_cfg.numberOfBinsFactor;
289 size_t nBinsZ = nModZ * m_cfg.numberOfBinsFactor;
290 layer = m_cfg.layerCreator->cylinderLayer(
291 gctx, surfaces, nBinsPhi, nBinsZ, pl, transform,
292 std::move(approachDescriptor), m_cfg.barrelNeighborWindow,
293 m_cfg.surfaceArrayOverfill);
294 } else {
295 layer = m_cfg.layerCreator->cylinderLayer(
296 gctx, surfaces, Acts::equidistant, Acts::equidistant, pl, transform,
297 std::move(approachDescriptor), m_cfg.barrelNeighborWindow,
298 m_cfg.surfaceArrayOverfill);
299 }
300
301 layersOutput.push_back(layer);
302 }
303
304 // check if additional passive layers need to be constructed
305 std::size_t numPassiveLayers = m_cfg.passiveBarrelLayerRadii.size();
306 ACTS_DEBUG("Configured to build " << numPassiveLayers << " passive central layers.");
307 if (numPassiveLayers != 0u) {
308 for (std::size_t icl = 0; icl < numPassiveLayers; ++icl) {
309 ACTS_VERBOSE("- build layer " << icl
310 << " with radius = " << m_cfg.passiveBarrelLayerRadii.at(icl)
311 << " and halfZ = " << m_cfg.passiveBarrelLayerHalflengthZ.at(icl)
312 << " and thickness = " << m_cfg.passiveBarrelLayerThickness.at(icl));
313
314 // create the boundary
315 auto cBounds = std::make_shared<const Acts::CylinderBounds>(
316 m_cfg.passiveBarrelLayerRadii.at(icl), m_cfg.passiveBarrelLayerHalflengthZ.at(icl));
317
318 // create the layer
319 std::shared_ptr<Acts::Layer> layer =
320 Acts::CylinderLayer::create(Transform3::Identity(), cBounds, nullptr, m_cfg.passiveBarrelLayerThickness.at(icl));
321
322 layersOutput.push_back(layer);
323 }
324 }
325}
#define M_PI
static Double_t a
std::vector< std::shared_ptr< const ActsDetectorElement > > getDetectorElements() const
bool exists(const std::string &filename)
does a file exist
bool equal(double a, double b)
Compare two FP numbers, working around x87 precision issues.
Definition fpcompare.h:114
@ layer
Definition HitInfo.h:79

◆ buildEndcap()

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

Definition at line 327 of file ActsLayerBuilder.cxx.

329{
330 using enum Acts::AxisDirection;
331
332 ACTS_VERBOSE("Build layers: " << (type < 0 ? "NEGATIVE" : "POSITIVE")
333 << " ENDCAP");
334 std::vector<std::shared_ptr<const ActsDetectorElement>> elements =
336 std::map<std::tuple<int, int, int>, std::vector<const Acts::Surface *>>
337 initialLayers{};
338
339 for (const auto &element : elements) {
340
341 IdentityHelper id = element->identityHelper();
342 if (id.bec() * type <= 0) {
343 continue;
344 }
345
346 if(m_cfg.mode == Mode::ITkPixelInner) {
347 if(id.layer_disk() >= 3) continue;
348 }
349 if(m_cfg.mode == Mode::ITkPixelOuter) {
350 if(id.layer_disk() <= 2) continue;
351 }
352
353 m_cfg.elementStore->push_back(element);
354
355 std::tuple<int, int, int> key{id.bec(), id.layer_disk(), id.eta_module()};
356
357 initialLayers[key].push_back(&element->surface());
358 }
359
360 ACTS_VERBOSE("Found " << initialLayers.size() << " "
361 << (type < 0 ? "NEGATIVE" : "POSITIVE")
362 << " ENDCAP inital layers");
363
364 std::vector<Acts::ProtoLayer> protoLayers;
365 protoLayers.reserve(initialLayers.size());
366
367 for (const auto &[key, surfaces] : initialLayers) {
368 auto &pl = protoLayers.emplace_back(gctx, surfaces);
369 pl.envelope[AxisR] = m_cfg.endcapEnvelopeR;
370 pl.envelope[AxisZ] = m_cfg.endcapEnvelopeZ;
371 }
372
373 // sort proto layers by their medium z position
374 std::sort(protoLayers.begin(), protoLayers.end(),
375 [type](const Acts::ProtoLayer &a, const Acts::ProtoLayer &b) {
376 double midA = (a.min(AxisZ) + a.max(AxisZ)) / 2.0;
377 double midB = (b.min(AxisZ) + b.max(AxisZ)) / 2.0;
378 if (type < 0) {
379 return midA < midB;
380 } else {
381 return midA > midB;
382 }
383 });
384
385 auto plPrintZ = [](const auto &pl) -> std::string {
386 std::stringstream ss;
387 double zMid = (pl.min(AxisZ) + pl.max(AxisZ)) / 2.0;
388 ss << " < " << pl.min(AxisZ) << " | " << zMid << " | "
389 << pl.max(AxisZ) << " > ";
390 return ss.str();
391 };
392 if (logger().doPrint(Acts::Logging::VERBOSE)) {
393 for (const auto &pl : protoLayers) {
394
395 ACTS_VERBOSE(" -> at < zMin | zMid | zMax >: " << plPrintZ(pl));
396
397 ACTS_VERBOSE(" -> at rMin / rMax: " << pl.min(AxisR) << " / "
398 << pl.max(AxisR));
399 }
400 }
401
402 std::vector<Acts::ProtoLayer> mergedProtoLayers;
403
404 if (m_cfg.doEndcapLayerMerging) {
405 mergedProtoLayers.push_back(protoLayers.front());
406 std::vector<const Acts::Surface *> surfaces;
407 for (size_t i = 1; i < protoLayers.size(); i++) {
408 auto &pl = protoLayers[i];
409 auto &pl_prev = mergedProtoLayers.back();
410 // do they intersect?
411 ACTS_VERBOSE("Compare: " << plPrintZ(pl_prev) << " and " << plPrintZ(pl));
412 bool overlap = (pl.min(AxisZ) <= pl_prev.max(AxisZ) &&
413 pl.max(AxisZ) >= pl_prev.min(AxisZ));
414 ACTS_VERBOSE(" -> overlap? " << (overlap ? "yes" : "no"));
415 if (overlap) {
416 ACTS_VERBOSE(" ===> merging");
417 surfaces.clear();
418 surfaces.reserve(pl.surfaces().size() + pl_prev.surfaces().size());
419 surfaces.insert(surfaces.end(), pl.surfaces().begin(),
420 pl.surfaces().end());
421 surfaces.insert(surfaces.end(), pl_prev.surfaces().begin(),
422 pl_prev.surfaces().end());
423 mergedProtoLayers.pop_back();
424 auto &new_pl =
425 mergedProtoLayers.emplace_back(gctx, std::move(surfaces));
426 new_pl.envelope[AxisR] = pl.envelope[AxisR];
427 new_pl.envelope[AxisZ] = pl.envelope[AxisZ];
428 } else {
429 mergedProtoLayers.push_back(std::move(pl));
430 }
431 }
432
433 ACTS_VERBOSE("" << mergedProtoLayers.size() << " "
434 << (type < 0 ? "NEGATIVE" : "POSITIVE")
435 << " ENDCAP layers remain after merging");
436 } else {
437 mergedProtoLayers = std::move(protoLayers);
438 }
439
440 if (m_cfg.objDebugOutput) {
441 for (size_t i = 0; i < mergedProtoLayers.size(); i++) {
442
443 std::stringstream ss;
444 ss << "obj/" << m_cfg.mode << "_" << (type < 0 ? "neg" : "pos")
445 << "_disk_" << std::setfill('0') << std::setw(2) << i << ".obj";
446
447 std::ofstream ofs{ss.str()};
448 Acts::ObjVisualization3D vis{};
449 Acts::ViewConfig vc = Acts::s_viewSensitive;
450 vc.quarterSegments = 200;
451 for (const auto &surface : mergedProtoLayers[i].surfaces()) {
452 Acts::GeometryView3D::drawSurface(vis, *surface, gctx,
453 Acts::Transform3::Identity(), vc);
454 }
455
456 vis.write(ofs);
457 }
458 }
459
460 std::vector<std::shared_ptr<const Surface>> ownedSurfaces;
461 for (const auto &pl : mergedProtoLayers) {
462
463 std::unique_ptr<Acts::ApproachDescriptor> approachDescriptor = nullptr;
464 std::shared_ptr<const Acts::ProtoSurfaceMaterial> materialProxy = nullptr;
465
466 double layerZ = pl.medium(AxisZ);
467 double layerHalfZ = 0.5 * pl.range(AxisZ);
468 double layerThickness = pl.range(AxisZ);
469
470 double layerZInner = layerZ - layerHalfZ;
471 double layerZOuter = layerZ + layerHalfZ;
472
473 if (std::abs(layerZInner) > std::abs(layerZOuter))
474 std::swap(layerZInner, layerZOuter);
475
476 std::vector<std::shared_ptr<const Acts::Surface>> aSurfaces;
477
478 Acts::Transform3 transformNominal(Translation3(0., 0., layerZ));
479 Acts::Transform3 transformInner(Translation3(0., 0., layerZInner));
480 Acts::Transform3 transformOuter(Translation3(0., 0., layerZOuter));
481
482 std::shared_ptr<Acts::DiscSurface> innerBoundary =
483 Acts::Surface::makeShared<Acts::DiscSurface>(
484 transformInner, pl.min(AxisR), pl.max(AxisR));
485 aSurfaces.push_back(innerBoundary);
486
487 std::shared_ptr<Acts::DiscSurface> nominalSurface =
488 Acts::Surface::makeShared<Acts::DiscSurface>(
489 transformNominal, pl.min(AxisR), pl.max(AxisR));
490 aSurfaces.push_back(nominalSurface);
491
492 std::shared_ptr<Acts::DiscSurface> outerBoundary =
493 Acts::Surface::makeShared<Acts::DiscSurface>(
494 transformOuter, pl.min(AxisR), pl.max(AxisR));
495 aSurfaces.push_back(outerBoundary);
496
497 if(layerThickness > 2_mm) {
498 ACTS_VERBOSE("Wide disc layer ("<< layerThickness << ") => adding cylinder like approach surfaces");
499 Acts::Transform3 trf{Translation3{0, 0, layerZ}};
500 auto cylinderInner =
501 Acts::Surface::makeShared<Acts::CylinderSurface>(
502 trf, pl.min(AxisR), layerHalfZ);
503 aSurfaces.push_back(cylinderInner);
504
505 auto cylinderOuter =
506 Acts::Surface::makeShared<Acts::CylinderSurface>(
507 trf, pl.max(AxisR), layerHalfZ);
508 aSurfaces.push_back(cylinderOuter);
509 }
510
511
512 size_t matBinsPhi = m_cfg.endcapMaterialBins.first;
513 size_t matBinsR = m_cfg.endcapMaterialBins.second;
514
515 Acts::BinUtility materialBinUtil(matBinsPhi, -M_PI, M_PI, Acts::closed,
516 AxisPhi);
517 materialBinUtil +=
518 Acts::BinUtility(matBinsR, pl.min(AxisR), pl.max(AxisR),
519 Acts::open, AxisR, transformNominal);
520
521 materialProxy =
522 std::make_shared<const Acts::ProtoSurfaceMaterial>(materialBinUtil);
523
524 ACTS_VERBOSE("[L] Layer is marked to carry support material on Surface ( "
525 "inner=0 / center=1 / outer=2 ) : "
526 << "inner");
527 ACTS_VERBOSE("with binning: [" << matBinsPhi << ", " << matBinsR << "]");
528
529 ACTS_VERBOSE("Created ApproachSurfaces for disc layer at:");
530 ACTS_VERBOSE(" - inner: Z=" << layerZInner);
531 ACTS_VERBOSE(" - central: Z=" << layerZ);
532 ACTS_VERBOSE(" - outer: Z=" << layerZOuter);
533
534 // set material on inner
535 innerBoundary->assignSurfaceMaterial(materialProxy);
536
537
538 // std::set<int> ringIds;
539 bool isITk = m_cfg.mode == Mode::ITkPixelInner ||
540 m_cfg.mode == Mode::ITkPixelOuter ||
541 m_cfg.mode == Mode::ITkStrip;
542
543 std::map<int, std::set<int>> phiModuleByRing;
544
545 // want to figure out bins in phi
546 for (const auto &srf : pl.surfaces()) {
547 auto* elm = getActsDetectorElement(srf);
548 if (elm) {
549 auto id = elm->identityHelper();
550 int ring_number;
551 if(m_cfg.mode == Mode::ITkStrip || !isITk) {
552 ring_number = id.eta_module();
553 }
554 else {
555 ring_number = id.layer_disk();
556 }
557 phiModuleByRing[ring_number].insert(id.phi_module());
558 }
559 }
560 size_t nModPhi = std::numeric_limits<size_t>::max();
561 for(const auto& [ring, phiModules] : phiModuleByRing) {
562 nModPhi = std::min(nModPhi, phiModules.size());
563 }
564
565 size_t nModR = phiModuleByRing.size();
566
567 ACTS_VERBOSE("Identifier reports: " << nModPhi << " is lowest for " << nModR
568 << " r-rings");
569
570 size_t nBinsPhi = nModPhi * m_cfg.numberOfBinsFactor;
571 size_t nBinsR = nModR * m_cfg.numberOfBinsFactor;
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(
588 gctx, ownedSurfaces, nBinsR, nBinsPhi, pl, Transform3::Identity(),
589 std::move(approachDescriptor), m_cfg.endcapNeighborWindow,
590 m_cfg.surfaceArrayOverfill);
591
592 layersOutput.push_back(layer);
593 }
594}
const ActsDetectorElement * getActsDetectorElement(const Acts::Surface &surf)
Attempts to retrieve the ActsDetectorElement associated to the passed ActsSurface.
static Double_t ss
void sort(typename DataModel_detail::iterator< DVL > beg, typename DataModel_detail::iterator< DVL > end)
Specialization of sort for DataVector/List.
void swap(ElementLinkVector< DOBJ > &lhs, ElementLinkVector< DOBJ > &rhs)

◆ centralLayers()

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

Definition at line 64 of file ActsLayerBuilder.cxx.

64 {
65 ACTS_VERBOSE("Building central layers");
66 Acts::LayerVector cVector;
67 buildBarrel(gctx, cVector);
68 return cVector;
69}
void buildBarrel(const Acts::GeometryContext &gctx, Acts::LayerVector &layersOutput) const

◆ getConfiguration()

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

get the configuration object

Definition at line 157 of file ActsLayerBuilder.h.

158 {
159 return m_cfg;
160 }

◆ getDetectorElements()

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

Definition at line 80 of file ActsLayerBuilder.cxx.

80 {
81 ACTS_VERBOSE("Retrieving detector elements from detector manager");
82 if (m_cfg.mng == nullptr) {
83 ACTS_ERROR("Manager is null");
84 throw std::runtime_error{"Detector manager is null"};
85 }
86 auto siDetMng = static_cast<const InDetDD::SiDetectorManager *>(m_cfg.mng);
87 ACTS_VERBOSE("Detector manager has "
88 << std::distance(siDetMng->getDetectorElementBegin(),
89 siDetMng->getDetectorElementEnd())
90 << " elements");
91
92 std::vector<std::shared_ptr<const ActsDetectorElement>> elements;
93
95 for (iter = siDetMng->getDetectorElementBegin();
96 iter != siDetMng->getDetectorElementEnd(); ++iter) {
97 const InDetDD::SiDetectorElement *siDetElement =
98 dynamic_cast<const InDetDD::SiDetectorElement *>(*iter);
99 if (siDetElement == nullptr) {
100 ACTS_ERROR("Detector element was nullptr");
101 throw std::runtime_error{"Corrupt detector element collection"};
102 }
103 elements.push_back(
104 std::make_shared<const ActsDetectorElement>(*siDetElement));
105 }
106 ACTS_VERBOSE("Retrieved " << elements.size() << " elements");
107
108 return elements;
109}
DataModel_detail::const_iterator< DataVector > const_iterator
Definition DataVector.h:861

◆ identification()

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

Definition at line 164 of file ActsLayerBuilder.h.

165 {
166 return m_cfg.configurationName;
167 }

◆ logger()

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

Private access to the logger.

Definition at line 179 of file ActsLayerBuilder.h.

180 {
181 return *m_logger;
182 }

◆ negativeLayers()

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

Definition at line 56 of file ActsLayerBuilder.cxx.

56 {
57 ACTS_VERBOSE("Building negative layers");
58 Acts::LayerVector nVector;
59 buildEndcap(gctx, nVector, -1);
60 return nVector;
61}
void buildEndcap(const Acts::GeometryContext &gctx, Acts::LayerVector &layersOutput, int type=0) const

◆ positiveLayers()

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

Definition at line 72 of file ActsLayerBuilder.cxx.

72 {
73 ACTS_VERBOSE("Building positive layers");
74 Acts::LayerVector pVector;
75 buildEndcap(gctx, pVector, 1);
76 return pVector;
77}

◆ 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 175 of file ActsLayerBuilder.h.

◆ m_logger

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

logging instance

Definition at line 188 of file ActsLayerBuilder.h.


The documentation for this class was generated from the following files: