Provided by: libfuntools-dev_1.4.8-1.1build2_amd64 bug

NAME

       FunRef - the Funtools Reference Handle

SYNOPSIS

       A  description  of  how  to use a Funtools reference handle to connect a Funtools input file to an output
       file.

DESCRIPTION

       The Funtools reference handle connects a Funtools input file to a Funtools output file so that parameters
       (or even whole extensions) can be copied from the one to the other. To make the connection, the  Funtools
       handle of the input file is passed to the final argument of the FunOpen() call for the output file:

         if( !(ifun = FunOpen(argv[1], "r", NULL)) )
           gerror(stderr, "could not FunOpen input file: %s\n", argv[1]);
         if( !(ofun = FunOpen(argv[2], "w", ifun)) )
           gerror(stderr, "could not FunOpen output file: %s\n", argv[2]);

       It  does  not  matter what type of input or output file (or extension) is opened, or whether they are the
       same type. When the output image or binary table is written using FunImagePut()  or  FunTableRowPut()  an
       appropriate  header  will  be  written first, with parameters copied from the input extension. Of course,
       invalid parameters will be removed first, e.g., if the input is a binary  table  and  the  output  is  an
       image,  then  binary  table  parameters  such  as TFORM, TUNIT, etc. parameters will not be copied to the
       output.

       Use of a reference handle also allows default values to be passed to FunImagePut() in order to write  out
       an  output  image with the same dimensions and data type as the input image. To use the defaults from the
       input, a value of 0 is entered for dim1, dim2, and bitpix. For example:

         fun = FunOpen(argv[1], "r", NULL);
         fun2 = FunOpen(argv[2], "w", fun);
         buf = FunImageGet(fun, NULL, NULL);
         ... process image data ...
         FunImagePut(fun2, buf, 0, 0, 0, NULL);

       Of course, you often want to get information about  the  data  type  and  dimensions  of  the  image  for
       processing. The above code is equivalent to the following:

         fun = FunOpen(argv[1], "r", NULL);
         fun2 = FunOpen(argv[2], "w", fun);
         buf = FunImageGet(fun, NULL, NULL);
         FunInfoGet(fun, FUN_SECT_DIM1, &dim1, FUN_SECT_DIM2, &dim2,
                    FUN_SECT_BITPIX, &bitpix, 0);
         ... process image data ...
         FunImagePut(fun2, buf, dim1, dim2, bitpix, NULL);

       It  is  possible to change the reference handle for a given output Funtools handle using the FunInfoPut()
       routine:

         /* make the new extension the reference handle for the output file */
         FunInfoPut(fun2, FUN_IFUN, &fun, 0);

       When this is done, Funtools specially resets the output file to start a new output  extension,  which  is
       connected  to  the  new  input  reference  handle.  You  can use this mechanism to process multiple input
       extensions into a single output file, by successively opening the former and setting the reference handle
       for the latter. For example:

         /* open a new output FITS file */
         if( !(fun2 = FunOpen(argv[2], "w", NULL)) )
           gerror(stderr, "could not FunOpen output file: %s\n", argv[2]);
         /* process each input extension in turn */
         for(ext=0; ;ext++){
           /* get new extension name */
           sprintf(tbuf, "%s[%d]", argv[1], ext);
           /* open it -- if we cannot open it, we are done */
           if( !(fun=FunOpen(tbuf, "r", NULL)) )
             break;
           /* make the new extension the reference handle for the output file */
           FunInfoPut(fun2, FUN_IFUN, &fun, 0);
           ... process ...
           /* flush output extension (write padding, etc.) */
           FunFlush(fun2, NULL);
           /* close the input extension */
           FunClose(fun);
         }

       In this example, the output file is opened first. Then each successive input extension is opened, and the
       output reference handle is set to the newly opened input handle. After data processing is performed,  the
       output  extension  is  flushed  and  the  input  extension  is  closed, in preparation for the next input
       extension.

       Finally, a reference handle can be used to copy other extensions from the input file to the output  file.
       Copy of other extensions is controlled by adding a "C" or "c" to the mode string of the FunOpen() call of
       the  input  reference  file.  If "C" is specified, then other extensions are always copied (i.e., copy is
       forced by the application).  If "c" is used, then other  extensions  are  copied  if  the  user  requests
       copying  by  adding a plus sign "+" to the extension name in the bracket specification.  For example, the
       funtable program utilizes user-specified "c" mode  so  that  the  second  example  below  will  copy  all
       extensions:

         # copy only the EVENTS extension
         csh> funtable "test.ev[EVENTS,circle(512,512,10)]" foo.ev
         # copy ALL extensions
         csh> funtable "test.ev[EVENTS+,circle(512,512,10)]" foo.ev

       When  extension  copy  is specified in the input file, the call to FunOpen() on the input file delays the
       actual file open until the output file also is opened (or until I/O is performed on the input file, which
       ever happens first). Then, when the output file is opened, the  input  file  is  also  opened  and  input
       extensions  are copied to the output file, up to the specific extension being opened. Processing of input
       and output extensions then proceed.

       When extension processing is complete, the remaining extensions need to be copied from input  to  output.
       This can be done explicitly, using the FunFlush() call with the "copy=remaining" plist:

         FunFlush(fun, "copy=remaining");

       Alternatively, this will happen automatically, if the output file is closed before the input file:

         /* we could explicitly flush remaining extensions that need copying */
         /* FunFlush(fun2, "copy=remaining"); */
         /* but if we close output before input, end flush is done automatically  */
         FunClose(fun2);
         FunClose(fun);

SEE ALSO

       See funtools(7) for a list of Funtools help pages

version 1.4.5                                    April 14, 2011                                        funref(3)