30 """Set a flag for each source if it is in the innerBBox of a patch.
34 sources : `lsst.afw.table.SourceCatalog`
35 A sourceCatalog with pre-calculated centroids.
36 patchInfo : `lsst.skymap.PatchInfo`
37 Information about a `SkyMap` `Patch`.
41 isPatchInner : array-like of `bool`
42 `True` for each source that has a centroid
43 in the inner region of a patch.
46 x = sources[
"slot_Centroid_x"]
47 y = sources[
"slot_Centroid_y"]
48 centroidFlag = sources[
"slot_Centroid_flag"]
52 innerFloatBBox =
Box2D(patchInfo.getInnerBBox())
53 inInner = innerFloatBBox.contains(x, y)
58 shrunkInnerFloatBBox =
Box2D(innerFloatBBox)
59 shrunkInnerFloatBBox.grow(-1)
60 inShrunkInner = shrunkInnerFloatBBox.contains(x, y)
63 isPatchInner = (centroidFlag & inShrunkInner) | (~centroidFlag & inInner)
68 """Set a flag for each source that the skyMap includes in tractInfo.
72 sources : `lsst.afw.table.SourceCatalog`
73 A sourceCatalog with pre-calculated centroids.
74 tractInfo : `lsst.skymap.TractInfo`
76 skyMap : `lsst.skymap.BaseSkyMap`
77 Sky tessellation object
81 isTractInner : array-like of `bool`
82 True if the skyMap.findTract method returns
83 the same tract as tractInfo.
85 tractId = tractInfo.getId()
86 isTractInner = np.array([skyMap.findTract(s.getCoord()).getId() == tractId
for s
in sources])
91 """Get a flag that marks pseudo sources.
93 Some categories of sources, for example sky objects,
94 are not really detected sources and should not be considered primary
99 sources : `lsst.afw.table.SourceCatalog`
100 The catalog of sources for which to identify "pseudo"
102 pseudoFilterList : `list` of `str`
103 Names of filters which should never be primary
107 isPseudo : array-like of `bool`
108 True for each source that is a pseudo source.
109 Note: to remove pseudo sources use `~isPseudo`.
112 isPseudo = np.zeros(len(sources), dtype=bool)
113 for filt
in pseudoFilterList:
115 pseudoFilterKey = schema.find(
"merge_peak_%s" % filt).getKey()
116 isPseudo |= sources[pseudoFilterKey]
118 log.warning(
"merge_peak is not set for pseudo-filter %s", filt)
123 """Get flags generated by the deblender
125 scarlet is different than meas_deblender in that it is not
126 (necessarily) flux conserving. For consistency in scarlet,
127 all of the parents with only a single child (isolated sources)
128 need to be deblended. This creates a question: which type
129 of isolated source should we make measurements on, the
130 undeblended "parent" or the deblended child?
131 For that reason we distinguish between a DeblendedSource,
132 which is a source that has no children and uses the
133 isolated parents, and a DeblendedModelSource, which uses
134 the scarlet models for both isolated and blended sources.
135 In the case of meas_deblender, DeblendedModelSource is
136 `None` because it is not contained in the output catalog.
140 sources : `lsst.afw.table.SourceCatalog`
141 A sourceCatalog that has already been deblended using
142 either meas_extensions_scarlet or meas_deblender.
146 fromBlend : array-like of `bool`
147 True for each source modeled by the deblender from a `Peak`
148 in a parent footprint that contained at least one other `Peak`.
149 While these models can be approximated as isolated,
150 and measurements are made on them as if that's the case,
151 we know deblending to introduce biases in the shape and centroid
152 of objects and it is important to know that the sources that these
153 models are based on are all bleneded in the true image.
154 isIsolated : array-like of `bool`
155 True for isolated sources, regardless of whether or not they
156 were modeled by the deblender.
157 isDeblendedSource : array-like of `bool`
158 True for each source that is a "DeblendedSource" as defined above.
159 isDeblendedModelSource : array-like of `bool`
160 True for each source that is a "DeblendedSourceModel"
163 nChildKey =
"deblend_nChild"
164 nChild = sources[nChildKey]
165 parent = sources[
"parent"]
167 if "deblend_scarletFlux" in sources.schema:
172 nPeaks = sources[
"deblend_nPeaks"]
173 parentNChild = sources[
"deblend_parentNChild"]
178 fromBlend = parentNChild > 1
179 isIsolated = isLeaf & ((parent == 0) | parentNChild == 1)
180 isDeblendedSource = (fromBlend & isLeaf) | (isIsolated & (parent == 0))
181 isDeblendedModelSource = (parent != 0) & isLeaf
184 fromBlend = parent != 0
185 isIsolated = (nChild == 0) & (parent == 0)
186 isDeblendedSource = nChild == 0
187 isDeblendedModelSource =
None
188 return fromBlend, isIsolated, isDeblendedSource, isDeblendedModelSource
192 nChildKeyName =
Field(dtype=str, default=
"deprecated",
193 doc=
"Deprecated. This parameter is not used.")
194 pseudoFilterList =
ListField(dtype=str, default=[
'sky'],
195 doc=
"Names of filters which should never be primary")
199 """Add isPrimaryKey to a given schema.
203 schema : `lsst.afw.table.Schema`
205 isSingleFrame : `bool`
206 Flag specifying if task is operating with single frame imaging.
207 includeDeblend : `bool`
208 Include deblend information in isPrimary and
209 add isDeblendedSource field?
211 Keyword arguments passed to the task.
214 ConfigClass = SetPrimaryFlagsConfig
216 def __init__(self, schema, isSingleFrame=False, **kwargs):
217 Task.__init__(self, **kwargs)
222 primaryDoc = (
"true if source has no children and is in the inner region of a coadd patch "
223 "and is in the inner region of a coadd tract "
224 "and is not \"detected\" in a pseudo-filter (see config.pseudoFilterList)")
226 "detect_isPatchInner", type=
"Flag",
227 doc=
"true if source is in the inner region of a coadd patch",
230 "detect_isTractInner", type=
"Flag",
231 doc=
"true if source is in the inner region of a coadd tract",
234 primaryDoc =
"true if source has no children and is not a sky source"
236 "detect_isPrimary", type=
"Flag",
240 if "deblend_nChild" in schema.getNames():
243 "detect_isDeblendedSource", type=
"Flag",
244 doc=primaryDoc +
" and is either an unblended isolated source or a "
245 "deblended child from a parent with 'deblend_nChild' > 1")
247 "detect_fromBlend", type=
"Flag",
248 doc=
"This source is deblended from a parent with more than one child."
251 "detect_isIsolated", type=
"Flag",
252 doc=
"This source is not a part of a blend."
254 if "deblend_scarletFlux" in schema.getNames():
256 "detect_isDeblendedModelSource", type=
"Flag",
257 doc=primaryDoc +
" and is a deblended child")
261 def run(self, sources, skyMap=None, tractInfo=None, patchInfo=None):
262 """Set isPrimary and related flags on sources.
264 For coadded imaging, the `isPrimary` flag returns True when an object
265 has no children, is in the inner region of a coadd patch, is in the
266 inner region of a coadd trach, and is not detected in a pseudo-filter
267 (e.g., a sky_object).
268 For single frame imaging, the isPrimary flag returns True when a
269 source has no children and is not a sky source.
273 sources : `lsst.afw.table.SourceCatalog`
274 A sourceTable. Reads in centroid fields and an nChild field.
275 Writes is-patch-inner, is-tract-inner, and is-primary flags.
276 skyMap : `lsst.skymap.BaseSkyMap`
277 Sky tessellation object
278 tractInfo : `lsst.skymap.TractInfo`
280 patchInfo : `lsst.skymap.PatchInfo`
289 isPrimary = isTractInner & isPatchInner & ~isPseudo
296 if "sky_source" in sources.schema:
297 isSky = sources[
"sky_source"]
299 isSky = np.zeros(len(sources), dtype=bool)
304 fromBlend, isIsolated, isDeblendedSource, isDeblendedModelSource = result
310 isPrimary = isPrimary & isDeblendedSource
A floating-point coordinate rectangle geometry.
def run(self, sources, skyMap=None, tractInfo=None, patchInfo=None)
def __init__(self, schema, isSingleFrame=False, **kwargs)
def getDeblendPrimaryFlags(sources)
def getPatchInner(sources, patchInfo)
def getTractInner(sources, tractInfo, skyMap)
def getPseudoSources(sources, pseudoFilterList, schema, log)