/*============================================================================
WCSLIB 4.3 - an implementation of the FITS WCS standard.
Copyright (C) 1995-2007, Mark Calabretta
This file is part of WCSLIB.
WCSLIB is free software: you can redistribute it and/or modify it under
the terms of the GNU Lesser General Public License as published by the
Free Software Foundation, either version 3 of the License, or (at your
option) any later version.
WCSLIB is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for
more details.
You should have received a copy of the GNU Lesser General Public License
along with WCSLIB. If not, see .
Correspondence concerning WCSLIB may be directed to:
Internet email: mcalabre@atnf.csiro.au
Postal address: Dr. Mark Calabretta
Australia Telescope National Facility, CSIRO
PO Box 76
Epping NSW 1710
AUSTRALIA
Author: Mark Calabretta, Australia Telescope National Facility
http://www.atnf.csiro.au/~mcalabre/index.html
$Id: twcsfix.c,v 4.3 2007/12/27 05:35:51 cal103 Exp $
*=============================================================================
*
* twcsfix tests the translation routines for non-standard WCS keyvalues, the
* wcsfix() suite, and the spectral coordinate translation routine wcssptr().
*
*---------------------------------------------------------------------------*/
#include
#include
#include
#include
#include
void parser(struct wcsprm *);
const int NAXIS = 3;
const double CRPIX[3] = {90.0, 90.0, 1.0};
const double PC[3][3] = {{ 1.0, 0.0, 0.0},
{ 0.0, 1.0, 0.0},
{ 0.0, 0.0, 1.0}};
const double CDELT[3] = {-1.0, 1.0, 19.68717093222};
char CUNIT[3][9] = {"ARCSEC", "ARCSEC", "KM/SEC"};
/* N.B. non-standard. */
char CTYPE[3][9] = {"RA---NCP", "DEC--NCP", "FELO-HEL"};
const double CRVAL[3] = {265.6220947090*3600.0, -28.98849996030*3600.0,
5569.27104};
const double RESTFRQ = 1.42040575e9;
const double RESTWAV = 0.0;
/* N.B. non-standard, corresponding to MJD 35884.04861111 */
const char DATEOBS[] = "1957/02/15 01:10:00";
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;
}
/*--------------------------------------------------------------------------*/
void parser(wcs)
struct wcsprm *wcs;
{
int i, j, status;
double *pcij;
/* In practice a parser would read the FITS header until it encountered */
/* the NAXIS keyword which must occur near the start, before any of the */
/* WCS keywords. It would then use wcsini() to allocate memory for */
/* arrays in the wcsprm struct and set default values. In this */
/* simulation the header keyvalues are set as global variables. */
wcsnpv(2);
wcsini(1, NAXIS, wcs);
/* Now the parser scans the FITS header, identifying WCS keywords and */
/* loading their values into the appropriate elements of the wcsprm */
/* struct. */
for (j = 0; j < NAXIS; j++) {
wcs->crpix[j] = CRPIX[j];
}
pcij = wcs->pc;
for (i = 0; i < NAXIS; i++) {
for (j = 0; j < NAXIS; j++) {
*(pcij++) = PC[i][j];
}
}
for (i = 0; i < NAXIS; i++) {
wcs->cdelt[i] = CDELT[i];
}
for (i = 0; i < NAXIS; i++) {
strcpy(wcs->cunit[i], &CUNIT[i][0]);
}
for (i = 0; i < NAXIS; i++) {
strcpy(wcs->ctype[i], &CTYPE[i][0]);
}
for (i = 0; i < NAXIS; i++) {
wcs->crval[i] = CRVAL[i];
}
wcs->restfrq = RESTFRQ;
wcs->restwav = RESTWAV;
wcs->pv[0].i = -1;
wcs->pv[0].m = -1;
wcs->pv[0].value = -1.0;
wcs->npv = 1;
strcpy(wcs->dateobs, DATEOBS);
/* Translate non-standard units specifications before wcsset(). */
for (i = 0; i < NAXIS; i++) {
wcsutrn(7, wcs->cunit[i]);
}
/* Extract information from the FITS header. */
if ((status = wcsset(wcs))) {
printf("wcsset ERROR %d: %s.\n", status, wcs_errmsg[status]);
}
return;
}