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
|
/*
*
* evmerge2.c -- example program for combining extensions from 2 binary tables
* we write the primary extension of file 1 along with its event extension,
* and the GTI extension of file2.
*
*/
#include <funtools.h>
#define MAXROW 8192
typedef struct gtistruct{
double start, stop;
} *GTI, GTIRec;
/* sample event struct */
typedef struct evstruct{
double time;
} *Ev, EvRec;
int main (int argc, char **argv)
{
int i, j;
int get, got;
int ngti;
char *idx;
char tbuf[SZ_LINE];
Fun ifun1, ifun2, ofun;
GTI gtibuf=NULL, gti;
Ev ebuf=NULL, ev;
/* exit on gio errors */
setgerror(2);
/* make sure we have minimal arguments */
if( argc < 4 )
gerror(stderr, "usage: %s iname1 iname2 oname\n", argv[0]);
/* open a new output FITS file */
if( !(ofun = FunOpen(argv[3], "w", NULL)) )
gerror(stderr, "could not FunOpen output file: %s\n", argv[2]);
/* open the primary extension of the event file (file #1) and output it */
/* first strip off the event extension from the filename */
strcpy(tbuf, argv[1]);
if( (idx=strchr(tbuf, '[')) ) *idx = '\0';
/* add '[0]' to denote primary */
strcat(tbuf, "[0]");
/* open primary extension */
if( !(ifun1 = FunOpen(tbuf, "r", NULL)) )
gerror(stderr, "could not FunOpen primary extension of file1: %s\n", tbuf);
/* make this extension the reference handle for the output file */
FunInfoPut(ofun, FUN_IFUN, &ifun1, 0);
/* a flush will write primary extension to the output file */
FunFlush(ofun, "copy=reference");
/* close primary */
FunClose(ifun1);
/* open the GTI file (file #2) */
strcpy(tbuf, argv[2]);
/* add GTI extension, if user left it off */
if( !(idx=strchr(tbuf, '[')) ) strcat(tbuf, "[GTI]");
if( !(ifun2 = FunOpen(tbuf, "r", NULL)) )
gerror(stderr, "could not FunOpen input GTI file: %s\n", tbuf);
/* select columns that we need to process */
/* NB: this is the entire GTI record (start,stop) */
FunColumnSelect(ifun2, sizeof(GTIRec), NULL,
"START", "D", "rw", FUN_OFFSET(GTI, start),
"STOP", "D", "rw", FUN_OFFSET(GTI, stop),
NULL);
/* read and store all GTI records for later processing and output */
ngti = FunParamGeti(ifun2, "NAXIS2", 0, 0, &get);
gtibuf = FunTableRowGet(ifun2, NULL, ngti, NULL, &got);
/* open the EVENTS extension (file #1) */
strcpy(tbuf, argv[1]);
/* add EVENTS extension, if user left it off */
if( !(idx=strchr(tbuf, '[')) ) strcat(tbuf, "[EVENTS]");
if( !(ifun1 = FunOpen(tbuf, "r", NULL)) )
gerror(stderr, "could not FunOpen EVENTS input file: %s\n", tbuf);
/* we need the time to get the right gti record */
FunColumnSelect(ifun1, sizeof(EvRec), "merge=update",
"TIME", "D", "rw", FUN_OFFSET(Ev, time),
NULL);
/* make this extension the reference handle for the output file */
FunInfoPut(ofun, FUN_IFUN, &ifun1, 0);
/* get input rows (let routine allocate the row array) */
while( (ebuf = (Ev)FunTableRowGet(ifun1, NULL, MAXROW, NULL, &got)) ){
/* process each row */
for(i=0; i<got; i++){
/* point to the i'th row */
ev = ebuf+i;
/* look through gti records for the right one */
for(j=0; j<ngti; j++){
gti = gtibuf + j;
/* if this row is in a good time interval, writ it out */
if( (ev->time > gti->start) && (ev->time <= gti->stop) ){
FunTableRowPut(ofun, (char *)ev, 1, i, NULL);
break;
}
}
}
/* free row data */
if( ebuf ) free(ebuf);
}
/* flush output extension (write padding, etc.) so we can start next one */
FunFlush(ofun, NULL);
/* we now write the gti records into the extension following the rows */
/* make the GTI extension the reference handle for the output file, which
also sets up the default columns from the input gti file */
FunInfoPut(ofun, FUN_IFUN, &ifun2, 0);
/* write the GTI records */
FunTableRowPut(ofun, (char *)gtibuf, ngti, 0, NULL);
/* close output */
FunClose(ofun);
/* close the inputs */
FunClose(ifun1);
FunClose(ifun2);
/* free gti buffer */
if( gtibuf ) free(gtibuf);
return(0);
}
|