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 (sinfo_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 (sinfo_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 (sinfo_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;
624 cpl_size max_ima_x=0;
625 cpl_size max_ima_y=0;
634 lam = (double)0.5*(ws+we);
637 check_nomsg(img_dup=cpl_image_duplicate(img));
638 sinfo_clean_nan(&img_dup);
639 check_nomsg(cpl_image_get_maxpos(img_dup,&max_ima_x,&max_ima_y));
640 sinfo_free_image(&img_dup);
642 check_nomsg(ima_szx=cpl_image_get_size_x(img));
643 check_nomsg(ima_szy=cpl_image_get_size_y(img));
644 sinfo_check_borders(&max_ima_x,ima_szx,SINFO_STREHL_WINDOW);
645 sinfo_check_borders(&max_ima_y,ima_szy,SINFO_STREHL_WINDOW);
646 sinfo_get_safe_box(&wllx,&wlly,&wurx,&wury,max_ima_x,max_ima_y,SINFO_PSF_SZ,
657 if(CPL_ERROR_NONE != sinfo_strehl_compute_one(img,
668 SINFO_STREHL_BOX_SIZE,
681 irplib_error_recover(clean_state,
"Problem computing strehl");
699 sinfo_get_strehl_from_slice(cpl_imagelist* cube,
705 double strehl_star_radius,
713 cpl_errorstate clean_state = cpl_errorstate_get();
716 cpl_image* img_dup=NULL;
732 cpl_size max_ima_x=0;
733 cpl_size max_ima_y=0;
742 lam = (double)0.5*(ws+we);
746 img=sinfo_new_average_cube_to_image_between_waves(cube,disp,cWave,ws,we);
747 check_nomsg(img_dup=cpl_image_duplicate(img));
748 sinfo_clean_nan(&img_dup);
749 check_nomsg(cpl_image_get_maxpos(img_dup,&max_ima_x,&max_ima_y));
750 check_nomsg(cpl_image_delete(img_dup));
753 check_nomsg(ima_szx=cpl_image_get_size_x(img));
754 check_nomsg(ima_szy=cpl_image_get_size_y(img));
755 sinfo_check_borders(&max_ima_x,ima_szx,SINFO_STREHL_WINDOW);
756 sinfo_check_borders(&max_ima_y,ima_szy,SINFO_STREHL_WINDOW);
759 sinfo_get_safe_box(&wllx,&wlly,&wurx,&wury,max_ima_x,max_ima_y,SINFO_PSF_SZ,
775 cpl_image_reject_value(img, CPL_VALUE_NAN);
776 if(CPL_ERROR_NONE != irplib_strehl_compute(img,
782 SINFO_STREHL_BOX_SIZE,
802 irplib_error_recover(clean_state,
"Problem computing strehl");
812 sinfo_free_image(&img);
824 cpl_table* sinfo_get_encircled_energy(cpl_frameset* sof,
828 cpl_table** qclog_tbl)
831 cpl_errorstate clean_state = cpl_errorstate_get();
833 cpl_image* img_dup=NULL;
834 cpl_size max_ima_x=0;
835 cpl_size max_ima_y=0;
840 const double d_mirror = 8.;
841 const double factor = 180/PI_NUMB*3600.;
867 char band[MAX_NAME_SIZE];
868 char spat_res[MAX_NAME_SIZE];
870 cpl_table* enc_energy=NULL;
871 cpl_frame* frame=NULL;
878 if(NULL != cpl_frameset_find(sof,PRO_COADD_PSF)) {
879 frame = cpl_frameset_find(sof,PRO_COADD_PSF);
880 }
else if(NULL != cpl_frameset_find(sof,PRO_OBS_PSF)) {
881 frame = cpl_frameset_find(sof,PRO_OBS_PSF);
882 }
else if(NULL != cpl_frameset_find(sof,PRO_COADD_STD)) {
883 frame = cpl_frameset_find(sof,PRO_COADD_STD);
884 }
else if(NULL != cpl_frameset_find(sof,PRO_OBS_STD)) {
885 frame = cpl_frameset_find(sof,PRO_OBS_STD);
886 }
else if(NULL != cpl_frameset_find(sof,PRO_COADD_OBJ)) {
887 frame = cpl_frameset_find(sof,PRO_COADD_OBJ);
888 }
else if(NULL != cpl_frameset_find(sof,PRO_OBS_OBJ)) {
889 frame = cpl_frameset_find(sof,PRO_OBS_OBJ);
892 PRO_COADD_PSF,PRO_OBS_PSF,
893 PRO_COADD_STD, PRO_OBS_STD,
894 PRO_COADD_OBJ, PRO_OBS_OBJ);
898 sinfo_get_spatial_res(frame,spat_res);
899 sinfo_get_band(frame,band);
900 pix_scale=atof(spat_res);
901 lam=sinfo_get_wave_cent(band);
903 pscale=0.5*pix_scale;
907 dr_difr=factor*1.22*lam*1.e-6/d_mirror/pscale;
908 ir_difr=floor(dr_difr+0.5);
909 if (pix_scale==0.025) {
921 sinfo_msg(
"Diffraction limit: %d",ir_difr);
923 check_nomsg(img_dup=cpl_image_duplicate(img));
924 sinfo_clean_nan(&img_dup);
925 check_nomsg(cpl_image_get_maxpos(img_dup,&max_ima_x,&max_ima_y));
926 sinfo_free_image(&img_dup);
930 check_nomsg(ima_szx=cpl_image_get_size_x(img));
931 check_nomsg(ima_szy=cpl_image_get_size_y(img));
932 sinfo_check_borders(&max_ima_x,ima_szx,SINFO_STREHL_WINDOW);
933 sinfo_check_borders(&max_ima_y,ima_szy,SINFO_STREHL_WINDOW);
934 sinfo_get_safe_box(&wllx,&wlly,&wurx,&wury,max_ima_x,max_ima_y,SINFO_PSF_SZ,
943 cpl_image_save(img,
"bad_image_psf_c.fits",CPL_BPP_IEEE_DOUBLE, NULL, CPL_IO_CREATE);
944 sinfo_msg(
"@@@@ sinfo_get_encircled_energy() max_ima_x[%" CPL_SIZE_FORMAT
"] max_ima_y[%" CPL_SIZE_FORMAT
"] psf_sz[%d]", max_ima_x,
948 if(CPL_ERROR_NONE != cpl_image_fit_gaussian(img,max_ima_x,max_ima_y,
950 &norm,&xc,&yc,&sx,&sy,
954 irplib_error_recover(clean_state,
"Gaussian fit failed");
958 check_nomsg(enc_energy = cpl_table_new(ni));
959 check_nomsg(cpl_table_new_column(enc_energy,
"r_pix", CPL_TYPE_INT));
960 check_nomsg(cpl_table_new_column(enc_energy,
"r_mas", CPL_TYPE_DOUBLE));
961 check_nomsg(cpl_table_new_column(enc_energy,
"r_dif", CPL_TYPE_DOUBLE));
962 check_nomsg(cpl_table_new_column(enc_energy,
"abs_energy" , CPL_TYPE_DOUBLE));
963 check_nomsg(cpl_table_new_column(enc_energy,
"rel_energy" , CPL_TYPE_DOUBLE));
966 check_nomsg(bkg=irplib_strehl_ring_background(img,max_ima_x,max_ima_y,
967 SINFO_BKG_R1,SINFO_BKG_R2,IRPLIB_BG_METHOD_AVER_REJ)) ;
969 cpl_image_reject_value(img, CPL_VALUE_NAN);
970 check_nomsg(flux_max=irplib_strehl_disk_flux(img,max_ima_x,max_ima_y,r,bkg));
975 check_nomsg(flux=irplib_strehl_disk_flux(img,max_ima_x,max_ima_y,r,bkg));
977 check_nomsg(cpl_table_set_int(enc_energy,
"r_pix",i,r));
978 check_nomsg(cpl_table_set_double(enc_energy,
"r_mas",i,r*pscale));
979 check_nomsg(cpl_table_set_double(enc_energy,
"r_dif",i,r/ir_difr));
981 check_nomsg(cpl_table_set_double(enc_energy,
"abs_energy",i,flux));
983 check_nomsg(cpl_table_set_double(enc_energy,
"abs_energy",i,-999));
988 flux_max=cpl_table_get_column_max(enc_energy,
"abs_energy");
993 check_nomsg(flux=irplib_strehl_disk_flux(img,max_ima_x,max_ima_y,r,bkg));
995 check_nomsg(cpl_table_set_double(enc_energy,
"rel_energy",i,flux/flux_max));
997 check_nomsg(cpl_table_set_double(enc_energy,
"rel_energy",i,1));
1008 check_nomsg(flux=irplib_strehl_disk_flux(img,max_ima_x,max_ima_y,
1011 if(!isnan(flux) && !isnan(flux_max)) {
1012 enc_en=flux/flux_max;
1014 ck0_nomsg(sinfo_qclog_add_double(*qclog_tbl,
"QC ENC CORE",
1016 "Encircled energy within PSF core",
"%f"));
1020 sinfo_free_image(&img_dup);
1026 static cpl_table* sinfo_get_strehl_from_cube(cpl_imagelist* cube,
1030 cpl_table* strehl_tbl=NULL;
1032 double dispersion=0.;
1033 double centralWave=0.;
1045 double strehl_star_radius=0;
1046 double strehl_bg_r1=0;
1047 double strehl_bg_r2=0;
1049 double strehl_err=0;
1050 char spat_res[MAX_NAME_SIZE];
1051 cpl_propertylist* plist=NULL;
1058 sinfo_get_spatial_res(frame,spat_res);
1059 pix_scale=atof(spat_res);
1060 sinfo_msg(
"Camera pixel scale=%f",pix_scale);
1062 pscale=0.5*pix_scale;
1064 strehl_star_radius=SINFO_BKG_R1*pscale;
1065 strehl_bg_r1=SINFO_BKG_R1*pscale;
1066 strehl_bg_r2=SINFO_BKG_R2*pscale;
1068 plist=cpl_propertylist_load(name,0);
1069 dispersion=sinfo_pfits_get_cdelt3(plist);
1070 centralWave=sinfo_pfits_get_crval3(plist);
1072 sinfo_free_propertylist(&plist);
1075 wstart = centralWave - (float) (cpl_imagelist_get_size(cube) / 2)*
1076 dispersion+dispersion;
1077 wend =wstart + dispersion * cpl_imagelist_get_size(cube);
1084 nsample=(int)((wend-wstart-wstep)/wstep);
1085 check_nomsg(strehl_tbl = cpl_table_new(nsample));
1086 check_nomsg(cpl_table_new_column(strehl_tbl,
"wavelength",CPL_TYPE_DOUBLE));
1087 check_nomsg(cpl_table_new_column(strehl_tbl,
"strehl",CPL_TYPE_DOUBLE));
1088 check_nomsg(cpl_table_new_column(strehl_tbl,
"strehl_error",CPL_TYPE_DOUBLE));
1091 for(i=1;i<nsample;i++) {
1096 lam = (double)0.5*(ws+we);
1099 check(sinfo_get_strehl_from_slice(cube,
1109 &strehl_err),
"Error computing strehl");
1112 if((isnan(lam) ==0) &&
1115 check_nomsg(cpl_table_set_double(strehl_tbl,
"wavelength",i,lam));
1116 check_nomsg(cpl_table_set_double(strehl_tbl,
"strehl",i,strehl));
1117 check_nomsg(cpl_table_set_double(strehl_tbl,
"strehl_error",i,
1133 sinfo_get_strehl_from_ima(cpl_image* ima,
1137 double dispersion=0.;
1138 double centralWave=0.;
1143 double strehl_star_radius=0;
1144 double strehl_bg_r1=0;
1145 double strehl_bg_r2=0;
1147 double strehl_err=0;
1152 ck0_nomsg(sinfo_get_strehl_input1(frame,&dispersion,¢ralWave,
1153 &wstart,&wend,&pscale,&exptime,
1154 &strehl_star_radius,&strehl_bg_r1,
1158 check(sinfo_get_strehl_from_image(ima,
1166 &strehl_err),
"Computing Strehl");
1179 sinfo_get_frm12(cpl_frameset* sof,cpl_frame** frm1,cpl_frame** frm2){
1181 cpl_frameset* obs=NULL;
1184 float* pix_scale=NULL;
1186 cpl_frame* frame=NULL;
1188 obs = cpl_frameset_new();
1189 sinfo_contains_frames_kind(sof,obs,PRO_OBS_PSF);
1190 nobs=cpl_frameset_get_size(obs);
1192 sinfo_contains_frames_kind(sof,obs,PRO_OBS_STD);
1193 nobs=cpl_frameset_get_size(obs);
1196 nobs=cpl_frameset_get_size(obs);
1200 sinfo_contains_frames_kind(sof,obs,PRO_OBS_OBJ);
1201 nobs=cpl_frameset_get_size(obs);
1204 nobs=cpl_frameset_get_size(obs);
1209 pix_scale=cpl_calloc(nobs,
sizeof(
float));
1210 for(i=0;i<nobs;i++) {
1211 frame=cpl_frameset_get_frame(obs,i);
1212 pix_scale[i]=sinfo_pfits_get_pixelscale(
1213 (
char*)cpl_frame_get_filename(frame));
1214 if(fabs(pix_scale[i]-0.025)< eps) {
1215 *frm1=cpl_frame_duplicate(frame);
1216 }
else if (fabs(pix_scale[i]-0.1) <eps) {
1217 *frm2=cpl_frame_duplicate(frame);
1224 cpl_free(pix_scale);
1225 cpl_frameset_delete(obs);
1235 sinfo_get_strehl_input1(cpl_frame* frm,
1237 double* centralWave,
1242 double* strehl_star_rad,
1243 double* strehl_bg_rmin,
1244 double* strehl_bg_rmax)
1248 cpl_propertylist* plist=NULL;
1249 char res[MAX_NAME_SIZE];
1252 char fname[MAX_NAME_SIZE];
1255 sinfo_get_spatial_res(frm,res);
1256 pix_scale=atof(res);
1265 *strehl_star_rad=SINFO_RSTAR*(*pscale);
1266 *strehl_bg_rmin=SINFO_BKG_R1*(*pscale);
1267 *strehl_bg_rmax=SINFO_BKG_R2*(*pscale);
1269 strcpy(fname,cpl_frame_get_filename(frm));
1270 check_nomsg(plist=cpl_propertylist_load(fname,0));
1271 check_nomsg(*dispersion=sinfo_pfits_get_cdelt3(plist));
1272 *centralWave=sinfo_pfits_get_crval3(plist);
1273 check_nomsg(naxis3=sinfo_pfits_get_naxis3(plist));
1274 *exptime=sinfo_pfits_get_exp_time(plist);
1275 sinfo_free_propertylist(&plist);
1277 wrange=(*dispersion)*naxis3;
1279 *wstart = *centralWave - (wrange / 2) +(*dispersion);
1280 *wend = *wstart + wrange;
1284 if (cpl_error_get_code() != CPL_ERROR_NONE) {
1294 sinfo_get_strehl_input2(cpl_frame* frm1,
1297 double* centralWave,
1304 double* strehl_star_rad1,
1305 double* strehl_star_rad2,
1306 double* strehl_bg_rmin1,
1307 double* strehl_bg_rmin2,
1308 double* strehl_bg_rmax1,
1309 double* strehl_bg_rmax2)
1313 cpl_propertylist* plist=NULL;
1314 char res1[MAX_NAME_SIZE];
1315 char res2[MAX_NAME_SIZE];
1316 double pix_scale1=0;
1317 double pix_scale2=0;
1319 char fname1[MAX_NAME_SIZE];
1320 char fname2[MAX_NAME_SIZE];
1323 sinfo_get_spatial_res(frm1,res1);
1324 sinfo_get_spatial_res(frm2,res2);
1325 pix_scale1=atof(res1);
1326 pix_scale2=atof(res2);
1332 *pscale1=pix_scale1;
1333 *pscale2=pix_scale2;
1336 *strehl_star_rad1=SINFO_RSTAR*(*pscale1);
1337 *strehl_bg_rmin1=SINFO_BKG_R1*(*pscale1);
1338 *strehl_bg_rmax1=SINFO_BKG_R2*(*pscale1);
1340 *strehl_star_rad2=SINFO_RSTAR*(*pscale2);
1341 *strehl_bg_rmin2=SINFO_BKG_R1*(*pscale2);
1342 *strehl_bg_rmax2=SINFO_BKG_R2*(*pscale2);
1344 strcpy(fname1,cpl_frame_get_filename(frm1));
1345 check_nomsg(plist=cpl_propertylist_load(fname1,0));
1346 check_nomsg(*dispersion=sinfo_pfits_get_cdelt3(plist));
1347 *centralWave=sinfo_pfits_get_crval3(plist);
1348 check_nomsg(naxis3=sinfo_pfits_get_naxis3(plist));
1349 *exptime1=sinfo_pfits_get_exp_time(plist);
1350 sinfo_free_propertylist(&plist);
1351 strcpy(fname2,cpl_frame_get_filename(frm2));
1354 check_nomsg(plist=cpl_propertylist_load(fname2,0));
1355 *exptime2=sinfo_pfits_get_exp_time(plist);
1356 sinfo_free_propertylist(&plist);
1360 wrange=(*dispersion)*naxis3;
1362 *wstart = *centralWave - (wrange / 2) +(*dispersion);
1363 *wend = *wstart + wrange;
1367 if (cpl_error_get_code() != CPL_ERROR_NONE) {
1378 sinfo_get_strehl_from_2images(cpl_image* ima1,
1384 cpl_table* strehl_tbl=NULL;
1387 double dispersion=0.;
1388 double centralWave=0.;
1397 double strehl_star_rad1=0;
1398 double strehl_star_rad2=0;
1399 double strehl_bg_rmin1=0;
1400 double strehl_bg_rmin2=0;
1401 double strehl_bg_rmax1=0;
1402 double strehl_bg_rmax2=0;
1404 double strehl_err=0;
1409 cpl_image* img_dup=NULL;
1411 cpl_size max_ima1_x=0;
1412 cpl_size max_ima1_y=0;
1414 cpl_size max_ima2_x=0;
1417 cpl_size max_ima2_y=0;
1426 cpl_errorstate clean_state = cpl_errorstate_get();
1428 ck0_nomsg(sinfo_get_strehl_input2(frm1,frm2,&dispersion, ¢ralWave,
1429 &wstart,&wend,&pscale1,&pscale2,
1430 &exptime1,&exptime2,
1431 &strehl_star_rad1,&strehl_star_rad2,
1432 &strehl_bg_rmin1,&strehl_bg_rmin2,
1433 &strehl_bg_rmax1,&strehl_bg_rmax2));
1439 check_nomsg(img_dup=cpl_image_duplicate(ima1));
1440 sinfo_clean_nan(&img_dup);
1441 check_nomsg(cpl_image_get_maxpos(img_dup,&max_ima1_x,&max_ima1_y));
1442 sinfo_free_image(&img_dup);
1445 check_nomsg(img_dup=cpl_image_duplicate(ima2));
1446 sinfo_clean_nan(&img_dup);
1447 check_nomsg(cpl_image_get_maxpos(img_dup,&max_ima2_x,&max_ima2_y));
1448 sinfo_free_image(&img_dup);
1458 check_nomsg(strehl_tbl = cpl_table_new(nsample));
1459 check_nomsg(cpl_table_new_column(strehl_tbl,
"wavelength",CPL_TYPE_DOUBLE));
1460 check_nomsg(cpl_table_new_column(strehl_tbl,
"strehl",CPL_TYPE_DOUBLE));
1461 check_nomsg(cpl_table_new_column(strehl_tbl,
"strehl_error",CPL_TYPE_DOUBLE));
1462 wstep = wend-wstart;
1466 lam = (double)0.5*(wstart+wend);
1468 sinfo_msg(
"lambda=%f dlambda=%f",lam,dlam);
1469 sinfo_msg(
"wstart=%f wend=%f",wstart,wend);
1470 sinfo_msg(
"wstep=%f",wstep);
1473 if(CPL_ERROR_NONE != sinfo_strehl_compute_two(ima1,ima2,
1474 SINFO_STREHL_M1,SINFO_STREHL_M2,
1478 max_ima1_x,max_ima1_y,
1479 max_ima2_x,max_ima2_y,
1483 &strehl,&strehl_err,&star_bkg,
1484 &star_peak,&star_flux,
1485 &psf_peak,&psf_flux,&bkg_noise))
1490 irplib_error_recover(clean_state,
1491 "Problem computing strehl, set it to -1");
1496 if((isnan(lam) ==0) &&
1499 check_nomsg(cpl_table_set_double(strehl_tbl,
"wavelength",0,lam));
1500 check_nomsg(cpl_table_set_double(strehl_tbl,
"strehl",0,strehl));
1501 check_nomsg(cpl_table_set_double(strehl_tbl,
"strehl_error",
1553 #define irplib_assure_code cpl_ensure_code
1554 int sinfo_strehl_compute_two(
1555 const cpl_image * im1,
1556 const cpl_image * im2,
1572 double * strehl_err,
1588 double star_flux1=0;
1589 double star_flux2=0;
1590 double star_peak1=0;
1591 double star_peak2=0;
1593 const double window_size = 5.0 ;
1598 double prat=pscale2/pscale1;
1599 double prat2=prat*prat;
1600 double trat=exptime1/exptime2;
1601 double frat=sinfo_scale_flux(pscale1,pscale2,exptime1,exptime2);
1609 cpl_errorstate initial_errorstate = cpl_errorstate_get();
1613 irplib_assure_code(im1 != NULL, CPL_ERROR_NULL_INPUT);
1614 irplib_assure_code(im2 != NULL, CPL_ERROR_NULL_INPUT);
1615 irplib_assure_code(strehl != NULL, CPL_ERROR_NULL_INPUT);
1616 irplib_assure_code(strehl_err != NULL, CPL_ERROR_NULL_INPUT);
1617 irplib_assure_code(star_bkg != NULL, CPL_ERROR_NULL_INPUT);
1618 irplib_assure_code(star_peak != NULL, CPL_ERROR_NULL_INPUT);
1619 irplib_assure_code(star_flux != NULL, CPL_ERROR_NULL_INPUT);
1620 irplib_assure_code(psf_peak != NULL, CPL_ERROR_NULL_INPUT);
1621 irplib_assure_code(psf_flux != NULL, CPL_ERROR_NULL_INPUT);
1623 irplib_assure_code(pscale1 > 0.0, CPL_ERROR_ILLEGAL_INPUT);
1624 irplib_assure_code(pscale2 > 0.0, CPL_ERROR_ILLEGAL_INPUT);
1626 irplib_assure_code(xpos1-window_size > 0, CPL_ERROR_ACCESS_OUT_OF_RANGE);
1627 irplib_assure_code(ypos1-window_size > 0, CPL_ERROR_ACCESS_OUT_OF_RANGE);
1628 irplib_assure_code(xpos2-window_size > 0, CPL_ERROR_ACCESS_OUT_OF_RANGE);
1629 irplib_assure_code(ypos2-window_size > 0, CPL_ERROR_ACCESS_OUT_OF_RANGE);
1631 irplib_assure_code(xpos1+window_size <= cpl_image_get_size_x(im1),
1632 CPL_ERROR_ACCESS_OUT_OF_RANGE);
1633 irplib_assure_code(ypos1+window_size <= cpl_image_get_size_y(im1),
1634 CPL_ERROR_ACCESS_OUT_OF_RANGE);
1636 irplib_assure_code(xpos2+window_size <= cpl_image_get_size_x(im2),
1637 CPL_ERROR_ACCESS_OUT_OF_RANGE);
1638 irplib_assure_code(ypos2+window_size <= cpl_image_get_size_y(im2),
1639 CPL_ERROR_ACCESS_OUT_OF_RANGE);
1641 irplib_assure_code(r1 > 0.0, CPL_ERROR_ILLEGAL_INPUT);
1642 irplib_assure_code(r2 > 0.0, CPL_ERROR_ILLEGAL_INPUT);
1643 irplib_assure_code(r3 > r2, CPL_ERROR_ILLEGAL_INPUT);
1661 ring[2] = r2/pscale2;
1662 ring[3] = r3/pscale2;
1665 sinfo_msg_debug(
"star_ring=%f %f %f %f",ring[0],ring[1],ring[2],ring[3]);
1676 check_nomsg(sinfo_get_star_features(im1,d,xpos1,ypos1,&xc,&yc,
1677 &star_peak1,&star_flux1,&star_bkg1));
1680 *star_peak=star_peak1;
1682 check_nomsg(sinfo_compute_psf(m1,m2/m1,lam*1.e-6,pscale1,xc,yc,1.,
1685 check_nomsg(sinfo_get_star_features(im2,d,xpos2,ypos2,&xc,&yc,
1686 &star_peak2,&star_flux2,&star_bkg2));
1688 *star_flux=star_flux2;
1689 *star_bkg=star_bkg2;
1691 check_nomsg(sinfo_compute_psf(m1,m2/m1,lam*1.e-6,pscale2,xc,yc,1.,
1699 sinfo_msg_debug(
"corr bkg: bkg1=%g bkg2=%g",star_bkg1/frat,*star_bkg);
1701 fabs(star_peak2/frat- *star_peak)/(star_peak2/frat));
1706 star_flux1*trat,*star_flux);
1711 if ( fabs((star_flux1*frat-*star_flux)/(*star_flux)) > 0.25) {
1713 fabs((star_flux1*frat-*star_flux)/(*star_flux)));
1719 if ( fabs(star_peak2-star_peak1*frat)/(star_peak2) > 0.25) {
1721 fabs(star_peak2-star_peak1*frat)/(star_peak2));
1724 irplib_assure_code(*star_peak > 0.0, CPL_ERROR_ILLEGAL_OUTPUT);
1725 *star_peak=star_peak1;
1727 *star_bkg=star_bkg2;
1728 *star_flux=star_flux2;
1739 *strehl = (*star_peak/(*star_flux*trat)) / (psf_peak1 );
1742 "fct=%g psf_peak=%g",
1743 *star_peak,star_flux1,star_flux2,*star_flux,
1744 *star_flux/frat*prat2,prat2/frat,psf_peak1);
1768 if (!cpl_errorstate_is_equal(initial_errorstate)) {
1771 cpl_errorstate_dump(initial_errorstate, CPL_FALSE, NULL);
1774 if (cpl_error_get_code() != CPL_ERROR_NONE) {
1775 return cpl_error_get_code();
1777 return CPL_ERROR_NONE;
1785 static cpl_error_code
1786 sinfo_get_star_features(
const cpl_image* im,
1809 int bkg_sx=SINFO_BKG_BOX_SZ;
1810 int bkg_sy=SINFO_BKG_BOX_SZ;
1812 cpl_bivector* iqe=NULL;
1814 cpl_image* im_new=NULL;
1816 sx=cpl_image_get_size_x(im);
1817 sy=cpl_image_get_size_y(im);
1821 if(NULL != (iqe=cpl_image_iqe(im,sx/2-radius,sy/2-radius,
1822 sx/2+radius,sy/2+radius))) {
1825 piqe=cpl_bivector_get_x_data(iqe);
1836 dim_new=floor(sinfo_find_min_of_four(xm,sx-xm,ym,sy-ym));
1838 llx=(ixm-dim_new > 1) ? ixm-dim_new : 1;
1839 lly=(iym-dim_new > 1) ? iym-dim_new : 1;
1840 urx=(ixm+dim_new < sx) ? ixm+dim_new : sx;
1841 ury=(iym+dim_new < sy) ? iym+dim_new : sy;
1843 check_nomsg(im_new=cpl_image_extract(im,llx,lly,urx,ury));
1846 check_nomsg(sinfo_get_bkg_4corners(im_new,bkg_sx,bkg_sy,bkg,&bkg_stdev));
1850 sinfo_free_bivector(&iqe);
1853 iqe=cpl_image_iqe(im_new,dim_new-radius,dim_new-radius,
1854 dim_new+radius,dim_new+radius);
1855 piqe=cpl_bivector_get_x_data(iqe);
1857 *xc=piqe[0]-dim_new-1;
1858 *yc=piqe[1]-dim_new-1;
1863 *peak=cpl_image_get_max_window(im_new,dim_new-radius,dim_new-radius,
1864 dim_new+radius,dim_new+radius);
1866 sinfo_get_flux_above_bkg(im_new,kappa,bkg_stdev,flux);
1871 sinfo_free_bivector(&iqe);
1881 check_nomsg(sinfo_get_bkg_4corners(im,bkg_sx,bkg_sy,bkg,&bkg_stdev));
1882 check_nomsg(sinfo_get_safe_box(&llx, &lly, &urx, &ury, xpos,ypos,radius,
1884 check_nomsg(*peak=cpl_image_get_max_window(im,llx,lly,urx,ury)-(*bkg));
1885 sinfo_get_flux_above_bkg(im,kappa,bkg_stdev,flux);
1894 sinfo_free_image(&im_new);
1895 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));
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_bkg);
2178 if (cpl_error_get_code() != CPL_ERROR_NONE) {
2179 return cpl_error_get_code();
2181 return CPL_ERROR_NONE;
2201 sinfo_compute_psf(
const double dia,
2203 const double lambda,
2207 const double anamorph,
2211 int bin=SINFO_PSF_BIN;
2212 int npoints=SINFO_PSF_NPOINT;
2214 int dim=SINFO_PSF_DIM;
2215 int blocks=SINFO_PSF_BLOCKS;
2228 double nyquist=lambda/dia/2.*206265/psize*bin;
2232 double part[npoints];
2250 cpl_image* img_xx=NULL;
2251 cpl_image* img_yy=NULL;
2252 cpl_image* img_rr=NULL;
2253 cpl_image* img_rrcor=NULL;
2254 cpl_image* img_airy=NULL;
2255 cpl_image* img_w=NULL;
2256 cpl_image* img_psf0=NULL;
2266 check_nomsg(img_xx=cpl_image_new(sx,sy,CPL_TYPE_DOUBLE));
2267 img_yy=cpl_image_new(sx,sy,CPL_TYPE_DOUBLE);
2268 img_rr=cpl_image_new(sx,sy,CPL_TYPE_DOUBLE);
2271 pxx=cpl_image_get_data_double(img_xx);
2272 pyy=cpl_image_get_data_double(img_yy);
2273 prr=cpl_image_get_data_double(img_rr);
2278 pxx[j*sx+i]=(i-sx/2-cx*bin)/nyquist*SINFO_MATH_PI/2;
2280 pyy[j*sx+i]=(j-sy/2-cy*bin)/nyquist*SINFO_MATH_PI/2*anamorph;
2283 prr[j*sx+i]=sqrt(pxx[j*sx+i]*pxx[j*sx+i]+pyy[j*sx+i]*pyy[j*sx+i]);
2301 cor=1./(1.-occ*occ);
2304 img_rrcor=cpl_image_duplicate(img_rr);
2305 cpl_image_multiply_scalar(img_rrcor,cor);
2306 pcor=cpl_image_get_data_double(img_rrcor);
2313 img_airy=cpl_image_new(sx,sy,CPL_TYPE_DOUBLE);
2314 pairy=cpl_image_get_data_double(img_airy);
2321 fct=(2.*j1(prr[j*sx+i])/prr[j*sx+i]);
2322 pairy[j*sx+i]=fct*fct;
2331 fct=(2.*j1(prr[j*sx+i])/prr[j*sx+i]-occ*occ*2.*j1(pcor[j*sx+i])/pcor[j*sx+i]);
2332 pairy[j*sx+i]=cor*fct*fct;
2345 img_w=cpl_image_duplicate(img_airy);
2347 pairy=cpl_image_get_data_double(img_airy);
2351 if(!irplib_isnan(pairy[i+j*sx]) && (pairy[i+j*sx] ==0)) {
2357 pairy[sx/2+sy/2*sx]=1.;
2373 for(i=0;i<npoints;i++) {
2374 ll[i]=(double)i/npoints*v0;
2377 cor=1./(1.-occ*occ);
2379 for(i=0;i<npoints;i++) {
2380 part[i]=2.*j1(ll[i])/ll[i];
2385 for(i=0;i<npoints;i++) {
2386 tot1+=j1(occ*ll[i])*part[i]*dll;
2393 ee=(1.-j0(v0)*j0(v0));
2398 ee-=(j1(v0))*(j1(v0));
2403 occ*occ*(1-j0(occ*v0)*j0(occ*v0)-j1(occ*v0)*j1(occ*v0)));
2406 ee+=occ*occ*(1-j0(occ*v0)*j0(occ*v0)-j1(occ*v0)*j1(occ*v0));
2417 pairy=cpl_image_get_data_double(img_airy);
2418 prr=cpl_image_get_data_double(img_rr);
2421 if(!irplib_isnan(pairy[i+j*sx]) && (prr[i+j*sx] <v0)) {
2422 tot1+=pairy[i+j*sx]*ee;
2430 cpl_image_divide_scalar(img_airy,tot1);
2442 start=(dim/2-1)-(blocks/2*bin-1)-bin/2;
2445 img_psf0=cpl_image_new(blocks,blocks,CPL_TYPE_DOUBLE);
2446 ppsf0=cpl_image_get_data_double(img_psf0);
2450 for(j=0;j<blocks;j++) {
2451 for(i=0;i<blocks;i++) {
2453 for(jj=start+j*bin;jj<start+(j+1)*bin-1;jj++){
2454 for(ii=start+i*bin;ii<start+(i+1)*bin-1;ii++){
2455 if(!irplib_isnan(pairy[ii+jj*sx])) {
2456 tot1+=pairy[ii+jj*sx];
2460 ppsf0[i+j*blocks]=tot1;
2465 cpl_image_divide_scalar(img_psf0,tot2);
2471 k=180.*3600./SINFO_MATH_PI;
2478 *psf_peak=cpl_image_get_max(img_psf0);
2481 dia,occ,lambda,psize,cx,cy,anamorph,*psf_peak);
2486 sinfo_free_image(&img_w);
2487 sinfo_free_image(&img_psf0);
2488 sinfo_free_image(&img_xx);
2489 sinfo_free_image(&img_yy);
2490 sinfo_free_image(&img_rr);
2491 sinfo_free_image(&img_rrcor);
2492 sinfo_free_image(&img_airy);
2495 if (cpl_error_get_code() != CPL_ERROR_NONE) {
2496 return cpl_error_get_code();
2498 return CPL_ERROR_NONE;
2505 sinfo_get_flux_above_bkg(
const cpl_image* img,
2511 const float* pimg=NULL;
2519 cpl_image* timg=NULL;
2523 timg=cpl_image_duplicate(img);
2524 cpl_image_subtract_scalar(timg,std);
2525 check_nomsg(sinfo_get_bkg_4corners(timg,SINFO_BKG_BOX_SZ,SINFO_BKG_BOX_SZ,
2526 &sky_bkg,&sky_std));
2528 check_nomsg(pimg=cpl_image_get_data_float_const(timg));
2530 sx=cpl_image_get_size_x(img);
2531 sy=cpl_image_get_size_y(img);
2535 if(!irplib_isnan(pimg[i+j*sx]) &&
2536 (pimg[i+j*sx]>(sky_bkg+kappa*sky_std))) {
2537 tot+=(double)pimg[i+j*sx];
2543 *f=(double)(tot-k*sky_bkg);
2546 sinfo_free_image(&timg);
2548 if (cpl_error_get_code() != CPL_ERROR_NONE) {
2549 return cpl_error_get_code();
2551 return CPL_ERROR_NONE;
2609 sinfo_find_min_of_four(
const double n1,
2615 min = (n1 < n2) ? n1 : n2;
2616 min = (min < n3) ? min : n3;
2617 min = (min < n4) ? min : n4;
2622 sinfo_scale_flux(
const double p1,
2628 return (p2/p1)*(p2/p1)*(t2/t1);