aboutsummaryrefslogtreecommitdiff
path: root/noao/artdata/lists/stspatial.x
diff options
context:
space:
mode:
authorJoe Hunkeler <jhunkeler@gmail.com>2015-08-11 16:51:37 -0400
committerJoe Hunkeler <jhunkeler@gmail.com>2015-08-11 16:51:37 -0400
commit40e5a5811c6ffce9b0974e93cdd927cbcf60c157 (patch)
tree4464880c571602d54f6ae114729bf62a89518057 /noao/artdata/lists/stspatial.x
downloadiraf-osx-40e5a5811c6ffce9b0974e93cdd927cbcf60c157.tar.gz
Repatch (from linux) of OSX IRAF
Diffstat (limited to 'noao/artdata/lists/stspatial.x')
-rw-r--r--noao/artdata/lists/stspatial.x264
1 files changed, 264 insertions, 0 deletions
diff --git a/noao/artdata/lists/stspatial.x b/noao/artdata/lists/stspatial.x
new file mode 100644
index 00000000..1171dfda
--- /dev/null
+++ b/noao/artdata/lists/stspatial.x
@@ -0,0 +1,264 @@
+include <math.h>
+include <math/curfit.h>
+include <math/iminterp.h>
+
+
+# ST_XYUNIFORM -- Compute a set of x and y values uniformly distributed in x and
+# y between xmin, xmax, ymin and ymax.
+
+procedure st_xyuniform (x, y, nstars, xmin, xmax, ymin, ymax, seed)
+
+real x[ARB] # output array of x values
+real y[ARB] # output array of y values
+int nstars # number of stars
+real xmin, xmax # x coordinate limits
+real ymin, ymax # y coordinate limits
+long seed # seed for random number generator
+
+int i
+real urand()
+
+begin
+ # Compute x and y values between 0 and 1.
+ do i = 1, nstars {
+ x[i] = urand (seed)
+ y[i] = urand (seed)
+ }
+
+ # Map these values into the data range.
+ call amapr (x, x, nstars, 0.0, 1.0, xmin, xmax)
+ call amapr (y, y, nstars, 0.0, 1.0, ymin, ymax)
+end
+
+
+# ST_HBSAMPLE -- Compute a set of x and y values with a Hubble density
+# distribution.
+
+procedure st_hbsample (x, y, nstars, core, base, xc, yc, xmin, xmax, ymin, ymax,
+ nsample, order, seed)
+
+real x[ARB] # output array of x values
+real y[ARB] # output array of y values
+int nstars # number of stars
+real core # Hubble core radius
+real base # baseline density
+real xc, yc # x and y center coordinates
+real xmin, xmax # x range
+real ymin, ymax # y range
+int nsample # number of sample points
+int order # order of spline fit
+long seed # seed for random number generator
+
+int i, ier
+pointer sp, rad, prob, w, cv
+real r1, r2, r3, r4, rmin, rmax, rval, dr, theta
+real urand(), cveval()
+
+begin
+ # Allocate space for the fits.
+ call smark (sp)
+ call salloc (rad, nsample, TY_REAL)
+ call salloc (prob, nsample, TY_REAL)
+ call salloc (w, nsample, TY_REAL)
+
+ # Compute the maximum radial distance from the center and
+ # the sampling interval.
+
+ r1 = (xmin - xc) ** 2 + (ymin - yc) ** 2
+ r2 = (xmax - xc) ** 2 + (ymin - yc) ** 2
+ r3 = (xmax - xc) ** 2 + (ymax - yc) ** 2
+ r4 = (xmin - xc) ** 2 + (ymax - yc) ** 2
+ if (xc >= xmin && xc <= xmax && yc >= ymin && yc <= ymax)
+ rmin = 0.0
+ else if (yc >= ymin && yc <= ymax)
+ rmin = min (abs (xmin - xc), abs (xmax - xc))
+ else if (xc >= xmin && xc <= xmax)
+ rmin = min (abs (ymin - yc), abs (ymax - yc))
+ else
+ rmin = sqrt (min (r1, r2, r3, r4))
+ rmax = sqrt (max (r1, r2, r3, r4))
+ dr = (rmax - rmin) / (nsample - 1)
+
+ # Compute the integral of the sampling function.
+ r1 = core ** 2
+ rval = rmin
+ do i = 1, nsample {
+ Memr[rad+i-1] = rval
+ r2 = (core + rval) / core
+ Memr[prob+i-1] = r1 * (log (r2) + 1.0 / r2 - 1.0) +
+ base * rval ** 2 / 2.0
+ rval = rval + dr
+ }
+
+ # Normalize the probability function.
+ call alimr (Memr[prob], nsample, rmin, rmax)
+ call amapr (Memr[prob], Memr[prob], nsample, rmin, rmax, 0.0, 1.0)
+
+ # Fit the inverse of the integral of the probability function
+ call cvinit (cv, SPLINE3, order, 0.0, 1.0)
+ call cvfit (cv, Memr[prob], Memr[rad], Memr[w], nsample, WTS_UNIFORM,
+ ier)
+
+ # Sample the computed function.
+ if (ier == OK) {
+ i = 0
+ repeat {
+ rval = cveval (cv, urand (seed))
+ theta = DEGTORAD (360.0 * urand (seed))
+ x[i+1] = rval * cos (theta) + xc
+ y[i+1] = rval * sin (theta) + yc
+ if (x[i+1] >= xmin && x[i+1] <= xmax && y[i+1] >= ymin &&
+ y[i+1] <= ymax)
+ i = i + 1
+ } until (i >= nstars)
+ } else {
+ call amovkr ((xmin + xmax) / 2.0, x, nstars)
+ call amovkr ((ymin + ymax) / 2.0, y, nstars)
+ call printf ("Error computing the spatial probability function.\n")
+ }
+
+ # Free up the space.
+ call cvfree (cv)
+ call sfree (sp)
+end
+
+
+# ST_SFSAMPLE -- Compute a sample of x and y coordinate values based
+# on a user supplied spatial density function.
+
+procedure st_sfsample (r, rprob, nsf, x, y, nstars, nsample, order, xc, yc,
+ xmin, xmax, ymin, ymax, seed)
+
+real r[ARB] # input array of radii
+real rprob[ARB] # input array of relative probabilities
+int nsf # number of input points
+real x[ARB] # output x coordinate array
+real y[ARB] # output y coordinate array
+int nstars # number of stars
+int nsample # number of sample points
+int order # order of the spline fit
+real xc, yc # x and y center coordiantes
+real xmin, xmax # min and max x values
+real ymin, ymax # min and max y values
+long seed # value of the seed
+
+int itemp, i, ier
+pointer sp, w, rad, iprob, cv, asi
+real rfmin, rfmax, dr, rval, theta, imin, imax
+real cveval(), asigrl(), urand()
+
+begin
+ # Allocate space for fitting.
+ itemp = max (nsf, nsample)
+ call smark (sp)
+ call salloc (rad, nsample, TY_REAL)
+ call salloc (iprob, nsample, TY_REAL)
+ call salloc (w, itemp, TY_REAL)
+
+ # Smooth the relative probability function function.
+ call alimr (r, nsf, rfmin, rfmax)
+ itemp = min (order, max (1, nsf / 4))
+ call cvinit (cv, SPLINE3, itemp, rfmin, rfmax)
+ call cvfit (cv, r, rprob, Memr[w], nsf, WTS_UNIFORM, ier)
+
+ # Evaluate the smoothed function at equal intervals in r,
+ # Multiplying by r to prepare for the area integration.
+ if (ier == OK) {
+ rval = rfmin
+ dr = (rfmax - rfmin) / (nsample - 1)
+ do i = 1, nsample {
+ Memr[rad+i-1] = rval
+ Memr[iprob+i-1] = rval * cveval (cv, rval)
+ rval = rval + dr
+ }
+ call cvfree (cv)
+ } else {
+ call printf ("Error smoothing the user spatial density function.\n")
+ call amovkr ((xmin + xmax) / 2.0, x, nstars)
+ call amovkr ((ymin + ymax) / 2.0, y, nstars)
+ call cvfree (cv)
+ call sfree (sp)
+ return
+ }
+
+
+ # Evaluate the integral.
+ call asiinit (asi, II_SPLINE3)
+ call asifit (asi, Memr[iprob], nsample)
+ Memr[iprob] = 0.0
+ do i = 2, nsample
+ Memr[iprob+i-1] = Memr[iprob+i-2] + asigrl (asi, real (i - 1),
+ real (i))
+ call alimr (Memr[iprob], nsample, imin, imax)
+ call amapr (Memr[iprob], Memr[iprob], nsample, imin, imax, 0.0, 1.0)
+ call asifree (asi)
+
+ # Fit the inverse of the integral of the probability function.
+ call cvinit (cv, SPLINE3, order, 0.0, 1.0)
+ call cvfit (cv, Memr[iprob], Memr[rad], Memr[w], nsample, WTS_UNIFORM,
+ ier)
+
+ # Sample the computed function.
+ if (ier == OK) {
+ i = 0
+ repeat {
+ rval = cveval (cv, urand (seed))
+ theta = DEGTORAD (360.0 * urand (seed))
+ x[i+1] = rval * cos (theta) + xc
+ y[i+1] = rval * sin (theta) + yc
+ if (x[i+1] >= xmin && x[i+1] <= xmax && y[i+1] >= ymin &&
+ y[i+1] <= ymax)
+ i = i + 1
+ } until (i >= nstars)
+ } else {
+ call printf (
+ "Error fitting the spatial probability function.\n")
+ call amovkr ((xmin + xmax) / 2.0, x, nstars)
+ call amovkr ((ymin + ymax) / 2.0, y, nstars)
+ }
+ call cvfree (cv)
+
+ # Free space.
+ call sfree (sp)
+end
+
+
+define BUFSIZE 200
+
+# ST_GFETCHXY -- Fetch two real values from a text file.
+
+int procedure st_gfetchxy (sf, x, y)
+
+int sf # input text file descriptor
+pointer x # pointer to the x array
+pointer y # pointer to the y array
+
+int bufsize, npts
+int fscan(), nscan()
+
+begin
+ call seek (sf, BOF)
+
+ call malloc (x, BUFSIZE, TY_REAL)
+ call malloc (y, BUFSIZE, TY_REAL)
+ bufsize = BUFSIZE
+
+ npts = 0
+ while (fscan (sf) != EOF) {
+ call gargr (Memr[x+npts])
+ call gargr (Memr[y+npts])
+ if (nscan () != 2)
+ next
+ npts = npts + 1
+ if (npts < bufsize)
+ next
+ bufsize = bufsize + BUFSIZE
+ call realloc (x, bufsize, TY_REAL)
+ call realloc (y, bufsize, TY_REAL)
+ }
+
+ call realloc (x, npts, TY_REAL)
+ call realloc (y, npts, TY_REAL)
+
+ return (npts)
+end