diff options
Diffstat (limited to 'funtest/qcon.c')
-rw-r--r-- | funtest/qcon.c | 123 |
1 files changed, 123 insertions, 0 deletions
diff --git a/funtest/qcon.c b/funtest/qcon.c new file mode 100644 index 0000000..a5d2e2d --- /dev/null +++ b/funtest/qcon.c @@ -0,0 +1,123 @@ +/* gcc -g -o qcon qcon.c -I/soft/saord/include -L/soft/saord/lib -lfuntools -lsocket -lnsl -ldl -lm */ + +#include <funtools.h> +#include <stdlib.h> + +extern char *optarg; +extern int optind; + +int main(int argc, char **argv) +{ + int c; + int args; + int offscl; + int dim1, dim2; + int ix, iy; + int offset; + int debug=0; + int dowcs=1; + int idx=0; + char tbuf[SZ_LINE]; + double dval1, dval2; + double dx, dy; + double *dbuf; + struct WorldCoor *wcs; + Fun fun; + + /* process switch arguments */ + while( (c = getopt(argc, argv, "d")) != -1){ + switch(c){ + case 'd': + debug = 1; + break; + case 'i': + dowcs = 0; + break; + } + } + + /* check for required arguments */ + args = argc - optind; + if( args < 1 ){ + fprintf(stderr, "usage: %s iname -d -i\n", argv[0]); + fprintf(stderr, "\n"); + fprintf(stderr, "where:\n"); + fprintf(stderr, " -d\tprint out input and output position values\n"); + fprintf(stderr, " -i\tinput values are image x,y (not ra,dec in deg)\n"); + fprintf(stderr, "\n"); + exit(1); + } + + /* exit on gio errors */ + setgerror(2); + + /* open the input FITS file */ + if( !(fun = FunOpen(argv[optind], "r", NULL)) ) + gerror(stderr, "could not FunOpen input file: %s\n", argv[optind]); + + /* extract and bin the data section into a double float image buffer */ + if( !(dbuf = FunImageGet(fun, NULL, "bitpix=-64")) ) + gerror(stderr, "could not FunImageGet: %s\n", argv[1]); + + /* get required information from funtools structure */ + FunInfoGet(fun, + FUN_SECT_DIM1, &dim1, + FUN_SECT_DIM2, &dim2, + FUN_WCS, &wcs, + 0); + + /* for each line in the contour file ... */ + while( fgets(tbuf, SZ_LINE, stdin) ){ + /* ignore comments */ + if( *tbuf == '#' ) + continue; + /* blank lines means reset counter */ + if( *tbuf == '\n' ){ + fprintf(stdout, "\n"); + idx = 0; + continue; + } + /* input contour values: ra, dec in degrees (or image coords if -i) */ + if(sscanf(tbuf, "%lf %lf", &dval1, &dval2) != 2){ + gerror(stderr, "invalid line in contour file: %s\n", tbuf); + } + /* convert input ra, dec to image x, y */ + if( dowcs ){ + wcs2pix(wcs, dval1, dval2, &dx, &dy, &offscl); + /* make sure we are not off scale */ + if( offscl ){ + fprintf(stderr, "warning: wcs position is offscale: %s\n", tbuf); + continue; + } + } + else{ + dx = dval1; + dy = dval2; + } + /* convert image values to integers */ + ix = (int)(dx+0.5); + iy = (int)(dy+0.5); + /* sanity checks -- must be inside the image */ + if( (ix < 1) || (ix > dim1) || (iy < 1) || (iy > dim2)){ + fprintf(stderr, "warning: image position off image: %s\n", tbuf); + continue; + } + /* calculate offset into dbuf */ + offset = (iy-1)*dim1 + ix-1; + /* write out the index and the pixel value at the image position */ + fprintf(stdout, "%d\t%f", idx, dbuf[offset]); + /* debugging info, if necessary */ + if( debug ){ + fprintf(stdout, "\t %f %f\t%d %d", dval1, dval2, ix, iy); + } + /* finish off line */ + fprintf(stdout, "\n"); + /* bump to next index */ + idx++; + } + + /* close output first so that flush happens automatically */ + FunClose(fun); + if( dbuf ) free(dbuf); + return(0); +} |