10 const std::string&
name,
134 return StatusCode::FAILURE;
140 return StatusCode::FAILURE;
146 return StatusCode::FAILURE;
152 return StatusCode::FAILURE;
161 "Inconsistent config zBinsCustomLooping contains bins that are not "
163 return StatusCode::FAILURE;
172 "Inconsistent config rBinsCustomLooping contains bins that are not "
174 return StatusCode::FAILURE;
194 m_gridCfg.bottomBinFinder = Acts::GridBinFinder<3ul>(
251 m_filterCfg.centralSeedConfirmationRange.nTopForLargeR =
253 m_filterCfg.centralSeedConfirmationRange.nTopForSmallR =
255 m_filterCfg.centralSeedConfirmationRange.seedConfMinBottomRadius =
257 m_filterCfg.centralSeedConfirmationRange.seedConfMaxZOrigin =
259 m_filterCfg.centralSeedConfirmationRange.minImpactSeedConf =
264 m_filterCfg.forwardSeedConfirmationRange.nTopForLargeR =
266 m_filterCfg.forwardSeedConfirmationRange.nTopForSmallR =
268 m_filterCfg.forwardSeedConfirmationRange.seedConfMinBottomRadius =
270 m_filterCfg.forwardSeedConfirmationRange.seedConfMaxZOrigin =
272 m_filterCfg.forwardSeedConfirmationRange.minImpactSeedConf =
279 Acts::Experimental::TripletSeeder(
logger().cloneWithSuffix(
"Finder"));
285 return StatusCode::SUCCESS;
290 float zabs = std::abs(sp->
z());
291 float absCotTheta = zabs /
r;
296 if (zabs > 200 &&
r < 40)
304 static constexpr
float cotThetaEta120 = 1.5095;
305 if (absCotTheta < cotThetaEta120)
309 static constexpr
float cotThetaEta340 = 14.9654;
315 static constexpr
float cotThetaEta220 = 4.4571;
316 if (absCotTheta > cotThetaEta220 &&
r > 260.)
320 static constexpr
float cotThetaEta260 = 6.6947;
321 if (absCotTheta > cotThetaEta260 &&
r > 200.)
325 static constexpr
float cotThetaEta320 = 12.2459;
326 if (absCotTheta > cotThetaEta320 &&
r > 140.)
330 static constexpr
float cotThetaEta400 = 27.2899;
331 if (absCotTheta > cotThetaEta400)
338 const Acts::Experimental::ConstSpacePointProxy2& middle,
339 const Acts::Experimental::ConstSpacePointProxy2&
other,
float cotTheta,
340 bool isBottomCandidate)
const {
346 if (std::abs(middle.zr()[0]) > 1500 and
347 middle.zr()[1] > 100 and middle.zr()[1] < 150) {
356 static constexpr
float cotThetaEta120 = 1.5095;
357 static constexpr
float cotThetaEta360 = 18.2855;
359 float absCotTheta = std::abs(
cotTheta);
361 absCotTheta > cotThetaEta120 && absCotTheta < cotThetaEta360) {
369 const Acts::Experimental::ConstSpacePointProxy2& spM,
370 const Acts::Range1D<float>& rMiddleSpRange)
const {
372 return {rMiddleSpRange.min(), rMiddleSpRange.max()};
375 throw std::runtime_error(
376 "m_rRangeMiddleSP is empty, please check the configuration.");
384 zBin == 0 ? zBin : --zBin;
389 const EventContext& ctx,
390 const std::vector<const xAOD::SpacePointContainer*>& spacePointCollections,
391 const Eigen::Vector3f& beamSpotPos,
float bFieldInZ,
396 gridCfg.bFieldInZ = bFieldInZ;
398 Acts::Experimental::CylindricalSpacePointGrid2 grid(
399 gridCfg,
logger().cloneWithSuffix(
"Grid"));
401 std::size_t totalSpacePoints = 0;
406 std::vector<const xAOD::SpacePoint*> selectedXAODSpacePoints;
407 std::vector<float> selectedSpacePointsR;
408 selectedXAODSpacePoints.reserve(totalSpacePoints);
409 selectedSpacePointsR.reserve(totalSpacePoints);
413 float x =
static_cast<float>(sp->x() - beamSpotPos[0]);
414 float y =
static_cast<float>(sp->y() - beamSpotPos[1]);
415 float z =
static_cast<float>(sp->z());
416 float r = std::hypot(
x,
y);
417 float phi = std::atan2(
y,
x);
423 grid.insert(selectedXAODSpacePoints.size(), phi,
z,
r);
424 selectedXAODSpacePoints.push_back(sp);
425 selectedSpacePointsR.push_back(
r);
429 for (std::size_t
i = 0;
i < grid.numberOfBins(); ++
i) {
431 grid.at(
i), [&](
const Acts::Experimental::SpacePointIndex2&
a,
432 const Acts::Experimental::SpacePointIndex2&
b) {
433 return selectedSpacePointsR[a] < selectedSpacePointsR[b];
437 Acts::Experimental::SpacePointContainer2 selectedSpacePoints;
438 selectedSpacePoints.createColumns(
439 Acts::Experimental::SpacePointColumns::SourceLinks |
440 Acts::Experimental::SpacePointColumns::XY |
441 Acts::Experimental::SpacePointColumns::ZR |
442 Acts::Experimental::SpacePointColumns::VarianceZ |
443 Acts::Experimental::SpacePointColumns::VarianceR);
445 selectedSpacePoints.createColumns(
446 Acts::Experimental::SpacePointColumns::Strip);
448 selectedSpacePoints.reserve(grid.numberOfSpacePoints());
449 std::vector<Acts::Experimental::SpacePointIndex2> copyFromIndices;
450 copyFromIndices.reserve(grid.numberOfSpacePoints());
451 std::vector<Acts::Experimental::SpacePointIndexRange2> gridSpacePointRanges;
452 gridSpacePointRanges.reserve(grid.numberOfBins());
453 for (std::size_t
i = 0;
i < grid.numberOfBins(); ++
i) {
455 for (
const Acts::Experimental::SpacePointIndex2 spIndex : grid.at(
i)) {
458 auto newSp = selectedSpacePoints.createSpacePoint();
459 newSp.assignSourceLinks(
460 std::array<Acts::SourceLink, 1>{Acts::SourceLink(sp)});
461 newSp.xy() = std::array<float, 2>{
static_cast<float>(sp->
x() - beamSpotPos[0]),
462 static_cast<float>(sp->
y() - beamSpotPos[1])};
463 newSp.zr() = std::array<float, 2>{
static_cast<float>(sp->
z()),
464 selectedSpacePointsR[spIndex]};
465 newSp.varianceZ() =
static_cast<float>(sp->
varianceZ());
466 newSp.varianceR() =
static_cast<float>(sp->
varianceR());
468 newSp.topStripVector() =
470 newSp.bottomStripVector() =
476 copyFromIndices.push_back(spIndex);
479 gridSpacePointRanges.emplace_back(
begin,
end);
483 selectedXAODSpacePoints = {};
484 selectedSpacePointsR = {};
486 ACTS_VERBOSE(
"Number of space points after selection "
487 << selectedSpacePoints.size() <<
" out of " << totalSpacePoints);
491 const Acts::Range1D<float> rRange = [&]() -> Acts::Range1D<float> {
493 float maxRange = std::numeric_limits<float>::lowest();
494 for (
const Acts::Experimental::SpacePointIndexRange2&
range :
495 gridSpacePointRanges) {
499 auto first = selectedSpacePoints[
range.first];
500 auto last = selectedSpacePoints[
range.second - 1];
502 maxRange =
std::max(last.zr()[1], maxRange);
504 return {minRange, maxRange};
507 auto bottomDoubletFinder = Acts::Experimental::DoubletSeedFinder::create(
508 Acts::Experimental::DoubletSeedFinder::DerivedConfig(
510 auto topDoubletFinder = Acts::Experimental::DoubletSeedFinder::create(
511 Acts::Experimental::DoubletSeedFinder::DerivedConfig(
513 auto tripletFinder = Acts::Experimental::TripletSeedFinder::create(
518 const Acts::Range1D<float> rMiddleSpRange(
523 Acts::Experimental::BroadTripletSeedFilter::Cache filterCache;
524 Acts::Experimental::TripletSeeder::Cache cache;
526 Acts::Experimental::BroadTripletSeedFilter
filter(
529 std::vector<Acts::Experimental::SpacePointContainer2::ConstRange>
531 std::optional<Acts::Experimental::SpacePointContainer2::ConstRange>
533 std::vector<Acts::Experimental::SpacePointContainer2::ConstRange> topSpRanges;
535 Acts::Experimental::SeedContainer2 tmpSeedContainer;
536 tmpSeedContainer.reserve(seedContainer.
capacity());
538 for (
const auto [bottom, middle,
top] : grid.binnedGroup()) {
539 ACTS_VERBOSE(
"Process middle bin " << middle);
540 if (middle >= gridSpacePointRanges.size()) {
541 ATH_MSG_ERROR(
"Grid Binned Group returned an unreasonable middle bin");
542 return StatusCode::FAILURE;
545 bottomSpRanges.clear();
549 bottom, std::back_inserter(bottomSpRanges),
551 -> Acts::Experimental::SpacePointContainer2::ConstRange {
552 return selectedSpacePoints.range(gridSpacePointRanges[
b]).asConst();
555 selectedSpacePoints.range(gridSpacePointRanges[middle]).asConst();
557 top, std::back_inserter(topSpRanges),
559 -> Acts::Experimental::SpacePointContainer2::ConstRange {
560 return selectedSpacePoints.range(gridSpacePointRanges[
t]).asConst();
565 auto firstMiddleSp = middleSpRange->front();
566 auto radiusRangeForMiddle =
569 ACTS_VERBOSE(
"Validity range (radius) for the middle space point is ["
570 << radiusRangeForMiddle.first <<
", "
571 << radiusRangeForMiddle.second <<
"]");
574 cache, *bottomDoubletFinder, *topDoubletFinder, *tripletFinder,
filter,
575 selectedSpacePoints, bottomSpRanges, *middleSpRange, topSpRanges,
576 radiusRangeForMiddle, tmpSeedContainer);
582 auto selectionFunction =
584 const Acts::Experimental::MutableSeedProxy2& seed) ->
bool {
585 float seedQuality = seed.quality();
586 float bottomQuality =
587 filterState.bestSeedQualityMap.at(seed.spacePointIndices()[0]);
588 float middleQuality =
589 filterState.bestSeedQualityMap.at(seed.spacePointIndices()[1]);
591 filterState.bestSeedQualityMap.at(seed.spacePointIndices()[2]);
593 return bottomQuality <= seedQuality || middleQuality <= seedQuality ||
594 topQuality <= seedQuality;
597 seedContainer.
reserve(tmpSeedContainer.size());
600 for (Acts::Experimental::MutableSeedProxy2 seed : tmpSeedContainer) {
606 selectedSpacePoints.at(seed.spacePointIndices()[0])
610 selectedSpacePoints.at(seed.spacePointIndices()[1])
614 selectedSpacePoints.at(seed.spacePointIndices()[2])
618 auto outputSeed = std::make_unique<ActsTrk::Seed>(*bottom, *middle, *
top);
619 outputSeed->setVertexZ(seed.vertexZ());
620 outputSeed->setQuality(seed.quality());
621 seedContainer.
push_back(std::move(outputSeed));
624 return StatusCode::SUCCESS;