summaryrefslogtreecommitdiffstats
path: root/funtools/funtest/evread.c
diff options
context:
space:
mode:
Diffstat (limited to 'funtools/funtest/evread.c')
-rw-r--r--funtools/funtest/evread.c363
1 files changed, 363 insertions, 0 deletions
diff --git a/funtools/funtest/evread.c b/funtools/funtest/evread.c
new file mode 100644
index 0000000..f93d80c
--- /dev/null
+++ b/funtools/funtest/evread.c
@@ -0,0 +1,363 @@
+/*
+ *
+ * evread.c -- example program for reading rows in different ways
+ *
+ */
+
+#include <funtoolsP.h>
+
+#define MAXROW 10000
+
+extern char *optarg;
+extern int optind;
+
+/* single event (used in array of structs) */
+typedef struct evstruct{
+ short region;
+ double x, y;
+ int pi, pha;
+ double time;
+ double dx, dy;
+} *Ev, EvRec;
+
+/* arrays of columns (used in struct of arrays) */
+typedef struct aevstruct{
+ short region[MAXROW];
+ double x[MAXROW], y[MAXROW];
+ int pi[MAXROW], pha[MAXROW];
+ double time[MAXROW];
+ double dx[MAXROW], dy[MAXROW];
+} *AEv, AEvRec;
+
+/* pointers to arrays of columns (used in struct of arrays) */
+typedef struct pevstruct{
+ short *region;
+ double *x, *y;
+ int *pi, *pha;
+ double *time;
+ double *dx, *dy;
+} *PEv, PEvRec;
+
+#ifdef ANSI_FUNC
+int
+main (int argc, char **argv)
+#else
+main(argc, argv)
+ int argc;
+ char **argv;
+#endif
+{
+ int i;
+ int c;
+ int got;
+ int put;
+ int args;
+ int ncol;
+ int ctype, cn, tcol;
+ int doev=0;
+ int doseek=0;
+ int doualloc=0;
+ int nrow;
+ int maxrow;
+ char tbuf[SZ_LINE];
+ char *mode="r";
+ char *iname;
+ char *oname=NULL;
+ char *params=NULL;
+ char *cname;
+ Fun fun=NULL;
+ Fun ofun=NULL;
+ void *buf=NULL;
+ Ev ev, ebuf=NULL;
+ AEv aev, abuf=NULL;
+ PEv pev, pbuf=NULL;
+ FITSHead header=NULL;
+ FunCol *cols;
+
+ /* process switch arguments */
+ while ((c = getopt(argc, argv, "aepusw:")) != -1){
+ switch(c){
+ case 'a':
+ doev = 1;
+ params = "org=soa";
+ break;
+ case 'e':
+ doev = 0;
+ params = "org=aos";
+ break;
+ case 'f':
+ doev = 3;
+ params = "org=aos";
+ break;
+ case 'p':
+ doev = 2;
+ params = "org=soa";
+ break;
+ case 's':
+ doseek = 1;
+ break;
+ case 'u':
+ doualloc = 1;
+ break;
+ case 'w':
+ oname = optarg;
+ mode = "rw";
+ break;
+ }
+ }
+
+ /* check for required arguments */
+ args = argc - optind;
+ if( args == 0 )
+ iname = "test.ev[EVENTS]";
+ else
+ iname = argv[optind];
+
+ /* open input file */
+ if( !(fun = FunOpen(iname, "r", NULL)) ){
+ gerror(stderr, "could not FunOpen %s\n", iname);
+ exit(1);
+ }
+
+ /* open output file, if necessary */
+ if( oname ){
+ if( !(ofun = FunOpen(oname, "w", fun)) ){
+ gerror(stderr, "could not FunOpen outout %s\n", oname);
+ exit(1);
+ }
+ }
+
+ /* set number of rows to read at once */
+ if( doseek )
+ maxrow = 1;
+ else
+ maxrow = MAXROW;
+
+ /* display column information from raw data file */
+ /* first get fitsy header info */
+ FunInfoGet(fun, FUN_HEADER, &header, FUN_COLS, &cols, FUN_NCOL, &ncol, 0);
+ if( !header->table ){
+ gerror(stderr, "not a table\n");
+ exit(1);
+ }
+ fprintf(stdout, " name\t type\t n\t col\t otype\t scaled\n");
+ fprintf(stdout, "-------\t-------\t-------\t-------\t-------\t-------\n");
+ for(i=0; i<ncol; i++){
+ /* current type info, which might have a changed data type if its scaled */
+ if( !FunColumnLookup(fun, NULL, i,
+ &cname, &ctype, NULL, NULL, &cn, NULL) ){
+ gerror(stderr, "missing column %d\n", i);
+ exit(1);
+ }
+ /* non-negative tcols point to raw columns in FITS table, where we can
+ determine the original data type and whether scaling params exist */
+ if( (tcol = cols[i]->tcol) >= 0 ){
+ fprintf(stdout, "%7s\t%7c\t%7d\t%7d\t%7c\t%7d\n",
+ cname, ctype, cn,
+ tcol,
+ header->table->col[tcol].type,
+ header->table->col[tcol].scaled);
+ }
+ }
+ fprintf(stdout, "\n");
+
+ /* specify columns we want */
+ switch(doev){
+ /* array of structs */
+ case 0:
+ got = FunColumnSelect(fun, sizeof(EvRec), params,
+ "x", "D:10:10", mode, FUN_OFFSET(Ev, x),
+ "y", "D:10:10", mode, FUN_OFFSET(Ev, y),
+ "pha", "J", mode, FUN_OFFSET(Ev, pha),
+ "pi", "J", mode, FUN_OFFSET(Ev, pi),
+ "time", "1D", mode, FUN_OFFSET(Ev, time),
+ "dx", "D:10:10", mode, FUN_OFFSET(Ev, dx),
+ "dy", "D:10:10", mode, FUN_OFFSET(Ev, dy),
+ "$region", "I", mode, FUN_OFFSET(Ev, region),
+ NULL);
+ if( doualloc ){
+ ebuf = calloc(MAXROW, sizeof(EvRec));
+ buf = ebuf;
+ }
+ break;
+ /* struct of arrays */
+ case 1:
+ got = FunColumnSelect(fun, sizeof(AEvRec), params,
+ "x", "D:10:10", mode, FUN_OFFSET(AEv, x),
+ "y", "D:10:10", mode, FUN_OFFSET(AEv, y),
+ "pha", "J", mode, FUN_OFFSET(AEv, pha),
+ "pi", "J", mode, FUN_OFFSET(AEv, pi),
+ "time", "1D", mode, FUN_OFFSET(AEv, time),
+ "dx", "D:10:10", mode, FUN_OFFSET(AEv, dx),
+ "dy", "D:10:10", mode, FUN_OFFSET(AEv, dy),
+ "$region", "I", mode, FUN_OFFSET(AEv, region),
+ NULL);
+ if( doualloc ){
+ abuf = calloc(1, sizeof(AEvRec));
+ buf = abuf;
+ }
+ break;
+ /* struct of pointers */
+ case 2:
+ got = FunColumnSelect(fun, sizeof(PEvRec), params,
+ "x", "@D:10:10", mode, FUN_OFFSET(PEv, x),
+ "y", "@D:10:10", mode, FUN_OFFSET(PEv, y),
+ "pha", "@J", mode, FUN_OFFSET(PEv, pha),
+ "pi", "@J", mode, FUN_OFFSET(PEv, pi),
+ "time", "@1D", mode, FUN_OFFSET(PEv, time),
+ "dx", "@D:10:10", mode, FUN_OFFSET(PEv, dx),
+ "dy", "@D:10:10", mode, FUN_OFFSET(PEv, dy),
+ "$region", "@I", mode, FUN_OFFSET(PEv, region),
+ NULL);
+ if( doualloc ){
+ pbuf = calloc(1, sizeof(PEvRec));
+ pbuf->region = calloc(MAXROW, sizeof(short));
+ pbuf->x = calloc(MAXROW, sizeof(double));
+ pbuf->y = calloc(MAXROW, sizeof(double));
+ pbuf->pi = calloc(MAXROW, sizeof(int));
+ pbuf->pha = calloc(MAXROW, sizeof(int));
+ pbuf->time = calloc(MAXROW, sizeof(double));
+ pbuf->dx = calloc(MAXROW, sizeof(double));
+ pbuf->dy = calloc(MAXROW, sizeof(double));
+ buf = pbuf;
+ }
+ break;
+ /* array of structs containing pointers */
+ case 3:
+ got = FunColumnSelect(fun, sizeof(PEvRec), params,
+ "x", "@D:10:10", mode, FUN_OFFSET(PEv, x),
+ "y", "@D:10:10", mode, FUN_OFFSET(PEv, y),
+ "pha", "@J", mode, FUN_OFFSET(PEv, pha),
+ "pi", "@J", mode, FUN_OFFSET(PEv, pi),
+ "time", "@1D", mode, FUN_OFFSET(PEv, time),
+ "dx", "@D:10:10", mode, FUN_OFFSET(PEv, dx),
+ "dy", "@D:10:10", mode, FUN_OFFSET(PEv, dy),
+ "$region", "@I", mode, FUN_OFFSET(PEv, region),
+ NULL);
+ if( doualloc ){
+ pbuf = calloc(1, sizeof(PEvRec));
+ pbuf->region = calloc(1, sizeof(short));
+ pbuf->x = calloc(1, sizeof(double));
+ pbuf->y = calloc(1, sizeof(double));
+ pbuf->pi = calloc(1, sizeof(int));
+ pbuf->pha = calloc(1, sizeof(int));
+ pbuf->time = calloc(1, sizeof(double));
+ pbuf->dx = calloc(1, sizeof(double));
+ pbuf->dy = calloc(1, sizeof(double));
+ buf = pbuf;
+ }
+ break;
+ default:
+ gerror(stderr, "unknown params value: %d\n", doev);
+ break;
+ }
+
+ /* get rows */
+ while( 1 ){
+ if( doseek ){
+ fprintf(stdout, "Enter row: ");
+ fflush(stdout);
+ fgets(tbuf, SZ_LINE, stdin);
+ nrow = atoi(tbuf);
+ if( nrow <=0 ) break;
+ if( FunTableRowSeek(fun, nrow, NULL) < 0 ){
+ gerror(stderr, "FunTableRowSeek() failed on row %d\n", nrow);
+ exit(1);
+ }
+ }
+ buf = (void *)FunTableRowGet(fun, buf, maxrow, NULL, &got);
+ if( !buf ) break;
+ /* output if necessary */
+ if( ofun ){
+ if( (put=FunTableRowPut(ofun, buf, got, 0, NULL)) != got ){
+ gerror(stderr, "expected to write %d rows; only wrote %d\n",
+ got, put);
+ }
+ }
+ /* and display */
+ switch(doev){
+ case 0:
+ for(i=0; i<got; i++){
+ ev = (Ev)buf+i;
+ fprintf(stdout, "%12.8f %12.8f %4d %4d %18.8f %8.4f %8.4f %4d\n",
+ ev->x, ev->y,
+ ev->pha, ev->pi,
+ ev->time,
+ ev->dx, ev->dy,
+ (int)ev->region);
+ fflush(stdout);
+ }
+ break;
+ case 1:
+ aev = (AEv)buf;
+ for(i=0; i<got; i++){
+ fprintf(stdout, "%12.8f %12.8f %4d %4d %18.8f %8.4f %8.4f %4d\n",
+ aev->x[i], aev->y[i],
+ aev->pha[i], aev->pi[i],
+ aev->time[i],
+ aev->dx[i], aev->dy[i],
+ (int)aev->region[i]);
+ fflush(stdout);
+ }
+ break;
+ case 2:
+ pev = (PEv)buf;
+ for(i=0; i<got; i++){
+ fprintf(stdout, "%12.8f %12.8f %4d %4d %18.8f %8.4f %8.4f %4d\n",
+ pev->x[i], pev->y[i],
+ pev->pha[i], pev->pi[i],
+ pev->time[i],
+ pev->dx[i], pev->dy[i],
+ (int)pev->region[i]);
+ fflush(stdout);
+ }
+ break;
+ case 3:
+ for(i=0; i<got; i++){
+ pev = (PEv)buf+i;
+ fprintf(stdout, "%12.8f %12.8f %4d %4d %18.8f %8.4f %8.4f %4d\n",
+ pev->x[0], pev->y[0],
+ pev->pha[0], pev->pi[0],
+ pev->time[0],
+ pev->dx[0], pev->dy[0],
+ (int)pev->region[0]);
+ fflush(stdout);
+ }
+ break;
+ default:
+ gerror(stderr, "unknown params value: %d\n", doev);
+ break;
+ }
+ /* if funtools did allocation, free it now */
+ if( !doualloc ){
+ if( buf ) xfree(buf);
+ buf = NULL;
+ }
+ }
+
+ /* clean up */
+ if( doualloc ){
+ switch(doev){
+ case 0:
+ if( ebuf ) xfree(ebuf);
+ break;
+ case 1:
+ if( abuf ) xfree(abuf);
+ break;
+ case 2:
+ if( pbuf->region ) xfree(pbuf->region);
+ if( pbuf->x ) xfree(pbuf->x);
+ if( pbuf->y ) xfree(pbuf->y);
+ if( pbuf->pi ) xfree(pbuf->pi);
+ if( pbuf->pha ) xfree(pbuf->pha);
+ if( pbuf->time ) xfree(pbuf->time);
+ if( pbuf->dx ) xfree(pbuf->dx);
+ if( pbuf->dy ) xfree(pbuf->dy);
+ if( pbuf ) xfree(pbuf);
+ break;
+ }
+ }
+ if( ofun ) FunClose(ofun);
+ FunClose(fun);
+ return(0);
+}