-
Notifications
You must be signed in to change notification settings - Fork 174
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: Marking Edgeholes during track finding #3988
base: main
Are you sure you want to change the base?
Changes from all commits
4f0fe37
ad0e897
e9a20e6
5cb0ada
29ed187
fbc3b2f
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -518,6 +518,10 @@ class CombinatorialKalmanFilter { | |
/// Calibration context for the finding run | ||
const CalibrationContext* calibrationContextPtr{nullptr}; | ||
|
||
|
||
/// PlaceHolder for EdgeHoles | ||
bool keepEdgeHoles = false; | ||
|
||
/// @brief CombinatorialKalmanFilter actor operation | ||
/// | ||
/// @tparam propagator_state_t Type of the Propagator state | ||
|
@@ -810,6 +814,7 @@ class CombinatorialKalmanFilter { | |
currentBranch = result.activeBranches.back(); | ||
prevTip = currentBranch.tipIndex(); | ||
} else { | ||
|
||
if (expectMeasurements) { | ||
ACTS_VERBOSE("Detected hole after measurement selection on surface " | ||
<< surface->geometryId()); | ||
|
@@ -823,7 +828,23 @@ class CombinatorialKalmanFilter { | |
currentBranch.tipIndex() = currentTip; | ||
auto currentState = currentBranch.outermostTrackState(); | ||
if (expectMeasurements) { | ||
currentBranch.nHoles()++; | ||
static const BoundaryTolerance exclude_sensor_border | ||
= BoundaryTolerance(BoundaryTolerance::AbsoluteCartesian{-2*UnitConstants::mm,-2*UnitConstants::mm}); | ||
if (currentState.referenceSurface().insideBounds(currentState.parameters().template head<2>(), | ||
exclude_sensor_border)) { | ||
currentBranch.nHoles()++; | ||
} | ||
else { | ||
if (!keepEdgeHoles) { | ||
currentBranch.nHoles()++; | ||
} | ||
else { | ||
auto typeFlags = currentState.typeFlags(); | ||
typeFlags.reset(TrackStateFlag::HoleFlag); | ||
typeFlags.set(TrackStateFlag::EdgeHoleFlag); | ||
//currentBranch.nEdgeHoles()++; | ||
} | ||
} | ||
Comment on lines
+831
to
+847
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. IMO this is an experiment choice and it should not be part of the Core CKF. This can be put into the track state creator to put the user in control There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Not sure whether there is a universally accepted definition of what a hole is. Is it really a how if the edge is within the uncertainties of the trajectory ? It is a definition, but I guess one can argue either way, whether it should be counted as a hole or not. Sure an ad hoc 2mm tolerance is not universal. |
||
} | ||
|
||
BranchStopperResult branchStopperResult = | ||
|
@@ -1198,6 +1219,8 @@ class CombinatorialKalmanFilter { | |
combKalmanActor.updaterLogger = m_updaterLogger.get(); | ||
combKalmanActor.calibrationContextPtr = &tfOptions.calibrationContext.get(); | ||
|
||
combKalmanActor.keepEdgeHoles = tfOptions.propagatorPlainOptions.keepEdgeHoles; | ||
|
||
// copy source link accessor, calibrator and measurement selector | ||
combKalmanActor.m_sourceLinkAccessor = tfOptions.sourceLinkAccessor; | ||
combKalmanActor.m_extensions = tfOptions.extensions; | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -16,6 +16,15 @@ | |
bool Acts::RectangleBounds::inside( | ||
const Acts::Vector2& lposition, | ||
const Acts::BoundaryTolerance& boundaryTolerance) const { | ||
if (boundaryTolerance.hasAbsoluteCartesian()) { | ||
|
||
const BoundaryTolerance::AbsoluteCartesian& tolerance = boundaryTolerance.asAbsoluteCartesian(); | ||
return lposition(0,0) > (m_min.x()-tolerance.tolerance0) | ||
&& lposition(0,0) < (m_max.x()+tolerance.tolerance0) | ||
&& lposition(1,0) > (m_min.y()-tolerance.tolerance1) | ||
&& lposition(1,0) < (m_max.y()+tolerance.tolerance1); | ||
} | ||
|
||
Comment on lines
+19
to
+27
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. why was this necessary? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @goetzgaycken Can you comment on this? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. It was just easier to implement the negative tolerance, this way then trying to add it to the more generic implementation. Btw. the implementation was not meant for a PR, it was more a proof of concept. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Doesn't There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
|
||
return detail::insideAlignedBox(m_min, m_max, boundaryTolerance, lposition, | ||
std::nullopt); | ||
} | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think this can be replaced by a proper implementation of the inside check given a tolerance
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
passing the "scale" parameter avoids a division. But anyway the way it is implemented duplicates code. So, as mentioned at a different place. This was the easiest way to implement it and was anyway more meant to be a proof of concept. And so far we only see that the concept does not work all that great ;-)