LSST Applications g04a91732dc+146a938ab0,g07dc498a13+80b84b0d75,g0fba68d861+4c4f3dcb5c,g1409bbee79+80b84b0d75,g1a7e361dbc+80b84b0d75,g1fd858c14a+f6e422e056,g20f46db602+333b6c0f32,g35bb328faa+fcb1d3bbc8,g42c1b31a95+a1301e4c20,g4d2262a081+f1facf12e5,g4d39ba7253+9b833be27e,g4e0f332c67+5d362be553,g53246c7159+fcb1d3bbc8,g60b5630c4e+9b833be27e,g78460c75b0+2f9a1b4bcd,g786e29fd12+cf7ec2a62a,g7b71ed6315+fcb1d3bbc8,g8852436030+790117df0f,g89139ef638+80b84b0d75,g8d6b6b353c+9b833be27e,g9125e01d80+fcb1d3bbc8,g989de1cb63+80b84b0d75,g9f33ca652e+9c6b68d7f3,ga9baa6287d+9b833be27e,gaaedd4e678+80b84b0d75,gabe3b4be73+1e0a283bba,gb1101e3267+9f3571abad,gb58c049af0+f03b321e39,gb90eeb9370+691e4ab549,gc741bbaa4f+2bcd3860df,gcf25f946ba+790117df0f,gd315a588df+5b65d88fe4,gd6cbbdb0b4+c8606af20c,gd9a9a58781+fcb1d3bbc8,gde0f65d7ad+ee6a3faa19,ge278dab8ac+932305ba37,ge82c20c137+76d20ab76d,gee8db133a9+2a6ae0040b,w.2025.10
LSST Data Management Base Package
Loading...
Searching...
No Matches
AnalyticKernel.cc
Go to the documentation of this file.
1// -*- LSST-C++ -*-
2
3/*
4 * LSST Data Management System
5 * Copyright 2008, 2009, 2010 LSST Corporation.
6 *
7 * This product includes software developed by the
8 * LSST Project (http://www.lsst.org/).
9 *
10 * This program is free software: you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation, either version 3 of the License, or
13 * (at your option) any later version.
14 *
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
19 *
20 * You should have received a copy of the LSST License Statement and
21 * the GNU General Public License along with this program. If not,
22 * see <http://www.lsstcorp.org/LegalNotices/>.
23 */
24#include <sstream>
25
26#include "lsst/pex/exceptions.h"
30
31namespace pexExcept = lsst::pex::exceptions;
32
33namespace lsst {
34namespace afw {
35
36template std::shared_ptr<math::AnalyticKernel> table::io::PersistableFacade<
37 math::AnalyticKernel>::dynamicCast(std::shared_ptr<table::io::Persistable> const &);
38
39namespace math {
40
42
43AnalyticKernel::AnalyticKernel(int width, int height, KernelFunction const &kernelFunction,
44 Kernel::SpatialFunction const &spatialFunction)
45 : Kernel(width, height, kernelFunction.getNParameters(), spatialFunction),
46 _kernelFunctionPtr(kernelFunction.clone()) {}
47
48AnalyticKernel::AnalyticKernel(int width, int height, KernelFunction const &kernelFunction,
49 std::vector<Kernel::SpatialFunctionPtr> const &spatialFunctionList)
50 : Kernel(width, height, spatialFunctionList), _kernelFunctionPtr(kernelFunction.clone()) {
51 if (kernelFunction.getNParameters() != spatialFunctionList.size()) {
52 std::ostringstream os;
53 os << "kernelFunction.getNParameters() = " << kernelFunction.getNParameters()
54 << " != " << spatialFunctionList.size() << " = "
55 << "spatialFunctionList.size()";
56 throw LSST_EXCEPT(pexExcept::InvalidParameterError, os.str());
57 }
58}
59
62 if (this->isSpatiallyVarying()) {
63 retPtr.reset(new AnalyticKernel(this->getWidth(), this->getHeight(), *(this->_kernelFunctionPtr),
65 } else {
66 retPtr.reset(new AnalyticKernel(this->getWidth(), this->getHeight(), *(this->_kernelFunctionPtr)));
67 }
68 retPtr->setCtr(this->getCtr());
69 return retPtr;
70}
71
74 if (isSpatiallyVarying()) {
76 } else {
78 }
79 return retPtr;
80}
81
82double AnalyticKernel::computeImage(image::Image<Pixel> &image, bool doNormalize, double x, double y) const {
83 lsst::geom::Extent2I llBorder = (image.getDimensions() - getDimensions()) / 2;
85 if (this->isSpatiallyVarying()) {
87 }
88 return doComputeImage(image, doNormalize);
89}
90
94
97 os << prefix << "AnalyticKernel:" << std::endl;
98 os << prefix << "..function: " << (_kernelFunctionPtr ? _kernelFunctionPtr->toString() : "None")
99 << std::endl;
100 os << Kernel::toString(prefix + "\t");
101 return os.str();
102}
103
107
108//
109// Protected Member Functions
110//
112 double imSum = 0;
113 for (int y = 0; y != image.getHeight(); ++y) {
114 double const fy = image.indexToPosition(y, image::Y);
115 image::Image<Pixel>::x_iterator ptr = image.row_begin(y);
116 for (int x = 0; x != image.getWidth(); ++x, ++ptr) {
117 double const fx = image.indexToPosition(x, image::X);
118 Pixel const pixelVal = (*_kernelFunctionPtr)(fx, fy);
119 *ptr = pixelVal;
120 imSum += pixelVal;
121 }
122 }
123
124 if (doNormalize && (imSum != 1)) {
125 if (imSum == 0) {
126 throw LSST_EXCEPT(pexExcept::OverflowError, "Cannot normalize; kernel sum is 0");
127 }
128 image /= imSum;
129 imSum = 1;
130 }
131
132 return imSum;
133}
134
135void AnalyticKernel::setKernelParameter(unsigned int ind, double value) const {
136 _kernelFunctionPtr->setParameter(ind, value);
137}
138
139// ------ Persistence ---------------------------------------------------------------------------------------
140
141namespace {
142
143struct AnalyticKernelPersistenceHelper : public Kernel::PersistenceHelper {
144 table::Key<int> kernelFunction;
145
146 explicit AnalyticKernelPersistenceHelper(int nSpatialFunctions)
147 : Kernel::PersistenceHelper(nSpatialFunctions),
148 kernelFunction(schema.addField<int>(
149 "kernelfunction", "archive ID for analytic function used to produce kernel images")) {}
150
151 explicit AnalyticKernelPersistenceHelper(table::Schema const &schema_)
152 : Kernel::PersistenceHelper(schema_), kernelFunction(schema["kernelfunction"]) {}
153};
154
155} // namespace
156
158public:
160 CatalogVector const &catalogs) const override {
161 LSST_ARCHIVE_ASSERT(catalogs.size() == 1u);
162 LSST_ARCHIVE_ASSERT(catalogs.front().size() == 1u);
163 AnalyticKernelPersistenceHelper const keys(catalogs.front().getSchema());
164 afw::table::BaseRecord const &record = catalogs.front().front();
166 archive.get<AnalyticKernel::KernelFunction>(record.get(keys.kernelFunction));
168 if (keys.spatialFunctions.isValid()) {
169 result = std::make_shared<AnalyticKernel>(record.get(keys.dimensions.getX()),
170 record.get(keys.dimensions.getY()), *kernelFunction,
171 keys.readSpatialFunctions(archive, record));
172 } else {
173 result = std::make_shared<AnalyticKernel>(record.get(keys.dimensions.getX()),
174 record.get(keys.dimensions.getY()), *kernelFunction);
175 }
176 result->setCtr(record.get(keys.center));
177 return result;
178 }
179
180 explicit Factory(std::string const &name) : afw::table::io::PersistableFactory(name) {}
181};
182
183namespace {
184
185std::string getAnalyticKernelPersistenceName() { return "AnalyticKernel"; }
186
187AnalyticKernel::Factory registration(getAnalyticKernelPersistenceName());
188
189} // namespace
190
191std::string AnalyticKernel::getPersistenceName() const { return getAnalyticKernelPersistenceName(); }
192
194 AnalyticKernelPersistenceHelper const keys(_spatialFunctionList.size());
195 std::shared_ptr<afw::table::BaseRecord> record = keys.write(handle, *this);
196 record->set(keys.kernelFunction, handle.put(_kernelFunctionPtr.get()));
197}
198} // namespace math
199} // namespace afw
200} // namespace lsst
#define LSST_EXCEPT(type,...)
Create an exception with a given type.
Definition Exception.h:48
#define LSST_ARCHIVE_ASSERT(EXPR)
An assertion macro used to validate the structure of an InputArchive.
Definition Persistable.h:48
A class to represent a 2-dimensional array of pixels.
Definition Image.h:51
std::shared_ptr< afw::table::io::Persistable > read(InputArchive const &archive, CatalogVector const &catalogs) const override
Construct a new object from the given InputArchive and vector of catalogs.
A kernel described by a function.
Definition Kernel.h:535
std::vector< double > getKernelParameters() const override
Return the current kernel parameters.
std::string toString(std::string const &prefix="") const override
Return a string representation of the kernel.
lsst::afw::math::Function2< Pixel > KernelFunction
Definition Kernel.h:537
std::shared_ptr< Kernel > resized(int width, int height) const override
Return a pointer to a clone with specified kernel dimensions.
double computeImage(lsst::afw::image::Image< Pixel > &image, bool doNormalize, double x=0.0, double y=0.0) const
Compute an image (pixellized representation of the kernel) in place.
std::shared_ptr< Kernel > clone() const override
Return a pointer to a deep copy of this kernel.
void setKernelParameter(unsigned int ind, double value) const override
Set one kernel parameter.
virtual KernelFunctionPtr getKernelFunction() const
Get a deep copy of the kernel function.
double doComputeImage(lsst::afw::image::Image< Pixel > &image, bool doNormalize) const override
Low-level version of computeImage.
void write(OutputArchiveHandle &handle) const override
Write the object to one or more catalogs.
KernelFunctionPtr _kernelFunctionPtr
Definition Kernel.h:633
std::shared_ptr< lsst::afw::math::Function2< Pixel > > KernelFunctionPtr
Definition Kernel.h:538
std::string getPersistenceName() const override
Return the unique name used to persist this object and look up its factory.
AnalyticKernel()
Construct an empty spatially invariant AnalyticKernel of size 0x0.
unsigned int getNParameters() const noexcept
Return the number of function parameters.
Definition Function.h:112
Kernels are used for convolution with MaskedImages and (eventually) Images.
Definition Kernel.h:110
lsst::geom::Extent2I const getDimensions() const
Return the Kernel's dimensions (width, height)
Definition Kernel.h:212
std::vector< SpatialFunctionPtr > _spatialFunctionList
Definition Kernel.h:449
int getHeight() const
Return the Kernel's height.
Definition Kernel.h:229
lsst::geom::Point2I getCtr() const
Return index of kernel's center.
Definition Kernel.h:234
virtual std::string toString(std::string const &prefix="") const
Return a string representation of the kernel.
Definition Kernel.cc:185
lsst::afw::math::Function2< double > SpatialFunction
Definition Kernel.h:114
int getWidth() const
Return the Kernel's width.
Definition Kernel.h:224
bool isSpatiallyVarying() const
Return true iff the kernel is spatially varying (has a spatial function)
Definition Kernel.h:333
Kernel()
Construct a null Kernel of size 0,0.
Definition Kernel.cc:49
void setKernelParametersFromSpatialModel(double x, double y) const
Set the kernel parameters from the spatial model (if any).
Definition Kernel.cc:217
Base class for all records.
Definition BaseRecord.h:31
Field< T >::Value get(Key< T > const &key) const
Return the value of a field for the given key.
Definition BaseRecord.h:151
A class used as a handle to a particular field in a table.
Definition Key.h:53
Defines the fields and offsets for a table.
Definition Schema.h:51
std::shared_ptr< Persistable > get(int id) const
Load the Persistable with the given ID and return it.
int put(Persistable const *obj, bool permissive=false)
Save an object to the archive and return a unique ID that can be used to retrieve it from an InputArc...
A CRTP facade class for subclasses of Persistable.
A base class for factory classes used to reconstruct objects from records.
PersistableFactory(std::string const &name)
Constructor for the factory.
io::OutputArchiveHandle OutputArchiveHandle
T endl(T... args)
T make_shared(T... args)
Extent< int, 2 > Extent2I
Definition Extent.h:397
Point< int, 2 > Point2I
Definition Point.h:321
T reset(T... args)
T size(T... args)
T str(T... args)