diff --git a/Core/include/Acts/Utilities/TrackHelpers.hpp b/Core/include/Acts/Utilities/TrackHelpers.hpp index dc3765be7f6..f8c61135502 100644 --- a/Core/include/Acts/Utilities/TrackHelpers.hpp +++ b/Core/include/Acts/Utilities/TrackHelpers.hpp @@ -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 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; @@ -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; } @@ -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 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; @@ -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; } @@ -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 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 diff --git a/Examples/Algorithms/TrackFinding/src/TrackFindingAlgorithm.cpp b/Examples/Algorithms/TrackFinding/src/TrackFindingAlgorithm.cpp index b1ef900c5b9..53b47a86d07 100644 --- a/Examples/Algorithms/TrackFinding/src/TrackFindingAlgorithm.cpp +++ b/Examples/Algorithms/TrackFinding/src/TrackFindingAlgorithm.cpp @@ -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); diff --git a/Tests/UnitTests/Core/Utilities/TrackHelpersTests.cpp b/Tests/UnitTests/Core/Utilities/TrackHelpersTests.cpp index c08cbd5455d..adc33d2168d 100644 --- a/Tests/UnitTests/Core/Utilities/TrackHelpersTests.cpp +++ b/Tests/UnitTests/Core/Utilities/TrackHelpersTests.cpp @@ -89,6 +89,7 @@ BOOST_AUTO_TEST_CASE(CalculateQuantities) { BOOST_AUTO_TEST_CASE(TrimTrack) { TrackContainer tc{VectorTrackContainer{}, VectorMultiTrajectory{}}; auto t = createTestTrack(tc, std::vector>{ + {}, {HoleFlag}, {MeasurementFlag}, {OutlierFlag}, @@ -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);