diff --git a/Base/Axis/MakeScale.cpp b/Base/Axis/MakeScale.cpp index da46a79afa6bf8c07411ac36d028d2d522251b67..c1be942e0cadc4b3f5420dd03b80e235e70d20c1 100644 --- a/Base/Axis/MakeScale.cpp +++ b/Base/Axis/MakeScale.cpp @@ -16,49 +16,22 @@ #include "Base/Axis/Scale.h" #include "Base/Util/Assert.h" -namespace { - -std::vector<Bin1D> limits2bins(const std::vector<double>& limits) +Scale* newGenericScale(const std::string& name, const std::vector<double>& limits) { - std::vector<Bin1D> result; + std::vector<Bin1D> vec; ASSERT(!(limits.size() & 1)); // must be an even number for (size_t i = 0; i < limits.size(); i += 2) - result.emplace_back(Bin1D::FromTo(limits[i], limits[i + 1])); - return result; -} - -std::vector<Bin1D> centers2bins(const std::vector<double>& centers) -{ - std::vector<Bin1D> result; - for (double c : centers) - result.emplace_back(Bin1D::At(c)); - return result; -} - -std::vector<Bin1D> bounds2division(size_t N, double start, double end) -{ - ASSERT(N > 0); - ASSERT(start <= end); - std::vector<Bin1D> result; - for (size_t i = 0; i < N; ++i) - result.emplace_back(Bin1D::FromTo((N - i) * (start / N) + i * (end / N), - (N - i - 1) * (start / N) + (i + 1) * (end / N))); - ASSERT(result.size() == N); - return result; -} - -} // namespace - - -Scale* newGenericScale(const std::string& name, const std::vector<double>& limits) -{ - return new Scale(name, limits2bins(limits)); + vec.emplace_back(Bin1D::FromTo(limits[i], limits[i + 1])); + return new Scale(name, vec); } Scale ListScan(const std::string& name, const std::vector<double>& points) { - return Scale(name, centers2bins(points)); + std::vector<Bin1D> vec; + for (double p : points) + vec.emplace_back(Bin1D::At(p)); + return Scale(name, vec); } Scale* newListScan(const std::string& name, const std::vector<double>& points) @@ -67,50 +40,58 @@ Scale* newListScan(const std::string& name, const std::vector<double>& points) } -Scale EquiDivision(const std::string& name, size_t nbins, double start, double end) +Scale EquiDivision(const std::string& name, size_t N, double start, double end) { - return Scale(name, bounds2division(nbins, start, end)); + ASSERT(N > 0); + ASSERT(start <= end); + std::vector<Bin1D> vec; + for (size_t i = 0; i < N; ++i) + vec.emplace_back(Bin1D::FromTo((N - i) * (start / N) + i * (end / N), + (N - i - 1) * (start / N) + (i + 1) * (end / N))); + ASSERT(vec.size() == N); + + return Scale(name, vec); } -Scale* newEquiDivision(const std::string& name, size_t nbins, double start, double end) +Scale* newEquiDivision(const std::string& name, size_t N, double start, double end) { - return new Scale(EquiDivision(name, nbins, start, end)); + return new Scale(EquiDivision(name, N, start, end)); } -std::shared_ptr<Scale> sharedEquiDivision(const std::string& name, size_t nbins, double start, +std::shared_ptr<Scale> sharedEquiDivision(const std::string& name, size_t N, double start, double end) { - return std::shared_ptr<Scale>(newEquiDivision(name, nbins, start, end)); + return std::shared_ptr<Scale>(newEquiDivision(name, N, start, end)); } -std::unique_ptr<Scale> uniqueEquiDivision(const std::string& name, size_t nbins, double start, +std::unique_ptr<Scale> uniqueEquiDivision(const std::string& name, size_t N, double start, double end) { - return std::unique_ptr<Scale>(newEquiDivision(name, nbins, start, end)); + return std::unique_ptr<Scale>(newEquiDivision(name, N, start, end)); } -Scale EquiScan(const std::string& name, size_t nbins, double start, double end) +Scale EquiScan(const std::string& name, size_t N, double start, double end) { - if (nbins < 2) + if (N < 2) throw std::runtime_error("Cannot scan axis with less than two points"); - const double delta = (end - start) / (nbins - 1); - return EquiDivision(name, nbins, start - delta / 2, end + delta / 2); + const double delta = (end - start) / (N - 1); + return EquiDivision(name, N, start - delta / 2, end + delta / 2); } -Scale* newEquiScan(const std::string& name, size_t nbins, double start, double end) +Scale* newEquiScan(const std::string& name, size_t N, double start, double end) { - return new Scale(EquiScan(name, nbins, start, end)); + return new Scale(EquiScan(name, N, start, end)); } -std::shared_ptr<Scale> sharedEquiScan(const std::string& name, size_t nbins, double start, +std::shared_ptr<Scale> sharedEquiScan(const std::string& name, size_t N, double start, double end) { - return std::shared_ptr<Scale>(newEquiDivision(name, nbins, start, end)); + return std::shared_ptr<Scale>(newEquiDivision(name, N, start, end)); } -std::unique_ptr<Scale> uniqueEquiScan(const std::string& name, size_t nbins, double start, +std::unique_ptr<Scale> uniqueEquiScan(const std::string& name, size_t N, double start, double end) { - return std::unique_ptr<Scale>(newEquiDivision(name, nbins, start, end)); + return std::unique_ptr<Scale>(newEquiDivision(name, N, start, end)); } diff --git a/Base/Axis/MakeScale.h b/Base/Axis/MakeScale.h index 997addb8ca74244974f2274db4f7f2da223ebad8..a879f259fecae19192d220fb9a3ff175692ea746 100644 --- a/Base/Axis/MakeScale.h +++ b/Base/Axis/MakeScale.h @@ -31,22 +31,22 @@ Scale* newListScan(const std::string& name, const std::vector<double>& points); #endif // SWIG //! Returns axis with fixed bin size. -Scale EquiDivision(const std::string& name, size_t nbins, double start, double end); +Scale EquiDivision(const std::string& name, size_t N, double start, double end); #ifndef SWIG -Scale* newEquiDivision(const std::string& name, size_t nbins, double start, double end); -std::shared_ptr<Scale> sharedEquiDivision(const std::string& name, size_t nbins, double start, +Scale* newEquiDivision(const std::string& name, size_t N, double start, double end); +std::shared_ptr<Scale> sharedEquiDivision(const std::string& name, size_t N, double start, double end); -std::unique_ptr<Scale> uniqueEquiDivision(const std::string& name, size_t nbins, double start, +std::unique_ptr<Scale> uniqueEquiDivision(const std::string& name, size_t N, double start, double end); #endif // SWIG #ifndef SWIG //! Returns a EquiDivision determined by first and last point in scan. -Scale EquiScan(const std::string& name, size_t nbins, double start, double end); -Scale* newEquiScan(const std::string& name, size_t nbins, double start, double end); -std::shared_ptr<Scale> sharedEquiScan(const std::string& name, size_t nbins, double start, +Scale EquiScan(const std::string& name, size_t N, double start, double end); +Scale* newEquiScan(const std::string& name, size_t N, double start, double end); +std::shared_ptr<Scale> sharedEquiScan(const std::string& name, size_t N, double start, double end); -std::unique_ptr<Scale> uniqueEquiScan(const std::string& name, size_t nbins, double start, +std::unique_ptr<Scale> uniqueEquiScan(const std::string& name, size_t N, double start, double end); #endif // SWIG diff --git a/auto/Wrap/libBornAgainBase.py b/auto/Wrap/libBornAgainBase.py index 25f1d41316b9e39184be88cfac36c77bd366345d..b5addf320345ddbd276f02b6d3bca8f9b5222fe2 100644 --- a/auto/Wrap/libBornAgainBase.py +++ b/auto/Wrap/libBornAgainBase.py @@ -1949,9 +1949,9 @@ def ListScan(name, points): r"""ListScan(std::string const & name, vdouble1d_t points) -> Scale""" return _libBornAgainBase.ListScan(name, points) -def EquiDivision(name, nbins, start, end): - r"""EquiDivision(std::string const & name, size_t nbins, double start, double end) -> Scale""" - return _libBornAgainBase.EquiDivision(name, nbins, start, end) +def EquiDivision(name, N, start, end): + r"""EquiDivision(std::string const & name, size_t N, double start, double end) -> Scale""" + return _libBornAgainBase.EquiDivision(name, N, start, end) class Frame(ICloneable): r"""Proxy of C++ Frame class.""" diff --git a/auto/Wrap/libBornAgainBase_wrap.cpp b/auto/Wrap/libBornAgainBase_wrap.cpp index 9593b580ca4842861eb8ade133806502b793017a..104060094069d4252905b998bb548afb568c2522 100644 --- a/auto/Wrap/libBornAgainBase_wrap.cpp +++ b/auto/Wrap/libBornAgainBase_wrap.cpp @@ -28717,7 +28717,7 @@ static PyMethodDef SwigMethods[] = { { "Scale_swigregister", Scale_swigregister, METH_O, NULL}, { "Scale_swiginit", Scale_swiginit, METH_VARARGS, NULL}, { "ListScan", _wrap_ListScan, METH_VARARGS, "ListScan(std::string const & name, vdouble1d_t points) -> Scale"}, - { "EquiDivision", _wrap_EquiDivision, METH_VARARGS, "EquiDivision(std::string const & name, size_t nbins, double start, double end) -> Scale"}, + { "EquiDivision", _wrap_EquiDivision, METH_VARARGS, "EquiDivision(std::string const & name, size_t N, double start, double end) -> Scale"}, { "new_Frame", _wrap_new_Frame, METH_VARARGS, "\n" "Frame(std::vector< Scale const *,std::allocator< Scale const * > > && axes)\n" "Frame(Scale const *&& ax0)\n"