LSSTApplications  1.1.2+25,10.0+13,10.0+132,10.0+133,10.0+224,10.0+41,10.0+8,10.0-1-g0f53050+14,10.0-1-g4b7b172+19,10.0-1-g61a5bae+98,10.0-1-g7408a83+3,10.0-1-gc1e0f5a+19,10.0-1-gdb4482e+14,10.0-11-g3947115+2,10.0-12-g8719d8b+2,10.0-15-ga3f480f+1,10.0-2-g4f67435,10.0-2-gcb4bc6c+26,10.0-28-gf7f57a9+1,10.0-3-g1bbe32c+14,10.0-3-g5b46d21,10.0-4-g027f45f+5,10.0-4-g86f66b5+2,10.0-4-gc4fccf3+24,10.0-40-g4349866+2,10.0-5-g766159b,10.0-5-gca2295e+25,10.0-6-g462a451+1
LSSTDataManagementBasePackage
MaskedImage.cc
Go to the documentation of this file.
1 // -*- lsst-c++ -*-
2 
3 /*
4  * LSST Data Management System
5  * Copyright 2008, 2009, 2010 LSST Corporation.
6  *
7  * This product includes software developed by the
8  * LSST Project (http://www.lsst.org/).
9  *
10  * This program is free software: you can redistribute it and/or modify
11  * it under the terms of the GNU General Public License as published by
12  * the Free Software Foundation, either version 3 of the License, or
13  * (at your option) any later version.
14  *
15  * This program is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18  * GNU General Public License for more details.
19  *
20  * You should have received a copy of the LSST License Statement and
21  * the GNU General Public License along with this program. If not,
22  * see <http://www.lsstcorp.org/LegalNotices/>.
23  */
24 
29 #include <typeinfo>
30 #include <sys/stat.h>
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"
37 #include "lsst/pex/logging/Trace.h"
38 #include "lsst/pex/exceptions.h"
39 #include "boost/algorithm/string/trim.hpp"
40 
43 #include "lsst/afw/fits.h"
44 
45 namespace bl = boost::lambda;
46 namespace image = lsst::afw::image;
47 
52 template<typename ImagePixelT, typename MaskPixelT, typename VariancePixelT>
54  unsigned int width,
55  unsigned int height,
56  MaskPlaneDict const& planeDict
57 ) :
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)) {
62  *_image = 0;
63  *_mask = 0x0;
64  *_variance = 0;
65 }
66 
71 template<typename ImagePixelT, typename MaskPixelT, typename VariancePixelT>
73  geom::Extent2I const & dimensions,
74  MaskPlaneDict const& planeDict
75 ) :
76  lsst::daf::base::Citizen(typeid(this)),
77  _image(new Image(dimensions)),
78  _mask(new Mask(dimensions, planeDict)),
79  _variance(new Variance(dimensions)) {
80  *_image = 0;
81  *_mask = 0x0;
82  *_variance = 0;
83 }
84 
93 template<typename ImagePixelT, typename MaskPixelT, typename VariancePixelT>
95  geom::Box2I const & bbox,
96  MaskPlaneDict const& planeDict
97 ) :
98  lsst::daf::base::Citizen(typeid(this)),
99  _image(new Image(bbox)),
100  _mask(new Mask(bbox, planeDict)),
101  _variance(new Variance(bbox)) {
102  *_image = 0;
103  *_mask = 0x0;
104  *_variance = 0;
105 }
106 
107 template<typename ImagePixelT, typename MaskPixelT, typename VariancePixelT>
109  std::string const & fileName, PTR(daf::base::PropertySet) metadata,
110  geom::Box2I const & bbox, ImageOrigin origin, bool conformMasks, bool needAllHdus,
111  PTR(daf::base::PropertySet) imageMetadata,
112  PTR(daf::base::PropertySet) maskMetadata,
113  PTR(daf::base::PropertySet) varianceMetadata
114 ) : lsst::daf::base::Citizen(typeid(this)),
115  _image(), _mask(), _variance()
116 {
117  fits::Fits fitsfile(fileName, "r", fits::Fits::AUTO_CLOSE | fits::Fits::AUTO_CHECK);
118  *this = MaskedImage(fitsfile, metadata, bbox, origin, conformMasks, needAllHdus,
119  imageMetadata, maskMetadata, varianceMetadata);
120  }
121 
122 template<typename ImagePixelT, typename MaskPixelT, typename VariancePixelT>
124  fits::MemFileManager & manager, PTR(daf::base::PropertySet) metadata,
125  geom::Box2I const & bbox, ImageOrigin origin, bool conformMasks, bool needAllHdus,
126  PTR(daf::base::PropertySet) imageMetadata,
127  PTR(daf::base::PropertySet) maskMetadata,
128  PTR(daf::base::PropertySet) varianceMetadata
129 ) : lsst::daf::base::Citizen(typeid(this)),
130  _image(), _mask(), _variance()
131 {
132  fits::Fits fitsfile(manager, "r", fits::Fits::AUTO_CLOSE | fits::Fits::AUTO_CHECK);
133  *this = MaskedImage(fitsfile, metadata, bbox, origin, conformMasks, needAllHdus,
134  imageMetadata, maskMetadata, varianceMetadata);
135 }
136 
137 namespace {
138 
139 // Helper functions for MaskedImage FITS ctor.
140 
141 void checkExtType(
142  lsst::afw::fits::Fits & fitsfile,
144  std::string const & expected
145 ) {
146  try {
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\"") %
151  expected % fitsfile.getFileName() % fitsfile.getHdu() % exttype).str());
152  }
153  metadata->remove("EXTTYPE");
154  } catch(lsst::pex::exceptions::NotFoundError) {}
155 }
156 
157 void ensureMetadata(PTR(lsst::daf::base::PropertySet) & metadata) {
158  if (!metadata) {
159  metadata.reset(new lsst::daf::base::PropertyList());
160  }
161 }
162 
163 } // anonymous
164 
165 
166 template<typename ImagePixelT, typename MaskPixelT, typename VariancePixelT>
168  fits::Fits & fitsfile, PTR(daf::base::PropertySet) metadata,
169  geom::Box2I const & bbox, ImageOrigin origin, bool conformMasks, bool needAllHdus,
170  PTR(daf::base::PropertySet) imageMetadata,
171  PTR(daf::base::PropertySet) maskMetadata,
172  PTR(daf::base::PropertySet) varianceMetadata
173 ) : lsst::daf::base::Citizen(typeid(this)),
174  _image(), _mask(), _variance()
175 {
176 
177  if (metadata) {
178  // Read primary metadata - only if user asks for it.
179  // If the primary HDU is not empty, this may be the same as imageMetadata.
180  fitsfile.setHdu(1);
181  fitsfile.readMetadata(*metadata);
182  }
183 
184  fitsfile.setHdu(0); // this moves to the first non-empty HDU, which should always be the Image HDU.
185  int hdu = fitsfile.getHdu();
186  ensureMetadata(imageMetadata);
187  _image.reset(new Image(fitsfile, imageMetadata, bbox, origin));
188  checkExtType(fitsfile, imageMetadata, "IMAGE");
189 
190  try {
191  fitsfile.setHdu(++hdu);
192  ensureMetadata(maskMetadata);
193  _mask.reset(new Mask(fitsfile, maskMetadata, bbox, origin, conformMasks));
194  checkExtType(fitsfile, maskMetadata, "MASK");
195  } catch(fits::FitsError &e) {
196  if (needAllHdus) {
197  LSST_EXCEPT_ADD(e, "Reading Mask");
198  throw e;
199  }
200  _mask.reset(new Mask(_image->getBBox()));
201  }
202 
203  try {
204  fitsfile.setHdu(++hdu);
205  ensureMetadata(varianceMetadata);
206  _variance.reset(new Variance(fitsfile, varianceMetadata, bbox, origin));
207  checkExtType(fitsfile, varianceMetadata, "VARIANCE");
208  } catch(fits::FitsError &e) {
209  if (needAllHdus) {
210  LSST_EXCEPT_ADD(e, "Reading Variance");
211  throw e;
212  }
213  _variance.reset(new Variance(_image->getBBox()));
214  }
215 }
216 
221 template<typename ImagePixelT, typename MaskPixelT, typename VariancePixelT>
223  ImagePtr image,
224  MaskPtr mask,
225  VariancePtr variance
226 ) :
227  lsst::daf::base::Citizen(typeid(this)),
228  _image(image),
229  _mask(mask),
230  _variance(variance) {
231  conformSizes();
232 }
233 
237 template<typename ImagePixelT, typename MaskPixelT, typename VariancePixelT>
239  MaskedImage const& rhs,
240  bool deep
241 ) :
242  lsst::daf::base::Citizen(typeid(this)),
243  _image(rhs._image), _mask(rhs._mask), _variance(rhs._variance) {
244  if (deep) {
245  _image = typename Image::Ptr(new Image(*rhs.getImage(), deep));
246  _mask = typename Mask::Ptr(new Mask(*rhs.getMask(), deep));
247  _variance = typename Variance::Ptr(new Variance(*rhs.getVariance(), deep));
248  }
249  conformSizes();
250 }
251 
255 template<typename ImagePixelT, typename MaskPixelT, typename VariancePixelT>
257  MaskedImage const& rhs,
258  const geom::Box2I& bbox,
259  ImageOrigin const origin,
260  bool deep
261 ) :
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)) {
267  conformSizes();
268 }
269 
270 #if defined(DOXYGEN)
271 
278 template<typename ImagePixelT, typename MaskPixelT, typename VariancePixelT>
280  ) {}
281 #endif
282 
283 template<typename ImagePixelT, typename MaskPixelT, typename VariancePixelT>
285  using std::swap; // See Meyers, Effective C++, Item 25
286 
287  _image.swap(rhs._image);
288  _mask.swap(rhs._mask);
289  _variance.swap(rhs._variance);
290 }
291 // Use compiler generated version of:
292 // MaskedImage<ImagePixelT, MaskPixelT> &operator=(const MaskedImage<ImagePixelT, MaskPixelT>& rhs);
293 
294 /************************************************************************************************************/
295 // Operators
299 template<typename ImagePixelT, typename MaskPixelT, typename VariancePixelT>
302  *_image = rhs.image();
303  *_mask = rhs.mask();
304  *_variance = rhs.variance();
305 
306  return *this;
307 }
308 
312 template<typename ImagePixelT, typename MaskPixelT, typename VariancePixelT>
315  *_image = rhs.image();
316  *_mask = rhs.mask();
317  *_variance = rhs.variance();
318 
319  return *this;
320 }
321 
327 template<typename ImagePixelT, typename MaskPixelT, typename VariancePixelT>
329  *_image <<= *rhs.getImage();
330  *_mask <<= *rhs.getMask();
331  *_variance <<= *rhs.getVariance();
332 }
333 
341 template<typename ImagePixelT, typename MaskPixelT, typename VariancePixelT>
343  *_image += *rhs.getImage();
344  *_mask |= *rhs.getMask();
345  *_variance += *rhs.getVariance();
346 }
347 
355 template<typename ImagePixelT, typename MaskPixelT, typename VariancePixelT>
357  MaskedImage const& rhs) {
358  (*_image).scaledPlus(c, *rhs.getImage());
359  *_mask |= *rhs.getMask();
360  (*_variance).scaledPlus(c*c, *rhs.getVariance());
361 }
362 
364 template<typename ImagePixelT, typename MaskPixelT, typename VariancePixelT>
366  *_image += rhs;
367 }
368 
374 template<typename ImagePixelT, typename MaskPixelT, typename VariancePixelT>
376  *_image -= *rhs.getImage();
377  *_mask |= *rhs.getMask();
378  *_variance += *rhs.getVariance();
379 }
380 
386 template<typename ImagePixelT, typename MaskPixelT, typename VariancePixelT>
388  MaskedImage const& rhs) {
389  (*_image).scaledMinus(c, *rhs.getImage());
390  *_mask |= *rhs.getMask();
391  (*_variance).scaledPlus(c*c, *rhs.getVariance());
392 }
393 
395 template<typename ImagePixelT, typename MaskPixelT, typename VariancePixelT>
397  *_image -= rhs;
398 }
399 
400 namespace {
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;
406  }
407  };
408 
410  template<typename ImagePixelT, typename VariancePixelT>
411  struct scaledProductVariance {
412  double _c;
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);
416  }
417  };
418 }
419 
420 template<typename ImagePixelT, typename MaskPixelT, typename VariancePixelT>
422  // Must do variance before we modify the image values
423  transform_pixels(_image->_getRawView(), // lhs
424  rhs._image->_getRawView(), // rhs,
425  _variance->_getRawView(), // Var(lhs),
426  rhs._variance->_getRawView(), // Var(rhs)
427  _variance->_getRawView(), // result
428  productVariance<ImagePixelT, VariancePixelT>());
429 
430  *_image *= *rhs.getImage();
431  *_mask |= *rhs.getMask();
432 }
433 
434 template<typename ImagePixelT, typename MaskPixelT, typename VariancePixelT>
436  MaskedImage const& rhs) {
437  // Must do variance before we modify the image values
438  transform_pixels(_image->_getRawView(), // lhs
439  rhs._image->_getRawView(), // rhs,
440  _variance->_getRawView(), // Var(lhs),
441  rhs._variance->_getRawView(), // Var(rhs)
442  _variance->_getRawView(), // result
443  scaledProductVariance<ImagePixelT, VariancePixelT>(c));
444 
445  (*_image).scaledMultiplies(c, *rhs.getImage());
446  *_mask |= *rhs.getMask();
447 }
448 
449 template<typename ImagePixelT, typename MaskPixelT, typename VariancePixelT>
451  *_image *= rhs;
452  *_variance *= rhs*rhs;
453 }
454 
455 
456 namespace {
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);
463  }
464  };
466  template<typename ImagePixelT, typename VariancePixelT>
467  struct scaledQuotientVariance {
468  double _c;
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);
473  }
474  };
475 }
476 
477 template<typename ImagePixelT, typename MaskPixelT, typename VariancePixelT>
479  // Must do variance before we modify the image values
480  transform_pixels(_image->_getRawView(), // lhs
481  rhs._image->_getRawView(), // rhs,
482  _variance->_getRawView(), // Var(lhs),
483  rhs._variance->_getRawView(), // Var(rhs)
484  _variance->_getRawView(), // result
485  quotientVariance<ImagePixelT, VariancePixelT>());
486 
487  *_image /= *rhs.getImage();
488  *_mask |= *rhs.getMask();
489 }
490 
491 template<typename ImagePixelT, typename MaskPixelT, typename VariancePixelT>
493  MaskedImage const& rhs) {
494  // Must do variance before we modify the image values
495  transform_pixels(_image->_getRawView(), // lhs
496  rhs._image->_getRawView(), // rhs,
497  _variance->_getRawView(), // Var(lhs),
498  rhs._variance->_getRawView(), // Var(rhs)
499  _variance->_getRawView(), // result
500  scaledQuotientVariance<ImagePixelT, VariancePixelT>(c));
501 
502  (*_image).scaledDivides(c, *rhs.getImage());
503  *_mask |= *rhs._mask;
504 }
505 
506 template<typename ImagePixelT, typename MaskPixelT, typename VariancePixelT>
508  *_image /= rhs;
509  *_variance /= rhs*rhs;
510 }
511 
512 template<typename ImagePixelT, typename MaskPixelT, typename VariancePixelT>
514  std::string const& fileName,
516  CONST_PTR(daf::base::PropertySet) imageMetadata,
517  CONST_PTR(daf::base::PropertySet) maskMetadata,
518  CONST_PTR(daf::base::PropertySet) varianceMetadata
519 ) const {
520  fits::Fits fitsfile(fileName, "w", fits::Fits::AUTO_CLOSE | fits::Fits::AUTO_CHECK);
521  writeFits(fitsfile, metadata, imageMetadata, maskMetadata, varianceMetadata);
522 }
523 
524 template<typename ImagePixelT, typename MaskPixelT, typename VariancePixelT>
526  fits::MemFileManager & manager,
528  CONST_PTR(daf::base::PropertySet) imageMetadata,
529  CONST_PTR(daf::base::PropertySet) maskMetadata,
530  CONST_PTR(daf::base::PropertySet) varianceMetadata
531 ) const {
532  fits::Fits fitsfile(manager, "w", fits::Fits::AUTO_CLOSE | fits::Fits::AUTO_CHECK);
533  writeFits(fitsfile, metadata, imageMetadata, maskMetadata, varianceMetadata);
534 }
535 
536 namespace {
537 
538 void processPlaneMetadata(
541  char const * exttype
542 ) {
543  if (metadata) {
544  hdr = metadata->deepCopy();
545  } else {
546  hdr.reset(new lsst::daf::base::PropertyList());
547  }
548  hdr->set("INHERIT", true);
549  hdr->set("EXTTYPE", exttype);
550 }
551 
552 } // anonymous
553 
554 template<typename ImagePixelT, typename MaskPixelT, typename VariancePixelT>
556  fits::Fits & fitsfile,
558  CONST_PTR(daf::base::PropertySet) imageMetadata,
559  CONST_PTR(daf::base::PropertySet) maskMetadata,
560  CONST_PTR(daf::base::PropertySet) varianceMetadata
561 ) const {
562 
564  if (metadata) {
565  hdr = metadata->deepCopy();
566  } else {
567  hdr.reset(new daf::base::PropertyList());
568  }
569 
570  if (fitsfile.countHdus() != 0) {
571  throw LSST_EXCEPT(
572  pex::exceptions::LogicError,
573  "MaskedImage::writeFits can only write to an empty file"
574  );
575  }
576  if (fitsfile.getHdu() <= 1) {
577  // Don't ever write images to primary; instead we make an empty primary.
578  fitsfile.createEmpty();
579  } else {
580  fitsfile.setHdu(1);
581  }
582  fitsfile.writeMetadata(*hdr);
583 
584  processPlaneMetadata(imageMetadata, hdr, "IMAGE");
585  _image->writeFits(fitsfile, hdr);
586 
587  processPlaneMetadata(maskMetadata, hdr, "MASK");
588  _mask->writeFits(fitsfile, hdr);
589 
590  processPlaneMetadata(varianceMetadata, hdr, "VARIANCE");
591  _variance->writeFits(fitsfile, hdr);
592 }
593 
594 /************************************************************************************************************/
595 // private function conformSizes() ensures that the Mask and Variance have the same dimensions
596 // as Image. If Mask and/or Variance have non-zero dimensions that conflict with the size of Image,
597 // a lsst::pex::exceptions::LengthError is thrown.
598 
599 template<typename ImagePixelT, typename MaskPixelT, typename VariancePixelT>
601 
602  if (!_mask || _mask->getWidth() == 0 || _mask->getHeight() == 0) {
603  _mask = MaskPtr(new Mask(_image->getBBox()));
604  *_mask = 0;
605  } else {
606  if (_mask->getDimensions() != _image->getDimensions()) {
607  throw LSST_EXCEPT(
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()
612  ).str()
613  );
614  }
615  }
616 
617  if (!_variance || _variance->getWidth() == 0 || _variance->getHeight() == 0) {
618  _variance = VariancePtr(new Variance(_image->getBBox()));
619  *_variance = 0;
620  } else {
621  if (_variance->getDimensions() != _image->getDimensions()) {
622  throw LSST_EXCEPT(
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()
627  ).str()
628  );
629  }
630  }
631 }
632 
633 /************************************************************************************************************/
634 //
635 // Iterators and locators
636 //
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());
642 #else
643  typename Image::iterator imageBegin = _image->begin();
644  typename Mask::iterator maskBegin = _mask->begin();
645  typename Variance::iterator varianceBegin = _variance->begin();
646 
647  return iterator(imageBegin, maskBegin, varianceBegin);
648 #endif
649 }
650 
652 template<typename ImagePixelT, typename MaskPixelT, typename VariancePixelT>
654  typename Image::iterator imageEnd = getImage()->end();
655  typename Mask::iterator maskEnd = getMask()->end();
656  typename Variance::iterator varianceEnd = getVariance()->end();
657 
658  return iterator(imageEnd, maskEnd, varianceEnd);
659 }
660 
662 template<typename ImagePixelT, typename MaskPixelT, typename VariancePixelT>
664  typename Image::iterator imageEnd = getImage()->at(x, y);
665  typename Mask::iterator maskEnd = getMask()->at(x, y);
666  typename Variance::iterator varianceEnd = getVariance()->at(x, y);
667 
668  return iterator(imageEnd, maskEnd, varianceEnd);
669 }
670 
672 template<typename ImagePixelT, typename MaskPixelT, typename VariancePixelT>
674  typename Image::reverse_iterator imageBegin = _image->rbegin();
675  typename Mask::reverse_iterator maskBegin = _mask->rbegin();
676  typename Variance::reverse_iterator varianceBegin = _variance->rbegin();
677 
678  return reverse_iterator(imageBegin, maskBegin, varianceBegin);
679 }
680 
682 template<typename ImagePixelT, typename MaskPixelT, typename VariancePixelT>
684  typename Image::reverse_iterator imageEnd = getImage()->rend();
685  typename Mask::reverse_iterator maskEnd = getMask()->rend();
686  typename Variance::reverse_iterator varianceEnd = getVariance()->rend();
687 
688  return reverse_iterator(imageEnd, maskEnd, varianceEnd);
689 }
690 
692 template<typename ImagePixelT, typename MaskPixelT, typename VariancePixelT>
694  typename Image::x_iterator imageBegin = _image->row_begin(y);
695  typename Mask::x_iterator maskBegin = _mask->row_begin(y);
696  typename Variance::x_iterator varianceBegin = _variance->row_begin(y);
697 
698  return x_iterator(imageBegin, maskBegin, varianceBegin);
699 }
700 
702 template<typename ImagePixelT, typename MaskPixelT, typename VariancePixelT>
704  typename Image::x_iterator imageEnd = getImage()->row_end(y);
705  typename Mask::x_iterator maskEnd = getMask()->row_end(y);
706  typename Variance::x_iterator varianceEnd = getVariance()->row_end(y);
707 
708  return x_iterator(imageEnd, maskEnd, varianceEnd);
709 }
710 
711 /************************************************************************************************************/
712 
714 template<typename ImagePixelT, typename MaskPixelT, typename VariancePixelT>
716  typename Image::y_iterator imageBegin = _image->col_begin(x);
717  typename Mask::y_iterator maskBegin = _mask->col_begin(x);
718  typename Variance::y_iterator varianceBegin = _variance->col_begin(x);
719 
720  return y_iterator(imageBegin, maskBegin, varianceBegin);
721 }
722 
724 template<typename ImagePixelT, typename MaskPixelT, typename VariancePixelT>
726  typename Image::y_iterator imageEnd = getImage()->col_end(x);
727  typename Mask::y_iterator maskEnd = getMask()->col_end(x);
728  typename Variance::y_iterator varianceEnd = getVariance()->col_end(x);
729 
730  return y_iterator(imageEnd, maskEnd, varianceEnd);
731 }
732 
733 /************************************************************************************************************/
741 template<typename ImagePixelT, typename MaskPixelT, typename VariancePixelT>
744  bool contiguous
745  ) const {
746  typename Image::fast_iterator imageBegin = _image->begin(contiguous);
747  typename Mask::fast_iterator maskBegin = _mask->begin(contiguous);
748  typename Variance::fast_iterator varianceBegin = _variance->begin(contiguous);
749 
750  return fast_iterator(imageBegin, maskBegin, varianceBegin);
751 }
752 
758 template<typename ImagePixelT, typename MaskPixelT, typename VariancePixelT>
761  bool contiguous
762  ) const {
763  typename Image::fast_iterator imageEnd = getImage()->end(contiguous);
764  typename Mask::fast_iterator maskEnd = getMask()->end(contiguous);
765  typename Variance::fast_iterator varianceEnd = getVariance()->end(contiguous);
766 
767  return fast_iterator(imageEnd, maskEnd, varianceEnd);
768 }
769 
770 /************************************************************************************************************/
771 //
772 // Explicit instantiations
773 //
775 template class image::MaskedImage<int>;
776 template class image::MaskedImage<float>;
777 template class image::MaskedImage<double>;
779 
int y
MaskPixelT mask() const
Definition: Pixel.h:81
void createEmpty()
Create an empty image HDU with NAXIS=0 at the end of the file.
#define CONST_PTR(...)
Definition: base.h:47
Mask< MaskPixelT >::Ptr MaskPtr
shared pointer to the Mask
Definition: MaskedImage.h:83
ImagePtr getImage(bool const noThrow=false) const
Return a (Ptr to) the MaskedImage&#39;s image.
Definition: MaskedImage.h:869
Image< VariancePixelT >::Ptr VariancePtr
shared pointer to the variance Image
Definition: MaskedImage.h:85
x_iterator fast_iterator
Definition: Image.h:154
Mask< MaskPixelT >::MaskPlaneDict MaskPlaneDict
The Mask&#39;s MaskPlaneDict.
Definition: MaskedImage.h:90
void setHdu(int hdu, bool relative=false)
Set the current HDU.
void swap(ImageBase< PixelT > &a, ImageBase< PixelT > &b)
Definition: Image.cc:291
iterator end() const
Return an iterator to the end of the image.
Definition: MaskedImage.cc:653
void scaledDivides(double const c, MaskedImage const &rhs)
Definition: MaskedImage.cc:492
Class for storing ordered metadata with comments.
Definition: PropertyList.h:81
VariancePixelT variance() const
Return the variance part of a Pixel.
Definition: Pixel.h:203
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)
Definition: MaskedImage.cc:663
void operator-=(ImagePixelT const rhs)
Subtract a scalar rhs from a MaskedImage.
Definition: MaskedImage.cc:396
y_iterator col_begin(int x) const
Return an y_iterator to the start of the image.
Definition: MaskedImage.cc:715
_view_t::y_iterator y_iterator
An iterator for traversing the pixels in a column.
Definition: Image.h:160
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...
Definition: MaskedImage.cc:53
A single pixel of the same type as a MaskedImage.
Definition: Pixel.h:63
x_iterator row_end(int y) const
Return an x_iterator to the end of the image.
Definition: MaskedImage.cc:703
#define PTR(...)
Definition: base.h:41
A simple struct that combines the two arguments that must be passed to most cfitsio routines and cont...
Definition: fits.h:194
lsst::afw::image::Mask< MaskPixelT > Mask
Definition: MaskedImage.h:94
boost::shared_ptr< Image< PixelT > > Ptr
Definition: Image.h:418
ImagePixelT image() const
Definition: Pixel.h:80
void swap(MaskedImage &rhs)
Definition: MaskedImage.cc:284
ImagePixelT image() const
Return the image part of a Pixel.
Definition: Pixel.h:199
boost::shared_ptr< Mask > Ptr
Definition: Mask.h:95
An integer coordinate rectangle.
Definition: Box.h:53
table::Key< table::Array< Kernel::Pixel > > image
Definition: FixedKernel.cc:117
_view_t::iterator iterator
An STL compliant iterator.
Definition: Image.h:143
An iterator to the MaskedImage.
Definition: MaskedImage.h:109
VariancePtr getVariance(bool const noThrow=false) const
Return a (Ptr to) the MaskedImage&#39;s variance.
Definition: MaskedImage.h:890
std::string getFileName() const
Return the file name associated with the FITS object or &quot;&lt;unknown&gt;&quot; if there is none.
void set(std::string const &name, T const &value)
Definition: PropertySet.cc:581
virtual Ptr deepCopy(void) const
Definition: PropertySet.cc:70
lsst::afw::image::Image< ImagePixelT > Image
Definition: MaskedImage.h:93
Represent a 2-dimensional array of bitmask pixels.
Definition: Mask.h:93
Lifetime-management for memory that goes into FITS memory files.
Definition: fits.h:106
lsst::afw::image::Image< VariancePixelT > Variance
Definition: MaskedImage.h:92
std::string getAsString(std::string const &name) const
Definition: PropertySet.cc:444
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.
Definition: MaskedImage.cc:513
void operator*=(ImagePixelT const rhs)
Definition: MaskedImage.cc:450
A class to manipulate images, masks, and variance as a single object.
Definition: MaskedImage.h:77
_view_t::reverse_iterator reverse_iterator
An STL compliant reverse iterator.
Definition: Image.h:147
Image< ImagePixelT >::Ptr ImagePtr
shared pointer to the Image
Definition: MaskedImage.h:81
void operator/=(ImagePixelT const rhs)
Definition: MaskedImage.cc:507
MaskedImage & operator=(MaskedImage const &rhs)
Make the lhs use the rhs&#39;s pixels.
Definition: MaskedImage.cc:279
int x
void operator<<=(MaskedImage const &rhs)
Definition: MaskedImage.cc:328
#define LSST_EXCEPT(type,...)
Definition: Exception.h:46
A pixel of a MaskedImage.
Definition: Pixel.h:137
MaskPixelT mask() const
Return the mask part of a Pixel.
Definition: Pixel.h:201
MaskPtr getMask(bool const noThrow=false) const
Return a (Ptr to) the MaskedImage&#39;s mask.
Definition: MaskedImage.h:879
VariancePixelT variance() const
Definition: Pixel.h:82
void scaledMultiplies(double const c, MaskedImage const &rhs)
Definition: MaskedImage.cc:435
_view_t::x_iterator x_iterator
An iterator for traversing the pixels in a row.
Definition: Image.h:151
Class for storing generic metadata.
Definition: PropertySet.h:82
virtual void remove(std::string const &name)
Definition: PropertySet.cc:754
reverse_iterator rbegin() const
Return a reverse_iterator to the start of the image.
Definition: MaskedImage.cc:673
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.
Definition: MaskedImage.cc:693
Implementation of the Class MaskedImage.
void operator+=(ImagePixelT const rhs)
Add a scalar rhs to a MaskedImage.
Definition: MaskedImage.cc:365
reverse_iterator rend() const
Return a reverse_iterator to the end of the image.
Definition: MaskedImage.cc:683
#define LSST_EXCEPT_ADD(e, m)
Definition: Exception.h:51
y_iterator col_end(int x) const
Return an y_iterator to the end of the image.
Definition: MaskedImage.cc:725
void scaledMinus(double const c, MaskedImage const &rhs)
Definition: MaskedImage.cc:387
void scaledPlus(double const c, MaskedImage const &rhs)
Definition: MaskedImage.cc:356
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.
Definition: MaskedImage.cc:639