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
|
#include <funtools.h>
/* if defined, user allocated row buffer, otherwise let funtools do it */
/* #define USER_ALLOC 1 */
#define MAXROW 100000
typedef struct evstruct{
double x, y;
int *phas;
} *Ev, EvRec;
void Reverse(double x, double y, int *phas,
double *nx, double *ny, int *nphas, int npha)
{
int i;
*nx = y;
*ny = x;
for(i=0; i<npha; i++){
nphas[npha-(i+1)] = phas[i];
}
}
int main(int argc, char **argv)
{
int i;
int got;
int npha;
char tbuf[SZ_LINE];
Ev ebuf, ev, nev;
Fun fun, fun2;
/* make sure we have minimal arguments */
if( argc < 3 ){
fprintf(stderr, "usage: %s iname oname [columns]\n", argv[0]);
exit(1);
}
/* exit on gio errors */
setgerror(2);
/* open input FITS file for reading, and allowing copy of other extensions */
if( !(fun = FunOpen(argv[1], "rc", NULL)) )
gerror(stderr, "could not FunOpen input file: %s\n", argv[1]);
/* look for the size of the phas vector */
if( !FunColumnLookup(fun, "phas", 0, NULL, NULL, NULL, NULL, &npha, NULL) )
gerror(stderr, "can't find phas column\n");
/* open the output FITS image, inheriting params from input */
if( !(fun2 = FunOpen(argv[2], "w", fun)) )
gerror(stderr, "could not FunOpen output file: %s\n", argv[2]);
/* allocate a new row buffer, now that we know the size of phas */
nev = (Ev)calloc(1, sizeof(EvRec));
nev->phas = (int *)calloc(npha, sizeof(int));
/* create format statement for the pha vector, @ means its a pointer */
sprintf(tbuf, "@%dJ", npha);
/* specify input columns we want brought into user space */
FunColumnSelect(fun, sizeof(EvRec), "merge=replace",
"$x", "D", "rw", FUN_OFFSET(Ev, x),
"$y", "D", "rw", FUN_OFFSET(Ev, y),
"phas", tbuf, "rw", FUN_OFFSET(Ev, phas),
NULL);
/* set columns to be written to the output file */
if( argc >= 4 )
FunColumnActivate(fun, argv[3], NULL);
/* loop through rows and replicate */
while( (ebuf=(Ev)FunTableRowGet(fun, NULL, MAXROW, NULL, &got)) ){
for(i=0; i<got; i++){
/* get pointer to the user info containing x,y, phas */
ev = ebuf+i;
/* generate a new rows (with new x, y, phas values) */
Reverse(ev->x, ev->y, ev->phas,
&(nev->x), &(nev->y), nev->phas, npha);
/* write this new row -- with the replacements from user space */
FunTableRowPut(fun2, nev, 1, i, NULL);
}
if( ebuf ) free(ebuf);
}
/* free the new row */
if( nev ){
if( nev->phas ) free(nev->phas);
free(nev);
}
/* close output before input so that funtools will copy the rest of the
input extensions to the output (if such copy is requred) */
FunClose(fun2);
FunClose(fun);
return(0);
}
|