33#include <cr2res_dfs.h>
34#include <cr2res_wave.h>
35#include <cr2res_wave.c>
36#include <cr2res_etalon.h>
38#define CR2RES_DETECTOR_SIZE 2048
44static void test_cr2res_wave_1d(
void);
49static void test_cr2res_wave_polys_1d_to_2d(
void);
50static void test_cr2res_wave_poly_2d_to_1d(
void);
51static void test_cr2res_wave_estimate_compute(
void);
52static void test_cr2res_wave_clean_spectrum(
void);
53static void test_cr2res_wave_etalon_2d(
void);
64static cpl_table * make_test_catalog()
66 cpl_table * catalog = cpl_table_new(2);
67 cpl_table_new_column(catalog, CR2RES_COL_WAVELENGTH, CPL_TYPE_DOUBLE);
68 cpl_table_new_column(catalog, CR2RES_COL_EMISSION, CPL_TYPE_DOUBLE);
75 cpl_table_set_double(catalog, CR2RES_COL_WAVELENGTH, 0, 2.551218908614062912e+03);
76 cpl_table_set_double(catalog, CR2RES_COL_EMISSION, 0, 9.935860000000000127e+02);
78 cpl_table_set_double(catalog, CR2RES_COL_WAVELENGTH, 1, 2.603302966671994909e+03);
79 cpl_table_set_double(catalog, CR2RES_COL_EMISSION, 1, 2.992800000000000082e+01);
84static const char * save_catalog(cpl_table * catalog){
85 const char * filename =
"TEST_linelist.fits";
86 cpl_propertylist * header = cpl_propertylist_new();
87 cpl_propertylist_append_string(header, CR2RES_HEADER_DRS_TYPE, CR2RES_DRSTYPE_CATALOG);
89 cpl_table_save(catalog, header, NULL, filename, CPL_IO_CREATE);
90 cpl_propertylist_delete(header);
93#ifdef CR2RES_UNUSED_TESTS
94static const char * save_linelist(cpl_bivector * linelist){
95 const char * filename =
"TEST_linelist.fits";
96 cpl_propertylist * header = cpl_propertylist_new();
97 cpl_propertylist_append_string(header, CR2RES_HEADER_DRS_TYPE, CR2RES_DRSTYPE_CATALOG);
99 cpl_table * table = cpl_table_new(cpl_bivector_get_size(linelist));
100 cpl_table_new_column(table, CR2RES_COL_WAVELENGTH, CPL_TYPE_DOUBLE);
101 cpl_table_new_column(table, CR2RES_COL_EMISSION, CPL_TYPE_DOUBLE);
103 for (cpl_size i = 0; i < cpl_bivector_get_size(linelist); i++)
105 cpl_table_set_double(table, CR2RES_COL_WAVELENGTH, i, cpl_vector_get(cpl_bivector_get_x(linelist), i));
106 cpl_table_set_double(table, CR2RES_COL_EMISSION, i, cpl_vector_get(cpl_bivector_get_y(linelist), i));
109 cpl_table_save(table, header, NULL, filename, CPL_IO_CREATE);
111 cpl_propertylist_delete(header);
112 cpl_table_delete(table);
118static cpl_bivector * make_test_spectrum(cpl_table * catalog,
double wmin,
double wmax,
int size, cpl_bivector ** spectrum_err)
120 double mu, line_em, sig;
122 cpl_bivector * spectrum = cpl_bivector_new(size);
123 *spectrum_err = cpl_bivector_new(size);
124 cpl_vector * wave1 = cpl_bivector_get_x(spectrum);
125 cpl_vector * wave2 = cpl_bivector_get_x(*spectrum_err);
127 cpl_vector * spec = cpl_bivector_get_y(spectrum);
128 cpl_vector * unc = cpl_bivector_get_y(*spectrum_err);
130 for (i = 0; i < size; i++){
133 wl = wmin + i * (wmax - wmin) / (
double)size;
135 for (j = 0; j < 2; j++){
136 mu = cpl_table_get_double(catalog, CR2RES_COL_WAVELENGTH, j, NULL);
137 line_em = cpl_table_get_double(catalog, CR2RES_COL_EMISSION, j, NULL);
139 tmp += line_em * exp(- 1 * pow(wl - mu, 2) / (2 * pow(sig, 2)));
142 cpl_vector_set(spec, i, tmp);
143 cpl_vector_set(unc, i, 0.01);
144 cpl_vector_set(wave1, i, wl);
145 cpl_vector_set(wave2, i, wl);
151#ifdef CR2RES_UNUSED_TESTS
152static cpl_bivector * make_test_etalon_spectrum(
int size,
double freq, cpl_bivector ** spectrum_err)
154 cpl_bivector * spectrum = cpl_bivector_new(size);
155 *spectrum_err = cpl_bivector_new(size);
157 cpl_vector * wave1 = cpl_bivector_get_x(spectrum);
158 cpl_vector * wave2 = cpl_bivector_get_x(*spectrum_err);
160 cpl_vector * spec = cpl_bivector_get_y(spectrum);
161 cpl_vector * unc = cpl_bivector_get_y(*spectrum_err);
164 for (
int i = 0; i < size; i++){
165 cpl_vector_set(spec, i, fabs(sin(i * freq)));
166 cpl_vector_set(unc, i, 1);
167 cpl_vector_set(wave1, i, i);
168 cpl_vector_set(wave2, i, i);
177static cpl_polynomial * make_test_polynomial(
double wmin,
double wmax,
int size)
179 cpl_polynomial * poly = cpl_polynomial_new(1);
183 cpl_polynomial_set_coeff(poly, &power, wmin);
185 cpl_polynomial_set_coeff(poly, &power,(wmax - wmin)/size);
195static void test_cr2res_wave_1d()
197 double wmin=2500, wmax=2650;
199 cpl_table * catalog = make_test_catalog();
200 cpl_table * diagnostics;
201 cpl_bivector * spectrum_err;
202 cpl_bivector * spectrum = make_test_spectrum(catalog, wmin, wmax, size, &spectrum_err);
203 cpl_polynomial * initial_guess = make_test_polynomial(wmin, wmax, size);
209 int propagate_flag = 0;
210 const char * catalog_name = save_catalog(catalog);
211 cr2res_wavecal_type wavecal_type = CR2RES_LINE1D;
212 cpl_array * wave_error_init = cpl_array_new(2, CPL_TYPE_DOUBLE);
213 cpl_array_set_double(wave_error_init, 0, 3.1);
214 cpl_array_set_double(wave_error_init, 1, 3.5);
216 cpl_array * wavelength_error;
217 cpl_polynomial * wavelength;
222 wave_error_init, order, trace, wavecal_type, catalog_name,
223 degree, 0, log_flag, propagate_flag, display, -1.0, -1.0, NULL,
224 NULL, NULL, NULL, NULL, &wavelength_error, &diagnostics);
225 cpl_test_null(wavelength);
228 wave_error_init, order, trace, wavecal_type, catalog_name, degree, 0,
229 log_flag, propagate_flag, display, -1.0, -1.0, NULL, NULL, NULL, NULL,
230 NULL, &wavelength_error, &diagnostics);
231 cpl_test_null(wavelength);
234 wave_error_init, order, trace, wavecal_type, catalog_name, degree,
235 0, log_flag, propagate_flag, display, -1.0, -1.0, NULL, NULL,
236 NULL, NULL, NULL, &wavelength_error, &diagnostics);
237 cpl_test_null(wavelength);
239 wavelength =
cr2res_wave_1d(spectrum, spectrum_err, initial_guess,
240 wave_error_init, order, trace, wavecal_type, NULL, degree, 0,
241 log_flag, propagate_flag, display, -1.0, -1.0, NULL, NULL, NULL, NULL,
242 NULL, &wavelength_error, &diagnostics);
243 cpl_test_null(wavelength);
245 wavelength =
cr2res_wave_1d(spectrum, spectrum_err, initial_guess,
246 wave_error_init, order, trace, wavecal_type, catalog_name,
247 degree, 0, log_flag, propagate_flag, display, -1.0, -1.0, NULL, NULL,
248 NULL, NULL, NULL, NULL, &diagnostics);
249 cpl_test_null(wavelength);
251 wavelength =
cr2res_wave_1d(spectrum, spectrum_err, initial_guess,
252 wave_error_init, order, trace, wavecal_type, catalog_name,
253 degree, 0, log_flag, propagate_flag, display, -1.0, -1.0,NULL, NULL,
254 NULL, NULL, NULL, &wavelength_error, NULL);
255 cpl_test_null(wavelength);
258 wavelength =
cr2res_wave_1d(spectrum, spectrum_err, initial_guess,
259 wave_error_init, order, trace, wavecal_type, catalog_name, 5, 0,
260 log_flag, propagate_flag, display, -1.0, -1.0, NULL, NULL, NULL, NULL,
261 NULL, &wavelength_error, &diagnostics);
263 cpl_test_null(wavelength);
264 cpl_test_null(wavelength_error);
265 cpl_test_null(diagnostics);
269 cpl_test(wavelength =
cr2res_wave_1d(spectrum, spectrum_err, initial_guess,
270 wave_error_init, order, trace, wavecal_type, catalog_name,
271 degree, 0, log_flag, propagate_flag, display, -1.0, -1.0, NULL,
272 NULL, NULL, NULL, NULL, &wavelength_error, &diagnostics));
274 cpl_test_nonnull(wavelength);
275 cpl_test_nonnull(wavelength_error);
276 cpl_test_nonnull(diagnostics);
280 cpl_test_abs(cpl_polynomial_get_coeff(wavelength, &power), wmin, 0.2);
282 cpl_test_abs(cpl_polynomial_get_coeff(wavelength, &power), (wmax-wmin)/(
double)size, 0.01);
285 cpl_test_abs(cpl_array_get_double(wavelength_error, 0, NULL), 0, DBL_EPSILON);
286 cpl_test_abs(cpl_array_get_double(wavelength_error, 1, NULL), 0, DBL_EPSILON);
289 cpl_table_delete(diagnostics);
290 cpl_array_delete(wavelength_error);
291 cpl_polynomial_delete(wavelength);
292 cpl_table_delete(catalog);
293 cpl_bivector_delete(spectrum);
294 cpl_bivector_delete(spectrum_err);
295 cpl_polynomial_delete(initial_guess);
296 cpl_array_delete(wave_error_init);
299#ifdef CR2RES_UNUSED_TESTS
305static void test_cr2res_wave_2d()
308 double wmin=2500, wmax=2650;
311 cpl_table * catalog = make_test_catalog();
312 cpl_bivector * spectrum_err;
313 cpl_bivector * spectrum = make_test_spectrum(catalog, wmin, wmax, size, &spectrum_err);
314 cpl_polynomial * initial_guess = make_test_polynomial(wmin, wmax, size);
315 int * orders = cpl_malloc(norders *
sizeof(
int));
316 int * traces = cpl_malloc(norders *
sizeof(
int));
318 const char * catalog_name = save_catalog(catalog);
319 cpl_array * wave_error_init = cpl_array_new(2, CPL_TYPE_DOUBLE);
320 cpl_array_set_double(wave_error_init, 0, 3.1);
321 cpl_array_set_double(wave_error_init, 1, 3.5);
323 cpl_array * wavelength_error;
324 cpl_table * diagnostics;
325 cpl_polynomial * wavelength;
327 cpl_size degree_x = 1;
328 cpl_size degree_y = 2;
331 cpl_bivector ** spec = cpl_malloc(norders *
sizeof(cpl_bivector*));
332 cpl_bivector ** spec_err = cpl_malloc(norders *
sizeof(cpl_bivector*));
333 cpl_polynomial ** guess = cpl_malloc(norders *
sizeof(cpl_polynomial*));
334 cpl_array ** init_error = cpl_malloc(norders *
sizeof(cpl_array*));
336 for (i = 0; i < norders; i++){
341 spec_err[i] = spectrum_err;
342 guess[i] = initial_guess;
343 init_error[i] = wave_error_init;
347 cpl_test(wavelength =
cr2res_wave_2d(spec, spec_err, guess, init_error,
348 orders, traces, norders, catalog_name, degree_x, degree_y,
349 0.0, 0, 0, display, &wavelength_error, &diagnostics));
352 cpl_polynomial_dump(wavelength, stdout);
364 cpl_size idx[2] = {0, 0};
365 cpl_test_abs(wmin, cpl_polynomial_get_coeff(wavelength, idx), 1e-3);
367 cpl_test_abs((wmax-wmin)/(
double)size, cpl_polynomial_get_coeff(wavelength, idx), 1e-5);
371 cpl_test_abs(0, cpl_polynomial_get_coeff(wavelength, idx), 1e-10);
374 cpl_test_abs(0, cpl_polynomial_get_coeff(wavelength, idx), 1e-10);
377 cpl_test_abs(0, cpl_polynomial_get_coeff(wavelength, idx), 1e-10);
380 cpl_test_abs(0, cpl_polynomial_get_coeff(wavelength, idx), 1e-10);
385 cpl_array_delete(wavelength_error);
386 cpl_polynomial_delete(wavelength);
387 cpl_table_delete(diagnostics);
388 cpl_table_delete(catalog);
389 cpl_bivector_delete(spectrum);
390 cpl_bivector_delete(spectrum_err);
391 cpl_polynomial_delete(initial_guess);
392 cpl_array_delete(wave_error_init);
397 cpl_free(init_error);
401#ifdef CR2RES_UNUSED_TESTS
402static void test_cr2res_wave_etalon(
void){
404 cpl_bivector * spectrum;
405 cpl_bivector * spectrum_err;
407 cpl_polynomial * initial;
408 cpl_polynomial * result;
416 spectrum = make_test_etalon_spectrum(size, 0.1, &spectrum_err);
419 for(
int i = 100; i < 150; i++)
421 cpl_vector_set(cpl_bivector_get_y(spectrum), i, 0);
425 for(
int i = 1462; i < 1493 ; i++)
427 cpl_vector_set(cpl_bivector_get_y(spectrum), i, 1);
430 initial = make_test_polynomial(wmin, wmax, size);
432 error = cpl_array_new(2, CPL_TYPE_DOUBLE);
433 cpl_array_set_double(error, 0, 3.1);
434 cpl_array_set_double(error, 1, 3.5);
436 cpl_test(result =
cr2res_wave_etalon(spectrum, spectrum_err, initial, degree, &error));
440 cpl_test_abs(cpl_polynomial_get_coeff(result, &power), wmin, 0.2);
442 cpl_test_abs(cpl_polynomial_get_coeff(result, &power), (wmax-wmin)/(
double)size, 0.01);
445 cpl_bivector_delete(spectrum);
446 cpl_bivector_delete(spectrum_err);
447 cpl_array_delete(error);
448 cpl_polynomial_delete(initial);
449 cpl_polynomial_delete(result);
453#ifdef CR2RES_UNUSED_TESTS
454static void test_cr2res_wave_etalon_other(
void){
456 cpl_bivector * spectrum;
457 cpl_bivector * spectrum_err;
459 cpl_polynomial * initial;
460 cpl_polynomial * result;
468 spectrum = make_test_etalon_spectrum(size, 0.1, &spectrum_err);
469 initial = make_test_polynomial(wmin, wmax, size);
471 error = cpl_array_new(2, CPL_TYPE_DOUBLE);
472 cpl_array_set_double(error, 0, 3.1);
473 cpl_array_set_double(error, 1, 3.5);
479 cpl_test_abs(cpl_polynomial_get_coeff(result, &power), wmin, 0.2);
481 cpl_test_abs(cpl_polynomial_get_coeff(result, &power), (wmax-wmin)/(
double)size, 0.01);
484 cpl_bivector_delete(spectrum);
485 cpl_bivector_delete(spectrum_err);
486 cpl_array_delete(error);
487 cpl_polynomial_delete(initial);
488 cpl_polynomial_delete(result);
492static void test_cr2res_wave_polys_1d_to_2d(
void)
495 cpl_polynomial ** poly_1ds = cpl_malloc(npolys *
sizeof(cpl_polynomial*));
496 int * orders = cpl_malloc(npolys *
sizeof(
int));
499 cpl_size * power = cpl_malloc(2 *
sizeof(cpl_size));
500 cpl_polynomial * res;
503 for (cpl_size i = 0; i < npolys; i++)
506 poly_1ds[i] = cpl_polynomial_new(1);
508 cpl_polynomial_set_coeff(poly_1ds[i], &coef_pos, i * 10);
510 cpl_polynomial_set_coeff(poly_1ds[i], &coef_pos, 1);
516 cpl_test_eq(2, cpl_polynomial_get_dimension(res));
517 cpl_test_eq(3, cpl_polynomial_get_degree(res));
521 cpl_test_abs(0, cpl_polynomial_get_coeff(res, power), FLT_EPSILON);
525 cpl_test_abs(1, cpl_polynomial_get_coeff(res, power), FLT_EPSILON);
529 cpl_test_abs(10, cpl_polynomial_get_coeff(res, power), FLT_EPSILON);
533 cpl_test_abs(0, cpl_polynomial_get_coeff(res, power), FLT_EPSILON);
537 cpl_test_abs(0, cpl_polynomial_get_coeff(res, power), FLT_EPSILON);
541 cpl_test_abs(0, cpl_polynomial_get_coeff(res, power), FLT_EPSILON);
544 cpl_polynomial_delete(res);
545 for (
size_t i = 0; i < (size_t) npolys; i++)
547 cpl_polynomial_delete(poly_1ds[i]);
554static void test_cr2res_wave_poly_2d_to_1d()
556 cpl_polynomial * poly_2d = cpl_polynomial_new(2);
558 cpl_size * power = cpl_malloc(2 *
sizeof(cpl_size));
560 cpl_polynomial * res;
564 cpl_polynomial_set_coeff(poly_2d, power, 10);
568 cpl_polynomial_set_coeff(poly_2d, power, 1);
572 cpl_polynomial_set_coeff(poly_2d, power, 1);
576 cpl_test_eq(1, cpl_polynomial_get_dimension(res));
578 cpl_test_abs(11, cpl_polynomial_get_coeff(res, &pow_1d), DBL_EPSILON);
580 cpl_test_abs(1, cpl_polynomial_get_coeff(res, &pow_1d), DBL_EPSILON);
582 cpl_polynomial_delete(poly_2d);
583 cpl_polynomial_delete(res);
592static void test_cr2res_wave_estimate_compute(
void)
608 cpl_test_abs(1999.0, cpl_polynomial_get_coeff(res, &power), DBL_EPSILON);
610 cpl_test_abs(1.0, cpl_polynomial_get_coeff(res, &power), DBL_EPSILON);
613 cpl_polynomial_delete(res);
625static void test_cr2res_wave_clean_spectrum(
void)
629 cpl_vector * spec_intens = cpl_vector_new(ncols);
630 cpl_polynomial * wl_poly = cpl_polynomial_new(1);
631 cpl_bivector * catalog = cpl_bivector_new(5);
632 double wl_error = 5.;
634 cpl_vector * res = NULL;
637 for (
int i = 0; i < ncols; i++){
638 cpl_vector_set(spec_intens, i, 1);
642 cpl_vector_set(cpl_bivector_get_x(catalog), 0, 20);
643 cpl_vector_set(cpl_bivector_get_y(catalog), 0, 1);
644 cpl_vector_set(cpl_bivector_get_x(catalog), 1, 23);
645 cpl_vector_set(cpl_bivector_get_y(catalog), 1, 1);
646 cpl_vector_set(cpl_bivector_get_x(catalog), 2, 23.2);
647 cpl_vector_set(cpl_bivector_get_y(catalog), 2, 1);
648 cpl_vector_set(cpl_bivector_get_x(catalog), 3, 23.3);
649 cpl_vector_set(cpl_bivector_get_y(catalog), 3, 1);
650 cpl_vector_set(cpl_bivector_get_x(catalog), 4, 50);
651 cpl_vector_set(cpl_bivector_get_y(catalog), 4, 1);
655 cpl_polynomial_set_coeff(wl_poly, &pow, 1);
657 cpl_test(res = cr2res_wave_clean_spectrum(spec_intens, wl_poly, catalog, wl_error));
659 for (
int i = 0; i < 15 ; i++){
660 cpl_test(isnan(cpl_vector_get(res, i)));
662 for (
int i = 15; i < 29 ; i++){
663 cpl_test_abs(1, cpl_vector_get(res, i), DBL_EPSILON);
665 for (
int i = 29; i < 45 ; i++){
666 cpl_test(isnan(cpl_vector_get(res, i)));
668 for (
int i = 45; i < 56 ; i++){
669 cpl_test_abs(1, cpl_vector_get(res, i), DBL_EPSILON);
671 for (
int i = 56; i < ncols ; i++){
672 cpl_test(isnan(cpl_vector_get(res, i)));
679 cpl_vector_delete(spec_intens);
680 cpl_polynomial_delete(wl_poly);
681 cpl_bivector_delete(catalog);
682 cpl_vector_delete(res);
702static void test_cr2res_wave_etalon_2d(){
703 cpl_bivector ** spectra = NULL;
704 cpl_bivector ** spectra_err = NULL;
705 cpl_polynomial ** wavesol_init = NULL;
706 cpl_array ** wavesol_init_err = NULL;
708 int * traces_nb = NULL;
709 cpl_table * line_diagnostics = NULL;
710 cpl_array * wavelength_error = NULL;
712 cpl_size degree_x = 2;
713 cpl_size degree_y = 2;
714 cpl_polynomial * result = NULL;
720 px = cpl_matrix_new(1, CR2RES_DETECTOR_SIZE);
721 py = cpl_vector_new(CR2RES_DETECTOR_SIZE);
723 spectra = cpl_malloc(ninputs *
sizeof(cpl_bivector*));
724 spectra_err = cpl_malloc(ninputs *
sizeof(cpl_bivector*));
725 wavesol_init = cpl_malloc(ninputs*
sizeof(cpl_polynomial*));
726 wavesol_init_err = cpl_malloc(ninputs *
sizeof(cpl_array*));
727 orders = cpl_malloc(ninputs *
sizeof(
int));
728 traces_nb = cpl_malloc(ninputs *
sizeof(
int));
729 for (cpl_size i = 0; i < ninputs; i++)
733 spectra[i] = cpl_bivector_new(CR2RES_DETECTOR_SIZE);
734 spectra_err[i] = cpl_bivector_new(CR2RES_DETECTOR_SIZE);
735 wavesol_init[i] = cpl_polynomial_new(1);
736 wavesol_init_err[i] = cpl_array_new(2, CPL_TYPE_DOUBLE);
738 for (cpl_size j = 0; j < CR2RES_DETECTOR_SIZE; j++)
740 cpl_vector_set(cpl_bivector_get_y(spectra[i]), j,
741 1 + sin(j * 100 * CPL_MATH_PI / CR2RES_DETECTOR_SIZE));
744 freq = 60 - i * 5 - j * 0.001;
745 wave = SPEED_OF_LIGHT / freq;
746 cpl_matrix_set(px, 0, j, j);
747 cpl_vector_set(py, j, wave);
751 cpl_polynomial_fit(wavesol_init[i], px, NULL, py, NULL, CPL_FALSE, NULL, °ree);
754 cpl_matrix_delete(px);
755 cpl_vector_delete(py);
758 orders, traces_nb, ninputs, degree_x, degree_y, 0, 0,
759 &wavelength_error, &line_diagnostics);
761 cpl_test_nonnull(result);
763 cpl_size degree2d[2];
765 double c00, c01, c10, c11;
768 c00 = cpl_polynomial_get_coeff(result, degree2d);
771 c01 = cpl_polynomial_get_coeff(result, degree2d);
774 c10 = cpl_polynomial_get_coeff(result, degree2d);
777 c11 = cpl_polynomial_get_coeff(result, degree2d);
779 cpl_test_abs(c00 + c01, SPEED_OF_LIGHT / 60, 2);
780 cpl_test_abs(c10, 0.1, 0.05);
781 cpl_test_abs(c11, -0.01, 0.03);
784 for (cpl_size i = 0; i < ninputs; i++)
786 cpl_bivector_delete(spectra[i]);
787 cpl_bivector_delete(spectra_err[i]);
788 cpl_polynomial_delete(wavesol_init[i]);
789 cpl_array_delete(wavesol_init_err[i]);
792 cpl_free(spectra_err);
793 cpl_free(wavesol_init);
794 cpl_free(wavesol_init_err);
798 if (wavelength_error != NULL) cpl_array_delete(wavelength_error);
799 if (line_diagnostics != NULL) cpl_table_delete(line_diagnostics);
800 if (result != NULL) cpl_polynomial_delete(result);
811 cpl_test_init(PACKAGE_BUGREPORT, CPL_MSG_DEBUG);
813 test_cr2res_wave_1d();
816 test_cr2res_wave_polys_1d_to_2d();
817 test_cr2res_wave_poly_2d_to_1d();
818 test_cr2res_wave_estimate_compute();
819 test_cr2res_wave_clean_spectrum();
820 test_cr2res_wave_etalon_2d();
821 return cpl_test_end(0);
cpl_polynomial * cr2res_etalon_wave_2d(cpl_bivector **spectra, cpl_bivector **spectra_err, cpl_polynomial **wavesol_init, cpl_array **wavesol_init_err, int *orders, int *traces_nb, int ninputs, cpl_size degree_x, cpl_size degree_y, int zp_order, int display, cpl_array **wavelength_error, cpl_table **line_diagnostics)
Create the 2d wavecal fit using etalon peaks.
int main(void)
Run the Unit tests.
cpl_polynomial * cr2res_wave_polys_1d_to_2d(cpl_polynomial **poly_1ds, int *orders, int npolys, cpl_size xdegree)
Create a 2D Wavelength Polynomial out of a several 1D ones.
cpl_polynomial * cr2res_wave_poly_2d_to_1d(cpl_polynomial *poly_2d, int order)
Create a 1D Wavelength Polynomial out of a 2D one.
cpl_polynomial * cr2res_wave_2d(cpl_bivector **spectra, cpl_bivector **spectra_err, cpl_polynomial **wavesol_init, cpl_array **wavesol_init_err, int *orders, int *traces_nb, int ninputs, const char *catalog, cpl_size degree, cpl_size degree_y, double threshold, int n_iterations, int zp_order, int display, cpl_array **wavelength_error, cpl_table **lines_diagnostics)
Compute the 2D wavelength polynomial based on a line spectrum and a reference catalog by finding line...
cpl_polynomial * cr2res_wave_1d(cpl_bivector *spectrum, cpl_bivector *spectrum_err, cpl_polynomial *wavesol_init, const cpl_array *wave_error_init, int order, int trace_nb, cr2res_wavecal_type wavecal_type, const char *catalog, int degree, int clean_spectrum, int log_flag, int keep_higher_degrees_flag, int display, double display_wmin, double display_wmax, double *best_xcorr, double *lines_resol_fwhm, double *lines_pos, double *lines_resol, double *lines_intens, cpl_array **wavelength_error, cpl_table **lines_diagnostics)
1D Wavelength Calibration
cpl_polynomial * cr2res_wave_estimate_compute(double wmin, double wmax)
Compute the polynomial from boundaries.
cpl_polynomial * cr2res_wave_etalon(cpl_bivector *spectrum, const cpl_bivector *spectrum_err, cpl_polynomial *wavesol_init, int degree, cpl_array **wavelength_error)
Find solution from etalon.