19 #include <Eigen/Dense>
23 #include <framework/logging/Logger.h>
26 #define B2FATAL(arg) { std::cout << arg << std::endl; std::exit(1);}
27 #define B2ASSERT(str, cond) { if((cond) == false) {std::cout << __FILE__ <<", line "<<__LINE__ << std::endl << "" << #cond << " failed" << std::endl; std::exit(1);} }
40 inline TString
rn() {
return Form(
"%d", gRandom->Integer(1000000000)); }
44 inline std::vector<std::vector<double>>
merge(std::vector<std::vector<std::vector<double>>> toMerge)
46 std::vector<std::vector<double>> allVecs;
47 for (
const auto& v : toMerge)
48 allVecs.insert(allVecs.end(), v.begin(), v.end());
54 inline Eigen::VectorXd
vec2vec(std::vector<double> vec)
56 Eigen::VectorXd v(vec.size());
57 for (
unsigned i = 0; i < vec.size(); ++i) {
64 inline std::vector<double>
vec2vec(Eigen::VectorXd v)
66 std::vector<double> vNew(v.rows());
67 for (
int i = 0; i < v.rows(); ++i)
75 inline Eigen::MatrixXd
vecs2mat(std::vector<std::vector<double>> vecs)
77 Eigen::MatrixXd m(vecs[0].size(), vecs.size());
78 for (
unsigned i = 0; i < vecs[0].size(); ++i)
79 for (
unsigned j = 0; j < vecs.size(); ++j) {
86 inline std::vector<double>
getRangeLin(
int nVals,
double xMin,
double xMax)
88 B2ASSERT(
"At least one value in the spline required", nVals >= 1);
89 if (nVals == 1)
return {};
90 std::vector<double> v(nVals);
91 for (
int i = 0; i < nVals; ++i)
92 v[i] = xMin + i * (xMax - xMin) / (nVals - 1);
97 inline std::vector<double>
getRangeZero(
int nVals,
double xMin,
double xMax)
99 B2ASSERT(
"At least one value in the spline required", nVals >= 1);
100 if (nVals == 1)
return {};
101 std::vector<double> v(nVals - 1);
102 for (
int i = 1; i < nVals; ++i)
103 v[i - 1] = xMin + i * (xMax - xMin) / (nVals);
109 inline std::vector<double>
slice(std::vector<double> v,
unsigned ind,
unsigned n)
111 std::vector<double> vNew;
112 for (
unsigned i = ind; i < ind + n && i < v.size(); ++i)
113 vNew.push_back(v[i]);
118 inline double eval(
const std::vector<double>& spl,
const std::vector<double>& vals,
double x)
123 else if (spl.size() == vals.size() - 1)
125 else if (spl.size() == vals.size())
128 B2FATAL(
"Unknown order of spline");
130 B2ASSERT(
"Spline order should be zero or one", order == 0 || order == 1);
133 B2ASSERT(
"Linear spline only meaningful for two or more nodes", spl.size() >= 2);
134 B2ASSERT(
"As nodes as values in lin. spline", spl.size() == vals.size());
136 if (x <= spl[0])
return vals[0];
137 if (x >= spl.back())
return vals.back();
140 int i1 = lower_bound(spl.begin(), spl.end(), x) - spl.begin() - 1;
142 if (!(spl[i1] <= x && x <= spl[i1 + 1])) {
143 B2FATAL(
"Wrong place founded : " << spl[i1] <<
" " << x <<
" " << spl[i1 + 1]);
147 double v = ((spl[i1 + 1] - x) * vals[i1] + (x - spl[i1]) * vals[i1 + 1]) / (spl[i1 + 1] - spl[i1]);
149 }
else if (order == 0) {
150 B2ASSERT(
"#values vs #nodes in zero-order spline", spl.size() + 1 == vals.size());
151 if (vals.size() == 1) {
154 double res = vals[0];
155 for (
unsigned i = 0; i < spl.size(); ++i) {
156 if (spl[i] <= x) res = vals[i + 1];
182 if (
nodes.size() == 0)
184 else if (
nodes.size() % 2 == 1)
193 std::cout << tag <<
" : nodes: ";
194 for (
auto n :
nodes) {
195 std::cout << n <<
" ";
197 std::cout << std::endl;
198 std::cout << tag <<
" : vals: ";
199 for (
auto n :
vals) {
200 std::cout << n <<
" ";
202 std::cout << std::endl;
204 std::cout << tag <<
" : errs: ";
205 for (
auto n :
errs) {
206 std::cout << n <<
" ";
208 std::cout << std::endl;