Belle II Software light-2501-betelgeuse
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 <framework/logging/Logger.h>
12
13#include <string>
14#include <map>
15#include <vector>
16#include <functional>
17#include <memory>
18#include <variant>
19
20namespace Belle2 {
25 class Particle;
26 class ParticleList;
27
28 namespace Variable {
100 class Manager {
108 public:
110 typedef std::variant<double, int, bool> VarVariant;
112 typedef std::function<VarVariant(const Particle*)> FunctionPtr;
114 typedef std::function<VarVariant(const Particle*, const std::vector<double>&)> ParameterFunctionPtr;
116 typedef std::function<FunctionPtr(const std::vector<std::string>&)> MetaFunctionPtr;
119
122 c_double = 0,
123 c_int = 1,
124 c_bool = 2
125 };
126
128 struct VarBase {
129 std::string name;
130 std::string description;
131 std::string group;
134 VarBase(const std::string& n, const std::string& d, const std::string& g, const VariableDataType& v)
135 : name(n), description(d), group(g), variabletype(v) { }
136
138 void extendDescriptionString(const std::string& d)
139 {
140 description.append(d);
141 }
142 };
143
145 struct Var : public VarBase {
148 Var(const std::string& n, FunctionPtr f, const std::string& d, const std::string& g = "",
149 const VariableDataType& v = VariableDataType::c_double)
150 : VarBase(n, d, g, v), function(f) { }
151 };
152
154 struct ParameterVar : public VarBase {
157 ParameterVar(const std::string& n, ParameterFunctionPtr f, const std::string& d, const std::string& g = "",
158 const VariableDataType& v = VariableDataType::c_double)
159 : VarBase(n, d, g, v), function(f) { }
160 };
161
163 struct MetaVar : public VarBase {
166 explicit MetaVar(const std::string& n, MetaFunctionPtr f, const std::string& d, const std::string& g = "",
167 const VariableDataType& v = VariableDataType::c_double)
168 : VarBase(n, d, g, v), function(f) { }
169 };
170
172 static Manager& Instance();
173
178 const Var* getVariable(std::string name);
179
186 const Var* getVariable(const std::string& functionName, const std::vector<std::string>& functionArguments);
187
191 std::vector<const Belle2::Variable::Manager::Var*> getVariables(const std::vector<std::string>& variables);
192
196 bool addAlias(const std::string& alias, const std::string& variable);
197
201 void printAliases();
202
206 void clearAliases();
207
211 std::string resolveAlias(const std::string& alias);
212
216 bool addCollection(const std::string& collection, const std::vector<std::string>& variables);
217
221 std::vector<std::string> getCollection(const std::string& collection);
222
226 std::vector<std::string> resolveCollections(const std::vector<std::string>& variables);
227
229 std::vector<const Belle2::Variable::Manager::VarBase*> getVariables() const { return m_variablesInRegistrationOrder; }
230
231
233 void setVariableGroup(const std::string& groupName);
234
236 void registerVariable(const std::string& name, const Manager::FunctionPtr& f, const std::string& description,
237 const Manager::VariableDataType& v, const std::string& unit = "");
239 void registerVariable(const std::string& name, const Manager::ParameterFunctionPtr& f, const std::string& description,
240 const Manager::VariableDataType& v, const std::string& unit = "");
242 void registerVariable(const std::string& name, const Manager::MetaFunctionPtr& f, const std::string& description,
245 void deprecateVariable(const std::string& name, bool make_fatal, const std::string& version, const std::string& description);
246
252 void checkDeprecatedVariable(const std::string& name);
253
260 double evaluate(const std::string& varName, const Particle* p);
261
266 std::vector<double> evaluateVariables(const std::vector<std::string>& varNames, const ParticleList* plist);
267
269 std::vector<std::string> getNames() const;
270
272 std::vector<std::string> getAliasNames() const;
273
275 void assertValidName(const std::string& name);
276
277 private:
278 Manager() {};
281 ~Manager();
282
284 bool createVariable(const std::string& name);
285
290 bool createVariable(const std::string& fullname, const std::string& functionName,
291 const std::vector<std::string>& functionArguments);
292
294 std::string m_currentGroup;
295
297 std::vector<const VarBase*> m_variablesInRegistrationOrder;
298
300 std::map<std::string, std::string> m_alias;
302 std::map<std::string, std::vector<std::string>> m_collection;
304 std::map<std::string, std::shared_ptr<Var>> m_variables;
306 std::map<std::string, std::shared_ptr<ParameterVar>> m_parameter_variables;
308 std::map<std::string, std::shared_ptr<MetaVar>> m_meta_variables;
310 std::map<std::string, std::pair<bool, std::string>> m_deprecated;
311 };
312
314 class Proxy {
315 public:
317 Proxy(const std::string& name, Manager::FunctionPtr f, const std::string& description, Manager::VariableDataType v,
318 const std::string& unit = "")
319 {
320 Manager::Instance().registerVariable(name, f, description, v, unit);
321 }
323 Proxy(const std::string& name, Manager::ParameterFunctionPtr f, const std::string& description, Manager::VariableDataType v,
324 const std::string& unit = "")
325 {
326 Manager::Instance().registerVariable(name, f, description, v, unit);
327 }
329 Proxy(const std::string& name, Manager::MetaFunctionPtr f, const std::string& description, Manager::VariableDataType v)
330 {
331 Manager::Instance().registerVariable(name, f, description, v);
332 }
333 };
334
337 public:
339 explicit GroupProxy(const std::string& groupName)
340 {
342 }
343 };
344
347 public:
349 DeprecateProxy(const std::string& name, bool make_fatal, const std::string& version, const std::string& description)
350 {
351 Manager::Instance().deprecateVariable(name, make_fatal, version, description);
352 }
353 };
354
355 template<typename T>
356 std::function<T> make_function(T* t)
357 {
358 return { t };
359 }
360
361 template<typename T>
362 Belle2::Variable::Manager::VariableDataType get_function_type(const std::string& name, T* t)
363 {
364 auto func = std::function{t};
365 using ReturnType = typename decltype(func)::result_type;
366 if (std::is_same_v<ReturnType, double>) {
367 return Belle2::Variable::Manager::VariableDataType::c_double;
368 } else if (std::is_same_v<ReturnType, int>) {
369 return Belle2::Variable::Manager::VariableDataType::c_int;
370 } else if (std::is_same_v<ReturnType, bool>) {
371 return Belle2::Variable::Manager::VariableDataType::c_bool;
372 } else {
373 B2FATAL("Metavariables must be registered using the REGISTER_METAVARIABLE macro." << LogVar("Variablename", name));
374 }
375 }
376
380#define VARMANAGER_CONCATENATE_DETAIL(x, y) x##y
384#define VARMANAGER_CONCATENATE(x, y) VARMANAGER_CONCATENATE_DETAIL(x, y)
388#define VARMANAGER_MAKE_UNIQUE(x) VARMANAGER_CONCATENATE(x, __LINE__)
389
395#define REGISTER_VARIABLE_NO_UNIT(name, function, description) \
396 static Proxy VARMANAGER_MAKE_UNIQUE(_variableproxy)(std::string(name), Belle2::Variable::make_function(function), std::string(description), Belle2::Variable::get_function_type(name,function));
397
403#define REGISTER_VARIABLE_WITH_UNIT(name, function, description, unit) \
404 static Proxy VARMANAGER_MAKE_UNIQUE(_variableproxy)(std::string(name), Belle2::Variable::make_function(function), std::string(description), Belle2::Variable::get_function_type(name,function), std::string(unit));
405
411#define PICK_FIFTH_ARG(arg1, arg2, arg3, arg4, arg5, ...) arg5
412
418#define REGISTER_VARIABLE_MACRO_CHOOSER(...) PICK_FIFTH_ARG(__VA_ARGS__, REGISTER_VARIABLE_WITH_UNIT, REGISTER_VARIABLE_NO_UNIT, )
419
425#define REGISTER_VARIABLE(...) REGISTER_VARIABLE_MACRO_CHOOSER(__VA_ARGS__)(__VA_ARGS__)
426
432#define REGISTER_METAVARIABLE(name, function, description, variabledatatype) \
433 static Proxy VARMANAGER_MAKE_UNIQUE(_variableproxy)(std::string(name), Belle2::Variable::make_function(function), std::string(description), Belle2::Variable::Manager::VariableDataType(variabledatatype));
434
440#define VARIABLE_GROUP(groupName) \
441 static GroupProxy VARMANAGER_MAKE_UNIQUE(_variablegroupproxy)(groupName);
442
443 }
448#define MAKE_DEPRECATED(name, make_fatal, version, description) \
449 static DeprecateProxy VARMANAGER_MAKE_UNIQUE(_deprecateproxy)(std::string(name), bool(make_fatal), std::string(version), std::string(description));
451}
ParticleList is a container class that stores a collection of Particle objects.
Definition: ParticleList.h:140
Class to store reconstructed particles.
Definition: Particle.h:76
Internal class that registers a variable as deprecated.
Definition: Manager.h:346
DeprecateProxy(const std::string &name, bool make_fatal, const std::string &version, const std::string &description)
constructor.
Definition: Manager.h:349
Internal class that registers a variable group with Manager when constructed.
Definition: Manager.h:336
GroupProxy(const std::string &groupName)
constructor.
Definition: Manager.h:339
Global list of available variables.
Definition: Manager.h:100
std::vector< const Belle2::Variable::Manager::VarBase * > getVariables() const
Return list of all variables (in order registered).
Definition: Manager.h:229
Particle Object
Typedef for the cut, that we use Particles as our base objects.
Definition: Manager.h:118
std::vector< const VarBase * > m_variablesInRegistrationOrder
List of variables in registration order.
Definition: Manager.h:297
std::vector< std::string > getAliasNames() const
Return a list of all variable alias names (in reverse order added).
Definition: Manager.cc:470
std::function< VarVariant(const Particle *)> FunctionPtr
functions stored take a const Particle* and return VarVariant.
Definition: Manager.h:112
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:180
Manager(const Manager &)
Copy constructor disabled (not defined).
std::string m_currentGroup
Group last set via VARIABLE_GROUP().
Definition: Manager.h:294
const Var * getVariable(std::string name)
Get the variable belonging to the given key.
Definition: Manager.cc:58
std::variant< double, int, bool > VarVariant
NOTE: the python interface is documented manually in analysis/doc/Variables.rst (because we use ROOT ...
Definition: Manager.h:110
std::map< std::string, std::string > m_alias
List of registered aliases.
Definition: Manager.h:300
std::map< std::string, std::shared_ptr< Var > > m_variables
List of registered variables.
Definition: Manager.h:304
void deprecateVariable(const std::string &name, bool make_fatal, const std::string &version, const std::string &description)
Make a variable deprecated.
Definition: Manager.cc:401
std::map< std::string, std::shared_ptr< ParameterVar > > m_parameter_variables
List of registered parameter variables.
Definition: Manager.h:306
static Manager & Instance()
get singleton instance.
Definition: Manager.cc:26
void printAliases()
Print existing aliases.
Definition: Manager.cc:123
std::map< std::string, std::pair< bool, std::string > > m_deprecated
List of deprecated variables.
Definition: Manager.h:310
bool createVariable(const std::string &name)
Creates and registers a concrete variable (Var) from a MetaVar, ParameterVar or numeric constant.
Definition: Manager.cc:214
void assertValidName(const std::string &name)
Abort with B2FATAL if name is not a valid name for a variable.
Definition: Manager.cc:198
void clearAliases()
Clear existing aliases.
Definition: Manager.cc:118
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:116
std::vector< std::string > getNames() const
Return list of all variable names (in order registered).
Definition: Manager.cc:461
std::map< std::string, std::vector< std::string > > m_collection
List of registered collections.
Definition: Manager.h:302
void setVariableGroup(const std::string &groupName)
All variables registered after VARIABLE_GROUP(groupName) will be added to this group.
Definition: Manager.cc:209
std::string resolveAlias(const std::string &alias)
Resolve alias Return original variable name.
Definition: Manager.cc:140
std::vector< std::string > getCollection(const std::string &collection)
Get Collection Returns variable names corresponding to the given collection.
Definition: Manager.cc:173
bool addAlias(const std::string &alias, const std::string &variable)
Add alias Return true if the alias was successfully added.
Definition: Manager.cc:96
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:152
std::function< VarVariant(const Particle *, const std::vector< double > &)> ParameterFunctionPtr
parameter functions stored take a const Particle*, const std::vector<double>& and return VarVariant.
Definition: Manager.h:114
VariableDataType
data type of variables
Definition: Manager.h:121
void registerVariable(const std::string &name, const Manager::FunctionPtr &f, const std::string &description, const Manager::VariableDataType &v, const std::string &unit="")
Register a variable.
Definition: Manager.cc:332
void checkDeprecatedVariable(const std::string &name)
Check if a variable is deprecated.
Definition: Manager.cc:444
double evaluate(const std::string &varName, const Particle *p)
Evaluate variable 'varName' on given Particle.
Definition: Manager.cc:477
std::vector< double > evaluateVariables(const std::vector< std::string > &varNames, const ParticleList *plist)
Evaluate each variable in the vector 'varNames' on given ParticleList and return a flattened vector o...
Definition: Manager.cc:493
std::map< std::string, std::shared_ptr< MetaVar > > m_meta_variables
List of registered meta variables.
Definition: Manager.h:308
Internal class that registers a variable with Manager when constructed.
Definition: Manager.h:314
Proxy(const std::string &name, Manager::ParameterFunctionPtr f, const std::string &description, Manager::VariableDataType v, const std::string &unit="")
constructor.
Definition: Manager.h:323
Proxy(const std::string &name, Manager::MetaFunctionPtr f, const std::string &description, Manager::VariableDataType v)
constructor.
Definition: Manager.h:329
Proxy(const std::string &name, Manager::FunctionPtr f, const std::string &description, Manager::VariableDataType v, const std::string &unit="")
constructor.
Definition: Manager.h:317
Class to store variables with their name which were sent to the logging service.
Abstract base class for different kinds of events.
Definition: ClusterUtils.h:24
A variable taking string arguments returning a variable.
Definition: Manager.h:163
MetaVar(const std::string &n, MetaFunctionPtr f, const std::string &d, const std::string &g="", const VariableDataType &v=VariableDataType::c_double)
ctor
Definition: Manager.h:166
MetaFunctionPtr function
Pointer to function.
Definition: Manager.h:164
A variable taking additional floating-point arguments to influence the behaviour.
Definition: Manager.h:154
ParameterVar(const std::string &n, ParameterFunctionPtr f, const std::string &d, const std::string &g="", const VariableDataType &v=VariableDataType::c_double)
ctor
Definition: Manager.h:157
ParameterFunctionPtr function
Pointer to function.
Definition: Manager.h:155
Base class for information common to all types of variables.
Definition: Manager.h:128
std::string description
Description of what this function does.
Definition: Manager.h:130
VarBase(const std::string &n, const std::string &d, const std::string &g, const VariableDataType &v)
ctor
Definition: Manager.h:134
void extendDescriptionString(const std::string &d)
function to extend the description of the variable
Definition: Manager.h:138
VariableDataType variabletype
data type of variable
Definition: Manager.h:132
std::string group
Associated group.
Definition: Manager.h:131
std::string name
Unique identifier of the function, used as key.
Definition: Manager.h:129
A variable returning a floating-point value for a given Particle.
Definition: Manager.h:145
Var(const std::string &n, FunctionPtr f, const std::string &d, const std::string &g="", const VariableDataType &v=VariableDataType::c_double)
ctor
Definition: Manager.h:148
FunctionPtr function
Pointer to function.
Definition: Manager.h:146