Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat!: Allow trimming other non measurement track states #3993

Merged
merged 4 commits into from
Jan 9, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
49 changes: 36 additions & 13 deletions Core/include/Acts/Utilities/TrackHelpers.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -412,9 +412,10 @@ void calculateTrackQuantities(track_proxy_t track)
/// @param trimHoles whether to trim holes
/// @param trimOutliers whether to trim outliers
/// @param trimMaterial whether to trim pure material states
/// @param trimOtherNoneMeasurement whether to trim other, non measurement, states
template <TrackProxyConcept track_proxy_t>
void trimTrackFront(track_proxy_t track, bool trimHoles, bool trimOutliers,
bool trimMaterial)
bool trimMaterial, bool trimOtherNoneMeasurement)
requires(!track_proxy_t::ReadOnly)
{
using TrackStateProxy = typename track_proxy_t::TrackStateProxy;
Expand All @@ -425,14 +426,23 @@ void trimTrackFront(track_proxy_t track, bool trimHoles, bool trimOutliers,

for (TrackStateProxy trackState : track.trackStatesReversed()) {
TrackStateType typeFlags = trackState.typeFlags();
if (trimHoles && typeFlags.test(TrackStateFlag::HoleFlag)) {
bool isHole = typeFlags.test(TrackStateFlag::HoleFlag);
bool isOutlier = typeFlags.test(TrackStateFlag::OutlierFlag);
bool isMaterial = typeFlags.test(TrackStateFlag::MaterialFlag) &&
!typeFlags.test(TrackStateFlag::MeasurementFlag);
bool isOtherNoneMeasurement =
!typeFlags.test(TrackStateFlag::MeasurementFlag) && !isHole &&
!isOutlier && !isMaterial;
if (trimHoles && isHole) {
continue;
}
if (trimOutliers && typeFlags.test(TrackStateFlag::OutlierFlag)) {
if (trimOutliers && isOutlier) {
continue;
}
if (trimMaterial && typeFlags.test(TrackStateFlag::MaterialFlag) &&
!typeFlags.test(TrackStateFlag::MeasurementFlag)) {
if (trimMaterial && isMaterial) {
continue;
}
if (trimOtherNoneMeasurement && isOtherNoneMeasurement) {
continue;
}

Expand All @@ -450,9 +460,10 @@ void trimTrackFront(track_proxy_t track, bool trimHoles, bool trimOutliers,
/// @param trimHoles whether to trim holes
/// @param trimOutliers whether to trim outliers
/// @param trimMaterial whether to trim pure material states
/// @param trimOtherNoneMeasurement whether to trim other, non measurement, states
template <TrackProxyConcept track_proxy_t>
void trimTrackBack(track_proxy_t track, bool trimHoles, bool trimOutliers,
bool trimMaterial)
bool trimMaterial, bool trimOtherNoneMeasurement)
requires(!track_proxy_t::ReadOnly)
{
using TrackStateProxy = typename track_proxy_t::TrackStateProxy;
Expand All @@ -463,14 +474,23 @@ void trimTrackBack(track_proxy_t track, bool trimHoles, bool trimOutliers,
back = trackState;

TrackStateType typeFlags = trackState.typeFlags();
if (trimHoles && typeFlags.test(TrackStateFlag::HoleFlag)) {
bool isHole = typeFlags.test(TrackStateFlag::HoleFlag);
bool isOutlier = typeFlags.test(TrackStateFlag::OutlierFlag);
bool isMaterial = typeFlags.test(TrackStateFlag::MaterialFlag) &&
!typeFlags.test(TrackStateFlag::MeasurementFlag);
bool isOtherNoneMeasurement =
!typeFlags.test(TrackStateFlag::MeasurementFlag) && !isHole &&
!isOutlier && !isMaterial;
if (trimHoles && isHole) {
continue;
}
if (trimOutliers && isOutlier) {
continue;
}
if (trimOutliers && typeFlags.test(TrackStateFlag::OutlierFlag)) {
if (trimMaterial && isMaterial) {
continue;
}
if (trimMaterial && typeFlags.test(TrackStateFlag::MaterialFlag) &&
!typeFlags.test(TrackStateFlag::MeasurementFlag)) {
if (trimOtherNoneMeasurement && isOtherNoneMeasurement) {
continue;
}

Expand All @@ -488,13 +508,16 @@ void trimTrackBack(track_proxy_t track, bool trimHoles, bool trimOutliers,
/// @param trimHoles whether to trim holes
/// @param trimOutliers whether to trim outliers
/// @param trimMaterial whether to trim pure material states
/// @param trimOtherNoneMeasurement whether to trim other, non measurement, states
template <TrackProxyConcept track_proxy_t>
void trimTrack(track_proxy_t track, bool trimHoles, bool trimOutliers,
bool trimMaterial)
bool trimMaterial, bool trimOtherNoneMeasurement)
requires(!track_proxy_t::ReadOnly)
{
trimTrackFront(track, trimHoles, trimOutliers, trimMaterial);
trimTrackBack(track, trimHoles, trimOutliers, trimMaterial);
trimTrackFront(track, trimHoles, trimOutliers, trimMaterial,
trimOtherNoneMeasurement);
trimTrackBack(track, trimHoles, trimOutliers, trimMaterial,
trimOtherNoneMeasurement);
}

/// Helper function to calculate the predicted residual and its covariance
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -421,7 +421,7 @@ ProcessCode TrackFindingAlgorithm::execute(const AlgorithmContext& ctx) const {

// trim the track if requested
if (m_cfg.trimTracks) {
Acts::trimTrack(track, true, true, true);
Acts::trimTrack(track, true, true, true, true);
}
Acts::calculateTrackQuantities(track);

Expand Down
12 changes: 9 additions & 3 deletions Tests/UnitTests/Core/Utilities/TrackHelpersTests.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,7 @@ BOOST_AUTO_TEST_CASE(CalculateQuantities) {
BOOST_AUTO_TEST_CASE(TrimTrack) {
TrackContainer tc{VectorTrackContainer{}, VectorMultiTrajectory{}};
auto t = createTestTrack(tc, std::vector<std::vector<TrackStateFlag>>{
{},
{HoleFlag},
{MeasurementFlag},
{OutlierFlag},
Expand All @@ -98,34 +99,39 @@ BOOST_AUTO_TEST_CASE(TrimTrack) {
{HoleFlag},
{MeasurementFlag},
{OutlierFlag},
{},
});

calculateTrackQuantities(t);

BOOST_CHECK_EQUAL(t.nTrackStates(), 11);
BOOST_CHECK_EQUAL(t.nHoles(), 3);
BOOST_CHECK_EQUAL(t.nMeasurements(), 3);
BOOST_CHECK_EQUAL(t.nOutliers(), 3);
BOOST_CHECK_EQUAL(t.nSharedHits(), 1);

trimTrackFront(t, true, true, true);
trimTrackFront(t, true, true, true, true);
calculateTrackQuantities(t);

BOOST_CHECK_EQUAL(t.nTrackStates(), 9);
BOOST_CHECK_EQUAL(t.nHoles(), 2);
BOOST_CHECK_EQUAL(t.nMeasurements(), 3);
BOOST_CHECK_EQUAL(t.nOutliers(), 3);
BOOST_CHECK_EQUAL(t.nSharedHits(), 1);

trimTrackBack(t, true, true, true);
trimTrackBack(t, true, true, true, true);
calculateTrackQuantities(t);

BOOST_CHECK_EQUAL(t.nTrackStates(), 7);
BOOST_CHECK_EQUAL(t.nHoles(), 2);
BOOST_CHECK_EQUAL(t.nMeasurements(), 3);
BOOST_CHECK_EQUAL(t.nOutliers(), 2);
BOOST_CHECK_EQUAL(t.nSharedHits(), 1);

trimTrack(t, true, true, true);
trimTrack(t, true, true, true, true);
calculateTrackQuantities(t);

BOOST_CHECK_EQUAL(t.nTrackStates(), 7);
BOOST_CHECK_EQUAL(t.nHoles(), 2);
BOOST_CHECK_EQUAL(t.nMeasurements(), 3);
BOOST_CHECK_EQUAL(t.nOutliers(), 2);
Expand Down
Loading