Belle II Software  release-06-00-14
Manager.h
1 /**************************************************************************
2  * basf2 (Belle II Analysis Software Framework) *
3  * Author: The Belle II Collaboration *
4  * *
5  * See git log for contributors and copyright holders. *
6  * This file is licensed under LGPL-3.0, see LICENSE.md. *
7  **************************************************************************/
8 
9 #pragma once
10 
11 #include <analysis/DecayDescriptor/DecayDescriptor.h>
12 
13 #include <string>
14 #include <map>
15 #include <vector>
16 #include <functional>
17 #include <memory>
18 
19 namespace Belle2 {
24  class Particle;
25 
26  namespace Variable {
98  class Manager {
106  public:
108  typedef std::function<double(const Particle*)> FunctionPtr;
110  typedef std::function<double(const Particle*, const std::vector<double>&)> ParameterFunctionPtr;
112  typedef std::function<FunctionPtr(const std::vector<std::string>&)> MetaFunctionPtr;
114  typedef Particle Object;
115 
117  struct VarBase {
118  std::string name;
119  std::string description;
120  std::string group;
122  VarBase(const std::string& n, const std::string& d, const std::string& g)
123  : name(n), description(d), group(g) { }
124 
126  void extendDescriptionString(const std::string& d)
127  {
128  description.append(d);
129  }
130  };
131 
133  struct Var : public VarBase {
134  FunctionPtr function;
136  Var(const std::string& n, FunctionPtr f, const std::string& d, const std::string& g = "")
137  : VarBase(n, d, g), function(f) { }
138  };
139 
141  struct ParameterVar : public VarBase {
144  ParameterVar(const std::string& n, ParameterFunctionPtr f, const std::string& d, const std::string& g = "")
145  : VarBase(n, d, g), function(f) { }
146  };
147 
149  struct MetaVar : public VarBase {
150  MetaFunctionPtr function;
152  explicit MetaVar(const std::string& n, MetaFunctionPtr f, const std::string& d, const std::string& g = "")
153  : VarBase(n, d, g), function(f) { }
154  };
155 
157  static Manager& Instance();
158 
163  const Var* getVariable(std::string name);
164 
168  std::vector<const Belle2::Variable::Manager::Var*> getVariables(const std::vector<std::string>& variables);
169 
173  bool addAlias(const std::string& alias, const std::string& variable);
174 
178  void printAliases();
179 
183  bool addCollection(const std::string& collection, const std::vector<std::string>& variables);
184 
188  std::vector<std::string> getCollection(const std::string& collection);
189 
193  std::vector<std::string> resolveCollections(const std::vector<std::string>& variables);
194 
196  std::vector<const Belle2::Variable::Manager::VarBase*> getVariables() const { return m_variablesInRegistrationOrder; }
197 
198 
200  void setVariableGroup(const std::string& groupName);
201 
203  void registerVariable(const std::string& name, const Manager::FunctionPtr& f, const std::string& description);
205  void registerVariable(const std::string& name, const Manager::ParameterFunctionPtr& f, const std::string& description);
207  void registerVariable(const std::string& name, const Manager::MetaFunctionPtr& f, const std::string& description);
209  void deprecateVariable(const std::string& name, bool make_fatal, const std::string& version, const std::string& description);
210 
216  void checkDeprecatedVariable(const std::string& name);
217 
224  double evaluate(const std::string& varName, const Particle* p);
225 
227  std::vector<std::string> getNames() const;
228 
230  std::vector<std::string> getAliasNames() const;
231 
233  void assertValidName(const std::string& name);
234 
235  private:
236  Manager() {};
238  Manager(const Manager&);
239  ~Manager();
240 
242  bool createVariable(const std::string& name);
243 
245  std::string m_currentGroup;
246 
248  std::vector<const VarBase*> m_variablesInRegistrationOrder;
249 
251  std::map<std::string, std::string> m_alias;
253  std::map<std::string, std::vector<std::string>> m_collection;
255  std::map<std::string, std::shared_ptr<Var>> m_variables;
257  std::map<std::string, std::shared_ptr<ParameterVar>> m_parameter_variables;
259  std::map<std::string, std::shared_ptr<MetaVar>> m_meta_variables;
261  std::map<std::string, std::pair<bool, std::string>> m_deprecated;
262  };
263 
265  class Proxy {
266  public:
268  Proxy(const std::string& name, Manager::FunctionPtr f, const std::string& description)
269  {
270  Manager::Instance().registerVariable(name, f, description);
271  }
273  Proxy(const std::string& name, Manager::ParameterFunctionPtr f, const std::string& description)
274  {
275  Manager::Instance().registerVariable(name, f, description);
276  }
278  Proxy(const std::string& name, Manager::MetaFunctionPtr f, const std::string& description)
279  {
280  Manager::Instance().registerVariable(name, f, description);
281  }
282  };
283 
285  class GroupProxy {
286  public:
288  explicit GroupProxy(const std::string& groupName)
289  {
290  Manager::Instance().setVariableGroup(groupName);
291  }
292  };
293 
296  public:
298  DeprecateProxy(const std::string& name, bool make_fatal, const std::string& version, const std::string& description)
299  {
300  Manager::Instance().deprecateVariable(name, make_fatal, version, description);
301  }
302  };
303 
304  template<typename T>
305  std::function<T> make_function(T* t)
306  {
307  return { t };
308  }
309 
310 
314 #define VARMANAGER_CONCATENATE_DETAIL(x, y) x##y
318 #define VARMANAGER_CONCATENATE(x, y) VARMANAGER_CONCATENATE_DETAIL(x, y)
322 #define VARMANAGER_MAKE_UNIQUE(x) VARMANAGER_CONCATENATE(x, __LINE__)
323 
329 #define REGISTER_VARIABLE(name, function, description) \
330  static Proxy VARMANAGER_MAKE_UNIQUE(_variableproxy)(std::string(name), Belle2::Variable::make_function(function), std::string(description));
331 
337 #define VARIABLE_GROUP(groupName) \
338  static GroupProxy VARMANAGER_MAKE_UNIQUE(_variablegroupproxy)(groupName);
339 
340  }
345 #define MAKE_DEPRECATED(name, make_fatal, version, description) \
346  static DeprecateProxy VARMANAGER_MAKE_UNIQUE(_deprecateproxy)(std::string(name), bool(make_fatal), std::string(version), std::string(description));
348 }
Class to store reconstructed particles.
Definition: Particle.h:74
Internal class that registers a variable as deprecated.
Definition: Manager.h:295
DeprecateProxy(const std::string &name, bool make_fatal, const std::string &version, const std::string &description)
constructor.
Definition: Manager.h:298
Internal class that registers a variable group with Manager when constructed.
Definition: Manager.h:285
GroupProxy(const std::string &groupName)
constructor.
Definition: Manager.h:288
Global list of available variables.
Definition: Manager.h:98
std::function< double(const Particle *, const std::vector< double > &)> ParameterFunctionPtr
parameter functions stored take a const Particle*, const std::vector<double>& and return double.
Definition: Manager.h:110
Particle Object
Typedef for the cut, that we use Particles as our base objects.
Definition: Manager.h:114
std::vector< const VarBase * > m_variablesInRegistrationOrder
List of variables in registration order.
Definition: Manager.h:248
std::vector< std::string > getAliasNames() const
Return a list of all variable alias names (in reverse order added).
Definition: Manager.cc:333
void registerVariable(const std::string &name, const Manager::FunctionPtr &f, const std::string &description)
Register a variable.
Definition: Manager.cc:226
std::vector< std::string > resolveCollections(const std::vector< std::string > &variables)
Resolve Collection Returns variable names corresponding to the given collection or if it is not a col...
Definition: Manager.cc:137
Manager(const Manager &)
Copy constructor disabled (not defined).
std::string m_currentGroup
Group last set via VARIABLE_GROUP().
Definition: Manager.h:245
const Var * getVariable(std::string name)
Get the variable belonging to the given key.
Definition: Manager.cc:31
std::map< std::string, std::string > m_alias
List of registered aliases.
Definition: Manager.h:251
std::map< std::string, std::shared_ptr< Var > > m_variables
List of registered variables.
Definition: Manager.h:255
void deprecateVariable(const std::string &name, bool make_fatal, const std::string &version, const std::string &description)
Make a variable deprecated.
Definition: Manager.cc:286
std::map< std::string, std::shared_ptr< ParameterVar > > m_parameter_variables
List of registered parameter variables.
Definition: Manager.h:257
std::vector< const Belle2::Variable::Manager::VarBase * > getVariables() const
Return list of all variables (in order registered).
Definition: Manager.h:196
static Manager & Instance()
get singleton instance.
Definition: Manager.cc:25
void printAliases()
Print existing aliases.
Definition: Manager.cc:92
std::map< std::string, std::pair< bool, std::string > > m_deprecated
List of deprecated variables.
Definition: Manager.h:261
bool createVariable(const std::string &name)
Creates and registers a concrete variable (Var) from a MetaVar, ParameterVar or numeric constant.
Definition: Manager.cc:171
void assertValidName(const std::string &name)
Abort with B2FATAL if name is not a valid name for a variable.
Definition: Manager.cc:155
std::function< FunctionPtr(const std::vector< std::string > &)> MetaFunctionPtr
meta functions stored take a const std::vector<std::string>& and return a FunctionPtr.
Definition: Manager.h:112
std::vector< std::string > getNames() const
Return list of all variable names (in order registered).
Definition: Manager.cc:324
std::map< std::string, std::vector< std::string > > m_collection
List of registered collections.
Definition: Manager.h:253
std::function< double(const Particle *)> FunctionPtr
NOTE: the python interface is documented manually in analysis/doc/Variables.rst (because we use ROOT ...
Definition: Manager.h:108
void setVariableGroup(const std::string &groupName)
All variables registered after VARIABLE_GROUP(groupName) will be added to this group.
Definition: Manager.cc:166
std::vector< std::string > getCollection(const std::string &collection)
Get Collection Returns variable names corresponding to the given collection.
Definition: Manager.cc:130
bool addAlias(const std::string &alias, const std::string &variable)
Add alias Return true if the alias was successfully added.
Definition: Manager.cc:69
bool addCollection(const std::string &collection, const std::vector< std::string > &variables)
Add collection Return true if the collection was successfully added.
Definition: Manager.cc:109
void checkDeprecatedVariable(const std::string &name)
Check if a variable is deprecated.
Definition: Manager.cc:307
double evaluate(const std::string &varName, const Particle *p)
evaluate variable 'varName' on given Particle.
Definition: Manager.cc:340
std::map< std::string, std::shared_ptr< MetaVar > > m_meta_variables
List of registered meta variables.
Definition: Manager.h:259
Internal class that registers a variable with Manager when constructed.
Definition: Manager.h:265
Proxy(const std::string &name, Manager::MetaFunctionPtr f, const std::string &description)
constructor.
Definition: Manager.h:278
Proxy(const std::string &name, Manager::FunctionPtr f, const std::string &description)
constructor.
Definition: Manager.h:268
Proxy(const std::string &name, Manager::ParameterFunctionPtr f, const std::string &description)
constructor.
Definition: Manager.h:273
Abstract base class for different kinds of events.
A variable taking string arguments returning a variable.
Definition: Manager.h:149
MetaVar(const std::string &n, MetaFunctionPtr f, const std::string &d, const std::string &g="")
ctor
Definition: Manager.h:152
MetaFunctionPtr function
Pointer to function.
Definition: Manager.h:150
A variable taking additional floating-point arguments to influence the behaviour.
Definition: Manager.h:141
ParameterVar(const std::string &n, ParameterFunctionPtr f, const std::string &d, const std::string &g="")
ctor
Definition: Manager.h:144
ParameterFunctionPtr function
Pointer to function.
Definition: Manager.h:142
Base class for information common to all types of variables.
Definition: Manager.h:117
std::string description
Description of what this function does.
Definition: Manager.h:119
void extendDescriptionString(const std::string &d)
function to extend the description of the variable
Definition: Manager.h:126
std::string group
Associated group.
Definition: Manager.h:120
std::string name
Unique identifier of the function, used as key.
Definition: Manager.h:118
VarBase(const std::string &n, const std::string &d, const std::string &g)
ctor
Definition: Manager.h:122
A variable returning a floating-point value for a given Particle.
Definition: Manager.h:133
Var(const std::string &n, FunctionPtr f, const std::string &d, const std::string &g="")
ctor
Definition: Manager.h:136
FunctionPtr function
Pointer to function.
Definition: Manager.h:134