Source code for nbodykit.io.fits
from .base import FileType
from . import tools
from six import string_types
import numpy
try: import fitsio
except ImportError: fitsio = None
[docs]class FITSFile(FileType):
"""
A file object to handle the reading of FITS data using the
:mod:`fitsio` package.
See also: https://github.com/esheldon/fitsio
Parameters
----------
path : str
the file path to load
ext: number or string, optional
The extension. Either the numerical extension from zero
or a string extension name. If not sent, data is read from
the first HDU that has data.
"""
def __init__(self, path, ext=None):
# hide the import exception
if fitsio is None:
raise ImportError("please install fitsio: ``conda install -c bccp fitsio``")
self.path = path
self.dataset = str(ext)
# try to find the first Table HDU to read if not specified
with fitsio.FITS(path) as ff:
if ext is None:
for i, hdu in enumerate(ff):
if hdu.has_data():
ext = i
break
if ext is None:
raise ValueError("input fits file '%s' has not binary table to read" %path)
else:
if isinstance(ext, string_types):
if ext not in ff:
raise ValueError("FITS file does not contain extension with name '%s'" %ext)
elif ext >= len(ff):
raise ValueError("FITS extension %d is not valid" %ext)
# make sure we crash if data is wrong or missing
if not ff[ext].has_data() or ff[ext].get_exttype() == 'IMAGE_HDU':
raise ValueError("FITS extension %d is not a readable binary table" %ext)
self.attrs = {}
self.attrs['ext'] = ext
# size and dtype
with fitsio.FITS(path) as ff:
FileType.__init__(self, size=ff[ext].get_nrows(),
dtype=ff[ext].get_rec_dtype()[0])
[docs] def read(self, columns, start, stop, step=1):
"""
Read the specified column(s) over the given range
'start' and 'stop' should be between 0 and :attr:`size`,
which is the total size of the file
Parameters
----------
columns : str, list of str
the name of the column(s) to return
start : int
the row integer to start reading at
stop : int
the row integer to stop reading at
step : int, optional
the step size to use when reading; default is 1
Returns
-------
numpy.array
structured array holding the requested columns over
the specified range of rows
"""
kws = {'ext':self.attrs['ext'], 'columns':columns, 'rows':range(start, stop, step)}
return fitsio.read(self.path, **kws)