54struct DoubleGaussianPsfPersistenceHelper {
59 afw::table::Key<double>
b;
61 static DoubleGaussianPsfPersistenceHelper
const& get() {
62 static DoubleGaussianPsfPersistenceHelper instance;
67 DoubleGaussianPsfPersistenceHelper(
const DoubleGaussianPsfPersistenceHelper&) =
delete;
68 DoubleGaussianPsfPersistenceHelper& operator=(
const DoubleGaussianPsfPersistenceHelper&) =
delete;
71 DoubleGaussianPsfPersistenceHelper(DoubleGaussianPsfPersistenceHelper&&) =
delete;
72 DoubleGaussianPsfPersistenceHelper& operator=(DoubleGaussianPsfPersistenceHelper&&) =
delete;
75 DoubleGaussianPsfPersistenceHelper()
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)")) {}
84class DoubleGaussianPsfFactory :
public afw::table::io::PersistableFactory {
87 read(InputArchive
const& archive, CatalogVector
const& catalogs)
const {
88 static DoubleGaussianPsfPersistenceHelper
const&
keys = DoubleGaussianPsfPersistenceHelper::get();
91 afw::table::BaseRecord
const& record =
catalogs.front().front();
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));
104makeDoubleGaussianKernel(
int width,
int height,
double sigma1,
double&
sigma2,
double b) {
105 if (
b == 0.0 &&
sigma2 == 0.0) {
110 (boost::format(
"sigma may not be 0: %g, %g") %
sigma1 %
sigma2).str());
112 afw::math::DoubleGaussianFunction2<double> dg(
sigma1,
sigma2,
b);
117std::string getDoubleGaussianPsfPersistenceName() {
return "DoubleGaussianPsf"; }
119DoubleGaussianPsfFactory registration(getDoubleGaussianPsfPersistenceName());
123DoubleGaussianPsf::DoubleGaussianPsf(
int width,
int height,
double sigma1,
double sigma2,
double b)
130 return std::make_shared<DoubleGaussianPsf>(
getKernel()->getWidth(),
getKernel()->getHeight(), _sigma1,
135 return std::make_shared<DoubleGaussianPsf>(width, height, _sigma1, _sigma2, _b);
141 static DoubleGaussianPsfPersistenceHelper
const& keys = DoubleGaussianPsfPersistenceHelper::get();
144 (*record).set(keys.dimensions.getX(),
getKernel()->getWidth());
145 (*record).set(keys.dimensions.getY(),
getKernel()->getHeight());
148 (*record).set(keys.b,
getB());
table::Key< std::string > name
#define LSST_EXCEPT(type,...)
Create an exception with a given type.
table::Key< double > sigma2
table::Key< double > sigma1
afw::table::PointKey< int > dimensions
#define LSST_ARCHIVE_ASSERT(EXPR)
An assertion macro used to validate the structure of an InputArchive.
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.
std::shared_ptr< afw::math::Kernel const > getKernel() const
Return the Kernel used to define this Psf.
std::shared_ptr< table::io::Persistable > read(table::io::InputArchive const &archive, table::io::CatalogVector const &catalogs) const override