summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorlim <lim@stsci.edu>2012-06-21 15:14:44 -0400
committerlim <lim@stsci.edu>2012-06-21 15:14:44 -0400
commit1121435a46e8796e83649003ea232eb6e2f4152c (patch)
treec1eab0e1278415d8ee2c1b42a28f9276fb921c07
parentca973fa7003fe9f4ea4d2db3fcca7fe9cdecef16 (diff)
downloadstsci.sphere-1121435a46e8796e83649003ea232eb6e2f4152c.tar.gz
lim added minor skyline doc and finished skyline tests
git-svn-id: http://svn.stsci.edu/svn/ssb/stsci_python/stsci_python/branches/sphere@17465 fe389314-cf27-0410-b35b-8c050e845b92 Former-commit-id: 4d99fa976cbdf1fbdf9b23abb8ab899f8fa3043d
-rw-r--r--lib/skyline.py4
-rw-r--r--lib/test/test_skyline.py127
2 files changed, 104 insertions, 27 deletions
diff --git a/lib/skyline.py b/lib/skyline.py
index 8a9755f..10c1c65 100644
--- a/lib/skyline.py
+++ b/lib/skyline.py
@@ -312,7 +312,7 @@ class SkyLine(object):
-------
max_skyline: `SkyLine` instance or `None`
`SkyLine` that overlaps the most or `None` if no
- overlap found.
+ overlap found. This is *not* a copy.
max_overlap_area: float
Area of intersection.
@@ -345,7 +345,7 @@ class SkyLine(object):
max_pair: tuple
Pair of `SkyLine` instances with max overlap
among given *skylines*. If no overlap found,
- return `None`.
+ return `None`. These are *not* copies.
"""
max_pair = None
diff --git a/lib/test/test_skyline.py b/lib/test/test_skyline.py
index 24cdce7..1ce3e09 100644
--- a/lib/test/test_skyline.py
+++ b/lib/test/test_skyline.py
@@ -16,6 +16,8 @@ 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
@@ -37,14 +39,29 @@ im_66_tan = SkyLine(f_66_tan, extname='primary')
#----- SHARED FUNCTIONS -----
-def compare_members(im1, im2):
- assert len(im1.members) == len(im2.members)
+def same_members(mem1, mem2):
+ assert len(mem1) == len(mem2)
- for m in im1.members:
- assert m in im2.members
+ for m in mem1:
+ assert m in mem2
- for m in im2.members:
- assert m in im1.members
+ 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 -----
@@ -76,11 +93,30 @@ def test_copy():
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())
+ radecs = 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(radecs[i][0], ra)
+ assert_almost_equal(radecs[i][1], dec)
+
+
+#----- WCS -----
+
+def test_wcs():
+ wcs = im_2chipA.to_wcs()
+ new_p = SphericalPolygon.from_wcs(wcs)
+ subset_polygon(im_2chipA, new_p)
+
#----- UNION -----
@@ -89,9 +125,15 @@ def do_add_image(im1, im2):
u2 = im2.add_image(im1)
assert u1.same_points_as(u2)
- compare_members(u1, u2)
+ same_members(u1.members, u2.members)
+
+ all_mems = im1.members + im2.members
+ same_members(u1.members, all_mems)
-def test_add_image():
+ subset_polygon(im1, u1)
+ subset_polygon(im2, u1)
+
+def test_add_image():
# Dithered
do_add_image(im_2chipA, im_2chipB)
@@ -99,14 +141,21 @@ def test_add_image():
do_add_image(im_2chipA, im_66_tan)
-# ----- INTERSECTION -----
+#----- INTERSECTION -----
def do_intersect_image(im1, im2):
i1 = im1.find_intersection(im2)
i2 = im2.find_intersection(im1)
assert i1.same_points_as(i2)
- compare_members(i1, 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
@@ -116,35 +165,63 @@ def test_find_intersection():
do_intersect_image(im_2chipA, im_66_tan)
-# ----- INTENDED USE CASE -----
+#----- 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())
-def NOT_DONE_science():
+ 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]
- assert_almost_equal(im_2chipA.overlap(mos), 1.0)
- assert_almost_equal(im_2chipB.overlap(mos), 1.0)
-
- assert_almost_equal(im_2chipC.overlap(mos), 0.0)
- assert_almost_equal(im_66_tan.overlap(mos), 0.0)
+ subset_polygon(im_2chipA, mos)
+ subset_polygon(im_2chipB, mos)
+ no_polygon(im_2chipC, mos)
+ no_polygon(im_66_tan, mos)
-# ----- UNSTABLE -----
+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_overlap_1():
- i1 = im_2chipA.find_intersection(im_2chipB)
- i2 = im_2chipB.find_intersection(im_2chipA)
- assert_almost_equal(i1.overlap(i2), 1.0) # ok if ran alone
-
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 - 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) # failed here - known bug
+ assert_almost_equal(i1.overlap(i2), 1.0)
assert_almost_equal(u1.overlap(u2), 1.0)