diff options
author | Joseph Hunkeler <jhunkeler@gmail.com> | 2015-07-08 20:46:52 -0400 |
---|---|---|
committer | Joseph Hunkeler <jhunkeler@gmail.com> | 2015-07-08 20:46:52 -0400 |
commit | fa080de7afc95aa1c19a6e6fc0e0708ced2eadc4 (patch) | |
tree | bdda434976bc09c864f2e4fa6f16ba1952b1e555 /pkg/tbtables/cfitsio/iter_a.c | |
download | iraf-linux-fa080de7afc95aa1c19a6e6fc0e0708ced2eadc4.tar.gz |
Initial commit
Diffstat (limited to 'pkg/tbtables/cfitsio/iter_a.c')
-rw-r--r-- | pkg/tbtables/cfitsio/iter_a.c | 147 |
1 files changed, 147 insertions, 0 deletions
diff --git a/pkg/tbtables/cfitsio/iter_a.c b/pkg/tbtables/cfitsio/iter_a.c new file mode 100644 index 00000000..19ea1d1c --- /dev/null +++ b/pkg/tbtables/cfitsio/iter_a.c @@ -0,0 +1,147 @@ +#include <string.h> +#include <stdio.h> +#include <stdlib.h> +#include "fitsio.h" + +/* + This program illustrates how to use the CFITSIO iterator function. + It reads and modifies the input 'iter_a.fit' file by computing a + value for the 'rate' column as a function of the values in the other + 'counts' and 'time' columns. +*/ +main() +{ + extern flux_rate(); /* external work function is passed to the iterator */ + fitsfile *fptr; + iteratorCol cols[3]; /* structure used by the iterator function */ + int n_cols; + long rows_per_loop, offset; + + int status, nkeys, keypos, hdutype, ii, jj; + char filename[] = "iter_a.fit"; /* name of rate FITS file */ + + status = 0; + + fits_open_file(&fptr, filename, READWRITE, &status); /* open file */ + + /* move to the desired binary table extension */ + if (fits_movnam_hdu(fptr, BINARY_TBL, "RATE", 0, &status) ) + fits_report_error(stderr, status); /* print out error messages */ + + n_cols = 3; /* number of columns */ + + /* define input column structure members for the iterator function */ + fits_iter_set_by_name(&cols[0], fptr, "COUNTS", TLONG, InputCol); + fits_iter_set_by_name(&cols[1], fptr, "TIME", TFLOAT, InputCol); + fits_iter_set_by_name(&cols[2], fptr, "RATE", TFLOAT, OutputCol); + + rows_per_loop = 0; /* use default optimum number of rows */ + offset = 0; /* process all the rows */ + + /* apply the rate function to each row of the table */ + printf("Calling iterator function...%d\n", status); + + fits_iterate_data(n_cols, cols, offset, rows_per_loop, + flux_rate, 0L, &status); + + fits_close_file(fptr, &status); /* all done */ + + if (status) + fits_report_error(stderr, status); /* print out error messages */ + + return(status); +} +/*--------------------------------------------------------------------------*/ +int flux_rate(long totalrows, long offset, long firstrow, long nrows, + int ncols, iteratorCol *cols, void *user_strct ) + +/* + Sample iterator function that calculates the output flux 'rate' column + by dividing the input 'counts' by the 'time' column. + It also applies a constant deadtime correction factor if the 'deadtime' + keyword exists. Finally, this creates or updates the 'LIVETIME' + keyword with the sum of all the individual integration times. +*/ +{ + int ii, status = 0; + + /* declare variables static to preserve their values between calls */ + static long *counts; + static float *interval; + static float *rate; + static float deadtime, livetime; /* must preserve values between calls */ + + /*--------------------------------------------------------*/ + /* Initialization procedures: execute on the first call */ + /*--------------------------------------------------------*/ + if (firstrow == 1) + { + if (ncols != 3) + return(-1); /* number of columns incorrect */ + + if (fits_iter_get_datatype(&cols[0]) != TLONG || + fits_iter_get_datatype(&cols[1]) != TFLOAT || + fits_iter_get_datatype(&cols[2]) != TFLOAT ) + return(-2); /* bad data type */ + + /* assign the input pointers to the appropriate arrays and null ptrs*/ + counts = (long *) fits_iter_get_array(&cols[0]); + interval = (float *) fits_iter_get_array(&cols[1]); + rate = (float *) fits_iter_get_array(&cols[2]); + + livetime = 0; /* initialize the total integration time */ + + /* try to get the deadtime keyword value */ + fits_read_key(cols[0].fptr, TFLOAT, "DEADTIME", &deadtime, '\0', + &status); + if (status) + { + deadtime = 1.0; /* default deadtime if keyword doesn't exist */ + } + else if (deadtime < 0. || deadtime > 1.0) + { + return(-1); /* bad deadtime value */ + } + + printf("deadtime = %f\n", deadtime); + } + + /*--------------------------------------------*/ + /* Main loop: process all the rows of data */ + /*--------------------------------------------*/ + + /* NOTE: 1st element of array is the null pixel value! */ + /* Loop from 1 to nrows, not 0 to nrows - 1. */ + + /* this version tests for null values */ + rate[0] = DOUBLENULLVALUE; /* define the value that represents null */ + + for (ii = 1; ii <= nrows; ii++) + { + if (counts[ii] == counts[0]) /* undefined counts value? */ + { + rate[ii] = DOUBLENULLVALUE; + } + else if (interval[ii] > 0.) + { + rate[ii] = counts[ii] / interval[ii] / deadtime; + livetime += interval[ii]; /* accumulate total integration time */ + } + else + return(-2); /* bad integration time */ + } + + /*-------------------------------------------------------*/ + /* Clean up procedures: after processing all the rows */ + /*-------------------------------------------------------*/ + + if (firstrow + nrows - 1 == totalrows) + { + /* update the LIVETIME keyword value */ + + fits_update_key(cols[0].fptr, TFLOAT, "LIVETIME", &livetime, + "total integration time", &status); + printf("livetime = %f\n", livetime); + } + return(0); /* return successful status */ +} |