Skip to content

feat: add geometric filter options for strip seeding #5339

Merged
kodiakhq[bot] merged 20 commits intoacts-project:mainfrom
mvessell96:makaylaLRTSeeding
Apr 14, 2026
Merged

feat: add geometric filter options for strip seeding #5339
kodiakhq[bot] merged 20 commits intoacts-project:mainfrom
mvessell96:makaylaLRTSeeding

Conversation

@mvessell96
Copy link
Copy Markdown
Contributor

@mvessell96 mvessell96 commented Apr 13, 2026

Adds optional filters on strip doublet cot(theta) + optional weighting on strip seed delta(eta) for displaced seeds
--- END COMMIT MESSAGE ---

Pixel triplet seeding order is sorted by doublet cot(theta) (sortedByCotTheta), which saves on execution time since the iteration can be aborted once a threshold is reached. Something similar doesn't exist for strip seeding, likely because the main bottleneck is the very expensive stripCoordinateCheck done before the global coord. transformation. It's still possible to implement a very loose criteria based on the approximate cot(theta) before this check is done that can save on execution time while still being conservative. Implementing a threshold of 0.5 here saves ~10-15% off of the total ATLAS LRT seeding time with near-negligible (LLP) efficiency loss.

Additionally, the ATLAS Run 3 LRT pass (https://arxiv.org/pdf/2304.12867, pg 11) had an additional weight component in the seed ordering based on deltaEta = |eta_seed − eta_prime|, where eta_prime is the pseudorapidity of the vector connecting the beam spot position with the point of closest approach of the seed. Seeds from LLP decays tend toward small values of deltaEta due to the correlated direction of the LLP and its decay products, in contrast to seeds corresponding to fake tracks. The ACTS seed filter does not quite function the same as the legacy Athena seed ordering, but a similar function can be emulated in the seed filter weight as an optional factor. This should give a higher weight to genuine displaced seeds, allowing us to reduce the number of seeds per middle SP from 3->2 or 1 downstream, which has another ~15-20% speedup potential in the finding stage.

Both are disabled by default and can just be configured downstream

FYI @jburzy

Makayla Vessella and others added 16 commits March 13, 2026 22:40
… LRT strip seeding

Add two configurable optimizations to the strip seeding path that
improve LRT performance without degrading physics:

1. cot(theta) doublet pre-filter (TripletSeedFinder):
   Skip top doublets whose cot(theta) differs from the bottom doublet
   by more than cotThetaDiffMax before the expensive strip coordinate
   transformation. Disabled by default (cotThetaDiffMax = infinity).

2. Delta-eta seed weight penalty (BroadTripletSeedFilter):
   Penalize triplet seeds whose direction (eta) is inconsistent with
   the vector from the beamspot to the point of closest approach.
   Real displaced-decay seeds have small delta-eta. Disabled by
   default (deltaEtaWeightFactor = 0).
@github-actions github-actions bot added this to the next milestone Apr 13, 2026
@github-actions github-actions bot added Component - Core Affects the Core module Seeding labels Apr 13, 2026
@github-actions
Copy link
Copy Markdown
Contributor

github-actions bot commented Apr 13, 2026

📊: Physics performance monitoring for e5ddf68

Full contents

physmon summary

Copy link
Copy Markdown
Contributor

@andiwand andiwand left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

generally looks good to me 👍 left a few minor suggestions and comments

Pixel triplet seeding order is sorted by doublet cot(theta) (sortedByCotTheta), which saves on execution time since the iteration can be aborted once a threshold is reached. Something similar doesn't exist for strip seeding, likely because the main bottleneck is the very expensive stripCoordinateCheck done before the global coord. transformation. It's still possible to implement a very loose criteria based on the approximate cot(theta) before this check is done that can save on execution time while still being conservative. Implementing a threshold of 0.5 here saves ~10-15% off of the total ATLAS LRT seeding time with near-negligible (LLP) efficiency loss.

I remember wondering about this - if you think it makes sense to harmonize this we can definitely do it. I faintly remember that cotTheta then depends on calibrated / non-calibrated quantities which could be individually above or below threshold potentially hurting efficiency.

@mvessell96
Copy link
Copy Markdown
Contributor Author

generally looks good to me 👍 left a few minor suggestions and comments

Pixel triplet seeding order is sorted by doublet cot(theta) (sortedByCotTheta), which saves on execution time since the iteration can be aborted once a threshold is reached. Something similar doesn't exist for strip seeding, likely because the main bottleneck is the very expensive stripCoordinateCheck done before the global coord. transformation. It's still possible to implement a very loose criteria based on the approximate cot(theta) before this check is done that can save on execution time while still being conservative. Implementing a threshold of 0.5 here saves ~10-15% off of the total ATLAS LRT seeding time with near-negligible (LLP) efficiency loss.

I remember wondering about this - if you think it makes sense to harmonize this we can definitely do it. I faintly remember that cotTheta then depends on calibrated / non-calibrated quantities which could be individually above or below threshold potentially hurting efficiency.

Yeah indeed there is this issue with calibrated vs non-calibrated, I think the difference is not too meaningful when the threshold is very coarse, since seeds whose doublets are this incompatible likely shouldn't be pushed into being compatible after any updates. For the LRT/displaced strips case for certain it's well-motivated, since much worse tradeoffs have to be made for CPU vs efficiency in the end... but for this reason I thought it best to just keep the default behavior by default rather than just implementing it directly

@andiwand andiwand marked this pull request as ready for review April 13, 2026 14:34
@paulgessinger
Copy link
Copy Markdown
Member

/ci-bridge-run

1 similar comment
@mvessell96
Copy link
Copy Markdown
Contributor Author

/ci-bridge-run

@sonarqubecloud
Copy link
Copy Markdown

@kodiakhq kodiakhq bot merged commit 46df76a into acts-project:main Apr 14, 2026
42 checks passed
@andiwand andiwand modified the milestones: next, v46.2.0 Apr 14, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Component - Core Affects the Core module Seeding

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants