Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2026-04-17 07:50:37

0001 // SPDX-License-Identifier: LGPL-3.0-or-later
0002 // Copyright (C) 2025 Wouter Deconinck
0003 
0004 #include "ActsTrackMerger.h"
0005 
0006 #include <Acts/EventData/MeasurementHelpers.hpp>
0007 #include <Acts/EventData/TrackContainer.hpp>
0008 #include <Acts/EventData/TrackProxy.hpp>
0009 #include <Acts/EventData/TrackStatePropMask.hpp>
0010 #include <Acts/EventData/VectorMultiTrajectory.hpp>
0011 #include <Acts/EventData/VectorTrackContainer.hpp>
0012 #include <ActsExamples/EventData/Track.hpp>
0013 #include <Eigen/LU> // IWYU pragma: keep
0014 #include <any>
0015 #include <gsl/pointers>
0016 #include <memory>
0017 #include <utility>
0018 #include <vector>
0019 
0020 namespace eicrecon {
0021 
0022 void ActsTrackMerger::process(const Input& input, const Output& output) const {
0023   const auto [input_track_states1, input_tracks1, input_track_states2, input_tracks2] = input;
0024   auto [output_track_states, output_tracks]                                           = output;
0025 
0026   // Collect all input track containers by reconstructing ConstTrackContainer wrappers
0027   std::vector<ActsExamples::ConstTrackContainer> input_containers;
0028 
0029   // Process first input set
0030   auto trackStateContainer1 =
0031       std::make_shared<Acts::ConstVectorMultiTrajectory>(*input_track_states1);
0032   auto trackContainer1 = std::make_shared<Acts::ConstVectorTrackContainer>(*input_tracks1);
0033   input_containers.emplace_back(trackContainer1, trackStateContainer1);
0034 
0035   // Process second input set
0036   auto trackStateContainer2 =
0037       std::make_shared<Acts::ConstVectorMultiTrajectory>(*input_track_states2);
0038   auto trackContainer2 = std::make_shared<Acts::ConstVectorTrackContainer>(*input_tracks2);
0039   input_containers.emplace_back(trackContainer2, trackStateContainer2);
0040 
0041   // Create new mutable containers for merging
0042   auto mergedTrackContainer      = std::make_shared<Acts::VectorTrackContainer>();
0043   auto mergedTrackStateContainer = std::make_shared<Acts::VectorMultiTrajectory>();
0044   ActsExamples::TrackContainer mergedTracks(mergedTrackContainer, mergedTrackStateContainer);
0045 
0046   // Copy all tracks from all input containers
0047   for (const auto& inputContainer : input_containers) {
0048     // Ensure dynamic columns exist in merged container
0049     mergedTracks.ensureDynamicColumns(inputContainer);
0050 
0051     // Copy each track
0052     for (const auto& srcTrack : inputContainer) {
0053       auto destTrack = mergedTracks.makeTrack();
0054       destTrack.copyFrom(srcTrack);
0055     }
0056   }
0057 
0058   // Allocate new const containers and assign pointers to outputs
0059   // (Cannot use placement new because Output<T>::Reset() clears the vector)
0060   *output_track_states =
0061       new Acts::ConstVectorMultiTrajectory(std::move(*mergedTrackStateContainer));
0062   *output_tracks = new Acts::ConstVectorTrackContainer(std::move(*mergedTrackContainer));
0063 }
0064 
0065 } // namespace eicrecon