Skip to content
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

refactor: Trajectories stores MultiTrajectory pointer #1839

Merged
merged 9 commits into from
Feb 13, 2023
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,8 @@ class TrackFindingAlgorithm final : public BareAlgorithm {
std::string inputInitialTrackParameters;
/// Output find trajectories collection.
std::string outputTrajectories;
/// Output find tracks collection.
std::string outputTracks;
/// Type erased track finder function.
std::shared_ptr<TrackFinderFunction> findTracks;
/// CKF measurement selector config
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -191,8 +191,7 @@ ActsExamples::ProcessCode ActsExamples::AmbiguityResolutionAlgorithm::execute(
parameters.emplace(tip, trackParameters[iTrack]);
}

outputTrajectories.emplace_back(traj.multiTrajectoryPtr(), tips,
parameters);
outputTrajectories.emplace_back(traj.multiTrajectory(), tips, parameters);
}

ctx.eventStore.add(m_cfg.outputTrajectories, std::move(outputTrajectories));
Expand Down
16 changes: 10 additions & 6 deletions Examples/Algorithms/TrackFinding/src/TrackFindingAlgorithm.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,9 @@ ActsExamples::TrackFindingAlgorithm::TrackFindingAlgorithm(
if (m_cfg.outputTrajectories.empty()) {
throw std::invalid_argument("Missing trajectories output collection");
}
if (m_cfg.outputTracks.empty()) {
throw std::invalid_argument("Missing tracks output collection");
}
}

ActsExamples::ProcessCode ActsExamples::TrackFindingAlgorithm::execute(
Expand Down Expand Up @@ -101,12 +104,12 @@ ActsExamples::ProcessCode ActsExamples::TrackFindingAlgorithm::execute(

auto trackContainer = std::make_shared<Acts::VectorTrackContainer>();
auto trackStateContainer = std::make_shared<Acts::VectorMultiTrajectory>();
auto tracks =
std::make_unique<TrackContainer>(trackContainer, trackStateContainer);

TrackContainer tracks(trackContainer, trackStateContainer);

for (std::size_t iseed = 0; iseed < initialParameters.size(); ++iseed) {
auto result =
(*m_cfg.findTracks)(initialParameters.at(iseed), options, *tracks);
(*m_cfg.findTracks)(initialParameters.at(iseed), options, tracks);
m_nTotalSeeds++;
if (!result.ok()) {
m_nFailedSeeds++;
Expand All @@ -133,22 +136,23 @@ ActsExamples::ProcessCode ActsExamples::TrackFindingAlgorithm::execute(
}

// Create a Trajectories result struct
trajectories.emplace_back(trackStateContainer, std::move(tips),
trajectories.emplace_back(*trackStateContainer, std::move(tips),
std::move(parameters));
}

// Compute shared hits from all the reconstructed tracks
if (m_cfg.computeSharedHits) {
computeSharedHits(sourceLinks, *tracks);
computeSharedHits(sourceLinks, tracks);
}

ACTS_DEBUG("Finalized track finding with " << trajectories.size()
<< " track candidates.");

m_memoryStatistics.local().hist +=
tracks->trackStateContainer().statistics().hist;
tracks.trackStateContainer().statistics().hist;

ctx.eventStore.add(m_cfg.outputTrajectories, std::move(trajectories));
ctx.eventStore.add(m_cfg.outputTracks, std::move(tracks));
return ActsExamples::ProcessCode::SUCCESS;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,8 @@ class TrackFittingAlgorithm final : public BareAlgorithm {
std::string inputInitialTrackParameters;
/// Output fitted trajectories collection.
std::string outputTrajectories;
/// Output fitted tracks collection.
std::string outputTracks;
/// Type erased fitter function.
std::shared_ptr<TrackFitterFunction> fit;
/// Tracking geometry for surface lookup
Expand Down
13 changes: 8 additions & 5 deletions Examples/Algorithms/TrackFitting/src/TrackFittingAlgorithm.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,9 @@ ActsExamples::TrackFittingAlgorithm::TrackFittingAlgorithm(
if (m_cfg.outputTrajectories.empty()) {
throw std::invalid_argument("Missing output trajectories collection");
}
if (m_cfg.outputTracks.empty()) {
throw std::invalid_argument("Missing output tracks collection");
}
}

ActsExamples::ProcessCode ActsExamples::TrackFittingAlgorithm::execute(
Expand Down Expand Up @@ -80,8 +83,7 @@ ActsExamples::ProcessCode ActsExamples::TrackFittingAlgorithm::execute(

auto trackContainer = std::make_shared<Acts::VectorTrackContainer>();
auto trackStateContainer = std::make_shared<Acts::VectorMultiTrajectory>();
auto tracks =
std::make_unique<TrackContainer>(trackContainer, trackStateContainer);
TrackContainer tracks(trackContainer, trackStateContainer);

// Perform the fit for each input track
std::vector<Acts::SourceLink> trackSourceLinks;
Expand Down Expand Up @@ -132,8 +134,8 @@ ActsExamples::ProcessCode ActsExamples::TrackFittingAlgorithm::execute(
auto result =
m_cfg.directNavigation
? (*m_cfg.fit)(trackSourceLinks, initialParams, options,
surfSequence, *tracks)
: (*m_cfg.fit)(trackSourceLinks, initialParams, options, *tracks);
surfSequence, tracks)
: (*m_cfg.fit)(trackSourceLinks, initialParams, options, tracks);

if (result.ok()) {
// Get the fit output object
Expand All @@ -156,7 +158,7 @@ ActsExamples::ProcessCode ActsExamples::TrackFittingAlgorithm::execute(
ACTS_DEBUG("No fitted parameters for track " << itrack);
}
// store the result
trajectories.emplace_back(trackStateContainer, std::move(trackTips),
trajectories.emplace_back(*trackStateContainer, std::move(trackTips),
std::move(indexedParams));
} else {
ACTS_WARNING("Fit failed for track "
Expand All @@ -173,5 +175,6 @@ ActsExamples::ProcessCode ActsExamples::TrackFittingAlgorithm::execute(
ACTS_DEBUG(ss.str());

ctx.eventStore.add(m_cfg.outputTrajectories, std::move(trajectories));
ctx.eventStore.add(m_cfg.outputTracks, std::move(tracks));
return ActsExamples::ProcessCode::SUCCESS;
}
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,8 @@ class TrackFittingChi2Algorithm final : public BareAlgorithm {
std::string inputInitialTrackParameters;
/// Output fitted trajectories collection.
std::string outputTrajectories;
/// Output fitted tracks collection.
std::string outputTracks;
/// number of update steps
unsigned int nUpdates = 0;
/// Type erased fitter function.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,9 @@ ActsExamples::TrackFittingChi2Algorithm::TrackFittingChi2Algorithm(
if (m_cfg.outputTrajectories.empty()) {
throw std::invalid_argument("Missing output trajectories collection");
}
if (m_cfg.outputTracks.empty()) {
throw std::invalid_argument("Missing output track collection");
}
}

ActsExamples::ProcessCode ActsExamples::TrackFittingChi2Algorithm::execute(
Expand Down Expand Up @@ -78,6 +81,13 @@ ActsExamples::ProcessCode ActsExamples::TrackFittingChi2Algorithm::execute(
// kfOptions.energyLoss = m_cfg.energyLoss;
// TODO: pass options to constructor, or here?

auto trackContainer = std::make_shared<Acts::VectorTrackContainer>();
auto trackStateContainer = std::make_shared<Acts::VectorMultiTrajectory>();
TrackContainer tracks(trackContainer, trackStateContainer);

tracks.addColumn<Acts::ActsScalar>("chi2");
static Acts::ConstTrackAccessor<Acts::ActsScalar> chisquare{"chi2"};

// Perform the fit for each input track
std::vector<Acts::SourceLink> trackSourceLinks;
std::vector<const Acts::Surface*> surfSequence;
Expand Down Expand Up @@ -121,17 +131,9 @@ ActsExamples::ProcessCode ActsExamples::TrackFittingChi2Algorithm::execute(
}
}

auto trackContainer = std::make_shared<Acts::VectorTrackContainer>();
auto trackStateContainer = std::make_shared<Acts::VectorMultiTrajectory>();
auto tracks =
std::make_unique<TrackContainer>(trackContainer, trackStateContainer);

tracks->addColumn<Acts::ActsScalar>("chi2");
static Acts::ConstTrackAccessor<Acts::ActsScalar> chisquare{"chi2"};

ACTS_DEBUG("invoke fitter");
auto result = fitTrack(trackSourceLinks, initialParams, chi2Options,
surfSequence, *tracks);
surfSequence, tracks);

if (result.ok()) {
ACTS_DEBUG("result ok");
Expand All @@ -158,7 +160,7 @@ ActsExamples::ProcessCode ActsExamples::TrackFittingChi2Algorithm::execute(
ACTS_DEBUG("No fitted parameters for track " << itrack);
}
// store the result
trajectories.emplace_back(trackStateContainer, std::move(trackTips),
trajectories.emplace_back(*trackStateContainer, std::move(trackTips),
std::move(indexedParams));
} else {
ACTS_WARNING("Fit failed for track "
Expand All @@ -171,6 +173,7 @@ ActsExamples::ProcessCode ActsExamples::TrackFittingChi2Algorithm::execute(
}

ctx.eventStore.add(m_cfg.outputTrajectories, std::move(trajectories));
ctx.eventStore.add(m_cfg.outputTracks, std::move(tracks));
// TODO: add chi2 values as output?
return ActsExamples::ProcessCode::SUCCESS;
}
Original file line number Diff line number Diff line change
Expand Up @@ -105,7 +105,7 @@ ActsExamples::ProcessCode ActsExamples::TrackModifier::execute(
parameters.emplace(tip, modifyTrack(trk));
}

outputTrajectories.emplace_back(trajectories.multiTrajectoryPtr(), tips,
outputTrajectories.emplace_back(trajectories.multiTrajectory(), tips,
parameters);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -104,7 +104,7 @@ ActsExamples::ProcessCode ActsExamples::TrackSelector::execute(
++outputCount;
}

outputTrajectories.emplace_back(trajectories.multiTrajectoryPtr(), tips,
outputTrajectories.emplace_back(trajectories.multiTrajectory(), tips,
parameters);
}

Expand Down
19 changes: 9 additions & 10 deletions Examples/Framework/include/ActsExamples/EventData/Trajectories.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@

#include "Acts/EventData/MultiTrajectory.hpp"
#include "Acts/EventData/VectorMultiTrajectory.hpp"
#include "Acts/Utilities/ThrowAssert.hpp"
#include "ActsExamples/EventData/IndexSourceLink.hpp"
#include "ActsExamples/EventData/Track.hpp"

Expand Down Expand Up @@ -41,24 +42,22 @@ struct Trajectories final {
/// Construct from fitted multi trajectory and parameters.
///
/// @param multiTraj The multi trajectory
/// @param tTips Tip indices that identify valid trajectories
/// /// @param tTips Tip indices that identify valid trajectories
/// @param parameters Fitted track parameters indexed by trajectory index
Trajectories(std::shared_ptr<MultiTrajectory> multiTraj,
Trajectories(const MultiTrajectory& multiTraj,
const std::vector<Acts::MultiTrajectoryTraits::IndexType>& tTips,
const IndexedParameters& parameters)
: m_multiTrajectory(std::move(multiTraj)),
: m_multiTrajectory(&multiTraj),
m_trackTips(tTips),
m_trackParameters(parameters) {}

/// Return true if there exists no valid trajectory.
bool empty() const { return m_trackTips.empty(); }

/// Access the underlying multi trajectory.
const MultiTrajectory& multiTrajectory() const { return *m_multiTrajectory; }

/// Access the underlying multi trajectory pointer.
const std::shared_ptr<MultiTrajectory>& multiTrajectoryPtr() const {
return m_multiTrajectory;
const MultiTrajectory& multiTrajectory() const {
throw_assert(m_multiTrajectory != nullptr, "MultiTrajectory is null");
return *m_multiTrajectory;
}

/// Access the tip indices that identify valid trajectories.
Expand Down Expand Up @@ -99,8 +98,8 @@ struct Trajectories final {
}

private:
// The multiTrajectory
std::shared_ptr<MultiTrajectory> m_multiTrajectory;
// The track container
const MultiTrajectory* m_multiTrajectory{nullptr};
// The entry indices of trajectories stored in multiTrajectory
std::vector<Acts::MultiTrajectoryTraits::IndexType> m_trackTips = {};
// The fitted parameters at the provided surface for individual trajectories
Expand Down
3 changes: 3 additions & 0 deletions Examples/Python/python/acts/examples/reconstruction.py
Original file line number Diff line number Diff line change
Expand Up @@ -768,6 +768,7 @@ def addKalmanTracks(
inputProtoTracks=inputProtoTracks,
inputInitialTrackParameters="estimatedparameters",
outputTrajectories="kfTrajectories",
outputTracks="kfTracks",
directNavigation=directNavigation,
pickTrack=-1,
trackingGeometry=trackingGeometry,
Expand Down Expand Up @@ -808,6 +809,7 @@ def addTruthTrackingGsf(
inputProtoTracks="prototracks",
inputInitialTrackParameters="estimatedparameters",
outputTrajectories="gsf_trajectories",
outputTracks="gsf_tracks",
directNavigation=False,
pickTrack=-1,
trackingGeometry=trackingGeometry,
Expand Down Expand Up @@ -873,6 +875,7 @@ def addCKFTracks(
inputSourceLinks="sourcelinks",
inputInitialTrackParameters="estimatedparameters",
outputTrajectories="ckfTrajectories",
outputTracks="ckfTracks",
findTracks=acts.examples.TrackFindingAlgorithm.makeTrackFinderFunction(
trackingGeometry, field
),
Expand Down
1 change: 1 addition & 0 deletions Examples/Python/src/TrackFinding.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -263,6 +263,7 @@ void addTrackFinding(Context& ctx) {
ACTS_PYTHON_MEMBER(inputSourceLinks);
ACTS_PYTHON_MEMBER(inputInitialTrackParameters);
ACTS_PYTHON_MEMBER(outputTrajectories);
ACTS_PYTHON_MEMBER(outputTracks);
ACTS_PYTHON_MEMBER(findTracks);
ACTS_PYTHON_MEMBER(measurementSelectorCfg);
ACTS_PYTHON_STRUCT_END();
Expand Down
2 changes: 2 additions & 0 deletions Examples/Python/src/TrackFitting.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ void addTrackFitting(Context& ctx) {
ACTS_PYTHON_MEMBER(inputProtoTracks);
ACTS_PYTHON_MEMBER(inputInitialTrackParameters);
ACTS_PYTHON_MEMBER(outputTrajectories);
ACTS_PYTHON_MEMBER(outputTracks);
ACTS_PYTHON_MEMBER(fit);
ACTS_PYTHON_MEMBER(trackingGeometry);
ACTS_PYTHON_MEMBER(pickTrack);
Expand Down Expand Up @@ -136,6 +137,7 @@ void addTrackFitting(Context& ctx) {
ACTS_PYTHON_MEMBER(inputProtoTracks);
ACTS_PYTHON_MEMBER(inputInitialTrackParameters);
ACTS_PYTHON_MEMBER(outputTrajectories);
ACTS_PYTHON_MEMBER(outputTracks);
ACTS_PYTHON_MEMBER(nUpdates);
ACTS_PYTHON_MEMBER(fit);
ACTS_PYTHON_MEMBER(trackingGeometry);
Expand Down