34 #include "sinfo_new_wave_cal_slit2.h"
35 #include "sinfo_pro_save.h"
36 #include "sinfo_pro_types.h"
37 #include "sinfo_wavecal_ini_by_cpl.h"
38 #include "sinfo_wcal_functions.h"
39 #include "sinfo_absolute.h"
40 #include "sinfo_wave_calibration.h"
41 #include "sinfo_wavecal.h"
42 #include "sinfo_globals.h"
43 #include "sinfo_hidden.h"
45 #include "sinfo_utilities.h"
46 #include "sinfo_utilities_scired.h"
47 #include "sinfo_utils_wrappers.h"
48 #include "sinfo_error.h"
59 sinfo_image_resample(
const char* plugin_id,
60 cpl_parameterlist* config,
62 cpl_frameset* ref_set);
117 sinfo_new_wave_cal_slit2(
const char* plugin_id,
118 cpl_parameterlist* config,
119 cpl_frameset* sof,cpl_frameset* ref_set)
121 wave_config * cfg =NULL;
122 char col_name[MAX_NAME_SIZE];
123 char tbl_name[MAX_NAME_SIZE];
124 char tbl_fitpar_name[MAX_NAME_SIZE];
125 char tbl_line_list_name[MAX_NAME_SIZE];
126 char tbl_slitpos_guess_name[MAX_NAME_SIZE];
127 char key_name[MAX_NAME_SIZE];
128 char col[MAX_NAME_SIZE];
144 int* n_found_lines=NULL;
145 int* sum_pointer=NULL;
146 int** row_clean=NULL;
157 float** wavelength_clean=NULL;
158 float** sinfo_slit_pos=NULL;
165 cpl_image * im=NULL ;
167 FitParams** par=NULL;
169 cpl_table* tbl_wcal=NULL;
170 cpl_table* tbl_spos=NULL;
171 cpl_table* tbl_fitpar = NULL;
172 cpl_table* tbl_line_list = NULL;
173 cpl_table* tbl_slitpos_guess=NULL;
174 cpl_table * tbl_fp =NULL;
175 cpl_table* qclog_tbl=NULL;
177 cpl_image* map_img=NULL;
179 cpl_frameset* raw=NULL;
180 cpl_parameter* p=NULL;
182 qc_wcal* qc=sinfo_qc_wcal_new();
191 check_nomsg(p=cpl_parameterlist_find(config,
"sinfoni.product.density"));
192 check_nomsg(pdensity=cpl_parameter_get_int(p));
195 sinfo_msg(
"Parsing cpl input");
196 check_nomsg(raw=cpl_frameset_new());
197 cknull(cfg = sinfo_parse_cpl_input_wave(config,sof,&raw),
198 "could not parse cpl input!") ;
200 check_nomsg(p = cpl_parameterlist_find(config,
201 "sinfoni.wavecal.slitpos_boostrap"));
202 check_nomsg(sw=cpl_parameter_get_bool(p));
206 cfg->calibIndicator=1;
208 cfg->slitposIndicator=1;
209 sinfo_msg(
"***********************************");
210 sinfo_msg(
"parameter setting for %s",PRO_WAVE_SLITPOS_STACKED);
211 sinfo_msg(
"***********************************");
214 if(sinfo_is_fits_file(cfg->inFrame) != 1) {
215 sinfo_msg_error(
"Input file cfg->inFrame %s is not FITS",cfg->inFrame);
220 if (cfg->slitposIndicator == 1 && cfg->estimateIndicator == 1) {
221 if (sinfo_is_fits_file(cfg->slitposGuessName) != 1) {
227 if (cfg->calibIndicator == 0 && cfg->wavemapInd == 1) {
228 if (sinfo_is_fits_file(cfg->coeffsName) != 1) {
234 if (cfg->slitposIndicator == 1) {
235 if (cfg->calibIndicator != 1 && cfg->estimateIndicator != 1) {
236 if (sinfo_is_fits_file(cfg->paramsList) != 1) {
244 check(im = cpl_image_load(cfg->inFrame,CPL_TYPE_FLOAT,0,0)
245 ,
"could not load image");
246 lx = cpl_image_get_size_x(im);
251 if (cfg->calibIndicator == 1 || cfg->wavemapInd == 1) {
253 strcpy(tbl_line_list_name,cfg->lineList);
254 check_nomsg(tbl_line_list = cpl_table_load(tbl_line_list_name,1,0));
255 check_nomsg(n = cpl_table_get_nrow(tbl_line_list));
258 check_nomsg(wave = cpl_table_get_data_float(tbl_line_list,
"wave"));
259 cpl_type type=cpl_table_get_column_type(tbl_line_list,
"int");
260 if(type==CPL_TYPE_INT) {
261 check_nomsg(cpl_table_cast_column(tbl_line_list,
"int",
"fint",CPL_TYPE_FLOAT));
262 check_nomsg(intens = cpl_table_get_data_float(tbl_line_list,
"fint"));
264 check_nomsg(intens = cpl_table_get_data_float(tbl_line_list,
"int"));
283 if (cfg->calibIndicator == 1 && cfg->wavemapInd == 0) {
284 sinfo_msg(
"Findlines");
285 acoefs = sinfo_new_2Dfloatarray(cfg->nrDispCoefficients, lx);
288 n_found_lines = sinfo_new_intarray(lx);
289 row_clean = sinfo_new_2Dintarray(lx, n_lines);
290 wavelength_clean = sinfo_new_2Dfloatarray(lx, n_lines);
291 sum_pointer = sinfo_new_intarray(1) ;
294 sinfo_new_intarray_set_value(sum_pointer, 0, 0);
296 ck0( (check = sinfo_new_find_lines(im,
302 cfg->guessBeginWavelength,
303 cfg->guessDispersion1,
304 cfg->guessDispersion2,
310 "sinfo_findLines failed!");
316 sinfo_msg(
"Wave Calibration");
317 sum = sinfo_new_intarray_get_value(sum_pointer,0);
319 cknull(par = sinfo_new_fit_params( sum ),
320 "sinfo_newFitParams failed!");
326 cknull(map_img = sinfo_new_wave_cal(im,
333 cfg->guessDispersion1,
338 cfg->nrDispCoefficients,
339 cfg->nrCoefCoefficients,
342 cfg->pixel_tolerance),
343 "sinfo_wave_cal failed!");
345 sinfo_msg(
"Check line positions");
347 shift=sinfo_new_check_line_positions(im,acoefs,cfg->nrDispCoefficients,
348 cfg->guessDispersion1,par);
354 sinfo_det_ncounts(raw, cfg->qc_thresh_max, qc);
356 cknull_nomsg(qclog_tbl = sinfo_qclog_init());
357 ck0_nomsg(sinfo_qclog_add_int(qclog_tbl,
"QC WAVE ALL",n_lines,
358 "Number of found lines",
"%d"));
359 ck0_nomsg(sinfo_qclog_add_int(qclog_tbl,
"QC WAVE NPIXSAT",qc->nsat,
360 "Number of saturated pixels",
"%d"));
361 ck0_nomsg(sinfo_qclog_add_double(qclog_tbl,
"QC WAVE MAXFLUX",qc->max_di,
362 "Max int off-lamp subtracted frm",
"%g"));
363 ck0_nomsg(sinfo_qclog_add_double(qclog_tbl,
"QC WAVE POSERR",shift,
364 "Overall positioning error in mum",
"%g"));
366 ck0(sinfo_pro_save_ima(map_img,ref_set,sof,cfg->outName,
367 PRO_WAVE_MAP,qclog_tbl,plugin_id,config),
368 "cannot save ima %s", cfg->outName);
370 sinfo_free_table(&qclog_tbl);
371 sinfo_free_image(&map_img);
378 if (cfg->writeCoeffsInd == 1) {
379 check_nomsg(tbl_wcal = cpl_table_new(lx));
380 for (i=0; i< cfg->nrDispCoefficients; i++) {
381 snprintf(col_name,MAX_NAME_SIZE-1,
"%s%d",
"coeff",i);
382 check_nomsg(cpl_table_new_column(tbl_wcal,col_name, CPL_TYPE_DOUBLE));
385 cknull_nomsg(qclog_tbl = sinfo_qclog_init());
386 ck0_nomsg(sinfo_qclog_add_int(qclog_tbl,
"QC WAVE ALL",n_lines,
387 "Number found lines",
"%d"));
389 for (j=0; j< lx; j++) {
390 for (i=0; i< cfg->nrDispCoefficients; i++) {
391 snprintf(col_name,MAX_NAME_SIZE-1,
"%s%d",
"coeff",i);
392 a = sinfo_new_array2D_get_value(acoefs, i, j);
394 cpl_table_set_double(tbl_wcal,col_name,j,a);
397 for (i=0; i< cfg->nrDispCoefficients; i++) {
398 snprintf(col_name,MAX_NAME_SIZE-1,
"%s%d",
"coeff",i);
399 check_nomsg(coef_avg=cpl_table_get_column_mean(tbl_wcal,col_name));
400 check_nomsg(coef_med=cpl_table_get_column_median(tbl_wcal,col_name));
402 snprintf(key_name,MAX_NAME_SIZE-1,
"%s%d%s",
"QC COEF",i,
" AVG");
403 ck0_nomsg(sinfo_qclog_add_double(qclog_tbl,key_name,coef_avg,
404 "Average wavecal Coef",
"%g"));
406 snprintf(key_name,MAX_NAME_SIZE-1,
"%s%d%s",
"QC COEF",i,
" MED");
407 ck0_nomsg(sinfo_qclog_add_double(qclog_tbl,key_name,coef_med,
408 "Median wavecal Coef",
"%g"));
412 strcpy(tbl_name,cfg->coeffsName);
413 ck0(sinfo_pro_save_tbl(tbl_wcal,ref_set,sof,tbl_name,
414 PRO_WAVE_COEF_SLIT,qclog_tbl,plugin_id,config),
415 "cannot save tbl %s", tbl_name);
416 sinfo_free_table(&tbl_wcal);
417 sinfo_free_table(&qclog_tbl);
425 if (cfg->writeParInd == 1) {
426 sinfo_new_dump_fit_params_to_ascii(par,WAVECAL_FIT_PARAMS_OUT_FILEASCII);
428 cknull(par,
"no fit parameters available!") ;
429 cknull(cfg->paramsList,
"no filename available!") ;
430 check_nomsg(tbl_fp = cpl_table_new(par[0] -> n_params));
431 check_nomsg(cpl_table_new_column(tbl_fp,
"n_params", CPL_TYPE_INT));
432 check_nomsg(cpl_table_new_column(tbl_fp,
"column", CPL_TYPE_INT));
433 check_nomsg(cpl_table_new_column(tbl_fp,
"line", CPL_TYPE_INT));
436 snprintf(col,MAX_NAME_SIZE-1,
"%s%d",
"fpar",j);
437 cpl_table_new_column(tbl_fp,col, CPL_TYPE_DOUBLE);
438 snprintf(col,MAX_NAME_SIZE-1,
"%s%d",
"dpar",j);
439 cpl_table_new_column(tbl_fp,col, CPL_TYPE_DOUBLE);
442 cknull_nomsg(qclog_tbl = sinfo_qclog_init());
443 ck0_nomsg(sinfo_qclog_add_int(qclog_tbl,
"QC NLINES",n_lines,
444 "Number of found lines",
"%d"));
446 for ( i = 0 ; i < par[0] -> n_params ; i++ ) {
448 check_nomsg(cpl_table_set_int(tbl_fp,
"n_params",i,par[i]->n_params));
449 check_nomsg(cpl_table_set_int(tbl_fp,
"column",i,par[i]->column));
450 check_nomsg(cpl_table_set_int(tbl_fp,
"line",i,par[i]->line));
453 snprintf(col,MAX_NAME_SIZE-1,
"%s%d",
"fpar",j);
454 if(isnan(par[i]->fit_par[j])) {
455 cpl_table_set_invalid(tbl_fp,col,i);
457 cpl_table_set_double(tbl_fp,col,i,par[i]->fit_par[j]);
459 snprintf(col,MAX_NAME_SIZE-1,
"%s%d",
"dpar",j);
460 if(isnan(par[i]->derv_par[j])) {
461 cpl_table_set_invalid(tbl_fp,col,i);
463 cpl_table_set_double(tbl_fp,col,i,par[i]->derv_par[j]);
468 check_nomsg(fwhm_avg = cpl_table_get_column_mean(tbl_fp,
"fpar1"));
469 check_nomsg(fwhm_med = cpl_table_get_column_median(tbl_fp,
"fpar1"));
470 ck0_nomsg(sinfo_qclog_add_double(qclog_tbl,
"QC FWHM MED",fwhm_med,
471 "Median FWHM of found lines",
"%f"));
472 ck0_nomsg(sinfo_qclog_add_double(qclog_tbl,
"QC FWHM AVG",fwhm_avg,
473 "Average FWHM of found lines",
"%f"));
476 ck0(sinfo_pro_save_tbl(tbl_fp,ref_set,sof,cfg->paramsList,
477 PRO_WAVE_PAR_LIST,qclog_tbl,plugin_id,config),
478 "cannot save tbl %s", cfg->paramsList);
481 sinfo_free_table(&qclog_tbl);
482 sinfo_free_table(&tbl_fp) ;
487 sinfo_new_destroy_2Dfloatarray ( &wavelength_clean, lx );
488 sinfo_new_destroy_2Dintarray (&row_clean, lx);
489 sinfo_new_destroy_intarray(&n_found_lines );
490 sinfo_new_destroy_intarray(&sum_pointer );
491 sinfo_new_destroy_2Dfloatarray ( &acoefs, cfg->nrDispCoefficients );
492 sinfo_free_table(&tbl_line_list);
503 }
else if (cfg->wavemapInd == 1 && cfg->calibIndicator == 0) {
504 sinfo_msg(
"Wavemap");
505 acoefs = sinfo_new_2Dfloatarray ( cfg->nrDispCoefficients, lx);
508 strcpy(tbl_name,cfg->coeffsName);
509 check_nomsg(tbl_wcal = cpl_table_load(tbl_name,1,0));
511 for (i =0; i < lx; i++) {
512 for (j = 0; j< cfg->nrDispCoefficients; j++) {
513 snprintf(col_name,MAX_NAME_SIZE-1,
"%s%d",
"coeff",j);
514 acoefs[j][i]=cpl_table_get_double(tbl_wcal,col_name,i,status);
517 sinfo_free_table(&tbl_wcal);
519 cknull(map_img = sinfo_new_create_shifted_slit_wavemap2(im,
521 cfg->nrDispCoefficients,
526 cfg->guessDispersion1,
528 "sinfo_createShiftedSlitWavemap2 failed!");
530 par = sinfo_new_fit_params(15*n_lines);
531 sinfo_msg(
"Check shifts");
533 shift = sinfo_new_check_correlated_line_positions ( im, acoefs,
534 cfg->nrDispCoefficients,
541 cfg->guessDispersion1,
548 sinfo_det_ncounts(raw, cfg->qc_thresh_max,qc);
549 cknull_nomsg(qclog_tbl = sinfo_qclog_init());
551 ck0_nomsg(sinfo_qclog_add_int(qclog_tbl,
"QC NLINES",n_lines,
552 "Number of found lines",
"%d"));
554 check_nomsg(fwhm_avg = cpl_table_get_column_mean(tbl_fp,
"fpar1"));
555 check_nomsg(fwhm_med = cpl_table_get_column_median(tbl_fp,
"fpar1"));
557 ck0_nomsg(sinfo_qclog_add_double(qclog_tbl,
"QC FWHM MED",fwhm_med,
558 "Median FWHM of found lines",
"%f"));
559 ck0_nomsg(sinfo_qclog_add_double(qclog_tbl,
"QC FWHM AVG",fwhm_avg,
560 "Average FWHM of found lines",
"%f"));
562 ck0(sinfo_pro_save_ima(map_img,ref_set,sof,cfg->outName,
563 PRO_WAVE_MAP,qclog_tbl,plugin_id,config),
564 "cannot save ima %s", cfg->outName);
566 sinfo_free_table(&qclog_tbl);
567 sinfo_free_image(&map_img);
570 sinfo_new_destroy_2Dfloatarray ( &acoefs, cfg->nrDispCoefficients );
575 }
else if (cfg->wavemapInd == 1 && cfg->calibIndicator == 1) {
576 sinfo_msg_error(
"give either wavemapIndicator = yes and calibIndicator");
577 sinfo_msg_error(
"= no or wavemapIndicator = no and calibIndicator = yes") ;
586 if (cfg->slitposIndicator == 1) {
587 sinfo_msg(
"fit the slitlet sinfo_edge positions");
588 if (cfg->calibIndicator != 1 && cfg->estimateIndicator != 1) {
595 if(sinfo_is_fits_file(cfg->paramsList) !=1 ) {
599 strcpy(tbl_fitpar_name,cfg->paramsList);
600 check_nomsg(tbl_fitpar = cpl_table_load(tbl_fitpar_name,1,0));
602 check_nomsg(readsum=cpl_table_get_int(tbl_fitpar,
"n_params",1,status));
603 sinfo_free_table(&tbl_fitpar);
605 cknull(sinfo_new_fit_params( readsum ),
"sinfo_new_fit_params failed!");
607 ck0(sinfo_dumpTblToFitParams(par, cfg->paramsList),
608 "reading tbl %s ", cfg->paramsList);
612 sinfo_slit_pos = sinfo_new_2Dfloatarray(32,2);
621 if (cfg->fitBoltzIndicator == 1) {
622 if (cfg->estimateIndicator == 1) {
625 strcpy(tbl_slitpos_guess_name,cfg->slitposGuessName);
626 check_nomsg(tbl_slitpos_guess=cpl_table_load(tbl_slitpos_guess_name,1,0));
627 check_nomsg(n = cpl_table_get_nrow(tbl_slitpos_guess));
629 for (i =0 ; i< 32; i++){
630 val_x=cpl_table_get_double(tbl_slitpos_guess,
"pos1",i,status);
631 val_y=cpl_table_get_double(tbl_slitpos_guess,
"pos2",i,status);
632 sinfo_new_array2D_set_value(sinfo_slit_pos,val_x,i,0);
633 sinfo_new_array2D_set_value(sinfo_slit_pos,val_y,i,1);
635 sinfo_free_table(&tbl_slitpos_guess);
637 sinfo_msg(
"sinfo_new_fit_slits_boltz_with_estimate");
638 fit = sinfo_new_fit_slits_boltz_with_estimate(im,
650 sinfo_msg(
"sinfo_new_fit_slits_boltz");
651 fit = sinfo_new_fit_slits_boltz(im,
663 }
else if (cfg->fitEdgeIndicator == 1) {
665 if (cfg->estimateIndicator == 1){
667 strcpy(tbl_slitpos_guess_name,cfg->slitposGuessName);
668 check_nomsg(tbl_slitpos_guess=cpl_table_load(tbl_slitpos_guess_name,1,0));
669 check_nomsg(n = cpl_table_get_nrow(tbl_slitpos_guess));
671 for (i =0 ; i< 32; i++){
672 val_x=cpl_table_get_double(tbl_slitpos_guess,
"pos1",i,status);
673 val_y=cpl_table_get_double(tbl_slitpos_guess,
"pos2",i,status);
674 sinfo_new_array2D_set_value(sinfo_slit_pos,val_x,i,0);
675 sinfo_new_array2D_set_value(sinfo_slit_pos,val_y,i,1);
677 cpl_table_delete(tbl_slitpos_guess);
679 sinfo_msg(
"sinfo_new_fit_slits_edge_with_estimate");
680 fit = sinfo_new_fit_slits_edge_with_estimate(im,
692 sinfo_msg(
"sinfo_new_fit_slits_edge");
693 fit = sinfo_new_fit_slits_edge(im,
708 sinfo_free_image(&im);
711 check_nomsg(tbl_spos = cpl_table_new(32));
712 check_nomsg(cpl_table_new_column(tbl_spos,
"pos1", CPL_TYPE_DOUBLE));
713 check_nomsg(cpl_table_new_column(tbl_spos,
"pos2", CPL_TYPE_DOUBLE));
714 check_nomsg(cpl_table_set_column_format(tbl_spos,
"pos1",
"15.9f"));
715 check_nomsg(cpl_table_set_column_format(tbl_spos,
"pos2",
"15.9f"));
717 for (i =0; i< 32; i++) {
718 cpl_table_set_double(tbl_spos,
"pos1",i,
719 sinfo_new_array2D_get_value(sinfo_slit_pos,i,0));
720 cpl_table_set_double(tbl_spos,
"pos2",i,
721 sinfo_new_array2D_get_value(sinfo_slit_pos,i,1));
725 strcpy(tbl_name,
"out_slitpos_guess.fits");
726 ck0(sinfo_pro_save_tbl(tbl_spos,ref_set,sof,tbl_name,
727 PRO_SLIT_POS_GUESS,NULL,plugin_id,config),
728 "cannot save tbl %s", tbl_name);
730 strcpy(tbl_name,cfg->slitposName);
731 ck0(sinfo_pro_save_tbl(tbl_spos,ref_set,sof,tbl_name,
732 PRO_SLIT_POS,NULL,plugin_id,config),
733 "cannot save tbl %s", tbl_name);
735 sinfo_free_table(&tbl_spos);
736 sinfo_new_destroy_2Dfloatarray ( &sinfo_slit_pos, 32 );
739 if ( (cfg->slitposIndicator == 1 && cfg->estimateIndicator != 1) ||
740 (cfg->calibIndicator == 1) || (cfg->wavemapInd == 1) ){
741 sinfo_new_destroy_fit_params(&par);
749 check_nomsg(sinfo_image_resample(plugin_id,config,sof,ref_set));
808 sinfo_free_frameset(&raw);
809 sinfo_qc_wcal_delete(&qc);
810 sinfo_wavecal_free(&cfg);
815 sinfo_free_image(&map_img);
817 sinfo_free_table(&tbl_spos);
818 sinfo_free_table(&tbl_fitpar);
819 sinfo_free_image(&map_img);
820 sinfo_free_table(&tbl_wcal);
821 sinfo_free_table(&tbl_fp) ;
822 sinfo_free_table(&tbl_line_list);
823 sinfo_free_table(&tbl_wcal);
824 sinfo_free_table(&qclog_tbl);
825 sinfo_free_image(&map_img);
826 sinfo_new_destroy_fit_params(&par);
827 sinfo_new_destroy_2Dfloatarray ( &sinfo_slit_pos, 32 );
828 sinfo_new_destroy_2Dfloatarray ( &wavelength_clean, lx );
829 sinfo_new_destroy_2Dintarray (&row_clean, lx);
830 sinfo_new_destroy_intarray(&n_found_lines );
831 sinfo_new_destroy_intarray(&sum_pointer );
833 sinfo_new_destroy_2Dfloatarray(&acoefs,cfg->nrDispCoefficients);
835 sinfo_free_table(&tbl_line_list);
836 sinfo_free_image(&im);
837 sinfo_wavecal_free(&cfg);
838 sinfo_free_frameset(&raw);
839 sinfo_qc_wcal_delete(&qc);
855 static cpl_error_code
856 sinfo_image_resample(
const char* plugin_id,
857 cpl_parameterlist* config,
859 cpl_frameset* ref_set)
867 const cpl_frame* frm=NULL;
870 cpl_image* res_ima=NULL;
872 int nrows=SINFO_RESAMP_NROWS;
873 cpl_parameter* p=NULL;
874 cpl_image* wstk_img=NULL;
875 cpl_image* map_img=NULL;
878 check_nomsg(p = cpl_parameterlist_find(config,
879 "sinfoni.wavecal.n_coeffs"));
881 check_nomsg(ncoeffs=cpl_parameter_get_int(p));
883 check_nomsg(frm=cpl_frameset_find_const(sof,PRO_WAVE_LAMP_STACKED));
884 check_nomsg(strcpy(wstk_name,cpl_frame_get_filename(frm)));
885 check_nomsg(wstk_img=cpl_image_load(wstk_name,CPL_TYPE_FLOAT,0,0));
889 check_nomsg(frm=cpl_frameset_find_const(sof,PRO_WAVE_MAP));
890 check_nomsg(strcpy(map_name,cpl_frame_get_filename(frm)));
891 check_nomsg(map_img=cpl_image_load(map_name,CPL_TYPE_FLOAT,0,0));
895 cknull(res_ima = sinfo_new_defined_resampling(wstk_img,
904 " sinfo_definedResampling() failed" ) ;
907 x_cen=0.5*cpl_image_get_size_x(wstk_img);
908 ck0(sinfo_pro_save_ima(res_ima,ref_set,sof,WAVECAL_RESAMPLED_OUT_FILENAME,
909 PRO_RESAMPLED_WAVE,NULL,plugin_id,config),
910 "cannot save ima %s",WAVECAL_RESAMPLED_OUT_FILENAME);
912 sinfo_set_wcs_cal_image(res_ima,WAVECAL_RESAMPLED_OUT_FILENAME,
913 (
double)x_cen,(
double)x_cen,1.,(
double)cpix,cwav,dis);
917 sinfo_free_image(&map_img);
918 sinfo_free_image(&res_ima);
919 sinfo_free_image(&wstk_img);
920 return cpl_error_get_code();
#define sinfo_msg_error(...)
Print an error message.