Source code for jdaviz.configs.specviz2d.plugins.parsers
from pathlib import Path
from specutils import Spectrum1D
from astropy.io import fits
import astropy.units as u
import numpy as np
from jdaviz.core.registries import data_parser_registry
from jdaviz.utils import standardize_metadata, PRIHDR_KEY
__all__ = ['spec2d_1d_parser']
def _check_is_file(path):
return isinstance(path, str) and Path(path).is_file()
[docs]
@data_parser_registry("spec2d-1d-parser")
def spec2d_1d_parser(app, data_obj, data_label=None, show_in_viewer=True):
"""
Generate a quicklook 1D spectrum from an input 2D spectrum by summing
over the cross-dispersion axis.
Notes
-----
This currently only works with JWST-type data in which the data is in the
second hdu of the fits file.
Parameters
----------
app : `~jdaviz.app.Application`
The application-level object used to reference the viewers.
data_obj : str or list or spectrum-like
File path, list, or spectrum-like object to be read as a new row in
the mosviz table.
data_labels : str, optional
The label applied to the glue data component.
"""
if _check_is_file(data_obj):
with fits.open(data_obj) as hdulist:
data = hdulist[1].data
header = hdulist[1].header
prihdr = hdulist[0].header
# Should only be 2D, so DISPAXIS-1 should be 0 or -1 and sum over the
# correct axis. If Unit doesn't understand the BUNIT we leave flux
# unitless
try:
flux = np.sum(data, header['DISPAXIS']-1)*u.Unit(header["BUNIT"])
except ValueError:
flux = u.Quantity(np.sum(data, header['DISPAXIS']-1))
if "WAVEND" in header and "WAVSTART" in header:
step = (header["WAVEND"] - header["WAVSTART"]) / flux.size
spectral_axis = np.arange(header["WAVSTART"], header["WAVEND"],
step) * u.m
else:
# u.Unit("m") is used if WAVEND and WAVSTART are present so
# we use it here as well, even though the actual unit is pixels
spectral_axis = np.arange(1, flux.size + 1, 1) * u.m
metadata = standardize_metadata(header)
metadata[PRIHDR_KEY] = standardize_metadata(prihdr)
data_obj = Spectrum1D(flux, spectral_axis=spectral_axis, meta=metadata)
data_label = app.return_data_label(data_label, alt_name="specviz2d_data")
app.data_collection[data_label] = data_obj
else:
raise NotImplementedError("Spectrum2d parser only takes a filename")
if show_in_viewer:
app.add_data_to_viewer(
app._default_spectrum_viewer_reference_name, data_label
)