Skip to content

Commit

Permalink
refactor!: move useBeamSpotConstraint to vertexingOptions (#2272)
Browse files Browse the repository at this point in the history
Previously, the boolean member variable `useBeamSpotConstraint` of the
AMVF and IVF was set independently of the actual beam spot constraint
which was part of the `vertexingOptions`. This PR moves
`useBeamSpotConstraint` to `vertexingOptions` as well.
  • Loading branch information
felix-russo committed Aug 29, 2023
1 parent ea81d56 commit 99050a8
Show file tree
Hide file tree
Showing 17 changed files with 127 additions and 132 deletions.
4 changes: 3 additions & 1 deletion CI/physmon/fpe_masks.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,5 +10,7 @@
FLTUND: 1
"Core/src/Utilities/AnnealingUtility.cpp:40":
FLTUND: 1
"Core/include/Acts/Vertexing/AdaptiveMultiVertexFinder.ipp:119":
"Core/src/Utilities/AnnealingUtility.cpp:38":
FLTUND: 1
"Core/include/Acts/Vertexing/AdaptiveMultiVertexFinder.ipp:120":
FLTUND: 1
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,7 @@ auto Acts::AdaptiveGridDensityVertexFinder<trkGridSize, vfitter_t>::find(
// No tracks were removed anymore
// Return empty seed, i.e. vertex at constraint position
// (Note: Upstream finder should check for this break condition)
std::vector<Vertex<InputTrack_t>> seedVec{
vertexingOptions.vertexConstraint};
std::vector<Vertex<InputTrack_t>> seedVec{vertexingOptions.constraint};
return seedVec;
}
} else {
Expand Down Expand Up @@ -81,12 +80,11 @@ auto Acts::AdaptiveGridDensityVertexFinder<trkGridSize, vfitter_t>::find(
}

// Construct output vertex
Vector3 seedPos =
vertexingOptions.vertexConstraint.position() + Vector3(0., 0., z);
Vector3 seedPos = vertexingOptions.constraint.position() + Vector3(0., 0., z);

Vertex<InputTrack_t> returnVertex = Vertex<InputTrack_t>(seedPos);

SquareMatrix4 seedCov = vertexingOptions.vertexConstraint.fullCovariance();
SquareMatrix4 seedCov = vertexingOptions.constraint.fullCovariance();

if (width != 0.) {
// Use z-constraint from seed width
Expand Down
9 changes: 4 additions & 5 deletions Core/include/Acts/Vertexing/AdaptiveMultiVertexFinder.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -81,10 +81,6 @@ class AdaptiveMultiVertexFinder {

std::shared_ptr<const MagneticFieldProvider> bField;

// Use a beam spot constraint, vertexConstraint in VertexingOptions
// has to be set in this case
bool useBeamSpotConstraint = true;

// Max z interval used for adding tracks to fit:
// When adding a new vertex to the multi vertex fit,
// only the tracks whose z at PCA is closer
Expand Down Expand Up @@ -249,8 +245,10 @@ class AdaptiveMultiVertexFinder {
/// @brief Sets constraint vertex after seeding
///
/// @param currentConstraint Vertex constraint
/// @param useVertexConstraintInFit Indicates whether constraint is used during vertex fit
/// @param seedVertex Seed vertex
void setConstraintAfterSeeding(Vertex<InputTrack_t>& currentConstraint,
bool useVertexConstraintInFit,
Vertex<InputTrack_t>& seedVertex) const;

/// @brief Calculates the IP significance of a track to a given vertex
Expand Down Expand Up @@ -318,12 +316,13 @@ class AdaptiveMultiVertexFinder {
/// @param vtx The vertex candidate
/// @param seedTracks The seed tracks
/// @param fitterState The vertex fitter state
/// @param useVertexConstraintInFit Indicates whether constraint is used in the vertex fit
///
/// @return pair(nCompatibleTracks, isGoodVertex)
std::pair<int, bool> checkVertexAndCompatibleTracks(
Vertex<InputTrack_t>& vtx,
const std::vector<const InputTrack_t*>& seedTracks,
FitterState_t& fitterState) const;
FitterState_t& fitterState, bool useVertexConstraintInFit) const;

/// @brief Method that removes all tracks that are compatible with
/// current vertex from seedTracks
Expand Down
24 changes: 12 additions & 12 deletions Core/include/Acts/Vertexing/AdaptiveMultiVertexFinder.ipp
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ auto Acts::AdaptiveMultiVertexFinder<vfitter_t, sfinder_t>::find(
} else {
searchTracks = seedTracks;
}
Vertex<InputTrack_t> currentConstraint = vertexingOptions.vertexConstraint;
Vertex<InputTrack_t> currentConstraint = vertexingOptions.constraint;
// Retrieve seed vertex from all remaining seedTracks
auto seedResult = doSeeding(seedTracks, currentConstraint, vertexingOptions,
seedFinderState, removedSeedTracks);
Expand All @@ -59,7 +59,7 @@ auto Acts::AdaptiveMultiVertexFinder<vfitter_t, sfinder_t>::find(
ACTS_DEBUG("Position of current vertex candidate after seeding: "
<< vtxCandidate.fullPosition().transpose());
if (vtxCandidate.position().z() ==
vertexingOptions.vertexConstraint.position().z()) {
vertexingOptions.constraint.position().z()) {
ACTS_DEBUG(
"No seed found anymore. Break and stop primary vertex finding.");
allVertices.pop_back();
Expand Down Expand Up @@ -97,7 +97,8 @@ auto Acts::AdaptiveMultiVertexFinder<vfitter_t, sfinder_t>::find(
<< vtxCandidate.fullPosition().transpose());
// Check if vertex is good vertex
auto [nCompatibleTracks, isGoodVertex] =
checkVertexAndCompatibleTracks(vtxCandidate, seedTracks, fitterState);
checkVertexAndCompatibleTracks(vtxCandidate, seedTracks, fitterState,
vertexingOptions.useConstraintInFit);

ACTS_DEBUG("Vertex is good vertex: " << isGoodVertex);
if (nCompatibleTracks > 0) {
Expand Down Expand Up @@ -143,7 +144,7 @@ auto Acts::AdaptiveMultiVertexFinder<vfitter_t, sfinder_t>::doSeeding(
const std::vector<const InputTrack_t*>& removedSeedTracks) const
-> Result<Vertex<InputTrack_t>> {
VertexingOptions<InputTrack_t> seedOptions = vertexingOptions;
seedOptions.vertexConstraint = currentConstraint;
seedOptions.constraint = currentConstraint;

if constexpr (NeedsRemovedTracks<typename sfinder_t::State>::value) {
seedFinderState.tracksToRemove = removedSeedTracks;
Expand All @@ -159,20 +160,18 @@ auto Acts::AdaptiveMultiVertexFinder<vfitter_t, sfinder_t>::doSeeding(

Vertex<InputTrack_t> seedVertex = (*seedResult).back();
// Update constraints according to seed vertex
setConstraintAfterSeeding(currentConstraint, seedVertex);
setConstraintAfterSeeding(currentConstraint, seedOptions.useConstraintInFit,
seedVertex);

return seedVertex;
}

template <typename vfitter_t, typename sfinder_t>
auto Acts::AdaptiveMultiVertexFinder<vfitter_t, sfinder_t>::
setConstraintAfterSeeding(Vertex<InputTrack_t>& currentConstraint,
bool useVertexConstraintInFit,
Vertex<InputTrack_t>& seedVertex) const -> void {
if (m_cfg.useBeamSpotConstraint) {
if (currentConstraint.fullCovariance() == SquareMatrix4::Zero()) {
ACTS_WARNING(
"No constraint provided, but useBeamSpotConstraint set to true.");
}
if (useVertexConstraintInFit) {
if (not m_cfg.useSeedConstraint) {
// Set seed vertex constraint to old constraint before seeding
seedVertex.setFullCovariance(currentConstraint.fullCovariance());
Expand Down Expand Up @@ -350,7 +349,8 @@ auto Acts::AdaptiveMultiVertexFinder<vfitter_t, sfinder_t>::
checkVertexAndCompatibleTracks(
Vertex<InputTrack_t>& vtx,
const std::vector<const InputTrack_t*>& seedTracks,
FitterState_t& fitterState) const -> std::pair<int, bool> {
FitterState_t& fitterState, bool useVertexConstraintInFit) const
-> std::pair<int, bool> {
bool isGoodVertex = false;
int nCompatibleTracks = 0;
for (const auto& trk : fitterState.vtxInfoMap[&vtx].trackLinks) {
Expand All @@ -370,7 +370,7 @@ auto Acts::AdaptiveMultiVertexFinder<vfitter_t, sfinder_t>::
nCompatibleTracks++;
ACTS_DEBUG("Compatible track found.");

if (m_cfg.addSingleTrackVertices && m_cfg.useBeamSpotConstraint) {
if (m_cfg.addSingleTrackVertices && useVertexConstraintInFit) {
isGoodVertex = true;
break;
}
Expand Down
32 changes: 13 additions & 19 deletions Core/include/Acts/Vertexing/FullBilloirVertexFitter.ipp
Original file line number Diff line number Diff line change
Expand Up @@ -84,20 +84,16 @@ Acts::FullBilloirVertexFitter<input_track_t, linearizer_t>::fit(
ndf = 1;
}

// Determine if we do constraint fit or not by checking if an
// invertible non-zero constraint vertex covariance is given
bool isConstraintFit = false;
if (vertexingOptions.vertexConstraint.covariance().determinant() != 0) {
isConstraintFit = true;
// Since we add a term to the chi2 when adding a vertex constraint (see Ref.
// (1)), the number of degrees of freedom increases
// Since we add a term to the chi2 when adding a vertex constraint (see Ref.
// (1)), the number of degrees of freedom increases
if (vertexingOptions.useConstraintInFit) {
ndf += 3;
}

std::vector<BilloirTrack<input_track_t>> billoirTracks;
std::vector<Vector3> trackMomenta;
// Initial guess of the 4D vertex position
Vector4 linPoint = vertexingOptions.vertexConstraint.fullPosition();
Vector4 linPoint = vertexingOptions.constraint.fullPosition();
Vertex<input_track_t> fittedVertex;

for (int nIter = 0; nIter < m_cfg.maxIterations; ++nIter) {
Expand Down Expand Up @@ -188,22 +184,21 @@ Acts::FullBilloirVertexFitter<input_track_t, linearizer_t>::fit(
// Cov(V) = Cov(deltaV)), see Ref. (1).
// invCovV = A-sum{Bi*Ci^-1*Bi^T}
SquareMatrix4 invCovV = billoirVertex.A - billoirVertex.sumBCinvBt;
if (isConstraintFit) {
if (vertexingOptions.useConstraintInFit) {
// Position of vertex constraint in Billoir frame (i.e., in coordinate
// system with origin at linPoint). This will be 0 for first iteration but
// != 0 from second on since our first guess for the vertex position is
// the vertex constraint position.
Vector4 posInBilloirFrame =
vertexingOptions.vertexConstraint.fullPosition() - linPoint;
vertexingOptions.constraint.fullPosition() - linPoint;

// For vertex constraint: T -> T + Cb^-1 (b - V0) where Cb is the
// covariance matrix of the constraint, b is the constraint position, and
// V0 is the vertex estimate (see Ref. (1)).
deltaVFac +=
vertexingOptions.vertexConstraint.fullCovariance().inverse() *
posInBilloirFrame;
deltaVFac += vertexingOptions.constraint.fullCovariance().inverse() *
posInBilloirFrame;
// For vertex constraint: A -> A + Cb^-1
invCovV += vertexingOptions.vertexConstraint.fullCovariance().inverse();
invCovV += vertexingOptions.constraint.fullCovariance().inverse();
}

// Covariance matrix of the 4D vertex position
Expand Down Expand Up @@ -283,17 +278,16 @@ Acts::FullBilloirVertexFitter<input_track_t, linearizer_t>::fit(

// Add an additional term to chi2 if there is a vertex constraint (see Ref.
// (1))
if (isConstraintFit) {
if (vertexingOptions.useConstraintInFit) {
// Position of vertex constraint in Billoir frame (i.e., in coordinate
// system with origin at linPoint).
Vector4 posInBilloirFrame =
vertexingOptions.vertexConstraint.fullPosition() - linPoint;
vertexingOptions.constraint.fullPosition() - linPoint;

newChi2 +=
(posInBilloirFrame.transpose())
.dot(
vertexingOptions.vertexConstraint.fullCovariance().inverse() *
posInBilloirFrame);
.dot(vertexingOptions.constraint.fullCovariance().inverse() *
posInBilloirFrame);
}

if (!std::isnormal(newChi2)) {
Expand Down
8 changes: 3 additions & 5 deletions Core/include/Acts/Vertexing/GridDensityVertexFinder.ipp
Original file line number Diff line number Diff line change
Expand Up @@ -30,8 +30,7 @@ auto Acts::GridDensityVertexFinder<mainGridSize, trkGridSize, vfitter_t>::find(
// No tracks were removed anymore
// Return empty seed, i.e. vertex at constraint position
// (Note: Upstream finder should check for this break condition)
std::vector<Vertex<InputTrack_t>> seedVec{
vertexingOptions.vertexConstraint};
std::vector<Vertex<InputTrack_t>> seedVec{vertexingOptions.constraint};
return seedVec;
}
} else {
Expand Down Expand Up @@ -81,12 +80,11 @@ auto Acts::GridDensityVertexFinder<mainGridSize, trkGridSize, vfitter_t>::find(
}

// Construct output vertex
Vector3 seedPos =
vertexingOptions.vertexConstraint.position() + Vector3(0., 0., z);
Vector3 seedPos = vertexingOptions.constraint.position() + Vector3(0., 0., z);

Vertex<InputTrack_t> returnVertex = Vertex<InputTrack_t>(seedPos);

SquareMatrix4 seedCov = vertexingOptions.vertexConstraint.fullCovariance();
SquareMatrix4 seedCov = vertexingOptions.constraint.fullCovariance();

if (width != 0.) {
// Use z-constraint from seed width
Expand Down
1 change: 0 additions & 1 deletion Core/include/Acts/Vertexing/IterativeVertexFinder.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,6 @@ class IterativeVertexFinder {
IPEstimator ipEst;

// Vertex finder configuration variables
bool useBeamConstraint = false;
double significanceCutSeeding = 10;
double maximumChi2cutForSeeding = 36.;
int maxVertices = 50;
Expand Down
25 changes: 14 additions & 11 deletions Core/include/Acts/Vertexing/IterativeVertexFinder.ipp
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ auto Acts::IterativeVertexFinder<vfitter_t, sfinder_t>::find(
const auto& seedVertex = *seedRes;

if (seedVertex.fullPosition()[eZ] ==
vertexingOptions.vertexConstraint.position().z()) {
vertexingOptions.constraint.position().z()) {
ACTS_DEBUG("No more seed found. Break and stop primary vertex finding.");
break;
}
Expand All @@ -58,15 +58,16 @@ auto Acts::IterativeVertexFinder<vfitter_t, sfinder_t>::find(
Vertex<InputTrack_t> currentVertex;
Vertex<InputTrack_t> currentSplitVertex;

if (m_cfg.useBeamConstraint && !perigeesToFit.empty()) {
if (vertexingOptions.useConstraintInFit && !perigeesToFit.empty()) {
auto fitResult = m_cfg.vertexFitter.fit(
perigeesToFit, m_cfg.linearizer, vertexingOptions, state.fitterState);
if (fitResult.ok()) {
currentVertex = std::move(*fitResult);
} else {
return fitResult.error();
}
} else if (!m_cfg.useBeamConstraint && perigeesToFit.size() > 1) {
} else if (!vertexingOptions.useConstraintInFit &&
perigeesToFit.size() > 1) {
auto fitResult = m_cfg.vertexFitter.fit(
perigeesToFit, m_cfg.linearizer, vertexingOptions, state.fitterState);
if (fitResult.ok()) {
Expand Down Expand Up @@ -97,9 +98,10 @@ auto Acts::IterativeVertexFinder<vfitter_t, sfinder_t>::find(
int nTracksAtVertex = countSignificantTracks(currentVertex);
int nTracksAtSplitVertex = countSignificantTracks(currentSplitVertex);

bool isGoodVertex =
((!m_cfg.useBeamConstraint && ndf > 0 && nTracksAtVertex >= 2) ||
(m_cfg.useBeamConstraint && ndf > 3 && nTracksAtVertex >= 2));
bool isGoodVertex = ((!vertexingOptions.useConstraintInFit && ndf > 0 &&
nTracksAtVertex >= 2) ||
(vertexingOptions.useConstraintInFit && ndf > 3 &&
nTracksAtVertex >= 2));

if (!isGoodVertex) {
removeAllTracks(perigeesToFit, seedTracks);
Expand Down Expand Up @@ -502,15 +504,15 @@ Acts::IterativeVertexFinder<vfitter_t, sfinder_t>::reassignTracksToNewVertex(
// set first to default vertex to be able to check if still good vertex
// later
currentVertex = Vertex<InputTrack_t>();
if (m_cfg.useBeamConstraint && !perigeesToFit.empty()) {
if (vertexingOptions.useConstraintInFit && !perigeesToFit.empty()) {
auto fitResult = m_cfg.vertexFitter.fit(
perigeesToFit, m_cfg.linearizer, vertexingOptions, state.fitterState);
if (fitResult.ok()) {
currentVertex = std::move(*fitResult);
} else {
return Result<bool>::success(false);
}
} else if (!m_cfg.useBeamConstraint && perigeesToFit.size() > 1) {
} else if (!vertexingOptions.useConstraintInFit && perigeesToFit.size() > 1) {
auto fitResult = m_cfg.vertexFitter.fit(
perigeesToFit, m_cfg.linearizer, vertexingOptions, state.fitterState);
if (fitResult.ok()) {
Expand All @@ -526,9 +528,10 @@ Acts::IterativeVertexFinder<vfitter_t, sfinder_t>::reassignTracksToNewVertex(
// Number of significant tracks
int nTracksAtVertex = countSignificantTracks(currentVertex);

bool isGoodVertex =
((!m_cfg.useBeamConstraint && ndf > 0 && nTracksAtVertex >= 2) ||
(m_cfg.useBeamConstraint && ndf > 3 && nTracksAtVertex >= 2));
bool isGoodVertex = ((!vertexingOptions.useConstraintInFit && ndf > 0 &&
nTracksAtVertex >= 2) ||
(vertexingOptions.useConstraintInFit && ndf > 3 &&
nTracksAtVertex >= 2));

if (!isGoodVertex) {
removeAllTracks(perigeesToFit, seedTracks);
Expand Down
5 changes: 2 additions & 3 deletions Core/include/Acts/Vertexing/TrackDensityVertexFinder.ipp
Original file line number Diff line number Diff line change
Expand Up @@ -22,12 +22,11 @@ auto Acts::TrackDensityVertexFinder<vfitter_t, track_density_t>::find(

// Calculate seed position
// Note: constraint position is (0,0,0) if no constraint provided
Vector3 seedPos =
vertexingOptions.vertexConstraint.position() + Vector3(0., 0., z);
Vector3 seedPos = vertexingOptions.constraint.position() + Vector3(0., 0., z);

Vertex<InputTrack_t> returnVertex = Vertex<InputTrack_t>(seedPos);

SquareMatrix3 seedCov = vertexingOptions.vertexConstraint.covariance();
SquareMatrix3 seedCov = vertexingOptions.constraint.covariance();

// Check if a constraint is provided and set the new z position constraint
if (seedCov != SquareMatrix3::Zero() && std::isnormal(zAndWidth.second)) {
Expand Down

0 comments on commit 99050a8

Please sign in to comment.