35 const std::vector<Trk::CylinderLayer*>& cylLayersInput,
38 ATH_MSG_VERBOSE(
" build LayerArray with " << cylLayersInput.size() <<
" cylindrical material layers." );
42 std::vector<Trk::CylinderLayer*> cylLayers(cylLayersInput);
45 std::sort(cylLayers.begin(), cylLayers.end(), rSorter);
50 std::vector< std::pair<std::shared_ptr<Trk::Layer>,
Amg::Vector3D> > layerOrderVector;
58 unsigned int layers = cylLayers.size();
60 for (
auto& layIter : cylLayers ) {
63 double currentR = layerSurface.
bounds().
r();
64 ATH_MSG_VERBOSE(
"equidistant : registering cylindrical MaterialLayer at radius : " << currentR );
65 layerOrderVector.emplace_back(std::shared_ptr<Layer>(layIter),
70 ATH_MSG_VERBOSE(
"equidistant : created a BinUtility as " << binUtility );
73 cylinderLayerArray = std::make_unique<Trk::BinnedArray1D<Trk::Layer>>(layerOrderVector, binUtility);
81 unsigned int layers = cylLayers.size();
83 double layerThickness = cylLayers[0]->thickness();
85 double radialStep = (rmax-rmin)/(layers-1);
87 double navigationR = 0.;
88 double navLayerHalflengthZ = 0.;
92 for (
auto& layIter : cylLayers ) {
95 layerTransform = layerSurface.
transform().isApprox(Amg::Transform3D::Identity()) ? nullptr : &layerSurface.
transform();
97 double currentR = layerSurface.
bounds().
r();
98 navigationR = currentR - 0.5*radialStep;
101 ATH_MSG_VERBOSE(
"bi-equidistant : creating cylindrical NavigationLayer at radius : " << navigationR );
102 auto navLayerSurface =
103 layerTransform ? std::make_unique<Trk::CylinderSurface>(
105 : std::make_unique<Trk::CylinderSurface>(
106 navigationR, navLayerHalflengthZ);
108 auto navLayer = std::make_shared<Trk::NavigationLayer>(std::move(navLayerSurface));
110 layerOrderVector.emplace_back(std::move(navLayer),
112 ATH_MSG_VERBOSE(
"bi-equidistant : registering cylindrical MaterialLayer at radius : " << currentR );
114 layerOrderVector.emplace_back(std::shared_ptr<Trk::Layer>(layIter),
119 ATH_MSG_VERBOSE(
"bi-equidistant : creating cylindrical NavigationLayer at radius : " << navigationR+radialStep);
120 auto navLayerSurfacFinal = layerTransform ?
121 std::make_unique<Trk::CylinderSurface>(
122 Amg::Transform3D(*layerTransform), navigationR+radialStep, navLayerHalflengthZ) :
123 std::make_unique<Trk::CylinderSurface>(navigationR+radialStep, navLayerHalflengthZ);
125 auto navLayer = std::make_shared<Trk::NavigationLayer>(std::move(navLayerSurfacFinal));
127 layerOrderVector.emplace_back(std::move(navLayer),
130 ATH_MSG_VERBOSE( layerOrderVector.size() <<
" cylindrical Layers (material + navigation) built. " );
133 double rMinBoundary = rmin-radialStep+0.5*layerThickness;
134 double rMaxBoundary = rmax+radialStep+0.5*layerThickness;
136 ATH_MSG_VERBOSE(
"bi-equidistant : created a BinUtility as " << binUtility );
139 cylinderLayerArray = std::make_unique<Trk::BinnedArray1D<Trk::Layer>>(layerOrderVector, binUtility);
146 std::vector<float> boundaries;
148 double halfLengthZ = 0;
152 boundaries.push_back(rmin);
155 for (
auto& layIter : cylLayers) {
158 layerTransform = layerSurface.
transform().isApprox(Amg::Transform3D::Identity()) ? nullptr : &layerSurface.
transform();
162 double layerRadius = layerSurface.
bounds().
r();
163 double layerThickness = layIter->thickness();
165 double navLayerRadius = 0.5*( (layerRadius-0.5*layerThickness) + boundaries[boundaries.size()-1] );
166 auto navLayerSurface = layerTransform ?
167 std::make_unique<Trk::CylinderSurface>(
169 std::make_unique<Trk::CylinderSurface>(navLayerRadius, halfLengthZ);
173 ATH_MSG_VERBOSE(
"arbitrary : creating cylindrical NavigationLayer at radius : " << navLayerRadius );
174 layerOrderVector.emplace_back(
175 std::make_shared<Trk::NavigationLayer>(std::move(navLayerSurface)),
177 ATH_MSG_VERBOSE(
"arbitrary : registering cylindrical MaterialLayer at radius :" << layerRadius );
178 layerOrderVector.emplace_back(
179 std::shared_ptr<Trk::Layer>(cylinderLayer),
181 boundaries.push_back(layerRadius-0.5*layerThickness);
182 boundaries.push_back(layerRadius+0.5*layerThickness);
184 ATH_MSG_VERBOSE(
"arbitrary : empty layer configuration cancelled this building of navigation layer.");
188 double navLayerRadiusFinal = 0.5*(rmax+boundaries[boundaries.size()-1]);
189 auto navLayerSurfaceFinal = layerTransform ?
190 std::make_unique<Trk::CylinderSurface>(
192 std::make_unique<Trk::CylinderSurface>(navLayerRadiusFinal, halfLengthZ);
193 boundaries.push_back(rmax);
194 ATH_MSG_VERBOSE(
"arbitrary : creating cylindrical NavigationLayer at radius : " << navLayerRadiusFinal );
195 layerOrderVector.emplace_back(std::make_shared<Trk::NavigationLayer>(std::move(navLayerSurfaceFinal)),
198 ATH_MSG_VERBOSE( layerOrderVector.size() <<
" cylindrical Layers (material + navigation) built. " );
201 ATH_MSG_VERBOSE(
"arbitrary : created a BinUtility as " << binUtility );
204 cylinderLayerArray = std::make_unique<Trk::BinnedArray1D<Trk::Layer>>(layerOrderVector, binUtility);
209 default : {
return nullptr; }
217 const std::vector<Trk::DiscLayer*>& discLayersInput,
223 ATH_MSG_VERBOSE(
" build LayerArray with " << discLayersInput.size() <<
" disc-like material layers." );
227 std::unique_ptr<Trk::BinnedArray1D<Trk::Layer>>
discLayerArray =
nullptr;
228 std::vector<std::pair<std::shared_ptr<Trk::Layer>,
Amg::Vector3D>> layerOrderVector;
231 std::vector<Trk::DiscLayer*> discLayers(discLayersInput);
234 std::sort(discLayers.begin(), discLayers.end(), zSorter);
244 size_t layers = discLayers.size();
250 ATH_MSG_VERBOSE(
"equidistant : registering disc-like MaterialLayer at z-Position : " << layerSurface.
center().z() );
251 layerOrderVector.emplace_back(std::shared_ptr<Layer>(discLayer),
256 ATH_MSG_VERBOSE(
"equidistant : created a BinUtility as " << binUtility );
259 discLayerArray = std::make_unique<Trk::BinnedArray1D<Trk::Layer>>(layerOrderVector, binUtility);
267 unsigned int layers = discLayers.size();
269 double layerThickness = discLayers[0]->thickness();
270 ATH_MSG_VERBOSE(
"bi-equidistant : zmin / zmax re-evaluated as = " << zmin <<
" / " << zmax );
272 double zStep = (zmax-zmin)/(layers-1);
277 double navigationZ = 0.;
279 for (
auto& layIter : discLayers) {
282 double currentZ = layerSurface.
center().z();
284 navigationZ = currentZ - 0.5*(zStep);
286 auto navLayerSurface = std::make_unique<Trk::DiscSurface>(navLayerTransform, minR, maxR);
288 ATH_MSG_VERBOSE(
"bi-equidistant : creating disc-like NavigationLayer at z-Position : " << navigationZ );
290 layerOrderVector.emplace_back(
291 std::make_shared<Trk::NavigationLayer>(std::move(navLayerSurface)),
296 minR = dbounds->
rMin();
297 maxR = dbounds->
rMax();
303 ATH_MSG_VERBOSE(
"bi-equidistant : registering disc-like MaterialLayer at z-Position : " << currentZ );
304 layerOrderVector.emplace_back(std::shared_ptr<Trk::Layer>(layIter),
308 ATH_MSG_VERBOSE(
"bi-equidistant : creating disc-like NavigationLayer at z-Position : " << navigationZ + zStep );
310 auto navLayerSurface = std::make_unique<Trk::DiscSurface>(navLayerTransform, minR, maxR);
312 layerOrderVector.emplace_back(std::make_shared<Trk::NavigationLayer>(std::move(navLayerSurface)),
315 ATH_MSG_VERBOSE( layerOrderVector.size() <<
" disc Layers (material + navigation) built. " );
318 double zminBoundary = zmin-zStep+0.5*layerThickness;
319 double zmaxBoundary = zmax+zStep+0.5*layerThickness;
321 ATH_MSG_VERBOSE(
"bi-equidistant : created a BinUtility as " << binUtility );
324 discLayerArray = std::make_unique<Trk::BinnedArray1D<Trk::Layer>>(layerOrderVector, binUtility);
331 std::vector<float> boundaries;
338 boundaries.push_back(zmin);
341 for (
auto& layIter : discLayers ) {
347 double layInnerR = dbounds->
rMin();
348 double layOuterR = dbounds->
rMax();
349 minR = (layInnerR < minR) ? layInnerR : minR;
350 maxR = (layOuterR > maxR) ? layOuterR : maxR;
356 double layerPositionZ = layerSurface.
center().z();
357 double layerThickness = layIter->thickness();
359 double navLayerPositionZ = 0.5*((layerPositionZ-0.5*layerThickness)+boundaries[boundaries.size()-1]);
363 auto navLayerSurface = std::make_unique<Trk::DiscSurface>(navLayerTransform, minR, maxR);
368 ATH_MSG_VERBOSE(
"arbitrary : creating disc-like NavigationLayer at z-Position : " << navLayerPositionZ );
369 layerOrderVector.emplace_back(std::make_shared<Trk::NavigationLayer>(std::move(navLayerSurface)),
371 ATH_MSG_VERBOSE(
"arbitrary : registering disc-like MaterialLayer at z-Position : " << layerPositionZ );
372 layerOrderVector.emplace_back(
373 std::shared_ptr<Trk::Layer>(discLayer),
375 boundaries.push_back(layerPositionZ-0.5*layerThickness);
376 boundaries.push_back(layerPositionZ+0.5*layerThickness);
378 ATH_MSG_VERBOSE(
"arbitrary : empty layer configuration cancelled this building of navigation layer.");
382 double navLayerPositionZFinal = 0.5*(zmax+boundaries[boundaries.size()-1]);
385 auto navLayerSurfaceFinal = std::make_unique<Trk::DiscSurface>(navLayerTransformFinal, minR, maxR);
386 ATH_MSG_VERBOSE(
"arbitrary : creating disc-like NavigationLayer at z-Position : " << navLayerPositionZFinal );
387 layerOrderVector.emplace_back(std::make_shared<Trk::NavigationLayer>(std::move(navLayerSurfaceFinal)),
389 ATH_MSG_VERBOSE( layerOrderVector.size() <<
" disc Layers (material + navigation) built. " );
391 boundaries.push_back(zmax);
394 ATH_MSG_VERBOSE(
"arbitrary : created a BinUtility as " << binUtility );
398 discLayerArray = std::make_unique<Trk::BinnedArray1D<Trk::Layer>>(layerOrderVector, binUtility);
403 default : {
return nullptr; }
411 const std::vector<Trk::PlaneLayer*>& planeLayersInput,
417 ATH_MSG_VERBOSE(
" build LayerArray with " << planeLayersInput.size() <<
" plane-like material layers." );
420 std::unique_ptr<Trk::BinnedArray1D<Trk::Layer>>
planeLayerArray =
nullptr;
421 std::vector< std::pair< std::shared_ptr<Trk::Layer>,
Amg::Vector3D> > layerOrderVector;
425 std::vector<Trk::PlaneLayer*> planeLayers(planeLayersInput);
427 auto sortBegin = planeLayers.begin();
428 auto sortEnd = planeLayers.end();
434 ATH_MSG_WARNING(
"Plane Layers can only be sorted in x/y/z. Returning 0.");
440 auto layIter = planeLayers.begin();
448 unsigned int layers = planeLayers.size();
450 for ( ; layIter != planeLayers.end(); ++layIter) {
453 ATH_MSG_VERBOSE(
"equidistant : registering plane-like MaterialLayer at position : " << layerSurface.
center() );
455 layerOrderVector.emplace_back(
456 std::shared_ptr<Layer>(*layIter),
462 planeLayerArray = std::make_unique<Trk::BinnedArray1D<Trk::Layer>>(layerOrderVector, binUtility);
470 unsigned int layers = planeLayers.size();
472 double posStep = (posmax-posmin)/(layers+1);
474 double currentPos = posmin + posStep;
475 double lastPos = posmin;
477 double minHalfX = 0.;
478 double maxHalfX = 0.;
481 double layerThickness = 0.;
484 for ( ; layIter != planeLayers.end() ; ++layIter) {
509 layerThickness = ((*layIter)->thickness() > layerThickness ) ? (*layIter)->thickness() : layerThickness;
512 double navigationPos = 0.5*(currentPos+lastPos);
513 double navigationX = (bv ==
Trk::binX) ? navigationPos : 0.;
514 double navigationY = (bv ==
Trk::binY) ? navigationPos : 0.;
515 double navigationZ = (bv ==
Trk::binZ) ? navigationPos : 0.;
518 std::unique_ptr<Trk::PlaneSurface> navLayerSurface =
nullptr;
521 if (std::abs(minHalfX)<10e-5) {
522 navLayerSurface = std::make_unique<Trk::PlaneSurface>(navLayerTransform,
526 navLayerSurface = std::make_unique<Trk::PlaneSurface>(navLayerTransform,
532 ATH_MSG_VERBOSE(
"bi-equidistant : creating plane-like NavigationLayer at position : " << navigationX );
534 layerOrderVector.emplace_back(std::make_shared<Trk::NavigationLayer>(std::move(navLayerSurface)),
537 lastPos = currentPos;
540 ATH_MSG_VERBOSE(
"bi-equidistant : registering plane-like MaterialLayer at position : " << currentPos );
541 layerOrderVector.emplace_back(
542 std::shared_ptr<Trk::Layer>(*layIter),
546 currentPos += posStep;
550 double navigationPosFinal = 0.5*(currentPos+lastPos);
551 double navigationXFinal = (bv ==
Trk::binX) ? navigationPosFinal : 0.;
552 double navigationYFinal = (bv ==
Trk::binY) ? navigationPosFinal : 0.;
553 double navigationZFinal = (bv ==
Trk::binZ) ? navigationPosFinal : 0.;
557 auto navLayerSurface = (std::abs(minHalfX)<10e-5) ?
558 std::make_unique<Trk::PlaneSurface>(navLayerTransform, maxHalfX,halfY) :
559 std::make_unique<Trk::PlaneSurface>(navLayerTransform, minHalfX, maxHalfX, halfY);
561 ATH_MSG_VERBOSE(
"bi-equidistant : creating plane-like NavigationLayer at position : " << navLayerSurface->center() );
563 layerOrderVector.emplace_back(std::make_shared<Trk::NavigationLayer>(std::move(navLayerSurface)),
570 planeLayerArray = std::make_unique<Trk::BinnedArray1D<Trk::Layer>>(layerOrderVector, binUtility);
578 std::vector<float> boundaries;
579 boundaries.push_back(posmin);
581 double minHalfX = 0.;
582 double maxHalfX = 0.;
586 for ( ; layIter != planeLayers.end(); ++layIter) {
612 layerCenter = layerSurface.
center();
613 double layerPosition = layerCenter[bv];
615 double layerThickness = (*layIter)->thickness();
617 boundaries.push_back(layerPosition-0.5*layerThickness);
618 double navLayerPositionX = (bv ==
Trk::binX) ? 0.5*(layerPosition+boundaries[boundaries.size()-1]) : layerCenter.x();
619 double navLayerPositionY = (bv ==
Trk::binY) ? 0.5*(layerPosition+boundaries[boundaries.size()-1]) : layerCenter.y();
620 double navLayerPositionZ = (bv ==
Trk::binZ) ? 0.5*(layerPosition+boundaries[boundaries.size()-1]) : layerCenter.z();
621 Amg::Translation3D navLayerPosition(navLayerPositionX,navLayerPositionY,navLayerPositionZ);
624 auto navLayerSurface = (std::abs(minHalfX)<10e-5) ?
625 std::make_unique<Trk::PlaneSurface>( navLayerTransform, maxHalfX, halfY ) :
626 std::make_unique<Trk::PlaneSurface>( navLayerTransform, minHalfX, maxHalfX, halfY );
627 ATH_MSG_VERBOSE(
"arbitrary : creating plane-like NavigationLayer at position : " << navLayerPositionX );
628 layerOrderVector.emplace_back(
629 std::make_shared<Trk::NavigationLayer>(std::move(navLayerSurface)),
630 Amg::Vector3D(navLayerPositionX, navLayerPositionY, navLayerPositionZ));
632 boundaries.push_back(layerPosition+0.5*layerThickness);
634 layerOrderVector.emplace_back(
635 std::shared_ptr<Trk::Layer>(*layIter),
640 double navLayerPositionXFinal = (bv ==
Trk::binX) ? 0.5*(posmax+boundaries[boundaries.size()-1]) : layerCenter.x();
641 double navLayerPositionYFinal = (bv ==
Trk::binY) ? 0.5*(posmax+boundaries[boundaries.size()-1]) : layerCenter.y();
642 double navLayerPositionZFinal = (bv ==
Trk::binZ) ? 0.5*(posmax+boundaries[boundaries.size()-1]) : layerCenter.z();
643 Amg::Translation3D navLayerPositionFinal(navLayerPositionXFinal,navLayerPositionYFinal,navLayerPositionZFinal);
646 auto navLayerSurfaceFinal = (std::abs(minHalfX)<10e-5) ?
647 std::make_unique<Trk::PlaneSurface>( navLayerTransformFinal, maxHalfX, halfY ) :
648 std::make_unique<Trk::PlaneSurface>( navLayerTransformFinal, minHalfX, maxHalfX, halfY );
649 ATH_MSG_VERBOSE(
"arbitrary : creating plane-like NavigationLayer at position : " << 0.5*(posmax+boundaries[boundaries.size()-1]) );
650 layerOrderVector.emplace_back(std::make_shared<Trk::NavigationLayer>(std::move(navLayerSurfaceFinal)),
651 Amg::Vector3D(navLayerPositionXFinal, navLayerPositionYFinal, navLayerPositionZFinal));
653 ATH_MSG_VERBOSE( layerOrderVector.size() <<
" plane Layers (material + navigation) built. " );
658 planeLayerArray = std::make_unique<Trk::BinnedArray1D<Trk::Layer>>(layerOrderVector, binUtility);
662 default : {
return nullptr; }