LSST Applications g0265f82a02+0e5473021a,g02d81e74bb+bd2ed33bd6,g1470d8bcf6+de7501a2e0,g14a832a312+ff425fae3c,g2079a07aa2+86d27d4dc4,g2305ad1205+91a32aca49,g295015adf3+762506a1ad,g2bbee38e9b+0e5473021a,g337abbeb29+0e5473021a,g3ddfee87b4+c34e8be1fa,g487adcacf7+5fae3daba8,g50ff169b8f+96c6868917,g52b1c1532d+585e252eca,g591dd9f2cf+ea1711114f,g5a732f18d5+53520f316c,g64a986408d+bd2ed33bd6,g858d7b2824+bd2ed33bd6,g8a8a8dda67+585e252eca,g99cad8db69+016a06b37a,g9ddcbc5298+9a081db1e4,ga1e77700b3+15fc3df1f7,ga8c6da7877+ef4e3a5875,gb0e22166c9+60f28cb32d,gb6a65358fc+0e5473021a,gba4ed39666+c2a2e4ac27,gbb8dafda3b+09e12c87ab,gc120e1dc64+bc2e06c061,gc28159a63d+0e5473021a,gcf0d15dbbd+c34e8be1fa,gdaeeff99f8+f9a426f77a,ge6526c86ff+508d0e0a30,ge79ae78c31+0e5473021a,gee10cc3b42+585e252eca,gf18bd8381d+8d59551888,gf1cff7945b+bd2ed33bd6,w.2024.16
LSST Data Management Base Package
Loading...
Searching...
No Matches
Public Member Functions | Protected Member Functions | Friends | List of all members
lsst::afw::image::ImageBaseFitsReader Class Reference

Base class for image FITS readers. More...

#include <ImageBaseFitsReader.h>

Inheritance diagram for lsst::afw::image::ImageBaseFitsReader:
lsst::afw::image::ImageFitsReader lsst::afw::image::MaskFitsReader

Public Member Functions

 ImageBaseFitsReader (std::string const &fileName, int hdu=fits::DEFAULT_HDU)
 Construct a FITS reader object.
 
 ImageBaseFitsReader (fits::MemFileManager &manager, int hdu=fits::DEFAULT_HDU)
 Construct a FITS reader object.
 
 ImageBaseFitsReader (fits::Fits *fitsFile)
 Construct a FITS reader object.
 
 ImageBaseFitsReader (ImageBaseFitsReader const &)=delete
 
 ImageBaseFitsReader (ImageBaseFitsReader &&)=delete
 
ImageBaseFitsReaderoperator= (ImageBaseFitsReader const &)=delete
 
ImageBaseFitsReaderoperator= (ImageBaseFitsReader &&)=delete
 
std::string readDType () const
 Read a string describing the pixel type of the on-disk image.
 
lsst::geom::Box2I readBBox (ImageOrigin origin=PARENT)
 Read the bounding box of the on-disk image.
 
lsst::geom::Point2I readXY0 (lsst::geom::Box2I const &bbox=lsst::geom::Box2I(), ImageOrigin origin=PARENT)
 Read the image origin from the on-disk image or a subimage thereof.
 
std::shared_ptr< daf::base::PropertyListreadMetadata ()
 Read the image's FITS header.
 
template<typename T >
ndarray::Array< T, 2, 2 > readArray (lsst::geom::Box2I const &bbox, ImageOrigin origin=PARENT, bool allowUnsafe=false)
 Read the image's data array.
 
int getHdu () const noexcept
 Return the HDU this reader targets.
 
std::string getFileName () const
 Return the name of the file this reader targets.
 

Protected Member Functions

 ~ImageBaseFitsReader () noexcept
 

Friends

class MaskedImageFitsReader
 

Detailed Description

Base class for image FITS readers.

This class should be considered an implementation detail of ImageFitsReader and MaskFitsReader that provides their common methods, not the definition of an interface.

Exception Safety
All ImageBaseFitsReader methods provide strong exception safety, but exceptions thrown by the internal fits::Fits object itself may change its status variable or HDU pointer; ImageBaseFitsReader guards against this by resetting those before any use of the Fits object.

Definition at line 47 of file ImageBaseFitsReader.h.

Constructor & Destructor Documentation

◆ ImageBaseFitsReader() [1/5]

lsst::afw::image::ImageBaseFitsReader::ImageBaseFitsReader ( std::string const & fileName,
int hdu = fits::DEFAULT_HDU )
explicit

Construct a FITS reader object.

Parameters
fileNameName of a file to open.
hduHDU index, where 0 is the primary HDU and DEFAULT_HDU is the first non-empty HDU.

Definition at line 27 of file ImageBaseFitsReader.cc.

27 :
28 _ownsFitsFile(true),
29 _hdu(0),
30 _fitsFile(new fits::Fits(fileName, "r", fits::Fits::AUTO_CLOSE | fits::Fits::AUTO_CHECK))
31{
32 _fitsFile->setHdu(hdu);
33 _fitsFile->checkCompressedImagePhu();
34 _hdu = _fitsFile->getHdu();
35}
void setHdu(int hdu, bool relative=false)
Set the current HDU.
Definition fits.cc:524
bool checkCompressedImagePhu()
Go to the first image header in the FITS file.
Definition fits.cc:1767
int getHdu()
Return the current HDU (0-indexed; 0 is the Primary HDU).
Definition fits.cc:518

◆ ImageBaseFitsReader() [2/5]

lsst::afw::image::ImageBaseFitsReader::ImageBaseFitsReader ( fits::MemFileManager & manager,
int hdu = fits::DEFAULT_HDU )
explicit

Construct a FITS reader object.

Parameters
managerMemory block containing a FITS file.
hduHDU index, where 0 is the primary HDU and DEFAULT_HDU is the first non-empty HDU.

Definition at line 37 of file ImageBaseFitsReader.cc.

37 :
38 _ownsFitsFile(true),
39 _hdu(0),
40 _fitsFile(new fits::Fits(manager, "r", fits::Fits::AUTO_CLOSE | fits::Fits::AUTO_CHECK))
41{
42 _fitsFile->setHdu(hdu);
43 _fitsFile->checkCompressedImagePhu();
44 _hdu = _fitsFile->getHdu();
45}

◆ ImageBaseFitsReader() [3/5]

lsst::afw::image::ImageBaseFitsReader::ImageBaseFitsReader ( fits::Fits * fitsFile)
explicit

Construct a FITS reader object.

Parameters
fitsFilePointer to a CFITSIO file object. Lifetime will not be managed by the Reader object.

Definition at line 47 of file ImageBaseFitsReader.cc.

47 :
48 _ownsFitsFile(false),
49 _hdu(0),
50 _fitsFile(fitsFile)
51{
52 if (_fitsFile) {
53 if (_fitsFile->getHdu() == 0 && _fitsFile->getImageDim() == 0) {
54 _fitsFile->setHdu(fits::DEFAULT_HDU);
55 }
56 _fitsFile->checkCompressedImagePhu();
57 _hdu = _fitsFile->getHdu();
58 }
59}
int getImageDim()
Return the number of dimensions in the current HDU.
Definition fits.cc:1442
const int DEFAULT_HDU
Specify that the default HDU should be read.

◆ ImageBaseFitsReader() [4/5]

lsst::afw::image::ImageBaseFitsReader::ImageBaseFitsReader ( ImageBaseFitsReader const & )
delete

◆ ImageBaseFitsReader() [5/5]

lsst::afw::image::ImageBaseFitsReader::ImageBaseFitsReader ( ImageBaseFitsReader && )
delete

◆ ~ImageBaseFitsReader()

lsst::afw::image::ImageBaseFitsReader::~ImageBaseFitsReader ( )
protectednoexcept

Definition at line 61 of file ImageBaseFitsReader.cc.

61 {
62 if (_ownsFitsFile) {
63 delete _fitsFile;
64 }
65}

Member Function Documentation

◆ getFileName()

std::string lsst::afw::image::ImageBaseFitsReader::getFileName ( ) const
inline

Return the name of the file this reader targets.

Definition at line 141 of file ImageBaseFitsReader.h.

141{ return _fitsFile->getFileName(); }
std::string getFileName() const
Return the file name associated with the FITS object or "<unknown>" if there is none.
Definition fits.cc:509

◆ getHdu()

int lsst::afw::image::ImageBaseFitsReader::getHdu ( ) const
inlinenoexcept

Return the HDU this reader targets.

Definition at line 136 of file ImageBaseFitsReader.h.

136{ return _hdu; }

◆ operator=() [1/2]

ImageBaseFitsReader & lsst::afw::image::ImageBaseFitsReader::operator= ( ImageBaseFitsReader && )
delete

◆ operator=() [2/2]

ImageBaseFitsReader & lsst::afw::image::ImageBaseFitsReader::operator= ( ImageBaseFitsReader const & )
delete

◆ readArray()

template<typename T >
template ndarray::Array< std::uint64_t, 2, 2 > lsst::afw::image::ImageBaseFitsReader::readArray ( lsst::geom::Box2I const & bbox,
ImageOrigin origin = PARENT,
bool allowUnsafe = false )

Read the image's data array.

Parameters
bboxA bounding box used to defined a subimage, or an empty box (default) to read the whole image.
originCoordinate system convention for the given box.
allowUnsafePermit reading into the requested pixel type even when on-disk values may overflow or truncate.

Definition at line 171 of file ImageBaseFitsReader.cc.

172 {
173 checkFitsFile(_fitsFile);
174 auto fullBBox = readBBox(origin);
175 auto subBBox = bbox;
176 if (subBBox.isEmpty()) {
177 subBBox = fullBBox;
178 } else if (!fullBBox.contains(subBBox)) {
179 throw LSST_EXCEPT(
180 pex::exceptions::LengthError,
181 str(boost::format("Subimage box (%d,%d) %dx%d doesn't fit in image (%d,%d) %dx%d in HDU %d") %
182 subBBox.getMinX() % subBBox.getMinY() % subBBox.getWidth() % subBBox.getHeight() %
183 fullBBox.getMinX() % fullBBox.getMinY() % fullBBox.getWidth() % fullBBox.getHeight() % _hdu)
184 );
185 }
186 fits::HduMoveGuard guard(*_fitsFile, _hdu);
187 if (!allowUnsafe & !_fitsFile->checkImageType<T>()) {
188 throw LSST_FITS_EXCEPT(
189 fits::FitsTypeError, *_fitsFile,
190 str(boost::format("Incompatible type for FITS image: on disk is %s (HDU %d), in-memory is %s. "
191 "Read with allowUnsafe=True to permit conversions that may overflow.") %
192 _fitsFile->getImageDType() % _hdu % makeDTypeString<T>())
193 );
194 }
195 ndarray::Array<T, 2, 2> result = ndarray::allocate(subBBox.getHeight(), subBBox.getWidth());
196 ndarray::Vector<int, 2> offset = ndarray::makeVector(subBBox.getMinY() - fullBBox.getMinY(),
197 subBBox.getMinX() - fullBBox.getMinX());
198 _fitsFile->readImage(result, offset);
199 return result;
200}
py::object result
Definition _schema.cc:429
AmpInfoBoxKey bbox
Definition Amplifier.cc:117
#define LSST_EXCEPT(type,...)
Create an exception with a given type.
Definition Exception.h:48
void readImage(ndarray::Array< T, N, N > const &array, ndarray::Vector< int, N > const &offset)
Read an array from a FITS image.
Definition fits.h:563
std::string getImageDType()
Return the numpy dtype equivalent of the image pixel type (e.g.
Definition fits.cc:1486
bool checkImageType()
Return true if the current HDU is compatible with the given pixel type.
Definition fits.cc:1455
lsst::geom::Box2I readBBox(ImageOrigin origin=PARENT)
Read the bounding box of the on-disk image.
#define LSST_FITS_EXCEPT(type, fitsObj,...)
A FITS-related replacement for LSST_EXCEPT that takes an additional Fits object and uses makeErrorMes...
Definition fits.h:105

◆ readBBox()

lsst::geom::Box2I lsst::afw::image::ImageBaseFitsReader::readBBox ( ImageOrigin origin = PARENT)

Read the bounding box of the on-disk image.

Parameters
originCoordinate system convention for the returned box. If LOCAL, the returned box will always have a minimum of (0, 0).

Definition at line 86 of file ImageBaseFitsReader.cc.

86 {
87 readMetadata(); // guarantees _bbox is initialized
88 if (origin == LOCAL) {
90 }
91 return _bbox;
92}
std::shared_ptr< daf::base::PropertyList > readMetadata()
Read the image's FITS header.
An integer coordinate rectangle.
Definition Box.h:55
Extent2I const getDimensions() const noexcept
Definition Box.h:186

◆ readDType()

std::string lsst::afw::image::ImageBaseFitsReader::readDType ( ) const

Read a string describing the pixel type of the on-disk image.

Returns
A string of the form [u](int|float)<bits> (e.g. "uint16", "float64").

Definition at line 80 of file ImageBaseFitsReader.cc.

80 {
81 checkFitsFile(_fitsFile);
82 fits::HduMoveGuard guard(*_fitsFile, _hdu);
83 return _fitsFile->getImageDType();
84}

◆ readMetadata()

std::shared_ptr< daf::base::PropertyList > lsst::afw::image::ImageBaseFitsReader::readMetadata ( )

Read the image's FITS header.

Definition at line 105 of file ImageBaseFitsReader.cc.

105 {
106 checkFitsFile(_fitsFile);
107 if (_metadata == nullptr) {
108 fits::HduMoveGuard guard(*_fitsFile, _hdu);
109 auto metadata = fits::readMetadata(*_fitsFile, /*strip=*/true);
110 // One-use lambda avoids declare-then-initialize; see C++ Core Guidelines, ES28.
111 auto computeShape = [this](){
112 int nAxis = _fitsFile->getImageDim();
113 if (nAxis == 2) {
114 return _fitsFile->getImageShape<2>();
115 }
116 if (nAxis == 3) {
117 ndarray::Vector<ndarray::Size, 3> shape3 = _fitsFile->getImageShape<3>();
118 if (shape3[0] != 1) {
119 throw LSST_EXCEPT(
120 fits::FitsError,
121 str(boost::format("Error reading %s: HDU %d has 3rd dimension %d != 1") %
122 getFileName() % _hdu % shape3[0]));
123 }
124 return shape3.last<2>();
125 }
126 throw LSST_EXCEPT(
127 fits::FitsError,
128 str(boost::format("Error reading %s: HDU %d has %d dimensions") %
129 getFileName() % _hdu % nAxis)
130 );
131 };
132 // Construct _bbox and check dimensions at the same time both to make
133 // one less valid state for this class to be in and to make sure
134 // the appropriate metadata is stripped before we ever return it.
135 ndarray::Vector<ndarray::Size, 2> shape = computeShape();
136 auto xy0 = afw::geom::getImageXY0FromMetadata(*metadata, detail::wcsNameForXY0, /*strip=*/true);
137 _bbox = lsst::geom::Box2I(xy0, lsst::geom::Extent2I(shape[1], shape[0]));
138 _metadata = std::move(metadata);
139 }
140 return _metadata;
141}
ndarray::Vector< ndarray::Size, N > getImageShape()
Return the shape of the current (image) HDU.
Definition fits.h:534
std::string getFileName() const
Return the name of the file this reader targets.
T move(T... args)
std::shared_ptr< daf::base::PropertyList > readMetadata(std::string const &fileName, int hdu=DEFAULT_HDU, bool strip=false)
Read FITS header.
Definition fits.cc:1689
lsst::geom::Point2I getImageXY0FromMetadata(daf::base::PropertySet &metadata, std::string const &wcsName, bool strip=false)
Definition wcsUtils.cc:95
std::string const wcsNameForXY0
Definition ImageBase.h:70

◆ readXY0()

lsst::geom::Point2I lsst::afw::image::ImageBaseFitsReader::readXY0 ( lsst::geom::Box2I const & bbox = lsst::geom::Box2I(),
ImageOrigin origin = PARENT )

Read the image origin from the on-disk image or a subimage thereof.

Parameters
bboxA bounding box used to defined a subimage, or an empty box (default) to use the whole image.
originCoordinate system convention for the given box. Ignored if bbox is empty.

Definition at line 94 of file ImageBaseFitsReader.cc.

94 {
95 if (bbox.isEmpty()) {
96 return readBBox().getMin();
97 } else if (origin == PARENT) {
98 return bbox.getMin();
99 } else {
100 auto full = readBBox();
101 return full.getMin() + lsst::geom::Extent2I(bbox.getMin());
102 }
103}
Point2I const getMin() const noexcept
Definition Box.h:156
Extent< int, 2 > Extent2I
Definition Extent.h:397

Friends And Related Symbol Documentation

◆ MaskedImageFitsReader

friend class MaskedImageFitsReader
friend

Definition at line 151 of file ImageBaseFitsReader.h.


The documentation for this class was generated from the following files: