31 #pragma clang diagnostic push
32 #pragma clang diagnostic ignored "-Wunused-variable"
33 #include "boost/lambda/lambda.hpp"
34 #pragma clang diagnostic pop
35 #include "boost/regex.hpp"
36 #include "boost/filesystem/path.hpp"
39 #include "boost/algorithm/string/trim.hpp"
45 namespace bl = boost::lambda;
52 template<
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
58 lsst::daf::base::Citizen(typeid(this)),
59 _image(new
Image(width, height)),
60 _mask(new
Mask(width, height, planeDict)),
61 _variance(new
Variance(width, height)) {
71 template<
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
76 lsst::daf::base::Citizen(typeid(this)),
77 _image(new
Image(dimensions)),
78 _mask(new
Mask(dimensions, planeDict)),
79 _variance(new
Variance(dimensions)) {
93 template<
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
98 lsst::daf::base::Citizen(typeid(this)),
99 _image(new
Image(bbox)),
100 _mask(new
Mask(bbox, planeDict)),
107 template<
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
114 ) : lsst::daf::base::Citizen(typeid(this)),
115 _image(), _mask(), _variance()
118 *
this =
MaskedImage(fitsfile, metadata, bbox, origin, conformMasks, needAllHdus,
119 imageMetadata, maskMetadata, varianceMetadata);
122 template<
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
129 ) : lsst::daf::base::Citizen(typeid(this)),
130 _image(), _mask(), _variance()
133 *
this =
MaskedImage(fitsfile, metadata, bbox, origin, conformMasks, needAllHdus,
134 imageMetadata, maskMetadata, varianceMetadata);
144 std::string
const & expected
147 std::string exttype = boost::algorithm::trim_right_copy(metadata->
getAsString(
"EXTTYPE"));
148 if (exttype !=
"" && exttype != expected) {
149 throw LSST_EXCEPT(lsst::pex::exceptions::InvalidParameterError,
150 (
boost::format(
"Reading %s (hdu %d) Expected EXTTYPE==\"%s\", saw \"%s\"") %
153 metadata->
remove(
"EXTTYPE");
154 }
catch(lsst::pex::exceptions::NotFoundError) {}
166 template<
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
173 ) : lsst::daf::base::Citizen(typeid(this)),
174 _image(), _mask(), _variance()
185 int hdu = fitsfile.
getHdu();
186 ensureMetadata(imageMetadata);
187 _image.reset(
new Image(fitsfile, imageMetadata, bbox, origin));
188 checkExtType(fitsfile, imageMetadata,
"IMAGE");
192 ensureMetadata(maskMetadata);
193 _mask.reset(
new Mask(fitsfile, maskMetadata, bbox, origin, conformMasks));
194 checkExtType(fitsfile, maskMetadata,
"MASK");
195 }
catch(fits::FitsError &e) {
205 ensureMetadata(varianceMetadata);
207 checkExtType(fitsfile, varianceMetadata,
"VARIANCE");
208 }
catch(fits::FitsError &e) {
221 template<
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
227 lsst::daf::base::Citizen(typeid(this)),
230 _variance(variance) {
237 template<
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
242 lsst::daf::base::Citizen(typeid(this)),
243 _image(rhs._image), _mask(rhs._mask), _variance(rhs._variance) {
255 template<
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
263 lsst::daf::base::Citizen(typeid(this)),
264 _image(new
Image(*rhs.getImage(), bbox, origin, deep)),
265 _mask(rhs._mask ? new
Mask(*rhs.getMask(), bbox, origin, deep) : static_cast<
Mask *>(NULL)),
266 _variance(rhs._variance ? new
Variance(*rhs.getVariance(), bbox, origin, deep) : static_cast<
Variance *>(NULL)) {
278 template<
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
283 template<
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
288 _mask.swap(rhs.
_mask);
299 template<
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
302 *_image = rhs.
image();
312 template<
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
315 *_image = rhs.
image();
327 template<
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
341 template<
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
355 template<
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
358 (*_image).scaledPlus(c, *rhs.
getImage());
364 template<
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
374 template<
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
386 template<
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
389 (*_image).scaledMinus(c, *rhs.
getImage());
395 template<
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
402 template<
typename ImagePixelT,
typename VariancePixelT>
403 struct productVariance {
404 double operator()(ImagePixelT lhs, ImagePixelT rhs, VariancePixelT varLhs, VariancePixelT varRhs) {
405 return lhs*lhs*varRhs + rhs*rhs*varLhs;
410 template<
typename ImagePixelT,
typename VariancePixelT>
411 struct scaledProductVariance {
413 scaledProductVariance(
double const c) : _c(c) {}
414 double operator()(ImagePixelT lhs, ImagePixelT rhs, VariancePixelT varLhs, VariancePixelT varRhs) {
415 return _c*_c*(lhs*lhs*varRhs + rhs*rhs*varLhs);
420 template<
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
423 transform_pixels(_image->_getRawView(),
424 rhs.
_image->_getRawView(),
425 _variance->_getRawView(),
427 _variance->_getRawView(),
428 productVariance<ImagePixelT, VariancePixelT>());
434 template<
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
438 transform_pixels(_image->_getRawView(),
439 rhs.
_image->_getRawView(),
440 _variance->_getRawView(),
442 _variance->_getRawView(),
443 scaledProductVariance<ImagePixelT, VariancePixelT>(c));
445 (*_image).scaledMultiplies(c, *rhs.
getImage());
449 template<
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
452 *_variance *= rhs*rhs;
458 template<
typename ImagePixelT,
typename VariancePixelT>
459 struct quotientVariance {
460 double operator()(ImagePixelT lhs, ImagePixelT rhs, VariancePixelT varLhs, VariancePixelT varRhs) {
461 ImagePixelT
const rhs2 = rhs*rhs;
462 return (lhs*lhs*varRhs + rhs2*varLhs)/(rhs2*rhs2);
466 template<
typename ImagePixelT,
typename VariancePixelT>
467 struct scaledQuotientVariance {
469 scaledQuotientVariance(
double c) : _c(c) {}
470 double operator()(ImagePixelT lhs, ImagePixelT rhs, VariancePixelT varLhs, VariancePixelT varRhs) {
471 ImagePixelT
const rhs2 = rhs*rhs;
472 return (lhs*lhs*varRhs + rhs2*varLhs)/(_c*_c*rhs2*rhs2);
477 template<
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
480 transform_pixels(_image->_getRawView(),
481 rhs.
_image->_getRawView(),
482 _variance->_getRawView(),
484 _variance->_getRawView(),
485 quotientVariance<ImagePixelT, VariancePixelT>());
491 template<
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
495 transform_pixels(_image->_getRawView(),
496 rhs.
_image->_getRawView(),
497 _variance->_getRawView(),
499 _variance->_getRawView(),
500 scaledQuotientVariance<ImagePixelT, VariancePixelT>(c));
502 (*_image).scaledDivides(c, *rhs.
getImage());
503 *_mask |= *rhs.
_mask;
506 template<
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
509 *_variance /= rhs*rhs;
512 template<
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
514 std::string
const& fileName,
521 writeFits(fitsfile, metadata, imageMetadata, maskMetadata, varianceMetadata);
524 template<
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
533 writeFits(fitsfile, metadata, imageMetadata, maskMetadata, varianceMetadata);
538 void processPlaneMetadata(
548 hdr->
set(
"INHERIT",
true);
549 hdr->
set(
"EXTTYPE", exttype);
554 template<
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
572 pex::exceptions::LogicError,
573 "MaskedImage::writeFits can only write to an empty file"
576 if (fitsfile.
getHdu() <= 1) {
584 processPlaneMetadata(imageMetadata, hdr,
"IMAGE");
585 _image->writeFits(fitsfile, hdr);
587 processPlaneMetadata(maskMetadata, hdr,
"MASK");
588 _mask->writeFits(fitsfile, hdr);
590 processPlaneMetadata(varianceMetadata, hdr,
"VARIANCE");
591 _variance->writeFits(fitsfile, hdr);
599 template<
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
602 if (!_mask || _mask->getWidth() == 0 || _mask->getHeight() == 0) {
606 if (_mask->getDimensions() != _image->getDimensions()) {
608 lsst::pex::exceptions::LengthError,
609 (
boost::format(
"Dimension mismatch: Image %dx%d v. Mask %dx%d") %
610 _image->getWidth() % _image->getHeight() %
611 _mask->getWidth() % _mask->getHeight()
617 if (!_variance || _variance->getWidth() == 0 || _variance->getHeight() == 0) {
621 if (_variance->getDimensions() != _image->getDimensions()) {
623 lsst::pex::exceptions::LengthError,
624 (
boost::format(
"Dimension mismatch: Image %dx%d v. Variance %dx%d") %
625 _image->getWidth() % _image->getHeight() %
626 _variance->getWidth() % _variance->getHeight()
638 template<
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
640 #if 0 // this doesn't compile; why?
641 return iterator(_image->begin(), _mask->begin(), _variance->begin());
647 return iterator(imageBegin, maskBegin, varianceBegin);
652 template<
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
658 return iterator(imageEnd, maskEnd, varianceEnd);
662 template<
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
668 return iterator(imageEnd, maskEnd, varianceEnd);
672 template<
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
682 template<
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
692 template<
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
698 return x_iterator(imageBegin, maskBegin, varianceBegin);
702 template<
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
708 return x_iterator(imageEnd, maskEnd, varianceEnd);
714 template<
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
720 return y_iterator(imageBegin, maskBegin, varianceBegin);
724 template<
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
730 return y_iterator(imageEnd, maskEnd, varianceEnd);
741 template<
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
758 template<
typename ImagePixelT,
typename MaskPixelT,
typename VariancePixelT>
void createEmpty()
Create an empty image HDU with NAXIS=0 at the end of the file.
Mask< MaskPixelT >::Ptr MaskPtr
shared pointer to the Mask
ImagePtr getImage(bool const noThrow=false) const
Return a (Ptr to) the MaskedImage's image.
Image< VariancePixelT >::Ptr VariancePtr
shared pointer to the variance Image
Mask< MaskPixelT >::MaskPlaneDict MaskPlaneDict
The Mask's MaskPlaneDict.
void setHdu(int hdu, bool relative=false)
Set the current HDU.
void swap(ImageBase< PixelT > &a, ImageBase< PixelT > &b)
iterator end() const
Return an iterator to the end of the image.
void scaledDivides(double const c, MaskedImage const &rhs)
Class for storing ordered metadata with comments.
VariancePixelT variance() const
Return the variance part of a Pixel.
void readMetadata(daf::base::PropertySet &metadata, bool strip=false)
Read a FITS header into a PropertySet or PropertyList.
afw::table::Key< afw::table::Point< int > > dimensions
iterator at(int const x, int const y) const
Return an iterator at the point (x, y)
void operator-=(ImagePixelT const rhs)
Subtract a scalar rhs from a MaskedImage.
y_iterator col_begin(int x) const
Return an y_iterator to the start of the image.
_view_t::y_iterator y_iterator
An iterator for traversing the pixels in a column.
definition of the Trace messaging facilities
MaskedImage(unsigned int width, unsigned int height, MaskPlaneDict const &planeDict=MaskPlaneDict())
Construct from a supplied dimensions. The Image, Mask, and Variance will be set to zero...
A single pixel of the same type as a MaskedImage.
x_iterator row_end(int y) const
Return an x_iterator to the end of the image.
A simple struct that combines the two arguments that must be passed to most cfitsio routines and cont...
lsst::afw::image::Mask< MaskPixelT > Mask
boost::shared_ptr< Image< PixelT > > Ptr
ImagePixelT image() const
void swap(MaskedImage &rhs)
ImagePixelT image() const
Return the image part of a Pixel.
boost::shared_ptr< Mask > Ptr
An integer coordinate rectangle.
table::Key< table::Array< Kernel::Pixel > > image
_view_t::iterator iterator
An STL compliant iterator.
An iterator to the MaskedImage.
VariancePtr getVariance(bool const noThrow=false) const
Return a (Ptr to) the MaskedImage's variance.
std::string getFileName() const
Return the file name associated with the FITS object or "<unknown>" if there is none.
void set(std::string const &name, T const &value)
virtual Ptr deepCopy(void) const
lsst::afw::image::Image< ImagePixelT > Image
Represent a 2-dimensional array of bitmask pixels.
Lifetime-management for memory that goes into FITS memory files.
lsst::afw::image::Image< VariancePixelT > Variance
std::string getAsString(std::string const &name) const
int getHdu()
Return the current HDU (1-indexed; 1 is the Primary HDU).
void writeFits(std::string const &fileName, boost::shared_ptr< daf::base::PropertySet const > metadata=boost::shared_ptr< daf::base::PropertySet const >(), boost::shared_ptr< daf::base::PropertySet const > imageMetadata=boost::shared_ptr< daf::base::PropertySet const >(), boost::shared_ptr< daf::base::PropertySet const > maskMetadata=boost::shared_ptr< daf::base::PropertySet const >(), boost::shared_ptr< daf::base::PropertySet const > varianceMetadata=boost::shared_ptr< daf::base::PropertySet const >()) const
Write a MaskedImage to a regular FITS file.
void operator*=(ImagePixelT const rhs)
A class to manipulate images, masks, and variance as a single object.
_view_t::reverse_iterator reverse_iterator
An STL compliant reverse iterator.
Image< ImagePixelT >::Ptr ImagePtr
shared pointer to the Image
void operator/=(ImagePixelT const rhs)
MaskedImage & operator=(MaskedImage const &rhs)
Make the lhs use the rhs's pixels.
void operator<<=(MaskedImage const &rhs)
#define LSST_EXCEPT(type,...)
A pixel of a MaskedImage.
MaskPixelT mask() const
Return the mask part of a Pixel.
MaskPtr getMask(bool const noThrow=false) const
Return a (Ptr to) the MaskedImage's mask.
VariancePixelT variance() const
void scaledMultiplies(double const c, MaskedImage const &rhs)
_view_t::x_iterator x_iterator
An iterator for traversing the pixels in a row.
Class for storing generic metadata.
virtual void remove(std::string const &name)
reverse_iterator rbegin() const
Return a reverse_iterator to the start of the image.
int countHdus()
Return the number of HDUs in the file.
x_iterator row_begin(int y) const
Return an x_iterator to the start of the image.
Implementation of the Class MaskedImage.
void operator+=(ImagePixelT const rhs)
Add a scalar rhs to a MaskedImage.
reverse_iterator rend() const
Return a reverse_iterator to the end of the image.
#define LSST_EXCEPT_ADD(e, m)
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)
void scaledPlus(double const c, MaskedImage const &rhs)
void writeMetadata(daf::base::PropertySet const &metadata)
Read a FITS header into a PropertySet or PropertyList.
Include files required for standard LSST Exception handling.
iterator begin() const
Return an iterator to the start of the image.