Skip to content

Commit 2c3edbe

Browse files
feat: Bindings for Spacepoints, Seeds and TrackContainer (#5242)
Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com>
1 parent 98e9de4 commit 2c3edbe

File tree

24 files changed

+1248
-206
lines changed

24 files changed

+1248
-206
lines changed

Core/include/Acts/EventData/TrackProxy.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -255,6 +255,7 @@ class TrackProxy
255255
using Base::chi2;
256256
using Base::direction;
257257
using Base::fourMomentum;
258+
using Base::isForwardLinked;
258259
using Base::loc0;
259260
using Base::loc1;
260261
using Base::momentum;

Core/include/Acts/EventData/TrackProxyCommon.hpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
#include "Acts/Definitions/Common.hpp"
1212
#include "Acts/Definitions/TrackParametrization.hpp"
13+
#include "Acts/EventData/Types.hpp"
1314
#include "Acts/Utilities/HashedString.hpp"
1415

1516
namespace Acts {
@@ -77,6 +78,12 @@ class TrackProxyCommon {
7778
return derived().template component<IndexType, detail_tp::kStemIndexKey>();
7879
}
7980

81+
/// Return whether the track is forward-linked, i.e. whether each track state
82+
/// has a valid next-state index. Forward-linking is required to use the
83+
/// inside-out @c trackStates() range.
84+
/// @return True if the track is forward-linked
85+
bool isForwardLinked() const { return stemIndex() != kTrackIndexInvalid; }
86+
8087
/// Return the number of measurements assigned to this track.
8188
/// @return The number of measurements
8289
unsigned int nMeasurements() const {

Core/include/Acts/TrackFinding/TrackSelector.hpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -438,8 +438,7 @@ void TrackSelector::selectTracks(const input_tracks_t& inputTracks,
438438
continue;
439439
}
440440
auto destProxy = outputTracks.makeTrack();
441-
destProxy.copyFromWithoutStates(track);
442-
destProxy.tipIndex() = track.tipIndex();
441+
destProxy.copyFromShallow(track);
443442
}
444443
}
445444

Examples/Algorithms/TrackFitting/include/ActsExamples/TrackFitting/TrackFittingAlgorithm.hpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,9 @@ class TrackFittingAlgorithm final : public IAlgorithm {
4646
int pickTrack = -1;
4747
// Type erased calibrator for the measurements
4848
std::shared_ptr<MeasurementCalibrator> calibrator;
49+
/// Forward-link all tracks after fitting, enabling inside-out track state
50+
/// iteration via TrackProxy::trackStates(). Off by default.
51+
bool linkForward = false;
4952
};
5053

5154
/// Constructor of the fitting algorithm

Examples/Algorithms/TrackFitting/src/TrackFittingAlgorithm.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -174,6 +174,12 @@ ProcessCode TrackFittingAlgorithm::execute(const AlgorithmContext& ctx) const {
174174

175175
ACTS_DEBUG("Fitted tracks: " << trackContainer->size());
176176

177+
if (m_cfg.linkForward) {
178+
for (auto track : tracks) {
179+
track.linkForward();
180+
}
181+
}
182+
177183
if (logger().doPrint(Acts::Logging::DEBUG)) {
178184
std::stringstream ss;
179185
trackStateContainer->statistics().toStream(ss);

Examples/Scripts/Python/truth_tracking_kalman.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ def runTruthTrackingKalman(
2020
generatedParticleType: acts.PdgParticle = acts.PdgParticle.eMuon,
2121
reverseFilteringMomThreshold=0 * u.GeV,
2222
reverseFilteringCovarianceScaling=100.0,
23+
numParticles=1,
24+
linkForward: bool = False,
2325
s: acts.examples.Sequencer = None,
2426
):
2527
from acts.examples.simulation import (
@@ -64,7 +66,9 @@ def runTruthTrackingKalman(
6466
if inputParticlePath is None:
6567
addParticleGun(
6668
s,
67-
ParticleConfig(num=1, pdg=generatedParticleType, randomizeCharge=True),
69+
ParticleConfig(
70+
num=numParticles, pdg=generatedParticleType, randomizeCharge=True
71+
),
6872
EtaConfig(-3.0, 3.0, uniform=True),
6973
MomentumConfig(1.0 * u.GeV, 100.0 * u.GeV, transverse=True),
7074
PhiConfig(0.0, 360.0 * u.degree),
@@ -165,6 +169,7 @@ def runTruthTrackingKalman(
165169
field,
166170
reverseFilteringMomThreshold,
167171
reverseFilteringCovarianceScaling,
172+
linkForward=linkForward,
168173
)
169174

170175
s.addAlgorithm(

Python/Core/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ target_sources(
1111
ActsPythonBindings
1212
PRIVATE
1313
src/Definitions.cpp
14+
src/EventData.cpp
1415
src/Utilities.cpp
1516
src/MagneticField.cpp
1617
src/Material.cpp

Python/Core/src/CoreModuleEntry.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ namespace py = pybind11;
1919
namespace ActsPython {
2020

2121
void addDefinitions(py::module_& m);
22+
void addEventData(py::module_& m);
2223
void addMagneticField(py::module_& m);
2324
void addUtilities(py::module_& m);
2425
void addVisualization(py::module_& m);
@@ -64,6 +65,7 @@ PYBIND11_MODULE(ActsPythonBindings, m) {
6465

6566
addSurfaces(m);
6667
addGeometry(m);
68+
addEventData(m);
6769
addGeometryGen1(m);
6870
addGeometryGen3(m);
6971
addNavigation(m);

Python/Core/src/Definitions.cpp

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
#include "Acts/Definitions/Algebra.hpp"
1010
#include "Acts/Definitions/PdgParticle.hpp"
11+
#include "Acts/Definitions/TrackParametrization.hpp"
1112
#include "Acts/Definitions/Units.hpp"
1213
#include "Acts/EventData/ParticleHypothesis.hpp"
1314

@@ -99,6 +100,40 @@ void addDefinitions(py::module_& m) {
99100
self[3]);
100101
});
101102

103+
py::class_<BoundVector>(m, "BoundVector")
104+
.def(py::init<double, double, double, double, double, double>())
105+
.def(py::init([](std::array<double, 6> a) {
106+
BoundVector v;
107+
v << a[0], a[1], a[2], a[3], a[4], a[5];
108+
return v;
109+
}))
110+
.def_static("Zero", []() -> BoundVector { return BoundVector::Zero(); })
111+
.def("__getitem__",
112+
[](const BoundVector& self, Eigen::Index i) { return self[i]; })
113+
.def("__str__", [](const BoundVector& self) {
114+
return std::format("({}, {}, {}, {}, {}, {})", self[0], self[1],
115+
self[2], self[3], self[4], self[5]);
116+
});
117+
118+
py::class_<BoundMatrix>(m, "BoundMatrix")
119+
.def(py::init([]() { return BoundMatrix::Zero(); }))
120+
.def_static("Zero", []() -> BoundMatrix { return BoundMatrix::Zero(); })
121+
.def_static("Identity",
122+
[]() -> BoundMatrix { return BoundMatrix::Identity(); })
123+
.def("__getitem__",
124+
[](const BoundMatrix& self, py::object idx) {
125+
py::tuple t = idx.cast<py::tuple>();
126+
if (py::len(t) != 2) {
127+
throw py::index_error("BoundMatrix index must be (i, j)");
128+
}
129+
return self(t[0].cast<Eigen::Index>(), t[1].cast<Eigen::Index>());
130+
})
131+
.def("__str__", [](const BoundMatrix& self) {
132+
std::stringstream ss;
133+
ss << self;
134+
return ss.str();
135+
});
136+
102137
py::class_<Translation3>(m, "Translation3")
103138
.def(py::init([](const Vector3& a) { return Translation3(a); }))
104139
.def(py::init([](std::array<double, 3> a) {

0 commit comments

Comments
 (0)