From 4a8bea215d30e67e4db1be4d3e9cb7dcc9dd73b8 Mon Sep 17 00:00:00 2001 From: gibsongreen Date: Thu, 29 Feb 2024 16:27:41 -0500 Subject: [PATCH 1/8] adjusting links to enable pixel, wavelength linking in specviz2d --- jdaviz/app.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/jdaviz/app.py b/jdaviz/app.py index 93d44aa55c..d10c42dc69 100644 --- a/jdaviz/app.py +++ b/jdaviz/app.py @@ -766,8 +766,13 @@ def _link_new_data(self, reference_data=None, data_to_be_linked=None): linked_data.ndim < 3 and # Cube linking requires special logic. See below ref_data.ndim < 3) ): - links = [LinkSame(linked_data.components[0], ref_data.components[0]), - LinkSame(linked_data.components[1], ref_data.components[1])] + if self.config == 'specviz2d': + links = [LinkSameWithUnits(linked_data.components[0], ref_data.components[1]), + LinkSameWithUnits(linked_data.components[1], ref_data.components[3])] + else: + links = [LinkSame(linked_data.components[0], ref_data.components[0]), + LinkSame(linked_data.components[1], ref_data.components[1])] + dc.add_link(links) return From d50e25874a88e470d9a1f96e06094922779a24fe Mon Sep 17 00:00:00 2001 From: gibsongreen Date: Fri, 8 Mar 2024 01:15:49 -0500 Subject: [PATCH 2/8] added changes log, pre-science test case that fails currently --- CHANGES.rst | 34 ++++++++++++++++++ jdaviz/tests/test_subsets.py | 70 ++++++++++++++++++++++++++++++++++++ 2 files changed, 104 insertions(+) diff --git a/CHANGES.rst b/CHANGES.rst index d26aac50df..9e732d5b5f 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -747,6 +747,40 @@ Specviz display label for the y axis in spectral viewer. Previously it was hard coded to always display ``flux density`` no matter the input unit. [#2703] +Specviz2d +^^^^^^^^^ + +Other Changes and Additions +--------------------------- + +3.8.3 (unreleased) +================== + +Bug Fixes +--------- + +- Fix redshifted line lists that were displaying at rest wavelengths, by assuming a global redshift. [#2726] + +- Order of RGB preset colors now matches for less than and greater than 5 layers. [#2731] + +- Fix subset linking/displaying between pixel/wavelength in Specviz2d viewers. [#2736] + +Cubeviz +^^^^^^^ + +Imviz +^^^^^ + +- Histogram in Plot Options no longer stalls for a very large image. [#2735] + +Mosviz +^^^^^^ + +Specviz +^^^^^^^ + +Specviz2d +^^^^^^^^^ 3.8.2 (2024-02-23) ================== diff --git a/jdaviz/tests/test_subsets.py b/jdaviz/tests/test_subsets.py index b00dd5f6be..e3f979c4e5 100644 --- a/jdaviz/tests/test_subsets.py +++ b/jdaviz/tests/test_subsets.py @@ -740,6 +740,76 @@ def test_only_overlapping_in_specviz2d(specviz2d_helper, mos_spectrum2d): assert reg[1].lower.value == 7600 and reg[1].upper.value == 7800 +def test_subset_linking_specviz2d(specviz2d_helper, mos_spectrum2d): + specviz2d_helper.load_data(spectrum_2d=mos_spectrum2d) + viewer_1d = specviz2d_helper.app.get_viewer( + specviz2d_helper._default_spectrum_viewer_reference_name) + viewer_2d = specviz2d_helper.app.get_viewer( + specviz2d_helper._default_spectrum_2d_viewer_reference_name) + + print(np.min(mos_spectrum2d.data)) + print(np.max(mos_spectrum2d.data)) + + # appear to be in meters + viewer_2d.apply_roi(XRangeROI(6400, 6800)) + + # reg1 = specviz2d_helper.app.get_subsets("Subset 1") + # print(reg1) + + # subset drawn in 2d viewer, want data in the 1d viewer + subset_drawn_2d = viewer_1d.native_marks[-1] + + # get x and y components to compute subset mask + y1 = subset_drawn_2d.y + x1 = subset_drawn_2d.x + + # print(len(y1)) + # print(len(x1)) + + sub_highlighted1 = x1[np.isfinite(y1)] + min_sub1 = np.min(sub_highlighted1) + max_sub1 = np.max(sub_highlighted1) + + # print(min_sub1) + # print(max_sub1) + + ''' + Need to update asserts with pixel to wavelength science case + ''' + + assert min_sub1 == 1 + assert max_sub1 == 1 + + # appear to be in meters + viewer_1d.apply_roi(XRangeROI(6000, 6400)) + + # reg2 = specviz2d_helper.app.get_subsets("Subset 1") + + # subset drawn in 1d viewer, want data in 2d viewer + subset_drawn_1d = viewer_1d.native_marks[-1] + + # get x and y components to compute subset mask + y2 = subset_drawn_1d.y + x2 = subset_drawn_1d.x + + sub_highlighted2 = x2[np.isfinite(y2)] + min_sub2 = np.min(sub_highlighted2) + max_sub2 = np.max(sub_highlighted2) + + # print(len(y2)) + # print(len(x2)) + + # reg2 = specviz2d_helper.app.get_subsets("Subset 1") + # print(reg2) + + ''' + Need to update asserts with wavelength to pixel science case + ''' + + assert min_sub2 == 1 + assert max_sub2 == 1 + + def test_multi_mask_subset(specviz_helper, spectrum1d): specviz_helper.load_data(spectrum1d) subset_plugin = specviz_helper.plugins['Subset Tools']._obj From 351b2eb2808ed172a1921f148200f0d3d3d7bdec Mon Sep 17 00:00:00 2001 From: gibsongreen Date: Fri, 8 Mar 2024 16:31:43 -0500 Subject: [PATCH 3/8] add link testing between viewers, drawing in 1d working in notebook, not in testing --- jdaviz/tests/test_subsets.py | 109 ++++++++++++++++++++--------------- 1 file changed, 64 insertions(+), 45 deletions(-) diff --git a/jdaviz/tests/test_subsets.py b/jdaviz/tests/test_subsets.py index e3f979c4e5..eb63cce136 100644 --- a/jdaviz/tests/test_subsets.py +++ b/jdaviz/tests/test_subsets.py @@ -1,6 +1,7 @@ import numpy as np import pytest from astropy import units as u +from astropy.wcs import WCS from astropy.tests.helper import assert_quantity_allclose from astropy.utils.data import get_pkg_data_filename from glue.core.roi import CircularROI, CircularAnnulusROI, EllipticalROI, RectangularROI @@ -740,74 +741,92 @@ def test_only_overlapping_in_specviz2d(specviz2d_helper, mos_spectrum2d): assert reg[1].lower.value == 7600 and reg[1].upper.value == 7800 -def test_subset_linking_specviz2d(specviz2d_helper, mos_spectrum2d): - specviz2d_helper.load_data(spectrum_2d=mos_spectrum2d) +def test_draw2d_linking_specviz2d(specviz2d_helper): + # custom test data to predict values for different viewers + header = { + 'WCSAXES': 2, + 'CRPIX1': 0.0, 'CRPIX2': 8.5, + 'CDELT1': 1E-06, 'CDELT2': 7.5E-05, + 'CUNIT1': 'm', 'CUNIT2': 'deg', + 'CTYPE1': 'WAVE', 'CTYPE2': 'OFFSET', + 'CRVAL1': 0.0, 'CRVAL2': 5.0, + 'RADESYS': 'ICRS', 'SPECSYS': 'BARYCENT'} + wcs = WCS(header) + + x_values = np.linspace(0, 10, 128) + y_values = np.linspace(0, 5, 256) + + # Create a continuous 2D + data = np.sin(x_values[:, np.newaxis]) * np.cos(y_values) * u.one + spectrum_data = Spectrum1D(data, wcs=wcs, meta=header) + + specviz2d_helper.load_data(spectrum_2d=spectrum_data) viewer_1d = specviz2d_helper.app.get_viewer( specviz2d_helper._default_spectrum_viewer_reference_name) viewer_2d = specviz2d_helper.app.get_viewer( specviz2d_helper._default_spectrum_2d_viewer_reference_name) - print(np.min(mos_spectrum2d.data)) - print(np.max(mos_spectrum2d.data)) - - # appear to be in meters - viewer_2d.apply_roi(XRangeROI(6400, 6800)) - - # reg1 = specviz2d_helper.app.get_subsets("Subset 1") - # print(reg1) - - # subset drawn in 2d viewer, want data in the 1d viewer + # create subset in 2d viewer, want data in 1d viewer + viewer_2d.apply_roi(XRangeROI(60, 80)) subset_drawn_2d = viewer_1d.native_marks[-1] # get x and y components to compute subset mask y1 = subset_drawn_2d.y x1 = subset_drawn_2d.x - # print(len(y1)) - # print(len(x1)) + subset_highlighted_region1 = x1[np.isfinite(y1)] + min_value_subset1 = np.min(subset_highlighted_region1) + max_value_subset1 = np.max(subset_highlighted_region1) - sub_highlighted1 = x1[np.isfinite(y1)] - min_sub1 = np.min(sub_highlighted1) - max_sub1 = np.max(sub_highlighted1) + tolerance1 = 1e-6 + expected_min1 = 6.e-5 + expected_max1 = 8.e-05 - # print(min_sub1) - # print(max_sub1) + assert np.allclose(min_value_subset1, expected_min1, atol=tolerance1) + assert np.allclose(max_value_subset1, expected_max1, atol=tolerance1) - ''' - Need to update asserts with pixel to wavelength science case - ''' - assert min_sub1 == 1 - assert max_sub1 == 1 +def test_draw1d_linking_specviz2d(specviz2d_helper): + # custom test data to predict values for different viewers + header = { + 'WCSAXES': 2, + 'CRPIX1': 0.0, 'CRPIX2': 8.5, + 'CDELT1': 1E-06, 'CDELT2': 7.5E-05, + 'CUNIT1': 'm', 'CUNIT2': 'deg', + 'CTYPE1': 'WAVE', 'CTYPE2': 'OFFSET', + 'CRVAL1': 0.0, 'CRVAL2': 5.0, + 'RADESYS': 'ICRS', 'SPECSYS': 'BARYCENT'} + wcs = WCS(header) - # appear to be in meters - viewer_1d.apply_roi(XRangeROI(6000, 6400)) + x_values = np.linspace(0, 10, 128) + y_values = np.linspace(0, 5, 256) - # reg2 = specviz2d_helper.app.get_subsets("Subset 1") + # Create a continuous 2D image + data = np.sin(x_values[:, np.newaxis]) * np.cos(y_values) * u.one + spectrum_data = Spectrum1D(data, wcs=wcs, meta=header) - # subset drawn in 1d viewer, want data in 2d viewer - subset_drawn_1d = viewer_1d.native_marks[-1] - - # get x and y components to compute subset mask - y2 = subset_drawn_1d.y - x2 = subset_drawn_1d.x + specviz2d_helper.load_data(spectrum_2d=spectrum_data) + viewer_1d = specviz2d_helper.app.get_viewer( + specviz2d_helper._default_spectrum_viewer_reference_name) + viewer_2d = specviz2d_helper.app.get_viewer( + specviz2d_helper._default_spectrum_2d_viewer_reference_name) - sub_highlighted2 = x2[np.isfinite(y2)] - min_sub2 = np.min(sub_highlighted2) - max_sub2 = np.max(sub_highlighted2) + # subset drawn in 1d viewer, want data in 2d viewer + viewer_1d.apply_roi(XRangeROI(.0001, .0002)) + subset_drawn_1d = viewer_2d.native_marks[-1].image - # print(len(y2)) - # print(len(x2)) + subset_highlighted_region2 = np.atleast_1d(np.nonzero(subset_drawn_1d))[1] - # reg2 = specviz2d_helper.app.get_subsets("Subset 1") - # print(reg2) + # Get the start and stop indices + min_value_subset2 = np.min(subset_highlighted_region2) + max_value_subset2 = np.max(subset_highlighted_region2) - ''' - Need to update asserts with wavelength to pixel science case - ''' + tolerance2 = 2 + expected_min2 = 338 + expected_max2 = 674 - assert min_sub2 == 1 - assert max_sub2 == 1 + assert np.allclose(min_value_subset2, expected_min2, atol=tolerance2) + assert np.allclose(max_value_subset2, expected_max2, atol=tolerance2) def test_multi_mask_subset(specviz_helper, spectrum1d): From d462f5389d8c063d0058c5ddfca3f1f994b95e52 Mon Sep 17 00:00:00 2001 From: gibsongreen Date: Thu, 23 Jan 2025 11:04:52 -0500 Subject: [PATCH 4/8] reconcile change log --- CHANGES.rst | 34 ++-------------------------------- 1 file changed, 2 insertions(+), 32 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index 9e732d5b5f..67f386ba6f 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -145,6 +145,8 @@ Specviz Specviz2d ^^^^^^^^^ +- Fix subset linking/displaying between pixel/wavelength in Specviz2d viewers. [#2736] + 4.1 (2024-12-23) ================ @@ -750,38 +752,6 @@ Specviz Specviz2d ^^^^^^^^^ -Other Changes and Additions ---------------------------- - -3.8.3 (unreleased) -================== - -Bug Fixes ---------- - -- Fix redshifted line lists that were displaying at rest wavelengths, by assuming a global redshift. [#2726] - -- Order of RGB preset colors now matches for less than and greater than 5 layers. [#2731] - -- Fix subset linking/displaying between pixel/wavelength in Specviz2d viewers. [#2736] - -Cubeviz -^^^^^^^ - -Imviz -^^^^^ - -- Histogram in Plot Options no longer stalls for a very large image. [#2735] - -Mosviz -^^^^^^ - -Specviz -^^^^^^^ - -Specviz2d -^^^^^^^^^ - 3.8.2 (2024-02-23) ================== From 10087c95192f8448f80bd01f170e82b4ee99c327 Mon Sep 17 00:00:00 2001 From: gibsongreen Date: Thu, 23 Jan 2025 11:08:08 -0500 Subject: [PATCH 5/8] add import --- jdaviz/tests/test_subsets.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/jdaviz/tests/test_subsets.py b/jdaviz/tests/test_subsets.py index eb63cce136..1588342fc3 100644 --- a/jdaviz/tests/test_subsets.py +++ b/jdaviz/tests/test_subsets.py @@ -4,7 +4,8 @@ from astropy.wcs import WCS from astropy.tests.helper import assert_quantity_allclose from astropy.utils.data import get_pkg_data_filename -from glue.core.roi import CircularROI, CircularAnnulusROI, EllipticalROI, RectangularROI +from glue.core.roi import CircularROI, CircularAnnulusROI, EllipticalROI, RectangularROI, XRangeROI + from glue.core.subset_group import GroupedSubset from regions import (PixCoord, CirclePixelRegion, CircleSkyRegion, RectanglePixelRegion, EllipsePixelRegion, CircleAnnulusPixelRegion) From 83d2c96159f10d580134db320ec6db706f7efb0f Mon Sep 17 00:00:00 2001 From: gibsongreen Date: Thu, 30 Jan 2025 16:12:12 -0500 Subject: [PATCH 6/8] temporarily remove test to run CI --- jdaviz/tests/test_subsets.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/jdaviz/tests/test_subsets.py b/jdaviz/tests/test_subsets.py index 1588342fc3..36119e2fba 100644 --- a/jdaviz/tests/test_subsets.py +++ b/jdaviz/tests/test_subsets.py @@ -787,6 +787,7 @@ def test_draw2d_linking_specviz2d(specviz2d_helper): assert np.allclose(max_value_subset1, expected_max1, atol=tolerance1) +''' def test_draw1d_linking_specviz2d(specviz2d_helper): # custom test data to predict values for different viewers header = { @@ -803,7 +804,7 @@ def test_draw1d_linking_specviz2d(specviz2d_helper): y_values = np.linspace(0, 5, 256) # Create a continuous 2D image - data = np.sin(x_values[:, np.newaxis]) * np.cos(y_values) * u.one + data = np.sin(x_values[:, np.newaxis]) * np.cos(y_values) * u.Jy spectrum_data = Spectrum1D(data, wcs=wcs, meta=header) specviz2d_helper.load_data(spectrum_2d=spectrum_data) @@ -814,21 +815,23 @@ def test_draw1d_linking_specviz2d(specviz2d_helper): # subset drawn in 1d viewer, want data in 2d viewer viewer_1d.apply_roi(XRangeROI(.0001, .0002)) - subset_drawn_1d = viewer_2d.native_marks[-1].image + #subset_drawn_1d = viewer_2d.native_marks[-1].image - subset_highlighted_region2 = np.atleast_1d(np.nonzero(subset_drawn_1d))[1] + subset_highlighted_region2 = np.atleast_1d(np.nonzero(subset_drawn_1d))[0] # Get the start and stop indices min_value_subset2 = np.min(subset_highlighted_region2) max_value_subset2 = np.max(subset_highlighted_region2) tolerance2 = 2 - expected_min2 = 338 - expected_max2 = 674 + expected_min2 = 209 + expected_max2 = 300 assert np.allclose(min_value_subset2, expected_min2, atol=tolerance2) assert np.allclose(max_value_subset2, expected_max2, atol=tolerance2) + ''' + def test_multi_mask_subset(specviz_helper, spectrum1d): specviz_helper.load_data(spectrum1d) From a33e32574dfa36b28961ca634e0d042c27ccfaa1 Mon Sep 17 00:00:00 2001 From: gibsongreen Date: Tue, 4 Feb 2025 09:32:56 -0500 Subject: [PATCH 7/8] update linking, verify subsetcreatemessage issue with test --- jdaviz/app.py | 13 +++++++++++-- jdaviz/tests/test_subsets.py | 31 +++++++++++++++++++------------ 2 files changed, 30 insertions(+), 14 deletions(-) diff --git a/jdaviz/app.py b/jdaviz/app.py index d10c42dc69..184e44ef28 100644 --- a/jdaviz/app.py +++ b/jdaviz/app.py @@ -767,8 +767,17 @@ def _link_new_data(self, reference_data=None, data_to_be_linked=None): ref_data.ndim < 3) ): if self.config == 'specviz2d': - links = [LinkSameWithUnits(linked_data.components[0], ref_data.components[1]), - LinkSameWithUnits(linked_data.components[1], ref_data.components[3])] + links = [] + if linked_data.ndim == 2: + # extracted image added to data collection + ref_wavelength_component = ref_data.components[1] + else: + # extracted spectrum added to data collection + ref_wavelength_component = ref_data.components[3] + links += [LinkSameWithUnits(linked_data.components[0], ref_data.components[1])] + + links += [LinkSameWithUnits(linked_data.components[0], ref_data.components[0]), + LinkSameWithUnits(linked_data.components[1], ref_wavelength_component)] else: links = [LinkSame(linked_data.components[0], ref_data.components[0]), LinkSame(linked_data.components[1], ref_data.components[1])] diff --git a/jdaviz/tests/test_subsets.py b/jdaviz/tests/test_subsets.py index 36119e2fba..0492214b8b 100644 --- a/jdaviz/tests/test_subsets.py +++ b/jdaviz/tests/test_subsets.py @@ -791,13 +791,14 @@ def test_draw2d_linking_specviz2d(specviz2d_helper): def test_draw1d_linking_specviz2d(specviz2d_helper): # custom test data to predict values for different viewers header = { - 'WCSAXES': 2, - 'CRPIX1': 0.0, 'CRPIX2': 8.5, - 'CDELT1': 1E-06, 'CDELT2': 7.5E-05, - 'CUNIT1': 'm', 'CUNIT2': 'deg', - 'CTYPE1': 'WAVE', 'CTYPE2': 'OFFSET', - 'CRVAL1': 0.0, 'CRVAL2': 5.0, - 'RADESYS': 'ICRS', 'SPECSYS': 'BARYCENT'} + 'WCSAXES': 2, + + 'CRPIX1': 0.0, 'CRPIX2': 8.5, + 'CDELT1': 1E-06, 'CDELT2': 7.5E-05, + 'CUNIT1': 'm', 'CUNIT2': 'deg', + 'CTYPE1': 'WAVE', 'CTYPE2': 'OFFSET', + 'CRVAL1': 0.0, 'CRVAL2': 5.0, + 'RADESYS': 'ICRS', 'SPECSYS': 'BARYCENT'} wcs = WCS(header) x_values = np.linspace(0, 10, 128) @@ -808,16 +809,23 @@ def test_draw1d_linking_specviz2d(specviz2d_helper): spectrum_data = Spectrum1D(data, wcs=wcs, meta=header) specviz2d_helper.load_data(spectrum_2d=spectrum_data) + se = specviz2d_helper.plugins['Spectral Extraction'] + se.export_extract() + viewer_1d = specviz2d_helper.app.get_viewer( specviz2d_helper._default_spectrum_viewer_reference_name) viewer_2d = specviz2d_helper.app.get_viewer( specviz2d_helper._default_spectrum_2d_viewer_reference_name) # subset drawn in 1d viewer, want data in 2d viewer - viewer_1d.apply_roi(XRangeROI(.0001, .0002)) - #subset_drawn_1d = viewer_2d.native_marks[-1].image + spec_reg = SpectralRegion(0. * u.m, 10000000 * u.m) + spec_reg = SpectralRegion(0.0001 * u.m, .0002 * u.m) + st = specviz2d_helper.plugins['Subset Tools'] + st.import_region(spec_reg) + + subset_drawn_1d = viewer_2d.native_marks[-1] - subset_highlighted_region2 = np.atleast_1d(np.nonzero(subset_drawn_1d))[0] + subset_highlighted_region2 = np.atleast_1d(np.nonzero(subset_drawn_1d))[1] # Get the start and stop indices min_value_subset2 = np.min(subset_highlighted_region2) @@ -829,8 +837,7 @@ def test_draw1d_linking_specviz2d(specviz2d_helper): assert np.allclose(min_value_subset2, expected_min2, atol=tolerance2) assert np.allclose(max_value_subset2, expected_max2, atol=tolerance2) - - ''' +''' def test_multi_mask_subset(specviz_helper, spectrum1d): From 540fa642b67590d1e0b584dbdba3ac56561e684e Mon Sep 17 00:00:00 2001 From: gibsongreen Date: Tue, 4 Feb 2025 09:44:05 -0500 Subject: [PATCH 8/8] update change log/rebase --- CHANGES.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGES.rst b/CHANGES.rst index 67f386ba6f..433168bdce 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -114,6 +114,8 @@ Specviz Specviz2d ^^^^^^^^^ +- Fix subset linking/displaying between pixel/wavelength in Specviz2d viewers. [#2736] + 4.1.1 (2025-01-31) ================== @@ -145,8 +147,6 @@ Specviz Specviz2d ^^^^^^^^^ -- Fix subset linking/displaying between pixel/wavelength in Specviz2d viewers. [#2736] - 4.1 (2024-12-23) ================