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_utils_wrappers.h"
47 #include "sinfo_error.h"
58 sinfo_image_resample(
const char* plugin_id,
59 cpl_parameterlist* config,
61 cpl_frameset* ref_set);
116 sinfo_new_wave_cal_slit2(
const char* plugin_id,
117 cpl_parameterlist* config,
118 cpl_frameset* sof,cpl_frameset* ref_set)
120 wave_config * cfg =NULL;
121 char col_name[MAX_NAME_SIZE];
122 char tbl_name[MAX_NAME_SIZE];
123 char tbl_fitpar_name[MAX_NAME_SIZE];
124 char tbl_line_list_name[MAX_NAME_SIZE];
125 char tbl_slitpos_guess_name[MAX_NAME_SIZE];
126 char key_name[MAX_NAME_SIZE];
127 char col[MAX_NAME_SIZE];
143 int* n_found_lines=NULL;
144 int* sum_pointer=NULL;
145 int** row_clean=NULL;
156 float** wavelength_clean=NULL;
157 float** sinfo_slit_pos=NULL;
164 cpl_image * im=NULL ;
166 FitParams** par=NULL;
168 cpl_table* tbl_wcal=NULL;
169 cpl_table* tbl_spos=NULL;
170 cpl_table* tbl_fitpar = NULL;
171 cpl_table* tbl_line_list = NULL;
172 cpl_table* tbl_slitpos_guess=NULL;
173 cpl_table * tbl_fp =NULL;
174 cpl_table* qclog_tbl=NULL;
176 cpl_image* map_img=NULL;
178 cpl_frameset* raw=NULL;
179 cpl_parameter* p=NULL;
181 qc_wcal* qc=sinfo_qc_wcal_new();
190 check_nomsg(p=cpl_parameterlist_find(config,
"sinfoni.product.density"));
191 check_nomsg(pdensity=cpl_parameter_get_int(p));
194 sinfo_msg(
"Parsing cpl input");
195 check_nomsg(raw=cpl_frameset_new());
196 cknull(cfg = sinfo_parse_cpl_input_wave(config,sof,&raw),
197 "could not parse cpl input!") ;
199 check_nomsg(p = cpl_parameterlist_find(config,
200 "sinfoni.wavecal.slitpos_boostrap"));
201 check_nomsg(sw=cpl_parameter_get_bool(p));
205 cfg->calibIndicator=1;
207 cfg->slitposIndicator=1;
208 sinfo_msg(
"***********************************");
209 sinfo_msg(
"parameter setting for %s",PRO_WAVE_SLITPOS_STACKED);
210 sinfo_msg(
"***********************************");
213 if(sinfo_is_fits_file(cfg->inFrame) != 1) {
214 sinfo_msg_error(
"Input file cfg->inFrame %s is not FITS",cfg->inFrame);
219 if (cfg->slitposIndicator == 1 && cfg->estimateIndicator == 1) {
220 if (sinfo_is_fits_file(cfg->slitposGuessName) != 1) {
226 if (cfg->calibIndicator == 0 && cfg->wavemapInd == 1) {
227 if (sinfo_is_fits_file(cfg->coeffsName) != 1) {
233 if (cfg->slitposIndicator == 1) {
234 if (cfg->calibIndicator != 1 && cfg->estimateIndicator != 1) {
235 if (sinfo_is_fits_file(cfg->paramsList) != 1) {
243 check(im = cpl_image_load(cfg->inFrame,CPL_TYPE_FLOAT,0,0)
244 ,
"could not load image");
245 lx = cpl_image_get_size_x(im);
250 if (cfg->calibIndicator == 1 || cfg->wavemapInd == 1) {
252 strcpy(tbl_line_list_name,cfg->lineList);
253 check_nomsg(tbl_line_list = cpl_table_load(tbl_line_list_name,1,0));
254 check_nomsg(n = cpl_table_get_nrow(tbl_line_list));
257 check_nomsg(wave = cpl_table_get_data_float(tbl_line_list,
"wave"));
258 cpl_type type=cpl_table_get_column_type(tbl_line_list,
"int");
259 if(type==CPL_TYPE_INT) {
260 check_nomsg(cpl_table_cast_column(tbl_line_list,
"int",
"fint",CPL_TYPE_FLOAT));
261 check_nomsg(intens = cpl_table_get_data_float(tbl_line_list,
"fint"));
263 check_nomsg(intens = cpl_table_get_data_float(tbl_line_list,
"int"));
282 if (cfg->calibIndicator == 1 && cfg->wavemapInd == 0) {
283 sinfo_msg(
"Findlines");
284 acoefs = sinfo_new_2Dfloatarray(cfg->nrDispCoefficients, lx);
287 n_found_lines = sinfo_new_intarray(lx);
288 row_clean = sinfo_new_2Dintarray(lx, n_lines);
289 wavelength_clean = sinfo_new_2Dfloatarray(lx, n_lines);
290 sum_pointer = sinfo_new_intarray(1) ;
293 sinfo_new_intarray_set_value(sum_pointer, 0, 0);
295 ck0(check = sinfo_new_find_lines(im,
301 cfg->guessBeginWavelength,
302 cfg->guessDispersion1,
303 cfg->guessDispersion2,
309 "sinfo_findLines failed!");
315 sinfo_msg(
"Wave Calibration");
316 sum = sinfo_new_intarray_get_value(sum_pointer,0);
318 cknull(par = sinfo_new_fit_params( sum ),
319 "sinfo_newFitParams failed!");
325 cknull(map_img = sinfo_new_wave_cal(im,
332 cfg->guessDispersion1,
337 cfg->nrDispCoefficients,
338 cfg->nrCoefCoefficients,
341 cfg->pixel_tolerance),
342 "sinfo_wave_cal failed!");
344 sinfo_msg(
"Check line positions");
346 shift=sinfo_new_check_line_positions(im,acoefs,cfg->nrDispCoefficients,
347 cfg->guessDispersion1,par);
353 sinfo_det_ncounts(raw, cfg->qc_thresh_max, qc);
355 cknull_nomsg(qclog_tbl = sinfo_qclog_init());
356 ck0_nomsg(sinfo_qclog_add_int(qclog_tbl,
"QC WAVE ALL",n_lines,
357 "Number of found lines",
"%d"));
358 ck0_nomsg(sinfo_qclog_add_int(qclog_tbl,
"QC WAVE NPIXSAT",qc->nsat,
359 "Number of saturated pixels",
"%d"));
360 ck0_nomsg(sinfo_qclog_add_double(qclog_tbl,
"QC WAVE MAXFLUX",qc->max_di,
361 "Max int off-lamp subtracted frm",
"%g"));
362 ck0_nomsg(sinfo_qclog_add_double(qclog_tbl,
"QC WAVE POSERR",shift,
363 "Overall positioning error in mum",
"%g"));
365 ck0(sinfo_pro_save_ima(map_img,ref_set,sof,cfg->outName,
366 PRO_WAVE_MAP,qclog_tbl,plugin_id,config),
367 "cannot save ima %s", cfg->outName);
369 sinfo_free_table(&qclog_tbl);
370 sinfo_free_image(&map_img);
377 if (cfg->writeCoeffsInd == 1) {
378 check_nomsg(tbl_wcal = cpl_table_new(lx));
379 for (i=0; i< cfg->nrDispCoefficients; i++) {
380 snprintf(col_name,MAX_NAME_SIZE-1,
"%s%d",
"coeff",i);
381 check_nomsg(cpl_table_new_column(tbl_wcal,col_name, CPL_TYPE_DOUBLE));
384 cknull_nomsg(qclog_tbl = sinfo_qclog_init());
385 ck0_nomsg(sinfo_qclog_add_int(qclog_tbl,
"QC WAVE ALL",n_lines,
386 "Number found lines",
"%d"));
388 for (j=0; j< lx; j++) {
389 for (i=0; i< cfg->nrDispCoefficients; i++) {
390 snprintf(col_name,MAX_NAME_SIZE-1,
"%s%d",
"coeff",i);
391 a = sinfo_new_array2D_get_value(acoefs, i, j);
393 cpl_table_set_double(tbl_wcal,col_name,j,a);
396 for (i=0; i< cfg->nrDispCoefficients; i++) {
397 snprintf(col_name,MAX_NAME_SIZE-1,
"%s%d",
"coeff",i);
398 check_nomsg(coef_avg=cpl_table_get_column_mean(tbl_wcal,col_name));
399 check_nomsg(coef_med=cpl_table_get_column_median(tbl_wcal,col_name));
401 snprintf(key_name,MAX_NAME_SIZE-1,
"%s%d%s",
"QC COEF",i,
" AVG");
402 ck0_nomsg(sinfo_qclog_add_double(qclog_tbl,key_name,coef_avg,
403 "Average wavecal Coef",
"%g"));
405 snprintf(key_name,MAX_NAME_SIZE-1,
"%s%d%s",
"QC COEF",i,
" MED");
406 ck0_nomsg(sinfo_qclog_add_double(qclog_tbl,key_name,coef_med,
407 "Median wavecal Coef",
"%g"));
411 strcpy(tbl_name,cfg->coeffsName);
412 ck0(sinfo_pro_save_tbl(tbl_wcal,ref_set,sof,tbl_name,
413 PRO_WAVE_COEF_SLIT,qclog_tbl,plugin_id,config),
414 "cannot save tbl %s", tbl_name);
415 sinfo_free_table(&tbl_wcal);
416 sinfo_free_table(&qclog_tbl);
424 if (cfg->writeParInd == 1) {
425 sinfo_new_dump_fit_params_to_ascii(par,WAVECAL_FIT_PARAMS_OUT_FILEASCII);
427 cknull(par,
"no fit parameters available!") ;
428 cknull(cfg->paramsList,
"no filename available!") ;
429 check_nomsg(tbl_fp = cpl_table_new(par[0] -> n_params));
430 check_nomsg(cpl_table_new_column(tbl_fp,
"n_params", CPL_TYPE_INT));
431 check_nomsg(cpl_table_new_column(tbl_fp,
"column", CPL_TYPE_INT));
432 check_nomsg(cpl_table_new_column(tbl_fp,
"line", CPL_TYPE_INT));
435 snprintf(col,MAX_NAME_SIZE-1,
"%s%d",
"fpar",j);
436 cpl_table_new_column(tbl_fp,col, CPL_TYPE_DOUBLE);
437 snprintf(col,MAX_NAME_SIZE-1,
"%s%d",
"dpar",j);
438 cpl_table_new_column(tbl_fp,col, CPL_TYPE_DOUBLE);
441 cknull_nomsg(qclog_tbl = sinfo_qclog_init());
442 ck0_nomsg(sinfo_qclog_add_int(qclog_tbl,
"QC NLINES",n_lines,
443 "Number of found lines",
"%d"));
445 for ( i = 0 ; i < par[0] -> n_params ; i++ ) {
447 check_nomsg(cpl_table_set_int(tbl_fp,
"n_params",i,par[i]->n_params));
448 check_nomsg(cpl_table_set_int(tbl_fp,
"column",i,par[i]->column));
449 check_nomsg(cpl_table_set_int(tbl_fp,
"line",i,par[i]->line));
452 snprintf(col,MAX_NAME_SIZE-1,
"%s%d",
"fpar",j);
453 if(isnan(par[i]->fit_par[j])) {
454 cpl_table_set_invalid(tbl_fp,col,i);
456 cpl_table_set_double(tbl_fp,col,i,par[i]->fit_par[j]);
458 snprintf(col,MAX_NAME_SIZE-1,
"%s%d",
"dpar",j);
459 if(isnan(par[i]->derv_par[j])) {
460 cpl_table_set_invalid(tbl_fp,col,i);
462 cpl_table_set_double(tbl_fp,col,i,par[i]->derv_par[j]);
467 check_nomsg(fwhm_avg = cpl_table_get_column_mean(tbl_fp,
"fpar1"));
468 check_nomsg(fwhm_med = cpl_table_get_column_median(tbl_fp,
"fpar1"));
469 ck0_nomsg(sinfo_qclog_add_double(qclog_tbl,
"QC FWHM MED",fwhm_med,
470 "Median FWHM of found lines",
"%f"));
471 ck0_nomsg(sinfo_qclog_add_double(qclog_tbl,
"QC FWHM AVG",fwhm_avg,
472 "Average FWHM of found lines",
"%f"));
475 ck0(sinfo_pro_save_tbl(tbl_fp,ref_set,sof,cfg->paramsList,
476 PRO_WAVE_PAR_LIST,qclog_tbl,plugin_id,config),
477 "cannot save tbl %s", cfg->paramsList);
480 sinfo_free_table(&qclog_tbl);
481 sinfo_free_table(&tbl_fp) ;
486 sinfo_new_destroy_2Dfloatarray ( &wavelength_clean, lx );
487 sinfo_new_destroy_2Dintarray (&row_clean, lx);
488 sinfo_new_destroy_intarray(&n_found_lines );
489 sinfo_new_destroy_intarray(&sum_pointer );
490 sinfo_new_destroy_2Dfloatarray ( &acoefs, cfg->nrDispCoefficients );
491 sinfo_free_table(&tbl_line_list);
502 }
else if (cfg->wavemapInd == 1 && cfg->calibIndicator == 0) {
503 sinfo_msg(
"Wavemap");
504 acoefs = sinfo_new_2Dfloatarray ( cfg->nrDispCoefficients, lx);
507 strcpy(tbl_name,cfg->coeffsName);
508 check_nomsg(tbl_wcal = cpl_table_load(tbl_name,1,0));
510 for (i =0; i < lx; i++) {
511 for (j = 0; j< cfg->nrDispCoefficients; j++) {
512 snprintf(col_name,MAX_NAME_SIZE-1,
"%s%d",
"coeff",j);
513 acoefs[j][i]=cpl_table_get_double(tbl_wcal,col_name,i,status);
516 sinfo_free_table(&tbl_wcal);
518 cknull(map_img = sinfo_new_create_shifted_slit_wavemap2(im,
520 cfg->nrDispCoefficients,
525 cfg->guessDispersion1,
527 "sinfo_createShiftedSlitWavemap2 failed!");
529 par = sinfo_new_fit_params(15*n_lines);
530 sinfo_msg(
"Check shifts");
532 shift = sinfo_new_check_correlated_line_positions ( im, acoefs,
533 cfg->nrDispCoefficients,
540 cfg->guessDispersion1,
547 sinfo_det_ncounts(raw, cfg->qc_thresh_max,qc);
548 cknull_nomsg(qclog_tbl = sinfo_qclog_init());
550 ck0_nomsg(sinfo_qclog_add_int(qclog_tbl,
"QC NLINES",n_lines,
551 "Number of found lines",
"%d"));
553 check_nomsg(fwhm_avg = cpl_table_get_column_mean(tbl_fp,
"fpar1"));
554 check_nomsg(fwhm_med = cpl_table_get_column_median(tbl_fp,
"fpar1"));
556 ck0_nomsg(sinfo_qclog_add_double(qclog_tbl,
"QC FWHM MED",fwhm_med,
557 "Median FWHM of found lines",
"%f"));
558 ck0_nomsg(sinfo_qclog_add_double(qclog_tbl,
"QC FWHM AVG",fwhm_avg,
559 "Average FWHM of found lines",
"%f"));
561 ck0(sinfo_pro_save_ima(map_img,ref_set,sof,cfg->outName,
562 PRO_WAVE_MAP,qclog_tbl,plugin_id,config),
563 "cannot save ima %s", cfg->outName);
565 sinfo_free_table(&qclog_tbl);
566 sinfo_free_image(&map_img);
569 sinfo_new_destroy_2Dfloatarray ( &acoefs, cfg->nrDispCoefficients );
574 }
else if (cfg->wavemapInd == 1 && cfg->calibIndicator == 1) {
575 sinfo_msg_error(
"give either wavemapIndicator = yes and calibIndicator");
576 sinfo_msg_error(
"= no or wavemapIndicator = no and calibIndicator = yes") ;
585 if (cfg->slitposIndicator == 1) {
586 sinfo_msg(
"fit the slitlet sinfo_edge positions");
587 if (cfg->calibIndicator != 1 && cfg->estimateIndicator != 1) {
594 if(sinfo_is_fits_file(cfg->paramsList) !=1 ) {
598 strcpy(tbl_fitpar_name,cfg->paramsList);
599 check_nomsg(tbl_fitpar = cpl_table_load(tbl_fitpar_name,1,0));
601 check_nomsg(readsum=cpl_table_get_int(tbl_fitpar,
"n_params",1,status));
602 sinfo_free_table(&tbl_fitpar);
604 cknull(sinfo_new_fit_params( readsum ),
"sinfo_new_fit_params failed!");
606 ck0(sinfo_dumpTblToFitParams(par, cfg->paramsList),
607 "reading tbl %s ", cfg->paramsList);
611 sinfo_slit_pos = sinfo_new_2Dfloatarray(32,2);
620 if (cfg->fitBoltzIndicator == 1) {
621 if (cfg->estimateIndicator == 1) {
624 strcpy(tbl_slitpos_guess_name,cfg->slitposGuessName);
625 check_nomsg(tbl_slitpos_guess=cpl_table_load(tbl_slitpos_guess_name,1,0));
626 check_nomsg(n = cpl_table_get_nrow(tbl_slitpos_guess));
628 for (i =0 ; i< 32; i++){
629 val_x=cpl_table_get_double(tbl_slitpos_guess,
"pos1",i,status);
630 val_y=cpl_table_get_double(tbl_slitpos_guess,
"pos2",i,status);
631 sinfo_new_array2D_set_value(sinfo_slit_pos,val_x,i,0);
632 sinfo_new_array2D_set_value(sinfo_slit_pos,val_y,i,1);
634 sinfo_free_table(&tbl_slitpos_guess);
636 sinfo_msg(
"sinfo_new_fit_slits_boltz_with_estimate");
649 sinfo_msg(
"sinfo_new_fit_slits_boltz");
662 }
else if (cfg->fitEdgeIndicator == 1) {
664 if (cfg->estimateIndicator == 1){
666 strcpy(tbl_slitpos_guess_name,cfg->slitposGuessName);
667 check_nomsg(tbl_slitpos_guess=cpl_table_load(tbl_slitpos_guess_name,1,0));
668 check_nomsg(n = cpl_table_get_nrow(tbl_slitpos_guess));
670 for (i =0 ; i< 32; i++){
671 val_x=cpl_table_get_double(tbl_slitpos_guess,
"pos1",i,status);
672 val_y=cpl_table_get_double(tbl_slitpos_guess,
"pos2",i,status);
673 sinfo_new_array2D_set_value(sinfo_slit_pos,val_x,i,0);
674 sinfo_new_array2D_set_value(sinfo_slit_pos,val_y,i,1);
676 cpl_table_delete(tbl_slitpos_guess);
678 sinfo_msg(
"sinfo_new_fit_slits_edge_with_estimate");
679 fit = sinfo_new_fit_slits_edge_with_estimate(im,
691 sinfo_msg(
"sinfo_new_fit_slits_edge");
692 fit = sinfo_new_fit_slits_edge(im,
707 sinfo_free_image(&im);
710 check_nomsg(tbl_spos = cpl_table_new(32));
711 check_nomsg(cpl_table_new_column(tbl_spos,
"pos1", CPL_TYPE_DOUBLE));
712 check_nomsg(cpl_table_new_column(tbl_spos,
"pos2", CPL_TYPE_DOUBLE));
713 check_nomsg(cpl_table_set_column_format(tbl_spos,
"pos1",
"15.9f"));
714 check_nomsg(cpl_table_set_column_format(tbl_spos,
"pos2",
"15.9f"));
716 for (i =0; i< 32; i++) {
717 cpl_table_set_double(tbl_spos,
"pos1",i,
718 sinfo_new_array2D_get_value(sinfo_slit_pos,i,0));
719 cpl_table_set_double(tbl_spos,
"pos2",i,
720 sinfo_new_array2D_get_value(sinfo_slit_pos,i,1));
724 strcpy(tbl_name,
"out_slitpos_guess.fits");
725 ck0(sinfo_pro_save_tbl(tbl_spos,ref_set,sof,tbl_name,
726 PRO_SLIT_POS_GUESS,NULL,plugin_id,config),
727 "cannot save tbl %s", tbl_name);
729 strcpy(tbl_name,cfg->slitposName);
730 ck0(sinfo_pro_save_tbl(tbl_spos,ref_set,sof,tbl_name,
731 PRO_SLIT_POS,NULL,plugin_id,config),
732 "cannot save tbl %s", tbl_name);
734 sinfo_free_table(&tbl_spos);
735 sinfo_new_destroy_2Dfloatarray ( &sinfo_slit_pos, 32 );
738 if ( (cfg->slitposIndicator == 1 && cfg->estimateIndicator != 1) ||
739 (cfg->calibIndicator == 1) || (cfg->wavemapInd == 1) ){
740 sinfo_new_destroy_fit_params(&par);
748 check_nomsg(sinfo_image_resample(plugin_id,config,sof,ref_set));
807 sinfo_free_frameset(&raw);
808 sinfo_qc_wcal_delete(&qc);
809 sinfo_wavecal_free(&cfg);
814 sinfo_free_image(&map_img);
816 sinfo_free_table(&tbl_spos);
817 sinfo_free_table(&tbl_fitpar);
818 sinfo_free_image(&map_img);
819 sinfo_free_table(&tbl_wcal);
820 sinfo_free_table(&tbl_fp) ;
821 sinfo_free_table(&tbl_line_list);
822 sinfo_free_table(&tbl_wcal);
823 sinfo_free_table(&qclog_tbl);
824 sinfo_free_image(&map_img);
825 sinfo_new_destroy_fit_params(&par);
826 sinfo_new_destroy_2Dfloatarray ( &sinfo_slit_pos, 32 );
827 sinfo_new_destroy_2Dfloatarray ( &wavelength_clean, lx );
828 sinfo_new_destroy_2Dintarray (&row_clean, lx);
829 sinfo_new_destroy_intarray(&n_found_lines );
830 sinfo_new_destroy_intarray(&sum_pointer );
832 sinfo_new_destroy_2Dfloatarray(&acoefs,cfg->nrDispCoefficients);
834 sinfo_free_table(&tbl_line_list);
835 sinfo_free_image(&im);
836 sinfo_wavecal_free(&cfg);
837 sinfo_free_frameset(&raw);
838 sinfo_qc_wcal_delete(&qc);
854 static cpl_error_code
855 sinfo_image_resample(
const char* plugin_id,
856 cpl_parameterlist* config,
858 cpl_frameset* ref_set)
866 const cpl_frame* frm=NULL;
869 cpl_image* res_ima=NULL;
871 int nrows=SINFO_RESAMP_NROWS;
872 cpl_parameter* p=NULL;
873 cpl_image* wstk_img=NULL;
874 cpl_image* map_img=NULL;
876 check_nomsg(p = cpl_parameterlist_find(config,
877 "sinfoni.wavecal.n_coeffs"));
879 check_nomsg(ncoeffs=cpl_parameter_get_int(p));
881 check_nomsg(frm=cpl_frameset_find_const(sof,PRO_WAVE_LAMP_STACKED));
882 check_nomsg(strcpy(wstk_name,cpl_frame_get_filename(frm)));
883 check_nomsg(wstk_img=cpl_image_load(wstk_name,CPL_TYPE_FLOAT,0,0));
887 check_nomsg(frm=cpl_frameset_find_const(sof,PRO_WAVE_MAP));
888 check_nomsg(strcpy(map_name,cpl_frame_get_filename(frm)));
889 check_nomsg(map_img=cpl_image_load(map_name,CPL_TYPE_FLOAT,0,0));
893 cknull(res_ima = sinfo_new_defined_resampling(wstk_img,
902 " sinfo_definedResampling() failed" ) ;
906 ck0(sinfo_pro_save_ima(res_ima,ref_set,sof,WAVECAL_RESAMPLED_OUT_FILENAME,
907 PRO_RESAMPLED_WAVE,NULL,plugin_id,config),
908 "cannot save ima %s",WAVECAL_RESAMPLED_OUT_FILENAME);
913 sinfo_free_image(&map_img);
914 sinfo_free_image(&res_ima);
915 sinfo_free_image(&wstk_img);
916 return cpl_error_get_code();