aboutsummaryrefslogtreecommitdiff
path: root/noao/onedspec/smw/smwesms.x
blob: d1b8a368ac6801cff2cb484d6d65f220a48d03a3 (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
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