70 const cpl_vector * spectrum,
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 ;
93 cpl_matrix * matchedx;
95 cpl_polynomial * fitted ;
96 cpl_table * spc_table ;
97 const cpl_vector* vectors_plot[3];
99 int start_ind, stop_ind ;
103 cpl_error_code error;
106 if (spectrum == NULL)
return NULL ;
107 if (lines_catalog == NULL)
return NULL ;
108 if (poly_init == NULL)
return NULL ;
111 spec_sz = cpl_vector_get_size(spectrum) ;
112 deg_loc = (cpl_size)degree ;
114#ifdef IRPLIB_PPM_USE_METHOD2
117 if ((spec_conv = irplib_ppm_convolve_line(spectrum, slitw, fwhm)) == NULL) {
118 cpl_msg_error(cpl_func,
"Cannot convolve the signal") ;
123 if ((det_lines = irplib_ppm_detect_lines(spec_conv, 0.9)) == NULL) {
124 cpl_msg_error(cpl_func,
"Cannot detect lines") ;
125 cpl_vector_delete(spec_conv) ;
128 cpl_vector_delete(spec_conv) ;
132 thresh, 0, NULL, NULL)) == NULL) {
133 cpl_msg_error(cpl_func,
"Cannot convolve the signal") ;
137 cpl_msg_info(cpl_func,
"Detected %"CPL_SIZE_FORMAT
" lines",
138 cpl_vector_get_size(det_lines));
141 wmin = cpl_polynomial_eval_1d(poly_init, 1.0, NULL) ;
142 wmax = cpl_polynomial_eval_1d(poly_init, spec_sz, NULL) ;
143 plines_catalog_x = cpl_bivector_get_x_data_const(lines_catalog) ;
144 plines_catalog_y = cpl_bivector_get_y_data_const(lines_catalog) ;
145 nlines = cpl_bivector_get_size(lines_catalog) ;
147 start_ind = stop_ind = -1 ;
148 for (i=0 ; i<nlines ; i++) {
149 if (plines_catalog_x[i] > wmin && plines_catalog_x[i] < wmax &&
150 plines_catalog_y[i] > 0.0) {
152 if (start_ind<0) start_ind = i ;
156 if (nlines_cat == 0) {
157 cpl_msg_error(cpl_func,
"No lines in catalog") ;
158 cpl_vector_delete(det_lines) ;
161 cat_lines = cpl_vector_new(nlines_cat) ;
162 pcat_lines = cpl_vector_get_data(cat_lines) ;
164 for (i=0 ; i<nlines ; i++) {
165 if (plines_catalog_x[i] > wmin && plines_catalog_x[i] < wmax &&
166 plines_catalog_y[i] > 0.0) {
167 pcat_lines[nlines_cat] = plines_catalog_x[i] ;
174 double * pdet_lines ;
177 irplib_wlxcorr_catalog_plot(lines_catalog, wmin, wmax) ;
180 fill_val = cpl_vector_get_max(spectrum) ;
181 plot_y = cpl_vector_new(spec_sz);
182 cpl_vector_fill(plot_y, 0.0) ;
183 pdet_lines = cpl_vector_get_data(det_lines) ;
184 for (i=0 ; i<cpl_vector_get_size(det_lines) ; i++) {
185 cpl_vector_set(plot_y, (
int)pdet_lines[i], fill_val) ;
187 vectors_plot[0] = NULL ;
188 vectors_plot[1] = spectrum ;
189 vectors_plot[2] = plot_y ;
191 cpl_plot_vectors(
"set grid;set xlabel 'Position (Pixel)';set ylabel "
192 "'Intensity (ADU/sec)';",
193 "t 'Spectrum with detected lines' w lines",
"",
195 cpl_vector_delete(plot_y) ;
199 disp = (wmax-wmin) / spec_sz ;
200 disp_min = disp - (disp/10) ;
201 disp_max = disp + (disp/10) ;
202 matched = cpl_ppm_match_positions(det_lines, cat_lines, disp_min,
203 disp_max, 0.05, NULL, NULL);
204 cpl_vector_delete(det_lines) ;
205 cpl_vector_delete(cat_lines) ;
207 if (matched == NULL) {
208 cpl_msg_error(cpl_func,
"Cannot apply the point pattern matching") ;
212 match_sz = cpl_bivector_get_size(matched);
214 cpl_msg_info(cpl_func,
"Matched %d lines", match_sz) ;
216 if (match_sz <= deg_loc) {
217 cpl_msg_error(cpl_func,
"Not enough match for the fit") ;
218 cpl_bivector_delete(matched) ;
224 const double * pmatched ;
225 cpl_bivector * biplot ;
226 cpl_vector * plot_cat_x ;
227 cpl_vector * plot_cat_y ;
229 fill_val = cpl_vector_get_max(spectrum) ;
230 plot_y = cpl_vector_new(spec_sz);
231 cpl_vector_fill(plot_y, 0.0) ;
232 pmatched = cpl_bivector_get_x_data_const(matched) ;
233 for (i=0 ; i < match_sz; i++) {
234 cpl_vector_set(plot_y, (
int)pmatched[i], fill_val) ;
236 vectors_plot[0] = NULL ;
237 vectors_plot[1] = spectrum ;
238 vectors_plot[2] = plot_y ;
240 cpl_plot_vectors(
"set grid;set xlabel 'Position (Pixel)';set ylabel "
241 "'Intensity (ADU/sec)';",
242 "t 'Spectrum with matched lines' w lines",
"",
244 cpl_vector_delete(plot_y) ;
247 plot_cat_x=cpl_vector_extract(cpl_bivector_get_x_const(lines_catalog),
248 start_ind, stop_ind, 1) ;
249 plot_cat_y=cpl_vector_extract(cpl_bivector_get_y_const(lines_catalog),
250 start_ind, stop_ind, 1) ;
251 biplot = cpl_bivector_wrap_vectors(plot_cat_x, plot_cat_y) ;
252 cpl_plot_bivector(
"set grid;set xlabel 'Wavelength';set ylabel "
253 "'Emission';",
"t 'Catalog' w impulses",
"",
255 cpl_bivector_unwrap_vectors(biplot) ;
257 plot_y = cpl_vector_duplicate(plot_cat_y) ;
258 cpl_vector_fill(plot_y, 0.0) ;
259 pmatched = cpl_bivector_get_y_data_const(matched) ;
260 fill_val=cpl_vector_get_mean(plot_cat_y) ;
261 for (i=0 ; i < match_sz; i++) {
263 while (pmatched[i] > cpl_vector_get(plot_cat_x, wl_ind)
264 && wl_ind < spec_sz) wl_ind++ ;
265 if (wl_ind < spec_sz) cpl_vector_set(plot_y, wl_ind, fill_val) ;
267 biplot = cpl_bivector_wrap_vectors(plot_cat_x, plot_y) ;
268 cpl_plot_bivector(
"set grid;set xlabel 'Wavelength';set ylabel "
269 "'Emission';",
"t 'Catalog (matched lines)' w "
270 "impulses",
"", biplot) ;
271 cpl_bivector_unwrap_vectors(biplot) ;
272 cpl_vector_delete(plot_cat_x) ;
273 cpl_vector_delete(plot_cat_y) ;
274 cpl_vector_delete(plot_y) ;
278 matchedx = cpl_matrix_wrap(1, match_sz, cpl_bivector_get_x_data(matched));
279 fitted = cpl_polynomial_new(1);
280 error = cpl_polynomial_fit(fitted, matchedx, NULL,
281 cpl_bivector_get_y_const(matched), NULL,
282 CPL_FALSE, NULL, °_loc);
283 cpl_bivector_delete(matched);
284 (void)cpl_matrix_unwrap(matchedx);
286 cpl_msg_error(cpl_func,
"Cannot fit the polynomial") ;
287 cpl_polynomial_delete(fitted);
292 if ((spc_table = irplib_wlxcorr_gen_spc_table(spectrum,
293 lines_catalog, slitw, fwhm, poly_init, fitted)) == NULL) {
294 cpl_msg_error(cpl_func,
"Cannot generate the infos table") ;
295 cpl_polynomial_delete(fitted) ;
298 if (tab_infos != NULL) *tab_infos = spc_table ;
299 else cpl_table_delete(spc_table) ;