Esempio n. 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)
Esempio n. 2
0
def detect(exp):
    from lsst.pipe.tasks.multiBand import DetectCoaddSourcesTask, DetectCoaddSourcesConfig
    if exp is None:
        return None
    config = DetectCoaddSourcesConfig()
    detectCoaddSources = DetectCoaddSourcesTask(config=config)
    r = detectCoaddSources.runDetection(exp, idFactory=None)
    return r
Esempio n. 3
0
    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 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)
Esempio n. 5
0
logger = lsst.log.Log.getDefaultLogger()
logger.setLevel(lsst.log.FATAL)
logger.propagate = False

#DFZ: debug for LSST env variables
pid = str(os.getpid())
#envs = str(os.environ)
#path = str(sys.path)

tm_start = datetime.datetime.now()
sys.stderr.write("\n\n=====> DFZ DEBUG: " + time.ctime() +
                 " OMG I start again! \n")

#DFZ: setup LSST
config = DetectCoaddSourcesConfig()
detectCoaddSources = DetectCoaddSourcesTask(config=config)

end_of_interaction = 0
while (end_of_interaction != 1):
    header = sys.stdin.readline().rstrip()
    sys.stderr.write("=====> DFZ: header = " + header + "\n")
    if (header != "0"):
        num_lines = int(header)  #how many lines did we get?
        sys.stderr.write("=====> DFZ: num_lines = " + str(num_lines) + "\n")

        input_lines = []
        output_lines = []
        for i in range(0, num_lines):
            line = sys.stdin.readline().rstrip()
            if not i % 1000000:
                sys.stderr.write("line " + str(i) + "/" + str(num_lines) +
Esempio n. 6
0
def main():
    # try out one exposure
    #visits = ["0288935","0288976"] #,"0289893","0289913","0289931","0289614","0289818","0289820", "0289850","0289851","0289871","0289892", "0288935","0288976","0289016","0289056","0289161","0289202","0289243","0289284","0289368","0289409","0289450","0289493","0289573","0289656"]
    visits = ["0288976", "0288935"]
    ccds = []
    exit(0)
    for i in range(1, 61):
        ccds.append(i)

    filterName = 'g'

    DATA_PATH = "/root/extra_home/lsst_data/"
    #spathprefix = "/home/dongfang/download/lsst_data/"
    spathprefix = DATA_PATH + "raw/"
    #calexpsloc = "/home/dongfang/download/lsst_data/calexps/"
    calexpsloc = DATA_PATH + "calexps/"
    #coaddloc = "/home/dongfang/download/lsst_data/coadds/"
    coaddloc = DATA_PATH + "coadds/"
    #mergecoaddloc = "/home/dongfang/download/lsst_data/merge/"
    mergecoaddloc = DATA_PATH + "merge/"

    # Characterize Image
    charImageConfig = CharacterizeImageConfig()
    charImage = CharacterizeImageTask()

    calibrateConfig = CalibrateConfig(doPhotoCal=False, doAstrometry=False)
    calibrateTask = CalibrateTask(config=calibrateConfig)

    makeCTEConfig = MakeCoaddTempExpConfig()
    makeCTE = MakeCoaddTempExpTask(config=makeCTEConfig)

    newSkyMapConfig = skymap.discreteSkyMap.DiscreteSkyMapConfig(
        projection='STG',
        decList=[-4.9325280994132905],
        patchInnerDimensions=[2000, 2000],
        radiusList=[4.488775723429071],
        pixelScale=0.333,
        rotation=0.0,
        patchBorder=100,
        raList=[154.10660740464786],
        tractOverlap=0.0)

    hits_skymap = skymap.discreteSkyMap.DiscreteSkyMap(config=newSkyMapConfig)
    tract = hits_skymap[0]
    coaddTempDict = {}
    calibResDict = {}
    f = open("log.txt", 'wb')
    start = datetime.datetime.now()
    #process CCDs to create calexps.
    for v in visits:
        for ccd in ccds:
            visit = int(v)
            filename = "instcal" + v + "." + str(ccd) + ".fits"
            calexpfn = calexpsloc + v + "/" + filename
            source = spathprefix + v + "/" + filename
            exposure = afwImg.ExposureF(source)

            try:
                # Characterize Image
                charRes = charImage.characterize(exposure,
                                                 exposureIdInfo=None,
                                                 background=None)
            except:
                f.write("DFZ DEBUG at charRes: errors in visit " + v +
                        ", ccd " + str(ccd) + "\n")

            try:
                # Caliberate Image
                calibRes = calibrateTask.calibrate(
                    charRes.exposure,
                    exposureIdInfo=None,
                    background=charRes.background,
                    icSourceCat=None)
            except:
                f.write("DFZ DEBUG at calibRes: errors in visit " + v +
                        ", ccd " + str(ccd) + "\n")

            try:
                #write out calexps
                calibRes.exposure.writeFits(calexpfn)
                #calbresDict.append((v,ccd),calibRes)
            except:
                f.write("DFZ DEBUG at calibRes.exposure: errors in visit " +
                        v + ", ccd " + str(ccd) + "\n")

    end = datetime.datetime.now()
    d = end - start

    f.write("time for creating calexps: ")
    f.write(str(d.total_seconds()))
    f.write("\n")

    #time for creating co-add tempexps.
    start = datetime.datetime.now()

    # map calexps to patch-ids
    visit = visits[0]
    ccdsPerPatch = []

    for ccd in ccds:
        filename = "instcal" + visit + "." + str(ccd) + ".fits"
        source = calexpsloc + visit + "/" + filename
        exposure = afwImg.ExposureF(source)
        bbox = exposure.getBBox()
        wcs = exposure.getWcs()
        corners = bbox.getCorners()
        xIndexMax, yIndexMax = tract.findPatch(
            wcs.pixelToSky(corners[0][0], corners[0][1])).getIndex()
        xIndexMin, yIndexMin = tract.findPatch(
            wcs.pixelToSky(corners[2][0], corners[2][1])).getIndex()
        yy = range(yIndexMin, yIndexMax + 1)
        xx = range(xIndexMin, xIndexMax + 1)

        for yIdx in yy:
            for xIdx in xx:
                ccdsPerPatch.append((ccd, (xIdx, yIdx)))
        print len(ccdsPerPatch)
    #import cPickle
    #cPickle.dump(open("ccdsinpatch.p",'wb'),ccdsPerPatch)

    # import cPickle
    # f = open("ccdsInPatch.p",'wb')
    # cPickle.dump(ccdsInPatch,f)
    #import cPickle

    #ccdsInPatch = cPickle.load(open("ccdsInPatch.p",'rb'))
    df = pd.DataFrame(ccdsPerPatch)

    dfgby = df.groupby(1)
    makeCTEConfig = MakeCoaddTempExpConfig()
    makeCTE = MakeCoaddTempExpTask(config=makeCTEConfig)
    coaddTempExpDict = {}
    for visit in visits:
        for a in dfgby.indices:
            coaddTempExpDict[a] = {}
            xInd = a[0]
            yInd = a[1]
            skyInfo = getSkyInfo(hits_skymap, xInd, yInd)
            v = int(visit)

            coaddTempExp = afwImage.ExposureF(skyInfo.bbox, skyInfo.wcs)
            coaddTempExp.getMaskedImage().set(
                numpy.nan, afwImage.MaskU.getPlaneBitMask("NO_DATA"),
                numpy.inf)
            totGoodPix = 0
            didSetMetadata = False
            modelPsf = makeCTEConfig.modelPsf.apply(
            ) if makeCTEConfig.doPsfMatch else None
            setInputRecorder = False

            for b in dfgby.get_group(a)[0].ravel():
                print a
                print b
                if not setInputRecorder:
                    ccdsinPatch = len(dfgby.get_group(a)[0].ravel())
                    try:
                        inputRecorder = makeCTE.inputRecorder.makeCoaddTempExpRecorder(
                            v, ccdsinPatch)
                    except:
                        f.write("DFZ DEBUG at inputRecorder\n")
                    setInputRecorder = True
                numGoodPix = 0
                ccd = b
                filename = "instcal" + visit + "." + str(ccd) + ".fits"
                source = calexpsloc + visit + "/" + filename
                calExp = afwImg.ExposureF(source)
                ccdId = calExp.getId()
                warpedCcdExp = makeCTE.warpAndPsfMatch.run(
                    calExp,
                    modelPsf=modelPsf,
                    wcs=skyInfo.wcs,
                    maxBBox=skyInfo.bbox).exposure
                if didSetMetadata:
                    mimg = calExp.getMaskedImage()
                    mimg *= (coaddTempExp.getCalib().getFluxMag0()[0] /
                             calExp.getCalib().getFluxMag0()[0])
                    del mimg

                numGoodPix = coaddUtils.copyGoodPixels(
                    coaddTempExp.getMaskedImage(),
                    warpedCcdExp.getMaskedImage(), makeCTE.getBadPixelMask())
                totGoodPix += numGoodPix
                if numGoodPix > 0 and not didSetMetadata:
                    coaddTempExp.setCalib(warpedCcdExp.getCalib())
                    coaddTempExp.setFilter(warpedCcdExp.getFilter())
                    didSetMetadata = True

                inputRecorder.addCalExp(calExp, ccdId, numGoodPix)

        ##### End loop over ccds here:
            inputRecorder.finish(coaddTempExp, totGoodPix)
            if totGoodPix > 0 and didSetMetadata:
                coaddTempExp.setPsf(
                    modelPsf if makeCTEConfig.doPsfMatch else CoaddPsf(
                        inputRecorder.coaddInputs.ccds, skyInfo.wcs))

            coaddTempExpDict[a][v] = coaddTempExp
            coaddfilename = coaddloc + visit + "/" + "instcal" + visit + "." + str(
                xInd) + "_" + str(yInd) + ".fits"
            coaddTempExp.writeFits(coaddfilename)

    end = datetime.datetime.now()
    d = end - start
    f.write("time for creating co-add tempexps:\n ")
    f.write(str(d.total_seconds()))
    f.write("\n")

    #DFZ: stop here
    exit(0)

    start = datetime.datetime.now()

    config = AssembleCoaddConfig()
    assembleTask = AssembleCoaddTask(config=config)
    mergcoadds = {}
    for a in dfgby.indices:
        ccdsinPatch = len(dfgby.get_group(a)[0].ravel())
        xInd = a[0]
        yInd = a[1]

        imageScalerRes = prepareInputs(coaddTempExpDict[a].values(),
                                       coaddTempExpDict[a].keys(),
                                       assembleTask)
        mask = None
        doClip = False
        if mask is None:
            mask = assembleTask.getBadPixelMask()

        statsCtrl = afwMath.StatisticsControl()
        statsCtrl.setNumSigmaClip(assembleTask.config.sigmaClip)
        statsCtrl.setNumIter(assembleTask.config.clipIter)
        statsCtrl.setAndMask(mask)
        statsCtrl.setNanSafe(True)
        statsCtrl.setWeighted(True)
        statsCtrl.setCalcErrorFromInputVariance(True)
        for plane, threshold in assembleTask.config.maskPropagationThresholds.items(
        ):
            bit = afwImage.MaskU.getMaskPlane(plane)
            statsCtrl.setMaskPropagationThreshold(bit, threshold)

        if doClip:
            statsFlags = afwMath.MEANCLIP
        else:
            statsFlags = afwMath.MEAN

        coaddExposure = afwImage.ExposureF(skyInfo.bbox, skyInfo.wcs)
        coaddExposure.setCalib(assembleTask.scaleZeroPoint.getCalib())
        coaddExposure.getInfo().setCoaddInputs(
            assembleTask.inputRecorder.makeCoaddInputs())

        #remember to set metadata if you want any hope of running detection and measurement on this coadd:
        #self.assembleMetadata(coaddExposure, tempExpRefList, weightList)

        #most important thing is the psf
        coaddExposure.setFilter(coaddTempExpDict[a].values()[0].getFilter())
        coaddInputs = coaddExposure.getInfo().getCoaddInputs()

        for tempExp, weight in zip(coaddTempExpDict[a].values(),
                                   imageScalerRes.weightList):
            assembleTask.inputRecorder.addVisitToCoadd(coaddInputs, tempExp,
                                                       weight)

        #takes numCcds as argument

        coaddInputs.ccds.reserve(ccdsinPatch)
        coaddInputs.visits.reserve(len(imageScalerRes.dataIdList))
        psf = measAlg.CoaddPsf(coaddInputs.ccds, coaddExposure.getWcs())
        coaddExposure.setPsf(psf)

        maskedImageList = afwImage.vectorMaskedImageF()
        coaddMaskedImage = coaddExposure.getMaskedImage()
        for dataId, imageScaler, exposure in zip(
                imageScalerRes.dataIdList, imageScalerRes.imageScalerList,
                coaddTempExpDict[a].values()):
            print dataId, imageScaler, exposure
            maskedImage = exposure.getMaskedImage()
            imageScaler.scaleMaskedImage(maskedImage)
            maskedImageList.append(maskedImage)

        maskedImage = afwMath.statisticsStack(maskedImageList, statsFlags,
                                              statsCtrl,
                                              imageScalerRes.weightList)

        coaddMaskedImage.assign(maskedImage, skyInfo.bbox)
        coaddUtils.setCoaddEdgeBits(coaddMaskedImage.getMask(),
                                    coaddMaskedImage.getVariance())

        # write out Coadd!
        mergefilename = mergecoaddloc + str(xInd) + "_" + str(yInd) + ".fits"
        mergcoadds[a] = coaddExposure
        coaddExposure.writeFits(mergefilename)

    end = datetime.datetime.now()
    d = end - start
    f.write("time for creating merged co-adds:\n ")
    f.write(str(d.total_seconds()))
    f.write("\n")

    start = datetime.datetime.now()
    config = DetectCoaddSourcesConfig()
    detectCoaddSources = DetectCoaddSourcesTask(config=config)
    for a in dfgby.indices:

        # Detect on Coadd
        exp = mergcoadds[a]
        detRes = detectCoaddSources.runDetection(exp, idFactory=None)

    end = datetime.datetime.now()
    d = end - start
    f.write("time for detecting sources:\n ")
    f.write(str(d.total_seconds()))
    f.close()
Esempio n. 7
0
    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)
Esempio n. 8
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)
Esempio n. 9
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)
Esempio n. 10
0
#!/usr/bin/env python
from lsst.pipe.tasks.multiBand import DetectCoaddSourcesTask
DetectCoaddSourcesTask.parseAndRun()
Esempio n. 11
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)