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);
247 tbl_line_list_name=cfg->lineList;
248 tbl_line_list = cpl_table_load(tbl_line_list_name,1,0);
249 if(cpl_error_get_code() != CPL_ERROR_NONE) {
251 sinfo_qc_wcal_delete(&qc);
254 n = cpl_table_get_nrow(tbl_line_list);
256 if(cpl_error_get_code() != CPL_ERROR_NONE) {
258 sinfo_qc_wcal_delete(&qc);
272 wave = cpl_table_get_data_float(tbl_line_list,
"wave");
273 if(cpl_error_get_code() != CPL_ERROR_NONE) {
275 sinfo_qc_wcal_delete(&qc);
279 intens = cpl_table_get_data_float(tbl_line_list,
"int");
280 if(cpl_error_get_code() != CPL_ERROR_NONE) {
282 sinfo_qc_wcal_delete(&qc);
306 if (cfg->calibIndicator == 1 && cfg->wavemapInd == 0) {
307 sinfo_msg(
"Findlines");
308 acoefs = sinfo_new_2Dfloatarray(cfg->nrDispCoefficients, lx);
310 n_found_lines = sinfo_new_intarray(lx);
311 row_clean = sinfo_new_2Dintarray(lx, n_lines);
312 wavelength_clean = sinfo_new_2Dfloatarray(lx, n_lines);
313 sum_pointer = sinfo_new_intarray(1) ;
315 sinfo_new_intarray_set_value(sum_pointer, 0, 0);
316 check = sinfo_new_find_lines(im, wave, intens, n_lines, row_clean,
317 wavelength_clean, cfg->guessBeginWavelength,
318 cfg->guessDispersion1, cfg->guessDispersion2,
319 cfg->mindiff, cfg->halfWidth,
320 n_found_lines, cfg->sigma, sum_pointer );
323 sinfo_qc_wcal_delete(&qc);
334 sinfo_msg(
"Wave Calibration");
335 sum = sinfo_new_intarray_get_value(sum_pointer,0);
337 par = sinfo_new_fit_params( sum );
340 sinfo_qc_wcal_delete(&qc);
348 sinfo_slit_pos = sinfo_new_2Dfloatarray(32,2);
350 map = sinfo_new_spred_wave_cal(im,
357 cfg->guessDispersion1,
362 cfg->nrDispCoefficients,
363 cfg->nrCoefCoefficients,
366 cfg->pixel_tolerance,
372 sinfo_qc_wcal_delete(&qc);
375 sinfo_msg(
"Check line positions");
377 shift = sinfo_new_check_line_positions (im, acoefs,
378 cfg->nrDispCoefficients,
379 cfg->guessDispersion1, par);
385 sinfo_det_ncounts(raw, cfg->qc_thresh_max,qc);
386 qclog_tbl = sinfo_qclog_init();
387 ck0_nomsg(sinfo_qclog_add_int(qclog_tbl,
"QC WAVE ALL",
388 n_lines,
"Number of found lines",
"%d"));
390 ck0_nomsg(sinfo_qclog_add_int(qclog_tbl,
"QC WAVE NPIXSAT",
391 qc->nsat,
"Number of saturated pixels",
"%d"));
393 ck0_nomsg(sinfo_qclog_add_int(qclog_tbl,
"QC WAVE MAXFLUX",
394 qc->max_di,
"Max int off-lamp subracted frm",
"%g"));
396 if(-1 == sinfo_pro_save_ima(map,raw,sof,cfg->outName,
397 PRO_WAVE_MAP,qclog_tbl,cpl_func,config)) {
400 sinfo_free_table(&qclog_tbl);
408 if (cfg->writeCoeffsInd == 1) {
409 col_name = (
char*) cpl_calloc(MAX_NAME_SIZE,
sizeof(
char*));
410 tbl_name = (
char*) cpl_calloc(MAX_NAME_SIZE,
sizeof(
char*));
411 tbl_wcal = cpl_table_new(lx);
412 for (i=0; i< cfg->nrDispCoefficients; i++) {
413 snprintf(col_name,MAX_NAME_SIZE-1,
"%s%d",
"coeff",i);
414 cpl_table_new_column(tbl_wcal,col_name, CPL_TYPE_DOUBLE);
418 qclog_tbl = sinfo_qclog_init();
419 key_name = cpl_calloc(FILE_NAME_SZ,
sizeof(
char));
420 ck0_nomsg(sinfo_qclog_add_int(qclog_tbl,
"QC WAVE ALL",
421 n_lines,
"Number of found lines",
"%d"));
425 for (j=0; j< lx; j++) {
426 for (i=0; i< cfg->nrDispCoefficients; i++) {
427 snprintf(col_name,MAX_NAME_SIZE-1,
"%s%d",
"coeff",i);
428 a = sinfo_new_array2D_get_value(acoefs, i, j);
430 cpl_table_set_double(tbl_wcal,col_name,j,a);
437 for (i=0; i< cfg->nrDispCoefficients; i++) {
438 snprintf(col_name,MAX_NAME_SIZE-1,
"%s%d",
"coeff",i);
439 coef_avg=cpl_table_get_column_mean(tbl_wcal,col_name);
440 coef_med=cpl_table_get_column_median(tbl_wcal,col_name);
443 snprintf(key_name,MAX_NAME_SIZE-1,
"%s%d%s",
"QC COEF",i,
" AVG");
444 ck0_nomsg(sinfo_qclog_add_double(qclog_tbl,key_name,coef_avg,
445 "Average wavecal Coef",
"%g"));
448 snprintf(key_name,MAX_NAME_SIZE-1,
"%s%d%s",
"QC COEF",i,
" MED");
449 ck0_nomsg(sinfo_qclog_add_double(qclog_tbl,key_name,coef_med,
450 "Median wavecal Coef",
"%g"));
457 strcpy(tbl_name,cfg->coeffsName);
459 if(-1 == sinfo_pro_save_tbl(tbl_wcal,raw,sof,tbl_name,
460 PRO_WAVE_COEF_SLIT,qclog_tbl,cpl_func,config)) {
463 sinfo_free_table(&tbl_wcal);
464 sinfo_free_table(&qclog_tbl);
476 if (cfg->writeParInd == 1) {
479 sinfo_new_dump_fit_params_to_ascii(par,WAVECAL_FIT_PARAMS_OUT_FILEASCII);
484 sinfo_qc_wcal_delete(&qc);
488 if ( NULL == cfg->paramsList )
491 sinfo_qc_wcal_delete(&qc);
495 tbl_fp = cpl_table_new(par[0] -> n_params);
496 cpl_table_new_column(tbl_fp,
"n_params", CPL_TYPE_INT);
497 cpl_table_new_column(tbl_fp,
"column", CPL_TYPE_INT);
498 cpl_table_new_column(tbl_fp,
"line", CPL_TYPE_INT);
499 col = (
char*) cpl_calloc(MAX_NAME_SIZE,
sizeof(
char*));
502 snprintf(col,MAX_NAME_SIZE-1,
"%s%d",
"fpar",j);
503 cpl_table_new_column(tbl_fp,col, CPL_TYPE_DOUBLE);
504 snprintf(col,MAX_NAME_SIZE-1,
"%s%d",
"dpar",j);
505 cpl_table_new_column(tbl_fp,col, CPL_TYPE_DOUBLE);
510 qclog_tbl = sinfo_qclog_init();
511 ck0_nomsg(sinfo_qclog_add_int(qclog_tbl,
"QC NLINES",n_lines,
512 "Number of Found lines",
"%d"));
514 for ( i = 0 ; i < par[0] -> n_params ; i++ )
516 cpl_table_set_int(tbl_fp,
"n_params",i,par[i]->n_params);
517 cpl_table_set_int(tbl_fp,
"column",i,par[i]->column);
518 cpl_table_set_int(tbl_fp,
"line",i,par[i]->line);
522 snprintf(col,MAX_NAME_SIZE-1,
"%s%d",
"fpar",j);
523 cpl_table_set_double(tbl_fp,col,i,par[i]->fit_par[j]);
524 snprintf(col,MAX_NAME_SIZE-1,
"%s%d",
"dpar",j);
525 cpl_table_set_double(tbl_fp,col,i,par[i]->derv_par[j]);
529 fwhm_avg = cpl_table_get_column_mean(tbl_fp,
"fpar1");
530 fwhm_med = cpl_table_get_column_median(tbl_fp,
"fpar1");
531 ck0_nomsg(sinfo_qclog_add_double(qclog_tbl,
"QC FWHM MED",fwhm_med,
532 "Median FWHM of found lines",
"%f"));
534 ck0_nomsg(sinfo_qclog_add_double(qclog_tbl,
"QC FWHM AVG",fwhm_avg,
535 "Average FWHM of found lines",
"%f"));
538 if(-1 == sinfo_pro_save_tbl(tbl_fp,raw,sof,cfg->paramsList,
539 PRO_WAVE_PAR_LIST,qclog_tbl,cpl_func,config)) {
542 sinfo_free_table(&qclog_tbl);
544 sinfo_free_table(&tbl_fp) ;
549 sinfo_new_destroy_2Dfloatarray ( &wavelength_clean, lx );
550 sinfo_new_destroy_2Dintarray (&row_clean, lx);
551 sinfo_new_destroy_intarray(&n_found_lines );
552 sinfo_new_destroy_intarray(&sum_pointer );
553 sinfo_new_destroy_2Dfloatarray ( &acoefs, cfg->nrDispCoefficients );
563 }
else if (cfg->wavemapInd == 1 && cfg->calibIndicator == 0) {
564 sinfo_msg(
"Wavemap");
565 acoefs = sinfo_new_2Dfloatarray ( cfg->nrDispCoefficients, lx);
568 tbl_name = (
char*) cpl_calloc(MAX_NAME_SIZE,
sizeof(
char*));
569 col_name = (
char*) cpl_calloc(MAX_NAME_SIZE,
sizeof(
char*));
570 strcpy(tbl_name,cfg->coeffsName);
571 tbl_wcal = cpl_table_load(tbl_name,1,0);
572 if(cpl_error_get_code() != CPL_ERROR_NONE) {
573 sinfo_msg(
"cannot load table %s",tbl_name);
575 sinfo_qc_wcal_delete(&qc);
578 for (i =0; i < lx; i++) {
579 for (j = 0; j< cfg->nrDispCoefficients; j++) {
580 snprintf(col_name,MAX_NAME_SIZE-1,
"%s%d",
"coeff",j);
581 acoefs[j][i]=cpl_table_get_double(tbl_wcal,col_name,i,status);
584 if(cpl_error_get_code() != CPL_ERROR_NONE) {
585 sinfo_msg(
"cannot read table %s",tbl_name);
587 sinfo_qc_wcal_delete(&qc);
592 sinfo_free_table(&tbl_wcal);
594 map = sinfo_new_create_shifted_slit_wavemap2 ( im,
596 cfg->nrDispCoefficients,
601 cfg->guessDispersion1,
605 sinfo_qc_wcal_delete(&qc);
609 par = sinfo_new_fit_params(15*n_lines);
610 sinfo_msg(
"Check shifts");
612 shift = sinfo_new_check_correlated_line_positions ( im, acoefs,
613 cfg->nrDispCoefficients,
620 cfg->guessDispersion1,
629 sinfo_det_ncounts(raw, cfg->qc_thresh_max,qc);
630 qclog_tbl = sinfo_qclog_init();
631 ck0_nomsg(sinfo_qclog_add_int(qclog_tbl,
"QC NLINES",n_lines,
632 "Number of found lines",
"%d"));
636 fwhm_avg = cpl_table_get_column_mean(tbl_fp,
"fpar1");
637 fwhm_med = cpl_table_get_column_median(tbl_fp,
"fpar1");
639 ck0_nomsg(sinfo_qclog_add_double(qclog_tbl,
"QC FWHM MED",fwhm_med,
640 "Median FWHM of found lines",
"%f"));
641 ck0_nomsg(sinfo_qclog_add_double(qclog_tbl,
"QC FWHM AVG",fwhm_avg,
642 "Average FWHM of found lines",
"%f"));
645 if(-1 == sinfo_pro_save_ima(map,raw,sof,cfg->outName,
646 PRO_WAVE_MAP,qclog_tbl,cpl_func,config)) {
649 sinfo_free_table(&qclog_tbl);
653 sinfo_new_destroy_2Dfloatarray ( &acoefs, cfg->nrDispCoefficients );
656 }
else if (cfg->wavemapInd == 1 && cfg->calibIndicator == 1) {
657 sinfo_msg_error(
"give either wavemapIndicator = yes and calibIndicator = no \
658 or wavemapIndicator = no and calibIndicator = yes") ;
659 sinfo_qc_wcal_delete(&qc);
669 if (cfg->slitposIndicator == 1) {
670 sinfo_msg(
"fit the slitlet sinfo_edge positions");
674 tbl_name = (
char*) cpl_calloc(MAX_NAME_SIZE,
sizeof(
char*));
675 tbl_spos = cpl_table_new(32);
676 cpl_table_new_column(tbl_spos,
"pos1", CPL_TYPE_DOUBLE);
677 cpl_table_new_column(tbl_spos,
"pos2", CPL_TYPE_DOUBLE);
678 cpl_table_set_column_format(tbl_spos,
"pos1",
"15.9f");
679 cpl_table_set_column_format(tbl_spos,
"pos2",
"15.9f");
681 for (i =0; i< 32; i++) {
687 cpl_table_set_double(tbl_spos,
"pos1",i,
688 sinfo_new_array2D_get_value(sinfo_slit_pos,i,0));
689 cpl_table_set_double(tbl_spos,
"pos2",i,
690 sinfo_new_array2D_get_value(sinfo_slit_pos,i,1));
694 strcpy(tbl_name,
"out_guess_slit_pos.fits");
695 if(-1 == sinfo_pro_save_tbl(tbl_spos,raw,sof,tbl_name,
696 PRO_SLIT_POS,NULL,cpl_func,config)) {
699 sinfo_free_table(&tbl_spos);
702 sinfo_new_destroy_2Dfloatarray ( &sinfo_slit_pos, 32 );
708 if ( (cfg->slitposIndicator == 1 && cfg->estimateIndicator != 1) ||
709 (cfg->calibIndicator == 1) || (cfg->wavemapInd == 1) ){
710 sinfo_new_destroy_fit_params(&par);
712 sinfo_free_image( &im );
713 sinfo_free_image( &map );
714 sinfo_wavecal_free(&cfg);
715 sinfo_qc_wcal_delete(&qc);