Source code for pylira.utils.io
import numpy as np
from astropy.io import fits
from astropy.table import Table
from astropy.wcs import WCS
[docs]def read_parameter_trace_file(filename, format="ascii"):
"""Read LIRA parameter output file
Parameters
----------
filename : str or Path
File name.
format : {"ascii", "fits"}
Table format
Returns
-------
table : `~astropy.table.Table`
Parameter table with one row per iteration.
"""
# TODO: maybe rename columns to more descriptive names
# and provide meta information
table = Table.read(filename, format=format)
return table
[docs]def read_image_trace_file(filename, format="ascii"):
"""Read LIRA image trace file
Parameters
----------
filename : str or Path
File name.
format : {"ascii", "fits"}
Table format
Returns
-------
trace : `~numpy.ndarray`
Three dimensional numpy array of the shape (niter, ny, nx)
representing the trace of the output image.
"""
if format == "ascii":
data = np.loadtxt(filename)
shape_y, shape_x = data.shape
n_iter = shape_y // shape_x
return data.reshape((n_iter, shape_x, shape_x))
elif format == "fits":
hdulist = fits.open(filename)
return hdulist["IMAGE_TRACE"].data
else:
raise ValueError(f"Not a supported format {format}")
[docs]def write_to_fits(result, filename, overwrite):
"""Write LIRA result to FITS.
Parameters
----------
result : `LIRADeconvolverResult`
Deconvolution result.
filename : `Path`
Output filename
overwrite : bool
Overwrite file.
"""
if result.wcs:
header = result.wcs.to_header()
else:
header = None
hdulist = fits.HDUList()
# Primary HDU
primary_hdu = fits.PrimaryHDU(
header=header,
data=result.posterior_mean,
)
hdulist.append(primary_hdu)
posterior_std_hdu = fits.ImageHDU(
data=result.posterior_std,
name="POSTERIOR_STD",
)
hdulist.append(posterior_std_hdu)
# Parameter trace HDU
table = result.parameter_trace.copy()
table.meta = None
parameter_trace_hdu = fits.BinTableHDU(table, name="PARAMETER_TRACE")
hdulist.append(parameter_trace_hdu)
# Image trace HDU
if result.image_trace is not None:
image_trace_hdu = fits.ImageHDU(data=result.image_trace, name="IMAGE_TRACE")
hdulist.append(image_trace_hdu)
# Config HDU
config_hdu = fits.BinTableHDU(result.config_table, name="CONFIG")
hdulist.append(config_hdu)
hdulist.writeto(filename, overwrite=overwrite)
[docs]def read_from_fits(filename):
"""Read LIRA result from FITS.
Parameters
----------
filename : `Path`
Output filename
Returns
-------
result : dict
Dictionary with init parameters for `LIRADeconvolverResult`
"""
hdulist = fits.open(filename)
wcs = WCS(hdulist["PRIMARY"].header)
config_table = Table.read(hdulist["CONFIG"])
config = dict(config_table[0])
paramter_trace = Table.read(hdulist["PARAMETER_TRACE"])
posterior_mean = hdulist["PRIMARY"].data
posterior_std = hdulist["POSTERIOR_STD"].data
# define location for lazy loading
image_trace = {"filename": filename, "format": "fits"}
return {
"posterior_mean": posterior_mean,
"posterior_std": posterior_std,
"config": config,
"parameter_trace": paramter_trace,
"image_trace": image_trace,
"wcs": wcs,
}
IO_FORMATS_WRITE = {"fits": write_to_fits}
IO_FORMATS_READ = {"fits": read_from_fits}