Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2026-03-31 07:48:29

0001 // SPDX-License-Identifier: LGPL-3.0-or-later
0002 // Copyright (C) 2025 Wouter Deconinck
0003 
0004 #pragma once
0005 
0006 #include <ActsExamples/EventData/Track.hpp>
0007 #include <JANA/JEvent.h>
0008 #include <memory>
0009 #include <string>
0010 #include <utility>
0011 #include <vector>
0012 
0013 #include "algorithms/tracking/ActsTrackMerger.h"
0014 #include "extensions/jana/JOmniFactory.h"
0015 
0016 namespace eicrecon {
0017 
0018 /// Factory that merges Acts track containers from multiple sources into a single output.
0019 ///
0020 /// Typical use is to combine tracks reconstructed in different subsystems
0021 /// (e.g. central tracker and B0 tracker) into one unified collection for
0022 /// downstream reconstruction or analysis. The current implementation simply
0023 /// concatenates the input ConstTrackContainer collections in the order they
0024 /// are provided.
0025 class ActsTrackMerger_factory : public JOmniFactory<ActsTrackMerger_factory, NoConfig> {
0026 public:
0027   using AlgoT = eicrecon::ActsTrackMerger;
0028 
0029 private:
0030   std::unique_ptr<AlgoT> m_algo;
0031 
0032   Input<Acts::ConstVectorMultiTrajectory> m_acts_track_states1_input{this};
0033   Input<Acts::ConstVectorTrackContainer> m_acts_tracks1_input{this};
0034   Input<Acts::ConstVectorMultiTrajectory> m_acts_track_states2_input{this};
0035   Input<Acts::ConstVectorTrackContainer> m_acts_tracks2_input{this};
0036   Output<Acts::ConstVectorMultiTrajectory> m_acts_track_states_output{this};
0037   Output<Acts::ConstVectorTrackContainer> m_acts_tracks_output{this};
0038 
0039 public:
0040   void Configure() {
0041     m_algo = std::make_unique<AlgoT>(this->GetPrefix());
0042     m_algo->level((algorithms::LogLevel)logger()->level());
0043     m_algo->applyConfig(config());
0044     m_algo->init();
0045   }
0046 
0047   void Process(int32_t /* run_number */, uint64_t /* event_number */) {
0048     auto track_states1_vec = m_acts_track_states1_input();
0049     auto tracks1_vec       = m_acts_tracks1_input();
0050     auto track_states2_vec = m_acts_track_states2_input();
0051     auto tracks2_vec       = m_acts_tracks2_input();
0052 
0053     assert(!track_states1_vec.empty() && "ConstVectorMultiTrajectory vector 1 should not be empty");
0054     assert(track_states1_vec.front() != nullptr &&
0055            "ConstVectorMultiTrajectory pointer 1 should not be null");
0056     assert(!tracks1_vec.empty() && "ConstVectorTrackContainer vector 1 should not be empty");
0057     assert(tracks1_vec.front() != nullptr &&
0058            "ConstVectorTrackContainer pointer 1 should not be null");
0059     assert(!track_states2_vec.empty() && "ConstVectorMultiTrajectory vector 2 should not be empty");
0060     assert(track_states2_vec.front() != nullptr &&
0061            "ConstVectorMultiTrajectory pointer 2 should not be null");
0062     assert(!tracks2_vec.empty() && "ConstVectorTrackContainer vector 2 should not be empty");
0063     assert(tracks2_vec.front() != nullptr &&
0064            "ConstVectorTrackContainer pointer 2 should not be null");
0065 
0066     m_algo->process(AlgoT::Input{track_states1_vec.front(), tracks1_vec.front(),
0067                                  track_states2_vec.front(), tracks2_vec.front()},
0068                     AlgoT::Output{&m_acts_track_states_output().emplace_back(),
0069                                   &m_acts_tracks_output().emplace_back()});
0070   }
0071 };
0072 
0073 } // namespace eicrecon