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
102
103
104
105
106
107
|
include <imhdr.h>
include <math/interp.h>
include "ms.h"
# EX_SMOOTH -- Extract spectra using the SMOOTH model.
# FIT_PROFILES -- Get SMOOTH profiles and fit the profiles to the data while
# replacing deviant pixels by model profile values.
# EX_SMOOTH -- Extract spectra using the SMOOTH 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 SMOOTH must be used
# for cleaning or model extraction. It outputs the extracted spectra to
# the output image file. Note that this task does CLIO.
procedure ex_smooth (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 strips
real upper # Upper limit of strips
bool ex_spectra # Extract spectra or image line?
bool ex_model # Extract model or data?
bool ex_integral # Extract integrated or strip spectra?
# User input parameters:
int nlines # Lines to average for smooth model
int interpolator # Line interpolator type
int len_line, nspectra, len_profile, len_profiles
int line_in, line_out
pointer sp, data, data_in, data_out, model, ranges, profiles, coeff
int clgeti(), get_next_number(), clginterp()
pointer impl2r()
begin
# Get parameters for model SMOOTH.
nlines = clgeti ("naverage") + 1
interpolator = clginterp ("interpolator")
# Set array lengths.
len_line = IM_LEN(im_in, 1)
nspectra = MS_NSPECTRA(ms)
len_profile = nint (upper - lower + 1)
len_profiles = len_profile * nspectra
# Allocate working memory.
call smark (sp)
call salloc (data, len_profiles, TY_REAL)
call salloc (model, len_profiles, TY_REAL)
call salloc (ranges, nspectra * LEN_RANGES, TY_REAL)
call salloc (profiles, len_profiles * (nlines + 1), TY_REAL)
call salloc (coeff, 2 * len_line + SZ_ASI, TY_REAL)
# Initialize ranges and interpolation arrays.
call amovkr (lower, Memr[ranges + (DX_START-1)*nspectra], nspectra)
call asiset (Memr[coeff], interpolator)
# Get fit position functions from the database.
call msgfits (ms, X0_FIT)
# Loop through the input image lines and write output 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 SMOOTH profiles and the data for the input line.
call set_smooth (ms, im_in, line_in, Memr[ranges], Memr[profiles],
Memr[coeff], len_profile, nspectra, nlines, Memr[data],
Memr[model])
# Fit and clean the data and model.
call fit_smooth (line_in, Memr[data], Memr[model],
Memr[profiles], len_profile, nspectra, nlines)
# Select model or data to be output.
if (ex_model)
data_in = model
else
data_in = data
if (ex_spectra) {
# Extract model or data spectra.
call ex_out (im_out, line_out, spectra, lower, upper,
Memr[ranges], Memr[data_in], len_profile, nspectra,
ex_integral)
} else {
# Extract model or data image line.
data_out = impl2r(im_out, line_out)
call set_model1 (ms, line_in, Memr[data_in], Memr[coeff],
Memr[ranges], len_line, len_profile, nspectra,
Memr[data_out])
}
}
# Free allocated memory.
call sfree (sp)
end
|