aboutsummaryrefslogtreecommitdiffstats
path: root/astro/region.py
blob: 47a1636d04e22712b9eb133c8bec117f19d80b3b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
# -*- coding: utf-8 -*-
#
# Aaron Li
# 2015/06/19

"""
Class Region for regions on the spherical surface.
Used in astronomy to select/define a certian region, e.g, DS9.
"""

import sys


class Region(object):
    """
    Basic region class for regions on the spherical surface,
    similar definition as to DS9 regions.

    Coordinate style: (ra, dec)
    Unit: degree
    ra: [0, 2\pi)
    dec: [-\pi/2, \pi/2]
    """

    # currently supported region types (similar to DS9)
    REGION_TYPES = ["circle", "ellipse", "box", "annulus", "pie", "panda"]

    def __init__(self, regtype, xc, yc,
            radius=None, radius2=None,
            width=None, height=None, rotation=None,
            start=None, end=None):
        if regtype.lower() not in self.REGION_TYPES:
            raise ValueError("only following region types supported: %s" %\
                    " ".join(self.REGION_TYPES))
        self.regtype = regtype.lower()
        self.xc = xc
        self.yc = yc
        self.radius = radius
        self.radius2 = radius2
        self.width = width
        self.height = height
        self.rotation = rotation

    def __repr__(self):
        return "Region: %s" % self.regtype

    def dump(self):
        return {"regtype": self.regtype,
                "xc": self.xc,
                "yc": self.yc,
                "radius": self.radius,
                "radius2": self.radius2,
                "width": self.width,
                "height": self.height,
                "rotation": self.rotation
               }

    def is_inside(self, point):
        """
        Determine whether the given point is inside the region.
        """
        x = point[0]
        y = point[1]
        if self.regtype == "box":
            #print("WARNING: rotation box currently not supported!",
            #        file=sys.stderr)
            xmin = self.xc - self.width/2.0
            xmax = self.xc + self.width/2.0
            ymin = self.yc - self.height/2.0
            ymax = self.yc + self.height/2.0
            if all([x >= xmin, x <= xmax, y >= ymin, y <= ymax]):
                return True
            else:
                return False
        else:
            raise ValueError("region type '%s' currently not implemented" %\
                    self.regtype)