421 ATH_MSG_VERBOSE(
" build LayerArray with " << planeLayersInput.size() <<
" plane-like material layers." );
424 std::unique_ptr<Trk::BinnedArray1D<Trk::Layer>>
planeLayerArray =
nullptr;
425 std::vector< std::pair< std::shared_ptr<Trk::Layer>,
Amg::Vector3D> > layerOrderVector;
429 std::vector<Trk::PlaneLayer*> planeLayers(planeLayersInput);
431 auto sortBegin = planeLayers.begin();
432 auto sortEnd = planeLayers.end();
438 ATH_MSG_WARNING(
"Plane Layers can only be sorted in x/y/z. Returning 0.");
444 auto layIter = planeLayers.begin();
452 unsigned int layers = planeLayers.size();
454 for ( ; layIter != planeLayers.end(); ++layIter) {
457 ATH_MSG_VERBOSE(
"equidistant : registering plane-like MaterialLayer at position : " << layerSurface.
center() );
459 layerOrderVector.emplace_back(
460 std::shared_ptr<Layer>(*layIter),
466 planeLayerArray = std::make_unique<Trk::BinnedArray1D<Trk::Layer>>(layerOrderVector, binUtility);
474 unsigned int layers = planeLayers.size();
476 double posStep = (posmax-posmin)/(
layers+1);
478 double currentPos = posmin + posStep;
479 double lastPos = posmin;
481 double minHalfX = 0.;
482 double maxHalfX = 0.;
485 double layerThickness = 0.;
488 for ( ; layIter != planeLayers.end() ; ++layIter) {
513 layerThickness = ((*layIter)->thickness() > layerThickness ) ? (*layIter)->thickness() : layerThickness;
516 double navigationPos = 0.5*(currentPos+lastPos);
517 double navigationX = (bv ==
Trk::binX) ? navigationPos : 0.;
518 double navigationY = (bv ==
Trk::binY) ? navigationPos : 0.;
519 double navigationZ = (bv ==
Trk::binZ) ? navigationPos : 0.;
522 std::unique_ptr<Trk::PlaneSurface> navLayerSurface =
nullptr;
525 if (std::abs(minHalfX)<10
e-5) {
526 navLayerSurface = std::make_unique<Trk::PlaneSurface>(navLayerTransform,
530 navLayerSurface = std::make_unique<Trk::PlaneSurface>(navLayerTransform,
536 ATH_MSG_VERBOSE(
"bi-equidistant : creating plane-like NavigationLayer at position : " << navigationX );
538 layerOrderVector.emplace_back(std::make_shared<Trk::NavigationLayer>(std::move(navLayerSurface)),
541 lastPos = currentPos;
544 ATH_MSG_VERBOSE(
"bi-equidistant : registering plane-like MaterialLayer at position : " << currentPos );
545 layerOrderVector.emplace_back(
546 std::shared_ptr<Trk::Layer>(*layIter),
550 currentPos += posStep;
554 double navigationPosFinal = 0.5*(currentPos+lastPos);
555 double navigationXFinal = (bv ==
Trk::binX) ? navigationPosFinal : 0.;
556 double navigationYFinal = (bv ==
Trk::binY) ? navigationPosFinal : 0.;
557 double navigationZFinal = (bv ==
Trk::binZ) ? navigationPosFinal : 0.;
561 auto navLayerSurface = (std::abs(minHalfX)<10
e-5) ?
562 std::make_unique<Trk::PlaneSurface>(navLayerTransform, maxHalfX,halfY) :
563 std::make_unique<Trk::PlaneSurface>(navLayerTransform, minHalfX, maxHalfX, halfY);
565 ATH_MSG_VERBOSE(
"bi-equidistant : creating plane-like NavigationLayer at position : " << navLayerSurface->
center() );
567 layerOrderVector.emplace_back(std::make_shared<Trk::NavigationLayer>(std::move(navLayerSurface)),
574 planeLayerArray = std::make_unique<Trk::BinnedArray1D<Trk::Layer>>(layerOrderVector, binUtility);
582 std::vector<float> boundaries;
583 boundaries.push_back(posmin);
585 double minHalfX = 0.;
586 double maxHalfX = 0.;
590 for ( ; layIter != planeLayers.end(); ++layIter) {
616 layerCenter = layerSurface.
center();
617 double layerPosition = layerCenter[bv];
619 double layerThickness = (*layIter)->thickness();
621 boundaries.push_back(layerPosition-0.5*layerThickness);
622 double navLayerPositionX = (bv ==
Trk::binX) ? 0.5*(layerPosition+boundaries[boundaries.size()-1]) : layerCenter.x();
623 double navLayerPositionY = (bv ==
Trk::binY) ? 0.5*(layerPosition+boundaries[boundaries.size()-1]) : layerCenter.y();
624 double navLayerPositionZ = (bv ==
Trk::binZ) ? 0.5*(layerPosition+boundaries[boundaries.size()-1]) : layerCenter.z();
625 Amg::Translation3D navLayerPosition(navLayerPositionX,navLayerPositionY,navLayerPositionZ);
628 auto navLayerSurface = (std::abs(minHalfX)<10
e-5) ?
629 std::make_unique<Trk::PlaneSurface>( navLayerTransform, maxHalfX, halfY ) :
630 std::make_unique<Trk::PlaneSurface>( navLayerTransform, minHalfX, maxHalfX, halfY );
631 ATH_MSG_VERBOSE(
"arbitrary : creating plane-like NavigationLayer at position : " << navLayerPositionX );
632 layerOrderVector.emplace_back(
633 std::make_shared<Trk::NavigationLayer>(std::move(navLayerSurface)),
634 Amg::Vector3D(navLayerPositionX, navLayerPositionY, navLayerPositionZ));
636 boundaries.push_back(layerPosition+0.5*layerThickness);
638 layerOrderVector.emplace_back(
639 std::shared_ptr<Trk::Layer>(*layIter),
644 double navLayerPositionXFinal = (bv ==
Trk::binX) ? 0.5*(posmax+boundaries[boundaries.size()-1]) : layerCenter.x();
645 double navLayerPositionYFinal = (bv ==
Trk::binY) ? 0.5*(posmax+boundaries[boundaries.size()-1]) : layerCenter.y();
646 double navLayerPositionZFinal = (bv ==
Trk::binZ) ? 0.5*(posmax+boundaries[boundaries.size()-1]) : layerCenter.z();
647 Amg::Translation3D navLayerPositionFinal(navLayerPositionXFinal,navLayerPositionYFinal,navLayerPositionZFinal);
650 auto navLayerSurfaceFinal = (std::abs(minHalfX)<10
e-5) ?
651 std::make_unique<Trk::PlaneSurface>( navLayerTransformFinal, maxHalfX, halfY ) :
652 std::make_unique<Trk::PlaneSurface>( navLayerTransformFinal, minHalfX, maxHalfX, halfY );
653 ATH_MSG_VERBOSE(
"arbitrary : creating plane-like NavigationLayer at position : " << 0.5*(posmax+boundaries[boundaries.size()-1]) );
654 layerOrderVector.emplace_back(std::make_shared<Trk::NavigationLayer>(std::move(navLayerSurfaceFinal)),
655 Amg::Vector3D(navLayerPositionXFinal, navLayerPositionYFinal, navLayerPositionZFinal));
657 ATH_MSG_VERBOSE( layerOrderVector.size() <<
" plane Layers (material + navigation) built. " );
662 planeLayerArray = std::make_unique<Trk::BinnedArray1D<Trk::Layer>>(layerOrderVector, binUtility);