From fb23045235eb6838c713e30647cdd032d3da6400 Mon Sep 17 00:00:00 2001 From: Kyle Conroy Date: Tue, 21 Jan 2025 11:36:07 -0500 Subject: [PATCH] add custom parser for specreduce trace objects --- jdaviz/configs/mosviz/plugins/parsers.py | 30 +++++++++++++++++++++++- jdaviz/configs/specviz/helper.py | 6 ++--- jdaviz/core/data_formats.py | 22 +++++++++++++++++ 3 files changed, 54 insertions(+), 4 deletions(-) diff --git a/jdaviz/configs/mosviz/plugins/parsers.py b/jdaviz/configs/mosviz/plugins/parsers.py index 689044f1bc..59893a3657 100644 --- a/jdaviz/configs/mosviz/plugins/parsers.py +++ b/jdaviz/configs/mosviz/plugins/parsers.py @@ -18,7 +18,7 @@ from jdaviz.core.events import SnackbarMessage from jdaviz.utils import standardize_metadata, PRIHDR_KEY, download_uri_to_path -__all__ = ['mos_spec1d_parser', 'mos_spec2d_parser', 'mos_image_parser'] +__all__ = ['mos_spec1d_parser', 'mos_spec2d_parser', 'mos_image_parser', 'specreduce_trace_parser'] FALLBACK_NAME = "Unspecified" EXPECTED_FILES = {"niriss": ['1D Spectra C', '1D Spectra R', @@ -403,6 +403,34 @@ def _parse_as_spectrum1d(hdulist, ext, transpose): return len(data_obj) +@data_parser_registry("specreduce-trace") +def specreduce_trace_parser(app, data_obj, data_label=None, show_in_viewer=False): + """ + Loads a specreduce trace object. + + 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_label : str, optional + The label applied to the glue data component. + show_in_viewer : bool + Show data in viewer(s). + """ + spectrum_2d_viewer_reference_name = ( + getattr(app._jdaviz_helper, "_default_spectrum_2d_viewer_reference_name", None) + ) + + app.add_data(data_obj, data_label=data_label) + if show_in_viewer and spectrum_2d_viewer_reference_name: + app.add_data_to_viewer( + spectrum_2d_viewer_reference_name, data_label + ) + + def _load_fits_image_from_filename(filename, app): with fits.open(filename) as hdulist: # We do not use the generated labels diff --git a/jdaviz/configs/specviz/helper.py b/jdaviz/configs/specviz/helper.py index 7f123ea803..c9ffa8d51f 100644 --- a/jdaviz/configs/specviz/helper.py +++ b/jdaviz/configs/specviz/helper.py @@ -75,9 +75,10 @@ def load_data(self, data, data_label=None, format=None, show_in_viewer=True, `~astroquery.mast.Conf.timeout`). """ from jdaviz.core import data_formats - format, conf = data_formats.get_valid_format(data) - parsers = {'specviz': 'specviz-spectrum1d-parser', 'specviz2d': 'mosviz-spec2d-parser'} + parser = data_formats.get_parser(data) + parser_kwargs = {'mosviz-spec2d-parser': {}, + 'specreduce-trace': {'show_in_viewer': show_in_viewer}, 'specviz-spectrum1d-parser': {'format': format, 'show_in_viewer': show_in_viewer, 'concat_by_file': concat_by_file, @@ -85,7 +86,6 @@ def load_data(self, data, data_label=None, format=None, show_in_viewer=True, 'local_path': local_path, 'timeout': timeout, 'load_as_list': load_as_list}} - parser = parsers.get(conf) kwargs = parser_kwargs.get(parser, {}) super().load_data(data, parser_reference=parser, diff --git a/jdaviz/core/data_formats.py b/jdaviz/core/data_formats.py index 88ceff8741..8f19ce64f2 100644 --- a/jdaviz/core/data_formats.py +++ b/jdaviz/core/data_formats.py @@ -8,6 +8,7 @@ from specutils.io.registers import identify_spectrum_format from specutils import Spectrum1D, SpectrumList, SpectrumCollection +from specreduce.tracing import Trace from stdatamodels import asdf_in_fits from jdaviz.core.config import list_configurations @@ -90,6 +91,27 @@ def get_valid_format(filename): return valid_file_format, recommended_config +def get_parser(obj): + """ + Identify the data parser from a filename or data object + + Parameters + ---------- + obj : str or `pathlib.Path` or file-like object + The filename of the loaded data + + Returns + ------- + parser : str + The parser for the data object + """ + if isinstance(obj, Trace): + return 'specreduce-trace' + _, config = get_valid_format(obj) + parsers = {'specviz': 'specviz-spectrum1d-parser', 'specviz2d': 'mosviz-spec2d-parser'} + return parsers.get(config) + + def identify_data(filename, current=None): """Identify the data format and application configuration from a filename.