42 #include <sinfo_cpl_size.h>
44 #include <irplib_utils.h>
45 #include <irplib_strehl.h>
46 #include "sinfo_new_psf.h"
47 #include "sinfo_pro_save.h"
48 #include "sinfo_hidden.h"
49 #include "sinfo_key_names.h"
50 #include "sinfo_psf_ini.h"
51 #include "sinfo_psf_ini_by_cpl.h"
52 #include "sinfo_utilities_scired.h"
53 #include "sinfo_hidden.h"
54 #include "sinfo_pfits.h"
55 #include "sinfo_functions.h"
56 #include "sinfo_error.h"
57 #include "sinfo_utils_wrappers.h"
58 #include "sinfo_globals.h"
60 #include "sinfo_dfs.h"
65 #define SINFO_MATH_PI 3.1415926535897932384626433832795028841971693993751058
66 #define SINFO_MATH_PI_2 1.5707963267948966192313216916397514420985846996875529
67 #define SINFO_MATH_PI_4 0.7853981633974483096156608458198757210492923498437765
71 #define SINFO_STREHL_M1 8.0 //7.9
72 #define SINFO_STREHL_M2 1.1 //1.33
73 #define SINFO_STREHL_BOX_SIZE 64
74 #define SINFO_STREHL_WINDOW 6
75 #define SINFO_PSF_SZ 4
76 #define SINFO_RSTAR 32//25
77 #define SINFO_BKG_R1 32//25
78 #define SINFO_BKG_R2 33//27
79 #define SINFO_STREHL_ERROR_COEFFICIENT SINFO_MATH_PI * 0.007 / 0.0271
80 #ifndef SINFO_STREHL_RAD_CENTRAL
81 #define SINFO_STREHL_RAD_CENTRAL 5
86 #define SINFO_PSF_DIM 1024//256
87 #define SINFO_PSF_BLOCKS 63//11
89 #define SINFO_PSF_BIN 16 // Pixels over "pixel_size"
90 #define SINFO_PSF_NPOINT 10000// number of encircled energy sampling points
91 #define SINFO_BKG_BOX_SZ 8
96 sinfo_add_com_psf_qclog(
const char* fname,cpl_table** qclog_tbl);
100 sinfo_get_star_features(
const cpl_image* im,
111 sinfo_find_min_of_four(
const double n1,
117 sinfo_get_strehl_from_2images(cpl_image* ima1,
124 sinfo_get_strehl_input1(cpl_frame* frm1,
131 double* strehl_star_rad,
132 double* strehl_bg_rmin,
133 double* strehl_bg_rmax);
136 sinfo_get_strehl_input2(cpl_frame* frm1,cpl_frame* frm2,
145 double* strehl_star_rad1,
146 double* strehl_star_rad2,
147 double* strehl_bg_rmin1,
148 double* strehl_bg_rmin2,
149 double* strehl_bg_rmax1,
150 double* strehl_bg_rmax2);
154 sinfo_check_borders(cpl_size* val,
const int max,
const int thresh);
157 sinfo_get_safe_box(
int* llx,
168 sinfo_get_strehl_from_slice(cpl_imagelist* cube,
174 double strehl_star_radius,
182 sinfo_get_encircled_energy(cpl_frameset* sof,
189 sinfo_get_strehl_from_ima(cpl_image* ima,
193 sinfo_get_strehl_from_image(cpl_image* img,
197 double strehl_star_radius,
206 sinfo_get_strehl_from_cube(cpl_imagelist* cube,
211 sinfo_get_frm12(cpl_frameset* sof,cpl_frame** frm1,cpl_frame** frm2);
237 sinfo_new_psf (
const char* plugin_id,
238 cpl_parameterlist* config,
239 cpl_frameset* sof, cpl_frameset* ref_set)
242 cpl_imagelist* cube1=NULL;
243 cpl_imagelist* cube2=NULL;
244 cpl_image * med_img1=NULL ;
245 cpl_image * med_img2=NULL ;
247 cpl_table* ao_performance=NULL;
248 cpl_table* enc_energy=NULL;
250 cpl_frame* frm1=NULL;
251 cpl_frame* frm2=NULL;
253 cpl_table* qclog_tbl=NULL;
254 cpl_frameset* stk=NULL;
255 cpl_propertylist* plist =NULL;
257 psf_config * cfg =NULL;
286 char fname1[MAX_NAME_SIZE];
287 char fname2[MAX_NAME_SIZE];
289 char key_name[MAX_NAME_SIZE];
291 char obs_name1[MAX_NAME_SIZE];
294 cpl_table* tmp_tbl=NULL;
304 sinfo_msg(
"Parsing cpl input");
305 check_nomsg(stk=cpl_frameset_new());
307 cknull(cfg = sinfo_parse_cpl_input_psf(sof,&stk),
308 "error parsing cpl input");
311 strehl_sw=sinfo_get_strehl_type(sof);
313 sinfo_msg(
"One target Strehl computation");
314 if(sinfo_is_fits_file(cfg->inFrame) != 1) {
318 strcpy(fname1,cfg->inFrame);
321 if(NULL != cpl_frameset_find(sof,PRO_COADD_PSF)) {
322 frm1 = cpl_frameset_find(sof,PRO_COADD_PSF);
323 }
else if(NULL != cpl_frameset_find(sof,PRO_OBS_PSF)) {
324 frm1 = cpl_frameset_find(sof,PRO_OBS_PSF);
325 }
else if(NULL != cpl_frameset_find(sof,PRO_COADD_STD)) {
326 frm1 = cpl_frameset_find(sof,PRO_COADD_STD);
327 }
else if(NULL != cpl_frameset_find(sof,PRO_OBS_STD)) {
328 frm1 = cpl_frameset_find(sof,PRO_OBS_STD);
329 }
else if(NULL != cpl_frameset_find(sof,PRO_COADD_OBJ)) {
330 frm1 = cpl_frameset_find(sof,PRO_COADD_OBJ);
331 }
else if(NULL != cpl_frameset_find(sof,PRO_OBS_OBJ)) {
332 frm1 = cpl_frameset_find(sof,PRO_OBS_OBJ);
335 PRO_COADD_PSF,PRO_OBS_PSF,
336 PRO_COADD_STD,PRO_OBS_STD,
337 PRO_COADD_OBJ,PRO_OBS_OBJ);
341 sinfo_get_obsname(frm1,obs_name1);
342 check_nomsg(hlamp_st=sinfo_get_keyvalue_bool(frm1,KEY_NAME_LAMP_HALO));
343 check_nomsg(shut2_st=sinfo_get_keyvalue_bool(frm1,KEY_NAME_SHUT2_ST));
346 check_nomsg(cube1 = cpl_imagelist_load(fname1,CPL_TYPE_FLOAT,0));
347 cknull(med_img1=sinfo_new_median_cube(cube1),
348 " could not do sinfo_medianCube()");
350 check_nomsg(ilx1=cpl_image_get_size_x(med_img1));
351 check_nomsg(ily1=cpl_image_get_size_y(med_img1));
353 cx1 = ilx1 / 2. + 0.5;
354 cy1 = ily1 / 2. + 0.5;
356 cknull(ao_performance=sinfo_get_strehl_from_cube(cube1,fname1,frm1),
357 "error computing strehl");
358 strehl=sinfo_get_strehl_from_ima(med_img1,frm1);
359 sinfo_free_imagelist(&cube1);
361 sinfo_msg(
"Two target Strehl computation");
362 sinfo_get_frm12(sof,&frm1,&frm2);
363 strcpy(fname1,cpl_frame_get_filename(frm1));
364 strcpy(fname2,cpl_frame_get_filename(frm2));
366 check_nomsg(cube1 = cpl_imagelist_load(fname1,CPL_TYPE_FLOAT,0));
367 check_nomsg(cube2 = cpl_imagelist_load(fname2,CPL_TYPE_FLOAT,0));
368 cknull(med_img1=sinfo_new_median_cube(cube1),
"Computing median on cube");
369 cknull(med_img2=sinfo_new_median_cube(cube2),
"Computing median on cube");
370 check_nomsg(cpl_image_save(med_img1,
"med_img1.fits",CPL_BPP_IEEE_FLOAT,
371 NULL,CPL_IO_DEFAULT));
372 check_nomsg(cpl_image_save(med_img2,
"med_img2.fits",CPL_BPP_IEEE_FLOAT,
373 NULL,CPL_IO_DEFAULT));
376 check_nomsg(ilx1=cpl_image_get_size_x(med_img1));
377 check_nomsg(ily1=cpl_image_get_size_y(med_img1));
382 cx1 = ilx1 / 2. + 0.5;
383 cy1 = ily1 / 2. + 0.5;
389 sinfo_free_imagelist(&cube1);
390 sinfo_free_imagelist(&cube2);
392 cknull(tmp_tbl=sinfo_get_strehl_from_2images(med_img1,med_img2,frm1,frm2),
394 check_nomsg(strehl=cpl_table_get_double(tmp_tbl,
"strehl",0,&status));
395 sinfo_free_table(&tmp_tbl);
396 strehl1=sinfo_get_strehl_from_ima(med_img1,frm1);
398 strehl2=sinfo_get_strehl_from_ima(med_img2,frm2);
401 cknull_nomsg(qclog_tbl = sinfo_qclog_init());
402 check_nomsg(sinfo_add_com_psf_qclog(fname1,&qclog_tbl));
403 if(irplib_isnan(strehl1)) strehl1=-100.;
404 ck0_nomsg(sinfo_qclog_add_double(qclog_tbl,
"QC STREHL025",strehl1,
405 "STREHL 25 mas",
"%f"));
406 ck0(sinfo_pro_save_ima(med_img1,ref_set,sof,PSF_MED_CUB_025_FILENAME,
407 PRO_MED_COADD_PSF,qclog_tbl,plugin_id,config),
408 "cannot save ima %s", PSF_MED_CUB_100_FILENAME);
409 sinfo_free_table(&qclog_tbl);
412 cknull_nomsg(qclog_tbl = sinfo_qclog_init());
413 check_nomsg(sinfo_add_com_psf_qclog(fname2,&qclog_tbl));
414 if(irplib_isnan(strehl2)) strehl2=-100.;
415 ck0_nomsg(sinfo_qclog_add_double(qclog_tbl,
"QC STREHL100",strehl2,
416 "STREHL 100 mas",
"%f"));
418 if(irplib_isnan(strehl)) strehl=-100.;
420 ck0_nomsg(sinfo_qclog_add_double(qclog_tbl,
"QC STREHL",strehl,
421 "STREHL from both pixel scale images",
"%f"));
422 ck0(sinfo_pro_save_ima(med_img2,ref_set,sof,PSF_MED_CUB_100_FILENAME,
423 PRO_MED_COADD_PSF,qclog_tbl,plugin_id,config),
424 "cannot save ima %s", PSF_MED_CUB_100_FILENAME);
426 sinfo_free_table(&qclog_tbl);
427 sinfo_free_image(&med_img2);
432 check_nomsg(nsample=cpl_table_get_nrow(ao_performance));
433 cknull_nomsg(qclog_tbl = sinfo_qclog_init());
434 check_nomsg(sinfo_add_com_psf_qclog(fname1,&qclog_tbl));
437 if(irplib_isnan(strehl)) strehl=-100.;
439 ck0_nomsg(sinfo_qclog_add_double(qclog_tbl,
"QC STREHL",strehl,
440 "STREHL from image",
"%f"));
444 check_nomsg(strehl=cpl_table_get_column_median(ao_performance,
"strehl"));
446 ck0_nomsg(sinfo_qclog_add_double(qclog_tbl,
"QC STREHL MED",strehl,
447 "STREHL MEDIAN",
"%f"));
449 check_nomsg(strehl=cpl_table_get_column_mean(ao_performance,
"strehl"));
451 ck0_nomsg(sinfo_qclog_add_double(qclog_tbl,
"QC STREHL AVG",strehl,
452 "STREHL AVERAGE",
"%f"));
459 for(i=1;i<nsample;i++) {
461 check_nomsg(strehl=cpl_table_get_double(ao_performance,
"strehl",
463 if(irplib_isnan(strehl)) strehl=-100.;
465 snprintf(key_name,MAX_NAME_SIZE-1,
"%s%d",
"QC STREHL",i);
466 ck0_nomsg(sinfo_qclog_add_double(qclog_tbl,key_name,strehl,
"STREHL",
"%f"));
468 check_nomsg(lam=cpl_table_get_double(ao_performance,
"wavelength",
470 snprintf(key_name,MAX_NAME_SIZE-1,
"%s%d",
"QC LAMBDA",i);
471 ck0_nomsg(sinfo_qclog_add_double(qclog_tbl,key_name,lam,
476 check_nomsg(strehl=cpl_table_get_column_median(ao_performance,
478 ck0_nomsg(sinfo_qclog_add_double(qclog_tbl,
"QC STREHL MEDERR",strehl,
479 "STREHL ERROR MEDIAN",
"%f"));
480 ck0_nomsg(sinfo_qclog_add_string(qclog_tbl,
"OBS NAME",obs_name1,
482 ck0_nomsg(sinfo_qclog_add_bool(qclog_tbl,PAF_NAME_LAMP_HALO,hlamp_st,
483 KEY_NAME_LAMP_HALO,
"%d"));
484 ck0_nomsg(sinfo_qclog_add_bool(qclog_tbl,PAF_NAME_SHUT2_ST,shut2_st,
485 KEY_NAME_SHUT2_ST,
"%d"));
487 ck0(sinfo_pro_save_tbl(ao_performance,ref_set,sof,
488 PSF_AO_PERFORMANCE_OUT_FILENAME,
489 PRO_AO_PERFORMANCE,qclog_tbl,plugin_id,config),
490 "cannot save tbl %s", PSF_AO_PERFORMANCE_OUT_FILENAME);
492 sinfo_free_table(&qclog_tbl);
493 sinfo_free_table(&ao_performance);
496 cknull_nomsg(qclog_tbl=sinfo_qclog_init());
497 cknull(enc_energy=sinfo_get_encircled_energy(sof,
502 "Computing encircled energy");
504 ck0(sinfo_pro_save_tbl(enc_energy,ref_set,sof,PSF_ENC_ENERGY_OUT_FILENAME,
505 PRO_ENC_ENERGY,qclog_tbl,plugin_id,config),
506 "cannot save tbl %s", PSF_ENC_ENERGY_OUT_FILENAME);
508 sinfo_free_table(&qclog_tbl);
509 sinfo_free_table(&enc_energy);
512 cknull_nomsg(qclog_tbl = sinfo_qclog_init());
513 ck0_nomsg(sinfo_qclog_add_double(qclog_tbl,
"QC FWHMX",fwhm_x,
515 ck0_nomsg(sinfo_qclog_add_double(qclog_tbl,
"QC FWHMY",fwhm_y,
517 ck0_nomsg(sinfo_qclog_add_bool(qclog_tbl,PAF_NAME_LAMP_HALO,
518 hlamp_st,KEY_NAME_LAMP_HALO,
"%d"));
519 ck0_nomsg(sinfo_qclog_add_bool(qclog_tbl,PAF_NAME_SHUT2_ST,shut2_st,
520 KEY_NAME_SHUT2_ST,
"%d"));
522 ck0(sinfo_pro_save_ima(med_img1,ref_set,sof,cfg->outName,PRO_PSF,
523 qclog_tbl,plugin_id,config),
524 "cannot save ima %s", cfg->outName);
526 sinfo_free_table(&qclog_tbl);
527 sinfo_new_set_wcs_image(med_img1,cfg->outName,cx1, cy1);
528 sinfo_free_image(&med_img1);
529 sinfo_free_frameset(&stk);
530 sinfo_free_psf(&cfg);
535 sinfo_free_table(&qclog_tbl);
536 sinfo_free_imagelist(&cube2);
537 sinfo_free_imagelist(&cube1);
538 sinfo_free_table(&enc_energy);
539 sinfo_free_image(&med_img1);
540 sinfo_free_table(&ao_performance);
541 sinfo_free_propertylist(&plist) ;
542 sinfo_free_psf(&cfg);
543 sinfo_free_frameset(&stk);
552 static cpl_error_code
553 sinfo_add_com_psf_qclog(
const char* fname,cpl_table** qclog_tbl)
556 cpl_propertylist* plist=NULL;
559 cknull(plist = cpl_propertylist_load(fname, 0),
560 "getting header from reference ima frame %s",fname);
562 if (cpl_propertylist_has(plist, KEY_NAME_LOOP_STATE)) {
563 sinfo_qclog_add_string(*qclog_tbl,KEY_NAME_LOOP_STATE,
564 cpl_propertylist_get_string(plist,KEY_NAME_LOOP_STATE),
565 KEY_HELP_LOOP_STATE,
"%s");
570 if (cpl_propertylist_has(plist, KEY_NAME_LOOP_LGS)) {
571 sinfo_qclog_add_int(*qclog_tbl,KEY_NAME_LOOP_LGS,
572 cpl_propertylist_get_int(plist,KEY_NAME_LOOP_LGS),
573 KEY_HELP_LOOP_LGS,
"%d");
577 if (cpl_propertylist_has(plist, KEY_NAME_INS1_MODE)) {
578 sinfo_qclog_add_string(*qclog_tbl,KEY_NAME_INS1_MODE,
579 cpl_propertylist_get_string(plist,KEY_NAME_INS1_MODE),
580 KEY_HELP_INS1_MODE,
"%s");
585 sinfo_free_propertylist(&plist);
587 if (cpl_error_get_code() != CPL_ERROR_NONE) {
588 return cpl_error_get_code();
590 return CPL_ERROR_NONE;
597 sinfo_get_strehl_from_image(cpl_image* img,
601 double strehl_star_radius,
607 cpl_errorstate clean_state = cpl_errorstate_get();
609 cpl_image* img_dup=NULL;
622 cpl_size max_ima_x=0;
623 cpl_size max_ima_y=0;
632 double lam = (double)0.5*(ws+we);
635 check_nomsg(img_dup=cpl_image_duplicate(img));
636 sinfo_clean_nan(&img_dup);
637 check_nomsg(cpl_image_get_maxpos(img_dup,&max_ima_x,&max_ima_y));
638 sinfo_free_image(&img_dup);
640 check_nomsg(ima_szx=cpl_image_get_size_x(img));
641 check_nomsg(ima_szy=cpl_image_get_size_y(img));
642 sinfo_check_borders(&max_ima_x,ima_szx,SINFO_STREHL_WINDOW);
643 sinfo_check_borders(&max_ima_y,ima_szy,SINFO_STREHL_WINDOW);
644 sinfo_get_safe_box(&wllx,&wlly,&wurx,&wury,max_ima_x,max_ima_y,SINFO_PSF_SZ,
655 if(CPL_ERROR_NONE != sinfo_strehl_compute_one(img,
666 SINFO_STREHL_BOX_SIZE,
679 irplib_error_recover(clean_state,
"Problem computing strehl");
697 sinfo_get_strehl_from_slice(cpl_imagelist* cube,
703 double strehl_star_radius,
711 cpl_errorstate clean_state = cpl_errorstate_get();
714 cpl_image* img_dup=NULL;
730 cpl_size max_ima_x=0;
731 cpl_size max_ima_y=0;
740 double lam = (double)0.5*(ws+we);
744 img=sinfo_new_average_cube_to_image_between_waves(cube,disp,cWave,ws,we);
745 check_nomsg(img_dup=cpl_image_duplicate(img));
746 sinfo_clean_nan(&img_dup);
747 check_nomsg(cpl_image_get_maxpos(img_dup,&max_ima_x,&max_ima_y));
748 check_nomsg(cpl_image_delete(img_dup));
751 check_nomsg(ima_szx=cpl_image_get_size_x(img));
752 check_nomsg(ima_szy=cpl_image_get_size_y(img));
753 sinfo_check_borders(&max_ima_x,ima_szx,SINFO_STREHL_WINDOW);
754 sinfo_check_borders(&max_ima_y,ima_szy,SINFO_STREHL_WINDOW);
757 sinfo_get_safe_box(&wllx,&wlly,&wurx,&wury,max_ima_x,max_ima_y,SINFO_PSF_SZ,
773 cpl_image_reject_value(img, CPL_VALUE_NAN);
774 if(CPL_ERROR_NONE != irplib_strehl_compute(img,
780 SINFO_STREHL_BOX_SIZE,
800 irplib_error_recover(clean_state,
"Problem computing strehl");
810 sinfo_free_image(&img);
822 cpl_table* sinfo_get_encircled_energy(cpl_frameset* sof,
826 cpl_table** qclog_tbl)
829 cpl_errorstate clean_state = cpl_errorstate_get();
831 cpl_image* img_dup=NULL;
832 cpl_size max_ima_x=0;
833 cpl_size max_ima_y=0;
838 const double d_mirror = 8.;
839 const double factor = 180/PI_NUMB*3600.;
865 char band[MAX_NAME_SIZE];
866 char spat_res[MAX_NAME_SIZE];
868 cpl_table* enc_energy=NULL;
869 cpl_frame* frame=NULL;
876 if(NULL != cpl_frameset_find(sof,PRO_COADD_PSF)) {
877 frame = cpl_frameset_find(sof,PRO_COADD_PSF);
878 }
else if(NULL != cpl_frameset_find(sof,PRO_OBS_PSF)) {
879 frame = cpl_frameset_find(sof,PRO_OBS_PSF);
880 }
else if(NULL != cpl_frameset_find(sof,PRO_COADD_STD)) {
881 frame = cpl_frameset_find(sof,PRO_COADD_STD);
882 }
else if(NULL != cpl_frameset_find(sof,PRO_OBS_STD)) {
883 frame = cpl_frameset_find(sof,PRO_OBS_STD);
884 }
else if(NULL != cpl_frameset_find(sof,PRO_COADD_OBJ)) {
885 frame = cpl_frameset_find(sof,PRO_COADD_OBJ);
886 }
else if(NULL != cpl_frameset_find(sof,PRO_OBS_OBJ)) {
887 frame = cpl_frameset_find(sof,PRO_OBS_OBJ);
890 PRO_COADD_PSF,PRO_OBS_PSF,
891 PRO_COADD_STD, PRO_OBS_STD,
892 PRO_COADD_OBJ, PRO_OBS_OBJ);
896 sinfo_get_spatial_res(frame,spat_res);
897 sinfo_get_band(frame,band);
898 pix_scale=atof(spat_res);
899 lam=sinfo_get_wave_cent(band);
901 pscale=0.5*pix_scale;
905 dr_difr=factor*1.22*lam*1.e-6/d_mirror/pscale;
906 ir_difr=floor(dr_difr+0.5);
907 if (pix_scale==0.025) {
919 sinfo_msg(
"Diffraction limit: %d",ir_difr);
921 check_nomsg(img_dup=cpl_image_duplicate(img));
922 sinfo_clean_nan(&img_dup);
923 check_nomsg(cpl_image_get_maxpos(img_dup,&max_ima_x,&max_ima_y));
924 sinfo_free_image(&img_dup);
928 check_nomsg(ima_szx=cpl_image_get_size_x(img));
929 check_nomsg(ima_szy=cpl_image_get_size_y(img));
930 sinfo_check_borders(&max_ima_x,ima_szx,SINFO_STREHL_WINDOW);
931 sinfo_check_borders(&max_ima_y,ima_szy,SINFO_STREHL_WINDOW);
932 sinfo_get_safe_box(&wllx,&wlly,&wurx,&wury,max_ima_x,max_ima_y,SINFO_PSF_SZ,
941 cpl_image_save(img,
"bad_image_psf_c.fits",CPL_BPP_IEEE_DOUBLE, NULL, CPL_IO_CREATE);
942 sinfo_msg(
"@@@@ sinfo_get_encircled_energy() max_ima_x[%" CPL_SIZE_FORMAT
"] max_ima_y[%" CPL_SIZE_FORMAT
"] psf_sz[%d]", max_ima_x,
946 if(CPL_ERROR_NONE != cpl_image_fit_gaussian(img,max_ima_x,max_ima_y,
948 &norm,&xc,&yc,&sx,&sy,
952 irplib_error_recover(clean_state,
"Gaussian fit failed");
956 check_nomsg(enc_energy = cpl_table_new(ni));
957 check_nomsg(cpl_table_new_column(enc_energy,
"r_pix", CPL_TYPE_INT));
958 check_nomsg(cpl_table_new_column(enc_energy,
"r_mas", CPL_TYPE_DOUBLE));
959 check_nomsg(cpl_table_new_column(enc_energy,
"r_dif", CPL_TYPE_DOUBLE));
960 check_nomsg(cpl_table_new_column(enc_energy,
"abs_energy" , CPL_TYPE_DOUBLE));
961 check_nomsg(cpl_table_new_column(enc_energy,
"rel_energy" , CPL_TYPE_DOUBLE));
964 check_nomsg(bkg=irplib_strehl_ring_background(img,max_ima_x,max_ima_y,
965 SINFO_BKG_R1,SINFO_BKG_R2,IRPLIB_BG_METHOD_AVER_REJ)) ;
967 cpl_image_reject_value(img, CPL_VALUE_NAN);
968 check_nomsg(flux_max=irplib_strehl_disk_flux(img,max_ima_x,max_ima_y,r,bkg));
973 check_nomsg(flux=irplib_strehl_disk_flux(img,max_ima_x,max_ima_y,r,bkg));
975 check_nomsg(cpl_table_set_int(enc_energy,
"r_pix",i,r));
976 check_nomsg(cpl_table_set_double(enc_energy,
"r_mas",i,r*pscale));
977 check_nomsg(cpl_table_set_double(enc_energy,
"r_dif",i,r/ir_difr));
979 check_nomsg(cpl_table_set_double(enc_energy,
"abs_energy",i,flux));
981 check_nomsg(cpl_table_set_double(enc_energy,
"abs_energy",i,-999));
986 flux_max=cpl_table_get_column_max(enc_energy,
"abs_energy");
991 check_nomsg(flux=irplib_strehl_disk_flux(img,max_ima_x,max_ima_y,r,bkg));
993 check_nomsg(cpl_table_set_double(enc_energy,
"rel_energy",i,flux/flux_max));
995 check_nomsg(cpl_table_set_double(enc_energy,
"rel_energy",i,1));
1006 check_nomsg(flux=irplib_strehl_disk_flux(img,max_ima_x,max_ima_y,
1009 if(!isnan(flux) && !isnan(flux_max)) {
1010 enc_en=flux/flux_max;
1012 ck0_nomsg(sinfo_qclog_add_double(*qclog_tbl,
"QC ENC CORE",
1014 "Encircled energy within PSF core",
"%f"));
1018 sinfo_free_image(&img_dup);
1024 static cpl_table* sinfo_get_strehl_from_cube(cpl_imagelist* cube,
1028 cpl_table* strehl_tbl=NULL;
1041 double strehl_star_radius=0;
1042 double strehl_bg_r1=0;
1043 double strehl_bg_r2=0;
1045 double strehl_err=0;
1046 char spat_res[MAX_NAME_SIZE];
1047 cpl_propertylist* plist=NULL;
1054 sinfo_get_spatial_res(frame,spat_res);
1055 pix_scale=atof(spat_res);
1056 sinfo_msg(
"Camera pixel scale=%f",pix_scale);
1058 pscale=0.5*pix_scale;
1060 strehl_star_radius=SINFO_BKG_R1*pscale;
1061 strehl_bg_r1=SINFO_BKG_R1*pscale;
1062 strehl_bg_r2=SINFO_BKG_R2*pscale;
1064 plist=cpl_propertylist_load(name,0);
1065 double dispersion=sinfo_pfits_get_cdelt3(plist);
1066 double centralWave=sinfo_pfits_get_crval3(plist);
1068 sinfo_free_propertylist(&plist);
1071 wstart = centralWave - (float) (cpl_imagelist_get_size(cube) / 2)*
1072 dispersion+dispersion;
1073 wend =wstart + dispersion * cpl_imagelist_get_size(cube);
1080 nsample=(int)((wend-wstart-wstep)/wstep);
1081 check_nomsg(strehl_tbl = cpl_table_new(nsample));
1082 check_nomsg(cpl_table_new_column(strehl_tbl,
"wavelength",CPL_TYPE_DOUBLE));
1083 check_nomsg(cpl_table_new_column(strehl_tbl,
"strehl",CPL_TYPE_DOUBLE));
1084 check_nomsg(cpl_table_new_column(strehl_tbl,
"strehl_error",CPL_TYPE_DOUBLE));
1087 for(i=1;i<nsample;i++) {
1092 lam = (double)0.5*(ws+we);
1095 check(sinfo_get_strehl_from_slice(cube,
1105 &strehl_err),
"Error computing strehl");
1108 if((isnan(lam) ==0) &&
1111 check_nomsg(cpl_table_set_double(strehl_tbl,
"wavelength",i,lam));
1112 check_nomsg(cpl_table_set_double(strehl_tbl,
"strehl",i,strehl));
1113 check_nomsg(cpl_table_set_double(strehl_tbl,
"strehl_error",i,
1129 sinfo_get_strehl_from_ima(cpl_image* ima,
1133 double dispersion=0.;
1134 double centralWave=0.;
1139 double strehl_star_radius=0;
1140 double strehl_bg_r1=0;
1141 double strehl_bg_r2=0;
1143 double strehl_err=0;
1148 ck0_nomsg(sinfo_get_strehl_input1(frame,&dispersion,¢ralWave,
1149 &wstart,&wend,&pscale,&exptime,
1150 &strehl_star_radius,&strehl_bg_r1,
1154 check(sinfo_get_strehl_from_image(ima,
1162 &strehl_err),
"Computing Strehl");
1175 sinfo_get_frm12(cpl_frameset* sof,cpl_frame** frm1,cpl_frame** frm2){
1177 cpl_frameset* obs=NULL;
1179 float* pix_scale=NULL;
1181 obs = cpl_frameset_new();
1182 sinfo_contains_frames_kind(sof,obs,PRO_OBS_PSF);
1183 nobs=cpl_frameset_get_size(obs);
1185 sinfo_contains_frames_kind(sof,obs,PRO_OBS_STD);
1186 nobs=cpl_frameset_get_size(obs);
1189 nobs=cpl_frameset_get_size(obs);
1193 sinfo_contains_frames_kind(sof,obs,PRO_OBS_OBJ);
1194 nobs=cpl_frameset_get_size(obs);
1197 nobs=cpl_frameset_get_size(obs);
1202 pix_scale=cpl_calloc(nobs,
sizeof(
float));
1204 for(
int i=0;i<nobs;i++) {
1205 cpl_frame* frame=cpl_frameset_get_frame(obs,i);
1206 pix_scale[i]=sinfo_pfits_get_pixelscale(
1207 (
char*)cpl_frame_get_filename(frame));
1208 if(fabs(pix_scale[i]-0.025)< eps) {
1209 *frm1=cpl_frame_duplicate(frame);
1210 }
else if (fabs(pix_scale[i]-0.1) <eps) {
1211 *frm2=cpl_frame_duplicate(frame);
1214 cpl_free(pix_scale);
1219 cpl_free(pix_scale);
1220 cpl_frameset_delete(obs);
1230 sinfo_get_strehl_input1(cpl_frame* frm,
1232 double* centralWave,
1237 double* strehl_star_rad,
1238 double* strehl_bg_rmin,
1239 double* strehl_bg_rmax)
1243 cpl_propertylist* plist=NULL;
1244 char res[MAX_NAME_SIZE];
1247 char fname[MAX_NAME_SIZE];
1250 sinfo_get_spatial_res(frm,res);
1251 pix_scale=atof(res);
1260 *strehl_star_rad=SINFO_RSTAR*(*pscale);
1261 *strehl_bg_rmin=SINFO_BKG_R1*(*pscale);
1262 *strehl_bg_rmax=SINFO_BKG_R2*(*pscale);
1264 strcpy(fname,cpl_frame_get_filename(frm));
1265 check_nomsg(plist=cpl_propertylist_load(fname,0));
1266 check_nomsg(*dispersion=sinfo_pfits_get_cdelt3(plist));
1267 *centralWave=sinfo_pfits_get_crval3(plist);
1268 check_nomsg(naxis3=sinfo_pfits_get_naxis3(plist));
1269 *exptime=sinfo_pfits_get_exp_time(plist);
1270 sinfo_free_propertylist(&plist);
1272 wrange=(*dispersion)*naxis3;
1274 *wstart = *centralWave - (wrange / 2) +(*dispersion);
1275 *wend = *wstart + wrange;
1279 if (cpl_error_get_code() != CPL_ERROR_NONE) {
1289 sinfo_get_strehl_input2(cpl_frame* frm1,
1292 double* centralWave,
1299 double* strehl_star_rad1,
1300 double* strehl_star_rad2,
1301 double* strehl_bg_rmin1,
1302 double* strehl_bg_rmin2,
1303 double* strehl_bg_rmax1,
1304 double* strehl_bg_rmax2)
1308 cpl_propertylist* plist=NULL;
1309 char res1[MAX_NAME_SIZE];
1310 char res2[MAX_NAME_SIZE];
1311 double pix_scale1=0;
1312 double pix_scale2=0;
1314 char fname1[MAX_NAME_SIZE];
1315 char fname2[MAX_NAME_SIZE];
1318 sinfo_get_spatial_res(frm1,res1);
1319 sinfo_get_spatial_res(frm2,res2);
1320 pix_scale1=atof(res1);
1321 pix_scale2=atof(res2);
1327 *pscale1=pix_scale1;
1328 *pscale2=pix_scale2;
1331 *strehl_star_rad1=SINFO_RSTAR*(*pscale1);
1332 *strehl_bg_rmin1=SINFO_BKG_R1*(*pscale1);
1333 *strehl_bg_rmax1=SINFO_BKG_R2*(*pscale1);
1335 *strehl_star_rad2=SINFO_RSTAR*(*pscale2);
1336 *strehl_bg_rmin2=SINFO_BKG_R1*(*pscale2);
1337 *strehl_bg_rmax2=SINFO_BKG_R2*(*pscale2);
1339 strcpy(fname1,cpl_frame_get_filename(frm1));
1340 check_nomsg(plist=cpl_propertylist_load(fname1,0));
1341 check_nomsg(*dispersion=sinfo_pfits_get_cdelt3(plist));
1342 *centralWave=sinfo_pfits_get_crval3(plist);
1343 check_nomsg(naxis3=sinfo_pfits_get_naxis3(plist));
1344 *exptime1=sinfo_pfits_get_exp_time(plist);
1345 sinfo_free_propertylist(&plist);
1346 strcpy(fname2,cpl_frame_get_filename(frm2));
1349 check_nomsg(plist=cpl_propertylist_load(fname2,0));
1350 *exptime2=sinfo_pfits_get_exp_time(plist);
1351 sinfo_free_propertylist(&plist);
1355 wrange=(*dispersion)*naxis3;
1357 *wstart = *centralWave - (wrange / 2) +(*dispersion);
1358 *wend = *wstart + wrange;
1362 if (cpl_error_get_code() != CPL_ERROR_NONE) {
1373 sinfo_get_strehl_from_2images(cpl_image* ima1,
1379 cpl_table* strehl_tbl=NULL;
1382 double dispersion=0.;
1383 double centralWave=0.;
1392 double strehl_star_rad1=0;
1393 double strehl_star_rad2=0;
1394 double strehl_bg_rmin1=0;
1395 double strehl_bg_rmin2=0;
1396 double strehl_bg_rmax1=0;
1397 double strehl_bg_rmax2=0;
1399 double strehl_err=0;
1404 cpl_image* img_dup=NULL;
1406 cpl_size max_ima1_x=0;
1407 cpl_size max_ima1_y=0;
1409 cpl_size max_ima2_x=0;
1412 cpl_size max_ima2_y=0;
1421 cpl_errorstate clean_state = cpl_errorstate_get();
1423 ck0_nomsg(sinfo_get_strehl_input2(frm1,frm2,&dispersion, ¢ralWave,
1424 &wstart,&wend,&pscale1,&pscale2,
1425 &exptime1,&exptime2,
1426 &strehl_star_rad1,&strehl_star_rad2,
1427 &strehl_bg_rmin1,&strehl_bg_rmin2,
1428 &strehl_bg_rmax1,&strehl_bg_rmax2));
1434 check_nomsg(img_dup=cpl_image_duplicate(ima1));
1435 sinfo_clean_nan(&img_dup);
1436 check_nomsg(cpl_image_get_maxpos(img_dup,&max_ima1_x,&max_ima1_y));
1437 sinfo_free_image(&img_dup);
1440 check_nomsg(img_dup=cpl_image_duplicate(ima2));
1441 sinfo_clean_nan(&img_dup);
1442 check_nomsg(cpl_image_get_maxpos(img_dup,&max_ima2_x,&max_ima2_y));
1443 sinfo_free_image(&img_dup);
1453 check_nomsg(strehl_tbl = cpl_table_new(nsample));
1454 check_nomsg(cpl_table_new_column(strehl_tbl,
"wavelength",CPL_TYPE_DOUBLE));
1455 check_nomsg(cpl_table_new_column(strehl_tbl,
"strehl",CPL_TYPE_DOUBLE));
1456 check_nomsg(cpl_table_new_column(strehl_tbl,
"strehl_error",CPL_TYPE_DOUBLE));
1457 wstep = wend-wstart;
1461 lam = (double)0.5*(wstart+wend);
1463 sinfo_msg(
"lambda=%f dlambda=%f",lam,dlam);
1464 sinfo_msg(
"wstart=%f wend=%f",wstart,wend);
1465 sinfo_msg(
"wstep=%f",wstep);
1468 if(CPL_ERROR_NONE != sinfo_strehl_compute_two(ima1,ima2,
1469 SINFO_STREHL_M1,SINFO_STREHL_M2,
1473 max_ima1_x,max_ima1_y,
1474 max_ima2_x,max_ima2_y,
1478 &strehl,&strehl_err,&star_bkg,
1479 &star_peak,&star_flux,
1480 &psf_peak,&psf_flux,&bkg_noise))
1485 irplib_error_recover(clean_state,
1486 "Problem computing strehl, set it to -1");
1491 if((isnan(lam) ==0) &&
1494 check_nomsg(cpl_table_set_double(strehl_tbl,
"wavelength",0,lam));
1495 check_nomsg(cpl_table_set_double(strehl_tbl,
"strehl",0,strehl));
1496 check_nomsg(cpl_table_set_double(strehl_tbl,
"strehl_error",
1548 #define irplib_assure_code cpl_ensure_code
1549 int sinfo_strehl_compute_two(
1550 const cpl_image * im1,
1551 const cpl_image * im2,
1567 double * strehl_err,
1583 double star_flux1=0;
1584 double star_flux2=0;
1585 double star_peak1=0;
1586 double star_peak2=0;
1588 const double window_size = 5.0 ;
1593 double prat=pscale2/pscale1;
1594 double prat2=prat*prat;
1595 double trat=exptime1/exptime2;
1596 double frat=sinfo_scale_flux(pscale1,pscale2,exptime1,exptime2);
1604 cpl_errorstate initial_errorstate = cpl_errorstate_get();
1608 irplib_assure_code(im1 != NULL, CPL_ERROR_NULL_INPUT);
1609 irplib_assure_code(im2 != NULL, CPL_ERROR_NULL_INPUT);
1610 irplib_assure_code(strehl != NULL, CPL_ERROR_NULL_INPUT);
1611 irplib_assure_code(strehl_err != NULL, CPL_ERROR_NULL_INPUT);
1612 irplib_assure_code(star_bkg != NULL, CPL_ERROR_NULL_INPUT);
1613 irplib_assure_code(star_peak != NULL, CPL_ERROR_NULL_INPUT);
1614 irplib_assure_code(star_flux != NULL, CPL_ERROR_NULL_INPUT);
1615 irplib_assure_code(psf_peak != NULL, CPL_ERROR_NULL_INPUT);
1616 irplib_assure_code(psf_flux != NULL, CPL_ERROR_NULL_INPUT);
1618 irplib_assure_code(pscale1 > 0.0, CPL_ERROR_ILLEGAL_INPUT);
1619 irplib_assure_code(pscale2 > 0.0, CPL_ERROR_ILLEGAL_INPUT);
1621 irplib_assure_code(xpos1-window_size > 0, CPL_ERROR_ACCESS_OUT_OF_RANGE);
1622 irplib_assure_code(ypos1-window_size > 0, CPL_ERROR_ACCESS_OUT_OF_RANGE);
1623 irplib_assure_code(xpos2-window_size > 0, CPL_ERROR_ACCESS_OUT_OF_RANGE);
1624 irplib_assure_code(ypos2-window_size > 0, CPL_ERROR_ACCESS_OUT_OF_RANGE);
1626 irplib_assure_code(xpos1+window_size <= cpl_image_get_size_x(im1),
1627 CPL_ERROR_ACCESS_OUT_OF_RANGE);
1628 irplib_assure_code(ypos1+window_size <= cpl_image_get_size_y(im1),
1629 CPL_ERROR_ACCESS_OUT_OF_RANGE);
1631 irplib_assure_code(xpos2+window_size <= cpl_image_get_size_x(im2),
1632 CPL_ERROR_ACCESS_OUT_OF_RANGE);
1633 irplib_assure_code(ypos2+window_size <= cpl_image_get_size_y(im2),
1634 CPL_ERROR_ACCESS_OUT_OF_RANGE);
1636 irplib_assure_code(r1 > 0.0, CPL_ERROR_ILLEGAL_INPUT);
1637 irplib_assure_code(r2 > 0.0, CPL_ERROR_ILLEGAL_INPUT);
1638 irplib_assure_code(r3 > r2, CPL_ERROR_ILLEGAL_INPUT);
1656 ring[2] = r2/pscale2;
1657 ring[3] = r3/pscale2;
1660 sinfo_msg_debug(
"star_ring=%f %f %f %f",ring[0],ring[1],ring[2],ring[3]);
1671 check_nomsg(sinfo_get_star_features(im1,d,xpos1,ypos1,&xc,&yc,
1672 &star_peak1,&star_flux1,&star_bkg1));
1675 *star_peak=star_peak1;
1677 check_nomsg(sinfo_compute_psf(m1,m2/m1,lam*1.e-6,pscale1,xc,yc,1.,
1680 check_nomsg(sinfo_get_star_features(im2,d,xpos2,ypos2,&xc,&yc,
1681 &star_peak2,&star_flux2,&star_bkg2));
1683 *star_flux=star_flux2;
1684 *star_bkg=star_bkg2;
1686 check_nomsg(sinfo_compute_psf(m1,m2/m1,lam*1.e-6,pscale2,xc,yc,1.,
1694 sinfo_msg_debug(
"corr bkg: bkg1=%g bkg2=%g",star_bkg1/frat,*star_bkg);
1696 fabs(star_peak2/frat- *star_peak)/(star_peak2/frat));
1701 star_flux1*trat,*star_flux);
1706 if ( fabs((star_flux1*frat-*star_flux)/(*star_flux)) > 0.25) {
1708 fabs((star_flux1*frat-*star_flux)/(*star_flux)));
1714 if ( fabs(star_peak2-star_peak1*frat)/(star_peak2) > 0.25) {
1716 fabs(star_peak2-star_peak1*frat)/(star_peak2));
1719 irplib_assure_code(*star_peak > 0.0, CPL_ERROR_ILLEGAL_OUTPUT);
1720 *star_peak=star_peak1;
1722 *star_bkg=star_bkg2;
1723 *star_flux=star_flux2;
1734 *strehl = (*star_peak/(*star_flux*trat)) / (psf_peak1 );
1737 "fct=%g psf_peak=%g",
1738 *star_peak,star_flux1,star_flux2,*star_flux,
1739 *star_flux/frat*prat2,prat2/frat,psf_peak1);
1763 if (!cpl_errorstate_is_equal(initial_errorstate)) {
1766 cpl_errorstate_dump(initial_errorstate, CPL_FALSE, NULL);
1769 if (cpl_error_get_code() != CPL_ERROR_NONE) {
1770 return cpl_error_get_code();
1772 return CPL_ERROR_NONE;
1780 static cpl_error_code
1781 sinfo_get_star_features(
const cpl_image* im,
1804 int bkg_sx=SINFO_BKG_BOX_SZ;
1805 int bkg_sy=SINFO_BKG_BOX_SZ;
1807 cpl_bivector* iqe=NULL;
1809 cpl_image* im_new=NULL;
1811 sx=cpl_image_get_size_x(im);
1812 sy=cpl_image_get_size_y(im);
1817 if(NULL != (iqe=cpl_image_iqe(im,sx/2-radius,sy/2-radius,
1818 sx/2+radius,sy/2+radius))) {
1820 piqe=cpl_bivector_get_x_data(iqe);
1832 dim_new=floor(sinfo_find_min_of_four(xm,sx-xm,ym,sy-ym));
1834 llx=(ixm-dim_new > 1) ? ixm-dim_new : 1;
1835 lly=(iym-dim_new > 1) ? iym-dim_new : 1;
1836 urx=(ixm+dim_new < sx) ? ixm+dim_new : sx;
1837 ury=(iym+dim_new < sy) ? iym+dim_new : sy;
1839 check_nomsg(im_new=cpl_image_extract(im,llx,lly,urx,ury));
1842 check_nomsg(sinfo_get_bkg_4corners(im_new,bkg_sx,bkg_sy,bkg,&bkg_stdev));
1844 sinfo_free_bivector(&iqe);
1846 if(NULL != (iqe=cpl_image_iqe(im_new,dim_new-radius,dim_new-radius,
1847 dim_new+radius,dim_new+radius))) {
1849 piqe=cpl_bivector_get_x_data(iqe);
1851 *xc=piqe[0]-dim_new-1;
1852 *yc=piqe[1]-dim_new-1;
1856 *peak=cpl_image_get_max_window(im_new,dim_new-radius,dim_new-radius,
1857 dim_new+radius,dim_new+radius);
1859 sinfo_get_flux_above_bkg(im_new,kappa,bkg_stdev,flux);
1862 sinfo_free_bivector(&iqe);
1872 check_nomsg(sinfo_get_bkg_4corners(im,bkg_sx,bkg_sy,bkg,&bkg_stdev));
1873 check_nomsg(sinfo_get_safe_box(&llx, &lly, &urx, &ury, xpos,ypos,radius,
1875 check_nomsg(*peak=cpl_image_get_max_window(im,llx,lly,urx,ury)-(*bkg));
1876 sinfo_get_flux_above_bkg(im,kappa,bkg_stdev,flux);
1888 check_nomsg(sinfo_get_bkg_4corners(im,bkg_sx,bkg_sy,bkg,&bkg_stdev));
1889 check_nomsg(sinfo_get_safe_box(&llx, &lly, &urx, &ury, xpos,ypos,radius,
1891 check_nomsg(*peak=cpl_image_get_max_window(im,llx,lly,urx,ury)-(*bkg));
1892 sinfo_get_flux_above_bkg(im,kappa,bkg_stdev,flux);
1897 sinfo_free_image(&im_new);
1898 sinfo_free_bivector(&iqe);
1900 if (cpl_error_get_code() != CPL_ERROR_NONE) {
1901 return cpl_error_get_code();
1903 return CPL_ERROR_NONE;
1942 sinfo_strehl_compute_one(
const cpl_image * im,
1955 double * strehl_err,
1967 const double window_size = (double)(SINFO_STREHL_RAD_CENTRAL);
1975 cpl_bivector* iqe1=NULL;
1983 cpl_ensure_code(window_size > 0.0, CPL_ERROR_ILLEGAL_INPUT);
1986 cpl_ensure_code(im != NULL, CPL_ERROR_NULL_INPUT);
1987 cpl_ensure_code(strehl != NULL, CPL_ERROR_NULL_INPUT);
1988 cpl_ensure_code(strehl_err != NULL, CPL_ERROR_NULL_INPUT);
1989 cpl_ensure_code(star_bkg != NULL, CPL_ERROR_NULL_INPUT);
1990 cpl_ensure_code(star_peak != NULL, CPL_ERROR_NULL_INPUT);
1991 cpl_ensure_code(star_flux != NULL, CPL_ERROR_NULL_INPUT);
1992 cpl_ensure_code(psf_peak != NULL, CPL_ERROR_NULL_INPUT);
1993 cpl_ensure_code(psf_flux != NULL, CPL_ERROR_NULL_INPUT);
1995 cpl_ensure_code(pscale > 0.0, CPL_ERROR_ILLEGAL_INPUT);
1998 cpl_ensure_code(r1 > 0.0, CPL_ERROR_ILLEGAL_INPUT);
1999 cpl_ensure_code(r2 > 0.0, CPL_ERROR_ILLEGAL_INPUT);
2001 cpl_ensure_code(r3 > r2, CPL_ERROR_ILLEGAL_INPUT);
2005 check_nomsg(sinfo_compute_psf(m1,m2/m1,lam*1.e-6,pscale,xc,yc,
2011 psf = irplib_strehl_generate_psf(m1, m2, lam, dlam, pscale, size);
2012 cpl_ensure_code(psf != NULL, CPL_ERROR_ILLEGAL_OUTPUT);
2015 *psf_peak = cpl_image_get_max(psf);
2017 cpl_image_delete(psf);
2022 cpl_ensure( *psf_peak > 0.0, CPL_ERROR_ILLEGAL_OUTPUT,CPL_ERROR_ILLEGAL_OUTPUT);
2030 check_nomsg(sinfo_get_star_features(im,d,xpos,ypos,&xc,&yc,
2031 star_peak,star_flux,star_bkg));
2034 check_nomsg(sinfo_compute_psf(m1,m2/m1,lam*1.e-6,pscale,xc,yc,1.,psf_peak));
2038 *star_peak -= *star_bkg;
2041 cpl_ensure_code(*star_peak > 0.0, CPL_ERROR_ILLEGAL_OUTPUT);
2051 *strehl = (*star_peak * *psf_flux ) / ( *star_flux * *psf_peak);
2056 cpl_msg_warning(cpl_func,
"Extreme Strehl-ratio=%g, star_peak=%g, "
2057 "star_flux=%g, psf_peak=%g, psf_flux=%g", *strehl,
2058 *star_peak, *star_flux, *psf_peak, *psf_flux);
2078 sinfo_free_bivector(&iqe1);
2079 if (cpl_error_get_code() != CPL_ERROR_NONE) {
2080 return cpl_error_get_code();
2082 return CPL_ERROR_NONE;
2091 sinfo_check_borders(cpl_size* val,
const int max,
const int thresh)
2094 *val = ((*val-thresh) > 0) ? *val : thresh;
2095 *val = ((*val+thresh) < max) ? *val : max-thresh-1;
2100 sinfo_get_safe_box(
int* llx,
2111 *llx= ((xpos-box)>0) ? (xpos-box) : 1;
2112 *lly= ((ypos-box)>0) ? (ypos-box) : 1;
2113 *urx= ((xpos+box)<szx) ? (xpos+box) : szx-1 ;
2114 *ury= ((ypos+box)<szy) ? (ypos+box) : szy-1 ;
2135 sinfo_get_bkg_4corners(
const cpl_image *img,
2144 cpl_image* img_bkg=NULL;
2147 cknull(img,
"NULL input image!");
2148 check_nomsg(sx=cpl_image_get_size_x(img));
2149 check_nomsg(sy=cpl_image_get_size_y(img));
2151 check_nomsg(img_bkg=cpl_image_new(2*bkg_sx,2*bkg_sy,CPL_TYPE_FLOAT));
2152 cpl_image* img_ext=NULL;
2153 img_ext=cpl_image_extract(img,1,1,bkg_sx,bkg_sy);
2154 check_nomsg(cpl_image_copy(img_bkg,img_ext,1,1));
2155 sinfo_free_image(&img_ext);
2157 img_ext=cpl_image_extract(img,sx-bkg_sx,1, sx,bkg_sy);
2158 check_nomsg(cpl_image_copy(img_bkg,img_ext,bkg_sx+1,1));
2159 sinfo_free_image(&img_ext);
2161 img_ext=cpl_image_extract(img,1,sy-bkg_sy,bkg_sx,sy);
2162 check_nomsg(cpl_image_copy(img_bkg,img_ext,1,bkg_sy+1));
2163 sinfo_free_image(&img_ext);
2165 img_ext=cpl_image_extract(img,sx-bkg_sx,sy-bkg_sy,sx,sy);
2166 check_nomsg(cpl_image_copy(img_bkg,img_ext,bkg_sx+1,bkg_sy+1));
2167 sinfo_free_image(&img_ext);
2169 check_nomsg(*bkg=cpl_image_get_median(img_bkg));
2170 check_nomsg(*std=cpl_image_get_stdev(img_bkg));
2176 sinfo_free_image(&img_ext);
2177 sinfo_free_image(&img_bkg);
2179 if (cpl_error_get_code() != CPL_ERROR_NONE) {
2180 return cpl_error_get_code();
2182 return CPL_ERROR_NONE;
2202 sinfo_compute_psf(
const double dia,
2204 const double lambda,
2208 const double anamorph,
2212 int bin=SINFO_PSF_BIN;
2213 int npoints=SINFO_PSF_NPOINT;
2215 int dim=SINFO_PSF_DIM;
2216 int blocks=SINFO_PSF_BLOCKS;
2229 double nyquist=lambda/dia/2.*206265/psize*bin;
2233 double part[npoints];
2251 cpl_image* img_xx=NULL;
2252 cpl_image* img_yy=NULL;
2253 cpl_image* img_rr=NULL;
2254 cpl_image* img_rrcor=NULL;
2255 cpl_image* img_airy=NULL;
2256 cpl_image* img_w=NULL;
2257 cpl_image* img_psf0=NULL;
2267 check_nomsg(img_xx=cpl_image_new(sx,sy,CPL_TYPE_DOUBLE));
2268 img_yy=cpl_image_new(sx,sy,CPL_TYPE_DOUBLE);
2269 img_rr=cpl_image_new(sx,sy,CPL_TYPE_DOUBLE);
2272 pxx=cpl_image_get_data_double(img_xx);
2273 pyy=cpl_image_get_data_double(img_yy);
2274 prr=cpl_image_get_data_double(img_rr);
2279 pxx[j*sx+i]=(i-sx/2-cx*bin)/nyquist*SINFO_MATH_PI/2;
2281 pyy[j*sx+i]=(j-sy/2-cy*bin)/nyquist*SINFO_MATH_PI/2*anamorph;
2284 prr[j*sx+i]=sqrt(pxx[j*sx+i]*pxx[j*sx+i]+pyy[j*sx+i]*pyy[j*sx+i]);
2302 cor=1./(1.-occ*occ);
2305 img_rrcor=cpl_image_duplicate(img_rr);
2306 cpl_image_multiply_scalar(img_rrcor,cor);
2307 pcor=cpl_image_get_data_double(img_rrcor);
2314 img_airy=cpl_image_new(sx,sy,CPL_TYPE_DOUBLE);
2315 pairy=cpl_image_get_data_double(img_airy);
2322 fct=(2.*j1(prr[j*sx+i])/prr[j*sx+i]);
2323 pairy[j*sx+i]=fct*fct;
2332 fct=(2.*j1(prr[j*sx+i])/prr[j*sx+i]-occ*occ*2.*j1(pcor[j*sx+i])/pcor[j*sx+i]);
2333 pairy[j*sx+i]=cor*fct*fct;
2346 img_w=cpl_image_duplicate(img_airy);
2348 pairy=cpl_image_get_data_double(img_airy);
2352 if(!irplib_isnan(pairy[i+j*sx]) && (pairy[i+j*sx] ==0)) {
2358 pairy[sx/2+sy/2*sx]=1.;
2374 for(i=0;i<npoints;i++) {
2375 ll[i]=(double)i/npoints*v0;
2378 cor=1./(1.-occ*occ);
2380 for(i=0;i<npoints;i++) {
2381 part[i]=2.*j1(ll[i])/ll[i];
2386 for(i=0;i<npoints;i++) {
2387 tot1+=j1(occ*ll[i])*part[i]*dll;
2394 ee=(1.-j0(v0)*j0(v0));
2399 ee-=(j1(v0))*(j1(v0));
2404 occ*occ*(1-j0(occ*v0)*j0(occ*v0)-j1(occ*v0)*j1(occ*v0)));
2407 ee+=occ*occ*(1-j0(occ*v0)*j0(occ*v0)-j1(occ*v0)*j1(occ*v0));
2418 pairy=cpl_image_get_data_double(img_airy);
2419 prr=cpl_image_get_data_double(img_rr);
2422 if(!irplib_isnan(pairy[i+j*sx]) && (prr[i+j*sx] <v0)) {
2423 tot1+=pairy[i+j*sx]*ee;
2431 cpl_image_divide_scalar(img_airy,tot1);
2443 start=(dim/2-1)-(blocks/2*bin-1)-bin/2;
2446 img_psf0=cpl_image_new(blocks,blocks,CPL_TYPE_DOUBLE);
2447 ppsf0=cpl_image_get_data_double(img_psf0);
2451 for(j=0;j<blocks;j++) {
2452 for(i=0;i<blocks;i++) {
2454 for(jj=start+j*bin;jj<start+(j+1)*bin-1;jj++){
2455 for(ii=start+i*bin;ii<start+(i+1)*bin-1;ii++){
2456 if(!irplib_isnan(pairy[ii+jj*sx])) {
2457 tot1+=pairy[ii+jj*sx];
2461 ppsf0[i+j*blocks]=tot1;
2466 cpl_image_divide_scalar(img_psf0,tot2);
2472 k=180.*3600./SINFO_MATH_PI;
2479 *psf_peak=cpl_image_get_max(img_psf0);
2482 dia,occ,lambda,psize,cx,cy,anamorph,*psf_peak);
2487 sinfo_free_image(&img_w);
2488 sinfo_free_image(&img_psf0);
2489 sinfo_free_image(&img_xx);
2490 sinfo_free_image(&img_yy);
2491 sinfo_free_image(&img_rr);
2492 sinfo_free_image(&img_rrcor);
2493 sinfo_free_image(&img_airy);
2496 if (cpl_error_get_code() != CPL_ERROR_NONE) {
2497 return cpl_error_get_code();
2499 return CPL_ERROR_NONE;
2506 sinfo_get_flux_above_bkg(
const cpl_image* img,
2512 const float* pimg=NULL;
2520 cpl_image* timg=NULL;
2524 timg=cpl_image_duplicate(img);
2525 cpl_image_subtract_scalar(timg,std);
2526 check_nomsg(sinfo_get_bkg_4corners(timg,SINFO_BKG_BOX_SZ,SINFO_BKG_BOX_SZ,
2527 &sky_bkg,&sky_std));
2529 check_nomsg(pimg=cpl_image_get_data_float_const(timg));
2531 sx=cpl_image_get_size_x(img);
2532 sy=cpl_image_get_size_y(img);
2536 if(!irplib_isnan(pimg[i+j*sx]) &&
2537 (pimg[i+j*sx]>(sky_bkg+kappa*sky_std))) {
2538 tot+=(double)pimg[i+j*sx];
2544 *f=(double)(tot-k*sky_bkg);
2547 sinfo_free_image(&timg);
2549 if (cpl_error_get_code() != CPL_ERROR_NONE) {
2550 return cpl_error_get_code();
2552 return CPL_ERROR_NONE;
2610 sinfo_find_min_of_four(
const double n1,
2616 min = (n1 < n2) ? n1 : n2;
2617 min = (min < n3) ? min : n3;
2618 min = (min < n4) ? min : n4;
2623 sinfo_scale_flux(
const double p1,
2629 return (p2/p1)*(p2/p1)*(t2/t1);
#define sinfo_msg_debug(...)
Print a debug message.
#define sinfo_msg_error(...)
Print an error message.
#define sinfo_msg_warning(...)
Print an warning message.