void test_wcs_shift(CuTest* tc) { sip_t wcs; memset(&wcs, 0, sizeof(sip_t)); wcs.wcstan.crpix[0] = 324.867; wcs.wcstan.crpix[1] = 476.596; wcs.wcstan.crval[0] = 39.0268; wcs.wcstan.crval[1] = 65.0062; wcs.wcstan.cd[0][0] = 0.00061453; wcs.wcstan.cd[0][1] = -0.0035865; wcs.wcstan.cd[1][0] = -0.0035971; wcs.wcstan.cd[1][1] = -0.00061653; wcs.a[0][2] = 3.7161e-06; wcs.a[1][1] = 2.4926e-06; wcs.a[2][0] = -1.9189e-05; wcs.b[0][2] = -3.0798e-05; wcs.b[1][1] = 1.8929e-07; wcs.b[2][0] = 8.5835e-06; wcs.ap[0][1] = -3.7374e-05; wcs.ap[0][2] = -3.8391e-06; wcs.ap[1][0] = 3.582e-05; wcs.ap[1][1] = -2.5333e-06; wcs.ap[2][0] = 1.9578e-05; wcs.bp[0][1] = 0.00028454; wcs.bp[0][2] = 3.0996e-05; wcs.bp[1][0] = -1.0094e-05; wcs.bp[1][1] = -3.7012e-07; wcs.bp[2][0] = -8.7938e-06; wcs.wcstan.imagew = 1024; wcs.wcstan.imageh = 1024; wcs.a_order = wcs.b_order = 2; wcs.ap_order = wcs.bp_order = 2; sip_t wcs2; memset(&wcs2, 0, sizeof(sip_t)); memcpy(&(wcs2.wcstan), &(wcs.wcstan), sizeof(tan_t)); #if 0 //sip_t* newwcs = wcs_shift(&wcs, 2.52369e-05,1.38956e-05); sip_t* newwcs = wcs_shift(&wcs, 10., 10.); printf("New1:\n"); sip_print_to(newwcs, stdout); printf("\n"); #else wcs_shift(&(wcs.wcstan), 10., 10.); printf("New1:\n"); tan_print_to(&(wcs.wcstan), stdout); printf("\n"); #endif #if 0 sip_t* newwcs2 = wcs_shift(&wcs2, 10., 10.); printf("New2:\n"); sip_print_to(newwcs2, stdout); printf("\n"); #endif // 10,10: #if 0 tan_t* newtan = &(newwcs->wcstan); #else tan_t* newtan = &(wcs.wcstan); #endif CuAssertDblEquals(tc, 39.0973, newtan->crval[0], 1e-4); CuAssertDblEquals(tc, 65.0483, newtan->crval[1], 1e-4); CuAssertDblEquals(tc, 324.867, newtan->crpix[0], 1e-3); CuAssertDblEquals(tc, 476.596, newtan->crpix[1], 1e-3); CuAssertDblEquals(tc, 0.00061053, newtan->cd[0][0], 1e-8); CuAssertDblEquals(tc, -0.0035872, newtan->cd[0][1], 1e-7); CuAssertDblEquals(tc, -0.0035978, newtan->cd[1][0], 1e-7); CuAssertDblEquals(tc, -0.00061252, newtan->cd[1][1], 1e-8); /* 1,1 shift: TAN-SIP Structure: crval=(39.0338, 65.0104) crpix=(324.867, 476.596) CD = ( 0.00061413 -0.0035866 ) ( -0.0035972 -0.00061613 ) image size = (1024 x 1024) SIP order: A=2, B=2, AP=2, BP=2 A = 0 0 3.7161e-06 0 2.4926e-06 -1.9189e-05 B = 0 0 -3.0798e-05 0 1.8929e-07 8.5835e-06 AP = 0 -3.7374e-05 -3.8391e-06 3.582e-05 -2.5333e-06 1.9578e-05 BP = 0 0.00028454 3.0996e-05 -1.0094e-05 -3.7012e-07 -8.7938e-06 sqrt(det(CD))=13.119 [arcsec] . OK (1 test) TAN-SIP Structure: crval=(39.0268, 65.0062) crpix=(324.867, 476.596) CD = ( 0.00061453 -0.0035865 ) ( -0.0035971 -0.00061653 ) image size = (1024 x 1024) SIP order: A=2, B=2, AP=2, BP=2 A = 0 0 3.7161e-06 0 2.4926e-06 -1.9189e-05 B = 0 0 -3.0798e-05 0 1.8929e-07 8.5835e-06 AP = 0 -3.7374e-05 -3.8391e-06 3.582e-05 -2.5333e-06 1.9578e-05 BP = 0 0.00028454 3.0996e-05 -1.0094e-05 -3.7012e-07 -8.7938e-06 sqrt(det(CD))=13.119 [arcsec] . crval=(39.0268, 65.0062) crpix=(324.867, 476.596) CD = ( 0.00061453 -0.0035865 ) ( -0.0035971 -0.00061653 ) image size = (1024 x 1024) SIP order: A=2, B=2, AP=2, BP=2 A = 0 0 3.7161e-06 0 2.4926e-06 -1.9189e-05 B = 0 0 -3.0798e-05 0 1.8929e-07 8.5835e-06 AP = 0 -3.7374e-05 -3.8391e-06 3.582e-05 -2.5333e-06 1.9578e-05 BP = 0 0.00028454 3.0996e-05 -1.0094e-05 -3.7012e-07 -8.7938e-06 */ }
int main(int argc, char** args) { int c; dl* xys = dl_new(16); dl* radecs = dl_new(16); dl* otherradecs = dl_new(16); double* xy; double* xyz; int i, N; tan_t tan, tan2, tan3; int W=0, H=0; double crpix[] = { HUGE_VAL, HUGE_VAL }; int loglvl = LOG_MSG; FILE* logstream = stderr; int order = 1; while ((c = getopt(argc, args, OPTIONS)) != -1) { switch (c) { case 'v': loglvl++; break; case 'h': exit(0); case 'o': order = atoi(optarg); break; case 'W': W = atoi(optarg); break; case 'H': H = atoi(optarg); break; case 'X': crpix[0] = atof(optarg); break; case 'Y': crpix[1] = atof(optarg); break; } } if (optind != argc) { exit(-1); } log_init(loglvl); log_to(logstream); errors_log_to(logstream); if (W == 0 || H == 0) { logerr("Need -W, -H\n"); exit(-1); } if (crpix[0] == HUGE_VAL) crpix[0] = W/2.0; if (crpix[1] == HUGE_VAL) crpix[1] = H/2.0; while (1) { double x,y,ra,dec; if (fscanf(stdin, "%lf %lf %lf %lf\n", &x, &y, &ra, &dec) < 4) break; if (x == -1 && y == -1) { dl_append(otherradecs, ra); dl_append(otherradecs, dec); } else { dl_append(xys, x); dl_append(xys, y); dl_append(radecs, ra); dl_append(radecs, dec); } } logmsg("Read %i x,y,ra,dec tuples\n", dl_size(xys)/2); N = dl_size(xys)/2; xy = dl_to_array(xys); xyz = malloc(3 * N * sizeof(double)); for (i=0; i<N; i++) radecdeg2xyzarr(dl_get(radecs, 2*i), dl_get(radecs, 2*i+1), xyz + i*3); dl_free(xys); dl_free(radecs); fit_tan_wcs(xyz, xy, N, &tan, NULL); tan.imagew = W; tan.imageh = H; logmsg("Computed TAN WCS:\n"); tan_print_to(&tan, logstream); sip_t* sip; { tweak_t* t = tweak_new(); starxy_t* sxy = starxy_new(N, FALSE, FALSE); il* imginds = il_new(256); il* refinds = il_new(256); for (i=0; i<N; i++) { starxy_set_x(sxy, i, xy[2*i+0]); starxy_set_y(sxy, i, xy[2*i+1]); } tweak_init(t); tweak_push_ref_xyz(t, xyz, N); tweak_push_image_xy(t, sxy); for (i=0; i<N; i++) { il_append(imginds, i); il_append(refinds, i); } // unweighted; no dist2s tweak_push_correspondence_indices(t, imginds, refinds, NULL, NULL); tweak_push_wcs_tan(t, &tan); t->sip->a_order = t->sip->b_order = t->sip->ap_order = t->sip->bp_order = order; for (i=0; i<10; i++) { // go to TWEAK_HAS_LINEAR_CD -> do_sip_tweak // t->image has the indices of corresponding image stars // t->ref has the indices of corresponding catalog stars tweak_go_to(t, TWEAK_HAS_LINEAR_CD); logmsg("\n"); sip_print(t->sip); t->state &= ~TWEAK_HAS_LINEAR_CD; } tan_write_to_file(&t->sip->wcstan, "kt1.wcs"); sip = t->sip; } for (i=0; i<dl_size(otherradecs)/2; i++) { double ra, dec, x,y; ra = dl_get(otherradecs, 2*i); dec = dl_get(otherradecs, 2*i+1); if (!sip_radec2pixelxy(sip, ra, dec, &x, &y)) { logerr("Not in tangent plane: %g,%g\n", ra, dec); exit(-1); //continue; } printf("%g %g\n", x, y); } /* blind_wcs_move_tangent_point(xyz, xy, N, crpix, &tan, &tan2); blind_wcs_move_tangent_point(xyz, xy, N, crpix, &tan2, &tan3); logmsg("Moved tangent point to (%g,%g):\n", crpix[0], crpix[1]); tan_print_to(&tan3, logstream); tan_write_to_file(&tan, "kt1.wcs"); tan_write_to_file(&tan3, "kt2.wcs"); */ dl_free(otherradecs); free(xy); free(xyz); return 0; }
void tan_print(const tan_t* tan) { tan_print_to(tan, stderr); }