void test_sorting(CuTest* tc) { double flux[] = { 50, 100, 50, 100, 20, 20, 40, 40 }; double bg[] = { 0, 10, 10, 0, 10, 0, 5, 0 }; int trueorder[] = { 4, 5, 7, 6, 2, 0, 1, 3 }; int i, N; starxy_t* s; char* infn = "/tmp/test-resort-xylist"; char* outfn = "/tmp/test-resort-xylist-out"; xylist_t* xy; xylist_t* xy2; starxy_t* s2; xy = xylist_open_for_writing(infn); CuAssertPtrNotNull(tc, xy); xylist_set_include_flux(xy, TRUE); xylist_set_include_background(xy, TRUE); if (xylist_write_primary_header(xy) || xylist_write_header(xy)) { CuFail(tc, "write header"); } N = sizeof(flux) / sizeof(double); s = starxy_new(N, TRUE, TRUE); for (i=0; i<N; i++) { starxy_setx(s, i, random()%1000); starxy_sety(s, i, random()%1000); } starxy_set_flux_array(s, flux); starxy_set_bg_array(s, bg); if (xylist_write_field(xy, s) || xylist_fix_header(xy) || xylist_fix_primary_header(xy) || xylist_close(xy)) { CuFail(tc, "close xy"); } CuAssertIntEquals(tc, 0, resort_xylist(infn, outfn, NULL, NULL, TRUE)); xy2 = xylist_open(outfn); s2 = xylist_read_field(xy2, NULL); CuAssertPtrNotNull(tc, s2); CuAssertPtrNotNull(tc, s2->x); CuAssertPtrNotNull(tc, s2->y); CuAssertPtrNotNull(tc, s2->flux); CuAssertPtrNotNull(tc, s2->background); for (i=0; i<N; i++) { CuAssertDblEquals(tc, s->x[trueorder[i]], s2->x[i], 1e-6); CuAssertDblEquals(tc, s->y[trueorder[i]], s2->y[i], 1e-6); CuAssertDblEquals(tc, s->flux[trueorder[i]], s2->flux[i], 1e-6); CuAssertDblEquals(tc, s->background[trueorder[i]], s2->background[i], 1e-6); } }
int plot_xy_setsize(plot_args_t* pargs, plotxy_t* args) { xylist_t* xyls; xyls = xylist_open(args->fn); if (!xyls) { ERROR("Failed to open xylist from file \"%s\"", args->fn); return -1; } pargs->W = xylist_get_imagew(xyls); pargs->H = xylist_get_imageh(xyls); if (pargs->W == 0 && pargs->H == 0) { qfits_header* hdr = xylist_get_primary_header(xyls); pargs->W = qfits_header_getint(hdr, "IMAGEW", 0); pargs->H = qfits_header_getint(hdr, "IMAGEH", 0); } xylist_close(xyls); return 0; }
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 main(int argc, char** args) { int c; char* xylsfn = NULL; char* wcsfn = NULL; char* rdlsfn = NULL; xylist_t* xyls = NULL; rdlist_t* rdls = NULL; sip_t sip; int i, j; int W, H; //double xyzcenter[3]; //double fieldrad2; double pixeljitter = 1.0; int loglvl = LOG_MSG; double wcsscale; char* bgfn = NULL; //double nsigma = 3.0; fits_use_error_system(); while ((c = getopt(argc, args, OPTIONS)) != -1) { switch (c) { case 'I': bgfn = optarg; break; case 'j': pixeljitter = atof(optarg); break; case 'h': print_help(args[0]); exit(0); case 'r': rdlsfn = optarg; break; case 'x': xylsfn = optarg; break; case 'w': wcsfn = optarg; break; case 'v': loglvl++; break; } } if (optind != argc) { print_help(args[0]); exit(-1); } if (!xylsfn || !wcsfn || !rdlsfn) { print_help(args[0]); exit(-1); } log_init(loglvl); // read WCS. logmsg("Trying to parse SIP header from %s...\n", wcsfn); if (!sip_read_header_file(wcsfn, &sip)) { logmsg("Failed to parse SIP header from %s.\n", wcsfn); } // image W, H W = sip.wcstan.imagew; H = sip.wcstan.imageh; if ((W == 0.0) || (H == 0.0)) { logmsg("WCS file %s didn't contain IMAGEW and IMAGEH headers.\n", wcsfn); // FIXME - use bounds of xylist? exit(-1); } wcsscale = sip_pixel_scale(&sip); logmsg("WCS scale: %g arcsec/pixel\n", wcsscale); // read XYLS. xyls = xylist_open(xylsfn); if (!xyls) { logmsg("Failed to read an xylist from file %s.\n", xylsfn); exit(-1); } // read RDLS. rdls = rdlist_open(rdlsfn); if (!rdls) { logmsg("Failed to read an rdlist from file %s.\n", rdlsfn); exit(-1); } // Find field center and radius. /* sip_pixelxy2xyzarr(&sip, W/2, H/2, xyzcenter); fieldrad2 = arcsec2distsq(sip_pixel_scale(&sip) * hypot(W/2, H/2)); */ { // (x,y) positions of field stars. double* fieldpix; int Nfield; double* indexpix; starxy_t* xy; rd_t* rd; int Nindex; xy = xylist_read_field(xyls, NULL); if (!xy) { logmsg("Failed to read xyls entries.\n"); exit(-1); } Nfield = starxy_n(xy); fieldpix = starxy_to_xy_array(xy, NULL); logmsg("Found %i field objects\n", Nfield); // Project RDLS into pixel space. rd = rdlist_read_field(rdls, NULL); if (!rd) { logmsg("Failed to read rdls entries.\n"); exit(-1); } Nindex = rd_n(rd); logmsg("Found %i indx objects\n", Nindex); indexpix = malloc(2 * Nindex * sizeof(double)); for (i=0; i<Nindex; i++) { anbool ok; double ra = rd_getra(rd, i); double dec = rd_getdec(rd, i); ok = sip_radec2pixelxy(&sip, ra, dec, indexpix + i*2, indexpix + i*2 + 1); assert(ok); } logmsg("CRPIX is (%g,%g)\n", sip.wcstan.crpix[0], sip.wcstan.crpix[1]); /* // ?? // Look for index-field pairs that are (a) close together; and (b) close to CRPIX. // Split the image into 3x3, 5x5 or so, and in each, look for a // (small) rotation and log(scale), then (bigger) shift, using histogram // cross-correlation. // Are the rotations and scales really going to be big enough that this // is required, or can we get away with doing shift first, then fine-tuning // rotation and scale? { // NxN blocks int NB = 3; int b; // HACK - use histogram2d machinery to split image into blocks. histogram2d* blockhist = histogram2d_new_nbins(0, W, NB, 0, H, NB); int* fieldi = malloc(Nfield * sizeof(int)); int* indexi = malloc(Nindex * sizeof(int)); // rotation bins int NR = 100; // scale bins (ie, log(radius) bins) double minrad = 1.0; double maxrad = 200.0; int NS = 100; histogram2d* rsfield = histogram2d_new_nbins(-M_PI, M_PI, NR, log(minrad), log(maxrad), NS); histogram2d* rsindex = histogram2d_new_nbins(-M_PI, M_PI, NR, log(minrad), log(maxrad), NS); histogram2d_set_y_edges(rsfield, HIST2D_DISCARD); histogram2d_set_y_edges(rsindex, HIST2D_DISCARD); for (b=0; b<(NB*NB); b++) { int bin; int NF, NI; double dx, dy; NF = NI = 0; for (i=0; i<Nfield; i++) { bin = histogram2d_add(blockhist, fieldpix[2*i], fieldpix[2*i+1]); if (bin != b) continue; fieldi[NF] = i; NF++; } for (i=0; i<Nindex; i++) { bin = histogram2d_add(blockhist, indexpix[2*i], indexpix[2*i+1]); if (bin != b) continue; indexi[NI] = i; NI++; } logmsg("bin %i has %i field and %i index stars.\n", b, NF, NI); logmsg("histogramming field rotation/scale\n"); for (i=0; i<NF; i++) { for (j=0; j<i; j++) { dx = fieldpix[2*fieldi[i]] - fieldpix[2*fieldi[j]]; dy = fieldpix[2*fieldi[i]+1] - fieldpix[2*fieldi[j]+1]; histogram2d_add(rsfield, atan2(dy, dx), log(sqrt(dx*dx + dy*dy))); } } logmsg("histogramming index rotation/scale\n"); for (i=0; i<NI; i++) { for (j=0; j<i; j++) { dx = indexpix[2*indexi[i]] - fieldpix[2*indexi[j]]; dy = indexpix[2*indexi[i]+1] - fieldpix[2*indexi[j]+1]; histogram2d_add(rsindex, atan2(dy, dx), log(sqrt(dx*dx + dy*dy))); } } } histogram2d_free(rsfield); histogram2d_free(rsindex); free(fieldi); free(indexi); histogram2d_free(blockhist); } */ { double* fieldsigma2s = malloc(Nfield * sizeof(double)); int besti; int* theta; double logodds; double Q2, R2; double qc[2]; double gamma; // HACK -- quad radius-squared Q2 = square(100.0); qc[0] = sip.wcstan.crpix[0]; qc[1] = sip.wcstan.crpix[1]; // HACK -- variance growth rate wrt radius. gamma = 1.0; for (i=0; i<Nfield; i++) { R2 = distsq(qc, fieldpix + 2*i, 2); fieldsigma2s[i] = square(pixeljitter) * (1.0 + gamma * R2/Q2); } logodds = verify_star_lists(indexpix, Nindex, fieldpix, fieldsigma2s, Nfield, W*H, 0.25, log(1e-100), log(1e100), &besti, NULL, &theta, NULL, NULL); logmsg("Logodds: %g\n", logodds); if (bgfn) { plot_args_t pargs; plotimage_t* img; cairo_t* cairo; char outfn[32]; j = 0; plotstuff_init(&pargs); pargs.outformat = PLOTSTUFF_FORMAT_PNG; sprintf(outfn, "tweak-%03i.png", j); pargs.outfn = outfn; img = plotstuff_get_config(&pargs, "image"); //img->format = PLOTSTUFF_FORMAT_JPG; // guess plot_image_set_filename(img, bgfn); plot_image_setsize(&pargs, img); plotstuff_run_command(&pargs, "image"); cairo = pargs.cairo; // red circles around every field star. cairo_set_color(cairo, "red"); for (i=0; i<Nfield; i++) { cairoutils_draw_marker(cairo, CAIROUTIL_MARKER_CIRCLE, fieldpix[2*i+0], fieldpix[2*i+1], 2.0 * sqrt(fieldsigma2s[i])); cairo_stroke(cairo); } // green crosshairs at every index star. cairo_set_color(cairo, "green"); for (i=0; i<Nindex; i++) { cairoutils_draw_marker(cairo, CAIROUTIL_MARKER_XCROSSHAIR, indexpix[2*i+0], indexpix[2*i+1], 3); cairo_stroke(cairo); } // thick white circles for corresponding field stars. cairo_set_line_width(cairo, 2); for (i=0; i<Nfield; i++) { if (theta[i] < 0) continue; cairo_set_color(cairo, "white"); cairoutils_draw_marker(cairo, CAIROUTIL_MARKER_CIRCLE, fieldpix[2*i+0], fieldpix[2*i+1], 2.0 * sqrt(fieldsigma2s[i])); cairo_stroke(cairo); // thick cyan crosshairs for corresponding index stars. cairo_set_color(cairo, "cyan"); cairoutils_draw_marker(cairo, CAIROUTIL_MARKER_XCROSSHAIR, indexpix[2*theta[i]+0], indexpix[2*theta[i]+1], 3); cairo_stroke(cairo); } plotstuff_output(&pargs); } free(theta); free(fieldsigma2s); } free(fieldpix); free(indexpix); } if (xylist_close(xyls)) { logmsg("Failed to close XYLS file.\n"); } return 0; }
void test_solve_multiindex(CuTest* ct) { sl* fns; multiindex_t* mi; int i; solver_t* s = NULL; starxy_t* field = NULL; MatchObj* mo = NULL; xylist_t* xy = NULL; log_init(LOG_VERB); fns = sl_new(4); sl_append(fns, "../util/t10.ind"); sl_append(fns, "../util/t11.ind"); sl_append(fns, "../util/t12.ind"); mi = multiindex_open("../util/t10.skdt", fns, 0); printf("Got %i indices\n", multiindex_n(mi)); for (i=0; i<multiindex_n(mi); i++) { index_t* ind = multiindex_get(mi, i); printf(" %i: %s, %i stars, %i quads (%g to %g arcmin)\n", i, ind->indexname, index_nquads(ind), index_nstars(ind), ind->index_scale_lower/60., ind->index_scale_upper/60.); } s = solver_new(); // 10.8 s->funits_lower = 5.0; s->funits_upper = 15.0; xy = xylist_open("../util/t1.xy"); if (!xy) { ERROR("Failed to open xylist\n"); CuFail(ct, "xylist"); } field = xylist_read_field(xy, NULL); solver_set_field(s, field); solver_set_field_bounds(s, 0, 1000, 0, 1000); for (i=0; i<multiindex_n(mi); i++) { index_t* ind = multiindex_get(mi, i); solver_add_index(s, ind); } solver_run(s); if (solver_did_solve(s)) { mo = solver_get_best_match(s); matchobj_print(mo, LOG_MSG); // HACK -- ugly!! verify_free_matchobj(mo); } xylist_close(xy); solver_cleanup_field(s); solver_free(s); multiindex_free(mi); sl_free2(fns); }
int main(int argc, char** args) { int c; char* xylsfn = NULL; char* wcsfn = NULL; char* rdlsfn = NULL; char* plotfn = NULL; xylist_t* xyls = NULL; rdlist_t* rdls = NULL; sip_t sip; int i; int W, H; double pixeljitter = 1.0; int loglvl = LOG_MSG; double wcsscale; fits_use_error_system(); while ((c = getopt(argc, args, OPTIONS)) != -1) { switch (c) { case 'p': plotfn = optarg; break; case 'j': pixeljitter = atof(optarg); break; case 'h': print_help(args[0]); exit(0); case 'r': rdlsfn = optarg; break; case 'x': xylsfn = optarg; break; case 'w': wcsfn = optarg; break; case 'v': loglvl++; break; } } if (optind != argc) { print_help(args[0]); exit(-1); } if (!xylsfn || !wcsfn || !rdlsfn) { print_help(args[0]); exit(-1); } log_init(loglvl); // read WCS. logmsg("Trying to parse SIP header from %s...\n", wcsfn); if (!sip_read_header_file(wcsfn, &sip)) { logmsg("Failed to parse SIP header from %s.\n", wcsfn); } // image W, H W = sip.wcstan.imagew; H = sip.wcstan.imageh; if ((W == 0.0) || (H == 0.0)) { logmsg("WCS file %s didn't contain IMAGEW and IMAGEH headers.\n", wcsfn); // FIXME - use bounds of xylist? exit(-1); } wcsscale = sip_pixel_scale(&sip); logmsg("WCS scale: %g arcsec/pixel\n", wcsscale); // read XYLS. xyls = xylist_open(xylsfn); if (!xyls) { logmsg("Failed to read an xylist from file %s.\n", xylsfn); exit(-1); } // read RDLS. rdls = rdlist_open(rdlsfn); if (!rdls) { logmsg("Failed to read an rdlist from file %s.\n", rdlsfn); exit(-1); } { // (x,y) positions of field stars. double* fieldpix; int Nfield; double* indexpix; starxy_t* xy; rd_t* rd; int Nindex; xy = xylist_read_field(xyls, NULL); if (!xy) { logmsg("Failed to read xyls entries.\n"); exit(-1); } Nfield = starxy_n(xy); fieldpix = starxy_to_xy_array(xy, NULL); logmsg("Found %i field objects\n", Nfield); // Project RDLS into pixel space. rd = rdlist_read_field(rdls, NULL); if (!rd) { logmsg("Failed to read rdls entries.\n"); exit(-1); } Nindex = rd_n(rd); logmsg("Found %i indx objects\n", Nindex); indexpix = malloc(2 * Nindex * sizeof(double)); for (i=0; i<Nindex; i++) { anbool ok; double ra = rd_getra(rd, i); double dec = rd_getdec(rd, i); ok = sip_radec2pixelxy(&sip, ra, dec, indexpix + i*2, indexpix + i*2 + 1); assert(ok); } logmsg("CRPIX is (%g,%g)\n", sip.wcstan.crpix[0], sip.wcstan.crpix[1]); { double* fieldsigma2s = malloc(Nfield * sizeof(double)); int besti; int* theta; double logodds; double Q2, R2; double qc[2]; double gamma; // HACK -- quad radius-squared Q2 = square(100.0); qc[0] = sip.wcstan.crpix[0]; qc[1] = sip.wcstan.crpix[1]; // HACK -- variance growth rate wrt radius. gamma = 1.0; for (i=0; i<Nfield; i++) { R2 = distsq(qc, fieldpix + 2*i, 2); fieldsigma2s[i] = square(pixeljitter) * (1.0 + gamma * R2/Q2); } logodds = verify_star_lists(indexpix, Nindex, fieldpix, fieldsigma2s, Nfield, W*H, 0.25, log(1e-100), log(1e100), &besti, NULL, &theta, NULL); logmsg("Logodds: %g\n", logodds); if (TRUE) { for (i=0; i<Nfield; i++) { if (theta[i] < 0) continue; printf("%g %g %g %g\n", fieldpix[2*i+0], fieldpix[2*i+1], rd_getra(rd, theta[i]), rd_getdec(rd, theta[i])); } } if (plotfn) { plot_args_t pargs; plotimage_t* img; cairo_t* cairo; plotstuff_init(&pargs); pargs.outformat = PLOTSTUFF_FORMAT_PNG; pargs.outfn = plotfn; img = plotstuff_get_config(&pargs, "image"); img->format = PLOTSTUFF_FORMAT_JPG; plot_image_set_filename(img, "1.jpg"); plot_image_setsize(&pargs, img); plotstuff_run_command(&pargs, "image"); cairo = pargs.cairo; // red circles around every field star. cairo_set_color(cairo, "red"); for (i=0; i<Nfield; i++) { cairoutils_draw_marker(cairo, CAIROUTIL_MARKER_CIRCLE, fieldpix[2*i+0], fieldpix[2*i+1], 2.0 * sqrt(fieldsigma2s[i])); cairo_stroke(cairo); } // green crosshairs at every index star. cairo_set_color(cairo, "green"); for (i=0; i<Nindex; i++) { cairoutils_draw_marker(cairo, CAIROUTIL_MARKER_XCROSSHAIR, indexpix[2*i+0], indexpix[2*i+1], 3); cairo_stroke(cairo); } // thick white circles for corresponding field stars. cairo_set_line_width(cairo, 2); for (i=0; i<Nfield; i++) { if (theta[i] < 0) continue; cairo_set_color(cairo, "white"); cairoutils_draw_marker(cairo, CAIROUTIL_MARKER_CIRCLE, fieldpix[2*i+0], fieldpix[2*i+1], 2.0 * sqrt(fieldsigma2s[i])); cairo_stroke(cairo); // thick cyan crosshairs for corresponding index stars. cairo_set_color(cairo, "cyan"); cairoutils_draw_marker(cairo, CAIROUTIL_MARKER_XCROSSHAIR, indexpix[2*theta[i]+0], indexpix[2*theta[i]+1], 3); cairo_stroke(cairo); } plotstuff_output(&pargs); } free(theta); free(fieldsigma2s); } free(fieldpix); free(indexpix); } if (xylist_close(xyls)) { logmsg("Failed to close XYLS file.\n"); } return 0; }
int main(int argc, char** args) { int c; char* xylsfn = NULL; char* rdlsfn = NULL; char* corrfn = NULL; char* outfn = NULL; char* xcol = NULL; char* ycol = NULL; char* rcol = NULL; char* dcol = NULL; xylist_t* xyls = NULL; rdlist_t* rdls = NULL; rd_t rd; starxy_t xy; int fieldnum = 1; int N; double* fieldxy = NULL; double* xyz = NULL; sip_t wcs; int rtn = -1; int loglvl = LOG_MSG; int siporder = 0; int W=0, H=0; anbool crpix_center = FALSE; int i; int doshift = 1; fits_use_error_system(); while ((c = getopt(argc, args, OPTIONS)) != -1) { switch (c) { case 'h': print_help(args[0]); exit(0); case 'W': W = atoi(optarg); break; case 'H': H = atoi(optarg); break; case 'C': crpix_center = TRUE; break; case 's': siporder = atoi(optarg); break; case 'c': corrfn = optarg; break; case 'r': rdlsfn = optarg; break; case 'R': rcol = optarg; break; case 'D': dcol = optarg; break; case 'x': xylsfn = optarg; break; case 'X': xcol = optarg; break; case 'Y': ycol = optarg; break; case 'o': outfn = optarg; break; case 'v': loglvl++; break; } } if (optind != argc) { print_help(args[0]); exit(-1); } if (! ((xylsfn && rdlsfn) || corrfn) || !outfn) { print_help(args[0]); exit(-1); } log_init(loglvl); if (corrfn) { xylsfn = corrfn; rdlsfn = corrfn; if (!xcol) xcol = "FIELD_X"; if (!ycol) ycol = "FIELD_Y"; if (!rcol) rcol = "INDEX_RA"; if (!dcol) dcol = "INDEX_DEC"; } // 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); // read RDLS. rdls = rdlist_open(rdlsfn); if (!rdls) { ERROR("Failed to read an RA,Dec list from file %s", rdlsfn); goto bailout; } if (rcol) rdlist_set_raname(rdls, rcol); if (dcol) rdlist_set_decname(rdls, dcol); if (!xylist_read_field_num(xyls, fieldnum, &xy)) { ERROR("Failed to read xyls file %s, field %i", xylsfn, fieldnum); goto bailout; } if (!rdlist_read_field_num(rdls, fieldnum, &rd)) { ERROR("Failed to read rdls field %i", fieldnum); goto bailout; } N = starxy_n(&xy); if (rd_n(&rd) != N) { ERROR("X,Y list and RA,Dec list must have the same number of entries, " "but found %i vs %i", N, rd_n(&rd)); goto bailout; } logverb("Read %i points from %s and %s\n", N, rdlsfn, xylsfn); xyz = (double*)malloc(sizeof(double) * 3 * N); if (!xyz) { ERROR("Failed to allocate %i xyz coords", N); goto bailout; } radecdeg2xyzarrmany(rd.ra, rd.dec, xyz, N); fieldxy = starxy_to_xy_array(&xy, NULL); if (!fieldxy) { ERROR("Failed to allocate %i xy coords", N); goto bailout; } logverb("Fitting WCS\n"); if (siporder == 0) { if (fit_tan_wcs(xyz, fieldxy, N, &(wcs.wcstan), NULL)) { ERROR("Failed to fit for TAN WCS"); goto bailout; } } else { if (W == 0) { for (i=0; i<N; i++) { W = MAX(W, (int)ceil(fieldxy[2*i + 0])); } } if (H == 0) { for (i=0; i<N; i++) { H = MAX(H, (int)ceil(fieldxy[2*i + 1])); } } logverb("Image size = %i x %i pix\n", W, H); fit_sip_wcs_2(xyz, fieldxy, NULL, N, siporder, siporder+1, W, H, crpix_center, NULL, doshift, &wcs); } if (siporder <= 1) { if (tan_write_to_file(&(wcs.wcstan), outfn)) { ERROR("Failed to write TAN WCS header to file \"%s\"", outfn); goto bailout; } } else { if (sip_write_to_file(&wcs, outfn)) { ERROR("Failed to write SIP WCS header to file \"%s\"", outfn); goto bailout; } } logverb("Wrote WCS to %s\n", outfn); starxy_free_data(&xy); rd_free_data(&rd); rtn = 0; bailout: if (rdls) rdlist_close(rdls); if (xyls) xylist_close(xyls); if (fieldxy) free(fieldxy); if (xyz) free(xyz); return rtn; }
int plot_xy_plot(const char* command, cairo_t* cairo, plot_args_t* pargs, void* baton) { plotxy_t* args = (plotxy_t*)baton; // Plot it! xylist_t* xyls; starxy_t myxy; starxy_t* xy = NULL; starxy_t* freexy = NULL; int Nxy; int i; #if 0 double t0; #endif plotstuff_builtin_apply(cairo, pargs); if (args->fn && dl_size(args->xyvals)) { ERROR("Can only plot one of xylist filename and xy_vals"); return -1; } if (!args->fn && !dl_size(args->xyvals)) { ERROR("Neither xylist filename nor xy_vals given!"); return -1; } if (args->fn) { #if 0 t0 = timenow(); #endif // Open xylist. xyls = xylist_open(args->fn); if (!xyls) { ERROR("Failed to open xylist from file \"%s\"", args->fn); return -1; } // we don't care about FLUX and BACKGROUND columns. xylist_set_include_flux(xyls, FALSE); xylist_set_include_background(xyls, FALSE); if (args->xcol) xylist_set_xname(xyls, args->xcol); if (args->ycol) xylist_set_yname(xyls, args->ycol); // Find number of entries in xylist. xy = xylist_read_field_num(xyls, args->ext, NULL); freexy = xy; xylist_close(xyls); if (!xy) { ERROR("Failed to read FITS extension %i from file %s.\n", args->ext, args->fn); return -1; } Nxy = starxy_n(xy); // If N is specified, apply it as a max. if (args->nobjs) Nxy = MIN(Nxy, args->nobjs); //logmsg("%g s to read xylist\n", timenow()-t0); } else { assert(dl_size(args->xyvals)); starxy_from_dl(&myxy, args->xyvals, FALSE, FALSE); xy = &myxy; Nxy = starxy_n(xy); } // Transform through WCSes. if (args->wcs) { double ra, dec, x, y; assert(pargs->wcs); /* // check for any overlap. double pralo,prahi,pdeclo,pdechi; double ralo,rahi,declo,dechi; anwcs_get_radec_bounds(pargs->wcs, 100, &pralo, &prahi, &pdeclo, &pdechi); anwcs_get_radec_bounds(args->wcs, 100, &ralo, &rahi, &declo, &dechi); if ( */ for (i=0; i<Nxy; i++) { anwcs_pixelxy2radec(args->wcs, // I used to add 1 here starxy_getx(xy, i), starxy_gety(xy, i), &ra, &dec); if (!plotstuff_radec2xy(pargs, ra, dec, &x, &y)) continue; logverb(" xy (%g,%g) -> RA,Dec (%g,%g) -> plot xy (%g,%g)\n", starxy_getx(xy,i), starxy_gety(xy,i), ra, dec, x, y); // add shift and scale... // FIXME -- not clear that we want to do this here... /* starxy_setx(xy, i, args->scale * (x - args->xoff)); starxy_sety(xy, i, args->scale * (y - args->yoff)); starxy_setx(xy, i, x-1); starxy_sety(xy, i, y-1); */ // Output coords: FITS -> 0-indexed image starxy_setx(xy, i, x-1); starxy_sety(xy, i, y-1); } } else { // Shift and scale xylist entries. if (args->xoff != 0.0 || args->yoff != 0.0) { for (i=0; i<Nxy; i++) { starxy_setx(xy, i, starxy_getx(xy, i) - args->xoff); starxy_sety(xy, i, starxy_gety(xy, i) - args->yoff); } } if (args->scale != 1.0) { for (i=0; i<Nxy; i++) { starxy_setx(xy, i, args->scale * starxy_getx(xy, i)); starxy_sety(xy, i, args->scale * starxy_gety(xy, i)); } } } // Plot markers. #if 0 t0 = timenow(); #endif for (i=args->firstobj; i<Nxy; i++) { double x = starxy_getx(xy, i); double y = starxy_gety(xy, i); if (plotstuff_marker_in_bounds(pargs, x, y)) plotstuff_stack_marker(pargs, x, y); } plotstuff_plot_stack(pargs, cairo); //logmsg("%g s to plot xylist\n", timenow()-t0); starxy_free(freexy); return 0; }
// This runs after "astrometry-engine" is run on the file. static void after_solved(augment_xylist_t* axy, solve_field_args_t* sf, anbool makeplots, const char* me, anbool verbose, const char* tempdir, sl* tempdirs, sl* tempfiles, double plotscale, const char* bgfn) { sip_t wcs; double ra, dec, fieldw, fieldh; char rastr[32], decstr[32]; char* fieldunits; // print info about the field. logmsg("Field: %s\n", axy->imagefn ? axy->imagefn : axy->xylsfn); if (file_exists(axy->wcsfn)) { double orient; if (axy->wcs_last_mod) { time_t t = file_get_last_modified_time(axy->wcsfn); if (t == axy->wcs_last_mod) { logmsg("Warning: there was already a WCS file, and its timestamp has not changed.\n"); } } if (!sip_read_header_file(axy->wcsfn, &wcs)) { ERROR("Failed to read WCS header from file %s", axy->wcsfn); exit(-1); } sip_get_radec_center(&wcs, &ra, &dec); sip_get_radec_center_hms_string(&wcs, rastr, decstr); sip_get_field_size(&wcs, &fieldw, &fieldh, &fieldunits); orient = sip_get_orientation(&wcs); logmsg("Field center: (RA,Dec) = (%3.6f, %3.6f) deg.\n", ra, dec); logmsg("Field center: (RA H:M:S, Dec D:M:S) = (%s, %s).\n", rastr, decstr); logmsg("Field size: %g x %g %s\n", fieldw, fieldh, fieldunits); logmsg("Field rotation angle: up is %g degrees E of N\n", orient); } else { logmsg("Did not solve (or no WCS file was written).\n"); } // create new FITS file... if (axy->fitsimgfn && sf->newfitsfn && file_exists(axy->wcsfn)) { logmsg("Creating new FITS file \"%s\"...\n", sf->newfitsfn); if (new_wcs(axy->fitsimgfn, axy->wcsfn, sf->newfitsfn, TRUE)) { ERROR("Failed to create FITS image with new WCS headers"); exit(-1); } } // write list of index stars in image coordinates if (sf->indxylsfn && file_exists(axy->wcsfn) && file_exists(axy->rdlsfn)) { assert(axy->wcsfn); assert(axy->rdlsfn); // index rdls to xyls. if (wcs_rd2xy(axy->wcsfn, 0, axy->rdlsfn, sf->indxylsfn, NULL, NULL, FALSE, FALSE, NULL)) { ERROR("Failed to project index stars into field coordinates using wcs-rd2xy"); exit(-1); } } if (makeplots && file_exists(sf->indxylsfn) && file_readable(axy->matchfn) && file_readable(axy->wcsfn)) { logmsg("Creating index object overlay plot...\n"); if (plot_index_overlay(axy, me, sf->indxylsfn, sf->redgreenfn, plotscale, bgfn)) { ERROR("Plot index overlay failed."); } } if (makeplots && file_readable(axy->wcsfn)) { logmsg("Creating annotation plot...\n"); if (plot_annotations(axy, me, verbose, sf->ngcfn, plotscale, bgfn)) { ERROR("Plot annotations failed."); } } if (axy->imagefn && sf->kmzfn && file_exists(axy->wcsfn)) { logmsg("Writing kmz file...\n"); if (write_kmz(axy, sf->kmzfn, tempdir, tempdirs, tempfiles)) { ERROR("Failed to write KMZ."); exit(-1); } } if (sf->scampfn && file_exists(axy->wcsfn)) { //char* hdrfile = NULL; qfits_header* imageheader = NULL; starxy_t* xy; xylist_t* xyls; xyls = xylist_open(axy->axyfn); if (!xyls) { ERROR("Failed to read xylist to write SCAMP catalog"); exit(-1); } if (axy->xcol) xylist_set_xname(xyls, axy->xcol); if (axy->ycol) xylist_set_yname(xyls, axy->ycol); //xylist_set_include_flux(xyls, FALSE); xylist_set_include_background(xyls, FALSE); xy = xylist_read_field(xyls, NULL); xylist_close(xyls); if (axy->fitsimgfn) { //hdrfile = axy->fitsimgfn; imageheader = anqfits_get_header2(axy->fitsimgfn, 0); } if (axy->xylsfn) { char val[32]; //hdrfile = axy->xylsfn; imageheader = anqfits_get_header2(axy->xylsfn, 0); // Set NAXIS=2, NAXIS1=IMAGEW, NAXIS2=IMAGEH fits_header_mod_int(imageheader, "NAXIS", 2, NULL); sprintf(val, "%i", axy->W); qfits_header_add_after(imageheader, "NAXIS", "NAXIS1", val, "image width", NULL); sprintf(val, "%i", axy->H); qfits_header_add_after(imageheader, "NAXIS1", "NAXIS2", val, "image height", NULL); //fits_header_add_int(imageheader, "NAXIS1", axy->W, NULL); //fits_header_add_int(imageheader, "NAXIS2", axy->H, NULL); logverb("Using NAXIS 1,2 = %i,%i\n", axy->W, axy->H); } if (scamp_write_field(imageheader, &wcs, xy, sf->scampfn)) { ERROR("Failed to write SCAMP catalog"); exit(-1); } starxy_free(xy); if (imageheader) qfits_header_destroy(imageheader); } if (sf->scampconfigfn) { if (scamp_write_config_file(axy->scampfn, sf->scampconfigfn)) { ERROR("Failed to write SCAMP config file snippet to %s", sf->scampconfigfn); exit(-1); } } }