LSST Applications 30.0.7,g0e76e35be5+e8e946ae08,g19811a7679+138f7293ba,g199a45376c+5e234f8357,g1fd858c14a+2f48dbc4c4,g262e1987ae+fb36cac54d,g29ae962dfc+d9108a0941,g2c21b0017a+4f59a27f16,g31e44d4a5c+b0138be388,g33ac35c1f1+28b9f72785,g35bb328faa+b0138be388,g40c9b15c53+823ad735c1,g47891489e3+bcc48a0b46,g53246c7159+b0138be388,g64539dfbff+e8e946ae08,g67b6fd64d1+bcc48a0b46,g74acd417e5+422380537a,g76965917b2+a5ca99c4d9,g786e29fd12+796b79145d,g7aefaa3e3d+dc0c200193,g86b635cae8+734fe384f0,g87389fa792+d8b5378923,g89139ef638+bcc48a0b46,g8bbb235e95+3f4f7f9447,g8ea07a8fe4+78a4c88802,g9290983e33+ffdc83c6f7,g92c671f44c+e8e946ae08,gaa753fd333+03f406da14,gbf99507273+b0138be388,gc49b57b85e+8df26ee1f0,gca7fc764a6+bcc48a0b46,gd7ef33dd92+bcc48a0b46,gdab6d2f7ff+422380537a,ge1c02a5578+b0138be388,ge410e46f29+bcc48a0b46,ge80df9fc40+e6db5413d1,geaed405ab2+1de65a85c6,gf5dcc679e7+35a0ce2edd,gf5f1c85443+e8e946ae08
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 1796 of file fits.cc.

1798 {
1800 bool const asScalar = true;
1801 for (auto const &name : first.getOrderedNames()) {
1802 auto const iscv = isCommentIsValid(first, name);
1803 if (iscv.isComment) {
1804 if (iscv.isValid) {
1805 combined->add<std::string>(name, first.getArray<std::string>(name));
1806 }
1807 } else {
1808 combined->copy(name, first, name, asScalar);
1809 }
1810 }
1811 for (auto const &name : second.getOrderedNames()) {
1812 auto const iscv = isCommentIsValid(second, name);
1813 if (iscv.isComment) {
1814 if (iscv.isValid) {
1815 combined->add<std::string>(name, second.getArray<std::string>(name));
1816 }
1817 } else {
1818 // `copy` will replace an item, even if has a different type, so no need to call `remove`
1819 combined->copy(name, second, name, asScalar);
1820 }
1821 }
1822 return combined;
1823}
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 1855 of file fits.cc.

1855 {
1857 fitsfile.readMetadata(*metadata, strip);
1858 // if INHERIT=T, we want to also include header entries from the primary HDU
1859 int oldHdu = fitsfile.getHdu();
1860 if (oldHdu != 0 && metadata->exists("INHERIT")) {
1861 bool inherit = false;
1862 if (metadata->typeOf("INHERIT") == typeid(std::nullptr_t)) {
1863 // Assume false if INHERIT exists but is undefined.
1864 inherit = false;
1865 } else if (metadata->typeOf("INHERIT") == typeid(std::string)) {
1866 inherit = (metadata->get<std::string>("INHERIT") == "T");
1867 } else {
1868 inherit = metadata->get<bool>("INHERIT");
1869 }
1870 if (strip) metadata->remove("INHERIT");
1871 if (inherit) {
1872 HduMoveGuard guard(fitsfile, 0);
1873 // Combine the metadata from the primary HDU with the metadata from the specified HDU,
1874 // with non-comment values from the specified HDU superseding those in the primary HDU
1875 // and comments from the specified HDU appended to comments from the primary HDU
1876 auto primaryHduMetadata = std::make_shared<daf::base::PropertyList>();
1877 fitsfile.readMetadata(*primaryHduMetadata, strip);
1878 metadata = combineMetadata(*primaryHduMetadata, *metadata);
1879 } else {
1880 // Purge invalid values
1881 auto const emptyMetadata = std::make_shared<lsst::daf::base::PropertyList>();
1882 metadata = combineMetadata(*metadata, *emptyMetadata);
1883 }
1884 }
1885 return metadata;
1886}
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:1796
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 1846 of file fits.cc.

1846 {
1847 return detail::_readMetadata(manager, strip, hdu);
1848}
dafPlistPtr _readMetadata(T &&fitsparm, bool strip, Args... args)
Definition fits.cc:1829

◆ 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 1850 of file fits.cc.

1851 {
1852 return detail::_readMetadata(manager, strip, hduname, type, hduver);
1853}

◆ 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 1837 of file fits.cc.

1837 {
1838 return detail::_readMetadata(fileName, strip, hdu);
1839}

◆ 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 1841 of file fits.cc.

1842 {
1843 return detail::_readMetadata(fileName, strip, hduname, type, hduver);
1844}

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.