71 const cpl_bivector *lines_catalog,
72 const cpl_polynomial *poly_init,
78 cpl_table **tab_infos)
80#ifdef IRPLIB_PPM_USE_METHOD2
81 cpl_vector *spec_conv;
84 cpl_vector *det_lines;
85 cpl_vector *cat_lines;
88 double disp_min, disp_max, disp;
89 int nlines_cat, nlines;
90 const double *plines_catalog_x;
91 const double *plines_catalog_y;
92 cpl_bivector *matched;
95 cpl_polynomial *fitted;
97 const cpl_vector *vectors_plot[3];
99 int start_ind, stop_ind;
103 cpl_error_code error;
106 if (spectrum == NULL)
108 if (lines_catalog == NULL)
110 if (poly_init == NULL)
114 spec_sz = cpl_vector_get_size(spectrum);
115 deg_loc = (cpl_size)degree;
117#ifdef IRPLIB_PPM_USE_METHOD2
120 if ((spec_conv = irplib_ppm_convolve_line(spectrum, slitw, fwhm)) == NULL) {
121 cpl_msg_error(cpl_func,
"Cannot convolve the signal");
126 if ((det_lines = irplib_ppm_detect_lines(spec_conv, 0.9)) == NULL) {
127 cpl_msg_error(cpl_func,
"Cannot detect lines");
128 cpl_vector_delete(spec_conv);
131 cpl_vector_delete(spec_conv);
135 NULL, NULL)) == NULL) {
136 cpl_msg_error(cpl_func,
"Cannot convolve the signal");
140 cpl_msg_info(cpl_func,
"Detected %" CPL_SIZE_FORMAT
" lines",
141 cpl_vector_get_size(det_lines));
144 wmin = cpl_polynomial_eval_1d(poly_init, 1.0, NULL);
145 wmax = cpl_polynomial_eval_1d(poly_init, spec_sz, NULL);
146 plines_catalog_x = cpl_bivector_get_x_data_const(lines_catalog);
147 plines_catalog_y = cpl_bivector_get_y_data_const(lines_catalog);
148 nlines = cpl_bivector_get_size(lines_catalog);
150 start_ind = stop_ind = -1;
151 for (i = 0; i < nlines; i++) {
152 if (plines_catalog_x[i] > wmin && plines_catalog_x[i] < wmax &&
153 plines_catalog_y[i] > 0.0) {
160 if (nlines_cat == 0) {
161 cpl_msg_error(cpl_func,
"No lines in catalog");
162 cpl_vector_delete(det_lines);
165 cat_lines = cpl_vector_new(nlines_cat);
166 pcat_lines = cpl_vector_get_data(cat_lines);
168 for (i = 0; i < nlines; i++) {
169 if (plines_catalog_x[i] > wmin && plines_catalog_x[i] < wmax &&
170 plines_catalog_y[i] > 0.0) {
171 pcat_lines[nlines_cat] = plines_catalog_x[i];
181 irplib_wlxcorr_catalog_plot(lines_catalog, wmin, wmax);
184 fill_val = cpl_vector_get_max(spectrum);
185 plot_y = cpl_vector_new(spec_sz);
186 cpl_vector_fill(plot_y, 0.0);
187 pdet_lines = cpl_vector_get_data(det_lines);
188 for (i = 0; i < cpl_vector_get_size(det_lines); i++) {
189 cpl_vector_set(plot_y, (
int)pdet_lines[i], fill_val);
191 vectors_plot[0] = NULL;
192 vectors_plot[1] = spectrum;
193 vectors_plot[2] = plot_y;
195 cpl_plot_vectors(
"set grid;set xlabel 'Position (Pixel)';set ylabel "
196 "'Intensity (ADU/sec)';",
197 "t 'Spectrum with detected lines' w lines",
"",
199 cpl_vector_delete(plot_y);
203 disp = (wmax - wmin) / spec_sz;
204 disp_min = disp - (disp / 10);
205 disp_max = disp + (disp / 10);
206 matched = cpl_ppm_match_positions(det_lines, cat_lines, disp_min, disp_max,
208 cpl_vector_delete(det_lines);
209 cpl_vector_delete(cat_lines);
211 if (matched == NULL) {
212 cpl_msg_error(cpl_func,
"Cannot apply the point pattern matching");
216 match_sz = cpl_bivector_get_size(matched);
218 cpl_msg_info(cpl_func,
"Matched %d lines", match_sz);
220 if (match_sz <= deg_loc) {
221 cpl_msg_error(cpl_func,
"Not enough match for the fit");
222 cpl_bivector_delete(matched);
228 const double *pmatched;
229 cpl_bivector *biplot;
230 cpl_vector *plot_cat_x;
231 cpl_vector *plot_cat_y;
233 fill_val = cpl_vector_get_max(spectrum);
234 plot_y = cpl_vector_new(spec_sz);
235 cpl_vector_fill(plot_y, 0.0);
236 pmatched = cpl_bivector_get_x_data_const(matched);
237 for (i = 0; i < match_sz; i++) {
238 cpl_vector_set(plot_y, (
int)pmatched[i], fill_val);
240 vectors_plot[0] = NULL;
241 vectors_plot[1] = spectrum;
242 vectors_plot[2] = plot_y;
244 cpl_plot_vectors(
"set grid;set xlabel 'Position (Pixel)';set ylabel "
245 "'Intensity (ADU/sec)';",
246 "t 'Spectrum with matched lines' w lines",
"",
248 cpl_vector_delete(plot_y);
251 plot_cat_x = cpl_vector_extract(cpl_bivector_get_x_const(lines_catalog),
252 start_ind, stop_ind, 1);
253 plot_cat_y = cpl_vector_extract(cpl_bivector_get_y_const(lines_catalog),
254 start_ind, stop_ind, 1);
255 biplot = cpl_bivector_wrap_vectors(plot_cat_x, plot_cat_y);
256 cpl_plot_bivector(
"set grid;set xlabel 'Wavelength';set ylabel "
258 "t 'Catalog' w impulses",
"", biplot);
259 cpl_bivector_unwrap_vectors(biplot);
261 plot_y = cpl_vector_duplicate(plot_cat_y);
262 cpl_vector_fill(plot_y, 0.0);
263 pmatched = cpl_bivector_get_y_data_const(matched);
264 fill_val = cpl_vector_get_mean(plot_cat_y);
265 for (i = 0; i < match_sz; i++) {
267 while (pmatched[i] > cpl_vector_get(plot_cat_x, wl_ind) &&
270 if (wl_ind < spec_sz)
271 cpl_vector_set(plot_y, wl_ind, fill_val);
273 biplot = cpl_bivector_wrap_vectors(plot_cat_x, plot_y);
274 cpl_plot_bivector(
"set grid;set xlabel 'Wavelength';set ylabel "
276 "t 'Catalog (matched lines)' w "
279 cpl_bivector_unwrap_vectors(biplot);
280 cpl_vector_delete(plot_cat_x);
281 cpl_vector_delete(plot_cat_y);
282 cpl_vector_delete(plot_y);
286 matchedx = cpl_matrix_wrap(1, match_sz, cpl_bivector_get_x_data(matched));
287 fitted = cpl_polynomial_new(1);
288 error = cpl_polynomial_fit(fitted, matchedx, NULL,
289 cpl_bivector_get_y_const(matched), NULL,
290 CPL_FALSE, NULL, °_loc);
291 cpl_bivector_delete(matched);
292 (void)cpl_matrix_unwrap(matchedx);
294 cpl_msg_error(cpl_func,
"Cannot fit the polynomial");
295 cpl_polynomial_delete(fitted);
301 irplib_wlxcorr_gen_spc_table(spectrum, lines_catalog, slitw, fwhm,
302 poly_init, fitted)) == NULL) {
303 cpl_msg_error(cpl_func,
"Cannot generate the infos table");
304 cpl_polynomial_delete(fitted);
307 if (tab_infos != NULL)
308 *tab_infos = spc_table;
310 cpl_table_delete(spc_table);