/*============================================================================
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: twcssub.c,v 4.3 2007/12/27 05:35:51 cal103 Exp $
*=============================================================================
*
* twcssub tests wcssub() which extracts the coordinate description for a
* subimage from a wcsprm struct.
*
*---------------------------------------------------------------------------*/
#include
#include
#include
/* In real life these would be encoded as FITS header keyrecords. */
const int NAXIS = 4;
const double CRPIX[4] = { 1025.0, 64.0, 512.0, 513.0};
const double PC[4][4] = {{ 1.1, 0.0, 0.0, 0.0},
{ 0.0, 1.0, 0.0, 0.0},
{ 0.0, 0.0, 1.0, 0.1},
{ 0.0, 0.0, 0.2, 1.0}};
const double CDELT[4] = {-9.2e-6, 10.0, 1.0, -1.0};
char CUNIT[4][16] = {"m", "s", "deg", "deg"};
char CTYPE[4][16] = {"WAVE-F2W", "TIME", "XLAT-SZP", "XLON-SZP"};
const double CRVAL[4] = {0.214982042, -2e3, -30.0, 150.0};
const double LONPOLE = 150.0;
const double LATPOLE = 999.0;
const double RESTFRQ = 1.42040575e9;
const double RESTWAV = 0.0;
char CNAME[4][16] = {"Wavelength", "Time", "Latitude", "Longitude"};
int NPS, NPV;
struct pvcard PV[10];
struct pscard PS[10];
int main()
{
int axes[4], i, j, nsub, status;
struct wcsprm wcs, wcsext;
double *pcij;
PV[0].i = 1; /* Frequency on axis 1. */
PV[0].m = 1; /* Parameter number 1. */
PV[0].value = -1.0; /* PV1_1. */
PV[1].i = 3; /* Latitude on axis 3. */
PV[1].m = 1; /* Parameter number 1. */
PV[1].value = 2.0; /* PV3_1. */
PV[2].i = 3; /* Latitude on axis 3. */
PV[2].m = 2; /* Parameter number 2. */
PV[2].value = 210.0; /* PV3_2. */
PV[3].i = 3; /* Latitude on axis 3. */
PV[3].m = 3; /* Parameter number 3. */
PV[3].value = 60.0; /* PV3_3. */
NPV = 4;
PS[0].i = 2; /* Time on axis 2. */
PS[0].m = 1; /* Parameter number 1. */
strcpy(PS[0].value, "UTC"); /* PS2_1. */
NPS = 1;
wcs.flag = -1;
wcsini(1, NAXIS, &wcs);
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]);
strcpy(wcs.ctype[i], &CTYPE[i][0]);
strcpy(wcs.cname[i], &CNAME[i][0]);
}
for (i = 0; i < NAXIS; i++) {
wcs.crval[i] = CRVAL[i];
}
wcs.lonpole = LONPOLE;
wcs.latpole = LATPOLE;
wcs.restfrq = RESTFRQ;
wcs.restwav = RESTWAV;
wcs.npv = NPV;
for (i = 0; i < NPV; i++) {
wcs.pv[i] = PV[i];
}
wcs.nps = NPS;
for (i = 0; i < NPS; i++) {
wcs.ps[i] = PS[i];
}
/* Initialize the wcsprm struct. */
(void) wcsset(&wcs);
printf("Testing WCSLIB subimage extraction routine (twcssub.c)\n"
"------------------------------------------------------\n");
printf("\nInitial contents of wcsprm struct:\n");
wcsprt(&wcs);
/* Extract the coordinate description for a subimage. */
nsub = 3;
wcsext.flag = -1;
axes[0] = WCSSUB_LONGITUDE;
axes[1] = WCSSUB_LATITUDE;
axes[2] = -(WCSSUB_SPECTRAL | WCSSUB_STOKES);
printf("\n\nExtracted contents of wcsprm struct:\n");
if ((status = wcssub(1, &wcs, &nsub, axes, &wcsext))) {
printf("wcssub ERROR %d: %s.\n", status, wcs_errmsg[status]);
} else if (nsub == 0) {
printf("None of the requested subimage axes were found.\n");
} else if ((status = wcsset(&wcsext))) {
printf("wcsset ERROR %d: %s.\n", status, wcs_errmsg[status]);
} else {
wcsprt(&wcsext);
}
/* Set it up for failure by setting PC1_3 non-zero. */
*(wcs.pc+2) = 1.0;
nsub = 2;
axes[0] = 4;
axes[1] = 3;
if ((status = wcssub(1, &wcs, &nsub, axes, &wcsext)) == 13) {
printf("\n\nReceived wcssub status 13 for a non-separable subimage "
"coordinate system,\nas expected.\n");
} else {
printf("\n\nERROR: expected wcssub status 13 for a non-separable "
"subimage coordinate\nsystem, but received status %d instead.\n",
status);
}
wcsfree(&wcs);
wcsfree(&wcsext);
return 0;
}