ATLAS Offline Software
Loading...
Searching...
No Matches
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
36using Acts::Surface;
37using Acts::Transform3;
38using Acts::Translation3;
39
40using 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
52const Acts::LayerVector
53ActsLayerBuilder::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
60const Acts::LayerVector
61ActsLayerBuilder::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
68const Acts::LayerVector
69ActsLayerBuilder::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
76std::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
108void 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
124 if(m_cfg.mode == Mode::ITkPixelInner) {
125 if(id.layer_disk() >= 2) continue;
126 }
127 if(m_cfg.mode == Mode::ITkPixelOuter) {
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 ||
290 m_cfg.mode == Mode::ITkPixelOuter) {
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>(
325 m_cfg.passiveBarrelLayerRadii.at(icl), m_cfg.passiveBarrelLayerHalflengthZ.at(icl));
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
336void 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
355 if(m_cfg.mode == Mode::ITkPixelInner) {
356 if(id.layer_disk() >= 3) continue;
357 }
358 if(m_cfg.mode == Mode::ITkPixelOuter) {
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
605std::ostream& operator<<(std::ostream& os, const ActsLayerBuilder::Mode& mode) {
606
607 using Mode = ActsLayerBuilder::Mode;
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}
#define M_PI
std::ostream & operator<<(std::ostream &os, const ActsLayerBuilder::Mode &mode)
static Double_t a
static Double_t ss
void buildBarrel(const Acts::GeometryContext &gctx, Acts::LayerVector &layersOutput) const
const Acts::LayerVector centralLayers(const Acts::GeometryContext &gctx) const override
void buildEndcap(const Acts::GeometryContext &gctx, Acts::LayerVector &layersOutput, int type=0) const
std::unique_ptr< const Acts::Logger > m_logger
logging instance
const Acts::LayerVector positiveLayers(const Acts::GeometryContext &gctx) const override
const Acts::LayerVector negativeLayers(const Acts::GeometryContext &gctx) const override
std::vector< std::shared_ptr< const ActsDetectorElement > > getDetectorElements() const
const Acts::Logger & logger() const
Private access to the logger.
ActsLayerBuilder(const Config &cfg, std::unique_ptr< const Acts::Logger > logger=Acts::getDefaultLogger("GMLayBldr", Acts::Logging::INFO))
Constructor.
Config m_cfg
configuration object
DataModel_detail::const_iterator< DataVector > const_iterator
Definition DataVector.h:838
Class to hold geometrical description of a silicon detector element.
Base class for Pixel and SCT Detector managers.
bool exists(const std::string &filename)
does a file exist
static Root::TMsgLogger logger("iLumiCalc")
@ layer
Definition HitInfo.h:79
STL namespace.
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)
nested configuration struct for steering of the layer builder