static fitstable_t* get_tagalong(startree_t* s, anbool report_errs) { char* fn; int next; int i; int ext = -1; fitstable_t* tag; if (!s->tree->io) return NULL; fn = fitsbin_get_filename(s->tree->io); if (!fn) { if (report_errs) ERROR("No filename"); return NULL; } tag = fitstable_open(fn); if (!tag) { if (report_errs) ERROR("Failed to open FITS table from %s", fn); return NULL; } next = fitstable_n_extensions(tag); for (i=1; i<next; i++) { char* type; anbool eq; const qfits_header* hdr; hdr = anqfits_get_header_const(tag->anq, i); if (!hdr) { if (report_errs) ERROR("Failed to read FITS header for ext %i in %s", i, fn); return NULL; } type = fits_get_dupstring(hdr, "AN_FILE"); eq = streq(type, AN_FILETYPE_TAGALONG); free(type); if (!eq) continue; ext = i; break; } if (ext == -1) { if (report_errs) ERROR("Failed to find a FITS header with the card AN_FILE = TAGALONG"); return NULL; } fitstable_open_extension(tag, ext); return tag; }
int anqfits_is_table(const anqfits_t* qf, int ext) { const qfits_header* hdr; int ttype; hdr = anqfits_get_header_const(qf, ext); if (!hdr) { printf("Failed to read header of ext %i", ext); return -1; } ttype = qfits_is_table_header(hdr); if (ttype == QFITS_ASCIITABLE) { return 1; } if (ttype == QFITS_BINTABLE) { return 1; } return 0; }
const qfits_table* anqfits_get_table_const(const anqfits_t* qf, int ext) { assert(ext >= 0 && ext < qf->Nexts); if (!qf->exts[ext].table) { const qfits_header* hdr = anqfits_get_header_const(qf, ext); off_t begin, size; if (!hdr) { qfits_error("Failed to get header for ext %i\n", ext); return NULL; } if (anqfits_get_data_start_and_size(qf, ext, &begin, &size)) { ERROR("failed to get data start and size"); return NULL; } qf->exts[ext].table = qfits_table_open2(hdr, begin, size, qf->filename, ext); } return qf->exts[ext].table; }
const anqfits_image_t* anqfits_get_image_const(const anqfits_t* qf, int ext) { assert(ext >= 0 && ext < qf->Nexts); if (!qf->exts[ext].image) { anqfits_image_t* img; const qfits_header* hdr = anqfits_get_header_const(qf, ext); int naxis1, naxis2, naxis3; if (!hdr) { qfits_error("Failed to get header for ext %i\n", ext); return NULL; } img = anqfits_image_new(); // from qfits_image.c : qfitsloader_init() img->bitpix = qfits_header_getint(hdr, "BITPIX", -1); img->naxis = qfits_header_getint(hdr, "NAXIS", -1); naxis1 = qfits_header_getint(hdr, "NAXIS1", -1); naxis2 = qfits_header_getint(hdr, "NAXIS2", -1); naxis3 = qfits_header_getint(hdr, "NAXIS3", -1); img->bzero = qfits_header_getdouble(hdr, "BZERO", 0.0); img->bscale = qfits_header_getdouble(hdr, "BSCALE", 1.0); if (img->bitpix == -1) { qfits_error("Missing BITPIX in file %s ext %i", qf->filename, ext); goto bailout; } if (!((img->bitpix == 8) || (img->bitpix == 16) || (img->bitpix == 32) || (img->bitpix == -32) || (img->bitpix == -64))) { qfits_error("Invalid BITPIX %i in file %s ext %i", img->bitpix, qf->filename, ext); goto bailout; } img->bpp = BYTESPERPIXEL(img->bitpix); if (img->naxis < 0) { qfits_error("No NAXIS in file %s ext %i", qf->filename, ext); goto bailout; } if (img->naxis==0) { qfits_error("NAXIS = 0 in file %s ext %i", qf->filename, ext); goto bailout; } if (img->naxis > 3) { qfits_error("NAXIS = %i > 3 unsupported in file %s ext %i", img->naxis, qf->filename, ext); goto bailout; } /* NAXIS1 must always be present */ if (naxis1 < 0) { qfits_error("No NAXIS1 in file %s ext %i", qf->filename, ext); goto bailout; } img->width = 1; img->height = 1; img->planes = 1; switch (img->naxis) { case 1: img->width = naxis1; break; case 3: if (naxis3 < 0) { qfits_error("No NAXIS3 in file %s ext %i", qf->filename, ext); goto bailout; } img->planes = naxis3; // no break: fall through to... case 2: if (naxis2 < 0) { qfits_error("No NAXIS2 in file %s ext %i", qf->filename, ext); goto bailout; } img->height = naxis2; img->width = naxis1; break; } qf->exts[ext].image = img; return img; bailout: anqfits_image_free(img); return NULL; } return qf->exts[ext].image; }
qfits_header* anqfits_get_header(const anqfits_t* qf, int ext) { const qfits_header* hdr = anqfits_get_header_const(qf, ext); if (!hdr) return NULL; return qfits_header_copy(hdr); }