int wcs_xy2rd(const char* wcsfn, int ext, const char* xylsfn, const char* rdlsfn, const char* xcol, const char* ycol, int forcetan, int forcewcslib, il* fields) { rdlist_t* rdls = NULL; xylist_t* xyls = NULL; anwcs_t* wcs = NULL; int i; int rtn = -1; anbool alloced_fields = FALSE; // read WCS. if (forcewcslib) { wcs = anwcs_open_wcslib(wcsfn, ext); } else if (forcetan) { wcs = anwcs_open_tan(wcsfn, ext); } else { wcs = anwcs_open(wcsfn, ext); } if (!wcs) { ERROR("Failed to read WCS file \"%s\", extension %i", wcsfn, ext); return -1; } // read XYLS. xyls = xylist_open(xylsfn); if (!xyls) { ERROR("Failed to read an xylist from file %s", xylsfn); goto bailout; } xylist_set_include_flux(xyls, FALSE); xylist_set_include_background(xyls, FALSE); if (xcol) xylist_set_xname(xyls, xcol); if (ycol) xylist_set_yname(xyls, ycol); // write RDLS. rdls = rdlist_open_for_writing(rdlsfn); if (!rdls) { ERROR("Failed to open file %s to write RDLS.\n", rdlsfn); goto bailout; } if (rdlist_write_primary_header(rdls)) { ERROR("Failed to write header to RDLS file %s.\n", rdlsfn); goto bailout; } if (!fields) { alloced_fields = TRUE; fields = il_new(16); } if (!il_size(fields)) { // add all fields. int NF = xylist_n_fields(xyls); for (i=1; i<=NF; i++) il_append(fields, i); } logverb("Processing %zu extensions...\n", il_size(fields)); for (i=0; i<il_size(fields); i++) { int fieldind = il_get(fields, i); starxy_t xy; rd_t rd; int j; if (!xylist_read_field_num(xyls, fieldind, &xy)) { ERROR("Failed to read xyls file %s, field %i", xylsfn, fieldind); goto bailout; } if (rdlist_write_header(rdls)) { ERROR("Failed to write rdls field header to %s", rdlsfn); goto bailout; } rd_alloc_data(&rd, starxy_n(&xy)); for (j=0; j<starxy_n(&xy); j++) { double x, y, ra, dec; x = starxy_getx(&xy, j); y = starxy_gety(&xy, j); anwcs_pixelxy2radec(wcs, x, y, &ra, &dec); rd_setra (&rd, j, ra); rd_setdec(&rd, j, dec); } if (rdlist_write_field(rdls, &rd)) { ERROR("Failed to write rdls field to %s", rdlsfn); goto bailout; } rd_free_data(&rd); starxy_free_data(&xy); if (rdlist_fix_header(rdls)) { ERROR("Failed to fix rdls field header for %s", rdlsfn); goto bailout; } rdlist_next_field(rdls); } if (rdlist_fix_primary_header(rdls) || rdlist_close(rdls)) { ERROR("Failed to fix header of RDLS file %s", rdlsfn); goto bailout; } rdls = NULL; if (xylist_close(xyls)) { ERROR("Failed to close XYLS file %s", xylsfn); goto bailout; } xyls = NULL; rtn = 0; bailout: if (alloced_fields) il_free(fields); if (rdls) rdlist_close(rdls); if (xyls) xylist_close(xyls); if (wcs) anwcs_free(wcs); return rtn; }
int wcs_rd2xy(const char* wcsfn, int wcsext, const char* rdlsfn, const char* xylsfn, const char* racol, const char* deccol, anbool forcetan, anbool forcewcslib, il* fields) { xylist_t* xyls = NULL; rdlist_t* rdls = NULL; anwcs_t* wcs = NULL; int i; anbool alloced_fields = FALSE; int rtn = -1; // read WCS. if (forcewcslib) { wcs = anwcs_open_wcslib(wcsfn, wcsext); } else if (forcetan) { wcs = anwcs_open_tan(wcsfn, wcsext); } else { wcs = anwcs_open(wcsfn, wcsext); } if (!wcs) { ERROR("Failed to read WCS file \"%s\", extension %i", wcsfn, wcsext); return -1; } // read RDLS. rdls = rdlist_open(rdlsfn); if (!rdls) { ERROR("Failed to read an RA,Dec list from file %s", rdlsfn); goto bailout; } if (racol) rdlist_set_raname(rdls, racol); if (deccol) rdlist_set_decname(rdls, deccol); // write XYLS. xyls = xylist_open_for_writing(xylsfn); if (!xyls) { ERROR("Failed to open file %s to write XYLS", xylsfn); goto bailout; } if (xylist_write_primary_header(xyls)) { ERROR("Failed to write header to XYLS file %s", xylsfn); goto bailout; } if (!fields) { alloced_fields = TRUE; fields = il_new(16); } if (!il_size(fields)) { // add all fields. int NF = rdlist_n_fields(rdls); for (i=1; i<=NF; i++) il_append(fields, i); } for (i=0; i<il_size(fields); i++) { int fieldnum = il_get(fields, i); int j; starxy_t xy; rd_t rd; if (!rdlist_read_field_num(rdls, fieldnum, &rd)) { ERROR("Failed to read rdls file \"%s\" field %i", rdlsfn, fieldnum); goto bailout; } starxy_alloc_data(&xy, rd_n(&rd), FALSE, FALSE); if (xylist_write_header(xyls)) { ERROR("Failed to write xyls field header"); goto bailout; } for (j=0; j<rd_n(&rd); j++) { double x, y, ra, dec; ra = rd_getra (&rd, j); dec = rd_getdec(&rd, j); if (anwcs_radec2pixelxy(wcs, ra, dec, &x, &y)) { ERROR("Point RA,Dec = (%g,%g) projects to the opposite side of the sphere", ra, dec); starxy_set(&xy, j, NAN, NAN); continue; } starxy_set(&xy, j, x, y); } if (xylist_write_field(xyls, &xy)) { ERROR("Failed to write xyls field"); goto bailout; } if (xylist_fix_header(xyls)) { ERROR("Failed to fix xyls field header"); goto bailout; } xylist_next_field(xyls); starxy_free_data(&xy); rd_free_data(&rd); } if (xylist_fix_primary_header(xyls) || xylist_close(xyls)) { ERROR("Failed to fix header of XYLS file"); goto bailout; } xyls = NULL; if (rdlist_close(rdls)) { ERROR("Failed to close RDLS file"); goto bailout; } rdls = NULL; rtn = 0; bailout: if (alloced_fields) il_free(fields); if (rdls) rdlist_close(rdls); if (xyls) xylist_close(xyls); if (wcs) anwcs_free(wcs); return rtn; }
void test_wcslib_equals_tan(CuTest* tc) { #ifndef WCSLIB_EXISTS printf("\n\nWarning, WCSLIB support was not compiled in, so no WCSLIB functionality will be tested.\n\n\n"); return; #endif anwcs_t* anwcs = NULL; tan_t* tan; char* tmpfile = create_temp_file("test-anwcs-wcs", "/tmp"); double x, y, x2, y2, ra, dec, ra2, dec2; int ok, ok2; int i; // from http://live.astrometry.net/status.php?job=alpha-201004-29242410 // test-anwcs-1.wcs const char* wcsliteral = "SIMPLE = T / Standard FITS file BITPIX = 8 / ASCII or bytes array NAXIS = 0 / Minimal header EXTEND = T / There may be FITS ext CTYPE1 = 'RA---TAN' / TAN (gnomic) projection CTYPE2 = 'DEC--TAN' / TAN (gnomic) projection WCSAXES = 2 / no comment EQUINOX = 2000.0 / Equatorial coordinates definition (yr) LONPOLE = 180.0 / no comment LATPOLE = 0.0 / no comment CRVAL1 = 83.7131676182 / RA of reference point CRVAL2 = -5.10104333945 / DEC of reference point CRPIX1 = 221.593284607 / X reference pixel CRPIX2 = 169.655508041 / Y reference pixel CUNIT1 = 'deg ' / X pixel scale units CUNIT2 = 'deg ' / Y pixel scale units CD1_1 = 1.55258090814E-06 / Transformation matrix CD1_2 = 0.00081692280013 / no comment CD2_1 = -0.00081692280013 / no comment CD2_2 = 1.55258090814E-06 / no comment IMAGEW = 900 / Image width, in pixels. IMAGEH = 600 / Image height, in pixels. DATE = '2010-04-14T12:12:18' / Date this file was created. HISTORY Created by the Astrometry.net suite. HISTORY For more details, see http://astrometry.net . HISTORY Subversion URL HISTORY http://astrometry.net/svn/branches/astrometry/alpha/quads/ HISTORY Subversion revision 5409 HISTORY Subversion date 2007-10-09 13:49:13 -0400 (Tue, 09 Oct HISTORY 2007) HISTORY This WCS header was created by the program \"blind\". COMMENT -- blind solver parameters: -- COMMENT Index(0): /data1/INDEXES/200/index-219 COMMENT Index(1): /data1/INDEXES/200/index-218 COMMENT Index(2): /data1/INDEXES/200/index-217 COMMENT Index(3): /data1/INDEXES/200/index-216 COMMENT Index(4): /data1/INDEXES/200/index-215 COMMENT Index(5): /data1/INDEXES/200/index-214 COMMENT Index(6): /data1/INDEXES/200/index-213 COMMENT Index(7): /data1/INDEXES/200/index-212 COMMENT Index(8): /data1/INDEXES/200/index-211 COMMENT Index(9): /data1/INDEXES/200/index-210 COMMENT Index(10): /data1/INDEXES/200/index-209 COMMENT Index(11): /data1/INDEXES/200/index-208 COMMENT Index(12): /data1/INDEXES/200/index-207 COMMENT Index(13): /data1/INDEXES/200/index-206 COMMENT Index(14): /data1/INDEXES/200/index-205 COMMENT Index(15): /data1/INDEXES/200/index-204-00 COMMENT Index(16): /data1/INDEXES/200/index-204-01 COMMENT Index(17): /data1/INDEXES/200/index-204-02 COMMENT Index(18): /data1/INDEXES/200/index-204-03 COMMENT Index(19): /data1/INDEXES/200/index-204-04 COMMENT Index(20): /data1/INDEXES/200/index-204-05 COMMENT Index(21): /data1/INDEXES/200/index-204-06 COMMENT Index(22): /data1/INDEXES/200/index-204-07 COMMENT Index(23): /data1/INDEXES/200/index-204-08 COMMENT Index(24): /data1/INDEXES/200/index-204-09 COMMENT Index(25): /data1/INDEXES/200/index-204-10 COMMENT Index(26): /data1/INDEXES/200/index-204-11 COMMENT Index(27): /data1/INDEXES/200/index-203-00 COMMENT Index(28): /data1/INDEXES/200/index-203-01 COMMENT Index(29): /data1/INDEXES/200/index-203-02 COMMENT Index(30): /data1/INDEXES/200/index-203-03 COMMENT Index(31): /data1/INDEXES/200/index-203-04 COMMENT Index(32): /data1/INDEXES/200/index-203-05 COMMENT Index(33): /data1/INDEXES/200/index-203-06 COMMENT Index(34): /data1/INDEXES/200/index-203-07 COMMENT Index(35): /data1/INDEXES/200/index-203-08 COMMENT Index(36): /data1/INDEXES/200/index-203-09 COMMENT Index(37): /data1/INDEXES/200/index-203-10 COMMENT Index(38): /data1/INDEXES/200/index-203-11 COMMENT Index(39): /data1/INDEXES/200/index-202-00 COMMENT Index(40): /data1/INDEXES/200/index-202-01 COMMENT Index(41): /data1/INDEXES/200/index-202-02 COMMENT Index(42): /data1/INDEXES/200/index-202-03 COMMENT Index(43): /data1/INDEXES/200/index-202-04 COMMENT Index(44): /data1/INDEXES/200/index-202-05 COMMENT Index(45): /data1/INDEXES/200/index-202-06 COMMENT Index(46): /data1/INDEXES/200/index-202-07 COMMENT Index(47): /data1/INDEXES/200/index-202-08 COMMENT Index(48): /data1/INDEXES/200/index-202-09 COMMENT Index(49): /data1/INDEXES/200/index-202-10 COMMENT Index(50): /data1/INDEXES/200/index-202-11 COMMENT Index(51): /data1/INDEXES/200/index-201-00 COMMENT Index(52): /data1/INDEXES/200/index-201-01 COMMENT Index(53): /data1/INDEXES/200/index-201-02 COMMENT Index(54): /data1/INDEXES/200/index-201-03 COMMENT Index(55): /data1/INDEXES/200/index-201-04 COMMENT Index(56): /data1/INDEXES/200/index-201-05 COMMENT Index(57): /data1/INDEXES/200/index-201-06 COMMENT Index(58): /data1/INDEXES/200/index-201-07 COMMENT Index(59): /data1/INDEXES/200/index-201-08 COMMENT Index(60): /data1/INDEXES/200/index-201-09 COMMENT Index(61): /data1/INDEXES/200/index-201-10 COMMENT Index(62): /data1/INDEXES/200/index-201-11 COMMENT Index(63): /data1/INDEXES/200/index-200-00 COMMENT Index(64): /data1/INDEXES/200/index-200-01 COMMENT Index(65): /data1/INDEXES/200/index-200-02 COMMENT Index(66): /data1/INDEXES/200/index-200-03 COMMENT Index(67): /data1/INDEXES/200/index-200-04 COMMENT Index(68): /data1/INDEXES/200/index-200-05 COMMENT Index(69): /data1/INDEXES/200/index-200-06 COMMENT Index(70): /data1/INDEXES/200/index-200-07 COMMENT Index(71): /data1/INDEXES/200/index-200-08 COMMENT Index(72): /data1/INDEXES/200/index-200-09 COMMENT Index(73): /data1/INDEXES/200/index-200-10 COMMENT Index(74): /data1/INDEXES/200/index-200-11 COMMENT Field name: field.xy.fits COMMENT Field scale lower: 0.4 arcsec/pixel COMMENT Field scale upper: 720 arcsec/pixel COMMENT X col name: X COMMENT Y col name: Y COMMENT Start obj: 0 COMMENT End obj: 200 COMMENT Solved_in: solved COMMENT Solved_out: solved COMMENT Solvedserver: (null) COMMENT Parity: 2 COMMENT Codetol: 0.01 COMMENT Verify distance: 0 arcsec COMMENT Verify pixels: 1 pix COMMENT Maxquads: 0 COMMENT Maxmatches: 0 COMMENT Cpu limit: 0 s COMMENT Time limit: 0 s COMMENT Total time limit: 0 s COMMENT Total CPU limit: 600 s COMMENT Tweak: no COMMENT -- COMMENT -- properties of the matching quad: -- COMMENT quadno: 686636 COMMENT stars: 1095617,1095660,1095623,1095618 COMMENT field: 6,5,24,35 COMMENT code error: 0.00868071 COMMENT noverlap: 42 COMMENT nconflict: 1 COMMENT nfield: 88 COMMENT nindex: 139 COMMENT scale: 2.94093 arcsec/pix COMMENT parity: 1 COMMENT quads tried: 2166080 COMMENT quads matched: 2079562 COMMENT quads verified: 1747182 COMMENT objs tried: 0 COMMENT cpu time: 117.82 COMMENT -- AN_JOBID= 'alpha-201004-29242410' / Astrometry.net job ID END "; if (write_file(tmpfile, wcsliteral, strlen(wcsliteral))) { ERROR("Failed to write WCS to temp file %s", tmpfile); CuFail(tc, "failed to write WCS to temp file"); } tan = tan_read_header_file(tmpfile, NULL); CuAssertPtrNotNull(tc, tan); for (i=0; i<2; i++) { if (i == 0) { anwcs = anwcs_open_wcslib(tmpfile, 0); } else if (i == 1) { anwcs = anwcs_open_sip(tmpfile, 0); } CuAssertPtrNotNull(tc, anwcs); /* printf("ANWCS:\n"); anwcs_print(anwcs, stdout); printf("TAN:\n"); tan_print_to(tan, stdout); */ /* this wcs has: crval=(83.7132, -5.10104) crpix=(221.593, 169.656) CD = ( 1.5526e-06 0.00081692 ) ( -0.00081692 1.5526e-06 ) */ // check crval <-> crpix. x = tan->crpix[0]; y = tan->crpix[1]; ra = 1; ra2 = 2; dec = 3; dec2 = 4; tan_pixelxy2radec(tan, x, y, &ra, &dec); CuAssertDblEquals(tc, tan->crval[0], ra, 1e-6); CuAssertDblEquals(tc, tan->crval[1], dec, 1e-6); ok = anwcs_pixelxy2radec(anwcs, x, y, &ra2, &dec2); CuAssertIntEquals(tc, 0, ok); CuAssertDblEquals(tc, tan->crval[0], ra2, 1e-6); CuAssertDblEquals(tc, tan->crval[1], dec2, 1e-6); ra = tan->crval[0]; dec = tan->crval[1]; x = 1; x2 = 2; y = 3; y2 = 4; ok = tan_radec2pixelxy(tan, ra, dec, &x, &y); CuAssertIntEquals(tc, TRUE, ok); CuAssertDblEquals(tc, tan->crpix[0], x, 1e-6); CuAssertDblEquals(tc, tan->crpix[1], y, 1e-6); ok2 = anwcs_radec2pixelxy(anwcs, ra, dec, &x2, &y2); CuAssertIntEquals(tc, 0, ok2); CuAssertDblEquals(tc, tan->crpix[0], x2, 1e-6); CuAssertDblEquals(tc, tan->crpix[1], y2, 1e-6); // check pixel (0,0). x = y = 0.0; ra = 1; ra2 = 2; dec = 3; dec2 = 4; tan_pixelxy2radec(tan, x, y, &ra, &dec); ok = anwcs_pixelxy2radec(anwcs, x, y, &ra2, &dec2); CuAssertIntEquals(tc, 0, ok); CuAssertDblEquals(tc, ra, ra2, 1e-6); CuAssertDblEquals(tc, dec, dec2, 1e-6); // check RA,Dec (85, -4) ra = 85; dec = -4; x = 1; x2 = 2; y = 3; y2 = 4; ok = tan_radec2pixelxy(tan, ra, dec, &x, &y); CuAssertIntEquals(tc, TRUE, ok); ok2 = anwcs_radec2pixelxy(anwcs, ra, dec, &x2, &y2); CuAssertIntEquals(tc, 0, ok2); printf("x,y (%g,%g) vs (%g,%g)\n", x, y, x2, y2); CuAssertDblEquals(tc, x, x2, 1e-6); CuAssertDblEquals(tc, y, y2, 1e-6); anwcs_free(anwcs); } free(tan); }
int main(int argc, char** args) { int c; char* rdlsfn = NULL; char* wcsfn = NULL; char* xylsfn = NULL; char* rcol = NULL; char* dcol = NULL; anbool forcetan = FALSE; il* fields; int ext = 0; double ra=HUGE_VAL, dec=HUGE_VAL; anbool wcslib = FALSE; int loglvl = LOG_MSG; fields = il_new(16); while ((c = getopt(argc, args, OPTIONS)) != -1) { switch (c) { case 'v': loglvl++; break; case 'L': wcslib = TRUE; break; case 'r': ra = atof(optarg); break; case 'd': dec = atof(optarg); break; case 'e': ext = atoi(optarg); break; case 'h': print_help(args[0]); exit(0); case 't': forcetan = TRUE; break; case 'o': xylsfn = optarg; break; case 'i': rdlsfn = optarg; break; case 'w': wcsfn = optarg; break; case 'f': il_append(fields, atoi(optarg)); break; case 'R': rcol = optarg; break; case 'D': dcol = optarg; break; } } log_init(loglvl); if (optind != argc) { print_help(args[0]); exit(-1); } if (!(wcsfn && ((rdlsfn && xylsfn) || ((ra != HUGE_VAL) && (dec != HUGE_VAL))))) { print_help(args[0]); exit(-1); } if (!rdlsfn) { double x,y; anwcs_t* wcs = NULL; // read WCS. if (wcslib) { wcs = anwcs_open_wcslib(wcsfn, ext); } else if (forcetan) { wcs = anwcs_open_tan(wcsfn, ext); } else { wcs = anwcs_open(wcsfn, ext); } if (!wcs) { ERROR("Failed to read WCS file"); exit(-1); } logverb("Read WCS:\n"); if (log_get_level() >= LOG_VERB) { anwcs_print(wcs, log_get_fid()); } // convert immediately. if (anwcs_radec2pixelxy(wcs, ra, dec, &x, &y)) { ERROR("The given RA,Dec is on the opposite side of the sky."); exit(-1); } printf("RA,Dec (%.10f, %.10f) -> pixel (%.10f, %.10f)\n", ra, dec, x, y); anwcs_free(wcs); exit(0); } if (wcs_rd2xy(wcsfn, ext, rdlsfn, xylsfn, rcol, dcol, forcetan, wcslib, fields)) { ERROR("wcs-rd2xy failed"); exit(-1); } return 0; }
int main(int argc, char** args) { int c; char* rdlsfn = NULL; char* wcsfn = NULL; char* xylsfn = NULL; char* xcol = NULL; char* ycol = NULL; anbool forcetan = FALSE; anbool forcewcslib = FALSE; anbool forcewcstools = FALSE; anbool printhms = FALSE; il* fields; int ext = 0; double x, y; int loglvl = LOG_MSG; x = y = HUGE_VAL; fields = il_new(16); while ((c = getopt(argc, args, OPTIONS)) != -1) { switch (c) { case 'v': loglvl++; break; case 's': printhms = TRUE; break; case 'L': forcewcslib = TRUE; break; case 'T': forcewcstools = TRUE; break; case 'x': x = atof(optarg); break; case 'y': y = atof(optarg); break; case 'e': ext = atoi(optarg); break; case 'h': print_help(args[0]); exit(0); case 't': forcetan = TRUE; break; case 'o': rdlsfn = optarg; break; case 'i': xylsfn = optarg; break; case 'w': wcsfn = optarg; break; case 'f': il_append(fields, atoi(optarg)); break; case 'X': xcol = optarg; break; case 'Y': ycol = optarg; break; } } log_init(loglvl); if (optind != argc) { print_help(args[0]); exit(-1); } if (!(wcsfn && ((rdlsfn && xylsfn) || ((x != HUGE_VAL) && (y != HUGE_VAL))))) { print_help(args[0]); exit(-1); } if (!xylsfn) { double ra,dec; anwcs_t* wcs = NULL; // read WCS. if (forcewcslib) { wcs = anwcs_open_wcslib(wcsfn, ext); } else if (forcewcstools) { wcs = anwcs_open_wcstools(wcsfn, ext); } else if (forcetan) { wcs = anwcs_open_tan(wcsfn, ext); } else { wcs = anwcs_open(wcsfn, ext); } if (!wcs) { ERROR("Failed to read WCS file \"%s\", extension %i", wcsfn, ext); exit(-1); } logverb("Read WCS:\n"); if (log_get_level() >= LOG_VERB) { anwcs_print(wcs, log_get_fid()); } // convert immediately. anwcs_pixelxy2radec(wcs, x, y, &ra, &dec); printf("Pixel (%.10f, %.10f) -> RA,Dec (%.10f, %.10f)\n", x, y, ra, dec); if (printhms) { char str[32]; ra2hmsstring(ra, str); printf(" RA,Dec (%20s, ", str); dec2dmsstring(dec, str); printf("%20s)\n", str); } anwcs_free(wcs); exit(0); } if (wcs_xy2rd(wcsfn, ext, xylsfn, rdlsfn, xcol, ycol, forcetan, forcewcslib, fields)) { ERROR("wcs-xy2rd failed"); exit(-1); } return 0; }