diff options
author | Aaron LI <aaronly.me@gmail.com> | 2016-03-31 10:57:34 +0800 |
---|---|---|
committer | Aaron LI <aaronly.me@gmail.com> | 2016-03-31 10:57:34 +0800 |
commit | c9c896dea2ba43551c4e10bd49666105449e9bd7 (patch) | |
tree | e94b73f17b2d776c2acd4c9549657f500c3dc7ce /region | |
parent | 2b6cb9b655a53d43b32a8a211287c82f4f59999a (diff) | |
download | atoolbox-c9c896dea2ba43551c4e10bd49666105449e9bd7.tar.bz2 |
add all scripts/tools
Diffstat (limited to 'region')
-rw-r--r-- | region/region.py | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/region/region.py b/region/region.py new file mode 100644 index 0000000..47a1636 --- /dev/null +++ b/region/region.py @@ -0,0 +1,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) + |