summaryrefslogtreecommitdiffstats
path: root/ast/stcschan-demo2.c
diff options
context:
space:
mode:
Diffstat (limited to 'ast/stcschan-demo2.c')
-rw-r--r--ast/stcschan-demo2.c263
1 files changed, 0 insertions, 263 deletions
diff --git a/ast/stcschan-demo2.c b/ast/stcschan-demo2.c
deleted file mode 100644
index 1967e0b..0000000
--- a/ast/stcschan-demo2.c
+++ /dev/null
@@ -1,263 +0,0 @@
-/* Name:
- stcschan-demo2.c
-
- Purpose:
- A demonstration of the facilities provided by the AST library
- for reading STC metadata encoded using the STC-S linear string
- format.
-
- Description:
- This program reads a set of FITS-WCS headers from a text file, and
- writes an STC-S description of the region covered by the FITS
- file to standard output.
-
- Notes:
- - The simple approach used in this demonstration will report an
- error if the FITS headers describe a WCS in which some pixels have
- invalid WCS axis values (such as most all sky maps, for instance).
-
- Usage:
- % stcschan-demo2 <header-file>
-
- <header-file>: The path to a text file containing a set of FITS-WCS
- headers.
-
- Example:
- % stcschan-demo2 m31.head
-
- To compile and link:
- Assuming your starlink distribution is in "/star":
-
- % gcc -o stcschan-demo2 stcschan-demo2.c -L/star/lib \
- -I/star/include `ast_link`
-
-*/
-
-/* Include system headers. */
-#include <stdio.h>
-#include <string.h>
-
-/* Include the AST library header. */
-#include "ast.h"
-
-/* Maximum number of axes in an STC-S AstroCoordSystem. */
-#define MAX_AXES 5
-
-/* Maximum allowed length for a single line of text from the disk file. */
-#define MAX_LINE_LEN 100
-
-/* Prototype for the function that reads text from the disk file. */
-const char *source( void );
-
-
-
-int main( int argc, char **argv ){
-
-/* Local variables: */
- AstBox *pixbox;
- AstFitsChan *fchan;
- AstFrame *pixfrm;
- AstFrame *wcsfrm;
- AstFrameSet *frameset;
- AstKeyMap *warnings;
- AstMapping *pix2wcs;
- AstObject *object;
- AstRegion *wcsbox;
- AstStcsChan *schan;
- FILE *fd;
- char key[ 15 ];
- char keyword[ 9 ];
- const char *message;
- double p1[ MAX_AXES ];
- double p2[ MAX_AXES ];
- int axis;
- int iwarn;
- int naxis;
- int status;
-
-/* Initialised the returned system status to indicate success. */
- status = 0;
-
-/* Check a file was specified on the command line, and attempt to open it
- for read access. */
- if( argc < 2 ) {
- printf( "Usage: stcschan-demo2 <header-file>\n" );
- status = 1;
- } else {
- fd = fopen( argv[ 1 ], "r" );
- if( !fd ) {
- printf("Failed to open input file '%s'.\n", argv[ 1 ] );
- status = 1;
- }
- }
-
-/* If a disk file was opened successfully... */
- if( !status ) {
-
-/* Start an AST object context. This means we do not need to annull
- each AST Object individually. Instead, all Objects created within
- this context will be annulled automatically by the corresponding
- invocation of astEnd. */
- astBegin;
-
-/* Create a FitsChan. This is the object that converts external FITS
- headers into corresponding AST Objects. Tell it to use the "source"
- function for obtaining lines of text from the disk file. */
- fchan = astFitsChan( source, NULL, " " );
-
-/* Associate the descriptor for the input disk file with the StcsChan.
- This makes it available to the "source" function. Since this
- application is single threaded, we could instead have made "fd" a
- global variable, but the ChannelData facility is used here to illustrate
- how to pass data to a source or sink function safely in a multi-threaded
- application. */
- astPutChannelData( fchan, fd );
-
-/* Attempt to read the FITS heades and convert them into an AST FrameSet. */
- object = astRead( fchan );
-
-/* The astRead function is a generic function and so returns a generic
- AstObject pointer. Check an Object was created successfully. */
- if( !object ) {
- printf( "Failed to read an AST Object from file '%s'.\n",
- argv[ 1 ] );
- status = 1;
-
-/* Now check that the object read is actually an AST FrameSet, rather than
- some other class of AST Object. */
- } else if( !astIsAFrameSet( object ) ) {
- printf( "Expected a FrameSet but read a %s from file '%s'.\n",
- astGetC( object, "Class" ), argv[ 1 ] );
- status = 1;
-
-/* We now know we have a FrameSet so it is safe to use the pointer
- returned by astRead as a FrameSet pointer. Do the cast now to avoid
- repeated casting in future. */
- } else {
- frameset = (AstFrameSet *) object;
-
-/* Get a pointer to the Frame that describes the attributes of the FITS
- world coordinate system. This is the current Frame in the FrameSet
- read from the FITS headers. */
- wcsfrm = astGetFrame( frameset, AST__CURRENT );
-
-/* Get a pointer to the Frame that describes the attributes of the FITS
- pixel coordinate system. This is the base Frame in the FrameSet
- read from the FITS headers. */
- pixfrm = astGetFrame( frameset, AST__BASE );
-
-/* Get the Mapping that transforms pixel positions into WCS positions.
- The is the Mapping from base to current Frame in the FrameSet read
- from the FITS headers. */
- pix2wcs = astGetMapping( frameset, AST__BASE, AST__CURRENT );
-
-/* Get the number of axes in ther pixel Frame. */
- naxis = astGetI( pixfrm, "Naxes" );
-
-/* For each pixel axis, form the name of the corresponding NAXISi
- keyword. */
- for( axis = 0; axis < naxis; axis++ ) {
- sprintf( keyword, "NAXIS%d", axis + 1 );
-
-/* Store the pixel coordinate on the current axis at the lower left corner
- of the first pixel. */
- p1[ axis ] = 0.5;
-
-/* Get the NAXISi value for the current axis from the FITS header, and
- store it in array "p2". Report an error if NAXISi is not found. */
- if( !astGetFitsF( fchan, keyword, p2 + axis ) ){
- printf("Keyword '%s' not found in header\n", keyword );
- status = 1;
- break;
-
-/* If it is found, modify "p2" so that it holds the pixel coordinate on
- the current axis at the upper right corner of the last pixel. */
- } else {
- p2[ axis ] += 0.5;
- }
- }
- }
-
-/* If all has gone well, create an AST Region (a Box) describing the
- rectangular region of pixel coordinates covered by the pixel array. */
- if( !status ) {
- pixbox = astBox( pixfrm, 1, p1, p2, NULL, " " );
-
-/* Map this box into the FITS world coordinate system. The Mapping is
- specified by "pix2wcs", and the attributes of the resulting axes is
- described by "wcsfrm". */
- wcsbox = astMapRegion( pixbox, pix2wcs, wcsfrm );
-
-/* Create an StcsChan. This is the object that converts (either way)
- between external STC-S descriptions and their corresponding AST Objects.
- Tell it to use the "source" function for obtaining lines of text from
- the disk file. Also tell it to store all warnings generated by the
- conversion for later use. Other attributes of the StcsChan class retain
- their default values. */
- schan = astStcsChan( NULL, NULL, "ReportLevel=3" );
-
-/* Attempt to write out the Region describing the pixel array (in WCS)
- as an STC-S description. Report an error if this fails. */
- if( ! astWrite( schan, wcsbox ) && astOK ) {
- printf( "Failed to convert the Region into an STC-S "
- "description.\n" );
- }
- }
-
-/* We asked the StcsChan to record any warnings that were generated
- whilst converting the AST Region into a corresponding STC-S description.
- We now see if any such warnings were generated by the earlier call to
- astWrite. */
- warnings = astWarnings( schan );
-
-/* If any warnings were generated, and if no other error has occurred so
- far, display the warnings. */
- if( warnings && !status && astOK ) {
- printf( "\nThe following warnings were issued:\n" );
-
-/* The warnings are stored in an AST KeyMap (a sort of hashmap). Each
- warning message is associated with a key of the form "Warning_1",
- "Warning_2", etc. Loop round successive keys, obtaining a value for
- each key from the warnings KeyMap, and displaying it. */
- iwarn = 1;
- while( astOK ) {
- sprintf( key, "Warning_%d", iwarn++ );
- if( astMapGet0C( warnings, key, &message ) ) {
- printf( "\n- %s\n", message );
- } else {
- break;
- }
- }
- }
-
-/* End the AST Object context. All Objects created since the
- corresponding invocation of astbegin will be annulled automatically. */
- astEnd;
-
-/* Close the disk file. */
- (void) fclose( fd );
- }
-
-/* If an error occurred in the AST library, set the retiurns system
- status non-zero. */
- if( !astOK ) status = 1;
- return status;
-}
-
-
-
-
-
-/* This is a function that reads a line of text from the disk file and
- returns it to the AST library. It is called from within the astRead
- function. */
-const char *source( void ){
- static char buffer[ MAX_LINE_LEN + 2 ];
- FILE *fd = astChannelData;
- return fgets( buffer, MAX_LINE_LEN + 2, fd );
-}
-
-
-
-
-