44 _kernelColFunctionPtr(),
45 _kernelRowFunctionPtr(),
58 :
Kernel(width, height, kernelColFunction.getNParameters() + kernelRowFunction.getNParameters(),
60 _kernelColFunctionPtr(kernelColFunction.
clone()),
61 _kernelRowFunctionPtr(kernelRowFunction.
clone()),
63 _localRowList(height),
74 :
Kernel(width, height, spatialFunctionList),
75 _kernelColFunctionPtr(kernelColFunction.
clone()),
76 _kernelRowFunctionPtr(kernelRowFunction.
clone()),
78 _localRowList(height),
84 spatialFunctionList.
size()) {
86 os <<
"kernelColFunction.getNParameters() + kernelRowFunction.getNParameters() = "
88 <<
" != " << spatialFunctionList.
size() <<
" = "
89 <<
"spatialFunctionList.size()";
103 *(this->_kernelRowFunctionPtr)));
105 retPtr->setCtr(this->
getCtr());
113 retPtr = std::make_shared<SeparableKernel>(width, height, *_kernelColFunctionPtr,
116 retPtr = std::make_shared<SeparableKernel>(width, height, *_kernelColFunctionPtr,
117 *_kernelRowFunctionPtr);
123 bool doNormalize,
double x,
double y)
const {
124 if (
static_cast<int>(colList.
size()) != this->getWidth() ||
125 static_cast<int>(rowList.
size()) != this->getHeight()) {
127 os <<
"colList.size(), rowList.size() = (" << colList.
size() <<
", " << rowList.
size() <<
") != ("
129 <<
"kernel dimensions";
136 return basicComputeVectors(colList, rowList, doNormalize);
140 return _kernelColFunctionPtr->
clone();
144 return _kernelRowFunctionPtr->
clone();
151 <<
"..x (width) function: " << (_kernelColFunctionPtr ? _kernelColFunctionPtr->
toString() :
"None")
154 <<
"..y (rows) function: " << (_kernelRowFunctionPtr ? _kernelRowFunctionPtr->
toString() :
"None")
172 double imSum = basicComputeVectors(_localColList, _localRowList, doNormalize);
174 for (
int y = 0;
y !=
image.getHeight(); ++
y) {
177 ++colIter, ++imPtr) {
178 *imPtr = (*colIter) * _localRowList[
y];
186 unsigned int const nColParams = _kernelColFunctionPtr->
getNParameters();
187 if (ind < nColParams) {
190 _kernelRowFunctionPtr->
setParameter(ind - nColParams, value);
199 bool doNormalize)
const {
201 if (_kernelColCache.
empty()) {
202 for (
unsigned int i = 0; i != colList.
size(); ++i) {
203 double colFuncValue = (*_kernelColFunctionPtr)(_kernelX[i]);
204 colList[i] = colFuncValue;
205 colSum += colFuncValue;
213 for (
unsigned int i = 0; i != colList.
size(); ++i) {
214 double colFuncValue = cachedValues[i];
215 colList[i] = colFuncValue;
216 colSum += colFuncValue;
221 if (_kernelRowCache.
empty()) {
222 for (
unsigned int i = 0; i != rowList.
size(); ++i) {
223 double rowFuncValue = (*_kernelRowFunctionPtr)(_kernelY[i]);
224 rowList[i] = rowFuncValue;
225 rowSum += rowFuncValue;
233 for (
unsigned int i = 0; i != rowList.
size(); ++i) {
234 double rowFuncValue = cachedValues[i];
235 rowList[i] = rowFuncValue;
236 rowSum += rowFuncValue;
240 if (::
fabs(rowFuncValue - (*_kernelRowFunctionPtr)(_kernelX[i])) > 1e-2) {
242 << rowFuncValue <<
" "
243 << (*_kernelRowFunctionPtr)(_kernelX[i])
251 double imSum = colSum * rowSum;
253 if ((colSum == 0) || (rowSum == 0)) {
256 for (
double & colIter : colList) {
260 for (
double & rowIter : rowList) {
275 kernelCache->erase(kernelCache->begin(), kernelCache->end());
279 if (kernelCache[0].size() !=
x.size()) {
280 kernelCache->erase(kernelCache->begin(), kernelCache->end());
283 int const old_cacheSize = kernelCache->size();
290 kernelCache->erase(kernelCache->begin() +
cacheSize, kernelCache->end());
293 for (
int i = old_cacheSize; i !=
cacheSize; ++i) {
294 (*kernelCache)[i].resize(
x.size());
301 func->setParameter(0, (i + 0.5) /
static_cast<double>(
cacheSize));
302 for (
unsigned int j = 0; j !=
x.size(); ++j) {
303 (*kernelCache)[i][j] = (*func)(
x[j]);
313 _computeCache(
cacheSize, _kernelY, func, &_kernelColCache);
316 _computeCache(
cacheSize, _kernelX, func, &_kernelRowCache);
#define LSST_EXCEPT(type,...)
Create an exception with a given type.
T back_inserter(T... args)
typename _view_t::x_iterator x_iterator
An iterator for traversing the pixels in a row.
A Function taking one argument.
std::string toString(std::string const &prefix="") const override
Return a string representation of the function.
virtual std::shared_ptr< Function1< ReturnT > > clone() const =0
Return a pointer to a deep copy of this function.
A Function taking two arguments.
std::vector< double > const & getParameters() const noexcept
Return all function parameters.
void setParameter(unsigned int ind, double newValue)
Set one function parameter without range checking.
unsigned int getNParameters() const noexcept
Return the number of function parameters.
Kernels are used for convolution with MaskedImages and (eventually) Images.
std::vector< SpatialFunctionPtr > _spatialFunctionList
int getHeight() const
Return the Kernel's height.
lsst::geom::Point2I getCtr() const
Return index of kernel's center.
virtual std::string toString(std::string const &prefix="") const
Return a string representation of the kernel.
int getWidth() const
Return the Kernel's width.
bool isSpatiallyVarying() const
Return true iff the kernel is spatially varying (has a spatial function)
void setKernelParametersFromSpatialModel(double x, double y) const
Set the kernel parameters from the spatial model (if any).
KernelFunctionPtr getKernelRowFunction() const
Get a deep copy of the row kernel function.
std::string toString(std::string const &prefix="") const override
Return a string representation of the kernel.
std::shared_ptr< Kernel > clone() const override
Return a pointer to a deep copy of this kernel.
std::vector< double > getKernelParameters() const override
Return the current kernel parameters.
std::shared_ptr< KernelFunction > KernelFunctionPtr
double getKernelParameter(unsigned int i) const override
Return a particular Kernel Parameter (no bounds checking).
int getCacheSize() const override
Get the current cache size (0 if none)
double doComputeImage(lsst::afw::image::Image< Pixel > &image, bool doNormalize) const override
Low-level version of computeImage.
KernelFunctionPtr getKernelColFunction() const
Get a deep copy of the col kernel function.
double computeVectors(std::vector< Pixel > &colList, std::vector< Pixel > &rowList, bool doNormalize, double x=0.0, double y=0.0) const
Compute the column and row arrays in place, where kernel(col, row) = colList(col) * rowList(row)
std::shared_ptr< Kernel > resized(int width, int height) const override
Return a pointer to a clone with specified kernel dimensions.
virtual void _setKernelXY() override
void setKernelParameter(unsigned int ind, double value) const override
Set one kernel parameter.
SeparableKernel()
Construct an empty spatially invariant SeparableKernel of size 0x0.
void computeCache(int const cacheSize) override
Compute a cache of Kernel values, if desired.
Reports invalid arguments.
Reports when the result of an arithmetic operation is too large for the destination type.
Backwards-compatibility support for depersisting the old Calib (FluxMag0/FluxMag0Err) objects.
A base class for image defects.
table::Key< int > cacheSize