24 from lsst.pex.config 
import Config, Field, ListField
 
   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")
 
   37     ConfigClass = SetPrimaryFlagsConfig
 
   40         Task.__init__(self, **kwargs)
 
   43             "detect_isPatchInner", type=
"Flag",
 
   44             doc=
"true if source is in the inner region of a coadd patch",
 
   47             "detect_isTractInner", type=
"Flag",
 
   48             doc=
"true if source is in the inner region of a coadd tract",
 
   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)",
 
   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? 
   70             nChildKey = self.
schema.find(self.
config.nChildKeyName).key
 
   74         innerFloatBBox = 
Box2D(patchInfo.getInnerBBox())
 
   80         shrunkInnerFloatBBox = 
Box2D(innerFloatBBox)
 
   81         shrunkInnerFloatBBox.grow(-1)
 
   84         for filt 
in self.
config.pseudoFilterList:
 
   86                 pseudoFilterKeys.append(self.
schema.find(
"merge_peak_%s" % filt).getKey())
 
   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)):
 
   95             if source.getCentroidFlag():
 
   97                 isPatchInner = shrunkInnerFloatBBox.contains(centroidPos)
 
   99                 isPatchInner = innerFloatBBox.contains(centroidPos)
 
  102             skyPos = source.getCoord()
 
  103             sourceInnerTractId = skyMap.findTract(skyPos).getId()
 
  104             isTractInner = sourceInnerTractId == tractId
 
  107             if nChildKey 
is None or source.get(nChildKey) == 0:
 
  108                 for pseudoFilterKey 
in pseudoFilterKeys:
 
  109                     if source.get(pseudoFilterKey):
 
  115                 source.setFlag(self.
isPrimaryKey, isPatchInner 
and isTractInner 
and not isPseudo)