167 cpl_table * vistable_sc, * wavelenght_sc, * fddl_met;
168 cpl_propertylist *
plist, * vis_FT_p, * vis_SC_p, * wavesc_plist;
170 int wave, nwave_sc, base, nbase = 6, row , nfile, nv;
171 cpl_array * phase_sc_base;
172 const cpl_array * phase_sc,
173 * phase_met1, * phase_met2, * fddl_sc, * fddl_ft;
174 cpl_vector * wave_sc;
175 cpl_bivector * fout, * fref;
176 int tel_1[6] = {0,0,0,1,1,2}, pol = 0;
177 int tel_2[6] = {1,2,3,2,3,3}, size_matrix, size_opd, npol;
178 double pos_sc, pos_ft, pos_mean, ph_sc, opd_sc, opd_met,
180 double time_sc, time_ft, exptime_sc;
181 gsl_matrix * phase_disp;
182 gsl_vector ** opd_disp;
183 char * pol_FT_check[2], * pol_SC_check[2];
222 nfile=cpl_table_get_nrow(fddl_met);
230 for (pol = 0; pol < npol; pol ++){
232 GRAVI_OI_VIS_SC_EXT, pol_SC_check[pol]);
234 GRAVI_OI_WAVELENGTH_SC_EXT, pol_SC_check[pol]);
236 GRAVI_OI_WAVELENGTH_SC_EXT, pol_SC_check[pol]);
237 nwave_sc = gravi_pfits_get_nwave (wavesc_plist);
238 wave_sc = cpl_vector_new(nwave_sc);
252 nfile = cpl_table_get_nrow (vistable_sc) / 6;
257 phase_disp = gsl_matrix_calloc (nfile * 6, 8);
259 opd_disp = cpl_malloc(nwave_sc *
sizeof(gsl_vector *));
260 for (wave = 0; wave < nwave_sc; wave ++){
262 cpl_vector_set (wave_sc, wave,
263 cpl_table_get_float (wavelenght_sc,
"EFF_WAVE", wave, &nv));
264 opd_disp[wave] = gsl_vector_alloc (nfile * 6);
268 cpl_array * met_phase = cpl_array_new(4, CPL_TYPE_DOUBLE);
269 cpl_array_fill_window (met_phase, 0, 4, 0.0);
270 for (row = 0; row < cpl_table_get_nrow(fddl_met); row ++){
271 cpl_array_add (met_phase, cpl_table_get_array(fddl_met,
"PHASE_FC", row));
274 cpl_array_divide_scalar(met_phase, cpl_table_get_nrow(fddl_met));
276 for (base = 0; base < 6; base++){
278 ph_met1 = cpl_array_get_double (met_phase, tel_1[base], &nv);
279 ph_met2 = cpl_array_get_double (met_phase, tel_2[base], &nv);
280 opd_met = (ph_met1 - ph_met2) * 2 * M_PI *
LAMBDA_MET;
288 for (row = 0; row < nfile; row ++){
292 phase_sc = cpl_table_get_array (vistable_sc,
"VISPHI", row * 6 + base);
299 phase_sc_base = cpl_array_duplicate (phase_sc);
301 if (cpl_error_get_code()){
302 cpl_bivector_unwrap_vectors(fout);
303 cpl_bivector_unwrap_vectors(fref);
304 cpl_error_set_message(cpl_func, CPL_ERROR_NULL_INPUT,
305 "Error during the interpolation of phase ft");
310 fddl_sc = cpl_table_get_array (fddl_met,
"FT_POS", row);
311 fddl_ft = cpl_table_get_array (fddl_met,
"SC_POS", row);
312 pos_sc = cpl_array_get_float (fddl_sc, tel_1[base], &nv);
313 pos_ft = cpl_array_get_float (fddl_ft, tel_1[base], &nv);
315 pos_mean = (pos_sc + pos_ft) / 2;
316 gsl_matrix_set (phase_disp, row * nbase + base, tel_1[base], ph_met1);
317 gsl_matrix_set (phase_disp, row * nbase + base, tel_2[base], ph_met2);
318 gsl_matrix_set (phase_disp, row * nbase + base, 4 + tel_1[base], pos_mean);
320 pos_sc = cpl_array_get_float (fddl_sc, tel_2[base], &nv);
321 pos_ft = cpl_array_get_float (fddl_ft, tel_2[base], &nv);
323 pos_mean = (pos_sc + pos_ft) / 2;
325 gsl_matrix_set (phase_disp, row * nbase + base, 4 + tel_2[base], pos_mean);
328 for (wave = 0; wave < nwave_sc; wave++){
329 ph_sc = cpl_array_get_double (phase_sc_base, wave, &nv);
330 opd_sc = ph_sc * cpl_vector_get (wave_sc, wave)/ (2 * M_PI);
334 gsl_vector_set (opd_disp[wave], base + nbase * row,
340 if (cpl_error_get_code()){
341 cpl_bivector_unwrap_vectors(fout);
342 cpl_bivector_unwrap_vectors(fref);
343 cpl_error_set_message(cpl_func, CPL_ERROR_NULL_INPUT,
344 "Error during the construction of the opd vector");
348 cpl_array_delete (phase_sc_base);
353 cpl_vector_unwrap (wave_sc);
354 cpl_array_delete (met_phase);
355 cpl_table * disp_table = cpl_table_new (nwave_sc);
356 cpl_table_new_column_array (disp_table,
"COEFF",
363 gsl_matrix * u = gsl_matrix_calloc (nfile * 6, 8), * V;
366 for (wave = 0; wave < nwave_sc; wave ++){
368 gsl_matrix_memcpy(u, phase_disp);
369 x = gsl_vector_alloc (8);
370 work = gsl_vector_alloc (8);
371 S = gsl_vector_alloc (8);
372 coeff = cpl_array_new (8, CPL_TYPE_DOUBLE);
373 V = gsl_matrix_alloc (8, 8);
375 gsl_linalg_SV_decomp (u, V, S, work);
376 gsl_linalg_SV_solve (u, V, S, opd_disp[wave], x);
378 for (i = 0; i < 8; i ++) {
379 cpl_array_set_double (coeff, i, gsl_vector_get (x, i));
382 cpl_table_set_array (disp_table,
"COEFF", wave, coeff);
384 cpl_array_delete (coeff);
385 gsl_vector_free (opd_disp[wave]);
388 gsl_vector_free (work);
392 gsl_matrix_free (phase_disp);
396 cpl_propertylist * met_plist = cpl_propertylist_duplicate (wavesc_plist);
397 char * name_tb = cpl_sprintf(
"DISP_%s", pol_SC_check[pol]);
398 cpl_propertylist_append_string (met_plist,
"EXTNAME",
401 gravi_data_add (disp_data, met_plist, disp_table);
402 cpl_propertylist_delete (met_plist);
435 cpl_propertylist * primary_hdr, *
plist;
436 cpl_table * spectrum_table, * imaging_detector, *
wave_data_sc,
438 cpl_matrix * all_coord;
439 cpl_array * wavelength;
440 cpl_polynomial * fit2d;
441 cpl_vector * residuals;
444 const cpl_size deg2d[2] = {2, 2};
445 const cpl_size deg1d[1] = {2};
446 cpl_vector * coord_X, * coord_Y, * all_wavelength;
451 int nwave, n_region, region;
456 double minwave = 0, maxwave = 1e10;
457 cpl_image * img_profile, * image_wave, * profile_image;
458 cpl_imagelist * imglist_wave;
459 cpl_table * profile_table;
460 cpl_table * wave_fibre;
461 int sizey, sizex, ind;
464 if (argon_data == NULL){
465 cpl_error_set_message(cpl_func, CPL_ERROR_NULL_INPUT,
"The data is NULL");
472 cpl_image * img_median = cpl_imagelist_collapse_median_create (imglist);
474 cpl_imagelist * imglist_med = cpl_imagelist_new ();
475 cpl_imagelist_set (imglist_med, img_median, 0);
481 dark_map, bad_map, NULL);
484 cpl_msg_info (cpl_func,
"Execution time gravi_extract_spectrum : %f", (end - start) / (
double)CLOCKS_PER_SEC);
490 double line_wave[] = {
510 if ((spectrum_table == NULL) || (imaging_detector == NULL)) {
512 cpl_error_set_message(cpl_func,
513 CPL_ERROR_ILLEGAL_OUTPUT,
"Data must contain SPECTRUM_DATA");
518 double wavestep = cpl_array_get_double (cpl_table_get_array (
wave_data_sc,
"DATA1", 0), 1, &nv) -
519 cpl_array_get_double (cpl_table_get_array (
wave_data_sc,
"DATA1", 0), 0, &nv);
521 cpl_array ** wave_array;
537 nwave = cpl_table_get_column_dimension(spectrum_table,
"DATA1", 1);
538 n_region = cpl_table_get_nrow(imaging_detector);
541 coord_X = cpl_vector_new(n_region * nlines);
542 coord_Y = cpl_vector_new(n_region * nlines);
543 cpl_vector * coord_X_fit = cpl_vector_new(n_region * nlines);
544 all_wavelength = cpl_vector_new(n_region * nlines);
545 cpl_vector * fitsigm = cpl_vector_new(n_region * nlines);
547 cpl_vector_fill (coord_X, -1);
548 cpl_vector_fill (coord_Y, -1);
549 cpl_vector_fill (all_wavelength, -1);
551 int fitwidth, fit_in, comp = 0, list;
556 if (! (strcmp(resolution,
"LOW") && strcmp(resolution,
"MED")) )
563 const cpl_array * argon;
565 for (region = 0; region < n_region; region ++) {
567 data_x = cpl_sprintf(
"DATA%d", region + 1);
568 wave_array = cpl_table_get_data_array (
wave_data_sc, data_x);
569 wave_ = cpl_array_get_data_double (wave_array[0]);
571 for (wave = 0; wave < nwave; wave ++){
572 wave_ [wave] -= wave * wavestep * slope;
575 argon = cpl_table_get_array (spectrum_table, data_x, 0);
580 for (list = 0; list < nlines; list ++) {
582 while (wave_[wave] < line_wave[list]){
589 cpl_error_set_message(cpl_func,
590 CPL_ERROR_ILLEGAL_OUTPUT,
"The argon wavelength does "
591 "not much with the calibration wavelength ");
596 double coord_flux = 0, coord_err = 0;
597 cpl_vector * vector_x=cpl_vector_new(fitwidth*2);
598 cpl_vector * vector_y=cpl_vector_new(fitwidth*2);
600 for (fit_in = wave - fitwidth; fit_in < wave + fitwidth; fit_in ++){
601 cpl_vector_set(vector_x, i, fit_in);
602 cpl_vector_set(vector_y, i, cpl_array_get_double (argon, fit_in, &nv));
604 flux += cpl_array_get_double (argon, fit_in, &nv);
605 coord_flux += fit_in * cpl_array_get_double (argon, fit_in, &nv);
609 cpl_errorstate prestate = cpl_errorstate_get();
610 double x0, sigma, area, offset, mse;
611 cpl_vector_fit_gaussian (vector_x, NULL, vector_y, NULL,
612 CPL_FIT_ALL, &x0, &sigma, &area,
613 &offset, &mse, NULL, NULL);
615 coord_flux = (coord_flux / flux);
616 coord_err = fabs (flux);
619 if (cpl_error_get_code() == CPL_ERROR_CONTINUE){
620 cpl_errorstate_set (prestate);
621 cpl_msg_warning(cpl_func,
"The gaussian fit did not converge while fitting argon line");
630 cpl_vector_set (coord_X, list * n_region + region, x0);
631 cpl_vector_set (coord_Y, list * n_region + region, region + 1);
633 cpl_vector_set (fitsigm, list * n_region + region, sigma);
634 cpl_vector_set (all_wavelength, list * n_region + region, line_wave[list]);
645 cpl_vector * coord_x_list, * fitsigm_list,
646 * coord_y_list, * coord_x_fit = cpl_vector_new (n_region);
648 cpl_matrix * matrix3, * matrix2;
650 gsl_matrix * X = gsl_matrix_alloc (n_region, 3);
651 gsl_matrix * X_bis = gsl_matrix_alloc (n_region, 3);
652 gsl_vector * y = gsl_vector_alloc (n_region);
653 gsl_vector * w = gsl_vector_alloc (n_region);
655 gsl_vector * c = gsl_vector_alloc (3);
656 gsl_matrix * cov = gsl_matrix_alloc (3, 3);
657 double chisq, result_gsl;
660 for (list = 0; list < nlines; list++) {
662 coord_x_list = cpl_vector_extract (coord_X, list * n_region, (list + 1) * n_region - 1, 1);
663 fitsigm_list = cpl_vector_extract (fitsigm, list * n_region, (list + 1) * n_region - 1, 1);
664 coord_y_list = cpl_vector_extract (coord_Y, list * n_region, (list + 1) * n_region - 1, 1);
666 for (i = 0; i < n_region; i++){
667 gsl_matrix_set (X, i, 0, 1.0);
668 gsl_matrix_set (X, i, 1, cpl_vector_get (coord_y_list, i));
669 gsl_matrix_set (X, i, 2, cpl_vector_get (coord_y_list, i) *
670 cpl_vector_get (coord_y_list, i));
672 gsl_vector_set (y, i, cpl_vector_get (coord_x_list, i));
673 gsl_vector_set (w, i, cpl_vector_get (fitsigm_list, i));
676 gsl_matrix_memcpy (X_bis, X);
677 gsl_multifit_linear_workspace * work = gsl_multifit_linear_alloc (n_region, 3);
678 gsl_multifit_wlinear (X_bis, w, y, c, cov,
680 gsl_multifit_linear_free (work);
682 CPLCHECK_NUL(
"Cannot compute the barycneter of all regions");
684 for (region = 0; region < n_region; region ++){
686 result_gsl = gsl_vector_get (c, 0) + gsl_vector_get (c, 1) *
687 gsl_matrix_get (X, region, 1) + gsl_vector_get (c, 2) *
688 gsl_matrix_get (X, region, 2);
689 cpl_vector_set (coord_X_fit, list * n_region + region, result_gsl);
690 cpl_vector_set (coord_x_fit, region, result_gsl);
693 cpl_vector_delete (coord_x_list);
694 cpl_vector_delete (fitsigm_list);
695 cpl_vector_delete (coord_y_list);
699 gsl_matrix_free (cov);
701 gsl_matrix_free (X_bis);
706 cpl_vector_delete (coord_x_fit);
711 fit2d = cpl_polynomial_new(2);
713 matrix3 = cpl_matrix_wrap(1, nlines * n_region, cpl_vector_get_data(coord_X));
714 matrix2 = cpl_matrix_wrap(1, nlines * n_region, cpl_vector_get_data(coord_Y));
716 all_coord = cpl_matrix_duplicate (matrix3) ;
717 cpl_matrix_append(all_coord, matrix2, 1);
720 cpl_polynomial_fit(fit2d, all_coord, NULL, all_wavelength, NULL,
721 CPL_TRUE, NULL, deg2d);
722 residuals = cpl_vector_new(nlines*n_region);
723 cpl_vector_fill_polynomial_fit_residual (residuals, all_wavelength, NULL,
724 fit2d, all_coord, &rechisq );
727 X = gsl_matrix_alloc (n_region*nlines, 6);
728 X_bis = gsl_matrix_alloc (n_region*nlines, 6);
729 y = gsl_vector_alloc (n_region*nlines);
730 w = gsl_vector_alloc (n_region*nlines);
732 c = gsl_vector_alloc (6);
733 cov = gsl_matrix_alloc (6, 6);
735 for (list = 0; list < nlines; list++) {
737 coord_x_list = cpl_vector_extract (coord_X, list * n_region, (list + 1) * n_region - 1, 1);
738 fitsigm_list = cpl_vector_extract (fitsigm, list * n_region, (list + 1) * n_region - 1, 1);
739 coord_y_list = cpl_vector_extract (coord_Y, list * n_region, (list + 1) * n_region - 1, 1);
741 for (i = 0; i < n_region; i++){
742 gsl_matrix_set (X, i+list*n_region, 0, 1.0);
743 gsl_matrix_set (X, i+list*n_region, 1, cpl_vector_get (coord_x_list, i));
744 gsl_matrix_set (X, i+list*n_region, 2, cpl_vector_get (coord_x_list, i) *
745 cpl_vector_get (coord_x_list, i));
746 gsl_matrix_set (X, i+list*n_region, 3, cpl_vector_get (coord_y_list, i));
747 gsl_matrix_set (X, i+list*n_region, 4, cpl_vector_get (coord_y_list, i) *
748 cpl_vector_get (coord_y_list, i));
749 gsl_matrix_set (X, i+list*n_region, 5, cpl_vector_get (coord_x_list, i) *
750 cpl_vector_get (coord_y_list, i));
752 gsl_vector_set (y, i+list*n_region, line_wave[list]);
753 gsl_vector_set (w, i+list*n_region, 1./pow(cpl_vector_get (fitsigm_list, i),2));
757 gsl_multifit_linear_workspace * work = gsl_multifit_linear_alloc (n_region*nlines, 6);
758 gsl_matrix_memcpy (X_bis, X);
759 gsl_multifit_wlinear (X_bis, w, y, c, cov,
761 gsl_vector * r=gsl_vector_alloc (n_region*nlines);
762 gsl_multifit_linear_residuals (X_bis, y, c, r);
763 gsl_multifit_linear_free (work);
765 for (list = 0; list < nlines; list++) {
766 for (i = 0; i < n_region; i++){
773 CPLCHECK_NUL(
"Error in the fit of the wavelength and position");
801 cpl_vector_delete(coord_X_fit);
802 cpl_vector_delete(all_wavelength);
803 cpl_vector_delete(coord_X);
804 cpl_vector_delete(coord_Y);
805 cpl_matrix_delete (all_coord);
806 cpl_matrix_unwrap(matrix2);
807 cpl_matrix_unwrap(matrix3);
808 cpl_vector_delete(residuals);
809 cpl_vector_delete(fitsigm);
815 cpl_array * dimension = cpl_array_new(2, CPL_TYPE_INT);
816 cpl_array_set(dimension, 0, 1);
817 cpl_array_set(dimension, 1, nwave);
820 sizex = cpl_table_get_column_dimension (profile_table,
"DATA1", 0);
821 sizey = cpl_table_get_column_dimension (profile_table,
"DATA1", 1);
822 profile_image = cpl_image_new (sizex, sizey, CPL_TYPE_DOUBLE);
823 cpl_image_fill_window (profile_image, 1, 1, sizex, sizey, 0.0);
824 image_wave = cpl_image_new (sizex, sizey, CPL_TYPE_DOUBLE);
825 cpl_image_fill_window (image_wave, 1, 1, sizex, sizey, 0.0);
827 img_output = cpl_table_new (1);
829 for (region = 0 ; region < n_region; region ++) {
831 data_x = cpl_sprintf(
"DATA%d", region + 1);
833 imglist_wave = gravi_table_data_to_imagelist(profile_table, region + 1);
834 img_profile = cpl_imagelist_get(imglist_wave, 0);
836 cpl_table_new_column_array (img_output, data_x, CPL_TYPE_DOUBLE, nwave);
837 cpl_table_set_column_dimensions(img_output, data_x, dimension);
839 wavelength = cpl_array_new(nwave, CPL_TYPE_DOUBLE);
844 cpl_image_add (profile_image, img_profile);
845 pos = cpl_vector_new(2);
846 for (wave = 0; wave < nwave; wave ++) {
848 cpl_vector_set(pos, 0, wave);
849 cpl_vector_set(pos, 1, region + 1);
850 result=gsl_vector_get (c, 0) +
851 gsl_vector_get (c, 1) * wave +
852 gsl_vector_get (c, 2) * wave*wave +
853 gsl_vector_get (c, 3) * (region+1) +
854 gsl_vector_get (c, 4) * (region+1)*(region+1) +
855 gsl_vector_get (c, 5) * (region+1)*wave;
859 cpl_array_set(wavelength, wave, result);
862 for (ind = 0; ind < sizey; ind ++){
864 if (cpl_image_get (img_profile, wave+1, ind+1, &nv) > 0.01)
865 cpl_image_set (image_wave, wave+1, ind+1, result);
870 cpl_vector_delete(pos);
873 minwave = CPL_MAX (minwave, cpl_array_get_min(wavelength));
874 maxwave = CPL_MIN (maxwave, cpl_array_get_max(wavelength));
876 cpl_table_set_array(img_output, data_x, 0, wavelength);
878 cpl_imagelist_delete (imglist_wave);
879 cpl_array_delete(wavelength);
889 gravi_data_append_header (wave_map,
plist);
891 cpl_propertylist * img_plist;
893 for (ext = 0; ext < nb_ext; ext++ ){
903 if (!(strcmp (plist_name,
"WAVE_FIBRE_SC") &&
906 strcmp (plist_name,
"TEST_WAVE"))){
909 gravi_data_add (wave_map, img_plist,
917 else if (type_ext == 3)
925 cpl_propertylist_append_double (primary_hdr, QC_MINWAVE_SC, minwave);
926 cpl_propertylist_append_double (primary_hdr, QC_MAXWAVE_SC, maxwave);
927 cpl_msg_info (cpl_func,
"QC_MINWAVE_SC = %e QC_MAXWAVE_SC = %e", minwave, maxwave);
933 imglist_wave = cpl_imagelist_new ();
934 cpl_imagelist_set(imglist_wave, image_wave, 0);
935 cpl_imagelist_set(imglist_wave, profile_image, 1);
937 gravi_data_set_cube (wave_map,
"TEST_WAVE", imglist_wave);
939 cpl_polynomial_delete (fit2d);
940 cpl_array_delete (dimension);
949 cpl_propertylist * primary_hdr, *
plist, * wavePlist, * detectorPlist;
950 cpl_table * detector, * waveArgon_table, * waveData_table,
952 cpl_matrix * all_coord;
953 cpl_array * wavelength;
954 cpl_polynomial * fit_slope;
955 cpl_polynomial * fit2d;
956 cpl_vector * residuals;
959 const cpl_size deg2d[2] = {4, 4};
960 cpl_vector * coord_X, * coord_Y, * all_wavelength;
965 int nwave, n_region, region;
971 double minwave, maxwave;
972 cpl_image * image_wave;
973 cpl_imagelist * imglist_wave;
974 int sizey, sizex, ind, npol;
978 char * baseString [6] = {
"12",
"13",
"14",
"23",
"24",
"34"};
979 char * baseString_bis [6] = {
"21",
"31",
"41",
"32",
"42",
"43"};
980 const cpl_size deg = 0, degM = 1;
981 cpl_vector * position;
982 cpl_matrix * matFit2;
985 if ((argon_wave == NULL) || (
wave_data == NULL)){
986 cpl_error_set_message(cpl_func, CPL_ERROR_NULL_INPUT,
991 int nbase = 6, base, type_data;
996 if (strcmp(resolArg, resolWave)){
997 cpl_error_set_message(cpl_func, CPL_ERROR_ILLEGAL_OUTPUT,
998 "The argon file doesn t have the same"
999 "resultion as the input wave");
1011 n_region = cpl_table_get_nrow (detector) ;
1013 npol = (n_region > 24)?2:1;
1021 nwave = cpl_table_get_column_depth(waveArgon_table,
"DATA1");
1022 char * base_fiber = cpl_sprintf(
"BASE_12_%s", pola);
1023 if (nwave!= cpl_table_get_column_depth(waveData_table, base_fiber)){
1024 cpl_error_set_message(cpl_func, CPL_ERROR_ILLEGAL_OUTPUT,
1025 "The argon and the wave data do not have"
1026 " the same number of wavelength");
1033 cpl_image * img_profile = cpl_imagelist_get (imglist, 1);
1034 sizex = cpl_image_get_size_x (img_profile);
1035 sizey = cpl_image_get_size_y (img_profile);
1036 image_wave = cpl_image_new (sizex, sizey, CPL_TYPE_DOUBLE);
1037 cpl_image * image_real = cpl_image_new (sizex, sizey, CPL_TYPE_DOUBLE);
1038 cpl_image_fill_window (image_real, 1, 1, sizex, sizey, 0.0);
1039 matFit2 = cpl_matrix_new (2,n_region*nwave);
1040 all_wavelength = cpl_vector_new (n_region*nwave);
1041 int regionA, regionD, regionC, regionB;
1042 cpl_array * waveToCal;
1044 cpl_table * cooef_table = cpl_table_new (n_region);
1045 cpl_table_new_column(cooef_table,
"SLOPE", CPL_TYPE_DOUBLE);
1046 cpl_table_new_column(cooef_table,
"OFFSET", CPL_TYPE_DOUBLE);
1050 if (cpl_error_get_code ()){
1051 cpl_error_set_message(cpl_func, CPL_ERROR_NULL_INPUT,
"Problem to get "
1052 "the start window detector");
1056 cpl_vector * vect_index = cpl_vector_new (nwave), * vect;
1058 for (i = startx; i < startx + nwave; i++){
1061 cpl_vector_set (vect_index, i - startx, 0);
1065 cpl_vector_set (vect_index, i - startx, 1);
1069 cpl_vector * residual_p = cpl_vector_new(np * n_region),
1070 * residual_q = cpl_vector_new(nq * n_region);
1072 for (region = 0; region < n_region; region ++) {
1169 const char * regname = cpl_table_get_string (detector,
"REGNAME", region);
1170 for (base = 0; base < nbase; base++){
1173 if (strstr(regname, baseString[base]) ||
1174 strstr(regname, baseString_bis[base]))
1179 if (strstr (regname,
POLAR_1))
1185 base_fiber = cpl_sprintf (
"BASE_%s_%s", baseString[base], pola);
1186 data_x = cpl_sprintf (
"DATA%d", region + 1);
1187 wavelength = cpl_array_duplicate (cpl_table_get_array (waveData_table,
1189 waveToCal = cpl_array_duplicate (wavelength);
1190 cpl_array_subtract (wavelength, cpl_table_get_array (waveArgon_table,
1195 cpl_matrix * matrix = cpl_matrix_new (1, nwave);
1196 position = cpl_vector_wrap (nwave, cpl_array_get_data_double(wavelength));
1198 for (ind = 0; ind < nwave; ind++) {
1199 cpl_matrix_set (matFit2,0, region*nwave + ind,
1201 cpl_matrix_set (matFit2,1, region*nwave + ind,
1203 cpl_matrix_set(matrix, 0, ind, ind);
1215 fit_slope = cpl_polynomial_new(1);
1216 cpl_polynomial_fit(fit_slope, matrix, NULL, position, NULL,
1217 CPL_FALSE, °, °M);
1219 vect = cpl_vector_new (nwave);
1220 cpl_vector_fill_polynomial_fit_residual (vect, position, NULL,
1221 fit_slope, matrix, &rechisq );
1222 if (cpl_error_get_code ()){
1223 cpl_error_set_message(cpl_func, CPL_ERROR_NULL_INPUT,
"fit the residual");
1229 for (wave = 0; wave < nwave; wave ++)
1230 if (cpl_vector_get (vect_index, wave) == 0) {
1231 cpl_vector_set (residual_p, ip + np * region ,
1232 cpl_vector_get (vect, wave));
1236 cpl_vector_set (residual_q, iq + nq * region,
1237 cpl_vector_get (vect, wave));
1243 const cpl_size pow_slope = 1;
1244 const cpl_size pow_slope2 = 0;
1245 cpl_msg_info (cpl_func,
"region %s : y = %e * x + %e", regname,
1246 cpl_polynomial_get_coeff(fit_slope,&pow_slope ),
1247 cpl_polynomial_get_coeff(fit_slope,
1250 cpl_table_set_double (cooef_table,
"SLOPE", region,
1251 cpl_polynomial_get_coeff(fit_slope,&pow_slope ));
1252 cpl_table_set_double (cooef_table,
"OFFSET", region,
1253 cpl_polynomial_get_coeff(fit_slope,&pow_slope2 ));
1254 if (cpl_error_get_code()){
1256 cpl_error_set_message(cpl_func, CPL_ERROR_NULL_INPUT,
"fit slope");
1260 pos = cpl_vector_new (1);
1261 for (wave = 0; wave < nwave; wave++){
1262 cpl_vector_set (pos, 0, wave);
1263 cpl_vector_set(all_wavelength, region*nwave + wave,
1264 cpl_array_get_double (waveToCal, wave, &nv) -
1265 cpl_polynomial_eval(fit_slope, pos));
1268 cpl_vector_delete (pos);
1269 cpl_polynomial_delete (fit_slope);
1270 cpl_matrix_delete (matrix);
1271 cpl_vector_unwrap (position);
1272 cpl_array_delete(wavelength);
1273 cpl_array_delete(waveToCal);
1275 cpl_free (base_fiber);
1279 double step = cpl_vector_get_median (residual_p) - cpl_vector_get_median (residual_q);
1285 fit2d = cpl_polynomial_new(2);
1286 cpl_polynomial_fit(fit2d, matFit2, NULL, all_wavelength, NULL,
1287 CPL_TRUE, NULL, deg2d);
1288 cpl_matrix_delete (matFit2);
1290 if (cpl_error_get_code()){
1292 cpl_error_set_message(cpl_func, CPL_ERROR_NULL_INPUT,
"fit 2D");
1300 cpl_array * dimension = cpl_array_new(2, CPL_TYPE_INT);
1301 cpl_array_set(dimension, 0, 1);
1302 cpl_array_set(dimension, 1, nwave);
1304 cpl_image_fill_window (image_wave, 1, 1, sizex, sizey, 0.0);
1307 img_output = cpl_table_new (1);
1309 for (region = 0 ; region < n_region; region ++){
1311 data_x = cpl_sprintf(
"DATA%d", region + 1);
1313 cpl_table_new_column_array (img_output, data_x, CPL_TYPE_DOUBLE, nwave);
1314 cpl_table_set_column_dimensions(img_output, data_x,
1316 const char * regname = cpl_table_get_string (detector,
"REGNAME", region);
1319 for (base = 0; base < nbase; base++){
1322 if (strstr(regname, baseString[base]) ||
1323 strstr(regname, baseString_bis[base]))
1328 cpl_error_set_message(cpl_func, CPL_ERROR_NULL_INPUT,
1333 wavelength = cpl_array_new(nwave, CPL_TYPE_DOUBLE);
1334 cpl_vector *wavelength_vect = cpl_vector_new(nwave);
1339 pos = cpl_vector_new(2);
1340 for (wave = 0; wave < nwave; wave ++){
1343 cpl_vector_set(pos, 0, region + 1);
1344 cpl_vector_set(pos, 1, wave);
1346 result = cpl_polynomial_eval(fit2d, pos);
1348 result = cpl_vector_get (all_wavelength, region*nwave + wave) -
1349 cpl_vector_get (vect_index, wave) * step;
1350 cpl_array_set(wavelength, wave, result);
1351 cpl_vector_set (wavelength_vect, wave, result );
1354 for (ind = 0; ind < sizey; ind ++){
1356 if (cpl_image_get (img_profile, wave+1, ind+1, &nv) > 0.01){
1358 cpl_image_set (image_wave, wave+1, ind+1, result);
1360 cpl_image_set (image_real, wave+1, ind+1,
1362 cpl_vector_get (all_wavelength, region*nwave + wave));
1365 if (cpl_error_get_code()){
1367 cpl_error_set_message(cpl_func, CPL_ERROR_NULL_INPUT,
"The corner and "
1376 cpl_vector_delete(pos);
1382 cpl_matrix * matrix = cpl_matrix_new (1, nwave);
1383 const cpl_size deg_2=2;
1385 for (ind = 0; ind < nwave; ind++) {
1386 cpl_matrix_set(matrix, 0, ind, ind);
1389 fit_slope = cpl_polynomial_new(1);
1390 cpl_polynomial_fit(fit_slope, matrix, NULL, wavelength_vect, NULL,
1391 CPL_FALSE, °, °_2);
1393 pos=cpl_vector_new(1);
1394 for (wave = 0; wave < nwave; wave ++){
1395 cpl_vector_set(pos, 0, wave);
1396 result = cpl_polynomial_eval(fit_slope, pos)-
1397 cpl_vector_get (vect_index, wave) * step;
1398 cpl_array_set(wavelength, wave, result);
1400 cpl_vector_delete(pos);
1401 cpl_polynomial_delete(fit_slope);
1405 minwave = cpl_array_get_min(wavelength);
1406 maxwave = cpl_array_get_max(wavelength);
1410 if (minwave < cpl_array_get_min(wavelength))
1411 minwave = cpl_array_get_min(wavelength);
1414 if (maxwave > cpl_array_get_max(wavelength))
1415 maxwave = cpl_array_get_max(wavelength);
1419 cpl_table_set_array(img_output, data_x, 0, wavelength);
1421 cpl_array_delete(wavelength);
1425 cpl_vector_delete (all_wavelength);
1429 gravi_data_append_header (wave_map,
plist);
1431 cpl_propertylist * img_plist;
1433 for (ext = 0; ext < nb_ext; ext++ ){
1446 strcmp (plist_name,
"TEST_WAVE") &&
1451 gravi_data_add (wave_map, img_plist,
1455 else if (type_ext == 3)
1466 cpl_propertylist_append_string (
plist,
"EXTNAME",
1468 gravi_data_add (wave_map,
plist, cooef_table);
1469 cpl_propertylist_delete (
plist);
1473 cpl_polynomial_delete(fit2d);
1474 cpl_propertylist_append_double (primary_hdr, QC_MINWAVE_SC, minwave);
1475 cpl_propertylist_append_double (primary_hdr, QC_MAXWAVE_SC, maxwave);
1477 cpl_msg_info (cpl_func,
"wave corrected : QC_MINWAVE_SC = %e QC_MAXWAVE_SC = %e",
1482 imglist_wave = cpl_imagelist_new ();
1483 cpl_imagelist_set(imglist_wave,image_wave , 0);
1484 cpl_imagelist_set(imglist_wave, cpl_image_duplicate (img_profile), 1);
1485 cpl_imagelist_set(imglist_wave, image_real, 2);
1486 gravi_data_set_cube (wave_map,
"TEST_WAVE", imglist_wave);
1488 cpl_array_delete (dimension);
2255 cpl_table * phase_sc,
2256 cpl_table * phase_ft,
2259 int ind_sc, nrow, row, nbase = 6, base;
2260 double exptime, exptime_sc, opl, time_sc, time_ft, time_metrology;
2261 int nv, comp, nrow_met, nrow_sc;
2262 int tel_1[6] = {0,0,0,1,1,2};
2263 int tel_2[6] = {1,2,3,2,3,3};
2264 const cpl_array * time_array_ft, * time_array_sc;
2267 cpl_ensure (opl_table, CPL_ERROR_NULL_INPUT, NULL);
2268 cpl_ensure (phase_sc, CPL_ERROR_NULL_INPUT, NULL);
2269 cpl_ensure (phase_ft, CPL_ERROR_NULL_INPUT, NULL);
2272 time_array_ft = cpl_table_get_array (phase_ft,
"TIME", 0);
2273 time_array_sc = cpl_table_get_array (phase_sc,
"TIME", 0);
2274 nrow = cpl_array_get_size (time_array_ft);
2275 nrow_sc = cpl_array_get_size (time_array_sc);
2276 nrow_met = cpl_table_get_nrow (opl_table);
2281 gsl_matrix * A_data = gsl_matrix_calloc (nbase * nrow, 8), * A;
2283 gsl_vector * bis_data = gsl_vector_alloc (nbase * nrow), * bis;
2284 gsl_matrix * X = gsl_matrix_alloc (8, 8),
2285 * V = gsl_matrix_alloc (8, 8);
2286 gsl_vector * S = gsl_vector_alloc (8);
2287 gsl_vector * work = gsl_vector_alloc (8), * x = gsl_vector_alloc (8);
2291 exptime = cpl_array_get_int (time_array_ft, 1, &nv) -
2292 cpl_array_get_int (time_array_ft, 0, &nv);
2293 exptime_sc = cpl_array_get_int (time_array_sc, 1, &nv) -
2294 cpl_array_get_int (time_array_sc, 0, &nv);
2302 for (base = 0; base < nbase; base ++){
2305 const cpl_array * ft_array = cpl_table_get_array (phase_ft,
"PHASE", base);
2306 const cpl_array * sc_array = cpl_table_get_array (phase_sc,
"PHASE", base);
2307 char * opl1 = cpl_sprintf(
"OPL%d", tel_1[base]+1);
2308 char * opl2 = cpl_sprintf(
"OPL%d", tel_2[base]+1);
2311 cpl_array * temp = cpl_array_wrap_double (
2312 cpl_table_get_data_double (opl_table, opl1), nrow_met);
2313 cpl_array * opl_met1 = cpl_array_duplicate (temp);
2314 cpl_array_unwrap (temp);
2315 cpl_array * opl_met2 = cpl_array_wrap_double (
2316 cpl_table_get_data_double (opl_table, opl2), nrow_met);
2317 cpl_array_subtract (opl_met1, opl_met2);
2323 for (row = 0; row < nrow; row ++){
2325 gsl_matrix_set (A_data, base * nrow + row, 6,
2326 - cpl_array_get_double (ft_array, row, &nv));
2329 time_ft = cpl_array_get_int (time_array_ft, row, &nv);
2330 if (ind_sc < cpl_array_get_size (sc_array)){
2331 time_sc = cpl_array_get_int (time_array_sc, ind_sc, &nv);
2336 while(time_ft > (time_sc+exptime_sc/2.)){
2338 if (ind_sc < cpl_array_get_size (sc_array))
2339 time_sc = cpl_array_get_int (time_array_sc, ind_sc, &nv);
2348 if(ind_sc < nrow_sc) {
2349 phi_sc=cpl_array_get_double (sc_array, ind_sc, &nv);
2352 phi_sc=cpl_array_get_double (sc_array, nrow_sc - 1, &nv);
2356 phi_sc = cpl_array_get_double (sc_array, 0, &nv);
2360 gsl_matrix_set (A_data, base * nrow + row, 7, phi_sc);
2361 gsl_matrix_set (A_data, base * nrow + row, base, 1.0);
2369 time_metrology = cpl_table_get_int (opl_table,
"TIME", im, &nv);
2371 while ((time_metrology < (time_ft + exptime))){
2373 if (im < nrow_met) {
2374 opl += cpl_array_get_double (opl_met1, im, &nv);
2379 if (im < nrow_met) {
2380 time_metrology = cpl_table_get_int (opl_table,
"TIME", im, &nv);
2391 gsl_vector_set (bis_data, base * nrow + row, opl/comp);
2397 opl = (cpl_array_get_double (opl_met1, im, &nv) -
2398 cpl_array_get_double (opl_met1, im - 1, &nv)) * (time_ft -
2399 cpl_table_get_int (opl_table,
"TIME", im - 1, &nv))
2401 cpl_table_get_int (opl_table,
"TIME", im - 1, &nv)) +
2402 cpl_array_get_double (opl_met1, im - 1, &nv);
2404 gsl_vector_set (bis_data, base * nrow + row, opl);
2407 gsl_vector_set (bis_data, base * nrow + row,
2408 cpl_array_get_double (opl_met1, nrow_met - 1, &nv));
2412 gsl_vector_set (bis_data, base * nrow + row,
2413 cpl_array_get_double (opl_met1, 0, &nv));
2419 cpl_array_delete (opl_met1);
2420 cpl_array_unwrap (opl_met2);
2429 long n_row_A=nrow_sc*(int)(dit_sc/exptime+1);
2430 cpl_vector *i_A_vector = cpl_vector_new(n_row_A);
2433 int t0_sc=cpl_array_get_int (time_array_sc, 0, &nv);
2434 int tend_sc=cpl_array_get_int (time_array_sc, nrow_sc-1, &nv);
2437 for (row=0; row<nrow; row++){
2438 time_ft = cpl_array_get_int (time_array_ft, row, &nv);
2439 if ((time_ft >= t0_sc-dit_sc/2) && (time_ft < tend_sc+dit_sc/2)){
2440 time_mod=((int)(time_ft-(t0_sc-dit_sc/2)) % (int)exptime_sc);
2441 if ( time_mod >= 0 && time_mod < dit_sc ) {
2442 cpl_vector_set (i_A_vector, i_A, row);
2450 A = gsl_matrix_alloc (nbase * n_row_A, 8);
2451 bis = gsl_vector_alloc (nbase * n_row_A);
2452 cpl_vector *time_A = cpl_vector_new(n_row_A);
2455 for (base = 0; base < nbase; base ++)
2456 for (i_A = 0; i_A < n_row_A; i_A++){
2457 row = cpl_vector_get(i_A_vector, i_A);
2458 for (col = 0; col < 8; col ++)
2459 gsl_matrix_set (A, base * n_row_A + i_A, col, gsl_matrix_get (A_data, base * nrow + row, col));
2461 gsl_vector_set (bis, base * n_row_A + i_A, gsl_vector_get (bis_data, base * nrow + row));
2463 cpl_vector_set (time_A, i_A, cpl_array_get_int (time_array_ft, row, &nv));
2466 cpl_vector_delete(i_A_vector);
2472 U = gsl_matrix_alloc (nbase * nrow, 8);
2473 gsl_matrix_memcpy (U, A);
2476 gsl_linalg_SV_decomp (U, V, S, work);
2477 gsl_linalg_SV_solve (U, V, S, bis, x);
2478 cpl_vector * opd_coeff = cpl_vector_new (2);
2479 cpl_vector_set (opd_coeff, 0, gsl_vector_get (x, 7));
2480 cpl_vector_set (opd_coeff, 1, gsl_vector_get (x, 6));
2482 cpl_msg_debug(cpl_func,
"Wavelength base %d => SC = %g, FT = %g\n",
2483 base, -cpl_vector_get(opd_coeff,0)*2*M_PI, cpl_vector_get(opd_coeff,1)*2*M_PI);
2486 if (PLOT_MET_PHASE_FIT)
2490 cpl_errorstate prestate = cpl_errorstate_get();
2491 gsl_matrix_memcpy (U, A);
2493 const cpl_vector ** vectors=malloc(3 *
sizeof(cpl_vector*));
2495 cpl_vector *vect_phase_sc_ft=cpl_vector_new(nrow*nbase);
2496 cpl_vector *vect_dopd_met=cpl_vector_new(nrow*nbase);
2497 cpl_vector *vect_diff=cpl_vector_new(nrow*nbase);
2498 for (row = 0; row < nrow*nbase; row ++){
2499 cpl_vector_set(vect_dopd_met, row, gsl_vector_get (bis, row));
2500 cpl_vector_set(vect_phase_sc_ft, row, gsl_matrix_get (A, row, 0)*gsl_vector_get (x, 0)+
2501 gsl_matrix_get (A, row, 1)*gsl_vector_get (x, 1)+
2502 gsl_matrix_get (A, row, 2)*gsl_vector_get (x, 2)+
2503 gsl_matrix_get (A, row, 3)*gsl_vector_get (x, 3)+
2504 gsl_matrix_get (A, row, 4)*gsl_vector_get (x, 4)+
2505 gsl_matrix_get (A, row, 5)*gsl_vector_get (x, 5)+
2506 gsl_matrix_get (A, row, 6)*gsl_vector_get (x, 6)+
2507 gsl_matrix_get (A, row, 7)*gsl_vector_get (x, 7));
2508 cpl_vector_set(vect_diff, row, cpl_vector_get(vect_dopd_met, row)-cpl_vector_get(vect_phase_sc_ft, row));
2511 vectors[1]=vect_phase_sc_ft;
2512 vectors[2]=vect_dopd_met;
2514 cpl_plot_vectors (cpl_sprintf(
"set title 'Met fit case %d a=%g b=%g'; set xlabel 'time[10-6s]'; set ylabel 'Phase_ft+Phase_sc, dopd_met';", base+1, gsl_vector_get (x, 0), gsl_vector_get (x, 1)),
2515 "",
"", vectors, 3);
2516 cpl_plot_vector(cpl_sprintf(
"set title 'Met fit case %d a=%g b=%g'; set xlabel 'time[10-6s]'; set ylabel 'Phase_ft+Phase_sc-dopd_met';", base+1, gsl_vector_get (x, 0), gsl_vector_get (x, 1)),
2518 cpl_vector_delete(vect_phase_sc_ft);
2519 cpl_vector_delete(vect_dopd_met);
2520 cpl_vector_delete(vect_diff);
2522 cpl_errorstate_set (prestate);
2525 gsl_matrix_free (A);
2526 gsl_matrix_free (A_data);
2527 gsl_matrix_free (U);
2528 gsl_matrix_free (V);
2529 gsl_vector_free (x);
2530 gsl_vector_free (bis);
2531 gsl_vector_free (bis_data);
2532 cpl_vector_delete(time_A);
2533 gsl_matrix_free (X);
2534 gsl_vector_free (S);
2535 gsl_vector_free (work);
2563 cpl_table * opl_table,
2567 cpl_ensure (metrology_table, CPL_ERROR_NULL_INPUT, NULL);
2568 cpl_ensure (opl_table, CPL_ERROR_NULL_INPUT, NULL);
2570 cpl_table * p2vm_met;
2573 cpl_vector * vectA, * vectB,
2574 * phase, * y_sigma, * init_val;
2576 cpl_array * temp, * coherence_fit, * phase_fit;
2577 const cpl_array * volt0;
2578 cpl_matrix * opd_matrix;
2579 int tel, infos = 0, n_tel;
2581 int val_to_fit2[] = {1,1,1,0}, nv;
2582 double mse, red_chisq;
2590 nb_row = cpl_table_get_nrow (opl_table);
2591 for (tel = 0; tel < 4; tel ++){
2592 opl = cpl_sprintf(
"OPL%d", tel + 1);
2593 cpl_table_new_column (opl_table, opl, CPL_TYPE_DOUBLE);
2598 volt0 = cpl_table_get_array (metrology_table,
"VOLT", 0);
2601 n_tel = cpl_array_get_size (volt0);
2606 int start_tel = n_tel/2 - 8;
2607 p2vm_met = cpl_table_new (n_tel / 2 - start_tel);
2608 cpl_table_new_column_array (p2vm_met,
"TRANSMISSION", CPL_TYPE_DOUBLE, 2);
2609 cpl_table_new_column_array (p2vm_met,
"COHERENCE", CPL_TYPE_DOUBLE, 2);
2610 cpl_table_new_column_array (p2vm_met,
"PHASE", CPL_TYPE_DOUBLE, 2);
2613 cpl_table_new_column (opl_table,
"TIME", CPL_TYPE_INT);
2615 if (cpl_error_get_code()){
2617 printf(
"error %f %s and %s \n", 1.0, cpl_error_get_message(), cpl_error_get_where());
2622 for (tel = n_tel/2 - 8; tel < n_tel/2; tel++){
2624 vectA = cpl_vector_new (nb_row);
2625 vectB = cpl_vector_new (nb_row);
2630 for (row = 0; row < nb_row; row ++){
2631 temp = cpl_array_duplicate (cpl_table_get_array (metrology_table,
2633 volt = cpl_array_cast (temp, CPL_TYPE_DOUBLE);
2634 cpl_array_delete (temp);
2635 cpl_vector_set (vectA, row, cpl_array_get_double (volt, 2*tel, &nv));
2636 cpl_vector_set (vectB, row, cpl_array_get_double (volt, 2*tel + 1, &nv));
2638 cpl_array_delete (volt);
2644 phase = gravi_vectors_phase_create (vectA, vectB);
2646 if (PLOT_MET_ELLIPSE)
2648 if (POSTSCRIPT_PLOT) ps_string=cpl_sprintf(
"set term png; set output 'plot_met_ellipse_T%d.png';", tel);
2649 else ps_string=cpl_sprintf(
" ");
2650 plot = cpl_bivector_wrap_vectors (vectA, vectB);
2651 cpl_plot_bivector (cpl_sprintf(
"set title 'Met ellipse Tel %d'; set xlabel 'C-A'; set ylabel 'D-B';", tel+1),
2654 if (POSTSCRIPT_PLOT) ps_string=cpl_sprintf(
"set term png; set output 'plot_met_phase_T%d.png';", tel);
2655 else ps_string=cpl_sprintf(
" ");
2656 cpl_plot_vector (cpl_sprintf(
"set title 'Met phase Tel %d'; set xlabel 'index'; set ylabel 'Phase';", tel+1),
2659 cpl_free(ps_string);
2663 if (cpl_error_get_code()){
2664 printf(
"error %f %s and %s \n", 4.0, cpl_error_get_message(), cpl_error_get_where());
2670 opd_matrix = cpl_matrix_new(nb_row, 1);
2672 for (i = 0; i < nb_row; i++){
2674 cpl_matrix_set(opd_matrix, i, 0,
2675 cpl_vector_get(phase, i) *
LAMBDA_MET/(2*M_PI));
2676 if (tel >= n_tel/2 - 8){
2678 if (tel < n_tel/2 - 4){
2679 opl = cpl_sprintf(
"OPL%d", tel - (n_tel/2 - 8) + 1);
2680 cpl_table_set_double (opl_table, opl, i,
2681 cpl_vector_get (phase, i) *
LAMBDA_MET/(2*M_PI));
2685 opl = cpl_sprintf(
"OPL%d", tel - (n_tel/2 - 4) + 1);
2686 double opl_ft = cpl_table_get_double (opl_table, opl, i, &nv);
2687 cpl_table_set_double (opl_table, opl, i, (cpl_vector_get (phase, i) *
LAMBDA_MET/(2*M_PI))- opl_ft);
2691 if (tel == n_tel/2 - 4)
2692 cpl_table_set_int (opl_table,
"TIME", i,
2693 cpl_table_get_int (metrology_table,
"TIME",
2696 if (cpl_error_get_code()){
2697 printf(
"error %f %s and %s \n", 5.0, cpl_error_get_message(), cpl_error_get_where());
2703 cpl_vector_delete(phase);
2709 vect = cpl_malloc(2*
sizeof(cpl_vector*));
2712 phase_fit = cpl_array_new(2, CPL_TYPE_DOUBLE);
2713 coherence_fit = cpl_array_new(2, CPL_TYPE_DOUBLE);
2714 trans = cpl_array_new(2, CPL_TYPE_DOUBLE);
2716 for (i = 0; i < 2; i++){
2722 y_sigma = cpl_vector_new(nb_row);
2723 cpl_vector_fill(y_sigma, 1);
2728 init_val = cpl_vector_new(4);
2729 cpl_vector_set(init_val, 0, 1);
2730 cpl_vector_set(init_val, 1, 1);
2731 cpl_vector_set(init_val, 2, 1);
2734 cpl_errorstate prestate = cpl_errorstate_get();
2735 cpl_fit_lvmq(opd_matrix, NULL, vect[i],
2737 &
dfda_sin, CPL_FIT_LVMQ_TOLERANCE, CPL_FIT_LVMQ_COUNT,
2738 CPL_FIT_LVMQ_MAXITER, &mse, &red_chisq, NULL);
2740 if (cpl_error_get_code()){
2741 printf(
"error %f %s and %s \n", 6.0, cpl_error_get_message(), cpl_error_get_where());
2745 if (!strcmp(
"The iterative process did not converge",
2746 cpl_error_get_message())){
2749 "did not converge");
2750 cpl_errorstate_set (prestate);
2754 "%g chi2 %g", tel, mse, red_chisq);
2759 cpl_array_set_double (coherence_fit, i,
2760 sqrt( pow( cpl_vector_get(init_val, 2), 2) +
2761 pow( cpl_vector_get(init_val, 1), 2)));
2763 cpl_array_set_double (phase_fit, i, atan2( cpl_vector_get(init_val, 2),
2764 cpl_vector_get(init_val, 1)));
2766 cpl_array_set_double (trans, i, cpl_vector_get(init_val, 0));
2768 if (cpl_error_get_code()){
2769 printf(
"error %f %s and %s \n", 7.0, cpl_error_get_message(), cpl_error_get_where());
2773 cpl_vector_delete(init_val);
2774 cpl_vector_delete(y_sigma);
2775 cpl_vector_delete (vect[i]);
2779 cpl_matrix_delete(opd_matrix);
2781 cpl_table_set_array (p2vm_met,
"COHERENCE", tel - start_tel, coherence_fit);
2782 cpl_array_subtract_scalar (phase_fit,
2783 cpl_array_get_double (phase_fit, 0, &nv));
2784 cpl_table_set_array (p2vm_met,
"PHASE", tel - start_tel, phase_fit);
2785 cpl_table_set_array (p2vm_met,
"TRANSMISSION", tel - start_tel, trans);
2787 cpl_array_delete (trans);
2788 cpl_array_delete (coherence_fit);
2789 cpl_array_delete (phase_fit);
2817 cpl_table * visMet_data, * fddl_data, * spectrum_sc;
2818 cpl_propertylist * primary_hdr;
2819 int nbrow_met, row, nbrow_sc;
2821 cpl_table * fddl_met_mean;
2824 cpl_ensure_code (oi_vis, CPL_ERROR_NULL_INPUT);
2825 cpl_ensure_code (p2vmred_data, CPL_ERROR_NULL_INPUT);
2826 cpl_ensure_code (preproc_data, CPL_ERROR_NULL_INPUT);
2827 cpl_ensure_code (thread>=0, CPL_ERROR_ILLEGAL_INPUT);
2834 fddl_met_mean = cpl_table_new (1);
2835 cpl_table_new_column_array (fddl_met_mean,
"FT_POS", CPL_TYPE_DOUBLE, 4);
2836 cpl_table_new_column_array (fddl_met_mean,
"SC_POS", CPL_TYPE_DOUBLE, 4);
2837 cpl_table_new_column_array (fddl_met_mean,
"PHASE_FC", CPL_TYPE_DOUBLE, 4);
2838 cpl_table_new_column (fddl_met_mean,
"TIME", CPL_TYPE_INT);
2849 nbrow_met = cpl_table_get_nrow (visMet_data);
2850 nbrow_sc = cpl_table_get_nrow (spectrum_sc);
2854 int * time = cpl_table_get_data_int (visMet_data,
"TIME");
2855 int exptime_sc = cpl_table_get_int (spectrum_sc,
"TIME", 1, &nv) -
2856 cpl_table_get_int (spectrum_sc,
"TIME", 0, &nv);
2857 cpl_array ** met_arrays = cpl_table_get_data_array (visMet_data,
"PHASE_FC");
2858 cpl_array * met_mean = cpl_array_new (4, CPL_TYPE_DOUBLE);
2859 cpl_array_fill_window (met_mean, 0, 4, 0.0);
2867 for (row = 0; row < nbrow_met; row ++){
2869 if ((time[row] > cpl_table_get_int (spectrum_sc,
"TIME", 0, &nv) - exptime_sc/2) &&
2870 (time[row] < cpl_table_get_int (spectrum_sc,
"TIME", nbrow_sc-1, &nv) + exptime_sc/2)){
2871 cpl_array_add (met_mean, met_arrays[row]);
2878 cpl_array_divide_scalar (met_mean, comp);
2884 cpl_table_set_array (fddl_met_mean,
"PHASE_FC", 0, met_mean);
2885 cpl_table_set_int (fddl_met_mean,
"TIME", 0,
2886 cpl_table_get_int (spectrum_sc,
"TIME", 0, &nv) );
2887 cpl_array_delete (met_mean);
2889 int nbrow_fddl = cpl_table_get_nrow (fddl_data);
2895 cpl_array ** fddl_ft = cpl_table_get_data_array (fddl_data,
"FT_POS");
2896 cpl_array ** fddl_sc = cpl_table_get_data_array (fddl_data,
"SC_POS");
2897 time = cpl_table_get_data_int (fddl_data,
"TIME");
2898 cpl_array * ft_pos = cpl_array_new (4, CPL_TYPE_DOUBLE);
2899 cpl_array * sc_pos = cpl_array_new (4, CPL_TYPE_DOUBLE);
2900 cpl_array_fill_window (ft_pos, 0, 4, 0.0);
2901 cpl_array_fill_window (sc_pos, 0, 4, 0.0);
2904 for (row = 0; row < nbrow_fddl; row ++){
2906 if ((time[row] > cpl_table_get_int (spectrum_sc,
"TIME", 0, &nv) - exptime_sc/2) &&
2907 (time[row] < cpl_table_get_int (spectrum_sc,
"TIME", nbrow_sc-1, &nv) + exptime_sc/2)){
2908 cpl_array_add (ft_pos, fddl_ft[row]);
2909 cpl_array_add (sc_pos, fddl_sc[row]);
2913 CPLCHECK_MSG (
"Problem during the compute of the mean of the fddl");
2917 cpl_array_divide_scalar (ft_pos, comp);
2918 cpl_array_divide_scalar (sc_pos, comp);
2924 cpl_table_set_array (fddl_met_mean,
"FT_POS", 0, ft_pos);
2925 cpl_table_set_array (fddl_met_mean,
"SC_POS", 0, sc_pos);
2926 cpl_array_delete (ft_pos);
2927 cpl_array_delete (sc_pos);
2930 cpl_propertylist * plist_img = cpl_propertylist_duplicate (
2932 cpl_propertylist_set_string (plist_img,
"EXTNAME",
"FDDL_MET_MEAN");
2933 gravi_data_add (oi_vis, plist_img, fddl_met_mean);
2934 cpl_propertylist_delete (plist_img);
2939 cpl_table_delete (fddl_met_mean);
2942 return CPL_ERROR_NONE;
3007 int ntel = 4, nbase = 6, npol = 2;
3009 gsl_matrix * U, * V;
3010 gsl_vector * S, * work;
3013 cpl_ensure (vis_data, CPL_ERROR_NULL_INPUT, NULL);
3020 double M_tab[24]={ 1., -1., 0.0, 0.0,
3026 gsl_matrix * M_matrix=gsl_matrix_alloc(6,4);
3027 memcpy(gsl_matrix_ptr(M_matrix, 0, 0), M_tab, 24*
sizeof(
double));
3030 gsl_matrix * M_matrix2=gsl_matrix_alloc(6,8);
3031 gsl_vector * M_vector=gsl_vector_alloc(6);
3032 for (
int tel=0; tel<
ntel; tel++){
3033 gsl_matrix_get_col(M_vector, M_matrix, tel);
3034 gsl_matrix_set_col(M_matrix2, tel, M_vector);
3035 gsl_vector_scale(M_vector, -1.);
3036 gsl_matrix_set_col(M_matrix2, tel+
ntel, M_vector);
3038 gsl_vector_free(M_vector);
3041 file = fopen(
"M_matrix2.txt",
"w");
3048 U = gsl_matrix_alloc (8, 6);
3049 V = gsl_matrix_alloc (6, 6);
3050 S = gsl_vector_alloc (6);
3051 work = gsl_vector_alloc (6);
3053 gsl_matrix_transpose_memcpy(U, M_matrix2);
3054 gsl_linalg_SV_decomp (U, V, S, work);
3059 gsl_matrix * M_matrix2_inv = gsl_matrix_alloc(
ntel*2, nbase);
3060 for (
int j = 0; j <
ntel*2; j++) {
3061 for (
int i = 0; i < nbase; i++){
3063 for (
int ii = 0; ii < nbase; ii++){
3064 if( gsl_vector_get(S, ii) > 1e-14)
3065 wv_at += gsl_matrix_get(V, i, ii) / gsl_vector_get(S, ii) *
3066 gsl_matrix_get(U, j, ii);
3068 gsl_matrix_set(M_matrix2_inv, j, i, wv_at);
3072 gsl_matrix_free (V);
3073 gsl_matrix_free (U);
3074 gsl_vector_free (S);
3075 gsl_vector_free (work);
3080 file = fopen(
"M_matrix2_inv.txt",
"w");
3092 cpl_error_set_message (cpl_func, CPL_ERROR_ILLEGAL_INPUT,
3093 "Missing OI_VIS (need split pol for SC and FT)");
3104 cpl_msg_info (cpl_func,
"*** 1 ) Compute the real FDDL position from their positions and Metrology ***");
3107 cpl_table * oi_flux;
3109 cpl_size nrow = cpl_table_get_nrow (oi_flux) / 4;
3114 gsl_matrix * fddl = gsl_matrix_alloc (nrow,
ntel*2);
3115 gsl_matrix * fddl2 = gsl_matrix_alloc (nrow,
ntel*2);
3117 for (cpl_size row=0; row<nrow; row++) {
3118 for (
int tel = 0; tel<
ntel; tel++) {
3120 value = cpl_table_get (oi_flux,
"SC_POS", row*
ntel + tel, NULL);
3121 gsl_matrix_set (fddl, row,tel,value);
3122 gsl_matrix_set (fddl2,row,tel,value*value);
3124 value = cpl_table_get (oi_flux,
"FT_POS", row*
ntel + tel, NULL);
3125 gsl_matrix_set (fddl, row,
ntel+tel,value);
3126 gsl_matrix_set (fddl2,row,
ntel+tel,value*value);
3131 gsl_matrix_scale (fddl, 1e-3);
3132 gsl_matrix_scale (fddl, 1e-6);
3135 file = fopen(
"FDDL_matrix.txt",
"w");
3143 gsl_matrix * met_data = gsl_matrix_alloc (nrow, 4);
3145 for (cpl_size row=0; row<nrow; row++) {
3146 for (
int tel = 0; tel<
ntel; tel++) {
3147 double value = cpl_table_get (oi_flux,
"OPD_MET_FC", row*
ntel + tel, NULL);
3148 gsl_matrix_set (met_data,row,tel,value);
3153 gsl_matrix_scale (met_data, 1e6);
3156 file = fopen(
"MET_data.txt",
"w");
3163 gsl_matrix * MET = gsl_matrix_alloc(nrow, nbase);
3164 gsl_blas_dgemm (CblasNoTrans, CblasTrans, 1., met_data, M_matrix, 0, MET);
3167 file = fopen(
"MET.txt",
"w");
3173 cpl_msg_info(cpl_func,
"Compute the FDDL linearity factors");
3175 gsl_matrix * model = gsl_matrix_calloc( nrow*nbase, Nmodel);
3176 for (cpl_size row=0; row<nrow; row++){
3177 for (
int base=0; base<nbase; base++){
3178 gsl_matrix_set(model, row*nbase+base, base, 1);
3179 for (
int tel=0; tel<
ntel*2; tel++) {
3180 gsl_matrix_set(model, row*nbase+base, nbase+tel,
3181 gsl_matrix_get(fddl, row, tel) * gsl_matrix_get(M_matrix2, base, tel));
3182 gsl_matrix_set(model, row*nbase+base, nbase+8+tel,
3183 gsl_matrix_get(fddl2, row, tel) * gsl_matrix_get(M_matrix2, base, tel));
3189 file = fopen(
"model.txt",
"w");
3195 U = gsl_matrix_alloc (nrow*nbase, Nmodel);
3196 V = gsl_matrix_alloc (Nmodel, Nmodel);
3197 S = gsl_vector_alloc (Nmodel);
3198 work = gsl_vector_alloc (Nmodel);
3199 gsl_matrix_memcpy(U, model);
3201 gsl_linalg_SV_decomp (U, V, S, work);
3203 gsl_vector * K_coeff = gsl_vector_alloc (Nmodel);
3204 gsl_vector * MET_vector = gsl_vector_alloc(nrow*nbase);
3205 memcpy (MET_vector->data, MET->data, nbase*nrow*
sizeof(
double));
3206 gsl_linalg_SV_solve (U, V, S, MET_vector, K_coeff);
3211 gsl_vector_free(work);
3212 gsl_vector_free(MET_vector);
3214 cpl_msg_info(cpl_func,
"Compute the real FDDL positions");
3215 gsl_matrix * FDDL_matrix=gsl_matrix_alloc(nrow, 8);
3216 for (cpl_size row=0; row<nrow; row++){
3217 for (
int tel=0; tel<8; tel++){
3218 gsl_matrix_set(FDDL_matrix, row, tel,
3219 gsl_vector_get(K_coeff, tel+6)*gsl_matrix_get(fddl, row, tel) +
3220 gsl_vector_get(K_coeff, tel+6+8)*gsl_matrix_get(fddl2, row, tel));
3225 for (cpl_size row=0; row<nrow; row++){
3226 for (
int base=0; base<nbase; base++){
3227 gsl_matrix_set(MET, row, base, gsl_matrix_get(MET, row, base)
3228 - gsl_matrix_get(model, row*nbase+base, base)
3229 * gsl_vector_get(K_coeff, base));
3239 gsl_matrix * FDDLdotM = gsl_matrix_alloc(nrow, nbase);
3240 gsl_matrix * METsub = gsl_matrix_alloc(nrow, nbase);
3241 gsl_matrix * FDDLcorrection = gsl_matrix_alloc(nrow,
ntel*2);
3243 memcpy (METsub->data, MET->data, nbase*nrow*
sizeof(
double));
3244 gsl_blas_dgemm(CblasNoTrans, CblasTrans, 1., FDDL_matrix, M_matrix2, 0, FDDLdotM);
3245 gsl_matrix_sub(METsub, FDDLdotM);
3247 gsl_blas_dgemm(CblasNoTrans, CblasTrans, 1., METsub, M_matrix2_inv, 0, FDDLcorrection);
3248 gsl_matrix_add(FDDL_matrix, FDDLcorrection);
3250 gsl_matrix_free(FDDLdotM);
3251 gsl_matrix_free(METsub);
3252 gsl_matrix_free(FDDLcorrection);
3256 file = fopen(
"MET.txt",
"w");
3259 file = fopen(
"coeff.txt",
"w");
3260 for (
int Imodel=0; Imodel<Nmodel;Imodel++) fprintf(file,
"%e \n", gsl_vector_get(K_coeff, Imodel));
3262 file = fopen(
"FDDL_matrix.txt",
"w");
3273 cpl_msg_info(cpl_func,
"*** 2 ) Compute the Phases ***");
3279 cpl_size nwave = cpl_table_get_nrow(oi_wavelength);
3280 cpl_array * wavenumber = cpl_array_new(nwave, CPL_TYPE_DOUBLE);
3283 for (cpl_size wave=0; wave<nwave; wave++)
3284 cpl_array_set(wavenumber, wave, (2.*M_PI/(((
double)cpl_table_get(oi_wavelength,
"EFF_WAVE", wave, NULL)*1.e6-0.021*1.908)/(1.-0.021))));
3286 file = fopen(
"wavenumber.txt",
"w");
3287 for (cpl_size i=0; i<nwave;i++) fprintf(file,
"%5.10g \n", cpl_array_get(wavenumber, i, NULL));
3294 cpl_array ** visdata_p1_orig = cpl_table_get_data_array(oi_vis,
"VISDATA");
3295 cpl_array ** visdata_p1 = cpl_malloc(cpl_table_get_nrow(oi_vis)*
sizeof(cpl_array *));
3298 cpl_array ** visdata_p2_orig = cpl_table_get_data_array(oi_vis,
"VISDATA");
3299 cpl_array ** visdata_p2 = cpl_malloc(cpl_table_get_nrow(oi_vis)*
sizeof(cpl_array *));
3302 file = fopen(
"vis_p1.txt",
"w");
3308 for (cpl_size row=0; row<nrow; row++){
3309 for (
int base=0; base < nbase; base++){
3310 visdata_p1[row*nbase+base]=cpl_array_duplicate(visdata_p1_orig[row*nbase+base]);
3313 for (cpl_size i=0; i<nwave;i++) fprintf(file,
"%f + i%f \t", creal(cpl_array_get_complex(visdata_p1[row*nbase+base], i, NULL)),
3314 cimag(cpl_array_get_complex(visdata_p1[row*nbase+base], i, NULL)));
3317 visdata_p2[row*nbase+base]=cpl_array_duplicate(visdata_p2_orig[row*nbase+base]);
3321 fprintf(file,
"\n");
3331 cpl_array * GD1 = cpl_array_new(nrow*nbase, CPL_TYPE_DOUBLE);
3332 cpl_array * GD2 = cpl_array_new(nrow*nbase, CPL_TYPE_DOUBLE);
3333 cpl_array * GD1_stat = cpl_array_new(nrow, CPL_TYPE_DOUBLE);
3334 cpl_array * GD2_stat = cpl_array_new(nrow, CPL_TYPE_DOUBLE);
3335 cpl_array * GD1_med = cpl_array_new(nbase, CPL_TYPE_DOUBLE);
3336 cpl_array * GD2_med = cpl_array_new(nbase, CPL_TYPE_DOUBLE);
3337 double std_gd1 = 0.;
3338 double std_gd2 = 0.;
3339 for (
int base=0; base < nbase; base++){
3340 for (cpl_size row=0; row<nrow; row++){
3341 double complex tmp = 0.0 * I + 0.0;
3342 for (cpl_size wave=1; wave<nwave; wave++)
3343 tmp += cpl_array_get_complex (visdata_p1[row*nbase+base], wave, NULL) * conj(cpl_array_get_complex (visdata_p1[row*nbase+base], wave-1, NULL));
3344 cpl_array_set(GD1 , row*nbase + base, carg(tmp));
3345 cpl_array_set(GD1_stat , row, carg(tmp));
3346 tmp = 0.0 * I + 0.0;
3347 for (cpl_size wave=1; wave<nwave; wave++)
3348 tmp += cpl_array_get_complex (visdata_p2[row*nbase+base], wave, NULL) * conj(cpl_array_get_complex (visdata_p2[row*nbase+base], wave-1, NULL));
3349 cpl_array_set(GD2 , row*nbase + base, carg(tmp));
3350 printf(
"%g ",carg(tmp));
3351 cpl_array_set(GD2_stat , row, carg(tmp));
3354 std_gd1+=cpl_array_get_stdev(GD1_stat)/nrow;
3355 std_gd2+=cpl_array_get_stdev(GD2_stat)/nrow;
3356 cpl_array_set(GD1_med, base, cpl_array_get_median(GD1_stat));
3357 cpl_array_set(GD2_med, base, cpl_array_get_median(GD2_stat));
3359 cpl_array_delete(GD1_stat);
3360 cpl_array_delete(GD2_stat);
3362 cpl_msg_info(cpl_func,
"GD rms average for pola 1 : %g[radians/element]", std_gd1);
3363 cpl_msg_info(cpl_func,
"GD rms average for pola 2 : %g[radians/element]", std_gd2);
3366 file = fopen(
"GD1.txt",
"w");
3367 for (cpl_size row=0; row<nrow; row++){
3368 for (
int base=0; base < nbase; base++){
3369 fprintf(file,
"%g \t", cpl_array_get(GD1 , row*nbase + base, NULL));
3371 fprintf(file,
"\n");
3374 file = fopen(
"GD2.txt",
"w");
3375 for (cpl_size row=0; row<nrow; row++){
3376 for (
int base=0; base < nbase; base++){
3377 fprintf(file,
"%g \t", cpl_array_get(GD1 , row*nbase + base, NULL));
3379 fprintf(file,
"\n");
3387 size_t * sort_met[6];
3388 for (
int base=0; base<nbase; base++){
3389 sort_met[base]=cpl_malloc(nrow*
sizeof(
size_t));
3390 gsl_sort_index (sort_met[base], gsl_matrix_ptr(MET, 0,base), nbase, nrow);
3394 double step = 0.000001;
3395 cpl_array * amp_sum=cpl_array_new(nspace, CPL_TYPE_DOUBLE_COMPLEX);
3396 cpl_array_fill_window_complex(amp_sum, 0, nspace, 0.0 * I + 0.0);
3397 cpl_array * amp=cpl_array_new(nspace, CPL_TYPE_DOUBLE_COMPLEX);
3398 gsl_matrix * A1_met = gsl_matrix_alloc (nbase, nwave);
3399 gsl_matrix * A2_met = gsl_matrix_alloc (nbase, nwave);
3400 cpl_array * i2step=cpl_array_new(nspace, CPL_TYPE_DOUBLE);
3402 CPLCHECK_NUL(
"Error before fitting the metrology slopes");
3403 for (
int i = 0; i < nspace; ++i) cpl_array_set(i2step, i, step*(
double)i*2.);
3407 for (
int base = 0; base < nbase; ++base) {
3408 for (cpl_size wave = 0; wave < nwave; ++wave) {
3410 amp_sum=cpl_array_new(nspace, CPL_TYPE_DOUBLE_COMPLEX);
3411 cpl_array_fill_window_complex(amp_sum, 0, nspace, 0.0 * I + 0.0);
3413 for (cpl_size row = 0; row < nrow; ++row) {
3414 cpl_array_fill_window_complex(amp, 0, nspace, (_Complex
double)cpl_array_get_float_complex(visdata_p1[sort_met[base][row]*nbase+base], wave, NULL));
3416 cpl_array_add(amp_sum, amp);
3419 cpl_array_abs(amp_sum);
3421 cpl_array_get_maxpos(amp_sum, &max_pos);
3422 gsl_matrix_set(A1_met, base, wave, max_pos*step);
3423 cpl_msg_info_overwritable(cpl_func,
"Fit phase sc for polar 1/2 of base %d/6 (wave %lld/%lld)", base+1, wave+1, nwave);
3424 CPLCHECK_NUL(
"Error when fitting the metrology slopes");
3429 for (
int base = 0; base < nbase; ++base) {
3430 for (cpl_size wave = 0; wave < nwave; ++wave) {
3432 amp_sum=cpl_array_new(nspace, CPL_TYPE_DOUBLE_COMPLEX);
3433 cpl_array_fill_window_complex(amp_sum, 0, nspace, 0.0 * I + 0.0);
3435 for (cpl_size row = 0; row < nrow; ++row) {
3436 cpl_array_fill_window_complex(amp, 0, nspace, (_Complex
double)cpl_array_get_float_complex(visdata_p2[sort_met[base][row]*nbase+base], wave, NULL));
3438 cpl_array_add(amp_sum, amp);
3441 cpl_array_abs(amp_sum);
3443 cpl_array_get_maxpos(amp_sum, &max_pos);
3444 gsl_matrix_set(A2_met, base, wave, max_pos*step);
3445 cpl_msg_info_overwritable(cpl_func,
"Fit phase sc for polar 2/2 of base %d/6 (wave %lld/%lld)", base+1, wave+1, nwave);
3446 CPLCHECK_NUL(
"Error when fitting the metrology slopes");
3450 cpl_array_delete(amp_sum);
3451 cpl_array_delete(amp);
3452 cpl_array_delete(i2step);
3456 file = fopen(
"A1_met.txt",
"w");
3459 file = fopen(
"A2_met.txt",
"w");
3470 cpl_msg_info(cpl_func,
"Reconstruct unwrap phase ...");
3471 cpl_array * SC1b_unwrap;
3472 cpl_array * SC2b_unwrap;
3473 cpl_array * slope = cpl_array_new(nwave, CPL_TYPE_DOUBLE_COMPLEX);
3474 for (
int base=0; base < nbase; base++){
3475 SC1b_unwrap = cpl_array_new (nwave, CPL_TYPE_DOUBLE_COMPLEX);
3476 cpl_array_fill_window_complex (SC1b_unwrap, 0, nwave, (
double complex)(0.0 + 0.0 * I));
3477 SC2b_unwrap = cpl_array_new (nwave, CPL_TYPE_DOUBLE_COMPLEX);
3478 cpl_array_fill_window_complex (SC2b_unwrap, 0, nwave, (
double complex)(0.0 + 0.0 * I));
3479 for (cpl_size row=0; row<nrow; row++){
3480 for (cpl_size wave=0; wave<nwave; wave++){
3481 cpl_array_set(slope, wave,cpl_array_get(visdata_p1[row*nbase+base], wave, NULL)*
3483 gsl_matrix_get(MET, row, base)
3484 *gsl_matrix_get(A1_met, base, wave)
3485 -wave*cpl_array_get(GD1_med, base, NULL))
3488 cpl_array_add(SC1b_unwrap, slope);
3489 for (cpl_size wave=0; wave<nwave; wave++){
3490 cpl_array_set(slope, wave,cpl_array_get(visdata_p2[row*nbase+base], wave, NULL)*
3492 gsl_matrix_get(MET, row, base)
3493 *gsl_matrix_get(A2_met, base, wave)
3494 -wave*cpl_array_get(GD2_med, base, NULL))
3497 cpl_array_add(SC2b_unwrap, slope);
3499 cpl_array_divide_scalar(SC1b_unwrap, nrow);
3500 cpl_array_divide_scalar(SC2b_unwrap, nrow);
3502 cpl_array_arg(SC1b_unwrap);
3503 cpl_array_arg(SC2b_unwrap);
3506 for (cpl_size row=0; row<nrow; row++){
3507 for (cpl_size wave=0; wave<nwave; wave++){
3508 cpl_array_set(slope, wave,cpl_array_get(visdata_p1[row*nbase+base], wave, NULL)*
3510 gsl_matrix_get(MET, row, base)
3511 *gsl_matrix_get(A1_met, base, wave)
3512 -wave*cpl_array_get(GD1_med, base, NULL))
3520 cpl_array_delete(SC1b_unwrap);
3521 cpl_array_delete(SC2b_unwrap);
3531 for (
int tel = 0; tel<4; tel++ ) {
3532 cpl_msg_info (cpl_func,
"FDDL linearity K FT%i = %f, K SC%i = %f ", tel+1, gsl_vector_get(K_coeff, tel+6),
3533 tel+1, gsl_vector_get(K_coeff, tel+4+6));
3534 qc_name=cpl_sprintf(
"ESO QC FDDL_LIN K_FT%i", tel+1);
3535 cpl_propertylist_append_double (disp_header, qc_name,gsl_vector_get(K_coeff, tel+6));
3536 cpl_propertylist_set_comment (disp_header, qc_name,
"[-] K fddl linearity factor");
3537 qc_name=cpl_sprintf(
"ESO QC FDDL_LIN K_SC%i", tel+1);
3538 cpl_propertylist_append_double (disp_header, qc_name, gsl_vector_get(K_coeff, tel+4+6));
3539 cpl_propertylist_set_comment (disp_header, qc_name,
"[-] K fddl linearity factor");
3542 for (
int tel = 0; tel<4; tel++ ) {
3543 cpl_msg_info (cpl_func,
"FDDL linearity K2 FT%i = %f, K2 SC%i = %f ", tel,
3544 gsl_vector_get (K_coeff, tel+6+8),
3545 tel, gsl_vector_get(K_coeff, tel+4+6));
3546 qc_name=cpl_sprintf(
"ESO QC FDDL_LIN K2_FT%i", tel+1);
3547 cpl_propertylist_append_double (disp_header, qc_name,gsl_vector_get(K_coeff, tel+6+8));
3548 cpl_propertylist_set_comment (disp_header, qc_name,
"[-] K2 fddl linearity factor");
3549 qc_name=cpl_sprintf(
"ESO QC FDDL_LIN K2_SC%i", tel+1);
3550 cpl_propertylist_append_double (disp_header, qc_name, gsl_vector_get(K_coeff, tel+4+6+8));
3551 cpl_propertylist_set_comment (disp_header, qc_name,
"[-] K2 fddl linearity factor");
3558 gsl_matrix_free(fddl);
3559 gsl_matrix_free(fddl2);
3560 gsl_matrix_free(met_data);
3561 gsl_matrix_free(M_matrix);
3562 gsl_matrix_free(M_matrix2);
3563 gsl_matrix_free(MET);
3564 gsl_matrix_free(model);
3565 gsl_vector_free(K_coeff);
3566 gsl_matrix_free(FDDL_matrix);
3567 cpl_array_delete(wavenumber);
3570 gsl_matrix_free(A1_met);
3571 gsl_matrix_free(A2_met);
3572 cpl_array_delete(GD1_med);
3573 cpl_array_delete(GD2_med);
3829 cpl_table * phase_sc,
3830 cpl_table * phase_ft,
3833 int nbase = 6,
ntel = 4;
3834 double opl, time_sc, time_ft, time_met;
3838 cpl_ensure (vis_met, CPL_ERROR_NULL_INPUT, NULL);
3839 cpl_ensure (phase_sc, CPL_ERROR_NULL_INPUT, NULL);
3840 cpl_ensure (phase_ft, CPL_ERROR_NULL_INPUT, NULL);
3843 cpl_size nrow = cpl_table_get_nrow (phase_ft) / nbase;
3844 cpl_size nrow_sc = cpl_table_get_nrow (phase_sc) / nbase;
3845 cpl_size nrow_met = cpl_table_get_nrow (vis_met) /
ntel;
3849 int * time_FT = cpl_table_get_data_int (phase_ft,
"TIME");
3850 int * time_SC = cpl_table_get_data_int (phase_sc,
"TIME");
3854 double exptime_ft = time_FT[nbase] - time_FT[0];
3855 double exptime_sc = time_SC[nbase] - time_SC[0];
3858 double * ft_phase = cpl_table_get_data_double (phase_ft,
"PHASE");
3859 double * sc_phase = cpl_table_get_data_double (phase_sc,
"PHASE");
3860 double * phase_met = cpl_table_get_data_double (vis_met,
"PHASE_FC");
3864 gsl_matrix * A_data = gsl_matrix_calloc (nbase * nrow, 8);
3865 gsl_matrix * U, * A;
3866 gsl_vector * bis_data = gsl_vector_alloc (nbase * nrow), * bis;
3867 gsl_matrix * X = gsl_matrix_alloc (8, 8);
3868 gsl_matrix * V = gsl_matrix_alloc (8, 8);
3869 gsl_vector * S = gsl_vector_alloc (8);
3870 gsl_vector * work = gsl_vector_alloc (8);
3871 gsl_vector * x = gsl_vector_alloc (8);
3878 for (
int base = 0; base < nbase; base ++) {
3888 for (cpl_size row = 0; row < nrow; row ++){
3890 gsl_matrix_set (A_data, base * nrow + row, 6, - ft_phase[row*nbase+base]);
3893 time_ft = time_FT[row*nbase+base];
3894 if (ind_sc < nrow_sc) time_sc = time_SC[ind_sc*nbase+base];
3898 while(time_ft > (time_sc+exptime_sc/2.)){
3900 if (ind_sc < nrow_sc) time_sc = time_SC[ind_sc*nbase+base];
3908 if(ind_sc < nrow_sc) phi_sc = sc_phase[ind_sc*nbase+base];
3909 else phi_sc = sc_phase[(nrow_sc - 1)*nbase+base];
3911 else phi_sc = sc_phase[0*nbase+base];
3915 gsl_matrix_set (A_data, base * nrow + row, 7, phi_sc);
3916 gsl_matrix_set (A_data, base * nrow + row, base, 1.0);
3923 time_met = cpl_table_get_int (vis_met,
"TIME", im*
ntel, &nv);
3925 while ((time_met < (time_ft + exptime_ft))){
3927 if (im < nrow_met) {
3928 opl += (phase_met[im*
ntel+tel0] - phase_met[im*
ntel+tel1]) *
LAMBDA_MET / CPL_MATH_2PI;
3933 if (im < nrow_met) {
3934 time_met = cpl_table_get_int (vis_met,
"TIME", im*
ntel, &nv);
3945 gsl_vector_set (bis_data, base * nrow + row, opl/comp);
3951 double opd1 = (phase_met[(im-1)*
ntel+tel0] - phase_met[(im-1)*
ntel+tel1]) *
LAMBDA_MET / CPL_MATH_2PI;
3952 double opd2 = (phase_met[im*
ntel+tel0] - phase_met[im*
ntel+tel1]) *
LAMBDA_MET / CPL_MATH_2PI;
3953 double opd = (opd2 - opd1) *
3954 (time_ft - cpl_table_get_int (vis_met,
"TIME", (im-1)*
ntel, &nv)) /
3955 (time_met - cpl_table_get_int (vis_met,
"TIME", (im-1)*
ntel, &nv)) +
3957 gsl_vector_set (bis_data, base * nrow + row, opd);
3960 double opd = (phase_met[(nrow_met-1)*
ntel+tel0] - phase_met[(nrow_met-1)*
ntel+tel1]) *
LAMBDA_MET / CPL_MATH_2PI;
3961 gsl_vector_set (bis_data, base * nrow + row, opd);
3965 double opd = (phase_met[0*
ntel+tel0] - phase_met[0*
ntel+tel1]) *
LAMBDA_MET / CPL_MATH_2PI;
3966 gsl_vector_set (bis_data, base * nrow + row, opd);
3978 long n_row_A=nrow_sc*(int)(dit_sc/exptime_ft+1);
3979 cpl_vector *i_A_vector = cpl_vector_new(n_row_A);
3982 int t0_sc = time_SC[0*nbase];
3983 int tend_sc = time_SC[(nrow_sc-1)*nbase];
3987 for (cpl_size row=0; row<nrow; row++){
3988 time_ft = time_FT[row*nbase];
3989 if ((time_ft >= t0_sc-dit_sc/2) && (time_ft < tend_sc+dit_sc/2)){
3990 time_mod=((int)(time_ft-(t0_sc-dit_sc/2)) % (int)exptime_sc);
3991 if ( time_mod >= 0 && time_mod < dit_sc ) {
3992 cpl_vector_set (i_A_vector, i_A, row);
4000 A = gsl_matrix_alloc (nbase * n_row_A, 8);
4001 bis = gsl_vector_alloc (nbase * n_row_A);
4002 cpl_vector *time_A = cpl_vector_new(n_row_A);
4004 for (
int base = 0; base < nbase; base ++)
4005 for (cpl_size i_A = 0; i_A < n_row_A; i_A++){
4006 cpl_size row = cpl_vector_get(i_A_vector, i_A);
4007 for (
int col = 0; col < 8; col ++)
4008 gsl_matrix_set (A, base * n_row_A + i_A, col, gsl_matrix_get (A_data, base * nrow + row, col));
4010 gsl_vector_set (bis, base * n_row_A + i_A, gsl_vector_get (bis_data, base * nrow + row));
4012 cpl_vector_set (time_A, i_A, time_FT[row*nbase+base]);
4015 cpl_vector_delete(i_A_vector);
4021 U = gsl_matrix_alloc (nbase * nrow, 8);
4022 gsl_matrix_memcpy (U, A);
4025 gsl_linalg_SV_decomp (U, V, S, work);
4026 gsl_linalg_SV_solve (U, V, S, bis, x);
4027 cpl_vector * opd_coeff = cpl_vector_new (3);
4028 cpl_vector_set (opd_coeff, 0, gsl_vector_get (x, 7));
4029 cpl_vector_set (opd_coeff, 1, gsl_vector_get (x, 6));
4031 cpl_msg_debug (cpl_func,
"Wavelength => SC = %g, FT = %g\n",
4032 cpl_vector_get(opd_coeff,0)*2*M_PI, cpl_vector_get(opd_coeff,1)*2*M_PI);
4039 cpl_table * table_output = cpl_table_new (nrow * nbase);
4040 const char * table_name[9] = {
"A0",
"A1",
"A2",
"A3",
"A4",
"A5",
"A6",
"A7",
"B"};
4043 double ** table_value = cpl_malloc (9 *
sizeof(
double*));
4044 for (
int col = 0; col < 9; col++)
4045 table_value[col] = cpl_malloc (nrow * nbase *
sizeof(
double));
4049 for (
int base = 0; base < nbase; base ++)
4050 for (cpl_size row = 0; row < nrow; row++) {
4051 for (
int col = 0; col < 8; col ++)
4052 table_value[col][base * nrow + row] = gsl_matrix_get (A, base * nrow + row, col);
4054 table_value[8][base * nrow + row] = gsl_vector_get (bis, base * nrow + row);
4059 for (
int col = 0; col < 9; col++) {
4060 cpl_table_wrap_double (table_output, table_value[col], table_name[col]);
4064 cpl_propertylist * table_header = cpl_propertylist_new ();
4065 for (
int col = 0; col < 8; col ++)
4070 cpl_table_save (table_output, NULL, table_header,
"matrix_AB.fits", CPL_IO_CREATE);
4078 cpl_vector *vect_phase_sc_ft=cpl_vector_new(nrow*nbase);
4079 cpl_vector *vect_dopd_met=cpl_vector_new(nrow*nbase);
4080 cpl_vector *vect_diff=cpl_vector_new(nrow*nbase);
4081 for (cpl_size row = 0; row < nrow*nbase; row ++){
4082 cpl_vector_set(vect_dopd_met, row, gsl_vector_get (bis, row));
4083 cpl_vector_set(vect_phase_sc_ft, row,
4084 gsl_matrix_get (A, row, 0)*gsl_vector_get (x, 0)+
4085 gsl_matrix_get (A, row, 1)*gsl_vector_get (x, 1)+
4086 gsl_matrix_get (A, row, 2)*gsl_vector_get (x, 2)+
4087 gsl_matrix_get (A, row, 3)*gsl_vector_get (x, 3)+
4088 gsl_matrix_get (A, row, 4)*gsl_vector_get (x, 4)+
4089 gsl_matrix_get (A, row, 5)*gsl_vector_get (x, 5)+
4090 gsl_matrix_get (A, row, 6)*gsl_vector_get (x, 6)+
4091 gsl_matrix_get (A, row, 7)*gsl_vector_get (x, 7));
4092 cpl_vector_set(vect_diff, row, cpl_vector_get(vect_dopd_met, row)-cpl_vector_get(vect_phase_sc_ft, row));
4095 double rms_fit_phase_met = cpl_vector_get_stdev(vect_diff);
4096 cpl_msg_info (cpl_func,
"RMS of residuals on fit of a.phi_ft+b.phi_sc+c = met : %g", rms_fit_phase_met);
4097 cpl_vector_set (opd_coeff, 2, rms_fit_phase_met);
4099 cpl_msg_info (
"TEST",
"coeff SC = %.20g [um]", cpl_vector_get (opd_coeff, 0) * CPL_MATH_2PI * 1e6);
4100 cpl_msg_info (
"TEST",
"coeff FT = %.20g [um]", cpl_vector_get (opd_coeff, 1) * CPL_MATH_2PI * 1e6);
4101 cpl_msg_info (
"TEST",
"residual = %.20g [um]", rms_fit_phase_met * CPL_MATH_2PI * 1e6);
4106 if (rms_fit_phase_met > 1e-7 ){
4107 cpl_msg_info (cpl_func,
"*************************************************");
4108 cpl_msg_warning (cpl_func,
"**** !!! residuals of the fit too high !!! ****");
4109 cpl_msg_warning (cpl_func,
"**** SC and RMN may be desynchronized ****");
4110 cpl_msg_warning (cpl_func,
"**** (or out of the envelope in LOW) ****");
4111 cpl_msg_info (cpl_func,
"*************************************************");
4114 if (PLOT_MET_PHASE_FIT) {
4117 cpl_errorstate prestate = cpl_errorstate_get();
4118 const cpl_vector ** vectors=malloc(3 *
sizeof(cpl_vector*));
4120 vectors[1]=vect_phase_sc_ft;
4121 vectors[2]=vect_dopd_met;
4123 cpl_plot_vectors (cpl_sprintf(
"set title 'Met fit case a=%g b=%g'; set xlabel 'time[10-6s]'; set ylabel 'Phase_ft+Phase_sc, dopd_met';", gsl_vector_get (x, 0), gsl_vector_get (x, 1)),
4124 "",
"", vectors, 3);
4125 cpl_plot_vector(cpl_sprintf(
"set title 'Met fit case a=%g b=%g'; set xlabel 'time[10-6s]'; set ylabel 'Phase_ft+Phase_sc-dopd_met';", gsl_vector_get (x, 0), gsl_vector_get (x, 1)),
4128 cpl_errorstate_set (prestate);
4131 FREE(cpl_vector_delete, vect_phase_sc_ft);
4132 FREE(cpl_vector_delete, vect_dopd_met);
4133 FREE(cpl_vector_delete, vect_diff);
4134 gsl_matrix_free (A);
4135 gsl_matrix_free (A_data);
4136 gsl_matrix_free (U);
4137 gsl_matrix_free (V);
4138 gsl_vector_free (x);
4139 gsl_vector_free (bis);
4140 gsl_vector_free (bis_data);
4141 cpl_vector_delete(time_A);
4142 gsl_matrix_free (X);
4143 gsl_vector_free (S);
4144 gsl_vector_free (work);
4241 cpl_ensure_code (phase_table, CPL_ERROR_NULL_INPUT);
4243 int ntel = 4, nbase = 6;
4244 int tel_1[6] = {0,0,0,1,1,2};
4245 int tel_2[6] = {1,2,3,2,3,3};
4247 gsl_matrix * gsl_SC_kernel = NULL;
4248 gsl_vector * phase_coeff = NULL;
4249 gsl_matrix * M = NULL;
4250 gsl_matrix * U = NULL;
4251 gsl_matrix * V = NULL;
4252 gsl_vector * S = NULL;
4253 gsl_vector * work = NULL;
4254 cpl_matrix * M_inv = NULL;
4255 cpl_matrix * SC_kernel_mat_final = NULL;
4256 gsl_vector * Ks = NULL;
4257 cpl_matrix * kernel = NULL;
4266 M = gsl_matrix_alloc (nbase,
ntel);
4267 gsl_matrix_set_zero (M);
4269 for (
int j = 0; j < nbase; j++){
4270 gsl_matrix_set (M, j, tel_1[j], 1);
4271 gsl_matrix_set (M, j, tel_2[j], -1);
4280 U = gsl_matrix_alloc (6, 4);
4281 V = gsl_matrix_alloc (4, 4);
4282 S = gsl_vector_alloc (4);
4283 work = gsl_vector_alloc (4);
4285 gsl_matrix_memcpy (U, M);
4286 gsl_linalg_SV_decomp (U, V, S, work);
4292 double * a_inv_data = cpl_malloc(
ntel * nbase *
sizeof(
double));
4293 for (
int j = 0; j < nbase; j++) {
4294 for (
int i = 0; i <
ntel; i++){
4296 for (
int ii = 0; ii <
ntel; ii++){
4297 if( gsl_vector_get(S, ii) > 1e-14)
4298 wv_at += gsl_matrix_get(V, i, ii) / gsl_vector_get(S, ii) *
4299 gsl_matrix_get(U, j, ii);
4301 a_inv_data[j + i * nbase] = wv_at;
4305 gsl_matrix_free (V);
4306 gsl_matrix_free (U);
4307 gsl_vector_free (S);
4308 gsl_vector_free (work);
4310 M_inv = cpl_matrix_wrap (
ntel, nbase, a_inv_data);
4318 kernel = cpl_matrix_new (nbase, nbase);
4320 for (
int j = 0; j < nbase; j++) {
4321 for (
int k = 0; k < nbase; k++) {
4323 for (
int ii = 0; ii <
ntel; ii++){
4324 ai += gsl_matrix_get (M, j, ii)*cpl_matrix_get (M_inv, ii, k);
4327 cpl_matrix_set (kernel, j, k, ai - 1);
4329 cpl_matrix_set (kernel, j, k, ai);
4333 cpl_matrix_unwrap (M_inv);
4334 cpl_free (a_inv_data);
4343 int nrow = cpl_table_get_nrow (phase_table) / nbase;
4345 double * pphase = cpl_table_get_data_double (phase_table,
"PHASE");
4346 cpl_ensure_code (pphase, CPL_ERROR_ILLEGAL_INPUT);
4349 Ks = gsl_vector_alloc (nbase* nrow);
4350 for (
int k = 0; k < nbase; k++) {
4351 for (cpl_size row = 0;row < nrow; row++) {
4353 for (
int ii = 0; ii < nbase; ii++){
4354 ai += cpl_matrix_get (kernel, k, ii) * pphase[row*nbase+ii];
4356 gsl_vector_set (Ks, row + k * nrow, ai);
4367 cpl_array * phase_temp;
4369 double * SC_kernel = cpl_malloc ( nbase*nbase * nrow *
sizeof (
double));
4370 double * SC_kernel2 = cpl_malloc ( nbase*nbase * nrow *
sizeof (
double));
4371 cpl_array * ones = cpl_array_new (nrow, CPL_TYPE_DOUBLE);
4373 for (
int i = 0; i < nbase; i++) {
4374 for (
int k = 0; k < nbase; k ++){
4377 phase_temp = cpl_array_new (nrow, CPL_TYPE_DOUBLE);
4378 for (cpl_size row = 0; row < nrow; row++)
4379 cpl_array_set (phase_temp, row, pphase[row*nbase+i]);
4381 cpl_array_fill_window_double (ones, 0, nrow, 1);
4382 cpl_array_multiply_scalar (ones, cpl_matrix_get (kernel, i, k));
4383 cpl_array_multiply_scalar (phase_temp, cpl_matrix_get (kernel, i, k));
4384 ph_data = cpl_array_get_data_double (phase_temp);
4385 ones_t = cpl_array_get_data_double (ones);
4387 memcpy (SC_kernel2 + (i*nbase + k) * nrow , ph_data, nrow *
sizeof(
double));
4388 memcpy (SC_kernel + (i*nbase + k) * nrow, ones_t, nrow *
sizeof(
double));
4391 cpl_array_delete (phase_temp);
4396 FREE (cpl_array_delete, ones);
4399 cpl_matrix * temp = cpl_matrix_wrap (nbase, nbase* nrow, SC_kernel);
4400 cpl_matrix * SC_kernel_mat = cpl_matrix_duplicate (temp);
4401 cpl_matrix * SC_kernel_mat2 = cpl_matrix_wrap (nbase, nbase* nrow, SC_kernel2);
4403 cpl_matrix_append (SC_kernel_mat, SC_kernel_mat2, 1);
4405 SC_kernel_mat_final = cpl_matrix_extract (SC_kernel_mat, 0, 0, 1, 1, 11, nbase*nrow);
4407 cpl_matrix_unwrap (temp);
4408 cpl_matrix_unwrap (SC_kernel_mat2);
4409 cpl_free (SC_kernel2);
4410 cpl_free (SC_kernel);
4411 cpl_matrix_delete (SC_kernel_mat);
4413 gsl_SC_kernel = gsl_matrix_alloc (nbase*nrow, 11);
4415 for (
int j = 0; j < cpl_matrix_get_nrow(SC_kernel_mat_final); j++){
4416 for (
int k = 0; k < cpl_matrix_get_ncol(SC_kernel_mat_final); k++)
4417 gsl_matrix_set (gsl_SC_kernel, k, j, cpl_matrix_get (SC_kernel_mat_final, j, k));
4424 U = gsl_matrix_alloc (nbase*nrow, 11);
4425 V = gsl_matrix_alloc (11, 11);
4426 S = gsl_vector_alloc (11);
4427 phase_coeff = gsl_vector_alloc (11);
4428 work = gsl_vector_alloc (11);
4429 gsl_matrix_memcpy (U, gsl_SC_kernel);
4431 gsl_linalg_SV_decomp (U, V, S, work);
4432 for (
int i = 0; i < 11; i++)
4433 if (gsl_vector_get (S, i) < 1e-10)
4434 gsl_vector_set (S, i , 0);
4435 gsl_linalg_SV_solve (U, V, S, Ks, phase_coeff);
4441 for (
int base = 0; base < nbase - 1; base ++){
4442 double f = gsl_vector_get (phase_coeff, nbase + base);
4443 cpl_msg_info (cpl_func,
"correction factor = 1 %+.20f", f);
4444 for (cpl_size row = 0; row < nrow; row++) {
4445 pphase[row*nbase+base] *= 1 - f;
4454 FREE (gsl_matrix_free, M);
4455 FREE (gsl_vector_free, Ks);
4456 FREE (cpl_matrix_delete, SC_kernel_mat_final);
4457 FREE (cpl_matrix_delete, kernel);
4458 FREE (gsl_matrix_free, gsl_SC_kernel);
4459 FREE (gsl_matrix_free, U);
4460 FREE (gsl_matrix_free, V);
4461 FREE (gsl_vector_free, S);
4462 FREE (gsl_vector_free, phase_coeff);
4463 FREE (gsl_vector_free, work);
4466 return CPL_ERROR_NONE;