aboutsummaryrefslogtreecommitdiff
path: root/noao/onedspec/smw/smwoldms.x
blob: 6640641ff0025ff458e451a8397c5504c62b2fcf (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
include	<mwset.h>
include	<smw.h>


# SMW_OLDMS -- Convert old multispec format into MULTISPEC SMW.

procedure smw_oldms (im, smw)

pointer	im			#I IMIO pointer
pointer	smw			#U Input MWCS pointer, output SMW pointer

int	i, j, k, nchar, ap, beam, dtype, nw, axes[2]
double	w1, dw, z
real	aplow[2], aphigh[2]
pointer	sp, key, val, lterm, mw, mw_open()
int	imgeti(), mw_stati(), ctoi(), ctor(), ctod(), imofnlu(), imgnfn()
errchk	imgstr, mw_gltermd, mw_sltermd
data	axes/1,2/

begin
	call smark (sp)
	call salloc (key, SZ_FNAME, TY_CHAR)
	call salloc (val, SZ_LINE, TY_CHAR)
	call salloc (lterm, 12, TY_DOUBLE)

	# Set the basic multispec MWCS
	i = mw_stati (smw, MW_NDIM)
	j = max (2, i)
	mw = mw_open (NULL, j)
	call mw_newsystem (mw, "multispec", j)
	call mw_swtype (mw, axes, 2, "multispec", "")
	if (j > 2)
	    call mw_swtype (mw, 3, 1, "linear", "")
	call mw_gltermd (smw, Memd[lterm+j], Memd[lterm], i)
	if (i == 1) {
	    Memd[lterm+1] = 0.
	    Memd[lterm+3] = 0.
	    Memd[lterm+4] = 0.
	    Memd[lterm+5] = 1.
	}
	call mw_sltermd (mw, Memd[lterm+j], Memd[lterm], j)

	iferr (dtype = imgeti (im, "DC-FLAG"))
	    dtype = -1
	else {
	    call mw_swattrs (mw, 1, "label", "Wavelength")
	    call mw_swattrs (mw, 1, "units", "Angstroms")
	}

	call mw_close (smw)
	smw = mw

	# Set the SMW data structure.
	call smw_open (smw, NULL, im)
	do i = 1, SMW_NSPEC(smw) {
	    call smw_mw (smw, i, 1, mw, j, k)
	    call sprintf (Memc[key], SZ_FNAME, "APNUM%d")
		call pargi (j)
	    call imgstr (im, Memc[key], Memc[val], SZ_LINE)
	    call imdelf (im, Memc[key])

	    k = 1
	    nchar = ctoi (Memc[val], k, ap)
	    nchar = ctoi (Memc[val], k, beam)
	    nchar = ctod (Memc[val], k, w1)
	    nchar = ctod (Memc[val], k, dw)
	    nchar = ctoi (Memc[val], k, nw)
	    if (ctor (Memc[val], k, aplow[1]) == 0)
		aplow[1] = INDEF
	    if (ctor (Memc[val], k, aphigh[1]) == 0)
		aphigh[1] = INDEF
	    z = 0.

	    k = dtype
	    if (k==1 && (abs(w1)>20. || abs(w1+(nw-1)*dw)>20.))
		k = 0
	    call smw_swattrs (smw, i, 1, ap, beam, k, w1, dw, nw, z,
		aplow, aphigh, "")

	    call sprintf (Memc[key], SZ_FNAME, "APID%d")
		call pargi (j)
	    ifnoerr (call imgstr (im, Memc[key], Memc[val], SZ_LINE)) {
		call smw_sapid (smw, i, 1, Memc[val])
		call imdelf (im, Memc[key])
	    }
	}

	# Delete old parameters
	i = imofnlu (im,
	    "DISPAXIS,APFORMAT,BEAM-NUM,DC-FLAG,W0,WPC,NP1,NP2")
	while (imgnfn (i, Memc[key], SZ_FNAME) != EOF) {
	    iferr (call imdelf (im, Memc[key]))
		;
	}
	call imcfnl (i)

	# Update MWCS
	call smw_saveim (smw, im)

	call sfree (sp)
end