34 #include "sinfo_new_dark.h"
35 #include "sinfo_utilities.h"
36 #include "sinfo_pro_save.h"
37 #include "sinfo_dark_ini_by_cpl.h"
38 #include "sinfo_dfs.h"
39 #include "sinfo_pfits.h"
40 #include "sinfo_error.h"
41 #include "sinfo_utils_wrappers.h"
45 static int sinfo_dark_ron_reduce(cpl_frameset * framelist,
51 sinfo_dark_compare(
const cpl_frame * frame1,
const cpl_frame * frame2);
80 int sinfo_new_dark (
const char* plugin_id, cpl_parameterlist* config,
81 cpl_frameset* sof,
char* dark_name)
84 dark_config * cfg=NULL ;
85 cpl_imagelist * image_list=NULL ;
86 cpl_imagelist * object_list=NULL ;
89 cpl_image * image=NULL ;
90 cpl_image * eclipse_image=NULL ;
92 cpl_image* dark_img=NULL;
93 cpl_frame* first_frame=NULL;
94 cpl_vector* qc_dark_median=NULL;
95 cpl_frameset* raw=NULL;
96 cpl_table* qclog_tbl=NULL;
97 cpl_propertylist* rplist=NULL;
98 cpl_frameset* f_one=NULL;
108 double exp_time = 0.;
109 float* int_time=NULL;
112 char ref_file[MAX_NAME_SIZE];
113 cpl_size zone_def[4];
116 double qc_darkmed_ave=0;
117 double qc_darkmed_stdev=0;
123 cpl_size* selection=NULL;
132 check_nomsg(raw=cpl_frameset_new());
133 cknull(cfg = sinfo_parse_cpl_input_dark(config,sof,&raw),
134 "could not parse cpl input!") ;
148 sinfo_msg(
"Build data cube");
150 check_nomsg(image_list = cpl_imagelist_new());
151 int_time = (
float*) cpl_calloc(cfg -> nframes,
sizeof(
float)) ;
152 sinfo_check_rec_status(0);
154 for ( i = 0 ; i < cfg->nframes ; i++ )
156 if (sinfo_is_fits_file (cfg->inFrameList[i]) != 1) {
161 check_nomsg(cpl_imagelist_set(image_list,
162 cpl_image_load(cfg->inFrameList[i],CPL_TYPE_FLOAT,0,0),i));
164 exp_time = sinfo_pfits_get_exptime(cfg->inFrameList[i]);
165 if(cpl_error_get_code() != CPL_ERROR_NONE) {
169 sinfo_new_array_set_value(int_time, (
float)exp_time, i);
177 sinfo_msg(
"Find frames with same tint");
180 n_times = (
int*) cpl_calloc(cfg -> nframes,
sizeof(
int));
181 sinfo_msg(
"Sort frames with same tint");
183 for ( i = 0 ; i < cfg->nframes-1 ; i++ )
185 if ( sinfo_new_array_get_value(int_time, i+1) !=
186 sinfo_new_array_get_value(int_time, i)
199 sinfo_msg(
"Do clean mean");
202 sinfo_msg(
"n == 0 ");
205 cknull(object_list = cpl_imagelist_new(),
206 "could not allocate memory for object_list");
213 check_nomsg(qc_dark_median=cpl_vector_new(cfg->nframes));
216 for ( j = 0 ; j < cfg->nframes ; j++ ) {
217 check_nomsg(cpl_imagelist_set(object_list,
218 cpl_image_duplicate(cpl_imagelist_get(image_list,j)),
220 check_nomsg(cpl_vector_set(qc_dark_median,j,
221 cpl_image_get_median(cpl_imagelist_get(image_list,j))));
227 check_nomsg(qc_darkmed_ave=cpl_vector_get_mean(qc_dark_median));
228 if (cfg->nframes > 1) {
229 check_nomsg(qc_darkmed_stdev=cpl_vector_get_stdev(qc_dark_median));
237 check_nomsg(no=cpl_imagelist_get_size(object_list));
238 lo_cut=(floor)(cfg->lo_reject*no+0.5);
239 hi_cut=(floor)(cfg->hi_reject*no+0.5);
243 cknull(image=cpl_imagelist_collapse_minmax_create(object_list,
245 "sinfo_average_with_rejection failed");
247 sinfo_free_imagelist(&object_list);
249 sinfo_msg(
"dark_name=%s\n",dark_name);
251 check_nomsg(first_frame = cpl_frameset_get_frame(raw, 0)) ;
253 strcpy(ref_file,cpl_frame_get_filename(first_frame)) ;
254 cknull_nomsg(rplist = cpl_propertylist_load(ref_file, 0));
256 check_nomsg(naxis1=cpl_propertylist_get_int(rplist,
"NAXIS1"));
257 check_nomsg(naxis2=cpl_propertylist_get_int(rplist,
"NAXIS1"));
258 sinfo_free_propertylist(&rplist);
260 if(cfg->qc_ron_xmin < 1) {
265 if(cfg->qc_ron_xmax > naxis1) {
270 if(cfg->qc_ron_ymin < 1) {
275 if(cfg->qc_ron_ymax > naxis2) {
280 zone_def[0]=cfg->qc_ron_xmin;
281 zone_def[1]=cfg->qc_ron_xmax;
282 zone_def[2]=cfg->qc_ron_ymin;
283 zone_def[3]=cfg->qc_ron_ymax;
287 check(cpl_flux_get_noise_window(image,
293 "In computation RON on image %s",dark_name);
297 if(cfg->qc_fpn_xmin < 1) {
302 if(cfg->qc_fpn_xmax > naxis1) {
307 if(cfg->qc_fpn_ymin < 1) {
312 if(cfg->qc_fpn_ymax > naxis2) {
317 zone[0]=cfg->qc_fpn_xmin;
318 zone[1]=cfg->qc_fpn_xmax;
319 zone[2]=cfg->qc_fpn_ymin;
320 zone[3]=cfg->qc_fpn_ymax;
321 check(cpl_flux_get_noise_window(image, zone, cfg->qc_fpn_hsize,
322 cfg->qc_fpn_nsamp, &fpn, NULL),
323 "Error computing noise in a window");
326 cknull_nomsg(qclog_tbl = sinfo_qclog_init());
328 ck0_nomsg(sinfo_qclog_add_double(qclog_tbl,
"QC DARKMED AVE",
329 qc_darkmed_ave,
"Average of raw darks medians",
"%f"));
331 ck0_nomsg(sinfo_qclog_add_double(qclog_tbl,
"QC DARKMED STDEV",
332 qc_darkmed_stdev,
"STDEV of raw darks medians",
"%f"));
334 ck0_nomsg(sinfo_qclog_add_double(qclog_tbl,
"QC RON",
335 qc_ron_val,
"Read Out Noise",
"%f"));
337 ck0_nomsg(sinfo_qclog_add_double(qclog_tbl,
"QC RONRMS",
338 qc_ron_err,
"RMS on Read Out Noise",
"%f"));
340 ck0_nomsg(sinfo_qclog_add_double(qclog_tbl,
"QC DARKFPN",
341 fpn,
"Fixed Pattern Noise of combined frames",
"%g"));
346 check(selection = cpl_frameset_labelise(raw,sinfo_dark_compare,&nsets),
351 for ( i = 0 ; i < nsets ; i++ ) {
352 sinfo_msg(
"Reduce data set no %d out of %" CPL_SIZE_FORMAT
"",
354 cpl_msg_indent_more();
355 check_nomsg(f_one = cpl_frameset_extract(raw,selection,i));
356 if (cpl_frameset_get_size(f_one) < 2) {
360 if (sinfo_dark_ron_reduce(f_one,cfg,qclog_tbl) ) {
364 sinfo_free_frameset(&f_one);
365 cpl_msg_indent_less();
374 ck0(sinfo_pro_save_ima(image,raw,sof,dark_name,
375 PRO_MASTER_DARK,qclog_tbl,plugin_id,config),
376 "cannot save ima %s", dark_name);
377 sinfo_free_table(&qclog_tbl);
378 sinfo_free_image(&image);
384 cknull(object_list = cpl_imagelist_new(),
385 "could not allocate memory");
389 for (j =0; j < n_times[0]; j++) {
391 check_nomsg(cpl_imagelist_set(object_list,
392 cpl_image_duplicate(cpl_imagelist_get(image_list,j)),
398 check_nomsg(no=cpl_imagelist_get_size(object_list));
399 lo_cut=(floor)(cfg->lo_reject*no+0.5);
400 hi_cut=(floor)(cfg->hi_reject*no+0.5);
401 check(image=cpl_imagelist_collapse_minmax_create(object_list,
403 "sinfo_average_with_rejection failed!");
405 sinfo_free_imagelist(&object_list);
407 cknull_nomsg(qclog_tbl = sinfo_qclog_init());
408 ck0_nomsg(sinfo_qclog_add_int(qclog_tbl,
"QC NAME",1,
409 "A description",
"%d"));
411 ck0(sinfo_pro_save_ima(image,raw,sof,dark_name,
412 PRO_MASTER_DARK,qclog_tbl,plugin_id,config),
413 "cannot save ima %s", dark_name);
416 sinfo_free_image(&image);
417 sinfo_free_table(&qclog_tbl);
420 cknull(object_list = cpl_imagelist_new(),
421 "could not allocate memory");
425 for (j = n_times[0]; j < cfg->nframes; j++) {
427 check_nomsg(cpl_imagelist_set(object_list,
428 cpl_image_duplicate(cpl_imagelist_get(image_list,j)),
434 check_nomsg(no=cpl_imagelist_get_size(object_list));
435 lo_cut=(floor)(cfg->lo_reject*no+0.5);
436 hi_cut=(floor)(cfg->hi_reject*no+0.5);
437 cknull(eclipse_image=cpl_imagelist_collapse_minmax_create(object_list,
439 "sinfo_average_with_rejection failed!");
441 sinfo_free_imagelist(&object_list);
444 cknull_nomsg(qclog_tbl = sinfo_qclog_init());
445 ck0_nomsg(sinfo_qclog_add_int(qclog_tbl,
"QC NAME",1,
446 "A description",
"%d"));
448 ck0(sinfo_pro_save_ima(eclipse_image,raw,sof,dark_name,
449 PRO_MASTER_DARK,qclog_tbl,plugin_id,config),
450 "cannot save ima %s", dark_name);
452 sinfo_free_image(&eclipse_image);
453 sinfo_free_table(&qclog_tbl);
457 sinfo_msg(
"n==else\n");
459 for (i= 0; i < n+1; i++) {
462 check(object_list = cpl_imagelist_new(),
463 "could not allocate memory");
466 for (j = 0; j < n_times[0]; j++) {
467 check_nomsg(cpl_imagelist_set(object_list,
468 cpl_image_duplicate(cpl_imagelist_get(image_list,j)),
472 check_nomsg(no=cpl_imagelist_get_size(object_list));
473 lo_cut=(floor)(cfg->lo_reject*no+0.5);
474 hi_cut=(floor)(cfg->hi_reject*no+0.5);
475 check(image=cpl_imagelist_collapse_minmax_create(object_list,
477 "Error computing average with rejection");
478 sinfo_free_imagelist(&object_list);
480 sinfo_msg(
"dark_name-%s\n",dark_name);
481 cknull_nomsg(qclog_tbl = sinfo_qclog_init());
482 ck0_nomsg(sinfo_qclog_add_int(qclog_tbl,
"QC NAME",1,
483 "A description",
"%d"));
485 ck0(sinfo_pro_save_ima(image,raw,sof,dark_name,
486 PRO_MASTER_DARK,qclog_tbl,plugin_id,config),
487 "cannot save ima %s", dark_name);
490 sinfo_free_table(&qclog_tbl);
491 sinfo_free_image(&image);
492 }
else if ( i == n ) {
494 cknull(object_list = cpl_imagelist_new(),
495 "could not allocate memory");
498 for (j = n_times[n-1]; j < cfg->nframes; j++) {
499 check_nomsg(cpl_imagelist_set(object_list,
500 cpl_image_duplicate(cpl_imagelist_get(image_list,j)),
504 check_nomsg(no=cpl_imagelist_get_size(object_list));
505 lo_cut=(floor)(cfg->lo_reject*no+0.5);
506 hi_cut=(floor)(cfg->hi_reject*no+0.5);
507 check(image=cpl_imagelist_collapse_minmax_create(object_list,
509 "Error computing average with rejection");
511 sinfo_free_imagelist(&object_list);
513 cknull_nomsg(qclog_tbl = sinfo_qclog_init());
514 ck0_nomsg(sinfo_qclog_add_int(qclog_tbl,
"QC NAME",1,
515 "A description",
"%d"));
517 ck0(sinfo_pro_save_ima(image,raw,sof,dark_name,
518 PRO_MASTER_DARK,qclog_tbl,plugin_id,config),
519 "cannot save ima %s", dark_name);
520 sinfo_free_table(&qclog_tbl);
521 sinfo_free_image(&image);
524 cknull(object_list = cpl_imagelist_new(),
525 "could not allocate memory");
528 for (j = n_times[i-1]; j < n_times[i]; j++) {
529 check_nomsg(cpl_imagelist_set(object_list,
530 cpl_image_duplicate(cpl_imagelist_get(image_list,j)),
534 check_nomsg(no=cpl_imagelist_get_size(object_list));
535 lo_cut=(floor)(cfg->lo_reject*no+0.5);
536 hi_cut=(floor)(cfg->hi_reject*no+0.5);
537 cknull(image=cpl_imagelist_collapse_minmax_create(object_list,
539 "Error computing average with rejection");
541 sinfo_free_imagelist(&object_list);
543 cknull_nomsg(qclog_tbl = sinfo_qclog_init());
544 ck0_nomsg(sinfo_qclog_add_int(qclog_tbl,
"QC NAME",1,
545 "A description",
"%d"));
547 ck0(sinfo_pro_save_ima(image,raw,sof,dark_name,
548 PRO_MASTER_DARK,qclog_tbl,plugin_id,config),
549 "cannot save ima %s", dark_name);
551 sinfo_free_image(&image);
552 sinfo_free_table(&qclog_tbl);
560 sinfo_free_imagelist(&image_list);
561 sinfo_free_my_vector(&qc_dark_median);
562 sinfo_free_int(&n_times);
563 sinfo_free_float(&int_time);
564 sinfo_dark_free(&cfg);
565 sinfo_free_frameset(&raw);
570 sinfo_free_frameset(&f_one);
572 sinfo_free_image(&eclipse_image);
573 sinfo_free_table(&qclog_tbl);
574 sinfo_free_image(&dark_img);
575 sinfo_free_image(&image);
576 sinfo_free_propertylist(&rplist);
577 sinfo_free_my_vector(&qc_dark_median);
578 sinfo_free_imagelist(&object_list);
579 sinfo_free_int(&n_times);
580 sinfo_free_float(&int_time);
581 sinfo_free_imagelist(&image_list);
582 sinfo_dark_free(&cfg);
583 sinfo_free_frameset(&raw);
604 sinfo_dark_ron_reduce(cpl_frameset * framelist,
606 cpl_table * qclog_tbl)
608 cpl_imagelist * iset =NULL;
613 char key_name[MAX_NAME_SIZE];
616 cknull_nomsg(framelist);
619 if ((iset = sinfo_new_frameset_to_iset(framelist)) == NULL) {
625 niset=cpl_imagelist_get_size(iset);
627 ron = cpl_calloc(niset,
sizeof(
double));
629 sinfo_get_ron(framelist,
630 cfg->qc_ron_xmin,cfg->qc_ron_xmax,
631 cfg->qc_ron_ymin,cfg->qc_ron_ymax,
632 cfg->qc_ron_hsize,cfg->qc_ron_nsamp,
635 for (i=0 ; i<niset-1 ; i++) {
640 snprintf(key_name,MAX_NAME_SIZE-1,
"%s%d",
"QC RON",i+1);
641 sinfo_qclog_add_double(qclog_tbl,key_name,ron[i],
642 "Read Out Noise",
"%f");
647 sinfo_free_imagelist(&iset) ;
653 sinfo_free_imagelist(&iset) ;
668 static int sinfo_dark_compare(
669 const cpl_frame * frame1,
670 const cpl_frame * frame2)
673 cpl_propertylist * plist1=NULL;
674 cpl_propertylist * plist2=NULL;
685 if (frame1==NULL || frame2==NULL)
return -1 ;
688 cknull(plist1=cpl_propertylist_load(cpl_frame_get_filename(frame1),0),
689 "getting header from reference frame");
691 cknull(plist2=cpl_propertylist_load(cpl_frame_get_filename(frame2),0),
692 "getting header from reference frame");
696 check(dval1=sinfo_pfits_get_exp_time(plist1),
"To get exptime");
697 check(dval2=sinfo_pfits_get_exp_time(plist2),
"To get exptime");
699 if (fabs(dval1-dval2) > 1e-5) comparison = 0 ;
702 check(ival1=sinfo_pfits_get_rom(plist1),
"to get read out mode");
703 check(ival2=sinfo_pfits_get_rom(plist2),
"to get read out mode");
704 if (ival1 != ival2) comparison = 0 ;
708 cknull(sval=sinfo_pfits_get_mode(plist1),
"to get detector mode");
709 strcpy(mode1, sval) ;
711 cknull(sval=sinfo_pfits_get_mode(plist2),
"to get detector mode");
712 strcpy(mode2, sval) ;
715 if (strcmp(mode1, mode2)) comparison = 0 ;
723 sinfo_free_propertylist(&plist1);
724 sinfo_free_propertylist(&plist2);
728 sinfo_free_propertylist(&plist1);
729 sinfo_free_propertylist(&plist2);
#define sinfo_msg_error(...)
Print an error message.
#define sinfo_msg_warning(...)
Print an warning message.