aboutsummaryrefslogtreecommitdiff
path: root/noao/onedspec/t_sapertures.x
diff options
context:
space:
mode:
Diffstat (limited to 'noao/onedspec/t_sapertures.x')
-rw-r--r--noao/onedspec/t_sapertures.x428
1 files changed, 428 insertions, 0 deletions
diff --git a/noao/onedspec/t_sapertures.x b/noao/onedspec/t_sapertures.x
new file mode 100644
index 00000000..4aa0c16f
--- /dev/null
+++ b/noao/onedspec/t_sapertures.x
@@ -0,0 +1,428 @@
+include <error.h>
+include <imhdr.h>
+include <smw.h>
+
+define LEN_SAP 52 # Length of structure
+define LEN_SAPTITLE 79 # Length of title
+
+define AP Memi[$1] # Aperture number
+define BEAM Memi[$1+1] # Beam number
+define DTYPE Memi[$1+2] # Dispersion type
+define W1 Memd[P2D($1+4)] # Starting wavelength
+define DW Memd[P2D($1+6)] # Wavelength per pixel
+define Z Memd[P2D($1+8)] # Doppler factor
+define APLOW Memr[P2R($1+10)] # Low aperture
+define APHIGH Memr[P2R($1+11)] # High aperture
+define TITLE Memc[P2C($1+12)] # Title
+
+
+# T_SAPERTURES -- Set aperture beam numbers and titles.
+
+procedure t_sapertures()
+
+int list # Input list
+bool wcsreset # Reset WCS?
+bool verbose # Verbose?
+pointer saps # Pointer to array of aperture structures
+
+int imtopenp(), imtgetim()
+bool clgetb()
+pointer sp, input, ranges, tmp, im, mw, rng_open(), immap(), smw_openim()
+errchk sap_gids, immap, smw_openim
+
+begin
+ call smark (sp)
+ call salloc (input, SZ_FNAME, TY_CHAR)
+
+ list = imtopenp ("input")
+ wcsreset = clgetb ("wcsreset")
+ verbose = clgetb ("verbose")
+ call clgstr ("apertures", Memc[input], SZ_FNAME)
+ iferr (ranges = rng_open (Memc[input], INDEF, INDEF, INDEF))
+ call error (0, "Bad aperture list")
+
+ call sap_gids (saps, wcsreset, verbose)
+
+ while (imtgetim (list, Memc[input], SZ_FNAME) != EOF) {
+ im = NULL
+ mw = NULL
+ iferr {
+ tmp = immap (Memc[input], READ_WRITE, 0); im = tmp
+ tmp = smw_openim (im); mw = tmp
+ if (SMW_FORMAT(mw) != SMW_ES && SMW_FORMAT(mw) != SMW_MS)
+ call error (1, "Wrong spectrum format")
+ call sap_ms (im, mw, Memc[input], ranges, saps, verbose)
+ } then
+ call erract (EA_WARN)
+
+ if (mw != NULL) {
+ call smw_saveim (mw, im)
+ call smw_close (mw)
+ }
+ if (im != NULL)
+ call imunmap (im)
+ }
+
+ call rng_close (ranges)
+ call imtclose (list)
+ call sap_fids (saps)
+ call sfree (sp)
+end
+
+
+# SAP_MS -- Set aperture information
+
+procedure sap_ms (im, mw, input, ranges, saps, verbose)
+
+pointer im # IMIO pointer
+pointer mw # SMW pointer
+char input[ARB] # Image name
+pointer ranges # Aperture range list
+pointer saps # Pointer to array of aperture structures
+bool verbose # Verbose?
+
+int i, naps, ap, beam, dtype, nw, obeam, odtype
+double w1, dw, z, ow1, odw, oz
+real aplow[2], aphigh[2], oaplow[2], oaphigh[2]
+bool newtitle, streq(), rng_elementi()
+pointer sp, title, coeff, sap
+
+begin
+ call smark (sp)
+ call salloc (title, SZ_LINE, TY_CHAR)
+ coeff = NULL
+
+ # Go through each spectrum and change the selected apertures.
+ naps = -1
+ do i = 1, SMW_NSPEC(mw) {
+ # Get aperture info
+ iferr (call smw_gwattrs (mw, i, 1, ap, beam, dtype, w1, dw, nw, z,
+ aplow, aphigh, coeff))
+ break
+
+ # Check if aperture is to be changed
+ if (!rng_elementi (ranges, ap))
+ next
+
+ # Check for aperture info
+ for (sap = saps; Memi[sap] != NULL; sap = sap + 1)
+ if (ap == AP(Memi[sap]))
+ break
+ if (Memi[sap] == NULL) {
+ for (sap = saps; Memi[sap] != NULL; sap = sap + 1)
+ if (IS_INDEFI (AP(Memi[sap])))
+ break
+ }
+ if (Memi[sap] == NULL)
+ next
+
+ # Get aperture title
+ call smw_gapid (mw, i, 1, Memc[title], SZ_LINE)
+
+ # Set new aperture values
+ sap = Memi[sap]
+ obeam = BEAM(sap)
+ odtype = DTYPE(sap)
+ ow1 = W1(sap)
+ odw = DW(sap)
+ oz = Z(sap)
+ oaplow[1] = APLOW(sap)
+ oaphigh[1] = APHIGH(sap)
+ oaplow[2] = INDEF
+ oaphigh[2] = INDEF
+
+ if (IS_INDEFI (obeam))
+ obeam = beam
+ if (IS_INDEFI (odtype))
+ odtype = dtype
+ else
+ odtype = max (-1, min (1, odtype))
+ if (IS_INDEFD (ow1))
+ ow1 = w1
+ if (IS_INDEFD (odw))
+ odw = dw
+ if (IS_INDEFD (oz))
+ oz = z
+ if (IS_INDEF (oaplow[1]))
+ oaplow[1] = aplow[1]
+ if (IS_INDEF (oaphigh[1]))
+ oaphigh[1] = aphigh[1]
+ if (streq (TITLE(sap), "INDEF") || TITLE(sap) == EOS)
+ newtitle = false
+ else
+ newtitle = !streq (TITLE(sap), Memc[title])
+
+ if (dtype == 2 && odtype != 2)
+ Memc[coeff] = EOS
+
+ # Make change if needed
+ if (obeam!=beam || odtype!=dtype || ow1!=w1 || odw !=dw || oz!=z ||
+ oaplow[1]!=aplow[1] || oaphigh[1]!=aphigh[1] || newtitle) {
+ call smw_swattrs (mw, i, 1, ap, obeam, odtype, ow1, odw, nw,
+ oz, oaplow, oaphigh, Memc[coeff])
+ if (newtitle)
+ call smw_sapid (mw, i, 1, TITLE(sap))
+ naps = naps + 1
+
+ # Make record
+ if (verbose) {
+ if (naps == 0) {
+ call printf ("%s:\n")
+ call pargstr (input)
+ naps = naps + 1
+ }
+ call printf (" Aperture %d:\n")
+ call pargi (ap)
+ if (obeam != beam) {
+ call printf (" beam %d --> %d\n")
+ call pargi (beam)
+ call pargi (obeam)
+ }
+ if (odtype != dtype) {
+ call printf (" dtype %d --> %d\n")
+ call pargi (dtype)
+ call pargi (odtype)
+ }
+ if (ow1 != w1) {
+ call printf (" w1 %g --> %g\n")
+ call pargd (w1)
+ call pargd (ow1)
+ }
+ if (odw != dw) {
+ call printf (" dw %g --> %g\n")
+ call pargd (dw)
+ call pargd (odw)
+ }
+ if (oz != z) {
+ call printf (" z %g --> %g\n")
+ call pargd (z)
+ call pargd (oz)
+ }
+ if (oaplow[1] != aplow[1]) {
+ call printf (" aplow %g --> %g\n")
+ call pargr (aplow[1])
+ call pargr (oaplow[1])
+ }
+ if (oaphigh[1] != aphigh[1]) {
+ call printf (" aphigh %g --> %g\n")
+ call pargr (aphigh[1])
+ call pargr (oaphigh[1])
+ }
+ if (newtitle) {
+ call printf (" apid %s --> %s\n")
+ call pargstr (Memc[title])
+ call pargstr (TITLE(sap))
+ }
+ }
+ }
+ }
+
+ call mfree (coeff, TY_CHAR)
+ call sfree (sp)
+end
+
+
+# SA_GIDS -- Get user aperture ID's.
+
+procedure sap_gids (saps, wcsreset, verbose)
+
+pointer saps # Pointer to array of aperture structures
+bool wcsreset # Reset WCS?
+bool verbose # Verbose (negative beam warning)?
+pointer sap
+
+int naps, ap, beam, fd, nalloc
+double ra, dec
+pointer sp, str, key, im, list
+
+real clgetr()
+double clgetd()
+int nowhite(), open(), fscan(), nscan(), clgeti()
+pointer immap(), imofnlu(), imgnfn()
+errchk open
+
+begin
+
+ # If resetting ignore the APIDTABLE and the task parameters.
+ if (wcsreset) {
+ call malloc (saps, 2, TY_POINTER)
+ call malloc (Memi[saps], LEN_SAP, TY_STRUCT)
+ Memi[saps+1] = NULL
+
+ sap = Memi[saps]
+ AP(sap) = INDEFI
+ BEAM(sap) = INDEFI
+ DTYPE(sap) = -1
+ W1(sap) = 1.
+ DW(sap) = 1.
+ Z(sap) = 0.
+ APLOW(sap) = INDEF
+ APHIGH(sap) = INDEF
+ TITLE(sap) = EOS
+ return
+ }
+
+ call smark (sp)
+ call salloc (str, SZ_LINE, TY_CHAR)
+ call salloc (key, SZ_FNAME, TY_CHAR)
+ call clgstr ("apidtable", Memc[str], SZ_LINE)
+
+ # Set parameters from an APIDTABLE if given.
+ naps = 0
+ if (nowhite (Memc[str], Memc[str], SZ_LINE) > 0) {
+ iferr {
+ # Read aperture information from an image.
+ ifnoerr (im = immap (Memc[str], READ_ONLY, 0)) {
+ list = imofnlu (im, "SLFIB[0-9]*")
+ while (imgnfn (list, Memc[key], SZ_FNAME) != EOF) {
+ call imgstr (im, Memc[key], Memc[str], SZ_LINE)
+ call sscan (Memc[str])
+ call gargi (ap)
+ call gargi (beam)
+ if (nscan() < 2)
+ next
+ if (!IS_INDEFI(beam) && beam < 0 && verbose) {
+ call eprintf (
+ "Negative beam number for aperture %d ignored.\n")
+ call pargi (ap)
+ beam = INDEFI
+ }
+ if (naps == 0) {
+ nalloc = 50
+ call malloc (saps, nalloc, TY_POINTER)
+ } else if (naps == nalloc) {
+ nalloc = nalloc + 50
+ call realloc (saps, nalloc, TY_POINTER)
+ }
+ call malloc (Memi[saps+naps], LEN_SAP, TY_STRUCT)
+
+ sap = Memi[saps+naps]
+ AP(sap) = ap
+ BEAM(sap) = beam
+ call gargd (ra)
+ call gargd (dec)
+ if (nscan() != 4) {
+ call reset_scan ()
+ call gargi (ap)
+ call gargi (beam)
+ call gargstr (TITLE(sap), LEN_SAPTITLE)
+ } else {
+ Memc[str] = EOS
+ call gargstr (Memc[str], SZ_LINE)
+ call xt_stripwhite (Memc[str])
+ if (Memc[str] == EOS) {
+ call sprintf (TITLE(sap), LEN_SAPTITLE,
+ "(%.2h %.2h)")
+ call pargd (ra)
+ call pargd (dec)
+ } else {
+ call sprintf (TITLE(sap), LEN_SAPTITLE,
+ "%s (%.2h %.2h)")
+ call pargstr (Memc[str])
+ call pargd (ra)
+ call pargd (dec)
+ }
+ }
+ DTYPE(sap) = INDEFI
+ W1(sap) = INDEFD
+ DW(sap) = INDEFD
+ Z(sap) = INDEFD
+ APLOW(sap) = INDEF
+ APHIGH(sap) = INDEF
+ call xt_stripwhite (TITLE(sap))
+ naps = naps + 1
+ }
+ call imcfnl (list)
+ call imunmap (im)
+
+ # Read aperture information from a file.
+ } else {
+ fd = open (Memc[str], READ_ONLY, TEXT_FILE)
+ while (fscan (fd) != EOF) {
+ call gargi (ap)
+ call gargi (beam)
+ if (nscan() < 2)
+ next
+ if (!IS_INDEFI(beam) && beam < 0 && verbose) {
+ call eprintf (
+ "Negative beam number for aperture %d ignored.\n")
+ call pargi (ap)
+ beam = INDEFI
+ }
+ if (naps == 0) {
+ nalloc = 50
+ call malloc (saps, nalloc, TY_POINTER)
+ } else if (naps == nalloc) {
+ nalloc = nalloc + 50
+ call realloc (saps, nalloc, TY_POINTER)
+ }
+ call malloc (Memi[saps+naps], LEN_SAP, TY_STRUCT)
+
+ sap = Memi[saps+naps]
+ AP(sap) = ap
+ BEAM(sap) = beam
+ call gargi (DTYPE(sap))
+ call gargd (W1(sap))
+ call gargd (DW(sap))
+ call gargd (Z(sap))
+ call gargr (APLOW(sap))
+ call gargr (APHIGH(sap))
+ call gargstr (TITLE(sap), LEN_SAPTITLE)
+ if (nscan() < 9) {
+ call reset_scan()
+ call gargi (AP(sap))
+ call gargi (BEAM(sap))
+ if (!IS_INDEFI(BEAM(sap)) && BEAM(sap) < 0)
+ BEAM(sap) = INDEFI
+ call gargstr (TITLE(sap), LEN_SAPTITLE)
+ DTYPE(sap) = INDEFI
+ W1(sap) = INDEFD
+ DW(sap) = INDEFD
+ Z(sap) = INDEFD
+ APLOW(sap) = INDEF
+ APHIGH(sap) = INDEF
+ }
+ call xt_stripwhite (TITLE(sap))
+ naps = naps + 1
+ }
+ call close (fd)
+ }
+ } then
+ call erract (EA_WARN)
+ }
+
+ # Set remaining default parameters and the list terminator.
+ call realloc (saps, naps+2, TY_INT)
+ call malloc (Memi[saps+naps], LEN_SAP, TY_STRUCT)
+ Memi[saps+naps+1] = NULL
+
+ sap = Memi[saps+naps]
+ AP(sap) = INDEFI
+ BEAM(sap) = clgeti ("beam")
+ if (!IS_INDEFI(BEAM(sap)) && BEAM(sap) < 0 && verbose) {
+ call eprintf (
+ "Negative default beam number ignored.\n")
+ BEAM(sap) = INDEFI
+ }
+ DTYPE(sap) = clgeti ("dtype")
+ W1(sap) = clgetd ("w1")
+ DW(sap) = clgetd ("dw")
+ Z(sap) = clgetd ("z")
+ APLOW(sap) = clgetr ("aplow")
+ APHIGH(sap) = clgetr ("aphigh")
+ call clgstr ("title", TITLE(sap), LEN_SAPTITLE)
+
+ call sfree (sp)
+end
+
+
+procedure sap_fids (saps)
+
+pointer saps # Pointer to array of aperture structures
+pointer sap
+
+begin
+ for (sap=saps; Memi[sap] != NULL; sap = sap + 1)
+ call mfree (Memi[sap], TY_STRUCT)
+ call mfree (saps, TY_POINTER)
+end