static void plot_hd(cairo_t* cairo, plot_args_t* pargs, plotann_t* ann) { int i, N; hd_catalog_t* hdcat = NULL; double ra,dec,rad; bl* hdlist = NULL; if (!ann->hd_catalog) return; hdcat = henry_draper_open(ann->hd_catalog); if (!hdcat) { ERROR("Failed to open Henry Draper catalog file \"%s\"", ann->hd_catalog); return; } if (plotstuff_get_radec_center_and_radius(pargs, &ra, &dec, &rad)) { ERROR("Failed to get RA,Dec,radius from plotstuff"); return; } hdlist = henry_draper_get(hdcat, ra, dec, deg2arcsec(rad)); logverb("Got %zu Henry Draper stars\n", bl_size(hdlist)); N = bl_size(hdlist); for (i=0; i<N; i++) { hd_entry_t* entry = bl_access(hdlist, i); double px, py; char label[16]; if (!plotstuff_radec2xy(pargs, entry->ra, entry->dec, &px, &py)) continue; px -= 1; py -= 1; if (px < 1 || py < 1 || px > pargs->W || py > pargs->H) continue; logverb("HD %i at RA,Dec (%g,%g) -> xy (%g, %g)\n", entry->hd, entry->ra, entry->dec, px, py); plotstuff_stack_marker(pargs, px, py); if (ann->HD_labels) { sprintf(label, "HD %i", entry->hd); plotstuff_stack_text(pargs, cairo, label, px, py); } } bl_free(hdlist); henry_draper_close(hdcat); }
static void plot_brightstars(cairo_t* cairo, plot_args_t* pargs, plotann_t* ann) { int i, N; // Get plot center, to use in trimming bright stars double rc,dc,radius; plotstuff_get_radec_center_and_radius(pargs, &rc, &dc, &radius); N = bright_stars_n(); for (i=0; i<N; i++) { double px, py; char* label; const brightstar_t* bs = bright_stars_get(i); // skip unnamed if (!strlen(bs->name) && !strlen(bs->common_name)) continue; // skip stars too far away if (deg_between_radecdeg(rc, dc, bs->ra, bs->dec) > radius * 1.2) continue; if (!plotstuff_radec2xy(pargs, bs->ra, bs->dec, &px, &py)) continue; logverb("Bright star %s/%s at RA,Dec (%g,%g) -> xy (%g, %g)\n", bs->name, bs->common_name, bs->ra, bs->dec, px, py); if (px < 1 || py < 1 || px > pargs->W || py > pargs->H) continue; px -= 1; py -= 1; if (ann->bright_pastel) { float r,g,b; color_for_radec(bs->ra, bs->dec, &r,&g,&b); plotstuff_set_rgba2(pargs, r,g,b, 0.8); plotstuff_builtin_apply(cairo, pargs); } plotstuff_stack_marker(pargs, px, py); if (ann->bright_labels) { label = (strlen(bs->common_name) ? bs->common_name : bs->name); plotstuff_stack_text(pargs, cairo, label, px, py); } } }
int plot_index_plot(const char* command, cairo_t* cairo, plot_args_t* pargs, void* baton) { plotindex_t* args = (plotindex_t*)baton; int i; double ra, dec, radius; double xyz[3]; double r2; pad_qidxes(args); plotstuff_builtin_apply(cairo, pargs); if (plotstuff_get_radec_center_and_radius(pargs, &ra, &dec, &radius)) { ERROR("Failed to get RA,Dec center and radius"); return -1; } radecdeg2xyzarr(ra, dec, xyz); r2 = deg2distsq(radius); logmsg("Field RA,Dec,radius = (%g,%g), %g deg\n", ra, dec, radius); logmsg("distsq: %g\n", r2); for (i=0; i<pl_size(args->indexes); i++) { index_t* index = pl_get(args->indexes, i); int j, N; int DQ; double px,py; if (args->stars) { // plot stars double* radecs = NULL; startree_search_for(index->starkd, xyz, r2, NULL, &radecs, NULL, &N); if (N) { assert(radecs); } logmsg("Found %i stars in range in index %s\n", N, index->indexname); for (j=0; j<N; j++) { logverb(" RA,Dec (%g,%g) -> x,y (%g,%g)\n", radecs[2*j], radecs[2*j+1], px, py); if (!plotstuff_radec2xy(pargs, radecs[j*2], radecs[j*2+1], &px, &py)) { ERROR("Failed to convert RA,Dec %g,%g to pixels\n", radecs[j*2], radecs[j*2+1]); continue; } cairoutils_draw_marker(cairo, pargs->marker, px, py, pargs->markersize); cairo_stroke(cairo); } free(radecs); } if (args->quads) { DQ = index_get_quad_dim(index); qidxfile* qidx = pl_get(args->qidxes, i); if (qidx) { int* stars; int Nstars; il* quadlist = il_new(256); // find stars in range. startree_search_for(index->starkd, xyz, r2, NULL, NULL, &stars, &Nstars); logmsg("Found %i stars in range of index %s\n", N, index->indexname); logmsg("Using qidx file.\n"); // find quads that each star is a member of. for (j=0; j<Nstars; j++) { uint32_t* quads; int Nquads; int k; if (qidxfile_get_quads(qidx, stars[j], &quads, &Nquads)) { ERROR("Failed to get quads for star %i\n", stars[j]); return -1; } for (k=0; k<Nquads; k++) il_insert_unique_ascending(quadlist, quads[k]); } for (j=0; j<il_size(quadlist); j++) { plotquad(cairo, pargs, args, index, il_get(quadlist, j), DQ); } } else { // plot quads N = index_nquads(index); for (j=0; j<N; j++) { plotquad(cairo, pargs, args, index, j, DQ); } } } } return 0; }
int plot_healpix_plot(const char* command, cairo_t* cairo, plot_args_t* pargs, void* baton) { plothealpix_t* args = (plothealpix_t*)baton; double ra,dec,rad; il* hps; int i; double hpstep; int minx[12], maxx[12], miny[12], maxy[12]; plotstuff_builtin_apply(cairo, pargs); if (plotstuff_get_radec_center_and_radius(pargs, &ra, &dec, &rad)) { ERROR("Failed to get RA,Dec center and radius"); return -1; } hps = healpix_rangesearch_radec(ra, dec, rad, args->nside, NULL); logmsg("Found %zu healpixes in range.\n", il_size(hps)); hpstep = args->nside * args->stepsize * plotstuff_pixel_scale(pargs) / 60.0 / healpix_side_length_arcmin(args->nside); hpstep = MIN(1, hpstep); logmsg("Taking steps of %g in healpix space\n", hpstep); // For each of the 12 top-level healpixes, find the range of healpixes covered by this image. for (i=0; i<12; i++) { maxx[i] = maxy[i] = -1; minx[i] = miny[i] = args->nside+1; } for (i=0; i<il_size(hps); i++) { int hp = il_get(hps, i); int hpx, hpy; int bighp; healpix_decompose_xy(hp, &bighp, &hpx, &hpy, args->nside); logverb(" hp %i: bighp %i, x,y (%i,%i)\n", i, bighp, hpx, hpy); minx[bighp] = MIN(minx[bighp], hpx); maxx[bighp] = MAX(maxx[bighp], hpx); miny[bighp] = MIN(miny[bighp], hpy); maxy[bighp] = MAX(maxy[bighp], hpy); } il_free(hps); for (i=0; i<12; i++) { int hx,hy; int hp; double d, frac; double x,y; if (maxx[i] == -1) continue; logverb("Big healpix %i: x range [%i, %i], y range [%i, %i]\n", i, minx[i], maxx[i], miny[i], maxy[i]); for (hy = miny[i]; hy <= maxy[i]; hy++) { logverb(" y=%i\n", hy); for (d=minx[i]; d<=maxx[i]; d+=hpstep) { hx = floor(d); frac = d - hx; hp = healpix_compose_xy(i, hx, hy, args->nside); healpix_to_radecdeg(hp, args->nside, frac, 0.0, &ra, &dec); if (!plotstuff_radec2xy(pargs, ra, dec, &x, &y)) continue; if (d == minx[i]) cairo_move_to(pargs->cairo, x, y); else cairo_line_to(pargs->cairo, x, y); } cairo_stroke(pargs->cairo); } for (hx = minx[i]; hx <= maxx[i]; hx++) { for (d=miny[i]; d<=maxy[i]; d+=hpstep) { hy = floor(d); frac = d - hy; hp = healpix_compose_xy(i, hx, hy, args->nside); healpix_to_radecdeg(hp, args->nside, 0.0, frac, &ra, &dec); if (!plotstuff_radec2xy(pargs, ra, dec, &x, &y)) continue; if (d == miny[i]) cairo_move_to(pargs->cairo, x, y); else cairo_line_to(pargs->cairo, x, y); } cairo_stroke(pargs->cairo); } } return 0; }
static void plot_targets(cairo_t* cairo, plot_args_t* pargs, plotann_t* ann) { int i; double cra, cdec; plotstuff_get_radec_center_and_radius(pargs, &cra, &cdec, NULL); for (i=0; i<bl_size(ann->targets); i++) { target_t* tar = bl_access(ann->targets, i); double px,py; double cx,cy; double dx,dy, r; double ex,ey; double ly, ry, tx, bx; double distdeg; anbool okquadrant; char* txt; logverb("Target: \"%s\" at (%g,%g)\n", tar->name, tar->ra, tar->dec); okquadrant = plotstuff_radec2xy(pargs, tar->ra, tar->dec, &px, &py); px -= 1; py -= 1; if (okquadrant && px >= 0 && px < pargs->W && py >= 0 && py < pargs->H) { // inside the image! logverb("Target \"%s\" is inside the image, at pixel (%g,%g)\n", tar->name, px, py); plotstuff_stack_marker(pargs, px, py); plotstuff_stack_text(pargs, cairo, tar->name, px, py); continue; } // outside the image: find intersection point. cx = pargs->W / 2.0; cy = pargs->H / 2.0; if (okquadrant) { logverb("Target \"%s\" is outside the image, at pixel (%g,%g)\n", tar->name, px, py); dx = px - cx; dy = py - cy; } else { double cxyz[3]; double txyz[3]; double vec[3]; int j; double ra,dec; logverb("Target \"%s\" is way outside the image.\n", tar->name); // fallback. radecdeg2xyzarr(cra, cdec, cxyz); radecdeg2xyzarr(tar->ra, tar->dec, txyz); for (j=0; j<3; j++) vec[j] = cxyz[j] + 0.1 * txyz[j]; normalize_3(vec); xyzarr2radecdeg(vec, &ra, &dec); okquadrant = plotstuff_radec2xy(pargs, ra, dec, &px, &py); assert(okquadrant); dx = px - cx; dy = py - cy; if ((dx*dx + dy*dy) < (cx*cx + cy*cy)) { double scale = 3.0 * sqrt(cx*cx + cy*cy) / sqrt(dx*dx + dy*dy); dx *= scale; dy *= scale; } } ly = (-(pargs->W/2.0) / dx) * dy + cy; ry = ( (pargs->W/2.0) / dx) * dy + cy; bx = (-(pargs->H/2.0) / dy) * dx + cx; tx = ( (pargs->H/2.0) / dy) * dx + cx; logverb("ly %g, ry %g, bx %g, tx %g\n", ly, ry, bx, tx); if (px < cx && ly >= 0 && ly < pargs->H) { ex = 0.0; ey = ly; } else if (px >= cx && ry >= 0 && ry < pargs->H) { ex = pargs->W - 1; ey = ry; } else if (py < cy && bx >= 0 && bx < pargs->W) { ex = bx; ey = 0; } else if (py >= cy && tx >= 0 && tx < pargs->W) { ex = tx; ey = pargs->H - 1; } else { logverb("None of the edges are in bounds: px,py=(%g,%g); ly=%g, ry=%g, bx=%g, tx=%g\n", px,py,ly,ry,bx,tx); continue; } dx = ex - cx; dy = ey - cy; r = sqrt(dx*dx + dy*dy); px = (r-100.0) / r * dx + cx; py = (r-100.0) / r * dy + cy; plotstuff_stack_arrow(pargs, px, py, ex, ey); logverb("Arrow from (%g,%g) to (%g,%g)\n", px, py, ex, ey); distdeg = deg_between_radecdeg(cra, cdec, tar->ra, tar->dec); asprintf_safe(&txt, "%s: %.1f deg", tar->name, distdeg); plotstuff_stack_text(pargs, cairo, txt, px, py); } }