44 #include <irplib_stdstar.h>
45 #include <sinfo_cpl_size.h>
46 #include "irplib_utils.h"
47 #include "sinfo_dfs.h"
48 #include "sinfo_tpl_utils.h"
50 #include "sinfo_new_stdstar.h"
51 #include "sinfo_standstar_ini_by_cpl.h"
52 #include "sinfo_pro_save.h"
53 #include "sinfo_pfits.h"
54 #include "sinfo_utilities_scired.h"
55 #include "sinfo_spectrum_ops.h"
56 #include "sinfo_hidden.h"
57 #include "sinfo_functions.h"
58 #include "sinfo_utl_efficiency.h"
59 #include "sinfo_error.h"
60 #include "sinfo_utils_wrappers.h"
98 sinfo_new_stdstar(
const char* plugin_id,
99 cpl_parameterlist* config,
100 cpl_frameset* sof,cpl_frameset* ref_set)
103 cpl_errorstate clean_state = cpl_errorstate_get();
104 standstar_config * cfg=NULL ;
105 cpl_imagelist * cube=NULL ;
107 cpl_imagelist * list_object=NULL ;
108 cpl_image ** spectrum=NULL ;
109 cpl_image * img_spct=NULL ;
113 cpl_frameset* raw=NULL;
114 cpl_frame* frame=NULL;
115 cpl_image* std_med_ima=NULL;
116 cpl_image* std_med_dup=NULL;
118 cpl_table* qclog_tbl=NULL;
119 cpl_table* tbl_spectrum=NULL;
120 cpl_propertylist* plist=NULL;
127 double cleanfactor=0;
130 char std_med_filename[MAX_NAME_SIZE];
131 char std_cub_filename[MAX_NAME_SIZE];
135 cpl_size max_ima_x=0;
136 cpl_size max_ima_y=0;
172 cpl_frame* frm_sci=NULL;
173 cpl_frame* frm_atmext=NULL;
174 cpl_frame* frm_std_cat=NULL;
175 cpl_table* tot_eff=NULL;
179 int do_compute_eff=0;
180 cpl_parameter* p=NULL;
194 check_nomsg(raw=cpl_frameset_new());
196 cknull(cfg=sinfo_parse_cpl_input_standstar(config,sof,&raw),
197 "could not parse cpl input!") ;
200 cknull_nomsg(p = cpl_parameterlist_find(config,
201 "sinfoni.std_star.compute_eff"));
203 check_nomsg(do_compute_eff = cpl_parameter_get_bool(p));
204 cknull(list_object = cpl_imagelist_new (),
205 "could not allocate memory");
212 if (cfg->convInd == 1) {
213 factor = sinfo_new_floatarray(cfg->nframes);
216 if(NULL != cpl_frameset_find(sof,PRO_COADD_STD)) {
217 frame = cpl_frameset_find(sof,PRO_COADD_STD);
218 strcpy(std_cub_filename,cpl_frame_get_filename(frame));
219 }
else if(NULL != cpl_frameset_find(sof,PRO_COADD_PSF)) {
220 frame = cpl_frameset_find(sof,PRO_COADD_PSF);
221 strcpy(std_cub_filename,cpl_frame_get_filename(frame));
222 }
else if(NULL != cpl_frameset_find(sof,PRO_COADD_OBJ)) {
223 frame = cpl_frameset_find(sof,PRO_COADD_OBJ);
224 strcpy(std_cub_filename,cpl_frame_get_filename(frame));
225 }
else if(NULL != cpl_frameset_find(sof,PRO_COADD_PUPIL)) {
226 frame = cpl_frameset_find(sof,PRO_COADD_PUPIL);
227 strcpy(std_cub_filename,cpl_frame_get_filename(frame));
230 PRO_COADD_STD,PRO_COADD_PSF,
231 PRO_COADD_OBJ,PRO_COADD_PUPIL );
236 cknull(plist = cpl_propertylist_load(std_cub_filename, 0),
237 "getting header from reference ima frame %s",std_cub_filename);
239 cenpix = sinfo_pfits_get_crpix3(plist);
240 cenLambda = sinfo_pfits_get_crval3(plist);
244 if (cpl_propertylist_has(plist, KEY_NAME_CDELT3)) {
245 disp=cpl_propertylist_get_double(plist, KEY_NAME_CDELT3);
251 sinfo_free_propertylist(&plist) ;
256 if(NULL != cpl_frameset_find(sof,PRO_MED_COADD_STD)) {
257 frame = cpl_frameset_find(sof,PRO_MED_COADD_STD);
258 strcpy(std_med_filename,cpl_frame_get_filename(frame));
259 check_nomsg(std_med_ima=cpl_image_load(std_med_filename,
260 CPL_TYPE_FLOAT,0,0));
261 }
else if(NULL != cpl_frameset_find(sof,PRO_OBS_STD)) {
262 check_nomsg(frame = cpl_frameset_find(sof,PRO_OBS_STD));
263 strcpy(std_cub_filename,cpl_frame_get_filename(frame));
264 check_nomsg(cube = cpl_imagelist_load(std_cub_filename,
266 strcpy(std_med_filename,STDSTAR_OUT_MED_CUBE);
267 check_nomsg(std_med_ima=cpl_imagelist_collapse_median_create(cube));
268 sinfo_free_imagelist(&cube);
270 ck0(sinfo_pro_save_ima(std_med_ima,ref_set,sof,STDSTAR_OUT_MED_CUBE,
271 PRO_MED_OBS_PSF,NULL,plugin_id,config),
272 "Error saving image %s tag %s",STDSTAR_OUT_MED_CUBE,PRO_MED_OBS_PSF);
274 }
else if(NULL != cpl_frameset_find(sof,PRO_MED_COADD_PSF)) {
275 check_nomsg(frame = cpl_frameset_find(sof,PRO_MED_COADD_PSF));
276 strcpy(std_med_filename,cpl_frame_get_filename(frame));
277 check_nomsg(std_med_ima=cpl_image_load(std_med_filename,
278 CPL_TYPE_FLOAT,0,0));
279 }
else if(NULL != cpl_frameset_find(sof,PRO_OBS_PSF)) {
280 check_nomsg(frame = cpl_frameset_find(sof,PRO_OBS_PSF));
281 strcpy(std_cub_filename,cpl_frame_get_filename(frame));
282 check_nomsg(cube=cpl_imagelist_load(std_cub_filename,CPL_TYPE_FLOAT,0));
283 strcpy(std_med_filename,STDSTAR_OUT_MED_CUBE);
284 check_nomsg(std_med_ima=cpl_imagelist_collapse_median_create(cube));
285 sinfo_free_imagelist(&cube);
287 ck0(sinfo_pro_save_ima(std_med_ima,ref_set,sof,STDSTAR_OUT_MED_CUBE,
288 PRO_MED_OBS_PSF,NULL,plugin_id,config),
289 "Error saving image %s tag %s",STDSTAR_OUT_MED_CUBE,PRO_MED_OBS_PSF);
291 }
else if(NULL != cpl_frameset_find(sof,PRO_MED_COADD_OBJ)) {
292 check_nomsg(frame = cpl_frameset_find(sof,PRO_MED_COADD_OBJ));
293 strcpy(std_med_filename,cpl_frame_get_filename(frame));
294 check_nomsg(std_med_ima=cpl_image_load(std_med_filename,
295 CPL_TYPE_FLOAT,0,0));
296 }
else if(NULL != cpl_frameset_find(sof,PRO_OBS_OBJ)) {
297 check_nomsg(frame = cpl_frameset_find(sof,PRO_OBS_OBJ));
298 strcpy(std_cub_filename,cpl_frame_get_filename(frame));
299 check_nomsg(cube = cpl_imagelist_load(std_cub_filename,
301 strcpy(std_med_filename,STDSTAR_OUT_MED_CUBE);
302 check_nomsg(std_med_ima=cpl_imagelist_collapse_median_create(cube));
303 sinfo_free_imagelist(&cube);
305 ck0(sinfo_pro_save_ima(std_med_ima,ref_set,sof,STDSTAR_OUT_MED_CUBE,
306 PRO_MED_OBS_OBJ,NULL,plugin_id,config),
307 "Error saving image %s tag %s",STDSTAR_OUT_MED_CUBE,PRO_MED_OBS_OBJ);
310 PRO_MED_COADD_STD, PRO_OBS_STD,
311 PRO_MED_COADD_PSF, PRO_OBS_PSF,
312 PRO_MED_COADD_OBJ, PRO_OBS_OBJ);
317 check_nomsg(std_med_dup=cpl_image_duplicate(std_med_ima));
318 sinfo_clean_nan(&std_med_dup);
319 ima_szx=cpl_image_get_size_x(std_med_ima);
320 ima_szy=cpl_image_get_size_y(std_med_ima);
328 check_nomsg(cpl_image_get_maxpos_window(std_med_dup,
329 margin,margin,ima_szx-margin,ima_szy-margin,
330 &max_ima_x,&max_ima_y));
331 sinfo_free_image(&std_med_dup);
335 wllx= ((max_ima_x-psf_sz)>0) ? (max_ima_x-psf_sz) : 1;
336 wlly= ((max_ima_y-psf_sz)>0) ? (max_ima_y-psf_sz) : 1;
337 wurx= ((max_ima_x+psf_sz)<ima_szx) ? (max_ima_x+psf_sz) : ima_szx ;
338 wury= ((max_ima_y+psf_sz)<ima_szy) ? (max_ima_y+psf_sz) : ima_szy ;
344 check_nomsg(qclog_tbl = sinfo_qclog_init());
345 check_nomsg(max_ima_cx=cpl_image_get_centroid_x_window(std_med_ima,wllx,
347 check_nomsg(max_ima_cy=cpl_image_get_centroid_y_window(std_med_ima,wllx,
350 xshift=max_ima_cx-ima_szx/2;
351 yshift=max_ima_cy-ima_szy/2;
353 ck0_nomsg(sinfo_qclog_add_double(qclog_tbl,
"QC SHIFTX",xshift,
354 "X shift centroid - center image",
"%f"));
356 ck0_nomsg(sinfo_qclog_add_double(qclog_tbl,
"QC SHIFTY",yshift,
357 "Y shift centroid - center image",
"%f"));
360 ((max_ima_x-psf_sz) < 1) ||
361 ((max_ima_y-psf_sz) < 1) ||
362 ((max_ima_x+psf_sz) > ima_szx) ||
363 ((max_ima_x+psf_sz) > ima_szy)
366 psf_sz = (psf_sz < (max_ima_x-1)) ? psf_sz : (max_ima_x-1);
367 psf_sz = (psf_sz < (max_ima_y-1)) ? psf_sz : (max_ima_y-1);
368 psf_sz = (psf_sz < ima_szx-max_ima_x) ? psf_sz : (ima_szx-max_ima_x);
369 psf_sz = (psf_sz < ima_szy-max_ima_y) ? psf_sz : (ima_szy-max_ima_y);
371 psf_sz = (psf_sz > 4) ? psf_sz : 4;
374 ck0_nomsg(sinfo_qclog_add_int(qclog_tbl,
"QC FWHM LLX",cfg->llx,
375 "STD star FWHM LLX",
"%d"));
376 ck0_nomsg(sinfo_qclog_add_int(qclog_tbl,
"QC FWHM LLY",cfg->lly,
377 "STD star FWHM LLY",
"%d"));
378 ck0_nomsg(sinfo_qclog_add_int(qclog_tbl,
"QC FWHM HBX",cfg->halfbox_x,
379 "STD star FWHM HBX",
"%d"));
380 ck0_nomsg(sinfo_qclog_add_int(qclog_tbl,
"QC FWHM HBX",cfg->halfbox_y,
381 "STD star FWHM HBY",
"%d"));
385 for ( i = 0 ; i < 7 ; i++ )
391 if(-1 == sinfo_new_fit_2d_gaussian(std_med_ima,
400 irplib_error_recover(clean_state,
"2d Gaussian fit failed");
405 ck0_nomsg(sinfo_qclog_add_double(qclog_tbl,
"QC FWHM MAJ",fpar[4],
406 "STD star FWHM on major axis",
"%f"));
407 ck0_nomsg(sinfo_qclog_add_double(qclog_tbl,
"QC FWHM MIN",fpar[5],
408 "STD star FWHM on minor axis",
"%f"));
409 ck0_nomsg(sinfo_qclog_add_double(qclog_tbl,
"QC THETA",fpar[6],
410 "STD star ellipsis angle theta",
"%f"));
423 if(CPL_ERROR_NONE == cpl_image_fit_gaussian(std_med_ima,
436 ck0_nomsg(sinfo_qclog_add_double(qclog_tbl,
"QC FWHMX",fwhm_x,
437 "STD star FWHM on X",
"%f"));
438 ck0_nomsg(sinfo_qclog_add_double(qclog_tbl,
"QC FWHMY",fwhm_y,
439 "STD star FWHM on Y",
"%f"));
441 cfg -> halfbox_x = (floor)(0.5*(fwhm_x+fwhm_y)*cfg->fwhm_factor+0.5);
443 cfg -> halfbox_y = (floor)(0.5*(fwhm_x+fwhm_y)*cfg->fwhm_factor+0.5);
447 irplib_error_recover(clean_state,
"Problem fitting Gaussian");
452 sinfo_free_image(&std_med_ima);
462 cfg -> llx = (int)(xcen-cfg->halfbox_x);
463 cfg -> llx = (cfg -> llx > 0 ) ? cfg -> llx : 1;
465 if((cfg->llx+2*cfg->halfbox_x) >= ima_szx) {
466 cfg -> halfbox_x=(int) ((ima_szx-cfg->llx-1)/2);
470 cfg -> lly = (int)(ycen-cfg->halfbox_y);
471 cfg -> lly = (cfg -> lly > 0 ) ? cfg -> lly : 1;
472 if((cfg->lly+2*cfg->halfbox_y) >= ima_szy) {
473 cfg -> halfbox_y=(int) ((ima_szy-cfg->lly-1)/2);
476 ck0_nomsg(sinfo_qclog_add_int(qclog_tbl,
"QC CHECK1",check1,
477 "Check on evaluation box",
"%d"));
490 sinfo_msg(
"Extraction");
491 cknull(spectrum = (cpl_image**) cpl_calloc (cfg -> nframes,
493 "Could not allocate memory for spectrum image");
495 for (fra=0; fra < cfg->nframes; fra++) {
496 name = cfg->inFrameList[fra];
497 if(sinfo_is_fits_file(name) != 1) {
501 cknull(cube = cpl_imagelist_load(name,CPL_TYPE_FLOAT,0),
502 "could not load data cube" );
504 if (exptime == FLAG) {
508 exptime = sinfo_pfits_get_ditndit(name);
510 sinfo_msg(
"cfg->gain %f",cfg->gain);
511 check_nomsg(tbl_spectrum=cpl_table_new(cpl_imagelist_get_size(cube)));
512 if(NULL==(spectrum[fra]=sinfo_new_optimal_extraction_from_cube( cube,
527 irplib_error_recover(clean_state,
528 "could not do sinfo_optimalExtractionFromCube");
530 check_nomsg(cpl_imagelist_set(list_object,
531 cpl_image_duplicate(spectrum[fra]), fra));
536 ck0_nomsg(sinfo_qclog_add_int(qclog_tbl,
"QC CHECK2",
537 check2,
"Check on evaluation box",
"%d"));
540 ck0(sinfo_pro_save_tbl(tbl_spectrum,ref_set,sof,
541 (
char*)STDSTAR_OUT_TABLE,
542 PRO_STD_STAR_SPECTRA,qclog_tbl,
544 "cannot dump ima %s",
"out_std_star_spectrum.fits");
547 sinfo_free_table(&qclog_tbl);
549 if (do_compute_eff!=0 && frm_std_cat !=NULL && frm_atmext != NULL) {
550 sinfo_msg(
"compute efficiency");
551 frm_sci = cpl_frameset_find(sof,PRO_STD_STAR_SPECTRA);
552 frm_std_cat = cpl_frameset_find(sof,FLUX_STD_CATALOG);
553 frm_atmext = cpl_frameset_find(sof,EXTCOEFF_TABLE);
557 check_nomsg(tot_eff=sinfo_efficiency_compute(frm_sci,frm_std_cat,
559 ck0(sinfo_pro_save_tbl(tot_eff,ref_set,sof,(
char*)EFFICIENCY_FILENAME,
560 PRO_EFFICIENCY,qclog_tbl,plugin_id,config),
561 "cannot dump ima %s",
"out_.fits");
573 if (cfg->convInd == 1) {
574 sinfo_msg(
"Determines convertion factor");
576 convfactor = sinfo_new_determine_conversion_factor( cube,
586 if (convfactor < -100000.) {
590 sinfo_new_array_set_value(factor, convfactor, fra);
593 sinfo_free_imagelist(&cube);
596 sinfo_free_table(&tbl_spectrum);
597 sinfo_free_image_array(&spectrum,cfg->nframes);
598 if (cfg->convInd == 1) {
599 sinfo_msg(
"Determines clean factor");
600 cleanfactor = sinfo_new_clean_mean(factor,
603 cfg->hi_reject*100.);
605 if (cleanfactor > 100000. || cleanfactor == FLAG) {
612 sinfo_msg(
"Average with rejection");
614 no=cpl_imagelist_get_size(list_object);
615 lo_cut=(floor)(cfg->lo_reject*no+0.5);
616 hi_cut=(floor)(cfg->hi_reject*no+0.5);
618 cknull(img_spct=cpl_imagelist_collapse_minmax_create(list_object,
620 "sinfo_average_with_rejection failed" );
623 sinfo_free_imagelist(&list_object);
625 check_nomsg(qclog_tbl = sinfo_qclog_init());
627 ck0_nomsg(sinfo_qclog_add_double(qclog_tbl,
"QC CONVFCT",cleanfactor,
628 "Conversion factor",
"%g"));
629 ck0_nomsg(sinfo_qclog_add_int(qclog_tbl,
"QC CHECK3",check3,
630 "Check evaluation box",
"%d"));
631 ck0(sinfo_pro_save_ima(img_spct,ref_set,sof,cfg->outName,
632 PRO_STD_STAR_SPECTRUM,qclog_tbl,
634 "cannot dump ima %s", cfg->outName);
636 sinfo_new_set_wcs_spectrum(img_spct,cfg->outName,cenLambda,disp,cenpix);
637 sinfo_free_table(&qclog_tbl);
640 if(factor != NULL) sinfo_new_destroy_array(&factor);
641 sinfo_free_image(&img_spct);
642 sinfo_stdstar_free(&cfg);
643 sinfo_free_frameset(&raw);
648 sinfo_free_table(&tbl_spectrum);
649 sinfo_free_table(&qclog_tbl);
650 sinfo_free_imagelist(&list_object);
651 if(spectrum != NULL) sinfo_free_image_array(&spectrum,cfg->nframes);
652 sinfo_free_image(&std_med_ima);
653 sinfo_free_image(&std_med_dup);
654 sinfo_free_imagelist(&cube);
655 sinfo_free_propertylist(&plist) ;
656 if(factor != NULL) sinfo_new_destroy_array(&factor);
657 sinfo_free_image(&img_spct);
658 sinfo_stdstar_free (&cfg);
659 sinfo_free_frameset(&raw);
#define sinfo_msg_error(...)
Print an error message.
#define sinfo_msg_warning(...)
Print an warning message.