| LSSTApplications
    20.0.0
    LSSTDataManagementBasePackage | 
 
 
 
Go to the documentation of this file.
   25 #ifndef LSST_AFW_MATH_FUNCTIONLIBRARY_H 
   26 #define LSST_AFW_MATH_FUNCTIONLIBRARY_H 
   51 template <
typename ReturnT>
 
   69     ReturnT 
operator()(
double x) 
const noexcept(IS_NOTHROW_INIT<ReturnT>)
 override {
 
   70         return static_cast<ReturnT
>(
x == _xo);
 
   75         os << 
"IntegerDeltaFunction1 [" << _xo << 
"]: ";
 
   76         os << Function1<ReturnT>::toString(
prefix);
 
   98 template <
typename ReturnT>
 
  116     ReturnT 
operator()(
double x, 
double y) 
const noexcept(IS_NOTHROW_INIT<ReturnT>)
 override {
 
  117         return static_cast<ReturnT
>((
x == _xo) && (
y == _yo));
 
  122         os << 
"IntegerDeltaFunction2 [" << _xo << 
", " << _yo << 
"]: ";
 
  123         os << Function2<ReturnT>::toString(
prefix);
 
  146 template <
typename ReturnT>
 
  166     ReturnT 
operator()(
double x) 
const noexcept(IS_NOTHROW_INIT<ReturnT>)
 override {
 
  167         return static_cast<ReturnT
>((_multFac / this->
_params[0]) *
 
  173         os << 
"GaussianFunction1 [" << _multFac << 
"]: ";
 
  174         os << Function1<ReturnT>::toString(
prefix);
 
  179     const double _multFac;  
 
  200 template <
typename ReturnT>
 
  227     ReturnT 
operator()(
double x, 
double y) 
const noexcept(IS_NOTHROW_INIT<ReturnT>)
 override {
 
  228         if (_angle != this->
_params[2]) {
 
  231         double pos1 = (_cosAngle * 
x) + (_sinAngle * 
y);
 
  232         double pos2 = (-_sinAngle * 
x) + (_cosAngle * 
y);
 
  233         return static_cast<ReturnT
>((_multFac / (this->
_params[0] * this->
_params[1])) *
 
  235                                              ((pos2 * pos2) / (2.0 * this->_params[1] * this->_params[1]))));
 
  240         os << 
"GaussianFunction2: ";
 
  241         os << Function2<ReturnT>::toString(
prefix);
 
  270     void _updateCache() const noexcept {
 
  275     const double _multFac;     
 
  276     mutable double _angle;     
 
  277     mutable double _sinAngle;  
 
  278     mutable double _cosAngle;  
 
  304 template <
typename ReturnT>
 
  331     ReturnT 
operator()(
double x, 
double y) 
const noexcept(IS_NOTHROW_INIT<ReturnT>)
 override {
 
  332         double radSq = (
x * 
x) + (
y * 
y);
 
  334         double sigma2Sq = this->_params[1] * this->_params[1];
 
  335         double b = this->_params[2];
 
  336         return static_cast<ReturnT
>(
 
  337                 (_multFac / (sigma1Sq + (
b * sigma2Sq))) *
 
  338                 (
std::exp(-radSq / (2.0 * sigma1Sq)) + (
b * 
std::exp(-radSq / (2.0 * sigma2Sq)))));
 
  343         os << 
"DoubleGaussianFunction2 [" << _multFac << 
"]: ";
 
  344         os << Function2<ReturnT>::toString(
prefix);
 
  356     const double _multFac;  
 
  370 template <
typename ReturnT>
 
  390         if (params.
size() < 1) {
 
  392                               "PolynomialFunction1 called with empty vector");
 
  408     ReturnT 
operator()(
double x) 
const noexcept(IS_NOTHROW_INIT<ReturnT>)
 override {
 
  409         int const order = 
static_cast<int>(this->
_params.
size()) - 1;
 
  410         double retVal = this->
_params[order];
 
  411         for (
int ii = order - 1; ii >= 0; --ii) {
 
  412             retVal = (retVal * 
x) + this->
_params[ii];
 
  414         return static_cast<ReturnT
>(retVal);
 
  424         os << 
"PolynomialFunction1 []: ";
 
  425         os << Function1<ReturnT>::toString(
prefix);
 
  448 template <
typename ReturnT>
 
  486     ReturnT 
operator()(
double x, 
double y) 
const noexcept(IS_NOTHROW_INIT<ReturnT>)
 override {
 
  501         const int maxXCoeffInd = this->
_order;
 
  506             int paramInd = 
static_cast<int>(this->
_params.
size()) - 1;
 
  510             for (
int xCoeffInd = 0; xCoeffInd <= maxXCoeffInd; ++xCoeffInd, --paramInd) {
 
  511                 _xCoeffs[xCoeffInd] = this->
_params[paramInd];
 
  515             for (
int xCoeffInd = 0, endXCoeffInd = maxXCoeffInd; paramInd >= 0; --paramInd) {
 
  516                 _xCoeffs[xCoeffInd] = (_xCoeffs[xCoeffInd] * 
y) + this->
_params[paramInd];
 
  518                 if (xCoeffInd >= endXCoeffInd) {
 
  529         double retVal = _xCoeffs[maxXCoeffInd];
 
  530         for (
int xCoeffInd = maxXCoeffInd - 1; xCoeffInd >= 0; --xCoeffInd) {
 
  531             retVal = (retVal * 
x) + _xCoeffs[xCoeffInd];
 
  533         return static_cast<ReturnT
>(retVal);
 
  544         os << 
"PolynomialFunction2 [" << this->
_order << 
"]: ";
 
  545         os << Function2<ReturnT>::toString(
prefix);
 
  557     mutable double _oldY;                  
 
  581 template <
typename ReturnT>
 
  593         _initialize(minX, maxX);
 
  607         if (params.
size() < 1) {
 
  609                               "Chebyshev1Function1 called with empty vector");
 
  611         _initialize(minX, maxX);
 
  627     double getMinX() const noexcept { 
return _minX; };
 
  632     double getMaxX() const noexcept { 
return _maxX; };
 
  642         double xPrime = (
x + _offset) * _scale;
 
  646         int const order = _order;
 
  649         } 
else if (order == 1) {
 
  652         double cshPrev = this->
_params[order];
 
  653         double csh = (2 * xPrime * this->
_params[order]) + this->
_params[order - 1];
 
  654         for (
int i = order - 2; i > 0; --i) {
 
  655             double cshNext = (2 * xPrime * csh) + this->
_params[i] - cshPrev;
 
  659         return (xPrime * csh) + this->
_params[0] - cshPrev;
 
  664         os << 
"Chebyshev1Function1 [" << _minX << 
", " << _maxX << 
"]: ";
 
  665         os << Function1<ReturnT>::toString(
prefix);
 
  679     void _initialize(
double minX, 
double maxX) {
 
  682         _scale = 2.0 / (_maxX - _minX);
 
  683         _offset = -(_minX + _maxX) * 0.5;
 
  690             : 
Function1<ReturnT>(1), _minX(0.0), _maxX(0.0), _scale(1.0), _offset(0.0), _order(0) {}
 
  718 template <
typename ReturnT>
 
  732               _yCheby(this->
_order + 1),
 
  733               _xCoeffs(this->
_order + 1) {
 
  734         _initialize(xyRange);
 
  751               _yCheby(this->
_order + 1),
 
  752               _xCoeffs(this->
_order + 1) {
 
  753         _initialize(xyRange);
 
  781         if (truncOrder > this->
_order) {
 
  783             os << 
"truncated order=" << truncOrder << 
" must be <= original order=" << this->
_order;
 
  805         double const xPrime = (
x + _offsetX) * _scaleX;
 
  806         double const yPrime = (
y + _offsetY) * _scaleY;
 
  808         const int nParams = 
static_cast<int>(this->
_params.
size());
 
  809         const int order = this->
_order;
 
  819             for (
int chebyInd = 2; chebyInd <= order; chebyInd++) {
 
  820                 _yCheby[chebyInd] = (2 * yPrime * _yCheby[chebyInd - 1]) - _yCheby[chebyInd - 2];
 
  823             for (
int coeffInd = 0; coeffInd <= order; coeffInd++) {
 
  824                 _xCoeffs[coeffInd] = 0;
 
  826             for (
int coeffInd = 0, endCoeffInd = 0, paramInd = 0; paramInd < nParams; paramInd++) {
 
  827                 _xCoeffs[coeffInd] += this->
_params[paramInd] * _yCheby[endCoeffInd];
 
  831                     coeffInd = endCoeffInd;
 
  843             return _xCoeffs[0] + (_xCoeffs[1] * xPrime);
 
  845         double cshPrev = _xCoeffs[order];
 
  846         double csh = (2 * xPrime * _xCoeffs[order]) + _xCoeffs[order - 1];
 
  847         for (
int i = order - 2; i > 0; --i) {
 
  848             double cshNext = (2 * xPrime * csh) + _xCoeffs[i] - cshPrev;
 
  852         return (xPrime * csh) + _xCoeffs[0] - cshPrev;
 
  857         os << 
"Chebyshev1Function2 [";
 
  859         os << Function2<ReturnT>::toString(
prefix);
 
  871     mutable double _oldYPrime;
 
  891         _scaleX = 2.0 / (_maxX - _minX);
 
  892         _scaleY = 2.0 / (_maxY - _minY);
 
  893         _offsetX = -(_minX + _maxX) * 0.5;
 
  894         _offsetY = -(_minY + _maxY) * 0.5;
 
  926 template <
typename ReturnT>
 
  933                               double xOffset = 0.0)  
 
  934             : 
Function1<ReturnT>(1), _invN(1.0 / static_cast<double>(n)) {
 
  948     ReturnT 
operator()(
double x) 
const noexcept(IS_NOTHROW_INIT<ReturnT>)
 override {
 
  950         double xArg2 = xArg1 * _invN;
 
  952             return static_cast<ReturnT
>(
std::sin(xArg1) * 
std::sin(xArg2) / (xArg1 * xArg2));
 
  954             return static_cast<ReturnT
>(1);
 
  961     unsigned int getOrder() const noexcept { 
return static_cast<unsigned int>(0.5 + (1.0 / _invN)); };
 
  965         os << 
"LanczosFunction1 [" << this->
getOrder() << 
"]: ";
 
  967         os << Function1<ReturnT>::toString(
prefix);
 
  991 template <
typename ReturnT>
 
  998                               double xOffset = 0.0,  
 
  999                               double yOffset = 0.0)  
 
 1000             : 
Function2<ReturnT>(2), _invN(1.0 / static_cast<double>(n)) {
 
 1016     ReturnT 
operator()(
double x, 
double y) 
const noexcept(IS_NOTHROW_INIT<ReturnT>)
 override {
 
 1018         double xArg2 = xArg1 * _invN;
 
 1024         double yArg2 = yArg1 * _invN;
 
 1029         return static_cast<ReturnT
>(xFunc * yFunc);
 
 1035     unsigned int getOrder() const noexcept { 
return static_cast<unsigned int>(0.5 + (1.0 / _invN)); };
 
 1039         os << 
"LanczosFunction2 [" << this->
getOrder() << 
"]: ";
 
 1041         os << Function2<ReturnT>::toString(
prefix);
 
 1056 #endif  // #ifndef LSST_AFW_MATH_FUNCTIONLIBRARY_H 
  
LanczosFunction1(unsigned int n, double xOffset=0.0)
Construct a Lanczos function of specified order and x,y offset.
IntegerDeltaFunction1(IntegerDeltaFunction1 &&)=default
std::shared_ptr< Function1< ReturnT > > clone() const override
Return a pointer to a deep copy of this function.
unsigned int getOrder() const noexcept
Get the polynomial order.
bool isLinearCombination() const noexcept override
Is the function a linear combination of its parameters?
ReturnT operator()(double x) const noexcept(IS_NOTHROW_INIT< ReturnT >) override
Chebyshev1Function2 & operator=(Chebyshev1Function2 &&)=default
unsigned int getOrder() const noexcept
Get the polynomial order.
GaussianFunction2 & operator=(GaussianFunction2 &&)=default
int _order
order of polynomial
constexpr double PI
The ratio of a circle's circumference to diameter.
LanczosFunction2 & operator=(LanczosFunction2 &&)=default
LanczosFunction1 & operator=(LanczosFunction1 &&)=default
LanczosFunction2(unsigned int n, double xOffset=0.0, double yOffset=0.0)
Construct a Lanczos function of specified order and x,y offset.
std::shared_ptr< Function2< ReturnT > > clone() const override
Return a pointer to a deep copy of this function.
Chebyshev1Function2 & operator=(Chebyshev1Function2 const &)=default
bool isPersistable() const noexcept override
Return true if this particular object can be persisted using afw::table::io.
Chebyshev1Function2(std::vector< double > params, lsst::geom::Box2D const &xyRange=lsst::geom::Box2D(lsst::geom::Point2D(-1.0, -1.0), lsst::geom::Point2D(1.0, 1.0)))
Construct a Chebyshev polynomial with specified parameters and range.
ReturnT operator()(double x, double y) const noexcept(IS_NOTHROW_INIT< ReturnT >) override
2-dimensional weighted sum of Chebyshev polynomials of the first kind.
std::string toString(std::string const &prefix) const override
Return a string representation of the function.
Chebyshev1Function2(unsigned int order, lsst::geom::Box2D const &xyRange=lsst::geom::Box2D(lsst::geom::Point2D(-1.0, -1.0), lsst::geom::Point2D(1.0, 1.0)))
Construct a Chebyshev polynomial of specified order and range.
std::shared_ptr< Function2< ReturnT > > clone() const override
Return a pointer to a deep copy of this function.
unsigned int getOrder() const noexcept
Get the order of the Lanczos function.
DoubleGaussianFunction2()
An object passed to Persistable::write to allow it to persist itself.
PolynomialFunction1(std::vector< double > params)
Construct a polynomial function with the specified parameters.
std::string getPersistenceName() const override
Return the unique name used to persist this object and look up its factory.
~Chebyshev1Function2() noexcept override=default
~Chebyshev1Function1() noexcept override=default
IntegerDeltaFunction1(double xo)
Construct an integer delta function with specified xo.
std::shared_ptr< Function1< ReturnT > > clone() const override
Return a pointer to a deep copy of this function.
static int nParametersFromOrder(int order)
Compute number of parameters from polynomial order.
ReturnT operator()(double x, double y) const noexcept(IS_NOTHROW_INIT< ReturnT >) override
LanczosFunction2(LanczosFunction2 &&)=default
PolynomialFunction1(unsigned int order)
Construct a polynomial function of the specified order.
PolynomialFunction2 & operator=(PolynomialFunction2 const &)=default
std::shared_ptr< Function2< ReturnT > > clone() const override
Return a pointer to a deep copy of this function.
~DoubleGaussianFunction2() noexcept override=default
afw::table::Key< double > sigma
1-dimensional integer delta function.
double getMinX() const noexcept
Get minimum allowed x.
Base class for 2-dimensional polynomials of the form:
2-dimensional separable Lanczos function
DoubleGaussianFunction2(double sigma1, double sigma2=0, double ampl2=0)
Construct a Gaussian function with specified x and y sigma.
LanczosFunction2(LanczosFunction2 const &)=default
bool isPersistable() const noexcept override
Return true if this particular object can be persisted using afw::table::io.
void write(afw::table::io::OutputArchiveHandle &handle) const override
Write the object to one or more catalogs.
IntegerDeltaFunction2(IntegerDeltaFunction2 const &)=default
std::string toString(std::string const &prefix) const override
Return a string representation of the function.
table::Key< double > angle
std::shared_ptr< Function2< ReturnT > > clone() const override
Return a pointer to a deep copy of this function.
DoubleGaussianFunction2 & operator=(DoubleGaussianFunction2 const &)=default
std::shared_ptr< Function2< ReturnT > > clone() const override
Return a pointer to a deep copy of this function.
bool isLinearCombination() const noexcept override
Is the function a linear combination of its parameters?
IntegerDeltaFunction1 & operator=(IntegerDeltaFunction1 const &)=default
std::shared_ptr< Function2< ReturnT > > clone() const override
Return a pointer to a deep copy of this function.
std::string toString(std::string const &prefix) const override
Return a string representation of the function.
DoubleGaussianFunction2(DoubleGaussianFunction2 &&)=default
1-dimensional weighted sum of Chebyshev polynomials of the first kind.
GaussianFunction1 & operator=(GaussianFunction1 const &)=default
ReturnT operator()(double x) const noexcept(IS_NOTHROW_INIT< ReturnT >) override
GaussianFunction2 & operator=(GaussianFunction2 const &)=default
~GaussianFunction1() noexcept override=default
table::Key< double > sigma2
PolynomialFunction2 & operator=(PolynomialFunction2 &&)=default
std::string toString(std::string const &prefix) const override
Return a string representation of the function.
~IntegerDeltaFunction1() noexcept override=default
std::string toString(std::string const &prefix="") const override
Return a string representation of the function.
IntegerDeltaFunction1 & operator=(IntegerDeltaFunction1 &&)=default
void write(afw::table::io::OutputArchiveHandle &handle) const override
Write the object to one or more catalogs.
double getMinY() const noexcept
table::Key< double > ampl2
std::shared_ptr< Function1< ReturnT > > clone() const override
Return a pointer to a deep copy of this function.
DoubleGaussianFunction2 & operator=(DoubleGaussianFunction2 &&)=default
2-dimensional integer delta function.
double getMaxX() const noexcept
Get maximum allowed x.
DoubleGaussianFunction2(DoubleGaussianFunction2 const &)=default
1-dimensional Lanczos function
double getMaxX() const noexcept
PolynomialFunction2(PolynomialFunction2 const &)=default
unsigned int getOrder() const noexcept
Get the order of Lanczos function.
~LanczosFunction2() noexcept override=default
~LanczosFunction1() noexcept override=default
std::vector< double > getDFuncDParameters(double x, double y) const override
Return the coefficients of the Function's parameters, evaluated at (x, y) I.e.
Chebyshev1Function1(std::vector< double > params, double minX=-1, double maxX=1)
Construct a Chebyshev polynomial with specified parameters and range.
double getMinX() const noexcept
ReturnT operator()(double x) const noexcept(IS_NOTHROW_INIT< ReturnT >) override
table::Key< double > sigma1
std::shared_ptr< Function1< ReturnT > > clone() const override
Return a pointer to a deep copy of this function.
ReturnT operator()(double x, double y) const noexcept(IS_NOTHROW_INIT< ReturnT >) override
Chebyshev1Function1 & operator=(Chebyshev1Function1 &&)=default
ReturnT operator()(double x) const noexcept(IS_NOTHROW_INIT< ReturnT >) override
Chebyshev1Function1(Chebyshev1Function1 const &)=default
Chebyshev1Function1(Chebyshev1Function1 &&)=default
lsst::geom::Box2D getXYRange() const noexcept
Get x,y range.
void write(afw::table::io::OutputArchiveHandle &handle) const override
Write the object to one or more catalogs.
GaussianFunction1(GaussianFunction1 const &)=default
std::string toString(std::string const &prefix) const override
Return a string representation of the function.
IntegerDeltaFunction2 & operator=(IntegerDeltaFunction2 &&)=default
IntegerDeltaFunction2 & operator=(IntegerDeltaFunction2 const &)=default
GaussianFunction1(double sigma)
Construct a Gaussian function with specified sigma.
GaussianFunction2(GaussianFunction2 &&)=default
PolynomialFunction1(PolynomialFunction1 &&)=default
A base class for image defects.
virtual Chebyshev1Function2 truncate(int truncOrder) const
Return a truncated copy of lower (or equal) order.
#define LSST_EXCEPT(type,...)
Create an exception with a given type.
1-dimensional polynomial function.
LanczosFunction2 & operator=(LanczosFunction2 const &)=default
ReturnT operator()(double x) const override
std::vector< double > _params
GaussianFunction1 & operator=(GaussianFunction1 &&)=default
bool isPersistable() const noexcept override
Return true if this particular object can be persisted using afw::table::io.
~GaussianFunction2() noexcept override=default
A Function taking two arguments.
std::string getPersistenceName() const override
Return the unique name used to persist this object and look up its factory.
PolynomialFunction2(std::vector< double > params)
Construct a polynomial function with specified parameters.
IntegerDeltaFunction2(IntegerDeltaFunction2 &&)=default
double Guassian (sum of two Gaussians)
bool isPersistable() const noexcept override
Return true if this particular object can be persisted using afw::table::io.
LanczosFunction1 & operator=(LanczosFunction1 const &)=default
ReturnT operator()(double x, double y) const override
IntegerDeltaFunction1(IntegerDeltaFunction1 const &)=default
GaussianFunction2(double sigma1, double sigma2, double angle=0.0)
Construct a 2-dimensional Gaussian function.
PolynomialFunction1(PolynomialFunction1 const &)=default
PolynomialFunction1 & operator=(PolynomialFunction1 &&)=default
Reports invalid arguments.
unsigned int getNParameters() const noexcept
Return the number of function parameters.
~PolynomialFunction2() noexcept override=default
void write(afw::table::io::OutputArchiveHandle &handle) const override
Write the object to one or more catalogs.
PolynomialFunction1 & operator=(PolynomialFunction1 const &)=default
Chebyshev1Function1 & operator=(Chebyshev1Function1 const &)=default
double getMaxY() const noexcept
PolynomialFunction2(unsigned int order)
Construct a polynomial function of specified order.
Chebyshev1Function2(Chebyshev1Function2 &&)=default
ReturnT operator()(double x, double y) const noexcept(IS_NOTHROW_INIT< ReturnT >) override
std::string toString(std::string const &prefix) const override
Return a string representation of the function.
PolynomialFunction2(PolynomialFunction2 &&)=default
std::string getPersistenceName() const override
Return the unique name used to persist this object and look up its factory.
~PolynomialFunction1() noexcept override=default
~IntegerDeltaFunction2() noexcept override=default
std::string toString(std::string const &prefix) const override
Return a string representation of the function.
std::string getPersistenceName() const override
Return the unique name used to persist this object and look up its factory.
Chebyshev1Function1(unsigned int order, double minX=-1, double maxX=1)
Construct a Chebyshev polynomial of specified order and range.
2-dimensional polynomial function with cross terms
A floating-point coordinate rectangle geometry.
std::string toString(std::string const &prefix) const override
Return a string representation of the function.
std::shared_ptr< Function1< ReturnT > > clone() const override
Return a pointer to a deep copy of this function.
Chebyshev1Function2(Chebyshev1Function2 const &)=default
LanczosFunction1(LanczosFunction1 &&)=default
A Function taking one argument.
std::string toString(std::string const &prefix) const override
Return a string representation of the function.
GaussianFunction1(GaussianFunction1 &&)=default
ReturnT operator()(double x, double y) const noexcept(IS_NOTHROW_INIT< ReturnT >) override
GaussianFunction2(GaussianFunction2 const &)=default
LanczosFunction1(LanczosFunction1 const &)=default
std::string toString(std::string const &prefix) const override
Return a string representation of the function.
IntegerDeltaFunction2(double xo, double yo)
Construct an integer delta function with specified xo, yo.