Belle II Software  release-05-01-25
FilterFactory.icc.h
1 /**************************************************************************
2  * BASF2 (Belle Analysis Framework 2) *
3  * Copyright(C) 2015 - Belle II Collaboration *
4  * *
5  * Author: The Belle II Collaboration *
6  * Contributors: Oliver Frost *
7  * *
8  * This software is provided "as is" without any warranty. *
9  **************************************************************************/
10 #pragma once
11 
12 #include <tracking/trackFindingCDC/filters/base/FilterFactory.dcl.h>
13 
14 #include <tracking/trackFindingCDC/filters/base/AndFilter.icc.h>
15 #include <tracking/trackFindingCDC/filters/base/NotFilter.icc.h>
16 
17 #include <tracking/trackFindingCDC/utilities/StringManipulation.h>
18 
19 #include <framework/core/ModuleParamList.h>
20 
21 #include <framework/logging/Logger.h>
22 
23 #include <map>
24 #include <vector>
25 #include <string>
26 #include <sstream>
27 #include <memory>
28 
29 namespace Belle2 {
34  namespace TrackFindingCDC {
35 
36  template <class AFilter>
37  FilterFactory<AFilter>::FilterFactory(const std::string& defaultFilterName)
38  : m_defaultFilterName(defaultFilterName)
39  {
40  }
41 
42  template <class AFilter>
43  FilterFactory<AFilter>::~FilterFactory() = default;
44 
45  template <class AFilter>
46  std::unique_ptr<AFilter> FilterFactory<AFilter>::create(const std::string& filterName) const
47  {
48  // Check whether false positive or false negative filter are requested
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);
53 
54  if (not truthFilter or not defaultFilter) break;
55 
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));
61  }
62 
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));
68  }
69  break;
70  }
71 
72  // Filter not valid
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));
80  }
81  message << join(", ", quotedFilterNames);
82  message << ".";
83  B2ERROR(message.str());
84  return std::unique_ptr<AFilter>(nullptr);
85  }
86 
87  template<class AFilter>
88  std::string FilterFactory<AFilter>::createFiltersNameDescription() const
89  {
90  // Compose description for the filter names
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));
99  }
100  oss << join(", ", filterNameAndDescriptions);
101  return oss.str();
102  }
103 
104  template<class AFilter>
105  std::string FilterFactory<AFilter>::createFiltersParametersDescription() const
106  {
107  // Compose description for the filter parameters
108  std::ostringstream oss;
109  oss << "Key -- value pairs depending on the filter." << std::endl;
110  for (const auto& filterNameAndDescription : this->getValidFilterNamesAndDescriptions()) {
111 
112  const std::string& filterName = filterNameAndDescription.first;
113  // const std::string& filterDescription = filterNameAndDescription.second;
114 
115  std::unique_ptr<AFilter> filter = this->create(filterName);
116  if (not filter) {
117  B2WARNING("Could not create a filter for name " << filterName);
118  continue;
119  }
120 
121  ModuleParamList moduleParamList;
122  const std::string prefix = "";
123  filter->exposeParameters(&moduleParamList, prefix);
124 
125  std::map<std::string, std::string> filterParameters;
126  for (auto && name : moduleParamList.getParameterNames()) {
127  filterParameters[name] = moduleParamList.getParameterDescription(name);
128  }
129 
130  oss << quoted(filterName) << " :\n";
131  if (filterParameters.empty()) {
132  oss << "(no parameters)";
133  } else {
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);
139  }
140  oss << join(",\n", parameterDescriptions);
141  }
142  oss << ";\n";
143  }
144  return oss.str();
145  }
146 
147  template<class AFilter>
148  const std::string& FilterFactory<AFilter>::getDefaultFilterName() const
149  {
150  return m_defaultFilterName;
151  }
152  }
154 }
Belle2::TrackFindingCDC::FilterFactory
Factory that can create apropriate filter instances from a name.
Definition: FilterFactory.dcl.h:35
Belle2::TrackFindingCDC::FilterFactory::FilterFactory
FilterFactory(const std::string &defaultFilterName="")
Fill the default filter name values.
Definition: FilterFactory.icc.h:45
Belle2::filter
std::map< ExpRun, std::pair< double, double > > filter(const std::map< ExpRun, std::pair< double, double >> &runs, double cut, std::map< ExpRun, std::pair< double, double >> &runsRemoved)
filter events to remove runs shorter than cut, it stores removed runs in runsRemoved
Definition: Splitter.cc:43
Belle2
Abstract base class for different kinds of events.
Definition: MillepedeAlgorithm.h:19
Belle2::ModuleParamList
The Module parameter list class.
Definition: ModuleParamList.h:46
Belle2::ModuleParamList::getParameterDescription
std::string getParameterDescription(const std::string &name) const
Returns the description of a parameter given by its name.
Definition: ModuleParamList.cc:107
Belle2::ModuleParamList::getParameterNames
std::vector< std::string > getParameterNames() const
Returns the names of all parameters in this parameter list.
Definition: ModuleParamList.cc:97