diff options
Diffstat (limited to 'noao/nproto/ace/mgs.x')
-rw-r--r-- | noao/nproto/ace/mgs.x | 321 |
1 files changed, 321 insertions, 0 deletions
diff --git a/noao/nproto/ace/mgs.x b/noao/nproto/ace/mgs.x new file mode 100644 index 00000000..2e11cab7 --- /dev/null +++ b/noao/nproto/ace/mgs.x @@ -0,0 +1,321 @@ +include <error.h> +include <imhdr.h> +include <imio.h> +include <math/gsurfit.h> + +# Data structure. +define MGS_SZNAME 99 # Length of mgs name string +define MGS_LEN 56 # Length of structure +define MGS_GS Memi[$1] # GSURFIT pointer +define MGS_X Memi[$1+1] # Pointer to line of x values +define MGS_Y Memi[$1+2] # Pointer to line of y values +define MGS_Z Memi[$1+3] # Pointer to line of z values +define MGS_NC Memi[$1+4] # Number of columns +define MGS_REFIM Memi[$1+5] # Reference image pointer +define MGS_NAME Memc[P2C($1+6)] # Map name + + +# MGS_GLR -- Get a line of data. + +pointer procedure mgs_glr (mgs, line) + +pointer mgs #I Map pointer +int line #I Line + +int nc +pointer x, y, z, gs + +begin + if (mgs == NULL) + call error (1, "Map is undefined") + + gs = MGS_GS(mgs) + x = MGS_X(mgs) + y = MGS_Y(mgs) + z = MGS_Z(mgs) + nc = MGS_NC(mgs) + + call amovkr (real(line), Memr[y], nc) + call gsvector (gs, Memr[x], Memr[y], Memr[z], nc) + + return (z) +end + + +# MGS_OPEN -- Open mgs. + +pointer procedure mgs_open (name, refim, gsin) + +char name[ARB] #I Name +pointer refim #I Reference image +pointer gsin #I GSURFIT pointer +pointer mgs #O Map pointer returned + +int i, nc, nl +real gsgetr() +pointer gs +errchk mgs_ggs + +begin + nc = IM_LEN(refim,1) + nl = IM_LEN(refim,2) + + call calloc (mgs, MGS_LEN, TY_STRUCT) + MGS_REFIM(mgs) = refim + call strcpy (name, MGS_NAME(mgs), MGS_SZNAME) + MGS_NC(mgs) = nc + + iferr { + gs = gsin + if (gs == NULL) { + call mgs_ggs (refim, name, gs) + MGS_GS(mgs) = gs + } + + if (1 < gsgetr (gs, GSXMIN) || nc > gsgetr (gs, GSXMAX) || + 1 < gsgetr (gs, GSYMIN) || nl > gsgetr (gs, GSYMAX)) + call error (2, "Map and data images have different sizes") + + MGS_GS(mgs) = gs + call malloc (MGS_X(mgs), nc, TY_REAL) + call malloc (MGS_Y(mgs), nc, TY_REAL) + call malloc (MGS_Z(mgs), nc, TY_REAL) + do i = 1, nc + Memr[MGS_X(mgs)+i-1] = i + } then { + call mgs_close (mgs) + call erract (EA_ERROR) + } + + return (mgs) +end + + +# MGS_CLOSE -- Close mgs. + +procedure mgs_close (mgs) + +pointer mgs #I Map pointer + +begin + if (mgs == NULL) + return + + if (MGS_GS(mgs) != NULL) + call gsfree (MGS_GS(mgs)) + call mfree (MGS_X(mgs), TY_REAL) + call mfree (MGS_Y(mgs), TY_REAL) + call mfree (MGS_Z(mgs), TY_REAL) + call mfree (mgs, TY_STRUCT) +end + + +# MGS_GETS -- Get string parameter. + +procedure mgs_gets (mgs, param, val, maxchar) + +pointer mgs #I Map pointer +char param[ARB] #I Parameter +char val[ARB] #O Parameter string value +int maxchar #I Maximum number of characters to return + +begin + call error (1, "mgs_gets: unknown parameter") +end + + +# MGS_SETS -- Set string parameter. + +procedure mgs_sets (mgs, param, val) + +pointer mgs #I Map pointer +char param[ARB] #I Parameter +char val[ARB] #O Parameter string value + +begin + call error (1, "mgs_sets: unknown parameter") +end + + +# MGS_GETI -- Get integer parameter. + +procedure mgs_geti (mgs, param, val) + +pointer mgs #I Map pointer +char param[ARB] #I Parameter +int val #O Value + +bool streq() + +begin + if (streq (param, "gsurfit")) + val = MGS_GS(mgs) + else + call error (1, "mgs_geti: unknown parameter") +end + + +# MGS_SETI -- Set integer parameter. + +procedure mgs_seti (mgs, param, val) + +pointer mgs #I Map pointer +char param[ARB] #I Parameter +int val #I Value + +bool streq() + +begin + if (streq (param, "gsurfit")) { + call mgs_pgs (MGS_REFIM(mgs), MGS_NAME(mgs), val) + call gsfree (MGS_GS(mgs)) + MGS_GS(mgs) = val + } else + call error (1, "mgs_seti: unknown parameter") +end + + +# MGS_GETR -- Get real parameter. + +procedure mgs_getr (mgs, param, val) + +pointer mgs #I Map pointer +char param[ARB] #I Parameter +real val #O Value + +begin + call error (1, "mgs_getr: unknown parameter") +end + + +# MGS_SETR -- Set real parameter. + +procedure mgs_setr (mgs, param, val) + +pointer mgs #I Map pointer +char param[ARB] #I Parameter +real val #I Value + +begin + call error (1, "mgs_setr: unknown parameter") +end + + +# MAP_PGS -- Put mgs surface fit. + +procedure mgs_pgs (im, key, gs) + +pointer im #I Image pointer +char key[ARB] #I Keyword root +pointer gs #I Surface fit pointer + +int i, nc, fd, gsgeti(), stropen() +pointer sp, kw, card, coeffs, strbuf, cp, cp1, cp2 + +begin + if (IM_SECTUSED(im) == YES) + return + + call smark (sp) + call salloc (kw, 80, TY_CHAR) + call salloc (card, 68, TY_CHAR) + + nc = gsgeti (gs, GSNSAVE) + call salloc (coeffs, nc, TY_REAL) + call gssave (gs, Memr[coeffs]) + + # Convert coeffs to a string. Last character will be space. + call salloc (strbuf, 20*nc, TY_CHAR) + call aclrc (Memc[strbuf], 20*nc) + fd = stropen (Memc[strbuf], 20*nc, WRITE_ONLY) + do i = 1, nc { + call fprintf (fd, "%g ") + call pargr (Memr[coeffs+i-1]) + } + call close (fd) + + i = 1 + cp1 = strbuf + for (cp=cp1; Memc[cp] != EOS; cp=cp+1) { + if (Memc[cp] == ' ') + cp2 = cp + if (cp - cp1 + 1 == 68) { + call sprintf (Memc[kw], 8, "%.6s%02d") + call pargstr (key) + call pargi (i) + i = i + 1 + Memc[cp2] = EOS + call imastr (im, Memc[kw], Memc[cp1]) + cp1 = cp2 + 1 + cp = cp1 + } + } + if (cp - cp1 + 1 > 0) { + call sprintf (Memc[kw], 8, "%.6s%02d") + call pargstr (key) + call pargi (i) + i = i + 1 + Memc[cp2] = EOS + call imastr (im, Memc[kw], Memc[cp1]) + } + repeat { + call sprintf (Memc[kw], 8, "%.6s%02d") + call pargstr (key) + call pargi (i) + i = i + 1 + iferr (call imdelf (im, Memc[kw])) + break + } + + call sfree (sp) +end + + +# MAP_GGS -- Get mgs surface fit. + +procedure mgs_ggs (im, key, gs) + +pointer im #I Image pointer +char key[ARB] #I Keyword root +pointer gs #O Surface fit pointer + +int i, j, nc, ctor() +pointer sp, kw, card, coeffs + +begin + if (IM_SECTUSED(im) == YES) + call error (1, "No surface fit with an image section") + + call smark (sp) + call salloc (kw, 8, TY_CHAR) + call salloc (card, 68, TY_CHAR) + + call malloc (coeffs, 100, TY_REAL) + iferr { + nc = 0 + do i = 1, ARB { + call sprintf (Memc[kw], 8, "%.6s%02d") + call pargstr (key) + call pargi (i) + iferr (call imgstr (im, Memc[kw], Memc[card], 68)) + break + j = 1 + while (ctor (Memc[card], j, Memr[coeffs+nc]) != 0) { + nc = nc + 1 + if (mod (nc, 100) == 0) + call realloc (coeffs, nc+100, TY_REAL) + } + } + + if (nc == 0) + call error (1, "Surface fit not found") + + call gsrestore (gs, Memr[coeffs]) + call mfree (coeffs, TY_REAL) + } then { + call mfree (coeffs, TY_REAL) + call erract (EA_ERROR) + } + + call sfree (sp) +end |