Warning, /education/kstars/kstars/fitsviewer/sep/aperture.i is written in an unsupported language. File is not indexed.
0001 /* 0002 Adding (void *) pointers is a GNU C extension, not part of standard C. 0003 When compiling on Windows with MS Visual C compiler need to cast the 0004 (void *) to something the size of one byte. 0005 */ 0006 #if defined(_MSC_VER) 0007 #define MSVC_VOID_CAST (char *) 0008 #else 0009 #define MSVC_VOID_CAST 0010 #endif 0011 0012 int APER_NAME(sep_image *im, 0013 double x, double y, APER_ARGS, int subpix, short inflag, 0014 double *sum, double *sumerr, double *area, short *flag) 0015 { 0016 PIXTYPE pix, varpix; 0017 double dx, dy, dx1, dy2, offset, scale, scale2, tmp; 0018 double tv, sigtv, totarea, maskarea, overlap, rpix2; 0019 int ix, iy, xmin, xmax, ymin, ymax, sx, sy, status, size, esize, msize; 0020 long pos; 0021 short errisarray, errisstd; 0022 BYTE *datat, *errort, *maskt; 0023 converter convert, econvert, mconvert; 0024 APER_DECL; 0025 0026 /* input checks */ 0027 APER_CHECKS; 0028 if (subpix < 0) 0029 return ILLEGAL_SUBPIX; 0030 0031 /* initializations */ 0032 size = esize = msize = 0; 0033 tv = sigtv = 0.0; 0034 overlap = totarea = maskarea = 0.0; 0035 datat = maskt = NULL; 0036 errort = im->noise; 0037 *flag = 0; 0038 varpix = 0.0; 0039 scale = 1.0/subpix; 0040 scale2 = scale*scale; 0041 offset = 0.5*(scale-1.0); 0042 errisarray = 0; 0043 errisstd = 0; 0044 0045 APER_INIT; 0046 0047 /* get data converter(s) for input array(s) */ 0048 if ((status = get_converter(im->dtype, &convert, &size))) 0049 return status; 0050 if (im->mask && (status = get_converter(im->mdtype, &mconvert, &msize))) 0051 return status; 0052 0053 /* get image noise */ 0054 if (im->noise_type != SEP_NOISE_NONE) 0055 { 0056 errisstd = (im->noise_type == SEP_NOISE_STDDEV); 0057 if (im->noise) 0058 { 0059 errisarray = 1; 0060 if ((status = get_converter(im->ndtype, &econvert, &esize))) 0061 return status; 0062 } 0063 else 0064 { 0065 varpix = (errisstd)? im->noiseval * im->noiseval: im->noiseval; 0066 } 0067 } 0068 0069 /* get extent of box */ 0070 APER_BOXEXTENT; 0071 0072 /* loop over rows in the box */ 0073 for (iy=ymin; iy<ymax; iy++) 0074 { 0075 /* set pointers to the start of this row */ 0076 pos = (iy%im->h) * im->w + xmin; 0077 datat = MSVC_VOID_CAST im->data + pos*size; 0078 if (errisarray) 0079 errort = MSVC_VOID_CAST im->noise + pos*esize; 0080 if (im->mask) 0081 maskt = MSVC_VOID_CAST im->mask + pos*msize; 0082 0083 /* loop over pixels in this row */ 0084 for (ix=xmin; ix<xmax; ix++) 0085 { 0086 dx = ix - x; 0087 dy = iy - y; 0088 rpix2 = APER_RPIX2; 0089 if (APER_COMPARE1) 0090 { 0091 if (APER_COMPARE2) /* might be partially in aperture */ 0092 { 0093 if (subpix == 0) 0094 overlap = APER_EXACT; 0095 else 0096 { 0097 dx += offset; 0098 dy += offset; 0099 overlap = 0.0; 0100 for (sy=subpix; sy--; dy+=scale) 0101 { 0102 dx1 = dx; 0103 dy2 = dy*dy; 0104 for (sx=subpix; sx--; dx1+=scale) 0105 { 0106 rpix2 = APER_RPIX2_SUBPIX; 0107 if (APER_COMPARE3) 0108 overlap += scale2; 0109 } 0110 } 0111 } 0112 } 0113 else 0114 /* definitely fully in aperture */ 0115 overlap = 1.0; 0116 0117 pix = convert(datat); 0118 0119 if (errisarray) 0120 { 0121 varpix = econvert(errort); 0122 if (errisstd) 0123 varpix *= varpix; 0124 } 0125 0126 if (im->mask && (mconvert(maskt) > im->maskthresh)) 0127 { 0128 *flag |= SEP_APER_HASMASKED; 0129 maskarea += overlap; 0130 } 0131 else 0132 { 0133 tv += pix*overlap; 0134 sigtv += varpix*overlap; 0135 } 0136 0137 totarea += overlap; 0138 0139 } /* closes "if pixel might be within aperture" */ 0140 0141 /* increment pointers by one element */ 0142 datat += size; 0143 if (errisarray) 0144 errort += esize; 0145 maskt += msize; 0146 } 0147 } 0148 0149 /* correct for masked values */ 0150 if (im->mask) 0151 { 0152 if (inflag & SEP_MASK_IGNORE) 0153 totarea -= maskarea; 0154 else 0155 { 0156 tv *= (tmp = totarea/(totarea-maskarea)); 0157 sigtv *= tmp; 0158 } 0159 } 0160 0161 /* add poisson noise, only if gain > 0 */ 0162 if (im->gain > 0.0 && tv>0.0) 0163 sigtv += tv / im->gain; 0164 0165 *sum = tv; 0166 *sumerr = sqrt(sigtv); 0167 *area = totarea; 0168 0169 return status; 0170 }