aboutsummaryrefslogtreecommitdiff
path: root/vendor/cfitsio/iter_a.c
diff options
context:
space:
mode:
authorJoseph Hunkeler <jhunkeler@gmail.com>2015-07-08 20:46:52 -0400
committerJoseph Hunkeler <jhunkeler@gmail.com>2015-07-08 20:46:52 -0400
commitfa080de7afc95aa1c19a6e6fc0e0708ced2eadc4 (patch)
treebdda434976bc09c864f2e4fa6f16ba1952b1e555 /vendor/cfitsio/iter_a.c
downloadiraf-linux-fa080de7afc95aa1c19a6e6fc0e0708ced2eadc4.tar.gz
Initial commit
Diffstat (limited to 'vendor/cfitsio/iter_a.c')
-rw-r--r--vendor/cfitsio/iter_a.c147
1 files changed, 147 insertions, 0 deletions
diff --git a/vendor/cfitsio/iter_a.c b/vendor/cfitsio/iter_a.c
new file mode 100644
index 00000000..19ea1d1c
--- /dev/null
+++ b/vendor/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 */
+}