1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 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 */
}
|