aboutsummaryrefslogtreecommitdiffstats
path: root/python/splitCCDgaps.py
blob: bc26c29482b68c6ebfd4654b6022928ecd478a13 (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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
# -*- coding: utf-8-
#
# Aaron LI
# 2015/08/12
#

"""
Split the long-strip-shaped CCD gaps regions into a series of little
square regions, which are used as the input regions of 'roi' to
determine the corresponding background regions, and finally providied
to 'dmfilth' in order to fill in the CCD gaps.
"""


import re
import math
from io import TextIOWrapper


class BoxRegion(object):
    """
    CIAO/DS9 "rotbox"/"box" region class.

    rotbox/box format:
        rotbox(xc, yc, width, height, rotation)
        box(xc, yc, width, height, rotation)
    Notes:
        rotation: [0, 360) (degree)
    """
    def __init__(self, xc=None, yc=None,
                 width=None, height=None, rotation=None):
        self.regtype  = "rotbox"
        self.xc       = xc
        self.yc       = yc
        self.width    = width
        self.height   = height
        self.rotation = rotation

    def __str__(self):
        return "%s(%s,%s,%s,%s,%s)" % (self.regtype, self.xc, self.yc,
                self.width, self.height, self.rotation)

    @classmethod
    def parse(cls, regstr):
        """
        Parse region string.
        """
        regex_box = re.compile(r'^(box|rotbox)\(([0-9.]+),([0-9.]+),([0-9.]+),([0-9.]+),([0-9.]+)\)$', re.I)
        m = regex_box.match(regstr)
        if m:
            regtype  = m.group(1)
            xc       = float(m.group(2))
            yc       = float(m.group(3))
            width    = float(m.group(4))
            height   = float(m.group(5))
            rotation = float(m.group(6))
            return cls(xc, yc, width, height, rotation)
        else:
            return None

    def split(self, filename=None):
        """
        Split long-strip-shaped box region into a series square box regions.
        """
        angle = self.rotation * math.pi / 180.0
        # to record the center coordinates of each split region
        centers = []
        if self.width > self.height:
            # number of regions after split
            nreg = math.ceil(self.width / self.height)
            # width & height of the split region
            width = self.width / nreg
            height = self.height
            # position of the left-most region
            x_l = self.xc - 0.5*self.width * math.cos(angle)
            y_l = self.yc - 0.5*self.width * math.sin(angle)
            for i in range(nreg):
                x = x_l + (0.5 + i) * width * math.cos(angle)
                y = y_l + (0.5 + i) * width * math.sin(angle)
                centers.append((x, y))
        else:
            # number of regions after split
            nreg = math.ceil(self.height / self.width)
            # width & height of the split region
            width = self.width
            height = self.height / nreg
            # position of the left-most region
            x_l = self.xc + 0.5*self.height * math.cos(angle + math.pi/2)
            y_l = self.yc + 0.5*self.height * math.sin(angle + math.pi/2)
            for i in range(nreg):
                x = x_l - (0.5 + i) * height * math.cos(angle + math.pi/2)
                y = y_l - (0.5 + i) * height * math.sin(angle + math.pi/2)
                centers.append((x, y))
        # create split regions
        regions = []
        for (x, y) in centers:
            regions.append(self.__class__(x, y, width+2, height+2,
                                          self.rotation))
        # write split regions into file if specified
        if isinstance(filename, str):
            regout = open(filename, "w")
            regout.write("\n".join(map(str, regions)))
            regout.close()
        else:
            return regions