Skip to content

Commit

Permalink
feat: GSF backward-pass misses as outliers (#1904)
Browse files Browse the repository at this point in the history
Now, the GSF does flag states as outliers that were missed at the backward pass.
  • Loading branch information
benjaminhuth committed Mar 3, 2023
1 parent 7431a8c commit f35d49b
Show file tree
Hide file tree
Showing 6 changed files with 44 additions and 38 deletions.
Binary file modified CI/physmon/reference/performance_gsf.root
Binary file not shown.
33 changes: 28 additions & 5 deletions Core/include/Acts/TrackFitting/GaussianSumFitter.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -304,7 +304,7 @@ struct GaussianSumFitter {
}

if (fwdGsfResult.measurementStates == 0) {
return return_error_or_abort(GsfError::NoStatesCreated);
return return_error_or_abort(GsfError::NoMeasurementStatesCreatedForward);
}

ACTS_VERBOSE("Finished forward propagation");
Expand Down Expand Up @@ -367,6 +367,7 @@ struct GaussianSumFitter {

r.currentTip = fwdGsfResult.lastMeasurementTip;
r.visitedSurfaces.push_back(&proxy.referenceSurface());
r.surfacesVisitedBwdAgain.push_back(&proxy.referenceSurface());
r.measurementStates++;
r.processedStates++;

Expand All @@ -388,8 +389,9 @@ struct GaussianSumFitter {
return return_error_or_abort(bwdGsfResult.result.error());
}

if (bwdGsfResult.processedStates == 0) {
return return_error_or_abort(GsfError::NoStatesCreated);
if (bwdGsfResult.measurementStates == 0) {
return return_error_or_abort(
GsfError::NoMeasurementStatesCreatedBackward);
}

////////////////////////////////////
Expand All @@ -408,8 +410,29 @@ struct GaussianSumFitter {
ACTS_DEBUG("Fwd and bwd measuerement states do not match");
}

auto track = trackContainer.getTrack(trackContainer.addTrack());
// Go through the states and assign outliers / unset smoothed if surface not
// passed in backward pass
const auto& foundBwd = bwdGsfResult.surfacesVisitedBwdAgain;
std::size_t measurementStatesFinal = 0;

for (auto state :
fwdGsfResult.fittedStates->trackStateRange(fwdGsfResult.currentTip)) {
const bool found = std::find(foundBwd.begin(), foundBwd.end(),
&state.referenceSurface()) != foundBwd.end();
if (not found && state.typeFlags().test(MeasurementFlag)) {
state.typeFlags().set(OutlierFlag);
state.typeFlags().reset(MeasurementFlag);
}

measurementStatesFinal +=
static_cast<std::size_t>(state.typeFlags().test(MeasurementFlag));
}

if (measurementStatesFinal == 0) {
return return_error_or_abort(GsfError::NoMeasurementStatesCreatedFinal);
}

auto track = trackContainer.getTrack(trackContainer.addTrack());
track.tipIndex() = fwdGsfResult.lastMeasurementTip;

if (options.referenceSurface) {
Expand All @@ -419,7 +442,7 @@ struct GaussianSumFitter {
track.setReferenceSurface(params.referenceSurface().getSharedPtr());
}

track.nMeasurements() = fwdGsfResult.measurementStates;
track.nMeasurements() = measurementStatesFinal;
track.nHoles() = fwdGsfResult.measurementHoles;

return track;
Expand Down
14 changes: 4 additions & 10 deletions Core/include/Acts/TrackFitting/GsfError.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -14,16 +14,10 @@ namespace Acts {
namespace Experimental {

enum class GsfError {
// ensure all values are non-zero
NavigationFailed = 1,
ComponentNumberMismatch,
AllComponentsSteppingError,
NoComponentCreated,
NoStatesCreated,
StartParametersNotOnStartSurface,
PropagationEndedOnWrongSurface,
LastStepParamsContainNan,
SmoothingFailed
NoMeasurementStatesCreatedForward = 1,
NoMeasurementStatesCreatedBackward,
NoMeasurementStatesCreatedFinal,
StartParametersNotOnStartSurface
};

std::error_code make_error_code(GsfError e);
Expand Down
4 changes: 2 additions & 2 deletions Core/include/Acts/TrackFitting/detail/GsfActor.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ struct GsfResult {
std::size_t processedStates = 0;

std::vector<const Acts::Surface*> visitedSurfaces;
std::vector<const Acts::Surface*> missedActiveSurfaces;
std::vector<const Acts::Surface*> surfacesVisitedBwdAgain;

// Propagate potential errors to the outside
Result<void> result{Result<void>::success()};
Expand Down Expand Up @@ -662,7 +662,6 @@ struct GsfActor {

// These things should only be done once for all components
if (is_hole) {
result.missedActiveSurfaces.push_back(&surface);
++result.measurementHoles;
}

Expand Down Expand Up @@ -762,6 +761,7 @@ struct GsfActor {

trackState.filtered() = filtMean;
trackState.filteredCovariance() = filtCov;
result.surfacesVisitedBwdAgain.push_back(&surface);
return false;
}
return true;
Expand Down
23 changes: 6 additions & 17 deletions Core/src/TrackFitting/GsfError.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -20,25 +20,14 @@ class GsfErrorCategory : public std::error_category {
using Acts::Experimental::GsfError;

switch (static_cast<GsfError>(c)) {
case GsfError::NavigationFailed:
return "Navigation failed, forward and backward pass incompatible";
case GsfError::ComponentNumberMismatch:
return "Component Number changed during two GSF calls";
case GsfError::AllComponentsSteppingError:
return "Stepping errors occurred in all components";
case GsfError::NoComponentCreated:
return "No component has been created in the filter step";
case GsfError::NoStatesCreated:
return "No states where created in the MultiTrajectory";
case GsfError::StartParametersNotOnStartSurface:
return "Start parameters don't lie in the start surface";
case GsfError::PropagationEndedOnWrongSurface:
return "The propagation did not reach the correct target surface";
case GsfError::LastStepParamsContainNan:
return "The parameters to start the last step with contain NAN values";
case GsfError::SmoothingFailed:
return "Smoothing failed because the difference between fwd and bwd "
"was to big";
case GsfError::NoMeasurementStatesCreatedForward:
return "No measurement states found in the forward pass";
case GsfError::NoMeasurementStatesCreatedBackward:
return "No measurement states found in the backward pass";
case GsfError::NoMeasurementStatesCreatedFinal:
return "No measurement states in the final trajectory";
default:
return "unknown";
}
Expand Down
8 changes: 4 additions & 4 deletions Examples/Python/tests/root_file_hashes.txt
Original file line number Diff line number Diff line change
Expand Up @@ -34,10 +34,10 @@ test_truth_tracking_kalman[odd-0.0]__performance_track_finder.root: dacf32346bca
test_truth_tracking_kalman[odd-1000.0]__trackstates_fitter.root: c76b77c50bd054594d0fc8dd5262a602f1c38c49611f6b975a60e77a83eb6525
test_truth_tracking_kalman[odd-1000.0]__tracksummary_fitter.root: 0f26a2e7c67407e0c7092b2d861753d658529147ff2dc4ea968a9c9f28a19bf9
test_truth_tracking_kalman[odd-1000.0]__performance_track_finder.root: dacf32346bca4c7010ca6a21f4868e2a9cdbc764d0918cb498cefdf322567716
test_truth_tracking_gsf[generic]__trackstates_gsf.root: 8c26b89ca9168b6b5e84444ac1cc90cb6316b81a2c8586b8134e9d161cf05e33
test_truth_tracking_gsf[generic]__tracksummary_gsf.root: f313dfbe29b6b3cbc4f1fb10982169424287ca170bc7807eaa36137e8761f457
test_truth_tracking_gsf[odd]__trackstates_gsf.root: e540ca7af70fe9cc2cc41708750cd0fd420e4bf1667774a5967f91f7c5882c4f
test_truth_tracking_gsf[odd]__tracksummary_gsf.root: 2d24d7352e8084b9bd643e8d9802dd4aecc84b73f833170a8e2cabb1887b1edc
test_truth_tracking_gsf[generic]__trackstates_gsf.root: 34f3f0f1e0733ae63bb7bcb99028395da9e5acb3ff267c85042ed3c463e9698b
test_truth_tracking_gsf[generic]__tracksummary_gsf.root: c183dfb54d3c37ef11544c926eb9e1f69584322f75142c0aa07a857fa389dba9
test_truth_tracking_gsf[odd]__trackstates_gsf.root: 50ce998036bfe46a2bd5bd6d9b3802ff0f70f1486d55dbc7518aec3b2599b2e9
test_truth_tracking_gsf[odd]__tracksummary_gsf.root: 2510705988aaea0adfaf3f0d414b0fe8fbc51dfef5ff3ca923358d76e217fa1b
test_particle_gun__particles.root: 8549ba6e20338004ab8ba299fc65e1ee5071985b46df8f77f887cb6fef56a8ec
test_material_mapping__material-map_tracks.root: 90a7deab073691ef431a3711e9cba40e902ce4de92a9b57162d84fbef5f97039
test_material_mapping__propagation-material.root: c60b17ddc4921847bb3e9ebf58de10322d0d3888596ee1106f160055647d8445
Expand Down

0 comments on commit f35d49b

Please sign in to comment.