From f34b786fc0dacf0db65e03803e43ad3dc6f4fe31 Mon Sep 17 00:00:00 2001 From: "P. L. Lim" <2090236+pllim@users.noreply.github.com> Date: Thu, 25 Jul 2024 16:21:21 -0400 Subject: [PATCH] BUG: Fix MaNGA cube loading --- CHANGES.rst | 8 +++++ jdaviz/configs/cubeviz/plugins/parsers.py | 41 ++++++++++++++--------- jdaviz/core/template_mixin.py | 12 +++---- 3 files changed, 40 insertions(+), 21 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index da8f87b455..899604b7bc 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -71,6 +71,9 @@ Cubeviz - Spectral Extraction: renamed ``collapse_to_spectrum(...)`` to ``extract(...)``. [#2859] +- Generic FITS parsing now goes through ``specutils`` loaders first, if possible. + If a ``specutils`` loader is used, uncertainty is converted to standard deviation type. [#3119] + Imviz ^^^^^ @@ -109,6 +112,11 @@ Cubeviz - Mouse over coordinates now responds to the selected surface brightness unit. [#2931] +- Fixed MaNGA cube loading. Uncertainty type is also handled properly now. [#3119] + +- Fixed spectral axis value display in Markers plugin. Previously, it failed to display + very small values, resulting in zeroes. [#3119] + Imviz ^^^^^ diff --git a/jdaviz/configs/cubeviz/plugins/parsers.py b/jdaviz/configs/cubeviz/plugins/parsers.py index cedf8191ba..9bbc932865 100644 --- a/jdaviz/configs/cubeviz/plugins/parsers.py +++ b/jdaviz/configs/cubeviz/plugins/parsers.py @@ -5,7 +5,7 @@ import numpy as np from astropy import units as u from astropy.io import fits - +from astropy.nddata import StdDevUncertainty from astropy.time import Time from astropy.wcs import WCS from specutils import Spectrum1D @@ -68,11 +68,18 @@ def parse_data(app, file_obj, data_type=None, data_label=None, # generic enough to work with other file types (e.g. ASDF). For now, this # supports MaNGA and JWST data. if isinstance(file_obj, fits.hdu.hdulist.HDUList): - _parse_hdulist( - app, file_obj, file_name=data_label, - flux_viewer_reference_name=flux_viewer_reference_name, - uncert_viewer_reference_name=uncert_viewer_reference_name - ) + try: + _parse_spectrum1d_3d( + app, Spectrum1D.read(file_obj), data_label=data_label, + flux_viewer_reference_name=flux_viewer_reference_name, + uncert_viewer_reference_name=uncert_viewer_reference_name + ) + except Exception: # nosec + _parse_hdulist( + app, file_obj, file_name=data_label, + flux_viewer_reference_name=flux_viewer_reference_name, + uncert_viewer_reference_name=uncert_viewer_reference_name + ) elif isinstance(file_obj, str): if file_obj.lower().endswith('.gif'): # pragma: no cover _parse_gif(app, file_obj, data_label, @@ -129,11 +136,18 @@ def parse_data(app, file_obj, data_type=None, data_label=None, flux_viewer_reference_name=flux_viewer_reference_name, ) else: - _parse_hdulist( - app, hdulist, file_name=data_label or file_name, - flux_viewer_reference_name=flux_viewer_reference_name, - uncert_viewer_reference_name=uncert_viewer_reference_name - ) + try: + _parse_spectrum1d_3d( + app, Spectrum1D.read(hdulist), data_label=data_label or file_name, + flux_viewer_reference_name=flux_viewer_reference_name, + uncert_viewer_reference_name=uncert_viewer_reference_name + ) + except Exception: # nosec + _parse_hdulist( + app, hdulist, file_name=data_label or file_name, + flux_viewer_reference_name=flux_viewer_reference_name, + uncert_viewer_reference_name=uncert_viewer_reference_name + ) # If the data types are custom data objects, use explicit parsers. Note # that this relies on the glue-astronomy machinery to turn the data object @@ -412,10 +426,7 @@ def _parse_spectrum1d_3d(app, file_obj, data_label=None, if attr == "mask": flux = val << u.dimensionless_unscaled # DQ flags have no unit elif attr == "uncertainty": - if hasattr(val, "array"): - flux = u.Quantity(val.array, file_obj.flux.unit) - else: - continue + flux = val.represent_as(StdDevUncertainty).quantity else: flux = val diff --git a/jdaviz/core/template_mixin.py b/jdaviz/core/template_mixin.py index 67cbfcb610..7650f2c292 100644 --- a/jdaviz/core/template_mixin.py +++ b/jdaviz/core/template_mixin.py @@ -4546,24 +4546,24 @@ def float_precision(column, item): return f"{item:0.3f}" elif column in ('xcenter', 'ycenter'): return f"{item:0.1f}" - elif column in ('sum', ): + elif column in ('sum', 'spectral_axis'): return f"{item:.3e}" else: return f"{item:0.5f}" if isinstance(item, SkyCoord): return item.to_string('hmsdms', precision=4) - if isinstance(item, u.Quantity) and not np.isnan(item): + elif isinstance(item, u.Quantity) and not np.isnan(item): return f"{float_precision(column, item.value)} {item.unit.to_string()}" - if hasattr(item, 'to_string'): + elif hasattr(item, 'to_string'): return item.to_string() - if isinstance(item, float) and np.isnan(item): + elif isinstance(item, float) and np.isnan(item): return '' - if isinstance(item, tuple) and np.all([np.isnan(i) for i in item]): + elif isinstance(item, tuple) and np.all([np.isnan(i) for i in item]): return '' - if isinstance(item, float): + elif isinstance(item, float): return float_precision(column, item) elif isinstance(item, (list, tuple)): return [float_precision(column, i) if isinstance(i, float) else i for i in item]