Coverage for python/lsst/pipe/tasks/setPrimaryFlags.py : 92%

Hot-keys on this page
r m x p toggle line displays
j k next/prev highlighted chunk
0 (zero) top of page
1 (one) first highlighted chunk
1#!/usr/bin/env python
2#
3# LSST Data Management System
4# Copyright 2008-2016 LSST/AURA
5#
6# This product includes software developed by the
7# LSST Project (http://www.lsst.org/).
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 LSST License Statement and
20# the GNU General Public License along with this program. If not,
21# see <http://www.lsstcorp.org/LegalNotices/>.
22#
23import numpy
24from lsst.pex.config import Config, Field, ListField
25from lsst.pipe.base import Task
26from lsst.geom import Box2D
29class SetPrimaryFlagsConfig(Config):
30 nChildKeyName = Field(dtype=str, default="deblend_nChild",
31 doc="Name of field in schema with number of deblended children")
32 pseudoFilterList = ListField(dtype=str, default=['sky'],
33 doc="Names of filters which should never be primary")
36class SetPrimaryFlagsTask(Task):
37 ConfigClass = SetPrimaryFlagsConfig
39 def __init__(self, schema, **kwargs):
40 Task.__init__(self, **kwargs)
41 self.schema = schema
42 self.isPatchInnerKey = self.schema.addField(
43 "detect_isPatchInner", type="Flag",
44 doc="true if source is in the inner region of a coadd patch",
45 )
46 self.isTractInnerKey = self.schema.addField(
47 "detect_isTractInner", type="Flag",
48 doc="true if source is in the inner region of a coadd tract",
49 )
50 self.isPrimaryKey = self.schema.addField(
51 "detect_isPrimary", type="Flag",
52 doc="true if source has no children and is in the inner region of a coadd patch "
53 "and is in the inner region of a coadd tract "
54 "and is not \"detected\" in a pseudo-filter (see config.pseudoFilterList)",
55 )
57 def run(self, sources, skyMap, tractInfo, patchInfo, includeDeblend=True):
58 """Set is-primary and related flags on sources
60 @param[in,out] sources a SourceTable
61 - reads centroid fields and an nChild field
62 - writes is-patch-inner, is-tract-inner and is-primary flags
63 @param[in] skyMap sky tessellation object (subclass of lsst.skymap.BaseSkyMap)
64 @param[in] tractInfo tract object (subclass of lsst.skymap.TractInfo)
65 @param[in] patchInfo patch object (subclass of lsst.skymap.PatchInfo)
66 @param[in] includeDeblend include deblend information in isPrimary?
67 """
68 nChildKey = None
69 if includeDeblend: 69 ↛ 74line 69 didn't jump to line 74, because the condition on line 69 was never false
70 nChildKey = self.schema.find(self.config.nChildKeyName).key
72 # set inner flags for each source and set primary flags for sources with no children
73 # (or all sources if deblend info not available)
74 innerFloatBBox = Box2D(patchInfo.getInnerBBox())
76 # When the centroider fails, we can still fall back to the peak, but we don't trust
77 # that quite as much - so we use a slightly smaller box for the patch comparison.
78 # That's trickier for the tract comparison, so we just use the peak without extra
79 # care there.
80 shrunkInnerFloatBBox = Box2D(innerFloatBBox)
81 shrunkInnerFloatBBox.grow(-1)
83 pseudoFilterKeys = []
84 for filt in self.config.pseudoFilterList:
85 try:
86 pseudoFilterKeys.append(self.schema.find("merge_peak_%s" % filt).getKey())
87 except Exception:
88 self.log.warn("merge_peak is not set for pseudo-filter %s" % filt)
90 tractId = tractInfo.getId()
91 for source in sources:
92 centroidPos = source.getCentroid()
93 if numpy.any(numpy.isnan(centroidPos)): 93 ↛ 94line 93 didn't jump to line 94, because the condition on line 93 was never true
94 continue
95 if source.getCentroidFlag():
96 # Use a slightly smaller box to guard against bad centroids (see above)
97 isPatchInner = shrunkInnerFloatBBox.contains(centroidPos)
98 else:
99 isPatchInner = innerFloatBBox.contains(centroidPos)
100 source.setFlag(self.isPatchInnerKey, isPatchInner)
102 skyPos = source.getCoord()
103 sourceInnerTractId = skyMap.findTract(skyPos).getId()
104 isTractInner = sourceInnerTractId == tractId
105 source.setFlag(self.isTractInnerKey, isTractInner)
107 if nChildKey is None or source.get(nChildKey) == 0:
108 for pseudoFilterKey in pseudoFilterKeys:
109 if source.get(pseudoFilterKey):
110 isPseudo = True
111 break
112 else:
113 isPseudo = False
115 source.setFlag(self.isPrimaryKey, isPatchInner and isTractInner and not isPseudo)