forked from healpy/cfitsio
-
Notifications
You must be signed in to change notification settings - Fork 0
/
iter_a.c
147 lines (119 loc) · 5.13 KB
/
iter_a.c
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 */
}