LSST Applications g0265f82a02+c6dfa2ddaf,g1162b98a3f+ffe7eabc7e,g2079a07aa2+1b2e822518,g2bbee38e9b+c6dfa2ddaf,g337abbeb29+c6dfa2ddaf,g36da64cc00+ea84795170,g3ddfee87b4+955a963fd8,g50ff169b8f+2eb0e556e8,g52b1c1532d+90ebb246c7,g555ede804d+955a963fd8,g591dd9f2cf+bac198a2cb,g5ec818987f+420292cfeb,g858d7b2824+d6c9a0a3b8,g876c692160+aabc49a3c3,g8a8a8dda67+90ebb246c7,g8cdfe0ae6a+4fd9e222a8,g99cad8db69+e6cd765486,g9ddcbc5298+a1346535a5,ga1e77700b3+df8f93165b,ga8c6da7877+acd47f83f4,gae46bcf261+c6dfa2ddaf,gb0e22166c9+8634eb87fb,gb3f2274832+12c8382528,gba4ed39666+1ac82b564f,gbb8dafda3b+0574160a1f,gbeb006f7da+dea2fbb49f,gc28159a63d+c6dfa2ddaf,gc86a011abf+d6c9a0a3b8,gcf0d15dbbd+955a963fd8,gdaeeff99f8+1cafcb7cd4,gdc0c513512+d6c9a0a3b8,ge79ae78c31+c6dfa2ddaf,geb67518f79+ba1859f325,gee10cc3b42+90ebb246c7,gf1cff7945b+d6c9a0a3b8,w.2024.13
LSST Data Management Base Package
Loading...
Searching...
No Matches
Public Member Functions | Public Attributes | Protected Attributes | List of all members
lsst.pipe.tasks.objectMasks.ObjectMaskCatalog Class Reference

Public Member Functions

 __init__ (self)
 
 __len__ (self)
 
 __iter__ (self)
 
 __getitem__ (self, i)
 
 __setitem__ (self, i, v)
 
 read (cls, fileName)
 

Public Attributes

 table
 
 addNew
 

Protected Attributes

 _catalog
 

Detailed Description

Class to support bright object masks

Definition at line 33 of file objectMasks.py.

Constructor & Destructor Documentation

◆ __init__()

lsst.pipe.tasks.objectMasks.ObjectMaskCatalog.__init__ ( self)

Definition at line 37 of file objectMasks.py.

37 def __init__(self):
38 schema = afwTable.SimpleTable.makeMinimalSchema()
39 schema.addField("type", str, "type of region (e.g. box, circle)", size=10)
40 schema.addField("radius", "Angle", "radius of mask (if type == circle")
41 schema.addField("height", "Angle", "height of mask (if type == box)")
42 schema.addField("width", "Angle", "width of mask (if type == box)")
43 schema.addField("angle", "Angle", "rotation of mask (if type == box)")
44 schema.addField("mag", float, "object's magnitude")
45
46 self._catalog = afwTable.SimpleCatalog(schema)
47 self._catalog.table.setMetadata(dafBase.PropertyList())
48
49 self.table = self._catalog.table
50 self.addNew = self._catalog.addNew
51
Custom catalog class for record/table subclasses that are guaranteed to have an ID,...
Class for storing ordered metadata with comments.

Member Function Documentation

◆ __getitem__()

lsst.pipe.tasks.objectMasks.ObjectMaskCatalog.__getitem__ ( self,
i )

Definition at line 58 of file objectMasks.py.

58 def __getitem__(self, i):
59 return self._catalog.__getitem__(i)
60

◆ __iter__()

lsst.pipe.tasks.objectMasks.ObjectMaskCatalog.__iter__ ( self)

Definition at line 55 of file objectMasks.py.

55 def __iter__(self):
56 return iter(self._catalog)
57

◆ __len__()

lsst.pipe.tasks.objectMasks.ObjectMaskCatalog.__len__ ( self)

Definition at line 52 of file objectMasks.py.

52 def __len__(self):
53 return len(self._catalog)
54

◆ __setitem__()

lsst.pipe.tasks.objectMasks.ObjectMaskCatalog.__setitem__ ( self,
i,
v )

Definition at line 61 of file objectMasks.py.

61 def __setitem__(self, i, v):
62 return self._catalog.__setitem__(i, v)
63

◆ read()

lsst.pipe.tasks.objectMasks.ObjectMaskCatalog.read ( cls,
fileName )
Read a ds9 region file, returning a ObjectMaskCatalog object

The files should be structured as follows:

# Description of catalogue as a comment
# CATALOG: catalog-id-string
# TRACT: 0
# PATCH: 5,4
# FILTER: HSC-I

wcs; fk5

circle(RA, DEC, RADIUS)           # ID: 1, mag: 12.34
box(RA, DEC, XSIZE, YSIZE, THETA) # ID: 2, mag: 23.45
...

The ", mag: XX.YY" is optional

The commented lines must be present, with the relevant fields such as
tract patch and filter filled in. The coordinate system must be listed
as above. Each patch is specified as a box or circle, with RA, DEC,
and dimensions specified in decimal degrees (with or without an
explicit "d").

Only (axis-aligned) boxes and circles are currently supported as
region definitions.

Definition at line 65 of file objectMasks.py.

65 def read(cls, fileName):
66 """Read a ds9 region file, returning a ObjectMaskCatalog object
67
68 The files should be structured as follows:
69
70 # Description of catalogue as a comment
71 # CATALOG: catalog-id-string
72 # TRACT: 0
73 # PATCH: 5,4
74 # FILTER: HSC-I
75
76 wcs; fk5
77
78 circle(RA, DEC, RADIUS) # ID: 1, mag: 12.34
79 box(RA, DEC, XSIZE, YSIZE, THETA) # ID: 2, mag: 23.45
80 ...
81
82 The ", mag: XX.YY" is optional
83
84 The commented lines must be present, with the relevant fields such as
85 tract patch and filter filled in. The coordinate system must be listed
86 as above. Each patch is specified as a box or circle, with RA, DEC,
87 and dimensions specified in decimal degrees (with or without an
88 explicit "d").
89
90 Only (axis-aligned) boxes and circles are currently supported as
91 region definitions.
92 """
93
94 log = logging.getLogger("lsst.ObjectMaskCatalog")
95
96 brightObjects = cls()
97 checkedWcsIsFk5 = False
98 NaN = float("NaN")*geom.degrees
99
100 nFormatError = 0 # number of format errors seen
101 with open(fileName) as fd:
102 for lineNo, line in enumerate(fd.readlines(), 1):
103 line = line.rstrip()
104
105 if re.search(r"^\s*#", line):
106 #
107 # Parse any line of the form "# key : value" and put them into the metadata.
108 #
109 # The medatdata values must be defined as outlined in the above docstring
110 #
111 # The value of these three keys will be checked,
112 # so get them right!
113 #
114 mat = re.search(r"^\s*#\s*([a-zA-Z][a-zA-Z0-9_]+)\s*:\s*(.*)", line)
115 if mat:
116 key, value = mat.group(1).lower(), mat.group(2)
117 if key == "tract":
118 value = int(value)
119
120 brightObjects.table.getMetadata().set(key, value)
121
122 line = re.sub(r"^\s*#.*", "", line)
123 if not line:
124 continue
125
126 if re.search(r"^\s*wcs\s*;\s*fk5\s*$", line, re.IGNORECASE):
127 checkedWcsIsFk5 = True
128 continue
129
130 # This regular expression parses the regions file for each region to be masked,
131 # with the format as specified in the above docstring.
132 mat = re.search(r"^\s*(box|circle)"
133 r"(?:\s+|\s*\‍(\s*)" # open paren or space
134 r"([+\-]?(?:0|[1-9]\d*)(?:\.\d*)?(?:[eE][+\-]?\d+)?)([d]*)" # ra + units
135 r"(?:\s+|\s*,\s*)" # sep
136 r"([+\-]?(?:0|[1-9]\d*)(?:\.\d*)?(?:[eE][+\-]?\d+)?)([d]*)" # dec + units
137 r"(?:\s+|\s*,\s*)" # sep
138 r"([+\-]?(?:0|[1-9]\d*)(?:\.\d*)?(?:[eE][+\-]?\d+)?)([d]*)" # param1 + units
139 r"(?:" # start optional 1
140 r"(?:\s+|\s*,\s*)" # sep
141 r"([+\-]?(?:0|[1-9]\d*)(?:\.\d*)?(?:[eE][+\-]?\d+)?)([d]*)" # param2 + units
142 r"(?:" # start optional 2
143 r"(?:\s+|\s*,\s*)" # sep
144 r"([+\-]?(?:0|[1-9]\d*)(?:\.\d*)?(?:[eE][+\-]?\d+)?)([d]*)" # param3 + units
145 ")?" # end optional 2
146 ")?" # end optional 1
147 r"(?:\s*|\s*\‍)\s*)" # close paren or space
148 r"#\s*ID:[\w\s]*(\d+)" # start comment, ID
149 r"(?:\s*,?\s*mag:\s*([+\-]?(?:0|[1-9]\d*)(?:\.\d*)?(?:[eE][+\-]?\d+)?))?"
150 r"\s*$", line)
151 if mat:
152 _type, ra, raUnit, dec, decUnit, \
153 param1, param1Unit, param2, param2Unit, param3, param3Unit, \
154 _id, mag = mat.groups()
155
156 _id = int(_id)
157 if mag is None:
158 mag = NaN
159 else:
160 mag = float(mag)
161
162 ra = convertToAngle(ra, raUnit, "ra", fileName, lineNo)
163 dec = convertToAngle(dec, decUnit, "dec", fileName, lineNo)
164
165 radius = NaN
166 width = NaN
167 height = NaN
168 angle = 0.0*geom.degrees
169
170 if _type == "box":
171 width = convertToAngle(param1, param1Unit, "width", fileName, lineNo)
172 height = convertToAngle(param2, param2Unit, "height", fileName, lineNo)
173 if param3 is not None:
174 angle = convertToAngle(param3, param3Unit, "angle", fileName, lineNo)
175
176 if angle != 0.0:
177 log.warning("Rotated boxes are not supported: \"%s\" at %s:%d",
178 line, fileName, lineNo)
179 nFormatError += 1
180 elif _type == "circle":
181 radius = convertToAngle(param1, param1Unit, "radius", fileName, lineNo)
182
183 if not (param2 is None and param3 is None):
184 log.warning("Extra parameters for circle: \"%s\" at %s:%d",
185 line, fileName, lineNo)
186 nFormatError += 1
187
188 rec = brightObjects.addNew()
189 # N.b. rec["coord"] = Coord is not supported, so we have to use the setter
190 rec["type"] = _type
191 rec["id"] = _id
192 rec["mag"] = mag
193 rec.setCoord(geom.SpherePoint(ra, dec))
194
195 rec["angle"] = angle
196 rec["height"] = height
197 rec["width"] = width
198 rec["radius"] = radius
199 else:
200 log.warning("Unexpected line \"%s\" at %s:%d", line, fileName, lineNo)
201 nFormatError += 1
202
203 if nFormatError > 0:
204 raise RuntimeError("Saw %d formatting errors in %s" % (nFormatError, fileName))
205
206 if not checkedWcsIsFk5:
207 raise RuntimeError("Expected to see a line specifying an fk5 wcs in %s" % fileName)
208
209 # This makes the deep copy contiguous in memory so that a ColumnView can be exposed to Numpy
210 brightObjects._catalog = brightObjects._catalog.copy(True)
211
212 return brightObjects
213
214
Point in an unspecified spherical coordinate system.
Definition SpherePoint.h:57
daf::base::PropertySet * set
Definition fits.cc:931
std::shared_ptr< table::io::Persistable > read(table::io::InputArchive const &archive, table::io::CatalogVector const &catalogs) const override

Member Data Documentation

◆ _catalog

lsst.pipe.tasks.objectMasks.ObjectMaskCatalog._catalog
protected

Definition at line 46 of file objectMasks.py.

◆ addNew

lsst.pipe.tasks.objectMasks.ObjectMaskCatalog.addNew

Definition at line 50 of file objectMasks.py.

◆ table

lsst.pipe.tasks.objectMasks.ObjectMaskCatalog.table

Definition at line 49 of file objectMasks.py.


The documentation for this class was generated from the following file: