Skip to content

Commit

Permalink
Merge branch 'main' into feat-ckf-allow-skip-first-surface
Browse files Browse the repository at this point in the history
  • Loading branch information
kodiakhq[bot] authored Aug 30, 2024
2 parents 08401c7 + e23a8ad commit 13c0190
Show file tree
Hide file tree
Showing 53 changed files with 1,715 additions and 1,223 deletions.
1 change: 1 addition & 0 deletions Core/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,7 @@ add_subdirectory(src/Detector)
add_subdirectory(src/Geometry)
add_subdirectory(src/MagneticField)
add_subdirectory(src/Material)
add_subdirectory(src/Navigation)
add_subdirectory(src/Propagator)
add_subdirectory(src/Surfaces)
add_subdirectory(src/TrackFinding)
Expand Down
18 changes: 6 additions & 12 deletions Core/include/Acts/EventData/MultiTrajectory.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@
#include "Acts/Utilities/HashedString.hpp"
#include "Acts/Utilities/Helpers.hpp"
#include "Acts/Utilities/ThrowAssert.hpp"
#include "Acts/Utilities/TypeTraits.hpp"

#include <bitset>
#include <cstddef>
Expand Down Expand Up @@ -116,12 +115,9 @@ class TrackStateRange {

// implement track state visitor concept
template <typename T, typename TS>
using call_operator_t = decltype(std::declval<T>()(std::declval<TS>()));

template <typename T, typename TS>
constexpr bool VisitorConcept = Concepts ::require<
Concepts ::either<Concepts ::identical_to<bool, call_operator_t, T, TS>,
Concepts ::identical_to<void, call_operator_t, T, TS>>>;
concept VisitorConcept = requires(T& t, TS& ts) {
{ t(ts) } -> Concepts::same_as_any_of<void, bool>;
};

} // namespace detail_lt

Expand Down Expand Up @@ -269,7 +265,8 @@ class MultiTrajectory {
/// @param iendpoint index of the last state
/// @param callable non-modifying functor to be called with each point
template <typename F>
void visitBackwards(IndexType iendpoint, F&& callable) const;
void visitBackwards(IndexType iendpoint, F&& callable) const
requires detail_lt::VisitorConcept<F, ConstTrackStateProxy>;

/// Apply a function to all previous states starting at a given endpoint.
///
Expand All @@ -281,11 +278,8 @@ class MultiTrajectory {
/// @note Only available if the MultiTrajectory is not read-only
template <typename F>
void applyBackwards(IndexType iendpoint, F&& callable)
requires(!ReadOnly)
requires(!ReadOnly) && detail_lt::VisitorConcept<F, TrackStateProxy>
{
static_assert(detail_lt::VisitorConcept<F, TrackStateProxy>,
"Callable needs to satisfy VisitorConcept");

if (iendpoint == MultiTrajectoryTraits::kInvalid) {
throw std::runtime_error(
"Cannot apply backwards with kInvalid as endpoint");
Expand Down
9 changes: 3 additions & 6 deletions Core/include/Acts/EventData/MultiTrajectory.ipp
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@
// file, You can obtain one at http://mozilla.org/MPL/2.0/.

#include "Acts/Utilities/AlgebraHelpers.hpp"
#include "Acts/Utilities/TypeTraits.hpp"

#include <bitset>
#include <cstdint>
Expand All @@ -20,11 +19,9 @@ namespace Acts {

template <typename D>
template <typename F>
void MultiTrajectory<D>::visitBackwards(IndexType iendpoint,
F&& callable) const {
static_assert(detail_lt::VisitorConcept<F, ConstTrackStateProxy>,
"Callable needs to satisfy VisitorConcept");

void MultiTrajectory<D>::visitBackwards(IndexType iendpoint, F&& callable) const
requires detail_lt::VisitorConcept<F, ConstTrackStateProxy>
{
if (iendpoint == MultiTrajectoryTraits::kInvalid) {
throw std::runtime_error(
"Cannot visit backwards with kInvalid as endpoint");
Expand Down
1 change: 0 additions & 1 deletion Core/include/Acts/EventData/SourceLink.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@
#include "Acts/Geometry/GeometryIdentifier.hpp"
#include "Acts/Utilities/Any.hpp"
#include "Acts/Utilities/Delegate.hpp"
#include "Acts/Utilities/TypeTraits.hpp"

#include <cassert>
#include <concepts>
Expand Down
1 change: 0 additions & 1 deletion Core/include/Acts/EventData/TrackParametersConcept.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@
#include "Acts/Definitions/Algebra.hpp"
#include "Acts/Definitions/TrackParametrization.hpp"
#include "Acts/Geometry/GeometryContext.hpp"
#include "Acts/Utilities/TypeTraits.hpp"

#include <concepts>
#include <optional>
Expand Down
178 changes: 178 additions & 0 deletions Core/include/Acts/Navigation/NavigationStream.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,178 @@
// This file is part of the Acts project.
//
// Copyright (C) 2024 CERN for the benefit of the Acts project
//
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
// file, You can obtain one at http://mozilla.org/MPL/2.0/.

#pragma once

#include "Acts/Definitions/Algebra.hpp"
#include "Acts/Geometry/GeometryContext.hpp"
#include "Acts/Surfaces/BoundaryTolerance.hpp"
#include "Acts/Utilities/Intersection.hpp"

#include <tuple>
#include <vector>

namespace Acts {

// To be removed when the namespace Experimental is omitted
namespace Experimental {
class Portal;
}
using namespace Experimental;

class Surface;

/// The NavigationStream is a container for the navigation candidates that
/// are currentlu processed in a given context. The context could be local to a
/// volume, or global to an entire track following.
///
/// The current candidates are stored in a vector of candidates, where an index
/// is used to indicate the current active candidate.
class NavigationStream {
public:
/// The query point for the navigation stream
///
/// This holds the position and direction from which the navigation stream
/// should either be initialized or updated.
struct QueryPoint {
/// The position of the query point
Vector3 position = Vector3::Zero();
/// The direction of the query point
Vector3 direction = Vector3::Zero();
};

/// This is a candidate object of the navigation stream, it holds:
///
/// - a Surface intersection
/// - a Portal : set if the surface represents a portal
/// - a BoundaryTolerance : the boundary tolerance used for the intersection
struct Candidate {
/// The intersection
ObjectIntersection<Surface> intersection =
ObjectIntersection<Surface>::invalid();
/// The portal
const Portal* portal = nullptr;
/// The boundary tolerance
BoundaryTolerance bTolerance = BoundaryTolerance::None();
/// Convenience access to surface
const Surface& surface() const { return *intersection.object(); }
/// Cinvencience access to the path length
ActsScalar pathLength() const { return intersection.pathLength(); }

/// Order along the path length
///
/// @param aCandidate is the first candidate
/// @param bCandidate is the second candidate
///
/// @return true if aCandidate is closer to the origin
constexpr static bool pathLengthOrder(const Candidate& aCandidate,
const Candidate& bCandidate) {
return ObjectIntersection<Surface>::pathLengthOrder(
aCandidate.intersection, bCandidate.intersection);
}
};

/// Switch to next next candidate
///
/// @return true if a next candidate is available
bool switchToNextCandidate() {
if (m_currentIndex < m_candidates.size()) {
++m_currentIndex;
return true;
}
return false;
}

/// Const access the current candidate
const Candidate& currentCandidate() const {
return m_candidates.at(m_currentIndex);
}

/// Current Index
std::size_t currentIndex() const { return m_currentIndex; }

/// Non-cost access the candidate vector
std::vector<Candidate>& candidates() { return m_candidates; }

/// Const access the candidate vector
const std::vector<Candidate>& candidates() const { return m_candidates; }

/// Non-cost access the current candidate
///
/// This will throw and out of bounds exception if the stream is not
/// valid anymore.
Candidate& currentCandidate() { return m_candidates.at(m_currentIndex); }

/// The number of active candidates
std::size_t remainingCandidates() const {
return (m_candidates.size() - m_currentIndex);
}

/// Fill one surface into the candidate vector
///
/// @param surface the surface to be filled
/// @param bTolerance the boundary tolerance used for the intersection
void addSurfaceCandidate(const Surface* surface,
const BoundaryTolerance& bTolerance);

/// Fill n surfaces into the candidate vector
///
/// @param surfaces the surfaces that are filled in
/// @param bTolerance the boundary tolerance used for the intersection
void addSurfaceCandidates(const std::vector<const Surface*>& surfaces,
const BoundaryTolerance& bTolerance);

/// Fill one portal into the candidate vector
///
/// @param portal the portals that are filled in
void addPortalCandidate(const Portal* portal);

/// Fill n portals into the candidate vector
///
/// @param portals the portals that are filled in
void addPortalCandidates(const std::vector<const Portal*>& portals);

/// Initialize the stream from a query point
///
/// @param gctx is the geometry context
/// @param queryPoint holds current position, direction, etc.
/// @param cTolerance is the candidate search tolerance
/// @param onSurfaceTolerance is the tolerance for on-surface intersections
///
/// This method will first de-duplicate the candidates on basis of the surface
/// pointer to make sure that the multi-intersections are handled correctly.
/// This will allow intializeStream() to be called even as a re-initialization
/// and still work correctly with at one time valid candidates.
///
/// @return true if the stream is active, false indicates that there are no valid candidates
bool initialize(const GeometryContext& gctx,
const NavigationStream::QueryPoint& queryPoint,
const BoundaryTolerance& cTolerance,
ActsScalar onSurfaceTolerance = s_onSurfaceTolerance);

/// Convenience method to update a stream from a new query point,
/// this could be called from navigation delegates that do not require
/// a local state or from the navigator on the target stream
///
/// @param gctx is the geometry context
/// @param queryPoint holds current position, direction, etc.
/// @param onSurfaceTolerance is the tolerance for on-surface intersections
///
/// @return true if the stream is active, false indicate no valid candidates left
bool update(const GeometryContext& gctx,
const NavigationStream::QueryPoint& queryPoint,
ActsScalar onSurfaceTolerance = s_onSurfaceTolerance);

private:
/// The candidates of this navigation stream
std::vector<Candidate> m_candidates;

/// The currently active candidate
std::size_t m_currentIndex = 0u;
};

} // namespace Acts
Loading

0 comments on commit 13c0190

Please sign in to comment.