diff options
author | Joseph Hunkeler <jhunkeler@gmail.com> | 2015-07-08 20:46:52 -0400 |
---|---|---|
committer | Joseph Hunkeler <jhunkeler@gmail.com> | 2015-07-08 20:46:52 -0400 |
commit | fa080de7afc95aa1c19a6e6fc0e0708ced2eadc4 (patch) | |
tree | bdda434976bc09c864f2e4fa6f16ba1952b1e555 /noao/onedspec/smw/smwesms.x | |
download | iraf-linux-fa080de7afc95aa1c19a6e6fc0e0708ced2eadc4.tar.gz |
Initial commit
Diffstat (limited to 'noao/onedspec/smw/smwesms.x')
-rw-r--r-- | noao/onedspec/smw/smwesms.x | 96 |
1 files changed, 96 insertions, 0 deletions
diff --git a/noao/onedspec/smw/smwesms.x b/noao/onedspec/smw/smwesms.x new file mode 100644 index 00000000..d1b8a368 --- /dev/null +++ b/noao/onedspec/smw/smwesms.x @@ -0,0 +1,96 @@ +include <mwset.h> +include <smw.h> + + +# SMW_ESMS -- Convert EQUISPEC WCS into MULTISPEC WCS. +# This is called by SMW_SWATTRS when the equal linear coordinate system +# requirement of the EQUISPEC WCS is violated. + +procedure smw_esms (smw) + +pointer smw #U SMW pointer + +int i, j, k, pdim1, pdim2, ap, beam, dtype, nw, axes[2] +double w1, dw, z +real aplow, aphigh +pointer sp, key, str, lterm, mw, mw1, mw2, apid, mw_open() +data axes/1,2/ + +begin + call smark (sp) + call salloc (key, SZ_FNAME, TY_CHAR) + call salloc (str, SZ_LINE, TY_CHAR) + call salloc (lterm, 12, TY_DOUBLE) + + # Set the basic MWCS + mw1 = SMW_MW(smw,0) + pdim1 = SMW_PDIM(smw) + pdim2 = max (2, pdim1) + mw2 = mw_open (NULL, pdim2) + call mw_newsystem (mw2, "multispec", pdim2) + call mw_swtype (mw2, axes, 2, "multispec", "") + if (pdim2 > 2) + call mw_swtype (mw2, 3, 1, "linear", "") + call mw_gltermd (mw1, Memd[lterm+pdim2], Memd[lterm], pdim1) + if (pdim1 == 1) { + Memd[lterm+1] = 0. + Memd[lterm+3] = 0. + Memd[lterm+4] = 0. + Memd[lterm+5] = 1. + } + call mw_sltermd (mw2, Memd[lterm+pdim2], Memd[lterm], pdim2) + ifnoerr (call mw_gwattrs (mw1, 1, "label", Memc[str], SZ_LINE)) + call mw_swattrs (mw2, 1, "label", Memc[str]) + ifnoerr (call mw_gwattrs (mw1, 1, "units", Memc[str], SZ_LINE)) + call mw_swattrs (mw2, 1, "units", Memc[str]) + ifnoerr (call mw_gwattrs (mw1, 1, "units_display", Memc[str], SZ_LINE)) + call mw_swattrs (mw2, 1, "units_display", Memc[str]) + + # Write the MULTISPEC WCS + dtype = SMW_DTYPE(smw) + w1 = SMW_W1(smw) + dw = SMW_DW(smw) + nw = SMW_NW(smw) + z = SMW_Z(smw) + if (dtype == DCLOG) { + dw = log10 ((w1+(nw-1)*dw)/w1)/(nw-1) + w1 = log10 (w1) + } + + call smw_open (mw2, smw, 0) + do i = 1, SMW_NSPEC(smw) { + ap = Memi[SMW_APS(smw)+i-1] + beam = Memi[SMW_BEAMS(smw)+i-1] + aplow = Memr[SMW_APLOW(smw)+2*i-2] + aphigh = Memr[SMW_APHIGH(smw)+2*i-2] + apid = Memi[SMW_APIDS(smw)+i-1] + + call smw_mw (mw2, i, 1, mw, j, k) + call sprintf (Memc[key], SZ_FNAME, "spec%d") + call pargi (j) + call sprintf (Memc[str], SZ_LINE, + "%d %d %d %.14g %.14g %d %.14g %.2f %.2f") + call pargi (ap) + call pargi (beam) + call pargi (dtype) + call pargd (w1) + call pargd (dw) + call pargi (nw) + call pargd (z) + call pargr (aplow) + call pargr (aphigh) + call mw_swattrs (mw, 2, Memc[key], Memc[str]) + + if (apid != NULL) + call smw_sapid (mw2, i, 1, Memc[apid]) + + # This is used if there is a split MULTISPEC WCS. + if (SMW_APS(mw2) != NULL) + Memi[SMW_APS(mw2)+i-1] = ap + } + + call smw_close (smw) + smw = mw2 + + call sfree (sp) +end |