442 {
443 (void)ctx;
444
446 gridCfg.bFieldInZ = bFieldInZ;
447
448 Acts::CylindricalSpacePointGrid2 grid(gridCfg,
449 logger().cloneWithSuffix(
"Grid"));
450
451 std::size_t totalSpacePoints = 0;
454 }
455
456 std::vector<const xAOD::SpacePoint*> selectedXAODSpacePoints;
457 std::vector<float> selectedSpacePointsR;
458 selectedXAODSpacePoints.reserve(totalSpacePoints);
459 selectedSpacePointsR.reserve(totalSpacePoints);
460
463 float x =
static_cast<float>(
sp->x() - beamSpotPos[0]);
464 float y =
static_cast<float>(
sp->y() - beamSpotPos[1]);
465 float z =
static_cast<float>(
sp->z());
466 float r = std::hypot(
x,
y);
467 float phi = std::atan2(
y,
x);
468
470 continue;
471 }
472
473 grid.insert(selectedXAODSpacePoints.size(),
phi,
z,
r);
474 selectedXAODSpacePoints.push_back(
sp);
475 selectedSpacePointsR.push_back(
r);
476 }
477 }
478
479 for (std::size_t i = 0;
i < grid.numberOfBins(); ++
i) {
480 std::ranges::sort(
481 grid.at(i), [&](Acts::SpacePointIndex2
a, Acts::SpacePointIndex2 b) {
482 return selectedSpacePointsR[a] < selectedSpacePointsR[b];
483 });
484 }
485
486 Acts::SpacePointContainer2 selectedSpacePoints;
487 selectedSpacePoints.createColumns(
488 Acts::SpacePointColumns::CopyFromIndex |
489 Acts::SpacePointColumns::PackedXY | Acts::SpacePointColumns::PackedZR |
490 Acts::SpacePointColumns::VarianceZ | Acts::SpacePointColumns::VarianceR);
492 selectedSpacePoints.createColumns(Acts::SpacePointColumns::Strip);
493 }
494 selectedSpacePoints.reserve(grid.numberOfSpacePoints());
495 std::vector<Acts::SpacePointIndexRange2> gridSpacePointRanges;
496 gridSpacePointRanges.reserve(grid.numberOfBins());
497 for (std::size_t i = 0;
i < grid.numberOfBins(); ++
i) {
498 std::uint32_t
begin = selectedSpacePoints.size();
499 for (const Acts::SpacePointIndex2 spIndex : grid.at(i)) {
501
502 auto newSp = selectedSpacePoints.createSpacePoint();
503 newSp.copyFromIndex() = spIndex;
504 newSp.xy() =
505 std::array<float, 2>{
static_cast<float>(
sp->x() - beamSpotPos[0]),
506 static_cast<float>(
sp->y() - beamSpotPos[1])};
507 newSp.zr() = std::array<float, 2>{
static_cast<float>(
sp->z()),
508 selectedSpacePointsR[spIndex]};
509 newSp.varianceZ() =
static_cast<float>(
sp->varianceZ());
510 newSp.varianceR() =
static_cast<float>(
sp->varianceR());
512 Eigen::Vector3f topStripVector =
513 sp->topHalfStripLength() *
sp->topStripDirection();
514 Eigen::Vector3f bottomStripVector =
515 sp->bottomHalfStripLength() *
sp->bottomStripDirection();
516 Eigen::Vector3f stripCenterDistance =
sp->stripCenterDistance();
517 Eigen::Vector3f topStripCenter =
sp->topStripCenter();
518
519 newSp.topStripVector() = std::array<float, 3>{
520 topStripVector.x(), topStripVector.y(), topStripVector.z()};
521 newSp.bottomStripVector() =
522 std::array<float, 3>{bottomStripVector.x(), bottomStripVector.y(),
523 bottomStripVector.z()};
524 newSp.stripCenterDistance() = std::array<float, 3>{
525 stripCenterDistance.x(), stripCenterDistance.y(),
526 stripCenterDistance.z()};
527 newSp.topStripCenter() = std::array<float, 3>{
528 topStripCenter.x(), topStripCenter.y(), topStripCenter.z()};
529 }
530 }
531 std::uint32_t
end = selectedSpacePoints.size();
532 gridSpacePointRanges.emplace_back(begin, end);
533 }
534
535
536 selectedSpacePointsR = {};
537
538 ACTS_VERBOSE("Number of space points after selection "
539 << selectedSpacePoints.size() << " out of " << totalSpacePoints);
540
541
542
543 const Acts::Range1D<float> rRange = [&]() -> Acts::Range1D<float> {
544 float minRange = std::numeric_limits<float>::max();
545 float maxRange = std::numeric_limits<float>::lowest();
546 for (const Acts::SpacePointIndexRange2& range : gridSpacePointRanges) {
548 continue;
549 }
550 auto first = selectedSpacePoints[
range.first];
551 auto last = selectedSpacePoints[
range.second - 1];
552 minRange = std::min(
first.zr()[1], minRange);
553 maxRange = std::max(last.zr()[1], maxRange);
554 }
555 return {minRange, maxRange};
556 }();
557
559
563
564 for(const auto* vtx: *inputHoughVtx)
565 {
567 {
570 break;
571 }
572 }
573
574 }
575
576 auto bottomDoubletFinder =
577 Acts::DoubletSeedFinder::create(Acts::DoubletSeedFinder::DerivedConfig(
578 bottomDoubletFinderCfg, bFieldInZ));
579 auto topDoubletFinder = Acts::DoubletSeedFinder::create(
581 auto tripletFinder = Acts::TripletSeedFinder::create(
583
584
585 const Acts::Range1D<float> rMiddleSpRange(
588
589 Acts::BroadTripletSeedFilter::State filterState;
590 Acts::BroadTripletSeedFilter::Cache filterCache;
591 Acts::TripletSeeder::Cache
cache;
592
595
596 std::vector<Acts::SpacePointContainer2::ConstRange> bottomSpRanges;
597 std::optional<Acts::SpacePointContainer2::ConstRange> middleSpRange;
598 std::vector<Acts::SpacePointContainer2::ConstRange> topSpRanges;
599
600 Acts::SeedContainer2 tmpSeedContainer;
601
602 for (
const auto [bottom, middle,
top] : grid.binnedGroup()) {
603 ACTS_VERBOSE("Process middle bin " << middle);
604 if (middle >= gridSpacePointRanges.size()) {
605 ATH_MSG_ERROR(
"Grid Binned Group returned an unreasonable middle bin");
606 return StatusCode::FAILURE;
607 }
608
609 bottomSpRanges.clear();
610 topSpRanges.clear();
611
612 std::ranges::transform(
613 bottom, std::back_inserter(bottomSpRanges),
614 [&](std::size_t b) -> Acts::SpacePointContainer2::ConstRange {
615 return selectedSpacePoints.range(gridSpacePointRanges[b]).asConst();
616 });
617 middleSpRange =
618 selectedSpacePoints.range(gridSpacePointRanges[middle]).asConst();
619 std::ranges::transform(
620 top, std::back_inserter(topSpRanges),
621 [&](std::size_t t) -> Acts::SpacePointContainer2::ConstRange {
622 return selectedSpacePoints.range(gridSpacePointRanges[t]).asConst();
623 });
624
625
626
627 auto firstMiddleSp = middleSpRange->front();
628 auto radiusRangeForMiddle =
630
631 ACTS_VERBOSE("Validity range (radius) for the middle space point is ["
632 << radiusRangeForMiddle.first << ", "
633 << radiusRangeForMiddle.second << "]");
634
636 cache, *bottomDoubletFinder, *topDoubletFinder, *tripletFinder, filter,
637 selectedSpacePoints, bottomSpRanges, *middleSpRange, topSpRanges,
638 radiusRangeForMiddle, tmpSeedContainer);
639 }
640
641
642
643
644 auto selectionFunction =
645 [&filterState](
const Acts::MutableSeedProxy2&
seed) ->
bool {
646 float seedQuality =
seed.quality();
647 float bottomQuality =
648 filterState.bestSeedQualityMap.at(
seed.spacePointIndices()[0]);
649 float middleQuality =
650 filterState.bestSeedQualityMap.at(
seed.spacePointIndices()[1]);
651 float topQuality =
652 filterState.bestSeedQualityMap.at(
seed.spacePointIndices()[2]);
653
654 return bottomQuality <= seedQuality || middleQuality <= seedQuality ||
655 topQuality <= seedQuality;
656 };
657
658 seedContainer.
reserve(seedContainer.
size() + tmpSeedContainer.size());
659
660
661 for (Acts::MutableSeedProxy2 seed : tmpSeedContainer) {
663 continue;
664 }
665
667 Acts::ConstSeedProxy2(seed), [&](const Acts::SpacePointIndex2 spIndex) {
668 const Acts::SpacePointIndex2 originalIndex =
669 selectedSpacePoints.at(spIndex).copyFromIndex();
670 return selectedXAODSpacePoints[originalIndex];
671 });
672 }
673
674 return StatusCode::SUCCESS;
675}
Scalar phi() const
phi method
#define ATH_CHECK
Evaluate an expression and check for errors.
virtual bool isValid() override final
Can the handle be successfully dereferenced?
SG::ReadCondHandle< T > makeHandle(const SG::ReadCondHandleKey< T > &key, const EventContext &ctx=Gaudi::Hive::currentContext())
const IIntersectionCache * cache() const
Retrieve the associated cache block, if it exists.
SpacePointContainer_v1 SpacePointContainer
Define the version of the space point container.
Seed push_back(SpacePointRange spacePoints, float quality, float vertexZ)
void reserve(std::size_t size, float averageSpacePoints=3) noexcept
std::size_t size() const noexcept