def getParamDerivatives(self, img, modelMask=None): e = ExpGalaxy(self.pos, self.brightnessExp, self.shapeExp) d = DevGalaxy(self.pos, self.brightnessDev, self.shapeDev) if hasattr(self, 'halfsize'): e.halfsize = d.halfsize = self.halfsize e.dname = 'comp.exp' d.dname = 'comp.dev' if self.isParamFrozen('pos'): e.freezeParam('pos') d.freezeParam('pos') if self.isParamFrozen('brightnessExp'): e.freezeParam('brightness') if self.isParamFrozen('shapeExp'): e.freezeParam('shape') if self.isParamFrozen('brightnessDev'): d.freezeParam('brightness') if self.isParamFrozen('shapeDev'): d.freezeParam('shape') de = e.getParamDerivatives(img, modelMask=modelMask) dd = d.getParamDerivatives(img, modelMask=modelMask) if self.isParamFrozen('pos'): derivs = de + dd else: derivs = [] # "pos" is shared between the models, so add the derivs. npos = len(self.pos.getStepSizes()) for i in range(npos): dp = add_patches(de[i], dd[i]) if dp is not None: dp.setName('d(comp)/d(pos%i)' % i) derivs.append(dp) derivs.extend(de[npos:]) derivs.extend(dd[npos:]) return derivs
def getModelPatch(self, img, minsb=0., modelMask=None): from tractor.patch import add_patches pc = img.getPhotoCal() p1 = self.umods[0] * pc.brightnessToCounts(self.brights[0]) p2 = self.umods[1] * pc.brightnessToCounts(self.brights[1]) return add_patches(p1, p2)
def getParamDerivatives(self, img, modelMask=None): e = ExpGalaxy(self.pos, self.brightness, self.shapeExp) d = DevGalaxy(self.pos, self.brightness, self.shapeDev) e.dname = 'fcomp.exp' d.dname = 'fcomp.dev' if self.isParamFrozen('pos'): e.freezeParam('pos') d.freezeParam('pos') if self.isParamFrozen('shapeExp'): e.freezeParam('shape') if self.isParamFrozen('shapeDev'): d.freezeParam('shape') if hasattr(self, 'halfsize'): e.halfsize = self.halfsize d.halfsize = self.halfsize dexp = e.getParamDerivatives(img, modelMask=modelMask) ddev = d.getParamDerivatives(img, modelMask=modelMask) # print('FixedCompositeGalaxy.getParamDerivatives.') # print('tim shape', img.shape) # print('exp deriv extents:') # for deriv in dexp + ddev: # print(' ', deriv.name, deriv.getExtent()) # fracDev scaling f = self.fracDev.clipped() for deriv in dexp: if deriv is not None: deriv *= (1. - f) for deriv in ddev: if deriv is not None: deriv *= f derivs = [] i0 = 0 if not self.isParamFrozen('pos'): # "pos" is shared between the models, so add the derivs. npos = self.pos.numberOfParams() for i in range(npos): ii = i0 + i dsum = add_patches(dexp[ii], ddev[ii]) if dsum is not None: dsum.setName('d(fcomp)/d(pos%i)' % i) derivs.append(dsum) i0 += npos if not self.isParamFrozen('brightness'): # shared between the models, so add the derivs. nb = self.brightness.numberOfParams() for i in range(nb): ii = i0 + i dsum = add_patches(dexp[ii], ddev[ii]) if dsum is not None: dsum.setName('d(fcomp)/d(bright%i)' % i) derivs.append(dsum) i0 += nb if not self.isParamFrozen('fracDev'): counts = img.getPhotoCal().brightnessToCounts(self.brightness) if counts == 0.: derivs.append(None) else: # FIXME -- should be possible to avoid recomputing these... ue = e.getUnitFluxModelPatch(img, modelMask=modelMask) ud = d.getUnitFluxModelPatch(img, modelMask=modelMask) df = self.fracDev.derivative() if ue is not None: ue *= -df if ud is not None: ud *= +df df = add_patches(ud, ue) if df is None: derivs.append(None) else: df *= counts df.setName('d(fcomp)/d(fracDev)') derivs.append(df) if not self.isParamFrozen('shapeExp'): derivs.extend(dexp[i0:]) if not self.isParamFrozen('shapeDev'): derivs.extend(ddev[i0:]) return derivs
def getModelPatch(self, img, minsb=0., modelMask=None): pe, pd = self._getModelPatches(img, minsb=minsb, modelMask=modelMask) return add_patches(pe, pd)