LSST Applications 27.0.0,g0265f82a02+469cd937ee,g02d81e74bb+21ad69e7e1,g1470d8bcf6+cbe83ee85a,g2079a07aa2+e67c6346a6,g212a7c68fe+04a9158687,g2305ad1205+94392ce272,g295015adf3+81dd352a9d,g2bbee38e9b+469cd937ee,g337abbeb29+469cd937ee,g3939d97d7f+72a9f7b576,g487adcacf7+71499e7cba,g50ff169b8f+5929b3527e,g52b1c1532d+a6fc98d2e7,g591dd9f2cf+df404f777f,g5a732f18d5+be83d3ecdb,g64a986408d+21ad69e7e1,g858d7b2824+21ad69e7e1,g8a8a8dda67+a6fc98d2e7,g99cad8db69+f62e5b0af5,g9ddcbc5298+d4bad12328,ga1e77700b3+9c366c4306,ga8c6da7877+71e4819109,gb0e22166c9+25ba2f69a1,gb6a65358fc+469cd937ee,gbb8dafda3b+69d3c0e320,gc07e1c2157+a98bf949bb,gc120e1dc64+615ec43309,gc28159a63d+469cd937ee,gcf0d15dbbd+72a9f7b576,gdaeeff99f8+a38ce5ea23,ge6526c86ff+3a7c1ac5f1,ge79ae78c31+469cd937ee,gee10cc3b42+a6fc98d2e7,gf1cff7945b+21ad69e7e1,gfbcc870c63+9a11dc8c8f
LSST Data Management Base Package
Loading...
Searching...
No Matches
DoubleGaussianPsf.cc
Go to the documentation of this file.
1// -*- LSST-C++ -*-
2/*
3 * LSST Data Management System
4 * Copyright 2008-2013 LSST Corporation.
5 *
6 * This product includes software developed by the
7 * LSST Project (http://www.lsst.org/).
8 *
9 * This program is free software: you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation, either version 3 of the License, or
12 * (at your option) any later version.
13 *
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
18 *
19 * You should have received a copy of the LSST License Statement and
20 * the GNU General Public License along with this program. If not,
21 * see <http://www.lsstcorp.org/LegalNotices/>.
22 */
23
24#include <cmath>
25
26#include "lsst/pex/exceptions.h"
35
36namespace lsst {
37namespace afw {
38namespace table {
39namespace io {
40
43
44} // namespace io
45} // namespace table
46} // namespace afw
47namespace meas {
48namespace algorithms {
49
50namespace {
51
52// Read-only singleton struct containing the schema and keys that a double-Gaussian Psf is mapped
53// to in record persistence.
54struct DoubleGaussianPsfPersistenceHelper {
55 afw::table::Schema schema;
56 afw::table::PointKey<int> dimensions;
57 afw::table::Key<double> sigma1;
58 afw::table::Key<double> sigma2;
59 afw::table::Key<double> b;
60
61 static DoubleGaussianPsfPersistenceHelper const& get() {
62 static DoubleGaussianPsfPersistenceHelper instance;
63 return instance;
64 }
65
66 // No copying
67 DoubleGaussianPsfPersistenceHelper(const DoubleGaussianPsfPersistenceHelper&) = delete;
68 DoubleGaussianPsfPersistenceHelper& operator=(const DoubleGaussianPsfPersistenceHelper&) = delete;
69
70 // No moving
71 DoubleGaussianPsfPersistenceHelper(DoubleGaussianPsfPersistenceHelper&&) = delete;
72 DoubleGaussianPsfPersistenceHelper& operator=(DoubleGaussianPsfPersistenceHelper&&) = delete;
73
74private:
75 DoubleGaussianPsfPersistenceHelper()
76 : schema(),
77 dimensions(afw::table::PointKey<int>::addFields(schema, "dimensions", "width/height of kernel",
78 "pixel")),
79 sigma1(schema.addField<double>("sigma1", "radius of inner Gaussian", "pixel")),
80 sigma2(schema.addField<double>("sigma2", "radius of outer Gaussian", "pixel")),
81 b(schema.addField<double>("b", "central amplitude of outer Gaussian (inner amplitude == 1)")) {}
82};
83
84class DoubleGaussianPsfFactory : public afw::table::io::PersistableFactory {
85public:
87 read(InputArchive const& archive, CatalogVector const& catalogs) const {
88 static DoubleGaussianPsfPersistenceHelper const& keys = DoubleGaussianPsfPersistenceHelper::get();
89 LSST_ARCHIVE_ASSERT(catalogs.size() == 1u);
90 LSST_ARCHIVE_ASSERT(catalogs.front().size() == 1u);
91 afw::table::BaseRecord const& record = catalogs.front().front();
92 LSST_ARCHIVE_ASSERT(record.getSchema() == keys.schema);
93 return std::make_shared<DoubleGaussianPsf>(
94 record.get(keys.dimensions.getX()), record.get(keys.dimensions.getY()),
95 record.get(keys.sigma1), record.get(keys.sigma2), record.get(keys.b));
96 }
97
98 DoubleGaussianPsfFactory(std::string const& name) : afw::table::io::PersistableFactory(name) {}
99};
100
101// Helper function for ctor: need to construct the kernel to pass to KernelPsf, because we
102// can't change it after construction.
104makeDoubleGaussianKernel(int width, int height, double sigma1, double& sigma2, double b) {
105 if (b == 0.0 && sigma2 == 0.0) {
106 sigma2 = 1.0; // avoid 0/0 at centre of Psf
107 }
108 if (sigma1 <= 0 || sigma2 <= 0) {
109 throw LSST_EXCEPT(pex::exceptions::DomainError,
110 (boost::format("sigma may not be 0: %g, %g") % sigma1 % sigma2).str());
111 }
112 afw::math::DoubleGaussianFunction2<double> dg(sigma1, sigma2, b);
113 std::shared_ptr<afw::math::Kernel> kernel(new afw::math::AnalyticKernel(width, height, dg));
114 return kernel;
115}
116
117std::string getDoubleGaussianPsfPersistenceName() { return "DoubleGaussianPsf"; }
118
119DoubleGaussianPsfFactory registration(getDoubleGaussianPsfPersistenceName());
120
121} // namespace
122
123DoubleGaussianPsf::DoubleGaussianPsf(int width, int height, double sigma1, double sigma2, double b)
124 : KernelPsf(makeDoubleGaussianKernel(width, height, sigma1, sigma2, b)),
125 _sigma1(sigma1),
126 _sigma2(sigma2),
127 _b(b) {}
128
130 return std::make_shared<DoubleGaussianPsf>(getKernel()->getWidth(), getKernel()->getHeight(), _sigma1,
131 _sigma2, _b);
132}
133
135 return std::make_shared<DoubleGaussianPsf>(width, height, _sigma1, _sigma2, _b);
136}
137
138std::string DoubleGaussianPsf::getPersistenceName() const { return getDoubleGaussianPsfPersistenceName(); }
139
141 static DoubleGaussianPsfPersistenceHelper const& keys = DoubleGaussianPsfPersistenceHelper::get();
142 afw::table::BaseCatalog catalog = handle.makeCatalog(keys.schema);
143 std::shared_ptr<afw::table::BaseRecord> record = catalog.addNew();
144 (*record).set(keys.dimensions.getX(), getKernel()->getWidth());
145 (*record).set(keys.dimensions.getY(), getKernel()->getHeight());
146 (*record).set(keys.sigma1, getSigma1());
147 (*record).set(keys.sigma2, getSigma2());
148 (*record).set(keys.b, getB());
149 handle.saveCatalog(catalog);
150}
151
152} // namespace algorithms
153} // namespace meas
154} // namespace lsst
155
156namespace lsst {
157namespace afw {
158namespace detection {
159
160} // namespace detection
161} // namespace afw
162} // namespace lsst
#define LSST_EXCEPT(type,...)
Create an exception with a given type.
Definition Exception.h:48
table::Key< double > sigma2
table::Key< double > sigma1
afw::table::PointKey< int > dimensions
table::Key< int > b
#define LSST_ARCHIVE_ASSERT(EXPR)
An assertion macro used to validate the structure of an InputArchive.
Definition Persistable.h:48
table::Schema schema
Definition python.h:134
An object passed to Persistable::write to allow it to persist itself.
void saveCatalog(BaseCatalog const &catalog)
Save a catalog in the archive.
BaseCatalog makeCatalog(Schema const &schema)
Return a new, empty catalog with the given schema.
static std::shared_ptr< T > dynamicCast(std::shared_ptr< Persistable > const &ptr)
Dynamically cast a shared_ptr.
std::string getPersistenceName() const override
Return the unique name used to persist this object and look up its factory.
void write(OutputArchiveHandle &handle) const override
Write the object to one or more catalogs.
double getSigma1() const
Return the radius of the inner Gaussian.
double getSigma2() const
Return the radius of the outer Gaussian.
std::shared_ptr< afw::detection::Psf > clone() const override
Polymorphic deep copy. Usually unnecessary, as Psfs are immutable.
double getB() const
Return the ratio of Gaussian peak amplitudes: outer/inner.
std::shared_ptr< afw::detection::Psf > resized(int width, int height) const override
Return a clone with specified kernel dimensions.
A Psf defined by a Kernel.
Definition KernelPsf.h:36
std::shared_ptr< afw::math::Kernel const > getKernel() const
Return the Kernel used to define this Psf.
Definition KernelPsf.h:52
std::shared_ptr< table::io::Persistable > read(table::io::InputArchive const &archive, table::io::CatalogVector const &catalogs) const override