From fa080de7afc95aa1c19a6e6fc0e0708ced2eadc4 Mon Sep 17 00:00:00 2001 From: Joseph Hunkeler Date: Wed, 8 Jul 2015 20:46:52 -0400 Subject: Initial commit --- noao/twodspec/multispec/exsmooth.x | 107 +++++++++++++++++++++++++++++++++++++ 1 file changed, 107 insertions(+) create mode 100644 noao/twodspec/multispec/exsmooth.x (limited to 'noao/twodspec/multispec/exsmooth.x') diff --git a/noao/twodspec/multispec/exsmooth.x b/noao/twodspec/multispec/exsmooth.x new file mode 100644 index 00000000..f092529a --- /dev/null +++ b/noao/twodspec/multispec/exsmooth.x @@ -0,0 +1,107 @@ +include +include +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 -- cgit