12 #include <tracking/ckf/general/findlets/OverlapResolver.dcl.h>
14 #include <tracking/ckf/general/utilities/CKFFunctors.h>
16 #include <tracking/trackFindingCDC/utilities/Functional.h>
17 #include <tracking/trackFindingCDC/numerics/WeightComperator.h>
18 #include <tracking/trackFindingCDC/utilities/Algorithms.h>
19 #include <tracking/trackFindingCDC/utilities/VectorRange.h>
20 #include <tracking/trackFindingCDC/utilities/StringManipulation.h>
22 #include <framework/core/ModuleParam.h>
23 #include <framework/logging/Logger.h>
30 template<
class AFilter>
33 Super::addProcessingSignalListener(&m_filter);
37 template<
class AFilter>
38 void OverlapResolver<AFilter>::exposeParameters(ModuleParamList* moduleParamList,
const std::string& prefix)
40 m_filter.exposeParameters(moduleParamList, prefix);
42 moduleParamList->addParameter(TrackFindingCDC::prefixed(prefix,
"enableOverlapResolving"),
43 m_param_enableOverlapResolving,
44 "Enable the overlap resolving.",
45 m_param_enableOverlapResolving);
46 moduleParamList->addParameter(TrackFindingCDC::prefixed(prefix,
"useBestNInSeed"),
47 m_param_useBestNInSeed,
48 "In seed mode, use only the best seeds.",
49 m_param_useBestNInSeed);
52 template<
class AFilter>
54 std::vector<typename AFilter::Object>& filteredResults)
56 if (not m_param_enableOverlapResolving or results.empty()) {
57 std::swap(results, filteredResults);
65 const auto& groupedBySeed = TrackFindingCDC::adjacent_groupby(results.begin(), results.end(),
SeedGetter());
68 m_resultsWithWeight.clear();
69 for (
Object& result : resultsWithSameSeed) {
70 TrackFindingCDC::Weight weight = m_filter(result);
71 if (std::isnan(weight)) {
74 m_resultsWithWeight.emplace_back(&result, weight);
77 if (not m_resultsWithWeight.empty()) {
79 std::sort(m_resultsWithWeight.begin(), m_resultsWithWeight.end(), TrackFindingCDC::GreaterWeight());
81 const unsigned int useBestNResults = std::min(m_resultsWithWeight.size(), m_param_useBestNInSeed);
82 const auto& lastItemToUse = std::next(m_resultsWithWeight.begin(), useBestNResults);
83 const auto& longestElement = *(std::max_element(m_resultsWithWeight.begin(), lastItemToUse,
84 TrackFindingCDC::LessOf<NumberOfHitsGetter>()));
85 filteredResults.push_back(*(longestElement));