37 #include <sinfo_cpl_size.h>
39 #include <irplib_utils.h>
41 #include <sinfo_skycor.h>
42 #include <sinfo_new_cube_ops.h>
43 #include "sinfo_pfits.h"
44 #include "sinfo_fit.h"
45 #include "sinfo_functions.h"
47 #include "sinfo_msg.h"
48 #include "sinfo_error.h"
49 #include "sinfo_globals.h"
50 #include "sinfo_utils_wrappers.h"
51 #include "sinfo_utl_cube2spectrum.h"
52 #include "sinfo_pro_types.h"
57 #define BAND_H_WAVE_MIN 1.445 //not used
58 #define BAND_H_WAVE_MAX 1.820 //not used
60 #define BAND_K_WAVE_MIN 1.945 //not used
61 #define BAND_K_WAVE_MAX 2.460 //not used
63 #define BAND_J_WAVE_MIN 1.445 //not used
64 #define BAND_J_WAVE_MAX 1.82 //not used
66 #define SINFO_FIT_BKG_TEMP 280.
67 #define SKY_THRES 0.95
68 #define SKY_LINE_MAX_CUT 4
69 #define SKY_LINE_MIN_CUT 4
72 #define XCOR_YSHIFT_KS_CLIP 5
75 #define HPLANK 6.62606876e-34; // J s
76 #define CLIGHT 2.99792458e+08; // m / s
77 #define KBOLTZ 1.3806503e-23; // J / K
78 #define AMOEBA_FTOL 1.e-5
81 #define N_ITER_FIT_LM 15
82 #define N_ITER_FIT_AMOEBA 10
84 double sinfo_scale_fct=1;
85 static cpl_vector* sa_vx=NULL;
86 static cpl_vector* sa_vy=NULL;
88 static cpl_vector* sa_ox=NULL;
89 static cpl_vector* sa_oy=NULL;
90 static cpl_vector* sa_sy=NULL;
95 cpl_vector* sinfo_sky_background_estimate(cpl_vector *spectrum,
101 sinfo_scales_obj_sky_cubes(cpl_imagelist* obj_cub,
102 cpl_imagelist* sky_cub,
105 cpl_imagelist** obj_cor);
108 sinfo_sub_thr_bkg_from_obj_cube(cpl_imagelist* obj_cub,
110 cpl_imagelist** obj_cor);
113 sinfo_filter_min(
const cpl_vector* vi,
const int size);
116 sinfo_filter_max(
const cpl_vector* vi,
const int size);
119 sinfo_filter_smo(
const cpl_vector* vi,
const int size);
121 static cpl_imagelist*
122 sinfo_cube_zshift_simple(cpl_imagelist* inp,
126 sinfo_optimise_sky_sub(
const double wtol,
127 const double line_hw,
152 sinfo_shift_sky(cpl_frame** sky_frm,
154 const double zshift);
157 sinfo_xcorr(cpl_table* int_obj,
160 const double dispersion,
161 const double line_hw);
164 sinfo_interpolate_sky(
const cpl_table* inp,
const cpl_table* lambdas);
167 sinfo_check_screw_values(cpl_table** int_obj,
173 sinfo_choose_good_sky_pixels(cpl_frame* obj_frm,
176 const double min_frac,
181 sinfo_sum_spectra(
const cpl_frame* obj,
182 const cpl_frame* sky,
190 cpl_table** int_sky);
193 sinfo_thermal_background2(cpl_table* int_sky,
199 sinfo_thermal_background(cpl_table* int_sky,
204 const int filter_width,
210 sinfo_object_flag_sky_pixels(cpl_frame* obj_frm,
213 cpl_imagelist* flag_data,
220 sinfo_object_flag_low_values(cpl_frame* obj_frm,
223 cpl_imagelist** flag_data);
226 sinfo_object_estimate_noise(cpl_frame* obj_frm,
const int obj_noise_fit,
227 double* centre,
double* noise);
232 sinfo_set_ranges(cpl_frame* obj_frm,
234 cpl_parameterlist* cfg,
260 sinfo_table_extract_rest(cpl_table* inp,
266 sinfo_get_sub_regions(cpl_table* sky,
271 cpl_table** sub_regions);
275 sinfo_get_obj_sky_wav_sub(cpl_table* obj,
282 cpl_table** sub_wav);
286 sinfo_find_rot_waves(
const double w_rot[],
291 sinfo_compute_line_ratio(cpl_table* obj,
295 const cpl_table* sel_regions,
296 cpl_table* cont_regions,
300 sinfo_table_subtract_continuum(cpl_table* lin,cpl_table* cnt);
303 sinfo_fit_bkg(
double p[]);
306 sinfo_fit_sky(
double p[]);
309 sinfo_get_line_ratio_amoeba(cpl_table* obj,
314 sinfo_table_interpol(cpl_table* obj_lin,
322 sinfo_get_line_ratio(cpl_table* obj_lin,
330 sinfo_table_shift_simple(cpl_table* inp,
338 sinfo_table_set(cpl_table** out,
339 const cpl_table* ref,
344 sinfo_table_threshold(cpl_table** t,
346 const double low_cut,
347 const double hig_cut,
348 const double low_ass,
349 const double hig_ass);
354 static double sinfo_fac(
const double x,
const double t);
356 static int sinfo_fitbkg(
const double x[],
359 static int sinfo_fitbkg_derivative(
const double x[],
365 sinfo_convolve_kernel(cpl_table** t,
const int rad);
367 sinfo_convolve_kernel2(cpl_table** t,
const int rad);
370 sinfo_convolve_gauss(cpl_table** t,
const int rad,
const double fwhm);
372 sinfo_convolve_exp(cpl_table** t,
const int rad,
const double fwhm);
375 sinfo_table_sky_obj_flag_nan(cpl_table** s,cpl_table** o, cpl_table** w);
378 sinfo_table_set_nan_out_min_max(cpl_table** s,
387 sinfo_gaussian_amp(
double area,
double sigma,
double x,
double x0,
double off);
389 sinfo_gaussian_area(
double amp,
double sigma,
double x,
double x0,
double off);
392 sinfo_table_smooth_column(cpl_table** t,
const char* c,
const int r);
395 sinfo_image_flag_nan(cpl_image** im);
398 sinfo_table_flag_nan(cpl_table** t,
const char* label);
403 sinfo_cnt_mask_thresh_and_obj_finite(
const cpl_image* mask,
405 const cpl_image* obj);
411 sinfo_interpolate(
const cpl_table* inp,
412 const cpl_table* lambdas,
417 sinfo_image2table(
const cpl_image* im);
420 sinfo_table_extract_finite(
const cpl_table* in1,
421 const cpl_table* in2,
426 sinfo_slice_z(
const cpl_imagelist* cin,
const int i,
const int j);
430 static cpl_imagelist*
431 sinfo_imagelist_select_range(
const cpl_imagelist* inp,
432 const cpl_table* full,
433 const cpl_table* good,
439 sinfo_table_select_range(cpl_table* inp,
444 sinfo_table_fill_column_over_range(cpl_table** inp,
445 const cpl_table* ref,
454 sinfo_table_column_dindgen(cpl_table** t,
const char* label);
484 sinfo_skycor_qc_new(
void)
486 sinfo_skycor_qc * sqc;
487 sqc= cpl_malloc(
sizeof(sinfo_skycor_qc));
501 sinfo_skycor_qc_delete(sinfo_skycor_qc** sqc)
523 sinfo_skycor(cpl_parameterlist * config,
526 sinfo_skycor_qc* sqc,
527 cpl_imagelist** obj_cor,
533 cpl_table* lambda=NULL;
534 cpl_table* lr41=NULL;
535 cpl_table* lr52=NULL;
536 cpl_table* lr63=NULL;
537 cpl_table* lr74=NULL;
538 cpl_table* lr02=NULL;
539 cpl_table* lr85=NULL;
540 cpl_table* lr20=NULL;
541 cpl_table* lr31=NULL;
542 cpl_table* lr42=NULL;
543 cpl_table* lr53=NULL;
544 cpl_table* lr64=NULL;
545 cpl_table* lr75=NULL;
546 cpl_table* lr86=NULL;
547 cpl_table* lr97=NULL;
548 cpl_table* lr00=NULL;
549 cpl_table* lrange=NULL;
550 cpl_table* mrange=NULL;
551 cpl_table* grange=NULL;
552 cpl_table* lambdas=NULL;
554 cpl_table* int_sky=NULL;
556 cpl_image* mask=NULL;
557 cpl_image* gpix=NULL;
558 cpl_image* ratio=NULL;
559 cpl_image* ima_sky=NULL;
560 cpl_imagelist* fdata=NULL;
561 cpl_table* rscale=NULL;
562 cpl_parameter* p=NULL;
579 int filter_width=SINFO_SKY_BKG_FILTER_WIDTH;
584 cpl_imagelist* obj_cub=NULL;
585 cpl_imagelist* sky_cub=NULL;
589 check_nomsg(p=cpl_parameterlist_find(config,
590 "sinfoni.sinfo_utl_skycor.min_frac"));
591 check_nomsg(min_frac=cpl_parameter_get_double(p));
593 check_nomsg(p=cpl_parameterlist_find(config,
594 "sinfoni.sinfo_utl_skycor.line_half_width"));
595 check_nomsg(line_hw=cpl_parameter_get_double(p));
599 check_nomsg(p=cpl_parameterlist_find(config,
600 "sinfoni.sinfo_utl_skycor.sky_bkg_filter_width"));
601 check_nomsg(filter_width=cpl_parameter_get_int(p));
603 check_nomsg(p=cpl_parameterlist_find(config,
604 "sinfoni.sinfo_utl_skycor.scale_method"));
605 check_nomsg(method=cpl_parameter_get_int(p));
609 check_nomsg(p=cpl_parameterlist_find(config,
610 "sinfoni.sinfo_utl_skycor.rot_cor"));
611 check_nomsg(do_rot=cpl_parameter_get_bool(p));
614 check_nomsg(p=cpl_parameterlist_find(config,
615 "sinfoni.sinfo_utl_skycor.sub_thr_bkg_from_obj"));
616 check_nomsg(sub_thr_bkg=cpl_parameter_get_bool(p));
619 check_nomsg(p=cpl_parameterlist_find(config,
620 "sinfoni.sinfo_utl_skycor.fit_obj_noise"));
621 check_nomsg(obj_noise_fit=cpl_parameter_get_bool(p));
624 check_nomsg(p=cpl_parameterlist_find(config,
625 "sinfoni.sinfo_utl_skycor.niter"));
626 check_nomsg(niter=cpl_parameter_get_int(p));
629 check_nomsg(p=cpl_parameterlist_find(config,
630 "sinfoni.sinfo_utl_skycor.pshift"));
631 check_nomsg(pshift=cpl_parameter_get_double(p));
635 check_nomsg(p=cpl_parameterlist_find(config,
636 "sinfoni.sinfo_utl_skycor.llx"));
637 check_nomsg(llx=cpl_parameter_get_int(p));
640 check_nomsg(p=cpl_parameterlist_find(config,
641 "sinfoni.sinfo_utl_skycor.lly"));
642 check_nomsg(lly=cpl_parameter_get_int(p));
645 check_nomsg(p=cpl_parameterlist_find(config,
646 "sinfoni.sinfo_utl_skycor.urx"));
647 check_nomsg(urx=cpl_parameter_get_int(p));
650 check_nomsg(p=cpl_parameterlist_find(config,
651 "sinfoni.sinfo_utl_skycor.ury"));
652 check_nomsg(ury=cpl_parameter_get_int(p));
655 sinfo_msg(
"Set wavelength ranges");
656 ck0(sinfo_set_ranges(obj_frm,sky_frm,config,&lambda,
657 &lr41,&lr52,&lr63,&lr74,&lr02,&lr85,&lr20,&lr31,&lr42,
658 &lr53,&lr64,&lr75,&lr86,&lr97,&lr00,
659 &lrange,&grange,&lambdas,&mrange,&sky_interp_sw,
660 &dispersion),
"Setting wavelength ranges");
686 sinfo_msg(
"Estimate noise");
687 ck0(sinfo_object_estimate_noise(obj_frm,obj_noise_fit,¢re,&noise),
690 sinfo_msg(
"Background=%f Noise=%f",centre,noise);
691 sinfo_msg(
"Flag object low_levels");
692 ck0(sinfo_object_flag_low_values(obj_frm,centre,noise,&fdata),
699 sinfo_msg(
"Flag sky pixels");
700 ck0(sinfo_object_flag_sky_pixels(obj_frm,lambda,mrange,fdata,dispersion,
701 &gpix,&ratio,&ima_sky),
702 "Flagging sky pixels");
716 sinfo_msg(
"Choose good sky (with > 95%% good spectral) pixels");
717 ck0(sinfo_choose_good_sky_pixels(obj_frm,ratio,gpix,min_frac,&mask),
718 "Choosing good sky pixels");
727 sinfo_msg(
"Sum obj and sky spectra");
728 ck0(sinfo_sum_spectra(obj_frm,sky_frm,mask,lambda,llx,lly,urx,ury,int_obj,
729 &int_sky),
"summing obj & sky spectra");
737 sinfo_msg(
"Computes thermal background");
743 ck0(sinfo_thermal_background(int_sky,lambda,lrange,fit_temp,niter,
744 filter_width,dispersion,&bkg,&th_fit),
745 "getting termal bkg");
748 check_nomsg(cpl_table_duplicate_column(*int_obj,
"INT_SKY_ORG",int_sky,
"INT"));
749 check_nomsg(cpl_table_duplicate_column(*int_obj,
"INT_BKG_FIT",bkg,
"INT2"));
750 check_nomsg(cpl_table_duplicate_column(*int_obj,
"INT_BKG_SMO",int_sky,
764 sinfo_msg(
"Subtracts thermal background from integrated OH spectrum");
767 check_nomsg(cpl_table_duplicate_column(int_sky,
"BKG",bkg,
"INT2"));
768 check_nomsg(cpl_table_duplicate_column(int_sky,
"INT0",int_sky,
"INT"));
769 check_nomsg(cpl_table_subtract_columns(int_sky,
"INT",
"BKG"));
776 if(sub_thr_bkg == 1) {
777 check_nomsg(cpl_table_duplicate_column(*int_obj,
"THR_BKG",bkg,
"INT2"));
778 check_nomsg(cpl_table_subtract_columns(*int_obj,
"INT",
"THR_BKG"));
797 sinfo_msg(
"Checks for screw values at ends of spectrum");
798 sinfo_check_screw_values(int_obj,&int_sky,grange,dispersion);
808 if(sky_interp_sw == 1) {
809 sinfo_msg(
"Interpolate sky if necessary");
810 sinfo_interpolate_sky(int_sky,lambdas);
814 sinfo_msg(
"Crosscorrelate obj & sky to check for lambda offset");
819 check_nomsg(wshift=sinfo_xcorr(*int_obj,int_sky,lambda,dispersion,line_hw));
823 sinfo_msg(
"Dispersion=%f",dispersion);
825 pshift=wshift/dispersion;
827 sinfo_msg(
"Shift sky of %f pixels toward object",pshift);
829 check_nomsg(sinfo_shift_sky(&sky_frm,&int_sky,pshift));
837 sinfo_msg(
"Optimise sky subtraction");
838 check_nomsg(sinfo_optimise_sky_sub(dispersion,line_hw,method,do_rot,
840 lr41,lr52,lr63,lr74,lr02,lr85,
841 lr20,lr31,lr42,lr53,lr64,lr75,
842 lr86,lr97,lr00,int_obj,&int_sky,
852 sinfo_msg(
"Apply same scaling to whole cubes");
855 cknull_nomsg(obj_cub=cpl_imagelist_load(cpl_frame_get_filename(obj_frm),
857 cknull_nomsg(sky_cub=cpl_imagelist_load(cpl_frame_get_filename(sky_frm),
863 if(sub_thr_bkg == 1) {
864 ck0_nomsg(sinfo_sub_thr_bkg_from_obj_cube(obj_cub,int_sky,obj_cor));
866 check_nomsg(*obj_cor=cpl_imagelist_duplicate(obj_cub));
869 ck0_nomsg(sinfo_scales_obj_sky_cubes(*obj_cor,sky_cub,bkg,rscale,obj_cor));
871 check_nomsg(cpl_table_name_column(*int_obj,
"INT",
"INT_OBJ_ORG"));
872 check_nomsg(cpl_table_name_column(*int_obj,
"INTC",
"INT_OBJ_COR"));
873 check_nomsg(cpl_table_name_column(*int_obj,
"SKYC",
"INT_SKY_COR"));
877 sinfo_free_table(&rscale);
878 sinfo_free_imagelist(&fdata);
880 sinfo_free_table(&bkg);
881 sinfo_free_table(&lambda);
882 sinfo_free_table(&lrange);
883 sinfo_free_table(&mrange);
884 sinfo_free_table(&grange);
885 sinfo_free_table(&lambdas);
886 sinfo_free_image(&mask);
888 sinfo_free_table(&lr41);
889 sinfo_free_table(&lr52);
890 sinfo_free_table(&lr63);
891 sinfo_free_table(&lr74);
892 sinfo_free_table(&lr02);
893 sinfo_free_table(&lr85);
894 sinfo_free_table(&lr20);
895 sinfo_free_table(&lr31);
896 sinfo_free_table(&lr42);
897 sinfo_free_table(&lr53);
898 sinfo_free_table(&lr64);
899 sinfo_free_table(&lr75);
900 sinfo_free_table(&lr86);
901 sinfo_free_table(&lr97);
902 sinfo_free_table(&lr00);
904 sinfo_free_image(&gpix);
905 sinfo_free_image(&ratio);
906 sinfo_free_image(&ima_sky);
908 sinfo_free_table(&int_sky);
910 sinfo_free_imagelist(&obj_cub);
911 sinfo_free_imagelist(&sky_cub);
913 if (cpl_error_get_code() != CPL_ERROR_NONE) {
938 sinfo_sub_thr_bkg_from_obj_cube(cpl_imagelist* obj_cub,
940 cpl_imagelist** obj_cor)
943 double* pthr_bkg=NULL;
946 cpl_image* imgo=NULL;
948 check_nomsg(pthr_bkg=cpl_table_get_data_double(int_sky,
"BKG"));
949 check_nomsg(zsz=cpl_imagelist_get_size(obj_cub));
950 check_nomsg(*obj_cor=cpl_imagelist_duplicate(obj_cub));
953 check_nomsg(imgo=cpl_imagelist_get(obj_cub,k));
954 check_nomsg(cpl_image_subtract_scalar(imgo,pthr_bkg[k]));
955 check_nomsg(cpl_imagelist_set(*obj_cor,imgo,k));
959 if (cpl_error_get_code() != CPL_ERROR_NONE) {
1002 sinfo_set_ranges(cpl_frame* obj_frm,
1004 cpl_parameterlist* cfg,
1023 cpl_table** lambdas,
1030 cpl_propertylist* plist=NULL;
1052 const double w_j_min=1.100;
1053 const double w_j_max=1.400;
1054 const double w_h_min=1.445;
1055 const double w_h_max=1.820;
1056 const double w_k_min=1.945;
1057 const double w_k_max=2.460;
1063 cpl_parameter* p=NULL;
1067 double w_bound[NBOUND]={1.067,1.125,1.196,1.252,1.289,
1068 1.400,1.472,1.5543,1.6356,1.7253,
1069 1.840,1.9570,2.095,2.300};
1071 cpl_table* tmp_tbl=NULL;
1072 cpl_table* add1=NULL;
1077 cknull_nomsg(plist=cpl_propertylist_load(cpl_frame_get_filename(obj_frm),0));
1078 check_nomsg(crval_obj=sinfo_pfits_get_crval3(plist));
1079 check_nomsg(cdelt_obj=sinfo_pfits_get_cdelt3(plist));
1080 check_nomsg(crpix_obj=sinfo_pfits_get_crpix3(plist));
1083 check_nomsg(zsize_obj=sinfo_pfits_get_naxis3(plist));
1085 sinfo_free_propertylist(&plist);
1086 *dispersion=cdelt_obj;
1089 check_nomsg(*lambda=cpl_table_new(zsize_obj));
1090 cpl_table_new_column(*lambda,
"WAVE",CPL_TYPE_DOUBLE);
1091 cpl_table_new_column(*lambda,
"INDEX",CPL_TYPE_DOUBLE);
1092 check_nomsg(sinfo_table_column_dindgen(lambda,
"INDEX"));
1093 check_nomsg(sinfo_table_column_dindgen(lambda,
"WAVE"));
1095 check_nomsg(cpl_table_add_scalar(*lambda,
"WAVE",1.));
1096 check_nomsg(cpl_table_subtract_scalar(*lambda,
"WAVE",crpix_obj));
1097 check_nomsg(cpl_table_multiply_scalar(*lambda,
"WAVE",cdelt_obj));
1098 check_nomsg(cpl_table_add_scalar(*lambda,
"WAVE",crval_obj));
1103 cknull_nomsg(*lr41=sinfo_where_tab_min_max(*lambda,
1110 cknull_nomsg(*lr52=sinfo_where_tab_min_max(*lambda,
1117 cknull_nomsg(*lr63=sinfo_where_tab_min_max(*lambda,
1125 cknull_nomsg(*lr74=sinfo_where_tab_min_max(*lambda,
1132 cknull_nomsg(*lr20=sinfo_where_tab_min_max(*lambda,
1139 cknull_nomsg(*lr02=sinfo_where_tab_min_max(*lambda,
1147 cknull_nomsg(*lr85=sinfo_where_tab_min_max(*lambda,
1154 cknull_nomsg(*lr31=sinfo_where_tab_min_max(*lambda,
1161 cknull_nomsg(*lr42=sinfo_where_tab_min_max(*lambda,
1168 cknull_nomsg(*lr53=sinfo_where_tab_min_max(*lambda,
1175 cknull_nomsg(*lr64=sinfo_where_tab_min_max(*lambda,
1182 cknull_nomsg(*lr75=sinfo_where_tab_min_max(*lambda,
1189 cknull_nomsg(*lr86=sinfo_where_tab_min_max(*lambda,
1196 cknull_nomsg(*lr97=sinfo_where_tab_min_max(*lambda,
1203 cknull_nomsg(*lr00=sinfo_where_tab_min_max(*lambda,
1211 cknull_nomsg(*lrange=sinfo_where_tab_min_max(*lambda,
1215 CPL_NOT_GREATER_THAN,
1220 cknull_nomsg(add1=sinfo_where_tab_min_max(*lambda,
1224 CPL_NOT_GREATER_THAN,
1227 check_nomsg(nrow=cpl_table_get_nrow(*lrange));
1228 check_nomsg(cpl_table_insert(*lrange,add1,nrow));
1229 sinfo_free_table(&add1);
1231 cknull_nomsg(add1=sinfo_where_tab_min_max(*lambda,
1235 CPL_NOT_GREATER_THAN,
1239 check_nomsg(nrow=cpl_table_get_nrow(*lrange));
1240 check_nomsg(cpl_table_insert(*lrange,add1,nrow));
1241 sinfo_free_table(&add1);
1245 cknull_nomsg(*grange=sinfo_where_tab_min_max(*lambda,
1249 CPL_NOT_GREATER_THAN,
1255 cknull_nomsg(add1=sinfo_where_tab_min_max(*lambda,
1259 CPL_NOT_GREATER_THAN,
1262 check_nomsg(nrow=cpl_table_get_nrow(*grange));
1263 check_nomsg(cpl_table_insert(*grange,add1,nrow));
1264 sinfo_free_table(&add1);
1268 cknull_nomsg(add1=sinfo_where_tab_min_max(*lambda,
1272 CPL_NOT_GREATER_THAN,
1275 check_nomsg(nrow=cpl_table_get_nrow(*grange));
1276 check_nomsg(cpl_table_insert(*grange,add1,nrow));
1277 sinfo_free_table(&add1);
1281 cknull_nomsg(plist=cpl_propertylist_load(cpl_frame_get_filename(sky_frm),0));
1282 check_nomsg(crval_sky=sinfo_pfits_get_crval3(plist));
1283 check_nomsg(cdelt_sky=sinfo_pfits_get_cdelt3(plist));
1284 check_nomsg(crpix_sky=sinfo_pfits_get_crpix3(plist));
1287 check_nomsg(zsize_sky=sinfo_pfits_get_naxis3(plist));
1288 sinfo_free_propertylist(&plist);
1291 check_nomsg(*lambdas=cpl_table_new(zsize_sky));
1292 cpl_table_new_column(*lambdas,
"WAVE",CPL_TYPE_DOUBLE);
1293 check_nomsg(sinfo_table_column_dindgen(lambdas,
"WAVE"));
1295 check_nomsg(cpl_table_add_scalar(*lambdas,
"WAVE",1.));
1296 check_nomsg(cpl_table_subtract_scalar(*lambdas,
"WAVE",crpix_sky));
1297 check_nomsg(cpl_table_multiply_scalar(*lambdas,
"WAVE",cdelt_sky));
1298 check_nomsg(cpl_table_add_scalar(*lambdas,
"WAVE",crval_sky));
1300 check_nomsg(p=cpl_parameterlist_find(cfg,
"sinfoni.sinfo_utl_skycor.mask_ws"));
1301 check_nomsg(ws=cpl_parameter_get_double(p));
1302 check_nomsg(p=cpl_parameterlist_find(cfg,
"sinfoni.sinfo_utl_skycor.mask_we"));
1303 check_nomsg(we=cpl_parameter_get_double(p));
1304 if((ws != SINFO_MASK_WAVE_MIN) || (we != SINFO_MASK_WAVE_MAX)) {
1305 cknull_nomsg(*mrange=sinfo_where_tab_min_max(*lambda,
"WAVE",
1306 CPL_NOT_LESS_THAN,ws,
1307 CPL_NOT_GREATER_THAN,we));
1309 check_nomsg(*mrange=cpl_table_duplicate(*lrange));
1313 check_nomsg(cpl_table_duplicate_column(*lambda,
"WDIFF",*lambdas,
"WAVE"));
1314 check_nomsg(cpl_table_subtract_columns(*lambda,
"WDIFF",
"WAVE"));
1315 check_nomsg(mean=cpl_table_get_column_mean(*lambda,
"WDIFF"));
1316 check_nomsg(nrow=cpl_table_get_nrow(*lambda));
1318 if((fabs(nrow*mean) > 0) || (zsize_obj != zsize_sky)) {
1319 sinfo_msg(
"We have to interpolate sky frame - this is not good");
1327 sinfo_free_table(&add1);
1328 sinfo_free_table(&tmp_tbl);
1329 sinfo_free_propertylist(&plist);
1348 sinfo_table_column_dindgen(cpl_table** t,
const char* label)
1354 cknull(*t,
"Null input vector");
1355 check(sz=cpl_table_get_nrow(*t),
"Getting size of a vector");
1357 cpl_table_set(*t,label,i,(
double)i);
1381 sinfo_sum_spectra(
const cpl_frame* obj_frm,
1382 const cpl_frame* sky_frm,
1389 cpl_table** int_obj,
1390 cpl_table** int_sky)
1395 cpl_image* obj_slice=NULL;
1396 cpl_image* sky_slice=NULL;
1397 cpl_image* gslice=NULL;
1398 cpl_image* pos_tmp=NULL;
1399 cpl_image* msk_tmp=NULL;
1400 cpl_imagelist* obj=NULL;
1401 cpl_imagelist* sky=NULL;
1404 cpl_table* loop=NULL;
1405 cpl_table* opos_tbl=NULL;
1406 cpl_table* spos_tbl=NULL;
1407 cpl_table* tmp_tbl=NULL;
1408 cpl_table* loop_tbl=NULL;
1420 cknull_nomsg(obj=cpl_imagelist_load(cpl_frame_get_filename(obj_frm),
1421 CPL_TYPE_DOUBLE,0));
1422 cknull_nomsg(sky=cpl_imagelist_load(cpl_frame_get_filename(sky_frm),
1423 CPL_TYPE_DOUBLE,0));
1425 check_nomsg(zsize=cpl_imagelist_get_size(obj));
1426 check_nomsg(*int_obj = cpl_table_new(zsize));
1427 check_nomsg(*int_sky = cpl_table_new(zsize));
1428 check_nomsg(cpl_table_duplicate_column(*int_obj,
"WAVE",wrange,
"WAVE"));
1429 check_nomsg(cpl_table_duplicate_column(*int_sky,
"WAVE",wrange,
"WAVE"));
1430 check_nomsg(cpl_table_new_column(*int_obj,
"INT",CPL_TYPE_DOUBLE));
1431 check_nomsg(cpl_table_new_column(*int_sky,
"INT",CPL_TYPE_DOUBLE));
1432 check_nomsg(cpl_table_fill_column_window_double(*int_obj,
"INT",0,zsize,0));
1433 check_nomsg(cpl_table_fill_column_window_double(*int_sky,
"INT",0,zsize,0));
1437 cknull_nomsg(loop_tbl=sinfo_image2table(mask));
1438 check_nomsg(cpl_table_and_selected_double(loop_tbl,
"VALUE",
1439 CPL_GREATER_THAN,0.5));
1440 check_nomsg(loop=cpl_table_extract_selected(loop_tbl));
1441 sinfo_free_table(&loop_tbl);
1442 sinfo_free_table(&loop);
1445 for (i=0;i<zsize;i++) {
1446 check_nomsg(obj_slice = cpl_imagelist_get(obj,i));
1449 pos_i=sinfo_cnt_mask_thresh_and_obj_finite(mask,0.5,obj_slice);
1455 check_nomsg(cpl_table_set_double(*int_obj,
"INT",i,
1456 cpl_image_get_mean_window(obj_slice,
1464 check_nomsg(gslice = cpl_image_duplicate(obj_slice));
1465 check_nomsg(sinfo_image_flag_nan(&gslice));
1473 if(cpl_image_count_rejected(gslice) < 2048) {
1475 check_nomsg(med = cpl_image_get_median_window(gslice,llx,lly,urx,ury));
1476 check_nomsg(sdv = cpl_image_get_stdev_window(gslice,llx,lly,urx,ury));
1479 check_nomsg(cpl_image_threshold(gslice,med-3*sdv,med+3*sdv,0,0));
1480 check_nomsg(avg= cpl_image_get_mean_window(gslice,llx,lly,urx,ury));
1481 check_nomsg(cpl_table_set_double(*int_obj,
"INT",i,avg));
1483 check_nomsg(cpl_table_set_invalid(*int_obj,
"INT",i));
1486 sinfo_free_image(&gslice);
1492 check_nomsg(sky_slice = cpl_imagelist_get(sky,i));
1494 pos_i=sinfo_cnt_mask_thresh_and_obj_finite(mask,0.5,sky_slice);
1500 check_nomsg(cpl_table_set_double(*int_sky,
"INT",i,
1501 cpl_image_get_mean_window(sky_slice,
1508 check_nomsg(gslice = cpl_image_duplicate(sky_slice));
1509 check_nomsg(sinfo_image_flag_nan(&gslice));
1512 if(cpl_image_count_rejected(gslice) < 2048) {
1514 check_nomsg(med = cpl_image_get_median_window(gslice,llx,lly,urx,ury));
1515 check_nomsg(sdv = cpl_image_get_stdev_window(gslice,llx,lly,urx,ury));
1517 check_nomsg(cpl_image_threshold(gslice,med-3*sdv,med+3*sdv,0,0));
1518 check_nomsg(avg= cpl_image_get_mean_window(gslice,llx,lly,urx,ury));
1519 check_nomsg(cpl_table_set_double(*int_sky,
"INT",i,avg));
1521 check_nomsg(cpl_table_set_invalid(*int_sky,
"INT",i));
1523 sinfo_free_image(&gslice);
1535 sinfo_free_imagelist(&obj);
1536 sinfo_free_imagelist(&sky);
1542 sinfo_free_image(&gslice);
1543 sinfo_free_image(&pos_tmp);
1544 sinfo_free_image(&msk_tmp);
1545 sinfo_free_table(&tmp_tbl);
1546 sinfo_free_table(&opos_tbl);
1547 sinfo_free_table(&spos_tbl);
1548 sinfo_free_table(&loop_tbl);
1549 sinfo_free_table(&loop);
1550 sinfo_free_imagelist(&obj);
1551 sinfo_free_imagelist(&sky);
1575 sinfo_cnt_mask_thresh_and_obj_finite(
const cpl_image* mask,
1577 const cpl_image* obj)
1586 const double* pm=NULL;
1587 const double* po=NULL;
1589 check_nomsg(sxm=cpl_image_get_size_x(mask));
1590 check_nomsg(sym=cpl_image_get_size_y(mask));
1591 check_nomsg(sxo=cpl_image_get_size_x(obj));
1592 check_nomsg(syo=cpl_image_get_size_y(obj));
1593 if( sxm != sxo || sym != syo) {
1596 check_nomsg(pm=cpl_image_get_data_double_const(mask));
1597 check_nomsg(po=cpl_image_get_data_double_const(obj));
1599 for(i=0;i<sxm*sym;i++) {
1601 if( (pm[i] > t) && (!irplib_isnan(po[i]))) { cnt++; }
1630 sinfo_image_flag_nan(cpl_image** im)
1641 check_nomsg(sx=cpl_image_get_size_x(*im));
1642 check_nomsg(sy=cpl_image_get_size_y(*im));
1643 check_nomsg(pi=cpl_image_get_data_double(*im));
1647 if(irplib_isnan(pi[j*sx+i])) {
1648 check_nomsg(cpl_image_reject(*im,i+1,j+1));
1677 sinfo_object_estimate_noise(cpl_frame* obj_frm,
1678 const int obj_noise_fit,
1683 const int nbins=HISTO_NBINS;
1724 cpl_propertylist* plist=NULL;
1725 cpl_imagelist* obj_cub=NULL;
1726 cpl_table* data_tbl=NULL;
1727 cpl_table* histo=NULL;
1728 cpl_image* img=NULL;
1729 cpl_table* dist=NULL;
1730 cpl_table* min_xi=NULL;
1731 cpl_table* tmp_tbl1=NULL;
1732 cpl_table* tmp_tbl2=NULL;
1733 cpl_vector* vx=NULL;
1734 cpl_vector* vy=NULL;
1735 cpl_vector* sx=NULL;
1736 cpl_vector* sy=NULL;
1740 cknull_nomsg(plist=cpl_propertylist_load(cpl_frame_get_filename(obj_frm),0));
1741 check_nomsg(xsz=sinfo_pfits_get_naxis1(plist));
1742 check_nomsg(ysz=sinfo_pfits_get_naxis2(plist));
1743 check_nomsg(zsz=sinfo_pfits_get_naxis3(plist));
1744 sinfo_free_propertylist(&plist);
1746 cknull_nomsg(obj_cub=cpl_imagelist_load(cpl_frame_get_filename(obj_frm),
1747 CPL_TYPE_DOUBLE,0));
1750 check_nomsg(data_tbl=cpl_table_new(n));
1751 check_nomsg(cpl_table_new_column(data_tbl,
"DATA",CPL_TYPE_DOUBLE));
1754 for(k=0;k<zsz;k++) {
1755 check_nomsg(img=cpl_imagelist_get(obj_cub,k));
1756 check_nomsg(pdata=cpl_image_get_data(img));
1757 for(i=0;i<xsz*ysz;i++) {
1758 if(!irplib_isnan(pdata[i])) {
1759 cpl_table_set_double(data_tbl,
"DATA",r,pdata[i]);
1764 sinfo_free_imagelist(&obj_cub);
1766 check_nomsg(cpl_table_erase_invalid(data_tbl));
1767 check_nomsg(avg_d=cpl_table_get_column_mean(data_tbl,
"DATA"));
1768 check_nomsg(std_d=cpl_table_get_column_stdev(data_tbl,
"DATA"));
1771 hmin=avg_d-kappa*std_d;
1772 hmax=avg_d+kappa*std_d;
1775 sinfo_msg(
"Computes histogram");
1776 ck0(sinfo_histogram(data_tbl,nbins,hmin,hmax,&histo),
"building histogram");
1782 while(min_xi_sz < HISTO_MIN_SIZE && counter < 10) {
1786 check_nomsg(max_pos=sinfo_table_get_index_of_max(histo,
"HY",CPL_TYPE_INT));
1799 sinfo_free_table(&tmp_tbl1);
1802 check_nomsg(tmp_tbl1=sinfo_extract_table_rows(histo,
"HL",
1804 cpl_table_get(histo,
"HL",max_pos,&status)));
1805 thres=cpl_table_get_column_max(tmp_tbl1,
"HY")/HISTO_Y_CUT;
1809 sinfo_free_table(&min_xi);
1810 check_nomsg(min_xi=sinfo_extract_table_rows(tmp_tbl1,
"HY",
1811 CPL_GREATER_THAN,thres));
1817 min_xi_sz=cpl_table_get_nrow(min_xi);
1818 val=cpl_table_get(min_xi,
"HL",0,&status);
1820 check_nomsg(min_pos=sinfo_table_get_index_of_val(histo,
"HL",val,
1827 if (min_xi_sz > 0) {
1828 min_x = min_pos-HISTO_X_LEFT_CUT*(max_pos-min_pos);
1829 max_x = max_pos+HISTO_X_RIGHT_CUT*(max_pos-min_pos);
1833 check_nomsg(hmin=sinfo_table_column_interpolate(histo,
"HL",min_x));
1834 check_nomsg(hmax=sinfo_table_column_interpolate(histo,
"HL",max_x));
1837 sinfo_free_table(&histo);
1838 ck0(sinfo_histogram(data_tbl,nbins,hmin,hmax,&histo),
"building histogram");
1840 check_nomsg(cpl_table_add_scalar(histo,
"HL",(hmax-hmin)/nbins/2));
1846 sinfo_free_table(&data_tbl);
1847 sinfo_free_table(&min_xi);
1851 check_nomsg(peak=cpl_table_get_column_max(histo,
"HY"));
1853 sinfo_free_table(&tmp_tbl1);
1855 check_nomsg(tmp_tbl1=sinfo_extract_table_rows(histo,
"HY",CPL_EQUAL_TO,peak));
1860 check_nomsg(*centre=cpl_table_get_column_mean(tmp_tbl1,
"HL"));
1863 sinfo_free_table(&tmp_tbl1);
1864 check_nomsg(tmp_tbl1=sinfo_extract_table_rows(histo,
"HY",
1867 sinfo_free_table(&tmp_tbl2);
1868 check_nomsg(tmp_tbl2=sinfo_extract_table_rows(tmp_tbl1,
"HY",
1869 CPL_LESS_THAN,peak));
1870 sinfo_free_table(&tmp_tbl1);
1872 check_nomsg(tempc=*centre-cpl_table_get_column_min(tmp_tbl2,
"HL"));
1874 sinfo_free_table(&tmp_tbl2);
1876 check_nomsg(dist=sinfo_where_tab_min_max(histo,
"HL",
1877 CPL_GREATER_THAN,*centre-HISTO_DIST_TEMPC_MIN_FCT*tempc,
1878 CPL_NOT_GREATER_THAN,*centre+HISTO_DIST_TEMPC_MAX_FCT*tempc));
1880 offset=cpl_table_get_column_min(histo,
"HY");
1881 sinfo_free_table(&histo);
1884 check_nomsg(ndist=cpl_table_get_nrow(dist));
1885 check_nomsg(cpl_table_cast_column(dist,
"HY",
"HYdouble",CPL_TYPE_DOUBLE));
1886 check_nomsg(disth=cpl_table_get_data_double(dist,
"HYdouble"));
1887 check_nomsg(distx=cpl_table_get_data_double(dist,
"HL"));
1897 if(obj_noise_fit == 1) {
1898 check_nomsg(vy=cpl_vector_wrap(ndist,disth));
1899 check_nomsg(vx=cpl_vector_wrap(ndist,distx));
1900 check_nomsg(sx=cpl_vector_new(ndist));
1901 check_nomsg(cpl_vector_fill(sx,1.));
1902 check_nomsg(sy=cpl_vector_duplicate(sx));
1906 check_nomsg(cpl_vector_fit_gaussian(vx,NULL,
1909 &x0,&sigma,&area,&offset,
1917 sinfo_unwrap_vector(&vx);
1918 sinfo_unwrap_vector(&vy);
1919 sinfo_free_my_vector(&sx);
1920 sinfo_free_my_vector(&sy);
1922 sinfo_free_table(&dist);
1928 sinfo_free_imagelist(&obj_cub);
1929 sinfo_free_propertylist(&plist);
1930 sinfo_free_table(&min_xi);
1931 sinfo_free_table(&tmp_tbl1);
1932 sinfo_free_table(&tmp_tbl2);
1933 sinfo_free_table(&histo);
1934 sinfo_free_table(&dist);
1935 sinfo_free_table(&data_tbl);
1936 sinfo_free_my_vector(&sx);
1937 sinfo_free_my_vector(&sy);
1938 sinfo_unwrap_vector(&vx);
1939 sinfo_unwrap_vector(&vy);
1959 sinfo_where_tab_min_max(cpl_table* t,
1961 cpl_table_select_operator op1,
1963 cpl_table_select_operator op2,
1967 cpl_table* res=NULL;
1968 cpl_table* tmp=NULL;
1970 check_nomsg(cpl_table_and_selected_double(t,col,op1,v1));
1971 check_nomsg(tmp=cpl_table_extract_selected(t));
1972 check_nomsg(cpl_table_and_selected_double(tmp,col,op2,v2));
1973 check_nomsg(res=cpl_table_extract_selected(tmp));
1974 check_nomsg(cpl_table_select_all(t));
1975 sinfo_free_table(&tmp);
1980 sinfo_free_table(&tmp);
1981 sinfo_free_table(&res);
2013 sinfo_histogram(
const cpl_table* data,
2019 cpl_table* tmp_tbl1=NULL;
2020 cpl_table* tmp_tbl2=NULL;
2021 cpl_table* dat=NULL;
2034 check_nomsg(dat=cpl_table_duplicate(data));
2035 check_nomsg(cpl_table_cast_column(dat,
"DATA",
"DDATA",CPL_TYPE_DOUBLE));
2041 check_nomsg(cpl_table_and_selected_double(dat,
"DDATA",
2042 CPL_NOT_GREATER_THAN,max));
2046 check_nomsg(tmp_tbl1=cpl_table_extract_selected(dat));
2056 check_nomsg(cpl_table_and_selected_double(tmp_tbl1,
"DDATA",
2057 CPL_GREATER_THAN,min));
2058 check_nomsg(tmp_tbl2=cpl_table_extract_selected(tmp_tbl1));
2064 sinfo_free_table(&tmp_tbl1);
2072 check_nomsg(ntot=cpl_table_get_nrow(tmp_tbl2));
2075 check_nomsg(vmin=cpl_table_get_column_min(tmp_tbl2,
"DDATA"));
2076 check_nomsg(vmax=cpl_table_get_column_max(tmp_tbl2,
"DDATA"));
2077 vstp=(vmax-vmin)/(nbins-1);
2079 check_nomsg(*histo=cpl_table_new(nbins));
2080 check_nomsg(cpl_table_new_column(*histo,
"HX",CPL_TYPE_DOUBLE));
2081 check_nomsg(cpl_table_new_column(*histo,
"HL",CPL_TYPE_DOUBLE));
2082 check_nomsg(cpl_table_new_column(*histo,
"HY",CPL_TYPE_INT));
2085 check_nomsg(cpl_table_fill_column_window(*histo,
"HL",0,nbins,0));
2086 check_nomsg(cpl_table_fill_column_window(*histo,
"HY",0,nbins,0));
2088 check_nomsg(phy=cpl_table_get_data_int(*histo,
"HY"));
2090 check_nomsg(pdt=cpl_table_get_data_double(dat,
"DATA"));
2092 for(i=0;i<nbins;i++) {
2093 cpl_table_set_double(*histo,
"HX",i,(
double)i);
2095 cpl_table_set_double(*histo,
"HL",i,vtmp);
2099 for(i=0;i<ntot;i++) {
2100 h=floor((pdt[i]-vmin)/vstp);
2101 if((h<nbins) && (h>-1)) {
2107 sinfo_free_table(&tmp_tbl2);
2108 sinfo_free_table(&dat);
2113 sinfo_free_table(&tmp_tbl1);
2114 sinfo_free_table(&tmp_tbl2);
2115 sinfo_free_table(&dat);
2135 sinfo_object_flag_low_values(cpl_frame* obj_frm,
2138 cpl_imagelist** flag_data)
2149 cpl_propertylist* plist=NULL;
2150 cpl_table* data_tbl=NULL;
2151 cpl_table* flag_tbl=NULL;
2152 cpl_image* img=NULL;
2153 cpl_imagelist* obj_cub=NULL;
2159 cknull_nomsg(plist=cpl_propertylist_load(cpl_frame_get_filename(obj_frm),0));
2160 check_nomsg(xsz=sinfo_pfits_get_naxis1(plist));
2161 check_nomsg(ysz=sinfo_pfits_get_naxis2(plist));
2162 check_nomsg(zsz=sinfo_pfits_get_naxis3(plist));
2163 sinfo_free_propertylist(&plist);
2165 cknull_nomsg(obj_cub=cpl_imagelist_load(cpl_frame_get_filename(obj_frm),
2166 CPL_TYPE_DOUBLE,0));
2169 check_nomsg(data_tbl=cpl_table_new(n));
2170 check_nomsg(cpl_table_new_column(data_tbl,
"DATA",CPL_TYPE_DOUBLE));
2172 for(k=0;k<zsz;k++) {
2173 check_nomsg(img=cpl_imagelist_get(obj_cub,k));
2174 check_nomsg(pdata=cpl_image_get_data_double(img));
2175 for(i=0;i<xsz*ysz;i++) {
2176 if(!irplib_isnan(pdata[i])) {
2177 check_nomsg(cpl_table_set_double(data_tbl,
"DATA",r,pdata[i]));
2183 check_nomsg(cpl_table_erase_invalid(data_tbl));
2185 check_nomsg(cpl_table_and_selected_double(data_tbl,
"DATA",
2186 CPL_LESS_THAN,cnt+2*sig));
2187 check_nomsg(flag_tbl=cpl_table_extract_selected(data_tbl));
2188 sinfo_free_table(&data_tbl);
2191 sinfo_free_table(&flag_tbl);
2193 check_nomsg(*flag_data=cpl_imagelist_new());
2194 for(i=0;i<zsz;i++) {
2195 check_nomsg(img=cpl_image_new(xsz,ysz,CPL_TYPE_DOUBLE));
2196 check_nomsg(cpl_image_add_scalar(img,0));
2197 check_nomsg(cpl_imagelist_set(*flag_data,cpl_image_duplicate(img),i));
2198 sinfo_free_image(&img);
2200 for(k=0;k<zsz;k++) {
2201 check_nomsg(img=cpl_imagelist_get(*flag_data,k));
2202 pflag=cpl_image_get_data_double(cpl_imagelist_get(*flag_data,k));
2203 pdata=cpl_image_get_data_double(cpl_imagelist_get(obj_cub,k));
2204 for(i=0;i<xsz*ysz;i++) {
2205 if((!irplib_isnan(pdata[i])) && pdata[i] < (cnt+2*sig)) {
2211 sinfo_free_imagelist(&obj_cub);
2219 sinfo_free_propertylist(&plist);
2220 sinfo_free_imagelist(&obj_cub);
2221 sinfo_free_table(&data_tbl);
2222 sinfo_free_table(&flag_tbl);
2245 sinfo_object_flag_sky_pixels(cpl_frame* obj_frm,
2248 cpl_imagelist* flag_data,
2266 double* pr_img=NULL;
2267 double* pg_img=NULL;
2268 double* pimage=NULL;
2269 cpl_propertylist* plist=NULL;
2270 cpl_imagelist* osel=NULL;
2271 cpl_imagelist* fsel=NULL;
2272 cpl_table* gpix=NULL;
2273 cpl_table* gspec=NULL;
2274 cpl_table* fspec=NULL;
2275 cpl_table* ospec=NULL;
2277 cpl_imagelist* obj_cub=NULL;
2280 cknull_nomsg(plist=cpl_propertylist_load(cpl_frame_get_filename(obj_frm),0));
2282 check_nomsg(xsz=sinfo_pfits_get_naxis1(plist));
2283 check_nomsg(ysz=sinfo_pfits_get_naxis2(plist));
2285 sinfo_free_propertylist(&plist);
2286 cknull_nomsg(obj_cub=cpl_imagelist_load(cpl_frame_get_filename(obj_frm),
2287 CPL_TYPE_DOUBLE,0));
2291 check_nomsg(*r_img=cpl_image_new(xsz,ysz,CPL_TYPE_DOUBLE));
2292 check_nomsg(*g_img=cpl_image_new(xsz,ysz,CPL_TYPE_DOUBLE));
2293 check_nomsg(*image=cpl_image_new(xsz,ysz,CPL_TYPE_DOUBLE));
2295 cknull_nomsg(pr_img=cpl_image_get_data_double(*r_img));
2296 cknull_nomsg(pg_img=cpl_image_get_data_double(*g_img));
2297 cknull_nomsg(pimage=cpl_image_get_data_double(*image));
2310 cknull_nomsg(osel=sinfo_imagelist_select_range(obj_cub,lambda,
2313 sinfo_free_imagelist(&obj_cub);
2315 cknull_nomsg(fsel=sinfo_imagelist_select_range(flag_data,lambda,
2323 for(j=0;j<ysz;j++) {
2324 for(i=0;i<xsz;i++) {
2326 cknull_nomsg(ospec=sinfo_slice_z(osel,i,j));
2327 cknull_nomsg(fspec=sinfo_slice_z(fsel,i,j));
2329 check_nomsg(gpix_i=sinfo_table_extract_finite(ospec,fspec,&gpix,&gspec));
2333 all_pix=(double)gpix_i;
2351 check_nomsg(flag_pix=cpl_table_and_selected_double(gspec,
"VALUE",
2352 CPL_GREATER_THAN,0.5));
2356 ratio=flag_pix/all_pix;
2358 if(all_pix > cpl_table_get_nrow(mrange)/2) {
2360 pr_img[i+j*xsz]=ratio;
2363 check_nomsg(pimage[i+j*xsz]=cpl_table_get_column_mean(gpix,
"VALUE"));
2366 sinfo_free_table(&ospec);
2367 sinfo_free_table(&fspec);
2368 sinfo_free_table(&gpix);
2369 sinfo_free_table(&gspec);
2373 sinfo_free_imagelist(&osel);
2374 sinfo_free_imagelist(&fsel);
2385 check_nomsg(tot=cpl_image_get_flux(*g_img));
2395 sinfo_free_propertylist(&plist);
2396 sinfo_free_imagelist(&obj_cub);
2397 sinfo_free_imagelist(&osel);
2398 sinfo_free_imagelist(&fsel);
2399 sinfo_free_table(&ospec);
2400 sinfo_free_table(&fspec);
2401 sinfo_free_table(&gpix);
2402 sinfo_free_table(&gspec);
2418 sinfo_choose_good_sky_pixels(cpl_frame* obj_frm,
2421 const double min_frac,
2431 double thres=SKY_THRES;
2434 cpl_image* r2img=NULL;
2435 cpl_propertylist* plist=NULL;
2436 cpl_table* cum=NULL;
2437 cpl_table* hcum=NULL;
2438 cpl_table* thres_tbl=NULL;
2440 cknull_nomsg(plist=cpl_propertylist_load(cpl_frame_get_filename(obj_frm),0));
2441 check_nomsg(xsz=sinfo_pfits_get_naxis1(plist));
2442 check_nomsg(ysz=sinfo_pfits_get_naxis2(plist));
2444 sinfo_free_propertylist(&plist);
2447 check_nomsg(*mask=cpl_image_new(xsz,ysz,CPL_TYPE_DOUBLE));
2450 check_nomsg(r2img=cpl_image_duplicate(r_img));
2451 check_nomsg(cpl_image_threshold(r2img,thres,thres,0,1));
2452 check_nomsg(r2i=cpl_image_get_flux(r2img));
2455 sinfo_free_image(&(*mask));
2456 check_nomsg(*mask=cpl_image_duplicate(r2img));
2458 sinfo_free_image(&r2img);
2459 check_nomsg(r2img=cpl_image_duplicate(r_img));
2460 check_nomsg(cpl_image_threshold(r2img,thres,SINFO_DBL_MAX,0,SINFO_DBL_MAX));
2461 sinfo_free_image(&r2img);
2463 check_nomsg(tot=cpl_image_get_flux(g_img));
2466 sinfo_msg(
"%2.2d spaxels (%4.1f %% of good pixels) are designated as sky",
2470 if (1.*r2i/tot < min_frac) {
2471 sinfo_msg(
"this is too small - will increase it to %4.1f %%",
2473 check_nomsg(cum=cpl_table_new(xsz*ysz));
2474 check_nomsg(cpl_table_new_column(cum,
"X",CPL_TYPE_DOUBLE));
2475 sinfo_table_column_dindgen(&cum,
"X");
2476 check_nomsg(cpl_table_add_scalar(cum,
"X",1.));
2479 hcum = sinfo_image2table(r_img);
2480 check_nomsg(sinfo_sort_table_1(hcum,
"VALUE",FALSE));
2483 check_nomsg(cpl_table_duplicate_column(cum,
"H",hcum,
"VALUE"));
2484 check_nomsg(cum_x_max=cpl_table_get_column_max(cum,
"X"));
2485 check_nomsg(cpl_table_duplicate_column(cum,
"R",cum,
"X"));
2486 check_nomsg(cpl_table_divide_scalar(cum,
"R",cum_x_max));
2487 check_nomsg(cpl_table_and_selected_double(cum,
"R",
2490 check_nomsg(thres_tbl=cpl_table_extract_selected(cum));
2492 check_nomsg(thres = cpl_table_get(thres_tbl,
"R",0,&status));
2494 sinfo_free_image(&(*mask));
2497 check_nomsg(*mask=cpl_image_duplicate(r_img));
2498 check_nomsg(cpl_image_threshold(*mask,thres,thres,0,1));
2500 sinfo_free_table(&cum);
2501 sinfo_free_table(&hcum);
2502 sinfo_free_table(&thres_tbl);
2507 sinfo_free_propertylist(&plist);
2508 sinfo_free_image(&r2img);
2509 sinfo_free_table(&cum);
2510 sinfo_free_table(&hcum);
2511 sinfo_free_table(&thres_tbl);
2529 sinfo_fit_bkg(
double p[])
2535 cpl_vector* vtmp=NULL;
2542 check_nomsg(px= cpl_vector_get_data(sa_vx));
2543 check_nomsg(py= cpl_vector_get_data(sa_vy));
2544 check_nomsg(np= cpl_vector_get_size(sa_vx));
2545 check_nomsg(vtmp=cpl_vector_duplicate(sa_vy));
2546 check_nomsg(pv=cpl_vector_get_data(vtmp));
2549 pv[i]=sinfo_fac(px[i],p[2]);
2552 check_nomsg(max=cpl_vector_get_max(vtmp));
2554 check_nomsg(cpl_vector_divide_scalar(vtmp,max));
2555 check_nomsg(cpl_vector_multiply_scalar(vtmp,p[1]));
2556 check_nomsg(cpl_vector_add_scalar(vtmp,p[0]));
2561 chi2+=(py[i]-pv[i])*(py[i]-pv[i]);
2563 sinfo_free_my_vector(&vtmp);
2566 sinfo_free_my_vector(&vtmp);
2587 sinfo_thermal_background2(cpl_table* int_sky,
2598 cpl_table* tmp1=NULL;
2599 cpl_table* tmp2=NULL;
2623 ap=(
double**) cpl_calloc(MP,
sizeof(
double*));
2626 ap[i]=cpl_calloc(NP,
sizeof(
double));
2629 cknull(int_sky,
"Null input table sky");
2630 cknull(lambda,
"Null input table lambda");
2631 cknull(lrange,
"Null input table lrange");
2635 check_nomsg(wmin=cpl_table_get_column_min(lrange,
"WAVE"));
2636 check_nomsg(wmax=cpl_table_get_column_max(lrange,
"WAVE"));
2637 check_nomsg(cpl_table_and_selected_double(int_sky,
"WAVE",
2638 CPL_NOT_LESS_THAN,wmin));
2639 check_nomsg(cpl_table_and_selected_double(int_sky,
"WAVE",
2640 CPL_NOT_GREATER_THAN,wmax));
2641 check_nomsg(tmp1=cpl_table_extract_selected(int_sky));
2643 check_nomsg(row=sinfo_table_get_index_of_val(tmp1,
"WAVE",
2644 wmax,CPL_TYPE_DOUBLE));
2645 check_nomsg(max=cpl_table_get_double(tmp1,
"INT",row,&status));
2646 check_nomsg(sinfo_table_flag_nan(&tmp1,
"INT"));
2647 check_nomsg(cpl_table_erase_invalid(tmp1));
2648 check_nomsg(cpl_table_and_selected_double(tmp1,
"INT",CPL_NOT_EQUAL_TO,0));
2649 check_nomsg(tmp2=cpl_table_extract_selected(tmp1));
2651 sinfo_free_table(&tmp1);
2652 check_nomsg(n2=cpl_table_get_nrow(tmp2));
2653 check_nomsg(sa_vx=cpl_vector_wrap(n2,
2654 cpl_table_get_data_double(tmp2,
"WAVE")));
2655 check_nomsg(sa_vy=cpl_vector_wrap(n2,
2656 cpl_table_get_data_double(tmp2,
"INT")));
2665 check_nomsg(bkg_min=cpl_table_get_column_min(tmp2,
"INT"));
2666 check_nomsg(bkg_max=cpl_table_get_double(tmp2,
"INT",row,&status));
2677 ap[0][0]=p0_min; ap[0][1]=p1_min; ap[0][2]=p2_min;
2678 ap[1][0]=p0_max; ap[1][1]=p1_min; ap[1][2]=p2_min;
2679 ap[2][0]=p0_min; ap[2][1]=p1_max; ap[2][2]=p2_min;
2680 ap[3][0]=p0_min; ap[3][1]=p1_min; ap[3][2]=p2_max;
2682 sinfo_msg(
"Before amoeba fit");
2685 sinfo_msg(
"ap[%d][%d]=%g",i,j,ap[i][j]);
2696 y[i]=sinfo_fit_bkg(p0);
2699 sinfo_msg(
"p0=%g %g %g",p0[0],p0[1],p0[2]);
2700 for(i=0;i<N_ITER_FIT_AMOEBA;i++) {
2701 check_nomsg(sinfo_fit_amoeba(ap,y,NP,AMOEBA_FTOL,sinfo_fit_bkg,&nfunc));
2702 sinfo_msg(
"After amoeba fit");
2703 sinfo_msg(
"iter=%d ap=%g %g %g",i,ap[0][0],ap[0][1],ap[0][2]);
2705 sinfo_unwrap_vector(&sa_vx);
2706 sinfo_unwrap_vector(&sa_vy);
2707 sinfo_free_table(&tmp2);
2710 sinfo_msg(
"After amoeba fit");
2713 sinfo_msg(
"ap[%d][%d]=%g",i,j,ap[i][j]);
2715 sinfo_msg(
"y[%d]=%g",i,y[i]);
2720 check_nomsg(nrow=cpl_table_get_nrow(lambda));
2721 check_nomsg(*bkg=cpl_table_new(nrow));
2722 check_nomsg(cpl_table_duplicate_column(*bkg,
"WAVE",lambda,
"WAVE"));
2723 check_nomsg(cpl_table_new_column(*bkg,
"INT2",CPL_TYPE_DOUBLE));
2724 cpl_table_fill_column_window(*bkg,
"INT2",0,nrow,0.);
2725 check_nomsg(pw=cpl_table_get_data_double(*bkg,
"WAVE"));
2726 check_nomsg(pf=cpl_table_get_data_double(*bkg,
"INT2"));
2728 for(i=0;i<nrow;i++) {
2729 pf[i]=sinfo_fac(pw[i],ap[0][2]);
2731 check_nomsg(max=cpl_table_get_column_max(*bkg,
"INT2"));
2734 check_nomsg(cpl_table_divide_scalar(*bkg,
"INT2",max));
2736 check_nomsg(cpl_table_multiply_scalar(*bkg,
"INT2",ap[0][1]));
2737 check_nomsg(cpl_table_add_scalar(*bkg,
"INT2",ap[0][0]));
2740 sinfo_new_destroy_2Ddoublearray(&ap,MP);
2746 sinfo_new_destroy_2Ddoublearray(&ap,MP);
2747 sinfo_free_table(&tmp1);
2748 sinfo_free_table(&tmp2);
2749 sinfo_unwrap_vector(&sa_vx);
2750 sinfo_unwrap_vector(&sa_vy);
2772 sinfo_thermal_background(cpl_table* int_sky,
2777 const int filter_width,
2813 cpl_vector *a = cpl_vector_new(ndim);
2814 cpl_table* xlr=NULL;
2815 cpl_table* ylr=NULL;
2816 cpl_table* wlr=NULL;
2817 cpl_table* tmp=NULL;
2818 cpl_table* temp2_tbl=NULL;
2821 cpl_vector* fy=NULL;
2823 cpl_vector* sy=NULL;
2825 cpl_matrix* x_matrix=NULL;
2840 check_nomsg(wmin=cpl_table_get_column_min(lrange,
"WAVE"));
2841 check_nomsg(wmax=cpl_table_get_column_max(lrange,
"WAVE"));
2844 bkg_max=sinfo_fac(wmax,temp);
2849 check_nomsg(cpl_table_and_selected_double(lambda,
"WAVE",
2850 CPL_NOT_LESS_THAN,wmin));
2851 check_nomsg(tmp=cpl_table_extract_selected(lambda));
2853 check_nomsg(cpl_table_and_selected_double(tmp,
"WAVE",
2854 CPL_NOT_GREATER_THAN,wmax));
2855 check_nomsg(xlr=cpl_table_extract_selected(tmp));
2856 sinfo_free_table(&tmp);
2859 check_nomsg(cpl_table_and_selected_double(int_sky,
"WAVE",
2860 CPL_NOT_LESS_THAN,wmin));
2861 check_nomsg(tmp=cpl_table_extract_selected(int_sky));
2862 check_nomsg(cpl_table_and_selected_double(tmp,
"WAVE",
2863 CPL_NOT_GREATER_THAN,wmax));
2867 check_nomsg(cpl_table_and_selected_double(tmp,
"INT",CPL_GREATER_THAN,-2));
2868 check_nomsg(ylr=cpl_table_extract_selected(tmp));
2870 sinfo_free_table(&tmp);
2871 check_nomsg(tmp=cpl_table_duplicate(ylr));
2872 sinfo_free_table(&ylr);
2874 check_nomsg(avg=cpl_table_get_column_mean(tmp,
"INT"));
2875 check_nomsg(sdv=cpl_table_get_column_stdev(tmp,
"INT"));
2876 check_nomsg(cpl_table_and_selected_double(tmp,
"INT",
2877 CPL_LESS_THAN,avg+10*sdv));
2879 check_nomsg(ylr=cpl_table_extract_selected(tmp));
2880 sinfo_free_table(&tmp);
2887 check_nomsg(cpl_table_and_selected_double(ylr,
"INT",CPL_NOT_EQUAL_TO,0));
2889 check_nomsg(wlr=cpl_table_extract_selected(ylr));
2892 check_nomsg(p0[0]=cpl_table_get_column_min(wlr,
"INT"));
2893 check_nomsg(row=sinfo_table_get_index_of_val(ylr,
"WAVE",
2894 wmax,CPL_TYPE_DOUBLE));
2895 check_nomsg(p0[1]=cpl_table_get_double(ylr,
"INT",row,&status));
2905 check_nomsg(sinfo_table_flag_nan(&wlr,
"INT"));
2906 check_nomsg(cpl_table_erase_invalid(wlr));
2912 check_nomsg(NPOINTS=cpl_table_get_nrow(ylr));
2914 check_nomsg(x_matrix = cpl_matrix_wrap(NPOINTS,1,
2915 cpl_table_get_data_double(ylr,
"WAVE")));
2916 check_nomsg(y=cpl_vector_wrap(NPOINTS,cpl_table_get_data_double(ylr,
"INT")));
2920 check_nomsg(fy=sinfo_sky_background_estimate(y,filter_width,filter_width));
2922 pif=cpl_vector_get_data(fy);
2923 pwf=cpl_table_get_data_double(ylr,
"WAVE");
2926 check_nomsg(cpl_table_new_column(int_sky,
"INT_BKG_SMO",CPL_TYPE_DOUBLE));
2927 check_nomsg(cpl_table_new_column(int_sky,
"WAVE_SMO",CPL_TYPE_DOUBLE));
2928 pws=cpl_table_get_data_double(int_sky,
"WAVE");
2932 check_nomsg(nrow=cpl_table_get_nrow(int_sky));
2933 if((pws[0]-pwf[0])>0) {
2934 for(i=0;i<NPOINTS;i++) {
2935 if(fabs(pws[k]-pwf[i]) < tol) {
2936 check_nomsg(cpl_table_set_double(int_sky,
"INT_BKG_SMO",k,pif[i]));
2937 check_nomsg(cpl_table_set_double(int_sky,
"WAVE_SMO",k,pws[i]));
2942 for(k=0;k<nrow;k++) {
2943 if((i<NPOINTS) && (fabs(pws[k]-pwf[i]) < tol)) {
2944 check_nomsg(cpl_table_set_double(int_sky,
"INT_BKG_SMO",k,pif[i]));
2945 check_nomsg(cpl_table_set_double(int_sky,
"WAVE_SMO",k,pws[i]));
2955 check_nomsg(cpl_vector_set(a, 0, ga0));
2956 check_nomsg(cpl_vector_set(a, 1, ga1));
2957 check_nomsg(cpl_vector_set(a, 2, ga2));
2959 check_nomsg(sy=cpl_vector_duplicate(y));
2960 check_nomsg(cpl_vector_power(sy,2));
2961 check_nomsg(cpl_vector_power(sy,0.5));
2969 for(i=0;i<niter;i++) {
2977 if(CPL_ERROR_NONE != sinfo_fit_lm(x_matrix,NULL,fy,sy,a,ia,sinfo_fitbkg,
2978 sinfo_fitbkg_derivative,
2979 &mse,&chired,NULL)) {
3000 sinfo_msg(
"Last fit: a=%g %g %g chired=%g",
3001 cpl_vector_get(a,0),
3002 cpl_vector_get(a,1),
3003 cpl_vector_get(a,2),
3006 sinfo_free_my_vector(&fy);
3007 sinfo_unwrap_vector(&y);
3008 sinfo_free_my_vector(&sy);
3009 sinfo_unwrap_matrix(&x_matrix);
3010 sinfo_free_table(&xlr);
3011 sinfo_free_table(&ylr);
3012 sinfo_free_table(&wlr);
3014 ga0=cpl_vector_get(a,0);
3015 ga1=cpl_vector_get(a,1);
3016 ga2=cpl_vector_get(a,2);
3018 check_nomsg(npix=cpl_table_get_nrow(lrange));
3019 check_nomsg(pw=cpl_table_get_data_double(lrange,
"WAVE"));
3020 check_nomsg(temp2_tbl=cpl_table_new(npix));
3021 check_nomsg(cpl_table_new_column(temp2_tbl,
"TEMP2",CPL_TYPE_DOUBLE));
3023 for(i=0;i<npix;i++) {
3024 temp2=sinfo_fac(pw[i],ga2);
3025 check_nomsg(cpl_table_set_double(temp2_tbl,
"TEMP2",i,temp2));
3027 check_nomsg(max_tmp2=cpl_table_get_column_max(temp2_tbl,
"TEMP2"));
3028 sinfo_free_table(&temp2_tbl);
3032 check_nomsg(npix=cpl_table_get_nrow(lambda));
3033 check_nomsg(pw=cpl_table_get_data_double(lambda,
"WAVE"));
3034 check_nomsg(*bkg=cpl_table_new(npix));
3035 check_nomsg(cpl_table_new_column(*bkg,
"WAVE",CPL_TYPE_DOUBLE));
3036 check_nomsg(cpl_table_new_column(*bkg,
"TEMP1",CPL_TYPE_DOUBLE));
3037 check_nomsg(cpl_table_new_column(*bkg,
"INT",CPL_TYPE_DOUBLE));
3038 check_nomsg(cpl_table_new_column(*bkg,
"INT2",CPL_TYPE_DOUBLE));
3040 for(i=0;i<npix;i++) {
3041 check_nomsg(cpl_table_set_double(*bkg,
"WAVE",i,pw[i]));
3042 temp1=sinfo_fac(pw[i],ga2);
3043 check_nomsg(cpl_table_set_double(*bkg,
"TEMP1",i,temp1));
3046 check_nomsg(ptmp1=cpl_table_get_data_double(*bkg,
"TEMP1"));
3049 for(i=0;i<npix;i++) {
3050 thermal=ga0+ptmp1[i]/max_tmp2*ga1;
3051 check_nomsg(cpl_table_set_double(*bkg,
"INT",i,thermal));
3052 thermal=ga0+ga1*sinfo_fac(pw[i],ga2);
3053 check_nomsg(cpl_table_set_double(*bkg,
"INT2",i,thermal));
3055 sinfo_free_my_vector(&a);
3061 check_nomsg(npix=cpl_table_get_nrow(lambda));
3062 check_nomsg(*bkg=cpl_table_new(npix));
3063 check_nomsg(cpl_table_new_column(*bkg,
"TEMP1",CPL_TYPE_DOUBLE));
3064 check_nomsg(cpl_table_new_column(*bkg,
"INT",CPL_TYPE_DOUBLE));
3065 check_nomsg(cpl_table_new_column(*bkg,
"INT2",CPL_TYPE_DOUBLE));
3067 med=cpl_table_get_column_median(ylr,
"INT");
3068 for(i=0;i<npix;i++) {
3069 check_nomsg(cpl_table_set_double(*bkg,
"INT",i,med));
3070 check_nomsg(cpl_table_set_double(*bkg,
"INT2",i,med));
3073 sinfo_free_my_vector(&a);
3074 sinfo_unwrap_vector(&y);
3075 sinfo_free_my_vector(&sy);
3076 sinfo_unwrap_matrix(&x_matrix);
3077 sinfo_free_table(&xlr);
3078 sinfo_free_table(&ylr);
3079 sinfo_free_table(&wlr);
3080 sinfo_free_table(&tmp);
3086 sinfo_free_my_vector(&a);
3087 sinfo_unwrap_vector(&y);
3088 sinfo_free_my_vector(&sy);
3089 sinfo_unwrap_matrix(&x_matrix);
3091 sinfo_free_table(&xlr);
3092 sinfo_free_table(&ylr);
3093 sinfo_free_table(&wlr);
3094 sinfo_free_table(&tmp);
3095 sinfo_free_table(&temp2_tbl);
3113 sinfo_filter_min(
const cpl_vector* vi,
const int size)
3116 cpl_vector* vo=NULL;
3123 const double* pi=NULL;
3125 cknull(vi,
"null input vector");
3126 pi=cpl_vector_get_data_const(vi);
3127 length=cpl_vector_get_size(vi);
3129 vo=cpl_vector_new(length);
3130 po=cpl_vector_get_data(vo);
3132 for(i=start; i < end; i++) {
3134 for(j=i-start+1;j<i+start+1;j++) {
3144 for (i = 0; i < start; i++) {
3148 for (i = end; i < length; i++) {
3172 sinfo_filter_max(
const cpl_vector* vi,
const int size)
3175 cpl_vector* vo=NULL;
3182 const double* pi=NULL;
3185 cknull(vi,
"null input vector");
3186 pi=cpl_vector_get_data_const(vi);
3187 length=cpl_vector_get_size(vi);
3189 vo=cpl_vector_new(length);
3190 po=cpl_vector_get_data(vo);
3192 for(i=start; i < end; i++) {
3194 for(j=i-start+1;j<i+start+1;j++) {
3204 for (i = 0; i < start; i++) {
3208 for (i = end; i < length; i++) {
3233 sinfo_filter_smo(
const cpl_vector* vi,
const int size)
3243 const double* pi=NULL;
3245 cpl_vector* vo=NULL;
3247 cknull(vi,
"null input vector");
3248 length=cpl_vector_get_size(vi);
3250 vo=cpl_vector_new(length);
3251 pi=cpl_vector_get_data_const(vi);
3252 po=cpl_vector_get_data(vo);
3254 for(i=start; i < end; i++) {
3256 for(j=i - start;j<i+start+1;j++) {
3264 for (i = 0; i < start; i++) {
3268 for (i = end; i < length; i++) {
3334 cpl_vector* sinfo_sky_background_estimate(cpl_vector *spectrum,
3339 cpl_vector * minf=NULL;
3340 cpl_vector * maxf=NULL;
3341 cpl_vector * smof=NULL;
3342 cpl_vector * back=NULL;
3350 cknull(spectrum,
"null input data");
3357 check_nomsg(length=cpl_vector_get_size(spectrum));
3359 if (msize < 3 || fsize < msize || length < 2*fsize)
3363 cknull_nomsg(minf = sinfo_filter_min(spectrum, msize));
3364 cknull_nomsg(smof = sinfo_filter_smo(minf, fsize));
3365 cpl_vector_delete(minf);
3366 cknull_nomsg(maxf = sinfo_filter_max(smof,2*msize+1));
3367 cpl_vector_delete(smof);
3368 cknull_nomsg(smof = sinfo_filter_smo(maxf, 2*fsize+1));
3369 cpl_vector_delete(maxf);
3370 cknull_nomsg(minf = sinfo_filter_min(smof, 2*msize+1));
3371 cpl_vector_delete(smof);
3372 cknull_nomsg(smof = sinfo_filter_smo(minf, 2*fsize+1));
3373 cpl_vector_delete(minf);
3374 cknull_nomsg(back=cpl_vector_new(length));
3375 cknull_nomsg(pb=cpl_vector_get_data(back));
3376 cknull_nomsg(ps=cpl_vector_get_data(smof));
3378 for (i = 0; i < length; i++) {
3381 cpl_vector_delete(smof);
3402 sinfo_slice_z(
const cpl_imagelist* cin,
const int i,
const int j)
3408 cpl_table* tout=NULL;
3409 const cpl_image* img=NULL;
3410 const double* pim=NULL;
3412 cknull(cin,
"null input imagelist");
3413 check_nomsg(sz=cpl_imagelist_get_size(cin));
3414 check_nomsg(img=cpl_imagelist_get_const(cin,0));
3415 check_nomsg(sx=cpl_image_get_size_x(img));
3417 check_nomsg(tout=cpl_table_new(sz));
3418 check_nomsg(cpl_table_new_column(tout,
"VALUE",CPL_TYPE_DOUBLE));
3420 check_nomsg(img=cpl_imagelist_get_const(cin,k));
3421 check_nomsg(pim=cpl_image_get_data_double_const(img));
3422 check_nomsg(cpl_table_set(tout,
"VALUE",k,pim[j*sx+i]));
3427 sinfo_free_table(&tout);
3444 sinfo_xcorr(cpl_table* int_obj,
3447 const double dispersion,
3448 const double line_hw)
3452 cpl_table* tmp_sky=NULL;
3454 cpl_table* z_diff=NULL;
3455 cpl_table* z_pos=NULL;
3479 cpl_table* z_good=NULL;
3480 cpl_table* w_tbl=NULL;
3481 cpl_table* o_tbl=NULL;
3482 cpl_table* s_tbl=NULL;
3483 cpl_vector* vw=NULL;
3484 cpl_vector* vs=NULL;
3485 cpl_vector* vo=NULL;
3486 cpl_vector* sx=NULL;
3487 cpl_vector* sy=NULL;
3516 cpl_polynomial* cfit=NULL;
3518 cpl_vector* vx=NULL;
3519 cpl_vector* vy=NULL;
3522 cpl_error_code error_code=CPL_ERROR_NONE;
3528 zsize=cpl_table_get_nrow(int_obj);
3529 check_nomsg(z = cpl_table_duplicate(int_sky));
3530 ck0_nomsg(sinfo_table_flag_nan(&z,
"INT"));
3532 check_nomsg(z_mean=cpl_table_get_column_mean(z,
"INT"));
3534 check_nomsg(cpl_table_multiply_scalar(z,
"INT",-1));
3540 check_nomsg(tmp_sky=cpl_table_duplicate(int_sky));
3541 ck0_nomsg(sinfo_table_flag_nan(&tmp_sky,
"INT"));
3542 check_nomsg(sky_max=cpl_table_get_column_max(tmp_sky,
"INT"));
3543 sinfo_free_table(&tmp_sky);
3546 check_nomsg(nrow=cpl_table_get_nrow(z));
3547 check_nomsg(pint=cpl_table_get_data_double(z,
"INT"));
3548 check_nomsg(sky_max=cpl_table_get_column_max(z,
"INT"));
3549 for(i=0;i<nrow;i++) {
3550 if(pint[i]<sky_max/SKY_LINE_MIN_CUT) {
3559 check_nomsg(z_diff=cpl_table_duplicate(z));
3560 check_nomsg(cpl_table_duplicate_column(z_diff,
"INT1",z,
"INT"));
3561 check_nomsg(cpl_table_duplicate_column(z_diff,
"INT2",z,
"INT"));
3562 check_nomsg(cpl_table_shift_column(z_diff,
"INT1",-1));
3563 check_nomsg(cpl_table_duplicate_column(z_diff,
"DIFF",z_diff,
"INT2"));
3564 check_nomsg(cpl_table_subtract_columns(z_diff,
"DIFF",
"INT1"));
3566 check_nomsg(cpl_table_erase_window(z_diff,nrow-2,2));
3571 check_nomsg(cpl_table_new_column(z_diff,
"POS",CPL_TYPE_INT));
3572 check_nomsg(cpl_table_fill_column_window_int(z_diff,
"POS",0,nrow,0));
3574 check_nomsg(pint=cpl_table_get_data_double(z_diff,
"DIFF"));
3575 check_nomsg(ppos=cpl_table_get_data_int(z_diff,
"POS"));
3576 check_nomsg(nrow=cpl_table_get_nrow(z_diff));
3577 for(i=1;i<nrow;i++) {
3578 if(!irplib_isnan(pint[i]) && (pint[i]>0 && pint[i-1]<0)) {
3585 check_nomsg(cpl_table_select_all(z_diff));
3586 check_nomsg(cpl_table_and_selected_int(z_diff,
"POS",CPL_GREATER_THAN,0));
3587 check_nomsg(z_pos=cpl_table_extract_selected(z_diff));
3588 sinfo_free_table(&z_diff);
3602 check_nomsg(npos=cpl_table_get_nrow(z_pos));
3604 check_nomsg(cpl_table_new_column(z_pos,
"STATUS_S",CPL_TYPE_INT));
3605 check_nomsg(cpl_table_new_column(z_pos,
"STATUS_O",CPL_TYPE_INT));
3606 check_nomsg(cpl_table_fill_column_window_int(z_pos,
"STATUS_S",0,npos,0));
3607 check_nomsg(cpl_table_fill_column_window_int(z_pos,
"STATUS_O",0,npos,0));
3608 check_nomsg(cpl_table_new_column(z_pos,
"SIGS",CPL_TYPE_DOUBLE));
3609 check_nomsg(cpl_table_new_column(z_pos,
"WAVES",CPL_TYPE_DOUBLE));
3610 check_nomsg(cpl_table_new_column(z_pos,
"BKGS",CPL_TYPE_DOUBLE));
3611 check_nomsg(cpl_table_new_column(z_pos,
"AREAS",CPL_TYPE_DOUBLE));
3612 check_nomsg(cpl_table_new_column(z_pos,
"AMPS",CPL_TYPE_DOUBLE));
3615 check_nomsg(cpl_table_new_column(z_pos,
"SIGO",CPL_TYPE_DOUBLE));
3616 check_nomsg(cpl_table_new_column(z_pos,
"WAVEO",CPL_TYPE_DOUBLE));
3617 check_nomsg(cpl_table_new_column(z_pos,
"BKGO",CPL_TYPE_DOUBLE));
3618 check_nomsg(cpl_table_new_column(z_pos,
"AREAO",CPL_TYPE_DOUBLE));
3619 check_nomsg(cpl_table_new_column(z_pos,
"AMPO",CPL_TYPE_DOUBLE));
3621 check_nomsg(cpl_table_new_column(z_pos,
"WAVEC",CPL_TYPE_DOUBLE));
3622 check_nomsg(cpl_table_new_column(z_pos,
"WDIF",CPL_TYPE_DOUBLE));
3623 check_nomsg(cpl_table_new_column(z_pos,
"ERR",CPL_TYPE_DOUBLE));
3635 for (jz=0;jz<npos;jz++) {
3636 check_nomsg(z1 = cpl_table_get_int(z_pos,
"POS",jz,&status));
3639 if((z1-z_ext) > 0 && (z1+z_ext) < zsize) {
3640 check_nomsg(cpl_table_select_all(int_sky));
3641 check_nomsg(cpl_table_select_all(int_obj));
3642 check_nomsg(cpl_table_select_all(lambda));
3643 check_nomsg(cpl_table_and_selected_window(int_sky,z1-z_ext,nfit));
3644 check_nomsg(s_tbl=cpl_table_extract_selected(int_sky));
3645 check_nomsg(cpl_table_and_selected_window(lambda,z1-z_ext,nfit));
3646 check_nomsg(w_tbl=cpl_table_extract_selected(lambda));
3647 check_nomsg(cpl_table_and_selected_window(int_obj,z1-z_ext,nfit));
3648 check_nomsg(o_tbl=cpl_table_extract_selected(int_obj));
3651 check_nomsg(vw=cpl_vector_wrap(nfit,
3652 cpl_table_get_data_double(w_tbl,
"WAVE")));
3653 check_nomsg(vs=cpl_vector_wrap(nfit,
3654 cpl_table_get_data_double(s_tbl,
"INT")));
3655 check_nomsg(vo=cpl_vector_wrap(nfit,
3656 cpl_table_get_data_double(o_tbl,
"INT")));
3659 check_nomsg(sx=cpl_vector_new(nfit));
3660 check_nomsg(cpl_vector_fill(sx,10.));
3661 check_nomsg(sy=cpl_vector_duplicate(sx));
3665 o1=cpl_vector_get(vo,0);
3666 o2=cpl_vector_get(vo,nfit-1);
3668 om=cpl_vector_get_median_const(vo);
3670 cpl_vector_multiply_scalar(vo,-1.);
3672 check_nomsg(ws=cpl_table_get_double(lambda,
"WAVE",z1,&status));
3673 check_nomsg(amp_s=cpl_table_get_double(z_pos,
"INT",jz,&status));
3675 sig_s=z_ext*dispersion;
3677 area_s=sinfo_gaussian_area(amp_s,sig_s,ws,wc_s,bkg_s);
3683 error_code=cpl_vector_fit_gaussian(vw,NULL,
3689 if(error_code == CPL_ERROR_NONE) {
3690 amp_s=sinfo_gaussian_amp(area_s,sig_s,ws,wc_s,bkg_s);
3691 check_nomsg(cpl_table_set_double(z_pos,
"WAVES",jz,wc_s));
3692 check_nomsg(cpl_table_set_double(z_pos,
"SIGS",jz,sig_s));
3693 check_nomsg(cpl_table_set_double(z_pos,
"AREAS",jz,area_s));
3694 check_nomsg(cpl_table_set_double(z_pos,
"BKGS",jz,bkg_s));
3695 check_nomsg(cpl_table_set_double(z_pos,
"AMPS",jz,amp_s));
3704 }
else if (error_code == CPL_ERROR_CONTINUE) {
3706 amp_s=sinfo_gaussian_amp(area_s,sig_s,ws,wc_s,bkg_s);
3707 check_nomsg(cpl_table_set_double(z_pos,
"WAVES",jz,wc_s));
3708 check_nomsg(cpl_table_set_double(z_pos,
"SIGS",jz,sig_s));
3709 check_nomsg(cpl_table_set_double(z_pos,
"AREAS",jz,area_s));
3710 check_nomsg(cpl_table_set_double(z_pos,
"BKGS",jz,bkg_s));
3711 check_nomsg(cpl_table_set_double(z_pos,
"AMPS",jz,amp_s));
3712 check_nomsg(cpl_table_set_int(z_pos,
"STATUS_S",jz,-1));
3715 check_nomsg(cpl_table_set_double(z_pos,
"WAVES",jz,wc_s));
3716 check_nomsg(cpl_table_set_double(z_pos,
"SIGS",jz,sig_s));
3717 check_nomsg(cpl_table_set_double(z_pos,
"AREAS",jz,area_s));
3718 check_nomsg(cpl_table_set_double(z_pos,
"BKGS",jz,bkg_s));
3719 check_nomsg(cpl_table_set_double(z_pos,
"AMPS",jz,amp_s));
3720 check_nomsg(cpl_table_set_int(z_pos,
"STATUS_S",jz,-2));
3722 check_nomsg(wo=cpl_table_get_double(lambda,
"WAVE",z1,&status));
3723 check_nomsg(amp_o=cpl_table_get_double(z_pos,
"INT",jz,&status));
3725 sig_o=z_ext*dispersion;
3727 area_o=sinfo_gaussian_area(amp_o,sig_o,wo,wc_o,bkg_o);
3728 error_code = cpl_vector_fit_gaussian(vw,NULL,
3735 if(error_code == CPL_ERROR_NONE) {
3737 amp_o=sinfo_gaussian_amp(area_o,sig_o,wo,wc_o,bkg_o);
3738 check_nomsg(cpl_table_set_double(z_pos,
"WAVEO",jz,wc_o));
3739 check_nomsg(cpl_table_set_double(z_pos,
"SIGO",jz,sig_o));
3740 check_nomsg(cpl_table_set_double(z_pos,
"AREAO",jz,area_o));
3741 check_nomsg(cpl_table_set_double(z_pos,
"BKGO",jz,bkg_o));
3742 check_nomsg(cpl_table_set_double(z_pos,
"AMPO",jz,amp_o));
3750 }
else if (error_code == CPL_ERROR_CONTINUE) {
3753 amp_o=sinfo_gaussian_amp(area_o,sig_o,wo,wc_o,bkg_o);
3754 check_nomsg(cpl_table_set_double(z_pos,
"WAVEO",jz,wc_o));
3755 check_nomsg(cpl_table_set_double(z_pos,
"SIGO",jz,sig_o));
3756 check_nomsg(cpl_table_set_double(z_pos,
"AREAO",jz,area_o));
3757 check_nomsg(cpl_table_set_double(z_pos,
"BKGO",jz,bkg_o));
3758 check_nomsg(cpl_table_set_double(z_pos,
"AMPO",jz,amp_o));
3759 check_nomsg(cpl_table_set_int(z_pos,
"STATUS_O",jz,-1));
3763 check_nomsg(cpl_table_set_double(z_pos,
"WAVEO",jz,wc_o));
3764 check_nomsg(cpl_table_set_double(z_pos,
"SIGO",jz,sig_o));
3765 check_nomsg(cpl_table_set_double(z_pos,
"AREAO",jz,area_o));
3766 check_nomsg(cpl_table_set_double(z_pos,
"BKGO",jz,bkg_o));
3767 check_nomsg(cpl_table_set_double(z_pos,
"AMPO",jz,amp_o));
3768 check_nomsg(cpl_table_set_int(z_pos,
"STATUS_O",jz,-2));
3780 check_nomsg(cpl_table_set_double(z_pos,
"ERR",
3781 jz,sqrt(sig_s*sig_s+sig_o*sig_o)));
3782 check_nomsg(cpl_table_set_double(z_pos,
"WDIF",jz,wc_s-wc_o));
3783 check_nomsg(cpl_table_set_double(z_pos,
"WAVEC",jz,(wc_o+wc_s)/2));
3786 check_nomsg(cpl_table_set_int(z_pos,
"STATUS_S",jz,-3));
3787 check_nomsg(cpl_table_set_int(z_pos,
"STATUS_O",jz,-3));
3789 sinfo_unwrap_vector(&vw);
3790 sinfo_unwrap_vector(&vs);
3791 sinfo_unwrap_vector(&vo);
3792 sinfo_free_my_vector(&sx);
3793 sinfo_free_my_vector(&sy);
3794 sinfo_free_table(&w_tbl);
3795 sinfo_free_table(&s_tbl);
3796 sinfo_free_table(&o_tbl);
3801 check_nomsg(cpl_table_duplicate_column(z_pos,
"YDIF",z_pos,
"WDIF"));
3802 check_nomsg(cpl_table_divide_scalar(z_pos,
"YDIF",dispersion));
3807 check_nomsg(cpl_table_and_selected_int(z_pos,
"STATUS_S",CPL_GREATER_THAN,-2));
3808 check_nomsg(cpl_table_and_selected_int(z_pos,
"STATUS_O",CPL_GREATER_THAN,-2));
3815 check_nomsg(z_good=cpl_table_extract_selected(z_pos));
3816 check_nomsg(npos=cpl_table_get_nrow(z_good));
3817 sinfo_free_table(&z_pos);
3821 check_nomsg(z_pos=cpl_table_duplicate(z_good));
3822 check_nomsg(z_mean = cpl_table_get_column_median(z_pos,
"WDIF"));
3823 check_nomsg(z_sdv = cpl_table_get_column_stdev(z_pos,
"WDIF"));
3828 check_nomsg(cpl_table_duplicate_column(z_pos,
"CHECK",
3832 cpl_table_erase_column(z_pos,
"AMPO");
3833 cpl_table_erase_column(z_pos,
"SIGO");
3834 cpl_table_erase_column(z_pos,
"AREAO");
3835 cpl_table_erase_column(z_pos,
"BKGO");
3836 cpl_table_erase_column(z_pos,
"WAVEO");
3837 cpl_table_erase_column(z_pos,
"AMPS");
3838 cpl_table_erase_column(z_pos,
"SIGS");
3839 cpl_table_erase_column(z_pos,
"AREAS");
3840 cpl_table_erase_column(z_pos,
"BKGS");
3841 cpl_table_erase_column(z_pos,
"WAVES");
3842 cpl_table_erase_column(z_pos,
"STATUS_S");
3843 cpl_table_erase_column(z_pos,
"STATUS_O");
3845 cpl_table_erase_column(z_pos,
"INT");
3846 cpl_table_erase_column(z_pos,
"INT1");
3847 cpl_table_erase_column(z_pos,
"INT2");
3848 cpl_table_erase_column(z_pos,
"ERR");
3849 cpl_table_erase_column(z_pos,
"POS");
3850 cpl_table_erase_column(z_pos,
"DIFF");
3857 sinfo_msg(
"ks-clip1");
3858 sinfo_msg(
"iter mean (um) sdv (um) mean (pix) sdv (pix)");
3862 for (iq = 0;iq<XCOR_YSHIFT_KS_CLIP;iq++) {
3864 sinfo_msg(
" %d %3.2g %3.2g %5.4g %5.4g",
3865 iq,z_mean,z_sdv,z_mean/dispersion,z_sdv/dispersion);
3868 check_nomsg(cpl_table_subtract_scalar(z_pos,
"CHECK",z_mean));
3869 check_nomsg(cpl_table_duplicate_column(z_pos,
"CHECKW",z_pos,
"CHECK"));
3870 check_nomsg(cpl_table_multiply_columns(z_pos,
"CHECKW",
"CHECK"));
3871 check_nomsg(cpl_table_power_column(z_pos,
"CHECKW",0.5));
3872 check_nomsg(cpl_table_add_scalar(z_pos,
"CHECK",z_mean));
3873 check_nomsg(cpl_table_and_selected_double(z_pos,
"CHECKW",
3874 CPL_NOT_GREATER_THAN,2*z_sdv));
3875 sinfo_free_table(&z_good);
3876 check_nomsg(z_good=cpl_table_extract_selected(z_pos));
3878 check_nomsg(cpl_table_select_all(z_pos));
3881 check_nomsg(z_mean = cpl_table_get_column_median(z_good,
"WDIF"));
3883 check_nomsg(z_sdv = cpl_table_get_column_stdev(z_good,
"WDIF"));
3887 sinfo_free_table(&z_good);
3888 check_nomsg(cpl_table_erase_column(z_pos,
"CHECKW"));
3903 cpl_table_select_all(z_pos);
3904 check_nomsg(cpl_table_new_column(z_pos,
"ZFIT",CPL_TYPE_DOUBLE));
3905 check_nomsg(nfit=cpl_table_get_nrow(z_pos));
3906 check_nomsg(cpl_table_fill_column_window(z_pos,
"ZFIT",0,nfit,0));
3909 check_nomsg(z_good=cpl_table_duplicate(z_pos));
3912 sinfo_msg(
"ks-clip2");
3913 sinfo_msg(
"iter mean (um) sdv (um) mean (pix) sdv (pix)");
3914 check_nomsg(cpl_table_select_all(z_good));
3916 for(iq=0;iq<XCOR_YSHIFT_KS_CLIP;iq++) {
3918 check_nomsg(nfit=cpl_table_get_nrow(z_good));
3921 check_nomsg(vx=cpl_vector_wrap(nfit,
3922 cpl_table_get_data_double(z_good,
"WAVE")));
3923 check_nomsg(vy=cpl_vector_wrap(nfit,
3924 cpl_table_get_data_double(z_good,
"WDIF")));
3925 check_nomsg(cfit=sinfo_polynomial_fit_1d_create(vx,vy,0,&mse));
3928 check_nomsg(zfit=cpl_polynomial_get_coeff(cfit,pows));
3929 sinfo_free_polynomial(&cfit);
3934 check_nomsg(cpl_table_fill_column_window(z_good,
"ZFIT",0,nfit,zfit));
3935 check_nomsg(cpl_table_duplicate_column(z_good,
"WRES",z_good,
"WDIF"));
3936 check_nomsg(cpl_table_subtract_columns(z_good,
"WRES",
"ZFIT"));
3940 check_nomsg(z_sdv=cpl_table_get_column_stdev(z_good,
"WRES"));
3945 check_nomsg(z_mean=cpl_table_get_column_mean(z_good,
"WDIF"));
3947 sinfo_msg(
" %d %3.2g %3.2g %5.4g %5.4g",
3948 iq,z_mean,z_sdv,z_mean/dispersion,z_sdv/dispersion);
3950 check_nomsg(nfit=cpl_table_get_nrow(z_pos));
3951 check_nomsg(cpl_table_fill_column_window(z_pos,
"ZFIT",0,nfit,zfit));
3952 check_nomsg(cpl_table_duplicate_column(z_pos,
"WRES",z_pos,
"WDIF"));
3953 check_nomsg(cpl_table_subtract_columns(z_pos,
"WRES",
"ZFIT"));
3955 check_nomsg(cpl_table_multiply_columns(z_pos,
"WRES",
"WRES"));
3956 check_nomsg(cpl_table_power_column(z_pos,
"WRES",0.5));
3964 check_nomsg(cpl_table_and_selected_double(z_pos,
"WRES",
3965 CPL_NOT_GREATER_THAN,3*z_sdv));
3967 check_nomsg(sinfo_free_table(&z_good));
3968 check_nomsg(z_good=cpl_table_extract_selected(z_pos));
3971 check_nomsg(cpl_table_select_all(z_pos));
3972 check_nomsg(cpl_table_select_all(z_good));
3973 check_nomsg(cpl_table_erase_column(z_good,
"WRES"));
3974 check_nomsg(cpl_table_erase_column(z_pos,
"WRES"));
3976 sinfo_unwrap_vector(&vx);
3977 sinfo_unwrap_vector(&vy);
3986 sinfo_unwrap_vector(&vx);
3987 sinfo_unwrap_vector(&vy);
3988 sinfo_free_polynomial(&cfit);
3989 sinfo_free_table(&z);
3990 sinfo_free_table(&z_pos);
3991 sinfo_free_table(&z_good);
3997 sinfo_free_table(&z_good);
3998 sinfo_free_table(&z);
3999 sinfo_free_table(&z_diff);
4000 sinfo_free_table(&tmp_sky);
4001 sinfo_free_table(&z_pos);
4002 sinfo_unwrap_vector(&vw);
4003 sinfo_unwrap_vector(&vs);
4004 sinfo_unwrap_vector(&vo);
4005 sinfo_free_my_vector(&sx);
4006 sinfo_free_my_vector(&sy);
4007 sinfo_unwrap_vector(&vx);
4008 sinfo_unwrap_vector(&vy);
4009 sinfo_free_table(&w_tbl);
4010 sinfo_free_table(&s_tbl);
4011 sinfo_free_table(&o_tbl);
4012 sinfo_free_polynomial(&cfit);
4035 sinfo_table_set_nan_out_min_max(cpl_table** t,
4046 check_nomsg(sz=cpl_table_get_nrow(*t));
4047 check_nomsg(pt=cpl_table_get_data_double(*t,c));
4049 if(pt[i] < min || pt[i] > max) {
4050 check_nomsg(cpl_table_set_invalid(*t ,c,i));
4073 sinfo_table_flag_nan(cpl_table** t,
const char* label)
4080 check_nomsg(sz=cpl_table_get_nrow(*t));
4081 check_nomsg(pt=cpl_table_get_data_double(*t,label));
4083 if(irplib_isnan(pt[i])) {
4084 check_nomsg(cpl_table_set_invalid(*t ,label,i));
4105 sinfo_table_sky_obj_flag_nan(cpl_table** s,cpl_table** o, cpl_table** w)
4118 check_nomsg(no=cpl_table_get_nrow(*o));
4119 check_nomsg(ns=cpl_table_get_nrow(*s));
4120 check_nomsg(nw=cpl_table_get_nrow(*w));
4121 if(no != ns || ns != nw || no != nw) {
4125 check_nomsg(po=cpl_table_get_data_double(*o,
"INT"));
4126 check_nomsg(ps=cpl_table_get_data_double(*s,
"INT"));
4127 check_nomsg(pw=cpl_table_get_data_double(*w,
"WAVE"));
4130 if( (0==cpl_table_is_valid(*o,
"INT",i)) ||
4131 irplib_isnan(po[i]) || irplib_isnan(ps[i]) || irplib_isnan(pw[i]) ) {
4132 check_nomsg(cpl_table_set_invalid(*o ,
"INT",i));
4133 check_nomsg(cpl_table_set_invalid(*s ,
"INT",i));
4134 check_nomsg(cpl_table_set_invalid(*w ,
"WAVE",i));
4214 sinfo_optimise_sky_sub(
const double wtol,
4215 const double line_hw,
4235 cpl_table** int_obj,
4236 cpl_table** int_sky,
4241 int npixw=2*line_hw;
4242 cpl_array* do_hk=NULL;
4243 cpl_array* rfit=NULL;
4245 cpl_table* sky_lr=NULL;
4246 cpl_table* obj_lr=NULL;
4247 cpl_table* wav_lr=NULL;
4269 double sky_thresh=0.;
4271 cpl_table* rat_sky=NULL;
4273 cpl_table* xxx1=NULL;
4274 cpl_table* xxx2=NULL;
4275 cpl_table* xxx1_sub=NULL;
4276 cpl_table* line_regions=NULL;
4277 cpl_table* cont_regions=NULL;
4282 cpl_table* fline_res=NULL;
4285 cpl_table* rscale0=NULL;
4287 cpl_table* obj_cont=NULL;
4288 cpl_table* sky_cont=NULL;
4289 cpl_table* obj_line=NULL;
4290 cpl_table* sky_line=NULL;
4298 cpl_table* finite_pix=NULL;
4299 cpl_table* tmp_tbl=NULL;
4301 cpl_table* low_scale=NULL;
4302 cpl_table* med_scale=NULL;
4303 cpl_table* hi_regions=NULL;
4305 cpl_table* low_regions=NULL;
4306 cpl_table* med_regions=NULL;
4309 cpl_table* low_pos=NULL;
4310 cpl_table* med_pos=NULL;
4311 cpl_table* hi_pos=NULL;
4312 cpl_table* llr_xxx1=NULL;
4318 double min_lrange=0;
4319 double max_lrange=0;
4324 double w_rot_low[NROT]={1.00852,1.03757,1.09264,1.15388,1.22293,
4325 1.30216,1.45190,1.52410,1.60308,1.69037,
4326 1.78803,2.02758,2.18023,1.02895,1.08343,
4327 1.14399,1.21226,1.29057,1.43444,1.50555,
4328 1.58333,1.66924,1.76532,2.00082,2.15073};
4331 double w_rot_med[NROT]={1.00282,1.02139,1.04212,1.07539,1.09753,
4332 1.13542,1.15917,1.20309,1.22870,1.28070,
4333 1.30853,1.41861,1.46048,1.48877,1.53324,
4334 1.56550,1.61286,1.65024,1.70088,1.74500,
4335 1.79940,1.97719,2.04127,2.12496,2.19956};
4339 check_nomsg(do_hk = cpl_array_new(NBOUND+1,CPL_TYPE_INT));
4340 check_nomsg(rfit = cpl_array_new(NBOUND+1,CPL_TYPE_DOUBLE));
4342 lr41_i=cpl_table_get_nrow(lr41);
4343 lr52_i=cpl_table_get_nrow(lr52);
4344 lr63_i=cpl_table_get_nrow(lr63);
4345 lr74_i=cpl_table_get_nrow(lr74);
4346 lr02_i=cpl_table_get_nrow(lr02);
4347 lr85_i=cpl_table_get_nrow(lr85);
4348 lr20_i=cpl_table_get_nrow(lr20);
4349 lr31_i=cpl_table_get_nrow(lr31);
4350 lr42_i=cpl_table_get_nrow(lr42);
4351 lr53_i=cpl_table_get_nrow(lr53);
4352 lr64_i=cpl_table_get_nrow(lr64);
4353 lr75_i=cpl_table_get_nrow(lr75);
4354 lr86_i=cpl_table_get_nrow(lr86);
4355 lr97_i=cpl_table_get_nrow(lr97);
4356 check_nomsg(lr00_i=cpl_table_get_nrow(lr00));
4358 cpl_array_set_int(do_hk,0,lr41_i);
4359 cpl_array_set_int(do_hk,1,lr52_i);
4360 cpl_array_set_int(do_hk,2,lr63_i);
4361 cpl_array_set_int(do_hk,3,lr74_i);
4362 cpl_array_set_int(do_hk,4,lr02_i);
4363 cpl_array_set_int(do_hk,5,lr85_i);
4364 cpl_array_set_int(do_hk,6,lr20_i);
4365 cpl_array_set_int(do_hk,7,lr31_i);
4366 cpl_array_set_int(do_hk,8,lr42_i);
4367 cpl_array_set_int(do_hk,9,lr53_i);
4368 cpl_array_set_int(do_hk,10,lr64_i);
4369 cpl_array_set_int(do_hk,11,lr75_i);
4370 cpl_array_set_int(do_hk,12,lr86_i);
4371 cpl_array_set_int(do_hk,13,lr97_i);
4372 check_nomsg(cpl_array_set_int(do_hk,14,lr00_i));
4374 check_nomsg(rscale0=cpl_table_duplicate(*int_sky));
4375 check_nomsg(cpl_table_new_column(rscale0,
"RATIO",CPL_TYPE_DOUBLE));
4376 check_nomsg(nrow=cpl_table_get_nrow(rscale0));
4377 check_nomsg(cpl_table_fill_column_window(rscale0,
"RATIO",0,nrow,0));
4380 for (i=0;i<NBOUND+1;i++) {
4381 if (cpl_array_get_int(do_hk,i,&status) > 0) {
4388 ck0_nomsg(sinfo_get_obj_sky_wav_sub(*int_obj,*int_sky,lambda,lr41,wtol,
4389 &obj_lr,&sky_lr,&wav_lr));
4393 ck0_nomsg(sinfo_get_obj_sky_wav_sub(*int_obj,*int_sky,lambda,lr52,wtol,
4394 &obj_lr,&sky_lr,&wav_lr));
4398 ck0_nomsg(sinfo_get_obj_sky_wav_sub(*int_obj,*int_sky,lambda,lr63,wtol,
4399 &obj_lr,&sky_lr,&wav_lr));
4403 ck0_nomsg(sinfo_get_obj_sky_wav_sub(*int_obj,*int_sky,lambda,lr74,wtol,
4404 &obj_lr,&sky_lr,&wav_lr));
4408 ck0_nomsg(sinfo_get_obj_sky_wav_sub(*int_obj,*int_sky,lambda,lr02,wtol,
4409 &obj_lr,&sky_lr,&wav_lr));
4413 ck0_nomsg(sinfo_get_obj_sky_wav_sub(*int_obj,*int_sky,lambda,lr85,wtol,
4414 &obj_lr,&sky_lr,&wav_lr));
4417 ck0_nomsg(sinfo_get_obj_sky_wav_sub(*int_obj,*int_sky,lambda,lr20,wtol,
4418 &obj_lr,&sky_lr,&wav_lr));
4421 ck0_nomsg(sinfo_get_obj_sky_wav_sub(*int_obj,*int_sky,lambda,lr31,wtol,
4422 &obj_lr,&sky_lr,&wav_lr));
4425 ck0_nomsg(sinfo_get_obj_sky_wav_sub(*int_obj,*int_sky,lambda,lr42,wtol,
4426 &obj_lr,&sky_lr,&wav_lr));
4429 ck0_nomsg(sinfo_get_obj_sky_wav_sub(*int_obj,*int_sky,lambda,lr53,wtol,
4430 &obj_lr,&sky_lr,&wav_lr));
4433 ck0_nomsg(sinfo_get_obj_sky_wav_sub(*int_obj,*int_sky,lambda,lr64,wtol,
4434 &obj_lr,&sky_lr,&wav_lr));
4437 ck0_nomsg(sinfo_get_obj_sky_wav_sub(*int_obj,*int_sky,lambda,lr75,wtol,
4438 &obj_lr,&sky_lr,&wav_lr));
4441 ck0_nomsg(sinfo_get_obj_sky_wav_sub(*int_obj,*int_sky,lambda,lr86,wtol,
4442 &obj_lr,&sky_lr,&wav_lr));
4445 ck0_nomsg(sinfo_get_obj_sky_wav_sub(*int_obj,*int_sky,lambda,lr97,wtol,
4446 &obj_lr,&sky_lr,&wav_lr));
4449 ck0_nomsg(sinfo_get_obj_sky_wav_sub(*int_obj,*int_sky,lambda,lr00,
4450 wtol,&obj_lr,&sky_lr,&wav_lr));
4456 if(sky_lr == NULL || obj_lr == NULL || wav_lr == NULL) {
4458 sinfo_msg(
"no good pix left");
4470 check_nomsg(finite_pix_i=sinfo_table_sky_obj_flag_nan(&sky_lr,
4478 if (finite_pix_i > npixw) {
4481 check_nomsg(cpl_table_erase_invalid(obj_lr));
4482 check_nomsg(cpl_table_erase_invalid(sky_lr));
4483 check_nomsg(cpl_table_erase_invalid(wav_lr));
4486 check_nomsg(sky_med=cpl_table_get_column_median(sky_lr,
"INT"));
4487 check_nomsg(sky_sdv=cpl_table_get_column_stdev(sky_lr,
"INT"));
4488 check_nomsg(cpl_table_select_all(sky_lr));
4489 sky_thresh=sky_med+sky_sdv;
4491 check_nomsg(xxx1_i=cpl_table_and_selected_double(sky_lr,
"INT",
4492 CPL_GREATER_THAN,sky_thresh));
4493 check_nomsg(xxx1 = cpl_table_extract_selected(sky_lr));
4494 check_nomsg(cpl_table_select_all(sky_lr));
4500 check_nomsg(xxx2 = cpl_table_duplicate(sky_lr));
4507 ck0_nomsg(sinfo_table_threshold(&xxx2,
"INT",sky_thresh,
4508 sky_thresh,0.,10.));
4517 check_nomsg(sinfo_convolve_kernel(&xxx2,npixw/2));
4522 check_nomsg(line_i=cpl_table_and_selected_double(xxx2,
"CNV",
4523 CPL_GREATER_THAN,0));
4525 check_nomsg(line_regions=cpl_table_extract_selected(xxx2));
4530 check_nomsg(cpl_table_erase_column(line_regions,
"INT"));
4531 check_nomsg(cpl_table_erase_column(line_regions,
"CNV"));
4533 check_nomsg(cpl_table_select_all(xxx2));
4536 check_nomsg(cont_i=cpl_table_and_selected_double(xxx2,
"CNV",
4538 check_nomsg(cont_regions=cpl_table_extract_selected(xxx2));
4543 check_nomsg(cpl_table_erase_column(cont_regions,
"INT"));
4544 check_nomsg(cpl_table_erase_column(cont_regions,
"CNV"));
4545 check_nomsg(cpl_table_select_all(xxx2));
4546 sinfo_free_table(&xxx2);
4549 if (line_i >= 3 && cont_i >= 3) {
4552 if (i == 0) sinfo_msg(
"optimising 4-1 transitions");
4553 if (i == 1) sinfo_msg(
"optimising 5-2 transitions");
4554 if (i == 2) sinfo_msg(
"optimising 6-3 transitions");
4555 if (i == 3) sinfo_msg(
"optimising 7-4 transitions");
4556 if (i == 4) sinfo_msg(
"optimising 0-2 transitions");
4557 if (i == 5) sinfo_msg(
"optimising 8-5 transitions");
4558 if (i == 6) sinfo_msg(
"optimising 2-0 transitions");
4559 if (i == 7) sinfo_msg(
"optimising 3-1 transitions");
4560 if (i == 8) sinfo_msg(
"optimising 4-2 transitions");
4561 if (i == 9) sinfo_msg(
"optimising 5-3 transitions");
4562 if (i == 10) sinfo_msg(
"optimising 6-4 transitions");
4563 if (i == 11) sinfo_msg(
"optimising 7-5 transitions");
4564 if (i == 12) sinfo_msg(
"optimising 8-6 transitions");
4565 if (i == 13) sinfo_msg(
"optimising 9-7 transitions");
4566 if (i == 14) sinfo_msg(
"optimising final bit");
4572 sinfo_free_table(&obj_cont);
4573 sinfo_free_table(&sky_cont);
4574 sinfo_free_table(&sky_line);
4575 sinfo_free_table(&obj_line);
4577 cknull_nomsg(obj_line=sinfo_table_select_range(obj_lr,line_regions,
4581 cknull_nomsg(sky_line=sinfo_table_select_range(sky_lr,line_regions,
4583 cknull_nomsg(obj_cont=sinfo_table_select_range(obj_lr,cont_regions,
4585 cknull_nomsg(sky_cont=sinfo_table_select_range(sky_lr,cont_regions,
4603 sinfo_free_table(&fline_res);
4606 ck0_nomsg(sinfo_get_line_ratio(obj_line,obj_cont,
4607 sky_line,sky_cont,method,&r));
4608 sinfo_msg(
"1st Line ratio %g",r);
4611 if(cpl_table_get_nrow(obj_cont) > 0) {
4612 check_nomsg(fline_res=sinfo_table_interpol(obj_line,obj_cont,
4616 check_nomsg(fline_res=cpl_table_duplicate(obj_line));
4620 cpl_table_select_all(fline_res);
4621 check_nomsg(fmed = cpl_table_get_column_median(fline_res,
"INT"));
4622 check_nomsg(fsdv = cpl_table_get_column_stdev(fline_res,
"INT"));
4624 check_nomsg(cpl_table_duplicate_column(fline_res,
"AINT",
4626 check_nomsg(cpl_table_multiply_columns(fline_res,
"AINT",
"INT"));
4627 check_nomsg(cpl_table_power_column(fline_res,
"AINT",0.5));
4628 check_nomsg(fclip_i=cpl_table_and_selected_double(fline_res,
"AINT",
4632 check_nomsg(cpl_table_select_all(fline_res));
4639 check_nomsg(line_i=cpl_table_and_selected_double(fline_res,
4641 CPL_NOT_GREATER_THAN,
4644 sinfo_free_table(&line_regions);
4646 check_nomsg(line_regions=cpl_table_extract_selected(fline_res));
4647 check_nomsg(cpl_table_erase_column(line_regions,
"INT"));
4648 check_nomsg(cpl_table_erase_column(line_regions,
"AINT"));
4650 sinfo_free_table(&obj_line);
4651 sinfo_free_table(&sky_line);
4664 obj_line=sinfo_table_select_range(obj_lr,line_regions,wtol);
4665 sky_line=sinfo_table_select_range(sky_lr,line_regions,wtol);
4666 fline_i=cpl_table_get_nrow(line_regions);
4672 ck0_nomsg(sinfo_get_line_ratio(obj_line,obj_cont,
4673 sky_line,sky_cont,method,&r));
4675 sinfo_msg(
"2nd Line ratio %g",r);
4681 sinfo_free_table(&sky_line);
4682 sinfo_free_table(&obj_line);
4685 cpl_msg_info(cpl_func,
"use %" CPL_SIZE_FORMAT
4686 " pixels for line and %" CPL_SIZE_FORMAT
4687 " for continuum estimation",
4688 cpl_table_get_nrow(line_regions),cpl_table_get_nrow(cont_regions));
4690 sinfo_msg(
"OH spectrum scaling = %f ",r);
4691 check_nomsg(cpl_array_set_double(rfit,i,r));
4692 ck0_nomsg(sinfo_table_set(&rscale0,wav_lr,r,wtol));
4700 sinfo_free_table(&xxx1);
4701 sinfo_free_table(&xxx2);
4702 sinfo_free_table(&sky_lr);
4703 sinfo_free_table(&obj_lr);
4704 sinfo_free_table(&wav_lr);
4706 sinfo_free_table(&line_regions);
4707 sinfo_free_table(&cont_regions);
4711 sinfo_free_array(&do_hk);
4712 sinfo_free_array(&rfit);
4718 check_nomsg(cpl_table_select_all(rscale0));
4723 check_nomsg(*rscale = cpl_table_extract_selected(rscale0));
4724 sinfo_free_table(&rscale0);
4727 check_nomsg(rat_sky=cpl_table_duplicate(*int_sky));
4728 check_nomsg(cpl_table_duplicate_column(rat_sky,
"RATIO",*rscale,
"RATIO"));
4729 check_nomsg(cpl_table_duplicate_column(*int_obj,
"COR_FCT_VIB",
4733 check_nomsg(cpl_table_multiply_columns(rat_sky,
"INT",
"RATIO"));
4751 check_nomsg(min_lrange=cpl_table_get_column_min(lrange,
"WAVE"));
4752 check_nomsg(max_lrange=cpl_table_get_column_max(lrange,
"WAVE"));
4757 check_nomsg(finite_pix_i=sinfo_table_sky_obj_flag_nan(int_sky,
4762 check_nomsg(finite_pix=cpl_table_duplicate(lambda));
4765 check_nomsg(cpl_table_erase_invalid(finite_pix));
4768 if (finite_pix_i > npixw) {
4773 check_nomsg(cpl_table_and_selected_double(finite_pix,
"WAVE",
4777 check_nomsg(cpl_table_and_selected_double(finite_pix,
"WAVE",
4783 check_nomsg(tmp_tbl=cpl_table_extract_selected(finite_pix));
4784 sinfo_free_table(&finite_pix);
4785 check_nomsg(finite_pix=cpl_table_duplicate(tmp_tbl));
4786 sinfo_free_table(&tmp_tbl);
4787 sinfo_free_table(&sky_lr);
4788 sinfo_free_table(&obj_lr);
4789 sinfo_free_table(&wav_lr);
4792 cknull(sky_lr=sinfo_table_select_range(rat_sky,finite_pix,wtol),
4793 "extracting sky sub range");
4794 cknull(obj_lr=sinfo_table_select_range(*int_obj,finite_pix,wtol),
4795 "extracting obj sub range");
4796 cknull(wav_lr=sinfo_table_select_range(lambda,finite_pix,wtol),
4797 "extracting sky sub range");
4812 if(1 == cpl_table_has_valid(sky_lr,
"INT")) {
4813 check_nomsg(sky_med=cpl_table_get_column_median(sky_lr,
"INT"));
4814 check_nomsg(sky_sdv=cpl_table_get_column_stdev(sky_lr,
"INT"));
4815 sky_thresh=sky_med+sky_sdv;
4817 check_nomsg(xxx1_i=cpl_table_and_selected_double(sky_lr,
"INT",
4818 CPL_GREATER_THAN,sky_thresh));
4819 check_nomsg(xxx1=cpl_table_extract_selected(sky_lr));
4820 check_nomsg(cpl_table_select_all(sky_lr));
4825 sinfo_msg(
"xxx1_i=%d",xxx1_i);
4827 sinfo_msg(
"wav_lr wmin=%g wmax=%g",
4828 cpl_table_get_column_min(wav_lr,
"WAVE"),
4829 cpl_table_get_column_max(wav_lr,
"WAVE"));
4831 cknull_nomsg(llr_xxx1=sinfo_table_select_range(wav_lr,xxx1,wtol));
4835 cknull(low_pos=sinfo_find_rot_waves(w_rot_low,npixw,wtol,llr_xxx1),
4836 "Determining low positions");
4839 check_nomsg(low_pos_i=cpl_table_get_nrow(low_pos));
4841 cknull(med_pos=sinfo_find_rot_waves(w_rot_med,npixw,wtol,llr_xxx1),
4842 "Determining med positions");
4843 check_nomsg(med_pos_i=cpl_table_get_nrow(med_pos));
4859 cknull(hi_pos=sinfo_table_extract_rest(xxx1,low_pos,med_pos,wtol),
4860 "determining hi position");
4861 check_nomsg(hi_pos_i=cpl_table_get_nrow(hi_pos));
4866 check_nomsg(xxx2 = cpl_table_duplicate(sky_lr));
4867 check_nomsg(nrow=cpl_table_get_nrow(sky_lr));
4878 ck0_nomsg(sinfo_table_threshold(&xxx2,
"INT",sky_thresh,
4879 sky_thresh,0.,10.));
4880 sinfo_msg(
"sky_thresh=%g %g %f",sky_thresh,sky_med,sky_sdv);
4883 check_nomsg(sinfo_convolve_kernel(&xxx2,npixw/2));
4887 check_nomsg(cont_i=cpl_table_and_selected_double(xxx2,
"CNV",
4889 check_nomsg(cont_regions=cpl_table_extract_selected(xxx2));
4891 sinfo_free_table(&xxx2);
4892 check_nomsg(cpl_table_erase_column(cont_regions,
"INT"));
4893 check_nomsg(cpl_table_erase_column(cont_regions,
"CNV"));
4895 check(low_pos_i=sinfo_get_sub_regions(sky_lr,xxx1,low_pos,wtol,
4896 npixw,&low_regions),
"failed determining low regions");
4898 check(med_pos_i=sinfo_get_sub_regions(sky_lr,xxx1,med_pos,wtol,
4899 npixw,&med_regions),
"failed determining med regions");
4902 check(hi_pos_i=sinfo_get_sub_regions(sky_lr,xxx1,hi_pos,wtol,
4903 npixw,&hi_regions),
"failed determining hi regions");
4913 sinfo_msg(
"hi_pos_i : %d med_pos_i : %d low_pos_i : %d cont_i: %d",
4914 hi_pos_i, med_pos_i, low_pos_i, cont_i);
4917 if (hi_pos_i >= 3 && med_pos_i >= 3 && low_pos_i >= 3 && cont_i >= 3) {
4920 ck0_nomsg(sinfo_compute_line_ratio(obj_lr, sky_lr,wtol, method,
4921 hi_regions,cont_regions,&rhi));
4922 sinfo_msg(
"high rotational OH scaling %g",rhi);
4925 ck0_nomsg(sinfo_compute_line_ratio(obj_lr, sky_lr,wtol, method,
4926 med_regions,cont_regions,&rmed));
4928 sinfo_msg(
"P1(3.5) & R1(1.5) rotational OH scaling %g ",rmed);
4931 ck0_nomsg(sinfo_compute_line_ratio(obj_lr, sky_lr,wtol, method,
4932 low_regions,cont_regions,&rlow));
4933 sinfo_msg(
"P1(2.5) & Q1(1.5) rotational OH scaling %g",rlow);
4935 cknull(low_scale=sinfo_find_rot_waves(w_rot_low,npixw,wtol,lambda),
4936 "Determining low scale");
4940 cknull(med_scale=sinfo_find_rot_waves(w_rot_low,npixw,wtol,lambda),
4941 "Determining low scale");
4942 check_nomsg(cpl_table_multiply_scalar(*rscale,
"RATIO",rhi));
4943 ck0_nomsg(sinfo_table_fill_column_over_range(rscale,med_scale,
4944 "RATIO",rmed/rhi,wtol));
4945 ck0_nomsg(sinfo_table_fill_column_over_range(rscale,low_scale,
4946 "RATIO",rlow/rhi,wtol));
4959 check_nomsg(cpl_table_duplicate_column(*int_sky,
"INTC",*int_sky,
"INT"));
4963 check_nomsg(cpl_table_duplicate_column(*int_obj,
"COR_FCT_ALL",
4965 check_nomsg(cpl_table_duplicate_column(*int_sky,
"RATIO",*rscale,
"RATIO"));
4966 check_nomsg(cpl_table_multiply_columns(*int_sky,
"INTC",
"RATIO"));
4968 check_nomsg(cpl_table_duplicate_column(*int_obj,
"INTC",*int_obj,
"INT"));
4974 check_nomsg(cpl_table_duplicate_column(*int_obj,
"SKYC",*int_sky,
"INTC"));
4975 check_nomsg(cpl_table_subtract_columns(*int_obj,
"INTC",
"SKYC"));
4978 check_nomsg(cpl_table_erase_column(*int_sky,
"INT"));
4979 check_nomsg(cpl_table_name_column(*int_sky,
"INTC",
"INT"));
4984 sinfo_free_table(&llr_xxx1);
4985 sinfo_free_table(&hi_pos);
4986 sinfo_free_table(&low_pos);
4987 sinfo_free_table(&med_pos);
4988 sinfo_free_table(&low_regions);
4989 sinfo_free_table(&med_regions);
4990 sinfo_free_table(&hi_regions);
4991 sinfo_free_table(&low_scale);
4992 sinfo_free_table(&med_scale);
4995 sinfo_free_table(&finite_pix);
4996 sinfo_free_table(&xxx1_sub);
4997 sinfo_free_table(&tmp_tbl);
4998 sinfo_free_table(&rat_sky);
4999 sinfo_free_table(&fline_res);
5000 sinfo_free_table(&sky_cont);
5001 sinfo_free_table(&obj_cont);
5002 sinfo_free_table(&obj_line);
5003 sinfo_free_table(&sky_line);
5004 sinfo_free_table(&rscale0);
5005 sinfo_free_table(&xxx1);
5006 sinfo_free_table(&xxx2);
5007 sinfo_free_table(&line_regions);
5008 sinfo_free_table(&cont_regions);
5009 sinfo_free_table(&sky_lr);
5010 sinfo_free_table(&obj_lr);
5011 sinfo_free_table(&wav_lr);
5012 sinfo_free_array(&rfit);
5013 sinfo_free_array(&do_hk);
5026 sinfo_table_get_index_of_max(cpl_table* t,
const char* name,cpl_type type)
5039 cpl_error_set(cpl_func, CPL_ERROR_NULL_INPUT);
5042 max=cpl_table_get_column_max(t,name);
5043 nrow=cpl_table_get_nrow(t);
5047 pi=cpl_table_get_data_int(t,name);
5048 for(i=0;i<nrow;i++) {
5049 if(pi[i]==(
int)max) result=i;
5052 case CPL_TYPE_FLOAT:
5053 pf=cpl_table_get_data_float(t,name);
5054 for(i=0;i<nrow;i++) {
5055 if(pf[i]==(
float)max) result=i;
5058 case CPL_TYPE_DOUBLE:
5059 pd=cpl_table_get_data_double(t,name);
5060 for(i=0;i<nrow;i++) {
5061 if(pd[i]==max) result=i;
5066 cpl_error_set(cpl_func, CPL_ERROR_TYPE_MISMATCH);
5085 sinfo_table_get_index_of_val(cpl_table* t,
5099 cpl_error_set(cpl_func, CPL_ERROR_NULL_INPUT);
5103 nrow=cpl_table_get_nrow(t);
5107 pi=cpl_table_get_data_int(t,name);
5108 for(i=0;i<nrow;i++) {
5109 if(pi[i]==(
int)val) result=i;
5112 case CPL_TYPE_FLOAT:
5113 pf=cpl_table_get_data_float(t,name);
5114 for(i=0;i<nrow;i++) {
5115 if(pf[i]==(
float)val) result=i;
5118 case CPL_TYPE_DOUBLE:
5119 pd=cpl_table_get_data_double(t,name);
5120 for(i=0;i<nrow;i++) {
5121 if(pd[i]==val) result=i;
5126 cpl_error_set(cpl_func, CPL_ERROR_TYPE_MISMATCH);
5146 sinfo_table_column_interpolate(
const cpl_table* t,
5159 nrow=cpl_table_get_nrow(t);
5160 if ((1<x) && (x<nrow-1)) {
5170 check_nomsg(val1=cpl_table_get(t,name,x1,&status));
5171 check_nomsg(val2=cpl_table_get(t,name,x2,&status));
5173 m=(val2-val1)/(x2-x1);
5193 static cpl_imagelist*
5194 sinfo_imagelist_select_range(
const cpl_imagelist* inp,
5195 const cpl_table* full,
5196 const cpl_table* good,
5199 cpl_imagelist* out=NULL;
5210 const cpl_image* img=NULL;
5217 check_nomsg(ksz=cpl_imagelist_get_size(inp));
5218 check_nomsg(isz=cpl_table_get_nrow(good));
5219 check_nomsg(out=cpl_imagelist_new());
5222 for(k=0;k<ksz;k++) {
5223 check_nomsg(img=cpl_imagelist_get_const(inp,k));
5224 check_nomsg(wave_chk=cpl_table_get(full,
"WAVE",k,&status));
5226 check_nomsg(wave_sel=cpl_table_get(good,
"WAVE",i,&status));
5229 if(fabs(wave_chk - wave_sel) < tol) {
5230 check_nomsg(cpl_imagelist_set(out,cpl_image_duplicate(img),i));
5256 sinfo_table_extract_finite(
const cpl_table* in1,
5257 const cpl_table* in2,
5270 cknull(in1,
"null input image");
5271 cknull(in2,
"null input image");
5272 cknull_nomsg(*ou1=cpl_table_duplicate(in1));
5273 cknull_nomsg(*ou2=cpl_table_duplicate(in2));
5275 check_nomsg(size1=cpl_table_get_nrow(*ou1));
5276 check_nomsg(size2=cpl_table_get_nrow(*ou2));
5278 check_nomsg(pout1=cpl_table_get_data_double(*ou1,
"VALUE"));
5280 for(i=0;i<size1;i++) {
5281 if (irplib_isnan(pout1[i])) {
5282 check_nomsg(cpl_table_set_invalid(*ou1,
"VALUE",i));
5283 check_nomsg(cpl_table_set_invalid(*ou2,
"VALUE",i));
5286 ninv1=cpl_table_count_invalid(*ou1,
"VALUE");
5287 ninv2=cpl_table_count_invalid(*ou2,
"VALUE");
5294 check_nomsg(cpl_table_erase_invalid(*ou1));
5295 check_nomsg(cpl_table_erase_invalid(*ou2));
5296 return (size1-ninv1);
5310 sinfo_image2table(
const cpl_image* im)
5312 cpl_table* out=NULL;
5315 const double* pim=NULL;
5321 cknull(im,
"input image is NULL");
5323 check_nomsg(sx=cpl_image_get_size_x(im));
5324 check_nomsg(sy=cpl_image_get_size_y(im));
5325 check_nomsg(pim=cpl_image_get_data_double_const(im));
5326 check_nomsg(out=cpl_table_new(sx*sy));
5327 check_nomsg(cpl_table_new_column(out,
"VALUE",CPL_TYPE_DOUBLE));
5336 cpl_table_set_double(out,
"VALUE",k++,pim[j*sx+i]);
5342 sinfo_free_table(&out);
5355 sinfo_check_screw_values(cpl_table** int_obj,
5356 cpl_table** int_sky,
5361 cpl_table* xsky=NULL;
5362 cpl_table* xobj=NULL;
5373 cknull(*int_sky,
"Null input sky spectrum");
5374 cknull(*int_obj,
"Null input obj spectrum");
5375 cknull(grange,
"Null input wavelength range");
5378 cknull_nomsg(xsky=sinfo_table_select_range(*int_sky,grange,wtol));
5381 check_nomsg(sky_min=cpl_table_get_column_min(xsky,
"INT"));
5382 check_nomsg(sky_max=cpl_table_get_column_max(xsky,
"INT"));
5385 gsky_max = (sky_max>0) ? sky_max : 0;
5386 gsky_min = (sky_min<0) ? sky_min : 0;
5388 check_nomsg(cpl_table_select_all(*int_sky));
5389 ck0_nomsg(sinfo_table_set_nan_out_min_max(int_sky,
"INT",gsky_min,gsky_max));
5393 sinfo_free_table(&xsky);
5396 cknull_nomsg(xobj=sinfo_table_select_range(*int_obj,grange,wtol));
5397 check_nomsg(obj_min=cpl_table_get_column_min(xobj,
"INT"));
5398 check_nomsg(obj_max=cpl_table_get_column_max(xobj,
"INT"));
5400 gobj_max = (obj_max>0) ? obj_max : 0;
5401 gobj_min = (obj_min<0) ? obj_min : 0;
5403 check_nomsg(cpl_table_select_all(*int_obj));
5404 ck0_nomsg(sinfo_table_set_nan_out_min_max(int_obj,
"INT",gobj_min,gobj_max));
5408 sinfo_free_table(&xobj);
5412 sinfo_free_table(&xsky);
5413 sinfo_free_table(&xobj);
5432 sinfo_table_fill_column_over_range(cpl_table** inp,
5433 const cpl_table* ref,
5446 const double* pwrf=NULL;
5448 cknull(inp,
"null input table");
5449 cknull(ref,
"null reference table");
5451 check_nomsg(ninp=cpl_table_get_nrow(*inp));
5452 check_nomsg(nref=cpl_table_get_nrow(ref));
5453 check_nomsg(pwin=cpl_table_get_data_double(*inp,
"WAVE"));
5454 check_nomsg(pcin=cpl_table_get_data_double(*inp,col));
5455 check_nomsg(pwrf=cpl_table_get_data_double_const(ref,
"WAVE"));
5464 if(pwin[0]<=pwrf[0]) {
5466 for(i=0;i<ninp;i++) {
5472 if(fabs(pwin[i] - pwrf[k])< tol) {
5482 for(k=0;k<nref;k++) {
5488 if(fabs(pwin[i] - pwrf[k])< tol) {
5513 sinfo_table_select_range(cpl_table* inp, cpl_table* ref,
const double tol)
5516 cpl_table* out=NULL;
5527 cpl_table* tmp=NULL;
5528 cknull(inp,
"null input table");
5529 cknull(ref,
"null reference table");
5531 check_nomsg(ninp=cpl_table_get_nrow(inp));
5532 check_nomsg(nref=cpl_table_get_nrow(ref));
5535 check_nomsg(wmin=cpl_table_get_column_min(ref,
"WAVE"));
5536 check_nomsg(wmax=cpl_table_get_column_max(ref,
"WAVE"));
5538 cpl_table_select_all(inp);
5539 check_nomsg(ninp=cpl_table_and_selected_double(inp,
"WAVE",
5540 CPL_NOT_LESS_THAN,wmin));
5541 check_nomsg(tmp=cpl_table_extract_selected(inp));
5542 check_nomsg(ninp=cpl_table_and_selected_double(tmp,
"WAVE",
5543 CPL_NOT_GREATER_THAN,wmax));
5544 check_nomsg(out=cpl_table_extract_selected(tmp));
5545 sinfo_free_table(&tmp);
5547 check_nomsg(out=cpl_table_duplicate(inp));
5550 check_nomsg(nout=cpl_table_get_nrow(out));
5555 tmp=cpl_table_duplicate(out);
5556 sinfo_free_table(&out);
5557 check_nomsg(pou=cpl_table_get_data_double(tmp,
"WAVE"));
5558 check_nomsg(prf=cpl_table_get_data_double(ref,
"WAVE"));
5560 check_nomsg(cpl_table_new_column(tmp,
"FLAG",CPL_TYPE_INT));
5561 check_nomsg(cpl_table_fill_column_window(tmp,
"FLAG",0,nout,-1));
5570 if(pou[0]<=prf[0]) {
5572 for(i=0;i<nout;i++) {
5574 if(fabs(pou[i] - prf[k])< tol) {
5575 check_nomsg(cpl_table_set_int(tmp,
"FLAG",i,1));
5584 for(k=0;k<nref;k++) {
5590 if(fabs(pou[i] - prf[k])< tol) {
5591 check_nomsg(cpl_table_set_int(tmp,
"FLAG",i,1));
5598 check_nomsg(nout=cpl_table_and_selected_int(tmp,
"FLAG",CPL_GREATER_THAN,0));
5599 check_nomsg(out=cpl_table_extract_selected(tmp));
5600 sinfo_free_table(&tmp);
5601 check_nomsg(cpl_table_erase_column(out,
"FLAG"));
5610 sinfo_free_table(&tmp);
5611 sinfo_free_table(&out);
5626 sinfo_interpolate_sky(
const cpl_table* inp,
const cpl_table* lambdas)
5629 cpl_table*
new=NULL;
5630 new = sinfo_interpolate(inp,lambdas,
"WAVE",
"lsquadratic");;
5646 sinfo_interpolate(
const cpl_table* inp,
5647 const cpl_table* lambdas,
5652 cpl_table* out=NULL;
5655 cknull_nomsg(lambdas);
5657 cknull_nomsg(method);
5659 out=cpl_table_duplicate(inp);
5683 sinfo_gaussian_amp(
double area,
double sigma,
double x,
double x0,
double off)
5685 return area/sqrt(2*PI_NUMB*sigma*sigma)*
5686 exp(-(x-x0)*(x-x0)/(2*sigma*sigma))+off;
5703 sinfo_gaussian_area(
double amp,
double sigma,
double x,
double x0,
double off)
5705 return sqrt(2*PI_NUMB*sigma*sigma)*exp((x-x0)*(x-x0)/(2*sigma*sigma))*
5717 sinfo_table_smooth_column(cpl_table** t,
const char* c,
const int r)
5724 check_nomsg(nrow=cpl_table_get_nrow(*t));
5725 check_nomsg(pval=cpl_table_get_data_double(*t,c));
5726 for(i=r;i<nrow;i++) {
5728 for(j=-r;j<=r;j++) {
5731 pval[i]=sum/(2*r+1);
5747 sinfo_shift_sky(cpl_frame** sky_frm,
5748 cpl_table** int_sky,
5749 const double zshift)
5756 cpl_propertylist* plist=NULL;
5757 cpl_imagelist* sky_cub=NULL;
5758 cpl_imagelist* sky_shift=NULL;
5759 cpl_table* int_sky_dup=NULL;
5765 cknull_nomsg(plist=cpl_propertylist_load(
5766 cpl_frame_get_filename(*sky_frm),0));
5772 sinfo_free_propertylist(&plist);
5774 cknull_nomsg(sky_cub=cpl_imagelist_load(cpl_frame_get_filename(*sky_frm),
5780 int_sky_dup=cpl_table_duplicate(*int_sky);
5781 sinfo_free_table(&(*int_sky));
5799 check_nomsg(*int_sky=sinfo_table_shift_simple(int_sky_dup,
"INT",zshift));
5807 sinfo_free_table(&int_sky_dup);
5826 check_nomsg(sky_shift=sinfo_cube_zshift_simple(sky_cub,(
float)zshift));
5832 sinfo_free_imagelist(&sky_shift);
5845 sinfo_free_imagelist(&sky_cub);
5850 sinfo_free_table(&int_sky_dup);
5851 sinfo_free_propertylist(&plist);
5852 sinfo_free_imagelist(&sky_shift);
5853 sinfo_free_imagelist(&sky_cub);
5865 sinfo_convolve_kernel(cpl_table** t,
const int rad)
5871 double* pidata=NULL;
5872 double* pcdata=NULL;
5879 cknull(*t,
"null input table");
5880 check_nomsg(cpl_table_new_column(*t,
"CNV",CPL_TYPE_DOUBLE));
5881 check_nomsg(pidata=cpl_table_get_data_double(*t,
"INT"));
5882 check_nomsg(pcdata=cpl_table_get_data_double(*t,
"CNV"));
5887 check_nomsg(np=cpl_table_get_nrow(*t));
5891 for(i=0;i<rad;i++) {
5894 for(i=np-rad;i<np;i++) {
5897 for(i=rad;i<np-rad;i++) {
5899 for(j=-rad;j<rad;j++) {
5903 check_nomsg(cpl_table_set_double(*t,
"CNV",i,val));
5922 sinfo_convolve_kernel2(cpl_table** t,
const int rad)
5928 double* pidata=NULL;
5929 double* pcdata=NULL;
5936 cknull(*t,
"null input table");
5937 check_nomsg(cpl_table_new_column(*t,
"CNV",CPL_TYPE_DOUBLE));
5938 check_nomsg(pidata=cpl_table_get_data_double(*t,
"INT"));
5939 check_nomsg(pcdata=cpl_table_get_data_double(*t,
"CNV"));
5944 check_nomsg(np=cpl_table_get_nrow(*t));
5950 for(i=0;i<rad;i++) {
5953 for(i=np-rad;i<np;i++) {
5956 for(i=0;i<np-rad;i++) {
5958 for(j=0;j<rad;j++) {
5962 check_nomsg(cpl_table_set_double(*t,
"CNV",i,val));
5981 sinfo_convolve_exp(cpl_table** t,
const int rad,
const double fwhm)
5986 double ln2=0.693147180560;
5989 double* pidata=NULL;
5990 double* pcdata=NULL;
5997 cknull(*t,
"null input table");
5998 check_nomsg(cpl_table_new_column(*t,
"CNV",CPL_TYPE_DOUBLE));
5999 check_nomsg(pidata=cpl_table_get_data_double(*t,
"INT"));
6000 check_nomsg(pcdata=cpl_table_get_data_double(*t,
"CNV"));
6005 check_nomsg(np=cpl_table_get_nrow(*t));
6009 for(i=0;i<rad;i++) {
6012 for(i=np-rad;i<np;i++) {
6015 for(i=rad;i<np-rad;i++) {
6017 for(j=-rad;j<rad;j++) {
6018 val+=pidata[i+j]*k*pow(2.0,-2.0*fabs(i-rad)/fwhm);
6021 check_nomsg(cpl_table_set_double(*t,
"CNV",i,val));
6040 sinfo_convolve_gauss(cpl_table** t,
const int rad,
const double fwhm)
6046 double sigma=fwhm/2.3548;
6047 double sigma2=sigma*sigma;
6048 double* pidata=NULL;
6049 double* pcdata=NULL;
6058 cknull(*t,
"null input table");
6059 check_nomsg(cpl_table_new_column(*t,
"CNV",CPL_TYPE_DOUBLE));
6060 check_nomsg(pidata=cpl_table_get_data_double(*t,
"INT"));
6061 check_nomsg(pcdata=cpl_table_get_data_double(*t,
"CNV"));
6066 check_nomsg(np=cpl_table_get_nrow(*t));
6072 for(i=0;i<rad;i++) {
6075 for(i=np-rad;i<np;i++) {
6078 for(i=rad;i<np-rad;i++) {
6080 for(j=-rad;j<rad;j++) {
6082 val+=pidata[i+j]*exp(-tx*tx/2.0/sigma2)/(sigma*sqrt(2.0*PI_NUMB));
6085 check_nomsg(cpl_table_set_double(*t,
"CNV",i,val));
6108 sinfo_scales_obj_sky_cubes(cpl_imagelist* obj_cub,
6109 cpl_imagelist* sky_cub,
6112 cpl_imagelist** obj_cor)
6123 double* podata=NULL;
6124 double* psdata=NULL;
6125 double* pbdata=NULL;
6126 double* pcdata=NULL;
6127 double* pscale=NULL;
6130 cpl_image* imgo=NULL;
6131 cpl_image* imgs=NULL;
6132 cpl_image* imgc=NULL;
6135 check_nomsg(imgo=cpl_imagelist_get(obj_cub,0));
6136 check_nomsg(xsz=cpl_image_get_size_x(imgo));
6137 check_nomsg(ysz=cpl_image_get_size_y(imgo));
6138 check_nomsg(zsz=cpl_imagelist_get_size(obj_cub));
6140 check_nomsg(*obj_cor=cpl_imagelist_duplicate(obj_cub));
6142 for(k=0;k<zsz;k++) {
6143 check_nomsg(imgo=cpl_imagelist_get(obj_cub,k));
6144 check_nomsg(imgc=cpl_imagelist_get(*obj_cor,k));
6145 check_nomsg(imgs=cpl_imagelist_get(sky_cub,k));
6147 check_nomsg(podata=cpl_image_get_data_double(imgo));
6148 check_nomsg(pcdata=cpl_image_get_data_double(imgc));
6149 check_nomsg(psdata=cpl_image_get_data_double(imgs));
6150 check_nomsg(pbdata=cpl_table_get_data_double(bkg,
"INT2"));
6151 check_nomsg(pscale=cpl_table_get_data_double(rscale,
"RATIO"));
6153 for (j=0;j<ysz; j++) {
6154 for (i=0;i<xsz; i++) {
6155 if(!irplib_isnan(podata[i+j*xsz]) &&
6156 !irplib_isnan(psdata[i+j*xsz]) &&
6157 !irplib_isnan(pbdata[k]) &&
6158 !irplib_isnan(pscale[k])) {
6159 pcdata[i+j*xsz] = podata[i+j*xsz]-
6160 (psdata[i+j*xsz]-pbdata[k])*pscale[k];
6166 sinfo_free_imagelist(&obj_cub);
6191 sinfo_fitbkg(
const double x[],
6197 double fac = sinfo_fac(x[0],a[2]);
6206 *result = a[0]+a[1]*fac;
6235 sinfo_fitbkg_derivative(
const double x[],
6245 double fac = sinfo_fac(x[0],a[2]);
6257 d[2]=a[1]*fac*fac*x[0]*x[0]*x[0]*x[0]*c/(a[2]*a[2])*exp(c/(x[0]*a[2]));
6281 sinfo_fac(
const double x,
const double t)
6292 return pow(x,-5.)/(expm1(c/(x*fabs(t))));
6305 sinfo_table_threshold(cpl_table** t,
6307 const double low_cut,
6308 const double hig_cut,
6309 const double low_ass,
6310 const double hig_ass)
6316 cknull(*t,
"null input table!");
6318 check_nomsg(nrow=cpl_table_get_nrow(*t));
6319 check_nomsg(pdata=cpl_table_get_data_double(*t,column));
6321 for(i=0;i<nrow;i++) {
6323 if(pdata[i]<low_cut) {
6326 if (pdata[i] >= hig_cut) {
6368 sinfo_table_set(cpl_table** inp,
6369 const cpl_table* ref,
6377 const double* prw=NULL;
6381 cknull(*inp,
"NULL input table");
6382 cknull(ref,
"NULL reference table");
6384 check_nomsg(ninp=cpl_table_get_nrow(*inp));
6387 check_nomsg(prw=cpl_table_get_data_double_const(ref,
"WAVE"));
6388 check_nomsg(piw=cpl_table_get_data_double(*inp,
"WAVE"));
6392 for(i=0;i<ninp;i++) {
6394 if(fabs(piw[i]-prw[k]) < tol) {
6395 check_nomsg(cpl_table_set_double(*inp,
"RATIO",i,val));
6410 sinfo_table_shift_simple(cpl_table* inp,
6416 cpl_table* out=NULL;
6423 cknull(inp,
"null input table");
6425 check_nomsg(nrow=cpl_table_get_nrow(inp));
6426 check_nomsg(out=cpl_table_duplicate(inp));
6427 check_nomsg(cpl_table_fill_column_window(out,col,0,nrow,0));
6428 check_nomsg(pi=cpl_table_get_data_double(inp,col));
6429 check_nomsg(po=cpl_table_get_data_double(out,col));
6432 for(i=0;i<nrow;i++) {
6433 if((i+is)>0 && (i+is+1) < nrow) {
6434 m=pi[i+is+1]-pi[i+is];
6435 po[i]=pi[i+is]+m*ds;
6440 sinfo_free_table(&out);
6448 static cpl_imagelist*
6449 sinfo_cube_zshift_simple(cpl_imagelist* inp,
6471 cpl_imagelist* out=NULL;
6472 cpl_image* imgu=NULL;
6473 cpl_image* imgl=NULL;
6474 cpl_image* imgo=NULL;
6477 cknull(inp,
"null input cube");
6479 check_nomsg(nz=cpl_imagelist_get_size(inp));
6480 check_nomsg(out=cpl_imagelist_duplicate(inp));
6481 check_nomsg(imgo=cpl_imagelist_get(out,0));
6482 check_nomsg(nx=cpl_image_get_size_x(imgo));
6483 check_nomsg(ny=cpl_image_get_size_y(imgo));
6486 if((k+ks)>0 && (k+ks+1) < nz) {
6488 check_nomsg(imgu=cpl_imagelist_get(inp,k+ks+1));
6489 check_nomsg(imgl=cpl_imagelist_get(inp,k+ks));
6490 check_nomsg(imgo=cpl_imagelist_get(out,k));
6492 check_nomsg(pu=cpl_image_get_data_float(imgu));
6493 check_nomsg(pl=cpl_image_get_data_float(imgl));
6494 check_nomsg(po=cpl_image_get_data_float(imgo));
6502 po[nx*j+i]=int1+m*ds;
6511 sinfo_free_imagelist(&out);
6528 sinfo_get_line_ratio(cpl_table* obj_lin,
6540 cpl_table* obj_dif=NULL;
6541 cpl_table* sky_dif=NULL;
6549 cpl_vector* num=NULL;
6550 cpl_vector* den=NULL;
6551 cpl_vector* rat=NULL;
6552 cpl_vector* wav=NULL;
6558 cpl_polynomial* cfit=NULL;
6561 cknull(obj_lin,
"null obj line table");
6562 cknull(sky_lin,
"null sky line table");
6564 cknull(obj_cnt,
"null obj cont table");
6565 cknull(sky_cnt,
"null sky cont table");
6568 cknull_nomsg(obj_dif=sinfo_table_subtract_continuum(obj_lin,obj_cnt));
6569 cknull_nomsg(sky_dif=sinfo_table_subtract_continuum(sky_lin,sky_cnt));
6571 check_nomsg(nobj=cpl_table_get_nrow(obj_dif));
6572 check_nomsg(nsky=cpl_table_get_nrow(sky_dif));
6584 ck0_nomsg(sinfo_get_line_ratio_amoeba(obj_dif,sky_dif,r));
6585 sinfo_free_table(&obj_dif);
6586 sinfo_free_table(&sky_dif);
6591 check_nomsg(poi=cpl_table_get_data_double(obj_dif,
"INT"));
6592 check_nomsg(psi=cpl_table_get_data_double(sky_dif,
"INT"));
6594 check_nomsg(num=cpl_vector_new(nobj));
6595 check_nomsg(den=cpl_vector_new(nobj));
6596 check_nomsg(rat=cpl_vector_new(nobj));
6597 check_nomsg(cpl_vector_fill(num,0));
6598 check_nomsg(cpl_vector_fill(den,0));
6599 check_nomsg(cpl_vector_fill(rat,0));
6600 check_nomsg(pvd=cpl_vector_get_data(den));
6601 check_nomsg(pvn=cpl_vector_get_data(num));
6602 check_nomsg(pvr=cpl_vector_get_data(rat));
6604 for(i=0;i<nobj;i++) {
6605 if(!irplib_isnan(psi[i]) &&
6606 !irplib_isnan(poi[i]) &&
6607 !irplib_isinf(psi[i]) &&
6608 !irplib_isinf(poi[i]) ) {
6609 pvn[i]=psi[i]*poi[i];
6610 pvd[i]=psi[i]*psi[i];
6612 pvr[i]=poi[i]/psi[i];
6616 sinfo_free_table(&sky_dif);
6618 check_nomsg(mnum=cpl_vector_get_median_const(num));
6619 check_nomsg(mden=cpl_vector_get_median_const(den));
6620 check_nomsg(tnum=cpl_vector_get_mean(num)*nobj);
6621 check_nomsg(tden=cpl_vector_get_mean(den)*nobj);
6625 sinfo_free_my_vector(&num);
6626 sinfo_free_my_vector(&den);
6629 }
else if (method == 2) {
6631 }
else if (method == 3) {
6632 *r=cpl_vector_get_median_const(rat);
6633 }
else if (method == 4) {
6634 *r=cpl_vector_get_mean(rat);
6635 }
else if (method == 5) {
6637 check_nomsg(wav=cpl_vector_wrap(nobj,
6638 cpl_table_get_data_double(obj_dif,
"WAVE")));
6639 check_nomsg(cfit=sinfo_polynomial_fit_1d_create(wav,rat,0,&mse));
6640 sinfo_unwrap_vector(&wav);
6643 check_nomsg(*r=cpl_polynomial_get_coeff(cfit,pows));
6644 sinfo_free_polynomial(&cfit);
6648 sinfo_free_table(&obj_dif);
6649 sinfo_free_my_vector(&rat);
6652 sinfo_free_table(&obj_dif);
6653 sinfo_free_table(&sky_dif);
6654 sinfo_free_my_vector(&num);
6655 sinfo_free_my_vector(&den);
6656 sinfo_free_my_vector(&rat);
6657 sinfo_unwrap_vector(&wav);
6675 sinfo_get_line_ratio_amoeba(cpl_table* obj,
6689 check_nomsg(np=cpl_table_get_nrow(obj));
6690 check_nomsg(sa_ox=cpl_vector_wrap(np,cpl_table_get_data_double(obj,
"WAVE")));
6691 check_nomsg(sa_oy=cpl_vector_wrap(np,cpl_table_get_data_double(obj,
"INT")));
6692 check_nomsg(sa_sy=cpl_vector_wrap(np,cpl_table_get_data_double(sky,
"INT")));
6696 ap=(
double**) cpl_calloc(MP,
sizeof(
double*));
6698 ap[i]=cpl_calloc(NP,
sizeof(
double));
6708 y[i]=sinfo_fit_sky(p0);
6712 check_nomsg(sinfo_fit_amoeba(ap,y,NP,AMOEBA_FTOL,sinfo_fit_sky,&nfunc));
6714 sinfo_msg(
"After amoeba fit");
6715 sinfo_msg(
"ap[0][0]=%g ap[0][1]=%g",ap[0][0],ap[1][0]);
6719 sinfo_unwrap_vector(&sa_ox);
6720 sinfo_unwrap_vector(&sa_oy);
6721 sinfo_unwrap_vector(&sa_sy);
6722 sinfo_new_destroy_2Ddoublearray(&ap,MP);
6728 sinfo_unwrap_vector(&sa_ox);
6729 sinfo_unwrap_vector(&sa_oy);
6730 sinfo_unwrap_vector(&sa_sy);
6731 sinfo_new_destroy_2Ddoublearray(&ap,MP);
6750 sinfo_fit_sky(
double p[])
6756 cpl_vector* vtmp=NULL;
6762 cpl_polynomial* pfit=NULL;
6768 check_nomsg(pfit=sinfo_polynomial_fit_1d_create(sa_ox,sa_oy,0,&mse));
6771 check_nomsg(cont=cpl_polynomial_get_coeff(pfit,pows));
6772 check_nomsg(sinfo_free_polynomial(&pfit));
6773 check_nomsg(cpl_vector_subtract_scalar(sa_oy,cont));
6777 check_nomsg(pfit=sinfo_polynomial_fit_1d_create(sa_ox,sa_sy,0,&mse));
6780 check_nomsg(cont=cpl_polynomial_get_coeff(pfit,pows));
6781 check_nomsg(sinfo_free_polynomial(&pfit));
6782 check_nomsg(cpl_vector_subtract_scalar(sa_sy,cont));
6785 check_nomsg(po= cpl_vector_get_data(sa_oy));
6786 check_nomsg(ps= cpl_vector_get_data(sa_sy));
6788 check_nomsg(np=cpl_vector_get_size(sa_oy));
6789 check_nomsg(vtmp=cpl_vector_new(np));
6790 check_nomsg(pv= cpl_vector_get_data(vtmp));
6794 pv[i]=po[i]-ps[i]*p[0];
6797 check_nomsg(rms=cpl_vector_get_stdev(vtmp));
6798 sinfo_free_my_vector(&vtmp);
6801 sinfo_free_my_vector(&vtmp);
6820 sinfo_table_interpol(cpl_table* obj_lin,
6827 cpl_table* out=NULL;
6828 cpl_table* obj_dif=NULL;
6829 cpl_table* sky_dif=NULL;
6830 cknull(obj_lin,
"null line table");
6831 cknull(obj_cnt,
"null cont table");
6833 cknull_nomsg(obj_dif=sinfo_table_subtract_continuum(obj_lin,obj_cnt));
6834 cknull_nomsg(sky_dif=sinfo_table_subtract_continuum(sky_lin,sky_cnt));
6836 check_nomsg(out=cpl_table_duplicate(obj_dif));
6837 check_nomsg(cpl_table_duplicate_column(out,
"CSKY",sky_dif,
"INT"));
6838 check_nomsg(cpl_table_multiply_scalar(out,
"CSKY",r));
6839 check_nomsg(cpl_table_subtract_columns(out,
"INT",
"CSKY"));
6841 sinfo_free_table(&obj_dif);
6842 sinfo_free_table(&sky_dif);
6847 sinfo_free_table(&obj_dif);
6848 sinfo_free_table(&sky_dif);
6849 sinfo_free_table(&out);
6868 sinfo_table_subtract_continuum(cpl_table* lin,
6873 cpl_table* out=NULL;
6878 cpl_vector* vx=NULL;
6879 cpl_vector* vy=NULL;
6880 cpl_polynomial* cfit=NULL;
6885 cknull(lin,
"null line table");
6886 cknull(cnt,
"null cont table");
6887 check_nomsg(out=cpl_table_duplicate(lin));
6888 check_nomsg(cpl_table_new_column(out,
"CONT",CPL_TYPE_DOUBLE));
6889 check_nomsg(nlin=cpl_table_get_nrow(lin));
6890 check_nomsg(ncnt=cpl_table_get_nrow(cnt));
6892 check_nomsg(cpl_table_fill_column_window(out,
"CONT",0,nlin,0));
6895 check_nomsg(vx=cpl_vector_wrap(ncnt,cpl_table_get_data_double(cnt,
"WAVE")));
6896 check_nomsg(vy=cpl_vector_wrap(ncnt,cpl_table_get_data_double(cnt,
"INT")));
6897 check_nomsg(cfit=sinfo_polynomial_fit_1d_create(vx,vy,0,&mse));
6898 sinfo_unwrap_vector(&vx);
6899 sinfo_unwrap_vector(&vy);
6903 check_nomsg(yfit=cpl_polynomial_get_coeff(cfit,pows));
6904 sinfo_free_polynomial(&cfit);
6907 check_nomsg(poi=cpl_table_get_data_double(out,
"CONT"));
6908 for(i=0;i<nlin;i++) {
6912 check_nomsg(cpl_table_subtract_columns(out,
"INT",
"CONT"));
6913 check_nomsg(cpl_table_erase_column(out,
"CONT"));
6920 sinfo_unwrap_vector(&vx);
6921 sinfo_unwrap_vector(&vy);
6922 sinfo_free_polynomial(&cfit);
6923 sinfo_free_table(&out);
6930 sinfo_compute_line_ratio(cpl_table* obj,
6934 const cpl_table* sel_regions,
6935 cpl_table* cont_regions,
6938 cpl_table* line_regions=NULL;
6939 cpl_table* obj_cnt=NULL;
6940 cpl_table* sky_cnt=NULL;
6941 cpl_table* obj_lin=NULL;
6942 cpl_table* sky_lin=NULL;
6943 cpl_table* lres=NULL;
6952 check_nomsg(line_regions = cpl_table_duplicate(sel_regions));
6955 check_nomsg(obj_lin=sinfo_table_select_range(obj,line_regions,wtol));
6956 check_nomsg(sky_lin=sinfo_table_select_range(sky,line_regions,wtol));
6957 check_nomsg(obj_cnt=sinfo_table_select_range(obj,cont_regions,wtol));
6958 check_nomsg(sky_cnt=sinfo_table_select_range(sky,cont_regions,wtol));
6960 ck0_nomsg(sinfo_get_line_ratio(obj_lin,obj_cnt,sky_lin,sky_cnt,meth,r));
6970 check_nomsg(lres=sinfo_table_interpol(obj_lin,obj_cnt,sky_lin,sky_cnt,*r));
6972 check_nomsg(fmed = cpl_table_get_column_median(lres,
"INT"));
6973 check_nomsg(fsdv = cpl_table_get_column_stdev(lres,
"INT"));
6974 fthresh=fmed+3*fsdv;
6976 check_nomsg(cpl_table_duplicate_column(lres,
"AINT",lres,
"INT"));
6977 check_nomsg(cpl_table_multiply_columns(lres,
"AINT",
"INT"));
6978 check_nomsg(cpl_table_power_column(lres,
"AINT",0.5));
6979 check_nomsg(fclip_i=cpl_table_and_selected_double(lres,
"AINT",
6982 check_nomsg(cpl_table_select_all(lres));
6987 check_nomsg(line_i=cpl_table_and_selected_double(lres,
"AINT",
6990 sinfo_free_table(&line_regions);
6991 check_nomsg(line_regions=cpl_table_extract_selected(lres));
6992 sinfo_free_table(&lres);
6994 check_nomsg(cpl_table_erase_column(line_regions,
"INT"));
6995 check_nomsg(cpl_table_erase_column(line_regions,
"AINT"));
7000 sinfo_free_table(&obj_lin);
7001 sinfo_free_table(&sky_lin);
7002 check_nomsg(obj_lin=sinfo_table_select_range(obj,line_regions,wtol));
7003 check_nomsg(sky_lin=sinfo_table_select_range(sky,line_regions,wtol));
7005 sinfo_free_table(&line_regions);
7009 ck0_nomsg(sinfo_get_line_ratio(obj_lin,obj_cnt,sky_lin,sky_cnt,meth,r));
7014 sinfo_free_table(&obj_cnt);
7015 sinfo_free_table(&sky_cnt);
7016 sinfo_free_table(&sky_lin);
7017 sinfo_free_table(&obj_lin);
7018 sinfo_free_table(&lres);
7019 sinfo_free_table(&line_regions);
7028 sinfo_free_table(&obj_cnt);
7029 sinfo_free_table(&sky_cnt);
7030 sinfo_free_table(&sky_lin);
7031 sinfo_free_table(&obj_lin);
7033 sinfo_free_table(&lres);
7034 sinfo_free_table(&line_regions);
7051 sinfo_find_rot_waves(
7052 const double w_rot[],
7054 const double w_step,
7064 cpl_table* w_sel=NULL;
7065 cpl_table* res=NULL;
7067 check_nomsg(res = cpl_table_new(0));
7069 check_nomsg(cpl_table_copy_structure(res,range));
7071 for (i=0; i< NROT; i++) {
7076 w_min=w_rot[i]-npix_w*w_step;
7077 w_max=w_rot[i]+npix_w*w_step;
7079 check_nomsg(cpl_table_and_selected_double(range,
"WAVE",
7080 CPL_GREATER_THAN,w_min));
7081 check_nomsg(cpl_table_and_selected_double(range,
"WAVE",
7082 CPL_LESS_THAN,w_max));
7083 sinfo_free_table(&w_sel);
7084 check_nomsg(w_sel=cpl_table_extract_selected(range));
7085 check_nomsg(x_i=cpl_table_get_nrow(w_sel));
7088 check_nomsg(r_start=cpl_table_get_nrow(res));
7090 check_nomsg(cpl_table_insert(res,w_sel,r_start));
7092 check_nomsg(cpl_table_select_all(range));
7096 sinfo_free_table(&w_sel);
7102 sinfo_free_table(&w_sel);
7103 sinfo_free_table(&res);
7121 sinfo_get_obj_sky_wav_sub(cpl_table* obj,
7126 cpl_table** sub_obj,
7127 cpl_table** sub_sky,
7128 cpl_table** sub_wav)
7131 cknull_nomsg(*sub_obj = sinfo_table_select_range(obj,sel,wtol));
7132 cknull_nomsg(*sub_sky = sinfo_table_select_range(sky,sel,wtol));
7133 cknull_nomsg(*sub_wav = sinfo_table_select_range(wav,sel,wtol));
7137 sinfo_free_table(&(*sub_obj));
7138 sinfo_free_table(&(*sub_sky));
7139 sinfo_free_table(&(*sub_wav));
7146 sinfo_get_sub_regions(cpl_table* sky,
7154 cpl_table* x1_sub=NULL;
7160 cknull(sky,
"Null input sky table");
7161 cknull(x1 ,
"Null input x1 table");
7162 cknull(pos,
"Null input pos table");
7164 check_nomsg(x2=cpl_table_duplicate(sky));
7165 check_nomsg(nrow=cpl_table_get_nrow(sky));
7166 check_nomsg(cpl_table_fill_column_window(x2,
"INT",0,nrow,0));
7173 x1_sub=sinfo_table_select_range(x1,pos,wtol);
7175 if(x1_sub != NULL) {
7176 ck0_nomsg(sinfo_table_fill_column_over_range(&x2,x1_sub,
"INT",10.,wtol));
7177 sinfo_free_table(&x1_sub);
7178 check_nomsg(sinfo_convolve_kernel(&x2,npixw/2));
7179 check_nomsg(np=cpl_table_and_selected_double(x2,
"CNV",CPL_GREATER_THAN,0));
7180 check_nomsg(*res=cpl_table_extract_selected(x2));
7181 sinfo_free_table(&x2);
7182 check_nomsg(cpl_table_erase_column(*res,
"INT"));
7183 check_nomsg(cpl_table_erase_column(*res,
"CNV"));
7187 sinfo_free_table(&x1_sub);
7188 sinfo_free_table(&x2);
7196 sinfo_free_table(&x1_sub);
7197 sinfo_free_table(&x2);
7203 sinfo_table_extract_rest(cpl_table* inp,
7209 cpl_table* out=NULL;
7219 cpl_table* tmp=NULL;
7221 cknull(inp,
"null input table");
7224 check_nomsg(tmp=cpl_table_duplicate(inp));
7225 check_nomsg(nrow=cpl_table_get_nrow(tmp));
7226 check_nomsg(cpl_table_new_column(tmp,
"SEL",CPL_TYPE_INT));
7227 check_nomsg(cpl_table_fill_column_window_int(tmp,
"SEL",0,nrow,0));
7229 check_nomsg(pinp=cpl_table_get_data_double(inp,
"WAVE"));
7230 check_nomsg(plow=cpl_table_get_data_double(low,
"WAVE"));
7231 check_nomsg(pmed=cpl_table_get_data_double(med,
"WAVE"));
7232 nlow=cpl_table_get_nrow(low);
7238 for(i=0;i<nrow;i++) {
7239 if(fabs(pinp[i]-plow[k]) < wtol) {
7240 cpl_table_set_int(tmp,
"SEL",k,-1);
7245 nmed=cpl_table_get_nrow(med);
7249 for(i=0;i<nrow;i++) {
7250 if(fabs(pinp[i]-pmed[k]) < wtol) {
7251 cpl_table_set_int(tmp,
"SEL",k,-1);
7257 check_nomsg(cpl_table_and_selected_int(tmp,
"SEL",CPL_GREATER_THAN,-1));
7258 check_nomsg(out=cpl_table_extract_selected(tmp));
7259 sinfo_free_table(&tmp);
7260 check_nomsg(cpl_table_erase_column(out,
"SEL"));
7265 sinfo_free_table(&tmp);
#define sinfo_msg_error(...)
Print an error message.
#define sinfo_msg_warning(...)
Print an warning message.