34 #include "sinfo_new_slit_pos.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_wave_calibration.h"
40 #include "sinfo_utilities.h"
41 #include "sinfo_utils_wrappers.h"
42 #include "sinfo_hidden.h"
43 #include "sinfo_error.h"
44 #include "sinfo_globals.h"
106 int sinfo_new_slit_pos (cpl_parameterlist* config, cpl_frameset* sof)
108 wave_config * cfg =NULL;
119 int* n_found_lines=NULL;
120 int* sum_pointer=NULL;
121 int** row_clean=NULL;
129 float** wavelength_clean=NULL;
131 float** sinfo_slit_pos=NULL;
133 cpl_image * map=NULL ;
134 cpl_image * im=NULL ;
136 FitParams** par=NULL;
138 cpl_table* tbl_wcal=NULL;
139 cpl_table* tbl_spos=NULL;
144 char* tbl_line_list_name=NULL;
145 cpl_table* tbl_line_list = NULL;
148 cpl_frameset* raw=NULL;
151 cpl_table * tbl_fp =NULL;
153 cpl_table* qclog_tbl=NULL;
160 qc_wcal* qc=sinfo_qc_wcal_new();
167 sinfo_msg(
"Parsing cpl input");
168 cfg = sinfo_parse_cpl_input_wave(config,sof,&raw) ;
172 cfg->calibIndicator=1;
174 cfg->slitposIndicator=1;
176 if(cpl_error_get_code() != CPL_ERROR_NONE) {
178 sinfo_qc_wcal_delete(&qc);
185 sinfo_qc_wcal_delete(&qc);
188 if(sinfo_is_fits_file(cfg->inFrame) != 1) {
190 sinfo_qc_wcal_delete(&qc);
195 if (cfg->slitposIndicator == 1 && cfg->estimateIndicator == 1) {
196 if (sinfo_is_fits_file(cfg->slitposGuessName) != 1) {
198 sinfo_qc_wcal_delete(&qc);
203 if (cfg->calibIndicator == 0 && cfg->wavemapInd == 1) {
204 if (sinfo_is_fits_file(cfg->coeffsName) != 1) {
206 sinfo_qc_wcal_delete(&qc);
212 if (cfg->slitposIndicator == 1) {
213 if (cfg->calibIndicator != 1 && cfg->estimateIndicator != 1) {
215 if (sinfo_is_fits_file(cfg->paramsList) != 1) {
217 sinfo_qc_wcal_delete(&qc);
225 im = cpl_image_load(cfg->inFrame,CPL_TYPE_FLOAT,0,0);
228 sinfo_qc_wcal_delete(&qc);
233 lx = cpl_image_get_size_x(im);
238 if (cfg->calibIndicator == 1 || cfg->wavemapInd == 1) {
241 if(cpl_error_get_code() != CPL_ERROR_NONE) {
243 sinfo_qc_wcal_delete(&qc);
244 cpl_image_delete(im);
248 tbl_line_list_name=cfg->lineList;
249 tbl_line_list = cpl_table_load(tbl_line_list_name,1,0);
250 if(cpl_error_get_code() != CPL_ERROR_NONE) {
252 sinfo_qc_wcal_delete(&qc);
255 n = cpl_table_get_nrow(tbl_line_list);
257 if(cpl_error_get_code() != CPL_ERROR_NONE) {
259 sinfo_qc_wcal_delete(&qc);
260 cpl_image_delete(im);
274 wave = cpl_table_get_data_float(tbl_line_list,
"wave");
275 if(cpl_error_get_code() != CPL_ERROR_NONE) {
277 sinfo_qc_wcal_delete(&qc);
278 cpl_image_delete(im);
282 intens = cpl_table_get_data_float(tbl_line_list,
"int");
283 if(cpl_error_get_code() != CPL_ERROR_NONE) {
285 sinfo_qc_wcal_delete(&qc);
286 cpl_image_delete(im);
310 if (cfg->calibIndicator == 1 && cfg->wavemapInd == 0) {
311 sinfo_msg(
"Findlines");
312 acoefs = sinfo_new_2Dfloatarray(cfg->nrDispCoefficients, lx);
314 n_found_lines = sinfo_new_intarray(lx);
315 row_clean = sinfo_new_2Dintarray(lx, n_lines);
316 wavelength_clean = sinfo_new_2Dfloatarray(lx, n_lines);
317 sum_pointer = sinfo_new_intarray(1) ;
319 sinfo_new_intarray_set_value(sum_pointer, 0, 0);
320 check = sinfo_new_find_lines(im, wave, intens, n_lines, row_clean,
321 wavelength_clean, cfg->guessBeginWavelength,
322 cfg->guessDispersion1, cfg->guessDispersion2,
323 cfg->mindiff, cfg->halfWidth,
324 n_found_lines, cfg->sigma, sum_pointer );
327 sinfo_qc_wcal_delete(&qc);
338 sinfo_msg(
"Wave Calibration");
339 sum = sinfo_new_intarray_get_value(sum_pointer,0);
341 par = sinfo_new_fit_params( sum );
344 sinfo_qc_wcal_delete(&qc);
352 sinfo_slit_pos = sinfo_new_2Dfloatarray(32,2);
354 map = sinfo_new_spred_wave_cal(im,
361 cfg->guessDispersion1,
366 cfg->nrDispCoefficients,
367 cfg->nrCoefCoefficients,
370 cfg->pixel_tolerance,
376 sinfo_qc_wcal_delete(&qc);
379 sinfo_msg(
"Check line positions");
381 shift = sinfo_new_check_line_positions (im, acoefs,
382 cfg->nrDispCoefficients,
383 cfg->guessDispersion1, par);
389 sinfo_det_ncounts(raw, cfg->qc_thresh_max,qc);
390 qclog_tbl = sinfo_qclog_init();
391 ck0_nomsg(sinfo_qclog_add_int(qclog_tbl,
"QC WAVE ALL",
392 n_lines,
"Number of found lines",
"%d"));
394 ck0_nomsg(sinfo_qclog_add_int(qclog_tbl,
"QC WAVE NPIXSAT",
395 qc->nsat,
"Number of saturated pixels",
"%d"));
397 ck0_nomsg(sinfo_qclog_add_int(qclog_tbl,
"QC WAVE MAXFLUX",
398 qc->max_di,
"Max int off-lamp subracted frm",
"%g"));
400 if(-1 == sinfo_pro_save_ima(map,raw,sof,cfg->outName,
401 PRO_WAVE_MAP,qclog_tbl,cpl_func,config)) {
404 sinfo_free_table(&qclog_tbl);
412 if (cfg->writeCoeffsInd == 1) {
413 col_name = (
char*) cpl_calloc(MAX_NAME_SIZE,
sizeof(
char*));
414 tbl_name = (
char*) cpl_calloc(MAX_NAME_SIZE,
sizeof(
char*));
415 tbl_wcal = cpl_table_new(lx);
416 for (i=0; i< cfg->nrDispCoefficients; i++) {
417 snprintf(col_name,MAX_NAME_SIZE-1,
"%s%d",
"coeff",i);
418 cpl_table_new_column(tbl_wcal,col_name, CPL_TYPE_DOUBLE);
422 qclog_tbl = sinfo_qclog_init();
423 key_name = cpl_calloc(FILE_NAME_SZ,
sizeof(
char));
424 ck0_nomsg(sinfo_qclog_add_int(qclog_tbl,
"QC WAVE ALL",
425 n_lines,
"Number of found lines",
"%d"));
429 for (j=0; j< lx; j++) {
430 for (i=0; i< cfg->nrDispCoefficients; i++) {
431 snprintf(col_name,MAX_NAME_SIZE-1,
"%s%d",
"coeff",i);
432 a = sinfo_new_array2D_get_value(acoefs, i, j);
434 cpl_table_set_double(tbl_wcal,col_name,j,a);
441 for (i=0; i< cfg->nrDispCoefficients; i++) {
442 snprintf(col_name,MAX_NAME_SIZE-1,
"%s%d",
"coeff",i);
443 coef_avg=cpl_table_get_column_mean(tbl_wcal,col_name);
444 coef_med=cpl_table_get_column_median(tbl_wcal,col_name);
447 snprintf(key_name,MAX_NAME_SIZE-1,
"%s%d%s",
"QC COEF",i,
" AVG");
448 ck0_nomsg(sinfo_qclog_add_double(qclog_tbl,key_name,coef_avg,
449 "Average wavecal Coef",
"%g"));
452 snprintf(key_name,MAX_NAME_SIZE-1,
"%s%d%s",
"QC COEF",i,
" MED");
453 ck0_nomsg(sinfo_qclog_add_double(qclog_tbl,key_name,coef_med,
454 "Median wavecal Coef",
"%g"));
461 strcpy(tbl_name,cfg->coeffsName);
463 if(-1 == sinfo_pro_save_tbl(tbl_wcal,raw,sof,tbl_name,
464 PRO_WAVE_COEF_SLIT,qclog_tbl,cpl_func,config)) {
467 sinfo_free_table(&tbl_wcal);
468 sinfo_free_table(&qclog_tbl);
480 if (cfg->writeParInd == 1) {
483 sinfo_new_dump_fit_params_to_ascii(par,WAVECAL_FIT_PARAMS_OUT_FILEASCII);
488 sinfo_qc_wcal_delete(&qc);
492 if ( NULL == cfg->paramsList )
495 sinfo_qc_wcal_delete(&qc);
499 tbl_fp = cpl_table_new(par[0] -> n_params);
500 cpl_table_new_column(tbl_fp,
"n_params", CPL_TYPE_INT);
501 cpl_table_new_column(tbl_fp,
"column", CPL_TYPE_INT);
502 cpl_table_new_column(tbl_fp,
"line", CPL_TYPE_INT);
503 col = (
char*) cpl_calloc(MAX_NAME_SIZE,
sizeof(
char*));
506 snprintf(col,MAX_NAME_SIZE-1,
"%s%d",
"fpar",j);
507 cpl_table_new_column(tbl_fp,col, CPL_TYPE_DOUBLE);
508 snprintf(col,MAX_NAME_SIZE-1,
"%s%d",
"dpar",j);
509 cpl_table_new_column(tbl_fp,col, CPL_TYPE_DOUBLE);
514 qclog_tbl = sinfo_qclog_init();
515 ck0_nomsg(sinfo_qclog_add_int(qclog_tbl,
"QC NLINES",n_lines,
516 "Number of Found lines",
"%d"));
518 for ( i = 0 ; i < par[0] -> n_params ; i++ )
520 cpl_table_set_int(tbl_fp,
"n_params",i,par[i]->n_params);
521 cpl_table_set_int(tbl_fp,
"column",i,par[i]->column);
522 cpl_table_set_int(tbl_fp,
"line",i,par[i]->line);
526 snprintf(col,MAX_NAME_SIZE-1,
"%s%d",
"fpar",j);
527 cpl_table_set_double(tbl_fp,col,i,par[i]->fit_par[j]);
528 snprintf(col,MAX_NAME_SIZE-1,
"%s%d",
"dpar",j);
529 cpl_table_set_double(tbl_fp,col,i,par[i]->derv_par[j]);
533 fwhm_avg = cpl_table_get_column_mean(tbl_fp,
"fpar1");
534 fwhm_med = cpl_table_get_column_median(tbl_fp,
"fpar1");
535 ck0_nomsg(sinfo_qclog_add_double(qclog_tbl,
"QC FWHM MED",fwhm_med,
536 "Median FWHM of found lines",
"%f"));
538 ck0_nomsg(sinfo_qclog_add_double(qclog_tbl,
"QC FWHM AVG",fwhm_avg,
539 "Average FWHM of found lines",
"%f"));
542 if(-1 == sinfo_pro_save_tbl(tbl_fp,raw,sof,cfg->paramsList,
543 PRO_WAVE_PAR_LIST,qclog_tbl,cpl_func,config)) {
546 sinfo_free_table(&qclog_tbl);
548 sinfo_free_table(&tbl_fp) ;
553 sinfo_new_destroy_2Dfloatarray ( &wavelength_clean, lx );
554 sinfo_new_destroy_2Dintarray (&row_clean, lx);
555 sinfo_new_destroy_intarray(&n_found_lines );
556 sinfo_new_destroy_intarray(&sum_pointer );
557 sinfo_new_destroy_2Dfloatarray ( &acoefs, cfg->nrDispCoefficients );
567 }
else if (cfg->wavemapInd == 1 && cfg->calibIndicator == 0) {
568 sinfo_msg(
"Wavemap");
569 acoefs = sinfo_new_2Dfloatarray ( cfg->nrDispCoefficients, lx);
572 tbl_name = (
char*) cpl_calloc(MAX_NAME_SIZE,
sizeof(
char*));
573 col_name = (
char*) cpl_calloc(MAX_NAME_SIZE,
sizeof(
char*));
574 strcpy(tbl_name,cfg->coeffsName);
575 tbl_wcal = cpl_table_load(tbl_name,1,0);
576 if(cpl_error_get_code() != CPL_ERROR_NONE) {
577 sinfo_msg(
"cannot load table %s",tbl_name);
579 sinfo_qc_wcal_delete(&qc);
580 cpl_image_delete(im);
584 for (i =0; i < lx; i++) {
585 for (j = 0; j< cfg->nrDispCoefficients; j++) {
586 snprintf(col_name,MAX_NAME_SIZE-1,
"%s%d",
"coeff",j);
587 acoefs[j][i]=cpl_table_get_double(tbl_wcal,col_name,i,status);
590 if(cpl_error_get_code() != CPL_ERROR_NONE) {
591 sinfo_msg(
"cannot read table %s",tbl_name);
593 sinfo_qc_wcal_delete(&qc);
598 sinfo_free_table(&tbl_wcal);
600 map = sinfo_new_create_shifted_slit_wavemap2 ( im,
602 cfg->nrDispCoefficients,
607 cfg->guessDispersion1,
611 sinfo_qc_wcal_delete(&qc);
615 par = sinfo_new_fit_params(15*n_lines);
616 sinfo_msg(
"Check shifts");
618 shift = sinfo_new_check_correlated_line_positions ( im, acoefs,
619 cfg->nrDispCoefficients,
626 cfg->guessDispersion1,
635 sinfo_det_ncounts(raw, cfg->qc_thresh_max,qc);
636 qclog_tbl = sinfo_qclog_init();
637 ck0_nomsg(sinfo_qclog_add_int(qclog_tbl,
"QC NLINES",n_lines,
638 "Number of found lines",
"%d"));
642 fwhm_avg = cpl_table_get_column_mean(tbl_fp,
"fpar1");
643 fwhm_med = cpl_table_get_column_median(tbl_fp,
"fpar1");
645 ck0_nomsg(sinfo_qclog_add_double(qclog_tbl,
"QC FWHM MED",fwhm_med,
646 "Median FWHM of found lines",
"%f"));
647 ck0_nomsg(sinfo_qclog_add_double(qclog_tbl,
"QC FWHM AVG",fwhm_avg,
648 "Average FWHM of found lines",
"%f"));
651 if(-1 == sinfo_pro_save_ima(map,raw,sof,cfg->outName,
652 PRO_WAVE_MAP,qclog_tbl,cpl_func,config)) {
655 sinfo_free_table(&qclog_tbl);
659 sinfo_new_destroy_2Dfloatarray ( &acoefs, cfg->nrDispCoefficients );
662 }
else if (cfg->wavemapInd == 1 && cfg->calibIndicator == 1) {
663 sinfo_msg_error(
"give either wavemapIndicator = yes and calibIndicator = no \
664 or wavemapIndicator = no and calibIndicator = yes") ;
665 sinfo_qc_wcal_delete(&qc);
675 if (cfg->slitposIndicator == 1) {
676 sinfo_msg(
"fit the slitlet sinfo_edge positions");
680 tbl_name = (
char*) cpl_calloc(MAX_NAME_SIZE,
sizeof(
char*));
681 tbl_spos = cpl_table_new(32);
682 cpl_table_new_column(tbl_spos,
"pos1", CPL_TYPE_DOUBLE);
683 cpl_table_new_column(tbl_spos,
"pos2", CPL_TYPE_DOUBLE);
684 cpl_table_set_column_format(tbl_spos,
"pos1",
"15.9f");
685 cpl_table_set_column_format(tbl_spos,
"pos2",
"15.9f");
687 for (i =0; i< 32; i++) {
693 cpl_table_set_double(tbl_spos,
"pos1",i,
694 sinfo_new_array2D_get_value(sinfo_slit_pos,i,0));
695 cpl_table_set_double(tbl_spos,
"pos2",i,
696 sinfo_new_array2D_get_value(sinfo_slit_pos,i,1));
700 strcpy(tbl_name,
"out_guess_slit_pos.fits");
701 if(-1 == sinfo_pro_save_tbl(tbl_spos,raw,sof,tbl_name,
702 PRO_SLIT_POS,NULL,cpl_func,config)) {
705 sinfo_free_table(&tbl_spos);
708 sinfo_new_destroy_2Dfloatarray ( &sinfo_slit_pos, 32 );
714 if ( (cfg->slitposIndicator == 1 && cfg->estimateIndicator != 1) ||
715 (cfg->calibIndicator == 1) || (cfg->wavemapInd == 1) ){
716 sinfo_new_destroy_fit_params(&par);
718 sinfo_free_image( &im );
719 sinfo_free_image( &map );
720 sinfo_wavecal_free(&cfg);
721 sinfo_qc_wcal_delete(&qc);
#define sinfo_msg_error(...)
Print an error message.