diff options
Diffstat (limited to 'funtools/doc/pod/funlib.pod')
-rw-r--r-- | funtools/doc/pod/funlib.pod | 542 |
1 files changed, 542 insertions, 0 deletions
diff --git a/funtools/doc/pod/funlib.pod b/funtools/doc/pod/funlib.pod new file mode 100644 index 0000000..354e217 --- /dev/null +++ b/funtools/doc/pod/funlib.pod @@ -0,0 +1,542 @@ +=pod + +=head1 NAME + + + +B<FunLib: the Funtools Programming Interface> + + + +=head1 SYNOPSIS + + + + +A description of the Funtools library. + + + +=head1 DESCRIPTION + + + +B<Introduction to the Funtools Programming Interface> + +To create a Funtools application, you need to include +the funtools.h definitions file in your code: + + #include <funtools.h> + + +You then call Funtools subroutines and functions to access Funtools data. +The most important routines are: + + +=over 4 + + + + + + +=item * + +FunOpen: open a Funtools file + + +=item * + +FunInfoGet: get info about an image or table + + +=item * + +FunImageGet: retrieve image data + + +=item * + +FunImageRowGet: retrieve image data by row + + +=item * + +FunImagePut: output image data + + +=item * + +FunImageRowPut: output image data by row + + +=item * + +FunColumnSelect: select columns in a table for access + + +=item * + +FunTableRowGet: retrieve rows from a table + + +=item * + +FunTableRowPut: output rows to a table + + +=item * + +FunClose: close a Funtools file + + +=back + + + +Your program must be linked against the libfuntools.a library, +along with the math library. The following libraries also might be required +on your system: + + +=over 4 + + + + +=item * + +-lsocket -lnsl for socket support + + +=item * + +-ldl for dynamic loading + + +=back + + + +For example, on a Solaris system using gcc, use the following link line: + + gcc -o foo foo.c -lfuntools -lsocket -lnsl -ldl -lm + +On a Solaris system using Solaris cc, use the following link line: + + gcc -o foo foo.c -lfuntools -lsocket -lnsl -lm + +On a Linux system using gcc, use the following link line: + + gcc -o foo foo.c -lfuntools -ldl -lm + +Once configure has built a Makefile on your platform, the required +"extra" libraries (aside from -lm, which always is required) are +specified in that file's EXTRA_LIBS variable. For example, under +Linux you will find: + + grep EXTRA_LIBS Makefile + EXTRA_LIBS = -ldl + ... + + + +The Funtools library contains both the zlib library +(http://www.gzip.org/zlib/) and Doug Mink's WCS library +(http://tdc-www.harvard.edu/software/wcstools/). It is not necessary +to put these libraries on a Funtools link line. Include files +necessary for using these libraries are installed in the Funtools +include directory. + +B<Funtools Programming Tutorial> + +The +FunOpen() +function is used to open a FITS file, an array, or a raw event file: + + /* open the input FITS file for reading */ + ifun = FunOpen(iname, "r", NULL); + /* open the output FITS file for writing, and connect it to the input file */ + ofun = FunOpen(iname, "w", ifun); + +A new output file can inherit header parameters automatically from +existing input file by passing the input Funtools handle as the last +argument to the new file's +FunOpen() +call as shown above. + + +For image data, you then can call +FunImageGet() +to read an image into memory. + + float buf=NULL; + /* extract and bin the data section into an image buffer */ + buf = FunImageGet(fun, NULL, "bitpix=-32"); + +If the (second) buf argument to this call is NULL, buffer space is allocated +automatically. The (third) plist argument can be used to specify the +return data type of the array. If NULL is specified, the data type of +the input file is used. + + +To process an image buffer, you would generally make a call to +FunInfoGet() to determine the +dimensions of the image (which may have been changed from the original +file dimensions due to Funtools image +sectioning on the command line). In a FITS image, the index along +the dim1 axis varies most rapidly, followed by the dim2 axis, etc. +Thus, to access each pixel in an 2D image, use a double loop such as: + + buf = FunImageGet(fun, NULL, "bitpix=-32"); + FunInfoGet(fun, FUN_SECT_DIM1, &dim1, FUN_SECT_DIM2, &dim2, 0); + for(i=1; i<=dim2; i++){ + for(j=1; j<=dim1; j++){ + ... process buf[((i-1)*dim1)+(j-1)] ... + } + } + +or: + + buf = FunImageGet(fun, NULL, "bitpix=-32"); + FunInfoGet(fun, FUN_SECT_DIM1, &dim1, FUN_SECT_DIM2, &dim2, 0); + for(i=0; i<(dim1*dim2); i++){ + ... process buf[i] ... + } + +Finally, you can write the resulting image to disk using +FunImagePut(): + + FunImagePut(fun2, buf, dim1, dim2, -32, NULL); + +Note that Funtools automatically takes care of book-keeping tasks such as +reading and writing FITS headers (although you can, of course, write +your own header or add your own parameters to a header). + + +For binary tables and raw event files, a call to +FunOpen() +will be followed by a call to the +FunColumnSelect() +routine to select columns to be read from the input file and/or +written to the output file: + + + typedef struct evstruct{ + double time; + int time2; + } *Ev, EvRec; + FunColumnSelect(fun, sizeof(EvRec), NULL, + "time", "D", "rw", FUN_OFFSET(Ev, time), + "time2", "J", "w", FUN_OFFSET(Ev, time2), + NULL); + +Columns whose (third) mode argument contains an "r" are "readable", +i.e., columns will be read from the input file and converted into the +data type specified in the call's second argument. These columns +values then are stored in the specified offset of the user record +structure. Columns whose mode argument contains a "w" are +"writable", i.e., these values will be written to the output file. +The +FunColumnSelect() +routine also offers the option of automatically merging user +columns with the original input columns when writing the output +rows. + + +Once a set of columns has been specified, you can retrieve rows using +FunTableRowGet(), +and write the rows using +FunTableRowPut(): + + Ev ebuf, ev; + /* get rows -- let routine allocate the array */ + while( (ebuf = (Ev)FunTableRowGet(fun, NULL, MAXROW, NULL, &got)) ){ + /* process all rows */ + for(i=0; i<got; i++){ + /* point to the i'th row */ + ev = ebuf+i; + /* time2 is generated here */ + ev->time2 = (int)(ev->time+.5); + /* change the input time as well */ + ev->time = -(ev->time/10.0); + } + /* write out this batch of rows with the new column */ + FunTableRowPut(fun2, (char *)ebuf, got, 0, NULL); + /* free row data */ + if( ebuf ) free(ebuf); + } + +The input rows are retrieved into an array of user structs, which +can be accessed serially as shown above. Once again, Funtools +automatically takes care of book-keeping tasks such as reading and writing +FITS headers (although you can, of course, write your own header or +add your own parameters to a header). + + +When all processing is done, you can call +FunClose() +to close the file(s): + + FunClose(fun2); + FunClose(fun); + + + +These are the basics of processing FITS files (and arrays or raw event +data) using Funtools. The routines in these examples are described in +more detail below, along with a few other routines that support +parameter access, data flushing, etc. + +B<Compiling and Linking> + +To create a Funtools application, a software developer will include +the funtools.h definitions file in Funtools code: + + #include <funtools.h> + +The program is linked against the libfuntools.a library, along with the +math library (and the dynamic load library, if the latter is available +on your system): + + gcc -o foo foo.c -lfuntools -ldl -lm + + +If gcc is used, Funtools filtering can be performed using dynamically +loaded shared objects that are built at run-time. Otherwise, filtering +is performed using a slave process. + +Funtools has been built on the following systems: + + +=over 4 + + + + +=item * + +Sun/Solaris 5.X + + +=item * + +Linux/RedHat Linux 5.X,6.X,7.X + + +=item * + +Dec Alpha/OSF1 V4.X + + +=item * + +WindowsNT/Cygwin 1.0 + + +=item * + +SGI/IRIX64 6.5 + + +=back + + + +B<A Short Digression on Subroutine Order> + +There is a natural order for all I/O access libraries. You would not +think of reading a file without first opening it, or writing a file +after closing it. A large part of the experiment in funtools is to use +the idea of "natural order" as a means of making programming +easier. We do this by maintaining the state of processing for a given +funtools file, so that we can do things like write headers and flush +extension padding at the right time, without you having to do it. + + +For example, if you open a new funtools file for writing using +FunOpen(), +then generate an array of image data and call +FunImagePut(), +funtools knows to write the image header automatically. +There is no need to think about writing a standard header. +Of course, you can add parameters to the file first by +calling one of the +FunParamPut() +routines, and these parameters will automatically be added +to the header when it is written out. There still is no +need to write the header explicitly. + + +Maintaining state in this way means that there are certain rules of +order which should be maintained in any funtools program. In particular, +we strongly recommend the following ordering rules be adhered to: + + + +=over 4 + + + + +=item * + +When specifying that input extensions be copied to an output file +via a reference handle, open the output file B<before> reading the +input file. (Otherwise the initial copy will not occur). + + + +=item * + +Always write parameters to an output file using one of the +FunParamPut() calls +B<before> writing any data. (This is a good idea for all FITS +libraries, to avoid having to recopy data is the FITS header needs +to be extended by adding a single parameter.) + + + +=item * + +If you retrieve an image, and need to know the data +type, use the FUN_SECT_BITPIX option of +FunInfoGet(), +B<after> calling +FunImageGet(), since +it is possible to change the value of BITPIX from the latter. + + + +=item * + +When specifying that input extensions be copied to an output file +via a reference handle, close the output file B<before> closing +input file, or else use +FunFlush() +explicitly on the output file +B<before> closing the input file. (Otherwise the final copy will +not occur). + + +=back + + + + +We believe that these are the natural rules that are implied in most +FITS programming tasks. However, we recognize that making explicit use +of "natural order" to decide what automatic action to take on behalf +of the programmer is experimental. Therefore, if you find that your +needs are not compatible with our preferred order, please let us know +-- it will be most illuminating for us as we evaluate this experiment. + +B<Funtools Programming Examples> + +The following complete coding examples are provided to illustrate the +simplicity of Funtools applications. They can be found in the funtest +subdirectory of the Funtools distribution. In many cases, you should +be able to modify one of these programs to generate your own Funtools +program: + + +=over 4 + + + + +=item * + +evread.c: read and write binary tables + + +=item * + +evcols.c: add column and rows to binary tables + + +=item * + +evmerge.c: merge new columns with existing columns + + +=item * + +evnext.c: manipulate raw data pointers + + +=item * + +imblank.c: blank out image values below a threshold + + +=item * + +asc2fits.c: convert a specific ASCII table to FITS binary table + + +=back + + + +B<The Funtools Programming Reference Manual> + + +#include <funtools.h> + +Fun FunOpen(char *name, char *mode, Fun ref) + +void *FunImageGet(Fun fun, void *buf, char *plist) + +int FunImagePut(Fun fun, void *buf, int dim1, int dim2, int bitpix, char *plist) + +void * FunImageRowGet(Fun fun, void *buf, int rstart, int rstop, char *plist) + +void * FunImageRowPut(Fun fun, void *buf, int rstart, int rstop, int dim1, int dim2, int bitpix, char *plist) + +int FunColumnSelect(Fun fun, int size, char *plist, ...) + +void FunColumnActivate(Fun fun, char *s, char *plist) + +int FunColumnLookup(Fun fun, char *s, int which, char **name, int *type, int *mode, int *offset, int *n, int *width) + +void *FunTableRowGet(Fun fun, void *rows, int maxrow, char *plist, int *nrow) + +int FunTableRowPut(Fun fun, void *rows, int nev, int idx, char *plist) + +int FunParamGetb(Fun fun, char *name, int n, int defval, int *got) + +int FunParamGeti(Fun fun, char *name, int n, int defval, int *got) + +double FunParamGetd(Fun fun, char *name, int n, double defval, int *got) + +char *FunParamGets(Fun fun, char *name, int n, char *defval, int *got) + +int FunParamPutb(Fun fun, char *name, int n, int value, char *comm, int append) + +int FunParamPuti(Fun fun, char *name, int n, int value, char *comm, int append) + +int FunParamPutd(Fun fun, char *name, int n, double value, int prec, char *comm, int append) + +int FunParamPuts(Fun fun, char *name, int n, char *value, char *comm, int append) + +int FunInfoGet(Fun fun, int type, ...) + +int FunInfoPut(Fun fun, int type, ...) + +void FunFlush(Fun fun, char *plist) + +void FunClose(Fun fun) + + + + + +=head1 SEE ALSO + + + +See funtools(n) for a list of Funtools help pages + + +=cut |