summaryrefslogtreecommitdiffstats
path: root/funtools/funcnts.c
diff options
context:
space:
mode:
authorWilliam Joye <wjoye@cfa.harvard.edu>2016-10-26 21:13:00 (GMT)
committerWilliam Joye <wjoye@cfa.harvard.edu>2016-10-26 21:13:00 (GMT)
commitda2e3d212171bbe64c1af39114fd067308656990 (patch)
tree9601f7ed15fa1394762124630c12a792bc073ec2 /funtools/funcnts.c
parent76b109ad6d97d19ab835596dc70149ef379f3733 (diff)
downloadblt-da2e3d212171bbe64c1af39114fd067308656990.zip
blt-da2e3d212171bbe64c1af39114fd067308656990.tar.gz
blt-da2e3d212171bbe64c1af39114fd067308656990.tar.bz2
rm funtools for update
Diffstat (limited to 'funtools/funcnts.c')
-rw-r--r--funtools/funcnts.c1693
1 files changed, 0 insertions, 1693 deletions
diff --git a/funtools/funcnts.c b/funtools/funcnts.c
deleted file mode 100644
index 6da09ed..0000000
--- a/funtools/funcnts.c
+++ /dev/null
@@ -1,1693 +0,0 @@
-/*
- * Copyright (c) 1999-2003 Smithsonian Astrophysical Observatory
- */
-
-#include <math.h>
-#include <funtools.h>
-#include <NaN.h>
-#include <filter.h>
-#include <swap.h>
-#include <word.h>
-#include <xalloc.h>
-
-#define MAXROW 8192
-static int maxrow=MAXROW;
-
-/* max number of intervals we will process in one pass through table data */
-#define MAXINTV 1024
-
-/* type of data we process */
-#define SRC 0
-#define BKG 1
-/* this must match number of types above */
-#define NTYPE 2
-
-/* how corrections (time and exposure) are applied to source/bkgd */
-#define NONE 0
-#define SCORR 1
-#define BCORR 2
-#define BOTH 3
-
-/* types of background */
-#define BKG_VAL 1
-#define BKG_ALL 2
-#define BKG_EACH 3
-
-/* types of image -> exposure pixel conversion algorithms */
-#define EXP_RATIO 1
-#define EXP_WCS 2
-
-#define ARCSEC_PER_DEG 3600.0
-#define ARCSEC_PER_DEGSQ (ARCSEC_PER_DEG*ARCSEC_PER_DEG)
-
-extern char *optarg;
-extern int optind;
-
-#ifdef ANSI_FUNC
-static void
-usage (char *fname)
-#else
-static void usage(fname)
- char *fname;
-#endif
-{
- fprintf(stderr,
- "usage: %s <switches> sname [sreg] [bname breg|breg|cnts]\n",
- fname);
- fprintf(stderr, "optional switches:\n");
- fprintf(stderr, " -e \"source_exposure[;bkgd_exposure]\" # exp matches data\n");
- fprintf(stderr, " -w \"source_exposure[;bkgd_exposure]\" # WCS method\n");
- fprintf(stderr, "\t\t# source (bkgd) FITS exposure image\n");
- fprintf(stderr, " -t \"source_timecorr[;bkgd_timecorr]\"\n");
- fprintf(stderr, "\t\t# source (bkgd) time correction value or header parameter name\n");
- fprintf(stderr, " -g\t\t# output using nice g format\n");
- fprintf(stderr, " -G\t\t# output using %%.14g format (maximum precision)\n");
- fprintf(stderr, " -i \"[column;]int1;int2...\" # column-based intervals\n");
- fprintf(stderr, " -m\t\t# match individual source and bkgd regions\n");
- fprintf(stderr, " -p\t\t# output in pixels, even if wcs is present\n");
- fprintf(stderr, " -r\t\t# output inner/outer radii (and angles) for annuli (and pandas)\n");
- fprintf(stderr, " -s\t\t# output summed values\n");
- fprintf(stderr, " -v \"scol[;bcol]\" # src and bkgd value columns for tables\n");
- fprintf(stderr, " -T\t\t# output in starbase/rdb table format\n");
- fprintf(stderr, " -z\t\t# include regions with zero area in output\n");
- fprintf(stderr, "\n(version: %s)\n", FUN_VERSION);
- exit(1);
-}
-
-#ifdef ANSI_FUNC
-static double
-DConvert (char *buf, int type, int n)
-#else
-static double
-DConvert(buf, type, n)
- char *buf;
- int type;
- int n;
-#endif
-{
- int ival;
- double dval=0.0;
-
- switch(type){
- case 'X':
- if( n == 16 )
- dval = (double)*(unsigned short *)buf;
- else if( n == 32 )
- dval = (double)*(unsigned int *)buf;
- else
- dval = (double)*(unsigned char *)buf;
- break;
- case 'B':
- dval = (double)*(unsigned char *)buf;
- break;
- case 'I':
- dval = (double)*(short *)buf;
- break;
- case 'U':
- dval = (double)*(unsigned short *)buf;
- break;
- case 'J':
- dval = (double)*(int *)buf;
- break;
- case 'K':
-#if HAVE_LONG_LONG == 0
- gerror(stderr,
- "64-bit data support not built (long long not available)\n");
-#endif
- break;
- case 'V':
- dval = (double)*(unsigned int *)buf;
- break;
- case 'E':
- dval = (double)*(float *)buf;
- break;
- case 'D':
- dval = *(double *)buf;
- break;
- case 'L':
- ival = (int)*(unsigned char *)buf;
- if( !ival || (ival == 'F') || (ival == 'f') )
- dval = 0.0;
- else
- dval = 1.0;
- break;
- default:
- dval = 0.0;
- break;
- }
- return(dval);
-}
-
-#ifdef ANSI_FUNC
-int
-main (int argc, char **argv)
-#else
-int
-main(argc, argv)
- int argc;
- char **argv;
-#endif
-{
- int c;
- int i, j, k, v;
- int args;
- int bkarea=0;
- int bktype=BKG_VAL;
- int dosum=0;
- int dog=0;
- int domatch=0;
- int doradang=0;
- int dobkgderr=1;
- int doexp=0;
- int dotim=0;
- int dopixels=0;
- int dozero=0;
- int evimage=0;
- int cold=' ';
- int nintv=1;
- int endian[NTYPE], type[NTYPE], rawsize[NTYPE], rowsize[NTYPE];
- int x0[NTYPE], x1[NTYPE], y0[NTYPE], y1[NTYPE];
- int dim1[4], dim2[4], block[4];
- int *area[NTYPE];
- int *savearea[NTYPE];
- int nmask[NTYPE]={0,0};
- int nreg[NTYPE]={0,0};
- int valtypes[NTYPE]={0,0};
- int valoffsets[NTYPE]={0,0};
- int valns[NTYPE]={0,0};
- int exptrans[NTYPE]={EXP_RATIO,EXP_RATIO};
- double bkexp=0.0;
- double dpp[NTYPE]={-1.0,-1.0};
- double timecorr[NTYPE]={1.0,1.0};
- double *cnts[MAXINTV][NTYPE];
- double *savecnts[MAXINTV][NTYPE];
- double *bncnts[MAXINTV];
- double *bnerr[MAXINTV];
- double *bscnts[MAXINTV];
- double *bserr[MAXINTV];
- double *exp[NTYPE];
- double *saveexp[NTYPE];
- double dppnorm=1.0;
- double bkval=0.0;
- char mode[SZ_LINE];
- char tbuf[SZ_LINE];
- char tbuf2[SZ_LINE];
- char *intvs[MAXINTV];
- char *s, *t, *u;
- char *ebuf;
- char *eptr;
- char *fmt=NULL;
- char *expstr=NULL;
- char *intvstr=NULL;
- char *valstr=NULL;
- char *timestr=NULL;
- char *radang=NULL;
- char *cradang=NULL;
- char *tradang=NULL;
- char *region[NTYPE]={NULL,NULL};
- char *filtstr[NTYPE]={NULL,NULL};
- char *bincols[NTYPE]={NULL,NULL};
- char *valname[2]={NULL,NULL};
- char *name[4]={NULL,NULL,NULL, NULL};
- Fun fun[4]={NULL,NULL,NULL,NULL};
- FITSHead header[NTYPE]={NULL,NULL};
- FilterMask masks[NTYPE]={NULL,NULL};
- Filter filter[NTYPE]={NULL,NULL};
- struct WorldCoor *wcs[4]={NULL,NULL,NULL,NULL};
-
- /* clear array elelemts to mark them as unallocated */
- memset(cnts, 0, MAXINTV*NTYPE*sizeof(double *));
- memset(savecnts, 0, MAXINTV*NTYPE*sizeof(double *));
- memset(bncnts, 0, NTYPE*sizeof(double *));
- memset(bnerr, 0, NTYPE*sizeof(double *));
- memset(bscnts, 0, NTYPE*sizeof(double *));
- memset(bserr, 0, NTYPE*sizeof(double *));
- memset(exp, 0, NTYPE*sizeof(double *));
- memset(saveexp, 0, NTYPE*sizeof(double *));
- memset(area, 0, NTYPE*sizeof(int *));
- memset(savearea, 0, NTYPE*sizeof(int *));
- memset(intvs, 0, MAXINTV*sizeof(char *));
-
- /* exit on gio errors */
- if( !getenv("GERROR") )
- setgerror(2);
-
- /* we want the args in the same order in which they arrived, and
- gnu getopt sometimes changes things without this */
- putenv("POSIXLY_CORRECT=true");
-
- /* process switch arguments */
- while ((c = getopt(argc, argv, "e:gGhi:mprst:v:w:zEIT")) != -1){
- switch(c){
- case 'e':
- expstr = optarg;
- break;
- case 'g':
- dog = 1;
- break;
- case 'G':
- dog = 2;
- break;
- case 'h':
- usage(argv[0]);
- break;
- case 'i':
- intvstr = optarg;
- break;
- case 'm':
- domatch = 1;
- break;
- case 'p':
- dopixels = 1;
- break;
- case 'r':
- doradang = 1;
- break;
- case 's':
- dosum = 1;
- break;
- case 't':
- timestr = optarg;
- break;
- case 'v':
- valstr = optarg;
- break;
- case 'w':
- putenv("FUNCNTS_EXPTRANS=wcs");
- expstr = optarg;
- break;
- case 'z':
- dozero = 1;
- break;
- case 'E':
- evimage = 0;
- break;
- case 'I':
- evimage = 1;
- break;
- case 'T':
- cold = '\t';
- break;
- }
- }
-
- /* get maxrow,if user-specified */
- if( (s=getenv("FUN_MAXROW")) != NULL )
- maxrow = atoi(s);
-
- /* check for required arguments */
- args = argc - optind;
- if( args < 1 ) usage(argv[0]);
-
- /* arg 1: source file name */
- name[SRC] = xstrdup(argv[optind+0]);
-
- /* arg 2: source region */
- if( (args == 1) || !*(region[SRC] = argv[optind+1]) )
- region[SRC] = "field()";
-
- /* arg 3: background region */
- if( args >= 3 ){
- if( args == 3 ){
- name[BKG] = NULL;
- region[BKG] = argv[optind+2];
- }
- else{
- name[BKG] = xstrdup(argv[optind+2]);
- region[BKG] = argv[optind+3];
- }
- /* check for constant numeric value -- background counts */
- bkval = strtod(region[BKG], &s);
- /* if we did not get a valid numeric constant, its a region */
- if( region[BKG] && *region[BKG] && (s == region[BKG]) ){
- bktype = BKG_ALL;
- bkval = 0.0;
- }
- else{
- /* can't have background file and background value */
- if( args == 4 ) usage(argv[0]);
- bktype = BKG_VAL;
- region[BKG] = NULL;
- }
- }
-
- /* get value column names, if necessary */
- if( valstr ){
- int ip=0;
- int i=0;
- newdtable(";");
- for(i=0; i<NTYPE; i++){
- if( word(valstr, tbuf, &ip) && *tbuf ){
- if( strcasecmp(tbuf, "$none") )
- valname[i] = xstrdup(tbuf);
- else
- valname[i] = xstrdup("-");
- }
- }
- freedtable();
- }
-
- /* open the source FITS file */
- if( !(fun[SRC] = FunOpen(name[SRC], "r", NULL)) )
- gerror(stderr, "can't FunOpen source file (or find extension): %s\n",
- name[SRC]);
- /* get required information from funtools structure */
- FunInfoGet(fun[SRC], FUN_ENDIAN, &endian[SRC],
- FUN_TYPE, &type[SRC], FUN_HEADER, &header[SRC],
- FUN_SECT_X0, &x0[SRC], FUN_SECT_X1, &x1[SRC],
- FUN_SECT_Y0, &y0[SRC], FUN_SECT_Y1, &y1[SRC],
- FUN_SECT_DIM1, &dim1[SRC], FUN_SECT_DIM2, &dim2[SRC],
- FUN_SECT_BLOCK, &block[SRC], FUN_WCS, &wcs[SRC],
- FUN_RAWSIZE, &rawsize[SRC], FUN_BINCOLS, &bincols[SRC],
- FUN_ROWSIZE, &rowsize[SRC],
- 0);
- /* set dim2 to 1 for a 1D image */
- if( dim2[SRC] == 0 ) dim2[SRC] = 1;
- /* make up filter mode string using source bincols */
- strcpy(mode, "type=image");
- /* add the binning key */
- if( bincols[SRC] ){
- strcat(mode, ",");
- strcat(mode, bincols[SRC]);
- }
-
- /* open the source region */
- filter[SRC] = FilterOpen(header[SRC], region[SRC], mode);
- if( filter[SRC] && (filter[SRC] != NOFILTER) ){
- /* retrieve region mask segments */
- nmask[SRC] = FilterImage(filter[SRC],
- x0[SRC], x1[SRC], y0[SRC], y1[SRC],
- block[SRC], &masks[SRC], &nreg[SRC]);
-
- /* filtstr[SRC] = xstrdup(FilterString(filter[SRC])); */
- /* for display, we have to add # comment chars after each \n */
- t = FilterString(filter[SRC]);
- filtstr[SRC] = calloc(strlen(t)*3, sizeof(char));
- for(u=filtstr[SRC]; *t; t++){
- *u++ = *t;
- if( *t == '\n' ){
- *u++ = '#';
- *u++ = ' ';
- }
- }
- filtstr[SRC] = realloc(filtstr[SRC], strlen(filtstr[SRC])+1);
- }
- if( filter[SRC] ) FilterClose(filter[SRC]);
-
- /* make sure we have something to do */
- if( nreg[SRC] == 0 )
- gerror(stderr, "no valid regions included in '%s'\n", region[SRC]);
-
- /* gather up intervals, if necessary (must be done before memory alloc) */
- if( intvstr ){
- int ip=0;
- int ntok=0;
- newdtable(";");
- nintv = 0;
- *tbuf2 = '\0';
- while( word(intvstr, tbuf, &ip) && *tbuf ){
- /* check for default column as first token */
- if( !ntok && !strpbrk(tbuf, "=><&|") ){
- strcpy(tbuf2, tbuf);
- strcat(tbuf2, "=");
- }
- else{
- if( nintv >= MAXINTV ){
- gwarning(stderr, "Too many intervals; ignoring: %s\n", tbuf);
- continue;
- }
- intvs[nintv] = (char *)calloc(SZ_LINE, sizeof(char));
- if( *tbuf2 ) strcat(intvs[nintv], tbuf2);
- strcat(intvs[nintv], tbuf);
- nintv++;
- }
- ntok++;
- }
- freedtable();
- }
-
- /* if a value name was specified, make sure its a calid column */
- if( valname[SRC] && (*valname[SRC] != '-') ){
- if( !FunColumnLookup(fun[SRC], valname[SRC], 0, NULL,
- &valtypes[SRC], NULL,
- &valoffsets[SRC], NULL, NULL) ){
- gerror(stderr, "value column does not exist: %s\n", valname[SRC]);
- }
- }
-
- /* allocate space for results */
- for(i=0; i<nintv; i++){
- cnts[i][SRC] = (double *)xcalloc(nreg[SRC]+1, sizeof(double));
- savecnts[i][SRC] = (double *)xcalloc(nreg[SRC]+1, sizeof(double));
- bncnts[i] = (double *)xcalloc(nreg[SRC]+1, sizeof(double));
- bnerr[i] = (double *)xcalloc(nreg[SRC]+1, sizeof(double));
- bscnts[i] = (double *)xcalloc(nreg[SRC]+1, sizeof(double));
- bserr[i] = (double *)xcalloc(nreg[SRC]+1, sizeof(double));
- }
- area[SRC] = (int *)xcalloc(nreg[SRC]+1, sizeof(int));
- exp[SRC] = (double *)xcalloc(nreg[SRC]+1, sizeof(double));
- savearea[SRC] = (int *)xcalloc(nreg[SRC]+1, sizeof(int));
- saveexp[SRC] = (double *)xcalloc(nreg[SRC]+1, sizeof(double));
- /* get radii and angle string, if needed */
- if( doradang ){
- if( (radang = FilterRadAng()) )
- radang = xstrdup(radang);
- }
-
- /* process background region, if necessary */
- if( region[BKG] ){
- /* open the background FITS file */
- if( name[BKG] ){
- if( !(fun[BKG] = FunOpen(name[BKG], "r", NULL)) )
- gerror(stderr,
- "can't FunOpen background file (or find extension): %s\n",
- name[BKG]);
- /* get required information from funtools structure */
- FunInfoGet(fun[BKG], FUN_ENDIAN, &endian[BKG],
- FUN_TYPE, &type[BKG], FUN_HEADER, &header[BKG],
- FUN_SECT_X0, &x0[BKG], FUN_SECT_X1, &x1[BKG],
- FUN_SECT_Y0, &y0[BKG], FUN_SECT_Y1, &y1[BKG],
- FUN_SECT_DIM1, &dim1[BKG], FUN_SECT_DIM2, &dim2[BKG],
- FUN_SECT_BLOCK, &block[BKG], FUN_WCS, &wcs[BKG],
- FUN_RAWSIZE, &rawsize[BKG], FUN_BINCOLS, &bincols[BKG],
- FUN_ROWSIZE, &rowsize[BKG],
- 0);
- /* set dim2 to 1 for a 1D image */
- if( dim2[BKG] == 0 ) dim2[BKG] = 1;
- /* make up filter mode string using back bincols */
- strcpy(mode, "type=image");
- /* add the binning key */
- if( bincols[BKG] ){
- strcat(mode, ",");
- strcat(mode, bincols[BKG]);
- }
- }
- /* use values from the source */
- else{
- fun[BKG] = fun[SRC];
- endian[BKG] = endian[SRC];
- type[BKG] = type[SRC]; header[BKG] = header[SRC];
- x0[BKG] = x0[SRC]; x1[BKG] = x1[SRC];
- y0[BKG] = y0[SRC]; y1[BKG] = y1[SRC];
- dim1[BKG] = dim1[SRC]; dim2[BKG] = dim2[SRC];
- block[BKG] = block[SRC];
- rawsize[BKG] = rawsize[SRC];
- rowsize[BKG] = rowsize[SRC];
- bincols[BKG] = bincols[SRC];
- }
-
- /* open the background region */
- filter[BKG] = FilterOpen(header[BKG], region[BKG], mode);
- if( filter[BKG] && (filter[BKG] != NOFILTER) ){
- /* retrieve region mask segments */
- nmask[BKG] = FilterImage(filter[BKG],
- x0[BKG], x1[BKG], y0[BKG], y1[BKG],
- block[BKG], &masks[BKG], &nreg[BKG]);
- /* see if we want to, and can, match source and bkgd regions */
- if( domatch && (nreg[SRC] == nreg[BKG]) )
- bktype = BKG_EACH;
- /* filtstr[BKG] = xstrdup(FilterString(filter[BKG])); */
- /* for display, we have to add # comment chars after each \n */
- t = FilterString(filter[BKG]);
- filtstr[BKG] = calloc(strlen(t)*3, sizeof(char));
- for(u=filtstr[BKG]; *t; t++){
- *u++ = *t;
- if( *t == '\n' ){
- *u++ = '#';
- *u++ = ' ';
- }
- }
- filtstr[BKG] = realloc(filtstr[BKG], strlen(filtstr[BKG])+1);
- }
- if( filter[BKG] ) FilterClose(filter[BKG]);
-
- /* if a value name was specified, make sure its a calid column */
- if( valname[BKG] ){
- if( *valname[BKG] != '-' ){
- if( !FunColumnLookup(fun[BKG], valname[BKG], 0, NULL,
- &valtypes[BKG], NULL,
- &valoffsets[BKG], NULL, NULL) ){
- gerror(stderr, "value column does not exist: %s\n", valname[BKG]);
- }
- }
- }
- else{
- if( valname[SRC] && (*valname[SRC] != '-') ){
- valname[BKG] = xstrdup(valname[SRC]);
- valtypes[BKG] = valtypes[SRC];
- valoffsets[BKG] = valoffsets[SRC];
- }
- }
-
- /* allocate space for results */
- for(i=0; i<nintv; i++){
- cnts[i][BKG] = (double *)xcalloc(nreg[BKG]+1, sizeof(double));
- savecnts[i][BKG] = (double *)xcalloc(nreg[BKG]+1, sizeof(double));
- }
- area[BKG] = (int *)xcalloc(nreg[BKG]+1, sizeof(int));
- exp[BKG] = (double *)xcalloc(nreg[BKG]+1, sizeof(double));
- savearea[BKG] = (int *)xcalloc(nreg[BKG]+1, sizeof(int));
- saveexp[BKG] = (double *)xcalloc(nreg[BKG]+1, sizeof(double));
- }
-
- /* look for degrees/pixel in source and background files -- we will
- use these to normalize background area, if both are present */
- if( name[BKG] ){
- for(i=0; i<2; i++){
- if( wcs[i] && iswcs(wcs[i]) ){
- if( !wcs[i]->coorflip )
- dpp[i] = ABS(wcs[i]->cdelt[0]) * block[i];
- else
- dpp[i] = ABS(wcs[i]->cdelt[1]) * block[i];
- }
- }
- /* note that BOTH must be present or we do not do this normalization */
- if( (dpp[SRC] > 0.0) && (dpp[BKG] > 0.0) )
- dppnorm = (dpp[SRC]/dpp[BKG]) * (dpp[SRC]/dpp[BKG]);
- }
- /* get degrees/pixel for source; not used in norm, but users want to know */
- else{
- if( wcs[SRC] && iswcs(wcs[SRC]) ){
- if( !wcs[SRC]->coorflip )
- dpp[SRC] = ABS(wcs[SRC]->cdelt[0]) * block[SRC];
- else
- dpp[SRC] = ABS(wcs[SRC]->cdelt[1]) * block[SRC];
- }
- }
-
- /* open exposure file(s), if necessary */
- if( expstr ){
- int ip=0;
- int i=0;
- int got=0;
- newdtable(";");
- for(i=0; i<NTYPE; i++){
- if( word(expstr, tbuf, &ip) && *tbuf ){
- name[NTYPE+i] = xstrdup(tbuf);
- if( !(fun[NTYPE+i] = FunOpen(name[NTYPE+i], "r", NULL)) )
- gerror(stderr, "can't FunOpen exp file: %s\n", name[NTYPE+i]);
- FunInfoGet(fun[NTYPE+i],
- FUN_SECT_DIM1, &dim1[NTYPE+i],
- FUN_SECT_DIM2, &dim2[NTYPE+i],
- FUN_SECT_BLOCK, &block[NTYPE+i], FUN_WCS, &wcs[NTYPE+i], 0);
- /* set dim2 to 1 for a 1D image */
- if( dim2[NTYPE+i] == 0 ) dim2[NTYPE+i] = 1;
- doexp |= (i+1);
- got++;
- }
- }
- freedtable();
- /* if we have wcs for the data and exposure, and the user asks for it,
- use wcs for conversion */
- if( (s=getenv("FUNCNTS_EXPTRANS")) && !strcasecmp(s, "wcs") ){
- for(i=0; i<got; i++){
- if( wcs[i] && wcs[NTYPE+i] )
- exptrans[i] = EXP_WCS;
- else
- gerror(stderr,
- "no WCS present for WCS-based exposure", name[NTYPE+i]);
- }
- }
- }
-
- /* if we have source exposure file but no background exposure file,
- and if background data comes from source file , then use the source
- exposure file for bkgd exposure as well */
- if( (doexp == SCORR) && !name[BKG] && (bktype != BKG_VAL) ){
- doexp |= BCORR;
- fun[3] = fun[2];
- dim1[3] = dim1[2];
- dim2[3] = dim2[2];
- block[3] = block[2];
- }
-
- /* get time correction values */
- if( timestr ){
- int ip=0;
- int i=0;
- int got;
- double dval;
- char *t;
- newdtable(";");
- for(i=0; i<2; i++){
- if( word(timestr, tbuf, &ip) && *tbuf ){
- dval = strtod(tbuf, &t);
- if( t != tbuf ){
- timecorr[i] = dval;
- }
- else{
- timecorr[i] = FunParamGetd(fun[i], tbuf, 0, 1.0, &got);
- if( !got ){
- /* try pure upper case */
- cluc(tbuf);
- timecorr[i] = FunParamGetd(fun[i], tbuf, 0, 1.0, &got);
- if( !got ){
- gerror(stderr, "can't find time correction parameter: %s\n",
- tbuf);
- }
- }
- }
- dotim |= (i+1);
- }
- }
- freedtable();
- }
- /* if we have source time correction but no background time correction,
- and if background data comes from source file , then use the source
- correction for bkgd as well */
- if( (dotim == SCORR) && !name[BKG] && (bktype != BKG_VAL) ){
- dotim |= BCORR;
- timecorr[BKG] = timecorr[SRC];
- }
-
- /* process separate source/background files */
- if( name[BKG] ){
- for(k=0; k<NTYPE; k++){
- /* process counts in all regions */
- switch(type[k]){
- case FUN_IMAGE:
- case FUN_ARRAY:
- {
- int y, lasty;
- double *dbuf=NULL;
- /* allocate a row buffer */
- dbuf = xmalloc(dim1[k] * sizeof(double));
- /* seed with impossible value so we load first line */
- lasty = -1;
- for(i=0; i<nmask[k]; i++){
- y = masks[k][i].y;
- if( y != lasty ){
- if( !FunImageRowGet(fun[k], dbuf, y, y, "bitpix=-64") )
- gerror(stderr, "can't FunImageRowGet: %d %s\n", y, name[k]);
- lasty = y;
- }
- area[k][masks[k][i].region-1] +=
- masks[k][i].xstop - masks[k][i].xstart + 1;
- for(j=masks[k][i].xstart-1; j<=masks[k][i].xstop-1; j++){
- if( !isnand(dbuf[j]) ){
- cnts[0][k][masks[k][i].region-1] += dbuf[j];
- }
- }
- }
- /* free temp buffers */
- if( dbuf ) xfree(dbuf);
- }
- break;
- case FUN_TABLE:
- case FUN_EVENTS:
- if( evimage ){
- int *iptr;
- int *ibuf=NULL;
- /* read data as ints */
- if( !(ibuf = FunImageGet(fun[k], NULL, "bitpix=32")) )
- gerror(stderr, "can't FunImageGet: %s\n", name[k]);
- /* get source counts */
- for(i=0; i<nmask[k]; i++){
- iptr = &(ibuf[(masks[k][i].y-1)*dim1[k]]);
- for(j=masks[k][i].xstart-1; j<=masks[k][i].xstop-1; j++){
- cnts[0][k][masks[k][i].region-1] += iptr[j];
- }
- }
- /* free up space */
- if( ibuf ) xfree(ibuf);
- }
- else{
- int *rbuf;
- int got;
- char *rawbuf;
- Filter efilter[MAXINTV];
- /* make sure we will have a valid image section in which to filter */
- if( (x1[k]-x0[k] <= 0) || (y1[k]-y0[k] <= 0) )
- gerror(stderr,
- "invalid or zero image dimensions(s) for table (%s)\n",
- bincols[k] ? bincols[k] : "invalid bincols?");
- /* make up the mode string */
- snprintf(mode, SZ_LINE,
- "type=events,convert=%s,evsect=\"%d %d %d %d %d\"",
- (endian[k] == is_bigendian()) ? "false" : "true",
- x0[k], x1[k], y0[k], y1[k], block[k]);
- /* add columns */
- if( bincols[k] ){
- strcat(mode, ",");
- strcat(mode, bincols[k]);
- }
- /* open filters for all intervals */
- for(v=0; v<nintv; v++){
- strcpy(tbuf, region[k]);
- if( intvs[v] ){
- strcat(tbuf, "&&(");
- strcat(tbuf, intvs[v]);
- strcat(tbuf, ")");
- }
- efilter[v] = FilterOpen(header[k], tbuf, mode);
- }
- /* allocate region value buffer */
- rbuf = xmalloc(maxrow*sizeof(int));
- /* extract events */
- while( (ebuf = FunTableRowGet(fun[k], NULL, maxrow, NULL, &got)) ){
- /* get pointer to raw buffer */
- FunInfoGet(fun[k], FUN_RAWBUF, &rawbuf, 0);
- /* process all intervals in one pass through this data */
- for(v=0; v<nintv; v++){
- /* get events which pass the region filter */
- if( efilter[v] && (efilter[v] != NOFILTER) &&
- FilterEvents(efilter[v], rawbuf, rawsize[k], got, rbuf)){
- /* loop through events, process those which are in a region */
- for(i=0; i<got; i++){
- eptr = (char *)(ebuf+(rowsize[k]*i)+valoffsets[k]);
- if( rbuf[i] > 0 ){
- if( valname[k] && (*valname[k] != '-') )
- cnts[v][k][rbuf[i]-1] +=
- DConvert(eptr, valtypes[k], valns[k]);
- else
- cnts[v][k][rbuf[i]-1] += 1;
- }
- }
- }
- }
- /* free for next read */
- if( ebuf ) xfree(ebuf);
- }
- /* Done with region values */
- if( rbuf ) xfree(rbuf);
- /* close filters */
- for(v=0; v<nintv; v++){
- if( efilter[v] && (efilter[v] != NOFILTER) ){
- FilterClose(efilter[v]);
- }
- }
- }
- /* get area */
- for(i=0; i<nmask[k]; i++){
- area[k][masks[k][i].region-1] +=
- masks[k][i].xstop - masks[k][i].xstart + 1;
- }
- break;
- }
- }
- }
- /* same file for source and background:
- this code is optimized so that we only traverse the file once
- */
- else{
- /* process counts in all regions */
- switch(type[SRC]){
- case FUN_IMAGE:
- case FUN_ARRAY:
- {
- int state;
- int y, lasty;
- double *dbuf=NULL;
- /* allocate a row buffer */
- dbuf = xmalloc(dim1[SRC] * sizeof(double));
- /* seed with impossible value so we load first line */
- lasty = -1;
- for(i=0, j=0; i<nmask[SRC] || j<nmask[BKG]; ){
- if( (i<nmask[SRC]) && (j<nmask[BKG]) ) state = 3;
- else if( i<nmask[SRC] ) state = 1;
- else if( j<nmask[BKG] ) state = 2;
- else break;
- switch(state){
- case 1:
- sline:
- y = masks[SRC][i].y;
- if( y != lasty ){
- if( !FunImageRowGet(fun[SRC], dbuf, y, y, "bitpix=-64") )
- gerror(stderr, "can't FunImageRowGet: %d %s\n", y, name[SRC]);
- lasty = y;
- }
- area[SRC][masks[SRC][i].region-1] +=
- masks[SRC][i].xstop - masks[SRC][i].xstart + 1;
- for(k=masks[SRC][i].xstart-1; k<=masks[SRC][i].xstop-1; k++){
- if( !isnand(dbuf[k]) ){
- cnts[0][SRC][masks[SRC][i].region-1] += dbuf[k];
- }
- }
- i++;
- break;
- case 2:
- bline:
- y = masks[BKG][j].y;
- if( y != lasty ){
- if( !FunImageRowGet(fun[SRC], dbuf, y, y, "bitpix=-64") )
- gerror(stderr, "can't FunImageRowGet: %d %s\n", y, name[SRC]);
- lasty = y;
- }
- area[BKG][masks[BKG][j].region-1] +=
- masks[BKG][j].xstop - masks[BKG][j].xstart + 1;
- for(k=masks[BKG][j].xstart-1; k<=masks[BKG][j].xstop-1; k++){
- if( !isnand(dbuf[k]) ){
- cnts[0][BKG][masks[BKG][j].region-1] += dbuf[k];
- }
- }
- j++;
- break;
- case 3:
- if( masks[SRC][i].y <= masks[BKG][j].y ){
- goto sline;
- }
- goto bline;
- }
- }
- if( dbuf ) xfree(dbuf);
- }
- break;
- case FUN_TABLE:
- case FUN_EVENTS:
- if( evimage ){
- int *iptr;
- int *ibuf=NULL;
- /* read data as ints */
- if( !(ibuf = FunImageGet(fun[SRC], NULL, "bitpix=32")) )
- gerror(stderr, "can't FunImageGet: %s\n", name[SRC]);
- /* get source counts */
- for(i=0; i<nmask[SRC]; i++){
- iptr = &(ibuf[(masks[SRC][i].y-1)*dim1[SRC]]);
- for(j=masks[SRC][i].xstart-1; j<=masks[SRC][i].xstop-1; j++){
- cnts[0][SRC][masks[SRC][i].region-1] += iptr[j];
- }
- }
- /* get background counts and area, if necessary */
- if( bktype != BKG_VAL ){
- for(i=0; i<nmask[BKG]; i++){
- iptr = &(ibuf[(masks[BKG][i].y-1)*dim1[SRC]]);
- for(j=masks[BKG][i].xstart-1; j<=masks[BKG][i].xstop-1; j++){
- cnts[0][BKG][masks[BKG][i].region-1] += iptr[j];
- }
- }
- }
- /* free up space */
- if( ibuf ) xfree(ibuf);
- }
- else{
- int *rbuf;
- int got;
- char *rawbuf;
- Filter efilter[MAXINTV][NTYPE];
- /* make sure we will have a valid image section in which to filter */
- if( (x1[SRC]-x0[SRC] <= 0) || (y1[SRC]-y0[SRC] <= 0) )
- gerror(stderr,
- "invalid or zero image dimensions(s) for table (%s)\n",
- bincols[SRC] ? bincols[SRC] : "invalid bincols?");
- /* open new filters to filter events through regions */
- snprintf(mode, SZ_LINE,
- "type=events,convert=%s,evsect=\"%d %d %d %d %d\"",
- (endian[SRC] == is_bigendian()) ? "false" : "true",
- x0[SRC], x1[SRC], y0[SRC], y1[SRC], block[SRC]);
- /* add columns */
- if( bincols[SRC] ){
- strcat(mode, ",");
- strcat(mode, bincols[SRC]);
- }
- /* open filters for all intervals */
- for(v=0; v<nintv; v++){
- for(i=0; i<NTYPE; i++){
- if( region[i] ){
- strcpy(tbuf, region[i]);
- if( intvs[v] ){
- strcat(tbuf, "&&(");
- strcat(tbuf, intvs[v]);
- strcat(tbuf, ")");
- }
- efilter[v][i] = FilterOpen(header[i], tbuf, mode);
- }
- else{
- efilter[v][i] = NULL;
- }
- }
- }
- /* allocate region value buffer */
- rbuf = xmalloc(maxrow*sizeof(int));
- /* extract and filter events */
- while( (ebuf = FunTableRowGet(fun[SRC], NULL, maxrow, NULL, &got)) ){
- /* get pointer to raw buffer */
- FunInfoGet(fun[SRC], FUN_RAWBUF, &rawbuf, 0);
- /* process all intervals in one pass through this data */
- for(v=0; v<nintv; v++){
- /* get events which pass the region filter */
- for(i=0; i<NTYPE; i++){
- if( efilter[v][i] && (efilter[v][i] != NOFILTER) &&
- FilterEvents(efilter[v][i], rawbuf, rawsize[i], got, rbuf)){
- /* count events which are in a region */
- for(j=0; j<got; j++){
- eptr = (char *)(ebuf+(rowsize[i]*j)+valoffsets[i]);
- if( rbuf[j] > 0 ){
- if( valname[i] && (*valname[i] != '-') )
- cnts[v][i][rbuf[j]-1] +=
- DConvert(eptr, valtypes[i], valns[i]);
- else
- cnts[v][i][rbuf[j]-1] += 1;
- }
- }
- }
- }
- }
- /* free for next read */
- if( ebuf ) xfree(ebuf);
- }
- /* done with region values */
- if( rbuf ) xfree(rbuf);
- /* close filters */
- for(v=0; v<nintv; v++)
- for(i=0; i<NTYPE; i++){
- if( efilter[v][i] && (efilter[v][i] != NOFILTER) ){
- FilterClose(efilter[v][i]);
- }
- }
- }
- /* get source area */
- for(i=0; i<nmask[SRC]; i++){
- area[SRC][masks[SRC][i].region-1] +=
- masks[SRC][i].xstop - masks[SRC][i].xstart + 1;
- }
- /* get background area, if necessary */
- if( bktype != BKG_VAL ){
- for(i=0; i<nmask[BKG]; i++){
- area[BKG][masks[BKG][i].region-1] +=
- masks[BKG][i].xstop - masks[BKG][i].xstart + 1;
- }
- }
- break;
- }
- }
-
- /* accumulate averge exposure for each region */
- if( doexp ){
- for(k=0; k<2; k++){
- if( fun[NTYPE+k] ){
- int ex, ey, lastey;
- double d1, d2;
- double *exbuf=NULL;
- char *tname="unknown";
- exbuf = xmalloc(dim1[NTYPE+k] * sizeof(double));
- if( name[NTYPE+k] )
- tname = name[NTYPE+k];
- else if( (k>0) && name[NTYPE+k-1] )
- tname = name[NTYPE+k-1];
- switch(exptrans[k]){
- case EXP_RATIO:
- lastey = -1;
- d1 = ((double)dim1[NTYPE+k]/(double)dim1[k]);
- d2 = ((double)dim2[NTYPE+k]/(double)dim2[k]);
- for(i=0; i<nmask[k]; i++){
- ey = ((masks[k][i].y - 1) * d2) + 1;
- if( ey != lastey ){
- if( !FunImageRowGet(fun[NTYPE+k], exbuf, ey, ey, "bitpix=-64") )
- gerror(stderr, "can't FunImageRowGet (exp file): %d %s\n",
- ey, tname);
- lastey = ey;
- }
- for(j=masks[k][i].xstart; j<=masks[k][i].xstop; j++){
- ex = (j-1) * d1 + 1;
- if( ex < 1 ) ex = 1;
- if( ex > dim1[NTYPE+k] ) ex = dim1[NTYPE+k];
- exp[k][masks[k][i].region-1] += exbuf[ex-1];
- }
- }
- break;
- case EXP_WCS:
- lastey = -1;
- for(i=0; i<nmask[k]; i++){
- for(j=masks[k][i].xstart; j<=masks[k][i].xstop; j++){
- double dval1, dval2;
- double dex, dey;
- int offscl;
- /* convert data image pixels to ra/dec using wcs */
- pix2wcs(wcs[k], (double)j,(double)masks[k][i].y, &dval1,&dval2);
- /* convert ra/dec to exp image pixels using wcs */
- wcs2pix(wcs[NTYPE+k], dval1, dval2, &dex, &dey, &offscl);
- ex = (int)(dex+0.5); ey = (int)(dey+0.5);
- if( ex < 1 ) ex = 1;
- if( ex > dim1[NTYPE+k] ) ex = dim1[NTYPE+k];
- if( ey < 1 ) ey = 1;
- if( ey > dim2[NTYPE+k] ) ey = dim2[NTYPE+k];
- if( ey != lastey ){
- if( !FunImageRowGet(fun[NTYPE+k], exbuf, ey, ey, "bitpix=-64") )
- gerror(stderr, "can't FunImageRowGet (exp file): %d %s\n",
- ey, tname);
- lastey = ey;
- }
- exp[k][masks[k][i].region-1] += exbuf[ex-1];
- }
- }
- break;
- default:
- gerror(stderr, "unknown exposure conversion type");
- }
- if( exbuf ) xfree(exbuf);
- }
- /* since we already checked for source exposure, we must be missing
- bkgd exposure. This is OK, unless we have a bkgd file. In that case,
- we need to warn the user and make an assumption about errors */
- else if( (k==1) && name[BKG] ){
- gwarning(stderr,
- "No exposure file was specified for the background file.\nWe therefore assume that the bkgd already has been corrected for\nexposure and that the error associated with each bkgd pixel is 0.\n");
- dobkgderr = 0;
- }
- }
- }
-
- /* reset the interval index for next stage of proessing*/
- v = 0;
- /* come back here if we are processing multiple intervals */
-intvagain:
- /* for data-based background, check validity of background area */
- if( bktype != BKG_VAL ){
- bkval = 0.0;
- bkarea = 0;
- bkexp = 0.0;
- for(i=0; i<nreg[BKG]; i++){
- bkval += cnts[v][BKG][i];
- bkarea += area[BKG][i];
- bkexp += exp[BKG][i];
- }
- /* if background area is 0, that is bad */
- if( bkarea == 0 ){
- gerror(stdout, "background has zero area\n");
- }
- }
-
- /* display source header information */
- fprintf(stdout, "# source\n");
- fprintf(stdout, "# data_file:\t\t%s\n", name[SRC]);
- if( intvs[v] )
- fprintf(stdout, "# interval:\t\t%s\n", intvs[v]);
- if( valname[SRC] && (*valname[SRC] != '-') )
- fprintf(stdout, "# value column:\t%s\n", valname[SRC]);
- if( dpp[SRC] > 0.0 )
- fprintf(stdout, "# arcsec/pixel:\t%g\n", dpp[SRC]*ARCSEC_PER_DEG);
- if( doexp & SCORR )
- fprintf(stdout, "# exp_correction:\t%s\n", name[NTYPE+SRC]);
- if( dotim & SCORR )
- fprintf(stdout, "# time_correction:\t%g\n", timecorr[SRC]);
-
- /* display bkgd header information */
- fprintf(stdout, "# background\n");
- if( name[BKG] ){
- fprintf(stdout, "# data_file:\t\t%s\n", name[BKG]);
- if( intvs[v] )
- fprintf(stdout, "# interval:\t\t%s\n", intvs[v]);
- if( valname[BKG] && (*valname[BKG] != '-') )
- fprintf(stdout, "# value column:\t%s\n", valname[BKG]);
- if( dpp[BKG] > 0.0 )
- fprintf(stdout, "# arcsec/pixel:\t%g\n", dpp[BKG]*ARCSEC_PER_DEG);
- if( doexp & BCORR )
- fprintf(stdout, "# exp_correction:\t%s\n", name[NTYPE+BKG]);
- if( dotim & BCORR )
- fprintf(stdout, "# time_correction:\t%g\n", timecorr[BKG]);
- if( dppnorm != 1.0 )
- fprintf(stdout, "# wcs area norm factor:\t%g/%g (source/bkgd))\n",
- dpp[SRC],dpp[BKG]);
- }
- else if( bktype != BKG_VAL ){
- fprintf(stdout, "# data_file:\t\t%s\n", name[SRC]);
- if( valname[SRC] && valname[BKG] && strcmp(valname[SRC], valname[BKG]) &&
- (*valname[BKG] != '-') )
- fprintf(stdout, "# value_column:\t%s\n", valname[BKG]);
- }
- else
- fprintf(stdout, "# constant_value:\t%.6f\n", bkval);
-
- /* dislay table information */
- if( (dpp[SRC] > 0.0) && !dopixels )
- s = "arcsec";
- else
- s = "pixel";
- fprintf(stdout, "# column units\n");
- fprintf(stdout, "# area:\t\t%s**2\n", s);
- fprintf(stdout, "# surf_bri:\t\tcnts/%s**2%s%s\n",
- s, (dotim & SCORR)? "/sec" : "", (doexp & SCORR)? "/expval" : "");
- fprintf(stdout, "# surf_err:\t\tcnts/%s**2%s%s\n",
- s, (dotim & SCORR)? "/sec" : "", (doexp & SCORR)? "/expval" : "");
- if( doradang ){
- fprintf(stdout, "# radii:\t\t%ss\n", s);
- fprintf(stdout, "# angles:\t\tdegrees\n");
- }
-
- /* come back here if we also are outputting summed results */
-sumagain:
- /* if we need to display sums, so the sum now, but save unsummed values,
- because we will have to display those as well */
- switch(dosum){
- case 1:
- memcpy(savecnts[v][SRC], cnts[v][SRC], (nreg[SRC]+1)*sizeof(double));
- memcpy(savearea[SRC], area[SRC], (nreg[SRC]+1)*sizeof(int));
- for(i=1; i<nreg[SRC]; i++){
- cnts[v][SRC][i] += cnts[v][SRC][i-1];
- area[SRC][i] += area[SRC][i-1];
- }
- if( bktype != BKG_VAL ){
- memcpy(savecnts[v][BKG], cnts[v][BKG],
- (nreg[BKG]+1)*sizeof(double));
- memcpy(savearea[BKG], area[BKG], (nreg[BKG]+1)*sizeof(int));
- for(i=1; i<nreg[BKG]; i++){
- cnts[v][BKG][i] += cnts[v][BKG][i-1];
- area[BKG][i] += area[BKG][i-1];
- }
- }
- break;
- case 2:
- memcpy(cnts[v][SRC], savecnts[v][SRC], (nreg[SRC]+1)*sizeof(double));
- memcpy(area[SRC], savearea[SRC], (nreg[SRC]+1)*sizeof(int));
- if( bktype != BKG_VAL ){
- memcpy(cnts[v][BKG], savecnts[v][BKG],
- (nreg[BKG]+1)*sizeof(double));
- memcpy(area[BKG], savearea[BKG], (nreg[BKG]+1)*sizeof(int));
- }
- break;
- default:
- break;
- }
-
- /* process the background */
- switch(bktype){
- /* constant background is counts/pixel */
- case BKG_VAL:
- for(i=0; i<nreg[SRC]; i++){
- bncnts[v][i] = (bkval * area[SRC][i] * timecorr[SRC]);
- bscnts[v][i] = cnts[v][SRC][i] - bncnts[v][i];
- bserr[v][i] = sqrt(cnts[v][SRC][i]);
- bnerr[v][i] = 0.0;
- }
- break;
- case BKG_ALL:
- switch( dosum ){
- case 1:
- bkval = cnts[v][BKG][nreg[BKG]-1];
- bkarea = area[BKG][nreg[BKG]-1];
- bkexp = exp[BKG][nreg[BKG]-1];
- break;
- case 2:
- default:
- bkval = 0.0;
- bkarea = 0;
- bkexp = 0.0;
- /* get total background and background area */
- for(i=0; i<nreg[BKG]; i++){
- bkval += cnts[v][BKG][i];
- bkarea += area[BKG][i];
- bkexp += exp[BKG][i];
- }
- break;
- }
- {
- double tempnorm=0.0;
- /* subtract entire normalized background from each source region */
- for(i=0; i<nreg[SRC]; i++){
- /* get area and exposure normalization */
- switch(doexp){
- case NONE:
- tempnorm = (double)area[SRC][i] / bkarea;
- break;
- case SCORR:
- tempnorm = exp[SRC][i] / bkarea;
- break;
- case BCORR:
- tempnorm = (double)area[SRC][i] / bkexp;
- break;
- case BOTH:
- tempnorm = exp[SRC][i] / bkexp;
- break;
- }
- /* add time normalization */
- tempnorm *= (timecorr[SRC]/timecorr[BKG]);
- /* add normalization due to different pixels sizes in src and bkg */
- tempnorm *= dppnorm;
- bncnts[v][i] = (bkval * tempnorm);
- bscnts[v][i] = cnts[v][SRC][i] - bncnts[v][i];
- bserr[v][i] = sqrt(cnts[v][SRC][i] + (tempnorm*tempnorm*bkval));
- if( dobkgderr )
- bnerr[v][i] = sqrt(bkval) * tempnorm;
- else
- bnerr[v][i] = 0.0;
- }
- }
- break;
- case BKG_EACH:
- {
- double tempnorm=0.0;
- /* subtract each background from each source region */
- for(i=0; i<nreg[SRC]; i++){
- /* get area and exposure normalization */
- switch(doexp){
- case NONE:
- tempnorm = (double)area[SRC][i] / (double)area[BKG][i];
- break;
- case SCORR:
- tempnorm = exp[SRC][i] / (double)area[BKG][i];
- break;
- case BCORR:
- tempnorm = (double)area[SRC][i] / (double)exp[BKG][i];
- break;
- case BOTH:
- tempnorm = exp[SRC][i] / (double)exp[BKG][i];
- break;
- }
- /* add time normalization */
- tempnorm *= (timecorr[SRC]/timecorr[BKG]);
- /* add normalization due to different pixels sizes in src and bkg */
- tempnorm *= dppnorm;
- bncnts[v][i] = (cnts[v][BKG][i] * tempnorm);
- bscnts[v][i] = cnts[v][SRC][i] - bncnts[v][i];
- bserr[v][i] = sqrt(cnts[v][SRC][i] +
- (tempnorm * tempnorm * cnts[v][BKG][i]));
- if( dobkgderr )
- bnerr[v][i] = sqrt(cnts[v][BKG][i]) * tempnorm;
- else
- bnerr[v][i] = 0.0;
- }
- }
- break;
- }
-
- /* display results */
- /* display the main output table */
- switch( dosum ){
- case 1:
- fprintf(stdout, "\n");
- fprintf(stdout, "# summed background-subtracted results\n");
- fprintf(stdout, "upto%c net_counts%c error", cold, cold);
- break;
- case 2:
- default:
- if( cold == '\t' ) fprintf(stdout, "\f");
- fprintf(stdout, "\n");
- fprintf(stdout, "# background-subtracted results\n");
- fprintf(stdout, " reg%c net_counts%c error", cold, cold);
- break;
- }
- fprintf(stdout, "%c background%c berror", cold, cold);
- fprintf(stdout, "%c area%c surf_bri%c surf_err", cold, cold, cold);
- if( doradang )
- fprintf(stdout, "%c radius1%c radius2%c angle1%c angle2",
- cold, cold, cold, cold);
- fprintf(stdout, "\n");
- fprintf(stdout, "----%c------------%c---------", cold, cold);
- fprintf(stdout, "%c------------%c---------", cold, cold);
- fprintf(stdout, "%c---------%c---------%c---------", cold, cold, cold);
- if( doradang )
- fprintf(stdout, "%c---------%c---------%c---------%c---------",
- cold, cold, cold, cold);
- fprintf(stdout, "\n");
- if( radang )
- newdtable(",");
- cradang = radang;
- for(i=0; i<nreg[SRC]; i++){
- /* get next line from radii/angle string */
- if( cradang ){
- tradang = (char *)strchr(cradang, '\n');
- if( tradang )
- *tradang = '\0';
- }
- if( area[SRC][i] ){
- double cntsperarea;
- double errperarea;
- double areasq;
- if( doexp & SCORR ){
- cntsperarea = bscnts[v][i]/(exp[SRC][i]*timecorr[SRC]);
- errperarea = bserr[v][i]/(exp[SRC][i]*timecorr[SRC]);
- areasq = area[SRC][i];
- }
- else{
- cntsperarea = bscnts[v][i]/(area[SRC][i]*timecorr[SRC]);
- errperarea = bserr[v][i]/(area[SRC][i]*timecorr[SRC]);
- areasq = area[SRC][i];
- }
- /* if we know how to convert to cnts/pix**2 to cnts/arcsec**2, do it */
- if( !dopixels && (dpp[SRC] > 0.0) ){
- cntsperarea = (cntsperarea / (dpp[SRC]*dpp[SRC])) / ARCSEC_PER_DEGSQ;
- errperarea = (errperarea / (dpp[SRC]*dpp[SRC])) / ARCSEC_PER_DEGSQ;
- areasq = (areasq * (dpp[SRC]*dpp[SRC])) * ARCSEC_PER_DEGSQ;
- }
- /* get correctly precisioned format statement */
- switch(dog){
- case 0:
- fmt = "%4d%c%12.3f%c%9.3f%c%12.3f%c%9.3f%c%9.2f%c%9.3f%c%9.3f";
- break;
- case 1:
- fmt = "%4d%c%12.3g%c%9.3g%c%12.3g%c%9.3g%c%9.2g%c%9.3g%c%9.3g";
- break;
- case 2:
- fmt = "%4d%c%.14g%c%.14g%c%.14g%c%.14g%c%.14g%c%.14g%c%.14g";
- break;
- }
- fprintf(stdout, fmt,
- i+1, cold,
- bscnts[v][i], cold, bserr[v][i], cold,
- bncnts[v][i], cold, bnerr[v][i], cold,
- areasq, cold, cntsperarea, cold, errperarea);
- /* display values from this line of radii/angles */
- if( doradang && cradang ){
- int ip=0;
- double dval;
- for(j=0; j<4; j++){
- if( word(cradang, tbuf, &ip) && strcmp(tbuf, "NA") ){
- dval = strtod(tbuf, NULL);
- if( (j<2) && !dopixels && (dpp[SRC]>0.0) )
- fprintf(stdout, "%c%9.3f", cold, (dval*dpp[SRC]*ARCSEC_PER_DEG));
- else
- fprintf(stdout, "%c%9.3f", cold, dval);
- }
- else{
- fprintf(stdout, "%c%9.9s", cold, "NA");
- }
- }
- }
- /* new-line at end */
- fprintf(stdout, "\n");
- }
- /* might have to display zero area pixels */
- else if( dozero ){
- /* get correctly precisioned format statement */
- switch(dog){
- case 0:
- fmt = "%4d%c%12.3f%c%9.3f%c%12.3f%c%9.3f%c%9.2f%c%9.3f%c%9.3f";
- break;
- case 1:
- fmt = "%4d%c%12.3g%c%9.3g%c%12.3g%c%9.3g%c%9.2g%c%9.3g%c%9.3g";
- break;
- case 2:
- fmt = "%4d%c%.14g%c%.14g%c%.14g%c%.14g%c%.14g%c%.14g%c%.14g";
- break;
- }
- fprintf(stdout, fmt, i+1, cold, 0.0, cold, 0.0, cold, 0.0, cold, 0.0,
- cold, 0.0, cold, 0.0, cold, 0.0);
- /* add the correct radii and angle info, to make plotting easier */
- if( doradang && cradang ){
- int ip=0;
- double dval;
- for(j=0; j<4; j++){
- if( word(cradang, tbuf, &ip) && strcmp(tbuf, "NA") ){
- dval = strtod(tbuf, NULL);
- if( (j<2) && !dopixels && (dpp[SRC]>0.0) )
- fprintf(stdout, "%c%9.3f", cold, (dval*dpp[SRC]*ARCSEC_PER_DEG));
- else
- fprintf(stdout, "%c%9.3f", cold, dval);
- }
- else{
- fprintf(stdout, "%c%9.9s", cold, "NA");
- }
- }
- }
- /* new-line at end */
- fprintf(stdout, "\n");
- }
- /* bump to next line of radii/angles */
- if( tradang ){
- cradang = tradang+1;
- /* put back the cr in case we pass through again */
- *tradang = '\n';
- }
- }
- if( radang )
- freedtable();
- fprintf(stdout, "\n");
- fflush(stdout);
-
- /* if we just summed, go back and display unsummed values */
- switch(dosum){
- case 1:
- dosum = 2;
- goto sumagain;
- /* set flag back to 1 in case we have multiple intervals to process */
- case 2:
- dosum = 1;
- break;
- default:
- break;
- }
-
- /* display raw source counts */
- if( dosum ){
- int tarea=0;
- double tcnts=0;
- if( cold == '\t' ) fprintf(stdout, "\f");
- fprintf(stdout, "\n");
- /* display source info */
- if( filtstr[SRC] ){
- fprintf(stdout, "# source_region(s):\n");
- fprintf(stdout, "# %s\n\n", filtstr[SRC]);
- }
- fprintf(stdout, "# summed_source_data\n");
- fprintf(stdout,
- " reg%c counts%c pixels%c sumcnts%c sumpix\n",
- cold, cold, cold, cold);
- fprintf(stdout,
- "----%c------------%c---------%c------------%c---------\n",
- cold, cold, cold, cold);
- for(i=0; i<nreg[SRC]; i++){
- tcnts += cnts[v][SRC][i];
- tarea += area[SRC][i];
- /* get correctly precisioned format statement */
- switch(dog){
- case 0:
- fmt = "%4d%c%12.3f%c%9d%c%12.3f%c%9d\n";
- break;
- case 1:
- fmt = "%4d%c%12.3g%c%9d%c%12.3g%c%9d\n";
- break;
- case 2:
- fmt = "%4d%c%.14g%c%9d%c%.14g%c%9d\n";
- break;
- }
- fprintf(stdout, fmt,
- i+1, cold,
- cnts[v][SRC][i], cold, area[SRC][i], cold,
- tcnts, cold, tarea);
- }
- } else{
- if( cold == '\t' ) fprintf(stdout, "\f");
- fprintf(stdout, "\n");
- /* display source info */
- if( filtstr[SRC] ){
- fprintf(stdout, "# source_region(s):\n");
- fprintf(stdout, "# %s\n\n", filtstr[SRC]);
- }
- fprintf(stdout, "# source_data\n");
- fprintf(stdout, " reg%c counts%c pixels", cold, cold);
- if( doexp & SCORR )
- fprintf(stdout, "%c avg_exp", cold);
- fprintf(stdout, "\n");
- fprintf(stdout, "----%c------------%c---------", cold, cold);
- if( doexp & SCORR )
- fprintf(stdout, "%c---------", cold);
- fprintf(stdout, "\n");
- for(i=0; i<nreg[SRC]; i++){
- /* get correctly precisioned format statement */
- switch(dog){
- case 0:
- fmt = "%4d%c%12.3f%c%9d";
- break;
- case 1:
- fmt = "%4d%c%12.3g%c%9d";
- break;
- case 2:
- fmt = "%4d%c%.14g%c%9d";
- break;
- }
- fprintf(stdout, fmt, i+1, cold, cnts[v][SRC][i], cold, area[SRC][i]);
-
- if( doexp & SCORR ){
- /* get correctly precisioned format statement */
- switch(dog){
- case 0:
- fmt = "%c%9.3f";
- break;
- case 1:
- fmt = "%c%9.3g";
- break;
- case 2:
- fmt = "%c%.14g";
- break;
- }
- if( area[SRC][i] > 0 )
- fprintf(stdout, fmt, cold, exp[SRC][i]/area[SRC][i]);
- else
- fprintf(stdout, fmt, cold, 0.0);
- }
- fprintf(stdout, "\n");
- }
- }
- fprintf(stdout, "\n");
- fflush(stdout);
-
- /* display raw background info */
- switch(bktype){
- case BKG_VAL:
- break;
- case BKG_ALL:
- if( cold == '\t' ) fprintf(stdout, "\f");
- fprintf(stdout, "\n");
- if( filtstr[BKG] ){
- fprintf(stdout, "# background_region(s)\n");
- fprintf(stdout, "# %s\n\n", filtstr[BKG]);
- }
- fprintf(stdout, "# background_data\n");
- fprintf(stdout, " reg%c counts%c pixels", cold, cold);
- if( doexp & BCORR )
- fprintf(stdout, "%c avg_exp", cold);
- fprintf(stdout, "\n");
- fprintf(stdout, "----%c------------%c---------", cold, cold);
- if( doexp & BCORR )
- fprintf(stdout, "%c---------", cold);
- fprintf(stdout, "\n");
- /* get correctly precisioned format statement */
- switch(dog){
- case 0:
- fmt = "%s%c%12.3f%c%9d";
- break;
- case 1:
- fmt = "%s%c%12.3g%c%9d";
- break;
- case 2:
- fmt = "%s%c%.14g%c%9d";
- break;
- }
- fprintf(stdout, fmt, "all ", cold, bkval, cold, bkarea);
- if( doexp & BCORR ){
- /* get correctly precisioned format statement */
- switch(dog){
- case 0:
- fmt = "%c%9.3f";
- break;
- case 1:
- fmt = "%c%9.3g";
- break;
- case 2:
- fmt = "%c%.14g";
- break;
- }
- fprintf(stdout, fmt, cold, bkexp/bkarea);
- }
- fprintf(stdout, "\n");
- break;
- case BKG_EACH:
- if( dosum ){
- int tarea=0;
- double tcnts=0;
- if( cold == '\t' ) fprintf(stdout, "\f");
- fprintf(stdout, "\n");
- if( filtstr[BKG] ){
- fprintf(stdout, "# background_region(s)\n");
- fprintf(stdout, "# %s\n\n", filtstr[BKG]);
- }
- fprintf(stdout, "# summed_background_data\n");
- fprintf(stdout,
- " reg%c counts%c pixels%c sumcnts%c sumpix\n",
- cold, cold, cold, cold);
- fprintf(stdout,
- "----%c------------%c---------%c------------%c---------\n",
- cold, cold, cold, cold);
- for(i=0; i<nreg[BKG]; i++){
- tcnts += cnts[v][BKG][i];
- tarea += area[BKG][i];
- /* get correctly precisioned format statement */
- switch(dog){
- case 0:
- fmt = "%4d%c%12.3f%c%9d%c%12.3f%c%9d\n";
- break;
- case 1:
- fmt = "%4d%c%12.3g%c%9d%c%12.3g%c%9d\n";
- break;
- case 2:
- fmt = "%4d%c%.14g%c%9d%c%.14g%c%9d\n";
- break;
- }
- fprintf(stdout, fmt, i+1, cold,
- cnts[v][BKG][i], cold, area[BKG][i], cold,
- tcnts, cold, tarea);
- }
- } else{
- if( cold == '\t' ) fprintf(stdout, "\f");
- fprintf(stdout, "\n");
- if( filtstr[BKG] ){
- fprintf(stdout, "# background_region(s)\n");
- fprintf(stdout, "# %s\n\n", filtstr[BKG]);
- }
- fprintf(stdout, "# background_data\n");
- fprintf(stdout, " reg%c counts%c pixels", cold, cold);
- if( doexp & BCORR )
- fprintf(stdout, "%c avg_exp", cold);
- fprintf(stdout, "\n");
- fprintf(stdout, "----%c------------%c---------", cold, cold);
- if( doexp & BCORR )
- fprintf(stdout, "%c---------", cold);
- fprintf(stdout, "\n");
- for(i=0; i<nreg[BKG]; i++){
- /* get correctly precisioned format statement */
- switch(dog){
- case 0:
- fmt = "%4d%c%12.3f%c%9d";
- break;
- case 1:
- fmt = "%4d%c%12.3g%c%9d";
- break;
- case 2:
- fmt = "%4d%c%.14g%c%9d";
- break;
- }
- fprintf(stdout, fmt, i+1, cold,
- cnts[v][BKG][i], cold, area[BKG][i]);
- if( doexp & BCORR ){
- /* get correctly precisioned format statement */
- switch(dog){
- case 0:
- fmt = "%c%9.3f";
- break;
- case 1:
- fmt = "%c%9.3g";
- break;
- case 2:
- fmt = "%c%.14g";
- break;
- }
- if( area[BKG][i] > 0 )
- fprintf(stdout, fmt, cold, exp[BKG][i]/area[BKG][i]);
- else
- fprintf(stdout, fmt, cold, 0.0);
- }
- fprintf(stdout, "\n");
- }
- }
- break;
- }
- fprintf(stdout, "\n");
- fflush(stdout);
-
- /* process the next interval, if necessary */
- if( ++v < nintv ){
- fprintf(stdout, "\014\n");
- goto intvagain;
- }
-
- /* cleanup */
- for(i=0; i<nintv; i++){
- if( bncnts[i] ) xfree(bncnts[i]);
- if( bnerr[i] ) xfree(bnerr[i]);
- if( bscnts[i] ) xfree(bscnts[i]);
- if( bserr[i] ) xfree(bserr[i]);
- for(j=0; j<2; j++){
- if( cnts[i][j] ) xfree(cnts[i][j]);
- if( savecnts[i][j] ) xfree(savecnts[i][j]);
- }
- if( intvs[i] ) xfree(intvs[i]);
- }
- for(i=0; i<2; i++){
- if( masks[i] ) xfree(masks[i]);
- if( area[i] ) xfree(area[i]);
- if( exp[i] ) xfree(exp[i]);
- if( savearea[i] ) xfree(savearea[i]);
- if( saveexp[i] ) xfree(saveexp[i]);
- if( filtstr[i] ) xfree(filtstr[i]);
- if( valname[i] ) xfree(valname[i]);
- }
- if( radang ) xfree(radang);
- for(i=0; i<4; i++){
- if( name[i] ){
- xfree(name[i]);
- if( fun[i] ) FunClose(fun[i]);
- }
- }
-
- return(0);
-}