diff options
Diffstat (limited to 'funtools/wcs/distort.c')
-rw-r--r-- | funtools/wcs/distort.c | 407 |
1 files changed, 0 insertions, 407 deletions
diff --git a/funtools/wcs/distort.c b/funtools/wcs/distort.c deleted file mode 100644 index d903dfe..0000000 --- a/funtools/wcs/distort.c +++ /dev/null @@ -1,407 +0,0 @@ -/*** File libwcs/distort.c - *** January 4, 2007 - *** By Jessica Mink, jmink@cfa.harvard.edu, - *** Based on code written by Jing Li, IPAC - *** Harvard-Smithsonian Center for Astrophysics - *** Copyright (C) 2004-2007 - *** Smithsonian Astrophysical Observatory, Cambridge, MA, USA - - This library 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 2 of the License, or (at your option) any later version. - - This library 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 this library; if not, write to the Free Software - Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - - Correspondence concerning WCSTools should be addressed as follows: - Internet email: jmink@cfa.harvard.edu - Postal address: Jessica Mink - Smithsonian Astrophysical Observatory - 60 Garden St. - Cambridge, MA 02138 USA - - * Module: distort.c (World Coordinate Systems) - * Purpose: Convert focal plane coordinates to pixels and vice versa: - * Subroutine: distortinit (wcs, hstring) set distortion coefficients from FITS header - * Subroutine: DelDistort (header, verbose) delete distortion coefficients in FITS header - * Subroutine: pix2foc (wcs, x, y, u, v) pixel coordinates -> focal plane coordinates - * Subroutine: foc2pix (wcs, u, v, x, y) focal plane coordinates -> pixel coordinates - * Subroutine: setdistcode (wcs,ctype) sets distortion code from CTYPEi - * Subroutine: getdistcode (wcs) returns distortion code string for CTYPEi - */ - -#include <unistd.h> -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include "wcs.h" - -void -distortinit (wcs, hstring) -struct WorldCoor *wcs; /* World coordinate system structure */ -const char *hstring; /* character string containing FITS header information - in the format <keyword>= <value> [/ <comment>] */ -{ - int i, j, m; - char keyword[12]; - - /* Read distortion coefficients, if present */ - if (wcs->distcode == DISTORT_SIRTF) { - if (wcs->wcsproj == WCS_OLD) { - wcs->wcsproj = WCS_NEW; - wcs->distort.a_order = 0; - wcs->distort.b_order = 0; - wcs->distort.ap_order = 0; - wcs->distort.bp_order = 0; - } - else { - if (!hgeti4 (hstring, "A_ORDER", &wcs->distort.a_order)) { - setwcserr ("DISTINIT: Missing A_ORDER keyword for Spitzer distortion"); - } - else { - m = wcs->distort.a_order; - for (i = 0; i <= m; i++) { - for (j = 0; j <= m; j++) { - wcs->distort.a[i][j] = 0.0; - } - } - for (i = 0; i <= m; i++) { - for (j = 0; j <= m-i; j++) { - sprintf (keyword, "A_%d_%d", i, j); - hgetr8 (hstring, keyword, &wcs->distort.a[i][j]); - } - } - } - if (!hgeti4 (hstring, "B_ORDER", &wcs->distort.b_order)) { - setwcserr ("DISTINIT: Missing B_ORDER keyword for Spitzer distortion"); - } - else { - m = wcs->distort.b_order; - for (i = 0; i <= m; i++) { - for (j = 0; j <= m; j++) { - wcs->distort.b[i][j] = 0.0; - } - } - for (i = 0; i <= m; i++) { - for (j = 0; j <= m-i; j++) { - sprintf (keyword, "B_%d_%d", i, j); - hgetr8 (hstring, keyword, &wcs->distort.b[i][j]); - } - } - } - if (!hgeti4 (hstring, "AP_ORDER", &wcs->distort.ap_order)) { - setwcserr ("DISTINIT: Missing AP_ORDER keyword for Spitzer distortion"); - } - else { - m = wcs->distort.ap_order; - for (i = 0; i <= m; i++) { - for (j = 0; j <= m; j++) { - wcs->distort.ap[i][j] = 0.0; - } - } - for (i = 0; i <= m; i++) { - for (j = 0; j <= m-i; j++) { - sprintf (keyword, "AP_%d_%d", i, j); - hgetr8 (hstring, keyword, &wcs->distort.ap[i][j]); - } - } - } - if (!hgeti4 (hstring, "BP_ORDER", &wcs->distort.bp_order)) { - setwcserr ("DISTINIT: Missing BP_ORDER keyword for Spitzer distortion"); - } - else { - m = wcs->distort.bp_order; - for (i = 0; i <= m; i++) { - for (j = 0; j <= m; j++) { - wcs->distort.bp[i][j] = 0.0; - } - } - for (i = 0; i <= m; i++) { - for (j = 0; j <= m-i; j++) { - sprintf (keyword, "BP_%d_%d", i, j); - hgetr8 (hstring, keyword, &wcs->distort.bp[i][j]); - } - } - } - } - } - return; -} - - -/* Delete all distortion-related fields. - * return 0 if at least one such field is found, else -1. */ - -int -DelDistort (header, verbose) - -char *header; -int verbose; - -{ - char keyword[16]; - char str[32]; - int i, j, m; - int lctype; - int n; - - n = 0; - - if (hgeti4 (header, "A_ORDER", &m)) { - for (i = 0; i <= m; i++) { - for (j = 0; j <= m-i; j++) { - sprintf (keyword, "A_%d_%d", i, j); - hdel (header, keyword); - n++; - } - } - hdel (header, "A_ORDER"); - n++; - } - - if (hgeti4 (header, "AP_ORDER", &m)) { - for (i = 0; i <= m; i++) { - for (j = 0; j <= m-i; j++) { - sprintf (keyword, "AP_%d_%d", i, j); - hdel (header, keyword); - n++; - } - } - hdel (header, "AP_ORDER"); - n++; - } - - if (hgeti4 (header, "B_ORDER", &m)) { - for (i = 0; i <= m; i++) { - for (j = 0; j <= m-i; j++) { - sprintf (keyword, "B_%d_%d", i, j); - hdel (header, keyword); - n++; - } - } - hdel (header, "B_ORDER"); - n++; - } - - if (hgeti4 (header, "BP_ORDER", &m)) { - for (i = 0; i <= m; i++) { - for (j = 0; j <= m-i; j++) { - sprintf (keyword, "BP_%d_%d", i, j); - hdel (header, keyword); - n++; - } - } - hdel (header, "BP_ORDER"); - n++; - } - - if (n > 0 && verbose) - fprintf (stderr,"%d keywords deleted\n", n); - - /* Remove WCS distortion code from CTYPEi in FITS header */ - if (hgets (header, "CTYPE1", 31, str)) { - lctype = strlen (str); - if (lctype > 8) { - str[8] = (char) 0; - hputs (header, "CTYPE1", str); - } - } - if (hgets (header, "CTYPE2", 31, str)) { - lctype = strlen (str); - if (lctype > 8) { - str[8] = (char) 0; - hputs (header, "CTYPE2", str); - } - } - - return (n); -} - -void -foc2pix (wcs, x, y, u, v) - -struct WorldCoor *wcs; /* World coordinate system structure */ -double x, y; /* Focal plane coordinates */ -double *u, *v; /* Image pixel coordinates (returned) */ -{ - int m, n, i, j, k; - double s[DISTMAX], sum; - double temp_x, temp_y; - - /* Spitzer distortion */ - if (wcs->distcode == DISTORT_SIRTF) { - m = wcs->distort.ap_order; - n = wcs->distort.bp_order; - - temp_x = x - wcs->xrefpix; - temp_y = y - wcs->yrefpix; - - /* compute u */ - for (j = 0; j <= m; j++) { - s[j] = wcs->distort.ap[m-j][j]; - for (k = j-1; k >= 0; k--) { - s[j] = (temp_y * s[j]) + wcs->distort.ap[m-j][k]; - } - } - - sum = s[0]; - for (i=m; i>=1; i--){ - sum = (temp_x * sum) + s[m-i+1]; - } - *u = sum; - - /* compute v*/ - for (j = 0; j <= n; j++) { - s[j] = wcs->distort.bp[n-j][j]; - for (k = j-1; k >= 0; k--) { - s[j] = temp_y*s[j] + wcs->distort.bp[n-j][k]; - } - } - - sum = s[0]; - for (i = n; i >= 1; i--) - sum = temp_x * sum + s[n-i+1]; - - *v = sum; - - *u = x + *u; - *v = y + *v; - } - - /* If no distortion, return pixel positions unchanged */ - else { - *u = x; - *v = y; - } - - return; -} - - -void -pix2foc (wcs, u, v, x, y) - -struct WorldCoor *wcs; /* World coordinate system structure */ -double u, v; /* Image pixel coordinates */ -double *x, *y; /* Focal plane coordinates (returned) */ -{ - int m, n, i, j, k; - double s[DISTMAX], sum; - double temp_u, temp_v; - - /* Spitzer distortion */ - if (wcs->distcode == DISTORT_SIRTF) { - m = wcs->distort.a_order; - n = wcs->distort.b_order; - - temp_u = u - wcs->xrefpix; - temp_v = v - wcs->yrefpix; - - /* compute u */ - for (j = 0; j <= m; j++) { - s[j] = wcs->distort.a[m-j][j]; - for (k = j-1; k >= 0; k--) { - s[j] = (temp_v * s[j]) + wcs->distort.a[m-j][k]; - } - } - - sum = s[0]; - for (i=m; i>=1; i--){ - sum = temp_u*sum + s[m-i+1]; - } - *x = sum; - - /* compute v*/ - for (j=0; j<=n; j++) { - s[j] = wcs->distort.b[n-j][j]; - for (k=j-1; k>=0; k--) { - s[j] =temp_v*s[j] + wcs->distort.b[n-j][k]; - } - } - - sum = s[0]; - for (i=n; i>=1; i--) - sum = temp_u*sum + s[n-i+1]; - - *y = sum; - - *x = u + *x; - *y = v + *y; - -/* *x = u + *x + coeff.crpix1; */ -/* *y = v + *y + coeff.crpix2; */ - } - - /* If no distortion, return pixel positions unchanged */ - else { - *x = u; - *y = v; - } - - return; -} - - -/* SETDISTCODE -- Set WCS distortion code from CTYPEi in FITS header */ - -void -setdistcode (wcs, ctype) - -struct WorldCoor *wcs; /* World coordinate system structure */ -char *ctype; /* Value of CTYPEi from FITS header */ - -{ - char *extension; - int lctype; - - lctype = strlen (ctype); - if (lctype < 9) - wcs->distcode = DISTORT_NONE; - else { - extension = ctype + 8; - if (!strncmp (extension, "-SIP", 4)) - wcs->distcode = DISTORT_SIRTF; - else - wcs->distcode = DISTORT_NONE; - } - return; -} - - -/* GETDISTCODE -- Return NULL if no distortion or code from wcs.h */ - -char * -getdistcode (wcs) - -struct WorldCoor *wcs; /* World coordinate system structure */ - -{ - char *dcode; /* Distortion string for CTYPEi */ - - if (wcs->distcode == DISTORT_SIRTF) { - dcode = (char *) calloc (8, sizeof (char)); - strcpy (dcode, "-SIP"); - } - else - dcode = NULL; - return (dcode); -} - -/* Apr 2 2003 New subroutines - * Nov 3 2003 Add getdistcode to return distortion code string - * Nov 10 2003 Include unistd.h to get definition of NULL - * Nov 18 2003 Include string.h to get strlen() - * - * Jan 9 2004 Add DelDistort() to delete distortion keywords - * - * Jan 4 2007 Declare header const char* - * - * Feb 25 2011 Change SIRTF to Spitzer (long overdue!) - */ |