static sip_t* run_test(CuTest* tc, sip_t* sip, int N, double* xy, double* radec) { int i; starxy_t* sxy; tweak_t* t; sip_t* outsip; il* imcorr; il* refcorr; dl* weights; tan_t* tan = &(sip->wcstan); printf("Input SIP:\n"); sip_print_to(sip, stdout); fflush(NULL); sxy = starxy_new(N, FALSE, FALSE); starxy_set_xy_array(sxy, xy); imcorr = il_new(256); refcorr = il_new(256); weights = dl_new(256); for (i=0; i<N; i++) { il_append(imcorr, i); il_append(refcorr, i); dl_append(weights, 1.0); } t = tweak_new(); tweak_push_wcs_tan(t, tan); outsip = t->sip; outsip->a_order = outsip->b_order = sip->a_order; outsip->ap_order = outsip->bp_order = sip->ap_order; t->weighted_fit = TRUE; tweak_push_ref_ad_array(t, radec, N); tweak_push_image_xy(t, sxy); tweak_push_correspondence_indices(t, imcorr, refcorr, NULL, weights); tweak_skip_shift(t); // push correspondences // push image xy // push ref ra,dec // push ref xy (tan) // push tan tweak_go_to(t, TWEAK_HAS_LINEAR_CD); printf("Output SIP:\n"); sip_print_to(outsip, stdout); CuAssertDblEquals(tc, tan->imagew, outsip->wcstan.imagew, 1e-10); CuAssertDblEquals(tc, tan->imageh, outsip->wcstan.imageh, 1e-10); // should be exactly equal. CuAssertDblEquals(tc, tan->crpix[0], outsip->wcstan.crpix[0], 1e-10); CuAssertDblEquals(tc, tan->crpix[1], outsip->wcstan.crpix[1], 1e-10); t->sip = NULL; tweak_free(t); starxy_free(sxy); return outsip; }
int wcs_pv2sip(const char* wcsinfn, int ext, const char* wcsoutfn, anbool scamp_head_file, double* xy, int Nxy, int imageW, int imageH, anbool forcetan) { qfits_header* hdr = NULL; double* radec = NULL; int rtn = -1; tan_t tanwcs; double x,y, px,py; double xyz[3]; double* xorig = NULL; double* yorig = NULL; double* rddist = NULL; int i, j; // 1 x y r x2 xy y2 x3 x2y xy2 y3 r3 x4 x3y x2y2 xy3 y4 // x5 x4y x3y2 x2y3 xy4 y5 r5 x6 x5y x4y2, x3y3 x2y4 xy5 y6 // x7 x6y x5y2 x4y3 x3y4 x2y5 xy6 y7 r7 int xp[] = { 0, 1, 0, 0, 2, 1, 0, 3, 2, 1, 0, 0, 4, 3, 2, 1, 0, 5, 4, 3, 2, 1, 5, 0, 6, 5, 4, 3, 2, 1, 0, 7, 6, 5, 4, 3, 2, 1, 0, 0}; int yp[] = { 0, 0, 1, 0, 0, 1, 2, 0, 1, 2, 3, 0, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 0, 0, 1, 2, 3, 4, 5, 6, 0, 1, 2, 3, 4, 5, 6, 7, 0}; int rp[] = { 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7}; double xpows[8]; double ypows[8]; double rpows[8]; double pv1[40]; double pv2[40]; double r; if (scamp_head_file) { size_t sz = 0; char* txt; char* prefix; int np; int nt; unsigned char* txthdr; sl* lines; int i; txt = file_get_contents(wcsinfn, &sz, TRUE); if (!txt) { ERROR("Failed to read file %s", wcsinfn); goto bailout; } lines = sl_split(NULL, txt, "\n"); prefix = "SIMPLE = T / Standard FITS file " "BITPIX = 8 / ASCII or bytes array " "NAXIS = 0 / Minimal header " "EXTEND = T / There may be FITS ext " "WCSAXES = 2 / "; np = strlen(prefix); nt = np + FITS_LINESZ * sl_size(lines); txthdr = malloc(nt); memset(txthdr, ' ', np + FITS_LINESZ * sl_size(lines)); memcpy(txthdr, prefix, np); for (i=0; i<sl_size(lines); i++) memcpy(txthdr + np + i*FITS_LINESZ, sl_get(lines, i), strlen(sl_get(lines, i))); sl_free2(lines); hdr = qfits_header_read_hdr_string(txthdr, nt); free(txthdr); free(txt); } else { char* ct; hdr = anqfits_get_header2(wcsinfn, ext); ct = fits_get_dupstring(hdr, "CTYPE1"); if ((ct && streq(ct, "RA---TPV")) || forcetan) { // http://iraf.noao.edu/projects/ccdmosaic/tpv.html logmsg("Replacing CTYPE1 = %s header with RA---TAN\n", ct); fits_update_value(hdr, "CTYPE1", "RA---TAN"); } ct = fits_get_dupstring(hdr, "CTYPE2"); if ((ct && streq(ct, "DEC--TPV")) || forcetan) { logmsg("Replacing CTYPE2 = %s header with DEC--TAN\n", ct); fits_update_value(hdr, "CTYPE2", "DEC--TAN"); } } if (!hdr) { ERROR("Failed to read header: file %s, ext %i\n", wcsinfn, ext); goto bailout; } tan_read_header(hdr, &tanwcs); for (i=0; i<sizeof(pv1)/sizeof(double); i++) { char key[10]; sprintf(key, "PV1_%i", i); pv1[i] = qfits_header_getdouble(hdr, key, 0.0); sprintf(key, "PV2_%i", i); pv2[i] = qfits_header_getdouble(hdr, key, 0.0); } xorig = malloc(Nxy * sizeof(double)); yorig = malloc(Nxy * sizeof(double)); rddist = malloc(2 * Nxy * sizeof(double)); for (j=0; j<Nxy; j++) { xorig[j] = xy[2*j+0]; yorig[j] = xy[2*j+1]; tan_pixelxy2iwc(&tanwcs, xorig[j], yorig[j], &x, &y); r = sqrt(x*x + y*y); xpows[0] = ypows[0] = rpows[0] = 1.0; for (i=1; i<sizeof(xpows)/sizeof(double); i++) { xpows[i] = xpows[i-1]*x; ypows[i] = ypows[i-1]*y; rpows[i] = rpows[i-1]*r; } px = py = 0; for (i=0; i<sizeof(xp)/sizeof(int); i++) { px += pv1[i] * xpows[xp[i]] * ypows[yp[i]] * rpows[rp[i]]; py += pv2[i] * ypows[xp[i]] * xpows[yp[i]] * rpows[rp[i]]; } tan_iwc2xyzarr(&tanwcs, px, py, xyz); xyzarr2radecdeg(xyz, rddist+2*j, rddist+2*j+1); } // { starxy_t sxy; tweak_t* t; il* imgi; il* refi; int sip_order = 5; int sip_inv_order = 5; sxy.N = Nxy; sxy.x = xorig; sxy.y = yorig; imgi = il_new(256); refi = il_new(256); for (i=0; i<Nxy; i++) { il_append(imgi, i); il_append(refi, i); } t = tweak_new(); t->sip->a_order = t->sip->b_order = sip_order; t->sip->ap_order = t->sip->bp_order = sip_inv_order; tweak_push_wcs_tan(t, &tanwcs); tweak_push_ref_ad_array(t, rddist, Nxy); tweak_push_image_xy(t, &sxy); tweak_push_correspondence_indices(t, imgi, refi, NULL, NULL); tweak_go_to(t, TWEAK_HAS_LINEAR_CD); if (imageW) t->sip->wcstan.imagew = imageW; if (imageH) t->sip->wcstan.imageh = imageH; sip_write_to_file(t->sip, wcsoutfn); tweak_free(t); } rtn = 0; bailout: free(xorig); free(yorig); free(rddist); qfits_header_destroy(hdr); free(radec); return rtn; }