31 #pragma clang diagnostic push
32 #pragma clang diagnostic ignored "-Wunused-variable"
33 #pragma clang diagnostic pop
34 #include "boost/regex.hpp"
35 #include "boost/filesystem/path.hpp"
47 template <
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
50 : _image(new
Image(width, height)),
51 _mask(new
Mask(width, height, planeDict)),
52 _variance(new
Variance(width, height)) {
58 template <
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
69 template <
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
78 template <
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
85 : _image(), _mask(), _variance() {
87 *
this = reader.
read<ImagePixelT, MaskPixelT, VariancePixelT>(
bbox, origin, conformMasks, needAllHdus,
98 if (varianceMetadata) {
103 template <
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
110 : _image(), _mask(), _variance() {
112 *
this = reader.
read<ImagePixelT, MaskPixelT, VariancePixelT>(
bbox, origin, conformMasks, needAllHdus,
123 if (varianceMetadata) {
128 template <
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
131 ImageOrigin origin,
bool conformMasks,
bool needAllHdus,
135 : _image(), _mask(), _variance() {
137 *
this = reader.
read<ImagePixelT, MaskPixelT, VariancePixelT>(
bbox, origin, conformMasks, needAllHdus,
148 if (varianceMetadata) {
153 template <
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
160 template <
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
162 : _image(rhs._image), _mask(rhs._mask), _variance(rhs._variance) {
172 template <
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
176 template <
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
182 : _image(new
Image(*rhs.getImage(),
bbox, origin, deep)),
183 _mask(rhs._mask ? new
Mask(*rhs.getMask(),
bbox, origin, deep) : static_cast<
Mask*>(NULL)),
184 _variance(rhs._variance ? new
Variance(*rhs.getVariance(),
bbox, origin, deep)
189 template <
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
193 template <
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
197 template <
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
201 _image.swap(rhs._image);
202 _mask.swap(rhs._mask);
203 _variance.swap(rhs._variance);
207 template <
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
210 *_image = rhs.
image();
217 template <
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
220 *_image = rhs.
image();
227 template <
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
236 template <
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
245 template <
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
248 (*_image).scaledPlus(c, *rhs.
getImage());
250 (*_variance).scaledPlus(c * c, *rhs.
getVariance());
253 template <
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
260 template <
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
269 template <
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
272 (*_image).scaledMinus(c, *rhs.
getImage());
274 (*_variance).scaledPlus(c * c, *rhs.
getVariance());
277 template <
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
286 template <
typename ImagePixelT,
typename VariancePixelT>
287 struct productVariance {
288 double operator()(ImagePixelT lhs, ImagePixelT rhs, VariancePixelT varLhs, VariancePixelT varRhs) {
289 return lhs * lhs * varRhs + rhs * rhs * varLhs;
295 template <
typename ImagePixelT,
typename VariancePixelT>
296 struct scaledProductVariance {
298 scaledProductVariance(
double const c) :
_c(c) {}
299 double operator()(ImagePixelT lhs, ImagePixelT rhs, VariancePixelT varLhs, VariancePixelT varRhs) {
300 return _c *
_c * (lhs * lhs * varRhs + rhs * rhs * varLhs);
305 template <
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
309 transform_pixels(_image->_getRawView(),
310 rhs._image->_getRawView(),
311 _variance->_getRawView(),
312 rhs._variance->_getRawView(),
313 _variance->_getRawView(),
314 productVariance<ImagePixelT, VariancePixelT>());
321 template <
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
325 transform_pixels(_image->_getRawView(),
326 rhs._image->_getRawView(),
327 _variance->_getRawView(),
328 rhs._variance->_getRawView(),
329 _variance->_getRawView(),
330 scaledProductVariance<ImagePixelT, VariancePixelT>(c));
332 (*_image).scaledMultiplies(c, *rhs.
getImage());
336 template <
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
340 *_variance *= rhs * rhs;
346 template <
typename ImagePixelT,
typename VariancePixelT>
347 struct quotientVariance {
348 double operator()(ImagePixelT lhs, ImagePixelT rhs, VariancePixelT varLhs, VariancePixelT varRhs) {
349 ImagePixelT
const rhs2 = rhs * rhs;
350 return (lhs * lhs * varRhs + rhs2 * varLhs) / (rhs2 * rhs2);
355 template <
typename ImagePixelT,
typename VariancePixelT>
356 struct scaledQuotientVariance {
358 scaledQuotientVariance(
double c) :
_c(c) {}
359 double operator()(ImagePixelT lhs, ImagePixelT rhs, VariancePixelT varLhs, VariancePixelT varRhs) {
360 ImagePixelT
const rhs2 = rhs * rhs;
361 return (lhs * lhs * varRhs + rhs2 * varLhs) / (
_c *
_c * rhs2 * rhs2);
366 template <
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
370 transform_pixels(_image->_getRawView(),
371 rhs._image->_getRawView(),
372 _variance->_getRawView(),
373 rhs._variance->_getRawView(),
374 _variance->_getRawView(),
375 quotientVariance<ImagePixelT, VariancePixelT>());
382 template <
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
386 transform_pixels(_image->_getRawView(),
387 rhs._image->_getRawView(),
388 _variance->_getRawView(),
389 rhs._variance->_getRawView(),
390 _variance->_getRawView(),
391 scaledQuotientVariance<ImagePixelT, VariancePixelT>(c));
393 (*_image).scaledDivides(c, *rhs.
getImage());
394 *_mask |= *rhs._mask;
397 template <
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
401 *_variance /= rhs * rhs;
405 template <
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
412 writeFits(fitsfile, metadata, imageMetadata, maskMetadata, varianceMetadata);
415 template <
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
422 writeFits(fitsfile, metadata, imageMetadata, maskMetadata, varianceMetadata);
430 hdr = metadata->deepCopy();
434 hdr->set(
"INHERIT",
true);
435 hdr->set(
"EXTTYPE", exttype);
440 template <
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
450 template <
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
459 writeFits(fitsfile, imageOptions, maskOptions, varianceOptions, metadata, imageMetadata, maskMetadata,
463 template <
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
472 writeFits(fitsfile, imageOptions, maskOptions, varianceOptions, metadata, imageMetadata, maskMetadata,
476 template <
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
486 header = metadata->deepCopy();
488 header = std::make_shared<daf::base::PropertyList>();
493 "MaskedImage::writeFits can only write to an empty file");
495 if (fitsfile.
getHdu() < 1) {
503 processPlaneMetadata(imageMetadata, header,
"IMAGE");
504 _image->writeFits(fitsfile, imageOptions, header, _mask);
506 processPlaneMetadata(maskMetadata, header,
"MASK");
507 _mask->writeFits(fitsfile, maskOptions, header);
509 processPlaneMetadata(varianceMetadata, header,
"VARIANCE");
510 _variance->writeFits(fitsfile, varianceOptions, header, _mask);
517 template <
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
519 if (!_mask || _mask->getWidth() == 0 || _mask->getHeight() == 0) {
520 _mask = MaskPtr(
new Mask(_image->getBBox()));
523 if (_mask->getDimensions() != _image->getDimensions()) {
526 (boost::format(
"Dimension mismatch: Image %dx%d v. Mask %dx%d") % _image->getWidth() %
527 _image->getHeight() % _mask->getWidth() % _mask->getHeight())
532 if (!_variance || _variance->getWidth() == 0 || _variance->getHeight() == 0) {
533 _variance = VariancePtr(
new Variance(_image->getBBox()));
536 if (_variance->getDimensions() != _image->getDimensions()) {
538 pex::exceptions::LengthError,
539 (boost::format(
"Dimension mismatch: Image %dx%d v. Variance %dx%d") % _image->getWidth() %
540 _image->getHeight() % _variance->getWidth() % _variance->getHeight())
549 template <
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
553 return iterator(_image->begin(), _mask->begin(), _variance->begin());
559 return iterator(imageBegin, maskBegin, varianceBegin);
563 template <
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
570 return iterator(imageEnd, maskEnd, varianceEnd);
573 template <
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
580 return iterator(imageEnd, maskEnd, varianceEnd);
583 template <
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
593 template <
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
603 template <
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
610 return x_iterator(imageBegin, maskBegin, varianceBegin);
613 template <
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
620 return x_iterator(imageEnd, maskEnd, varianceEnd);
623 template <
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
630 return y_iterator(imageBegin, maskBegin, varianceBegin);
633 template <
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
640 return y_iterator(imageEnd, maskEnd, varianceEnd);
643 template <
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
653 template <
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
663 template <
typename ImagePixelT1,
typename ImagePixelT2>
674 #define INSTANTIATE2(ImagePixelT1, ImagePixelT2) \
675 template bool imagesOverlap<ImagePixelT1, ImagePixelT2>(MaskedImage<ImagePixelT1> const&, \
676 MaskedImage<ImagePixelT2> const&);
#define LSST_EXCEPT(type,...)
afw::table::PointKey< int > dimensions
#define INSTANTIATE2(ImagePixelT1, ImagePixelT2)
A simple struct that combines the two arguments that must be passed to most cfitsio routines and cont...
void createEmpty()
Create an empty image HDU with NAXIS=0 at the end of the file.
void setHdu(int hdu, bool relative=false)
Set the current HDU.
int countHdus()
Return the number of HDUs in the file.
int getHdu()
Return the current HDU (0-indexed; 0 is the Primary HDU).
void writeMetadata(daf::base::PropertySet const &metadata)
Read a FITS header into a PropertySet or PropertyList.
Lifetime-management for memory that goes into FITS memory files.
_view_t::reverse_iterator reverse_iterator
An STL compliant reverse iterator.
x_iterator fast_iterator
A fast STL compliant iterator for contiguous images N.b.
_view_t::iterator iterator
An STL compliant iterator.
_view_t::y_iterator y_iterator
An iterator for traversing the pixels in a column.
_view_t::x_iterator x_iterator
An iterator for traversing the pixels in a row.
A class to represent a 2-dimensional array of pixels.
Represent a 2-dimensional array of bitmask pixels.
An iterator to the MaskedImage.
A FITS reader class for MaskedImages and their components.
std::shared_ptr< daf::base::PropertyList > readImageMetadata()
Read the FITS header of one of the HDUs.
std::shared_ptr< daf::base::PropertyList > readPrimaryMetadata()
Read the FITS header of one of the HDUs.
std::shared_ptr< daf::base::PropertyList > readMaskMetadata()
Read the FITS header of one of the HDUs.
std::shared_ptr< daf::base::PropertyList > readVarianceMetadata()
Read the FITS header of one of the HDUs.
MaskedImage< ImagePixelT, MaskPixelT, VariancePixelT > read(lsst::geom::Box2I const &bbox=lsst::geom::Box2I(), ImageOrigin origin=PARENT, bool conformMasks=false, bool needAllHdus=false, bool allowUnsafe=false)
Read the full MaskedImage.
A class to manipulate images, masks, and variance as a single object.
void scaledPlus(double const c, MaskedImage const &rhs)
Add a scaled MaskedImage c*rhs to a MaskedImage.
void writeFits(std::string const &fileName, std::shared_ptr< daf::base::PropertySet const > metadata=std::shared_ptr< daf::base::PropertySet const >(), std::shared_ptr< daf::base::PropertySet const > imageMetadata=std::shared_ptr< daf::base::PropertySet const >(), std::shared_ptr< daf::base::PropertySet const > maskMetadata=std::shared_ptr< daf::base::PropertySet const >(), std::shared_ptr< daf::base::PropertySet const > varianceMetadata=std::shared_ptr< daf::base::PropertySet const >()) const
Write a MaskedImage to a regular FITS file.
MaskedImage(unsigned int width, unsigned int height, MaskPlaneDict const &planeDict=MaskPlaneDict())
Construct from a supplied dimensions.
lsst::afw::image::Image< VariancePixelT > Variance
void scaledDivides(double const c, MaskedImage const &rhs)
MaskedImageIterator< typename Image::reverse_iterator, typename Mask::reverse_iterator, typename Variance::reverse_iterator > reverse_iterator
MaskedImageIterator< typename Image::y_iterator, typename Mask::y_iterator, typename Variance::y_iterator > y_iterator
An iterator to a column of a MaskedImage.
x_iterator fast_iterator
A fast STL compliant iterator for contiguous images N.b.
iterator begin() const
Return an iterator to the start of the image.
reverse_iterator rbegin() const
Return a reverse_iterator to the start of the image.
y_iterator col_end(int x) const
Return an y_iterator to the end of the image.
void scaledMinus(double const c, MaskedImage const &rhs)
Subtract a scaled MaskedImage c*rhs from a MaskedImage.
lsst::afw::image::Image< ImagePixelT > Image
MaskedImage & operator-=(ImagePixelT const rhs)
Subtract a scalar rhs from a MaskedImage.
x_iterator row_end(int y) const
Return an x_iterator to the end of the image.
void scaledMultiplies(double const c, MaskedImage const &rhs)
iterator end() const
Return an iterator to the end of the image.
void assign(MaskedImage const &rhs, lsst::geom::Box2I const &bbox=lsst::geom::Box2I(), ImageOrigin origin=PARENT)
Copy pixels from another masked image to a specified subregion of this masked image.
VariancePtr getVariance() const
Return a (shared_ptr to) the MaskedImage's variance.
MaskedImage & operator=(MaskedImage const &rhs)
Make the lhs use the rhs's pixels.
x_iterator row_begin(int y) const
Return an x_iterator to the start of the image.
void swap(MaskedImage &rhs)
y_iterator col_begin(int x) const
Return an y_iterator to the start of the image.
lsst::afw::image::Mask< MaskPixelT > Mask
reverse_iterator rend() const
Return a reverse_iterator to the end of the image.
MaskedImageIterator< typename Image::iterator, typename Mask::iterator, typename Variance::iterator > iterator
MaskedImage & operator+=(ImagePixelT const rhs)
Add a scalar rhs to a MaskedImage.
MaskedImage & operator*=(ImagePixelT const rhs)
iterator at(int const x, int const y) const
Return an iterator at the point (x, y)
MaskedImage & operator/=(ImagePixelT const rhs)
MaskPtr getMask() const
Return a (shared_ptr to) the MaskedImage's mask.
ImagePtr getImage() const
Return a (shared_ptr to) the MaskedImage's image.
MaskedImageIterator< typename Image::x_iterator, typename Mask::x_iterator, typename Variance::x_iterator > x_iterator
An iterator to a row of a MaskedImage.
A pixel of a MaskedImage.
MaskPixelT mask() const
Return the mask part of a Pixel.
ImagePixelT image() const
Return the image part of a Pixel.
VariancePixelT variance() const
Return the variance part of a Pixel.
A single pixel of the same type as a MaskedImage.
VariancePixelT variance() const
ImagePixelT image() const
Backwards-compatibility support for depersisting the old Calib (FluxMag0/FluxMag0Err) objects.
bool imagesOverlap(ImageBase< T1 > const &image1, ImageBase< T2 > const &image2)
Return true if the pixels for two images or masks overlap in memory.
A base class for image defects.
Options for writing an image to FITS.