26 #include "ndarray/eigen.h" 47 struct GaussianPsfPersistenceHelper {
52 static GaussianPsfPersistenceHelper
const&
get() {
53 static GaussianPsfPersistenceHelper instance;
58 GaussianPsfPersistenceHelper(
const GaussianPsfPersistenceHelper&) =
delete;
59 GaussianPsfPersistenceHelper& operator=(
const GaussianPsfPersistenceHelper&) =
delete;
62 GaussianPsfPersistenceHelper(GaussianPsfPersistenceHelper&&) =
delete;
63 GaussianPsfPersistenceHelper& operator=(GaussianPsfPersistenceHelper&&) =
delete;
66 GaussianPsfPersistenceHelper()
69 "width/height of realization of Psf",
"pixel")),
70 sigma(schema.addField<
double>(
"sigma",
"radius of Gaussian",
"pixel")) {}
73 class GaussianPsfFactory :
public afw::table::io::PersistableFactory {
76 CatalogVector
const& catalogs)
const override {
77 static GaussianPsfPersistenceHelper
const&
keys = GaussianPsfPersistenceHelper::get();
80 afw::table::BaseRecord
const& record = catalogs.front().front();
82 return std::make_shared<GaussianPsf>(record.get(keys.dimensions.getX()),
83 record.get(keys.dimensions.getY()), record.get(keys.sigma));
86 GaussianPsfFactory(
std::string const&
name) : afw::table::io::PersistableFactory(name) {}
89 GaussianPsfFactory registration(
"GaussianPsf");
92 if (dimensions.getX() % 2 == 0 || dimensions.getY() % 2 == 2) {
93 throw LSST_EXCEPT(pex::exceptions::InvalidParameterError,
"GaussianPsf dimensions must be odd");
100 :
Psf(true), _dimensions(width, height), _sigma(sigma) {
101 checkDimensions(_dimensions);
105 :
Psf(true), _dimensions(dimensions), _sigma(sigma) {
106 checkDimensions(_dimensions);
114 return std::make_shared<GaussianPsf>(_dimensions, _sigma);
126 static GaussianPsfPersistenceHelper
const&
keys = GaussianPsfPersistenceHelper::get();
129 (*record)[keys.dimensions.getX()] = _dimensions.getX();
130 (*record)[keys.dimensions.getY()] = _dimensions.getY();
140 for (
int yIndex = 0,
y = r->getY0(); yIndex < _dimensions.getY(); ++yIndex, ++
y) {
141 Image::Array::Reference
row = array[yIndex];
142 for (
int xIndex = 0,
x = r->getX0(); xIndex < _dimensions.getX(); ++xIndex, ++
x) {
143 sum += row[xIndex] =
std::exp(-0.5 * (
x *
x +
y *
y) / (_sigma * _sigma));
146 ndarray::asEigenMatrix(array) /= sum;
152 return 1.0 -
std::exp(-0.5 * radius * radius / (_sigma * _sigma));
An ellipse core with quadrupole moments as parameters.
An object passed to Persistable::write to allow it to persist itself.
afw::table::Schema schema
std::string getPythonModule() const override
Return the fully-qualified Python module that should be imported to guarantee that its factory is reg...
GaussianPsf(int width, int height, double sigma)
Constructor for a GaussianPsf.
static PointKey addFields(Schema &schema, std::string const &name, std::string const &doc, std::string const &unit)
Add a pair of _x, _y fields to a Schema, and return a PointKey that points to them.
std::shared_ptr< afw::detection::Psf > resized(int width, int height) const override
Return a clone with specified kernel dimensions.
afw::table::Key< double > sigma
afw::table::PointKey< int > dimensions
A base class for image defects.
std::shared_ptr< afw::detection::Psf > clone() const override
Polymorphic deep copy; should usually be unnecessary because Psfs are immutable.
BaseCatalog makeCatalog(Schema const &schema)
Return a new, empty catalog with the given schema.
#define LSST_EXCEPT(type,...)
Create an exception with a given type.
Extent< int, 2 > Extent2I
#define LSST_ARCHIVE_ASSERT(EXPR)
An assertion macro used to validate the structure of an InputArchive.
double getSigma() const
Return the radius of the Gaussian.
void saveCatalog(BaseCatalog const &catalog)
Save a catalog in the archive.
Describe the colour of a source.
A polymorphic base class for representing an image's Point Spread Function.
lsst::geom::Box2I computeBBox(lsst::geom::Point2D position=makeNullPoint(), image::Color color=image::Color()) const
Return the bounding box of the image returned by computeKernelImage()
ndarray::Array< PixelT, 2, 1 > Array
A mutable ndarray representation of the image.
An integer coordinate rectangle.
A circularly symmetric Gaussian Psf class with no spatial variation, intended mostly for testing purp...
image::Image< Pixel > Image
Image type returned by computeImage.
void write(OutputArchiveHandle &handle) const override
Write the object to one or more catalogs.
std::shared_ptr< RecordT > addNew()
Create a new record, add it to the end of the catalog, and return a pointer to it.
std::string getPersistenceName() const override
Return the unique name used to persist this object and look up its factory.