# -*- mode: python; coding: utf-8 -* # Copyright (c) 2018 Radio Astronomy Software Group # Licensed under the 2-clause BSD License """Tests for telescope objects and functions. """ from __future__ import absolute_import, division, print_function import numpy as np import pytest import pyuvdata required_parameters = ['_telescope_name', '_telescope_location'] required_properties = ['telescope_name', 'telescope_location'] extra_parameters = ['_antenna_diameters'] extra_properties = ['antenna_diameters'] other_attributes = ['citation', 'telescope_location_lat_lon_alt', 'telescope_location_lat_lon_alt_degrees', 'pyuvdata_version_str'] expected_known_telescopes = ['PAPER', 'HERA', 'MWA'] # Tests for Telescope object def test_parameter_iter(): "Test expected parameters." telescope_obj = pyuvdata.Telescope() all = [] for prop in telescope_obj: all.append(prop) for a in required_parameters: assert a in all, 'expected attribute ' + a + ' not returned in object iterator' def test_required_parameter_iter(): "Test expected required parameters." telescope_obj = pyuvdata.Telescope() required = [] for prop in telescope_obj.required(): required.append(prop) for a in required_parameters: assert a in required, 'expected attribute ' + a + ' not returned in required iterator' def test_extra_parameter_iter(): "Test expected optional parameters." telescope_obj = pyuvdata.Telescope() extra = [] for prop in telescope_obj.extra(): extra.append(prop) for a in extra_parameters: a in extra, 'expected attribute ' + a + ' not returned in extra iterator' def test_unexpected_parameters(): "Test for extra parameters." telescope_obj = pyuvdata.Telescope() expected_parameters = required_parameters + extra_parameters attributes = [i for i in list(telescope_obj.__dict__.keys()) if i[0] == '_'] for a in attributes: assert a in expected_parameters, 'unexpected parameter ' + a + ' found in Telescope' def test_unexpected_attributes(): "Test for extra attributes." telescope_obj = pyuvdata.Telescope() expected_attributes = required_properties + other_attributes attributes = [i for i in list(telescope_obj.__dict__.keys()) if i[0] != '_'] for a in attributes: assert a in expected_attributes, 'unexpected attribute ' + a + ' found in Telescope' def test_properties(): "Test that properties can be get and set properly." telescope_obj = pyuvdata.Telescope() prop_dict = dict(list(zip(required_properties, required_parameters))) for k, v in prop_dict.items(): rand_num = np.random.rand() setattr(telescope_obj, k, rand_num) this_param = getattr(telescope_obj, v) try: assert rand_num == this_param.value except(AssertionError): print('setting {prop_name} to a random number failed'.format(prop_name=k)) raise def test_known_telescopes(): """Test known_telescopes function returns expected results.""" # using np.sort here and casting to list instead of .sort() since .sort() acts inplace and returns None assert np.sort(pyuvdata.known_telescopes()).tolist() == np.sort(expected_known_telescopes).tolist() def test_get_telescope(): for inst in pyuvdata.known_telescopes(): telescope_obj = pyuvdata.get_telescope(inst) assert telescope_obj.telescope_name == inst def test_get_telescope_center_xyz(): ref_xyz = (-2562123.42683, 5094215.40141, -2848728.58869) ref_latlonalt = (-26.7 * np.pi / 180.0, 116.7 * np.pi / 180.0, 377.8) test_telescope_dict = {'test': {'center_xyz': ref_xyz, 'latitude': None, 'longitude': None, 'altitude': None, 'citation': ''}, 'test2': {'center_xyz': ref_xyz, 'latitude': ref_latlonalt[0], 'longitude': ref_latlonalt[1], 'altitude': ref_latlonalt[2], 'citation': ''}} telescope_obj = pyuvdata.get_telescope('test', telescope_dict_in=test_telescope_dict) telescope_obj_ext = pyuvdata.Telescope() telescope_obj_ext.citation = '' telescope_obj_ext.telescope_name = 'test' telescope_obj_ext.telescope_location = ref_xyz assert telescope_obj == telescope_obj_ext telescope_obj_ext.telescope_name = 'test2' telescope_obj2 = pyuvdata.get_telescope('test2', telescope_dict_in=test_telescope_dict) assert telescope_obj2 == telescope_obj_ext def test_get_telescope_no_loc(): test_telescope_dict = {'test': {'center_xyz': None, 'latitude': None, 'longitude': None, 'altitude': None, 'citation': ''}} pytest.raises(ValueError, pyuvdata.get_telescope, 'test', telescope_dict_in=test_telescope_dict)