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 }