LSST Applications g0b6bd0c080+a72a5dd7e6,g1182afd7b4+2a019aa3bb,g17e5ecfddb+2b8207f7de,g1d67935e3f+06cf436103,g38293774b4+ac198e9f13,g396055baef+6a2097e274,g3b44f30a73+6611e0205b,g480783c3b1+98f8679e14,g48ccf36440+89c08d0516,g4b93dc025c+98f8679e14,g5c4744a4d9+a302e8c7f0,g613e996a0d+e1c447f2e0,g6c8d09e9e7+25247a063c,g7271f0639c+98f8679e14,g7a9cd813b8+124095ede6,g9d27549199+a302e8c7f0,ga1cf026fa3+ac198e9f13,ga32aa97882+7403ac30ac,ga786bb30fb+7a139211af,gaa63f70f4e+9994eb9896,gabf319e997+ade567573c,gba47b54d5d+94dc90c3ea,gbec6a3398f+06cf436103,gc6308e37c7+07dd123edb,gc655b1545f+ade567573c,gcc9029db3c+ab229f5caf,gd01420fc67+06cf436103,gd877ba84e5+06cf436103,gdb4cecd868+6f279b5b48,ge2d134c3d5+cc4dbb2e3f,ge448b5faa6+86d1ceac1d,gecc7e12556+98f8679e14,gf3ee170dca+25247a063c,gf4ac96e456+ade567573c,gf9f5ea5b4d+ac198e9f13,gff490e6085+8c2580be5c,w.2022.27
LSST Data Management Base Package
ds9Regions.py
Go to the documentation of this file.
1# This file is part of afw.
2#
3# Developed for the LSST Data Management System.
4# This product includes software developed by the LSST Project
5# (https://www.lsst.org).
6# See the COPYRIGHT file at the top-level directory of this distribution
7# for details of code ownership.
8#
9# This program is free software: you can redistribute it and/or modify
10# it under the terms of the GNU General Public License as published by
11# the Free Software Foundation, either version 3 of the License, or
12# (at your option) any later version.
13#
14# This program is distributed in the hope that it will be useful,
15# but WITHOUT ANY WARRANTY; without even the implied warranty of
16# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17# GNU General Public License for more details.
18#
19# You should have received a copy of the GNU General Public License
20# along with this program. If not, see <https://www.gnu.org/licenses/>.
21
22import math
23import re
24import lsst.afw.geom as afwGeom
25
26
27def dot(symb, c, r, size, ctype=None, fontFamily="helvetica", textAngle=None):
28 """Draw a symbol onto the specified DS9 frame.
29
30 Parameters
31 ----------
32 symb
33 Possible values are:
34
35 ``"+"``
36 Draw a +
37 ``"x"``
38 Draw an x
39 ``"*"``
40 Draw a *
41 ``"o"``
42 Draw a circle
43 ``"@:Mxx,Mxy,Myy"``
44 Draw an ellipse with moments (Mxx, Mxy, Myy) (argument size is ignored)
46 Draw the ellipse (argument size is ignored). N.b. objects
47 derived from `~lsst.afw.geom.ellipses.BaseCore` include
49 Any other value
50 Interpreted as a string to be drawn. Strings obey the ``fontFamily``
51 (which may be extended with other characteristics, e.g. "times
52 bold italic". Text will be drawn rotated by ``textAngle``
53 (textAngle is ignored otherwise).
54 c, r
55 Zero-based coordinates at which to draw the symbol
56 size
57 ctype : `str`
58 the name of the desired color (e.g. 'red', 'orchid')
59 fontFamily
60 textAngle
61 """
62 if ctype is None:
63 color = "" # the default
64 else:
65 color = ' # color=%s' % ctype
66
67 regions = []
68
69 r += 1
70 c += 1 # ds9 uses 1-based coordinates
71 if isinstance(symb, afwGeom.ellipses.Axes):
72 regions.append('ellipse %g %g %gi %gi %g%s' % (c, r, symb.getA(), symb.getB(),
73 math.degrees(symb.getTheta()), color))
74 elif symb == '+':
75 regions.append('line %g %g %g %g%s' % (c, r+size, c, r-size, color))
76 regions.append('line %g %g %g %g%s' % (c-size, r, c+size, r, color))
77 elif symb == 'x':
78 size = size/math.sqrt(2)
79 regions.append('line %g %g %g %g%s' %
80 (c+size, r+size, c-size, r-size, color))
81 regions.append('line %g %g %g %g%s' %
82 (c-size, r+size, c+size, r-size, color))
83 elif symb == '*':
84 size30 = 0.5*size
85 size60 = 0.5*math.sqrt(3)*size
86 regions.append('line %g %g %g %g%s' % (c+size, r, c-size, r, color))
87 regions.append('line %g %g %g %g%s' %
88 (c-size30, r+size60, c+size30, r-size60, color))
89 regions.append('line %g %g %g %g%s' %
90 (c+size30, r+size60, c-size30, r-size60, color))
91 elif symb == 'o':
92 regions.append('circle %g %g %gi%s' % (c, r, size, color))
93 else:
94 color = re.sub("^ # ", "", color) # skip the leading " # "
95
96 angle = ""
97 if textAngle is not None:
98 angle += " textangle=%.1f"%(textAngle)
99
100 font = ""
101 if size != 2 or fontFamily != "helvetica":
102 fontFamily = fontFamily.split()
103 font += ' font="%s %d' % (fontFamily.pop(0),
104 int(10*size/2.0 + 0.5))
105 if not fontFamily:
106 # appears to be needed at least for 7.4b1
107 fontFamily = ["normal"]
108 font += " " + " ".join(fontFamily)
109 font += '"'
110 extra = ""
111 if color or angle or font:
112 extra = " # "
113 extra += color
114 extra += angle
115 extra += font
116
117 regions.append('text %g %g \"%s\"%s' % (c, r, symb, extra))
118
119 return regions
120
121
122def drawLines(points, ctype=None):
123 """Draw a line by connecting the points
124
125 Parameters
126 ----------
127 points : `list` of `tuple` of `float`
128 a list of (col,row)
129 ctype : `str`
130 the name of the desired color (e.g. 'red', 'orchid')
131 """
132
133 if ctype is None: # default
134 color = ""
135 else:
136 color = f"# color={ctype}"
137
138 regions = []
139 if len(points) > 0:
140 c0, r0 = points[0]
141 r0 += 1
142 c0 += 1 # ds9 uses 1-based coordinates
143 for (c, r) in points[1:]:
144 r += 1
145 c += 1 # ds9 uses 1-based coordinates
146 regions.append('line %g %g %g %g %s' % (c0, r0, c, r, color))
147 c0, r0 = c, r
148
149 return regions
An ellipse core for the semimajor/semiminor axis and position angle parametrization (a,...
Definition: Axes.h:47
A base class for parametrizations of the "core" of an ellipse - the ellipticity and size.
Definition: BaseCore.h:55
An ellipse core with quadrupole moments as parameters.
Definition: Quadrupole.h:47
def drawLines(points, ctype=None)
Definition: ds9Regions.py:122
def dot(symb, c, r, size, ctype=None, fontFamily="helvetica", textAngle=None)
Definition: ds9Regions.py:27