diff options
author | Joe Hunkeler <jhunkeler@gmail.com> | 2015-08-11 16:51:37 -0400 |
---|---|---|
committer | Joe Hunkeler <jhunkeler@gmail.com> | 2015-08-11 16:51:37 -0400 |
commit | 40e5a5811c6ffce9b0974e93cdd927cbcf60c157 (patch) | |
tree | 4464880c571602d54f6ae114729bf62a89518057 /noao/digiphot/daophot/allstar/dpastar.x | |
download | iraf-osx-40e5a5811c6ffce9b0974e93cdd927cbcf60c157.tar.gz |
Repatch (from linux) of OSX IRAF
Diffstat (limited to 'noao/digiphot/daophot/allstar/dpastar.x')
-rw-r--r-- | noao/digiphot/daophot/allstar/dpastar.x | 327 |
1 files changed, 327 insertions, 0 deletions
diff --git a/noao/digiphot/daophot/allstar/dpastar.x b/noao/digiphot/daophot/allstar/dpastar.x new file mode 100644 index 00000000..c8004f6d --- /dev/null +++ b/noao/digiphot/daophot/allstar/dpastar.x @@ -0,0 +1,327 @@ +include <mach.h> +include <imhdr.h> +include "../lib/daophotdef.h" +include "../lib/apseldef.h" +include "../lib/allstardef.h" + + +# DP_ASTAR -- Begin doing the photometry. + +procedure dp_astar (dao, im, subim, allfd, rejfd, cache, savesub, version) + +pointer dao # pointer to the daophot structure +pointer im # pointer to the input image +pointer subim # pointer to the subtracted image +int allfd # file descriptor for the output photometry file +int rejfd # file descriptor for rejections files +int cache # cache the data ? +int savesub # save the subtracted image ? +int version # version number + +bool clip +int nstar, row1_number, row2_number, niter, itsky, x1, x2, y1, y2, istar +int lstar, ldummy, newsky +pointer apsel, psffit, allstar, sp, indices, colpoints +real fradius, sepcrt, sepmin, clmpmx, wcrit, radius, xmin, xmax, ymin, ymax +real csharp, rdummy + +int dp_alphot(), dp_alnstar() +pointer dp_gst(), dp_gwt(), dp_gdc() +real dp_usepsf() + +begin + # Define some daophot structure pointers. + apsel = DP_APSEL(dao) + psffit = DP_PSFFIT (dao) + allstar = DP_ALLSTAR (dao) + + # Store the original fitting radius + fradius = DP_FITRAD(dao) + DP_FITRAD(dao) = min (DP_FITRAD(dao), DP_PSFRAD(dao)) + DP_SFITRAD(dao) = DP_FITRAD(dao) * DP_SCALE(dao) + + # Get some working memory. + call smark (sp) + call salloc (indices, NAPPAR, TY_INT) + call salloc (colpoints, ALL_NOUTCOLUMN, TY_INT) + + # Define some daophot constants. + nstar = DP_APNUM(apsel) + csharp = 1.4427 * Memr[DP_PSFPARS(psffit)] * + Memr[DP_PSFPARS(psffit)+1] / dp_usepsf (DP_PSFUNCTION(psffit), 0.0, + 0.0, DP_PSFHEIGHT(psffit), Memr[DP_PSFPARS(psffit)], + Memr[DP_PSFLUT(psffit)], DP_PSFSIZE(psffit), DP_NVLTABLE(psffit), + DP_NFEXTABLE(psffit), 0.0, 0.0, rdummy, rdummy) + if (IS_INDEFR(DP_MERGERAD(dao))) + sepcrt = 2.0 * (Memr[DP_PSFPARS(psffit)] ** 2 + + Memr[DP_PSFPARS(psffit)+1] ** 2) + else + sepcrt = DP_MERGERAD(dao) ** 2 + sepmin = min (1.0, FRACTION_MINSEP * sepcrt) + itsky = 3 + + # Initialize the output photometry file for writing. + row1_number = 0 + row2_number = 0 + if (DP_TEXT(dao) == YES) { + call dp_xnewal (dao, allfd) + if (rejfd != NULL) + call dp_xnewal (dao, rejfd) + } else { + call dp_tnewal (dao, allfd, Memi[colpoints]) + if (rejfd != NULL) + call dp_tnewal (dao, rejfd, Memi[colpoints]) + } + + # Allocate memory for the input, output and fitting arrays. + call dp_gnindices (Memi[indices]) + call dp_rmemapsel (dao, Memi[indices], NAPPAR, nstar) + call dp_almemstar (dao, nstar, DP_MAXGROUP(dao)) + call dp_cache (dao, im, subim, cache) + + # Read in the input data and assign the initial weights. + call dp_setwt (dao, im) + + # Convert the magnitudes to relative brightnesses. + call dp_alzero (dao, Memr[DP_APMAG(apsel)], nstar) + + # Initialize all the fit/nofit indices and the error codes. + call amovki (NO, Memi[DP_ASKIP(allstar)], nstar) + call amovki (ALLERR_OK, Memi[DP_AIER(allstar)], nstar) + + # Remove stars that have INDEF centers, are off the image altogether, + # or are too close to another star before beginning to fit. + call dp_strip (Memi[DP_APID(apsel)], Memr[DP_APXCEN(apsel)], + Memr[DP_APYCEN(apsel)], Memr[DP_APMAG(apsel)], + Memr[DP_APMSKY(apsel)], Memi[DP_ASKIP(allstar)], + Memi[DP_AIER(allstar)], nstar, sepmin, int(IM_LEN(im,1)), + int(IM_LEN(im,2)), DP_FITRAD(dao), DP_VERBOSE(dao)) + + # Write out results for the rejected stars. + call dp_wout (dao, im, Memr[DP_APXCEN(apsel)+nstar], + Memr[DP_APYCEN(apsel)+nstar], Memr[DP_APXCEN(apsel)+nstar], + Memr[DP_APYCEN(apsel)+nstar], DP_APNUM(apsel) - nstar) + if (DP_TEXT(dao) == YES) { + call dp_xalwrite (allfd, rejfd, Memi[DP_APID(apsel)], + Memr[DP_APXCEN(apsel)], Memr[DP_APYCEN(apsel)], + Memr[DP_APMAG(apsel)], Memr[DP_APERR(apsel)], + Memr[DP_APMSKY(apsel)], Memr[DP_APCHI(apsel)], + Memr[DP_ANUMER(allstar)], Memr[DP_ADENOM(allstar)], + Memi[DP_ASKIP(allstar)], Memi[DP_AIER(allstar)], niter, + nstar + 1, DP_APNUM(apsel), DP_PSFMAG(psffit), csharp) + } else { + call dp_talwrite (allfd, rejfd, Memi[colpoints], + Memi[DP_APID(apsel)], Memr[DP_APXCEN(apsel)], + Memr[DP_APYCEN(apsel)], Memr[DP_APMAG(apsel)], + Memr[DP_APERR(apsel)], Memr[DP_APMSKY(apsel)], + Memr[DP_APCHI(apsel)], Memr[DP_ANUMER(allstar)], + Memr[DP_ADENOM(allstar)], Memi[DP_ASKIP(allstar)], + Memi[DP_AIER(allstar)], niter, nstar + 1, DP_APNUM(apsel), + row1_number, row2_number, DP_PSFMAG(psffit), csharp) + } + + # Do some initialization for the fit. + clmpmx = CLAMP_FRACTION * DP_FITRAD(dao) + call aclrr (Memr[DP_AXOLD(allstar)], nstar) + call aclrr (Memr[DP_AYOLD(allstar)], nstar) + call amovkr (clmpmx, Memr[DP_AXCLAMP(allstar)], nstar) + call amovkr (clmpmx, Memr[DP_AYCLAMP(allstar)], nstar) + call amovkr (1.0, Memr[DP_ASUMWT(allstar)], nstar) + + # Begin iterating. + for (niter = 1; (nstar > 0) && (niter <= DP_MAXITER (dao)); + niter = niter + 1) { + + if (DP_VERBOSE(dao) == YES) { + call printf ("NITER = %d\n") + call pargi (niter) + } + + if ((DP_CLIPEXP(dao) != 0) && (niter >= 4)) + clip = true + else + clip = false + + # Define the critical errors. + if (niter >= 15) + wcrit = WCRIT15 + else if (niter >= 10) + wcrit = WCRIT10 + else if (niter >= 5) + wcrit = WCRIT5 + else + wcrit = WCRIT0 + + # Sort the data on y. + call dp_alsort (Memi[DP_APID(apsel)], Memr[DP_APXCEN(apsel)], + Memr[DP_APYCEN(apsel)], Memr[DP_APMAG(apsel)], + Memr[DP_APMSKY(apsel)], Memr[DP_ASUMWT(allstar)], + Memr[DP_AXOLD(allstar)], Memr[DP_AYOLD(allstar)], + Memr[DP_AXCLAMP(allstar)], Memr[DP_AYCLAMP(allstar)], nstar) + + # Compute the working radius. This is either the fitting radius + # or the outer sky radius if this is an iteration during which + # sky is to be determined whichever is larger. + if ((DP_FITSKY(dao) == YES) && (mod (niter, itsky) == 0)) { + newsky = YES + if ((DP_ANNULUS(dao) + DP_DANNULUS(dao)) > DP_FITRAD(dao)) + radius = DP_ANNULUS(dao) + DP_DANNULUS(dao) + else + radius = DP_FITRAD(dao) + } else { + newsky = NO + radius = DP_FITRAD(dao) + } + + # Define region of the image used to fit the remaining stars. + call alimr (Memr[DP_APXCEN(apsel)], nstar, xmin, xmax) + call alimr (Memr[DP_APYCEN(apsel)], nstar, ymin, ymax) + x1 = max (1, min (IM_LEN(im,1), int (xmin-radius)+1)) + x2 = max (1, min (IM_LEN(im,1), int (xmax+radius))) + y1 = max (1, min (IM_LEN(im,2), int (ymin-radius)+1)) + y2 = max (1, min (IM_LEN (im,2), int (ymax+radius))) + + # Reinitialize the weight and scratch arrays / images . + call dp_wstinit (dao, im, Memr[DP_APXCEN(apsel)], + Memr[DP_APYCEN(apsel)], Memr[DP_APMAG(apsel)], + nstar, radius, x1, x2, y1, y2) + + # Recompute the initial sky estimates if that switch is enabled. + if (newsky == YES) + call dp_alsky (dao, im, Memr[DP_APXCEN(apsel)], + Memr[DP_APYCEN(apsel)], Memr[DP_APMSKY(apsel)], nstar, + x1, x2, y1, y2, DP_ANNULUS(dao), DP_ANNULUS(dao) + + DP_DANNULUS(dao), 100, -MAX_REAL) + + # Group the remaining stars. + call dp_regroup (Memi[DP_APID(apsel)], Memr[DP_APXCEN(apsel)], + Memr[DP_APYCEN(apsel)], Memr[DP_APMAG(apsel)], + Memr[DP_APMSKY(apsel)], Memr[DP_ASUMWT(allstar)], + Memr[DP_AXOLD(allstar)], Memr[DP_AYOLD(allstar)], + Memr[DP_AXCLAMP(allstar)], Memr[DP_AYCLAMP(allstar)], nstar, + DP_FITRAD(dao), Memi[DP_ALAST(allstar)]) + + # Reset the error codes. + call amovki (ALLERR_OK, Memi[DP_AIER(allstar)], nstar) + + # Do the serious fitting one group at a time. + for (istar = 1; istar <= nstar; istar = lstar + 1) { + + # Do the fitting a group at a time. + lstar = dp_alphot (dao, im, nstar, istar, niter, sepcrt, + sepmin, wcrit, clip, clmpmx, version) + + # Write the results. + if (DP_TEXT(dao) == YES) { + call dp_xalwrite (allfd, rejfd, Memi[DP_APID(apsel)], + Memr[DP_APXCEN(apsel)], Memr[DP_APYCEN(apsel)], + Memr[DP_APMAG(apsel)], Memr[DP_APERR(apsel)], + Memr[DP_APMSKY(apsel)], Memr[DP_APCHI(apsel)], + Memr[DP_ANUMER(allstar)], Memr[DP_ADENOM(allstar)], + Memi[DP_ASKIP(allstar)], Memi[DP_AIER(allstar)], + niter, istar, lstar, DP_PSFMAG(psffit), csharp) + } else { + call dp_talwrite (allfd, rejfd, Memi[colpoints], + Memi[DP_APID(apsel)], Memr[DP_APXCEN(apsel)], + Memr[DP_APYCEN(apsel)], Memr[DP_APMAG(apsel)], + Memr[DP_APERR(apsel)], Memr[DP_APMSKY(apsel)], + Memr[DP_APCHI(apsel)], Memr[DP_ANUMER(allstar)], + Memr[DP_ADENOM(allstar)], Memi[DP_ASKIP(allstar)], + Memi[DP_AIER(allstar)], niter, istar, lstar, row1_number, + row2_number, DP_PSFMAG(psffit), csharp) + } + + } + + # Find the last star in the list that still needs more work. + nstar = dp_alnstar (Memi[DP_ASKIP(allstar)], nstar) + + # Remove the fitted stars from the list. + for (istar = 1; (istar < nstar) && nstar > 0; istar = istar + 1) { + call dp_alswitch (Memi[DP_APID(apsel)], + Memr[DP_APXCEN(apsel)], Memr[DP_APYCEN(apsel)], + Memr[DP_APMAG(apsel)], Memr[DP_APERR(apsel)], + Memr[DP_APMSKY(apsel)], Memr[DP_ASUMWT(allstar)], + Memr[DP_AXOLD(allstar)], Memr[DP_AYOLD(allstar)], + Memr[DP_AXCLAMP(allstar)], Memr[DP_AYCLAMP(allstar)], + Memi[DP_ASKIP(allstar)], istar, nstar) + } + + # Flush the output buffers. + if (dp_gwt (dao, im, ldummy, ldummy, READ_WRITE, YES) == NULL) + ; + if (dp_gst (dao, im, ldummy, ldummy, READ_ONLY, YES) == NULL) + ; + if (dp_gdc (dao, im, ldummy, ldummy, READ_WRITE, YES) == NULL) + ; + } + + # Release cached memory. + call dp_uncache (dao, subim, savesub) + + call sfree (sp) + + # Restore the original fitting radius + DP_FITRAD(dao) = fradius + DP_SFITRAD(dao) = DP_FITRAD(dao) * DP_SCALE(dao) +end + + +# DP_ALNSTAR -- Compute the number of stars left + +int procedure dp_alnstar (skip, nstar) + +int skip[ARB] # skip array +int nstar # number of stars + +begin + while (nstar > 0) { + if (skip[nstar] == NO) + break + nstar = nstar - 1 + } + + return (nstar) +end + + +# DP_ALSWITCH -- Switch array elements. + +procedure dp_alswitch (id, xcen, ycen, mag, magerr, sky, chi, xold, yold, + xclamp, yclamp, skip, istar, nstar) + +int id[ARB] # array of ids +real xcen[ARB] # array of x centers +real ycen[ARB] # array of y centers +real mag[ARB] # array of magnitudes +real magerr[ARB] # array of magnitude errors +real sky[ARB] # array of sky values +real chi[ARB] # array of chi values +real xold[ARB] # old x array +real yold[ARB] # old y array +real xclamp[ARB] # array of x clamps +real yclamp[ARB] # array of y clamps +int skip[ARB] # skip array +int istar # next star +int nstar # total number of stars + +int dp_alnstar() + +begin + if (skip[istar] == YES) { + id[istar] = id[nstar] + xcen[istar] = xcen[nstar] + ycen[istar] = ycen[nstar] + mag[istar] = mag[nstar] + magerr[istar] = magerr[nstar] + sky[istar] = sky[nstar] + chi[istar] = chi[nstar] + xold[istar] = xold[nstar] + yold[istar] = yold[nstar] + xclamp[istar] = xclamp[nstar] + yclamp[istar] = yclamp[nstar] + skip[istar] = NO + nstar = nstar - 1 + nstar = dp_alnstar (skip, nstar) + } +end |