コード例 #1
0
def setup_module(module):
    lsst.utils.tests.init()

    if os.path.exists(DATAREPO_ROOT):
        print("Deleting existing repo: %r" % (DATAREPO_ROOT,))
        shutil.rmtree(DATAREPO_ROOT)

    if not haveMeasBase:
        raise unittest.SkipTest("meas_base could not be imported")

    # Create a task that creates simulated images and builds a coadd from them
    mocksTask = lsst.pipe.tasks.mocks.MockCoaddTask()

    # Create an instance of DetectCoaddSourcesTask to measure on the coadd.
    # There's no noise in these images, so we set a direct-value threshold,
    # and the background weighting (when using Approximate) to False

    detectConfig = DetectCoaddSourcesTask.ConfigClass()
    # Images have no noise, so we can't use the default DynamicDetectionTask
    detectConfig.detection.retarget(lsst.meas.algorithms.SourceDetectionTask)
    detectConfig.detection.thresholdType = "value"
    detectConfig.detection.thresholdValue = 0.01
    detectConfig.detection.background.weighting = False
    detectTask = DetectCoaddSourcesTask(config=detectConfig)

    butler = lsst.pipe.tasks.mocks.makeDataRepo(DATAREPO_ROOT)

    mocksTask.buildAllInputs(butler)

    addMaskPlanes(butler)
    mocksTask.buildCoadd(butler)
    mocksTask.buildMockCoadd(butler)
    detectTask.writeSchemas(butler)
    # Now run the seperate multiband tasks on the Coadd to make the reference
    # catalog for the forced photometry tests.
    runTaskOnPatches(butler, detectTask, mocksTask)

    mergeDetConfig = MergeDetectionsTask.ConfigClass()
    mergeDetConfig.priorityList = ['r', ]
    mergeDetTask = MergeDetectionsTask(config=mergeDetConfig, butler=butler)
    mergeDetTask.writeSchemas(butler)
    runTaskOnPatchList(butler, mergeDetTask, mocksTask)

    measMergedConfig = MeasureMergedCoaddSourcesTask.ConfigClass()
    measMergedConfig.measurement.slots.shape = "base_SdssShape"
    measMergedConfig.measurement.plugins['base_PixelFlags'].masksFpAnywhere = []
    measMergedConfig.propagateFlags.flags = {}  # Disable flag propagation: no flags to propagate
    measMergedConfig.doMatchSources = False  # We don't have a reference catalog available
    measMergedTask = MeasureMergedCoaddSourcesTask(config=measMergedConfig, butler=butler)
    measMergedTask.writeSchemas(butler)
    runTaskOnPatches(butler, measMergedTask, mocksTask)

    mergeMeasConfig = MergeMeasurementsTask.ConfigClass()
    mergeMeasConfig.priorityList = ['r', ]
    mergeMeasTask = MergeMeasurementsTask(config=mergeMeasConfig, butler=butler)
    mergeMeasTask.writeSchemas(butler)
    runTaskOnPatchList(butler, mergeMeasTask, mocksTask)

    runForcedPhotCoaddTask(butler, mocksTask)
    runForcedPhotCcdTask(butler)
コード例 #2
0
def setup_module(module):
    lsst.utils.tests.init()

    if os.path.exists(DATAREPO_ROOT):
        print("Deleting existing repo: %r" % (DATAREPO_ROOT,))
        shutil.rmtree(DATAREPO_ROOT)

    if not haveMeasBase:
        raise unittest.SkipTest("meas_base could not be imported")

    # Create a task that creates simulated images and builds a coadd from them
    mocksTask = lsst.pipe.tasks.mocks.MockCoaddTask()

    # Create an instance of DetectCoaddSourcesTask to measure on the coadd.
    # There's no noise in these images, so we set a direct-value threshold,
    # and the background weighting (when using Approximate) to False

    detectConfig = DetectCoaddSourcesTask.ConfigClass()
    # Images have no noise, so we can't use the default DynamicDetectionTask
    detectConfig.detection.retarget(lsst.meas.algorithms.SourceDetectionTask)
    detectConfig.detection.thresholdType = "value"
    detectConfig.detection.thresholdValue = 0.01
    detectConfig.detection.background.weighting = False
    detectTask = DetectCoaddSourcesTask(config=detectConfig)

    butler = lsst.pipe.tasks.mocks.makeDataRepo(DATAREPO_ROOT)

    mocksTask.buildAllInputs(butler)

    addMaskPlanes(butler)
    mocksTask.buildCoadd(butler)
    mocksTask.buildMockCoadd(butler)
    detectTask.writeSchemas(butler)
    # Now run the seperate multiband tasks on the Coadd to make the reference
    # catalog for the forced photometry tests.
    runTaskOnPatches(butler, detectTask, mocksTask)

    mergeDetConfig = MergeDetectionsTask.ConfigClass()
    mergeDetConfig.priorityList = ['r', ]
    mergeDetTask = MergeDetectionsTask(config=mergeDetConfig, butler=butler)
    mergeDetTask.writeSchemas(butler)
    runTaskOnPatchList(butler, mergeDetTask, mocksTask)

    deblendSourcesConfig = DeblendCoaddSourcesTask.ConfigClass()
    deblendSourcesTask = DeblendCoaddSourcesTask(config=deblendSourcesConfig, butler=butler)
    deblendSourcesTask.writeSchemas(butler)
    runTaskOnPatchList(butler, deblendSourcesTask, mocksTask)

    measMergedConfig = MeasureMergedCoaddSourcesTask.ConfigClass()
    measMergedConfig.measurement.slots.shape = "base_SdssShape"
    measMergedConfig.measurement.plugins['base_PixelFlags'].masksFpAnywhere = []
    measMergedConfig.propagateFlags.flags = {}  # Disable flag propagation: no flags to propagate
    measMergedConfig.doMatchSources = False  # We don't have a reference catalog available
    measMergedTask = MeasureMergedCoaddSourcesTask(config=measMergedConfig, butler=butler)
    measMergedTask.writeSchemas(butler)
    runTaskOnPatches(butler, measMergedTask, mocksTask)

    mergeMeasConfig = MergeMeasurementsTask.ConfigClass()
    mergeMeasConfig.priorityList = ['r', ]
    mergeMeasTask = MergeMeasurementsTask(config=mergeMeasConfig, butler=butler)
    mergeMeasTask.writeSchemas(butler)
    runTaskOnPatchList(butler, mergeMeasTask, mocksTask)

    runForcedPhotCoaddTask(butler, mocksTask)
    runForcedPhotCcdTask(butler)
コード例 #3
0
    def setUpClass(cls):
        """Create 200MB of test data."""
        # Start by assuming nothing failed
        cls.failed = False

        if os.path.exists(DATAREPO_ROOT):
            print(f"Deleting existing repo: {DATAREPO_ROOT}")
            # Do not ignore errors since failure to clean up is indicative
            shutil.rmtree(DATAREPO_ROOT)

        # Create a task that creates simulated images and builds a coadd from them
        mocksTask = lsst.pipe.tasks.mocks.MockCoaddTask()

        # Create an instance of DetectCoaddSourcesTask to measure on the coadd.
        # There's no noise in these images, so we set a direct-value threshold,
        # and the background weighting (when using Approximate) to False

        detectConfig = DetectCoaddSourcesTask.ConfigClass()
        # Images have no noise, so we can't use the default DynamicDetectionTask
        detectConfig.detection.retarget(
            lsst.meas.algorithms.SourceDetectionTask)
        detectConfig.detection.thresholdType = "value"
        detectConfig.detection.thresholdValue = 0.01
        detectConfig.detection.background.weighting = False
        detectTask = DetectCoaddSourcesTask(config=detectConfig)

        butler = lsst.pipe.tasks.mocks.makeDataRepo(DATAREPO_ROOT)

        mocksTask.buildAllInputs(butler)

        addMaskPlanes(butler)
        mocksTask.buildCoadd(butler)
        mocksTask.buildMockCoadd(butler)
        detectTask.writeSchemas(butler)
        # Now run the seperate multiband tasks on the Coadd to make the reference
        # catalog for the forced photometry tests.
        runTaskOnPatches(butler, detectTask, mocksTask)

        mergeDetConfig = MergeDetectionsTask.ConfigClass()
        mergeDetConfig.priorityList = [
            'r',
        ]
        mergeDetTask = MergeDetectionsTask(config=mergeDetConfig,
                                           butler=butler)
        mergeDetTask.writeSchemas(butler)
        runTaskOnPatchList(butler, mergeDetTask, mocksTask)

        deblendSourcesConfig = DeblendCoaddSourcesTask.ConfigClass()
        deblendSourcesTask = DeblendCoaddSourcesTask(
            config=deblendSourcesConfig, butler=butler)
        deblendSourcesTask.writeSchemas(butler)
        runTaskOnPatchList(butler, deblendSourcesTask, mocksTask)

        measMergedConfig = MeasureMergedCoaddSourcesTask.ConfigClass()
        measMergedConfig.measurement.slots.shape = "base_SdssShape"
        measMergedConfig.measurement.plugins[
            'base_PixelFlags'].masksFpAnywhere = []
        measMergedConfig.propagateFlags.flags = {
        }  # Disable flag propagation: no flags to propagate
        measMergedConfig.doMatchSources = False  # We don't have a reference catalog available
        measMergedTask = MeasureMergedCoaddSourcesTask(config=measMergedConfig,
                                                       butler=butler)
        measMergedTask.writeSchemas(butler)
        runTaskOnPatches(butler, measMergedTask, mocksTask)

        mergeMeasConfig = MergeMeasurementsTask.ConfigClass()
        mergeMeasConfig.priorityList = [
            'r',
        ]
        mergeMeasTask = MergeMeasurementsTask(config=mergeMeasConfig,
                                              butler=butler)
        mergeMeasTask.writeSchemas(butler)
        runTaskOnPatchList(butler, mergeMeasTask, mocksTask)

        runForcedPhotCoaddTask(butler, mocksTask)
        runForcedPhotCcdTask(butler)
コード例 #4
0
class CoaddsTestCase(lsst.utils.tests.TestCase):
    def setupClass(self):
        """Delete the data repo if it exists"""

    def setUp(self):

        # Create a task that creates simulated images and builds a coadd from them
        self.mocksTask = lsst.pipe.tasks.mocks.MockCoaddTask()

        # Create an instance of DetectCoaddSourcesTask to measure on the coadd.
        # There's no noise in these images, so we set a direct-value threshold,
        # and the background weighting (when using Approximate) to False

        detectConfig = DetectCoaddSourcesTask.ConfigClass()
        detectConfig.detection.thresholdType = "value"
        detectConfig.detection.thresholdValue = 0.01
        detectConfig.detection.background.weighting = False
        self.detectTask = DetectCoaddSourcesTask(config=detectConfig)

        if REUSE_DATAREPO and os.path.exists(
                os.path.join(DATAREPO_ROOT, "_mapper")):
            self.butler = lsst.daf.persistence.Butler(DATAREPO_ROOT)
        else:
            self.butler = lsst.pipe.tasks.mocks.makeDataRepo(DATAREPO_ROOT)

            self.mocksTask.buildAllInputs(self.butler)
            self.addMaskPlanes()
            self.checkMaskPlanesExist()
            self.mocksTask.buildCoadd(self.butler)
            self.mocksTask.buildMockCoadd(self.butler)
            self.detectTask.writeSchemas(self.butler)
            # Now run the seperate multiband tasks on the Coadd to make the reference
            # catalog for the forced photometry tests.
            self.runTaskOnPatches(self.detectTask)

            mergeDetConfig = MergeDetectionsTask.ConfigClass()
            mergeDetConfig.priorityList = [
                'r',
            ]
            mergeDetTask = MergeDetectionsTask(config=mergeDetConfig,
                                               butler=self.butler)
            mergeDetTask.writeSchemas(self.butler)
            self.runTaskOnPatchList(mergeDetTask)

            measMergedConfig = MeasureMergedCoaddSourcesTask.ConfigClass()
            measMergedConfig.measurement.slots.shape = "base_SdssShape"
            measMergedConfig.measurement.doApplyApCorr = "no"
            measMergedConfig.measurement.plugins[
                'base_PixelFlags'].masksFpAnywhere = []
            measMergedConfig.propagateFlags.flags = {
            }  # Disable flag propagation: no flags to propagate
            measMergedConfig.doMatchSources = False  # We don't have a reference catalog available
            measMergedTask = MeasureMergedCoaddSourcesTask(
                config=measMergedConfig, butler=self.butler)
            measMergedTask.writeSchemas(self.butler)
            self.runTaskOnPatches(measMergedTask)

            mergeMeasConfig = MergeMeasurementsTask.ConfigClass()
            mergeMeasConfig.priorityList = [
                'r',
            ]
            mergeMeasTask = MergeMeasurementsTask(config=mergeMeasConfig,
                                                  butler=self.butler)
            mergeMeasTask.writeSchemas(self.butler)
            self.runTaskOnPatchList(mergeMeasTask)

    def tearDown(self):
        if not REUSE_DATAREPO:
            shutil.rmtree(DATAREPO_ROOT)
        del self.mocksTask
        del self.detectTask
        del self.butler

    def getCalexpIds(self, butler):
        if len(butler.repository._parents) is not 1:
            raise RuntimeError(
                "This test assumes one input repository, can not continue with %s"
                % butler.repository._parents)

        return butler.repository._parents[0]._mapper.index['calexp']['visit'][
            None]

    def addMaskPlanes(self):
        butler = lsst.daf.persistence.Butler(DATAREPO_ROOT)
        # Get the dataId for each calexp in the repository
        calexpDataIds = self.getCalexpIds(butler)
        # Loop over each of the calexp and add the CROSSTALK and NOT_DEBLENDED mask planes
        for Id in calexpDataIds:
            image = butler.get('calexp', Id)
            mask = image.getMaskedImage().getMask()
            mask.addMaskPlane("CROSSTALK")
            mask.addMaskPlane("NOT_DEBLENDED")
            butler.put(image, 'calexp', dataId=Id)

    def checkMaskPlanesExist(self):
        butler = lsst.daf.persistence.Butler(DATAREPO_ROOT)
        # Get the dataId for each calexp in the repository
        calexpDataIds = self.getCalexpIds(butler)
        # Loop over each Id and verify the mask planes were added
        for ID in calexpDataIds:
            image = butler.get('calexp', ID)
            mask = image.getMaskedImage().getMask()
            self.assert_('CROSSTALK' in mask.getMaskPlaneDict().keys())
            self.assert_('NOT_DEBLENDED' in mask.getMaskPlaneDict().keys())

    def runTaskOnPatches(self, task, tract=0):
        skyMap = self.butler.get(self.mocksTask.config.coaddName +
                                 "Coadd_skyMap",
                                 immediate=True)
        tractInfo = skyMap[tract]
        for dataRef in self.mocksTask.iterPatchRefs(self.butler, tractInfo):
            task.run(dataRef)

    def runTaskOnPatchList(self, task, tract=0):
        skyMap = self.butler.get(self.mocksTask.config.coaddName +
                                 "Coadd_skyMap",
                                 immediate=True)
        tractInfo = skyMap[tract]
        for dataRef in self.mocksTask.iterPatchRefs(self.butler, tractInfo):
            task.run([dataRef])

    def runTaskOnCcds(self, task, tract=0):
        catalog = self.butler.get("observations", tract=tract, immediate=True)
        visitKey = catalog.getSchema().find("visit").key
        ccdKey = catalog.getSchema().find("ccd").key
        for record in catalog:
            dataRef = self.butler.dataRef("forced_src",
                                          tract=tract,
                                          visit=record.getI(visitKey),
                                          ccd=record.getI(ccdKey))
            task.run(dataRef)

    def getObsDict(self, tract=0):
        catalog = self.butler.get("observations", tract=tract, immediate=True)
        visitKey = catalog.getSchema().find("visit").key
        ccdKey = catalog.getSchema().find("ccd").key
        obsDict = {}
        for record in catalog:
            visit = record.getI(visitKey)
            ccd = record.getI(ccdKey)
            obsDict.setdefault(visit, {})[ccd] = record
        return obsDict

    def comparePsfs(self, a, b):
        if a is None and b is None:
            return
        ak = lsst.meas.algorithms.KernelPsf.swigConvert(a).getKernel()
        bk = lsst.meas.algorithms.KernelPsf.swigConvert(b).getKernel()
        self.assertEqual(type(ak), type(bk))
        self.assertEqual(ak.getDimensions(), bk.getDimensions())
        self.assertEqual(ak.getNKernelParameters(), ak.getNKernelParameters())
        self.assertEqual(ak.getNSpatialParameters(),
                         ak.getNSpatialParameters())
        for aFuncParams, bFuncParams in zip(ak.getSpatialParameters(),
                                            bk.getSpatialParameters()):
            for aParam, bParam in zip(aFuncParams, bFuncParams):
                self.assertEqual(aParam, bParam)

    @unittest.skip("Remove test until DM-5174 is complete")
    def testMasksRemoved(self):
        image = self.butler.get(self.mocksTask.config.coaddName + 'Coadd_mock',\
                                {'filter':'r','tract':0, 'patch':'0,0'})
        keys = image.getMaskedImage().getMask().getMaskPlaneDict().keys()
        self.assert_('CROSSTALK' not in keys)
        self.assert_('NOT_DEBLENDED' not in keys)

    def testTempExpInputs(self, tract=0):
        skyMap = self.butler.get(self.mocksTask.config.coaddName +
                                 "Coadd_skyMap",
                                 immediate=True)
        tractInfo = skyMap[tract]
        for visit, obsVisitDict in self.getObsDict(tract).iteritems():
            foundOneTempExp = False
            for patchRef in self.mocksTask.iterPatchRefs(
                    self.butler, tractInfo):
                try:
                    tempExp = patchRef.get(self.mocksTask.config.coaddName +
                                           "Coadd_tempExp",
                                           visit=visit,
                                           immediate=True)
                    foundOneTempExp = True
                except:
                    continue
                self.assertEqual(tractInfo.getWcs(), tempExp.getWcs())
                coaddInputs = tempExp.getInfo().getCoaddInputs()
                self.assertEqual(len(coaddInputs.visits), 1)
                visitRecord = coaddInputs.visits[0]
                self.assertEqual(visitRecord.getWcs(), tempExp.getWcs())
                self.assertEqual(visitRecord.getBBox(), tempExp.getBBox())
                self.assert_(len(coaddInputs.ccds) > 0)
                ccdKey = coaddInputs.ccds.getSchema().find("ccd").key
                for ccdRecord in coaddInputs.ccds:
                    ccd = ccdRecord.getI(ccdKey)
                    obsRecord = obsVisitDict[ccd]
                    self.assertEqual(obsRecord.getId(), ccdRecord.getId())
                    self.assertEqual(obsRecord.getWcs(), ccdRecord.getWcs())
                    self.assertEqual(obsRecord.getBBox(), ccdRecord.getBBox())
                    self.comparePsfs(obsRecord.getPsf(), ccdRecord.getPsf())
            self.assert_(foundOneTempExp)

    def testCoaddInputs(self, tract=0):
        skyMap = self.butler.get(self.mocksTask.config.coaddName +
                                 "Coadd_skyMap",
                                 immediate=True)
        tractInfo = skyMap[tract]
        obsCatalog = self.butler.get("observations",
                                     tract=tract,
                                     immediate=True)
        for patchRef in self.mocksTask.iterPatchRefs(self.butler, tractInfo):
            coaddExp = patchRef.get(self.mocksTask.config.coaddName + "Coadd",
                                    immediate=True)
            self.assertEqual(tractInfo.getWcs(), coaddExp.getWcs())
            coaddInputs = coaddExp.getInfo().getCoaddInputs()
            try:
                ccdVisitKey = coaddInputs.ccds.getSchema().find("visit").key
            except:
                print patchRef.dataId
                print coaddInputs.ccds.getSchema()
                raise
            for ccdRecord in coaddInputs.ccds:
                obsRecord = obsCatalog.find(ccdRecord.getId())
                self.assertEqual(obsRecord.getId(), ccdRecord.getId())
                self.assertEqual(obsRecord.getWcs(), ccdRecord.getWcs())
                self.assertEqual(obsRecord.getBBox(), ccdRecord.getBBox())
                self.comparePsfs(obsRecord.getPsf(), ccdRecord.getPsf())
                self.assert_(
                    coaddInputs.visits.find(ccdRecord.getL(ccdVisitKey))
                    is not None)
            for visitRecord in coaddInputs.visits:
                nCcds = len([
                    ccdRecord for ccdRecord in coaddInputs.ccds
                    if ccdRecord.getL(ccdVisitKey) == visitRecord.getId()
                ])
                self.assert_(nCcds >= 1)
                self.assert_(nCcds <= 2)

    def testPsfInstallation(self, tract=0):
        skyMap = self.butler.get(self.mocksTask.config.coaddName +
                                 "Coadd_skyMap",
                                 immediate=True)
        tractInfo = skyMap[tract]
        for patchRef in self.mocksTask.iterPatchRefs(self.butler, tractInfo):
            coaddExp = patchRef.get(self.mocksTask.config.coaddName + "Coadd",
                                    immediate=True)
            ccdCat = coaddExp.getInfo().getCoaddInputs().ccds
            savedPsf = lsst.meas.algorithms.CoaddPsf.swigConvert(
                coaddExp.getPsf())
            newPsf = lsst.meas.algorithms.CoaddPsf(ccdCat, coaddExp.getWcs())
            self.assertEqual(savedPsf.getComponentCount(), len(ccdCat))
            self.assertEqual(newPsf.getComponentCount(), len(ccdCat))
            for n, record in enumerate(ccdCat):
                self.assert_(
                    lsst.afw.table.io.comparePersistablePtrs(
                        savedPsf.getPsf(n), record.getPsf()))
                self.assert_(
                    lsst.afw.table.io.comparePersistablePtrs(
                        newPsf.getPsf(n), record.getPsf()))
                self.assert_(
                    lsst.afw.table.io.comparePersistablePtrs(
                        savedPsf.getWcs(n), record.getWcs()))
                self.assert_(
                    lsst.afw.table.io.comparePersistablePtrs(
                        newPsf.getWcs(n), record.getWcs()))
                self.assertEqual(savedPsf.getBBox(n), record.getBBox())
                self.assertEqual(newPsf.getBBox(n), record.getBBox())

    def testCoaddPsf(self, tract=0):
        skyMap = self.butler.get(self.mocksTask.config.coaddName +
                                 "Coadd_skyMap",
                                 immediate=True)
        tractInfo = skyMap[tract]
        # Start by finding objects that never appeared on the edge of an image
        simSrcCat = self.butler.get("simsrc", tract=tract, immediate=True)
        simSrcSchema = simSrcCat.getSchema()
        objectIdKey = simSrcSchema.find("objectId").key
        centroidInBBoxKey = simSrcSchema.find("centroidInBBox").key
        partialOverlapKey = simSrcSchema.find("partialOverlap").key
        simSrcByObject = {}
        for simSrcRecord in simSrcCat:
            simSrcByObject.setdefault(simSrcRecord.getL(objectIdKey),
                                      []).append(simSrcRecord)
        pureObjectIds = set(
        )  # set will contain objects that never appear on edges
        for objectId, simSrcRecords in simSrcByObject.iteritems():
            inAnyImages = False
            for simSrcRecord in simSrcRecords:
                if simSrcRecord.getFlag(centroidInBBoxKey):
                    if simSrcRecord.getFlag(partialOverlapKey):
                        break
                    inAnyImages = True
            else:  # only get here if we didn't break
                if inAnyImages:
                    pureObjectIds.add(objectId)

        truthCatalog = self.butler.get("truth", tract=tract, immediate=True)
        truthCatalog.sort()
        nTested = 0
        for patchRef in self.mocksTask.iterPatchRefs(self.butler, tractInfo):
            coaddExp = patchRef.get(self.mocksTask.config.coaddName + "Coadd",
                                    immediate=True)
            coaddWcs = coaddExp.getWcs()
            coaddPsf = coaddExp.getPsf()
            coaddBBox = lsst.afw.geom.Box2D(coaddExp.getBBox())
            for objectId in pureObjectIds:
                truthRecord = truthCatalog.find(objectId)
                position = coaddWcs.skyToPixel(truthRecord.getCoord())
                if not coaddBBox.contains(position):
                    continue
                try:
                    psfImage = coaddPsf.computeImage(position)
                except:
                    continue
                psfImageBBox = psfImage.getBBox()
                if not coaddExp.getBBox().contains(psfImageBBox):
                    continue
                starImage = lsst.afw.image.ImageF(
                    coaddExp.getMaskedImage().getImage(),
                    psfImageBBox).convertD()
                starImage /= starImage.getArray().sum()
                psfImage /= psfImage.getArray().sum()
                residuals = lsst.afw.image.ImageD(starImage, True)
                residuals -= psfImage

                self.assertClose(starImage.getArray(),
                                 psfImage.getArray(),
                                 rtol=1E-3,
                                 atol=1E-2)
                nTested += 1
        if nTested == 0:
            print(
                "WARNING: CoaddPsf test inconclusive (this can occur randomly, but very rarely; "
                "first try running the test again)")

    def testForcedPhotCoaddTask(self):
        config = lsst.meas.base.ForcedPhotCoaddConfig()
        config.references.filter = 'r'
        config.measurement.doApplyApCorr = "no"
        task = lsst.meas.base.ForcedPhotCoaddTask(config=config,
                                                  butler=self.butler)
        task.writeSchemas(self.butler)
        self.runTaskOnPatches(task)

    def testForcedPhotCcdTask(self):
        config = lsst.meas.base.ForcedPhotCcdConfig()
        config.references.filter = 'r'
        config.measurement.doApplyApCorr = "no"
        task = lsst.meas.base.ForcedPhotCcdTask(config=config,
                                                butler=self.butler)
        self.runTaskOnCcds(task)
コード例 #5
0
class CoaddsTestCase(lsst.utils.tests.TestCase):

    def setupClass(self):
        """Delete the data repo if it exists"""

    def setUp(self):

        # Create a task that creates simulated images and builds a coadd from them
        self.mocksTask = lsst.pipe.tasks.mocks.MockCoaddTask()

        # Create an instance of DetectCoaddSourcesTask to measure on the coadd.
        # There's no noise in these images, so we set a direct-value threshold,
        # and the background weighting (when using Approximate) to False

        detectConfig = DetectCoaddSourcesTask.ConfigClass()
        detectConfig.detection.thresholdType = "value"
        detectConfig.detection.thresholdValue = 0.01
        detectConfig.detection.background.weighting = False
        self.detectTask = DetectCoaddSourcesTask(config=detectConfig)

        if REUSE_DATAREPO and os.path.exists(os.path.join(DATAREPO_ROOT, "_mapper")):
            self.butler = lsst.daf.persistence.Butler(DATAREPO_ROOT)
        else:
            self.butler = lsst.pipe.tasks.mocks.makeDataRepo(DATAREPO_ROOT)

            self.mocksTask.buildAllInputs(self.butler)
            self.addMaskPlanes()
            self.checkMaskPlanesExist()
            self.mocksTask.buildCoadd(self.butler)
            self.mocksTask.buildMockCoadd(self.butler)
            self.detectTask.writeSchemas(self.butler)
            # Now run the seperate multiband tasks on the Coadd to make the reference
            # catalog for the forced photometry tests.
            self.runTaskOnPatches(self.detectTask)

            mergeDetConfig = MergeDetectionsTask.ConfigClass()
            mergeDetConfig.priorityList = ['r', ]
            mergeDetTask = MergeDetectionsTask(config=mergeDetConfig, butler=self.butler)
            mergeDetTask.writeSchemas(self.butler)
            self.runTaskOnPatchList(mergeDetTask)

            measMergedConfig = MeasureMergedCoaddSourcesTask.ConfigClass()
            measMergedConfig.measurement.slots.shape = "base_SdssShape"
            measMergedConfig.measurement.doApplyApCorr = "no"
            measMergedConfig.measurement.plugins['base_PixelFlags'].masksFpAnywhere = []
            measMergedConfig.propagateFlags.flags = {} # Disable flag propagation: no flags to propagate
            measMergedTask = MeasureMergedCoaddSourcesTask(config=measMergedConfig, butler=self.butler)
            measMergedTask.writeSchemas(self.butler)
            self.runTaskOnPatches(measMergedTask)

            mergeMeasConfig = MergeMeasurementsTask.ConfigClass()
            mergeMeasConfig.priorityList = ['r', ]
            mergeMeasTask = MergeMeasurementsTask(config=mergeMeasConfig, butler=self.butler)
            mergeMeasTask.writeSchemas(self.butler)
            self.runTaskOnPatchList(mergeMeasTask)

    def tearDown(self):
        if not REUSE_DATAREPO:
            shutil.rmtree(DATAREPO_ROOT)
        del self.mocksTask
        del self.detectTask
        del self.butler

    def getCalexpIds(self, butler):
        if len(butler.repository._parents) is not 1:
            raise RuntimeError("This test assumes one input repository, can not continue with %s"
                               % butler.repository._parents)

        return butler.repository._parents[0]._mapper.index['calexp']['visit'][None]

    def addMaskPlanes(self):
        butler = lsst.daf.persistence.Butler(DATAREPO_ROOT)
        # Get the dataId for each calexp in the repository
        calexpDataIds = self.getCalexpIds(butler)
        # Loop over each of the calexp and add the CROSSTALK and NOT_DEBLENDED mask planes
        for Id in calexpDataIds:
            image = butler.get('calexp', Id)
            mask = image.getMaskedImage().getMask()
            mask.addMaskPlane("CROSSTALK")
            mask.addMaskPlane("NOT_DEBLENDED")
            butler.put(image, 'calexp', dataId=Id)

    def checkMaskPlanesExist(self):
        butler = lsst.daf.persistence.Butler(DATAREPO_ROOT)
        # Get the dataId for each calexp in the repository
        calexpDataIds = self.getCalexpIds(butler)
        # Loop over each Id and verify the mask planes were added
        for ID in calexpDataIds:
            image = butler.get('calexp', ID)
            mask = image.getMaskedImage().getMask()
            self.assert_('CROSSTALK' in mask.getMaskPlaneDict().keys())
            self.assert_('NOT_DEBLENDED' in mask.getMaskPlaneDict().keys())

    def runTaskOnPatches(self, task, tract=0):
        skyMap = self.butler.get(self.mocksTask.config.coaddName + "Coadd_skyMap", immediate=True)
        tractInfo = skyMap[tract]
        for dataRef in self.mocksTask.iterPatchRefs(self.butler, tractInfo):
            task.run(dataRef)

    def runTaskOnPatchList(self, task, tract=0):
        skyMap = self.butler.get(self.mocksTask.config.coaddName + "Coadd_skyMap", immediate=True)
        tractInfo = skyMap[tract]
        for dataRef in self.mocksTask.iterPatchRefs(self.butler, tractInfo):
            task.run([dataRef])

    def runTaskOnCcds(self, task, tract=0):
        catalog = self.butler.get("observations", tract=tract, immediate=True)
        visitKey = catalog.getSchema().find("visit").key
        ccdKey = catalog.getSchema().find("ccd").key
        for record in catalog:
            dataRef = self.butler.dataRef("forced_src", tract=tract, visit=record.getI(visitKey),
                                          ccd=record.getI(ccdKey))
            task.run(dataRef)

    def getObsDict(self, tract=0):
        catalog = self.butler.get("observations", tract=tract, immediate=True)
        visitKey = catalog.getSchema().find("visit").key
        ccdKey = catalog.getSchema().find("ccd").key
        obsDict = {}
        for record in catalog:
            visit = record.getI(visitKey)
            ccd = record.getI(ccdKey)
            obsDict.setdefault(visit, {})[ccd] = record
        return obsDict

    def comparePsfs(self, a, b):
        if a is None and b is None:
            return
        ak = lsst.meas.algorithms.KernelPsf.swigConvert(a).getKernel()
        bk = lsst.meas.algorithms.KernelPsf.swigConvert(b).getKernel()
        self.assertEqual(type(ak), type(bk))
        self.assertEqual(ak.getDimensions(), bk.getDimensions())
        self.assertEqual(ak.getNKernelParameters(), ak.getNKernelParameters())
        self.assertEqual(ak.getNSpatialParameters(), ak.getNSpatialParameters())
        for aFuncParams, bFuncParams in zip(ak.getSpatialParameters(), bk.getSpatialParameters()):
            for aParam, bParam in zip(aFuncParams, bFuncParams):
                self.assertEqual(aParam, bParam)

    @unittest.skip("Remove test until DM-5174 is complete")
    def testMasksRemoved(self):
        image = self.butler.get(self.mocksTask.config.coaddName + 'Coadd_mock',\
                                {'filter':'r','tract':0, 'patch':'0,0'})
        keys = image.getMaskedImage().getMask().getMaskPlaneDict().keys()
        self.assert_('CROSSTALK' not in keys)
        self.assert_('NOT_DEBLENDED' not in keys)

    def testTempExpInputs(self, tract=0):
        skyMap = self.butler.get(self.mocksTask.config.coaddName + "Coadd_skyMap", immediate=True)
        tractInfo = skyMap[tract]
        for visit, obsVisitDict in self.getObsDict(tract).iteritems():
            foundOneTempExp = False
            for patchRef in self.mocksTask.iterPatchRefs(self.butler, tractInfo):
                try:
                    tempExp = patchRef.get(self.mocksTask.config.coaddName + "Coadd_tempExp", visit=visit,
                                           immediate=True)
                    foundOneTempExp = True
                except:
                    continue
                self.assertEqual(tractInfo.getWcs(), tempExp.getWcs())
                coaddInputs = tempExp.getInfo().getCoaddInputs()
                self.assertEqual(len(coaddInputs.visits), 1)
                visitRecord = coaddInputs.visits[0]
                self.assertEqual(visitRecord.getWcs(), tempExp.getWcs())
                self.assertEqual(visitRecord.getBBox(), tempExp.getBBox())
                self.assert_(len(coaddInputs.ccds) > 0)
                ccdKey = coaddInputs.ccds.getSchema().find("ccd").key
                for ccdRecord in coaddInputs.ccds:
                    ccd = ccdRecord.getI(ccdKey)
                    obsRecord = obsVisitDict[ccd]
                    self.assertEqual(obsRecord.getId(), ccdRecord.getId())
                    self.assertEqual(obsRecord.getWcs(), ccdRecord.getWcs())
                    self.assertEqual(obsRecord.getBBox(), ccdRecord.getBBox())
                    self.comparePsfs(obsRecord.getPsf(), ccdRecord.getPsf())
            self.assert_(foundOneTempExp)

    def testCoaddInputs(self, tract=0):
        skyMap = self.butler.get(self.mocksTask.config.coaddName + "Coadd_skyMap", immediate=True)
        tractInfo = skyMap[tract]
        obsCatalog = self.butler.get("observations", tract=tract, immediate=True)
        for patchRef in self.mocksTask.iterPatchRefs(self.butler, tractInfo):
            coaddExp = patchRef.get(self.mocksTask.config.coaddName + "Coadd", immediate=True)
            self.assertEqual(tractInfo.getWcs(), coaddExp.getWcs())
            coaddInputs = coaddExp.getInfo().getCoaddInputs()
            try:
                ccdVisitKey = coaddInputs.ccds.getSchema().find("visit").key
            except:
                print patchRef.dataId
                print coaddInputs.ccds.getSchema()
                raise
            for ccdRecord in coaddInputs.ccds:
                obsRecord = obsCatalog.find(ccdRecord.getId())
                self.assertEqual(obsRecord.getId(), ccdRecord.getId())
                self.assertEqual(obsRecord.getWcs(), ccdRecord.getWcs())
                self.assertEqual(obsRecord.getBBox(), ccdRecord.getBBox())
                self.comparePsfs(obsRecord.getPsf(), ccdRecord.getPsf())
                self.assert_(coaddInputs.visits.find(ccdRecord.getL(ccdVisitKey)) is not None)
            for visitRecord in coaddInputs.visits:
                nCcds = len([ccdRecord for ccdRecord in coaddInputs.ccds
                             if ccdRecord.getL(ccdVisitKey) == visitRecord.getId()])
                self.assert_(nCcds >= 1)
                self.assert_(nCcds <= 2)

    def testPsfInstallation(self, tract=0):
        skyMap = self.butler.get(self.mocksTask.config.coaddName + "Coadd_skyMap", immediate=True)
        tractInfo = skyMap[tract]
        for patchRef in self.mocksTask.iterPatchRefs(self.butler, tractInfo):
            coaddExp = patchRef.get(self.mocksTask.config.coaddName + "Coadd", immediate=True)
            ccdCat = coaddExp.getInfo().getCoaddInputs().ccds
            savedPsf = lsst.meas.algorithms.CoaddPsf.swigConvert(coaddExp.getPsf())
            newPsf = lsst.meas.algorithms.CoaddPsf(ccdCat, coaddExp.getWcs())
            self.assertEqual(savedPsf.getComponentCount(), len(ccdCat))
            self.assertEqual(newPsf.getComponentCount(), len(ccdCat))
            for n, record in enumerate(ccdCat):
                self.assert_(lsst.afw.table.io.comparePersistablePtrs(savedPsf.getPsf(n), record.getPsf()))
                self.assert_(lsst.afw.table.io.comparePersistablePtrs(newPsf.getPsf(n), record.getPsf()))
                self.assert_(lsst.afw.table.io.comparePersistablePtrs(savedPsf.getWcs(n), record.getWcs()))
                self.assert_(lsst.afw.table.io.comparePersistablePtrs(newPsf.getWcs(n), record.getWcs()))
                self.assertEqual(savedPsf.getBBox(n), record.getBBox())
                self.assertEqual(newPsf.getBBox(n), record.getBBox())

    def testCoaddPsf(self, tract=0):
        skyMap = self.butler.get(self.mocksTask.config.coaddName + "Coadd_skyMap", immediate=True)
        tractInfo = skyMap[tract]
        # Start by finding objects that never appeared on the edge of an image
        simSrcCat = self.butler.get("simsrc", tract=tract, immediate=True)
        simSrcSchema = simSrcCat.getSchema()
        objectIdKey = simSrcSchema.find("objectId").key
        centroidInBBoxKey = simSrcSchema.find("centroidInBBox").key
        partialOverlapKey = simSrcSchema.find("partialOverlap").key
        simSrcByObject = {}
        for simSrcRecord in simSrcCat:
            simSrcByObject.setdefault(simSrcRecord.getL(objectIdKey), []).append(simSrcRecord)
        pureObjectIds = set() # set will contain objects that never appear on edges
        for objectId, simSrcRecords in simSrcByObject.iteritems():
            inAnyImages = False
            for simSrcRecord in simSrcRecords:
                if simSrcRecord.getFlag(centroidInBBoxKey):
                    if simSrcRecord.getFlag(partialOverlapKey):
                        break
                    inAnyImages = True
            else: # only get here if we didn't break
                if inAnyImages:
                    pureObjectIds.add(objectId)

        truthCatalog = self.butler.get("truth", tract=tract, immediate=True)
        truthCatalog.sort()
        nTested = 0
        for patchRef in self.mocksTask.iterPatchRefs(self.butler, tractInfo):
            coaddExp = patchRef.get(self.mocksTask.config.coaddName + "Coadd", immediate=True)
            coaddWcs = coaddExp.getWcs()
            coaddPsf = coaddExp.getPsf()
            coaddBBox = lsst.afw.geom.Box2D(coaddExp.getBBox())
            for objectId in pureObjectIds:
                truthRecord = truthCatalog.find(objectId)
                position = coaddWcs.skyToPixel(truthRecord.getCoord())
                if not coaddBBox.contains(position):
                    continue
                try:
                    psfImage = coaddPsf.computeImage(position)
                except:
                    continue
                psfImageBBox = psfImage.getBBox()
                if not coaddExp.getBBox().contains(psfImageBBox):
                    continue
                starImage = lsst.afw.image.ImageF(coaddExp.getMaskedImage().getImage(),
                                                  psfImageBBox).convertD()
                starImage /= starImage.getArray().sum()
                psfImage /= psfImage.getArray().sum()
                residuals = lsst.afw.image.ImageD(starImage, True)
                residuals -= psfImage

                self.assertClose(starImage.getArray(), psfImage.getArray(), rtol=1E-3, atol=1E-2)
                nTested += 1
        if nTested == 0:
            print ("WARNING: CoaddPsf test inconclusive (this can occur randomly, but very rarely; "
                   "first try running the test again)")

    def testForcedPhotCoaddTask(self):
        config = lsst.meas.base.ForcedPhotCoaddConfig()
        config.references.filter = 'r'
        config.measurement.doApplyApCorr = "no"
        task = lsst.meas.base.ForcedPhotCoaddTask(config=config, butler=self.butler)
        task.writeSchemas(self.butler)
        self.runTaskOnPatches(task)

    def testForcedPhotCcdTask(self):
        config = lsst.meas.base.ForcedPhotCcdConfig()
        config.references.filter = 'r'
        config.measurement.doApplyApCorr = "no"
        task = lsst.meas.base.ForcedPhotCcdTask(config=config, butler=self.butler)
        self.runTaskOnCcds(task)