diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/graph.py | 6 | ||||
-rw-r--r-- | lib/great_circle_arc.py | 3 | ||||
-rw-r--r-- | lib/polygon.py | 9 | ||||
-rw-r--r-- | lib/skyline.py | 117 |
4 files changed, 86 insertions, 49 deletions
diff --git a/lib/graph.py b/lib/graph.py index e9f03ba..25fc80c 100644 --- a/lib/graph.py +++ b/lib/graph.py @@ -45,10 +45,8 @@ import weakref import numpy as np # LOCAL -#from . import great_circle_arc -#from . import vector -import great_circle_arc -import vector +from sphere import great_circle_arc +from sphere import vector # Set to True to enable some sanity checks DEBUG = False diff --git a/lib/great_circle_arc.py b/lib/great_circle_arc.py index 0fff174..056857d 100644 --- a/lib/great_circle_arc.py +++ b/lib/great_circle_arc.py @@ -48,8 +48,7 @@ import numpy as np try: - #from . import math_util - import math_util + from sphere import math_util HAS_C_UFUNCS = True except ImportError: HAS_C_UFUNCS = False diff --git a/lib/polygon.py b/lib/polygon.py index 8388e2a..7e76baa 100644 --- a/lib/polygon.py +++ b/lib/polygon.py @@ -45,10 +45,8 @@ from copy import copy import numpy as np # LOCAL -#from . import great_circle_arc -#from . import vector -import great_circle_arc -import vector +from sphere import great_circle_arc +from sphere import vector __all__ = ['SphericalPolygon'] @@ -93,6 +91,9 @@ class SphericalPolygon(object): def __copy__(self): return self.__class__(np.copy(self._points), np.copy(self._inside)) + def __repr__(self): + return 'SphericalPolygon(%r, %r)' % (self.points, self.inside) + @property def points(self): """ diff --git a/lib/skyline.py b/lib/skyline.py index a8e27a2..df6a390 100644 --- a/lib/skyline.py +++ b/lib/skyline.py @@ -7,7 +7,7 @@ generalized steps:: #. Initialize SkyLine objects for each input image. This object would be the union of all the input image's individual chips WCS footprints. - + #. Determine overlap between all images. The determination would employ a recursive operation to return the extended list of all overlap values @@ -18,19 +18,19 @@ generalized steps:: pair which produces the largest overlap with the first input image. This defines the initial reference SkyLine object. - + #. Perform some operation on the 2 images: for example, match sky in intersecting regions, or aligning second image with the first (reference) image. - + #. Update the second image, either apply the sky value or correct the WCS, then generate a new SkyLine object for that image. - + #. Create a new reference SkyLine object as the union of the initial reference object and the newly updated SkyLine object. - + #. Repeat Steps 2-6 for all remaining input images. This process will work reasonably fast as most operations @@ -55,15 +55,55 @@ from __future__ import division, print_function # THIRD-PARTY import pyfits -from stwcs import wcsutil +from stwcs import wcsutil # LOCAL -from polygon import SphericalPolygon +from sphere.polygon import SphericalPolygon __all__ = ['SkyLine'] +__version__ = '0.1a' +__vdate__ = '31-May-2012' + +class SkyLineMember(object): + def __init__(self, fname, ext): + """Container for SkyLine members. + + Given FITS image and extension, will store its SphericalPolygon + instance from WCS under `polygon`. + + self: obj + SkyLineMember instance. + + fname: str + FITS image. + + ext: int + Image extension. + + """ + self._fname = fname + self._ext = ext + self._polygon = SphericalPolygon.from_wcs( + wcsutil.HSTWCS(fname, ext=ext)) + + def __repr__(self): + return 'SkyLineMember(%r, %r, %r)' % (self.fname, self.ext, + self.polygon) + + @property + def fname(self): + return self._fname + + @property + def ext(self): + return self._ext + + @property + def polygon(self): + return self._polygon class SkyLine(SphericalPolygon): - + def __init__(self, fname): """Initialize SkyLine object instance. @@ -74,47 +114,46 @@ class SkyLine(SphericalPolygon): fname: str FITS image. + + """ + # Inherit from SphericalPolygon + SphericalPolygon.__init__(self, [], None) - """ - # Find SCI extensions + # Convert SCI data to SkyLineMember + poly_list = [] with pyfits.open(fname) as pf: - sci_extnum = tuple([i for i,ext in enumerate(pf) if - 'SCI' in ext.name.upper()]) - assert len(sci_extnum) > 0, \ - 'SkyLine cannot find SCI ext in {}.'.format(fname) + for i,ext in enumerate(pf): + if 'SCI' in ext.name.upper(): + poly_list.append(SkyLineMember(fname, i)) - # Initialize mosaic with first chip - all_sph = SphericalPolygon.from_wcs( - wcsutil.HSTWCS(fname, ext=sci_extnum[0])) + assert len(poly_list) > 0, \ + 'SkyLine cannot find SCI ext in {}.'.format(fname) - # Mosaic all the chips - for i in sci_extnum[1:]: - prev_sph = all_sph.__copy__() - - cur_sph = SphericalPolygon.from_wcs( - wcsutil.HSTWCS(fname, ext=i)) - - all_sph = prev_sph.union(cur_sph) + self._members = poly_list - # SkyLine = final mosaic inheriting from SphericalPolygon - SphericalPolygon.__init__(self, all_sph.points, all_sph.inside) + # Put mosaic of all the chips in SkyLine + mosaic = SphericalPolygon.multi_union(self.polygons) + self._points = mosaic.points + self._inside = mosaic.inside - # Add attribute to track images in SkyLine - self._image_list = [fname] + @property + def members(self): + """List of SkyLineMember objects.""" + return self._members @property - def image_list(self): - """List of images in SkyLine.""" - return self._image_list + def polygons(self): + """List of SkyLineMember polygons.""" + return [m.polygon for m in self.members] # Overload parent class with following changes # a. add own attr # b. update self var in-place, no return - + def add_image(self,skyline): """Make composite SkyLine""" pass - + def compute_overlap(self, skyline): """Return sphere object with intersect of 2 skylines. @@ -122,21 +161,21 @@ class SkyLine(SphericalPolygon): """ pass - + def find_intersection(self, skyline): """ Return WCS object of overlap of 2 skylines. """ pass - + def within(self, pos): """ Return bool if pos is in skyline or not. """ pass - + def create_wcs(self): """Create WCS from SkyLine object. @@ -149,7 +188,7 @@ class SkyLine(SphericalPolygon): """ pass - + def footprints(self): """Compute edges of skyline.""" pass @@ -159,5 +198,5 @@ def test(): """Basic use case.""" # Allow disjoint? - + pass |