1 __all__ = (
"displayReconstructedCmodel", 
"displayReconstrucedCmodelMpl",
 
    2            "buildCModelImages", 
"reconstructCModel")
 
    5 import matplotlib.pyplot 
as plt
 
   14     """ Display an image, the Cmodel, and residuals 
   18     exposure : `lsst.afw.image.Exposure` 
   19         Exposure object that contains the source which was modeled 
   20     record : `lsst.afw.table.SourceRecord` 
   21         Record object which contains the measurements made on the source 
   22     config : `lsst.meas.modelfit.CModel(SingleFrame/Forced)Config` 
   23         Configuration object of the CModel plugin used in the measurement 
   25     display : `str`, optional 
   26         Display in which to render the data, may be mpl for matplotlib or afw 
   27         for afwDisplay, defaults to mpl 
   32         If the display backend specified is not implemented 
   37     elif display == 
"afw":
 
   38         raise NotImplementedError(
"The afw display backend is not yet " 
   41         raise NotImplementedError(
"The display backend '{}' is not a supported" 
   46     """ Display an image, the Cmodel, and residuals using matplotlib 
   50     exposure : `lsst.afw.image.Exposure` 
   51         Exposure object that contains the source which was  modeled 
   52     record : `lsst.afw.table.SourceRecord` 
   53         Record object which contains the measurements made on the source 
   54     config : `lsst.meas.modelfit.CModel(SingleFrame/Forced)Config` 
   55         Configuration object of the CModel plugin used in the measurement 
   62     subImMin = subImage.array.min()
 
   63     subImMax = subImage.array.max()
 
   66     devResidual = subImage.array-devIm.array
 
   67     expResidual = subImage.array-expIm.array
 
   68     jointResidual = subImage.array-jointIm.array
 
   69     residualList = (devResidual, expResidual, jointResidual)
 
   71     differences = [(x.max()-x.max()) 
for x 
in residualList]
 
   72     maxDifferenceIndex = np.argmax(differences)
 
   73     resImMin = residualList[maxDifferenceIndex].
min()
 
   74     resImMax = residualList[maxDifferenceIndex].
max()
 
   77     fig, axes = plt.subplots(3, 3, sharex=
'col', sharey=
'row', figsize=(8, 5))
 
   78     fig.subplots_adjust(left=0.25, right=0.8)
 
   79     lCBar = fig.add_axes([0.1, 0.15, 0.05, 0.7])
 
   80     rCBar = fig.add_axes([0.85, 0.15, 0.05, 0.7])
 
   84         axes[i, 0].imshow(subImage.array, vmin=subImMin, vmax=subImMax)
 
   87     axes[0, 1].imshow(devIm.array, vmin=subImMin, vmax=subImMax)
 
   88     axes[0, 2].imshow(devResidual, vmin=resImMin, vmax=resImMax, cmap=
"BrBG")
 
   91     axes[1, 1].imshow(expIm.array, vmin=subImMin, vmax=subImMax)
 
   92     axes[1, 2].imshow(expResidual, vmin=resImMin, vmax=resImMax, cmap=
"BrBG")
 
   95     axes[2, 1].imshow(jointIm.array, vmin=subImMin, vmax=subImMax)
 
   96     axes[2, 2].imshow(jointResidual, vmin=resImMin, vmax=resImMax, cmap=
"BrBG")
 
   98     axes[0, 0].set_title(
"Image")
 
   99     axes[0, 1].set_title(
"Model")
 
  100     axes[0, 2].set_title(
'Residuals')
 
  102     axes[0, 0].set_ylabel(
"Dev")
 
  103     axes[1, 0].set_ylabel(
"Exp")
 
  104     axes[2, 0].set_ylabel(
"Joint")
 
  106     fig.colorbar(axes[0, 0].get_images()[0], lCBar)
 
  107     lCBar.yaxis.set_ticks_position(
'left')
 
  108     fig.colorbar(axes[maxDifferenceIndex, 2].get_images()[0], rCBar)
 
  114     """ Create Images out of the CModel for the given record 
  118     exposure : `lsst.afw.image.Exposure` 
  119         Exposure object that contains the source which was  modeled 
  120     record : `lsst.afw.table.SourceRecord` 
  121         Record object which contains the measurements made on the source 
  122     config : `lsst.meas.modelfit.CModel(SingleFrame/Forced)Config` 
  123         Configuration object of the CModel plugin used in the measurement 
  128     subImage : `lsst.afw.image.ImageD` 
  129         Sub image of the original data taken from a region defined by the 
  130         bounding box of the footprint for the object defined in the given 
  132     devIm : `lsst.afw.image.ImageD` 
  133         Image created from the dev component of the CModel for the supplied 
  134         record at the same pixel locations as subImage 
  135     expIm: `lsst.afw.image.ImageD` 
  136         Image created from the exp component of the CModel for the supplied 
  137         record at the same pixel locations as subImage 
  139         Image created from the joint fit of the dev and exp components of the 
  140         CModel for the supplied record at the same pixel locations as subImage 
  145     footBBox = record.getFootprint().getBBox()
 
  146     subImage = afwImage.ImageD(exposure.getImage().convertD(), footBBox)
 
  150         record.schema[config.psfName])
 
  151     psfApprox = record.get(shapeletPsfKey)
 
  154     devIm = afwImage.ImageD(footBBox)
 
  155     dev = dev.convolve(psfApprox)
 
  159     expIm = afwImage.ImageD(footBBox)
 
  160     exp = exp.convolve(psfApprox)
 
  164     jointIm = afwImage.ImageD(footBBox)
 
  165     jointDev = jointDev.convolve(psfApprox)
 
  166     jointExp = jointExp.convolve(psfApprox)
 
  170     return subImage, devIm, expIm, jointIm
 
  174     """ Reconstruct the CModel for the given record 
  178     exposure : `lsst.afw.image.Exposure` 
  179         Exposure object that contains the source which was  modeled 
  180     record : `lsst.afw.table.SourceRecord` 
  181         Record object which contains the measurements made on the source 
  182     config : `lsst.meas.modelfit.CModel(SingleFrame/Forced)Config` 
  183         Configuration object of the CModel plugin used in the measurement 
  188     devShapelet : `lsst.shapelet.MultiShapeletFunction` 
  189         Multi-component shapelet model of the dev component of CModel 
  190     expShapelet : `lsst.shapelet.MultiShapeletFunction` 
  191         Multi-component shapelet model fo the exp component of CModel 
  192     devJointShapelet : `lsst.shapelet.MultiShapeletFunction` 
  193         Multi-component shapelet model of the dev component of CModel jointly 
  194         fit with the exp component 
  195     expJointShapelet : `lsst.shapelet.MultiShapeletFunction` 
  196         Multi-component shapelet model of the exp component of Cmodel jointly 
  197         fit with the dev component 
  201     center = record.getCentroid()
 
  202     position = exposure.getWcs().pixelToSky(center)
 
  203     measSys = measMod.UnitSystem(exposure)
 
  204     approxFlux = record.get(
"base_PsfFlux_instFlux")
 
  205     fitSys = measMod.UnitSystem(position, exposure.getPhotoCalib(), approxFlux)
 
  206     fitSysToMeasSys = measMod.LocalUnitTransform(
Point2D(0, 0), fitSys, measSys)
 
  209     ctrl = config.makeControl()
 
  210     baseName = 
"modelfit_CModel" 
  211     nonlinearKeys = [
"{}_{{model}}_nonlinear_{p}".
format(baseName, p=p)
 
  213     fixedKeys = [
"{}_{{model}}_fixed_{p}".
format(baseName, p=p)
 
  215     fluxKey = 
"{}_{{model}}_instFlux".
format(baseName)
 
  219         apCorr = record.get(
"{}_apCorr".
format(baseName))
 
  221         print(
"Warning, problem retrieving aperture correction, using a value" 
  226     devNonLinearParams = np.array([record.get(key.format(model=
"dev"))
 
  227                                   for key 
in nonlinearKeys])
 
  228     devFixedParams = np.array([record.get(key.format(model=
"dev"))
 
  229                               for key 
in fixedKeys])
 
  230     devAmp = np.array([record.get(fluxKey.format(model=
"dev"))])
 
  232     devShapelet = ctrl.dev.getModel().makeShapeletFunction(devNonLinearParams,
 
  235     devShapelet.transformInPlace(fitSysToMeasSys.geometric)
 
  238     expNonLinearParams = np.array([record.get(key.format(model=
"exp"))
 
  239                                   for key 
in nonlinearKeys])
 
  240     expFixedParams = np.array([record.get(key.format(model=
"exp"))
 
  241                               for key 
in fixedKeys])
 
  242     expAmp = np.array([record.get(fluxKey.format(model=
"exp"))])
 
  244     expShapelet = ctrl.exp.getModel().makeShapeletFunction(expNonLinearParams,
 
  247     expShapelet.transformInPlace(fitSysToMeasSys.geometric)
 
  250     fracDev = record.get(
"{}_fracDev".
format(baseName))
 
  251     jointFlux = np.array([record.get(
"{}_instFlux".
format(baseName))])
 
  253     devJointShapelet = ctrl.dev.getModel()\
 
  254         .makeShapeletFunction(devNonLinearParams, jointFlux*fracDev,
 
  256     devJointShapelet.transformInPlace(fitSysToMeasSys.geometric)
 
  258     expJointShapelet = ctrl.exp.getModel()\
 
  259         .makeShapeletFunction(expNonLinearParams, jointFlux*(1-fracDev),
 
  261     expJointShapelet.transformInPlace(fitSysToMeasSys.geometric)
 
  263     return devShapelet, expShapelet, devJointShapelet, expJointShapelet