aboutsummaryrefslogtreecommitdiff
path: root/pkg/utilities/nttools/stxtools/stxgetcoord.x
diff options
context:
space:
mode:
authorJoseph Hunkeler <jhunkeler@gmail.com>2015-07-08 20:46:52 -0400
committerJoseph Hunkeler <jhunkeler@gmail.com>2015-07-08 20:46:52 -0400
commitfa080de7afc95aa1c19a6e6fc0e0708ced2eadc4 (patch)
treebdda434976bc09c864f2e4fa6f16ba1952b1e555 /pkg/utilities/nttools/stxtools/stxgetcoord.x
downloadiraf-linux-fa080de7afc95aa1c19a6e6fc0e0708ced2eadc4.tar.gz
Initial commit
Diffstat (limited to 'pkg/utilities/nttools/stxtools/stxgetcoord.x')
-rw-r--r--pkg/utilities/nttools/stxtools/stxgetcoord.x182
1 files changed, 182 insertions, 0 deletions
diff --git a/pkg/utilities/nttools/stxtools/stxgetcoord.x b/pkg/utilities/nttools/stxtools/stxgetcoord.x
new file mode 100644
index 00000000..0fc9842c
--- /dev/null
+++ b/pkg/utilities/nttools/stxtools/stxgetcoord.x
@@ -0,0 +1,182 @@
+include <imhdr.h>
+include <mwset.h>
+include <math.h>
+
+define SZ_PNAME 8
+
+# stx_getcoord -- get coordinate parameters
+# This procedure gets the coordinate parameters from an image.
+# The parameter values are gotten via mwcs, and the lterm is factored
+# into the wterm so that the parameters are relative to the actual image
+# section that was opened rather than to the "original" image.
+#
+# Phil Hodge, 5-Jan-1993 Copied from fourier$lib/loadct.x.
+# Phil Hodge, 2-Feb-1994 Errchk mwcs routines.
+
+procedure stx_getcoord (im, crpix, crval, cd, maxdim, ctype, maxch)
+
+pointer im # i: pointer to imhdr struct for input image
+double crpix[ARB] # o: reference pixel
+double crval[ARB] # o: coordinates at reference pixel
+double cd[maxdim,maxdim] # o: derivatives of l & m with respect to x & y
+int maxdim # i: dimension of arrays (e.g. IM_MAXDIM)
+char ctype[maxch,maxdim] # o: coord. type of each axis (e.g. "RA---TAN")
+int maxch # i: size of ctype string (e.g. SZ_CTYPE)
+#--
+pointer mw
+
+double o_crval[IM_MAXDIM] # world coordinates at reference pixel
+double o_crpix[IM_MAXDIM] # not corrected for image section
+double o_cd[IM_MAXDIM,IM_MAXDIM] # wterm only (not corr. for section)
+
+double n_crpix[IM_MAXDIM] # corrected for image section
+double n_cd[IM_MAXDIM,IM_MAXDIM] # CD matrix corrected for section
+
+double ltm[IM_MAXDIM,IM_MAXDIM] # lterm matrix
+double i_ltm[IM_MAXDIM,IM_MAXDIM] # inverse of ltm
+double ltv[IM_MAXDIM] # lterm vector
+
+int ndim # dimension of image
+int wcsdim # dimension of mwcs coordinates
+pointer mw_openim()
+int mw_stati()
+errchk mw_openim, mw_stati, mw_gwtermd, mw_gltermd, mw_invertd, mw_close,
+ stx_extract
+
+begin
+ ndim = IM_NDIM(im)
+ if (ndim > maxdim)
+ call error (1,
+ "stx_getcoord: dimension of image is larger than array size")
+
+ mw = mw_openim (im)
+ wcsdim = mw_stati (mw, MW_NPHYSDIM) # get mwcs dimension
+
+ # Get the wterm and the lterm.
+ call mw_gwtermd (mw, o_crpix, o_crval, o_cd, wcsdim)
+ call mw_gltermd (mw, ltm, ltv, wcsdim)
+
+ # Convert the wterm to be the values relative to the current
+ # image section. (Comments & code copied from mwcs.)
+
+ # Output CRPIX = R' = (LTM * R + LTV).
+ call mw_vmuld (ltm, o_crpix, n_crpix, wcsdim)
+ call aaddd (ltv, n_crpix, n_crpix, wcsdim)
+
+ # Output CD matrix = CD' = (CD * inv(LTM)).
+ call mw_invertd (ltm, i_ltm, wcsdim)
+ call mw_mmuld (o_cd, i_ltm, n_cd, wcsdim)
+
+ # Extract the coordinate parameters, and get ctype.
+ call stx_extract (im, mw, n_crpix, o_crval, n_cd, wcsdim,
+ crpix, crval, cd, maxdim, ctype, maxch)
+
+ call mw_close (mw)
+
+ # Check for invalid CD matrix.
+ if (ndim == 1) {
+ if (cd[1,1] == 0.d0) {
+ call eprintf ("warning: pixel spacing = 0; reset to 1\n")
+ cd[1,1] = 1.d0
+ }
+ } else if (ndim == 2) {
+ if (cd[1,1] * cd[2,2] - cd[1,2] * cd[2,1] == 0.d0) {
+ call eprintf (
+ "warning: CD matrix is singular; reset to identity matrix\n")
+ cd[1,1] = 1.d0
+ cd[2,1] = 0.d0
+ cd[1,2] = 0.d0
+ cd[2,2] = 1.d0
+ }
+ }
+end
+
+# stx_extract -- extract coordinate parameters
+# This routine is needed to take care of the situation where the dimension
+# of the input image was reduced by taking an image section. In that case,
+# the coordinate information gotten using mwcs has the dimension of the
+# original image, which results in two problems. (1) We need to know which
+# axis of the original image maps to which axis of the image that we've
+# got. (2) We have to dimension the CD matrix differently. When MWCS
+# puts values into a 2-D array it is dimensioned wcsdim X wcsdim, but we
+# declared it maxdim X maxdim in the calling routine. In this routine
+# we declare the input CD matrix to be wcsdim X wcsdim, while the output
+# CD matrix is maxdim X maxdim.
+
+procedure stx_extract (im, mw, n_crpix, n_crval, n_cd, wcsdim,
+ crpix, crval, cd, maxdim, ctype, maxch)
+
+pointer im # i: pointer to imhdr struct for input image
+pointer mw # i: mwcs pointer
+double n_crpix[wcsdim] # i: crpix
+double n_crval[wcsdim] # i: crval
+double n_cd[wcsdim,wcsdim] # i: CD matrix
+int wcsdim # i: dimension of wcs
+double crpix[maxdim] # o: crpix extracted from n_crpix
+double crval[maxdim] # o: crval extracted from n_crval
+double cd[maxdim,maxdim] # o: CD matrix extracted from n_cd
+int maxdim # i: dimension of arrays (e.g. IM_MAXDIM)
+char ctype[maxch,maxdim] # o: coord. type of each axis (e.g. "RA---TAN")
+int maxch # i: size of ctype string (e.g. SZ_CTYPE)
+#--
+char keyword[SZ_PNAME] # keyword for getting ctype
+int ndim # actual dimension of image
+int axno[IM_MAXDIM] # axis numbers
+int axval[IM_MAXDIM] # ignored
+int ax[IM_MAXDIM] # physical axis number for each logical axis
+int i, j
+bool ax_ok # for checking that axis numbers were found
+int imaccf()
+errchk mw_gaxmap
+
+begin
+ ndim = IM_NDIM(im)
+
+ # Get the axis mapping.
+ call mw_gaxmap (mw, axno, axval, wcsdim)
+
+ # Find the image axis numbers corresponding to the mwcs numbers.
+ do i = 1, ndim # initialize
+ ax[i] = 0
+ do j = 1, wcsdim {
+ do i = 1, ndim {
+ if (axno[j] == i) {
+ ax[i] = j
+ break
+ }
+ }
+ }
+
+ # It's an error if any axis number was not found.
+ ax_ok = true # initial value
+ do i = 1, ndim {
+ if (ax[i] < 1)
+ ax_ok = false
+ }
+ if (!ax_ok) {
+# call error (1, "stx_extract: mwcs axis mapping is messed up")
+# This is a temporary fix to prevent crashing on a vax.
+ do i = 1, ndim
+ ax[i] = i
+ }
+
+ # Extract crpix, crval and the CD matrix.
+ # Note that we transpose the CD matrix because of different
+ # conventions regarding how a matrix is stored.
+ do i = 1, ndim {
+ crpix[i] = n_crpix[ax[i]]
+ crval[i] = n_crval[ax[i]]
+ do j = 1, ndim
+ cd[i,j] = n_cd[ax[j],ax[i]] # transpose
+ }
+
+ # Get ctype.
+ do i = 1, ndim {
+ call sprintf (keyword, SZ_PNAME, "ctype%d")
+ call pargi (ax[i]) # physical axis number
+ if (imaccf (im, keyword) == YES)
+ call imgstr (im, keyword, ctype[1,i], maxch)
+ else
+ call strcpy ("PIXEL", ctype[1,i], maxch)
+ }
+end