View Javadoc
1   package nom.tam.fits.header;
2   
3   /*-
4    * #%L
5    * nom.tam.fits
6    * %%
7    * Copyright (C) 1996 - 2024 nom-tam-fits
8    * %%
9    * This is free and unencumbered software released into the public domain.
10   * 
11   * Anyone is free to copy, modify, publish, use, compile, sell, or
12   * distribute this software, either in source code form or as a compiled
13   * binary, for any purpose, commercial or non-commercial, and by any
14   * means.
15   * 
16   * In jurisdictions that recognize copyright laws, the author or authors
17   * of this software dedicate any and all copyright interest in the
18   * software to the public domain. We make this dedication for the benefit
19   * of the public at large and to the detriment of our heirs and
20   * successors. We intend this dedication to be an overt act of
21   * relinquishment in perpetuity of all present and future rights to this
22   * software under copyright law.
23   * 
24   * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
25   * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
26   * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
27   * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
28   * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
29   * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
30   * OTHER DEALINGS IN THE SOFTWARE.
31   * #L%
32   */
33  
34  /**
35   * Standard FITS keywords for defining world coordinate systems (WCS). Many (but not all) keywords listed here support
36   * alternative coordinate systems. These have a lower case 'a' at the end of their enum names, e.g.
37   * <code>WCSNAMEa</code>. The alternative coordinate system for these can be set via the {@link #alt(char)} method.
38   * 
39   * @author Attila Kovacs
40   * 
41   * @see    DateTime
42   * 
43   * @since  1.19
44   */
45  public enum WCS implements IFitsHeader {
46  
47      /**
48       * World coordinate system name
49       * 
50       * @since 1.19
51       */
52      WCSNAMEa(SOURCE.RESERVED, HDU.IMAGE, VALUE.STRING, "coordinate system name"),
53  
54      /**
55       * Dimensionality of image coordinate system
56       * 
57       * @since 1.19
58       */
59      WCSAXESa(SOURCE.RESERVED, HDU.IMAGE, VALUE.INTEGER, "coordinate dimensions"),
60  
61      /**
62       * Coordinate reference frame of major/minor axes.If absent the default value is 'FK5'.
63       * 
64       * @since 1.19
65       */
66      RADESYSa(SOURCE.RESERVED, HDU.IMAGE, VALUE.STRING, "celestial coordinate reference frame."),
67  
68      /**
69       * Coordinate reference frame of major/minor axes (generic).
70       *
71       * @deprecated Deprecated in the current FITS standard, use {@link #RADESYSa} instead.
72       */
73      RADECSYS(SOURCE.RESERVED, HDU.ANY, VALUE.STRING, "celestial coordinate reference frame."),
74  
75      /**
76       * [deg] The longitude of the celestial pole (for spherical coordinates).
77       * 
78       * @since 1.19
79       */
80      LONPOLEa(SOURCE.RESERVED, HDU.IMAGE, VALUE.REAL, "[deg] celestial pole longitude"),
81  
82      /**
83       * [deg] The latitude of the celestial pole (for spherical coordinates).
84       * 
85       * @since 1.19
86       */
87      LATPOLEa(SOURCE.RESERVED, HDU.IMAGE, VALUE.REAL, "[deg] celestial pole latitude"),
88  
89      /**
90       * The value field shall contain a floating point number giving the equinox in years for the celestial coordinate
91       * system in which positions are expressed. Starting with Version 1, the Standard has deprecated the use of the
92       * EPOCH keyword and thus it shall not be used in FITS files created after the adoption of the standard; rather, the
93       * EQUINOX keyword shall be used.
94       *
95       * @deprecated Deprecated in the current FITS standard, use {@link #EQUINOXa} instead.
96       */
97      @Deprecated
98      EPOCH(SOURCE.RESERVED, HDU.ANY, VALUE.REAL, "[yr] equinox of celestial coordinate system"),
99  
100     /**
101      * The value field shall contain a floating point number giving the equinox in years for the celestial coordinate
102      * system in which positions are expressed.
103      * 
104      * @since 1.19
105      */
106     EQUINOXa(SOURCE.RESERVED, HDU.IMAGE, VALUE.REAL, "[yr] equinox of celestial coordinate system"),
107 
108     /**
109      * Coordinate axis name.
110      * 
111      * @since 1.19
112      */
113     CNAMEna(SOURCE.RESERVED, HDU.IMAGE, VALUE.STRING, "coordinate system display name"),
114 
115     /**
116      * The value field shall contain a floating point number, identifying the location of a reference point along axis
117      * n, in units of the axis index. This value is based upon a counter that runs from 1 to NAXISn with an increment of
118      * 1 per pixel. The reference point value need not be that for the center of a pixel nor lie within the actual data
119      * array. Use comments to indicate the location of the index point relative to the pixel.
120      * 
121      * @since 1.19
122      */
123     CRPIXna(SOURCE.RESERVED, HDU.IMAGE, VALUE.REAL, "coordinate axis reference pixel"),
124 
125     /**
126      * The value field shall contain a floating point number, giving the value of the coordinate specified by the CTYPEn
127      * keyword at the reference point CRPIXn. Units must follow the prescriptions of section 5.3 of the FITS Standard.
128      * 
129      * @since 1.19
130      */
131     CRVALna(SOURCE.RESERVED, HDU.IMAGE, VALUE.REAL, "coordinate axis value at reference pixel"),
132 
133     /**
134      * The value field shall contain a character string, giving the name of the coordinate represented by axis n.
135      * 
136      * @since 1.19
137      */
138     CTYPEna(SOURCE.RESERVED, HDU.IMAGE, VALUE.STRING, "name of the coordinate axis"),
139 
140     /**
141      * The value field shall contain a floating point number giving the partial derivative of the coordinate specified
142      * by the CTYPEn keywords with respect to the pixel index, evaluated at the reference point CRPIXn, in units of the
143      * coordinate specified by the CTYPEn keyword. These units must follow the prescriptions of section 5.3 of the FITS
144      * Standard.
145      * 
146      * @since 1.19
147      */
148     CDELTna(SOURCE.RESERVED, HDU.IMAGE, VALUE.REAL, "coordinate spacing along axis"),
149 
150     /**
151      * Random coordinate error on axis <i>n</i> in the physical coordinate unit (if defined).
152      * 
153      * @since 1.19
154      */
155     CRDERna(SOURCE.RESERVED, HDU.IMAGE, VALUE.REAL, "random error in coordinate"),
156 
157     /**
158      * Systematic coordinate error on axis <i>n</i> in the physical coordinate unit (if defined).
159      * 
160      * @since 1.19
161      */
162     CSYERna(SOURCE.RESERVED, HDU.IMAGE, VALUE.REAL, "systematic error in coordinate"),
163 
164     /**
165      * Phase axis zero point
166      * 
167      * @since 1.19
168      */
169     CZPHSna(SOURCE.RESERVED, HDU.IMAGE, VALUE.REAL, "phase axis zero point"),
170 
171     /**
172      * Phase axis period
173      */
174     CPERIna(SOURCE.RESERVED, HDU.IMAGE, VALUE.REAL, "phase axis period"),
175 
176     /**
177      * [Hz] Rest frequency of observed spectral line.
178      * 
179      * @since 1.19
180      */
181     RESTFRQa(SOURCE.RESERVED, HDU.IMAGE, VALUE.REAL, "[Hz] line rest frequency"),
182 
183     /**
184      * [Hz] Rest frequeny of observed spectral line (generic).
185      *
186      * @deprecated Deprecated in the current FITS standard, use {@link #RESTFRQa} instead.
187      */
188     RESTFREQ(SOURCE.RESERVED, HDU.ANY, VALUE.REAL, "[Hz] observed line rest frequency"),
189 
190     /**
191      * [m] Rest wavelength of observed spectral line in image.
192      * 
193      * @since 1.19
194      */
195     RESTWAVa(SOURCE.RESERVED, HDU.IMAGE, VALUE.REAL, "[m] line rest wavelength"),
196 
197     /**
198      * Image spectral reference system name.
199      * 
200      * @since 1.19
201      */
202     SPECSYSa(SOURCE.RESERVED, HDU.IMAGE, VALUE.STRING, "spectral reference frame"),
203 
204     /**
205      * Image spectral reference system name of observer.
206      * 
207      * @since 1.19
208      */
209     SSYSOBSa(SOURCE.RESERVED, HDU.IMAGE, VALUE.STRING, "spectral reference frame of observer"),
210 
211     /**
212      * Spectral reference system name of source.
213      * 
214      * @since 1.19
215      */
216     SSYSSRCa(SOURCE.RESERVED, HDU.IMAGE, VALUE.STRING, "spectral reference frame of source"),
217 
218     /**
219      * [m/s] Radial velocity of source in the spectral reference frame.
220      * 
221      * @since 1.19
222      */
223     VELOSYSa(SOURCE.RESERVED, HDU.IMAGE, VALUE.REAL, "[m/s] source radial velocity"),
224 
225     /**
226      * Redshift value of source in the spectral reference frame.
227      * 
228      * @since 1.19
229      */
230     ZSOURCEa(SOURCE.RESERVED, HDU.IMAGE, VALUE.REAL, "source redshift value"),
231 
232     /**
233      * [deg] True velocity angle of source
234      * 
235      * @since 1.19
236      */
237     VELANGLa(SOURCE.RESERVED, HDU.IMAGE, VALUE.REAL, "[deg] true velocity angle"),
238 
239     /**
240      * [m] Geodetic location of observer (<i>x</i> coordinate).
241      * 
242      * @since 1.19
243      */
244     OBSGEO_X("OBSGEO-X", SOURCE.RESERVED, HDU.ANY, VALUE.REAL, "[m] geodetic location x of observer"),
245 
246     /**
247      * [m] Geodetic location of observer (<i>y</i> coordinate).
248      * 
249      * @since 1.19
250      */
251     OBSGEO_Y("OBSGEO-Y", SOURCE.RESERVED, HDU.ANY, VALUE.REAL, "[m] geodetic location y of observer"),
252 
253     /**
254      * [m] Geodetic location of observer (<i>z</i> coordinate).
255      * 
256      * @since 1.19
257      */
258     OBSGEO_Z("OBSGEO-Z", SOURCE.RESERVED, HDU.ANY, VALUE.REAL, "[m] geodetic location z of observer"),
259 
260     /**
261      * WCS name for the array entries in the given column index.
262      * 
263      * @since 1.19
264      */
265     WCSNna(SOURCE.RESERVED, HDU.TABLE, VALUE.STRING, "column coordinate syste name"),
266 
267     /**
268      * [deg] The longitude of the celestial pole for the entries in the given column index (for spherical coordinates).
269      * 
270      * @since 1.19
271      */
272     LONPna(SOURCE.RESERVED, HDU.TABLE, VALUE.REAL, "[deg] column celestial pole longitude"),
273 
274     /**
275      * [deg] The latitude of the celestial pole for the entries in the given column index (for spherical coordinates).
276      * 
277      * @since 1.19
278      */
279     LATPna(SOURCE.RESERVED, HDU.TABLE, VALUE.REAL, "[deg] column celestial pole latitude"),
280 
281     /**
282      * [yr] Coordinate epoch for which the celestial coorinate system is defined for the given column index.
283      * 
284      * @since 1.19
285      */
286     EQUIna(SOURCE.RESERVED, HDU.TABLE, VALUE.REAL, "[yr] column coordinate epoch"),
287 
288     /**
289      * The equatorial coordinate frame used for the given column index, e.g. 'FK4', 'FK5', or 'ICRS'.
290      * 
291      * @since 1.19
292      */
293     RADEna(SOURCE.RESERVED, HDU.TABLE, VALUE.STRING, "column equatorial coordinate frame"),
294 
295     /**
296      * [Hz] The rest frequency of the line in the given column index.
297      * 
298      * @since 1.19
299      */
300     RFRQna(SOURCE.RESERVED, HDU.TABLE, VALUE.REAL, "[Hz] line rest frequency in column"),
301 
302     /**
303      * [Hz] The rest wavelength of the line in the given column index.
304      * 
305      * @since 1.19
306      */
307     RWAVna(SOURCE.RESERVED, HDU.TABLE, VALUE.REAL, "[m] line rest wavelength in column"),
308 
309     /**
310      * Spectral reference frame for the given column index.
311      * 
312      * @since 1.19
313      */
314     SPECna(SOURCE.RESERVED, HDU.TABLE, VALUE.STRING, "column spectral reference frame"),
315 
316     /**
317      * Spectral reference system of observer for the given column index.
318      * 
319      * @since 1.19
320      */
321     SOBSna(SOURCE.RESERVED, HDU.TABLE, VALUE.STRING, "column observer spectral frame"),
322 
323     /**
324      * Spectral reference system of source for the given column index.
325      * 
326      * @since 1.19
327      */
328     SSRCna(SOURCE.RESERVED, HDU.TABLE, VALUE.STRING, "column source spectral frame"),
329 
330     /**
331      * [m/s] Source radial velocity for the given column index.
332      * 
333      * @since 1.19
334      */
335     VSYSna(SOURCE.RESERVED, HDU.TABLE, VALUE.REAL, "[m/s] column radial velocity"),
336 
337     /**
338      * [deg] Angle of true velocity for the given column index.
339      * 
340      * @since 1.19
341      */
342     VANGna(SOURCE.RESERVED, HDU.TABLE, VALUE.REAL, "[deg] angle of velocity in column"),
343 
344     /**
345      * Source redshift value for the given column index.
346      * 
347      * @since 1.19
348      */
349     ZSOUna(SOURCE.RESERVED, HDU.TABLE, VALUE.REAL, "column redshift value"),
350 
351     /**
352      * [m] Geodetic location (<i>x</i> coordinate) of observer for he given column index.
353      * 
354      * @since 1.19
355      */
356     OBSGXn(SOURCE.RESERVED, HDU.TABLE, VALUE.REAL, "[m] column geodetic location x"),
357 
358     /**
359      * [m] Geodetic location (<i>y</i> coordinate) of observer for he given column index.
360      * 
361      * @since 1.19
362      */
363     OBSGYn(SOURCE.RESERVED, HDU.TABLE, VALUE.REAL, "[m] column geodetic location y"),
364 
365     /**
366      * [m] Geodetic location (<i>z</i> coordinate) of observer for he given column index.
367      * 
368      * @since 1.19
369      */
370     OBSGZn(SOURCE.RESERVED, HDU.TABLE, VALUE.REAL, "[m] column geodetic location z"),
371 
372     /**
373      * The coordinate axis type for array entries in this column (trailing index). The number of coordinate axes
374      * (leading index) defined this way should match the dimensionality of the array elements in the column. This
375      * version does not support alternative coordinates systems.
376      * 
377      * @see   #nCTYna
378      * 
379      * @since 1.19
380      */
381     nCTYPn(SOURCE.RESERVED, HDU.TABLE, VALUE.STRING, "column coordinate axis type"),
382 
383     /**
384      * The coordinate axis type for array entries in this column (trailing index). The number of coordinate axes
385      * (leading index) defined this way should match the dimensionality of the array elements in the column. This
386      * version supports alternative coordinates systems.
387      * 
388      * @see   #nCTYPn
389      * 
390      * @since 1.19
391      */
392     nCTYna(SOURCE.RESERVED, HDU.TABLE, VALUE.STRING, "column coordinate axis type"),
393 
394     /**
395      * The coordinate axis name for array entries in this column (trailing index). The number of coordinate axes
396      * (leading index) defined this way should match the dimensionality of the array elements in the column.
397      * 
398      * @since 1.19
399      */
400     nCNAna(SOURCE.RESERVED, HDU.TABLE, VALUE.STRING, "column coordinate axis type"),
401 
402     /**
403      * The physical coordinate unit for array entries in this column (trailing index). The number of coordinate axes
404      * (leading index) defined this way should match the dimensionality of the array elements in the column. This
405      * version does not support alternative coordinates systems.
406      * 
407      * @see   #nCUNna
408      * 
409      * @since 1.19
410      */
411     nCUNIn(SOURCE.RESERVED, HDU.TABLE, VALUE.STRING, "column coordinate axis unit"),
412 
413     /**
414      * The physical coordinate unit for array entries in this column (trailing index). The number of coordinate axes
415      * (leading index) defined this way should match the dimensionality of the array elements in the column. This
416      * version supports alternative coordinates systems.
417      * 
418      * @see   #nCUNIn
419      * 
420      * @since 1.19
421      */
422     nCUNna(SOURCE.RESERVED, HDU.TABLE, VALUE.STRING, "column coordinate axis unit"),
423 
424     /**
425      * The coordinate reference value in the physical unit of the axis (if defined) for array entries in this column
426      * (trailing index). The number of coordinate axes (leading index) defined this way should match the dimensionality
427      * of the array elements in the column. This version does not support alternative coordinates systems.
428      * 
429      * @see   #nCRVna
430      * 
431      * @since 1.19
432      */
433     nCRVLn(SOURCE.RESERVED, HDU.TABLE, VALUE.REAL, "column coordinate axis reference value"),
434 
435     /**
436      * The coordinate reference value in the physical unit of the axis (if defined) for array entries in this column
437      * (trailing index). The number of coordinate axes (leading index) defined this way should match the dimensionality
438      * of the array elements in the column. This version supports alternative coordinates systems.
439      * 
440      * @see   #nCRVLn
441      * 
442      * @since 1.19
443      */
444     nCRVna(SOURCE.RESERVED, HDU.TABLE, VALUE.REAL, "column coordinate axis reference value"),
445 
446     /**
447      * The coordinate axis random error in the physical unit of the axis (if defined) for array entries in this column
448      * (trailing index). The number of coordinate axes (leading index) defined this way should match the dimensionality
449      * of the array elements in the column.
450      * 
451      * @since 1.19
452      */
453     nCRDna(SOURCE.RESERVED, HDU.TABLE, VALUE.REAL, "column coordinate axis random error"),
454 
455     /**
456      * The coordinate axis systematic error in the physical unit of the axis (if defined) for array entries in this
457      * column (trailing index). The number of coordinate axes (leading index) defined this way should match the
458      * dimensionality of the array elements in the column.
459      * 
460      * @since 1.19
461      */
462     nCSYna(SOURCE.RESERVED, HDU.TABLE, VALUE.REAL, "column coordinate axis systematic error"),
463 
464     /**
465      * Phase axis zero point on axis (leading index) for array entries in this column (trailing index)
466      * 
467      * @since 1.19
468      */
469     nCZPna(SOURCE.RESERVED, HDU.TABLE, VALUE.REAL, "phase axis zero point"),
470 
471     /**
472      * Phase axis period on axis (leading index) for array entries in this column (trailing index)
473      * 
474      * @since 1.19
475      */
476     nCPRna(SOURCE.RESERVED, HDU.TABLE, VALUE.REAL, "phase axis period"),
477 
478     /**
479      * The coordinate axis spacing in the physical unit of the axis (if defined) for array entries in this column
480      * (trailing index). The number of coordinate axes (leading index) defined this way should match the dimensionality
481      * of the array elements in the column. This version does not support alternative coordinates systems.
482      * 
483      * @see   #nCDEna
484      * 
485      * @since 1.19
486      */
487     nCDLTn(SOURCE.RESERVED, HDU.TABLE, VALUE.REAL, "column coordinate axis spacing"),
488 
489     /**
490      * The coordinate axis spacing in the physical unit of the axis (if defined) for array entries in this column
491      * (trailing index). The number of coordinate axes (leading index) defined this way should match the dimensionality
492      * of the array elements in the column. This version supports alternative coordinates systems.
493      * 
494      * @see   #nCDLTn
495      * 
496      * @since 1.19
497      */
498     nCDEna(SOURCE.RESERVED, HDU.TABLE, VALUE.REAL, "column coordinate axis spacing"),
499 
500     /**
501      * The 1-based coordinate reference pixel index in the physical unit of the axis (if defined) for array entries in
502      * this column (trailing index). The number of coordinate axes (leading index) defined this way should match the
503      * dimensionality of the array elements in the column. This version does not support alternative coordinates
504      * systems.
505      * 
506      * @see   #nCRPna
507      * 
508      * @since 1.19
509      */
510     nCRPXn(SOURCE.RESERVED, HDU.TABLE, VALUE.REAL, "column coordinate axis reference pixel"),
511 
512     /**
513      * The 1-based coordinate reference pixel index in the physical unit of the axis (if defined) for array entries in
514      * this column (trailing index). The number of coordinate axes (leading index) defined this way should match the
515      * dimensionality of the array elements in the column. This version supports alternative coordinates systems.
516      * 
517      * @see   #nCRPXn
518      * 
519      * @since 1.19
520      */
521     nCRPna(SOURCE.RESERVED, HDU.TABLE, VALUE.REAL, "column coordinate axis reference pixel"),
522 
523     /**
524      * @deprecated The FITS standard deprecated this keyword. Use {@link WCS#nnPCna} and {@link WCS#nnCDna}instead.
525      *                 [deg] The coordinate axis rotation in the physical unit of the axis (if defined) for array
526      *                 entries in this column (trailing index). The number of coordinate axes (leading index) defined
527      *                 this way should match the dimensionality of the array elements in the column.
528      * 
529      * @since      1.19
530      */
531     nCROTn(SOURCE.RESERVED, HDU.TABLE, VALUE.REAL, "[deg] column coordinate axis rotation"),
532 
533     /**
534      * Coordinate transformation matrix in the PC convention. from rectilinear coordinate index <i>i</i> (leading index)
535      * to coordinate index <i>j</i> (second index) for the for array entries in this column (trailing index). The number
536      * of coordinate axes (leading index) defined this way should match the dimensionality of the array elements in the
537      * column.
538      * 
539      * @since 1.19
540      */
541     nnPCna(SOURCE.RESERVED, HDU.TABLE, VALUE.REAL, "column coord. trans. matrix element"),
542 
543     /**
544      * Coordinate transformation matrix in the CD convention. from rectilinear coordinate index <i>i</i> (leading index)
545      * to coordinate index <i>j</i> (second index) for the for array entries in this column (trailing index). The number
546      * of coordinate axes (leading index) defined this way should match the dimensionality of the array elements in the
547      * column.
548      * 
549      * @since 1.19
550      */
551     nnCDna(SOURCE.RESERVED, HDU.TABLE, VALUE.REAL, "column coord. trans. matrix element"),
552 
553     /**
554      * The coordinate string parameter <i>m</i> (trailing index) for axis <i>i</i> (leading index) for array entries in
555      * this column (middle index). The number of coordinate axes (leading index) defined this way should match the
556      * dimensionality of the array elements in the column. The shorter {@link #nSn_na} form may be required for column
557      * indices &gt;99 with alternate coordinate systems.
558      * 
559      * @since 1.19
560      */
561     nPSn_na(SOURCE.RESERVED, HDU.TABLE, VALUE.STRING, "column axis parameter name"),
562 
563     /**
564      * The coordinate string parameter <i>m</i> (trailing index) for axis <i>i</i> (leading index) for array entries in
565      * this column (middle index). The number of coordinate axes (leading index) defined this way should match the
566      * dimensionality of the array elements in the column. Same as {@link #nPSn_na}. This shorter form may be required
567      * for column indices &gt;99 with alternate coordinate systems.
568      * 
569      * @since 1.19
570      */
571     nSn_na(SOURCE.RESERVED, HDU.TABLE, VALUE.STRING, "column axis parameter name"),
572 
573     /**
574      * The coordinate parameter value <i>m</i> (trailing index) for axis <i>i</i> (leading index) for array entries in
575      * this column (middle index). The number of coordinateaxes defined this way should match the dimensionality of the
576      * array elements in the column. The shorter {@link #nVn_na} form may be required for column indices &gt;99 with
577      * alternate coordinate systems.
578      * 
579      * @since 1.19
580      */
581     nPVn_na(SOURCE.RESERVED, HDU.TABLE, VALUE.REAL, "column axis parameter value"),
582 
583     /**
584      * The coordinate parameter value <i>m</i> (trailing index) for axis <i>i</i> (leading index) for array entries in
585      * this column (middle index). The number of coordinateaxes defined this way should match the dimensionality of the
586      * array elements in the column. Same as {@link #nPVn_na}. This shorter form may be required for column indices
587      * &gt;99 with alternate coordinate systems.
588      * 
589      * @since 1.19
590      */
591     nVn_na(SOURCE.RESERVED, HDU.TABLE, VALUE.REAL, "column axis parameter value"),
592 
593     /**
594      * The coordinate parameter array for axis <i>i</i> (leading index) in this column (middle index). The number of
595      * coordinate axes defined this way should match the dimensionality of the array elements in the column.
596      * 
597      * @since 1.19
598      */
599     nVn_Xa(SOURCE.RESERVED, HDU.TABLE, VALUE.REAL, "column parameter array"),
600 
601     /**
602      * WCS name for the pixe list entries in the given column index. Same as {@link #TWCSna}. This shorter form may be
603      * required for column indices &gt;99 with alternate coordinate systems.
604      * 
605      * @since 1.19
606      */
607     WCSna(SOURCE.RESERVED, HDU.TABLE, VALUE.STRING, "column WCS name"),
608 
609     /**
610      * WCS name for the pixe list entries in the given column index. The shorter form {@link #WCSna} may be required for
611      * column indices &gt;99 with alternate coordinate systems.
612      * 
613      * @since 1.19
614      */
615     TWCSna(SOURCE.RESERVED, HDU.TABLE, VALUE.STRING, "column WCS name"),
616 
617     /**
618      * WCS dimensions for given column index.
619      * 
620      * @since 1.19
621      */
622     WCAXna(SOURCE.RESERVED, HDU.TABLE, VALUE.INTEGER, "column coordinate dimensions"),
623 
624     /**
625      * The coordinate axis type for (1D) pixel lists in this column (trailing index). This version does not support
626      * alternative coordinates systems.
627      * 
628      * @see   #TCTYna
629      * 
630      * @since 1.19
631      */
632     TCTYPn(SOURCE.RESERVED, HDU.TABLE, VALUE.STRING, "column pixel axis type"),
633 
634     /**
635      * The coordinate axis type for (1D) pixel lists in this column (trailing index). This version supports alternative
636      * coordinates systems.
637      * 
638      * @see   #TCTYPn
639      * 
640      * @since 1.19
641      */
642     TCTYna(SOURCE.RESERVED, HDU.TABLE, VALUE.STRING, "column pixel axis type"),
643 
644     /**
645      * The coordinate axis name for (1D) pixel lists in this column (trailing index).
646      * 
647      * @since 1.19
648      */
649     TCNAna(SOURCE.RESERVED, HDU.TABLE, VALUE.STRING, "column pixel axis name"),
650 
651     /**
652      * The physical coordinate unit for (1D) pixel lists in this column (trailing index). This version does not support
653      * alternative coordinates systems.
654      * 
655      * @see   #TCUNna
656      * 
657      * @since 1.19
658      */
659     TCUNIn(SOURCE.RESERVED, HDU.TABLE, VALUE.STRING, "column pixel axis unit"),
660 
661     /**
662      * The physical coordinate unit for (1D) pixel lists in this column (trailing index). This version supports
663      * alternative coordinates systems.
664      * 
665      * @see   #TCUNIn
666      * 
667      * @since 1.19
668      */
669     TCUNna(SOURCE.RESERVED, HDU.TABLE, VALUE.STRING, "column pixel axis unit"),
670 
671     /**
672      * The coordinate reference value in the physical unit of the axis (if defined) for the (1D) pixel lists in this
673      * column (trailing index). This version does not support alternative coordinates systems.
674      * 
675      * @see   #TCRVna
676      * 
677      * @since 1.19
678      */
679     TCRVLn(SOURCE.RESERVED, HDU.TABLE, VALUE.REAL, "column pixel axis reference value"),
680 
681     /**
682      * The coordinate reference value in the physical unit of the axis (if defined) for the (1D) pixel lists in this
683      * column (trailing index). This version supports alternative coordinates systems.
684      * 
685      * @see   #TCRVLn
686      * 
687      * @since 1.19
688      */
689     TCRVna(SOURCE.RESERVED, HDU.TABLE, VALUE.REAL, "column pixel axis reference value"),
690 
691     /**
692      * The coordinate axis spacing in the physical unit of the axis (if defined) for the (1D_) pixel lists in this
693      * column (trailing index). This version does not support alternative coordinates systems.
694      * 
695      * @see   #TCDEna
696      * 
697      * @since 1.19
698      */
699     TCDLTn(SOURCE.RESERVED, HDU.TABLE, VALUE.REAL, "column pixel axis spacing"),
700 
701     /**
702      * The coordinate axis spacing in the physical unit of the axis (if defined) for the (1D_) pixel lists in this
703      * column (trailing index). This version supports alternative coordinates systems.
704      * 
705      * @see   #TCDLTn
706      * 
707      * @since 1.19
708      */
709     TCDEna(SOURCE.RESERVED, HDU.TABLE, VALUE.REAL, "column pixel axis spacing"),
710 
711     /**
712      * The coordinate axis random error in the physical unit of the axis (if defined) for the (1D_) pixel lists in this
713      * column (trailing index).
714      * 
715      * @since 1.19
716      */
717     TCRDna(SOURCE.RESERVED, HDU.TABLE, VALUE.REAL, "column pixel axis random error"),
718 
719     /**
720      * The coordinate axis systematics error in the physical unit of the axis (if defined) for the (1D_) pixel lists in
721      * this column (trailing index).
722      * 
723      * @since 1.19
724      */
725     TCSYna(SOURCE.RESERVED, HDU.TABLE, VALUE.REAL, "column pixel axis random error"),
726 
727     /**
728      * Phase axis zero point on axis (leading index) for array entries in this column (trailing index)
729      * 
730      * @since 1.19
731      */
732     TCZPna(SOURCE.RESERVED, HDU.TABLE, VALUE.REAL, "phase axis zero point"),
733 
734     /**
735      * Phase axis period on axis (leading index) for array entries in this column (trailing index)
736      * 
737      * @since 1.19
738      */
739     TCPRna(SOURCE.RESERVED, HDU.TABLE, VALUE.REAL, "phase axis period"),
740 
741     /**
742      * The 1-based coordinate reference pixel index in the physical unit of the axis (if defined) for the (1D) pixel
743      * lists in this column (trailing index). This version does not support alternative coordinates systems.
744      * 
745      * @see   #TCRPna
746      * 
747      * @since 1.19
748      */
749     TCRPXn(SOURCE.RESERVED, HDU.TABLE, VALUE.REAL, "column pixel axis reference pixel"),
750 
751     /**
752      * The 1-based coordinate reference pixel index in the physical unit of the axis (if defined) for the (1D) pixel
753      * lists in this column (trailing index). This version supports alternative coordinates systems.
754      * 
755      * @see   #TCRPXn
756      * 
757      * @since 1.19
758      */
759     TCRPna(SOURCE.RESERVED, HDU.TABLE, VALUE.REAL, "column pixel axis reference pixel"),
760 
761     /**
762      * Coordinate transformation matrix in the PC convention. from column index <i>n</i> (leading index) to column index
763      * <i>k</i> (second index) for the for the (1D) pixel lists in this column. The shorter form {@link #TPn_na} may be
764      * required for column indices &gt;99 with alternate coordinate systems.
765      * 
766      * @see   #TPn_na
767      * 
768      * @since 1.19
769      */
770     TPCn_na(SOURCE.RESERVED, HDU.TABLE, VALUE.REAL, "column pix trans. matrix element"),
771 
772     /**
773      * Coordinate transformation matrix in the PC convention. from column index <i>n</i> (leading index) to column index
774      * <i>k</i> (second index) for the for the (1D) pixel lists in this column. Same as {@link #TPCn_na}. This shorter
775      * form may be required for column indices &gt;99 with alternate coordinate systems.
776      * 
777      * @see   #TPCn_na
778      * 
779      * @since 1.19
780      */
781     TPn_na(SOURCE.RESERVED, HDU.TABLE, VALUE.REAL, "column pix trans. matrix element"),
782 
783     /**
784      * @deprecated The FITS standard deprecated this keyword. Use {@link WCS#TPCn_na} and {@link WCS#TCDn_na}instead.
785      *                 [deg] The coordinate axis rotation in the physical unit of the axis (if defined) for the (1D)
786      *                 pixel lists in this column (trailing index).
787      * 
788      * @since      1.19
789      */
790     TCROTn(SOURCE.RESERVED, HDU.TABLE, VALUE.REAL, "[deg] column pixel axis rotation"),
791 
792     /**
793      * Coordinate transformation matrix in the CD convention. from column index <i>n</i> (leading index) to column index
794      * <i>k</i> (second index) for the for the (1D) pixel lists in this column. The shorter form {@link #TCn_na} may be
795      * required for column indices &gt;99 with alternate coordinate systems.
796      * 
797      * @since 1.19
798      */
799     TCDn_na(SOURCE.RESERVED, HDU.TABLE, VALUE.REAL, "column pix trans. matrix element"),
800 
801     /**
802      * Coordinate transformation matrix in the CD convention. from column index <i>n</i> (leading index) to column index
803      * <i>k</i> (second index) for the for the (1D) pixel lists in this column. Same as {@link #TCDn_na}. This shorter
804      * form may be required for column indices &gt;99 with alternate coordinate systems.
805      * 
806      * @since 1.19
807      */
808     TCn_na(SOURCE.RESERVED, HDU.TABLE, VALUE.REAL, "column pix trans. matrix element"),
809 
810     /**
811      * The coordinate string parameter <i>m</i> (trailing index) for the (1D) pixel list entries in this column (leading
812      * index). This shorter form {@link #TSn_na} may be required for column indices &gt;99 with alternate coordinate
813      * systems.
814      * 
815      * @since 1.19
816      */
817     TPSn_na(SOURCE.RESERVED, HDU.TABLE, VALUE.STRING, "column axis parameter name"),
818 
819     /**
820      * The coordinate string parameter <i>m</i> (trailing index) for the (1D) pixel list entries in this column (leading
821      * index). Same as {@link #TPSn_na}. This shorter form may be required for column indices &gt;99 with alternate
822      * coordinate systems.
823      * 
824      * @since 1.19
825      */
826     TSn_na(SOURCE.RESERVED, HDU.TABLE, VALUE.STRING, "column axis parameter name"),
827 
828     /**
829      * The coordinate parameter value <i>m</i> (trailing index) for the (1D) pixel list entries in this column (leading
830      * index). The shorter form {@link #TVn_na} may be required for column indices &gt;99 with alternate coordinate
831      * systems.
832      * 
833      * @since 1.19
834      */
835     TPVn_na(SOURCE.RESERVED, HDU.TABLE, VALUE.REAL, "column pixel axis parameter value"),
836 
837     /**
838      * The coordinate parameter value <i>m</i> (trailing index) for the (1D) pixel list entries in this column (leading
839      * index). Same as {@link #TPVn_na}. This shorter form may be required for column indices &gt;99 with alternate
840      * coordinate systems.
841      * 
842      * @since 1.19
843      */
844     TVn_na(SOURCE.RESERVED, HDU.TABLE, VALUE.REAL, "column pixel axis parameter value");
845 
846     /** ICRS coordinate reference frame */
847     public static final int WCSAXES_MAX_VALUE = 9;
848 
849     /** ICRS coordinate reference frame */
850     public static final String RADESYS_ICRS = "ICRS";
851 
852     /** IAU 1984 FK5 coordinate reference frame */
853     public static final String RADESYS_FK5 = "FK5";
854 
855     /** Bessel-Newcomb FK4 coordinate reference frame */
856     public static final String RADESYS_FK4 = "FK4";
857 
858     /** Bessel-Newcomb FK4 coordinate reference frame, without eccentricity terms */
859     public static final String RADESYS_FK4_NO_E = "FK4-NO-E";
860 
861     /** Geocentric apparent place (IAU 1984) */
862     public static final String RADESYS_GAPPT = "GAPPT";
863 
864     /** Logarithmically sampled algorithm code for {@link #CTYPEna} keywords */
865     public static final String ALGO_LOG = "LOG";
866 
867     /** Detector sampling algorithm code for {@link #CTYPEna} keywords */
868     public static final String ALGO_GRI = "GRI";
869 
870     /** Detector sampling algorithm code for {@link #CTYPEna} keywords */
871     public static final String ALGO_GRA = "GRA";
872 
873     /** Irregular sampling algorithm code for {@link #CTYPEna} keywords */
874     public static final String ALGO_TAB = "TAB";
875 
876     /** Spectral frequency coordinate value for {@link #CTYPEna} keywords */
877     public static final String SPECTRAL_TYPE_FREQ = "FREQ";
878 
879     /** Spectral energy coordinate value for {@link #CTYPEna} keywords */
880     public static final String SPECTRAL_TYPE_ENER = "ENER";
881 
882     /** Spectral wavenumber coordinate value for {@link #CTYPEna} keywords */
883     public static final String SPECTRAL_TYPE_WAVN = "WAVN";
884 
885     /** Spectral radial velocity coordinate value for {@link #CTYPEna} keywords */
886     public static final String SPECTRAL_TYPE_VRAD = "VRAD";
887 
888     /** Spectral vacuum wavenlength coordinate value for {@link #CTYPEna} keywords */
889     public static final String SPECTRAL_TYPE_WAVE = "WAVE";
890 
891     /** Spectral optical velocity coordinate value for {@link #CTYPEna} keywords */
892     public static final String SPECTRAL_TYPE_VOPT = "VOPT";
893 
894     /** Spectral redshift coordinate value for {@link #CTYPEna} keywords */
895     public static final String SPECTRAL_TYPE_ZOPT = "ZOPT";
896 
897     /** Spectral wavelength in air coordinate value for {@link #CTYPEna} keywords */
898     public static final String SPECTRAL_TYPE_AWAV = "AWAV";
899 
900     /** Spectral apparent radial velocity coordinate value for {@link #CTYPEna} keywords */
901     public static final String SPECTRAL_TYPE_VELO = "VELO";
902 
903     /** Spectral beta factor (<i>v/c</i>) coordinate value for {@link #CTYPEna} keywords */
904     public static final String SPECTRAL_TYPE_BETA = "BETA";
905 
906     /** Spectral frequency expressed as wavelength transformation code for {@link #CTYPEna} keywords */
907     public static final String SPECTRAL_ALGO_F2W = "F2W";
908 
909     /** Spectral frequency expressed as apparent radial velocity transformation code for {@link #CTYPEna} keywords */
910     public static final String SPECTRAL_ALGO_F2V = "F2V";
911 
912     /** Spectral frequency expressed as air wavelength transformation code for {@link #CTYPEna} keywords */
913     public static final String SPECTRAL_ALGO_F2A = "F2A";
914 
915     /** Spectral wavelength expressed as frequency transformation code for {@link #CTYPEna} keywords */
916     public static final String SPECTRAL_ALGO_W2F = "W2F";
917 
918     /** Spectral wavelength expressed as apparent radial velocity transformation code for {@link #CTYPEna} keywords */
919     public static final String SPECTRAL_ALGO_W2V = "W2V";
920 
921     /** Spectral wavelength expressed as air wavelength transformation code for {@link #CTYPEna} keywords */
922     public static final String SPECTRAL_ALGO_W2A = "W2A";
923 
924     /** Spectral radial velocity expressed as frequency transformation code for {@link #CTYPEna} keywords */
925     public static final String SPECTRAL_ALGO_V2F = "V2F";
926 
927     /** Spectral radial velocity expressed as wavelength transformation code for {@link #CTYPEna} keywords */
928     public static final String SPECTRAL_ALGO_V2W = "V2W";
929 
930     /** Spectral radial velocity expressed as air wavelength transformation code for {@link #CTYPEna} keywords */
931     public static final String SPECTRAL_ALGO_V2A = "V2A";
932 
933     /** Spectral air wavelength expressed as frequency transformation code for {@link #CTYPEna} keywords */
934     public static final String SPECTRAL_ALGO_A2F = "A2F";
935 
936     /** Spectral air wavelength expressed as vacuum wavelength transformation code for {@link #CTYPEna} keywords */
937     public static final String SPECTRAL_ALGO_A2W = "A2W";
938 
939     /**
940      * Spectral air wavelength expressed as apparent radial velocity transformation code for {@link #CTYPEna} keywords
941      */
942     public static final String SPECTRAL_ALGO_A2V = "A2V";
943 
944     private final FitsKey key;
945 
946     WCS(SOURCE status, HDU hdu, VALUE valueType, String comment) {
947         this(null, status, hdu, valueType, comment);
948     }
949 
950     WCS(String headerName, SOURCE status, HDU hdu, VALUE valueType, String comment) {
951         key = new FitsKey(headerName == null ? name() : headerName, status, hdu, valueType, comment);
952         FitsKey.registerStandard(this);
953     }
954 
955     @Override
956     public final FitsKey impl() {
957         return key;
958     }
959 
960     /**
961      * Specifying an alternative coordinate system. Alternative systems are labelled 'A' through 'Z'. This call is
962      * available only for the enums, which have a lower-case 'a' at the end of their Java names (such as
963      * {@link #WCSNAMEa}). Attempting to call this on WCS keywords that do not end with lower-case 'a' in their Java
964      * names (such as {@link #OBSGEO_X} will throw and {@link UnsupportedOperationException}. You will want to call this
965      * before chaining other calls to {@link IFitsHeader}.
966      * 
967      * @param  c                             The alternative coordinate system marker 'A' through 'Z' (case
968      *                                           insensitive).
969      * 
970      * @return                               The standard FITS keyword with the alternate coordinate system marker
971      *                                           attached.
972      * 
973      * @throws IllegalArgumentException      if the marker is outside of the legal range of 'A' through 'Z' (case
974      *                                           insensitive).
975      * @throws UnsupportedOperationException if the keyword does not support alternative coordinate systems
976      * 
977      * @since                                1.19
978      */
979     public IFitsHeader alt(char c) throws IllegalArgumentException, UnsupportedOperationException {
980         if (!name().endsWith("a")) {
981             throw new UnsupportedOperationException("WCS keyword " + key.key() + " does not support alternatives.");
982         }
983 
984         c = Character.toUpperCase(c);
985         if (c < 'A' || c > 'Z') {
986             throw new IllegalArgumentException("Expected 'A' through 'Z': Got '%c'");
987         }
988 
989         return new FitsKey(key() + Character.toUpperCase(c), status(), hdu(), valueType(), comment());
990     }
991 
992 }