Let us now examine the practicalities of extracting WCS information from a set of FITS header cards which have been written by some other software system. We will pretend that our program does not know which encoding has been used for the WCS information and must discover this for itself. In order to have a concrete example, however, we will use the following set of cards. These use the FITS-WCS encoding and contain a typical mix of other FITS cards which are irrelevant to the WCS information in which we are interested:
SIMPLE = T / Written by IDL: 30-Jul-1997 05:35:42.00 BITPIX = -32 / Bits per pixel. NAXIS = 2 / Number of dimensions NAXIS1 = 300 / Length of x axis. NAXIS2 = 300 / Length of y axis. CTYPE1 = 'GLON-ZEA' / X-axis type CTYPE2 = 'GLAT-ZEA' / Y-axis type CRVAL1 = -149.56866 / Reference pixel value CRVAL2 = -19.758201 / Reference pixel value CRPIX1 = 150.500 / Reference pixel CRPIX2 = 150.500 / Reference pixel CDELT1 = -1.20000 / Degrees/pixel CDELT2 = 1.20000 / Degrees/pixel CROTA1 = 0.00000 / Rotation in degrees. SURVEY = 'COBE DIRBE' BUNITS = 'MJy/sr ' / ORIGIN = 'CDAC ' / Cosmology Data Analysis Center TELESCOP= 'COBE ' / COsmic Background Explorer satellite INSTRUME= 'DIRBE ' / COBE instrument [DIRBE, DMR, FIRAS] PIXRESOL= 9 / Quad tree pixel resolution [6, 9] DATE = '27/09/94' / FITS file creation date (dd/mm/yy) DATE-MAP= '16/09/94' / Date of original file creation (dd/mm/yy) COMMENT COBE specific keywords DATE-BEG= '08/12/89' / date of initial data represented (dd/mm/yy) DATE-END= '25/09/90' / date of final data represented (dd/mm/yy)
The first step is to create a FitsChan and insert these cards into it. If ``cards'' is an array of pointers to character strings holding the header cards and ``ncards'' is the number of cards, this could be done as follows:
#include "ast.h" #define MAXCARD 100 AstFitsChan *fitschan; char *cards[ MAXCARD ]; int icard, ncard; ... fitschan = astFitsChan( NULL, NULL, "" ); for ( icard = 0; icard < ncard; icard++ ) astPutFits( fitschan, cards[ icard ], 0 );
Note that we have not initialised the Encoding attribute of the
FitsChan as we did in when we wanted to
use the native encoding. This is because we are pretending not to know
which encoding to use and want AST to determine this for us. By
leaving the Encoding attribute un-set, its default value will adjust
to whichever encoding AST considers to be most appropriate, according
to the FITS header cards present. For details of how this choice is
made, see the description of the Encoding attribute in
.
This approach has the obvious advantages of making our program simpler and more flexible and of freeing us from having to know about the different encodings available. As a bonus, it also means that the program will be able to read any new encodings that AST may support in future, without needing to be changed.
At this point, we could enquire the default value of the Encoding attribute, which indicates which encoding AST intends to use, as follows:
const char *encode; ... encode = astGetC( fitschan, "Encoding" );
The result of this enquiry would be the string ``FITS-AIPS''. Note that we could also have set the FitsChan's Encoding attribute explicitly, such as when creating it:
fitschan = astFitsChan( NULL, NULL, "Encoding=FITS-AIPS" );
If we tried to read information using this encoding
(), but failed, we could then change the
encoding and try again. This would allow our program to take control
of how the optimum choice of encoding is arrived at. However, it would
also involve using explicit knowledge of the encodings available and
this is best avoided if possible.
AST A Library for Handling World Coordinate Systems in Astronomy