|
| 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