LSST Applications g00d0e8bbd7+edbf708997,g03191d30f7+9ce8016dbd,g1955dfad08+0bd186d245,g199a45376c+5137f08352,g1fd858c14a+a888a50aa2,g262e1987ae+45f9aba685,g29ae962dfc+1c7d47a24f,g2cef7863aa+73c82f25e4,g35bb328faa+edbf708997,g3fd5ace14f+eed17d2c67,g47891489e3+6dc8069a4c,g53246c7159+edbf708997,g64539dfbff+c4107e45b5,g67b6fd64d1+6dc8069a4c,g74acd417e5+f452e9c21a,g786e29fd12+af89c03590,g7ae74a0b1c+a25e60b391,g7aefaa3e3d+2025e9ce17,g7cc15d900a+2d158402f9,g87389fa792+a4172ec7da,g89139ef638+6dc8069a4c,g8d4809ba88+c4107e45b5,g8d7436a09f+e96c132b44,g8ea07a8fe4+db21c37724,g98df359435+aae6d409c1,ga2180abaac+edbf708997,gac66b60396+966efe6077,gb632fb1845+88945a90f8,gbaa8f7a6c5+38b34f4976,gbf99507273+edbf708997,gca7fc764a6+6dc8069a4c,gd7ef33dd92+6dc8069a4c,gda68eeecaf+7d1e613a8d,gdab6d2f7ff+f452e9c21a,gdbb4c4dda9+c4107e45b5,ge410e46f29+6dc8069a4c,ge41e95a9f2+c4107e45b5,geaed405ab2+e194be0d2b,w.2025.47
LSST Data Management Base Package
Loading...
Searching...
No Matches
lsst::afw::fits Namespace Reference

Namespaces

namespace  _fitsContinued
 
namespace  _pickleFits
 
namespace  detail
 

Classes

struct  CompressionOptions
 Options controlling image compression with FITS. More...
 
class  Fits
 A simple struct that combines the two arguments that must be passed to most cfitsio routines and contains thin and/or templated wrappers around common cfitsio routines. More...
 
class  FitsError
 An exception thrown when problems are found when reading or writing FITS files. More...
 
class  FitsTypeError
 An exception thrown when a FITS file has the wrong type. More...
 
class  HduMoveGuard
 RAII scoped guard for moving the HDU in a Fits object. More...
 
class  HeaderIterationFunctor
 Base class for polymorphic functors used to iterator over FITS key headers. More...
 
class  MemFileManager
 Lifetime-management for memory that goes into FITS memory files. More...
 
struct  QuantizationOptions
 Options controlling quantization for image compression with FITS. More...
 

Typedefs

using dafPlistPtr = std::shared_ptr<daf::base::PropertyList>
 

Enumerations

enum class  HduType : int { IMAGE = 0 , ASCII_TABLE = 1 , BIN_TABLE = 2 , ANY = -1 }
 an enum representing the various types of FITS HDU that are available in cfitsio library More...
 
enum class  CompressionAlgorithm { GZIP_1_ , GZIP_2_ , RICE_1_ }
 FITS compression algorithms. More...
 
enum class  DitherAlgorithm { NO_DITHER_ , SUBTRACTIVE_DITHER_1_ , SUBTRACTIVE_DITHER_2_ }
 FITS quantization algorithms. More...
 
enum class  ScalingAlgorithm { RANGE , STDEV_MASKED , STDEV_CFITSIO , MANUAL }
 Algorithms used to compute the scaling factor used in quantization. More...
 

Functions

std::string makeErrorMessage (std::string const &fileName="", int status=0, std::string const &msg="")
 Return an error message reflecting FITS I/O errors.
 
std::string makeErrorMessage (std::string const &fileName, int status, boost::format const &msg)
 
std::string makeErrorMessage (void *fptr, int status=0, std::string const &msg="")
 Return an error message reflecting FITS I/O errors.
 
std::string makeErrorMessage (void *fptr, int status, boost::format const &msg)
 
std::string makeLimitedFitsHeader (lsst::daf::base::PropertySet const &metadata, std::set< std::string > const &excludeNames={})
 Format a PropertySet into an FITS header string in a simplistic fashion.
 
template<typename T>
int getBitPix ()
 Return the cfitsio integer BITPIX code for the given data type.
 
template<typename T, int N, int C>
ndarray::Array< T const, N, N > const makeContiguousArray (ndarray::Array< T, N, C > const &array)
 Construct a contiguous ndarray.
 
std::shared_ptr< daf::base::PropertyListcombineMetadata (daf::base::PropertyList const &first, daf::base::PropertyList const &second)
 Combine two sets of metadata in a FITS-appropriate fashion.
 
std::shared_ptr< daf::base::PropertyListreadMetadata (std::string const &fileName, int hdu=DEFAULT_HDU, bool strip=false)
 Read FITS header.
 
std::shared_ptr< daf::base::PropertyListreadMetadata (std::string const &fileName, std::string const &hduname, HduType type=HduType::ANY, int hduver=0, bool strip=false)
 Read FITS header.
 
std::shared_ptr< daf::base::PropertyListreadMetadata (fits::MemFileManager &manager, int hdu=DEFAULT_HDU, bool strip=false)
 Read FITS header.
 
std::shared_ptr< daf::base::PropertyListreadMetadata (fits::MemFileManager &manager, std::string const &hduname, HduType type=HduType::ANY, int hduver=0, bool strip=false)
 Read FITS header.
 
std::shared_ptr< daf::base::PropertyListreadMetadata (fits::Fits &fitsfile, bool strip=false)
 Read FITS header.
 
 PYBIND11_MODULE (_fits, mod)
 

Variables

const int DEFAULT_HDU = INT_MIN
 Specify that the default HDU should be read.
 

Typedef Documentation

◆ dafPlistPtr

Enumeration Type Documentation

◆ CompressionAlgorithm

FITS compression algorithms.

See the standard for details.

These have a trailing underscore to avoid conflict with CFITSIO's preprocessor macros (the trailing underscore is dropped in the Python bindings). Not all FITS compression algorithms are supported.

Enumerator
GZIP_1_ 
GZIP_2_ 
RICE_1_ 

Definition at line 28 of file fitsCompression.h.

◆ DitherAlgorithm

FITS quantization algorithms.

See the standard for details.

These have a trailing underscore to avoid conflict with CFITSIO's preprocessor macros (the trailing underscore is dropped in the Python bindings).

Enumerator
NO_DITHER_ 
SUBTRACTIVE_DITHER_1_ 
SUBTRACTIVE_DITHER_2_ 

Definition at line 41 of file fitsCompression.h.

◆ HduType

enum class lsst::afw::fits::HduType : int
strong

an enum representing the various types of FITS HDU that are available in cfitsio library

This is an int because the value it maps to in cfitsio is also an int.

Enumerator
IMAGE 
ASCII_TABLE 
BIN_TABLE 
ANY 

Definition at line 224 of file fits.h.

◆ ScalingAlgorithm

Algorithms used to compute the scaling factor used in quantization.

Enumerator
RANGE 

Scale to preserve dynamic range with bad pixels msasked out.

STDEV_MASKED 

Scale based on the standard deviation with bad pixels masked out.

STDEV_CFITSIO 

Let CFITSIO work out the scaling (per-tile; does not respect mask planes)

MANUAL 

Scale set manually.

Definition at line 48 of file fitsCompression.h.

48 {
49 RANGE,
52 MANUAL,
53};
@ RANGE
Scale to preserve dynamic range with bad pixels msasked out.
@ STDEV_MASKED
Scale based on the standard deviation with bad pixels masked out.
@ STDEV_CFITSIO
Let CFITSIO work out the scaling (per-tile; does not respect mask planes)

Function Documentation

◆ combineMetadata()

std::shared_ptr< daf::base::PropertyList > lsst::afw::fits::combineMetadata ( daf::base::PropertyList const & first,
daf::base::PropertyList const & second )

Combine two sets of metadata in a FITS-appropriate fashion.

"COMMENT" and "HISTORY" entries:

  • If of type std::string then the values in second are appended to values in first
  • If not of type std::string then they are silently ignored

All other entries:

  • Values in second override values in first (regardless of type)
  • Only scalars are copied; if a vector is found, only the last value is copied
Parameters
[in]firstThe first set of metadata to combine
[in]secondThe second set of metadata to combine
Returns
The combined metadata. Item names have the following order:
  • names in first, omitting all names except "COMMENT" and "HISTORY" that appear in second
  • names in second, omitting "COMMENT" and "HISTORY" if valid versions appear in first

Definition at line 1783 of file fits.cc.

1785 {
1787 bool const asScalar = true;
1788 for (auto const &name : first.getOrderedNames()) {
1789 auto const iscv = isCommentIsValid(first, name);
1790 if (iscv.isComment) {
1791 if (iscv.isValid) {
1792 combined->add<std::string>(name, first.getArray<std::string>(name));
1793 }
1794 } else {
1795 combined->copy(name, first, name, asScalar);
1796 }
1797 }
1798 for (auto const &name : second.getOrderedNames()) {
1799 auto const iscv = isCommentIsValid(second, name);
1800 if (iscv.isComment) {
1801 if (iscv.isValid) {
1802 combined->add<std::string>(name, second.getArray<std::string>(name));
1803 }
1804 } else {
1805 // `copy` will replace an item, even if has a different type, so no need to call `remove`
1806 combined->copy(name, second, name, asScalar);
1807 }
1808 }
1809 return combined;
1810}
T make_shared(T... args)

◆ getBitPix()

template<typename T>
int lsst::afw::fits::getBitPix ( )

Return the cfitsio integer BITPIX code for the given data type.

Definition at line 466 of file fits.cc.

466 {
467 return cfitsio_bitpix<T>;
468}

◆ makeContiguousArray()

template<typename T, int N, int C>
ndarray::Array< T const, N, N > const lsst::afw::fits::makeContiguousArray ( ndarray::Array< T, N, C > const & array)

Construct a contiguous ndarray.

A deep copy is only performed if the array is not already contiguous.

Definition at line 213 of file fits.h.

213 {
214 ndarray::Array<T const, N, N> contiguous = ndarray::dynamic_dimension_cast<N>(array);
215 if (contiguous.empty()) contiguous = ndarray::copy(array);
216 return contiguous;
217}

◆ makeErrorMessage() [1/4]

std::string lsst::afw::fits::makeErrorMessage ( std::string const & fileName,
int status,
boost::format const & msg )
inline

Definition at line 66 of file fits.h.

66 {
67 return makeErrorMessage(fileName, status, msg.str());
68}
std::string makeErrorMessage(std::string const &fileName="", int status=0, std::string const &msg="")
Return an error message reflecting FITS I/O errors.
Definition fits.cc:396

◆ makeErrorMessage() [2/4]

std::string lsst::afw::fits::makeErrorMessage ( std::string const & fileName = "",
int status = 0,
std::string const & msg = "" )

Return an error message reflecting FITS I/O errors.

Parameters
[in]fileNameFITS filename to be included in the error message.
[in]statusThe last status value returned by the cfitsio library; if nonzero, the error message will include a description from cfitsio.
[in]msgAn additional custom message to include.

Definition at line 396 of file fits.cc.

396 {
398 os << "cfitsio error";
399 if (fileName != "") {
400 os << " (" << fileName << ")";
401 }
402 if (status != 0) {
403 char fitsErrMsg[FLEN_ERRMSG];
404 fits_get_errstatus(status, fitsErrMsg);
405 os << ": " << fitsErrMsg << " (" << status << ")";
406 }
407 if (msg != "") {
408 os << " : " << msg;
409 }
410 os << "\ncfitsio error stack:\n";
411 char cfitsioMsg[FLEN_ERRMSG];
412 // fits_read_errmsg can return a junk string with non printable characters
413 // creating problem with python exception bindings
414 while (fits_read_errmsg(cfitsioMsg) != 0) {
415 cfitsioMsg[FLEN_ERRMSG-1] = char(0); // ensure termination
416 std::size_t len=strlen(cfitsioMsg);
417 for(std::size_t i = 0; i < len; i++)
418 if( !isprint(cfitsioMsg[i]) ) cfitsioMsg[i] = '.';
419 os << " " << cfitsioMsg << "\n";
420 }
421 return os.str();
422}
T str(T... args)

◆ makeErrorMessage() [3/4]

std::string lsst::afw::fits::makeErrorMessage ( void * fptr,
int status,
boost::format const & msg )
inline

Definition at line 80 of file fits.h.

80 {
81 return makeErrorMessage(fptr, status, msg.str());
82}

◆ makeErrorMessage() [4/4]

std::string lsst::afw::fits::makeErrorMessage ( void * fptr,
int status = 0,
std::string const & msg = "" )

Return an error message reflecting FITS I/O errors.

Parameters
[in]fptrA cfitsio fitsfile pointer to be inspected for a filename. Passed as void* to avoid including fitsio.h in the header file.
[in]statusThe last status value returned by the cfitsio library; if nonzero, the error message will include a description from cfitsio.
[in]msgAn additional custom message to include.

Definition at line 424 of file fits.cc.

424 {
425 std::string fileName = "";
426 fitsfile *fd = reinterpret_cast<fitsfile *>(fptr);
427 if (fd != nullptr && fd->Fptr != nullptr && fd->Fptr->filename != nullptr) {
428 fileName = fd->Fptr->filename;
429 }
430 return makeErrorMessage(fileName, status, msg);
431}

◆ makeLimitedFitsHeader()

std::string lsst::afw::fits::makeLimitedFitsHeader ( lsst::daf::base::PropertySet const & metadata,
std::set< std::string > const & excludeNames = {} )

Format a PropertySet into an FITS header string in a simplistic fashion.

This function is designed to format data for creating a WCS. As such, it is quite limited:

  • It skips entries whose name is longer than 8 characters, since none are used for FITS-WCS
  • It skips string entries if the fully formatted string is longer than 80 characters
  • It skips entries with types it cannot handle (e.g. long, long long)
  • For entries that have array data, it only writes the final value, since that is the value that should be used by code that reads FITS headers.
  • It makes no attempt to insure that required entries, such as SIMPLE, are present.
Parameters
[in]metadataMetadata to format; if this is a PropertyList then the order of items is preserved
[in]excludeNamesNames of entries to exclude from the returned header string
Returns
a FITS header string (exactly 80 characters per entry, no line terminators)

Definition at line 433 of file fits.cc.

434 {
435 daf::base::PropertyList const *pl = dynamic_cast<daf::base::PropertyList const *>(&metadata);
436 std::vector<std::string> allParamNames;
437 if (pl) {
438 allParamNames = pl->getOrderedNames();
439 } else {
440 allParamNames = metadata.paramNames(false);
441 }
442 std::vector<std::string> desiredParamNames;
443 for (auto const &name : allParamNames) {
444 if (excludeNames.count(name) == 0) {
445 desiredParamNames.push_back(name);
446 }
447 }
448 return makeLimitedFitsHeaderImpl(desiredParamNames, metadata);
449}
Class for storing ordered metadata with comments.
std::vector< std::string > getOrderedNames() const
Get the list of property names, in the order they were added.
T count(T... args)
T push_back(T... args)

◆ PYBIND11_MODULE()

lsst::afw::fits::PYBIND11_MODULE ( _fits ,
mod  )

Definition at line 195 of file _fits.cc.

195 {
196 lsst::cpputils::python::WrapperCollection wrappers(mod, "lsst.afw.fits");
197 wrappers.addInheritanceDependency("lsst.pex.exceptions");
198 wrappers.addSignatureDependency("lsst.daf.base");
199 // FIXME: after afw.image pybind wrappers are converted
200 //wrappers.addSignatureDependency("lsst.afw.image");
201 auto cls = wrappers.wrapException<FitsError, lsst::pex::exceptions::IoError>("FitsError", "IoError");
202 cls.def(py::init<std::string const &>());
203 declareCompression(wrappers);
204 declareFits(wrappers);
205 declareFitsModule(wrappers);
206 wrappers.finish();
207}
An exception thrown when problems are found when reading or writing FITS files.
Definition fits.h:37
A helper class for subdividing pybind11 module across multiple translation units (i....
Definition python.h:242
Reports errors in external input/output operations.
Definition Runtime.h:160

◆ readMetadata() [1/5]

std::shared_ptr< daf::base::PropertyList > lsst::afw::fits::readMetadata ( fits::Fits & fitsfile,
bool strip = false )

Read FITS header.

Includes support for the INHERIT convention: if 'INHERIT = T' is in the header, the PHU will be read as well, and nominated HDU will override any duplicated values.

Parameters
fitsfilethe file and HDU to be read
stripif true, common FITS keys that usually have non-metadata intepretations (e.g. NAXIS, BITPIX) will be ignored.

Definition at line 1842 of file fits.cc.

1842 {
1844 fitsfile.readMetadata(*metadata, strip);
1845 // if INHERIT=T, we want to also include header entries from the primary HDU
1846 int oldHdu = fitsfile.getHdu();
1847 if (oldHdu != 0 && metadata->exists("INHERIT")) {
1848 bool inherit = false;
1849 if (metadata->typeOf("INHERIT") == typeid(std::nullptr_t)) {
1850 // Assume false if INHERIT exists but is undefined.
1851 inherit = false;
1852 } else if (metadata->typeOf("INHERIT") == typeid(std::string)) {
1853 inherit = (metadata->get<std::string>("INHERIT") == "T");
1854 } else {
1855 inherit = metadata->get<bool>("INHERIT");
1856 }
1857 if (strip) metadata->remove("INHERIT");
1858 if (inherit) {
1859 HduMoveGuard guard(fitsfile, 0);
1860 // Combine the metadata from the primary HDU with the metadata from the specified HDU,
1861 // with non-comment values from the specified HDU superseding those in the primary HDU
1862 // and comments from the specified HDU appended to comments from the primary HDU
1863 auto primaryHduMetadata = std::make_shared<daf::base::PropertyList>();
1864 fitsfile.readMetadata(*primaryHduMetadata, strip);
1865 metadata = combineMetadata(*primaryHduMetadata, *metadata);
1866 } else {
1867 // Purge invalid values
1868 auto const emptyMetadata = std::make_shared<lsst::daf::base::PropertyList>();
1869 metadata = combineMetadata(*metadata, *emptyMetadata);
1870 }
1871 }
1872 return metadata;
1873}
void readMetadata(daf::base::PropertySet &metadata, bool strip=false)
Read a FITS header into a PropertySet or PropertyList.
Definition fits.cc:1078
int getHdu()
Return the current HDU (0-indexed; 0 is the Primary HDU).
Definition fits.cc:483
std::shared_ptr< daf::base::PropertyList > combineMetadata(daf::base::PropertyList const &first, daf::base::PropertyList const &second)
Combine two sets of metadata in a FITS-appropriate fashion.
Definition fits.cc:1783
py::scoped_interpreter guard
Definition test_image.cc:19

◆ readMetadata() [2/5]

dafPlistPtr lsst::afw::fits::readMetadata ( fits::MemFileManager & manager,
int hdu = DEFAULT_HDU,
bool strip = false )

Read FITS header.

Includes support for the INHERIT convention: if 'INHERIT = T' is in the header, the PHU will be read as well, and nominated HDU will override any duplicated values.

Parameters
managerthe in-memory file whose header will be read
hduthe HDU to read (0-indexed; 0 is the Primary HDU).
stripif true, common FITS keys that usually have non-metadata intepretations (e.g. NAXIS, BITPIX) will be ignored.

Definition at line 1833 of file fits.cc.

1833 {
1834 return detail::_readMetadata(manager, strip, hdu);
1835}
dafPlistPtr _readMetadata(T &&fitsparm, bool strip, Args... args)
Definition fits.cc:1816

◆ readMetadata() [3/5]

dafPlistPtr lsst::afw::fits::readMetadata ( fits::MemFileManager & manager,
std::string const & hduname,
HduType type = HduType::ANY,
int hduver = 0,
bool strip = false )

Read FITS header.

Includes support for the INHERIT convention: if 'INHERIT = T' is in the header, the PHU will be read as well, and nominated HDU will override any duplicated values.

Parameters
managerthe in-memory file whose header will be read
hdunamethe name of the HDU to read
typetype of FITS header to match. Defaults to ANY_HDU
hduverversion of HDU header to match, defaults to 0 (version ignored)
stripif true, common FITS keys that usually have non-metadata intepretations (e.g. NAXIS, BITPIX) will be ignored.

Definition at line 1837 of file fits.cc.

1838 {
1839 return detail::_readMetadata(manager, strip, hduname, type, hduver);
1840}

◆ readMetadata() [4/5]

dafPlistPtr lsst::afw::fits::readMetadata ( std::string const & fileName,
int hdu = DEFAULT_HDU,
bool strip = false )

Read FITS header.

Includes support for the INHERIT convention: if 'INHERIT = T' is in the header, the PHU will be read as well, and nominated HDU will override any duplicated values.

Parameters
fileNamethe file whose header will be read
hduthe HDU to read (0-indexed; 0 is the Primary HDU).
stripif true, common FITS keys that usually have non-metadata intepretations (e.g. NAXIS, BITPIX) will be ignored.

Definition at line 1824 of file fits.cc.

1824 {
1825 return detail::_readMetadata(fileName, strip, hdu);
1826}

◆ readMetadata() [5/5]

dafPlistPtr lsst::afw::fits::readMetadata ( std::string const & fileName,
std::string const & hduname,
HduType type = HduType::ANY,
int hduver = 0,
bool strip = false )

Read FITS header.

Includes support for the INHERIT convention: if 'INHERIT = T' is in the header, the PHU will be read as well, and nominated HDU will override any duplicated values.

Parameters
fileNamethe file whose header will be read
hdunamethe name of the HDU to read
typetype of FITS header to match. Defaults to ANY_HDU
hduverversion of HDU header to match, defaults to 0 (version ignored)
stripif true, common FITS keys that usually have non-metadata intepretations (e.g. NAXIS, BITPIX) will be ignored.

Definition at line 1828 of file fits.cc.

1829 {
1830 return detail::_readMetadata(fileName, strip, hduname, type, hduver);
1831}

Variable Documentation

◆ DEFAULT_HDU

const int lsst::afw::fits::DEFAULT_HDU = INT_MIN

Specify that the default HDU should be read.

This special HDU number indicates that the first extension should be used if the primary HDU is empty (i.e., has NAXIS=0) and the Primary HDU is the current.

Definition at line 18 of file fitsDefaults.h.