56 namespace algorithms {
89 template<
typename ImageT>
91 computeFirstMoment(ImageT
const&
image,
92 float const xCen,
float const yCen
97 for (
int iY = 0; iY != image->getHeight(); ++iY) {
100 end = image->row_end(iY); ptr !=
end; ++ptr, ++iX) {
101 double const x = iX - xCen;
102 double const y = iY - yCen;
104 double const m = (*ptr)*r;
112 errmsg =
"sum(I*r) is negative. ";
115 errmsg +=
"sum(I) is <= 0.";
129 template<
typename ImageT>
131 computeSecondMoment(ImageT
const& image,
132 float const xCen,
float const yCen
137 for (
int iY = 0; iY != image->getHeight(); ++iY) {
140 end = image->row_end(iY); ptr !=
end; ++ptr, ++iX) {
141 double const x = iX - xCen;
142 double const y = iY - yCen;
143 double const r2 = x*x + y*y;
144 double const m = (*ptr)*r2;
152 errmsg =
"sum(I*r*r) is negative. ";
155 errmsg +=
"sum(I) is <= 0.";
168 template<
typename ImageT>
170 calcmom(ImageT
const& image,
171 float const xCen,
float const yCen,
176 if (fabs(w11) > 1e6) {
180 double sum = 0, sumrr = 0.0;
182 for (
int i = 0; i < image.getHeight(); ++i) {
183 float const y = i - yCen;
184 float const y2 = y*y;
186 typename ImageT::x_iterator ptr = image.row_begin(i);
187 for (
int j = 0; j < image.getWidth(); ++j, ++ptr) {
188 float const x = j - xCen;
189 float const x2 = x*x;
190 float const expon = (x2 + y2)*w11;
193 float const weight = exp(-0.5*expon);
194 float const tmod = *ptr;
195 float const ymod = tmod*
weight;
197 sumrr += (x2 + y2)*ymod;
202 if (sum <= 0 || sumrr < 0) {
217 template<
typename ImageT>
219 computeSecondMomentAdaptive(ImageT
const& image,
220 float const xCen,
float const yCen
223 int const MAXIT = 100;
224 float const TOL = 0.0001;
226 float sigma11_ow_old = 1e6;
228 bool unweighted =
false;
230 for (; iter < MAXIT; ++iter) {
233 if (not moments.first) {
240 float const sigma11_ow = moments.second;
242 if (iter > 0 && fabs(sigma11_ow/sigma11_ow_old - 1.0) < TOL) {
246 sigma11_ow_old = sigma11_ow;
266 w11 = 1/sigma11_ow - w11;
278 if (iter == MAXIT || unweighted) {
283 sigma11W = moments.second;
308 auto foot = std::make_shared<afwDetection::Footprint>(std::make_shared<afwGeom::SpanSet>(exposure->getBBox(
312 _psfImage->getY0() + _psfImage->getHeight()/2);
313 double x(center.getX());
314 double y(center.getY());
316 double const xCen = fittedCenter.getX();
317 double const yCen = fittedCenter.getY();
320 return ::sqrt(0.5*computeSecondMomentAdaptive(_psfImage, xCen, yCen));
322 return ::sqrt(2.0/afwGeom::PI)*computeFirstMoment(_psfImage, xCen, yCen);
324 return ::sqrt(0.5*computeSecondMoment(_psfImage, xCen, yCen));
331 for (
int iY = 0; iY != _psfImage->getHeight(); ++iY) {
334 end = _psfImage->row_end(iY); ptr !=
end;
336 double const x = iX - xCen;
337 double const y = iY - yCen;
339 double const m = (*ptr)*r;
340 norm += (*ptr)*(*ptr);
344 return sqrt(sum/norm);
359 for (
int iY = 0; iY != _psfImage->getHeight(); ++iY) {
363 sumsqr += (*ptr)*(*ptr);
366 return sum*sum/sumsqr;
Calculate width as sqrt(n_eff/(4 pi))
tbl::Key< double > weight
static afw::geom::Point2D fitCentroid(afw::image::Image< PixelT > const &im, double x0, double y0)
x_iterator row_begin(int y) const
Calculate width using <r^2>
std::shared_ptr< Exposure< ImagePixelT, MaskPixelT, VariancePixelT > > makeExposure(MaskedImage< ImagePixelT, MaskPixelT, VariancePixelT > &mimage, std::shared_ptr< Wcs const > wcs=std::shared_ptr< Wcs const >())
Calculate width using <r>
double computeGaussianWidth(Method how=ADAPTIVE_MOMENT) const
Compute the 'sigma' value for an equivalent gaussian psf.
#define LSST_EXCEPT(type,...)
Weight <r^2> by I^2 to avoid negative fluxes.
PsfAttributes(boost::shared_ptr< lsst::afw::detection::Psf const > psf, int const iX, int const iY)
Constructor for PsfAttributes.
Calculate width using adaptive Gaussian weights.
std::shared_ptr< Image > computeImage(geom::Point2D position=makeNullPoint(), image::Color color=image::Color(), ImageOwnerEnum owner=COPY) const
double computeEffectiveArea() const
Compute the effective area of the psf ( sum(I)^2/sum(I^2) )