38 namespace lsst {
namespace meas {
namespace algorithms {
44 struct DoubleGaussianPsfPersistenceHelper {
49 afw::table::Key<double>
b;
51 static DoubleGaussianPsfPersistenceHelper
const &
get() {
52 static DoubleGaussianPsfPersistenceHelper instance;
57 DoubleGaussianPsfPersistenceHelper (
const DoubleGaussianPsfPersistenceHelper&) =
delete;
58 DoubleGaussianPsfPersistenceHelper& operator=(
const DoubleGaussianPsfPersistenceHelper&) =
delete;
61 DoubleGaussianPsfPersistenceHelper (DoubleGaussianPsfPersistenceHelper&&) =
delete;
62 DoubleGaussianPsfPersistenceHelper& operator=(DoubleGaussianPsfPersistenceHelper&&) =
delete;
65 DoubleGaussianPsfPersistenceHelper() :
68 afw::table::PointKey<int>::addFields(
schema,
"dimensions",
"width/height of kernel",
"pixel")
70 sigma1(
schema.addField<double>(
"sigma1",
"radius of inner Gaussian",
"pixel")),
71 sigma2(
schema.addField<double>(
"sigma2",
"radius of outer Gaussian",
"pixel")),
72 b(
schema.addField<double>(
"b",
"central amplitude of outer Gaussian (inner amplitude == 1)"))
74 schema.getCitizen().markPersistent();
78 class DoubleGaussianPsfFactory :
public afw::table::io::PersistableFactory {
81 virtual PTR(afw::table::io::Persistable)
82 read(InputArchive const & archive, CatalogVector const & catalogs)
const {
83 static DoubleGaussianPsfPersistenceHelper
const & keys = DoubleGaussianPsfPersistenceHelper::get();
86 afw::table::BaseRecord
const & record = catalogs.front().front();
88 return std::make_shared<DoubleGaussianPsf>(
89 record.get(keys.dimensions.getX()),
90 record.get(keys.dimensions.getY()),
91 record.get(keys.sigma1),
92 record.get(keys.sigma2),
97 DoubleGaussianPsfFactory(std::string
const &
name) : afw::table::io::PersistableFactory(name) {}
102 PTR(afw::math::Kernel) makeDoubleGaussianKernel(
103 int width,
int height,
double sigma1,
double &
sigma2,
double b
105 if (b == 0.0 && sigma2 == 0.0) {
108 if (sigma1 <= 0 || sigma2 <= 0) {
109 throw LSST_EXCEPT(lsst::pex::exceptions::DomainError,
110 (
boost::format(
"sigma may not be 0: %g, %g") % sigma1 % sigma2).str());
112 afw::math::DoubleGaussianFunction2<double> dg(sigma1, sigma2, b);
113 PTR(afw::math::Kernel) kernel(new afw::math::AnalyticKernel(width, height, dg));
117 std::
string getDoubleGaussianPsfPersistenceName() {
return "DoubleGaussianPsf"; }
119 DoubleGaussianPsfFactory registration(getDoubleGaussianPsfPersistenceName());
123 DoubleGaussianPsf::DoubleGaussianPsf(
int width,
int height,
double sigma1,
double sigma2,
double b) :
124 KernelPsf(makeDoubleGaussianKernel(width, height, sigma1, sigma2, b)),
125 _sigma1(sigma1), _sigma2(sigma2),
_b(b)
129 return std::make_shared<DoubleGaussianPsf>(
130 getKernel()->getWidth(),
131 getKernel()->getHeight(),
139 static DoubleGaussianPsfPersistenceHelper
const & keys = DoubleGaussianPsfPersistenceHelper::get();
142 (*record).set(keys.dimensions.getX(),
getKernel()->getWidth());
143 (*record).set(keys.dimensions.getY(),
getKernel()->getHeight());
146 (*record).set(keys.b,
getB());
152 namespace lsst {
namespace afw {
namespace detection {
155 daf::persistence::FormatterRegistration
156 PsfFormatter::doubleGaussianPsfRegistration(
157 "DoubleGaussianPsf",
typeid(meas::algorithms::DoubleGaussianPsf), createInstance
A Psf defined by a Kernel.
table::Key< std::string > name
double getSigma2() const
Return the radius of the outer Gaussian.
An object passed to Persistable::write to allow it to persist itself.
A custom container class for records, based on std::vector.
afw::table::Schema schema
Define a collection of useful Functions.
Represent a Psf as a circularly symmetrical double Gaussian.
afw::table::PointKey< int > dimensions
boost::shared_ptr< afw::math::Kernel const > getKernel() const
Return the Kernel used to define this Psf.
double getB() const
Return the ratio of Gaussian peak amplitudes: outer/inner.
BaseCatalog makeCatalog(Schema const &schema)
Return a new, empty catalog with the given schema.
#define LSST_EXCEPT(type,...)
Base class for all records.
#define LSST_ARCHIVE_ASSERT(EXPR)
An assertion macro used to validate the structure of an InputArchive.
afw::table::Key< double > sigma1
virtual void write(OutputArchiveHandle &handle) const
Write the object to one or more catalogs.
boost::shared_ptr< RecordT > addNew()
Create a new record, add it to the end of the catalog, and return a pointer to it.
afw::table::Key< double > b
void saveCatalog(BaseCatalog const &catalog)
Save a catalog in the archive.
virtual std::string getPersistenceName() const
Return the unique name used to persist this object and look up its factory.
double getSigma1() const
Return the radius of the inner Gaussian.
Include files required for standard LSST Exception handling.
A polymorphic base class for representing an image's Point Spread Function.
afw::table::Key< double > sigma2