summaryrefslogtreecommitdiffstats
path: root/ast/devtools/simtest.c
diff options
context:
space:
mode:
authorWilliam Joye <wjoye@cfa.harvard.edu>2016-10-17 15:22:52 (GMT)
committerWilliam Joye <wjoye@cfa.harvard.edu>2016-10-17 15:22:52 (GMT)
commit7dd9b970cec6832b8f6118dc2dd91a08d2836648 (patch)
tree4b3c86596ab87f35a3c6213397da07afe1e24d3e /ast/devtools/simtest.c
parentd7bf7c61e8507e3cf51f195392c0f41f27ae18d8 (diff)
parent7fde2daeed593684120d75de07598154f3ddaf2c (diff)
downloadblt-7dd9b970cec6832b8f6118dc2dd91a08d2836648.zip
blt-7dd9b970cec6832b8f6118dc2dd91a08d2836648.tar.gz
blt-7dd9b970cec6832b8f6118dc2dd91a08d2836648.tar.bz2
Merge commit '7fde2daeed593684120d75de07598154f3ddaf2c' as 'ast'
Diffstat (limited to 'ast/devtools/simtest.c')
-rw-r--r--ast/devtools/simtest.c864
1 files changed, 864 insertions, 0 deletions
diff --git a/ast/devtools/simtest.c b/ast/devtools/simtest.c
new file mode 100644
index 0000000..e36634c
--- /dev/null
+++ b/ast/devtools/simtest.c
@@ -0,0 +1,864 @@
+#define astCLASS simtest
+
+#include <stdio.h>
+#include <string.h>
+#include "globals.h"
+#include "object.h"
+#include "fitschan.h"
+#include "mapping.h"
+#include "cmpmap.h"
+#include "error.h"
+#include "winmap.h"
+#include "tranmap.h"
+#include "frameset.h"
+#include "pointset.h"
+#include "f77.h"
+#include "memory.h"
+#include "switchmap.h"
+#include "unitmap.h"
+
+void DisplayList( AstMapping *, int, int, int * );
+void sink( const char * );
+const char *source( void );
+void tran( AstMapping *, int * );
+void diff( AstMapping *, int * );
+void tranm( AstMapping **, int *, int, int, int * );
+
+extern F77_SUBROUTINE(kpg1_asreg)( INTEGER(status) );
+
+
+FILE *fd=NULL;
+
+main(){
+ char file[ 50 ], text[ 100 ];
+ const char *class, *enc0;
+ char *attrs, *kvalue;
+ AstWinMap *winmap;
+ AstFitsChan *fc, *fc2;
+ AstChannel *ch, *channel;
+ AstMapping *map, *map2, *tmap;
+ AstObject *obj, *obj2;
+ int opt, nin, nout, i;
+ DECLARE_INTEGER(lstatus);
+ int *status;
+
+ lstatus = 0;
+ status = &lstatus;
+
+/* F77_CALL(kpg1_asreg)( INTEGER_ARG(&lstatus) ); */
+
+ printf( "Input FITS or AST file [| fitschan attrs] > ");
+ scanf( "%s", file );
+
+ attrs = strchr( file, '|' );
+ if( attrs ) {
+ *attrs = 0;
+ attrs++;
+ } else {
+ attrs = "Carlin=0";
+ }
+
+ fd = fopen( file, "r" );
+ if( fd ){
+ ch = (AstChannel *) astFitsChan( NULL, sink, attrs, status );
+ if( astOK ) {
+ fc = (AstFitsChan *) ch;
+ while( astOK && fgets( text, 100, fd ) ){
+ astPutFits( fc, text, 0 );
+ }
+ astClearCard( fc );
+
+ enc0 = astGetC( fc, "encoding" );
+ printf("Using %s encoding\n", enc0 );
+ obj = astRead( fc );
+ }
+ if( !obj || !astOK ){
+ printf("Attempting to read file %s as an AST file...\n", file );
+ astClearStatus;
+ ch = astChannel( source, NULL, "", status );
+
+ fclose( fd );
+ fd = NULL;
+ fd = fopen( file, "r" );
+ obj = astRead( ch );
+ if( obj != NULL ) {
+ fc = NULL;
+ } else {
+ astClearStatus;
+ printf("Reverting to FitsChan and using a dummy UnitMap. \n", file );
+ obj = (AstObject *) astUnitMap( 1, "", status );
+ astAnnul( ch );
+ ch = (AstChannel *) fc;
+ }
+
+ }
+ fclose( fd );
+ fd = NULL;
+ } else {
+ astError( 1, "Cannot open file '%s'.", status, file );
+ }
+
+ class = obj ? astGetClass( obj ) : NULL;
+ if( obj && class ){
+ printf( "%s %s has been read from file '%s'.\n",
+ strspn( class, "AEIOUaeiou" )?"An":"A", class, file );
+ }
+
+ if( obj && astIsAFitsChan( obj ) ) {
+ fc = (AstFitsChan *) obj;
+ astClearCard( fc );
+ enc0 = astGetC( fc, "encoding" );
+ printf("Using %s encoding\n", enc0 );
+ obj = astRead( fc );
+ }
+
+ if( obj && astIsAMapping( obj ) ){
+ map = (AstMapping *) obj;
+
+ while( astOK ){
+ printf("\n"
+ "0 - Quit\n"
+ "1 - Transform points\n"
+ "2 - Simplify\n"
+ "3 - Display\n"
+ "4 - Write\n"
+ "5 - Shift and scale\n"
+ "6 - Set mapping attributes\n"
+ "7 - Get mapping attributes\n"
+ "8 - Dump the FitsChan\n"
+ "9 - Differentiate\n"
+ "10 - Find a FITS keyword\n"
+ "\n"
+ "Option > " );
+ opt = 0;
+ scanf( "%d", &opt );
+
+ if( opt == 0 ){
+ break;
+
+ } else if( opt == 1 ){
+ tran( map, status );
+
+ } else if( opt == 2 ){
+ map2 = astSimplify( map );
+ map = astAnnul( map );
+ map = map2;
+ obj = (AstObject *) map2;
+
+ } else if( opt == 3 ){
+ if( astIsAFrameSet( map ) ) {
+ tmap = astGetMapping( map, AST__BASE, AST__CURRENT );
+ } else {
+ tmap = astClone( map );
+ }
+ DisplayList( tmap, 1, astGetInvert( tmap ), status );
+ tmap = astAnnul( tmap );
+
+ } else if( opt == 4 ){
+ printf( "\n Output FITS file > ");
+ scanf( "%s", file );
+ fd = fopen( file, "w" );
+ if( fd ){
+ if( fc ) {
+ printf(" Encoding (orig=%s)> ",enc0 );
+ scanf( "%s", text );
+ if( !strcmp( enc0, text ) && fc != NULL ){
+ printf("Using existing FitsChan.\n");
+ fc2 = astClone( fc );
+ fc = astAnnul( fc );
+ ch = NULL;
+ astClearCard( fc2 );
+ astSet( fc2, "encoding=%s", status, text );
+ } else {
+ printf("Creating new FitsChan.\n");
+ fc2 = astFitsChan( NULL, sink, "encoding=%s", status, text );
+ astPutFits( fc2, "NAXIS1 = 1", 1 );
+ astPutFits( fc2, "NAXIS2 = 1", 1 );
+ astPutFits( fc2, "NAXIS3 = 1", 1 );
+ astPutFits( fc2, "NAXIS4 = 1", 1 );
+ }
+ } else {
+ printf(" Encoding for new FitsChan > " );
+ scanf( "%s", text );
+ fc2 = astFitsChan( NULL, sink, "encoding=%s", status, text );
+ astPutFits( fc2, "NAXIS1 = 1", 1 );
+ astPutFits( fc2, "NAXIS2 = 1", 1 );
+ astPutFits( fc2, "NAXIS3 = 1", 1 );
+ astPutFits( fc2, "NAXIS4 = 1", 1 );
+ }
+ if( !astWrite( fc2, obj ) ){
+ printf("No object written to file '%s'.\n", file );
+ }
+ fc2 = astAnnul( fc2 );
+ fclose( fd );
+ fd = NULL;
+ } else {
+ astError( 1, "Cannot open file '%s'.", status, file );
+ }
+
+ } else if( opt == 5 ){
+ nin = astGetNin( map );
+ winmap = astWinMap( nin, NULL, NULL, NULL, NULL, "", status );
+
+ printf( "\n Enter %d axis shift values > ", nin );
+ for( i = 0; i < nin; i++ ) scanf( "%lg", (winmap->a) + i );
+
+ printf( "\n Enter %d axis scale values > ", nin );
+ for( i = 0; i < nin; i++ ) scanf( "%lg", (winmap->b) + i );
+
+ if( !strcmp( class, "FrameSet" ) ){
+ astInvert( winmap );
+ astRemapFrame( obj, AST__BASE, winmap );
+ } else {
+ map2 = (AstMapping *) astCmpMap( winmap, map, 1, "", status );
+ map = astAnnul( map );
+ map = map2;
+ obj = (AstObject *) map2;
+ }
+ winmap = astAnnul( winmap );
+
+ } else if( opt == 6 ) {
+ printf("Enter attribute specifications: ");
+ scanf( "%s", text );
+ astSet( map, text, status );
+ if( !astOK ) astClearStatus;
+
+ } else if( opt == 7 ) {
+ printf("Enter attribute name: ");
+ scanf( "%s", text );
+ printf( "%s = %s\n", text, astGetC( map, text ) );
+ if( !astOK ) astClearStatus;
+
+ } else if( opt == 8 ) {
+ printf( "\n Output text file > ");
+ scanf( "%s", file );
+ fd = fopen( file, "w" );
+ if( fd ){
+ channel = astChannel( NULL, sink, "Full=1", status );
+ astDump( ch, channel );
+ channel = astAnnul( channel );
+ fclose( fd );
+ fd = NULL;
+ } else {
+ printf("Failed to open output file '%s'.\n", file );
+ perror(" ");
+ }
+
+ } else if( opt == 9 ){
+ diff( map, status );
+
+ } else if( opt == 10 ){
+ if( fc ) {
+ printf("Enter FITS keyword: ");
+ scanf( "%s", text );
+ if( astGetFitsS( fc, text, &kvalue ) ) {
+ printf("%s = '%s'\n", text, kvalue );
+ } else {
+ printf("%s not found\n", text );
+ }
+ } else {
+ printf("No FITS keywords are available\n", text );
+ }
+ }
+ }
+
+ } else {
+ astError( 1, "Object should be a Mapping).", status );
+ }
+
+ if( ch ) ch = astAnnul( ch );
+ obj = astAnnul( obj );
+
+}
+
+void DisplayList( AstMapping *map0, int series, int invert, int *status ){
+ int nmap, i, inv, res, junk;
+ AstMapping *mi, *mf, **map_list, *m, *m2, *map, *smap, *tm1, *tm2;
+ AstCmpMap *cm;
+ AstTranMap *tm;
+ AstChannel *channel;
+ int invi, invf, *invert_list, opt, old_inv, nin, in[20], *out, nout;
+ int isswitch, tfwd, tinv;
+ const char *class;
+ char file[ 50 ];
+ double dv;
+
+ nmap = 0;
+ map_list = NULL;
+ invert_list = NULL;
+ map = astClone( map0 );
+
+ isswitch = astIsASwitchMap( map );
+ if( isswitch ) {
+ astSwitchList( (AstSwitchMap *) map, invert, &nmap, &map_list,
+ &invert_list, status );
+ } else {
+ astMapList( map, series, invert, &nmap, &map_list, &invert_list );
+ }
+
+ while( 1 ){
+ if( isswitch ) {
+ printf("\nSwitchMap: (fwd selector, inv selector, routes )\n" );
+ printf(" -3 - <transform points>\n");
+ } else {
+ printf("\nMappings in %s:\n", series?"series":"parallel" );
+ printf(" -8 - <invert>\n");
+ printf(" -7 - <write list to text file>\n");
+ printf(" -6 - <split>\n");
+ printf(" -5 - <simplify whole list>\n");
+ printf(" -4 - <merge a single mapping>\n");
+ printf(" -3 - <transform points>\n");
+ printf(" -2 - <show to text file>\n");
+ printf(" -1 - <show to screen>\n");
+ }
+ printf(" 0 - <up>\n");
+ for( i = 0; i < nmap; i++ ){
+ m = map_list[ i ];
+ class = m ? astGetClass( m ) :"(NULL)";
+ printf( " %d - %s\n", i + 1, class );
+ }
+ printf("\n Option > ", 0 );
+ opt = 0;
+ scanf("%d", &opt );
+
+ if ( opt == -8 ) {
+
+ for( i = 0; i < nmap; i++ ) map_list[ i ] = astAnnul( map_list[ i ] );
+ map_list = astFree( map_list );
+ invert_list = astFree( invert_list );
+ nmap = 0;
+
+ invert = ( invert == 0 );
+ if( isswitch ) {
+ astSwitchList( (AstSwitchMap *) map, invert, &nmap,
+ &map_list, &invert_list, status );
+ } else {
+ astMapList( map, series, invert, &nmap, &map_list, &invert_list );
+ }
+
+ } else if ( opt == -7 && !isswitch ) {
+ printf( "\n Output text file > ");
+ scanf( "%s", file );
+ fd = fopen( file, "w" );
+ if( fd ){
+ channel = astChannel( NULL, sink, "", status );
+ for( i = 0; i < nmap; i++ ) {
+ inv = astGetInvert( map_list[ i ] );
+ astSetInvert( map_list[ i ], invert_list[ i ] );
+ astDump( map_list[ i ], channel );
+ astSetInvert( map_list[ i ], inv );
+ }
+ channel = astAnnul( channel );
+ fclose( fd );
+ fd = NULL;
+ } else {
+ printf("Failed to open output file.\n" );
+ }
+
+ } else if( opt == -6 && !isswitch ) {
+ old_inv = astGetInvert( map );
+ astSetInvert( map, invert );
+
+ printf( "\n Pick how many input axes (max=%d)? > ",
+ astGetNin( map ) );
+ scanf( "%lg", &dv );
+ nin = dv;
+
+ printf( "\n Enter %d zero-based axis indices > ", nin );
+ for( i = 0; i < nin; i++ ) {
+ scanf( "%lg", &dv );
+ in[ i ] = dv;
+ }
+
+ out = astMapSplit( map, nin, in, &smap );
+ astSetInvert( map, old_inv );
+
+ if( out ) {
+ printf( "Corresponding outputs are: " );
+ nout = astGetNout( smap );
+ for( i = 0; i < nout; i++ ) printf( "%d ", out[ i ] );
+ printf("\n");
+ out = astFree( out );
+ map = astAnnul( map );
+ map = smap;
+ } else {
+ printf( "Selected inputs do not correspond to a subset of outputs\n");
+ }
+
+ for( i = 0; i < nmap; i++ ) map_list[ i ] = astAnnul( map_list[ i ] );
+ map_list = astFree( map_list );
+ invert_list = astFree( invert_list );
+
+ nmap = 0;
+ astMapList( map, series, invert, &nmap, &map_list, &invert_list );
+
+ } else if( opt == -5 && !isswitch ) {
+ old_inv = astGetInvert( map );
+ astSetInvert( map, invert );
+ smap = astSimplify( map );
+ if( smap == map ) printf("\n No simplification performed\n" );
+ astSetInvert( map, old_inv );
+ map = astAnnul( map );
+ map = smap;
+
+ for( i = 0; i < nmap; i++ ) map_list[ i ] = astAnnul( map_list[ i ] );
+ map_list = astFree( map_list );
+ invert_list = astFree( invert_list );
+
+ nmap = 0;
+ astMapList( map, series, invert, &nmap, &map_list, &invert_list );
+
+ } else if( opt == -4 && !isswitch ) {
+ printf("\n Mapping index > ", 0 );
+ scanf("%d", &i );
+ i--;
+ res = astMapMerge( map_list[ i ], i, series, &nmap,
+ &map_list, &invert_list );
+ if( res != -1 ) {
+ printf( "Index of first modified Mapping: %d\n", res + 1 );
+ } else {
+ printf( "No mappings modified\n" );
+ }
+
+ } else if( opt == -3 && series && !isswitch ) {
+
+ if( invert == astGetInvert( map ) ) {
+ tfwd = astGetTranForward( map );
+ tinv = astGetTranInverse( map );
+ } else {
+ tinv = astGetTranForward( map );
+ tfwd = astGetTranInverse( map );
+ }
+
+ if( !tfwd ) {
+ printf( "\n No forward transformation available\n" );
+
+ } else if( !tinv ) {
+ printf( "\n No inverse transformation available\n" );
+ tranm( map_list, invert_list, nmap, 0, status );
+
+ } else {
+ tranm( map_list, invert_list, nmap, 1, status );
+
+ }
+
+ } else if( opt == -3 && isswitch ) {
+
+ if( invert == astGetInvert( map ) ) {
+ tfwd = astGetTranForward( map );
+ tinv = astGetTranInverse( map );
+ } else {
+ tinv = astGetTranForward( map );
+ tfwd = astGetTranInverse( map );
+ }
+
+ if( !tfwd ) {
+ printf( "\n No forward transformation available\n" );
+
+ } else if( !tinv ) {
+ printf( "\n No inverse transformation available\n" );
+ tranm( &map, &invert, 1, 0, status );
+
+ } else {
+ tranm( &map, &invert, 1, 1, status );
+
+ }
+
+ } else if( opt == -3 && !series && !isswitch ) {
+ old_inv = astGetInvert( map );
+ astSetInvert( map, invert );
+ tran( map, status );
+ astSetInvert( map, old_inv );
+
+ } else if ( opt == -2 && !isswitch ) {
+
+ for( i = 0; i < nmap; i++ ) {
+ inv = astGetInvert( map_list[ i ] );
+ astSetInvert( map_list[ i ], invert_list[ i ] );
+ if( i == 0 ) {
+ tm1 = astClone( map_list[ 0 ] );
+ } else {
+ tm2 = (AstMapping *) astCmpMap( tm1, map_list[ i ], series, "", status );
+ tm1 = astAnnul( tm1 );
+ tm1 = tm2;
+ }
+ astSetInvert( map_list[ i ], inv );
+ }
+
+ printf( "\n Output text file > ");
+ scanf( "%s", file );
+ fd = fopen( file, "w" );
+ if( fd ){
+ channel = astChannel( NULL, sink, "", status );
+ old_inv = astGetInvert( tm1 );
+ astSetInvert( tm1, invert );
+ astDump( tm1, channel );
+ astSetInvert( tm1, old_inv );
+ channel = astAnnul( channel );
+ fclose( fd );
+ fd = NULL;
+ } else {
+ printf("Failed to open output file.\n" );
+ }
+ tm1= astAnnul( tm1 );
+
+ } else if ( opt == -1 && !isswitch ) {
+
+
+ for( i = 0; i < nmap; i++ ) {
+ inv = astGetInvert( map_list[ i ] );
+ astSetInvert( map_list[ i ], invert_list[ i ] );
+ if( i == 0 ) {
+ tm1 = astClone( map_list[ 0 ] );
+ } else {
+ tm2 = (AstMapping *) astCmpMap( tm1, map_list[ i ],
+ series, "", status );
+ tm1 = astAnnul( tm1 );
+ tm1 = tm2;
+ }
+ astSetInvert( map_list[ i ], inv );
+ }
+
+ channel = astChannel( NULL, NULL, "Full=1", status );
+ old_inv = astGetInvert( tm1);
+ astSetInvert( tm1, invert );
+ astDump( tm1, channel );
+ astSetInvert( tm1, old_inv );
+ channel = astAnnul( channel );
+ tm1= astAnnul( tm1 );
+
+ } else if( opt > 0 && opt <= nmap && map_list[ opt - 1 ] ){
+ m2 = map_list[ opt - 1 ];
+ inv = invert_list[ opt - 1 ];
+ class = astGetClass( m2 );
+
+ if( m2 && astIsAFrameSet( m2 ) ){
+ m = astGetMapping( m2, AST__BASE, AST__CURRENT );
+ class = astGetClass( m );
+
+ } else if( astIsATranMap( m2 ) ){
+
+ astDecompose( m2, &mf, &mi, &invf, &invi, &junk );
+
+ if( inv ) {
+ m = mi;
+ inv = invi;
+ } else {
+ m = mf;
+ inv = invf;
+ }
+ class = astGetClass( m );
+
+ } else {
+ m = astClone( m2 );
+ }
+
+ if( strcmp( class, "CmpMap" ) ){
+ DisplayList( m, 1, inv, status );
+ } else {
+ cm = (AstCmpMap *) m;
+ DisplayList( m, cm->series, inv, status );
+ }
+ } else {
+ break;
+ }
+ }
+
+ for( i = 0; i < nmap; i++ ) map_list[ i ] = astAnnul( map_list[ i ] );
+ map_list = astFree( map_list );
+ invert_list = astFree( invert_list );
+ nmap = 0;
+
+}
+
+
+void sink( const char *text ){
+ if( fd && text ) fprintf( fd, "%s\n", text );
+}
+
+const char *source( void ){
+ static char text[2000];
+ static char *ptext;
+ if( fd ) {
+ ptext = fgets( text, 2000, fd );
+ } else {
+ ptext = NULL;
+ }
+ return ptext;
+}
+
+void tran( AstMapping *map, int *status ){
+ char text[2000];
+ AstFrame *infrm, *outfrm;
+ AstPointSet *pset1, *pset2;
+ double **ptr1, **ptr2;
+ int nin, nout, i, ok;
+
+ if( !astGetTranForward( map ) ) {
+ printf( "\n No forward transformation available\n" );
+ return;
+ }
+
+ if( !astGetTranInverse( map ) ) {
+ printf( "\n No inverse transformation available\n" );
+ }
+
+ nin = astGetNin( map );
+ nout = astGetNout( map );
+ pset1 = astPointSet( 1, nin, "", status );
+ ptr1 = astGetPoints( pset1 );
+ pset2 = astPointSet( 1, nout, "", status );
+ ptr2 = astGetPoints( pset2 );
+
+ if( astIsAFrameSet( map ) ) {
+ infrm = astGetFrame( map, AST__BASE );
+ outfrm = astGetFrame( map, AST__CURRENT );
+ } else if( astIsAFrame( map ) ) {
+ infrm = (AstFrame *) map;
+ outfrm = (AstFrame *) map;
+ } else {
+ infrm = NULL;
+ outfrm = NULL;
+ }
+
+ if( astOK ){
+ ok = 0;
+ if( infrm != NULL ) {
+ ok = 1;
+ for( i = 0; i < nin; i++ ) {
+ printf( "\n Enter %s value (or <bad>) > ", astGetLabel( infrm, i ) );
+ scanf( "%s", text );
+ if( !astUnformat( infrm, i, text, ptr1[ i ] ) ) {
+ ok = 0;
+ printf( "Bad formatted value supplied! Now try unformatted axis values...\n");
+ break;
+ }
+ }
+ }
+
+ if( !ok ) {
+ printf( "\n Enter %d axis values (BAD=999) > ", nin );
+ for( i = 0; i < nin; i++ ) {
+ scanf( "%lg", ptr1[ i ] );
+ if( ptr1[ i ][ 0 ] == 999.0 ) ptr1[ i ][ 0 ] = AST__BAD;
+ }
+ }
+
+ astTransform( map, pset1, 1, pset2 );
+ printf( "\n Forward: [ " );
+ for( i = 0; i < nin; i++ ) {
+ if( ptr1[ i ][ 0 ] == AST__BAD ) {
+ printf( "999.0 " );
+ } else {
+ printf( "%.*g ", DBL_DIG, ptr1[ i ][ 0 ] );
+ }
+ }
+
+ printf( "] -> [ " );
+ for( i = 0; i < nout; i++ ) {
+ if( ptr2[ i ][ 0 ] == AST__BAD ) {
+ printf( "999.0 " );
+ } else {
+ printf( "%.*g ", DBL_DIG, ptr2[ i ][ 0 ] );
+ }
+ }
+ printf( "]\n" );
+
+ if( infrm != NULL && outfrm != NULL ) {
+ printf( " ( " );
+ for( i = 0; i < nin; i++ ) {
+ printf( "%s ", astFormat( infrm, i, ptr1[ i ][ 0 ] ) );
+ }
+ printf( ") -> ( " );
+ for( i = 0; i < nout; i++ ) {
+ printf( "%s ", astFormat( outfrm, i, ptr2[ i ][ 0 ] ) );
+ }
+ printf( ") formatted\n" );
+ }
+
+
+ if( astGetTranInverse( map ) ) {
+ astTransform( map, pset2, 0, pset1 );
+ printf( "\n Inverse: [ " );
+ for( i = 0; i < nout; i++ ) {
+ if( ptr2[ i ][ 0 ] == AST__BAD ) {
+ printf( "999.0 " );
+ } else {
+ printf( "%.*g ", DBL_DIG, ptr2[ i ][ 0 ] );
+ }
+ }
+
+ printf( "] -> [ " );
+ for( i = 0; i < nin; i++ ) {
+ if( ptr1[ i ][ 0 ] == AST__BAD ) {
+ printf( "999.0 " );
+ } else {
+ printf( "%.*g ", DBL_DIG, ptr1[ i ][ 0 ] );
+ }
+ }
+ printf( "]\n" );
+
+
+ if( infrm != NULL && outfrm != NULL ) {
+ printf( " ( " );
+ for( i = 0; i < nout; i++ ) {
+ printf( "%s ", astFormat( outfrm, i, ptr2[ i ][ 0 ] ) );
+ }
+ printf( ") -> ( " );
+ for( i = 0; i < nin; i++ ) {
+ printf( "%s ", astFormat( infrm, i, ptr1[ i ][ 0 ] ) );
+ }
+ printf( ") formatted\n" );
+ }
+ }
+ }
+ pset1 = astAnnul( pset1 );
+ pset2 = astAnnul( pset2 );
+}
+
+void tranm( AstMapping **map, int *inv_list, int nmap, int inv, int *status ){
+ AstPointSet *pset1, *pset2;
+ double **ptr1, **ptr2;
+ int nin, nout, i, j, inv0;
+
+ inv0 = astGetInvert( map[ 0 ] );
+ astSetInvert( map[ 0 ], inv_list[ 0 ] );
+ nin = astGetNin( map[ 0 ] );
+ astSetInvert( map[ 0 ], inv0 );
+
+ pset1 = astPointSet( 1, nin, "", status );
+ ptr1 = astGetPoints( pset1 );
+
+ if( astOK ){
+ printf( "\n Enter %d axis values (BAD=999) > ", nin );
+ for( i = 0; i < nin; i++ ) {
+ scanf( "%lg", ptr1[ i ] );
+ if( ptr1[ i ][ 0 ] == 999.0 ) ptr1[ i ][ 0 ] = AST__BAD;
+ }
+
+ printf("Forward...\n");
+ for( j=0; j<nmap; j++ ) {
+ inv0 = astGetInvert( map[ j ] );
+ astSetInvert( map[ j ], inv_list[ j ] );
+
+ nout = astGetNout( map[ j ] );
+ pset2 = astPointSet( 1, nout, "", status );
+ ptr2 = astGetPoints( pset2 );
+
+ astTransform( map[ j ], pset1, 1, pset2 );
+
+ printf( " Mapping %d gave [ ", j+1 );
+ for( i = 0; i < nout; i++ ) {
+ if( ptr2[ i ][ 0 ] == AST__BAD ) {
+ printf( "999.0 " );
+ } else {
+ printf( "%.*g ", DBL_DIG, ptr2[ i ][ 0 ] );
+ }
+ }
+
+ printf( "]\n" );
+
+ pset1 = astAnnul( pset1 );
+ astSetInvert( map[ j ], inv0 );
+
+ pset1 = pset2;
+ ptr1 = ptr2;
+ nin = nout;
+ }
+
+ printf("Inverse...\n");
+
+ for( j=nmap - 1; j>=0 && inv; j-- ) {
+ inv0 = astGetInvert( map[ j ] );
+ astSetInvert( map[ j ], inv_list[ j ] );
+
+ nin = astGetNin( map[ j ] );
+ pset2 = astPointSet( 1, nin, "", status );
+ ptr2 = astGetPoints( pset2 );
+
+ astTransform( map[ j ], pset1, 0, pset2 );
+
+ printf( " Mapping %d gave [ ", j+1 );
+ for( i = 0; i < nin; i++ ) {
+ if( ptr2[ i ][ 0 ] == AST__BAD ) {
+ printf( "999.0 " );
+ } else {
+ printf( "%.*g ", DBL_DIG, ptr2[ i ][ 0 ] );
+ }
+ }
+ printf( "]\n" );
+
+ pset1 = astAnnul( pset1 );
+ astSetInvert( map[ j ], inv0 );
+
+ pset1 = pset2;
+ ptr1 = ptr2;
+ nout = nin;
+ }
+
+ pset1 = astAnnul( pset1 );
+
+ }
+}
+
+
+
+
+void diff( AstMapping *map, int *status ){
+ char text[200];
+ AstFrame *infrm, *outfrm;
+ int nin, nout, i, ok, ax1, ax2;
+ double at[2000];
+
+
+ nin = astGetNin( map );
+ nout = astGetNout( map );
+
+ if( astIsAFrameSet( map ) ) {
+ infrm = astGetFrame( map, AST__BASE );
+ outfrm = astGetFrame( map, AST__CURRENT );
+ } else if( astIsAFrame( map ) ) {
+ infrm = (AstFrame *) map;
+ outfrm = (AstFrame *) map;
+ } else {
+ infrm = NULL;
+ outfrm = NULL;
+ }
+
+ if( astOK ){
+ ok = 0;
+ if( infrm != NULL ) {
+ ok = 1;
+ for( i = 0; i < nin; i++ ) {
+ printf( "\n Enter %s value (or <bad>) > ", astGetLabel( infrm, i ) );
+ scanf( "%s", text );
+ if( !astUnformat( infrm, i, text, at + i ) ) {
+ ok = 0;
+ printf( "Bad formatted value supplied! Now try unformatted axis values...\n");
+ break;
+ }
+ }
+ }
+
+ if( !ok ) {
+ printf( "\n Enter %d axis values (BAD=999) > ", nin );
+ for( i = 0; i < nin; i++ ) {
+ scanf( "%lg", at + i );
+ if( at[ i ] == 999.0 ) at[ i ] = AST__BAD;
+ printf("(got %.*g)\n", DBL_DIG, at[ i ] );
+ }
+
+ }
+
+ for( i = 0; i < nin; i++ ) {
+ printf("(%d: got %.*g)\n", i, DBL_DIG, at[ i ] );
+ }
+
+ printf( "\n Enter output to differentiate (zero-based index): > " );
+ scanf( "%d", &ax1 );
+ printf( "\n Enter input to vary (zero-based index): > " );
+ scanf( "%d", &ax2 );
+ printf( "%.*g \n", DBL_DIG, astRate( map, at, ax1, ax2 ) );
+ }
+}
+