WCSLIB 7.7

wcshdr.h
Go to the documentation of this file.
1 /*============================================================================
2 WCSLIB 7.7 - an implementation of the FITS WCS standard.
3 Copyright (C) 1995-2021, Mark Calabretta
4
5 This file is part of WCSLIB.
6
7 WCSLIB is free software: you can redistribute it and/or modify it under the
8 terms of the GNU Lesser General Public License as published by the Free
9 Software Foundation, either version 3 of the License, or (at your option)
10 any later version.
11
12 WCSLIB is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
14 FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for
15 more details.
16
17 You should have received a copy of the GNU Lesser General Public License
18 along with WCSLIB. If not, see http://www.gnu.org/licenses.
19
20 Author: Mark Calabretta, Australia Telescope National Facility, CSIRO.
21 http://www.atnf.csiro.au/people/Mark.Calabretta
22 $Id: wcshdr.h,v 7.7 2021/07/12 06:36:49 mcalabre Exp $
23 *=============================================================================
24 *
25 * WCSLIB 7.7 - C routines that implement the FITS World Coordinate System
26 * (WCS) standard. Refer to the README file provided with WCSLIB for an
27 * overview of the library.
28 *
29 *
30 * Summary of the wcshdr routines
31 * ------------------------------
32 * Routines in this suite are aimed at extracting WCS information from a FITS
33 * file. The information is encoded via keywords defined in
34 *
35 = "Representations of world coordinates in FITS",
36 = Greisen, E.W., & Calabretta, M.R. 2002, A&A, 395, 1061 (WCS Paper I)
37 =
38 = "Representations of celestial coordinates in FITS",
39 = Calabretta, M.R., & Greisen, E.W. 2002, A&A, 395, 1077 (WCS Paper II)
40 =
41 = "Representations of spectral coordinates in FITS",
42 = Greisen, E.W., Calabretta, M.R., Valdes, F.G., & Allen, S.L.
43 = 2006, A&A, 446, 747 (WCS Paper III)
44 =
45 = "Representations of distortions in FITS world coordinate systems",
46 = Calabretta, M.R. et al. (WCS Paper IV, draft dated 2004/04/22),
47 = available from http://www.atnf.csiro.au/people/Mark.Calabretta
48 =
49 = "Representations of time coordinates in FITS -
50 = Time and relative dimension in space",
51 = Rots, A.H., Bunclark, P.S., Calabretta, M.R., Allen, S.L.,
52 = Manchester, R.N., & Thompson, W.T. 2015, A&A, 574, A36 (WCS Paper VII)
53 *
54 * These routines provide the high-level interface between the FITS file and
55 * the WCS coordinate transformation routines.
56 *
57 * Additionally, function wcshdo() is provided to write out the contents of a
58 * wcsprm struct as a FITS header.
59 *
60 * Briefly, the anticipated sequence of operations is as follows:
61 *
62 * - 1: Open the FITS file and read the image or binary table header, e.g.
63 * using CFITSIO routine fits_hdr2str().
64 *
65 * - 2: Parse the header using wcspih() or wcsbth(); they will automatically
66 * interpret 'TAB' header keywords using wcstab().
67 *
68 * - 3: Allocate memory for, and read 'TAB' arrays from the binary table
69 * extension, e.g. using CFITSIO routine fits_read_wcstab() - refer to
70 * the prologue of getwcstab.h. wcsset() will automatically take
71 * control of this allocated memory, in particular causing it to be
72 * freed by wcsfree().
73 *
74 * - 4: Translate non-standard WCS usage using wcsfix(), see wcsfix.h.
75 *
76 * - 5: Initialize wcsprm struct(s) using wcsset() and calculate coordinates
77 * using wcsp2s() and/or wcss2p(). Refer to the prologue of wcs.h for a
78 * description of these and other high-level WCS coordinate
79 * transformation routines.
80 *
81 * - 6: Clean up by freeing memory with wcsvfree().
82 *
83 * In detail:
84 *
85 * - wcspih() is a high-level FITS WCS routine that parses an image header. It
86 * returns an array of up to 27 wcsprm structs on each of which it invokes
87 * wcstab().
88 *
89 * - wcsbth() is the analogue of wcspih() for use with binary tables; it
90 * handles image array and pixel list keywords. As an extension of the FITS
91 * WCS standard, it also recognizes image header keywords which may be used
92 * to provide default values via an inheritance mechanism.
93 *
94 * - wcstab() assists in filling in members of the wcsprm struct associated
95 * with coordinate lookup tables ('TAB'). These are based on arrays stored
96 * in a FITS binary table extension (BINTABLE) that are located by PVi_ma
97 * keywords in the image header.
98 *
99 * - wcsidx() and wcsbdx() are utility routines that return the index for a
100 * specified alternate coordinate descriptor in the array of wcsprm structs
101 * returned by wcspih() or wcsbth().
102 *
103 * - wcsvfree() deallocates memory for an array of wcsprm structs, such as
104 * returned by wcspih() or wcsbth().
105 *
106 * - wcshdo() writes out a wcsprm struct as a FITS header.
107 *
108 *
109 * wcspih() - FITS WCS parser routine for image headers
110 * ----------------------------------------------------
111 * wcspih() is a high-level FITS WCS routine that parses an image header,
112 * either that of a primary HDU or of an image extension. All WCS keywords
113 * defined in Papers I, II, III, IV, and VII are recognized, and also those
114 * used by the AIPS convention and certain other keywords that existed in early
115 * drafts of the WCS papers as explained in wcsbth() note 5. wcspih() also
116 * handles keywords associated with non-standard distortion functions described
117 * in the prologue of dis.h.
118 *
119 * Given a character array containing a FITS image header, wcspih() identifies
120 * and reads all WCS keywords for the primary coordinate representation and up
121 * to 26 alternate representations. It returns this information as an array of
122 * wcsprm structs.
123 *
124 * wcspih() invokes wcstab() on each of the wcsprm structs that it returns.
125 *
126 * Use wcsbth() in preference to wcspih() for FITS headers of unknown type;
127 * wcsbth() can parse image headers as well as binary table and pixel list
128 * headers, although it cannot handle keywords relating to distortion
129 * functions, which may only exist in a primary image header.
130 *
131 * Given and returned:
132 * header char[] Character array containing the (entire) FITS image
133 * header from which to identify and construct the
134 * coordinate representations, for example, as might be
135 * obtained conveniently via the CFITSIO routine
136 * fits_hdr2str().
137 *
138 * Each header "keyrecord" (formerly "card image")
139 * consists of exactly 80 7-bit ASCII printing characters
140 * in the range 0x20 to 0x7e (which excludes NUL, BS,
141 * TAB, LF, FF and CR) especially noting that the
142 * keyrecords are NOT null-terminated.
143 *
144 * For negative values of ctrl (see below), header[] is
145 * modified so that WCS keyrecords processed by wcspih()
146 * are removed from it.
147 *
148 * Given:
149 * nkeyrec int Number of keyrecords in header[].
150 *
151 * relax int Degree of permissiveness:
152 * 0: Recognize only FITS keywords defined by the
153 * published WCS standard.
154 * WCSHDR_all: Admit all recognized informal
155 * extensions of the WCS standard.
156 * Fine-grained control of the degree of permissiveness
157 * is also possible as explained in wcsbth() note 5.
158 *
159 * ctrl int Error reporting and other control options for invalid
160 * WCS and other header keyrecords:
161 * 0: Do not report any rejected header keyrecords.
162 * 1: Produce a one-line message stating the number
163 * of WCS keyrecords rejected (nreject).
164 * 2: Report each rejected keyrecord and the reason
165 * why it was rejected.
166 * 3: As above, but also report all non-WCS
167 * keyrecords that were discarded, and the number
168 * of coordinate representations (nwcs) found.
169 * 4: As above, but also report the accepted WCS
170 * keyrecords, with a summary of the number
171 * accepted as well as rejected.
172 * The report is written to stderr by default, or the
173 * stream set by wcsprintf_set().
174 *
175 * For ctrl < 0, WCS keyrecords processed by wcspih()
176 * are removed from header[]:
177 * -1: Remove only valid WCS keyrecords whose values
178 * were successfully extracted, nothing is
179 * reported.
180 * -2: As above, but also remove WCS keyrecords that
181 * were rejected, reporting each one and the
182 * reason that it was rejected.
183 * -3: As above, and also report the number of
184 * coordinate representations (nwcs) found.
185 * -11: Same as -1 but preserving global WCS-related
186 * keywords such as '{DATE,MJD}-{OBS,BEG,AVG,END}'
187 * and the other basic time-related keywords, and
188 * 'OBSGEO-{X,Y,Z,L,B,H}'.
189 * If any keyrecords are removed from header[] it will
190 * be null-terminated (NUL not being a legal FITS header
191 * character), otherwise it will contain its original
192 * complement of nkeyrec keyrecords and possibly not be
193 * null-terminated.
194 *
195 * Returned:
196 * nreject int* Number of WCS keywords rejected for syntax errors,
197 * illegal values, etc. Keywords not recognized as WCS
198 * keywords are simply ignored. Refer also to wcsbth()
199 * note 5.
200 *
201 * nwcs int* Number of coordinate representations found.
202 *
203 * wcs struct wcsprm**
204 * Pointer to an array of wcsprm structs containing up to
205 * 27 coordinate representations.
206 *
207 * Memory for the array is allocated by wcspih() which
208 * also invokes wcsini() for each struct to allocate
209 * memory for internal arrays and initialize their
210 * members to default values. Refer also to wcsbth()
211 * note 8. Note that wcsset() is not invoked on these
212 * structs.
213 *
214 * This allocated memory must be freed by the user, first
215 * by invoking wcsfree() for each struct, and then by
216 * freeing the array itself. A routine, wcsvfree(), is
217 * provided to do this (see below).
218 *
219 * Function return value:
220 * int Status return value:
221 * 0: Success.
222 * 1: Null wcsprm pointer passed.
223 * 2: Memory allocation failed.
224 * 4: Fatal error returned by Flex parser.
225 *
226 * Notes:
227 * 1: Refer to wcsbth() notes 1, 2, 3, 5, 7, and 8.
228 *
229 *
230 * wcsbth() - FITS WCS parser routine for binary table and image headers
231 * ---------------------------------------------------------------------
232 * wcsbth() is a high-level FITS WCS routine that parses a binary table header.
233 * It handles image array and pixel list WCS keywords which may be present
234 * together in one header.
235 *
236 * As an extension of the FITS WCS standard, wcsbth() also recognizes image
237 * header keywords in a binary table header. These may be used to provide
238 * default values via an inheritance mechanism discussed in note 5 (c.f.
239 * WCSHDR_AUXIMG and WCSHDR_ALLIMG), or may instead result in wcsprm structs
240 * that are not associated with any particular column. Thus wcsbth() can
241 * handle primary image and image extension headers in addition to binary table
242 * headers (it ignores NAXIS and does not rely on the presence of the TFIELDS
243 * keyword).
244 *
245 * All WCS keywords defined in Papers I, II, III, and VII are recognized, and
246 * also those used by the AIPS convention and certain other keywords that
247 * existed in early drafts of the WCS papers as explained in note 5 below.
248 *
249 * wcsbth() sets the colnum or colax[] members of the wcsprm structs that it
250 * returns with the column number of an image array or the column numbers
251 * associated with each pixel coordinate element in a pixel list. wcsprm
252 * structs that are not associated with any particular column, as may be
253 * derived from image header keywords, have colnum == 0.
254 *
255 * Note 6 below discusses the number of wcsprm structs returned by wcsbth(),
256 * and the circumstances in which image header keywords cause a struct to be
257 * created. See also note 9 concerning the number of separate images that may
258 * be stored in a pixel list.
259 *
260 * The API to wcsbth() is similar to that of wcspih() except for the addition
261 * of extra arguments that may be used to restrict its operation. Like
262 * wcspih(), wcsbth() invokes wcstab() on each of the wcsprm structs that it
263 * returns.
264 *
265 * Given and returned:
266 * header char[] Character array containing the (entire) FITS binary
267 * table, primary image, or image extension header from
268 * which to identify and construct the coordinate
269 * representations, for example, as might be obtained
270 * conveniently via the CFITSIO routine fits_hdr2str().
271 *
272 * Each header "keyrecord" (formerly "card image")
273 * consists of exactly 80 7-bit ASCII printing
274 * characters in the range 0x20 to 0x7e (which excludes
275 * NUL, BS, TAB, LF, FF and CR) especially noting that
276 * the keyrecords are NOT null-terminated.
277 *
278 * For negative values of ctrl (see below), header[] is
279 * modified so that WCS keyrecords processed by wcsbth()
280 * are removed from it.
281 *
282 * Given:
283 * nkeyrec int Number of keyrecords in header[].
284 *
285 * relax int Degree of permissiveness:
286 * 0: Recognize only FITS keywords defined by the
287 * published WCS standard.
288 * WCSHDR_all: Admit all recognized informal
289 * extensions of the WCS standard.
290 * Fine-grained control of the degree of permissiveness
291 * is also possible, as explained in note 5 below.
292 *
293 * ctrl int Error reporting and other control options for invalid
294 * WCS and other header keyrecords:
295 * 0: Do not report any rejected header keyrecords.
296 * 1: Produce a one-line message stating the number
297 * of WCS keyrecords rejected (nreject).
298 * 2: Report each rejected keyrecord and the reason
299 * why it was rejected.
300 * 3: As above, but also report all non-WCS
301 * keyrecords that were discarded, and the number
302 * of coordinate representations (nwcs) found.
303 * 4: As above, but also report the accepted WCS
304 * keyrecords, with a summary of the number
305 * accepted as well as rejected.
306 * The report is written to stderr by default, or the
307 * stream set by wcsprintf_set().
308 *
309 * For ctrl < 0, WCS keyrecords processed by wcsbth()
310 * are removed from header[]:
311 * -1: Remove only valid WCS keyrecords whose values
312 * were successfully extracted, nothing is
313 * reported.
314 * -2: Also remove WCS keyrecords that were rejected,
315 * reporting each one and the reason that it was
316 * rejected.
317 * -3: As above, and also report the number of
318 * coordinate representations (nwcs) found.
319 * -11: Same as -1 but preserving global WCS-related
320 * keywords such as '{DATE,MJD}-{OBS,BEG,AVG,END}'
321 * and the other basic time-related keywords, and
322 * 'OBSGEO-{X,Y,Z,L,B,H}'.
323 * If any keyrecords are removed from header[] it will
324 * be null-terminated (NUL not being a legal FITS header
325 * character), otherwise it will contain its original
326 * complement of nkeyrec keyrecords and possibly not be
327 * null-terminated.
328 *
329 * keysel int Vector of flag bits that may be used to restrict the
330 * keyword types considered:
331 * WCSHDR_IMGHEAD: Image header keywords.
332 * WCSHDR_BIMGARR: Binary table image array.
333 * WCSHDR_PIXLIST: Pixel list keywords.
334 * If zero, there is no restriction.
335 *
336 * Keywords such as EQUIna or RFRQna that are common to
337 * binary table image arrays and pixel lists (including
338 * WCSNna and TWCSna, as explained in note 4 below) are
339 * selected by both WCSHDR_BIMGARR and WCSHDR_PIXLIST.
340 * Thus if inheritance via WCSHDR_ALLIMG is enabled as
341 * discussed in note 5 and one of these shared keywords
342 * is present, then WCSHDR_IMGHEAD and WCSHDR_PIXLIST
343 * alone may be sufficient to cause the construction of
344 * coordinate descriptions for binary table image arrays.
345 *
346 * colsel int* Pointer to an array of table column numbers used to
347 * restrict the keywords considered by wcsbth().
348 *
349 * A null pointer may be specified to indicate that there
350 * is no restriction. Otherwise, the magnitude of
351 * cols[0] specifies the length of the array:
352 * cols[0] > 0: the columns are included,
353 * cols[0] < 0: the columns are excluded.
354 *
355 * For the pixel list keywords TPn_ka and TCn_ka (and
356 * TPCn_ka and TCDn_ka if WCSHDR_LONGKEY is enabled), it
357 * is an error for one column to be selected but not the
358 * other. This is unlike the situation with invalid
359 * keyrecords, which are simply rejected, because the
360 * error is not intrinsic to the header itself but
361 * arises in the way that it is processed.
362 *
363 * Returned:
364 * nreject int* Number of WCS keywords rejected for syntax errors,
365 * illegal values, etc. Keywords not recognized as WCS
366 * keywords are simply ignored, refer also to note 5
367 * below.
368 *
369 * nwcs int* Number of coordinate representations found.
370 *
371 * wcs struct wcsprm**
372 * Pointer to an array of wcsprm structs containing up
373 * to 27027 coordinate representations, refer to note 6
374 * below.
375 *
376 * Memory for the array is allocated by wcsbth() which
377 * also invokes wcsini() for each struct to allocate
378 * memory for internal arrays and initialize their
379 * members to default values. Refer also to note 8
380 * below. Note that wcsset() is not invoked on these
381 * structs.
382 *
383 * This allocated memory must be freed by the user, first
384 * by invoking wcsfree() for each struct, and then by
385 * freeing the array itself. A routine, wcsvfree(), is
386 * provided to do this (see below).
387 *
388 * Function return value:
389 * int Status return value:
390 * 0: Success.
391 * 1: Null wcsprm pointer passed.
392 * 2: Memory allocation failed.
393 * 3: Invalid column selection.
394 * 4: Fatal error returned by Flex parser.
395 *
396 * Notes:
397 * 1: wcspih() determines the number of coordinate axes independently for
398 * each alternate coordinate representation (denoted by the "a" value in
399 * keywords like CTYPEia) from the higher of
400 *
401 * a: NAXIS,
402 * b: WCSAXESa,
403 * c: The highest axis number in any parameterized WCS keyword. The
404 * keyvalue, as well as the keyword, must be syntactically valid
405 * otherwise it will not be considered.
406 *
407 * If none of these keyword types is present, i.e. if the header only
408 * contains auxiliary WCS keywords for a particular coordinate
409 * representation, then no coordinate description is constructed for it.
410 *
411 * wcsbth() is similar except that it ignores the NAXIS keyword if given
412 * an image header to process.
413 *
414 * The number of axes, which is returned as a member of the wcsprm
415 * struct, may differ for different coordinate representations of the
416 * same image.
417 *
418 * 2: wcspih() and wcsbth() enforce correct FITS "keyword = value" syntax
419 * with regard to "= " occurring in columns 9 and 10.
420 *
421 * However, they do recognize free-format character (NOST 100-2.0,
422 * Sect. 5.2.1), integer (Sect. 5.2.3), and floating-point values
423 * (Sect. 5.2.4) for all keywords.
424 *
425 * 3: Where CROTAn, CDi_ja, and PCi_ja occur together in one header wcspih()
426 * and wcsbth() treat them as described in the prologue to wcs.h.
427 *
428 * 4: WCS Paper I mistakenly defined the pixel list form of WCSNAMEa as
429 * TWCSna instead of WCSNna; the 'T' is meant to substitute for the axis
430 * number in the binary table form of the keyword - note that keywords
431 * defined in WCS Papers II, III, and VII that are not parameterized by
432 * axis number have identical forms for binary tables and pixel lists.
433 * Consequently wcsbth() always treats WCSNna and TWCSna as equivalent.
434 *
435 * 5: wcspih() and wcsbth() interpret the "relax" argument as a vector of
436 * flag bits to provide fine-grained control over what non-standard WCS
437 * keywords to accept. The flag bits are subject to change in future and
438 * should be set by using the preprocessor macros (see below) for the
439 * purpose.
440 *
441 * - WCSHDR_none: Don't accept any extensions (not even those in the
442 * errata). Treat non-conformant keywords in the same way as
443 * non-WCS keywords in the header, i.e. simply ignore them.
444 *
445 * - WCSHDR_all: Accept all extensions recognized by the parser.
446 *
447 * - WCSHDR_reject: Reject non-standard keyrecords (that are not otherwise
448 * explicitly accepted by one of the flags below). A message will
449 * optionally be printed on stderr by default, or the stream set
450 * by wcsprintf_set(), as determined by the ctrl argument, and
451 * nreject will be incremented.
452 *
453 * This flag may be used to signal the presence of non-standard
454 * keywords, otherwise they are simply passed over as though they
455 * did not exist in the header. It is mainly intended for testing
456 * conformance of a FITS header to the WCS standard.
457 *
458 * Keyrecords may be non-standard in several ways:
459 *
460 * - The keyword may be syntactically valid but with keyvalue of
461 * incorrect type or invalid syntax, or the keycomment may be
462 * malformed.
463 *
464 * - The keyword may strongly resemble a WCS keyword but not, in
465 * fact, be one because it does not conform to the standard.
466 * For example, "CRPIX01" looks like a CRPIXja keyword, but in
467 * fact the leading zero on the axis number violates the basic
468 * FITS standard. Likewise, "LONPOLE2" is not a valid
469 * LONPOLEa keyword in the WCS standard, and indeed there is
470 * nothing the parser can sensibly do with it.
471 *
472 * - Use of the keyword may be deprecated by the standard. Such
473 * will be rejected if not explicitly accepted via one of the
474 * flags below.
475 *
476 * - WCSHDR_strict: As for WCSHDR_reject, but also reject AIPS-convention
477 * keywords and all other deprecated usage that is not explicitly
478 * accepted.
479 *
480 * - WCSHDR_CROTAia: Accept CROTAia (wcspih()),
481 * iCROTna (wcsbth()),
482 * TCROTna (wcsbth()).
483 * - WCSHDR_VELREFa: Accept VELREFa.
484 * wcspih() always recognizes the AIPS-convention keywords,
485 * CROTAn, EPOCH, and VELREF for the primary representation
486 * (a = ' ') but alternates are non-standard.
487 *
488 * wcsbth() accepts EPOCHa and VELREFa only if WCSHDR_AUXIMG is
489 * also enabled.
490 *
491 * - WCSHDR_CD00i00j: Accept CD00i00j (wcspih()).
492 * - WCSHDR_PC00i00j: Accept PC00i00j (wcspih()).
493 * - WCSHDR_PROJPn: Accept PROJPn (wcspih()).
494 * These appeared in early drafts of WCS Paper I+II (before they
495 * were split) and are equivalent to CDi_ja, PCi_ja, and PVi_ma
496 * for the primary representation (a = ' '). PROJPn is
497 * equivalent to PVi_ma with m = n <= 9, and is associated
498 * exclusively with the latitude axis.
499 *
500 * - WCSHDR_CD0i_0ja: Accept CD0i_0ja (wcspih()).
501 * - WCSHDR_PC0i_0ja: Accept PC0i_0ja (wcspih()).
502 * - WCSHDR_PV0i_0ma: Accept PV0i_0ja (wcspih()).
503 * - WCSHDR_PS0i_0ma: Accept PS0i_0ja (wcspih()).
504 * Allow the numerical index to have a leading zero in doubly-
505 * parameterized keywords, for example, PC01_01. WCS Paper I
506 * (Sects 2.1.2 & 2.1.4) explicitly disallows leading zeroes.
507 * The FITS 3.0 standard document (Sect. 4.1.2.1) states that the
508 * index in singly-parameterized keywords (e.g. CTYPEia) "shall
509 * not have leading zeroes", and later in Sect. 8.1 that "leading
510 * zeroes must not be used" on PVi_ma and PSi_ma. However, by an
511 * oversight, it is silent on PCi_ja and CDi_ja.
512 *
513 * - WCSHDR_DOBSn (wcsbth() only): Allow DOBSn, the column-specific
514 * analogue of DATE-OBS. By an oversight this was never formally
515 * defined in the standard.
516 *
517 * - WCSHDR_OBSGLBHn (wcsbth() only): Allow OBSGLn, OBSGBn, and OBSGHn,
518 * the column-specific analogues of OBSGEO-L, OBSGEO-B, and
519 * OBSGEO-H. By an oversight these were never formally defined in
520 * the standard.
521 *
522 * - WCSHDR_RADECSYS: Accept RADECSYS. This appeared in early drafts of
523 * WCS Paper I+II and was subsequently replaced by RADESYSa.
524 *
525 * wcsbth() accepts RADECSYS only if WCSHDR_AUXIMG is also
526 * enabled.
527 *
528 * - WCSHDR_EPOCHa: Accept EPOCHa.
529 *
530 * - WCSHDR_VSOURCE: Accept VSOURCEa or VSOUna (wcsbth()). This appeared
531 * in early drafts of WCS Paper III and was subsequently dropped
532 * in favour of ZSOURCEa and ZSOUna.
533 *
534 * wcsbth() accepts VSOURCEa only if WCSHDR_AUXIMG is also
535 * enabled.
536 *
537 * - WCSHDR_DATEREF: Accept DATE-REF, MJD-REF, MJD-REFI, MJD-REFF, JDREF,
538 * JD-REFI, and JD-REFF as synonyms for the standard keywords,
539 * DATEREF, MJDREF, MJDREFI, MJDREFF, JDREF, JDREFI, and JDREFF.
540 * The latter buck the pattern set by the other date keywords
541 * ({DATE,MJD}-{OBS,BEG,AVG,END}), thereby increasing the
542 * potential for confusion and error.
543 *
544 * - WCSHDR_LONGKEY (wcsbth() only): Accept long forms of the alternate
545 * binary table and pixel list WCS keywords, i.e. with "a" non-
546 * blank. Specifically
547 *
548 # jCRPXna TCRPXna : jCRPXn jCRPna TCRPXn TCRPna CRPIXja
549 # - TPCn_ka : - ijPCna - TPn_ka PCi_ja
550 # - TCDn_ka : - ijCDna - TCn_ka CDi_ja
551 # iCDLTna TCDLTna : iCDLTn iCDEna TCDLTn TCDEna CDELTia
552 # iCUNIna TCUNIna : iCUNIn iCUNna TCUNIn TCUNna CUNITia
553 # iCTYPna TCTYPna : iCTYPn iCTYna TCTYPn TCTYna CTYPEia
554 # iCRVLna TCRVLna : iCRVLn iCRVna TCRVLn TCRVna CRVALia
555 # iPVn_ma TPVn_ma : - iVn_ma - TVn_ma PVi_ma
556 # iPSn_ma TPSn_ma : - iSn_ma - TSn_ma PSi_ma
557 *
558 * where the primary and standard alternate forms together with
559 * the image-header equivalent are shown rightwards of the colon.
560 *
561 * The long form of these keywords could be described as quasi-
562 * standard. TPCn_ka, iPVn_ma, and TPVn_ma appeared by mistake
563 * in the examples in WCS Paper II and subsequently these and
564 * also TCDn_ka, iPSn_ma and TPSn_ma were legitimized by the
565 * errata to the WCS papers.
566 *
567 * Strictly speaking, the other long forms are non-standard and
568 * in fact have never appeared in any draft of the WCS papers nor
569 * in the errata. However, as natural extensions of the primary
570 * form they are unlikely to be written with any other intention.
571 * Thus it should be safe to accept them provided, of course,
572 * that the resulting keyword does not exceed the 8-character
573 * limit.
574 *
575 * If WCSHDR_CNAMn is enabled then also accept
576 *
577 # iCNAMna TCNAMna : --- iCNAna --- TCNAna CNAMEia
578 # iCRDEna TCRDEna : --- iCRDna --- TCRDna CRDERia
579 # iCSYEna TCSYEna : --- iCSYna --- TCSYna CSYERia
580 # iCZPHna TCZPHna : --- iCZPna --- TCZPna CZPHSia
581 # iCPERna TCPERna : --- iCPRna --- TCPRna CPERIia
582 *
583 * Note that CNAMEia, CRDERia, CSYERia, CZPHSia, CPERIia, and
584 * their variants are not used by WCSLIB but are stored in the
585 * wcsprm struct as auxiliary information.
586 *
587 * - WCSHDR_CNAMn (wcsbth() only): Accept iCNAMn, iCRDEn, iCSYEn, iCZPHn,
588 * iCPERn, TCNAMn, TCRDEn, TCSYEn, TCZPHn, and TCPERn, i.e. with
589 * "a" blank. While non-standard, these are the obvious analogues
590 * of iCTYPn, TCTYPn, etc.
591 *
592 * - WCSHDR_AUXIMG (wcsbth() only): Allow the image-header form of an
593 * auxiliary WCS keyword with representation-wide scope to
594 * provide a default value for all images. This default may be
595 * overridden by the column-specific form of the keyword.
596 *
597 * For example, a keyword like EQUINOXa would apply to all image
598 * arrays in a binary table, or all pixel list columns with
599 * alternate representation "a" unless overridden by EQUIna.
600 *
601 * Specifically the keywords are:
602 *
603 # LONPOLEa for LONPna
604 # LATPOLEa for LATPna
605 # VELREF - ... (No column-specific form.)
606 # VELREFa - ... Only if WCSHDR_VELREFa is set.
607 *
608 * whose keyvalues are actually used by WCSLIB, and also keywords
609 * providing auxiliary information that is simply stored in the
610 * wcsprm struct:
611 *
612 # WCSNAMEa for WCSNna ... Or TWCSna (see below).
613 #
614 # DATE-OBS for DOBSn
615 # MJD-OBS for MJDOBn
616 #
617 # RADESYSa for RADEna
618 # RADECSYS for RADEna ... Only if WCSHDR_RADECSYS is set.
619 # EPOCH - ... (No column-specific form.)
620 # EPOCHa - ... Only if WCSHDR_EPOCHa is set.
621 # EQUINOXa for EQUIna
622 *
623 * where the image-header keywords on the left provide default
624 * values for the column specific keywords on the right.
625 *
626 * Note that, according to Sect. 8.1 of WCS Paper III, and
627 * Sect. 5.2 of WCS Paper VII, the following are always inherited:
628 *
629 # RESTFREQ for RFRQna
630 # RESTFRQa for RFRQna
631 # RESTWAVa for RWAVna
632 *
633 * being those actually used by WCSLIB, together with the
634 * following auxiliary keywords, many of which do not have binary
635 * table equivalents and therefore can only be inherited:
636 *
637 # TIMESYS -
638 # TREFPOS for TRPOSn
639 # TREFDIR for TRDIRn
640 # PLEPHEM -
641 # TIMEUNIT -
642 # DATEREF -
643 # MJDREF -
644 # MJDREFI -
645 # MJDREFF -
646 # JDREF -
647 # JDREFI -
648 # JDREFF -
649 # TIMEOFFS -
650 #
651 # DATE-BEG -
652 # DATE-AVG for DAVGn
653 # DATE-END -
654 # MJD-BEG -
655 # MJD-AVG for MJDAn
656 # MJD-END -
657 # JEPOCH -
658 # BEPOCH -
659 # TSTART -
660 # TSTOP -
661 # XPOSURE -
662 # TELAPSE -
663 #
664 # TIMSYER -
665 # TIMRDER -
666 # TIMEDEL -
667 # TIMEPIXR -
668 #
669 # OBSGEO-X for OBSGXn
670 # OBSGEO-Y for OBSGYn
671 # OBSGEO-Z for OBSGZn
672 # OBSGEO-L for OBSGLn
673 # OBSGEO-B for OBSGBn
674 # OBSGEO-H for OBSGHn
675 # OBSORBIT -
676 #
677 # SPECSYSa for SPECna
678 # SSYSOBSa for SOBSna
679 # VELOSYSa for VSYSna
680 # VSOURCEa for VSOUna ... Only if WCSHDR_VSOURCE is set.
681 # ZSOURCEa for ZSOUna
682 # SSYSSRCa for SSRCna
683 # VELANGLa for VANGna
684 *
685 * Global image-header keywords, such as MJD-OBS, apply to all
686 * alternate representations, and would therefore provide a
687 * default value for all images in the header.
688 *
689 * This auxiliary inheritance mechanism applies to binary table
690 * image arrays and pixel lists alike. Most of these keywords
691 * have no default value, the exceptions being LONPOLEa and
692 * LATPOLEa, and also RADESYSa and EQUINOXa which provide
693 * defaults for each other. Thus one potential difficulty in
694 * using WCSHDR_AUXIMG is that of erroneously inheriting one of
695 * these four keywords.
696 *
697 * Also, beware of potential inconsistencies that may arise where,
698 * for example, DATE-OBS is inherited, but MJD-OBS is overridden
699 * by MJDOBn and specifies a different time. Pairs in this
700 * category are:
701 *
702 = DATE-OBS/DOBSn versus MJD-OBS/MJDOBn
703 = DATE-AVG/DAVGn versus MJD-AVG/MJDAn
704 = RESTFRQa/RFRQna versus RESTWAVa/RWAVna
705 = OBSGEO-[XYZ]/OBSG[XYZ]n versus OBSGEO-[LBH]/OBSG[LBH]n
706 *
707 * The wcsfixi() routines datfix() and obsfix() are provided to
708 * check the consistency of these and other such pairs of
709 * keywords.
710 *
711 * Unlike WCSHDR_ALLIMG, the existence of one (or all) of these
712 * auxiliary WCS image header keywords will not by itself cause a
713 * wcsprm struct to be created for alternate representation "a".
714 * This is because they do not provide sufficient information to
715 * create a non-trivial coordinate representation when used in
716 * conjunction with the default values of those keywords that are
717 * parameterized by axis number, such as CTYPEia.
718 *
719 * - WCSHDR_ALLIMG (wcsbth() only): Allow the image-header form of *all*
720 * image header WCS keywords to provide a default value for all
721 * image arrays in a binary table (n.b. not pixel list). This
722 * default may be overridden by the column-specific form of the
723 * keyword.
724 *
725 * For example, a keyword like CRPIXja would apply to all image
726 * arrays in a binary table with alternate representation "a"
727 * unless overridden by jCRPna.
728 *
729 * Specifically the keywords are those listed above for
730 * WCSHDR_AUXIMG plus
731 *
732 # WCSAXESa for WCAXna
733 *
734 * which defines the coordinate dimensionality, and the following
735 * keywords that are parameterized by axis number:
736 *
737 # CRPIXja for jCRPna
738 # PCi_ja for ijPCna
739 # CDi_ja for ijCDna
740 # CDELTia for iCDEna
741 # CROTAi for iCROTn
742 # CROTAia - ... Only if WCSHDR_CROTAia is set.
743 # CUNITia for iCUNna
744 # CTYPEia for iCTYna
745 # CRVALia for iCRVna
746 # PVi_ma for iVn_ma
747 # PSi_ma for iSn_ma
748 #
749 # CNAMEia for iCNAna
750 # CRDERia for iCRDna
751 # CSYERia for iCSYna
752 # CZPHSia for iCZPna
753 # CPERIia for iCPRna
754 *
755 * where the image-header keywords on the left provide default
756 * values for the column specific keywords on the right.
757 *
758 * This full inheritance mechanism only applies to binary table
759 * image arrays, not pixel lists, because in the latter case
760 * there is no well-defined association between coordinate axis
761 * number and column number (see note 9 below).
762 *
763 * Note that CNAMEia, CRDERia, CSYERia, and their variants are
764 * not used by WCSLIB but are stored in the wcsprm struct as
765 * auxiliary information.
766 *
767 * Note especially that at least one wcsprm struct will be
768 * returned for each "a" found in one of the image header
769 * keywords listed above:
770 *
771 * - If the image header keywords for "a" ARE NOT inherited by a
772 * binary table, then the struct will not be associated with
773 * any particular table column number and it is up to the user
774 * to provide an association.
775 *
776 * - If the image header keywords for "a" ARE inherited by a
777 * binary table image array, then those keywords are considered
778 * to be "exhausted" and do not result in a separate wcsprm
779 * struct.
780 *
781 * For example, to accept CD00i00j and PC00i00j and reject all other
782 * extensions, use
783 *
784 = relax = WCSHDR_reject | WCSHDR_CD00i00j | WCSHDR_PC00i00j;
785 *
786 * The parser always treats EPOCH as subordinate to EQUINOXa if both are
787 * present, and VSOURCEa is always subordinate to ZSOURCEa.
788 *
789 * Likewise, VELREF is subordinate to the formalism of WCS Paper III, see
790 * spcaips().
791 *
792 * Neither wcspih() nor wcsbth() currently recognize the AIPS-convention
793 * keywords ALTRPIX or ALTRVAL which effectively define an alternative
794 * representation for a spectral axis.
795 *
796 * 6: Depending on what flags have been set in its "relax" argument,
797 * wcsbth() could return as many as 27027 wcsprm structs:
798 *
799 * - Up to 27 unattached representations derived from image header
800 * keywords.
801 *
802 * - Up to 27 structs for each of up to 999 columns containing an image
803 * arrays.
804 *
805 * - Up to 27 structs for a pixel list.
806 *
807 * Note that it is considered legitimate for a column to contain an image
808 * array and also form part of a pixel list, and in particular that
809 * wcsbth() does not check the TFORM keyword for a pixel list column to
810 * check that it is scalar.
811 *
812 * In practice, of course, a realistic binary table header is unlikely to
813 * contain more than a handful of images.
814 *
815 * In order for wcsbth() to create a wcsprm struct for a particular
816 * coordinate representation, at least one WCS keyword that defines an
817 * axis number must be present, either directly or by inheritance if
818 * WCSHDR_ALLIMG is set.
819 *
820 * When the image header keywords for an alternate representation are
821 * inherited by a binary table image array via WCSHDR_ALLIMG, those
822 * keywords are considered to be "exhausted" and do not result in a
823 * separate wcsprm struct. Otherwise they do.
824 *
825 * 7: Neither wcspih() nor wcsbth() check for duplicated keywords, in most
826 * cases they accept the last encountered.
827 *
828 * 8: wcspih() and wcsbth() use wcsnpv() and wcsnps() (refer to the prologue
829 * of wcs.h) to match the size of the pv[] and ps[] arrays in the wcsprm
830 * structs to the number in the header. Consequently there are no unused
831 * elements in the pv[] and ps[] arrays, indeed they will often be of
832 * zero length.
833 *
834 * 9: The FITS WCS standard for pixel lists assumes that a pixel list
835 * defines one and only one image, i.e. that each row of the binary table
836 * refers to just one event, e.g. the detection of a single photon or
837 * neutrino, for which the device "pixel" coordinates are stored in
838 * separate scalar columns of the table.
839 *
840 * In the absence of a standard for pixel lists - or even an informal
841 * description! - let alone a formal mechanism for identifying the columns
842 * containing pixel coordinates (as opposed to pixel values or metadata
843 * recorded at the time the photon or neutrino was detected), WCS Paper I
844 * discusses how the WCS keywords themselves may be used to identify them.
845 *
846 * In practice, however, pixel lists have been used to store multiple
847 * images. Besides not specifying how to identify columns, the pixel list
848 * convention is also silent on the method to be used to associate table
849 * columns with image axes.
850 *
851 * An additional shortcoming is the absence of a formal method for
852 * associating global binary-table WCS keywords, such as WCSNna or MJDOBn,
853 * with a pixel list image, whether one or several.
854 *
855 * In light of these uncertainties, wcsbth() simply collects all WCS
856 * keywords for a particular pixel list coordinate representation (i.e.
857 * the "a" value in TCTYna) into one wcsprm struct. However, these
858 * alternates need not be associated with the same table columns and this
859 * allows a pixel list to contain up to 27 separate images. As usual, if
860 * one of these representations happened to contain more than two
861 * celestial axes, for example, then an error would result when wcsset()
862 * is invoked on it. In this case the "colsel" argument could be used to
863 * restrict the columns used to construct the representation so that it
864 * only contained one pair of celestial axes.
865 *
866 * Global, binary-table WCS keywords are considered to apply to the pixel
867 * list image with matching alternate (e.g. the "a" value in LONPna or
868 * EQUIna), regardless of the table columns the image occupies. In other
869 * words, the column number is ignored (the "n" value in LONPna or
870 * EQUIna). This also applies for global, binary-table WCS keywords that
871 * have no alternates, such as MJDOBn and OBSGXn, which match all images
872 * in a pixel list. Take heed that this may lead to counterintuitive
873 * behaviour, especially where such a keyword references a column that
874 * does not store pixel coordinates, and moreso where the pixel list
875 * stores only a single image. In fact, as the column number, n, is
876 * ignored for such keywords, it would make no difference even if they
877 * referenced non-existent columns. Moreover, there is no requirement for
878 * consistency in the column numbers used for such keywords, even for
879 * OBSGXn, OBSGYn, and OBSGZn which are meant to define the elements of a
880 * coordinate vector. Although it would surely be perverse to construct a
881 * pixel list like this, such a situation may still arise in practice
882 * where columns are deleted from a binary table.
883 *
884 * The situation with global, binary-table WCS keywords becomes
885 * potentially even more confusing when image arrays and pixel list images
886 * coexist in one binary table. In that case, a keyword such as MJDOBn
887 * may legitimately appear multiple times with n referencing different
888 * image arrays. Which then is the one that applies to the pixel list
889 * images? In this implementation, it is the last instance that appears
890 * in the header, whether or not it is also associated with an image
891 * array.
892 *
893 *
894 * wcstab() - Tabular construction routine
895 * ---------------------------------------
896 * wcstab() assists in filling in the information in the wcsprm struct relating
897 * to coordinate lookup tables.
898 *
899 * Tabular coordinates ('TAB') present certain difficulties in that the main
900 * components of the lookup table - the multidimensional coordinate array plus
901 * an index vector for each dimension - are stored in a FITS binary table
902 * extension (BINTABLE). Information required to locate these arrays is stored
903 * in PVi_ma and PSi_ma keywords in the image header.
904 *
905 * wcstab() parses the PVi_ma and PSi_ma keywords associated with each 'TAB'
906 * axis and allocates memory in the wcsprm struct for the required number of
907 * tabprm structs. It sets as much of the tabprm struct as can be gleaned from
908 * the image header, and also sets up an array of wtbarr structs (described in
909 * the prologue of wtbarr.h) to assist in extracting the required arrays from
910 * the BINTABLE extension(s).
911 *
912 * It is then up to the user to allocate memory for, and copy arrays from the
913 * BINTABLE extension(s) into the tabprm structs. A CFITSIO routine,
914 * fits_read_wcstab(), has been provided for this purpose, see getwcstab.h.
915 * wcsset() will automatically take control of this allocated memory, in
916 * particular causing it to be freed by wcsfree(); the user must not attempt
917 * to free it after wcsset() has been called.
918 *
919 * Note that wcspih() and wcsbth() automatically invoke wcstab() on each of the
920 * wcsprm structs that they return.
921 *
922 * Given and returned:
923 * wcs struct wcsprm*
924 * Coordinate transformation parameters (see below).
925 *
926 * wcstab() sets ntab, tab, nwtb and wtb, allocating
927 * memory for the tab and wtb arrays. This allocated
928 * memory will be freed automatically by wcsfree().
929 *
930 * Function return value:
931 * int Status return value:
932 * 0: Success.
933 * 1: Null wcsprm pointer passed.
934 * 2: Memory allocation failed.
935 * 3: Invalid tabular parameters.
936 *
937 * For returns > 1, a detailed error message is set in
938 * wcsprm::err if enabled, see wcserr_enable().
939 *
940 *
941 * wcsidx() - Index alternate coordinate representations
942 * -----------------------------------------------------
943 * wcsidx() returns an array of 27 indices for the alternate coordinate
944 * representations in the array of wcsprm structs returned by wcspih(). For
945 * the array returned by wcsbth() it returns indices for the unattached
946 * (colnum == 0) representations derived from image header keywords - use
947 * wcsbdx() for those derived from binary table image arrays or pixel lists
948 * keywords.
949 *
950 * Given:
951 * nwcs int Number of coordinate representations in the array.
952 *
953 * wcs const struct wcsprm**
954 * Pointer to an array of wcsprm structs returned by
955 * wcspih() or wcsbth().
956 *
957 * Returned:
958 * alts int[27] Index of each alternate coordinate representation in
959 * the array: alts[0] for the primary, alts[1] for 'A',
960 * etc., set to -1 if not present.
961 *
962 * For example, if there was no 'P' representation then
963 *
964 = alts['P'-'A'+1] == -1;
965 *
966 * Otherwise, the address of its wcsprm struct would be
967 *
968 = wcs + alts['P'-'A'+1];
969 *
970 * Function return value:
971 * int Status return value:
972 * 0: Success.
973 * 1: Null wcsprm pointer passed.
974 *
975 *
976 * wcsbdx() - Index alternate coordinate representions
977 * ---------------------------------------------------
978 * wcsbdx() returns an array of 999 x 27 indices for the alternate coordinate
979 * representions for binary table image arrays xor pixel lists in the array of
980 * wcsprm structs returned by wcsbth(). Use wcsidx() for the unattached
981 * representations derived from image header keywords.
982 *
983 * Given:
984 * nwcs int Number of coordinate representations in the array.
985 *
986 * wcs const struct wcsprm**
987 * Pointer to an array of wcsprm structs returned by
988 * wcsbth().
989 *
990 * type int Select the type of coordinate representation:
991 * 0: binary table image arrays,
992 * 1: pixel lists.
993 *
994 * Returned:
995 * alts short[1000][28]
996 * Index of each alternate coordinate represention in the
997 * array: alts[col][0] for the primary, alts[col][1] for
998 * 'A', to alts[col][26] for 'Z', where col is the
999 * 1-relative column number, and col == 0 is used for
1000 * unattached image headers. Set to -1 if not present.
1001 *
1002 * alts[col][27] counts the number of coordinate
1003 * representations of the chosen type for each column.
1004 *
1005 * For example, if there was no 'P' represention for
1006 * column 13 then
1007 *
1008 = alts[13]['P'-'A'+1] == -1;
1009 *
1010 * Otherwise, the address of its wcsprm struct would be
1011 *
1012 = wcs + alts[13]['P'-'A'+1];
1013 *
1014 * Function return value:
1015 * int Status return value:
1016 * 0: Success.
1017 * 1: Null wcsprm pointer passed.
1018 *
1019 *
1020 * wcsvfree() - Free the array of wcsprm structs
1021 * ---------------------------------------------
1022 * wcsvfree() frees the memory allocated by wcspih() or wcsbth() for the array
1023 * of wcsprm structs, first invoking wcsfree() on each of the array members.
1024 *
1025 * Given and returned:
1026 * nwcs int* Number of coordinate representations found; set to 0
1027 * on return.
1028 *
1029 * wcs struct wcsprm**
1030 * Pointer to the array of wcsprm structs; set to 0x0 on
1031 * return.
1032 *
1033 * Function return value:
1034 * int Status return value:
1035 * 0: Success.
1036 * 1: Null wcsprm pointer passed.
1037 *
1038 *
1039 * wcshdo() - Write out a wcsprm struct as a FITS header
1040 * -----------------------------------------------------
1041 * wcshdo() translates a wcsprm struct into a FITS header. If the colnum
1042 * member of the struct is non-zero then a binary table image array header will
1043 * be produced. Otherwise, if the colax[] member of the struct is set non-zero
1044 * then a pixel list header will be produced. Otherwise, a primary image or
1045 * image extension header will be produced.
1046 *
1047 * If the struct was originally constructed from a header, e.g. by wcspih(),
1048 * the output header will almost certainly differ in a number of respects:
1049 *
1050 * - The output header only contains WCS-related keywords. In particular, it
1051 * does not contain syntactically-required keywords such as SIMPLE, NAXIS,
1052 * BITPIX, or END.
1053 *
1054 * - Elements of the PCi_ja matrix will be written if and only if they differ
1055 * from the unit matrix. Thus, if the matrix is unity then no elements
1056 * will be written.
1057 *
1058 * - The redundant keywords MJDREF, JDREF, JDREFI, JDREFF, all of which
1059 * duplicate MJDREFI + MJDREFF, are never written. OBSGEO-[LBH] are not
1060 * written if OBSGEO-[XYZ] are defined.
1061 *
1062 * - Deprecated (e.g. CROTAn, RESTFREQ, VELREF, RADECSYS, EPOCH, VSOURCEa) or
1063 * non-standard usage will be translated to standard (this is partially
1064 * dependent on whether wcsfix() was applied).
1065 *
1066 * - Additional keywords such as WCSAXESa, CUNITia, LONPOLEa and LATPOLEa may
1067 * appear.
1068 *
1069 * - Quantities will be converted to the units used internally, basically SI
1070 * with the addition of degrees.
1071 *
1072 * - Floating-point quantities may be given to a different decimal precision.
1073 *
1074 * - The original keycomments will be lost, although wcshdo() tries hard to
1075 * write meaningful comments.
1076 *
1077 * - Keyword order will almost certainly be changed.
1078 *
1079 * Keywords can be translated between the image array, binary table, and pixel
1080 * lists forms by manipulating the colnum or colax[] members of the wcsprm
1081 * struct.
1082 *
1083 * Given:
1084 * ctrl int Vector of flag bits that controls the degree of
1085 * permissiveness in departing from the published WCS
1086 * standard, and also controls the formatting of
1087 * floating-point keyvalues. Set it to zero to get the
1088 * default behaviour.
1089 *
1090 * Flag bits for the degree of permissiveness:
1091 * WCSHDO_none: Recognize only FITS keywords defined by
1092 * the published WCS standard.
1093 * WCSHDO_all: Admit all recognized informal extensions
1094 * of the WCS standard.
1095 * Fine-grained control of the degree of permissiveness
1096 * is also possible as explained in the notes below.
1097 *
1098 * As for controlling floating-point formatting, by
1099 * default wcshdo() uses "%20.12G" for non-parameterized
1100 * keywords such as LONPOLEa, and attempts to make the
1101 * header more human-readable by using the same "%f"
1102 * format for all values of each of the following
1103 * parameterized keywords: CRPIXja, PCi_ja, and CDELTia
1104 * (n.b. excluding CRVALia). Each has the same field
1105 * width and precision so that the decimal points line
1106 * up. The precision, allowing for up to 15 significant
1107 * digits, is chosen so that there are no excess trailing
1108 * zeroes. A similar formatting scheme applies by
1109 * default for distortion function parameters.
1110 *
1111 * However, where the values of, for example, CDELTia
1112 * differ by many orders of magnitude, the default
1113 * formatting scheme may cause unacceptable loss of
1114 * precision for the lower-valued keyvalues. Thus the
1115 * default behaviour may be overridden:
1116 * WCSHDO_P12: Use "%20.12G" format for all floating-
1117 * point keyvalues (12 significant digits).
1118 * WCSHDO_P13: Use "%21.13G" format for all floating-
1119 * point keyvalues (13 significant digits).
1120 * WCSHDO_P14: Use "%22.14G" format for all floating-
1121 * point keyvalues (14 significant digits).
1122 * WCSHDO_P15: Use "%23.15G" format for all floating-
1123 * point keyvalues (15 significant digits).
1124 * WCSHDO_P16: Use "%24.16G" format for all floating-
1125 * point keyvalues (16 significant digits).
1126 * WCSHDO_P17: Use "%25.17G" format for all floating-
1127 * point keyvalues (17 significant digits).
1128 * If more than one of the above flags are set, the
1129 * highest number of significant digits prevails. In
1130 * addition, there is an anciliary flag:
1131 * WCSHDO_EFMT: Use "%E" format instead of the default
1132 * "%G" format above.
1133 * Note that excess trailing zeroes are stripped off the
1134 * fractional part with "%G" (which never occurs with
1135 * "%E"). Note also that the higher-precision options
1136 * eat into the keycomment area. In this regard,
1137 * WCSHDO_P14 causes minimal disruption with "%G" format,
1138 * while WCSHDO_P13 is appropriate with "%E".
1139 *
1140 * Given and returned:
1141 * wcs struct wcsprm*
1142 * Pointer to a wcsprm struct containing coordinate
1143 * transformation parameters. Will be initialized if
1144 * necessary.
1145 *
1146 * Returned:
1147 * nkeyrec int* Number of FITS header keyrecords returned in the
1148 * "header" array.
1149 *
1150 * header char** Pointer to an array of char holding the header.
1151 * Storage for the array is allocated by wcshdo() in
1152 * blocks of 2880 bytes (32 x 80-character keyrecords)
1153 * and must be freed by the user to avoid memory leaks.
1154 * See wcsdealloc().
1155 *
1156 * Each keyrecord is 80 characters long and is *NOT*
1157 * null-terminated, so the first keyrecord starts at
1158 * (*header)[0], the second at (*header)[80], etc.
1159 *
1160 * Function return value:
1161 * int Status return value (associated with wcs_errmsg[]):
1162 * 0: Success.
1163 * 1: Null wcsprm pointer passed.
1164 * 2: Memory allocation failed.
1165 * 3: Linear transformation matrix is singular.
1166 * 4: Inconsistent or unrecognized coordinate axis
1167 * types.
1168 * 5: Invalid parameter value.
1169 * 6: Invalid coordinate transformation parameters.
1170 * 7: Ill-conditioned coordinate transformation
1171 * parameters.
1172 *
1173 * For returns > 1, a detailed error message is set in
1174 * wcsprm::err if enabled, see wcserr_enable().
1175 *
1176 * Notes:
1177 * 1: wcshdo() interprets the "relax" argument as a vector of flag bits to
1178 * provide fine-grained control over what non-standard WCS keywords to
1179 * write. The flag bits are subject to change in future and should be set
1180 * by using the preprocessor macros (see below) for the purpose.
1181 *
1182 * - WCSHDO_none: Don't use any extensions.
1183 *
1184 * - WCSHDO_all: Write all recognized extensions, equivalent to setting
1185 * each flag bit.
1186 *
1187 * - WCSHDO_safe: Write all extensions that are considered to be safe and
1188 * recommended.
1189 *
1190 * - WCSHDO_DOBSn: Write DOBSn, the column-specific analogue of DATE-OBS
1191 * for use in binary tables and pixel lists. WCS Paper III
1192 * introduced DATE-AVG and DAVGn but by an oversight DOBSn (the
1193 * obvious analogy) was never formally defined by the standard.
1194 * The alternative to using DOBSn is to write DATE-OBS which
1195 * applies to the whole table. This usage is considered to be
1196 * safe and is recommended.
1197 *
1198 * - WCSHDO_TPCn_ka: WCS Paper I defined
1199 *
1200 * - TPn_ka and TCn_ka for pixel lists
1201 *
1202 * but WCS Paper II uses TPCn_ka in one example and subsequently
1203 * the errata for the WCS papers legitimized the use of
1204 *
1205 * - TPCn_ka and TCDn_ka for pixel lists
1206 *
1207 * provided that the keyword does not exceed eight characters.
1208 * This usage is considered to be safe and is recommended because
1209 * of the non-mnemonic terseness of the shorter forms.
1210 *
1211 * - WCSHDO_PVn_ma: WCS Paper I defined
1212 *
1213 * - iVn_ma and iSn_ma for bintables and
1214 * - TVn_ma and TSn_ma for pixel lists
1215 *
1216 * but WCS Paper II uses iPVn_ma and TPVn_ma in the examples and
1217 * subsequently the errata for the WCS papers legitimized the use
1218 * of
1219 *
1220 * - iPVn_ma and iPSn_ma for bintables and
1221 * - TPVn_ma and TPSn_ma for pixel lists
1222 *
1223 * provided that the keyword does not exceed eight characters.
1224 * This usage is considered to be safe and is recommended because
1225 * of the non-mnemonic terseness of the shorter forms.
1226 *
1227 * - WCSHDO_CRPXna: For historical reasons WCS Paper I defined
1228 *
1229 * - jCRPXn, iCDLTn, iCUNIn, iCTYPn, and iCRVLn for bintables and
1230 * - TCRPXn, TCDLTn, TCUNIn, TCTYPn, and TCRVLn for pixel lists
1231 *
1232 * for use without an alternate version specifier. However,
1233 * because of the eight-character keyword constraint, in order to
1234 * accommodate column numbers greater than 99 WCS Paper I also
1235 * defined
1236 *
1237 * - jCRPna, iCDEna, iCUNna, iCTYna and iCRVna for bintables and
1238 * - TCRPna, TCDEna, TCUNna, TCTYna and TCRVna for pixel lists
1239 *
1240 * for use with an alternate version specifier (the "a"). Like
1241 * the PC, CD, PV, and PS keywords there is an obvious tendency to
1242 * confuse these two forms for column numbers up to 99. It is
1243 * very unlikely that any parser would reject keywords in the
1244 * first set with a non-blank alternate version specifier so this
1245 * usage is considered to be safe and is recommended.
1246 *
1247 * - WCSHDO_CNAMna: WCS Papers I and III defined
1248 *
1249 * - iCNAna, iCRDna, and iCSYna for bintables and
1250 * - TCNAna, TCRDna, and TCSYna for pixel lists
1251 *
1252 * By analogy with the above, the long forms would be
1253 *
1254 * - iCNAMna, iCRDEna, and iCSYEna for bintables and
1255 * - TCNAMna, TCRDEna, and TCSYEna for pixel lists
1256 *
1257 * Note that these keywords provide auxiliary information only,
1258 * none of them are needed to compute world coordinates. This
1259 * usage is potentially unsafe and is not recommended at this
1260 * time.
1261 *
1262 * - WCSHDO_WCSNna: In light of wcsbth() note 4, write WCSNna instead of
1263 * TWCSna for pixel lists. While wcsbth() treats WCSNna and
1264 * TWCSna as equivalent, other parsers may not. Consequently,
1265 * this usage is potentially unsafe and is not recommended at this
1266 * time.
1267 *
1268 *
1269 * Global variable: const char *wcshdr_errmsg[] - Status return messages
1270 * ---------------------------------------------------------------------
1271 * Error messages to match the status value returned from each function.
1272 * Use wcs_errmsg[] for status returns from wcshdo().
1273 *
1274 *===========================================================================*/
1275
1276 #ifndef WCSLIB_WCSHDR
1277 #define WCSLIB_WCSHDR
1278
1279 #include "wcs.h"
1280
1281 #ifdef __cplusplus
1282 extern "C" {
1283 #endif
1284
1285 #define WCSHDR_none 0x00000000
1286 #define WCSHDR_all 0x000FFFFF
1287 #define WCSHDR_reject 0x10000000
1288 #define WCSHDR_strict 0x20000000
1289
1290 #define WCSHDR_CROTAia 0x00000001
1291 #define WCSHDR_VELREFa 0x00000002
1292 #define WCSHDR_CD00i00j 0x00000004
1293 #define WCSHDR_PC00i00j 0x00000008
1294 #define WCSHDR_PROJPn 0x00000010
1295 #define WCSHDR_CD0i_0ja 0x00000020
1296 #define WCSHDR_PC0i_0ja 0x00000040
1297 #define WCSHDR_PV0i_0ma 0x00000080
1298 #define WCSHDR_PS0i_0ma 0x00000100
1299 #define WCSHDR_DOBSn 0x00000200
1300 #define WCSHDR_OBSGLBHn 0x00000400
1301 #define WCSHDR_RADECSYS 0x00000800
1302 #define WCSHDR_EPOCHa 0x00001000
1303 #define WCSHDR_VSOURCE 0x00002000
1304 #define WCSHDR_DATEREF 0x00004000
1305 #define WCSHDR_LONGKEY 0x00008000
1306 #define WCSHDR_CNAMn 0x00010000
1307 #define WCSHDR_AUXIMG 0x00020000
1308 #define WCSHDR_ALLIMG 0x00040000
1309
1310 #define WCSHDR_IMGHEAD 0x00100000
1311 #define WCSHDR_BIMGARR 0x00200000
1312 #define WCSHDR_PIXLIST 0x00400000
1313
1314 #define WCSHDO_none 0x00000
1315 #define WCSHDO_all 0x000FF
1316 #define WCSHDO_safe 0x0000F
1317 #define WCSHDO_DOBSn 0x00001
1318 #define WCSHDO_TPCn_ka 0x00002
1319 #define WCSHDO_PVn_ma 0x00004
1320 #define WCSHDO_CRPXna 0x00008
1321 #define WCSHDO_CNAMna 0x00010
1322 #define WCSHDO_WCSNna 0x00020
1323 #define WCSHDO_P12 0x01000
1324 #define WCSHDO_P13 0x02000
1325 #define WCSHDO_P14 0x04000
1326 #define WCSHDO_P15 0x08000
1327 #define WCSHDO_P16 0x10000
1328 #define WCSHDO_P17 0x20000
1329 #define WCSHDO_EFMT 0x40000
1330
1331
1332 extern const char *wcshdr_errmsg[];
1333
1334 enum wcshdr_errmsg_enum {
1335 WCSHDRERR_SUCCESS = 0, // Success.
1336 WCSHDRERR_NULL_POINTER = 1, // Null wcsprm pointer passed.
1337 WCSHDRERR_MEMORY = 2, // Memory allocation failed.
1338 WCSHDRERR_BAD_COLUMN = 3, // Invalid column selection.
1339 WCSHDRERR_PARSER = 4, // Fatal error returned by Flex
1340 // parser.
1341 WCSHDRERR_BAD_TABULAR_PARAMS = 5 // Invalid tabular parameters.
1342 };
1343
1344 int wcspih(char *header, int nkeyrec, int relax, int ctrl, int *nreject,
1345 int *nwcs, struct wcsprm **wcs);
1346
1347 int wcsbth(char *header, int nkeyrec, int relax, int ctrl, int keysel,
1348 int *colsel, int *nreject, int *nwcs, struct wcsprm **wcs);
1349
1350 int wcstab(struct wcsprm *wcs);
1351
1352 int wcsidx(int nwcs, struct wcsprm **wcs, int alts[27]);
1353
1354 int wcsbdx(int nwcs, struct wcsprm **wcs, int type, short alts[1000][28]);
1355
1356 int wcsvfree(int *nwcs, struct wcsprm **wcs);
1357
1358 int wcshdo(int ctrl, struct wcsprm *wcs, int *nkeyrec, char **header);
1359
1360
1361 #ifdef __cplusplus
1362 }
1363 #endif
1364
1365 #endif // WCSLIB_WCSHDR
wcsprm
Coordinate transformation parameters.
Definition: wcs.h:2044
wcs.h
wcshdr_errmsg
const char * wcshdr_errmsg[]
Status return messages.
wcsbdx
int wcsbdx(int nwcs, struct wcsprm **wcs, int type, short alts[1000][28])
Index alternate coordinate representions.
wcsvfree
int wcsvfree(int *nwcs, struct wcsprm **wcs)
Free the array of wcsprm structs.
wcsidx
int wcsidx(int nwcs, struct wcsprm **wcs, int alts[27])
Index alternate coordinate representations.
wcstab
int wcstab(struct wcsprm *wcs)
Tabular construction routine.
wcspih
int wcspih(char *header, int nkeyrec, int relax, int ctrl, int *nreject, int *nwcs, struct wcsprm **wcs)
FITS WCS parser routine for image headers.
wcshdo
int wcshdo(int ctrl, struct wcsprm *wcs, int *nkeyrec, char **header)
Write out a wcsprm struct as a FITS header.
wcsbth
int wcsbth(char *header, int nkeyrec, int relax, int ctrl, int keysel, int *colsel, int *nreject, int *nwcs, struct wcsprm **wcs)
FITS WCS parser routine for binary table and image headers.
wcshdr_errmsg_enum
wcshdr_errmsg_enum
Definition: wcshdr.h:1334
WCSHDRERR_MEMORY
@ WCSHDRERR_MEMORY
Definition: wcshdr.h:1337
WCSHDRERR_BAD_COLUMN
@ WCSHDRERR_BAD_COLUMN
Definition: wcshdr.h:1338
WCSHDRERR_PARSER
@ WCSHDRERR_PARSER
Definition: wcshdr.h:1339
WCSHDRERR_NULL_POINTER
@ WCSHDRERR_NULL_POINTER
Definition: wcshdr.h:1336
WCSHDRERR_SUCCESS
@ WCSHDRERR_SUCCESS
Definition: wcshdr.h:1335
WCSHDRERR_BAD_TABULAR_PARAMS
@ WCSHDRERR_BAD_TABULAR_PARAMS
Definition: wcshdr.h:1341