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_functions.h"
46 #include "sinfo_msg.h"
47 #include "sinfo_error.h"
48 #include "sinfo_globals.h"
49 #include "sinfo_utils_wrappers.h"
50 #include "sinfo_utl_cube2spectrum.h"
51 #include "sinfo_pro_types.h"
56 #define BAND_H_WAVE_MIN 1.445 //not used
57 #define BAND_H_WAVE_MAX 1.820 //not used
59 #define BAND_K_WAVE_MIN 1.945 //not used
60 #define BAND_K_WAVE_MAX 2.460 //not used
62 #define BAND_J_WAVE_MIN 1.445 //not used
63 #define BAND_J_WAVE_MAX 1.82 //not used
65 #define SINFO_FIT_BKG_TEMP 280.
66 #define SKY_THRES 0.95
67 #define SKY_LINE_MAX_CUT 4
68 #define SKY_LINE_MIN_CUT 4
71 #define XCOR_YSHIFT_KS_CLIP 5
74 #define HPLANK 6.62606876e-34; // J s
75 #define CLIGHT 2.99792458e+08; // m / s
76 #define KBOLTZ 1.3806503e-23; // J / K
77 #define AMOEBA_FTOL 1.e-5
80 #define N_ITER_FIT_LM 15
81 #define N_ITER_FIT_AMOEBA 10
83 double sinfo_scale_fct=1;
84 static cpl_vector* sa_vx=NULL;
85 static cpl_vector* sa_vy=NULL;
87 static cpl_vector* sa_ox=NULL;
88 static cpl_vector* sa_oy=NULL;
89 static cpl_vector* sa_sy=NULL;
94 cpl_vector* sinfo_sky_background_estimate(cpl_vector *spectrum,
100 sinfo_scales_obj_sky_cubes(cpl_imagelist* obj_cub,
101 cpl_imagelist* sky_cub,
104 cpl_imagelist** obj_cor);
107 sinfo_sub_thr_bkg_from_obj_cube(cpl_imagelist* obj_cub,
109 cpl_imagelist** obj_cor);
112 sinfo_filter_min(
const cpl_vector* vi,
const int size);
115 sinfo_filter_max(
const cpl_vector* vi,
const int size);
118 sinfo_filter_smo(
const cpl_vector* vi,
const int size);
120 static cpl_imagelist*
121 sinfo_cube_zshift_simple(cpl_imagelist* inp,
125 sinfo_optimise_sky_sub(
const double wtol,
126 const double line_hw,
151 sinfo_shift_sky(cpl_frame** sky_frm,
153 const double zshift);
156 sinfo_xcorr(cpl_table* int_obj,
159 const double dispersion,
160 const double line_hw);
163 sinfo_interpolate_sky(
const cpl_table* inp,
const cpl_table* lambdas);
166 sinfo_check_screw_values(cpl_table** int_obj,
172 sinfo_choose_good_sky_pixels(cpl_frame* obj_frm,
175 const double min_frac,
180 sinfo_sum_spectra(
const cpl_frame* obj,
181 const cpl_frame* sky,
189 cpl_table** int_sky);
192 sinfo_thermal_background2(cpl_table* int_sky,
198 sinfo_thermal_background(cpl_table* int_sky,
203 const int filter_width,
209 sinfo_object_flag_sky_pixels(cpl_frame* obj_frm,
212 cpl_imagelist* flag_data,
219 sinfo_object_flag_low_values(cpl_frame* obj_frm,
222 cpl_imagelist** flag_data);
225 sinfo_object_estimate_noise(cpl_frame* obj_frm,
const int obj_noise_fit,
226 double* centre,
double* noise);
231 sinfo_set_ranges(cpl_frame* obj_frm,
233 cpl_parameterlist* cfg,
259 sinfo_table_extract_rest(cpl_table* inp,
265 sinfo_get_sub_regions(cpl_table* sky,
270 cpl_table** sub_regions);
274 sinfo_get_obj_sky_wav_sub(cpl_table* obj,
281 cpl_table** sub_wav);
285 sinfo_find_rot_waves(
const double w_rot[],
290 sinfo_compute_line_ratio(cpl_table* obj,
294 const cpl_table* sel_regions,
295 cpl_table* cont_regions,
299 sinfo_table_subtract_continuum(cpl_table* lin,cpl_table* cnt);
302 sinfo_fit_bkg(
double p[]);
305 sinfo_fit_sky(
double p[]);
308 sinfo_get_line_ratio_amoeba(cpl_table* obj,
313 sinfo_table_interpol(cpl_table* obj_lin,
321 sinfo_get_line_ratio(cpl_table* obj_lin,
329 sinfo_table_shift_simple(cpl_table* inp,
337 sinfo_table_set(cpl_table** out,
338 const cpl_table* ref,
343 sinfo_table_threshold(cpl_table** t,
345 const double low_cut,
346 const double hig_cut,
347 const double low_ass,
348 const double hig_ass);
353 static double sinfo_fac(
const double x,
const double t);
355 static int sinfo_fitbkg(
const double x[],
358 static int sinfo_fitbkg_derivative(
const double x[],
364 sinfo_convolve_kernel(cpl_table** t,
const int rad);
366 sinfo_convolve_kernel2(cpl_table** t,
const int rad);
369 sinfo_convolve_gauss(cpl_table** t,
const int rad,
const double fwhm);
371 sinfo_convolve_exp(cpl_table** t,
const int rad,
const double fwhm);
374 sinfo_table_sky_obj_flag_nan(cpl_table** s,cpl_table** o, cpl_table** w);
377 sinfo_table_set_nan_out_min_max(cpl_table** s,
386 sinfo_gaussian_amp(
double area,
double sigma,
double x,
double x0,
double off);
388 sinfo_gaussian_area(
double amp,
double sigma,
double x,
double x0,
double off);
391 sinfo_table_smooth_column(cpl_table** t,
const char* c,
const int r);
394 sinfo_image_flag_nan(cpl_image** im);
397 sinfo_table_flag_nan(cpl_table** t,
const char* label);
402 sinfo_cnt_mask_thresh_and_obj_finite(
const cpl_image* mask,
404 const cpl_image* obj);
410 sinfo_interpolate(
const cpl_table* inp,
411 const cpl_table* lambdas,
416 sinfo_image2table(
const cpl_image* im);
419 sinfo_table_extract_finite(
const cpl_table* in1,
420 const cpl_table* in2,
425 sinfo_slice_z(
const cpl_imagelist* cin,
const int i,
const int j);
429 static cpl_imagelist*
430 sinfo_imagelist_select_range(
const cpl_imagelist* inp,
431 const cpl_table* full,
432 const cpl_table* good,
438 sinfo_table_select_range(cpl_table* inp,
443 sinfo_table_fill_column_over_range(cpl_table** inp,
444 const cpl_table* ref,
453 sinfo_table_column_dindgen(cpl_table** t,
const char* label);
483 sinfo_skycor_qc_new(
void)
485 sinfo_skycor_qc * sqc;
486 sqc= cpl_malloc(
sizeof(sinfo_skycor_qc));
500 sinfo_skycor_qc_delete(sinfo_skycor_qc** sqc)
522 sinfo_skycor(cpl_parameterlist * config,
525 sinfo_skycor_qc* sqc,
526 cpl_imagelist** obj_cor,
532 cpl_table* lambda=NULL;
533 cpl_table* lr41=NULL;
534 cpl_table* lr52=NULL;
535 cpl_table* lr63=NULL;
536 cpl_table* lr74=NULL;
537 cpl_table* lr02=NULL;
538 cpl_table* lr85=NULL;
539 cpl_table* lr20=NULL;
540 cpl_table* lr31=NULL;
541 cpl_table* lr42=NULL;
542 cpl_table* lr53=NULL;
543 cpl_table* lr64=NULL;
544 cpl_table* lr75=NULL;
545 cpl_table* lr86=NULL;
546 cpl_table* lr97=NULL;
547 cpl_table* lr00=NULL;
548 cpl_table* lrange=NULL;
549 cpl_table* mrange=NULL;
550 cpl_table* grange=NULL;
551 cpl_table* lambdas=NULL;
553 cpl_table* int_sky=NULL;
555 cpl_image* mask=NULL;
556 cpl_image* gpix=NULL;
557 cpl_image* ratio=NULL;
558 cpl_image* ima_sky=NULL;
559 cpl_imagelist* fdata=NULL;
560 cpl_table* rscale=NULL;
561 cpl_parameter* p=NULL;
578 int filter_width=SINFO_SKY_BKG_FILTER_WIDTH;
583 cpl_imagelist* obj_cub=NULL;
584 cpl_imagelist* sky_cub=NULL;
588 check_nomsg(p=cpl_parameterlist_find(config,
589 "sinfoni.sinfo_utl_skycor.min_frac"));
590 check_nomsg(min_frac=cpl_parameter_get_double(p));
592 check_nomsg(p=cpl_parameterlist_find(config,
593 "sinfoni.sinfo_utl_skycor.line_half_width"));
594 check_nomsg(line_hw=cpl_parameter_get_double(p));
598 check_nomsg(p=cpl_parameterlist_find(config,
599 "sinfoni.sinfo_utl_skycor.sky_bkg_filter_width"));
600 check_nomsg(filter_width=cpl_parameter_get_int(p));
602 check_nomsg(p=cpl_parameterlist_find(config,
603 "sinfoni.sinfo_utl_skycor.scale_method"));
604 check_nomsg(method=cpl_parameter_get_int(p));
608 check_nomsg(p=cpl_parameterlist_find(config,
609 "sinfoni.sinfo_utl_skycor.rot_cor"));
610 check_nomsg(do_rot=cpl_parameter_get_bool(p));
613 check_nomsg(p=cpl_parameterlist_find(config,
614 "sinfoni.sinfo_utl_skycor.sub_thr_bkg_from_obj"));
615 check_nomsg(sub_thr_bkg=cpl_parameter_get_bool(p));
618 check_nomsg(p=cpl_parameterlist_find(config,
619 "sinfoni.sinfo_utl_skycor.fit_obj_noise"));
620 check_nomsg(obj_noise_fit=cpl_parameter_get_bool(p));
623 check_nomsg(p=cpl_parameterlist_find(config,
624 "sinfoni.sinfo_utl_skycor.niter"));
625 check_nomsg(niter=cpl_parameter_get_int(p));
628 check_nomsg(p=cpl_parameterlist_find(config,
629 "sinfoni.sinfo_utl_skycor.pshift"));
630 check_nomsg(pshift=cpl_parameter_get_double(p));
634 check_nomsg(p=cpl_parameterlist_find(config,
635 "sinfoni.sinfo_utl_skycor.llx"));
636 check_nomsg(llx=cpl_parameter_get_int(p));
639 check_nomsg(p=cpl_parameterlist_find(config,
640 "sinfoni.sinfo_utl_skycor.lly"));
641 check_nomsg(lly=cpl_parameter_get_int(p));
644 check_nomsg(p=cpl_parameterlist_find(config,
645 "sinfoni.sinfo_utl_skycor.urx"));
646 check_nomsg(urx=cpl_parameter_get_int(p));
649 check_nomsg(p=cpl_parameterlist_find(config,
650 "sinfoni.sinfo_utl_skycor.ury"));
651 check_nomsg(ury=cpl_parameter_get_int(p));
654 sinfo_msg(
"Set wavelength ranges");
655 ck0(sinfo_set_ranges(obj_frm,sky_frm,config,&lambda,
656 &lr41,&lr52,&lr63,&lr74,&lr02,&lr85,&lr20,&lr31,&lr42,
657 &lr53,&lr64,&lr75,&lr86,&lr97,&lr00,
658 &lrange,&grange,&lambdas,&mrange,&sky_interp_sw,
659 &dispersion),
"Setting wavelength ranges");
685 sinfo_msg(
"Estimate noise");
686 ck0(sinfo_object_estimate_noise(obj_frm,obj_noise_fit,¢re,&noise),
689 sinfo_msg(
"Background=%f Noise=%f",centre,noise);
690 sinfo_msg(
"Flag object low_levels");
691 ck0(sinfo_object_flag_low_values(obj_frm,centre,noise,&fdata),
698 sinfo_msg(
"Flag sky pixels");
699 ck0(sinfo_object_flag_sky_pixels(obj_frm,lambda,mrange,fdata,dispersion,
700 &gpix,&ratio,&ima_sky),
701 "Flagging sky pixels");
715 sinfo_msg(
"Choose good sky (with > 95%% good spectral) pixels");
716 ck0(sinfo_choose_good_sky_pixels(obj_frm,ratio,gpix,min_frac,&mask),
717 "Choosing good sky pixels");
726 sinfo_msg(
"Sum obj and sky spectra");
727 ck0(sinfo_sum_spectra(obj_frm,sky_frm,mask,lambda,llx,lly,urx,ury,int_obj,
728 &int_sky),
"summing obj & sky spectra");
736 sinfo_msg(
"Computes thermal background");
742 ck0(sinfo_thermal_background(int_sky,lambda,lrange,fit_temp,niter,
743 filter_width,dispersion,&bkg,&th_fit),
744 "getting termal bkg");
747 check_nomsg(cpl_table_duplicate_column(*int_obj,
"INT_SKY_ORG",int_sky,
"INT"));
748 check_nomsg(cpl_table_duplicate_column(*int_obj,
"INT_BKG_FIT",bkg,
"INT2"));
749 check_nomsg(cpl_table_duplicate_column(*int_obj,
"INT_BKG_SMO",int_sky,
763 sinfo_msg(
"Subtracts thermal background from integrated OH spectrum");
766 check_nomsg(cpl_table_duplicate_column(int_sky,
"BKG",bkg,
"INT2"));
767 check_nomsg(cpl_table_duplicate_column(int_sky,
"INT0",int_sky,
"INT"));
768 check_nomsg(cpl_table_subtract_columns(int_sky,
"INT",
"BKG"));
775 if(sub_thr_bkg == 1) {
776 check_nomsg(cpl_table_duplicate_column(*int_obj,
"THR_BKG",bkg,
"INT2"));
777 check_nomsg(cpl_table_subtract_columns(*int_obj,
"INT",
"THR_BKG"));
796 sinfo_msg(
"Checks for screw values at ends of spectrum");
797 sinfo_check_screw_values(int_obj,&int_sky,grange,dispersion);
807 if(sky_interp_sw == 1) {
808 sinfo_msg(
"Interpolate sky if necessary");
809 sinfo_interpolate_sky(int_sky,lambdas);
813 sinfo_msg(
"Crosscorrelate obj & sky to check for lambda offset");
818 check_nomsg(wshift=sinfo_xcorr(*int_obj,int_sky,lambda,dispersion,line_hw));
822 sinfo_msg(
"Dispersion=%f",dispersion);
824 pshift=wshift/dispersion;
826 sinfo_msg(
"Shift sky of %f pixels toward object",pshift);
828 check_nomsg(sinfo_shift_sky(&sky_frm,&int_sky,pshift));
836 sinfo_msg(
"Optimise sky subtraction");
837 check_nomsg(sinfo_optimise_sky_sub(dispersion,line_hw,method,do_rot,
839 lr41,lr52,lr63,lr74,lr02,lr85,
840 lr20,lr31,lr42,lr53,lr64,lr75,
841 lr86,lr97,lr00,int_obj,&int_sky,
851 sinfo_msg(
"Apply same scaling to whole cubes");
854 cknull_nomsg(obj_cub=cpl_imagelist_load(cpl_frame_get_filename(obj_frm),
856 cknull_nomsg(sky_cub=cpl_imagelist_load(cpl_frame_get_filename(sky_frm),
862 if(sub_thr_bkg == 1) {
863 ck0_nomsg(sinfo_sub_thr_bkg_from_obj_cube(obj_cub,int_sky,obj_cor));
865 check_nomsg(*obj_cor=cpl_imagelist_duplicate(obj_cub));
868 ck0_nomsg(sinfo_scales_obj_sky_cubes(*obj_cor,sky_cub,bkg,rscale,obj_cor));
870 check_nomsg(cpl_table_name_column(*int_obj,
"INT",
"INT_OBJ_ORG"));
871 check_nomsg(cpl_table_name_column(*int_obj,
"INTC",
"INT_OBJ_COR"));
872 check_nomsg(cpl_table_name_column(*int_obj,
"SKYC",
"INT_SKY_COR"));
876 sinfo_free_table(&rscale);
877 sinfo_free_imagelist(&fdata);
879 sinfo_free_table(&bkg);
880 sinfo_free_table(&lambda);
881 sinfo_free_table(&lrange);
882 sinfo_free_table(&mrange);
883 sinfo_free_table(&grange);
884 sinfo_free_table(&lambdas);
885 sinfo_free_image(&mask);
887 sinfo_free_table(&lr41);
888 sinfo_free_table(&lr52);
889 sinfo_free_table(&lr63);
890 sinfo_free_table(&lr74);
891 sinfo_free_table(&lr02);
892 sinfo_free_table(&lr85);
893 sinfo_free_table(&lr20);
894 sinfo_free_table(&lr31);
895 sinfo_free_table(&lr42);
896 sinfo_free_table(&lr53);
897 sinfo_free_table(&lr64);
898 sinfo_free_table(&lr75);
899 sinfo_free_table(&lr86);
900 sinfo_free_table(&lr97);
901 sinfo_free_table(&lr00);
903 sinfo_free_image(&gpix);
904 sinfo_free_image(&ratio);
905 sinfo_free_image(&ima_sky);
907 sinfo_free_table(&int_sky);
909 sinfo_free_imagelist(&obj_cub);
910 sinfo_free_imagelist(&sky_cub);
912 if (cpl_error_get_code() != CPL_ERROR_NONE) {
937 sinfo_sub_thr_bkg_from_obj_cube(cpl_imagelist* obj_cub,
939 cpl_imagelist** obj_cor)
942 double* pthr_bkg=NULL;
945 cpl_image* imgo=NULL;
947 check_nomsg(pthr_bkg=cpl_table_get_data_double(int_sky,
"BKG"));
948 check_nomsg(zsz=cpl_imagelist_get_size(obj_cub));
949 check_nomsg(*obj_cor=cpl_imagelist_duplicate(obj_cub));
952 check_nomsg(imgo=cpl_imagelist_get(obj_cub,k));
953 check_nomsg(cpl_image_subtract_scalar(imgo,pthr_bkg[k]));
954 check_nomsg(cpl_imagelist_set(*obj_cor,imgo,k));
958 if (cpl_error_get_code() != CPL_ERROR_NONE) {
1001 sinfo_set_ranges(cpl_frame* obj_frm,
1003 cpl_parameterlist* cfg,
1022 cpl_table** lambdas,
1029 cpl_propertylist* plist=NULL;
1051 const double w_j_min=1.100;
1052 const double w_j_max=1.400;
1053 const double w_h_min=1.445;
1054 const double w_h_max=1.820;
1055 const double w_k_min=1.945;
1056 const double w_k_max=2.460;
1062 cpl_parameter* p=NULL;
1066 double w_bound[NBOUND]={1.067,1.125,1.196,1.252,1.289,
1067 1.400,1.472,1.5543,1.6356,1.7253,
1068 1.840,1.9570,2.095,2.300};
1070 cpl_table* tmp_tbl=NULL;
1071 cpl_table* add1=NULL;
1076 cknull_nomsg(plist=cpl_propertylist_load(cpl_frame_get_filename(obj_frm),0));
1077 check_nomsg(crval_obj=sinfo_pfits_get_crval3(plist));
1078 check_nomsg(cdelt_obj=sinfo_pfits_get_cdelt3(plist));
1079 check_nomsg(crpix_obj=sinfo_pfits_get_crpix3(plist));
1082 check_nomsg(zsize_obj=sinfo_pfits_get_naxis3(plist));
1084 sinfo_free_propertylist(&plist);
1085 *dispersion=cdelt_obj;
1088 check_nomsg(*lambda=cpl_table_new(zsize_obj));
1089 cpl_table_new_column(*lambda,
"WAVE",CPL_TYPE_DOUBLE);
1090 cpl_table_new_column(*lambda,
"INDEX",CPL_TYPE_DOUBLE);
1091 check_nomsg(sinfo_table_column_dindgen(lambda,
"INDEX"));
1092 check_nomsg(sinfo_table_column_dindgen(lambda,
"WAVE"));
1094 check_nomsg(cpl_table_add_scalar(*lambda,
"WAVE",1.));
1095 check_nomsg(cpl_table_subtract_scalar(*lambda,
"WAVE",crpix_obj));
1096 check_nomsg(cpl_table_multiply_scalar(*lambda,
"WAVE",cdelt_obj));
1097 check_nomsg(cpl_table_add_scalar(*lambda,
"WAVE",crval_obj));
1102 cknull_nomsg(*lr41=sinfo_where_tab_min_max(*lambda,
1109 cknull_nomsg(*lr52=sinfo_where_tab_min_max(*lambda,
1116 cknull_nomsg(*lr63=sinfo_where_tab_min_max(*lambda,
1124 cknull_nomsg(*lr74=sinfo_where_tab_min_max(*lambda,
1131 cknull_nomsg(*lr20=sinfo_where_tab_min_max(*lambda,
1138 cknull_nomsg(*lr02=sinfo_where_tab_min_max(*lambda,
1146 cknull_nomsg(*lr85=sinfo_where_tab_min_max(*lambda,
1153 cknull_nomsg(*lr31=sinfo_where_tab_min_max(*lambda,
1160 cknull_nomsg(*lr42=sinfo_where_tab_min_max(*lambda,
1167 cknull_nomsg(*lr53=sinfo_where_tab_min_max(*lambda,
1174 cknull_nomsg(*lr64=sinfo_where_tab_min_max(*lambda,
1181 cknull_nomsg(*lr75=sinfo_where_tab_min_max(*lambda,
1188 cknull_nomsg(*lr86=sinfo_where_tab_min_max(*lambda,
1195 cknull_nomsg(*lr97=sinfo_where_tab_min_max(*lambda,
1202 cknull_nomsg(*lr00=sinfo_where_tab_min_max(*lambda,
1210 cknull_nomsg(*lrange=sinfo_where_tab_min_max(*lambda,
1214 CPL_NOT_GREATER_THAN,
1219 cknull_nomsg(add1=sinfo_where_tab_min_max(*lambda,
1223 CPL_NOT_GREATER_THAN,
1226 check_nomsg(nrow=cpl_table_get_nrow(*lrange));
1227 check_nomsg(cpl_table_insert(*lrange,add1,nrow));
1228 sinfo_free_table(&add1);
1230 cknull_nomsg(add1=sinfo_where_tab_min_max(*lambda,
1234 CPL_NOT_GREATER_THAN,
1238 check_nomsg(nrow=cpl_table_get_nrow(*lrange));
1239 check_nomsg(cpl_table_insert(*lrange,add1,nrow));
1240 sinfo_free_table(&add1);
1244 cknull_nomsg(*grange=sinfo_where_tab_min_max(*lambda,
1248 CPL_NOT_GREATER_THAN,
1254 cknull_nomsg(add1=sinfo_where_tab_min_max(*lambda,
1258 CPL_NOT_GREATER_THAN,
1261 check_nomsg(nrow=cpl_table_get_nrow(*grange));
1262 check_nomsg(cpl_table_insert(*grange,add1,nrow));
1263 sinfo_free_table(&add1);
1267 cknull_nomsg(add1=sinfo_where_tab_min_max(*lambda,
1271 CPL_NOT_GREATER_THAN,
1274 check_nomsg(nrow=cpl_table_get_nrow(*grange));
1275 check_nomsg(cpl_table_insert(*grange,add1,nrow));
1276 sinfo_free_table(&add1);
1280 cknull_nomsg(plist=cpl_propertylist_load(cpl_frame_get_filename(sky_frm),0));
1281 check_nomsg(crval_sky=sinfo_pfits_get_crval3(plist));
1282 check_nomsg(cdelt_sky=sinfo_pfits_get_cdelt3(plist));
1283 check_nomsg(crpix_sky=sinfo_pfits_get_crpix3(plist));
1286 check_nomsg(zsize_sky=sinfo_pfits_get_naxis3(plist));
1287 sinfo_free_propertylist(&plist);
1290 check_nomsg(*lambdas=cpl_table_new(zsize_sky));
1291 cpl_table_new_column(*lambdas,
"WAVE",CPL_TYPE_DOUBLE);
1292 check_nomsg(sinfo_table_column_dindgen(lambdas,
"WAVE"));
1294 check_nomsg(cpl_table_add_scalar(*lambdas,
"WAVE",1.));
1295 check_nomsg(cpl_table_subtract_scalar(*lambdas,
"WAVE",crpix_sky));
1296 check_nomsg(cpl_table_multiply_scalar(*lambdas,
"WAVE",cdelt_sky));
1297 check_nomsg(cpl_table_add_scalar(*lambdas,
"WAVE",crval_sky));
1299 check_nomsg(p=cpl_parameterlist_find(cfg,
"sinfoni.sinfo_utl_skycor.mask_ws"));
1300 check_nomsg(ws=cpl_parameter_get_double(p));
1301 check_nomsg(p=cpl_parameterlist_find(cfg,
"sinfoni.sinfo_utl_skycor.mask_we"));
1302 check_nomsg(we=cpl_parameter_get_double(p));
1303 if((ws != SINFO_MASK_WAVE_MIN) || (we != SINFO_MASK_WAVE_MAX)) {
1304 cknull_nomsg(*mrange=sinfo_where_tab_min_max(*lambda,
"WAVE",
1305 CPL_NOT_LESS_THAN,ws,
1306 CPL_NOT_GREATER_THAN,we));
1308 check_nomsg(*mrange=cpl_table_duplicate(*lrange));
1312 check_nomsg(cpl_table_duplicate_column(*lambda,
"WDIFF",*lambdas,
"WAVE"));
1313 check_nomsg(cpl_table_subtract_columns(*lambda,
"WDIFF",
"WAVE"));
1314 check_nomsg(mean=cpl_table_get_column_mean(*lambda,
"WDIFF"));
1315 check_nomsg(nrow=cpl_table_get_nrow(*lambda));
1317 if((fabs(nrow*mean) > 0) || (zsize_obj != zsize_sky)) {
1318 sinfo_msg(
"We have to interpolate sky frame - this is not good");
1326 sinfo_free_table(&add1);
1327 sinfo_free_table(&tmp_tbl);
1328 sinfo_free_propertylist(&plist);
1347 sinfo_table_column_dindgen(cpl_table** t,
const char* label)
1353 cknull(*t,
"Null input vector");
1354 check(sz=cpl_table_get_nrow(*t),
"Getting size of a vector");
1356 cpl_table_set(*t,label,i,(
double)i);
1380 sinfo_sum_spectra(
const cpl_frame* obj_frm,
1381 const cpl_frame* sky_frm,
1388 cpl_table** int_obj,
1389 cpl_table** int_sky)
1394 cpl_image* obj_slice=NULL;
1395 cpl_image* sky_slice=NULL;
1396 cpl_image* gslice=NULL;
1397 cpl_image* pos_tmp=NULL;
1398 cpl_image* msk_tmp=NULL;
1399 cpl_imagelist* obj=NULL;
1400 cpl_imagelist* sky=NULL;
1403 cpl_table* loop=NULL;
1404 cpl_table* opos_tbl=NULL;
1405 cpl_table* spos_tbl=NULL;
1406 cpl_table* tmp_tbl=NULL;
1407 cpl_table* loop_tbl=NULL;
1419 cknull_nomsg(obj=cpl_imagelist_load(cpl_frame_get_filename(obj_frm),
1420 CPL_TYPE_DOUBLE,0));
1421 cknull_nomsg(sky=cpl_imagelist_load(cpl_frame_get_filename(sky_frm),
1422 CPL_TYPE_DOUBLE,0));
1424 check_nomsg(zsize=cpl_imagelist_get_size(obj));
1425 check_nomsg(*int_obj = cpl_table_new(zsize));
1426 check_nomsg(*int_sky = cpl_table_new(zsize));
1427 check_nomsg(cpl_table_duplicate_column(*int_obj,
"WAVE",wrange,
"WAVE"));
1428 check_nomsg(cpl_table_duplicate_column(*int_sky,
"WAVE",wrange,
"WAVE"));
1429 check_nomsg(cpl_table_new_column(*int_obj,
"INT",CPL_TYPE_DOUBLE));
1430 check_nomsg(cpl_table_new_column(*int_sky,
"INT",CPL_TYPE_DOUBLE));
1431 check_nomsg(cpl_table_fill_column_window_double(*int_obj,
"INT",0,zsize,0));
1432 check_nomsg(cpl_table_fill_column_window_double(*int_sky,
"INT",0,zsize,0));
1436 cknull_nomsg(loop_tbl=sinfo_image2table(mask));
1437 check_nomsg(cpl_table_and_selected_double(loop_tbl,
"VALUE",
1438 CPL_GREATER_THAN,0.5));
1439 check_nomsg(loop=cpl_table_extract_selected(loop_tbl));
1440 sinfo_free_table(&loop_tbl);
1441 sinfo_free_table(&loop);
1444 for (i=0;i<zsize;i++) {
1445 check_nomsg(obj_slice = cpl_imagelist_get(obj,i));
1448 pos_i=sinfo_cnt_mask_thresh_and_obj_finite(mask,0.5,obj_slice);
1454 check_nomsg(cpl_table_set_double(*int_obj,
"INT",i,
1455 cpl_image_get_mean_window(obj_slice,
1463 check_nomsg(gslice = cpl_image_duplicate(obj_slice));
1464 check_nomsg(sinfo_image_flag_nan(&gslice));
1472 if(cpl_image_count_rejected(gslice) < 2048) {
1474 check_nomsg(med = cpl_image_get_median_window(gslice,llx,lly,urx,ury));
1475 check_nomsg(sdv = cpl_image_get_stdev_window(gslice,llx,lly,urx,ury));
1478 check_nomsg(cpl_image_threshold(gslice,med-3*sdv,med+3*sdv,0,0));
1479 check_nomsg(avg= cpl_image_get_mean_window(gslice,llx,lly,urx,ury));
1480 check_nomsg(cpl_table_set_double(*int_obj,
"INT",i,avg));
1482 check_nomsg(cpl_table_set_invalid(*int_obj,
"INT",i));
1485 sinfo_free_image(&gslice);
1491 check_nomsg(sky_slice = cpl_imagelist_get(sky,i));
1493 pos_i=sinfo_cnt_mask_thresh_and_obj_finite(mask,0.5,sky_slice);
1499 check_nomsg(cpl_table_set_double(*int_sky,
"INT",i,
1500 cpl_image_get_mean_window(sky_slice,
1507 check_nomsg(gslice = cpl_image_duplicate(sky_slice));
1508 check_nomsg(sinfo_image_flag_nan(&gslice));
1511 if(cpl_image_count_rejected(gslice) < 2048) {
1513 check_nomsg(med = cpl_image_get_median_window(gslice,llx,lly,urx,ury));
1514 check_nomsg(sdv = cpl_image_get_stdev_window(gslice,llx,lly,urx,ury));
1516 check_nomsg(cpl_image_threshold(gslice,med-3*sdv,med+3*sdv,0,0));
1517 check_nomsg(avg= cpl_image_get_mean_window(gslice,llx,lly,urx,ury));
1518 check_nomsg(cpl_table_set_double(*int_sky,
"INT",i,avg));
1520 check_nomsg(cpl_table_set_invalid(*int_sky,
"INT",i));
1522 sinfo_free_image(&gslice);
1534 sinfo_free_imagelist(&obj);
1535 sinfo_free_imagelist(&sky);
1541 sinfo_free_image(&gslice);
1542 sinfo_free_image(&pos_tmp);
1543 sinfo_free_image(&msk_tmp);
1544 sinfo_free_table(&tmp_tbl);
1545 sinfo_free_table(&opos_tbl);
1546 sinfo_free_table(&spos_tbl);
1547 sinfo_free_table(&loop_tbl);
1548 sinfo_free_table(&loop);
1549 sinfo_free_imagelist(&obj);
1550 sinfo_free_imagelist(&sky);
1574 sinfo_cnt_mask_thresh_and_obj_finite(
const cpl_image* mask,
1576 const cpl_image* obj)
1585 const double* pm=NULL;
1586 const double* po=NULL;
1588 check_nomsg(sxm=cpl_image_get_size_x(mask));
1589 check_nomsg(sym=cpl_image_get_size_y(mask));
1590 check_nomsg(sxo=cpl_image_get_size_x(obj));
1591 check_nomsg(syo=cpl_image_get_size_y(obj));
1592 if( sxm != sxo || sym != syo) {
1595 check_nomsg(pm=cpl_image_get_data_double_const(mask));
1596 check_nomsg(po=cpl_image_get_data_double_const(obj));
1598 for(i=0;i<sxm*sym;i++) {
1600 if( (pm[i] > t) && (!irplib_isnan(po[i]))) { cnt++; }
1629 sinfo_image_flag_nan(cpl_image** im)
1640 check_nomsg(sx=cpl_image_get_size_x(*im));
1641 check_nomsg(sy=cpl_image_get_size_y(*im));
1642 check_nomsg(pi=cpl_image_get_data_double(*im));
1646 if(irplib_isnan(pi[j*sx+i])) {
1647 check_nomsg(cpl_image_reject(*im,i+1,j+1));
1676 sinfo_object_estimate_noise(cpl_frame* obj_frm,
1677 const int obj_noise_fit,
1682 const int nbins=HISTO_NBINS;
1723 cpl_propertylist* plist=NULL;
1724 cpl_imagelist* obj_cub=NULL;
1725 cpl_table* data_tbl=NULL;
1726 cpl_table* histo=NULL;
1727 cpl_image* img=NULL;
1728 cpl_table* dist=NULL;
1729 cpl_table* min_xi=NULL;
1730 cpl_table* tmp_tbl1=NULL;
1731 cpl_table* tmp_tbl2=NULL;
1732 cpl_vector* vx=NULL;
1733 cpl_vector* vy=NULL;
1734 cpl_vector* sx=NULL;
1735 cpl_vector* sy=NULL;
1739 cknull_nomsg(plist=cpl_propertylist_load(cpl_frame_get_filename(obj_frm),0));
1740 check_nomsg(xsz=sinfo_pfits_get_naxis1(plist));
1741 check_nomsg(ysz=sinfo_pfits_get_naxis2(plist));
1742 check_nomsg(zsz=sinfo_pfits_get_naxis3(plist));
1743 sinfo_free_propertylist(&plist);
1745 cknull_nomsg(obj_cub=cpl_imagelist_load(cpl_frame_get_filename(obj_frm),
1746 CPL_TYPE_DOUBLE,0));
1749 check_nomsg(data_tbl=cpl_table_new(n));
1750 check_nomsg(cpl_table_new_column(data_tbl,
"DATA",CPL_TYPE_DOUBLE));
1753 for(k=0;k<zsz;k++) {
1754 check_nomsg(img=cpl_imagelist_get(obj_cub,k));
1755 check_nomsg(pdata=cpl_image_get_data(img));
1756 for(i=0;i<xsz*ysz;i++) {
1757 if(!irplib_isnan(pdata[i])) {
1758 cpl_table_set_double(data_tbl,
"DATA",r,pdata[i]);
1763 sinfo_free_imagelist(&obj_cub);
1765 check_nomsg(cpl_table_erase_invalid(data_tbl));
1766 check_nomsg(avg_d=cpl_table_get_column_mean(data_tbl,
"DATA"));
1767 check_nomsg(std_d=cpl_table_get_column_stdev(data_tbl,
"DATA"));
1770 hmin=avg_d-kappa*std_d;
1771 hmax=avg_d+kappa*std_d;
1774 sinfo_msg(
"Computes histogram");
1775 ck0(sinfo_histogram(data_tbl,nbins,hmin,hmax,&histo),
"building histogram");
1781 while(min_xi_sz < HISTO_MIN_SIZE && counter < 10) {
1785 check_nomsg(max_pos=sinfo_table_get_index_of_max(histo,
"HY",CPL_TYPE_INT));
1798 sinfo_free_table(&tmp_tbl1);
1801 check_nomsg(tmp_tbl1=sinfo_extract_table_rows(histo,
"HL",
1803 cpl_table_get(histo,
"HL",max_pos,&status)));
1804 thres=cpl_table_get_column_max(tmp_tbl1,
"HY")/HISTO_Y_CUT;
1808 sinfo_free_table(&min_xi);
1809 check_nomsg(min_xi=sinfo_extract_table_rows(tmp_tbl1,
"HY",
1810 CPL_GREATER_THAN,thres));
1816 min_xi_sz=cpl_table_get_nrow(min_xi);
1817 val=cpl_table_get(min_xi,
"HL",0,&status);
1819 check_nomsg(min_pos=sinfo_table_get_index_of_val(histo,
"HL",val,
1826 if (min_xi_sz > 0) {
1827 min_x = min_pos-HISTO_X_LEFT_CUT*(max_pos-min_pos);
1828 max_x = max_pos+HISTO_X_RIGHT_CUT*(max_pos-min_pos);
1832 check_nomsg(hmin=sinfo_table_column_interpolate(histo,
"HL",min_x));
1833 check_nomsg(hmax=sinfo_table_column_interpolate(histo,
"HL",max_x));
1836 sinfo_free_table(&histo);
1837 ck0(sinfo_histogram(data_tbl,nbins,hmin,hmax,&histo),
"building histogram");
1839 check_nomsg(cpl_table_add_scalar(histo,
"HL",(hmax-hmin)/nbins/2));
1845 sinfo_free_table(&data_tbl);
1846 sinfo_free_table(&min_xi);
1850 check_nomsg(peak=cpl_table_get_column_max(histo,
"HY"));
1852 sinfo_free_table(&tmp_tbl1);
1854 check_nomsg(tmp_tbl1=sinfo_extract_table_rows(histo,
"HY",CPL_EQUAL_TO,peak));
1859 check_nomsg(*centre=cpl_table_get_column_mean(tmp_tbl1,
"HL"));
1862 sinfo_free_table(&tmp_tbl1);
1863 check_nomsg(tmp_tbl1=sinfo_extract_table_rows(histo,
"HY",
1866 sinfo_free_table(&tmp_tbl2);
1867 check_nomsg(tmp_tbl2=sinfo_extract_table_rows(tmp_tbl1,
"HY",
1868 CPL_LESS_THAN,peak));
1869 sinfo_free_table(&tmp_tbl1);
1871 check_nomsg(tempc=*centre-cpl_table_get_column_min(tmp_tbl2,
"HL"));
1873 sinfo_free_table(&tmp_tbl2);
1875 check_nomsg(dist=sinfo_where_tab_min_max(histo,
"HL",
1876 CPL_GREATER_THAN,*centre-HISTO_DIST_TEMPC_MIN_FCT*tempc,
1877 CPL_NOT_GREATER_THAN,*centre+HISTO_DIST_TEMPC_MAX_FCT*tempc));
1879 offset=cpl_table_get_column_min(histo,
"HY");
1880 sinfo_free_table(&histo);
1883 check_nomsg(ndist=cpl_table_get_nrow(dist));
1884 check_nomsg(cpl_table_cast_column(dist,
"HY",
"HYdouble",CPL_TYPE_DOUBLE));
1885 check_nomsg(disth=cpl_table_get_data_double(dist,
"HYdouble"));
1886 check_nomsg(distx=cpl_table_get_data_double(dist,
"HL"));
1896 if(obj_noise_fit == 1) {
1897 check_nomsg(vy=cpl_vector_wrap(ndist,disth));
1898 check_nomsg(vx=cpl_vector_wrap(ndist,distx));
1899 check_nomsg(sx=cpl_vector_new(ndist));
1900 check_nomsg(cpl_vector_fill(sx,1.));
1901 check_nomsg(sy=cpl_vector_duplicate(sx));
1905 check_nomsg(cpl_vector_fit_gaussian(vx,NULL,
1908 &x0,&sigma,&area,&offset,
1916 sinfo_unwrap_vector(&vx);
1917 sinfo_unwrap_vector(&vy);
1918 sinfo_free_my_vector(&sx);
1919 sinfo_free_my_vector(&sy);
1921 sinfo_free_table(&dist);
1927 sinfo_free_imagelist(&obj_cub);
1928 sinfo_free_propertylist(&plist);
1929 sinfo_free_table(&min_xi);
1930 sinfo_free_table(&tmp_tbl1);
1931 sinfo_free_table(&tmp_tbl2);
1932 sinfo_free_table(&histo);
1933 sinfo_free_table(&dist);
1934 sinfo_free_table(&data_tbl);
1935 sinfo_free_my_vector(&sx);
1936 sinfo_free_my_vector(&sy);
1937 sinfo_unwrap_vector(&vx);
1938 sinfo_unwrap_vector(&vy);
1958 sinfo_where_tab_min_max(cpl_table* t,
1960 cpl_table_select_operator op1,
1962 cpl_table_select_operator op2,
1966 cpl_table* res=NULL;
1967 cpl_table* tmp=NULL;
1969 check_nomsg(cpl_table_and_selected_double(t,col,op1,v1));
1970 check_nomsg(tmp=cpl_table_extract_selected(t));
1971 check_nomsg(cpl_table_and_selected_double(tmp,col,op2,v2));
1972 check_nomsg(res=cpl_table_extract_selected(tmp));
1973 check_nomsg(cpl_table_select_all(t));
1974 sinfo_free_table(&tmp);
1979 sinfo_free_table(&tmp);
1980 sinfo_free_table(&res);
2012 sinfo_histogram(
const cpl_table* data,
2018 cpl_table* tmp_tbl1=NULL;
2019 cpl_table* tmp_tbl2=NULL;
2020 cpl_table* dat=NULL;
2033 check_nomsg(dat=cpl_table_duplicate(data));
2034 check_nomsg(cpl_table_cast_column(dat,
"DATA",
"DDATA",CPL_TYPE_DOUBLE));
2040 check_nomsg(cpl_table_and_selected_double(dat,
"DDATA",
2041 CPL_NOT_GREATER_THAN,max));
2045 check_nomsg(tmp_tbl1=cpl_table_extract_selected(dat));
2055 check_nomsg(cpl_table_and_selected_double(tmp_tbl1,
"DDATA",
2056 CPL_GREATER_THAN,min));
2057 check_nomsg(tmp_tbl2=cpl_table_extract_selected(tmp_tbl1));
2063 sinfo_free_table(&tmp_tbl1);
2071 check_nomsg(ntot=cpl_table_get_nrow(tmp_tbl2));
2074 check_nomsg(vmin=cpl_table_get_column_min(tmp_tbl2,
"DDATA"));
2075 check_nomsg(vmax=cpl_table_get_column_max(tmp_tbl2,
"DDATA"));
2076 vstp=(vmax-vmin)/(nbins-1);
2078 check_nomsg(*histo=cpl_table_new(nbins));
2079 check_nomsg(cpl_table_new_column(*histo,
"HX",CPL_TYPE_DOUBLE));
2080 check_nomsg(cpl_table_new_column(*histo,
"HL",CPL_TYPE_DOUBLE));
2081 check_nomsg(cpl_table_new_column(*histo,
"HY",CPL_TYPE_INT));
2084 check_nomsg(cpl_table_fill_column_window(*histo,
"HL",0,nbins,0));
2085 check_nomsg(cpl_table_fill_column_window(*histo,
"HY",0,nbins,0));
2087 check_nomsg(phy=cpl_table_get_data_int(*histo,
"HY"));
2089 check_nomsg(pdt=cpl_table_get_data_double(dat,
"DATA"));
2091 for(i=0;i<nbins;i++) {
2092 cpl_table_set_double(*histo,
"HX",i,(
double)i);
2094 cpl_table_set_double(*histo,
"HL",i,vtmp);
2098 for(i=0;i<ntot;i++) {
2099 h=floor((pdt[i]-vmin)/vstp);
2100 if((h<nbins) && (h>-1)) {
2106 sinfo_free_table(&tmp_tbl2);
2107 sinfo_free_table(&dat);
2112 sinfo_free_table(&tmp_tbl1);
2113 sinfo_free_table(&tmp_tbl2);
2114 sinfo_free_table(&dat);
2134 sinfo_object_flag_low_values(cpl_frame* obj_frm,
2137 cpl_imagelist** flag_data)
2148 cpl_propertylist* plist=NULL;
2149 cpl_table* data_tbl=NULL;
2150 cpl_table* flag_tbl=NULL;
2151 cpl_image* img=NULL;
2152 cpl_imagelist* obj_cub=NULL;
2158 cknull_nomsg(plist=cpl_propertylist_load(cpl_frame_get_filename(obj_frm),0));
2159 check_nomsg(xsz=sinfo_pfits_get_naxis1(plist));
2160 check_nomsg(ysz=sinfo_pfits_get_naxis2(plist));
2161 check_nomsg(zsz=sinfo_pfits_get_naxis3(plist));
2162 sinfo_free_propertylist(&plist);
2164 cknull_nomsg(obj_cub=cpl_imagelist_load(cpl_frame_get_filename(obj_frm),
2165 CPL_TYPE_DOUBLE,0));
2168 check_nomsg(data_tbl=cpl_table_new(n));
2169 check_nomsg(cpl_table_new_column(data_tbl,
"DATA",CPL_TYPE_DOUBLE));
2171 for(k=0;k<zsz;k++) {
2172 check_nomsg(img=cpl_imagelist_get(obj_cub,k));
2173 check_nomsg(pdata=cpl_image_get_data_double(img));
2174 for(i=0;i<xsz*ysz;i++) {
2175 if(!irplib_isnan(pdata[i])) {
2176 check_nomsg(cpl_table_set_double(data_tbl,
"DATA",r,pdata[i]));
2182 check_nomsg(cpl_table_erase_invalid(data_tbl));
2184 check_nomsg(cpl_table_and_selected_double(data_tbl,
"DATA",
2185 CPL_LESS_THAN,cnt+2*sig));
2186 check_nomsg(flag_tbl=cpl_table_extract_selected(data_tbl));
2187 sinfo_free_table(&data_tbl);
2190 sinfo_free_table(&flag_tbl);
2192 check_nomsg(*flag_data=cpl_imagelist_new());
2193 for(i=0;i<zsz;i++) {
2194 check_nomsg(img=cpl_image_new(xsz,ysz,CPL_TYPE_DOUBLE));
2195 check_nomsg(cpl_image_add_scalar(img,0));
2196 check_nomsg(cpl_imagelist_set(*flag_data,cpl_image_duplicate(img),i));
2197 sinfo_free_image(&img);
2199 for(k=0;k<zsz;k++) {
2200 check_nomsg(img=cpl_imagelist_get(*flag_data,k));
2201 pflag=cpl_image_get_data_double(cpl_imagelist_get(*flag_data,k));
2202 pdata=cpl_image_get_data_double(cpl_imagelist_get(obj_cub,k));
2203 for(i=0;i<xsz*ysz;i++) {
2204 if((!irplib_isnan(pdata[i])) && pdata[i] < (cnt+2*sig)) {
2210 sinfo_free_imagelist(&obj_cub);
2218 sinfo_free_propertylist(&plist);
2219 sinfo_free_imagelist(&obj_cub);
2220 sinfo_free_table(&data_tbl);
2221 sinfo_free_table(&flag_tbl);
2244 sinfo_object_flag_sky_pixels(cpl_frame* obj_frm,
2247 cpl_imagelist* flag_data,
2265 double* pr_img=NULL;
2266 double* pg_img=NULL;
2267 double* pimage=NULL;
2268 cpl_propertylist* plist=NULL;
2269 cpl_imagelist* osel=NULL;
2270 cpl_imagelist* fsel=NULL;
2271 cpl_table* gpix=NULL;
2272 cpl_table* gspec=NULL;
2273 cpl_table* fspec=NULL;
2274 cpl_table* ospec=NULL;
2276 cpl_imagelist* obj_cub=NULL;
2279 cknull_nomsg(plist=cpl_propertylist_load(cpl_frame_get_filename(obj_frm),0));
2281 check_nomsg(xsz=sinfo_pfits_get_naxis1(plist));
2282 check_nomsg(ysz=sinfo_pfits_get_naxis2(plist));
2284 sinfo_free_propertylist(&plist);
2285 cknull_nomsg(obj_cub=cpl_imagelist_load(cpl_frame_get_filename(obj_frm),
2286 CPL_TYPE_DOUBLE,0));
2290 check_nomsg(*r_img=cpl_image_new(xsz,ysz,CPL_TYPE_DOUBLE));
2291 check_nomsg(*g_img=cpl_image_new(xsz,ysz,CPL_TYPE_DOUBLE));
2292 check_nomsg(*image=cpl_image_new(xsz,ysz,CPL_TYPE_DOUBLE));
2294 cknull_nomsg(pr_img=cpl_image_get_data_double(*r_img));
2295 cknull_nomsg(pg_img=cpl_image_get_data_double(*g_img));
2296 cknull_nomsg(pimage=cpl_image_get_data_double(*image));
2309 cknull_nomsg(osel=sinfo_imagelist_select_range(obj_cub,lambda,
2312 sinfo_free_imagelist(&obj_cub);
2314 cknull_nomsg(fsel=sinfo_imagelist_select_range(flag_data,lambda,
2322 for(j=0;j<ysz;j++) {
2323 for(i=0;i<xsz;i++) {
2325 cknull_nomsg(ospec=sinfo_slice_z(osel,i,j));
2326 cknull_nomsg(fspec=sinfo_slice_z(fsel,i,j));
2328 check_nomsg(gpix_i=sinfo_table_extract_finite(ospec,fspec,&gpix,&gspec));
2332 all_pix=(double)gpix_i;
2350 check_nomsg(flag_pix=cpl_table_and_selected_double(gspec,
"VALUE",
2351 CPL_GREATER_THAN,0.5));
2355 ratio=flag_pix/all_pix;
2357 if(all_pix > cpl_table_get_nrow(mrange)/2) {
2359 pr_img[i+j*xsz]=ratio;
2362 check_nomsg(pimage[i+j*xsz]=cpl_table_get_column_mean(gpix,
"VALUE"));
2365 sinfo_free_table(&ospec);
2366 sinfo_free_table(&fspec);
2367 sinfo_free_table(&gpix);
2368 sinfo_free_table(&gspec);
2372 sinfo_free_imagelist(&osel);
2373 sinfo_free_imagelist(&fsel);
2384 check_nomsg(tot=cpl_image_get_flux(*g_img));
2394 sinfo_free_propertylist(&plist);
2395 sinfo_free_imagelist(&obj_cub);
2396 sinfo_free_imagelist(&osel);
2397 sinfo_free_imagelist(&fsel);
2398 sinfo_free_table(&ospec);
2399 sinfo_free_table(&fspec);
2400 sinfo_free_table(&gpix);
2401 sinfo_free_table(&gspec);
2417 sinfo_choose_good_sky_pixels(cpl_frame* obj_frm,
2420 const double min_frac,
2430 double thres=SKY_THRES;
2433 cpl_image* r2img=NULL;
2434 cpl_propertylist* plist=NULL;
2435 cpl_table* cum=NULL;
2436 cpl_table* hcum=NULL;
2437 cpl_table* thres_tbl=NULL;
2439 cknull_nomsg(plist=cpl_propertylist_load(cpl_frame_get_filename(obj_frm),0));
2440 check_nomsg(xsz=sinfo_pfits_get_naxis1(plist));
2441 check_nomsg(ysz=sinfo_pfits_get_naxis2(plist));
2443 sinfo_free_propertylist(&plist);
2446 check_nomsg(*mask=cpl_image_new(xsz,ysz,CPL_TYPE_DOUBLE));
2449 check_nomsg(r2img=cpl_image_duplicate(r_img));
2450 check_nomsg(cpl_image_threshold(r2img,thres,thres,0,1));
2451 check_nomsg(r2i=cpl_image_get_flux(r2img));
2454 sinfo_free_image(&(*mask));
2455 check_nomsg(*mask=cpl_image_duplicate(r2img));
2457 sinfo_free_image(&r2img);
2458 check_nomsg(r2img=cpl_image_duplicate(r_img));
2459 check_nomsg(cpl_image_threshold(r2img,thres,SINFO_DBL_MAX,0,SINFO_DBL_MAX));
2460 sinfo_free_image(&r2img);
2462 check_nomsg(tot=cpl_image_get_flux(g_img));
2465 sinfo_msg(
"%2.2d spaxels (%4.1f %% of good pixels) are designated as sky",
2469 if (1.*r2i/tot < min_frac) {
2470 sinfo_msg(
"this is too small - will increase it to %4.1f %%",
2472 check_nomsg(cum=cpl_table_new(xsz*ysz));
2473 check_nomsg(cpl_table_new_column(cum,
"X",CPL_TYPE_DOUBLE));
2474 sinfo_table_column_dindgen(&cum,
"X");
2475 check_nomsg(cpl_table_add_scalar(cum,
"X",1.));
2478 hcum = sinfo_image2table(r_img);
2479 check_nomsg(sinfo_sort_table_1(hcum,
"VALUE",FALSE));
2482 check_nomsg(cpl_table_duplicate_column(cum,
"H",hcum,
"VALUE"));
2483 check_nomsg(cum_x_max=cpl_table_get_column_max(cum,
"X"));
2484 check_nomsg(cpl_table_duplicate_column(cum,
"R",cum,
"X"));
2485 check_nomsg(cpl_table_divide_scalar(cum,
"R",cum_x_max));
2486 check_nomsg(cpl_table_and_selected_double(cum,
"R",
2489 check_nomsg(thres_tbl=cpl_table_extract_selected(cum));
2491 check_nomsg(thres = cpl_table_get(thres_tbl,
"R",0,&status));
2493 sinfo_free_image(&(*mask));
2496 check_nomsg(*mask=cpl_image_duplicate(r_img));
2497 check_nomsg(cpl_image_threshold(*mask,thres,thres,0,1));
2499 sinfo_free_table(&cum);
2500 sinfo_free_table(&hcum);
2501 sinfo_free_table(&thres_tbl);
2506 sinfo_free_propertylist(&plist);
2507 sinfo_free_image(&r2img);
2508 sinfo_free_table(&cum);
2509 sinfo_free_table(&hcum);
2510 sinfo_free_table(&thres_tbl);
2528 sinfo_fit_bkg(
double p[])
2534 cpl_vector* vtmp=NULL;
2541 check_nomsg(px= cpl_vector_get_data(sa_vx));
2542 check_nomsg(py= cpl_vector_get_data(sa_vy));
2543 check_nomsg(np= cpl_vector_get_size(sa_vx));
2544 check_nomsg(vtmp=cpl_vector_duplicate(sa_vy));
2545 check_nomsg(pv=cpl_vector_get_data(vtmp));
2548 pv[i]=sinfo_fac(px[i],p[2]);
2551 check_nomsg(max=cpl_vector_get_max(vtmp));
2553 check_nomsg(cpl_vector_divide_scalar(vtmp,max));
2554 check_nomsg(cpl_vector_multiply_scalar(vtmp,p[1]));
2555 check_nomsg(cpl_vector_add_scalar(vtmp,p[0]));
2560 chi2+=(py[i]-pv[i])*(py[i]-pv[i]);
2562 sinfo_free_my_vector(&vtmp);
2565 sinfo_free_my_vector(&vtmp);
2586 sinfo_thermal_background2(cpl_table* int_sky,
2597 cpl_table* tmp1=NULL;
2598 cpl_table* tmp2=NULL;
2622 ap=(
double**) cpl_calloc(MP,
sizeof(
double*));
2625 ap[i]=cpl_calloc(NP,
sizeof(
double));
2628 cknull(int_sky,
"Null input table sky");
2629 cknull(lambda,
"Null input table lambda");
2630 cknull(lrange,
"Null input table lrange");
2634 check_nomsg(wmin=cpl_table_get_column_min(lrange,
"WAVE"));
2635 check_nomsg(wmax=cpl_table_get_column_max(lrange,
"WAVE"));
2636 check_nomsg(cpl_table_and_selected_double(int_sky,
"WAVE",
2637 CPL_NOT_LESS_THAN,wmin));
2638 check_nomsg(cpl_table_and_selected_double(int_sky,
"WAVE",
2639 CPL_NOT_GREATER_THAN,wmax));
2640 check_nomsg(tmp1=cpl_table_extract_selected(int_sky));
2642 check_nomsg(row=sinfo_table_get_index_of_val(tmp1,
"WAVE",
2643 wmax,CPL_TYPE_DOUBLE));
2644 check_nomsg(max=cpl_table_get_double(tmp1,
"INT",row,&status));
2645 check_nomsg(sinfo_table_flag_nan(&tmp1,
"INT"));
2646 check_nomsg(cpl_table_erase_invalid(tmp1));
2647 check_nomsg(cpl_table_and_selected_double(tmp1,
"INT",CPL_NOT_EQUAL_TO,0));
2648 check_nomsg(tmp2=cpl_table_extract_selected(tmp1));
2650 sinfo_free_table(&tmp1);
2651 check_nomsg(n2=cpl_table_get_nrow(tmp2));
2652 check_nomsg(sa_vx=cpl_vector_wrap(n2,
2653 cpl_table_get_data_double(tmp2,
"WAVE")));
2654 check_nomsg(sa_vy=cpl_vector_wrap(n2,
2655 cpl_table_get_data_double(tmp2,
"INT")));
2664 check_nomsg(bkg_min=cpl_table_get_column_min(tmp2,
"INT"));
2665 check_nomsg(bkg_max=cpl_table_get_double(tmp2,
"INT",row,&status));
2676 ap[0][0]=p0_min; ap[0][1]=p1_min; ap[0][2]=p2_min;
2677 ap[1][0]=p0_max; ap[1][1]=p1_min; ap[1][2]=p2_min;
2678 ap[2][0]=p0_min; ap[2][1]=p1_max; ap[2][2]=p2_min;
2679 ap[3][0]=p0_min; ap[3][1]=p1_min; ap[3][2]=p2_max;
2681 sinfo_msg(
"Before amoeba fit");
2684 sinfo_msg(
"ap[%d][%d]=%g",i,j,ap[i][j]);
2695 y[i]=sinfo_fit_bkg(p0);
2698 sinfo_msg(
"p0=%g %g %g",p0[0],p0[1],p0[2]);
2699 for(i=0;i<N_ITER_FIT_AMOEBA;i++) {
2700 check_nomsg(sinfo_fit_amoeba(ap,y,NP,AMOEBA_FTOL,sinfo_fit_bkg,&nfunc));
2701 sinfo_msg(
"After amoeba fit");
2702 sinfo_msg(
"iter=%d ap=%g %g %g",i,ap[0][0],ap[0][1],ap[0][2]);
2704 sinfo_unwrap_vector(&sa_vx);
2705 sinfo_unwrap_vector(&sa_vy);
2706 sinfo_free_table(&tmp2);
2709 sinfo_msg(
"After amoeba fit");
2712 sinfo_msg(
"ap[%d][%d]=%g",i,j,ap[i][j]);
2714 sinfo_msg(
"y[%d]=%g",i,y[i]);
2719 check_nomsg(nrow=cpl_table_get_nrow(lambda));
2720 check_nomsg(*bkg=cpl_table_new(nrow));
2721 check_nomsg(cpl_table_duplicate_column(*bkg,
"WAVE",lambda,
"WAVE"));
2722 check_nomsg(cpl_table_new_column(*bkg,
"INT2",CPL_TYPE_DOUBLE));
2723 cpl_table_fill_column_window(*bkg,
"INT2",0,nrow,0.);
2724 check_nomsg(pw=cpl_table_get_data_double(*bkg,
"WAVE"));
2725 check_nomsg(pf=cpl_table_get_data_double(*bkg,
"INT2"));
2727 for(i=0;i<nrow;i++) {
2728 pf[i]=sinfo_fac(pw[i],ap[0][2]);
2730 check_nomsg(max=cpl_table_get_column_max(*bkg,
"INT2"));
2733 check_nomsg(cpl_table_divide_scalar(*bkg,
"INT2",max));
2735 check_nomsg(cpl_table_multiply_scalar(*bkg,
"INT2",ap[0][1]));
2736 check_nomsg(cpl_table_add_scalar(*bkg,
"INT2",ap[0][0]));
2739 sinfo_new_destroy_2Ddoublearray(&ap,MP);
2745 sinfo_new_destroy_2Ddoublearray(&ap,MP);
2746 sinfo_free_table(&tmp1);
2747 sinfo_free_table(&tmp2);
2748 sinfo_unwrap_vector(&sa_vx);
2749 sinfo_unwrap_vector(&sa_vy);
2771 sinfo_thermal_background(cpl_table* int_sky,
2776 const int filter_width,
2812 cpl_vector *a = cpl_vector_new(ndim);
2813 cpl_table* xlr=NULL;
2814 cpl_table* ylr=NULL;
2815 cpl_table* wlr=NULL;
2816 cpl_table* tmp=NULL;
2817 cpl_table* temp2_tbl=NULL;
2820 cpl_vector* fy=NULL;
2822 cpl_vector* sy=NULL;
2824 cpl_matrix* x_matrix=NULL;
2839 check_nomsg(wmin=cpl_table_get_column_min(lrange,
"WAVE"));
2840 check_nomsg(wmax=cpl_table_get_column_max(lrange,
"WAVE"));
2843 bkg_max=sinfo_fac(wmax,temp);
2848 check_nomsg(cpl_table_and_selected_double(lambda,
"WAVE",
2849 CPL_NOT_LESS_THAN,wmin));
2850 check_nomsg(tmp=cpl_table_extract_selected(lambda));
2852 check_nomsg(cpl_table_and_selected_double(tmp,
"WAVE",
2853 CPL_NOT_GREATER_THAN,wmax));
2854 check_nomsg(xlr=cpl_table_extract_selected(tmp));
2855 sinfo_free_table(&tmp);
2858 check_nomsg(cpl_table_and_selected_double(int_sky,
"WAVE",
2859 CPL_NOT_LESS_THAN,wmin));
2860 check_nomsg(tmp=cpl_table_extract_selected(int_sky));
2861 check_nomsg(cpl_table_and_selected_double(tmp,
"WAVE",
2862 CPL_NOT_GREATER_THAN,wmax));
2866 check_nomsg(cpl_table_and_selected_double(tmp,
"INT",CPL_GREATER_THAN,-2));
2867 check_nomsg(ylr=cpl_table_extract_selected(tmp));
2869 sinfo_free_table(&tmp);
2870 check_nomsg(tmp=cpl_table_duplicate(ylr));
2871 sinfo_free_table(&ylr);
2873 check_nomsg(avg=cpl_table_get_column_mean(tmp,
"INT"));
2874 check_nomsg(sdv=cpl_table_get_column_stdev(tmp,
"INT"));
2875 check_nomsg(cpl_table_and_selected_double(tmp,
"INT",
2876 CPL_LESS_THAN,avg+10*sdv));
2878 check_nomsg(ylr=cpl_table_extract_selected(tmp));
2879 sinfo_free_table(&tmp);
2886 check_nomsg(cpl_table_and_selected_double(ylr,
"INT",CPL_NOT_EQUAL_TO,0));
2888 check_nomsg(wlr=cpl_table_extract_selected(ylr));
2891 check_nomsg(p0[0]=cpl_table_get_column_min(wlr,
"INT"));
2892 check_nomsg(row=sinfo_table_get_index_of_val(ylr,
"WAVE",
2893 wmax,CPL_TYPE_DOUBLE));
2894 check_nomsg(p0[1]=cpl_table_get_double(ylr,
"INT",row,&status));
2904 check_nomsg(sinfo_table_flag_nan(&wlr,
"INT"));
2905 check_nomsg(cpl_table_erase_invalid(wlr));
2911 check_nomsg(NPOINTS=cpl_table_get_nrow(ylr));
2913 check_nomsg(x_matrix = cpl_matrix_wrap(NPOINTS,1,
2914 cpl_table_get_data_double(ylr,
"WAVE")));
2915 check_nomsg(y=cpl_vector_wrap(NPOINTS,cpl_table_get_data_double(ylr,
"INT")));
2919 check_nomsg(fy=sinfo_sky_background_estimate(y,filter_width,filter_width));
2921 pif=cpl_vector_get_data(fy);
2922 pwf=cpl_table_get_data_double(ylr,
"WAVE");
2925 check_nomsg(cpl_table_new_column(int_sky,
"INT_BKG_SMO",CPL_TYPE_DOUBLE));
2926 check_nomsg(cpl_table_new_column(int_sky,
"WAVE_SMO",CPL_TYPE_DOUBLE));
2927 pws=cpl_table_get_data_double(int_sky,
"WAVE");
2931 check_nomsg(nrow=cpl_table_get_nrow(int_sky));
2932 if((pws[0]-pwf[0])>0) {
2933 for(i=0;i<NPOINTS;i++) {
2934 if(fabs(pws[k]-pwf[i]) < tol) {
2935 check_nomsg(cpl_table_set_double(int_sky,
"INT_BKG_SMO",k,pif[i]));
2936 check_nomsg(cpl_table_set_double(int_sky,
"WAVE_SMO",k,pws[i]));
2941 for(k=0;k<nrow;k++) {
2942 if((i<NPOINTS) && (fabs(pws[k]-pwf[i]) < tol)) {
2943 check_nomsg(cpl_table_set_double(int_sky,
"INT_BKG_SMO",k,pif[i]));
2944 check_nomsg(cpl_table_set_double(int_sky,
"WAVE_SMO",k,pws[i]));
2954 check_nomsg(cpl_vector_set(a, 0, ga0));
2955 check_nomsg(cpl_vector_set(a, 1, ga1));
2956 check_nomsg(cpl_vector_set(a, 2, ga2));
2958 check_nomsg(sy=cpl_vector_duplicate(y));
2959 check_nomsg(cpl_vector_power(sy,2));
2960 check_nomsg(cpl_vector_power(sy,0.5));
2968 for(i=0;i<niter;i++) {
2976 if(CPL_ERROR_NONE != sinfo_fit_lm(x_matrix,NULL,fy,sy,a,ia,sinfo_fitbkg,
2977 sinfo_fitbkg_derivative,
2978 &mse,&chired,NULL)) {
2999 sinfo_msg(
"Last fit: a=%g %g %g chired=%g",
3000 cpl_vector_get(a,0),
3001 cpl_vector_get(a,1),
3002 cpl_vector_get(a,2),
3005 sinfo_free_my_vector(&fy);
3006 sinfo_unwrap_vector(&y);
3007 sinfo_free_my_vector(&sy);
3008 sinfo_unwrap_matrix(&x_matrix);
3009 sinfo_free_table(&xlr);
3010 sinfo_free_table(&ylr);
3011 sinfo_free_table(&wlr);
3013 ga0=cpl_vector_get(a,0);
3014 ga1=cpl_vector_get(a,1);
3015 ga2=cpl_vector_get(a,2);
3017 check_nomsg(npix=cpl_table_get_nrow(lrange));
3018 check_nomsg(pw=cpl_table_get_data_double(lrange,
"WAVE"));
3019 check_nomsg(temp2_tbl=cpl_table_new(npix));
3020 check_nomsg(cpl_table_new_column(temp2_tbl,
"TEMP2",CPL_TYPE_DOUBLE));
3022 for(i=0;i<npix;i++) {
3023 temp2=sinfo_fac(pw[i],ga2);
3024 check_nomsg(cpl_table_set_double(temp2_tbl,
"TEMP2",i,temp2));
3026 check_nomsg(max_tmp2=cpl_table_get_column_max(temp2_tbl,
"TEMP2"));
3027 sinfo_free_table(&temp2_tbl);
3031 check_nomsg(npix=cpl_table_get_nrow(lambda));
3032 check_nomsg(pw=cpl_table_get_data_double(lambda,
"WAVE"));
3033 check_nomsg(*bkg=cpl_table_new(npix));
3034 check_nomsg(cpl_table_new_column(*bkg,
"WAVE",CPL_TYPE_DOUBLE));
3035 check_nomsg(cpl_table_new_column(*bkg,
"TEMP1",CPL_TYPE_DOUBLE));
3036 check_nomsg(cpl_table_new_column(*bkg,
"INT",CPL_TYPE_DOUBLE));
3037 check_nomsg(cpl_table_new_column(*bkg,
"INT2",CPL_TYPE_DOUBLE));
3039 for(i=0;i<npix;i++) {
3040 check_nomsg(cpl_table_set_double(*bkg,
"WAVE",i,pw[i]));
3041 temp1=sinfo_fac(pw[i],ga2);
3042 check_nomsg(cpl_table_set_double(*bkg,
"TEMP1",i,temp1));
3045 check_nomsg(ptmp1=cpl_table_get_data_double(*bkg,
"TEMP1"));
3048 for(i=0;i<npix;i++) {
3049 thermal=ga0+ptmp1[i]/max_tmp2*ga1;
3050 check_nomsg(cpl_table_set_double(*bkg,
"INT",i,thermal));
3051 thermal=ga0+ga1*sinfo_fac(pw[i],ga2);
3052 check_nomsg(cpl_table_set_double(*bkg,
"INT2",i,thermal));
3054 sinfo_free_my_vector(&a);
3060 check_nomsg(npix=cpl_table_get_nrow(lambda));
3061 check_nomsg(*bkg=cpl_table_new(npix));
3062 check_nomsg(cpl_table_new_column(*bkg,
"TEMP1",CPL_TYPE_DOUBLE));
3063 check_nomsg(cpl_table_new_column(*bkg,
"INT",CPL_TYPE_DOUBLE));
3064 check_nomsg(cpl_table_new_column(*bkg,
"INT2",CPL_TYPE_DOUBLE));
3066 med=cpl_table_get_column_median(ylr,
"INT");
3067 for(i=0;i<npix;i++) {
3068 check_nomsg(cpl_table_set_double(*bkg,
"INT",i,med));
3069 check_nomsg(cpl_table_set_double(*bkg,
"INT2",i,med));
3072 sinfo_free_my_vector(&a);
3073 sinfo_unwrap_vector(&y);
3074 sinfo_free_my_vector(&sy);
3075 sinfo_unwrap_matrix(&x_matrix);
3076 sinfo_free_table(&xlr);
3077 sinfo_free_table(&ylr);
3078 sinfo_free_table(&wlr);
3079 sinfo_free_table(&tmp);
3085 sinfo_free_my_vector(&a);
3086 sinfo_unwrap_vector(&y);
3087 sinfo_free_my_vector(&sy);
3088 sinfo_unwrap_matrix(&x_matrix);
3090 sinfo_free_table(&xlr);
3091 sinfo_free_table(&ylr);
3092 sinfo_free_table(&wlr);
3093 sinfo_free_table(&tmp);
3094 sinfo_free_table(&temp2_tbl);
3112 sinfo_filter_min(
const cpl_vector* vi,
const int size)
3115 cpl_vector* vo=NULL;
3122 const double* pi=NULL;
3124 cknull(vi,
"null input vector");
3125 pi=cpl_vector_get_data_const(vi);
3126 length=cpl_vector_get_size(vi);
3128 vo=cpl_vector_new(length);
3129 po=cpl_vector_get_data(vo);
3131 for(i=start; i < end; i++) {
3133 for(j=i-start+1;j<i+start+1;j++) {
3143 for (i = 0; i < start; i++) {
3147 for (i = end; i < length; i++) {
3171 sinfo_filter_max(
const cpl_vector* vi,
const int size)
3174 cpl_vector* vo=NULL;
3181 const double* pi=NULL;
3184 cknull(vi,
"null input vector");
3185 pi=cpl_vector_get_data_const(vi);
3186 length=cpl_vector_get_size(vi);
3188 vo=cpl_vector_new(length);
3189 po=cpl_vector_get_data(vo);
3191 for(i=start; i < end; i++) {
3193 for(j=i-start+1;j<i+start+1;j++) {
3203 for (i = 0; i < start; i++) {
3207 for (i = end; i < length; i++) {
3232 sinfo_filter_smo(
const cpl_vector* vi,
const int size)
3242 const double* pi=NULL;
3244 cpl_vector* vo=NULL;
3246 cknull(vi,
"null input vector");
3247 length=cpl_vector_get_size(vi);
3249 vo=cpl_vector_new(length);
3250 pi=cpl_vector_get_data_const(vi);
3251 po=cpl_vector_get_data(vo);
3253 for(i=start; i < end; i++) {
3255 for(j=i - start;j<i+start+1;j++) {
3263 for (i = 0; i < start; i++) {
3267 for (i = end; i < length; i++) {
3333 cpl_vector* sinfo_sky_background_estimate(cpl_vector *spectrum,
3338 cpl_vector * minf=NULL;
3339 cpl_vector * maxf=NULL;
3340 cpl_vector * smof=NULL;
3341 cpl_vector * back=NULL;
3349 cknull(spectrum,
"null input data");
3356 check_nomsg(length=cpl_vector_get_size(spectrum));
3358 if (msize < 3 || fsize < msize || length < 2*fsize)
3362 cknull_nomsg(minf = sinfo_filter_min(spectrum, msize));
3363 cknull_nomsg(smof = sinfo_filter_smo(minf, fsize));
3364 cpl_vector_delete(minf);
3365 cknull_nomsg(maxf = sinfo_filter_max(smof,2*msize+1));
3366 cpl_vector_delete(smof);
3367 cknull_nomsg(smof = sinfo_filter_smo(maxf, 2*fsize+1));
3368 cpl_vector_delete(maxf);
3369 cknull_nomsg(minf = sinfo_filter_min(smof, 2*msize+1));
3370 cpl_vector_delete(smof);
3371 cknull_nomsg(smof = sinfo_filter_smo(minf, 2*fsize+1));
3372 cpl_vector_delete(minf);
3373 cknull_nomsg(back=cpl_vector_new(length));
3374 cknull_nomsg(pb=cpl_vector_get_data(back));
3375 cknull_nomsg(ps=cpl_vector_get_data(smof));
3377 for (i = 0; i < length; i++) {
3380 cpl_vector_delete(smof);
3401 sinfo_slice_z(
const cpl_imagelist* cin,
const int i,
const int j)
3407 cpl_table* tout=NULL;
3408 const cpl_image* img=NULL;
3409 const double* pim=NULL;
3411 cknull(cin,
"null input imagelist");
3412 check_nomsg(sz=cpl_imagelist_get_size(cin));
3413 check_nomsg(img=cpl_imagelist_get_const(cin,0));
3414 check_nomsg(sx=cpl_image_get_size_x(img));
3416 check_nomsg(tout=cpl_table_new(sz));
3417 check_nomsg(cpl_table_new_column(tout,
"VALUE",CPL_TYPE_DOUBLE));
3419 check_nomsg(img=cpl_imagelist_get_const(cin,k));
3420 check_nomsg(pim=cpl_image_get_data_double_const(img));
3421 check_nomsg(cpl_table_set(tout,
"VALUE",k,pim[j*sx+i]));
3426 sinfo_free_table(&tout);
3443 sinfo_xcorr(cpl_table* int_obj,
3446 const double dispersion,
3447 const double line_hw)
3451 cpl_table* tmp_sky=NULL;
3453 cpl_table* z_diff=NULL;
3454 cpl_table* z_pos=NULL;
3478 cpl_table* z_good=NULL;
3479 cpl_table* w_tbl=NULL;
3480 cpl_table* o_tbl=NULL;
3481 cpl_table* s_tbl=NULL;
3482 cpl_vector* vw=NULL;
3483 cpl_vector* vs=NULL;
3484 cpl_vector* vo=NULL;
3485 cpl_vector* sx=NULL;
3486 cpl_vector* sy=NULL;
3515 cpl_polynomial* cfit=NULL;
3517 cpl_vector* vx=NULL;
3518 cpl_vector* vy=NULL;
3521 cpl_error_code error_code=CPL_ERROR_NONE;
3527 zsize=cpl_table_get_nrow(int_obj);
3528 check_nomsg(z = cpl_table_duplicate(int_sky));
3529 ck0_nomsg(sinfo_table_flag_nan(&z,
"INT"));
3531 check_nomsg(z_mean=cpl_table_get_column_mean(z,
"INT"));
3533 check_nomsg(cpl_table_multiply_scalar(z,
"INT",-1));
3539 check_nomsg(tmp_sky=cpl_table_duplicate(int_sky));
3540 ck0_nomsg(sinfo_table_flag_nan(&tmp_sky,
"INT"));
3541 check_nomsg(sky_max=cpl_table_get_column_max(tmp_sky,
"INT"));
3542 sinfo_free_table(&tmp_sky);
3545 check_nomsg(nrow=cpl_table_get_nrow(z));
3546 check_nomsg(pint=cpl_table_get_data_double(z,
"INT"));
3547 check_nomsg(sky_max=cpl_table_get_column_max(z,
"INT"));
3548 for(i=0;i<nrow;i++) {
3549 if(pint[i]<sky_max/SKY_LINE_MIN_CUT) {
3558 check_nomsg(z_diff=cpl_table_duplicate(z));
3559 check_nomsg(cpl_table_duplicate_column(z_diff,
"INT1",z,
"INT"));
3560 check_nomsg(cpl_table_duplicate_column(z_diff,
"INT2",z,
"INT"));
3561 check_nomsg(cpl_table_shift_column(z_diff,
"INT1",-1));
3562 check_nomsg(cpl_table_duplicate_column(z_diff,
"DIFF",z_diff,
"INT2"));
3563 check_nomsg(cpl_table_subtract_columns(z_diff,
"DIFF",
"INT1"));
3565 check_nomsg(cpl_table_erase_window(z_diff,nrow-2,2));
3570 check_nomsg(cpl_table_new_column(z_diff,
"POS",CPL_TYPE_INT));
3571 check_nomsg(cpl_table_fill_column_window_int(z_diff,
"POS",0,nrow,0));
3573 check_nomsg(pint=cpl_table_get_data_double(z_diff,
"DIFF"));
3574 check_nomsg(ppos=cpl_table_get_data_int(z_diff,
"POS"));
3575 check_nomsg(nrow=cpl_table_get_nrow(z_diff));
3576 for(i=1;i<nrow;i++) {
3577 if(!irplib_isnan(pint[i]) && (pint[i]>0 && pint[i-1]<0)) {
3584 check_nomsg(cpl_table_select_all(z_diff));
3585 check_nomsg(cpl_table_and_selected_int(z_diff,
"POS",CPL_GREATER_THAN,0));
3586 check_nomsg(z_pos=cpl_table_extract_selected(z_diff));
3587 sinfo_free_table(&z_diff);
3601 check_nomsg(npos=cpl_table_get_nrow(z_pos));
3603 check_nomsg(cpl_table_new_column(z_pos,
"STATUS_S",CPL_TYPE_INT));
3604 check_nomsg(cpl_table_new_column(z_pos,
"STATUS_O",CPL_TYPE_INT));
3605 check_nomsg(cpl_table_fill_column_window_int(z_pos,
"STATUS_S",0,npos,0));
3606 check_nomsg(cpl_table_fill_column_window_int(z_pos,
"STATUS_O",0,npos,0));
3607 check_nomsg(cpl_table_new_column(z_pos,
"SIGS",CPL_TYPE_DOUBLE));
3608 check_nomsg(cpl_table_new_column(z_pos,
"WAVES",CPL_TYPE_DOUBLE));
3609 check_nomsg(cpl_table_new_column(z_pos,
"BKGS",CPL_TYPE_DOUBLE));
3610 check_nomsg(cpl_table_new_column(z_pos,
"AREAS",CPL_TYPE_DOUBLE));
3611 check_nomsg(cpl_table_new_column(z_pos,
"AMPS",CPL_TYPE_DOUBLE));
3614 check_nomsg(cpl_table_new_column(z_pos,
"SIGO",CPL_TYPE_DOUBLE));
3615 check_nomsg(cpl_table_new_column(z_pos,
"WAVEO",CPL_TYPE_DOUBLE));
3616 check_nomsg(cpl_table_new_column(z_pos,
"BKGO",CPL_TYPE_DOUBLE));
3617 check_nomsg(cpl_table_new_column(z_pos,
"AREAO",CPL_TYPE_DOUBLE));
3618 check_nomsg(cpl_table_new_column(z_pos,
"AMPO",CPL_TYPE_DOUBLE));
3620 check_nomsg(cpl_table_new_column(z_pos,
"WAVEC",CPL_TYPE_DOUBLE));
3621 check_nomsg(cpl_table_new_column(z_pos,
"WDIF",CPL_TYPE_DOUBLE));
3622 check_nomsg(cpl_table_new_column(z_pos,
"ERR",CPL_TYPE_DOUBLE));
3634 for (jz=0;jz<npos;jz++) {
3635 check_nomsg(z1 = cpl_table_get_int(z_pos,
"POS",jz,&status));
3638 if((z1-z_ext) > 0 && (z1+z_ext) < zsize) {
3639 check_nomsg(cpl_table_select_all(int_sky));
3640 check_nomsg(cpl_table_select_all(int_obj));
3641 check_nomsg(cpl_table_select_all(lambda));
3642 check_nomsg(cpl_table_and_selected_window(int_sky,z1-z_ext,nfit));
3643 check_nomsg(s_tbl=cpl_table_extract_selected(int_sky));
3644 check_nomsg(cpl_table_and_selected_window(lambda,z1-z_ext,nfit));
3645 check_nomsg(w_tbl=cpl_table_extract_selected(lambda));
3646 check_nomsg(cpl_table_and_selected_window(int_obj,z1-z_ext,nfit));
3647 check_nomsg(o_tbl=cpl_table_extract_selected(int_obj));
3650 check_nomsg(vw=cpl_vector_wrap(nfit,
3651 cpl_table_get_data_double(w_tbl,
"WAVE")));
3652 check_nomsg(vs=cpl_vector_wrap(nfit,
3653 cpl_table_get_data_double(s_tbl,
"INT")));
3654 check_nomsg(vo=cpl_vector_wrap(nfit,
3655 cpl_table_get_data_double(o_tbl,
"INT")));
3658 check_nomsg(sx=cpl_vector_new(nfit));
3659 check_nomsg(cpl_vector_fill(sx,10.));
3660 check_nomsg(sy=cpl_vector_duplicate(sx));
3664 o1=cpl_vector_get(vo,0);
3665 o2=cpl_vector_get(vo,nfit-1);
3667 om=cpl_vector_get_median_const(vo);
3669 cpl_vector_multiply_scalar(vo,-1.);
3671 check_nomsg(ws=cpl_table_get_double(lambda,
"WAVE",z1,&status));
3672 check_nomsg(amp_s=cpl_table_get_double(z_pos,
"INT",jz,&status));
3674 sig_s=z_ext*dispersion;
3676 area_s=sinfo_gaussian_area(amp_s,sig_s,ws,wc_s,bkg_s);
3682 error_code=cpl_vector_fit_gaussian(vw,NULL,
3688 if(error_code == CPL_ERROR_NONE) {
3689 amp_s=sinfo_gaussian_amp(area_s,sig_s,ws,wc_s,bkg_s);
3690 check_nomsg(cpl_table_set_double(z_pos,
"WAVES",jz,wc_s));
3691 check_nomsg(cpl_table_set_double(z_pos,
"SIGS",jz,sig_s));
3692 check_nomsg(cpl_table_set_double(z_pos,
"AREAS",jz,area_s));
3693 check_nomsg(cpl_table_set_double(z_pos,
"BKGS",jz,bkg_s));
3694 check_nomsg(cpl_table_set_double(z_pos,
"AMPS",jz,amp_s));
3703 }
else if (error_code == CPL_ERROR_CONTINUE) {
3705 amp_s=sinfo_gaussian_amp(area_s,sig_s,ws,wc_s,bkg_s);
3706 check_nomsg(cpl_table_set_double(z_pos,
"WAVES",jz,wc_s));
3707 check_nomsg(cpl_table_set_double(z_pos,
"SIGS",jz,sig_s));
3708 check_nomsg(cpl_table_set_double(z_pos,
"AREAS",jz,area_s));
3709 check_nomsg(cpl_table_set_double(z_pos,
"BKGS",jz,bkg_s));
3710 check_nomsg(cpl_table_set_double(z_pos,
"AMPS",jz,amp_s));
3711 check_nomsg(cpl_table_set_int(z_pos,
"STATUS_S",jz,-1));
3714 check_nomsg(cpl_table_set_double(z_pos,
"WAVES",jz,wc_s));
3715 check_nomsg(cpl_table_set_double(z_pos,
"SIGS",jz,sig_s));
3716 check_nomsg(cpl_table_set_double(z_pos,
"AREAS",jz,area_s));
3717 check_nomsg(cpl_table_set_double(z_pos,
"BKGS",jz,bkg_s));
3718 check_nomsg(cpl_table_set_double(z_pos,
"AMPS",jz,amp_s));
3719 check_nomsg(cpl_table_set_int(z_pos,
"STATUS_S",jz,-2));
3721 check_nomsg(wo=cpl_table_get_double(lambda,
"WAVE",z1,&status));
3722 check_nomsg(amp_o=cpl_table_get_double(z_pos,
"INT",jz,&status));
3724 sig_o=z_ext*dispersion;
3726 area_o=sinfo_gaussian_area(amp_o,sig_o,wo,wc_o,bkg_o);
3727 error_code = cpl_vector_fit_gaussian(vw,NULL,
3734 if(error_code == CPL_ERROR_NONE) {
3736 amp_o=sinfo_gaussian_amp(area_o,sig_o,wo,wc_o,bkg_o);
3737 check_nomsg(cpl_table_set_double(z_pos,
"WAVEO",jz,wc_o));
3738 check_nomsg(cpl_table_set_double(z_pos,
"SIGO",jz,sig_o));
3739 check_nomsg(cpl_table_set_double(z_pos,
"AREAO",jz,area_o));
3740 check_nomsg(cpl_table_set_double(z_pos,
"BKGO",jz,bkg_o));
3741 check_nomsg(cpl_table_set_double(z_pos,
"AMPO",jz,amp_o));
3749 }
else if (error_code == CPL_ERROR_CONTINUE) {
3752 amp_o=sinfo_gaussian_amp(area_o,sig_o,wo,wc_o,bkg_o);
3753 check_nomsg(cpl_table_set_double(z_pos,
"WAVEO",jz,wc_o));
3754 check_nomsg(cpl_table_set_double(z_pos,
"SIGO",jz,sig_o));
3755 check_nomsg(cpl_table_set_double(z_pos,
"AREAO",jz,area_o));
3756 check_nomsg(cpl_table_set_double(z_pos,
"BKGO",jz,bkg_o));
3757 check_nomsg(cpl_table_set_double(z_pos,
"AMPO",jz,amp_o));
3758 check_nomsg(cpl_table_set_int(z_pos,
"STATUS_O",jz,-1));
3762 check_nomsg(cpl_table_set_double(z_pos,
"WAVEO",jz,wc_o));
3763 check_nomsg(cpl_table_set_double(z_pos,
"SIGO",jz,sig_o));
3764 check_nomsg(cpl_table_set_double(z_pos,
"AREAO",jz,area_o));
3765 check_nomsg(cpl_table_set_double(z_pos,
"BKGO",jz,bkg_o));
3766 check_nomsg(cpl_table_set_double(z_pos,
"AMPO",jz,amp_o));
3767 check_nomsg(cpl_table_set_int(z_pos,
"STATUS_O",jz,-2));
3779 check_nomsg(cpl_table_set_double(z_pos,
"ERR",
3780 jz,sqrt(sig_s*sig_s+sig_o*sig_o)));
3781 check_nomsg(cpl_table_set_double(z_pos,
"WDIF",jz,wc_s-wc_o));
3782 check_nomsg(cpl_table_set_double(z_pos,
"WAVEC",jz,(wc_o+wc_s)/2));
3785 check_nomsg(cpl_table_set_int(z_pos,
"STATUS_S",jz,-3));
3786 check_nomsg(cpl_table_set_int(z_pos,
"STATUS_O",jz,-3));
3788 sinfo_unwrap_vector(&vw);
3789 sinfo_unwrap_vector(&vs);
3790 sinfo_unwrap_vector(&vo);
3791 sinfo_free_my_vector(&sx);
3792 sinfo_free_my_vector(&sy);
3793 sinfo_free_table(&w_tbl);
3794 sinfo_free_table(&s_tbl);
3795 sinfo_free_table(&o_tbl);
3800 check_nomsg(cpl_table_duplicate_column(z_pos,
"YDIF",z_pos,
"WDIF"));
3801 check_nomsg(cpl_table_divide_scalar(z_pos,
"YDIF",dispersion));
3806 check_nomsg(cpl_table_and_selected_int(z_pos,
"STATUS_S",CPL_GREATER_THAN,-2));
3807 check_nomsg(cpl_table_and_selected_int(z_pos,
"STATUS_O",CPL_GREATER_THAN,-2));
3814 check_nomsg(z_good=cpl_table_extract_selected(z_pos));
3815 check_nomsg(npos=cpl_table_get_nrow(z_good));
3816 sinfo_free_table(&z_pos);
3820 check_nomsg(z_pos=cpl_table_duplicate(z_good));
3821 check_nomsg(z_mean = cpl_table_get_column_median(z_pos,
"WDIF"));
3822 check_nomsg(z_sdv = cpl_table_get_column_stdev(z_pos,
"WDIF"));
3827 check_nomsg(cpl_table_duplicate_column(z_pos,
"CHECK",
3831 cpl_table_erase_column(z_pos,
"AMPO");
3832 cpl_table_erase_column(z_pos,
"SIGO");
3833 cpl_table_erase_column(z_pos,
"AREAO");
3834 cpl_table_erase_column(z_pos,
"BKGO");
3835 cpl_table_erase_column(z_pos,
"WAVEO");
3836 cpl_table_erase_column(z_pos,
"AMPS");
3837 cpl_table_erase_column(z_pos,
"SIGS");
3838 cpl_table_erase_column(z_pos,
"AREAS");
3839 cpl_table_erase_column(z_pos,
"BKGS");
3840 cpl_table_erase_column(z_pos,
"WAVES");
3841 cpl_table_erase_column(z_pos,
"STATUS_S");
3842 cpl_table_erase_column(z_pos,
"STATUS_O");
3844 cpl_table_erase_column(z_pos,
"INT");
3845 cpl_table_erase_column(z_pos,
"INT1");
3846 cpl_table_erase_column(z_pos,
"INT2");
3847 cpl_table_erase_column(z_pos,
"ERR");
3848 cpl_table_erase_column(z_pos,
"POS");
3849 cpl_table_erase_column(z_pos,
"DIFF");
3856 sinfo_msg(
"ks-clip1");
3857 sinfo_msg(
"iter mean (um) sdv (um) mean (pix) sdv (pix)");
3861 for (iq = 0;iq<XCOR_YSHIFT_KS_CLIP;iq++) {
3863 sinfo_msg(
" %d %3.2g %3.2g %5.4g %5.4g",
3864 iq,z_mean,z_sdv,z_mean/dispersion,z_sdv/dispersion);
3867 check_nomsg(cpl_table_subtract_scalar(z_pos,
"CHECK",z_mean));
3868 check_nomsg(cpl_table_duplicate_column(z_pos,
"CHECKW",z_pos,
"CHECK"));
3869 check_nomsg(cpl_table_multiply_columns(z_pos,
"CHECKW",
"CHECK"));
3870 check_nomsg(cpl_table_power_column(z_pos,
"CHECKW",0.5));
3871 check_nomsg(cpl_table_add_scalar(z_pos,
"CHECK",z_mean));
3872 check_nomsg(cpl_table_and_selected_double(z_pos,
"CHECKW",
3873 CPL_NOT_GREATER_THAN,2*z_sdv));
3874 sinfo_free_table(&z_good);
3875 check_nomsg(z_good=cpl_table_extract_selected(z_pos));
3877 check_nomsg(cpl_table_select_all(z_pos));
3880 check_nomsg(z_mean = cpl_table_get_column_median(z_good,
"WDIF"));
3882 check_nomsg(z_sdv = cpl_table_get_column_stdev(z_good,
"WDIF"));
3886 sinfo_free_table(&z_good);
3887 check_nomsg(cpl_table_erase_column(z_pos,
"CHECKW"));
3902 cpl_table_select_all(z_pos);
3903 check_nomsg(cpl_table_new_column(z_pos,
"ZFIT",CPL_TYPE_DOUBLE));
3904 check_nomsg(nfit=cpl_table_get_nrow(z_pos));
3905 check_nomsg(cpl_table_fill_column_window(z_pos,
"ZFIT",0,nfit,0));
3908 check_nomsg(z_good=cpl_table_duplicate(z_pos));
3911 sinfo_msg(
"ks-clip2");
3912 sinfo_msg(
"iter mean (um) sdv (um) mean (pix) sdv (pix)");
3913 check_nomsg(cpl_table_select_all(z_good));
3915 for(iq=0;iq<XCOR_YSHIFT_KS_CLIP;iq++) {
3917 check_nomsg(nfit=cpl_table_get_nrow(z_good));
3920 check_nomsg(vx=cpl_vector_wrap(nfit,
3921 cpl_table_get_data_double(z_good,
"WAVE")));
3922 check_nomsg(vy=cpl_vector_wrap(nfit,
3923 cpl_table_get_data_double(z_good,
"WDIF")));
3924 check_nomsg(cfit=sinfo_polynomial_fit_1d_create(vx,vy,0,&mse));
3927 check_nomsg(zfit=cpl_polynomial_get_coeff(cfit,pows));
3928 sinfo_free_polynomial(&cfit);
3933 check_nomsg(cpl_table_fill_column_window(z_good,
"ZFIT",0,nfit,zfit));
3934 check_nomsg(cpl_table_duplicate_column(z_good,
"WRES",z_good,
"WDIF"));
3935 check_nomsg(cpl_table_subtract_columns(z_good,
"WRES",
"ZFIT"));
3939 check_nomsg(z_sdv=cpl_table_get_column_stdev(z_good,
"WRES"));
3944 check_nomsg(z_mean=cpl_table_get_column_mean(z_good,
"WDIF"));
3946 sinfo_msg(
" %d %3.2g %3.2g %5.4g %5.4g",
3947 iq,z_mean,z_sdv,z_mean/dispersion,z_sdv/dispersion);
3949 check_nomsg(nfit=cpl_table_get_nrow(z_pos));
3950 check_nomsg(cpl_table_fill_column_window(z_pos,
"ZFIT",0,nfit,zfit));
3951 check_nomsg(cpl_table_duplicate_column(z_pos,
"WRES",z_pos,
"WDIF"));
3952 check_nomsg(cpl_table_subtract_columns(z_pos,
"WRES",
"ZFIT"));
3954 check_nomsg(cpl_table_multiply_columns(z_pos,
"WRES",
"WRES"));
3955 check_nomsg(cpl_table_power_column(z_pos,
"WRES",0.5));
3963 check_nomsg(cpl_table_and_selected_double(z_pos,
"WRES",
3964 CPL_NOT_GREATER_THAN,3*z_sdv));
3966 check_nomsg(sinfo_free_table(&z_good));
3967 check_nomsg(z_good=cpl_table_extract_selected(z_pos));
3970 check_nomsg(cpl_table_select_all(z_pos));
3971 check_nomsg(cpl_table_select_all(z_good));
3972 check_nomsg(cpl_table_erase_column(z_good,
"WRES"));
3973 check_nomsg(cpl_table_erase_column(z_pos,
"WRES"));
3975 sinfo_unwrap_vector(&vx);
3976 sinfo_unwrap_vector(&vy);
3985 sinfo_unwrap_vector(&vx);
3986 sinfo_unwrap_vector(&vy);
3987 sinfo_free_polynomial(&cfit);
3988 sinfo_free_table(&z);
3989 sinfo_free_table(&z_pos);
3990 sinfo_free_table(&z_good);
3996 sinfo_free_table(&z_good);
3997 sinfo_free_table(&z);
3998 sinfo_free_table(&z_diff);
3999 sinfo_free_table(&tmp_sky);
4000 sinfo_free_table(&z_pos);
4001 sinfo_unwrap_vector(&vw);
4002 sinfo_unwrap_vector(&vs);
4003 sinfo_unwrap_vector(&vo);
4004 sinfo_free_my_vector(&sx);
4005 sinfo_free_my_vector(&sy);
4006 sinfo_unwrap_vector(&vx);
4007 sinfo_unwrap_vector(&vy);
4008 sinfo_free_table(&w_tbl);
4009 sinfo_free_table(&s_tbl);
4010 sinfo_free_table(&o_tbl);
4011 sinfo_free_polynomial(&cfit);
4034 sinfo_table_set_nan_out_min_max(cpl_table** t,
4045 check_nomsg(sz=cpl_table_get_nrow(*t));
4046 check_nomsg(pt=cpl_table_get_data_double(*t,c));
4048 if(pt[i] < min || pt[i] > max) {
4049 check_nomsg(cpl_table_set_invalid(*t ,c,i));
4072 sinfo_table_flag_nan(cpl_table** t,
const char* label)
4079 check_nomsg(sz=cpl_table_get_nrow(*t));
4080 check_nomsg(pt=cpl_table_get_data_double(*t,label));
4082 if(irplib_isnan(pt[i])) {
4083 check_nomsg(cpl_table_set_invalid(*t ,label,i));
4104 sinfo_table_sky_obj_flag_nan(cpl_table** s,cpl_table** o, cpl_table** w)
4117 check_nomsg(no=cpl_table_get_nrow(*o));
4118 check_nomsg(ns=cpl_table_get_nrow(*s));
4119 check_nomsg(nw=cpl_table_get_nrow(*w));
4120 if(no != ns || ns != nw || no != nw) {
4124 check_nomsg(po=cpl_table_get_data_double(*o,
"INT"));
4125 check_nomsg(ps=cpl_table_get_data_double(*s,
"INT"));
4126 check_nomsg(pw=cpl_table_get_data_double(*w,
"WAVE"));
4129 if( (0==cpl_table_is_valid(*o,
"INT",i)) ||
4130 irplib_isnan(po[i]) || irplib_isnan(ps[i]) || irplib_isnan(pw[i]) ) {
4131 check_nomsg(cpl_table_set_invalid(*o ,
"INT",i));
4132 check_nomsg(cpl_table_set_invalid(*s ,
"INT",i));
4133 check_nomsg(cpl_table_set_invalid(*w ,
"WAVE",i));
4213 sinfo_optimise_sky_sub(
const double wtol,
4214 const double line_hw,
4234 cpl_table** int_obj,
4235 cpl_table** int_sky,
4240 int npixw=2*line_hw;
4241 cpl_array* do_hk=NULL;
4242 cpl_array* rfit=NULL;
4244 cpl_table* sky_lr=NULL;
4245 cpl_table* obj_lr=NULL;
4246 cpl_table* wav_lr=NULL;
4268 double sky_thresh=0.;
4270 cpl_table* rat_sky=NULL;
4272 cpl_table* xxx1=NULL;
4273 cpl_table* xxx2=NULL;
4274 cpl_table* xxx1_sub=NULL;
4275 cpl_table* line_regions=NULL;
4276 cpl_table* cont_regions=NULL;
4281 cpl_table* fline_res=NULL;
4284 cpl_table* rscale0=NULL;
4286 cpl_table* obj_cont=NULL;
4287 cpl_table* sky_cont=NULL;
4288 cpl_table* obj_line=NULL;
4289 cpl_table* sky_line=NULL;
4297 cpl_table* finite_pix=NULL;
4298 cpl_table* tmp_tbl=NULL;
4300 cpl_table* low_scale=NULL;
4301 cpl_table* med_scale=NULL;
4302 cpl_table* hi_regions=NULL;
4304 cpl_table* low_regions=NULL;
4305 cpl_table* med_regions=NULL;
4308 cpl_table* low_pos=NULL;
4309 cpl_table* med_pos=NULL;
4310 cpl_table* hi_pos=NULL;
4311 cpl_table* llr_xxx1=NULL;
4317 double min_lrange=0;
4318 double max_lrange=0;
4323 double w_rot_low[NROT]={1.00852,1.03757,1.09264,1.15388,1.22293,
4324 1.30216,1.45190,1.52410,1.60308,1.69037,
4325 1.78803,2.02758,2.18023,1.02895,1.08343,
4326 1.14399,1.21226,1.29057,1.43444,1.50555,
4327 1.58333,1.66924,1.76532,2.00082,2.15073};
4330 double w_rot_med[NROT]={1.00282,1.02139,1.04212,1.07539,1.09753,
4331 1.13542,1.15917,1.20309,1.22870,1.28070,
4332 1.30853,1.41861,1.46048,1.48877,1.53324,
4333 1.56550,1.61286,1.65024,1.70088,1.74500,
4334 1.79940,1.97719,2.04127,2.12496,2.19956};
4338 check_nomsg(do_hk = cpl_array_new(NBOUND+1,CPL_TYPE_INT));
4339 check_nomsg(rfit = cpl_array_new(NBOUND+1,CPL_TYPE_DOUBLE));
4341 lr41_i=cpl_table_get_nrow(lr41);
4342 lr52_i=cpl_table_get_nrow(lr52);
4343 lr63_i=cpl_table_get_nrow(lr63);
4344 lr74_i=cpl_table_get_nrow(lr74);
4345 lr02_i=cpl_table_get_nrow(lr02);
4346 lr85_i=cpl_table_get_nrow(lr85);
4347 lr20_i=cpl_table_get_nrow(lr20);
4348 lr31_i=cpl_table_get_nrow(lr31);
4349 lr42_i=cpl_table_get_nrow(lr42);
4350 lr53_i=cpl_table_get_nrow(lr53);
4351 lr64_i=cpl_table_get_nrow(lr64);
4352 lr75_i=cpl_table_get_nrow(lr75);
4353 lr86_i=cpl_table_get_nrow(lr86);
4354 lr97_i=cpl_table_get_nrow(lr97);
4355 check_nomsg(lr00_i=cpl_table_get_nrow(lr00));
4357 cpl_array_set_int(do_hk,0,lr41_i);
4358 cpl_array_set_int(do_hk,1,lr52_i);
4359 cpl_array_set_int(do_hk,2,lr63_i);
4360 cpl_array_set_int(do_hk,3,lr74_i);
4361 cpl_array_set_int(do_hk,4,lr02_i);
4362 cpl_array_set_int(do_hk,5,lr85_i);
4363 cpl_array_set_int(do_hk,6,lr20_i);
4364 cpl_array_set_int(do_hk,7,lr31_i);
4365 cpl_array_set_int(do_hk,8,lr42_i);
4366 cpl_array_set_int(do_hk,9,lr53_i);
4367 cpl_array_set_int(do_hk,10,lr64_i);
4368 cpl_array_set_int(do_hk,11,lr75_i);
4369 cpl_array_set_int(do_hk,12,lr86_i);
4370 cpl_array_set_int(do_hk,13,lr97_i);
4371 check_nomsg(cpl_array_set_int(do_hk,14,lr00_i));
4373 check_nomsg(rscale0=cpl_table_duplicate(*int_sky));
4374 check_nomsg(cpl_table_new_column(rscale0,
"RATIO",CPL_TYPE_DOUBLE));
4375 check_nomsg(nrow=cpl_table_get_nrow(rscale0));
4376 check_nomsg(cpl_table_fill_column_window(rscale0,
"RATIO",0,nrow,0));
4379 for (i=0;i<NBOUND+1;i++) {
4380 if (cpl_array_get_int(do_hk,i,&status) > 0) {
4387 ck0_nomsg(sinfo_get_obj_sky_wav_sub(*int_obj,*int_sky,lambda,lr41,wtol,
4388 &obj_lr,&sky_lr,&wav_lr));
4392 ck0_nomsg(sinfo_get_obj_sky_wav_sub(*int_obj,*int_sky,lambda,lr52,wtol,
4393 &obj_lr,&sky_lr,&wav_lr));
4397 ck0_nomsg(sinfo_get_obj_sky_wav_sub(*int_obj,*int_sky,lambda,lr63,wtol,
4398 &obj_lr,&sky_lr,&wav_lr));
4402 ck0_nomsg(sinfo_get_obj_sky_wav_sub(*int_obj,*int_sky,lambda,lr74,wtol,
4403 &obj_lr,&sky_lr,&wav_lr));
4407 ck0_nomsg(sinfo_get_obj_sky_wav_sub(*int_obj,*int_sky,lambda,lr02,wtol,
4408 &obj_lr,&sky_lr,&wav_lr));
4412 ck0_nomsg(sinfo_get_obj_sky_wav_sub(*int_obj,*int_sky,lambda,lr85,wtol,
4413 &obj_lr,&sky_lr,&wav_lr));
4416 ck0_nomsg(sinfo_get_obj_sky_wav_sub(*int_obj,*int_sky,lambda,lr20,wtol,
4417 &obj_lr,&sky_lr,&wav_lr));
4420 ck0_nomsg(sinfo_get_obj_sky_wav_sub(*int_obj,*int_sky,lambda,lr31,wtol,
4421 &obj_lr,&sky_lr,&wav_lr));
4424 ck0_nomsg(sinfo_get_obj_sky_wav_sub(*int_obj,*int_sky,lambda,lr42,wtol,
4425 &obj_lr,&sky_lr,&wav_lr));
4428 ck0_nomsg(sinfo_get_obj_sky_wav_sub(*int_obj,*int_sky,lambda,lr53,wtol,
4429 &obj_lr,&sky_lr,&wav_lr));
4432 ck0_nomsg(sinfo_get_obj_sky_wav_sub(*int_obj,*int_sky,lambda,lr64,wtol,
4433 &obj_lr,&sky_lr,&wav_lr));
4436 ck0_nomsg(sinfo_get_obj_sky_wav_sub(*int_obj,*int_sky,lambda,lr75,wtol,
4437 &obj_lr,&sky_lr,&wav_lr));
4440 ck0_nomsg(sinfo_get_obj_sky_wav_sub(*int_obj,*int_sky,lambda,lr86,wtol,
4441 &obj_lr,&sky_lr,&wav_lr));
4444 ck0_nomsg(sinfo_get_obj_sky_wav_sub(*int_obj,*int_sky,lambda,lr97,wtol,
4445 &obj_lr,&sky_lr,&wav_lr));
4448 ck0_nomsg(sinfo_get_obj_sky_wav_sub(*int_obj,*int_sky,lambda,lr00,
4449 wtol,&obj_lr,&sky_lr,&wav_lr));
4455 if(sky_lr == NULL || obj_lr == NULL || wav_lr == NULL) {
4457 sinfo_msg(
"no good pix left");
4469 check_nomsg(finite_pix_i=sinfo_table_sky_obj_flag_nan(&sky_lr,
4477 if (finite_pix_i > npixw) {
4480 check_nomsg(cpl_table_erase_invalid(obj_lr));
4481 check_nomsg(cpl_table_erase_invalid(sky_lr));
4482 check_nomsg(cpl_table_erase_invalid(wav_lr));
4485 check_nomsg(sky_med=cpl_table_get_column_median(sky_lr,
"INT"));
4486 check_nomsg(sky_sdv=cpl_table_get_column_stdev(sky_lr,
"INT"));
4487 check_nomsg(cpl_table_select_all(sky_lr));
4488 sky_thresh=sky_med+sky_sdv;
4490 check_nomsg(xxx1_i=cpl_table_and_selected_double(sky_lr,
"INT",
4491 CPL_GREATER_THAN,sky_thresh));
4492 check_nomsg(xxx1 = cpl_table_extract_selected(sky_lr));
4493 check_nomsg(cpl_table_select_all(sky_lr));
4499 check_nomsg(xxx2 = cpl_table_duplicate(sky_lr));
4506 ck0_nomsg(sinfo_table_threshold(&xxx2,
"INT",sky_thresh,
4507 sky_thresh,0.,10.));
4516 check_nomsg(sinfo_convolve_kernel(&xxx2,npixw/2));
4521 check_nomsg(line_i=cpl_table_and_selected_double(xxx2,
"CNV",
4522 CPL_GREATER_THAN,0));
4524 check_nomsg(line_regions=cpl_table_extract_selected(xxx2));
4529 check_nomsg(cpl_table_erase_column(line_regions,
"INT"));
4530 check_nomsg(cpl_table_erase_column(line_regions,
"CNV"));
4532 check_nomsg(cpl_table_select_all(xxx2));
4535 check_nomsg(cont_i=cpl_table_and_selected_double(xxx2,
"CNV",
4537 check_nomsg(cont_regions=cpl_table_extract_selected(xxx2));
4542 check_nomsg(cpl_table_erase_column(cont_regions,
"INT"));
4543 check_nomsg(cpl_table_erase_column(cont_regions,
"CNV"));
4544 check_nomsg(cpl_table_select_all(xxx2));
4545 sinfo_free_table(&xxx2);
4548 if (line_i >= 3 && cont_i >= 3) {
4551 if (i == 0) sinfo_msg(
"optimising 4-1 transitions");
4552 if (i == 1) sinfo_msg(
"optimising 5-2 transitions");
4553 if (i == 2) sinfo_msg(
"optimising 6-3 transitions");
4554 if (i == 3) sinfo_msg(
"optimising 7-4 transitions");
4555 if (i == 4) sinfo_msg(
"optimising 0-2 transitions");
4556 if (i == 5) sinfo_msg(
"optimising 8-5 transitions");
4557 if (i == 6) sinfo_msg(
"optimising 2-0 transitions");
4558 if (i == 7) sinfo_msg(
"optimising 3-1 transitions");
4559 if (i == 8) sinfo_msg(
"optimising 4-2 transitions");
4560 if (i == 9) sinfo_msg(
"optimising 5-3 transitions");
4561 if (i == 10) sinfo_msg(
"optimising 6-4 transitions");
4562 if (i == 11) sinfo_msg(
"optimising 7-5 transitions");
4563 if (i == 12) sinfo_msg(
"optimising 8-6 transitions");
4564 if (i == 13) sinfo_msg(
"optimising 9-7 transitions");
4565 if (i == 14) sinfo_msg(
"optimising final bit");
4571 sinfo_free_table(&obj_cont);
4572 sinfo_free_table(&sky_cont);
4573 sinfo_free_table(&sky_line);
4574 sinfo_free_table(&obj_line);
4576 cknull_nomsg(obj_line=sinfo_table_select_range(obj_lr,line_regions,
4580 cknull_nomsg(sky_line=sinfo_table_select_range(sky_lr,line_regions,
4582 cknull_nomsg(obj_cont=sinfo_table_select_range(obj_lr,cont_regions,
4584 cknull_nomsg(sky_cont=sinfo_table_select_range(sky_lr,cont_regions,
4602 sinfo_free_table(&fline_res);
4605 ck0_nomsg(sinfo_get_line_ratio(obj_line,obj_cont,
4606 sky_line,sky_cont,method,&r));
4607 sinfo_msg(
"1st Line ratio %g",r);
4610 if(cpl_table_get_nrow(obj_cont) > 0) {
4611 check_nomsg(fline_res=sinfo_table_interpol(obj_line,obj_cont,
4615 check_nomsg(fline_res=cpl_table_duplicate(obj_line));
4619 cpl_table_select_all(fline_res);
4620 check_nomsg(fmed = cpl_table_get_column_median(fline_res,
"INT"));
4621 check_nomsg(fsdv = cpl_table_get_column_stdev(fline_res,
"INT"));
4623 check_nomsg(cpl_table_duplicate_column(fline_res,
"AINT",
4625 check_nomsg(cpl_table_multiply_columns(fline_res,
"AINT",
"INT"));
4626 check_nomsg(cpl_table_power_column(fline_res,
"AINT",0.5));
4627 check_nomsg(fclip_i=cpl_table_and_selected_double(fline_res,
"AINT",
4631 check_nomsg(cpl_table_select_all(fline_res));
4638 check_nomsg(line_i=cpl_table_and_selected_double(fline_res,
4640 CPL_NOT_GREATER_THAN,
4643 sinfo_free_table(&line_regions);
4645 check_nomsg(line_regions=cpl_table_extract_selected(fline_res));
4646 check_nomsg(cpl_table_erase_column(line_regions,
"INT"));
4647 check_nomsg(cpl_table_erase_column(line_regions,
"AINT"));
4649 sinfo_free_table(&obj_line);
4650 sinfo_free_table(&sky_line);
4663 obj_line=sinfo_table_select_range(obj_lr,line_regions,wtol);
4664 sky_line=sinfo_table_select_range(sky_lr,line_regions,wtol);
4665 fline_i=cpl_table_get_nrow(line_regions);
4671 ck0_nomsg(sinfo_get_line_ratio(obj_line,obj_cont,
4672 sky_line,sky_cont,method,&r));
4674 sinfo_msg(
"2nd Line ratio %g",r);
4680 sinfo_free_table(&sky_line);
4681 sinfo_free_table(&obj_line);
4684 cpl_msg_info(cpl_func,
"use %" CPL_SIZE_FORMAT
4685 " pixels for line and %" CPL_SIZE_FORMAT
4686 " for continuum estimation",
4687 cpl_table_get_nrow(line_regions),cpl_table_get_nrow(cont_regions));
4689 sinfo_msg(
"OH spectrum scaling = %f ",r);
4690 check_nomsg(cpl_array_set_double(rfit,i,r));
4691 ck0_nomsg(sinfo_table_set(&rscale0,wav_lr,r,wtol));
4699 sinfo_free_table(&xxx1);
4700 sinfo_free_table(&xxx2);
4701 sinfo_free_table(&sky_lr);
4702 sinfo_free_table(&obj_lr);
4703 sinfo_free_table(&wav_lr);
4705 sinfo_free_table(&line_regions);
4706 sinfo_free_table(&cont_regions);
4710 sinfo_free_array(&do_hk);
4711 sinfo_free_array(&rfit);
4717 check_nomsg(cpl_table_select_all(rscale0));
4722 check_nomsg(*rscale = cpl_table_extract_selected(rscale0));
4723 sinfo_free_table(&rscale0);
4726 check_nomsg(rat_sky=cpl_table_duplicate(*int_sky));
4727 check_nomsg(cpl_table_duplicate_column(rat_sky,
"RATIO",*rscale,
"RATIO"));
4728 check_nomsg(cpl_table_duplicate_column(*int_obj,
"COR_FCT_VIB",
4732 check_nomsg(cpl_table_multiply_columns(rat_sky,
"INT",
"RATIO"));
4750 check_nomsg(min_lrange=cpl_table_get_column_min(lrange,
"WAVE"));
4751 check_nomsg(max_lrange=cpl_table_get_column_max(lrange,
"WAVE"));
4756 check_nomsg(finite_pix_i=sinfo_table_sky_obj_flag_nan(int_sky,
4761 check_nomsg(finite_pix=cpl_table_duplicate(lambda));
4764 check_nomsg(cpl_table_erase_invalid(finite_pix));
4767 if (finite_pix_i > npixw) {
4772 check_nomsg(cpl_table_and_selected_double(finite_pix,
"WAVE",
4776 check_nomsg(cpl_table_and_selected_double(finite_pix,
"WAVE",
4782 check_nomsg(tmp_tbl=cpl_table_extract_selected(finite_pix));
4783 sinfo_free_table(&finite_pix);
4784 check_nomsg(finite_pix=cpl_table_duplicate(tmp_tbl));
4785 sinfo_free_table(&tmp_tbl);
4786 sinfo_free_table(&sky_lr);
4787 sinfo_free_table(&obj_lr);
4788 sinfo_free_table(&wav_lr);
4791 cknull(sky_lr=sinfo_table_select_range(rat_sky,finite_pix,wtol),
4792 "extracting sky sub range");
4793 cknull(obj_lr=sinfo_table_select_range(*int_obj,finite_pix,wtol),
4794 "extracting obj sub range");
4795 cknull(wav_lr=sinfo_table_select_range(lambda,finite_pix,wtol),
4796 "extracting sky sub range");
4811 if(1 == cpl_table_has_valid(sky_lr,
"INT")) {
4812 check_nomsg(sky_med=cpl_table_get_column_median(sky_lr,
"INT"));
4813 check_nomsg(sky_sdv=cpl_table_get_column_stdev(sky_lr,
"INT"));
4814 sky_thresh=sky_med+sky_sdv;
4816 check_nomsg(xxx1_i=cpl_table_and_selected_double(sky_lr,
"INT",
4817 CPL_GREATER_THAN,sky_thresh));
4818 check_nomsg(xxx1=cpl_table_extract_selected(sky_lr));
4819 check_nomsg(cpl_table_select_all(sky_lr));
4824 sinfo_msg(
"xxx1_i=%d",xxx1_i);
4826 sinfo_msg(
"wav_lr wmin=%g wmax=%g",
4827 cpl_table_get_column_min(wav_lr,
"WAVE"),
4828 cpl_table_get_column_max(wav_lr,
"WAVE"));
4830 cknull_nomsg(llr_xxx1=sinfo_table_select_range(wav_lr,xxx1,wtol));
4834 cknull(low_pos=sinfo_find_rot_waves(w_rot_low,npixw,wtol,llr_xxx1),
4835 "Determining low positions");
4838 check_nomsg(low_pos_i=cpl_table_get_nrow(low_pos));
4840 cknull(med_pos=sinfo_find_rot_waves(w_rot_med,npixw,wtol,llr_xxx1),
4841 "Determining med positions");
4842 check_nomsg(med_pos_i=cpl_table_get_nrow(med_pos));
4858 cknull(hi_pos=sinfo_table_extract_rest(xxx1,low_pos,med_pos,wtol),
4859 "determining hi position");
4860 check_nomsg(hi_pos_i=cpl_table_get_nrow(hi_pos));
4865 check_nomsg(xxx2 = cpl_table_duplicate(sky_lr));
4866 check_nomsg(nrow=cpl_table_get_nrow(sky_lr));
4877 ck0_nomsg(sinfo_table_threshold(&xxx2,
"INT",sky_thresh,
4878 sky_thresh,0.,10.));
4879 sinfo_msg(
"sky_thresh=%g %g %f",sky_thresh,sky_med,sky_sdv);
4882 check_nomsg(sinfo_convolve_kernel(&xxx2,npixw/2));
4886 check_nomsg(cont_i=cpl_table_and_selected_double(xxx2,
"CNV",
4888 check_nomsg(cont_regions=cpl_table_extract_selected(xxx2));
4890 sinfo_free_table(&xxx2);
4891 check_nomsg(cpl_table_erase_column(cont_regions,
"INT"));
4892 check_nomsg(cpl_table_erase_column(cont_regions,
"CNV"));
4894 check(low_pos_i=sinfo_get_sub_regions(sky_lr,xxx1,low_pos,wtol,
4895 npixw,&low_regions),
"failed determining low regions");
4897 check(med_pos_i=sinfo_get_sub_regions(sky_lr,xxx1,med_pos,wtol,
4898 npixw,&med_regions),
"failed determining med regions");
4901 check(hi_pos_i=sinfo_get_sub_regions(sky_lr,xxx1,hi_pos,wtol,
4902 npixw,&hi_regions),
"failed determining hi regions");
4912 sinfo_msg(
"hi_pos_i : %d med_pos_i : %d low_pos_i : %d cont_i: %d",
4913 hi_pos_i, med_pos_i, low_pos_i, cont_i);
4916 if (hi_pos_i >= 3 && med_pos_i >= 3 && low_pos_i >= 3 && cont_i >= 3) {
4919 ck0_nomsg(sinfo_compute_line_ratio(obj_lr, sky_lr,wtol, method,
4920 hi_regions,cont_regions,&rhi));
4921 sinfo_msg(
"high rotational OH scaling %g",rhi);
4924 ck0_nomsg(sinfo_compute_line_ratio(obj_lr, sky_lr,wtol, method,
4925 med_regions,cont_regions,&rmed));
4927 sinfo_msg(
"P1(3.5) & R1(1.5) rotational OH scaling %g ",rmed);
4930 ck0_nomsg(sinfo_compute_line_ratio(obj_lr, sky_lr,wtol, method,
4931 low_regions,cont_regions,&rlow));
4932 sinfo_msg(
"P1(2.5) & Q1(1.5) rotational OH scaling %g",rlow);
4934 cknull(low_scale=sinfo_find_rot_waves(w_rot_low,npixw,wtol,lambda),
4935 "Determining low scale");
4939 cknull(med_scale=sinfo_find_rot_waves(w_rot_low,npixw,wtol,lambda),
4940 "Determining low scale");
4941 check_nomsg(cpl_table_multiply_scalar(*rscale,
"RATIO",rhi));
4942 ck0_nomsg(sinfo_table_fill_column_over_range(rscale,med_scale,
4943 "RATIO",rmed/rhi,wtol));
4944 ck0_nomsg(sinfo_table_fill_column_over_range(rscale,low_scale,
4945 "RATIO",rlow/rhi,wtol));
4958 check_nomsg(cpl_table_duplicate_column(*int_sky,
"INTC",*int_sky,
"INT"));
4962 check_nomsg(cpl_table_duplicate_column(*int_obj,
"COR_FCT_ALL",
4964 check_nomsg(cpl_table_duplicate_column(*int_sky,
"RATIO",*rscale,
"RATIO"));
4965 check_nomsg(cpl_table_multiply_columns(*int_sky,
"INTC",
"RATIO"));
4967 check_nomsg(cpl_table_duplicate_column(*int_obj,
"INTC",*int_obj,
"INT"));
4973 check_nomsg(cpl_table_duplicate_column(*int_obj,
"SKYC",*int_sky,
"INTC"));
4974 check_nomsg(cpl_table_subtract_columns(*int_obj,
"INTC",
"SKYC"));
4977 check_nomsg(cpl_table_erase_column(*int_sky,
"INT"));
4978 check_nomsg(cpl_table_name_column(*int_sky,
"INTC",
"INT"));
4983 sinfo_free_table(&llr_xxx1);
4984 sinfo_free_table(&hi_pos);
4985 sinfo_free_table(&low_pos);
4986 sinfo_free_table(&med_pos);
4987 sinfo_free_table(&low_regions);
4988 sinfo_free_table(&med_regions);
4989 sinfo_free_table(&hi_regions);
4990 sinfo_free_table(&low_scale);
4991 sinfo_free_table(&med_scale);
4994 sinfo_free_table(&finite_pix);
4995 sinfo_free_table(&xxx1_sub);
4996 sinfo_free_table(&tmp_tbl);
4997 sinfo_free_table(&rat_sky);
4998 sinfo_free_table(&fline_res);
4999 sinfo_free_table(&sky_cont);
5000 sinfo_free_table(&obj_cont);
5001 sinfo_free_table(&obj_line);
5002 sinfo_free_table(&sky_line);
5003 sinfo_free_table(&rscale0);
5004 sinfo_free_table(&xxx1);
5005 sinfo_free_table(&xxx2);
5006 sinfo_free_table(&line_regions);
5007 sinfo_free_table(&cont_regions);
5008 sinfo_free_table(&sky_lr);
5009 sinfo_free_table(&obj_lr);
5010 sinfo_free_table(&wav_lr);
5011 sinfo_free_array(&rfit);
5012 sinfo_free_array(&do_hk);
5025 sinfo_table_get_index_of_max(cpl_table* t,
const char* name,cpl_type type)
5038 cpl_error_set(cpl_func, CPL_ERROR_NULL_INPUT);
5041 max=cpl_table_get_column_max(t,name);
5042 nrow=cpl_table_get_nrow(t);
5046 pi=cpl_table_get_data_int(t,name);
5047 for(i=0;i<nrow;i++) {
5048 if(pi[i]==(
int)max) result=i;
5051 case CPL_TYPE_FLOAT:
5052 pf=cpl_table_get_data_float(t,name);
5053 for(i=0;i<nrow;i++) {
5054 if(pf[i]==(
float)max) result=i;
5057 case CPL_TYPE_DOUBLE:
5058 pd=cpl_table_get_data_double(t,name);
5059 for(i=0;i<nrow;i++) {
5060 if(pd[i]==max) result=i;
5065 cpl_error_set(cpl_func, CPL_ERROR_TYPE_MISMATCH);
5084 sinfo_table_get_index_of_val(cpl_table* t,
5098 cpl_error_set(cpl_func, CPL_ERROR_NULL_INPUT);
5102 nrow=cpl_table_get_nrow(t);
5106 pi=cpl_table_get_data_int(t,name);
5107 for(i=0;i<nrow;i++) {
5108 if(pi[i]==(
int)val) result=i;
5111 case CPL_TYPE_FLOAT:
5112 pf=cpl_table_get_data_float(t,name);
5113 for(i=0;i<nrow;i++) {
5114 if(pf[i]==(
float)val) result=i;
5117 case CPL_TYPE_DOUBLE:
5118 pd=cpl_table_get_data_double(t,name);
5119 for(i=0;i<nrow;i++) {
5120 if(pd[i]==val) result=i;
5125 cpl_error_set(cpl_func, CPL_ERROR_TYPE_MISMATCH);
5145 sinfo_table_column_interpolate(
const cpl_table* t,
5158 nrow=cpl_table_get_nrow(t);
5159 if ((1<x) && (x<nrow-1)) {
5169 check_nomsg(val1=cpl_table_get(t,name,x1,&status));
5170 check_nomsg(val2=cpl_table_get(t,name,x2,&status));
5172 m=(val2-val1)/(x2-x1);
5192 static cpl_imagelist*
5193 sinfo_imagelist_select_range(
const cpl_imagelist* inp,
5194 const cpl_table* full,
5195 const cpl_table* good,
5198 cpl_imagelist* out=NULL;
5209 const cpl_image* img=NULL;
5216 check_nomsg(ksz=cpl_imagelist_get_size(inp));
5217 check_nomsg(isz=cpl_table_get_nrow(good));
5218 check_nomsg(out=cpl_imagelist_new());
5221 for(k=0;k<ksz;k++) {
5222 check_nomsg(img=cpl_imagelist_get_const(inp,k));
5223 check_nomsg(wave_chk=cpl_table_get(full,
"WAVE",k,&status));
5225 check_nomsg(wave_sel=cpl_table_get(good,
"WAVE",i,&status));
5228 if(fabs(wave_chk - wave_sel) < tol) {
5229 check_nomsg(cpl_imagelist_set(out,cpl_image_duplicate(img),i));
5255 sinfo_table_extract_finite(
const cpl_table* in1,
5256 const cpl_table* in2,
5269 cknull(in1,
"null input image");
5270 cknull(in2,
"null input image");
5271 cknull_nomsg(*ou1=cpl_table_duplicate(in1));
5272 cknull_nomsg(*ou2=cpl_table_duplicate(in2));
5274 check_nomsg(size1=cpl_table_get_nrow(*ou1));
5275 check_nomsg(size2=cpl_table_get_nrow(*ou2));
5277 check_nomsg(pout1=cpl_table_get_data_double(*ou1,
"VALUE"));
5279 for(i=0;i<size1;i++) {
5280 if (irplib_isnan(pout1[i])) {
5281 check_nomsg(cpl_table_set_invalid(*ou1,
"VALUE",i));
5282 check_nomsg(cpl_table_set_invalid(*ou2,
"VALUE",i));
5285 ninv1=cpl_table_count_invalid(*ou1,
"VALUE");
5286 ninv2=cpl_table_count_invalid(*ou2,
"VALUE");
5293 check_nomsg(cpl_table_erase_invalid(*ou1));
5294 check_nomsg(cpl_table_erase_invalid(*ou2));
5295 return (size1-ninv1);
5309 sinfo_image2table(
const cpl_image* im)
5311 cpl_table* out=NULL;
5314 const double* pim=NULL;
5320 cknull(im,
"input image is NULL");
5322 check_nomsg(sx=cpl_image_get_size_x(im));
5323 check_nomsg(sy=cpl_image_get_size_y(im));
5324 check_nomsg(pim=cpl_image_get_data_double_const(im));
5325 check_nomsg(out=cpl_table_new(sx*sy));
5326 check_nomsg(cpl_table_new_column(out,
"VALUE",CPL_TYPE_DOUBLE));
5335 cpl_table_set_double(out,
"VALUE",k++,pim[j*sx+i]);
5341 sinfo_free_table(&out);
5354 sinfo_check_screw_values(cpl_table** int_obj,
5355 cpl_table** int_sky,
5360 cpl_table* xsky=NULL;
5361 cpl_table* xobj=NULL;
5372 cknull(*int_sky,
"Null input sky spectrum");
5373 cknull(*int_obj,
"Null input obj spectrum");
5374 cknull(grange,
"Null input wavelength range");
5377 cknull_nomsg(xsky=sinfo_table_select_range(*int_sky,grange,wtol));
5380 check_nomsg(sky_min=cpl_table_get_column_min(xsky,
"INT"));
5381 check_nomsg(sky_max=cpl_table_get_column_max(xsky,
"INT"));
5384 gsky_max = (sky_max>0) ? sky_max : 0;
5385 gsky_min = (sky_min<0) ? sky_min : 0;
5387 check_nomsg(cpl_table_select_all(*int_sky));
5388 ck0_nomsg(sinfo_table_set_nan_out_min_max(int_sky,
"INT",gsky_min,gsky_max));
5392 sinfo_free_table(&xsky);
5395 cknull_nomsg(xobj=sinfo_table_select_range(*int_obj,grange,wtol));
5396 check_nomsg(obj_min=cpl_table_get_column_min(xobj,
"INT"));
5397 check_nomsg(obj_max=cpl_table_get_column_max(xobj,
"INT"));
5399 gobj_max = (obj_max>0) ? obj_max : 0;
5400 gobj_min = (obj_min<0) ? obj_min : 0;
5402 check_nomsg(cpl_table_select_all(*int_obj));
5403 ck0_nomsg(sinfo_table_set_nan_out_min_max(int_obj,
"INT",gobj_min,gobj_max));
5407 sinfo_free_table(&xobj);
5411 sinfo_free_table(&xsky);
5412 sinfo_free_table(&xobj);
5431 sinfo_table_fill_column_over_range(cpl_table** inp,
5432 const cpl_table* ref,
5445 const double* pwrf=NULL;
5447 cknull(inp,
"null input table");
5448 cknull(ref,
"null reference table");
5450 check_nomsg(ninp=cpl_table_get_nrow(*inp));
5451 check_nomsg(nref=cpl_table_get_nrow(ref));
5452 check_nomsg(pwin=cpl_table_get_data_double(*inp,
"WAVE"));
5453 check_nomsg(pcin=cpl_table_get_data_double(*inp,col));
5454 check_nomsg(pwrf=cpl_table_get_data_double_const(ref,
"WAVE"));
5463 if(pwin[0]<=pwrf[0]) {
5465 for(i=0;i<ninp;i++) {
5471 if(fabs(pwin[i] - pwrf[k])< tol) {
5481 for(k=0;k<nref;k++) {
5487 if(fabs(pwin[i] - pwrf[k])< tol) {
5512 sinfo_table_select_range(cpl_table* inp, cpl_table* ref,
const double tol)
5515 cpl_table* out=NULL;
5526 cpl_table* tmp=NULL;
5527 cknull(inp,
"null input table");
5528 cknull(ref,
"null reference table");
5530 check_nomsg(ninp=cpl_table_get_nrow(inp));
5531 check_nomsg(nref=cpl_table_get_nrow(ref));
5534 check_nomsg(wmin=cpl_table_get_column_min(ref,
"WAVE"));
5535 check_nomsg(wmax=cpl_table_get_column_max(ref,
"WAVE"));
5537 cpl_table_select_all(inp);
5538 check_nomsg(ninp=cpl_table_and_selected_double(inp,
"WAVE",
5539 CPL_NOT_LESS_THAN,wmin));
5540 check_nomsg(tmp=cpl_table_extract_selected(inp));
5541 check_nomsg(ninp=cpl_table_and_selected_double(tmp,
"WAVE",
5542 CPL_NOT_GREATER_THAN,wmax));
5543 check_nomsg(out=cpl_table_extract_selected(tmp));
5544 sinfo_free_table(&tmp);
5546 check_nomsg(out=cpl_table_duplicate(inp));
5549 check_nomsg(nout=cpl_table_get_nrow(out));
5554 tmp=cpl_table_duplicate(out);
5555 sinfo_free_table(&out);
5556 check_nomsg(pou=cpl_table_get_data_double(tmp,
"WAVE"));
5557 check_nomsg(prf=cpl_table_get_data_double(ref,
"WAVE"));
5559 check_nomsg(cpl_table_new_column(tmp,
"FLAG",CPL_TYPE_INT));
5560 check_nomsg(cpl_table_fill_column_window(tmp,
"FLAG",0,nout,-1));
5569 if(pou[0]<=prf[0]) {
5571 for(i=0;i<nout;i++) {
5573 if(fabs(pou[i] - prf[k])< tol) {
5574 check_nomsg(cpl_table_set_int(tmp,
"FLAG",i,1));
5583 for(k=0;k<nref;k++) {
5589 if(fabs(pou[i] - prf[k])< tol) {
5590 check_nomsg(cpl_table_set_int(tmp,
"FLAG",i,1));
5597 check_nomsg(nout=cpl_table_and_selected_int(tmp,
"FLAG",CPL_GREATER_THAN,0));
5598 check_nomsg(out=cpl_table_extract_selected(tmp));
5599 sinfo_free_table(&tmp);
5600 check_nomsg(cpl_table_erase_column(out,
"FLAG"));
5609 sinfo_free_table(&tmp);
5610 sinfo_free_table(&out);
5625 sinfo_interpolate_sky(
const cpl_table* inp,
const cpl_table* lambdas)
5628 cpl_table*
new=NULL;
5629 new = sinfo_interpolate(inp,lambdas,
"WAVE",
"lsquadratic");;
5645 sinfo_interpolate(
const cpl_table* inp,
5646 const cpl_table* lambdas,
5651 cpl_table* out=NULL;
5654 cknull_nomsg(lambdas);
5656 cknull_nomsg(method);
5658 out=cpl_table_duplicate(inp);
5682 sinfo_gaussian_amp(
double area,
double sigma,
double x,
double x0,
double off)
5684 return area/sqrt(2*PI_NUMB*sigma*sigma)*
5685 exp(-(x-x0)*(x-x0)/(2*sigma*sigma))+off;
5702 sinfo_gaussian_area(
double amp,
double sigma,
double x,
double x0,
double off)
5704 return sqrt(2*PI_NUMB*sigma*sigma)*exp((x-x0)*(x-x0)/(2*sigma*sigma))*
5716 sinfo_table_smooth_column(cpl_table** t,
const char* c,
const int r)
5723 check_nomsg(nrow=cpl_table_get_nrow(*t));
5724 check_nomsg(pval=cpl_table_get_data_double(*t,c));
5725 for(i=r;i<nrow;i++) {
5727 for(j=-r;j<=r;j++) {
5730 pval[i]=sum/(2*r+1);
5746 sinfo_shift_sky(cpl_frame** sky_frm,
5747 cpl_table** int_sky,
5748 const double zshift)
5755 cpl_propertylist* plist=NULL;
5756 cpl_imagelist* sky_cub=NULL;
5757 cpl_imagelist* sky_shift=NULL;
5758 cpl_table* int_sky_dup=NULL;
5764 cknull_nomsg(plist=cpl_propertylist_load(
5765 cpl_frame_get_filename(*sky_frm),0));
5771 sinfo_free_propertylist(&plist);
5773 cknull_nomsg(sky_cub=cpl_imagelist_load(cpl_frame_get_filename(*sky_frm),
5779 int_sky_dup=cpl_table_duplicate(*int_sky);
5780 sinfo_free_table(&(*int_sky));
5798 check_nomsg(*int_sky=sinfo_table_shift_simple(int_sky_dup,
"INT",zshift));
5806 sinfo_free_table(&int_sky_dup);
5825 check_nomsg(sky_shift=sinfo_cube_zshift_simple(sky_cub,(
float)zshift));
5831 sinfo_free_imagelist(&sky_shift);
5844 sinfo_free_imagelist(&sky_cub);
5849 sinfo_free_table(&int_sky_dup);
5850 sinfo_free_propertylist(&plist);
5851 sinfo_free_imagelist(&sky_shift);
5852 sinfo_free_imagelist(&sky_cub);
5864 sinfo_convolve_kernel(cpl_table** t,
const int rad)
5870 double* pidata=NULL;
5871 double* pcdata=NULL;
5878 cknull(*t,
"null input table");
5879 check_nomsg(cpl_table_new_column(*t,
"CNV",CPL_TYPE_DOUBLE));
5880 check_nomsg(pidata=cpl_table_get_data_double(*t,
"INT"));
5881 check_nomsg(pcdata=cpl_table_get_data_double(*t,
"CNV"));
5886 check_nomsg(np=cpl_table_get_nrow(*t));
5890 for(i=0;i<rad;i++) {
5893 for(i=np-rad;i<np;i++) {
5896 for(i=rad;i<np-rad;i++) {
5898 for(j=-rad;j<rad;j++) {
5902 check_nomsg(cpl_table_set_double(*t,
"CNV",i,val));
5921 sinfo_convolve_kernel2(cpl_table** t,
const int rad)
5927 double* pidata=NULL;
5928 double* pcdata=NULL;
5935 cknull(*t,
"null input table");
5936 check_nomsg(cpl_table_new_column(*t,
"CNV",CPL_TYPE_DOUBLE));
5937 check_nomsg(pidata=cpl_table_get_data_double(*t,
"INT"));
5938 check_nomsg(pcdata=cpl_table_get_data_double(*t,
"CNV"));
5943 check_nomsg(np=cpl_table_get_nrow(*t));
5949 for(i=0;i<rad;i++) {
5952 for(i=np-rad;i<np;i++) {
5955 for(i=0;i<np-rad;i++) {
5957 for(j=0;j<rad;j++) {
5961 check_nomsg(cpl_table_set_double(*t,
"CNV",i,val));
5980 sinfo_convolve_exp(cpl_table** t,
const int rad,
const double fwhm)
5985 double ln2=0.693147180560;
5988 double* pidata=NULL;
5989 double* pcdata=NULL;
5996 cknull(*t,
"null input table");
5997 check_nomsg(cpl_table_new_column(*t,
"CNV",CPL_TYPE_DOUBLE));
5998 check_nomsg(pidata=cpl_table_get_data_double(*t,
"INT"));
5999 check_nomsg(pcdata=cpl_table_get_data_double(*t,
"CNV"));
6004 check_nomsg(np=cpl_table_get_nrow(*t));
6008 for(i=0;i<rad;i++) {
6011 for(i=np-rad;i<np;i++) {
6014 for(i=rad;i<np-rad;i++) {
6016 for(j=-rad;j<rad;j++) {
6017 val+=pidata[i+j]*k*pow(2.0,-2.0*fabs(i-rad)/fwhm);
6020 check_nomsg(cpl_table_set_double(*t,
"CNV",i,val));
6039 sinfo_convolve_gauss(cpl_table** t,
const int rad,
const double fwhm)
6045 double sigma=fwhm/2.3548;
6046 double sigma2=sigma*sigma;
6047 double* pidata=NULL;
6048 double* pcdata=NULL;
6057 cknull(*t,
"null input table");
6058 check_nomsg(cpl_table_new_column(*t,
"CNV",CPL_TYPE_DOUBLE));
6059 check_nomsg(pidata=cpl_table_get_data_double(*t,
"INT"));
6060 check_nomsg(pcdata=cpl_table_get_data_double(*t,
"CNV"));
6065 check_nomsg(np=cpl_table_get_nrow(*t));
6071 for(i=0;i<rad;i++) {
6074 for(i=np-rad;i<np;i++) {
6077 for(i=rad;i<np-rad;i++) {
6079 for(j=-rad;j<rad;j++) {
6081 val+=pidata[i+j]*exp(-tx*tx/2.0/sigma2)/(sigma*sqrt(2.0*PI_NUMB));
6084 check_nomsg(cpl_table_set_double(*t,
"CNV",i,val));
6107 sinfo_scales_obj_sky_cubes(cpl_imagelist* obj_cub,
6108 cpl_imagelist* sky_cub,
6111 cpl_imagelist** obj_cor)
6122 double* podata=NULL;
6123 double* psdata=NULL;
6124 double* pbdata=NULL;
6125 double* pcdata=NULL;
6126 double* pscale=NULL;
6129 cpl_image* imgo=NULL;
6130 cpl_image* imgs=NULL;
6131 cpl_image* imgc=NULL;
6134 check_nomsg(imgo=cpl_imagelist_get(obj_cub,0));
6135 check_nomsg(xsz=cpl_image_get_size_x(imgo));
6136 check_nomsg(ysz=cpl_image_get_size_y(imgo));
6137 check_nomsg(zsz=cpl_imagelist_get_size(obj_cub));
6139 check_nomsg(*obj_cor=cpl_imagelist_duplicate(obj_cub));
6141 for(k=0;k<zsz;k++) {
6142 check_nomsg(imgo=cpl_imagelist_get(obj_cub,k));
6143 check_nomsg(imgc=cpl_imagelist_get(*obj_cor,k));
6144 check_nomsg(imgs=cpl_imagelist_get(sky_cub,k));
6146 check_nomsg(podata=cpl_image_get_data_double(imgo));
6147 check_nomsg(pcdata=cpl_image_get_data_double(imgc));
6148 check_nomsg(psdata=cpl_image_get_data_double(imgs));
6149 check_nomsg(pbdata=cpl_table_get_data_double(bkg,
"INT2"));
6150 check_nomsg(pscale=cpl_table_get_data_double(rscale,
"RATIO"));
6152 for (j=0;j<ysz; j++) {
6153 for (i=0;i<xsz; i++) {
6154 if(!irplib_isnan(podata[i+j*xsz]) &&
6155 !irplib_isnan(psdata[i+j*xsz]) &&
6156 !irplib_isnan(pbdata[k]) &&
6157 !irplib_isnan(pscale[k])) {
6158 pcdata[i+j*xsz] = podata[i+j*xsz]-
6159 (psdata[i+j*xsz]-pbdata[k])*pscale[k];
6190 sinfo_fitbkg(
const double x[],
6196 double fac = sinfo_fac(x[0],a[2]);
6205 *result = a[0]+a[1]*fac;
6234 sinfo_fitbkg_derivative(
const double x[],
6244 double fac = sinfo_fac(x[0],a[2]);
6256 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]));
6280 sinfo_fac(
const double x,
const double t)
6291 return pow(x,-5.)/(expm1(c/(x*fabs(t))));
6304 sinfo_table_threshold(cpl_table** t,
6306 const double low_cut,
6307 const double hig_cut,
6308 const double low_ass,
6309 const double hig_ass)
6315 cknull(*t,
"null input table!");
6317 check_nomsg(nrow=cpl_table_get_nrow(*t));
6318 check_nomsg(pdata=cpl_table_get_data_double(*t,column));
6320 for(i=0;i<nrow;i++) {
6322 if(pdata[i]<low_cut) {
6325 if (pdata[i] >= hig_cut) {
6367 sinfo_table_set(cpl_table** inp,
6368 const cpl_table* ref,
6376 const double* prw=NULL;
6380 cknull(*inp,
"NULL input table");
6381 cknull(ref,
"NULL reference table");
6383 check_nomsg(ninp=cpl_table_get_nrow(*inp));
6386 check_nomsg(prw=cpl_table_get_data_double_const(ref,
"WAVE"));
6387 check_nomsg(piw=cpl_table_get_data_double(*inp,
"WAVE"));
6391 for(i=0;i<ninp;i++) {
6393 if(fabs(piw[i]-prw[k]) < tol) {
6394 check_nomsg(cpl_table_set_double(*inp,
"RATIO",i,val));
6409 sinfo_table_shift_simple(cpl_table* inp,
6415 cpl_table* out=NULL;
6422 cknull(inp,
"null input table");
6424 check_nomsg(nrow=cpl_table_get_nrow(inp));
6425 check_nomsg(out=cpl_table_duplicate(inp));
6426 check_nomsg(cpl_table_fill_column_window(out,col,0,nrow,0));
6427 check_nomsg(pi=cpl_table_get_data_double(inp,col));
6428 check_nomsg(po=cpl_table_get_data_double(out,col));
6431 for(i=0;i<nrow;i++) {
6432 if((i+is)>0 && (i+is+1) < nrow) {
6433 m=pi[i+is+1]-pi[i+is];
6434 po[i]=pi[i+is]+m*ds;
6439 sinfo_free_table(&out);
6447 static cpl_imagelist*
6448 sinfo_cube_zshift_simple(cpl_imagelist* inp,
6470 cpl_imagelist* out=NULL;
6471 cpl_image* imgu=NULL;
6472 cpl_image* imgl=NULL;
6473 cpl_image* imgo=NULL;
6476 cknull(inp,
"null input cube");
6478 check_nomsg(nz=cpl_imagelist_get_size(inp));
6479 check_nomsg(out=cpl_imagelist_duplicate(inp));
6480 check_nomsg(imgo=cpl_imagelist_get(out,0));
6481 check_nomsg(nx=cpl_image_get_size_x(imgo));
6482 check_nomsg(ny=cpl_image_get_size_y(imgo));
6485 if((k+ks)>0 && (k+ks+1) < nz) {
6487 check_nomsg(imgu=cpl_imagelist_get(inp,k+ks+1));
6488 check_nomsg(imgl=cpl_imagelist_get(inp,k+ks));
6489 check_nomsg(imgo=cpl_imagelist_get(out,k));
6491 check_nomsg(pu=cpl_image_get_data_float(imgu));
6492 check_nomsg(pl=cpl_image_get_data_float(imgl));
6493 check_nomsg(po=cpl_image_get_data_float(imgo));
6501 po[nx*j+i]=int1+m*ds;
6510 sinfo_free_imagelist(&out);
6527 sinfo_get_line_ratio(cpl_table* obj_lin,
6539 cpl_table* obj_dif=NULL;
6540 cpl_table* sky_dif=NULL;
6548 cpl_vector* num=NULL;
6549 cpl_vector* den=NULL;
6550 cpl_vector* rat=NULL;
6551 cpl_vector* wav=NULL;
6557 cpl_polynomial* cfit=NULL;
6560 cknull(obj_lin,
"null obj line table");
6561 cknull(sky_lin,
"null sky line table");
6563 cknull(obj_cnt,
"null obj cont table");
6564 cknull(sky_cnt,
"null sky cont table");
6567 cknull_nomsg(obj_dif=sinfo_table_subtract_continuum(obj_lin,obj_cnt));
6568 cknull_nomsg(sky_dif=sinfo_table_subtract_continuum(sky_lin,sky_cnt));
6570 check_nomsg(nobj=cpl_table_get_nrow(obj_dif));
6571 check_nomsg(nsky=cpl_table_get_nrow(sky_dif));
6583 ck0_nomsg(sinfo_get_line_ratio_amoeba(obj_dif,sky_dif,r));
6584 sinfo_free_table(&obj_dif);
6585 sinfo_free_table(&sky_dif);
6590 check_nomsg(poi=cpl_table_get_data_double(obj_dif,
"INT"));
6591 check_nomsg(psi=cpl_table_get_data_double(sky_dif,
"INT"));
6593 check_nomsg(num=cpl_vector_new(nobj));
6594 check_nomsg(den=cpl_vector_new(nobj));
6595 check_nomsg(rat=cpl_vector_new(nobj));
6596 check_nomsg(cpl_vector_fill(num,0));
6597 check_nomsg(cpl_vector_fill(den,0));
6598 check_nomsg(cpl_vector_fill(rat,0));
6599 check_nomsg(pvd=cpl_vector_get_data(den));
6600 check_nomsg(pvn=cpl_vector_get_data(num));
6601 check_nomsg(pvr=cpl_vector_get_data(rat));
6603 for(i=0;i<nobj;i++) {
6604 if(!irplib_isnan(psi[i]) &&
6605 !irplib_isnan(poi[i]) &&
6606 !irplib_isinf(psi[i]) &&
6607 !irplib_isinf(poi[i]) ) {
6608 pvn[i]=psi[i]*poi[i];
6609 pvd[i]=psi[i]*psi[i];
6611 pvr[i]=poi[i]/psi[i];
6615 sinfo_free_table(&sky_dif);
6617 check_nomsg(mnum=cpl_vector_get_median_const(num));
6618 check_nomsg(mden=cpl_vector_get_median_const(den));
6619 check_nomsg(tnum=cpl_vector_get_mean(num)*nobj);
6620 check_nomsg(tden=cpl_vector_get_mean(den)*nobj);
6624 sinfo_free_my_vector(&num);
6625 sinfo_free_my_vector(&den);
6628 }
else if (method == 2) {
6630 }
else if (method == 3) {
6631 *r=cpl_vector_get_median_const(rat);
6632 }
else if (method == 4) {
6633 *r=cpl_vector_get_mean(rat);
6634 }
else if (method == 5) {
6636 check_nomsg(wav=cpl_vector_wrap(nobj,
6637 cpl_table_get_data_double(obj_dif,
"WAVE")));
6638 check_nomsg(cfit=sinfo_polynomial_fit_1d_create(wav,rat,0,&mse));
6639 sinfo_unwrap_vector(&wav);
6642 check_nomsg(*r=cpl_polynomial_get_coeff(cfit,pows));
6643 sinfo_free_polynomial(&cfit);
6647 sinfo_free_table(&obj_dif);
6648 sinfo_free_my_vector(&rat);
6651 sinfo_free_table(&obj_dif);
6652 sinfo_free_table(&sky_dif);
6653 sinfo_free_my_vector(&num);
6654 sinfo_free_my_vector(&den);
6655 sinfo_free_my_vector(&rat);
6656 sinfo_unwrap_vector(&wav);
6674 sinfo_get_line_ratio_amoeba(cpl_table* obj,
6688 check_nomsg(np=cpl_table_get_nrow(obj));
6689 check_nomsg(sa_ox=cpl_vector_wrap(np,cpl_table_get_data_double(obj,
"WAVE")));
6690 check_nomsg(sa_oy=cpl_vector_wrap(np,cpl_table_get_data_double(obj,
"INT")));
6691 check_nomsg(sa_sy=cpl_vector_wrap(np,cpl_table_get_data_double(sky,
"INT")));
6695 ap=(
double**) cpl_calloc(MP,
sizeof(
double*));
6697 ap[i]=cpl_calloc(NP,
sizeof(
double));
6707 y[i]=sinfo_fit_sky(p0);
6711 check_nomsg(sinfo_fit_amoeba(ap,y,NP,AMOEBA_FTOL,sinfo_fit_sky,&nfunc));
6713 sinfo_msg(
"After amoeba fit");
6714 sinfo_msg(
"ap[0][0]=%g ap[0][1]=%g",ap[0][0],ap[1][0]);
6718 sinfo_unwrap_vector(&sa_ox);
6719 sinfo_unwrap_vector(&sa_oy);
6720 sinfo_unwrap_vector(&sa_sy);
6721 sinfo_new_destroy_2Ddoublearray(&ap,MP);
6727 sinfo_unwrap_vector(&sa_ox);
6728 sinfo_unwrap_vector(&sa_oy);
6729 sinfo_unwrap_vector(&sa_sy);
6730 sinfo_new_destroy_2Ddoublearray(&ap,MP);
6749 sinfo_fit_sky(
double p[])
6755 cpl_vector* vtmp=NULL;
6761 cpl_polynomial* pfit=NULL;
6767 check_nomsg(pfit=sinfo_polynomial_fit_1d_create(sa_ox,sa_oy,0,&mse));
6770 check_nomsg(cont=cpl_polynomial_get_coeff(pfit,pows));
6771 check_nomsg(sinfo_free_polynomial(&pfit));
6772 check_nomsg(cpl_vector_subtract_scalar(sa_oy,cont));
6776 check_nomsg(pfit=sinfo_polynomial_fit_1d_create(sa_ox,sa_sy,0,&mse));
6779 check_nomsg(cont=cpl_polynomial_get_coeff(pfit,pows));
6780 check_nomsg(sinfo_free_polynomial(&pfit));
6781 check_nomsg(cpl_vector_subtract_scalar(sa_sy,cont));
6784 check_nomsg(po= cpl_vector_get_data(sa_oy));
6785 check_nomsg(ps= cpl_vector_get_data(sa_sy));
6787 check_nomsg(np=cpl_vector_get_size(sa_oy));
6788 check_nomsg(vtmp=cpl_vector_new(np));
6789 check_nomsg(pv= cpl_vector_get_data(vtmp));
6793 pv[i]=po[i]-ps[i]*p[0];
6796 check_nomsg(rms=cpl_vector_get_stdev(vtmp));
6797 sinfo_free_my_vector(&vtmp);
6800 sinfo_free_my_vector(&vtmp);
6819 sinfo_table_interpol(cpl_table* obj_lin,
6826 cpl_table* out=NULL;
6827 cpl_table* obj_dif=NULL;
6828 cpl_table* sky_dif=NULL;
6829 cknull(obj_lin,
"null line table");
6830 cknull(obj_cnt,
"null cont table");
6832 cknull_nomsg(obj_dif=sinfo_table_subtract_continuum(obj_lin,obj_cnt));
6833 cknull_nomsg(sky_dif=sinfo_table_subtract_continuum(sky_lin,sky_cnt));
6835 check_nomsg(out=cpl_table_duplicate(obj_dif));
6836 check_nomsg(cpl_table_duplicate_column(out,
"CSKY",sky_dif,
"INT"));
6837 check_nomsg(cpl_table_multiply_scalar(out,
"CSKY",r));
6838 check_nomsg(cpl_table_subtract_columns(out,
"INT",
"CSKY"));
6840 sinfo_free_table(&obj_dif);
6841 sinfo_free_table(&sky_dif);
6846 sinfo_free_table(&obj_dif);
6847 sinfo_free_table(&sky_dif);
6848 sinfo_free_table(&out);
6867 sinfo_table_subtract_continuum(cpl_table* lin,
6872 cpl_table* out=NULL;
6877 cpl_vector* vx=NULL;
6878 cpl_vector* vy=NULL;
6879 cpl_polynomial* cfit=NULL;
6884 cknull(lin,
"null line table");
6885 cknull(cnt,
"null cont table");
6886 check_nomsg(out=cpl_table_duplicate(lin));
6887 check_nomsg(cpl_table_new_column(out,
"CONT",CPL_TYPE_DOUBLE));
6888 check_nomsg(nlin=cpl_table_get_nrow(lin));
6889 check_nomsg(ncnt=cpl_table_get_nrow(cnt));
6891 check_nomsg(cpl_table_fill_column_window(out,
"CONT",0,nlin,0));
6894 check_nomsg(vx=cpl_vector_wrap(ncnt,cpl_table_get_data_double(cnt,
"WAVE")));
6895 check_nomsg(vy=cpl_vector_wrap(ncnt,cpl_table_get_data_double(cnt,
"INT")));
6896 check_nomsg(cfit=sinfo_polynomial_fit_1d_create(vx,vy,0,&mse));
6897 sinfo_unwrap_vector(&vx);
6898 sinfo_unwrap_vector(&vy);
6902 check_nomsg(yfit=cpl_polynomial_get_coeff(cfit,pows));
6903 sinfo_free_polynomial(&cfit);
6906 check_nomsg(poi=cpl_table_get_data_double(out,
"CONT"));
6907 for(i=0;i<nlin;i++) {
6911 check_nomsg(cpl_table_subtract_columns(out,
"INT",
"CONT"));
6912 check_nomsg(cpl_table_erase_column(out,
"CONT"));
6919 sinfo_unwrap_vector(&vx);
6920 sinfo_unwrap_vector(&vy);
6921 sinfo_free_polynomial(&cfit);
6922 sinfo_free_table(&out);
6929 sinfo_compute_line_ratio(cpl_table* obj,
6933 const cpl_table* sel_regions,
6934 cpl_table* cont_regions,
6937 cpl_table* line_regions=NULL;
6938 cpl_table* obj_cnt=NULL;
6939 cpl_table* sky_cnt=NULL;
6940 cpl_table* obj_lin=NULL;
6941 cpl_table* sky_lin=NULL;
6942 cpl_table* lres=NULL;
6951 check_nomsg(line_regions = cpl_table_duplicate(sel_regions));
6954 check_nomsg(obj_lin=sinfo_table_select_range(obj,line_regions,wtol));
6955 check_nomsg(sky_lin=sinfo_table_select_range(sky,line_regions,wtol));
6956 check_nomsg(obj_cnt=sinfo_table_select_range(obj,cont_regions,wtol));
6957 check_nomsg(sky_cnt=sinfo_table_select_range(sky,cont_regions,wtol));
6959 ck0_nomsg(sinfo_get_line_ratio(obj_lin,obj_cnt,sky_lin,sky_cnt,meth,r));
6969 check_nomsg(lres=sinfo_table_interpol(obj_lin,obj_cnt,sky_lin,sky_cnt,*r));
6971 check_nomsg(fmed = cpl_table_get_column_median(lres,
"INT"));
6972 check_nomsg(fsdv = cpl_table_get_column_stdev(lres,
"INT"));
6973 fthresh=fmed+3*fsdv;
6975 check_nomsg(cpl_table_duplicate_column(lres,
"AINT",lres,
"INT"));
6976 check_nomsg(cpl_table_multiply_columns(lres,
"AINT",
"INT"));
6977 check_nomsg(cpl_table_power_column(lres,
"AINT",0.5));
6978 check_nomsg(fclip_i=cpl_table_and_selected_double(lres,
"AINT",
6981 check_nomsg(cpl_table_select_all(lres));
6986 check_nomsg(line_i=cpl_table_and_selected_double(lres,
"AINT",
6989 sinfo_free_table(&line_regions);
6990 check_nomsg(line_regions=cpl_table_extract_selected(lres));
6991 sinfo_free_table(&lres);
6993 check_nomsg(cpl_table_erase_column(line_regions,
"INT"));
6994 check_nomsg(cpl_table_erase_column(line_regions,
"AINT"));
6999 sinfo_free_table(&obj_lin);
7000 sinfo_free_table(&sky_lin);
7001 check_nomsg(obj_lin=sinfo_table_select_range(obj,line_regions,wtol));
7002 check_nomsg(sky_lin=sinfo_table_select_range(sky,line_regions,wtol));
7004 sinfo_free_table(&line_regions);
7008 ck0_nomsg(sinfo_get_line_ratio(obj_lin,obj_cnt,sky_lin,sky_cnt,meth,r));
7013 sinfo_free_table(&obj_cnt);
7014 sinfo_free_table(&sky_cnt);
7015 sinfo_free_table(&sky_lin);
7016 sinfo_free_table(&obj_lin);
7017 sinfo_free_table(&lres);
7018 sinfo_free_table(&line_regions);
7027 sinfo_free_table(&obj_cnt);
7028 sinfo_free_table(&sky_cnt);
7029 sinfo_free_table(&sky_lin);
7030 sinfo_free_table(&obj_lin);
7032 sinfo_free_table(&lres);
7033 sinfo_free_table(&line_regions);
7050 sinfo_find_rot_waves(
7051 const double w_rot[],
7053 const double w_step,
7063 cpl_table* w_sel=NULL;
7064 cpl_table* res=NULL;
7066 check_nomsg(res = cpl_table_new(0));
7068 check_nomsg(cpl_table_copy_structure(res,range));
7070 for (i=0; i< NROT; i++) {
7075 w_min=w_rot[i]-npix_w*w_step;
7076 w_max=w_rot[i]+npix_w*w_step;
7078 check_nomsg(cpl_table_and_selected_double(range,
"WAVE",
7079 CPL_GREATER_THAN,w_min));
7080 check_nomsg(cpl_table_and_selected_double(range,
"WAVE",
7081 CPL_LESS_THAN,w_max));
7082 sinfo_free_table(&w_sel);
7083 check_nomsg(w_sel=cpl_table_extract_selected(range));
7084 check_nomsg(x_i=cpl_table_get_nrow(w_sel));
7087 check_nomsg(r_start=cpl_table_get_nrow(res));
7089 check_nomsg(cpl_table_insert(res,w_sel,r_start));
7091 check_nomsg(cpl_table_select_all(range));
7095 sinfo_free_table(&w_sel);
7101 sinfo_free_table(&w_sel);
7102 sinfo_free_table(&res);
7120 sinfo_get_obj_sky_wav_sub(cpl_table* obj,
7125 cpl_table** sub_obj,
7126 cpl_table** sub_sky,
7127 cpl_table** sub_wav)
7130 cknull_nomsg(*sub_obj = sinfo_table_select_range(obj,sel,wtol));
7131 cknull_nomsg(*sub_sky = sinfo_table_select_range(sky,sel,wtol));
7132 cknull_nomsg(*sub_wav = sinfo_table_select_range(wav,sel,wtol));
7136 sinfo_free_table(&(*sub_obj));
7137 sinfo_free_table(&(*sub_sky));
7138 sinfo_free_table(&(*sub_wav));
7145 sinfo_get_sub_regions(cpl_table* sky,
7153 cpl_table* x1_sub=NULL;
7159 cknull(sky,
"Null input sky table");
7160 cknull(x1 ,
"Null input x1 table");
7161 cknull(pos,
"Null input pos table");
7163 check_nomsg(x2=cpl_table_duplicate(sky));
7164 check_nomsg(nrow=cpl_table_get_nrow(sky));
7165 check_nomsg(cpl_table_fill_column_window(x2,
"INT",0,nrow,0));
7172 x1_sub=sinfo_table_select_range(x1,pos,wtol);
7174 if(x1_sub != NULL) {
7175 ck0_nomsg(sinfo_table_fill_column_over_range(&x2,x1_sub,
"INT",10.,wtol));
7176 sinfo_free_table(&x1_sub);
7177 check_nomsg(sinfo_convolve_kernel(&x2,npixw/2));
7178 check_nomsg(np=cpl_table_and_selected_double(x2,
"CNV",CPL_GREATER_THAN,0));
7179 check_nomsg(*res=cpl_table_extract_selected(x2));
7180 sinfo_free_table(&x2);
7181 check_nomsg(cpl_table_erase_column(*res,
"INT"));
7182 check_nomsg(cpl_table_erase_column(*res,
"CNV"));
7186 sinfo_free_table(&x1_sub);
7187 sinfo_free_table(&x2);
7195 sinfo_free_table(&x1_sub);
7196 sinfo_free_table(&x2);
7202 sinfo_table_extract_rest(cpl_table* inp,
7208 cpl_table* out=NULL;
7218 cpl_table* tmp=NULL;
7220 cknull(inp,
"null input table");
7223 check_nomsg(tmp=cpl_table_duplicate(inp));
7224 check_nomsg(nrow=cpl_table_get_nrow(tmp));
7225 check_nomsg(cpl_table_new_column(tmp,
"SEL",CPL_TYPE_INT));
7226 check_nomsg(cpl_table_fill_column_window_int(tmp,
"SEL",0,nrow,0));
7228 check_nomsg(pinp=cpl_table_get_data_double(inp,
"WAVE"));
7229 check_nomsg(plow=cpl_table_get_data_double(low,
"WAVE"));
7230 check_nomsg(pmed=cpl_table_get_data_double(med,
"WAVE"));
7231 nlow=cpl_table_get_nrow(low);
7237 for(i=0;i<nrow;i++) {
7238 if(fabs(pinp[i]-plow[k]) < wtol) {
7239 cpl_table_set_int(tmp,
"SEL",k,-1);
7244 nmed=cpl_table_get_nrow(med);
7248 for(i=0;i<nrow;i++) {
7249 if(fabs(pinp[i]-pmed[k]) < wtol) {
7250 cpl_table_set_int(tmp,
"SEL",k,-1);
7256 check_nomsg(cpl_table_and_selected_int(tmp,
"SEL",CPL_GREATER_THAN,-1));
7257 check_nomsg(out=cpl_table_extract_selected(tmp));
7258 sinfo_free_table(&tmp);
7259 check_nomsg(cpl_table_erase_column(out,
"SEL"));
7264 sinfo_free_table(&tmp);