summaryrefslogtreecommitdiffstats
path: root/funtools/funtest/qcon.c
diff options
context:
space:
mode:
Diffstat (limited to 'funtools/funtest/qcon.c')
-rw-r--r--funtools/funtest/qcon.c123
1 files changed, 123 insertions, 0 deletions
diff --git a/funtools/funtest/qcon.c b/funtools/funtest/qcon.c
new file mode 100644
index 0000000..a5d2e2d
--- /dev/null
+++ b/funtools/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);
+}