Source code for asdf_astropy.converters.fits.fits
from asdf.extension import Converter
from asdf.tags.core.ndarray import NDArrayType
def _card_to_node(card):
from astropy.io.fits import Undefined
value = "" if isinstance(card.value, Undefined) else card.value
if card.comment:
return [card.keyword, value, card.comment]
if value:
return [card.keyword, value]
if card.keyword:
return [card.keyword]
return []
[docs]
class FitsConverter(Converter):
[docs]
def to_yaml_tree(self, obj, tag, ctx):
from astropy.table import Table
node = []
for hdu in obj:
header_node = [_card_to_node(c) for c in hdu.header.cards]
hdu_node = {"header": header_node}
if hdu.data is not None:
if hdu.data.dtype.names is not None:
hdu_node["data"] = Table(hdu.data)
else:
hdu_node["data"] = hdu.data
node.append(hdu_node)
return node
[docs]
def from_yaml_tree(self, node, tag, ctx):
from astropy.io import fits
hdus = []
first = True
for hdu_node in node:
header = fits.Header([fits.Card(*x) for x in hdu_node["header"]])
data = hdu_node.get("data")
if isinstance(data, NDArrayType):
# TODO: Why doesn't NDArrayType work? This needs some research
# and documentation.
data = data._make_array()
if first:
hdu = fits.PrimaryHDU(data=data, header=header)
first = False
elif data.dtype.names is not None:
hdu = fits.BinTableHDU(data=data, header=header)
else:
hdu = fits.ImageHDU(data=data, header=header)
hdus.append(hdu)
return fits.HDUList(hdus)
[docs]
class AsdfFitsConverter(FitsConverter):
tags = ("tag:stsci.edu:asdf/fits/fits-*",)
types = ()
[docs]
class AstropyFitsConverter(FitsConverter):
tags = ("tag:astropy.org:astropy/fits/fits-*",)
types = ("astropy.io.fits.hdu.hdulist.HDUList",)