diff options
author | sienkiew <sienkiew@stsci.edu> | 2014-03-25 10:53:08 -0400 |
---|---|---|
committer | sienkiew <sienkiew@stsci.edu> | 2014-03-25 10:53:08 -0400 |
commit | 5d00dcb1a0123389d9759698a5c42828e17af9bc (patch) | |
tree | ecef07881ea7b6b661ee5f59847b00dafecf3409 /stsci/sphere/test/test_skyline.py | |
parent | 64be292044c4428b5908acf5cc2dda6693ed1afb (diff) | |
download | stsci.sphere-5d00dcb1a0123389d9759698a5c42828e17af9bc.tar.gz |
mod for d2to1 install
git-svn-id: http://svn.stsci.edu/svn/ssb/stsci_python/stsci.sphere/trunk@30670 fe389314-cf27-0410-b35b-8c050e845b92
Former-commit-id: 91667828b7e01b5aae55679093564473a976e8a9
Diffstat (limited to 'stsci/sphere/test/test_skyline.py')
-rw-r--r-- | stsci/sphere/test/test_skyline.py | 225 |
1 files changed, 225 insertions, 0 deletions
diff --git a/stsci/sphere/test/test_skyline.py b/stsci/sphere/test/test_skyline.py new file mode 100644 index 0000000..929f0ba --- /dev/null +++ b/stsci/sphere/test/test_skyline.py @@ -0,0 +1,225 @@ +""" +SkyLine tests. + +:Author: Pey Lian Lim + +:Organization: Space Telescope Science Institute + +Examples +-------- +>>> cd path/to/project +>>> nosetests + +""" +from __future__ import absolute_import + +from copy import copy +from numpy.testing import assert_almost_equal + +from ..vector import vector_to_radec +from ..polygon import SphericalPolygon +from ..skyline import SkyLine + +from .test_util import ROOT_DIR +from .test_shared import resolve_imagename + + +#---------------------------------------# +# Load footprints used by all the tests # +#---------------------------------------# +f_2chipA = resolve_imagename(ROOT_DIR, '2chipA.fits') # ACS/WFC #1 +im_2chipA = SkyLine(f_2chipA) +f_2chipB = resolve_imagename(ROOT_DIR, '2chipB.fits') # ACS/WFC #2 +im_2chipB = SkyLine(f_2chipB) +f_2chipC = resolve_imagename(ROOT_DIR, '2chipC.fits') # WFC3/UVIS +im_2chipC = SkyLine(f_2chipC) +f_66_tan = resolve_imagename(ROOT_DIR, '1904-66_TAN.fits') +im_66_tan = SkyLine(f_66_tan, extname='primary') + + +#----- SHARED FUNCTIONS ----- + +def same_members(mem1, mem2): + assert len(mem1) == len(mem2) + + for m in mem1: + assert m in mem2 + + for m in mem2: + assert m in mem1 + +def subset_members(mem_child, mem_parent): + assert len(mem_parent) > len(mem_child) + + for m in mem_child: + assert m in mem_parent + +def subset_polygon(p_child, p_parent): + """Overlap not working. Do this instead until fixed.""" + assert p_parent.area() >= p_child.area() + assert p_parent.contains_point(p_child.inside) + +def no_polygon(p_child, p_parent): + """Overlap not working. Do this instead until fixed.""" + assert not p_parent.contains_point(p_child.inside) + + +#----- MEMBERSHIP ----- + +def do_member_overlap(im): + for m in im.members: + assert_almost_equal(m.polygon.overlap(im), 1.0) + +def test_membership(): + do_member_overlap(im_2chipA) + do_member_overlap(im_2chipB) + do_member_overlap(im_66_tan) + + assert len(im_2chipA.members) == 1 + assert im_2chipA.members[0].fname == f_2chipA + assert im_2chipA.members[0].ext == (1,4) + + +#----- COPY ----- + +def test_copy(): + a_copy = copy(im_2chipA) + assert a_copy is not im_2chipA + + +#----- SPHERICAL POLYGON RELATED ----- + +def test_sphericalpolygon(): + assert im_2chipA.contains_point(im_2chipA.inside) + + assert im_2chipA.intersects_poly(im_2chipB.polygon) + + assert im_2chipA.intersects_arc(im_2chipA.inside, im_2chipB.inside) + + assert im_2chipA.overlap(im_2chipB) < im_2chipA.overlap(im_2chipA) + + assert_almost_equal(im_2chipA.area(), im_2chipB.area()) + + ra_A, dec_A = im_2chipA.to_radec() + for i in xrange(len(im_2chipA.points)): + p = im_2chipA.points[i] + ra, dec = vector_to_radec(p[0], p[1], p[2], degrees=True) + assert_almost_equal(ra_A[i], ra) + assert_almost_equal(dec_A[i], dec) + + +#----- WCS ----- + +def test_wcs(): + wcs = im_2chipA.to_wcs() + new_p = SphericalPolygon.from_wcs(wcs) + subset_polygon(im_2chipA, new_p) + + +#----- UNION ----- + +def do_add_image(im1, im2): + u1 = im1.add_image(im2) + u2 = im2.add_image(im1) + + assert u1.same_points_as(u2) + same_members(u1.members, u2.members) + + all_mems = im1.members + im2.members + same_members(u1.members, all_mems) + + subset_polygon(im1, u1) + subset_polygon(im2, u1) + +def test_add_image(): + # Dithered + do_add_image(im_2chipA, im_2chipB) + + # Not related + do_add_image(im_2chipA, im_66_tan) + + +#----- INTERSECTION ----- + +def do_intersect_image(im1, im2): + i1 = im1.find_intersection(im2) + i2 = im2.find_intersection(im1) + + assert i1.same_points_as(i2) + same_members(i1.members, i2.members) + + if len(i1.points) > 0: + subset_members(im1.members, i1.members) + subset_members(im2.members, i1.members) + + subset_polygon(i1, im1) + subset_polygon(i1, im2) + +def test_find_intersection(): + # Dithered + do_intersect_image(im_2chipA, im_2chipB) + + # Not related + do_intersect_image(im_2chipA, im_66_tan) + + +#----- SKYLINE OVERLAP ----- + +def test_max_overlap(): + max_s, max_a = im_2chipA.find_max_overlap([im_2chipB, im_2chipC, im_66_tan]) + assert max_s is im_2chipB + assert_almost_equal(max_a, im_2chipA.intersection(im_2chipB).area()) + + max_s, max_a = im_2chipA.find_max_overlap([im_2chipB, im_2chipA]) + assert max_s is im_2chipA + assert_almost_equal(max_a, im_2chipA.area()) + +def test_max_overlap_pair(): + assert SkyLine.max_overlap_pair( + [im_2chipB, im_2chipC, im_2chipA, im_66_tan]) == (im_2chipB, im_2chipA) + + assert SkyLine.max_overlap_pair([im_2chipC, im_2chipA, im_66_tan]) is None + + +#----- INTENDED USE CASE ----- + +def test_science_1(): + mos, inc, exc = SkyLine.mosaic([im_2chipA, im_2chipB, im_2chipC, im_66_tan]) + + assert inc == [f_2chipA, f_2chipB] + assert exc == [f_2chipC, f_66_tan] + + subset_polygon(im_2chipA, mos) + subset_polygon(im_2chipB, mos) + + no_polygon(im_2chipC, mos) + no_polygon(im_66_tan, mos) + +def test_science_2(): + """Like `test_science_1` but different input order.""" + mos, inc, exc = SkyLine.mosaic([im_2chipB, im_66_tan, im_2chipC, im_2chipA]) + + assert inc == [f_2chipB, f_2chipA] + assert exc == [f_66_tan, f_2chipC] + + subset_polygon(im_2chipA, mos) + subset_polygon(im_2chipB, mos) + + no_polygon(im_2chipC, mos) + no_polygon(im_66_tan, mos) + + +#----- UNSTABLE ----- + +def DISABLED_unstable_overlap(): + i1 = im_2chipA.find_intersection(im_2chipB) + i2 = im_2chipB.find_intersection(im_2chipA) + + u1 = im_2chipA.add_image(im_2chipB) + u2 = im_2chipB.add_image(im_2chipA) + + # failed here before - known bug + # failure not always the same due to hash mapping + assert_almost_equal(i1.overlap(u1), 1.0) + assert_almost_equal(i1.overlap(i2), 1.0) + assert_almost_equal(u1.overlap(u2), 1.0) |