def _xobjective_sip(params, u, v, x, y, crval, crpix, a_names, b_names, cd, ret): """ Objective function for fitting SIP coefficients """ from astropy.modeling import models, fitting #u, v, x, y, crpix, a_names, b_names, cd = data cdx = params[0:4].reshape((2, 2)) a_params = params[4:4+len(a_names)] b_params = params[4+len(a_names):] a_coeff = {} for i in range(len(a_names)): a_coeff[a_names[i]] = a_params[i] b_coeff = {} for i in range(len(b_names)): b_coeff[b_names[i]] = b_params[i] if ret == 1: return cdx, a_coeff, b_coeff off = 1 sip = models.SIP(crpix=crpix-off, a_order=4, b_order=4, a_coeff=a_coeff, b_coeff=b_coeff) fuv, guv = sip(u, v) xo, yo = np.dot(cdx, np.array([u+fuv-crpix[0], v+guv-crpix[1]])) #dr = np.sqrt((x-xo)**2+(y-yo)**2)*3600. dr = np.append(x-xo, y-yo)*3600./0.065 #print(params, np.abs(dr).max()) return dr
def setup_class(self): hdr = fits.Header.fromtextfile(get_pkg_data_filename("data/acs.hdr"), endcard=False) #warnings.filterwarnings("ignore", message="^The WCS transformation has more axes (2)", # module="astropy.wcs.wcs") self.fitsw = astwcs.WCS(hdr) a_coeff = hdr['A_*'] a_order = a_coeff.pop('A_ORDER') b_coeff = hdr['B_*'] b_order = b_coeff.pop('B_ORDER') crpix = [hdr['CRPIX1'], hdr['CRPIX2']] distortion = models.SIP( crpix, a_order, b_order, a_coeff, b_coeff, name='sip_distorion') + models.Identity(2) cdmat = np.array([[hdr['CD1_1'], hdr['CD1_2']], [hdr['CD2_1'], hdr['CD2_2']]]) aff = models.AffineTransformation2D(matrix=cdmat, name='rotation') offx = models.Shift(-hdr['CRPIX1'], name='x_translation') offy = models.Shift(-hdr['CRPIX2'], name='y_translation') wcslin = (offx & offy) | aff phi = hdr['CRVAL1'] lon = hdr['CRVAL2'] theta = 180 n2c = models.RotateNative2Celestial(phi, lon, theta, name='sky_rotation') tan = models.Pix2Sky_TAN(name='tangent_projection') sky_cs = cf.CelestialFrame(reference_frame=coord.ICRS(), name='sky') det = cf.Frame2D('detector') wcs_forward = wcslin | tan | n2c pipeline = [('detector', distortion), ('focal', wcs_forward), (sky_cs, None)] self.wcs = wcs.WCS(input_frame=det, output_frame=sky_cs, forward_transform=pipeline) nx, ny = (5, 2) x = np.linspace(0, 1, nx) y = np.linspace(0, 1, ny) self.xv, self.yv = np.meshgrid(x, y)