File indexing completed on 2026-07-23 09:08:20
0001
0002
0003
0004 #pragma once
0005
0006 #include "services/geometry/dd4hep/DD4hep_service.h"
0007
0008
0009 #include <edm4eic/EDM4eicVersion.h>
0010 #include <edm4eic/MCRecoTrackerHitAssociationCollection.h>
0011 #include <edm4eic/MCRecoTrackerHitLinkCollection.h>
0012 #include <edm4eic/MCRecoTrackParticleAssociationCollection.h>
0013 #include <edm4eic/TrackCollection.h>
0014 #include <edm4eic/Measurement2DCollection.h>
0015 #include <algorithms/fardetectors/FarDetectorLinearTracking.h>
0016
0017 #include <extensions/jana/JOmniFactory.h>
0018 #include <spdlog/logger.h>
0019
0020 namespace eicrecon {
0021
0022 class FarDetectorLinearTracking_factory
0023 : public JOmniFactory<FarDetectorLinearTracking_factory, FarDetectorLinearTrackingConfig> {
0024
0025 public:
0026 using AlgoT = eicrecon::FarDetectorLinearTracking;
0027
0028 private:
0029 std::unique_ptr<AlgoT> m_algo;
0030
0031 VariadicPodioInput<edm4eic::Measurement2D> m_hits_input{this};
0032 PodioInput<edm4eic::MCRecoTrackerHitLink> m_hits_links_input{this};
0033 PodioInput<edm4eic::MCRecoTrackerHitAssociation> m_hits_association_input{this};
0034 PodioOutput<edm4eic::Track> m_tracks_output{this};
0035 PodioOutput<edm4eic::MCRecoTrackParticleLink> m_tracks_links_output{this};
0036 PodioOutput<edm4eic::MCRecoTrackParticleAssociation> m_tracks_association_output{this};
0037
0038 ParameterRef<std::size_t> n_layer{this, "numLayers", config().n_layer};
0039 ParameterRef<std::vector<double>> layer_weights{this, "layerWeights", config().layer_weights};
0040 ParameterRef<std::size_t> layer_hits_max{this, "layerHitsMax", config().layer_hits_max};
0041 ParameterRef<float> chi2_max{this, "chi2Max", config().chi2_max};
0042
0043 public:
0044 void Configure() {
0045 m_algo = std::make_unique<AlgoT>(GetPrefix());
0046 m_algo->level(static_cast<algorithms::LogLevel>(logger()->level()));
0047 m_algo->applyConfig(config());
0048 m_algo->init();
0049 }
0050
0051 void Process(int32_t , uint64_t ) {
0052
0053 try {
0054 std::vector<gsl::not_null<const edm4eic::Measurement2DCollection*>> hits;
0055 for (const auto& hit : m_hits_input()) {
0056 hits.push_back(gsl::not_null<const edm4eic::Measurement2DCollection*>{hit});
0057 }
0058
0059
0060 auto input = std::make_tuple(hits, m_hits_links_input(), m_hits_association_input());
0061
0062 m_algo->process(input, {m_tracks_output().get(), m_tracks_links_output().get(),
0063 m_tracks_association_output().get()});
0064 } catch (std::exception& e) {
0065 throw JException(e.what());
0066 }
0067 }
0068 };
0069
0070 }