35 #ifndef LSST_IP_DIFFIM_IMAGESTATISTICS_H 36 #define LSST_IP_DIFFIM_IMAGESTATISTICS_H 42 #include "lsst/afw/image.h" 43 #include "lsst/log/Log.h" 44 #include "lsst/pex/policy/Policy.h" 58 template <
typename PixelT>
61 typedef std::shared_ptr<ImageStatistics>
Ptr;
62 typedef typename lsst::afw::image::MaskedImage<PixelT>::x_iterator
x_iterator;
67 std::vector<std::string> detBadMaskPlanes = policy.getStringArray(
"badMaskPlanes");
68 for (std::vector<std::string>::iterator mi = detBadMaskPlanes.begin();
69 mi != detBadMaskPlanes.end(); ++mi){
72 _bpMask |= lsst::afw::image::Mask<lsst::afw::image::MaskPixel>::getPlaneBitMask(*mi);
73 }
catch (pexExcept::Exception& e) {
74 LOGL_DEBUG(
"TRACE4.ip.diffim.ImageStatistics",
75 "Cannot update bad bit mask with %s", (*mi).c_str());
76 LOGL_DEBUG(
"TRACE5.ip.diffim.ImageStatistics",
87 void apply(lsst::afw::image::MaskedImage<PixelT>
const& image) {
91 void apply(lsst::afw::image::MaskedImage<PixelT>
const& image,
int core) {
96 y1 = image.getHeight();
98 x1 = image.getWidth();
101 y0 = std::max(0, image.getHeight()/2 - core);
102 y1 = std::min(image.getHeight(), image.getHeight()/2 + core + 1);
103 x0 = std::max(0, image.getWidth()/2 - core);
104 x1 = std::min(image.getWidth(), image.getWidth()/2 + core + 1);
107 for (
int y = y0; y != y1; ++y) {
108 for (x_iterator ptr = image.x_at(x0, y), end = image.x_at(x1, y);
110 if (!((*ptr).mask() &
_bpMask)) {
111 double const ivar = 1. / (*ptr).variance();
112 if (std::isfinite(ivar)) {
113 _xsum += (*ptr).image() * sqrt(ivar);
114 _x2sum += (*ptr).image() * (*ptr).image() * ivar;
120 if ((!std::isfinite(
_xsum)) || (!std::isfinite(
_x2sum))) {
121 throw LSST_EXCEPT(pexExcept::Exception,
122 "Nan/Inf in ImageStatistics.apply");
131 return (
_npix > 0) ?
_xsum/
_npix : std::numeric_limits<double>::quiet_NaN();
136 std::numeric_limits<double>::quiet_NaN();
147 if ( fabs(
getMean()) > policy.getDouble(
"maximumFootprintResidualMean") )
return false;
148 if (
getRms() > policy.getDouble(
"maximumFootprintResidualStd") )
return false;
void apply(lsst::afw::image::MaskedImage< PixelT > const &image)
std::shared_ptr< ImageStatistics > Ptr
virtual ~ImageStatistics()
lsst::afw::image::MaskPixel _bpMask
void setBpMask(lsst::afw::image::MaskPixel bpMask)
lsst::afw::image::MaskedImage< PixelT >::x_iterator x_iterator
double getVariance() const
Class to calculate difference image statistics.
ImageStatistics(lsst::pex::policy::Policy const &policy)
bool evaluateQuality(lsst::pex::policy::Policy const &policy)
void apply(lsst::afw::image::MaskedImage< PixelT > const &image, int core)
lsst::afw::image::MaskPixel getBpMask()