35#include "eris_nix_wavecal_utils.h"
88 const cpl_size slice_index,
89 const cpl_vector * guess_pos) {
91 cpl_matrix * line_pos = NULL;
92 cpl_vector * next_guess_pos = NULL;
93 cpl_vector * spectrum1d = NULL;
95 if (cpl_error_get_code() != CPL_ERROR_NONE)
return NULL;
97 cpl_ensure(spectrum2d, CPL_ERROR_NULL_INPUT, NULL);
98 cpl_ensure(guess_pos, CPL_ERROR_NULL_INPUT, NULL);
99 cpl_ensure(cpl_vector_get_size(guess_pos) > 0,
100 CPL_ERROR_ILLEGAL_INPUT, NULL);
102 cpl_size nlines = cpl_vector_get_size(guess_pos);
105 line_pos = cpl_matrix_new(nx, nlines);
106 cpl_matrix_fill(line_pos, NAN);
111 next_guess_pos = cpl_vector_duplicate(guess_pos);
113 for (cpl_size ix = slice_index; ix < nx; ix++) {
117 spectrum1d = cpl_vector_new_from_image_column(
120 for (cpl_size line_id=0; line_id < nlines; line_id++) {
121 double line_guess_pos = cpl_vector_get(next_guess_pos, line_id);
122 double fitted_pos = enwu_linepos_1d(spectrum1d, line_guess_pos);
123 if (!isnan(fitted_pos)) {
129 cpl_matrix_set(line_pos, ix, line_id, fitted_pos);
130 cpl_vector_set(next_guess_pos, line_id, fitted_pos);
133 cpl_vector_delete(spectrum1d);
135 cpl_vector_delete(next_guess_pos);
139 next_guess_pos = cpl_vector_duplicate(guess_pos);
141 for (cpl_size ix = slice_index-1; ix >= 0; ix--) {
142 spectrum1d = cpl_vector_new_from_image_column(
145 for (cpl_size line_id=0; line_id < nlines; line_id++) {
146 double line_guess_pos = cpl_vector_get(next_guess_pos, line_id);
147 double fitted_pos = enwu_linepos_1d(spectrum1d, line_guess_pos);
148 if (!isnan(fitted_pos)) {
149 cpl_matrix_set(line_pos, ix, line_id, fitted_pos);
150 cpl_vector_set(next_guess_pos, line_id, fitted_pos);
153 cpl_vector_delete(spectrum1d);
155 cpl_vector_delete(next_guess_pos);
159 if (cpl_error_get_code() != CPL_ERROR_NONE) {
160 cpl_matrix_delete(line_pos);
192double enwu_linepos_1d(
const cpl_vector * spectrum1d,
193 const double guess_pos) {
195 if (cpl_error_get_code() != CPL_ERROR_NONE)
return NAN;
196 cpl_ensure(spectrum1d, CPL_ERROR_NULL_INPUT, NAN);
198 cpl_polynomial * line_fit = NULL;
201 cpl_size half_width = 4;
202 cpl_size istart = (cpl_size) guess_pos - half_width;
203 cpl_size istop = (cpl_size) guess_pos + half_width;
204 cpl_size npos = istop - istart + 1;
208 cpl_matrix * pos_chunk = cpl_matrix_new(1, npos);
209 for (cpl_size i = 0; i < npos; i++) {
210 cpl_matrix_set(pos_chunk, 0, i, (
double) (i + istart));
216 cpl_vector * spectrum_chunk = cpl_vector_extract(spectrum1d,
218 const double * spectrum_chunk_data = cpl_vector_get_data_const(
221 for (cpl_size i = 0; i < npos; i++) {
223 spectrum_chunk_data[i] != 0.0 &&
224 !isnan(spectrum_chunk_data[i]);
230 line_fit = cpl_polynomial_new(1);
231 const cpl_size maxdeg1d = 2;
232 cpl_polynomial_fit(line_fit, pos_chunk, NULL, spectrum_chunk, NULL,
233 CPL_FALSE, NULL, &maxdeg1d);
240 double poly_b = cpl_polynomial_get_coeff(line_fit, &pow);
242 double poly_c = cpl_polynomial_get_coeff(line_fit, &pow);
243 result = -poly_b / (2.0 * poly_c);
249 if (fabs(result - guess_pos) > half_width) {
254 cpl_matrix_delete(pos_chunk);
255 cpl_vector_delete(spectrum_chunk);
256 cpl_polynomial_delete(line_fit);
258 if (cpl_error_get_code() != CPL_ERROR_NONE) {
cpl_matrix * enwu_linepos_2d(const hdrl_image *spectrum2d, const cpl_size slice_index, const cpl_vector *guess_pos)
Fit the line peaks of a wave calibration spectrum.
cpl_size hdrl_image_get_size_x(const hdrl_image *self)
return size of X dimension of image
const cpl_image * hdrl_image_get_image_const(const hdrl_image *himg)
get data as cpl image