summaryrefslogtreecommitdiff
path: root/stsci/sphere/test/test_skyline.py
diff options
context:
space:
mode:
Diffstat (limited to 'stsci/sphere/test/test_skyline.py')
-rw-r--r--stsci/sphere/test/test_skyline.py225
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)