def checkTract(self, cache, tractId, selectIdList): """!Check whether a tract has any overlapping inputs This method only runs on slave nodes. @param cache: Pool cache @param tractId: Data identifier for tract @param selectDataList: List of selection data @return whether tract has any overlapping inputs """ skymap = cache.skymap tract = skymap[tractId] tractWcs = tract.getWcs() tractPoly = convexHull([tractWcs.pixelToSky(afwGeom.Point2D(coord)).getVector() for coord in tract.getBBox().getCorners()]) for selectData in selectIdList: if not hasattr(selectData, "poly"): wcs = selectData.wcs dims = selectData.dims box = afwGeom.Box2D(afwGeom.Point2D(0, 0), afwGeom.Point2D(*dims)) selectData.poly = convexHull([wcs.pixelToSky(coord).getVector() for coord in box.getCorners()]) if tractPoly.intersects(selectData.poly): return True return False
def runDataRef(self, dataRef, coordList, makeDataRefList=True, selectDataList=[]): """Select images in the selectDataList that overlap the patch We use the "convexHull" function in the geom package to define polygons on the celestial sphere, and test the polygon of the patch for overlap with the polygon of the image. We use "convexHull" instead of generating a SphericalConvexPolygon directly because the standard for the inputs to SphericalConvexPolygon are pretty high and we don't want to be responsible for reaching them. If "convexHull" is found to be too slow, we can revise this. @param dataRef: Data reference for coadd/tempExp (with tract, patch) @param coordList: List of Coord specifying boundary of patch @param makeDataRefList: Construct a list of data references? @param selectDataList: List of SelectStruct, to consider for selection """ from lsst.geom import convexHull dataRefList = [] exposureInfoList = [] patchVertices = [coord.getVector() for coord in coordList] patchPoly = convexHull(patchVertices) for data in selectDataList: dataRef = data.dataRef imageWcs = data.wcs nx,ny = data.dims imageBox = afwGeom.Box2D(afwGeom.Point2D(0,0), afwGeom.Extent2D(nx, ny)) try: imageCorners = [imageWcs.pixelToSky(pix) for pix in imageBox.getCorners()] except (pexExceptions.DomainError, pexExceptions.RuntimeError) as e: # Protecting ourselves from awful Wcs solutions in input images self.log.logdebug("WCS error in testing calexp %s (%s): deselecting" % (dataRef.dataId, e)) continue imagePoly = convexHull([coord.getVector() for coord in imageCorners]) if imagePoly is None: self.log.logdebug("Unable to create polygon from image %s: deselecting" % dataRef.dataId) continue if patchPoly.intersects(imagePoly): # "intersects" also covers "contains" or "is contained by" self.log.info("Selecting calexp %s" % dataRef.dataId) dataRefList.append(dataRef) exposureInfoList.append(BaseExposureInfo(dataRef.dataId, imageCorners)) return pipeBase.Struct( dataRefList = dataRefList if makeDataRefList else None, exposureInfoList = exposureInfoList, )
def overlapsTract(tract, imageWcs, imageBox): """Return whether the image (specified by Wcs and bounding box) overlaps the tract @param tract: TractInfo specifying a tract @param imageWcs: Wcs for image @param imageBox: Bounding box for image @return bool """ tractWcs = tract.getWcs() tractCorners = [tractWcs.pixelToSky(lsst.afw.geom.Point2D(coord)).getVector() for coord in tract.getBBox().getCorners()] tractPoly = convexHull(tractCorners) try: imageCorners = [imageWcs.pixelToSky(lsst.afw.geom.Point2D(pix)) for pix in imageBox.getCorners()] except lsst.pex.exceptions.LsstCppException, e: # Protecting ourselves from awful Wcs solutions in input images if (not isinstance(e.message, lsst.pex.exceptions.DomainErrorException) and not isinstance(e.message, lsst.pex.exceptions.RuntimeErrorException)): raise return False
for tractSet in visitTract.itervalues(): tractCounter.update(tractSet) log.info("Number of visits for each tract: %s" % (dict(tractCounter),)) def overlapsTract(tract, imageWcs, imageBox): """Return whether the image (specified by Wcs and bounding box) overlaps the tract @param tract: TractInfo specifying a tract @param imageWcs: Wcs for image @param imageBox: Bounding box for image @return bool """ tractWcs = tract.getWcs() tractCorners = [tractWcs.pixelToSky(lsst.afw.geom.Point2D(coord)).getVector() for coord in tract.getBBox().getCorners()] tractPoly = convexHull(tractCorners) try: imageCorners = [imageWcs.pixelToSky(lsst.afw.geom.Point2D(pix)) for pix in imageBox.getCorners()] except lsst.pex.exceptions.LsstCppException, e: # Protecting ourselves from awful Wcs solutions in input images if (not isinstance(e.message, lsst.pex.exceptions.DomainErrorException) and not isinstance(e.message, lsst.pex.exceptions.RuntimeErrorException)): raise return False imagePoly = convexHull([coord.getVector() for coord in imageCorners]) if imagePoly is None: return False return tractPoly.intersects(imagePoly) # "intersects" also covers "contains" or "is contained by"
def runDataRef(self, dataRef, coordList, makeDataRefList=True, selectDataList=[]): """Select images in the selectDataList that overlap the patch We use the "convexHull" function in the geom package to define polygons on the celestial sphere, and test the polygon of the patch for overlap with the polygon of the image. We use "convexHull" instead of generating a SphericalConvexPolygon directly because the standard for the inputs to SphericalConvexPolygon are pretty high and we don't want to be responsible for reaching them. If "convexHull" is found to be too slow, we can revise this. @param dataRef: Data reference for coadd/tempExp (with tract, patch) @param coordList: List of Coord specifying boundary of patch @param makeDataRefList: Construct a list of data references? @param selectDataList: List of SelectStruct, to consider for selection """ from lsst.geom import convexHull dataRefList = [] exposureInfoList = [] patchVertices = [coord.getVector() for coord in coordList] patchPoly = convexHull(patchVertices) for data in selectDataList: dataRef = data.dataRef imageWcs = data.wcs nx, ny = data.dims imageBox = afwGeom.Box2D(afwGeom.Point2D(0, 0), afwGeom.Extent2D(nx, ny)) try: imageCorners = [ imageWcs.pixelToSky(pix) for pix in imageBox.getCorners() ] except (pexExceptions.DomainError, pexExceptions.RuntimeError) as e: # Protecting ourselves from awful Wcs solutions in input images self.log.debug( "WCS error in testing calexp %s (%s): deselecting", dataRef.dataId, e) continue imagePoly = convexHull( [coord.getVector() for coord in imageCorners]) if imagePoly is None: self.log.debug( "Unable to create polygon from image %s: deselecting", dataRef.dataId) continue if patchPoly.intersects( imagePoly ): # "intersects" also covers "contains" or "is contained by" self.log.info("Selecting calexp %s" % dataRef.dataId) dataRefList.append(dataRef) exposureInfoList.append( BaseExposureInfo(dataRef.dataId, imageCorners)) return pipeBase.Struct( dataRefList=dataRefList if makeDataRefList else None, exposureInfoList=exposureInfoList, )