Mantid
Loading...
Searching...
No Matches
BSpline.h
Go to the documentation of this file.
1// Mantid Repository : https://github.com/mantidproject/mantid
2//
3// Copyright © 2007 ISIS Rutherford Appleton Laboratory UKRI,
4// NScD Oak Ridge National Laboratory, European Spallation Source,
5// Institut Laue - Langevin & CSNS, Institute of High Energy Physics, CAS
6// SPDX - License - Identifier: GPL - 3.0 +
7#pragma once
8
9//----------------------------------------------------------------------
10// Includes
11//----------------------------------------------------------------------
16
17#include <memory>
18#include <unsupported/Eigen/Splines>
19
21
22typedef Eigen::Spline<double, 1, Eigen::Dynamic> Spline1D;
23
28class MANTID_CURVEFITTING_DLL BSpline : public BackgroundFunction {
29public:
31 BSpline();
33 std::string name() const override { return "BSpline"; }
34 void function1D(double *out, const double *xValues, const size_t nData) const override;
35 void derivative1D(double *out, const double *xValues, size_t nData, const size_t order) const override;
36
38 void setAttribute(const std::string &attName, const Attribute &) override;
40 std::vector<std::string> getAttributeNames() const override;
41
43 void resetParameters();
45 void resetKnots();
47 void resetValidators();
49 [[nodiscard]] std::vector<double> calcUniformBreakPoints(const double startX, const double endX);
51 void resetKnotVector(const std::vector<double> &breakPoints);
53 size_t evaluateBasisFunctions(EigenVector &B, const double x, size_t currentBBase) const;
55 void initialiseSpline(const std::vector<double> &breakPoints);
57 size_t getSpanIndex(const double x, const size_t currentBBase, const bool clamped = true) const;
59 [[nodiscard]] EigenMatrix evaluateBasisFnDerivatives(const double x, const size_t derivOrder) const;
60
62 inline int getNBSplineCoefficients() { return getNBreakPoints() + getOrder() - 2; }
64 inline int getNBreakPoints() const { return getAttribute("NBreak").asInt(); }
66 inline int getNKnots() const { return getNBreakPoints() + getClampedKnots() * 2 - 2; }
68 inline int getOrder() const { return getAttribute("Order").asInt(); }
70 inline int getClampedKnots() const { return getDegree() + 1; }
72 inline int getDegree() const { return getOrder() - 1; }
73
76 std::vector<double> m_knots;
77};
78
79} // namespace Mantid::CurveFitting::Functions
Attribute is a non-fitting parameter.
Definition IFunction.h:285
A wrapper around Eigen::Matrix.
Definition EigenMatrix.h:33
A wrapper around Eigen::Vector.
Definition EigenVector.h:27
A wrapper around Eigen functions implementing a B-spline.
Definition BSpline.h:28
std::string name() const override
overwrite IFunction base class methods
Definition BSpline.h:33
int getOrder() const
Get order of the spline, k.
Definition BSpline.h:68
int getNBreakPoints() const
Get number of Break Points.
Definition BSpline.h:64
int getClampedKnots() const
Get number of knots required to clamp the spline closed.
Definition BSpline.h:70
int getDegree() const
Get the degree of constituent polynomial functions.
Definition BSpline.h:72
int getNBSplineCoefficients()
Get number of B-Spline coefficients.
Definition BSpline.h:62
Spline1D m_spline
Member variable for spline.
Definition BSpline.h:75
int getNKnots() const
Get number of Knots.
Definition BSpline.h:66
Eigen::Spline< double, 1, Eigen::Dynamic > Spline1D
Definition BSpline.h:22