LSST Applications  21.0.0-147-g0e635eb1+1acddb5be5,22.0.0+052faf71bd,22.0.0+1ea9a8b2b2,22.0.0+6312710a6c,22.0.0+729191ecac,22.0.0+7589c3a021,22.0.0+9f079a9461,22.0.1-1-g7d6de66+b8044ec9de,22.0.1-1-g87000a6+536b1ee016,22.0.1-1-g8e32f31+6312710a6c,22.0.1-10-gd060f87+016f7cdc03,22.0.1-12-g9c3108e+df145f6f68,22.0.1-16-g314fa6d+c825727ab8,22.0.1-19-g93a5c75+d23f2fb6d8,22.0.1-19-gb93eaa13+aab3ef7709,22.0.1-2-g8ef0a89+b8044ec9de,22.0.1-2-g92698f7+9f079a9461,22.0.1-2-ga9b0f51+052faf71bd,22.0.1-2-gac51dbf+052faf71bd,22.0.1-2-gb66926d+6312710a6c,22.0.1-2-gcb770ba+09e3807989,22.0.1-20-g32debb5+b8044ec9de,22.0.1-23-gc2439a9a+fb0756638e,22.0.1-3-g496fd5d+09117f784f,22.0.1-3-g59f966b+1e6ba2c031,22.0.1-3-g849a1b8+f8b568069f,22.0.1-3-gaaec9c0+c5c846a8b1,22.0.1-32-g5ddfab5d3+60ce4897b0,22.0.1-4-g037fbe1+64e601228d,22.0.1-4-g8623105+b8044ec9de,22.0.1-5-g096abc9+d18c45d440,22.0.1-5-g15c806e+57f5c03693,22.0.1-7-gba73697+57f5c03693,master-g6e05de7fdc+c1283a92b8,master-g72cdda8301+729191ecac,w.2021.39
LSST Data Management Base Package
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 
36 namespace lsst {
37 namespace afw {
38 namespace table {
39 namespace io {
40 
43 
44 } // namespace io
45 } // namespace table
46 } // namespace afw
47 namespace meas {
48 namespace algorithms {
49 
50 namespace {
51 
52 // Read-only singleton struct containing the schema and keys that a double-Gaussian Psf is mapped
53 // to in record persistence.
54 struct 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 
74 private:
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 
84 class DoubleGaussianPsfFactory : public afw::table::io::PersistableFactory {
85 public:
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.
104 makeDoubleGaussianKernel(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 
117 std::string getDoubleGaussianPsfPersistenceName() { return "DoubleGaussianPsf"; }
118 
119 DoubleGaussianPsfFactory registration(getDoubleGaussianPsfPersistenceName());
120 
121 } // namespace
122 
123 DoubleGaussianPsf::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 
138 std::string DoubleGaussianPsf::getPersistenceName() const { return getDoubleGaussianPsfPersistenceName(); }
139 
141  static DoubleGaussianPsfPersistenceHelper const& keys = DoubleGaussianPsfPersistenceHelper::get();
142  afw::table::BaseCatalog catalog = handle.makeCatalog(keys.schema);
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 
156 namespace lsst {
157 namespace afw {
158 namespace detection {
159 
160 } // namespace detection
161 } // namespace afw
162 } // namespace lsst
table::Key< std::string > name
Definition: Amplifier.cc:116
#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
std::shared_ptr< RecordT > addNew()
Create a new record, add it to the end of the catalog, and return a pointer to it.
Definition: Catalog.h:490
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.
Definition: Persistable.cc:18
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
FilterProperty & operator=(FilterProperty const &)=default
def format(config, name=None, writeSourceLine=True, prefix="", verbose=False)
Definition: history.py:174
A base class for image defects.
afw::table::PointKey< int > dimensions
afw::table::Schema schema
afw::table::Key< double > sigma2
afw::table::Key< double > sigma1
afw::table::Key< double > b
std::shared_ptr< table::io::Persistable > read(table::io::InputArchive const &archive, table::io::CatalogVector const &catalogs) const override
Definition: warpExposure.cc:0