Logo Search packages:      
Sourcecode: saoimage version File versions

wcs.h

/*** File libwcs/wcs.h
 *** November 3, 2003
 *** By Doug Mink, dmink@cfa.harvard.edu
 *** Harvard-Smithsonian Center for Astrophysics
 *** Copyright (C) 1994-2003
 *** 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: dmink@cfa.harvard.edu
           Postal address: Doug Mink
                           Smithsonian Astrophysical Observatory
                           60 Garden St.
                           Cambridge, MA 02138 USA
 */

#ifndef _wcs_h_
#define _wcs_h_

#include "wcslib.h"
#include "fitshead.h"

/* SIRTF distortion matrix coefficients */
#define DISTMAX 10
struct Distort {
  int    a_order;                /* max power for the 1st dimension */
  double a[DISTMAX][DISTMAX];  /* coefficient array of 1st dimension */
  int    b_order;                /* max power for 1st dimension */
  double b[DISTMAX][DISTMAX];  /* coefficient array of 2nd dimension */
  int    ap_order;               /* max power for the 1st dimension */
  double ap[DISTMAX][DISTMAX]; /* coefficient array of 1st dimension */
  int    bp_order;               /* max power for 1st dimension */
  double bp[DISTMAX][DISTMAX]; /* coefficient array of 2nd dimension */
};

struct WorldCoor {
  double    xref;       /* X reference coordinate value (deg) */
  double    yref;       /* Y reference coordinate value (deg) */
  double    xrefpix;    /* X reference pixel */
  double    yrefpix;    /* Y reference pixel */
  double    xinc;       /* X coordinate increment (deg) */
  double    yinc;       /* Y coordinate increment (deg) */
  double    rot;        /* rotation around axis (deg) (N through E) */
  double    cd[4];            /* rotation matrix */
  double    dc[4];            /* inverse rotation matrix */
  double    equinox;    /* Equinox of coordinates default to 1950.0 */
  double    epoch;            /* Epoch of coordinates default to equinox */
  double    nxpix;            /* Number of pixels in X-dimension of image */
  double    nypix;            /* Number of pixels in Y-dimension of image */
  double    plate_ra;   /* Right ascension of plate center */
  double    plate_dec;  /* Declination of plate center */
  double    plate_scale;      /* Plate scale in arcsec/mm */
  double    x_pixel_offset;   /* X pixel offset of image lower right */
  double    y_pixel_offset;   /* Y pixel offset of image lower right */
  double    x_pixel_size;     /* X pixel_size */
  double    y_pixel_size;     /* Y pixel_size */
  double    ppo_coeff[6];     /* pixel to plate coefficients for DSS */
  double    x_coeff[20];      /* X coefficients for plate model */
  double    y_coeff[20];      /* Y coefficients for plate model */
  double    xpix;       /* X (RA) coordinate (pixels) */
  double    ypix;       /* Y (dec) coordinate (pixels) */
  double    zpix;       /* Z (face) coordinate (pixels) */
  double    xpos;       /* X (RA) coordinate (deg) */
  double    ypos;       /* Y (dec) coordinate (deg) */
  double    crpix[4];   /* Values of CRPIXn keywords */
  double    crval[4];   /* Values of CRVALn keywords */
  double    cdelt[4];   /* Values of CDELTn keywords */
  double    pc[16];           /* Values of PCiiijjj keywords */
  double    projp[10];  /* Constants for various projections */
  double    longpole;   /* Longitude of North Pole in degrees */
  double    latpole;    /* Latitude of North Pole in degrees */
  double    rodeg;            /* Radius of the projection generating sphere */
  double    imrot;            /* Rotation angle of north pole */
  double    pa_north;   /* Position angle of north (0=horizontal) */
  double    pa_east;    /* Position angle of east (0=horizontal) */
  double    radvel;           /* Radial velocity (km/sec away from observer)*/
  double    zvel;       /* Radial velocity (v/c away from observer)*/
  int       imflip;           /* If not 0, image is reflected around axis */
  int       prjcode;    /* projection code (-1-32) */
  int       latbase;    /* Latitude base 90 (NPA), 0 (LAT), -90 (SPA) */
  int       ncoeff1;    /* Number of x-axis plate fit coefficients */
  int       ncoeff2;    /* Number of y-axis plate fit coefficients */
  int       changesys;  /* 1 for FK4->FK5, 2 for FK5->FK4 */
                        /* 3 for FK4->galactic, 4 for FK5->galactic */
  int       printsys;   /* 1 to print coordinate system, else 0 */
  int       ndec;       /* Number of decimal places in PIX2WCST */
  int       degout;           /* 1 to always print degrees in PIX2WCST */
  int       tabsys;           /* 1 to put tab between RA & Dec, else 0 */
  int       rotmat;           /* 0 if CDELT, CROTA; 1 if CD */
  int       coorflip;   /* 0 if x=RA, y=Dec; 1 if x=Dec, y=RA */
  int       offscl;           /* 0 if OK, 1 if offscale */
  int       wcson;            /* 1 if WCS is set, else 0 */
  int       naxis;            /* Number of axes in image */
  int       wcsproj;    /* WCS_OLD: AIPS worldpos() and worldpix()
                           WCS_NEW: Mark Calabretta's WCSLIB subroutines
                           WCS_BEST: WCSLIB for all but CAR,COE,NCP
                           WCS_ALT:  AIPS for all but CAR,COE,NCP */
  int       linmode;    /* 0=system only, 1=units, 2=system+units */
  int       detector;   /* Instrument detector number */
  char            instrument[32];   /* Instrument name */
  char            ctype[4][9];      /* Values of CTYPEn keywords */
  char            c1type[8];  /*  1st coordinate type code:
                              RA--, GLON, ELON */
  char            c2type[8];  /*  2nd coordinate type code:
                              DEC-, GLAT, ELAT */
  char            ptype[8];   /*  projection type code:
                            SIN, TAN, ARC, NCP, GLS, MER, AIT, etc */
  char            units[4][32];     /* Units if LINEAR */
  char            radecsys[32];     /* Reference frame: FK4, FK4-NO-E, FK5, GAPPT*/
  char            radecout[32];     /* Output reference frame: FK4,FK5,GAL,ECL */
  char            radecin[32];      /* Input reference frame: FK4,FK5,GAL,ECL */
  double    eqin;       /* Input equinox (match sysin if 0.0) */
  double    eqout;            /* Output equinox (match sysout if 0.0) */
  int       sysin;            /* Input coordinate system code */
  int       syswcs;           /* WCS coordinate system code */
  int       sysout;           /* Output coordinate system code */
                        /* WCS_B1950, WCS_J2000, WCS_GALACTIC,
                         * WCS_ECLIPTIC, WCS_LINEAR, WCS_ALTAZ  */
  char            center[32]; /* Center coordinates (with frame) */
  struct wcsprm wcsl;         /* WCSLIB main projection parameters */
  struct linprm lin;          /* WCSLIB image/pixel conversion parameters */
  struct celprm cel;          /* WCSLIB projection type */
  struct prjprm prj;          /* WCSLIB projection parameters */
  struct IRAFsurface *lngcor; /* RA/longitude correction structure */
  struct IRAFsurface *latcor; /* Dec/latitude correction structure */
  int       distcode;   /* Distortion code 0=none 1=SIRTF */
  struct Distort distort;     /* SIRTF distortion coefficients */
  char *command_format[10];   /* WCS command formats */
                        /* where %s is replaced by WCS coordinates */
                        /* where %f is replaced by the image filename */
                        /* where %x is replaced by image coordinates */
  double    ltm[4];           /* Image rotation matrix */
  double    ltv[2];           /* Image offset */
  int       idpix[2];   /* First pixel to use in image (x, y) */
  int       ndpix[2];   /* Number of pixels to use in image (x, y) */
  struct WorldCoor *wcs;      /* WCS upon which this WCS depends */
  struct WorldCoor *wcsdep;   /* WCS depending on this WCS */
  char            *wcsname;   /* WCS name (defaults to NULL pointer) */
  char            wcschar;    /* WCS character (A-Z, null, space) */
};

/* Projections (1-26 are WCSLIB) (values for wcs->prjcode) */
#define WCS_PIX -1      /* Pixel WCS */
#define WCS_LIN  0      /* Linear projection */
#define WCS_AZP  1      /* Zenithal/Azimuthal Perspective */
#define WCS_SZP  2      /* Zenithal/Azimuthal Perspective */
#define WCS_TAN  3      /* Gnomonic = Tangent Plane */
#define WCS_SIN  4      /* Orthographic/synthesis */
#define WCS_STG  5      /* Stereographic */
#define WCS_ARC  6      /* Zenithal/azimuthal equidistant */
#define WCS_ZPN  7      /* Zenithal/azimuthal PolyNomial */
#define WCS_ZEA  8      /* Zenithal/azimuthal Equal Area */
#define WCS_AIR  9      /* Airy */
#define WCS_CYP 10      /* CYlindrical Perspective */
#define WCS_CAR 11      /* Cartesian */
#define WCS_MER 12      /* Mercator */
#define WCS_CEA 13      /* Cylindrical Equal Area */
#define WCS_COP 14      /* Conic PerSpective (COP) */
#define WCS_COD 15      /* COnic equiDistant */
#define WCS_COE 16      /* COnic Equal area */
#define WCS_COO 17      /* COnic Orthomorphic */
#define WCS_BON 18      /* Bonne */
#define WCS_PCO 19      /* Polyconic */
#define WCS_SFL 20      /* Sanson-Flamsteed (GLobal Sinusoidal) */
#define WCS_PAR 21      /* Parabolic */
#define WCS_AIT 22      /* Hammer-Aitoff */
#define WCS_MOL 23      /* Mollweide */
#define WCS_CSC 24      /* COBE quadrilateralized Spherical Cube */
#define WCS_QSC 25      /* Quadrilateralized Spherical Cube */
#define WCS_TSC 26      /* Tangential Spherical Cube */
#define WCS_NCP 27      /* Special case of SIN */
#define WCS_GLS 28      /* Same as SFL */
#define WCS_DSS 29      /* Digitized Sky Survey plate solution */
#define WCS_PLT 30      /* Plate fit polynomials (SAO) */
#define WCS_TNX 31      /* Gnomonic = Tangent Plane (NOAO with corrections) */

/* Coordinate systems */
#define WCS_J2000 1     /* J2000(FK5) right ascension and declination */
#define WCS_B1950 2     /* B1950(FK4) right ascension and declination */
#define WCS_GALACTIC    3     /* Galactic longitude and latitude */
#define WCS_ECLIPTIC    4     /* Ecliptic longitude and latitude */
#define WCS_ALTAZ 5     /* Azimuth and altitude/elevation */
#define WCS_LINEAR      6     /* Linear with optional units */
#define WCS_NPOLE 7     /* Longitude and north polar angle */
#define WCS_SPA         8     /* Longitude and south polar angle */
#define WCS_PLANET      9     /* Longitude and latitude on planet */
#define WCS_XY          10    /* X-Y Cartesian coordinates */

/* Method to use */
#define WCS_BEST  0     /* Use best WCS projections */
#define WCS_ALT         1     /* Use not best WCS projections */
#define WCS_OLD         2     /* Use AIPS WCS projections */
#define WCS_NEW         3     /* Use WCSLIB 2.5 WCS projections */

/* Distortion codes (values for wcs->distcode) */
#define DISTORT_NONE    0     /* No distortion coefficients */
#define DISTORT_SIRTF   1     /* SIRTF distortion matrix */

#ifndef PI
#define PI  3.141592653589793238462643
#endif

/* Conversions among hours of RA, degrees and radians. */
#define degrad(x) ((x)*PI/180.)
#define raddeg(x) ((x)*180./PI)
#define hrdeg(x)  ((x)*15.)
#define deghr(x)  ((x)/15.)
#define hrrad(x)  degrad(hrdeg(x))
#define radhr(x)  deghr(raddeg(x))

/* TNX surface fitting structure and flags */
struct IRAFsurface {
  double xrange;  /* 2. / (xmax - xmin), polynomials */
  double xmaxmin; /* - (xmax + xmin) / 2., polynomials */
  double yrange;  /* 2. / (ymax - ymin), polynomials */
  double ymaxmin; /* - (ymax + ymin) / 2., polynomials */
  int  type;            /* type of curve to be fitted */
  int    xorder;  /* order of the fit in x */
  int    yorder;  /* order of the fit in y */
  int    xterms;  /* cross terms for polynomials */
  int    ncoeff;  /* total number of coefficients */
  double *coeff;  /* pointer to coefficient vector */
  double *xbasis; /* pointer to basis functions (all x) */
  double *ybasis; /* pointer to basis functions (all y) */
};

/* TNX permitted types of surfaces */
#define  TNX_CHEBYSHEV    1
#define  TNX_LEGENDRE     2
#define  TNX_POLYNOMIAL   3

/* TNX cross-terms flags */
#define     TNX_XNONE   0     /* no x-terms (old no) */
#define     TNX_XFULL   1     /* full x-terms (new yes) */
#define     TNX_XHALF   2     /* half x-terms (new) */

#ifdef __cplusplus /* allan: 28.4.98: added C++ prototypes */
extern "C" {

    /* WCS subroutines in wcs.c */
    struct WorldCoor *wcsinit (const char* hstring);
    struct WorldCoor *wcsninit (
      const char* hstring,    /* FITS header */
      int len);         /* Length of FITS header */
    struct WorldCoor *wcsinitn (
      const char* hstring,    /* FITS header */
      const char* wcsname);   /* WCS name */
    struct WorldCoor *wcsninitn (
      const char* hstring,    /* FITS header */
      int len,          /* Length of FITS header */
      const char* wcsname);   /* WCS name */
    struct WorldCoor *wcsinitc (
      const char* hstring,    /* FITS header */
      const char wcschar);    /* WCS character (A-Z) */
    struct WorldCoor *wcsninitc (
      const char* hstring,    /* FITS header */
      int len,          /* Length of FITS header */
      const char wcschar);    /* WCS character (A-Z) */
    void wcsfree (
      struct WorldCoor *wcs); /* World coordinate system structure */

    int iswcs(                /* Returns 1 if wcs structure set, else 0 */
      struct WorldCoor *wcs); /* World coordinate system structure */
    int nowcs(                /* Returns 0 if wcs structure set, else 1 */
      struct WorldCoor *wcs); /* World coordinate system structure */

    int pix2wcst (
        struct WorldCoor *wcs,  /* World coordinate system structure */
        double xpix, 
        double ypix,            /* Image coordinates in pixels */
        char   *wcstring,       /* World coordinate string (returned) */
        int    lstr             /* Length of world coordinate string (returned) */
        );

    int pix2wcs (
        struct WorldCoor *wcs,  /* World coordinate system structure */
        double xpix, 
        double ypix,            /* Image coordinates in pixels */
        double *xpos, 
        double *ypos            /* RA and Dec in degrees (returned) */
        );

    void wcsc2pix (
        struct WorldCoor *wcs,  /* World coordinate system structure */
        double xpos,
        double ypos,            /* World coordinates in degrees */
      char *coorsys,          /* Coordinate system (B1950, J2000, etc) */
        double *xpix,
        double *ypix,           /* Image coordinates in pixels */
        int     *offscl);

    void wcs2pix (
        struct WorldCoor *wcs,  /* World coordinate system structure */
        double xpos,
        double ypos,            /* World coordinates in degrees */
        double *xpix,
        double *ypix,           /* Image coordinates in pixels */
        int     *offscl);

    double wcsdist(           /* Compute angular distance between 2 sky positions */
      double ra0,       /* World coordinates in degrees */
      double dec0,
      double ra1,       /* World coordinates in degrees */
      double dec1);

    double wcsdiff(           /* Compute angular distance between 2 sky positions */
      double ra0,       /* World coordinates in degrees */
      double dec0,
      double ra1,       /* World coordinates in degrees */
      double dec1);

    struct WorldCoor* wcsxinit(
        double  cra,    /* Center right ascension in degrees */
        double  cdec,   /* Center declination in degrees */
        double  secpix, /* Number of arcseconds per pixel */
        double  xrpix,  /* Reference pixel X coordinate */
        double  yrpix,  /* Reference pixel X coordinate */
        int     nxpix,  /* Number of pixels along x-axis */
        int     nypix,  /* Number of pixels along y-axis */
        double  rotate, /* Rotation angle (clockwise positive) in degrees */
        int     equinox, /* Equinox of coordinates, 1950 and 2000 supported */
        double  epoch,  /* Epoch of coordinates, used for FK4/FK5 conversion
                         * no effect if 0 */
        char    *proj); /* Projection */

    struct WorldCoor* wcskinit( /* set up WCS structure from keyword values */
      int     naxis1,         /* Number of pixels along x-axis */
      int     naxis2,         /* Number of pixels along y-axis */
      char    *ctype1,  /* FITS WCS projection for axis 1 */
      char    *ctype2,  /* FITS WCS projection for axis 2 */
      double  crpix1,         /* Reference pixel coordinates */
      double  crpix2,         /* Reference pixel coordinates */
      double  crval1,         /* Coordinate at reference pixel in degrees */
      double  crval2,         /* Coordinate at reference pixel in degrees */
      double  *cd,            /* Rotation matrix, used if not NULL */
      double  cdelt1,         /* scale in degrees/pixel, if cd is NULL */
      double  cdelt2,         /* scale in degrees/pixel, if cd is NULL */
      double  crota,          /* Rotation angle in degrees, if cd is NULL */
      int     equinox, /* Equinox of coordinates, 1950 and 2000 supported */
      double  epoch);  /* Epoch of coordinates, for FK4/FK5 conversion */

    void wcsshift(            /* Change center of WCS */
        struct WorldCoor *wcs,  /* World coordinate system structure */
        double  cra,            /* New center right ascension in degrees */
        double  cdec,           /* New center declination in degrees */
        char    *coorsys);      /* FK4 or FK5 coordinates (1950 or 2000) */

    void wcsfull(
        struct WorldCoor *wcs,  /* World coordinate system structure */
        double  *cra,           /* Right ascension of image center (deg) (returned) */
        double  *cdec,          /* Declination of image center (deg) (returned) */
        double  *width,         /* Width in degrees (returned) */
        double  *height);       /* Height in degrees (returned) */

    void wcsrange(
        struct WorldCoor *wcs,  /* World coordinate system structure */
        double  *ra1,           /* Min. right ascension of image (deg) (returned) */
        double  *ra2,           /* Max. right ascension of image (deg) (returned) */
        double  *dec1,          /* Min. declination of image (deg) (returned) */
        double  *dec2);         /* Max. declination of image (deg) (returned) */

    void setwcserr(           /* Set WCS error message for later printing */
      char *errmsg);          /* Error mesage < 80 char */
    void wcserr();            /* Print WCS error message to stderr */

    void setdefwcs(           /* Set flag to use AIPS WCS instead of WCSLIB */
      int oldwcs);            /* 1 for AIPS WCS subroutines, else WCSLIB */
    int getdefwcs();          /* Return flag for AIPS WCS set by setdefwcs */

    char *getradecsys(        /* Return name of image coordinate system */
        struct WorldCoor *wcs);     /* World coordinate system structure */
      
    void wcsoutinit(          /* Set output coordinate system for pix2wcs */
        struct WorldCoor *wcs,      /* World coordinate system structure */
      char *coorsys);         /* Coordinate system (B1950, J2000, etc) */

    char *getwcsout(          /* Return current output coordinate system */
        struct WorldCoor *wcs);     /* World coordinate system structure */

    void wcsininit(           /* Set input coordinate system for wcs2pix */
        struct WorldCoor *wcs,      /* World coordinate system structure */
      char *coorsys);         /* Coordinate system (B1950, J2000, etc) */

    char *getwcsin(           /* Return current input coordinate system */
        struct WorldCoor *wcs);     /* World coordinate system structure */

    int setwcsdeg(            /* Set WCS coordinate output format */
        struct WorldCoor *wcs,      /* World coordinate system structure */
      int degout);            /* 1= degrees, 0= hh:mm:ss dd:mm:ss */

    int wcsndec(        /* Set or get number of output decimal places */
        struct WorldCoor *wcs,      /* World coordinate system structure */
      int ndec);        /* Number of decimal places in output string
                           if < 0, return current ndec unchanged */

    void setwcslin(           /* Set pix2wcst() mode for LINEAR coordinates */
        struct WorldCoor *wcs,      /* World coordinate system structure */
      int mode);        /* 0: x y linear, 1: x units x units
                           2: x y linear units */

    int wcszin(
      int izpix);       /* Set coordinate in third dimension (face) */

    int wcszout (       /* Return coordinate in third dimension */
        struct WorldCoor *wcs);     /* World coordinate system structure */

    void savewcscoor(         /* Save output coordinate system */
      char *wcscoor);         /* coordinate system (J2000, B1950, galactic) */
    char *getwcscoor();       /* Return output coordinate system */
    void savewcscom(          /* Save WCS shell command */
      char *wcscom);          /* Shell command using output WCS string */
    char *getwcscom();        /* Return WCS shell command */
    void setwcsfile(          /* Set filename for WCS error message */
      char *filename);  /* FITS or IRAF file name */


    /* Coordinate conversion subroutines in wcscon.c */
    void wcsconv( /* Convert between coordinate systems and equinoxes */
      int sys1,   /* Input coordinate system (J2000, B1950, ECLIPTIC, GALACTIC */
      int sys2,   /* Output coordinate system (J2000, B1950, ECLIPTIC, G ALACTIC */
      double eq1, /* Input equinox (default of sys1 if 0.0) */
      double eq2, /* Output equinox (default of sys2 if 0.0) */
      double ep1, /* Input Besselian epoch in years */
      double ep2, /* Output Besselian epoch in years */
      double *dtheta,   /* Longitude or right ascension in degrees
                     Input in sys1, returned in sys2 */
      double *dphi,     /* Latitude or declination in degrees
                     Input in sys1, returned in sys2 */
      double *ptheta,   /* Longitude or right ascension proper motion in deg/year
                     Input in sys1, returned in sys2 */
      double *pphi,     /* Latitude or declination proper motion in deg/year */
      double *px, /* Parallax in arcseconds */
      double *rv);      /* Radial velocity in km/sec */
    void wcsconp( /* Convert between coordinate systems and equinoxes */
      int sys1,   /* Input coordinate system (J2000, B1950, ECLIPTIC, GALACTIC */
      int sys2,   /* Output coordinate system (J2000, B1950, ECLIPTIC, G ALACTIC */
      double eq1, /* Input equinox (default of sys1 if 0.0) */
      double eq2, /* Output equinox (default of sys2 if 0.0) */
      double ep1, /* Input Besselian epoch in years */
      double ep2, /* Output Besselian epoch in years */
      double *dtheta,   /* Longitude or right ascension in degrees
                     Input in sys1, returned in sys2 */
      double *dphi,     /* Latitude or declination in degrees
                     Input in sys1, returned in sys2 */
      double *ptheta,   /* Longitude or right ascension proper motion in degrees/year
                     Input in sys1, returned in sys2 */
      double *pphi);    /* Latitude or declination proper motion in degrees/year
                     Input in sys1, returned in sys2 */
    void wcscon(  /* Convert between coordinate systems and equinoxes */
      int sys1,   /* Input coordinate system (J2000, B1950, ECLIPTIC, GALACTIC */
      int sys2,   /* Output coordinate system (J2000, B1950, ECLIPTIC, G ALACTIC */
      double eq1, /* Input equinox (default of sys1 if 0.0) */
      double eq2, /* Output equinox (default of sys2 if 0.0) */
      double *dtheta,   /* Longitude or right ascension in degrees
                     Input in sys1, returned in sys2 */
      double *dphi,     /* Latitude or declination in degrees
                     Input in sys1, returned in sys2 */
      double epoch);    /* Besselian epoch in years */

    int wcscsys(  /* Return code for coordinate system in string */
      char *coorsys);    /* Coordinate system (B1950, J2000, etc) */

    double wcsceq (     /* Set equinox from string (return 0.0 if not obvious) */
      char *wcstring);  /* Coordinate system (B1950, J2000, etc) */

    void wcscstr (      /* Set coordinate system type string from system and equinox */
      char   *cstr,      /* Coordinate system string (returned) */
      int    syswcs,    /* Coordinate system code */
      double equinox,   /* Equinox of coordinate system */
      double epoch);    /* Epoch of coordinate system */

    void distortinit (  /* Set distortion coefficients from FITS header */
      struct WorldCoor *wcs,  /* World coordinate system structure */
      const char* hstring);   /* FITS header */

    void setdistcode (  /* Set WCS distortion code string from CTYPEi value */
      struct WorldCoor *wcs,  /* World coordinate system structure */
      char  *ctype);    /* CTYPE value from FITS header */

    char *getdistcode ( /* Return distortion code string for CTYPEi */
      struct WorldCoor *wcs); /* World coordinate system structure */

    void pix2foc (      /* Convert pixel to focal plane coordinates */
      struct WorldCoor *wcs,  /* World coordinate system structure */
      double x,         /* Image pixel horizontal coordinate */
      double y,         /* Image pixel vertical coordinate */
      double *u,        /* Focal plane horizontal coordinate(returned) */
      double *v);       /* Focal plane vertical coordinate (returned) */

    void foc2pix (      /* Convert focal plane to pixel coordinates */
      struct WorldCoor *wcs,  /* World coordinate system structure */
      double u,         /* Focal plane horizontal coordinate */
      double v,         /* Focal plane vertical coordinate */
      double *x,        /* Image pixel horizontal coordinate(returned) */
      double *y);       /* Image pixel vertical coordinate (returned) */

};
#else /* __cplusplus */

/* WCS subroutines in wcs.c */
struct WorldCoor *wcsinit(); /* set up a WCS structure from a FITS image header */
struct WorldCoor *wcsninit(); /* set up a WCS structure from a FITS image header */
struct WorldCoor *wcsinitn(); /* set up a WCS structure from a FITS image header */
struct WorldCoor *wcsninitn(); /* set up a WCS structure from a FITS image header */
struct WorldCoor *wcsinitc(); /* set up a WCS structure from a FITS image header */
struct WorldCoor *wcsninitc(); /* set up a WCS structure from a FITS image header */
struct WorldCoor *wcsxinit(); /* set up a WCS structure from arguments */
struct WorldCoor *wcskinit(); /* set up a WCS structure from keyword values */
void wcsfree();         /* Free a WCS structure and its contents */
int wcstype();          /* Set projection type from header CTYPEs */
void wcscdset();  /* Set scaling and rotation from CD matrix */
void wcsdeltset();      /* set scaling and rotation from CDELTs and CROTA2 */
void wcspcset();  /* set scaling and rotation from CDELTs and PC matrix */
int iswcs();            /* Return 1 if WCS structure is filled, else 0 */
int nowcs();            /* Return 0 if WCS structure is filled, else 1 */
void wcsshift();  /* Reset the center of a WCS structure */
void wcscent();         /* Print the image center and size in WCS units */
void wcssize();         /* Return RA and Dec of image center, size in RA and Dec */
void wcsfull();         /* Return RA and Dec of image center, size in degrees */
void wcsrange();  /* Return min and max RA and Dec of image in degrees */
double wcsdist(); /* Distance in degrees between two sky coordinates */
double wcsdiff(); /* Distance in degrees between two sky coordinates */
void wcscominit();      /* Initialize catalog search command set by -wcscom */
void wcscom();          /* Execute catalog search command set by -wcscom */
char *getradecsys();    /* Return current value of coordinate system */
void wcsoutinit();      /* Initialize WCS output coordinate system for use by pix2wcs */
char *getwcsout();      /* Return current value of WCS output coordinate system */
void wcsininit(); /* Initialize WCS input coordinate system for use by wcs2pix */
char *getwcsin(); /* Return current value of WCS input coordinate system */
int setwcsdeg();  /* Set WCS output in degrees (1) or hh:mm:ss dd:mm:ss (0) */
int wcsndec();          /* Set or get number of output decimal places */
int wcsreset();         /* Change WCS using arguments */
void wcseqset();  /* Change equinox of reference pixel coordinates in WCS */
void wcscstr();         /* Set coordinate system string from system and equinox */
void setwcslin(); /* Set output string mode for LINEAR coordinates */
int pix2wcst();         /* Convert pixel coordinates to World Coordinate string */
void pix2wcs();         /* Convert pixel coordinates to World Coordinates */
void wcsc2pix();  /* Convert World Coordinates to pixel coordinates */
void wcs2pix();         /* Convert World Coordinates to pixel coordinates */
void setdefwcs(); /* Call to use AIPS classic WCS (also not PLT or TNX */
int getdefwcs();  /* Call to get flag for AIPS classic WCS */
int wcszin();           /* Set coordinate in third dimension (face) */
int wcszout();          /* Return coordinate in third dimension */
void wcserr();          /* Print WCS error message to stderr */
void setwcserr(); /* Set WCS error message for later printing */
void savewcscoor();     /* Save output coordinate system */
char *getwcscoor();     /* Return output coordinate system */
void savewcscom();      /* Save WCS shell command */
char *getwcscom();      /* Return WCS shell command */
void setwcscom(); /* Set WCS shell commands from stored values */
void freewcscom();      /* Free memory used to store WCS shell commands */
void setwcsfile();      /* Set filename for WCS error message */

/* Coordinate conversion subroutines in wcscon.c */
void wcscon();          /* Convert between coordinate systems and equinoxes */
void wcsconp();         /* Convert between coordinate systems and equinoxes */
void wcsconv();         /* Convert between coordinate systems and equinoxes */
int wcscsys();          /* Set coordinate system from string */
double wcsceq();  /* Set equinox from string (return 0.0 if not obvious) */
void wcscstr();         /* Return system string from system code, equinox, epoch */
void distortinit();     /* Set distortion coefficients from FITS header */
void setdistcode();     /* Set WCS distortion code string from CTYPEi value */
char *getdistcode();    /* Return distortion code string for CTYPEi */
void pix2foc();         /*  pixel coordinates -> focal plane coordinates */
void foc2pix();         /*  focal plane coordinates -> pixel coordinates */
#endif
#endif

/* Oct 26 1994    New file
 * Dec 21 1994    Add rotation matrix
 * Dec 22 1994    Add flag for coordinate reversal

 * Mar  6 1995    Add parameters for Digital Sky Survey plate fit
 * Jun  8 1995    Add parameters for coordinate system change
 * Jun 21 1995    Add parameter for plate scale
 * Jul  6 1995    Add parameter to note whether WCS is set
 * Aug  8 1995    Add parameter to note whether to print coordinate system
 * Oct 16 1995    Add parameters to save image dimensions and center coordinates

 * Feb 15 1996    Add coordinate conversion functions
 * Feb 20 1996    Add flag for tab tables
 * Apr 26 1996    Add epoch of positions (actual date of image)
 * Jul  5 1996    Add subroutine declarations
 * Jul 19 1996    Add WCSFULL declaration
 * Aug  5 1996    Add WCSNINIT to initialize WCS for non-terminated header
 * Oct 31 1996    Add DCnn inverse rotation matrix
 * Nov  1 1996    Add NDEC number of decimal places in output
 *
 * May 22 1997    Change range of pcode from 1-8 to -1-8 for linear transform
 * Sep 12 1997    Add chip rotation MROT, XMPIX, YMPIX
 *
 * Jan  7 1998    Add INSTRUME and DETECTOR for HST metric correction
 * Jan 16 1998    Add Mark Calabretta's WCSLIB data structures
 * Jan 16 1998    Add LONGPOLE, LATPOLE, and PROJP constants for Calabretta
 * Jan 22 1998    Add ctype[], crpix[], crval[], and cdelt[] for Calabretta
 * Jan 23 1998    Change wcsset() to wcsxinit() and pcode to prjcode
 * Jan 23 1998    Define projection type flags
 * Jan 26 1998    Remove chip rotation
 * Jan 26 1998    Add chip correction polynomial
 * Feb  3 1998    Add number of coefficients for residual fit
 * Feb  5 1998    Make cd and dc matrices vectors, not individual elements
 * Feb 19 1998    Add projection names
 * Feb 23 1998    Add TNX projection from NOAO
 * Mar  3 1998    Add NOAO plate fit and residual fit
 * Mar 12 1998    Add variables for TNX correction surface
 * Mar 23 1998    Add PLT plate fit polynomial projection; reassign DSS
 * Mar 23 1998    Drop plate_fit flag from structure
 * Mar 25 1998    Add npcoeff to wcs structure for new plate fit WCS
 * Apr  7 1998    Change amd_i_coeff to i_coeff
 * Apr  8 1998    Add wcseqset() and wcsreset() subroutine declarations
 * Apr 10 1998    Rearrange order of nonstandard WCS types
 * Apr 13 1998    Add setdefwcs() subroutine declaration
 * Apr 14 1998    Add coordinate systems and wcscoor()
 * Apr 24 1998    Add units
 * Apr 28 1998    Change coordinate system flags to WCS_*
 * Apr 28 1998    Change projection flags to WCS_*
 * Apr 28 1998    Add wcsc2pix()
 * May  7 1998    Add C++ declarations
 * May 13 1998    Add eqin and eqout for conversions to and from equinoxes
 * May 14 1998    Add declarations for coordinate conversion subroutines
 * May 27 1998    Add blsearch()
 * May 27 1998    Change linear projection back to WCS_LIN from WCS_LPR
 * May 27 1998    Move hget.c and hput.c C++ declarations to fitshead.h
 * May 27 1998    Include fitshead.h
 * May 29 1998    Add wcskinit()
 * Jun  1 1998    Add wcserr()
 * Jun 11 1998    Add initialization support subroutines
 * Jun 18 1998    Add wcspcset()
 * Jun 25 1998    Add wcsndec()
 * Jul  6 1998    Add wcszin() and wcszout() to use third dimension of images
 * Jul  7 1998    Change setdegout() to setwcsdeg(); setlinmode() to setwcslin()
 * Jul 17 1998    Add savewcscoor(), getwcscoor(), savewcscom(), and getwcscom()
 * Aug 14 1998    Add freewcscom(), setwcscom(), and multiple WCS commands
 * Sep  3 1998    Add pa_north, pa_east, imrot and imflip to wcs structure
 * Sep 14 1998    Add latbase for AXAF North Polar angle (NPOL not LAT-)
 * Sep 16 1998    Make WCS_system start at 1; add NPOLE
 * Sep 17 1998    Add wcscstr()
 * Sep 21 1998    Add wcsconp() to convert proper motions, too.
 * Dec  2 1998    Add WCS type for planet surface

 * Jan 20 1999    Add declaration of wcsfree()
 * Jun 16 1999    Add declaration of wcsrange()
 * Oct 21 1999    Add declaration of setwcsfile()
 *
 * Jan 28 2000    Add flags for choice of WCS projection subroutines
 * Jun 26 2000    Add XY coordinate system
 * Nov  2 2000    Add wcsconv() to convert coordinates when parallax or rv known
 *
 * Jan 17 2001    Add idpix and ndpix for trim section, ltm for readout rotation
 * Jan 31 2001    Add wcsinitn(), wcsninitn(), wcsinitc(), and wcsninitc()
 * Feb 20 2001    Add wcs->wcs to main data structure
 * Mar 20 2001    Close unclosed comment in wcsconv() argument list
 *
 * Apr  3 2002    Add SZP and second GLS/SFL projection
 * Apr  9 2002    Add wcs->wcsdep for pointer to WCS depending on this WCS
 * Apr 26 2002    Add wcs->wcsname and wcs->wcschar to identify WCS structure
 * May  9 2002    Add wcs->radvel and wcs->zvel for radial velocity in km/sec
 *
 * Apr  1 2003    Add wcs->distort Distort structure for distortion correction
 * Apr  1 2003    Add foc2pix() and pix2foc() subroutines for distortion correction
 * May  1 2003    Add missing semicolons after C++ declarations of previous two functions
 * Oct  1 2003    Rename wcs->naxes to wcs->naxis to match WCSLIB 3.2
 * Nov  3 2003    Add distinit(), setdistcode(), and getdistcode() to distort.c
 */

Generated by  Doxygen 1.6.0   Back to index