diff options
Diffstat (limited to 'noao/digiphot/apphot/fitsky/apfitsky.x')
-rw-r--r-- | noao/digiphot/apphot/fitsky/apfitsky.x | 452 |
1 files changed, 452 insertions, 0 deletions
diff --git a/noao/digiphot/apphot/fitsky/apfitsky.x b/noao/digiphot/apphot/fitsky/apfitsky.x new file mode 100644 index 00000000..1c105b79 --- /dev/null +++ b/noao/digiphot/apphot/fitsky/apfitsky.x @@ -0,0 +1,452 @@ +include "../lib/apphotdef.h" +include "../lib/apphot.h" +include "../lib/noisedef.h" +include "../lib/fitskydef.h" +include "../lib/fitsky.h" + +# APFITSKY -- Procedure to the compute the sky value in an annular region +# around a given position in the IRAF image. + +int procedure apfitsky (ap, im, wx, wy, sd, gd) + +pointer ap # pointer to the apphot structure +pointer im # pointer to the IRAF image +real wx # object x coordinate +real wy # object y coordinate +int sd # pointer to input text file containing sky values +pointer gd # pointer to graphics stream + +int ier, nclip, nsky, ilo, ihi +pointer sky, nse, gt +real x, y +int apskybuf(), ap_mode(), ap_centroid(), ap_histplot(), ap_readsky() +int ap_median(), ap_radplot(), ap_gauss(), ap_lgsky(), ap_crosscor() +int ap_mean(), ap_clip() +pointer ap_gtinit() + +begin + # Initialize. + sky = AP_PSKY(ap) + nse = AP_NOISE(ap) + AP_SXCUR(sky) = wx + AP_SYCUR(sky) = wy + if (IS_INDEFR(wx) || IS_INDEFR(wy)) { + AP_OSXCUR(sky) = INDEFR + AP_OSYCUR(sky) = INDEFR + } else { + switch (AP_WCSOUT(ap)) { + case WCS_WORLD, WCS_PHYSICAL: + call ap_ltoo (ap, wx, wy, AP_OSXCUR(sky), AP_OSYCUR(sky), 1) + case WCS_TV: + call ap_ltov (im, wx, wy, AP_OSXCUR(sky), AP_OSYCUR(sky), 1) + default: + AP_OSXCUR(sky) = wx + AP_OSYCUR(sky) = wy + } + } + + AP_SKY_MODE(sky) = INDEFR + AP_SKY_SIG(sky) = INDEFR + AP_SKY_SKEW(sky) = INDEFR + AP_NSKY(sky) = 0 + AP_NSKY_REJECT(sky) = 0 + if (IS_INDEFR(wx) || IS_INDEFR(wy)) + return (AP_NOSKYAREA) + + switch (AP_SKYFUNCTION(sky)) { + + case AP_MEAN: + + # Fetch the sky pixels. + ier = apskybuf (ap, im, wx, wy) + if (ier != AP_OK) + return (ier) + + # Initialze the weights. + call amovkr (1.0, Memr[AP_SWGT(sky)], AP_NSKYPIX(sky)) + + # Clip the data. + if (AP_SLOCLIP(sky) > 0.0 || AP_SHICLIP(sky) > 0.0) { + nclip = ap_clip (Memr[AP_SKYPIX(sky)], Memi[AP_INDEX(sky)], + AP_NSKYPIX(sky), AP_SLOCLIP(sky), AP_SHICLIP(sky), ilo, + ihi) + if (nclip >= AP_NSKYPIX(sky)) + return (AP_NSKY_TOO_SMALL) + nsky = AP_NSKYPIX(sky) - nclip + } else { + nclip = 0 + call ap_index (Memi[AP_INDEX(sky)], AP_NSKYPIX(sky)) + ilo = 1 + nsky = AP_NSKYPIX(sky) + } + + # Compute the mean of the sky pixel distribution with pixel + # rejection and region growing. + ier = ap_mean (Memr[AP_SKYPIX(sky)], Memi[AP_COORDS(sky)], + Memr[AP_SWGT(sky)], Memi[AP_INDEX(sky)+ilo-1], + nsky, AP_SNX(sky), AP_SNY(sky), AP_SLOREJECT(sky), + AP_SHIREJECT(sky), AP_RGROW(sky) * AP_SCALE(ap), + AP_SNREJECT(sky), AP_SKY_MODE(sky), AP_SKY_SIG(sky), + AP_SKY_SKEW(sky), AP_NSKY(sky), AP_NSKY_REJECT(sky)) + AP_NSKY_REJECT(sky) = AP_NBADSKYPIX(sky) + nclip + + AP_NSKY_REJECT(sky) + + return (ier) + + case AP_MEDIAN: + + # Fetch the sky pixels. + ier = apskybuf (ap, im, wx, wy) + if (ier != AP_OK) + return (ier) + + # Initialze the weights. + call amovkr (1.0, Memr[AP_SWGT(sky)], AP_NSKYPIX(sky)) + + # Clip the data. + if (AP_SLOCLIP(sky) > 0.0 || AP_SHICLIP(sky) > 0.0) { + nclip = ap_clip (Memr[AP_SKYPIX(sky)], Memi[AP_INDEX(sky)], + AP_NSKYPIX(sky), AP_SLOCLIP(sky), AP_SHICLIP(sky), ilo, + ihi) + if (nclip >= AP_NSKYPIX(sky)) + return (AP_NSKY_TOO_SMALL) + nsky = AP_NSKYPIX(sky) - nclip + } else { + nclip = 0 + call apqsort (Memr[AP_SKYPIX(sky)], Memi[AP_INDEX(sky)], + Memi[AP_INDEX(sky)], AP_NSKYPIX(sky)) + ilo = 1 + nsky = AP_NSKYPIX(sky) + } + + # Compute the median of the sky pixel distribution with pixel + # rejection and region growing. + ier = ap_median (Memr[AP_SKYPIX(sky)], Memi[AP_COORDS(sky)], + Memr[AP_SWGT(sky)], Memi[AP_INDEX(sky)+ilo-1], nsky, + AP_SNX(sky), AP_SNY(sky), AP_SLOREJECT(sky), + AP_SHIREJECT(sky), AP_RGROW(sky) * AP_SCALE(ap), + AP_SNREJECT(sky), AP_SKY_MODE(sky), AP_SKY_SIG(sky), + AP_SKY_SKEW(sky), AP_NSKY(sky), AP_NSKY_REJECT(sky)) + AP_NSKY_REJECT(sky) = AP_NBADSKYPIX(sky) + nclip + + AP_NSKY_REJECT(sky) + + return (ier) + + case AP_MODE: + + # Fetch the sky pixels. + ier = apskybuf (ap, im, wx, wy) + if (ier != AP_OK) + return (ier) + + # Initialze the weights. + call amovkr (1.0, Memr[AP_SWGT(sky)], AP_NSKYPIX(sky)) + + # Clip the data. + if (AP_SLOCLIP(sky) > 0.0 || AP_SHICLIP(sky) > 0.0) { + nclip = ap_clip (Memr[AP_SKYPIX(sky)], Memi[AP_INDEX(sky)], + AP_NSKYPIX(sky), AP_SLOCLIP(sky), AP_SHICLIP(sky), ilo, + ihi) + if (nclip >= AP_NSKYPIX(sky)) + return (AP_NSKY_TOO_SMALL) + nsky = AP_NSKYPIX(sky) - nclip + } else { + nclip = 0 + call apqsort (Memr[AP_SKYPIX(sky)], Memi[AP_INDEX(sky)], + Memi[AP_INDEX(sky)], AP_NSKYPIX(sky)) + ilo = 1 + nsky = AP_NSKYPIX(sky) + } + + # Compute the median of the sky pixel distribution with pixel + # rejection and region growing. + ier = ap_mode (Memr[AP_SKYPIX(sky)], Memi[AP_COORDS(sky)], + Memr[AP_SWGT(sky)], Memi[AP_INDEX(sky)+ilo-1], nsky, + AP_SNX(sky), AP_SNY(sky), AP_SLOREJECT(sky), + AP_SHIREJECT(sky), AP_RGROW(sky) * AP_SCALE(ap), + AP_SNREJECT(sky), AP_SKY_MODE(sky), AP_SKY_SIG(sky), + AP_SKY_SKEW(sky), AP_NSKY(sky), AP_NSKY_REJECT(sky)) + AP_NSKY_REJECT(sky) = AP_NBADSKYPIX(sky) + nclip + + AP_NSKY_REJECT(sky) + + return (ier) + + case AP_CENTROID: + + # Fetch the sky pixels. + ier = apskybuf (ap, im, wx, wy) + if (ier != AP_OK) + return (ier) + + # Initialze the weights. + call amovkr (1.0, Memr[AP_SWGT(sky)], AP_NSKYPIX(sky)) + + # Clip the data. + if (AP_SLOCLIP(sky) > 0.0 || AP_SHICLIP(sky) > 0.0) { + nclip = ap_clip (Memr[AP_SKYPIX(sky)], Memi[AP_INDEX(sky)], + AP_NSKYPIX(sky), AP_SLOCLIP(sky), AP_SHICLIP(sky), ilo, + ihi) + if (nclip >= AP_NSKYPIX(sky)) + return (AP_NSKY_TOO_SMALL) + nsky = AP_NSKYPIX(sky) - nclip + } else { + nclip = 0 + call ap_index (Memi[AP_INDEX(sky)], AP_NSKYPIX(sky)) + ilo = 1 + nsky = AP_NSKYPIX(sky) + } + + # Compute the sky value by performing a moment analysis of the + # sky pixel histogram. + ier = ap_centroid (Memr[AP_SKYPIX(sky)], Memi[AP_COORDS(sky)], + Memr[AP_SWGT(sky)], Memi[AP_INDEX(sky)+ilo-1], nsky, + AP_SNX(sky), AP_SNY(sky), AP_K1(sky), INDEFR, + AP_BINSIZE(sky), AP_SMOOTH(sky), AP_SLOREJECT(sky), + AP_SHIREJECT(sky), AP_RGROW(sky) * AP_SCALE(ap), + AP_SMAXITER(sky), AP_SKY_MODE(sky), AP_SKY_SIG(sky), + AP_SKY_SKEW(sky), AP_NSKY(sky), AP_NSKY_REJECT(sky)) + AP_NSKY_REJECT(sky) = AP_NBADSKYPIX(sky) + nclip + + AP_NSKY_REJECT(sky) + + return (ier) + + case AP_CONSTANT: + + # Set the sky value to a constant. + AP_SKY_MODE(sky) = AP_SKYBACKGROUND(sky) + AP_SKY_SIG(sky) = AP_SKYSIGMA(nse) + AP_SKY_SKEW(sky) = INDEFR + AP_NSKY(sky) = 0 + AP_NSKY_REJECT(sky) = 0 + return (AP_OK) + + case AP_SKYFILE: + + # Read the sky values from a file. + if (sd == NULL) + return (AP_NOSKYFILE) + ier = ap_readsky (sd, x, y, AP_SKY_MODE(sky), AP_SKY_SIG(sky), + AP_SKY_SKEW(sky), AP_NSKY(sky), AP_NSKY_REJECT(sky)) + if (ier == EOF) + return (AP_EOFSKYFILE) + else if (ier != 7) + return (AP_BADSKYSCAN) + else if (AP_NSKY(sky) <= 0) + return (AP_NOSKYAREA) + else + return (AP_OK) + + case AP_RADPLOT: + + # Check the status of the graphics stream. + if (gd == NULL) + return (AP_NOGRAPHICS) + + # Fetch the sky pixels. + ier = apskybuf (ap, im, wx, wy) + if (ier != AP_OK) + return (ier) + + # Clip the data. + if (AP_SLOCLIP(sky) > 0.0 || AP_SHICLIP(sky) > 0.0) { + nclip = ap_clip (Memr[AP_SKYPIX(sky)], Memi[AP_INDEX(sky)], + AP_NSKYPIX(sky), AP_SLOCLIP(sky), AP_SHICLIP(sky), ilo, + ihi) + if (nclip >= AP_NSKYPIX(sky)) + return (AP_NSKY_TOO_SMALL) + nsky = AP_NSKYPIX(sky) - nclip + } else { + nclip = 0 + call ap_index (Memi[AP_INDEX(sky)], AP_NSKYPIX(sky)) + ilo = 1 + nsky = AP_NSKYPIX(sky) + } + + # Mark the sky level on the radial profile plot. + call gactivate (gd, 0) + gt = ap_gtinit (AP_IMROOT(ap), wx, wy) + ier = ap_radplot (gd, gt, Memr[AP_SKYPIX(sky)], + Memi[AP_COORDS(sky)], Memi[AP_INDEX(sky)+ilo-1], nsky, + AP_SXC(sky), AP_SYC(sky), AP_SNX(sky), AP_SNY(sky), + AP_SCALE(ap), AP_SKY_MODE(sky), AP_SKY_SKEW(sky), + AP_SKY_SIG(sky), AP_NSKY(sky), AP_NSKY_REJECT(sky)) + AP_NSKY_REJECT(sky) = AP_NBADSKYPIX(sky) + nclip + + AP_NSKY_REJECT(sky) + call ap_gtfree (gt) + call gdeactivate (gd, 0) + + return (ier) + + case AP_HISTPLOT: + + # Check the status of the graphics stream. + if (gd == NULL) + return (AP_NOGRAPHICS) + + # Fetch the sky pixels. + ier = apskybuf (ap, im, wx, wy) + if (ier != AP_OK) + return (ier) + + # Initialze the weights. + call amovkr (1.0, Memr[AP_SWGT(sky)], AP_NSKYPIX(sky)) + + # Clip the data. + if (AP_SLOCLIP(sky) > 0.0 || AP_SHICLIP(sky) > 0.0) { + nclip = ap_clip (Memr[AP_SKYPIX(sky)], Memi[AP_INDEX(sky)], + AP_NSKYPIX(sky), AP_SLOCLIP(sky), AP_SHICLIP(sky), + ilo, ihi) + if (nclip >= AP_NSKYPIX(sky)) + return (AP_NSKY_TOO_SMALL) + nsky = AP_NSKYPIX(sky) - nclip + } else { + nclip = 0 + call ap_index (Memi[AP_INDEX(sky)], AP_NSKYPIX(sky)) + ilo = 1 + nsky = AP_NSKYPIX(sky) + } + + # Mark the peak of the histogram on the histogram plot. + #call gactivate (gd, 0) + gt = ap_gtinit (AP_IMROOT(ap), wx, wy) + ier = ap_histplot (gd, gt, Memr[AP_SKYPIX(sky)], + Memr[AP_SWGT(sky)], Memi[AP_INDEX(sky)+ilo-1], nsky, + AP_K1(sky), INDEFR, AP_BINSIZE(sky), AP_SMOOTH(sky), + AP_SKY_MODE(sky), AP_SKY_SIG(sky), AP_SKY_SKEW(sky), + AP_NSKY(sky), AP_NSKY_REJECT(sky)) + AP_NSKY_REJECT(sky) = AP_NBADSKYPIX(sky) + nclip + + AP_NSKY_REJECT(sky) + call ap_gtfree (gt) + #call gdeactivate (gd, 0) + + return (ier) + + case AP_OFILT: + + # Fetch the sky pixels. + ier = apskybuf (ap, im, wx, wy) + if (ier != AP_OK) + return (ier) + + # Initialze the weights. + call amovkr (1.0, Memr[AP_SWGT(sky)], AP_NSKYPIX(sky)) + + # Clip the data. + if (AP_SLOCLIP(sky) > 0.0 || AP_SHICLIP(sky) > 0.0) { + nclip = ap_clip (Memr[AP_SKYPIX(sky)], Memi[AP_INDEX(sky)], + AP_NSKYPIX(sky), AP_SLOCLIP(sky), AP_SHICLIP(sky), + ilo, ihi) + if (nclip >= AP_NSKYPIX(sky)) + return (AP_NSKY_TOO_SMALL) + nsky = AP_NSKYPIX(sky) - nclip + } else { + nclip = 0 + call ap_index (Memi[AP_INDEX(sky)], AP_NSKYPIX(sky)) + ilo = 1 + nsky = AP_NSKYPIX(sky) + } + + # Compute the sky value using the histogram of the sky pixels + # and a variation of the optimal filtering technique. + ier = ap_lgsky (Memr[AP_SKYPIX(sky)], Memi[AP_COORDS(sky)], + Memr[AP_SWGT(sky)], Memi[AP_INDEX(sky)+ilo-1], nsky, + AP_SNX(sky), AP_SNY(sky), AP_K1(sky), INDEFR, + AP_BINSIZE(sky), AP_SMOOTH(sky), AP_SLOREJECT(sky), + AP_SHIREJECT(sky), AP_RGROW(sky) * AP_SCALE(ap), + AP_SMAXITER(sky), AP_SKY_MODE(sky), AP_SKY_SIG(sky), + AP_SKY_SKEW(sky), AP_NSKY(sky), AP_NSKY_REJECT(sky)) + AP_NSKY_REJECT(sky) = AP_NBADSKYPIX(sky) + nclip + + AP_NSKY_REJECT(sky) + + return (ier) + + case AP_GAUSS: + + # Fetch the sky pixels. + ier = apskybuf (ap, im, wx, wy) + if (ier != AP_OK) + return (ier) + + # Initialze the weights. + call amovkr (1.0, Memr[AP_SWGT(sky)], AP_NSKYPIX(sky)) + + # Clip the data. + if (AP_SLOCLIP(sky) > 0.0 || AP_SHICLIP(sky) > 0.0) { + nclip = ap_clip (Memr[AP_SKYPIX(sky)], Memi[AP_INDEX(sky)], + AP_NSKYPIX(sky), AP_SLOCLIP(sky), AP_SHICLIP(sky), + ilo, ihi) + if (nclip >= AP_NSKYPIX(sky)) + return (AP_NSKY_TOO_SMALL) + nsky = AP_NSKYPIX(sky) - nclip + } else { + nclip = 0 + call ap_index (Memi[AP_INDEX(sky)], AP_NSKYPIX(sky)) + ilo = 1 + nsky = AP_NSKYPIX(sky) + } + + # Compute the sky value by a fitting a skewed Gaussian function + # to the sky pixel histogram. + ier = ap_gauss (Memr[AP_SKYPIX(sky)], Memi[AP_COORDS(sky)], + Memr[AP_SWGT(sky)], Memi[AP_INDEX(sky)+ilo-1], nsky, + AP_SNX(sky), AP_SNY(sky), AP_SMAXITER(sky), AP_K1(sky), + INDEFR, AP_BINSIZE(sky), AP_SMOOTH(sky), + AP_SLOREJECT(sky), AP_SHIREJECT(sky), AP_RGROW(sky) * + AP_SCALE(ap), AP_SNREJECT(sky), AP_SKY_MODE(sky), + AP_SKY_SIG(sky), AP_SKY_SKEW(sky), AP_NSKY(sky), + AP_NSKY_REJECT(sky)) + AP_NSKY_REJECT(sky) = AP_NBADSKYPIX(sky) + nclip + + AP_NSKY_REJECT(sky) + + return (ier) + + case AP_CROSSCOR: + + # Fetch the sky pixels. + ier = apskybuf (ap, im, wx, wy) + if (ier != AP_OK) + return (ier) + + # Initialze the weights. + call amovkr (1.0, Memr[AP_SWGT(sky)], AP_NSKYPIX(sky)) + + # Clip the data. + if (AP_SLOCLIP(sky) > 0.0 || AP_SHICLIP(sky) > 0.0) { + nclip = ap_clip (Memr[AP_SKYPIX(sky)], Memi[AP_INDEX(sky)], + AP_NSKYPIX(sky), AP_SLOCLIP(sky), AP_SHICLIP(sky), + ilo, ihi) + if (nclip >= AP_NSKYPIX(sky)) + return (AP_NSKY_TOO_SMALL) + nsky = AP_NSKYPIX(sky) - nclip + } else { + nclip = 0 + call ap_index (Memi[AP_INDEX(sky)], AP_NSKYPIX(sky)) + ilo = 1 + nsky = AP_NSKYPIX(sky) + } + + # Fit the sky value by computing the cross-correlation + # function of the histogram and an estimate of the noise + # distribution. + ier = ap_crosscor (Memr[AP_SKYPIX(sky)], Memi[AP_COORDS(sky)], + Memr[AP_SWGT(sky)], Memi[AP_INDEX(sky)+ilo-1], nsky, + AP_SNX(sky), AP_SNY(sky), AP_K1(sky), INDEFR, + AP_BINSIZE(sky), AP_SMOOTH(sky), AP_SLOREJECT(sky), + AP_SHIREJECT(sky), AP_RGROW(sky) * AP_SCALE(ap), + AP_SMAXITER(sky), AP_SKY_MODE(sky), AP_SKY_SIG(sky), + AP_SKY_SKEW(sky), AP_NSKY(sky), AP_NSKY_REJECT(sky)) + AP_NSKY_REJECT(sky) = AP_NBADSKYPIX(sky) + nclip + + AP_NSKY_REJECT(sky) + + return (ier) + + default: + + AP_SKY_MODE(sky) = INDEFR + AP_SKY_SIG(sky) = INDEFR + AP_SKY_SKEW(sky) = INDEFR + AP_NSKY(sky) = AP_NSKYPIX(sky) + AP_NSKY_REJECT(sky) = 0 + return (AP_OK) + } +end |