aboutsummaryrefslogtreecommitdiff
path: root/noao/twodspec/multispec/exgauss5.x
blob: 5c009239d406a40557d1178d9f00234eb9b0a213 (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
include	<imhdr.h>
include "ms.h"


# EX_GAUSS5 -- Extract spectra using the GAUSS5 model.
#
# This procedure is called either by t_extract to extract spectra (either
# integrated or strip) or by t_newimage to extract a new image (either
# model or cleaned data).  It is called only if model GAUSS5 must be used
# for cleaning, blending corrections, or model extraction.

procedure ex_gauss5 (ms, im_in, im_out, spectra, lines, lower, upper,
    ex_spectra, ex_model, ex_integral)

pointer	ms				# MULTISPEC pointer
pointer	im_in				# Input image descriptor
pointer	im_out				# Output image descriptor
int	spectra[ARB]			# Spectra range list
int	lines[ARB]			# Line range list
real	lower				# Lower limit of strip
real	upper				# Upper limit of strip
bool	ex_spectra			# Extract spectra or image line
bool	ex_model			# Extract model or data
bool	ex_integral			# Extract integrated spectra or strip

int	len_line, len_profile, nspectra, nparams
int	line_in, line_out
pointer	data, data_in, data_out
pointer	sp, model, profiles, ranges, data_profiles

int	get_next_number()
pointer	imgl2r(), impl2r()

begin
	# Set array size variables.
	len_line = MS_LEN(ms, 1)
	nspectra = MS_NSPECTRA(ms)
	nparams = MS_NGAUSS5
	len_profile = nint (upper - lower + 2)

	# Allocate and setup necessary arrays.
	call smark (sp)
	call salloc (model, len_line, TY_REAL)
	call salloc (ranges, nspectra * LEN_RANGES * 3, TY_REAL)
	call salloc (profiles, len_profile * nspectra * nparams * 3, TY_REAL)
	call salloc (data_profiles, len_profile * nspectra, TY_REAL)

	# Initialize ranges arrays.
	Memr[ranges] = INDEFR

	# Loop through the input lines and write an output line for each
	# input line.
	line_in = 0
	line_out = 0
	while (get_next_number (lines, line_in) != EOF) {
	    line_out = line_out + 1
	    call ex_prnt2 (line_in, line_out)

	    # Get the multi-spectra image data.
	    data = imgl2r (im_in, line_in)

	    # Get the GAUSS5 model profiles using interpolation between the
	    # sample lines.
	    call int_gauss5 (ms, lower, Memr[profiles], Memr[ranges],
		len_profile, nspectra, nparams, line_in)

	    # Iteratively fit the profile scales to the data and replace
	    # deviant pixels by model values.
	    call fit_and_clean (ms, Memr[data], Memr[model], Memr[ranges],
		Memr[profiles], len_line, len_profile, nspectra, nparams)

	    # Unblend data spectra only if needed.
	    if (ex_spectra && !ex_model)
		call unblend (Memr[data], Memr[data_profiles], Memr[model],
		    Memr[profiles], Memr[ranges], len_line, len_profile,
		    nspectra)

	    if (!ex_spectra) {
		# Output a new model or data image line.
		data_out = impl2r (im_out, line_out)
		if (ex_model)
		    data_in = model
		else
		    data_in = data
		call amovr (Memr[data_in], Memr[data_out], len_line)
	    } else {
		# Output either model or data extracted spectra.
		if (ex_model)
		    data_in = profiles
		else
		    data_in = data_profiles
	        call ex_out (im_out, line_out, spectra, lower, upper,
		    Memr[ranges], Memr[data_in], len_profile, nspectra,
		    ex_integral)
	    }
	}

	# Free allocated memory.
	call sfree (sp)
end