void wcsmap_param_dump(struct wcsmap_param_t* m) { assert(m); printf("WCS MAPPING PARAMETERS:\n" "input WCS: \n"); wcsprt(m->input_wcs->wcs); printf("output WCS: \n"); wcsprt(m->input_wcs->wcs); }
int main() { char ctypeS[9]; int i, stat[NWCSFIX], status; struct wcsprm wcs; printf("Testing WCSLIB translator for non-standard usage (twcsfix.c)\n" "------------------------------------------------------------\n\n"); wcs.flag = -1; parser(&wcs); /* Print the unmodified struct. */ wcsprt(&wcs); printf("\n------------------------------------" "------------------------------------\n"); /* Fix non-standard WCS keyvalues. */ if ((status = wcsfix(7, 0, &wcs, stat))) { printf("wcsfix error, status returns: ("); for (i = 0; i < NWCSFIX; i++) { printf(i ? ", %d" : "%d", stat[i]); } printf(")\n"); return 1; } wcsprt(&wcs); printf("\n------------------------------------" "------------------------------------\n"); /* Should now have a 'VOPT-F2W' axis, translate it to frequency. */ strcpy(ctypeS, "FREQ-???"); i = -1; if ((status = wcssptr(&wcs, &i, ctypeS))) { printf("wcssptr ERROR %d: %s.n", status, wcs_errmsg[status]); return 1; } if ((status = wcsset(&wcs))) { printf("wcsset ERROR %d: %s.\n", status, wcs_errmsg[status]); return 1; } wcsprt(&wcs); wcsfree(&wcs); return 0; }
int wcsprt_(int *wcs) { /* This may or may not force the Fortran I/O buffers to be flushed. If * not, try CALL FLUSH(6) before calling WCSPRT in the Fortran code. */ fflush(NULL); return wcsprt((struct wcsprm *)wcs); }
int main(int argc, char **argv) { char alt = ' ', *header, idents[3][80], *infile; int alts[27], c, dofix = 0, doprt = 0, dopix = 0, doworld = 0, hdunum = 1, hdutype, i, j, nelem, nkeyrec, nreject, nwcs, *stat = 0x0, status; double *imgcrd = 0x0, phi, *pixcrd = 0x0, theta, *world = 0x0; struct wcsprm *wcs; fitsfile *fptr; /* Parse options. */ for (i = 1; i < argc && argv[i][0] == '-'; i++) { if (!argv[i][1]) break; switch (argv[i][1]) { case 'a': alt = toupper(argv[i][2]); break; case 'f': dofix = 1; break; case 'h': hdunum = atoi(argv[i]+2); break; case 'p': doprt = 1; break; case 'x': dopix = 1; break; case 'w': doworld = 1; break; default: fprintf(stderr, "%s", usage); return 1; } } if (i < argc) { infile = argv[i++]; if (i < argc) { fprintf(stderr, "%s", usage); return 1; } } else { infile = "-"; } /* Check accessibility of the input file. */ if (strcmp(infile, "-") && access(infile, R_OK) == -1) { printf("wcsware: Cannot access %s.\n", infile); return 1; } if (!dopix && !doworld) doprt = 1; /* Open the FITS file and move to the required HDU. */ status = 0; if (fits_open_file(&fptr, infile, READONLY, &status)) goto fitserr; if (fits_movabs_hdu(fptr, hdunum, &hdutype, &status)) goto fitserr; if (hdutype != IMAGE_HDU) { fprintf(stderr, "ERROR, HDU number %d does not contain an image array.\n", hdunum); return 1; } /* Read in the FITS header, excluding COMMENT and HISTORY keyrecords. */ if (fits_hdr2str(fptr, 1, NULL, 0, &header, &nkeyrec, &status)) { goto fitserr; } /* Interpret the WCS keywords. */ if ((status = wcspih(header, nkeyrec, WCSHDR_all, -3, &nreject, &nwcs, &wcs))) { fprintf(stderr, "wcspih ERROR %d: %s.\n", status, wcshdr_errmsg[status]); return 1; } free(header); if (wcs == 0x0) { fprintf(stderr, "No world coordinate systems found.\n"); return 1; } /* Read -TAB arrays from the binary table extension (if necessary). */ if (fits_read_wcstab(fptr, wcs->nwtb, (wtbarr *)wcs->wtb, &status)) { goto fitserr; } fits_close_file(fptr, &status); /* Translate non-standard WCS keyvalues? */ if (dofix) { stat = malloc(NWCSFIX * sizeof(int)); if ((status = wcsfix(7, 0, wcs, stat))) { for (i = 0; i < NWCSFIX; i++) { if (stat[i] > 0) { fprintf(stderr, "wcsfix ERROR %d: %s.\n", status, wcsfix_errmsg[stat[i]]); } } return 1; } } /* Sort out alternates. */ if (alt) { wcsidx(nwcs, &wcs, alts); if (alt == ' ') { if (alts[0] == -1) { fprintf(stderr, "WARNING, no primary coordinate representation.\n"); alt = '\0'; } } else if (alt < 'A' || alt > 'Z') { fprintf(stderr, "WARNING, alternate specifier \"%c\" is invalid.\n", alt); alt = '\0'; } else { if (alts[alt - 'A' + 1] == -1) { fprintf(stderr, "WARNING, no alternate coordinate representation " "\"%c\".\n", alt); alt = '\0'; } } } /* Initialize and possibly print the structs. */ for (i = 0; i < nwcs; i++) { if (alt && (wcs+i)->alt[0] != alt) { continue; } else if (i) { printf("\nType <CR> for next: "); fgetc(stdin); } if ((status = wcsset(wcs+i))) { fprintf(stderr, "wcsset ERROR %d: %s.\n", status, wcs_errmsg[status]); continue; } /* Get WCSNAME out of the wcsprm struct. */ strcpy(idents[2], (wcs+i)->wcsname); if (strlen(idents[2])) { printf("\n%s\n", idents[2]); } /* Print the struct. */ if (doprt) { wcsprt(wcs+i); } /* Transform coordinates? */ if (dopix || doworld) { nelem = (wcs+i)->naxis; world = realloc(world, nelem * sizeof(double)); imgcrd = realloc(imgcrd, nelem * sizeof(double)); pixcrd = realloc(pixcrd, nelem * sizeof(double)); stat = realloc(stat, nelem * sizeof(int)); if (dopix) { /* Transform pixel coordinates. */ while (1) { printf("\nEnter %d pixel coordinate element%s: ", nelem, (nelem==1)?"":"s"); c = fgetc(stdin); if (c == EOF || c == '\n') { if (c == EOF) printf("\n"); break; } ungetc(c, stdin); scanf("%lf", pixcrd); for (j = 1; j < nelem; j++) { scanf("%*[ ,]%lf", pixcrd+j); } while (fgetc(stdin) != '\n'); printf("Pixel: "); for (j = 0; j < nelem; j++) { printf("%s%14.9g", j?", ":"", pixcrd[j]); } if ((status = wcsp2s(wcs+i, 1, nelem, pixcrd, imgcrd, &phi, &theta, world, stat))) { fprintf(stderr, "wcsp2s ERROR %d: %s.\n", status, wcs_errmsg[status]); } else { printf("\nImage: "); for (j = 0; j < nelem; j++) { if (j == (wcs+i)->lng || j == (wcs+i)->lat) { /* Print angles in fixed format. */ printf("%s%14.6f", j?", ":"", imgcrd[j]); } else { printf("%s%14.9g", j?", ":"", imgcrd[j]); } } printf("\nWorld: "); for (j = 0; j < nelem; j++) { if (j == (wcs+i)->lng || j == (wcs+i)->lat) { /* Print angles in fixed format. */ printf("%s%14.6f", j?", ":"", world[j]); } else { printf("%s%14.9g", j?", ":"", world[j]); } } printf("\n"); } } } if (doworld) { /* Transform world coordinates. */ while (1) { printf("\nEnter %d world coordinate element%s: ", nelem, (nelem==1)?"":"s"); c = fgetc(stdin); if (c == EOF || c == '\n') { if (c == EOF) printf("\n"); break; } ungetc(c, stdin); scanf("%lf", world); for (j = 1; j < nelem; j++) { scanf("%*[ ,]%lf", world+j); } while (fgetc(stdin) != '\n'); printf("World: "); for (j = 0; j < nelem; j++) { if (j == (wcs+i)->lng || j == (wcs+i)->lat) { /* Print angles in fixed format. */ printf("%s%14.6f", j?", ":"", world[j]); } else { printf("%s%14.9g", j?", ":"", world[j]); } } if ((status = wcss2p(wcs+i, 1, nelem, world, &phi, &theta, imgcrd, pixcrd, stat))) { fprintf(stderr, "wcss2p ERROR %d: %s.\n", status, wcs_errmsg[status]); } else { printf("\nImage: "); for (j = 0; j < nelem; j++) { if (j == (wcs+i)->lng || j == (wcs+i)->lat) { /* Print angles in fixed format. */ printf("%s%14.6f", j?", ":"", imgcrd[j]); } else { printf("%s%14.9g", j?", ":"", imgcrd[j]); } } printf("\nPixel: "); for (j = 0; j < nelem; j++) { printf("%s%14.9g", j?", ":"", pixcrd[j]); } printf("\n"); } } } } } status = wcsvfree(&nwcs, &wcs); return 0; fitserr: fits_report_error(stderr, status); fits_close_file(fptr, &status); return 1; }
static void wcslib_print(const anwcslib_t* anwcslib, FILE* fid) { fprintf(fid, "AN WCS type: wcslib\n"); wcsprt(anwcslib->wcs); fprintf(fid, "Image size: %i x %i\n", anwcslib->imagew, anwcslib->imageh); }
int do_wcs_stuff(fitsfile *fptr, struct wcsprm *wcs) { int i1, i2, i3, k, naxis1, naxis2, naxis3, stat[8], status; double phi[8], pixcrd[8][4], imgcrd[8][4], theta[8], world[8][4], x1, x2, x3; /* Initialize the wcsprm struct, also taking control of memory allocated by * fits_read_wcstab(). */ if ((status = wcsset(wcs))) { fprintf(stderr, "wcsset ERROR %d: %s.\n", status, wcs_errmsg[status]); return 1; } /* Print the struct. */ if ((status = wcsprt(wcs))) return status; /* Compute coordinates in the corners. */ fits_read_key(fptr, TINT, "NAXIS1", &naxis1, NULL, &status); fits_read_key(fptr, TINT, "NAXIS2", &naxis2, NULL, &status); fits_read_key(fptr, TINT, "NAXIS3", &naxis3, NULL, &status); k = 0; x3 = 1.0f; for (i3 = 0; i3 < 2; i3++) { x2 = 0.5f; for (i2 = 0; i2 < 2; i2++) { x1 = 0.5f; for (i1 = 0; i1 < 2; i1++) { pixcrd[k][0] = x1; pixcrd[k][1] = x2; pixcrd[k][2] = x3; pixcrd[k][3] = 1.0f; k++; x1 = naxis1 + 0.5f; } x2 = naxis2 + 0.5f; } x3 = naxis3; } if ((status = wcsp2s(wcs, 8, 4, pixcrd[0], imgcrd[0], phi, theta, world[0], stat))) { fprintf(stderr, "\n\nwcsp2s ERROR %d: %s.\n", status, wcs_errmsg[status]); /* Invalid pixel coordinates. */ if (status == 8) status = 0; } if (status == 0) { printf("\n\nCorner world coordinates:\n" " Pixel World\n"); for (k = 0; k < 8; k++) { printf(" (%5.1f,%6.1f,%4.1f,%4.1f) -> (%7.3f,%8.3f,%9g,%11.5f)", pixcrd[k][0], pixcrd[k][1], pixcrd[k][2], pixcrd[k][3], world[k][0], world[k][1], world[k][2], world[k][3]); if (stat[k]) printf(" (BAD)"); printf("\n"); } } return 0; }
int main() { char ctypeS[9]; int i, stat[NWCSFIX], status; struct wcsprm wcs; struct wcserr info[NWCSFIX]; wcsprintf("Testing WCSLIB translator for non-standard usage (twcsfix.c)\n" "------------------------------------------------------------\n\n"); wcs.flag = -1; parser(&wcs); /* Note: to print the unfixed wcsprm struct using wcsprt() the struct would first have to be initialized by wcsset(). However, if the struct contains non-standard keyvalues then wcsset() will either fix them itself or else fail (e.g. for non-standard units). Thus, in general, wcsprt() cannot be used to print the unmodified struct. */ /* Fix non-standard WCS keyvalues. */ wcserr_enable(1); status = wcsfixi(7, 0, &wcs, stat, info); wcsprintf("wcsfix status returns: ("); for (i = 0; i < NWCSFIX; i++) { wcsprintf(i ? ", %d" : "%d", stat[i]); } wcsprintf(")\n"); for (i = 0; i < NWCSFIX; i++) { if (info[i].status < -1 || 0 < info[i].status) { wcsprintf("\n"); wcserr_prt(info+i, 0x0); } } if (status) { wcsprintf("\nwcsfix error %d", status); return 1; } /* Extract information from the FITS header. */ if (wcsset(&wcs)) { wcsprintf("\n"); wcserr_prt(wcs.err, 0x0); } wcsprintf("\n"); wcsprt(&wcs); wcsprintf("\n------------------------------------" "------------------------------------\n"); /* Should now have a 'VOPT-F2W' axis, translate it to frequency. */ strcpy(ctypeS, "FREQ-???"); i = -1; if (wcssptr(&wcs, &i, ctypeS)) { wcserr_prt(wcs.err, 0x0); return 1; } if (wcsset(&wcs)) { wcserr_prt(wcs.err, 0x0); return 1; } wcsprt(&wcs); wcsfree(&wcs); return 0; }
int main(int argc, char *argv[]) { char *infile = "SIP.fits"; char keyrec[81], header[288001]; int axes[4], gotend, iblock, ikeyrec, j, k, n, naxis[4], nkeyrec, nreject, nsamp, nsub, nwcs, status; double pixblc[4], pixsamp[4], pixtrc[4]; double *avgdis, *avgtot, *maxdis, *maxtot, *rmsdis, *rmstot, stats[15]; FILE *fptr; struct linprm *lin; struct wcsprm *wcs, wcsext; wcserr_enable(1); wcsprintf_set(stdout); /* Set line buffering in case stdout is redirected to a file, otherwise * stdout and stderr messages will be jumbled (stderr is unbuffered). */ setvbuf(stdout, NULL, _IOLBF, 0); wcsprintf("Testing wcssub() with distortions (tdis2.c)\n" "-------------------------------------------\n"); /* Optional file name specified? */ if (1 < argc) { infile = argv[1]; } /* Read in the FITS header, excluding COMMENT and HISTORY keyrecords. */ if ((fptr = fopen(infile, "r")) == 0) { wcsprintf("ERROR opening %s\n", infile); return 1; } memset(naxis, 0, 2*sizeof(int)); k = 0; nkeyrec = 0; gotend = 0; for (iblock = 0; iblock < 100; iblock++) { for (ikeyrec = 0; ikeyrec < 36; ikeyrec++) { if (fgets(keyrec, 81, fptr) == 0) { break; } if (strncmp(keyrec, " ", 8) == 0) continue; if (strncmp(keyrec, "COMMENT ", 8) == 0) continue; if (strncmp(keyrec, "HISTORY ", 8) == 0) continue; if (strncmp(keyrec, "NAXIS", 5) == 0) { if (keyrec[5] == ' ') { sscanf(keyrec+10, "%d", &n); if (4 < n) { wcsprintf("ERROR, can't handle more than 4 axes.\n"); return 1; } continue; } sscanf(keyrec+5, "%d = %d", &j, &n); naxis[j-1] = n; continue; } strncpy(header+k, keyrec, 80); k += 80; nkeyrec++; if (strncmp(keyrec, "END ", 10) == 0) { /* An END keyrecord was read, but read the rest of the block. */ gotend = 1; } } if (gotend) break; } fclose(fptr); /* Parse the header. */ if ((wcspih(header, nkeyrec, WCSHDR_none, 2, &nreject, &nwcs, &wcs))) { wcsperr(wcs, 0x0); return 1; } /* Extract the coordinate description for a transposed subimage and prepend a new axis. Also tests wcssub() on a struct that hasn't been set up. */ nsub = 3; axes[0] = 0; axes[1] = WCSSUB_LATITUDE; axes[2] = WCSSUB_LONGITUDE; wcsext.flag = -1; if ((status = wcssub(1, wcs, &nsub, axes, &wcsext))) { wcsperr(&wcsext, ""); goto cleanup; } else if (nsub == 0) { printf("None of the requested subimage axes were found.\n"); goto cleanup; } /* Print the original and extracted structs. */ printf("\nInitial contents of wcsprm struct:\n"); if ((status = wcsset(wcs))) { wcsperr(wcs, ""); goto cleanup; }; wcsprt(wcs); printf("\n\nExtracted contents of wcsprm struct:\n"); if ((status = wcsset(&wcsext))) { wcsperr(&wcsext, ""); goto cleanup; } wcsprt(&wcsext); /* Compute distortion statistics in the initial struct. */ maxdis = stats; maxtot = maxdis + 4; avgdis = maxtot + 1; avgtot = avgdis + 4; rmsdis = avgtot + 1; rmstot = rmsdis + 4; pixblc[0] = 1.0; pixblc[1] = 1.0; pixblc[2] = 1.0; pixblc[3] = 1.0; pixtrc[0] = 256.0; pixtrc[1] = 256.0; pixtrc[2] = 1.0; pixtrc[3] = 1.0; pixsamp[0] = 1.0; pixsamp[1] = 1.0; pixsamp[2] = 1.0; pixsamp[3] = 1.0; lin = &(wcs->lin); if (linwarp(lin, pixblc, pixtrc, pixsamp, &nsamp, maxdis, maxtot, avgdis, avgtot, rmsdis, rmstot)) { linperr(lin, 0x0); return 1; } for (k = 0; k < 12; k++) { if (fabs(stats[k]) < 0.0005) stats[k] = 0.0; } wcsprintf("\n\n" "Initial linwarp() statistics computed over %d sample points:\n" " Max distortion, axis 1: %10.5f pixels\n" " axis 2: %10.5f pixels\n" " axis 3: %10.5f pixels\n" " axis 4: %10.5f pixels\n" " total: %10.5f pixels\n" " Mean distortion, axis 1: %10.5f pixels\n" " axis 2: %10.5f pixels\n" " axis 3: %10.5f pixels\n" " axis 4: %10.5f pixels\n" " total: %10.5f pixels\n" " RMS distortion, axis 1: %10.5f pixels\n" " axis 2: %10.5f pixels\n" " axis 3: %10.5f pixels\n" " axis 4: %10.5f pixels\n" " total: %10.5f pixels\n", nsamp, maxdis[0], maxdis[1], maxdis[2], maxdis[3], *maxtot, avgdis[0], avgdis[1], avgdis[2], avgdis[3], *avgtot, rmsdis[0], rmsdis[1], rmsdis[2], rmsdis[3], *rmstot); /* Compute distortion statistics in the extracted struct. */ pixtrc[0] = 1.0; pixtrc[1] = 256.0; pixtrc[2] = 256.0; lin = &(wcsext.lin); if (linwarp(lin, pixblc, pixtrc, pixsamp, &nsamp, maxdis, maxtot, avgdis, avgtot, rmsdis, rmstot)) { linperr(lin, 0x0); return 1; } for (k = 0; k < 12; k++) { if (fabs(stats[k]) < 0.0005) stats[k] = 0.0; } wcsprintf("\n" "linwarp() statistics for extract computed over the same %d points:\n" " Max distortion, axis 1: %10.5f pixels\n" " axis 2: %10.5f pixels\n" " axis 3: %10.5f pixels\n" " total: %10.5f pixels\n" " Mean distortion, axis 1: %10.5f pixels\n" " axis 2: %10.5f pixels\n" " axis 3: %10.5f pixels\n" " total: %10.5f pixels\n" " RMS distortion, axis 1: %10.5f pixels\n" " axis 2: %10.5f pixels\n" " axis 3: %10.5f pixels\n" " total: %10.5f pixels\n", nsamp, maxdis[0], maxdis[1], maxdis[2], *maxtot, avgdis[0], avgdis[1], avgdis[2], *avgtot, rmsdis[0], rmsdis[1], rmsdis[2], *rmstot); cleanup: wcsvfree(&nwcs, &wcs); wcsfree(&wcsext); return status; }
int main() { char infile[] = "bth.fits"; char a, *hptr; short alts[1000][28]; int colsel[8], ctrl, ialt, iblock, icol, ifix, ikeyrec, iwcs, keysel, nkeyrec, nreject, nwcs, relax, stat[NWCSFIX], status; struct wcsprm *wcs; #if defined HAVE_CFITSIO && defined DO_CFITSIO char *header; fitsfile *fptr; #else char keyrec[81], header[288001]; int gotend, k; FILE *fptr; #endif /* Set line buffering in case stdout is redirected to a file, otherwise * stdout and stderr messages will be jumbled (stderr is unbuffered). */ setvbuf(stdout, NULL, _IOLBF, 0); printf("Testing WCSLIB parser for FITS binary table headers (tbth1.c)\n" "-------------------------------------------------------------\n\n"); /* Read in the FITS header, excluding COMMENT and HISTORY keyrecords. */ #if defined HAVE_CFITSIO && defined DO_CFITSIO status = 0; if (fits_open_file(&fptr, infile, READONLY, &status)) { fits_report_error(stderr, status); return 1; } if (fits_hdr2str(fptr, 1, NULL, 0, &header, &nkeyrec, &status)) { fits_report_error(stderr, status); return 1; } fits_close_file(fptr, &status); #else if ((fptr = fopen(infile, "r")) == 0) { fprintf(stderr, "ERROR opening %s\n", infile); return 1; } k = 0; nkeyrec = 0; gotend = 0; for (iblock = 0; iblock < 100; iblock++) { for (ikeyrec = 0; ikeyrec < 36; ikeyrec++) { if (fgets(keyrec, 81, fptr) == 0) { break; } if (strncmp(keyrec, " ", 8) == 0) continue; if (strncmp(keyrec, "COMMENT ", 8) == 0) continue; if (strncmp(keyrec, "HISTORY ", 8) == 0) continue; strncpy(header+k, keyrec, 80); k += 80; nkeyrec++; if (strncmp(keyrec, "END ", 8) == 0) { /* An END keyrecord was read, but read the rest of the block. */ gotend = 1; } } if (gotend) break; } fclose(fptr); #endif fprintf(stderr, "Found %d non-comment header keyrecords.\n\n", nkeyrec); /* Parse the header, allowing all recognized non-standard WCS keywords and * usage. WCS keyrecords that are used are culled from the header, illegal * ones are reported. */ relax = WCSHDR_all; ctrl = -2; keysel = 0; colsel[0] = 0; fprintf(stderr, "\nIllegal or extraneous WCS header keyrecords rejected " "by wcsbth():\n"); if ((status = wcsbth(header, nkeyrec, relax, ctrl, keysel, colsel, &nreject, &nwcs, &wcs))) { fprintf(stderr, "wcsbth ERROR %d: %s.\n", status, wcs_errmsg[status]); } if (!nreject) fprintf(stderr, "(none)\n"); /* List the remaining keyrecords. */ printf("\n\nNon-WCS header keyrecords ignored by wcsbth():\n"); hptr = header; while (*hptr) { printf("%.80s\n", hptr); hptr += 80; } #if defined HAVE_CFITSIO && defined DO_CFITSIO free(header); #endif /* Summarize what was found. */ printf("\n\nExtracted %d coordinate description%s:\n", nwcs, (nwcs == 1) ? "" : "s"); printf("\n Unattached image header(s)"); status = wcsbdx(nwcs, &wcs, 0, alts); if (alts[0][27]) { printf(" with indices:\n -"); for (a = 'A'; a <= 'Z'; a++) { printf("%2c", a); } printf("\n "); for (ialt = 0; ialt < 27; ialt++) { if (alts[0][ialt] < 0) { printf(" -"); } else { printf("%2d", alts[0][ialt]); } } printf("\n"); } else { printf(": (none)\n"); } printf("\n Binary table image array(s)"); for (icol = 1; icol <= 999; icol++) { if (alts[icol][27]) { printf(" with indices:\n Col. -"); for (a = 'A'; a <= 'Z'; a++) { printf("%2c", a); } printf("\n"); for (icol = 1; icol <= 999; icol++) { for (ialt = 0; ialt < 27; ialt++) { if (alts[icol][ialt] >= 0) { printf("%5d: ", icol); for (ialt = 0; ialt < 27; ialt++) { if (alts[icol][ialt] < 0) { printf(" -"); } else { printf("%2d", alts[icol][ialt]); } } printf("\n"); break; } } } icol = 9999; } } if (icol < 9999) { printf(": (none)\n"); } printf("\n Pixel list(s)"); status = wcsbdx(nwcs, &wcs, 1, alts); for (icol = 1; icol <= 999; icol++) { if (alts[icol][27]) { printf(" with indices:\n Col. -"); for (a = 'A'; a <= 'Z'; a++) { printf("%2c", a); } printf("\n"); for (icol = 1; icol <= 999; icol++) { for (ialt = 0; ialt < 27; ialt++) { if (alts[icol][ialt] >= 0) { printf("%5d: ", icol); for (ialt = 0; ialt < 27; ialt++) { if (alts[icol][ialt] < 0) { printf(" -"); } else { printf("%2d", alts[icol][ialt]); } } printf("\n"); break; } } } icol = 9999; } } if (icol < 9999) { printf(": (none)\n"); } /* Fix non-standard usage and print each of the wcsprm structs. */ for (iwcs = 0; iwcs < nwcs; iwcs++) { printf("\n------------------------------------" "------------------------------------\n"); /* Fix non-standard WCS keyvalues. */ if ((status = wcsfix(7, 0, wcs+iwcs, stat))) { printf("wcsfix ERROR, status returns: ("); for (ifix = 0; ifix < NWCSFIX; ifix++) { printf(ifix ? ", %d" : "%d", stat[ifix]); } printf(")\n\n"); } if ((status = wcsset(wcs+iwcs))) { fprintf(stderr, "wcsset ERROR %d: %s.\n", status, wcs_errmsg[status]); continue; } if ((status = wcsprt(wcs+iwcs))) { fprintf(stderr, "wcsprt ERROR %d: %s.\n", status, wcs_errmsg[status]); } } status = wcsvfree(&nwcs, &wcs); /* Do it again to check that wcsbth() can handle multiple invokations. */ printf("\nInvoking wcsbth() a second time on the same header...\n"); ctrl = 0; if ((status = wcsbth(header, nkeyrec, relax, 0, keysel, colsel, &nreject, &nwcs, &wcs))) { fprintf(stderr, "wcsbth ERROR %d: %s.\n", status, wcs_errmsg[status]); } else { printf("OK, extracted %d coordinate description%s.\n", nwcs, (nwcs == 1) ? "" : "s"); } return 0; }
int main() { char infile[] = "pih.fits"; char a, *hptr; int alts[27], ctrl, ialt, iblock, ifix, ikeyrec, iwcs, nkeyrec, nreject, nwcs, relax, stat[NWCSFIX], status; struct wcsprm *wcs; #if defined HAVE_CFITSIO && defined DO_CFITSIO char *header; fitsfile *fptr; #else char keyrec[81], header[288001]; int gotend, k; FILE *fptr; #endif /* Set line buffering in case stdout is redirected to a file, otherwise * stdout and stderr messages will be jumbled (stderr is unbuffered). */ setvbuf(stdout, NULL, _IOLBF, 0); printf("Testing WCSLIB parser for FITS image headers (tpih1.c)\n" "------------------------------------------------------\n\n"); /* Read in the FITS header, excluding COMMENT and HISTORY keyrecords. */ #if defined HAVE_CFITSIO && defined DO_CFITSIO status = 0; if (fits_open_file(&fptr, infile, READONLY, &status)) { fits_report_error(stderr, status); return 1; } if (fits_hdr2str(fptr, 1, NULL, 0, &header, &nkeyrec, &status)) { fits_report_error(stderr, status); return 1; } fits_close_file(fptr, &status); #else if ((fptr = fopen(infile, "r")) == 0) { fprintf(stderr, "ERROR opening %s\n", infile); return 1; } k = 0; nkeyrec = 0; gotend = 0; for (iblock = 0; iblock < 100; iblock++) { for (ikeyrec = 0; ikeyrec < 36; ikeyrec++) { if (fgets(keyrec, 81, fptr) == 0) { break; } if (strncmp(keyrec, " ", 8) == 0) continue; if (strncmp(keyrec, "COMMENT ", 8) == 0) continue; if (strncmp(keyrec, "HISTORY ", 8) == 0) continue; strncpy(header+k, keyrec, 80); k += 80; nkeyrec++; if (strncmp(keyrec, "END ", 8) == 0) { /* An END keyrecord was read, but read the rest of the block. */ gotend = 1; } } if (gotend) break; } fclose(fptr); #endif fprintf(stderr, "Found %d non-comment header keyrecords.\n\n", nkeyrec); /* Parse the header, allowing all recognized non-standard WCS keywords and * usage. All WCS keyrecords are culled from the header, illegal ones are * reported. */ relax = WCSHDR_all; ctrl = -2; fprintf(stderr, "\nIllegal or extraneous WCS header keyrecords rejected " "by wcspih():\n"); if ((status = wcspih(header, nkeyrec, relax, ctrl, &nreject, &nwcs, &wcs))) { fprintf(stderr, "wcspih ERROR %d: %s.\n", status, wcs_errmsg[status]); } if (!nreject) fprintf(stderr, "(none)\n"); /* List the remaining keyrecords. */ printf("\n\nNon-WCS header keyrecords ignored by wcspih():\n"); hptr = header; while (*hptr) { printf("%.80s\n", hptr); hptr += 80; } #if defined HAVE_CFITSIO && defined DO_CFITSIO free(header); #endif /* Summarize what was found. */ status = wcsidx(nwcs, &wcs, alts); printf("\n\nFound %d alternate coordinate descriptions with indices:\n ", nwcs); for (a = 'A'; a <= 'Z'; a++) { printf("%2c", a); } printf("\n"); for (ialt = 0; ialt < 27; ialt++) { if (alts[ialt] < 0) { printf(" -"); } else { printf("%2d", alts[ialt]); } } printf("\n"); /* Fix non-standard usage and print each of the wcsprm structs. The output * from wcsprt() will be written to an internal buffer and then printed just * to show that it can be done. */ wcsprintf_set(0x0); for (iwcs = 0; iwcs < nwcs; iwcs++) { wcsprintf("\n------------------------------------" "------------------------------------\n"); /* Fix non-standard WCS keyvalues. */ if ((status = wcsfix(7, 0, wcs+iwcs, stat))) { printf("wcsfix ERROR, status returns: ("); for (ifix = 0; ifix < NWCSFIX; ifix++) { printf(ifix ? ", %d" : "%d", stat[ifix]); } printf(")\n\n"); } if ((status = wcsset(wcs+iwcs))) { fprintf(stderr, "wcsset ERROR %d: %s.\n", status, wcs_errmsg[status]); continue; } if ((status = wcsprt(wcs+iwcs))) { fprintf(stderr, "wcsprt ERROR %d: %s.\n", status, wcs_errmsg[status]); } } printf("%s", wcsprintf_buf()); status = wcsvfree(&nwcs, &wcs); return 0; }
int main(int argc, char *argv[]) { char *header, *hptr; int dohdr = 0, dopixel = 0, doworld = 0; int i, nkeyrec, nreject, nwcs, stat[NWCSFIX], status = 0; double imgcrd[2], phi, pixcrd[2], theta, world[2]; fitsfile *fptr; struct wcsprm *wcs; /* Parse options. */ for (i = 1; i < argc && argv[i][0] == '-'; i++) { if (!argv[i][1]) break; switch (argv[i][1]) { case 'h': dohdr = 1; break; case 'p': dopixel = 1; break; case 'w': doworld = 1; break; default: fprintf(stderr, "Usage: twcshdr [-h | -p | -w] <file>\n"); return 1; } } if (i != (argc-1)) { fprintf(stderr, "Usage: twcshdr [-h | -p | -w] <file>\n"); return 1; } /* Open the FITS test file and read the primary header. */ fits_open_file(&fptr, argv[i], READONLY, &status); if ((status = fits_hdr2str(fptr, 1, NULL, 0, &header, &nkeyrec, &status))) { fits_report_error(stderr, status); return 1; } /*-----------------------------------------------------------------------*/ /* Basic steps required to interpret a FITS WCS header, including -TAB. */ /*-----------------------------------------------------------------------*/ /* Parse the primary header of the FITS file. */ if ((status = wcspih(header, nkeyrec, WCSHDR_all, 2, &nreject, &nwcs, &wcs))) { fprintf(stderr, "wcspih ERROR %d: %s.\n", status,wcshdr_errmsg[status]); } /* Read coordinate arrays from the binary table extension. */ if ((status = fits_read_wcstab(fptr, wcs->nwtb, (wtbarr *)wcs->wtb, &status))) { fits_report_error(stderr, status); return 1; } /* Translate non-standard WCS keyvalues. */ if ((status = wcsfix(7, 0, wcs, stat))) { for (i = 0; i < NWCSFIX; i++) { if (stat[i] > 0) { fprintf(stderr, "wcsfix ERROR %d: %s.\n", status, wcsfix_errmsg[stat[i]]); } } return 1; } /*-----------------------------------------------------------------------*/ /* The wcsprm struct is now ready for use. */ /*-----------------------------------------------------------------------*/ /* Finished with the FITS file. */ fits_close_file(fptr, &status); free(header); /* Initialize the wcsprm struct, also taking control of memory allocated by * fits_read_wcstab(). */ if ((status = wcsset(wcs))) { fprintf(stderr, "wcsset ERROR %d: %s.\n", status, wcs_errmsg[status]); return 1; } if (dohdr) { if ((status = wcshdo(WCSHDO_all, wcs, &nkeyrec, &header))) { return 1; } hptr = header; printf("\n\n"); for (i = 0; i < nkeyrec; i++, hptr += 80) { printf("%.80s\n", hptr); } free(header); } else if (dopixel) { while (1) { printf("Enter pixel coordinates: "); if (scanf("%lf%*[ ,]%lf", pixcrd, pixcrd+1) != wcs->naxis) break; status = wcsp2s(wcs, 1, 2, pixcrd, imgcrd, &phi, &theta, world, stat); printf(" (%20.15f, %20.15f) ->\n (%20.15f, %20.15f)\n\n", pixcrd[0], pixcrd[1], world[0], world[1]); } } else if (doworld) { while (1) { printf("Enter world coordinates: "); if (scanf("%lf%*[ ,]%lf", world, world+1) != wcs->naxis) break; status = wcss2p(wcs, 1, 2, world, &phi, &theta, imgcrd, pixcrd, stat); printf(" (%20.15f, %20.15f) ->\n (%20.15f, %20.15f)\n\n", world[0], world[1], pixcrd[0], pixcrd[1]); } } else { /* Print the struct. */ if ((status = wcsprt(wcs))) { return 1; } } /* Clean up. */ status = wcsvfree(&nwcs, &wcs); return 0; }