32 declareInterface<ILayerArrayCreator>(
this);
45 ATH_MSG_VERBOSE(
" build LayerArray with " << cylLayersInput.size() <<
" cylindrical material layers." );
49 std::vector<Trk::CylinderLayer*> cylLayers(cylLayersInput);
52 std::sort(cylLayers.begin(), cylLayers.end(), rSorter);
57 std::vector< std::pair<std::shared_ptr<Trk::Layer>,
Amg::Vector3D> > layerOrderVector;
65 unsigned int layers = cylLayers.size();
67 for (
auto& layIter : cylLayers ) {
70 double currentR = layerSurface.
bounds().
r();
71 ATH_MSG_VERBOSE(
"equidistant : registering cylindrical MaterialLayer at radius : " << currentR );
72 layerOrderVector.emplace_back(std::shared_ptr<Layer>(layIter),
77 ATH_MSG_VERBOSE(
"equidistant : created a BinUtility as " << binUtility );
88 unsigned int layers = cylLayers.size();
90 double layerThickness = cylLayers[0]->thickness();
92 double radialStep = (rmax-rmin)/(
layers-1);
94 double navigationR = 0.;
95 double navLayerHalflengthZ = 0.;
99 for (
auto& layIter : cylLayers ) {
102 layerTransform = layerSurface.
transform().isApprox(Amg::Transform3D::Identity()) ?
nullptr : &layerSurface.
transform();
104 double currentR = layerSurface.
bounds().
r();
105 navigationR = currentR - 0.5*radialStep;
108 ATH_MSG_VERBOSE(
"bi-equidistant : creating cylindrical NavigationLayer at radius : " << navigationR );
109 auto navLayerSurface =
110 layerTransform ? std::make_unique<Trk::CylinderSurface>(
112 : std::make_unique<Trk::CylinderSurface>(
113 navigationR, navLayerHalflengthZ);
115 auto navLayer = std::make_shared<Trk::NavigationLayer>(std::move(navLayerSurface));
117 layerOrderVector.emplace_back(std::move(navLayer),
119 ATH_MSG_VERBOSE(
"bi-equidistant : registering cylindrical MaterialLayer at radius : " << currentR );
121 layerOrderVector.emplace_back(std::shared_ptr<Trk::Layer>(layIter),
126 ATH_MSG_VERBOSE(
"bi-equidistant : creating cylindrical NavigationLayer at radius : " << navigationR+radialStep);
127 auto navLayerSurfacFinal = layerTransform ?
128 std::make_unique<Trk::CylinderSurface>(
129 Amg::Transform3D(*layerTransform), navigationR+radialStep, navLayerHalflengthZ) :
130 std::make_unique<Trk::CylinderSurface>(navigationR+radialStep, navLayerHalflengthZ);
132 auto navLayer = std::make_shared<Trk::NavigationLayer>(std::move(navLayerSurfacFinal));
134 layerOrderVector.emplace_back(std::move(navLayer),
137 ATH_MSG_VERBOSE( layerOrderVector.size() <<
" cylindrical Layers (material + navigation) built. " );
140 double rMinBoundary = rmin-radialStep+0.5*layerThickness;
141 double rMaxBoundary = rmax+radialStep+0.5*layerThickness;
143 ATH_MSG_VERBOSE(
"bi-equidistant : created a BinUtility as " << binUtility );
153 std::vector<float> boundaries;
155 double halfLengthZ = 0;
159 boundaries.push_back(rmin);
162 for (
auto& layIter : cylLayers) {
165 layerTransform = layerSurface.
transform().isApprox(Amg::Transform3D::Identity()) ? nullptr : &layerSurface.
transform();
169 double layerRadius = layerSurface.
bounds().
r();
170 double layerThickness = layIter->thickness();
172 double navLayerRadius = 0.5*( (layerRadius-0.5*layerThickness) + boundaries[boundaries.size()-1] );
173 auto navLayerSurface = layerTransform ?
174 std::make_unique<Trk::CylinderSurface>(
176 std::make_unique<Trk::CylinderSurface>(navLayerRadius, halfLengthZ);
178 cylinderLayer = checkAndReplaceEmptyLayer(layIter);
180 ATH_MSG_VERBOSE(
"arbitrary : creating cylindrical NavigationLayer at radius : " << navLayerRadius );
181 layerOrderVector.emplace_back(
182 std::make_shared<Trk::NavigationLayer>(std::move(navLayerSurface)),
184 ATH_MSG_VERBOSE(
"arbitrary : registering cylindrical MaterialLayer at radius :" << layerRadius );
185 layerOrderVector.emplace_back(
186 std::shared_ptr<Trk::Layer>(cylinderLayer),
188 boundaries.push_back(layerRadius-0.5*layerThickness);
189 boundaries.push_back(layerRadius+0.5*layerThickness);
191 ATH_MSG_VERBOSE(
"arbitrary : empty layer configuration cancelled this building of navigation layer.");
195 double navLayerRadiusFinal = 0.5*(rmax+boundaries[boundaries.size()-1]);
196 auto navLayerSurfaceFinal = layerTransform ?
197 std::make_unique<Trk::CylinderSurface>(
199 std::make_unique<Trk::CylinderSurface>(navLayerRadiusFinal, halfLengthZ);
200 boundaries.push_back(rmax);
201 ATH_MSG_VERBOSE(
"arbitrary : creating cylindrical NavigationLayer at radius : " << navLayerRadiusFinal );
202 layerOrderVector.emplace_back(std::make_shared<Trk::NavigationLayer>(std::move(navLayerSurfaceFinal)),
205 ATH_MSG_VERBOSE( layerOrderVector.size() <<
" cylindrical Layers (material + navigation) built. " );
208 ATH_MSG_VERBOSE(
"arbitrary : created a BinUtility as " << binUtility );
219 return cylinderLayerArray;
229 ATH_MSG_VERBOSE(
" build LayerArray with " << discLayersInput.size() <<
" disc-like material layers." );
234 std::vector<std::pair<std::shared_ptr<Trk::Layer>,
Amg::Vector3D>> layerOrderVector;
237 std::vector<Trk::DiscLayer*> discLayers(discLayersInput);
240 std::sort(discLayers.begin(), discLayers.end(), zSorter);
250 size_t layers = discLayers.size();
253 discLayer = checkAndReplaceEmptyLayer(layIter);
256 ATH_MSG_VERBOSE(
"equidistant : registering disc-like MaterialLayer at z-Position : " << layerSurface.
center().z() );
257 layerOrderVector.emplace_back(std::shared_ptr<Layer>(discLayer),
262 ATH_MSG_VERBOSE(
"equidistant : created a BinUtility as " << binUtility );
273 unsigned int layers = discLayers.size();
275 double layerThickness = discLayers[0]->thickness();
283 double navigationZ = 0.;
285 for (
auto& layIter : discLayers) {
288 double currentZ = layerSurface.
center().z();
290 navigationZ = currentZ - 0.5*(zStep);
292 auto navLayerSurface = std::make_unique<Trk::DiscSurface>(navLayerTransform, minR, maxR);
294 ATH_MSG_VERBOSE(
"bi-equidistant : creating disc-like NavigationLayer at z-Position : " << navigationZ );
296 layerOrderVector.emplace_back(
297 std::make_shared<Trk::NavigationLayer>(std::move(navLayerSurface)),
302 minR = dbounds->
rMin();
303 maxR = dbounds->
rMax();
309 ATH_MSG_VERBOSE(
"bi-equidistant : registering disc-like MaterialLayer at z-Position : " << currentZ );
310 layerOrderVector.emplace_back(std::shared_ptr<Trk::Layer>(layIter),
314 ATH_MSG_VERBOSE(
"bi-equidistant : creating disc-like NavigationLayer at z-Position : " << navigationZ + zStep );
316 auto navLayerSurface = std::make_unique<Trk::DiscSurface>(navLayerTransform, minR, maxR);
318 layerOrderVector.emplace_back(std::make_shared<Trk::NavigationLayer>(std::move(navLayerSurface)),
321 ATH_MSG_VERBOSE( layerOrderVector.size() <<
" disc Layers (material + navigation) built. " );
324 double zminBoundary =
zmin-zStep+0.5*layerThickness;
325 double zmaxBoundary =
zmax+zStep+0.5*layerThickness;
327 ATH_MSG_VERBOSE(
"bi-equidistant : created a BinUtility as " << binUtility );
337 std::vector<float> boundaries;
344 boundaries.push_back(
zmin);
347 for (
auto& layIter : discLayers ) {
353 double layInnerR = dbounds->
rMin();
354 double layOuterR = dbounds->
rMax();
355 minR = (layInnerR < minR) ? layInnerR : minR;
356 maxR = (layOuterR > maxR) ? layOuterR : maxR;
362 double layerPositionZ = layerSurface.
center().z();
363 double layerThickness = layIter->thickness();
365 double navLayerPositionZ = 0.5*((layerPositionZ-0.5*layerThickness)+boundaries[boundaries.size()-1]);
369 auto navLayerSurface = std::make_unique<Trk::DiscSurface>(navLayerTransform, minR, maxR);
372 discLayer = checkAndReplaceEmptyLayer(layIter);
374 ATH_MSG_VERBOSE(
"arbitrary : creating disc-like NavigationLayer at z-Position : " << navLayerPositionZ );
375 layerOrderVector.emplace_back(std::make_shared<Trk::NavigationLayer>(std::move(navLayerSurface)),
377 ATH_MSG_VERBOSE(
"arbitrary : registering disc-like MaterialLayer at z-Position : " << layerPositionZ );
378 layerOrderVector.emplace_back(
379 std::shared_ptr<Trk::Layer>(discLayer),
381 boundaries.push_back(layerPositionZ-0.5*layerThickness);
382 boundaries.push_back(layerPositionZ+0.5*layerThickness);
384 ATH_MSG_VERBOSE(
"arbitrary : empty layer configuration cancelled this building of navigation layer.");
388 double navLayerPositionZFinal = 0.5*(
zmax+boundaries[boundaries.size()-1]);
391 auto navLayerSurfaceFinal = std::make_unique<Trk::DiscSurface>(navLayerTransformFinal, minR, maxR);
392 ATH_MSG_VERBOSE(
"arbitrary : creating disc-like NavigationLayer at z-Position : " << navLayerPositionZFinal );
393 layerOrderVector.emplace_back(std::make_shared<Trk::NavigationLayer>(std::move(navLayerSurfaceFinal)),
395 ATH_MSG_VERBOSE( layerOrderVector.size() <<
" disc Layers (material + navigation) built. " );
397 boundaries.push_back(
zmax);
400 ATH_MSG_VERBOSE(
"arbitrary : created a BinUtility as " << binUtility );
412 return discLayerArray;
419 ATH_MSG_VERBOSE(
" build LayerArray with " << planeLayersInput.size() <<
" plane-like material layers." );
423 std::vector< std::pair< std::shared_ptr<Trk::Layer>,
Amg::Vector3D> > layerOrderVector;
427 std::vector<Trk::PlaneLayer*> planeLayers(planeLayersInput);
429 auto sortBegin = planeLayers.begin();
430 auto sortEnd = planeLayers.end();
436 ATH_MSG_WARNING(
"Plane Layers can only be sorted in x/y/z. Returning 0.");
442 auto layIter = planeLayers.begin();
450 unsigned int layers = planeLayers.size();
452 for ( ; layIter != planeLayers.end(); ++layIter) {
455 ATH_MSG_VERBOSE(
"equidistant : registering plane-like MaterialLayer at position : " << layerSurface.
center() );
457 layerOrderVector.emplace_back(
458 std::shared_ptr<Layer>(*layIter),
472 unsigned int layers = planeLayers.size();
474 double posStep = (posmax-posmin)/(
layers+1);
476 double currentPos = posmin + posStep;
477 double lastPos = posmin;
479 double minHalfX = 0.;
480 double maxHalfX = 0.;
483 double layerThickness = 0.;
486 for ( ; layIter != planeLayers.end() ; ++layIter) {
511 layerThickness = ((*layIter)->thickness() > layerThickness ) ? (*layIter)->thickness() : layerThickness;
514 double navigationPos = 0.5*(currentPos+lastPos);
515 double navigationX = (bv ==
Trk::binX) ? navigationPos : 0.;
516 double navigationY = (bv ==
Trk::binY) ? navigationPos : 0.;
517 double navigationZ = (bv ==
Trk::binZ) ? navigationPos : 0.;
520 std::unique_ptr<Trk::PlaneSurface> navLayerSurface =
nullptr;
523 if (std::abs(minHalfX)<10
e-5) {
524 navLayerSurface = std::make_unique<Trk::PlaneSurface>(navLayerTransform,
528 navLayerSurface = std::make_unique<Trk::PlaneSurface>(navLayerTransform,
534 ATH_MSG_VERBOSE(
"bi-equidistant : creating plane-like NavigationLayer at position : " << navigationX );
536 layerOrderVector.emplace_back(std::make_shared<Trk::NavigationLayer>(std::move(navLayerSurface)),
539 lastPos = currentPos;
542 ATH_MSG_VERBOSE(
"bi-equidistant : registering plane-like MaterialLayer at position : " << currentPos );
543 layerOrderVector.emplace_back(
544 std::shared_ptr<Trk::Layer>(*layIter),
548 currentPos += posStep;
552 double navigationPosFinal = 0.5*(currentPos+lastPos);
553 double navigationXFinal = (bv ==
Trk::binX) ? navigationPosFinal : 0.;
554 double navigationYFinal = (bv ==
Trk::binY) ? navigationPosFinal : 0.;
555 double navigationZFinal = (bv ==
Trk::binZ) ? navigationPosFinal : 0.;
559 auto navLayerSurface = (std::abs(minHalfX)<10
e-5) ?
560 std::make_unique<Trk::PlaneSurface>(navLayerTransform, maxHalfX,halfY) :
561 std::make_unique<Trk::PlaneSurface>(navLayerTransform, minHalfX, maxHalfX, halfY);
563 ATH_MSG_VERBOSE(
"bi-equidistant : creating plane-like NavigationLayer at position : " << navLayerSurface->center() );
565 layerOrderVector.emplace_back(std::make_shared<Trk::NavigationLayer>(std::move(navLayerSurface)),
580 std::vector<float> boundaries;
581 boundaries.push_back(posmin);
583 double minHalfX = 0.;
584 double maxHalfX = 0.;
588 for ( ; layIter != planeLayers.end(); ++layIter) {
614 layerCenter = layerSurface.
center();
615 double layerPosition = layerCenter[bv];
617 double layerThickness = (*layIter)->thickness();
619 boundaries.push_back(layerPosition-0.5*layerThickness);
620 double navLayerPositionX = (bv ==
Trk::binX) ? 0.5*(layerPosition+boundaries[boundaries.size()-1]) : layerCenter.x();
621 double navLayerPositionY = (bv ==
Trk::binY) ? 0.5*(layerPosition+boundaries[boundaries.size()-1]) : layerCenter.y();
622 double navLayerPositionZ = (bv ==
Trk::binZ) ? 0.5*(layerPosition+boundaries[boundaries.size()-1]) : layerCenter.z();
623 Amg::Translation3D navLayerPosition(navLayerPositionX,navLayerPositionY,navLayerPositionZ);
626 auto navLayerSurface = (std::abs(minHalfX)<10
e-5) ?
627 std::make_unique<Trk::PlaneSurface>( navLayerTransform, maxHalfX, halfY ) :
628 std::make_unique<Trk::PlaneSurface>( navLayerTransform, minHalfX, maxHalfX, halfY );
629 ATH_MSG_VERBOSE(
"arbitrary : creating plane-like NavigationLayer at position : " << navLayerPositionX );
630 layerOrderVector.emplace_back(
631 std::make_shared<Trk::NavigationLayer>(std::move(navLayerSurface)),
632 Amg::Vector3D(navLayerPositionX, navLayerPositionY, navLayerPositionZ));
634 boundaries.push_back(layerPosition+0.5*layerThickness);
636 layerOrderVector.emplace_back(
637 std::shared_ptr<Trk::Layer>(*layIter),
642 double navLayerPositionXFinal = (bv ==
Trk::binX) ? 0.5*(posmax+boundaries[boundaries.size()-1]) : layerCenter.x();
643 double navLayerPositionYFinal = (bv ==
Trk::binY) ? 0.5*(posmax+boundaries[boundaries.size()-1]) : layerCenter.y();
644 double navLayerPositionZFinal = (bv ==
Trk::binZ) ? 0.5*(posmax+boundaries[boundaries.size()-1]) : layerCenter.z();
645 Amg::Translation3D navLayerPositionFinal(navLayerPositionXFinal,navLayerPositionYFinal,navLayerPositionZFinal);
648 auto navLayerSurfaceFinal = (std::abs(minHalfX)<10
e-5) ?
649 std::make_unique<Trk::PlaneSurface>( navLayerTransformFinal, maxHalfX, halfY ) :
650 std::make_unique<Trk::PlaneSurface>( navLayerTransformFinal, minHalfX, maxHalfX, halfY );
651 ATH_MSG_VERBOSE(
"arbitrary : creating plane-like NavigationLayer at position : " << 0.5*(posmax+boundaries[boundaries.size()-1]) );
652 layerOrderVector.emplace_back(std::make_shared<Trk::NavigationLayer>(std::move(navLayerSurfaceFinal)),
653 Amg::Vector3D(navLayerPositionXFinal, navLayerPositionYFinal, navLayerPositionZFinal));
655 ATH_MSG_VERBOSE( layerOrderVector.size() <<
" plane Layers (material + navigation) built. " );
667 return planeLayerArray;
673 if (m_emptyLayerMode){
675 ATH_MSG_VERBOSE(
" replacing dummyMaterial layer with " << ( m_emptyLayerMode > 1 ?
" nothing" :
" NavigationLayer." ) );