1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172
|
/*
* fitswcs.h
*
* Include file for fitswcs.c
*
*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
*
* This file part of: AstrOmatic software
*
* Copyright: (C) 1993-2016 IAP/CNRS/UPMC
*
* License: GNU General Public License
*
* AstrOmatic software is free software: you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
* AstrOmatic software 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 General Public License for more details.
* You should have received a copy of the GNU General Public License
* along with AstrOmatic software.
* If not, see <http://www.gnu.org/licenses/>.
*
* Last modified: 08/03/2016
*
*%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%*/
#ifndef _FITSWCS_H_
#define _FITSWCS_H_
/*-------------------------------- macros -----------------------------------*/
/*----------------------------- Internal constants --------------------------*/
#define NAXIS 2 /* Max number of FITS axes */
#define DEG (PI/180.0) /* 1 deg in radians */
#define ARCMIN (DEG/60.0) /* 1 arcsec in radians */
#define ARCSEC (DEG/3600.0) /* 1 arcsec in radians */
#define MAS (ARCSEC/1000.0) /* 1 mas in radians */
#define YEAR (365.25*DAY) /* 1 year in seconds */
#define DAY (24.0*HOUR) /* 1 day in seconds */
#define HOUR (60.0*MINUTE) /* 1 hour in seconds */
#define MINUTE 60.0 /* 1 minute in seconds */
#define MJD2000 51544.50000 /* Modified Julian date for J2000.0 */
#define JD2000 (2400000.5+MJD2000) /* Julian date for J2000.0 */
#define MJD1950 33281.92346 /* Modified Julian date for B1950.0 */
#define JD1950 (2400000.5+MJD1950) /* Julian date for B1950.0 */
#define JU2TROP 1.0000214 /* 1 Julian century in tropical units*/
#define WCS_NOCOORD 1e31 /* Code for non-existing coordinates */
#define WCS_NGRIDPOINTS 12 /* Number of WCS grid points / axis */
#define WCS_NGRIDPOINTS2 (WCS_NGRIDPOINTS*WCS_NGRIDPOINTS)
#define WCS_INVMAXDEG 9 /* Maximum inversion polynom degree */
#define WCS_INVACCURACY 0.001 /* Maximum inversion error (pixels) */
#define WCS_NRANGEPOINTS 32 /* Number of WCS range points / axis */
/*-------------------------------- typedefs ---------------------------------*/
typedef enum {CELSYS_NATIVE, CELSYS_PIXEL, CELSYS_EQUATORIAL, CELSYS_GALACTIC,
CELSYS_ECLIPTIC, CELSYS_SUPERGALACTIC} celsysenum;
/*------------------------------- structures --------------------------------*/
typedef struct wcs
{
int naxis; /* Number of image axes */
int naxisn[NAXIS]; /* FITS NAXISx parameters */
char ctype[NAXIS][9]; /* FITS CTYPE strings */
char cunit[NAXIS][32]; /* FITS CUNIT strings */
double crval[NAXIS]; /* FITS CRVAL parameters */
double cdelt[NAXIS]; /* FITS CDELT parameters */
double crpix[NAXIS]; /* FITS CRPIX parameters */
double crder[NAXIS]; /* FITS CRDER parameters */
double csyer[NAXIS]; /* FITS CSYER parameters */
double cd[NAXIS*NAXIS]; /* FITS CD matrix */
double *projp; /* FITS PV/PROJP mapping parameters */
int nprojp; /* number of useful projp parameters */
double longpole,latpole; /* FITS LONGPOLE and LATPOLE */
double wcsmin[NAXIS]; /* minimum values of WCS coords */
double wcsmax[NAXIS]; /* maximum values of WCS coords */
double wcsscale[NAXIS]; /* typical pixel scale at center */
double wcsscalepos[NAXIS]; /* WCS coordinates of scaling point */
double wcsmaxradius; /* Maximum distance to wcsscalepos */
int outmin[NAXIS]; /* minimum output pixel coordinate */
int outmax[NAXIS]; /* maximum output pixel coordinate */
int lat,lng; /* longitude and latitude axes # */
double r0; /* projection "radius" */
double lindet; /* Determinant of the local matrix */
int chirality; /* Chirality of the CD matrix */
double pixscale; /* (Local) pixel scale */
double ap2000,dp2000; /* J2000 coordinates of pole */
double ap1950,dp1950; /* B1950 coordinates of pole */
double obsdate; /* Date of observations */
double equinox; /* Equinox of observations */
double epoch; /* Epoch of observations (deprec.) */
enum {RDSYS_ICRS, RDSYS_FK5, RDSYS_FK4, RDSYS_FK4_NO_E, RDSYS_GAPPT}
radecsys; /* FITS RADECSYS reference frame */
celsysenum celsys; /* Celestial coordinate system */
double celsysmat[4]; /* Equ. <=> Cel. system parameters */
int celsysconvflag; /* Equ. <=> Cel. conversion needed? */
struct wcsprm *wcsprm; /* WCSLIB's wcsprm structure */
struct linprm *lin; /* WCSLIB's linprm structure */
struct celprm *cel; /* WCSLIB's celprm structure */
struct prjprm *prj; /* WCSLIB's prjprm structure */
struct tnxaxis *tnx_latcor; /* IRAF's TNX latitude corrections */
struct tnxaxis *tnx_lngcor; /* IRAF's TNX longitude corrections */
struct poly *inv_x; /* Proj. correction polynom in x */
struct poly *inv_y; /* Proj. correction polynom in y */
} wcsstruct;
/*------------------------------- functions ---------------------------------*/
extern wcsstruct *create_wcs(char **ctype, double *crval, double *crpix,
double *cdelt, int *naxisn, int naxis),
*copy_wcs(wcsstruct *wcsin),
*read_wcs(tabstruct *tab);
extern double fmod_0_p360(double angle),
fmod_0_pmod(double angle, double mod),
fmod_m90_p90(double angle),
fmod_mmod_pmod(double angle, double mod),
sextodegal(char *hms),
sextodegde(char *dms),
wcs_dist(wcsstruct *wcs,
double *wcspos1, double *wcspos2),
wcs_jacobian(wcsstruct *wcs, double *pixpos,
double *jacob),
wcs_rawtoraw(wcsstruct *wcsin, wcsstruct *wcsout,
double *pixposin, double *pixposout,
double *jacob),
wcs_scale(wcsstruct *wcs, double *pixpos);
extern int celsys_to_eq(wcsstruct *wcs, double *wcspos),
eq_to_celsys(wcsstruct *wcs, double *wcspos),
fcmp_0_p360(double anglep, double anglem),
frame_wcs(wcsstruct *wcsin, wcsstruct *wcsout),
raw_to_red(wcsstruct *wcs,
double *pixpos, double *redpos),
raw_to_wcs(wcsstruct *wcs,
double *pixpos, double *wcspos),
reaxe_wcs(wcsstruct *wcs, int lng, int lat),
red_to_raw(wcsstruct *wcs,
double *redpos, double *pixpos),
wcs_chirality(wcsstruct *wcs),
wcs_supproj(char *name),
wcs_to_raw(wcsstruct *wcs,
double *wcspos, double *pixpos);
extern char *degtosexal(double alpha, char *str),
*degtosexde(double delta, char *str);
extern void b2j(double yearobs, double alphain, double deltain,
double *alphaout, double *deltaout),
end_wcs(wcsstruct *wcs),
init_wcs(wcsstruct *wcs),
init_wcscelsys(wcsstruct *wcs),
invert_wcs(wcsstruct *wcs),
j2b(double yearobs, double alphain, double deltain,
double *alphaout, double *deltaout),
precess(double yearin, double alphain, double deltain,
double yearout,
double *alphaout, double *deltaout),
precess_wcs(wcsstruct *wcs, double yearin,
double yearout),
range_wcs(wcsstruct *wcs),
wipe_wcs(tabstruct *tab),
write_wcs(tabstruct *tab, wcsstruct *wcs);
#endif
|