Skip to content

Commit 64408ee

Browse files
committed
1 parent 34a0536 commit 64408ee

File tree

2 files changed

+81
-5
lines changed

2 files changed

+81
-5
lines changed

jdaviz/configs/default/aida.py

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,12 @@ def set_viewport(self, center=None, fov=None, image_label=None, **kwargs):
7070
elif hasattr(center, '__len__') and isinstance(center[0], (float, int)):
7171
reference_center_pix = center
7272

73+
else:
74+
raise ValueError(
75+
"The AID API supports `center` arguments as SkyCoords or as "
76+
f"a tuple of floats in pixel coordinates, got {type(center)=}."
77+
)
78+
7379
current_width = self.viewer.state.x_max - self.viewer.state.x_min
7480
current_height = self.viewer.state.y_max - self.viewer.state.y_min
7581

@@ -110,12 +116,14 @@ def _get_current_fov(self, sky_or_pixel):
110116
wcs = WCS(wcs.to_fits_sip())
111117

112118
lower_left, lower_right, upper_left = wcs.pixel_to_world(
113-
[x_min, y_min, x_min], [x_max, y_min, y_max]
119+
[x_min, x_max, x_min], [y_min, y_min, y_max]
120+
)
121+
return min(
122+
lower_left.separation(lower_right),
123+
lower_left.separation(upper_left),
114124
)
115-
116-
return lower_left.separation(lower_right)
117125
else:
118-
return x_max - x_min
126+
return min(abs(x_max - x_min), abs(y_max - y_min))
119127

120128
def get_viewport(self, sky_or_pixel=None, image_label=None, **kwargs):
121129
"""
@@ -165,6 +173,9 @@ def get_viewport(self, sky_or_pixel=None, image_label=None, **kwargs):
165173

166174
else:
167175
center = (center_x, center_y)
168-
fov = x_max - x_min
176+
fov = min(
177+
abs(x_max - x_min),
178+
abs(y_max - y_min)
179+
)
169180

170181
return dict(center=center, fov=fov, image_label=image_label)
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
import pytest
2+
import astropy.units as u
3+
import numpy as np
4+
from astropy.coordinates import SkyCoord
5+
from astropy.wcs import WCS
6+
from astropy.tests.helper import assert_quantity_allclose
7+
8+
9+
def assert_coordinate_close(coord1, coord2, atol=1 * u.arcsec):
10+
# check that two coordinates are within some separation tolerance
11+
separation = coord1.separation(coord2)
12+
assert_quantity_allclose(separation, desired=0*u.arcsec, atol=atol)
13+
14+
15+
def assert_angle_close(angle1, angle2, atol=1 * u.arcsec):
16+
# check that two angles are within some separation tolerance
17+
difference = abs(angle1 - angle2)
18+
assert_quantity_allclose(difference, desired=0*u.arcsec, atol=atol)
19+
20+
21+
def test_get_viewport(imviz_helper, image_hdu_wcs):
22+
imviz_helper.load_data(image_hdu_wcs)
23+
viewer = imviz_helper.app.get_viewer('imviz-0')
24+
viewport = viewer.aid.get_viewport()
25+
26+
expected_center = SkyCoord(ra=337.51894337, dec=-20.83208305, unit='deg')
27+
expected_fov = 0.00277778 * u.deg
28+
expected_image_label = imviz_helper.app.data_collection[0].label
29+
30+
# by default, the viewer y-axis is the narrower axis, which is used to
31+
# define the FOV parameter. Use the WCS to find what the actual
32+
# viewport dimensions are in the x-axis, which maps onto RA in this case:
33+
wcs = WCS(image_hdu_wcs.header)
34+
ra_unit = wcs.wcs.cunit[1]
35+
delta_ra = abs(wcs.wcs.cdelt[1])
36+
expected_fov = (
37+
abs(viewer.state.y_max - viewer.state.y_min) *
38+
delta_ra * u.Unit(ra_unit)
39+
)
40+
assert_coordinate_close(viewport['center'], expected_center)
41+
assert_angle_close(viewport['fov'], expected_fov)
42+
43+
assert viewport['image_label'] == expected_image_label
44+
45+
46+
def test_set_viewport(imviz_helper, image_hdu_wcs):
47+
imviz_helper.load_data(image_hdu_wcs)
48+
viewer = imviz_helper.app.get_viewer('imviz-0')
49+
50+
# change only the center:
51+
new_viewport_settings = dict(
52+
center=SkyCoord(ra=337.5, dec=-20.8, unit='deg'),
53+
fov=0.01 * u.deg
54+
)
55+
viewer.aid.set_viewport(**new_viewport_settings)
56+
new_viewport = viewer.aid.get_viewport()
57+
58+
assert_coordinate_close(new_viewport['center'], new_viewport_settings['center'])
59+
60+
# todo: investigate why this tolerance needs to be larger than expected:
61+
assert_angle_close(new_viewport['fov'], new_viewport_settings['fov'], atol=1 * u.arcsec)
62+
63+
with pytest.raises(ValueError, match='The AID API supports `center` arguments as'):
64+
viewer.aid.set_viewport(center=np.array([0, 1]))
65+

0 commit comments

Comments
 (0)