12 #include <tracking/trackFindingCDC/filters/base/FilterFactory.dcl.h>
14 #include <tracking/trackFindingCDC/filters/base/AndFilter.icc.h>
15 #include <tracking/trackFindingCDC/filters/base/NotFilter.icc.h>
17 #include <tracking/trackFindingCDC/utilities/StringManipulation.h>
19 #include <framework/core/ModuleParamList.h>
21 #include <framework/logging/Logger.h>
34 namespace TrackFindingCDC {
36 template <
class AFilter>
38 : m_defaultFilterName(defaultFilterName)
42 template <
class AFilter>
43 FilterFactory<AFilter>::~FilterFactory() =
default;
45 template <
class AFilter>
49 while (filterName ==
"false_positive" or filterName ==
"false_negative") {
50 std::string truthFilterName =
"truth";
51 std::unique_ptr<AFilter> truthFilter = this->create(truthFilterName);
52 std::unique_ptr<AFilter> defaultFilter = this->create(m_defaultFilterName);
54 if (not truthFilter or not defaultFilter)
break;
56 if (filterName ==
"false_positive") {
57 std::unique_ptr<AFilter> notTruthFilter =
58 std::make_unique<NotFilter<AFilter>>(std::move(truthFilter));
59 return std::make_unique<AndFilter<AFilter>>(std::move(notTruthFilter),
60 std::move(defaultFilter));
63 if (filterName ==
"false_negative") {
64 std::unique_ptr<AFilter> notDefaultFilter =
65 std::make_unique<NotFilter<AFilter>>(std::move(defaultFilter));
66 return std::make_unique<AndFilter<AFilter>>(std::move(notDefaultFilter),
67 std::move(truthFilter));
73 B2ERROR(
"Could not create filter with name " << filterName);
74 std::ostringstream message;
75 message <<
"Known filter names are: ";
76 std::vector<std::string> quotedFilterNames;
77 for (
const auto& filterNameAndDescription : getValidFilterNamesAndDescriptions()) {
78 const std::string& validFilterName = filterNameAndDescription.first;
79 quotedFilterNames.push_back(quoted(validFilterName));
81 message << join(
", ", quotedFilterNames);
83 B2ERROR(message.str());
84 return std::unique_ptr<AFilter>(
nullptr);
87 template<
class AFilter>
88 std::string FilterFactory<AFilter>::createFiltersNameDescription()
const
91 std::ostringstream oss;
92 oss << this->getFilterPurpose();
93 oss <<
"Allowed values are: ";
94 std::vector<std::string> filterNameAndDescriptions;
95 for (
const auto& filterNameAndDescription : this->getValidFilterNamesAndDescriptions()) {
96 const std::string& filterName = filterNameAndDescription.first;
97 const std::string& filterDescription = filterNameAndDescription.second;
98 filterNameAndDescriptions.push_back(quoted(filterName) +
" " + bracketed(filterDescription));
100 oss << join(
", ", filterNameAndDescriptions);
104 template<
class AFilter>
105 std::string FilterFactory<AFilter>::createFiltersParametersDescription()
const
108 std::ostringstream oss;
109 oss <<
"Key -- value pairs depending on the filter." << std::endl;
110 for (
const auto& filterNameAndDescription : this->getValidFilterNamesAndDescriptions()) {
112 const std::string& filterName = filterNameAndDescription.first;
115 std::unique_ptr<AFilter>
filter = this->create(filterName);
117 B2WARNING(
"Could not create a filter for name " << filterName);
122 const std::string prefix =
"";
123 filter->exposeParameters(&moduleParamList, prefix);
125 std::map<std::string, std::string> filterParameters;
130 oss << quoted(filterName) <<
" :\n";
131 if (filterParameters.empty()) {
132 oss <<
"(no parameters)";
134 std::vector<std::string> parameterDescriptions;
135 for (
const auto& parameterNameAndDescription : filterParameters) {
136 const std::string& parameterName = parameterNameAndDescription.first;
137 const std::string& parameterDescription = parameterNameAndDescription.second;
138 parameterDescriptions.push_back(parameterName +
" -- " + parameterDescription);
140 oss << join(
",\n", parameterDescriptions);
147 template<
class AFilter>
148 const std::string& FilterFactory<AFilter>::getDefaultFilterName()
const
150 return m_defaultFilterName;