ra4_draw  4bd0201e3d922d42bd545d4b045ed44db33454a4
named_func.hpp
Go to the documentation of this file.
1 #ifndef H_NAMED_FUNC
2 #define H_NAMED_FUNC
3 
4 #include <string>
5 #include <functional>
6 #include <ostream>
7 #include <vector>
8 
9 #include "TString.h"
10 
11 #include "core/baby.hpp"
12 
13 class NamedFunc{
14 public:
15  using ScalarType = double;
16  using VectorType = std::vector<ScalarType>;
17  using ScalarFunc = ScalarType(const Baby &);
18  using VectorFunc = VectorType(const Baby &);
19 
20  NamedFunc(const std::string &name,
21  const std::function<ScalarFunc> &function);
22  NamedFunc(const std::string &name,
23  const std::function<VectorFunc> &function);
24  NamedFunc(const std::string &function);
25  NamedFunc(const char *function);
26  NamedFunc(const TString &function);
28  NamedFunc(const NamedFunc &) = default;
29  NamedFunc & operator=(const NamedFunc &) = default;
30  NamedFunc(NamedFunc &&) = default;
31  NamedFunc & operator=(NamedFunc &&) = default;
32  ~NamedFunc() = default;
33 
34  const std::string & Name() const;
35  NamedFunc & Name(const std::string &name);
36  std::string PlainName() const;
37  std::string PrettyName() const;
38 
39  NamedFunc & Function(const std::function<ScalarFunc> &function);
40  NamedFunc & Function(const std::function<VectorFunc> &function);
41  const std::function<ScalarFunc> & ScalarFunction() const;
42  const std::function<VectorFunc> & VectorFunction() const;
43 
44  bool IsScalar() const;
45  bool IsVector() const;
46 
47  ScalarType GetScalar(const Baby &b) const;
48  VectorType GetVector(const Baby &b) const;
49 
50  NamedFunc & operator += (const NamedFunc &func);
51  NamedFunc & operator -= (const NamedFunc &func);
52  NamedFunc & operator *= (const NamedFunc &func);
53  NamedFunc & operator /= (const NamedFunc &func);
54  NamedFunc & operator %= (const NamedFunc &func);
55 
56  NamedFunc operator [] (const NamedFunc &func) const;
57 
58 private:
59  NamedFunc() = delete;
60  std::string name_;
61  std::function<ScalarFunc> scalar_func_;//<!Scalar function. Cannot be valid at same time as NamedFunc::vector_func_.
62  std::function<VectorFunc> vector_func_;//<!Vector function. Cannot be valid at same time as NamedFunc::scalar_func_.
63 
64  void CleanName();
65 };
66 
72 
75 
82 
85 
87 
88 std::ostream & operator<<(std::ostream &stream, const NamedFunc &function);
89 
90 bool HavePass(const NamedFunc::VectorType &v);
91 bool HavePass(const std::vector<NamedFunc::VectorType> &vv);
92 
93 #endif
NamedFunc operator>=(NamedFunc f, NamedFunc g)
Gets NamedFunc which tests if result of f is greater than or equal to result of g.
Definition: named_func.cpp:740
NamedFunc operator==(NamedFunc f, NamedFunc g)
Gets NamedFunc which tests for equality of results of f and g.
Definition: named_func.cpp:665
std::vector< ScalarType > VectorType
Definition: named_func.hpp:16
NamedFunc & operator*=(const NamedFunc &func)
Multiply *this by func.
Definition: named_func.cpp:512
std::string name_
String representation of the function.
Definition: named_func.hpp:60
const std::string & Name() const
Get the string representation of this function.
Definition: named_func.cpp:376
Abstract base class for access to ntuple variables.
Definition: baby.hpp:16
NamedFunc operator>(NamedFunc f, NamedFunc g)
Gets NamedFunc which tests if result of f is greater than result of g.
Definition: named_func.cpp:702
ScalarType GetScalar(const Baby &b) const
Evaluate scalar function with b as argument.
Definition: named_func.cpp:460
ScalarType(const Baby &) ScalarFunc
Definition: named_func.hpp:17
NamedFunc operator<(NamedFunc f, NamedFunc g)
Gets NamedFunc which tests if result of f is less than result of g.
Definition: named_func.cpp:720
NamedFunc operator-(NamedFunc f, NamedFunc g)
Add a NamedFunc from another.
Definition: named_func.cpp:592
Combines a callable function taking a Baby and returning a scalar or vector with its string represent...
Definition: named_func.hpp:13
NamedFunc operator<=(NamedFunc f, NamedFunc g)
Gets NamedFunc which tests if result of f is less than or equal to result of g.
Definition: named_func.cpp:760
double ScalarType
Definition: named_func.hpp:15
VectorType(const Baby &) VectorFunc
Definition: named_func.hpp:18
bool IsScalar() const
Check if scalar function is valid.
Definition: named_func.cpp:442
NamedFunc operator!(NamedFunc f)
Gets NamedFunct returning logical inverse of result of f.
Definition: named_func.cpp:812
NamedFunc operator%(NamedFunc f, NamedFunc g)
Get remainder form division of two NamedFuncs.
Definition: named_func.cpp:629
NamedFunc operator[](const NamedFunc &func) const
Apply indexing operator and return result as a NamedFunc.
Definition: named_func.cpp:556
void CleanName()
Strip spaces from name.
Definition: named_func.cpp:568
NamedFunc operator*(NamedFunc f, NamedFunc g)
Multiply two NamedFuncs.
Definition: named_func.cpp:604
~NamedFunc()=default
NamedFunc()=delete
VectorType GetVector(const Baby &b) const
Evaluate vector function with b as argument.
Definition: named_func.cpp:470
std::function< ScalarFunc > scalar_func_
Definition: named_func.hpp:61
NamedFunc operator&&(NamedFunc f, NamedFunc g)
Gets NamedFunc which tests if results of both f and g are true.
Definition: named_func.cpp:778
std::string PlainName() const
NamedFunc & operator-=(const NamedFunc &func)
Subtract func from *this.
Definition: named_func.cpp:496
NamedFunc & operator=(const NamedFunc &)=default
NamedFunc operator||(NamedFunc f, NamedFunc g)
Gets NamedFunc which tests if result of f or g is true.
Definition: named_func.cpp:796
NamedFunc & Function(const std::function< ScalarFunc > &function)
Set function to given scalar function.
Definition: named_func.cpp:399
std::function< VectorFunc > vector_func_
Definition: named_func.hpp:62
NamedFunc operator+(NamedFunc f, NamedFunc g)
Add two NamedFuncs.
Definition: named_func.cpp:580
bool IsVector() const
Check if vectorr function is valid.
Definition: named_func.cpp:450
const std::function< VectorFunc > & VectorFunction() const
Return the (possibly invalid) vector function.
Definition: named_func.cpp:434
std::string PrettyName() const
NamedFunc & operator%=(const NamedFunc &func)
Set *this to remainder of *this divided by func.
Definition: named_func.cpp:544
NamedFunc operator!=(NamedFunc f, NamedFunc g)
Gets NamedFunc which tests for inequality of results of f and g.
Definition: named_func.cpp:683
NamedFunc & operator+=(const NamedFunc &func)
Add func to *this.
Definition: named_func.cpp:480
bool HavePass(const NamedFunc::VectorType &v)
Definition: named_func.cpp:830
std::ostream & operator<<(std::ostream &stream, const NamedFunc &function)
Print NamedFunc to output stream.
Definition: named_func.cpp:825
NamedFunc & operator/=(const NamedFunc &func)
Divide *this by func.
Definition: named_func.cpp:528
const std::function< ScalarFunc > & ScalarFunction() const
Return the (possibly invalid) scalar function.
Definition: named_func.cpp:426
NamedFunc operator/(NamedFunc f, NamedFunc g)
Divide two NamedFuncs.
Definition: named_func.cpp:616