summaryrefslogtreecommitdiffstats
path: root/funtools/wcs/wcs.h
blob: 1943c8dc7fe9e59b261dae1591e29c6c077c2cc3 (plain)
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
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
/*** File libwcs/wcs.h
 *** September 9, 2011
 *** By Jessica Mink, jmink@cfa.harvard.edu
 *** Harvard-Smithsonian Center for Astrophysics
 *** Copyright (C) 1994-2011
 *** 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
 */

#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[9];	/* Values of CRPIXn keywords */
  double	crval[9];	/* Values of CRVALn keywords */
  double	cdelt[9];	/* Values of CDELTn keywords */
  double	pc[81];		/* Values of PCiiijjj keywords */
  double	projp[10];	/* Constants for various projections */
  int		pvfail;		/* If non-zero, significant inaccuracy likely to occur in projection */
  double	projppv[2*MAXPV]; /* SCAMP constants for the PV coordinates */
  struct poly	*inv_x;		/* SCAMP projection correction polynom in x */
  struct poly	*inv_y;		/* SCAMP projection correction polynom in y */
  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)*/
  double	zpzd;		/* Colat of FIP (degs) */
  double	zpr;		/* Radius of FIP (degs) */
  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		zpnp;		 /* ZP polynomial order (0-9) */
  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 (for WCSLIB 3.0) */
  int		naxes;		/* 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[9][9];	/* Values of CTYPEn keywords */
  char		c1type[9];	/*  1st coordinate type code:
					RA--, GLON, ELON */
  char		c2type[9];	/*  2nd coordinate type code:
					DEC-, GLAT, ELAT */
  char		ptype[9];	/*  projection type code:
				    SIN, TAN, ARC, NCP, GLS, MER, AIT, etc */
  char		units[9][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_ICRS, 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) */
  int		logwcs;		/* 1 if DC-FLAG is set for log wavelength */
};

/* 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) */
#define WCS_ZPX 32	/* Gnomonic = Tangent Plane (NOAO with corrections) */
#define WCS_TPV 33	/* Gnomonic = Tangent Plane (NOAO with corrections) */
#define NWCSTYPE 34	/* Number of WCS types (-1 really means no WCS) */

/* 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 */
#define WCS_ICRS	11	/* ICRS right ascension and declination */

/* 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

/* pi/(180*3600):  arcseconds to radians */
#define AS2R		4.8481368110953e-6

/* 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))
#define secrad(x)	((x)*AS2R)

/* TNX/ZPX 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/ZPX permitted types of surfaces */
#define  TNX_CHEBYSHEV    1
#define  TNX_LEGENDRE     2
#define  TNX_POLYNOMIAL   3

/* TNX/ZPX 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 /* C++ prototypes */
extern "C" {
#endif

#ifdef __STDC__   /* Full ANSI prototypes */

    /* WCS data structure initialization subroutines in wcsinit.c */
    struct WorldCoor *wcsinit ( /* set up WCS structure from a FITS image header */
	const char* hstring);

    struct WorldCoor *wcsninit ( /* set up WCS structure from a FITS image header */
	const char* hstring,	/* FITS header */
	int len);		/* Length of FITS header */

    struct WorldCoor *wcsinitn ( /* set up WCS structure from a FITS image header */
	const char* hstring,	/* FITS header */
	const char* wcsname);	/* WCS name */

    struct WorldCoor *wcsninitn ( /* set up WCS structure from a FITS image header */
	const char* hstring,	/* FITS header */
	int len,		/* Length of FITS header */
	const char* wcsname);	/* WCS name */

    struct WorldCoor *wcsinitc ( /* set up WCS structure from a FITS image header */
	const char* hstring,	/* FITS header */
	char *wcschar);		/* WCS character (A-Z) */

    struct WorldCoor *wcsninitc ( /* set up WCS structure from a FITS image header */
	const char* hstring,	/* FITS header */
	int len,		/* Length of FITS header */
	char *wcschar);		/* WCS character (A-Z) */

    /* WCS subroutines in wcs.c */
    void wcsfree (		/* Free a WCS structure and its contents */
	struct WorldCoor *wcs);	/* World coordinate system structure */

    int wcstype(		/* Set projection type from header CTYPEs */
	struct WorldCoor *wcs,	/* World coordinate system structure */
	char *ctype1,		/* FITS WCS projection for axis 1 */
	char *ctype2);		/* FITS WCS projection for axis 2 */

    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 (	/* Convert pixel coordinates to World Coordinate string */
        struct WorldCoor *wcs,  /* World coordinate system structure */
        double xpix, 	/* Image horizontal coordinate in pixels */
        double ypix,	/* Image vertical coordinate in pixels */
        char *wcstring,	/* World coordinate string (returned) */
        int lstr);	/* Length of world coordinate string (returned) */

    void pix2wcs (	/* Convert pixel coordinates to World Coordinates */
        struct WorldCoor *wcs,  /* World coordinate system structure */
        double xpix,	/* Image horizontal coordinate in pixels */	
        double ypix,	/* Image vertical coordinate in pixels */
        double *xpos,	/* Longitude/Right Ascension in degrees (returned) */
        double *ypos);	/* Latitude/Declination in degrees (returned) */

    void wcsc2pix (	/* Convert World Coordinates to pixel coordinates */
        struct WorldCoor *wcs,  /* World coordinate system structure */
        double xpos,	/* Longitude/Right Ascension in degrees */
        double ypos,	/* Latitude/Declination in degrees */
	char *coorsys,	/* Coordinate system (B1950, J2000, etc) */
        double *xpix,	/* Image horizontal coordinate in pixels (returned) */
        double *ypix,	/* Image vertical coordinate in pixels (returned) */
        int *offscl);

    void wcs2pix (	/* Convert World Coordinates to pixel coordinates */
        struct WorldCoor *wcs,  /* World coordinate system structure */
        double xpos,	/* Longitude/Right Ascension in degrees */
        double ypos,	/* Latitude/Declination in degrees */
        double *xpix,	/* Image horizontal coordinate in pixels (returned) */
        double *ypix,	/* Image vertical coordinate in pixels (returned) */
        int *offscl);

    double wcsdist(	/* Compute angular distance between 2 sky positions */
	double ra1,	/* First longitude/right ascension in degrees */
	double dec1,	/* First latitude/declination in degrees */
	double ra2,	/* Second longitude/right ascension in degrees */
	double dec2);	/* Second latitude/declination in degrees */

    double wcsdist1(	/* Compute angular distance between 2 sky positions */
	double ra1,	/* First longitude/right ascension in degrees */
	double dec1,	/* First latitude/declination in degrees */
	double ra2,	/* Second longitude/right ascension in degrees */
	double dec2);	/* Second latitude/declination in degrees */

    double wcsdiff(	/* Compute angular distance between 2 sky positions */
	double ra1,	/* First longitude/right ascension in degrees */
	double dec1,	/* First latitude/declination in degrees */
	double ra2,	/* Second longitude/right ascension in degrees */
	double dec2);	/* Second latitude/declination in degrees */

    struct WorldCoor* wcsxinit( /* set up a WCS structure from arguments */
        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(	/* Return RA and Dec of image center, size in degrees */
        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 wcscent(	/* Print the image center and size in WCS units */
        struct WorldCoor *wcs); /* World coordinate system structure */

    void wcssize(	/* Return image center and size in RA and Dec */
        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 *dra,	/* Half-width in right ascension (deg) (returned) */
        double *ddec);	/* Half-width in declination (deg) (returned) */

    void wcsrange(	/* Return min and max RA and Dec of image in degrees */
        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 wcscdset(	/* Set scaling and rotation from CD matrix */
	struct WorldCoor *wcs,	/* World coordinate system structure */
	double *cd);	/* CD matrix, ignored if NULL */

    void wcsdeltset(	/* set scaling, rotation from CDELTi, CROTA2 */
	struct WorldCoor *wcs,	/* World coordinate system structure */
	double cdelt1,	/* degrees/pixel in first axis (or both axes) */
	double cdelt2,	/* degrees/pixel in second axis if nonzero */
	double crota);	/* Rotation counterclockwise in degrees */

    void wcspcset(	/* set scaling, rotation from CDELTs and PC matrix */
	struct WorldCoor *wcs,	/* World coordinate system structure */
	double cdelt1,	/* degrees/pixel in first axis (or both axes) */
	double cdelt2,	/* degrees/pixel in second axis if nonzero */
	double *pc);	/* Rotation matrix, ignored if NULL */

    void setwcserr(	/* Set WCS error message for later printing */
	char *errmsg);	/* Error mesage < 80 char */
    void wcserr(void);	/* 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(void);	/* 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 */

    int wcsreset(	/* Change WCS using arguments */
	struct WorldCoor *wcs,	/* World coordinate system data structure */
	double crpix1,	/* Horizontal reference pixel */
	double crpix2,	/* Vertical reference pixel */
	double crval1,	/* Reference pixel horizontal coordinate in degrees */
	double crval2,	/* Reference pixel vertical coordinate in degrees */
	double cdelt1,	/* Horizontal scale in degrees/pixel, ignored if cd is not NULL */
	double cdelt2,	/* Vertical scale in degrees/pixel, ignored if cd is not NULL */
	double crota,	/* Rotation angle in degrees, ignored if cd is not NULL */
	double *cd);	/* Rotation matrix, used if not NULL */

    void wcseqset(	/* Change equinox of reference pixel coordinates in WCS */
	struct WorldCoor *wcs,	/* World coordinate system data structure */
	double equinox);	/* Desired equinox as fractional year */

    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(		/* Set third dimension for cube projections */
	int izpix);	/* Set coordinate in third dimension (face) */

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

    void wcscominit(	/* Initialize catalog search command set by -wcscom */
	struct WorldCoor *wcs,	/* World coordinate system structure */
	int i,		/* Number of command (0-9) to initialize */
	char *command);	/* command with %s where coordinates will go */

    void wcscom(	/* Execute catalog search command set by -wcscom */
	struct WorldCoor *wcs,	/* World coordinate system structure */
	int i,		/* Number of command (0-9) to execute */
	char *filename,	/* Image file name */
	double xfile,	/* Horizontal image pixel coordinates for WCS command */
	double yfile,	/* Vertical image pixel coordinates for WCS command */
	char *wcstring); /* WCS String from pix2wcst() */

    void savewcscom(	/* Save WCS shell command */
	int i,		/* i of 10 possible shell commands */
	char *wcscom);	/* Shell command using output WCS string */
    char *getwcscom(	/* Return WCS shell command */
	int i);		/* i of 10 possible shell commands */
    void setwcscom(	/* Set WCS shell commands from stored values */
        struct WorldCoor *wcs);	/* World coordinate system structure */
    void freewcscom(	/* Free memory storing WCS shell commands */
        struct WorldCoor *wcs);	/* World coordinate system structure */

    void setwcsfile(	/* Set filename for WCS error message */
	char *filename); /* FITS or IRAF file name */
    int cpwcs (		/* Copy WCS keywords with no suffix to ones with suffix */
	char **header,	/* Pointer to start of FITS header */
	char *cwcs);	/* Keyword suffix character for output WCS */

    void savewcscoor(	/* Save output coordinate system */
	char *wcscoor);	/* coordinate system (J2000, B1950, galactic) */
    char *getwcscoor(void); /* Return output coordinate system */

    /* 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 */
    void fk425e (	/* Convert B1950(FK4) to J2000(FK5) coordinates */
	double *ra,	/* Right ascension in degrees (B1950 in, J2000 out) */
	double *dec,	/* Declination in degrees (B1950 in, J2000 out) */
	double epoch);	/* Besselian epoch in years */
    void fk524e (	/* Convert J2000(FK5) to B1950(FK4) coordinates */
	double *ra,	/* Right ascension in degrees (J2000 in, B1950 out) */
	double *dec,	/* Declination in degrees (J2000 in, B1950 out) */
	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 d2v3 (		/* Convert RA and Dec in degrees and distance to vector */
	double	rra,	/* Right ascension in degrees */
	double	rdec,	/* Declination in degrees */
	double	r,	/* Distance to object in same units as pos */
	double pos[3]);	/* x,y,z geocentric equatorial position of object (returned) */
    void s2v3 (		/* Convert RA and Dec in radians and distance to vector */
	double	rra,	/* Right ascension in radians */
	double	rdec,	/* Declination in radians */
	double	r,	/* Distance to object in same units as pos */
	double pos[3]);	/* x,y,z geocentric equatorial position of object (returned) */
    void v2d3 (		/* Convert vector to RA and Dec in degrees and distance */
	double	pos[3],	/* x,y,z geocentric equatorial position of object */
	double	*rra,	/* Right ascension in degrees (returned) */
	double	*rdec,	/* Declination in degrees (returned) */
	double	*r);	/* Distance to object in same units as pos (returned) */
    void v2s3 (		/* Convert vector to RA and Dec in radians and distance */
	double	pos[3],	/* x,y,z geocentric equatorial position of object */
	double	*rra,	/* Right ascension in radians (returned) */
	double	*rdec,	/* Declination in radians (returned) */
	double	*r);	/* Distance to object in same units as pos (returned) */

/* Distortion model subroutines in distort.c */
    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 */
    int DelDistort (	/* Delete all distortion-related fields */
	char *header,	/* FITS header */
	int verbose);	/* If !=0, print keywords as deleted */
    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) */

/* Other projection subroutines */

/* 8 projections using AIPS algorithms (worldpos.c) */
    int worldpos (	/* Convert from pixel location to RA,Dec */
	double xpix,	/* x pixel number  (RA or long without rotation) */
	double ypix,	/* y pixel number  (Dec or lat without rotation) */
	struct WorldCoor *wcs, /* WCS parameter structure */
	double *xpos,	/* x (RA) coordinate (deg) (returned) */
	double *ypos);	/* y (dec) coordinate (deg) (returned) */
    int worldpix (	/* Convert from RA,Dec to pixel location */
	double xpos,	/* x (RA) coordinate (deg) */
	double ypos,	/* y (dec) coordinate (deg) */
	struct WorldCoor *wcs, /* WCS parameter structure */
	double *xpix,	/* x pixel number (RA or long without rotation) */
	double *ypix);	/* y pixel number (dec or lat without rotation) */

/* Digital Sky Survey projection (dsspos.c) */
    int dsspos (	/* Convert from pixel location to RA,Dec */
	double xpix,	/* x pixel number  (RA or long without rotation) */
	double ypix,	/* y pixel number  (Dec or lat without rotation) */
	struct WorldCoor *wcs, /* WCS parameter structure */
	double *xpos,	/* x (RA) coordinate (deg) (returned) */
	double *ypos);	/* y (dec) coordinate (deg) (returned) */
    int dsspix (	/* Convert from RA,Dec to pixel location */
	double xpos,	/* x (RA) coordinate (deg) */
	double ypos,	/* y (dec) coordinate (deg) */
	struct WorldCoor *wcs, /* WCS parameter structure */
	double *xpix,	/* x pixel number (RA or long without rotation) */
	double *ypix);	/* y pixel number (dec or lat without rotation) */

/* SAO TDC TAN projection with higher order terms (platepos.c) */
    int platepos (	/* Convert from pixel location to RA,Dec */
	double xpix,	/* x pixel number  (RA or long without rotation) */
	double ypix,	/* y pixel number  (Dec or lat without rotation) */
	struct WorldCoor *wcs, /* WCS parameter structure */
	double *xpos,	/* x (RA) coordinate (deg) (returned) */
	double *ypos);	/* y (dec) coordinate (deg) (returned) */
    int platepix (	/* Convert from RA,Dec to pixel location */
	double xpos,	/* x (RA) coordinate (deg) */
	double ypos,	/* y (dec) coordinate (deg) */
	struct WorldCoor *wcs, /* WCS parameter structure */
	double *xpix,	/* x pixel number (RA or long without rotation) */
	double *ypix);	/* y pixel number (dec or lat without rotation) */
    void SetFITSPlate (	/* Set FITS header plate fit coefficients from structure */
	char *header,	/* Image FITS header */
	struct WorldCoor *wcs); /* WCS structure */
    int SetPlate (	/* Set plate fit coefficients in structure from arguments */
	struct WorldCoor *wcs, /* World coordinate system structure */
	int ncoeff1,	/* Number of coefficients for x */
	int ncoeff2,	/* Number of coefficients for y */
	double *coeff);	/* Plate fit coefficients */
    int GetPlate (	/* Return plate fit coefficients from structure in arguments */
	struct WorldCoor *wcs, /* World coordinate system structure */
	int *ncoeff1,	/* Number of coefficients for x */
	int *ncoeff2,	/* Number of coefficients for y) */
	double *coeff);	/* Plate fit coefficients */

/* IRAF TAN projection with higher order terms (tnxpos.c) */
    int tnxinit (	/* initialize the gnomonic forward or inverse transform */
	const char *header, /* FITS header */
	struct WorldCoor *wcs); /* pointer to WCS structure */
    int tnxpos (	/* forward transform (physical to world) gnomonic projection. */
	double xpix,	/* Image X coordinate */
	double ypix,	/* Image Y coordinate */
	struct WorldCoor *wcs, /* pointer to WCS descriptor */
	double *xpos,	/* Right ascension (returned) */
	double *ypos);	/* Declination (returned) */
    int tnxpix (	/* Inverse transform (world to physical) gnomonic projection */
	double xpos,     /* Right ascension */
	double ypos,     /* Declination */
	struct WorldCoor *wcs, /* Pointer to WCS descriptor */
	double *xpix,	/* Image X coordinate (returned) */
	double *ypix);	/* Image Y coordinate (returned) */

/* IRAF ZPN projection with higher order terms (zpxpos.c) */
    int zpxinit (	/* initialize the zenithal forward or inverse transform */
	const char *header, /* FITS header */
	struct WorldCoor *wcs); /* pointer to WCS structure */
    int zpxpos (	/* forward transform (physical to world) */
	double xpix,	/* Image X coordinate */
	double ypix,	/* Image Y coordinate */
	struct WorldCoor *wcs, /* pointer to WCS descriptor */
	double *xpos,	/* Right ascension (returned) */
	double *ypos);	/* Declination (returned) */
    int zpxpix (	/* Inverse transform (world to physical) */
	double xpos,	/* Right ascension */
	double ypos,	/* Declination */
	struct WorldCoor *wcs, /* Pointer to WCS descriptor */
	double *xpix,	/* Image X coordinate (returned) */
	double *ypix);	/* Image Y coordinate (returned) */

#else /* K&R prototypes */

/* 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(void);		/* 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 wcsdist1();	/* Compute angular distance between 2 sky positions */
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();		/* Return system string from system code, equinox, epoch */
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/TNX/ZPX */
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 */
int cpwcs();		/* Copy WCS keywords with no suffix to ones with suffix */

/* 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 */
void fk425e();		/* Convert B1950(FK4) to J2000(FK5) coordinates */
void fk524e();		/* Convert J2000(FK5) to B1950(FK4) coordinates */
int wcscsys();		/* Set coordinate system from string */
double wcsceq();	/* Set equinox from string (return 0.0 if not obvious) */
void d2v3();		/* Convert RA and Dec in degrees and distance to vector */
void s2v3();		/* Convert RA and Dec in radians and distance to vector */
void v2d3();		/* Convert vector to RA and Dec in degrees and distance */
void v2s3();		/* Convert vector to RA and Dec in radians and distance */

/* Distortion model subroutines in distort.c */
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 */
int DelDistort();	/* Delete all distortion-related fields */
void pix2foc();		/*  pixel coordinates -> focal plane coordinates */
void foc2pix();		/*  focal plane coordinates -> pixel coordinates */

/* Other projection subroutines */

/* 8 projections using AIPS algorithms (worldpos.c) */
extern int worldpos();	/* Convert from pixel location to RA,Dec */
extern int worldpix();	/* Convert from RA,Dec to pixel location */

/* Digital Sky Survey projection (dsspos.c) */
extern int dsspos();	/* Convert from pixel location to RA,Dec */
extern int dsspix();	/* Convert from RA,Dec to pixel location */

/* SAO TDC TAN projection with higher order terms (platepos.c) */
extern int platepos();	/* Convert from pixel location to RA,Dec */
extern int platepix();	/* Convert from RA,Dec to pixel location */
extern void SetFITSPlate(); /* Set FITS header plate fit coefficients from structure */
extern int SetPlate();	/* Set plate fit coefficients in structure from arguments */
extern int GetPlate();	/* Return plate fit coefficients from structure in arguments */

/* IRAF TAN projection with higher order terms (tnxpos.c) */
extern int tnxinit();	/* initialize the gnomonic forward or inverse transform */
extern int tnxpos();	/* forward transform (physical to world) gnomonic projection. */
extern int tnxpix();	/* Inverse transform (world to physical) gnomonic projection */

/* IRAF ZPN projection with higher order terms (zpxpos.c) */
extern int zpxinit();	/* initialize the gnomonic forward or inverse transform */
extern int zpxpos();	/* forward transform (physical to world) gnomonic projection. */
extern int zpxpix();	/* Inverse transform (world to physical) gnomonic projection */

#endif	/* __STDC__ */

#ifdef __cplusplus
}
#endif

#endif	/* _wcs_h_ */

/* 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
 * Dec  3 2003	Add back wcs->naxes for backward compatibility
 *
 * Aug 30 2004	Add DelDistort()
 *
 * Nov  1 2005	Add WCS_ICRS
 *
 * Jan  5 2006	Add secrad()
 * Apr 21 2006	Increase maximum number of axes from 4 to 8
 * Apr 24 2006	Increase maximum number of axes to 9
 * Nov 29 2006	Drop semicolon at end of C++ ifdef
 * Dec 21 2006	Add cpwcs()
 *
 * Jan  4 2007	Drop extra declaration of wcscstr()
 * Jan  4 2007	Fix declarations so ANSI prototypes are not just for C++
 * Jan  9 2007	Add fk425e() and fk524e() subroutines
 * Jan  9 2007	Add worldpos.c, dsspos.c, platepos.c, and tnxpos.c subroutines
 * Jan 10 2007	Add ANSI prototypes for all subroutines
 * Feb  1 2007	Add wcs.wcslog for log wavelength
 * Jul 25 2007	Add v2s3(), s2v3(), d2v3(), v2d3() for coordinate-vector conversion
 *
 * Mar 31 2010	Add wcsdist1(), an alternate method
 * Apr 07 2010	Add NWCSTYPE to keep it aligned with actual number of WCS types
 *
 * Mar 11 2011	Add NOAO ZPX projection parameters and subroutines (Frank Valdes)
 * Mar 14 2011	Add SCAMP polynomial projection coefficients
 * Sep  1 2011	Add TPV TAN projectioin with SCAT PV terms
 * Sep  9 2011	Fix comment on TPV declaration
 */