44 #include "sinfo_new_lamp_flats.h"
45 #include "sinfo_flat_ini_by_cpl.h"
46 #include "sinfo_pro_save.h"
47 #include "sinfo_pro_types.h"
48 #include "sinfo_functions.h"
49 #include "sinfo_new_cube_ops.h"
50 #include "sinfo_error.h"
51 #include "sinfo_utils_wrappers.h"
52 #include "sinfo_image_ops.h"
53 #include "sinfo_utilities.h"
54 #include "sinfo_globals.h"
60 new_qc_get_cnt(cpl_frameset* on_set, cpl_frameset* of_set, flat_config* cfg);
62 new_lamp_flats_det_ncounts(cpl_frameset* raw, flat_config* config);
113 sinfo_new_lamp_flats (
const char* plugin_id,
114 cpl_parameterlist* config,
116 cpl_frameset* ref_set)
118 flat_config * cfg =NULL;
119 cpl_imagelist* list_object=NULL;
120 cpl_imagelist* list_dither_object=NULL ;
121 cpl_imagelist* list_sky=NULL ;
122 cpl_imagelist* list_dither_sky=NULL;
123 cpl_image ** im=NULL ;
124 cpl_image * norm_dith =NULL;
125 cpl_image * im_obj =NULL;
126 cpl_image * int_im =NULL;
127 cpl_image * int_im_dith =NULL;
128 cpl_image * im_sky =NULL;
129 cpl_image * im_dither =NULL;
130 cpl_image * im_obj_sub =NULL;
131 cpl_image * im_dither_sub =NULL;
132 cpl_image * im_dither_sky =NULL;
133 cpl_image ** imMed=NULL ;
134 cpl_image * colImage =NULL;
135 cpl_image * mask_im =NULL;
136 cpl_image * norm =NULL;
137 cpl_image * compImage =NULL;
138 cpl_image * maskImage =NULL;
139 cpl_image * threshIm =NULL;
141 char name[MAX_NAME_SIZE];
154 float** slit_edges=NULL;
155 float local_clean_mean =0.;
156 float clean_stdev =0.;
157 float mean_factor =0.;
161 char outNameDither[MAX_NAME_SIZE];
162 char name_list[MAX_NAME_SIZE];
163 char tbl_slitpos_name[MAX_NAME_SIZE];
165 cpl_table* tbl_slitpos=NULL;
169 cpl_frameset* raw=NULL;
171 cpl_table* qclog_tbl=NULL;
188 cknull_nomsg(raw=cpl_frameset_new());
190 cknull(cfg = sinfo_parse_cpl_input_flat(config,sof,&raw),
191 "could not parse cpl input!");
193 if (cfg->interpolInd == 1) {
194 if(sinfo_is_fits_file(cfg->mask) != 1) {
198 if (sinfo_is_fits_file(cfg->slitposList) != 1) {
210 sinfo_msg(
"Takes clean mean of several images");
212 cknull(list_object = cpl_imagelist_new (),
"could not allocate memory");
214 if (cfg->contains_dither == 1) {
215 cknull(list_dither_object=cpl_imagelist_new(),
"could not allocate memory");
218 if (cfg->contains_sky == 1) {
219 cknull(list_sky=cpl_imagelist_new(),
"could not allocate memory");
222 if (cfg->contains_dither == 1 && cfg->nditheroff > 0) {
223 cknull(list_dither_sky=cpl_imagelist_new(),
"could not allocate memory");
226 if (cfg->contains_dither == 0 && cfg->nditheroff > 0){
233 im = (cpl_image**) cpl_calloc (cfg -> nframes,
sizeof(cpl_image*));
235 for (i=0; i< cfg->nframes; i++) {
236 strcpy(name,cfg->framelist[i]);
237 if(sinfo_is_fits_file(name) != 1) {
241 im[i]=cpl_image_load(name,CPL_TYPE_FLOAT,0,0);
245 for (i=0; i< cfg->nframes; i++) {
246 typ = cfg->frametype[i];
247 pos = cfg->frameposition[i];
248 cknull(im[i],
"could not load image %d",i);
251 cpl_imagelist_set( list_object, cpl_image_duplicate(im[i]), nob );
254 cpl_imagelist_set( list_sky, cpl_image_duplicate(im[i]), nsky );
259 cpl_imagelist_set(list_dither_object,
260 cpl_image_duplicate(im[i]), nobjdith );
261 nobjdith = nobjdith + 1;
263 cpl_imagelist_set( list_dither_sky,
264 cpl_image_duplicate(im[i]), nskydith );
265 nskydith = nskydith + 1 ;
271 if (nob != cfg->nobj || cfg->noff != nsky ||
272 nobjdith != cfg->nditherobj || nskydith != cfg->nditheroff) {
274 "the different types of frames");
279 sinfo_msg(
"Creates and fills cubes with the different image lists");
280 cknull(list_object,
"could not create data cube!");
282 if (cfg->contains_dither == 1) {
283 cknull(list_dither_object,
"could not create data cube!");
285 if (cfg->contains_sky == 1 && nsky > 0) {
286 cknull(list_sky,
"could not create data cube!");
289 if (cfg->contains_dither == 1 && nskydith > 0) {
290 cknull(list_dither_sky,
"could not create data cube!");
295 sinfo_msg(
"Takes the average of the different cubes");
296 if (cfg->loReject*cfg->nobj < 1. && cfg->hiReject *cfg->nobj < 1.) {
297 cknull(im_obj = sinfo_new_average_cube_to_image(list_object ),
298 "sinfo_averageCubeToImage failed" );
301 no=cpl_imagelist_get_size(list_object);
302 lo_cut=(floor)(cfg->loReject*no+0.5);
303 hi_cut=(floor)(cfg->hiReject*no+0.5);
304 cknull(im_obj=cpl_imagelist_collapse_minmax_create(list_object,
307 "sinfo_average_with_rejection failed" );
309 sinfo_free_imagelist(&list_object);
311 if (cfg->contains_sky == 1) {
312 if (cfg->loReject * nsky < 1. && cfg->hiReject * nsky < 1.) {
313 cknull(im_sky = sinfo_new_average_cube_to_image(list_sky ),
314 "sinfo_new_average_cube_to_image failed" );
317 no=cpl_imagelist_get_size(list_sky);
318 lo_cut=(floor)(cfg->loReject*no+0.5);
319 hi_cut=(floor)(cfg->hiReject*no+0.5);
320 cknull(im_sky=cpl_imagelist_collapse_minmax_create(list_sky,lo_cut,hi_cut),
321 "sinfo_average_with_rejection failed" );
323 sinfo_free_imagelist(&list_sky);
326 if (cfg->contains_dither == 1) {
327 if (cfg->loReject*nobjdith < 1. && cfg->hiReject * nobjdith < 1.) {
328 cknull(im_dither = sinfo_new_average_cube_to_image(list_dither_object ),
329 "sinfo_new_average_cube_to_image failed" );
333 no=cpl_imagelist_get_size(list_dither_object);
334 lo_cut=(floor)(cfg->loReject*no+0.5);
335 hi_cut=(floor)(cfg->hiReject*no+0.5);
336 cknull(im_dither=cpl_imagelist_collapse_minmax_create(list_dither_object,
338 "sinfo_average_with_rejection failed" );
340 sinfo_free_imagelist(&list_dither_object);
343 if (cfg->contains_dither == 1 && nskydith > 0 ) {
344 if (cfg->loReject*nskydith < 1. && cfg->hiReject*nskydith < 1.) {
345 cknull(im_dither_sky = sinfo_new_average_cube_to_image(list_dither_sky ),
346 "sinfo_new_average_cube_to_image failed" );
348 no=cpl_imagelist_get_size(list_dither_sky);
349 lo_cut=(floor)(cfg->loReject*no+0.5);
350 hi_cut=(floor)(cfg->hiReject*no+0.5);
351 cknull(im_dither_sky=cpl_imagelist_collapse_minmax_create(list_dither_sky,
353 "new_average_with_rejection failed" );
355 sinfo_free_imagelist(&list_dither_sky);
366 sinfo_msg(
"Subtracts the resulting off-frame (sky) from the on-frame");
367 if (cfg->contains_sky == 1) {
368 cknull(im_obj_sub = cpl_image_subtract_create(im_obj, im_sky),
369 "could not sinfo_sub_image");
370 sinfo_free_image(&im_obj);
371 if (((cfg->contains_dither == 1) && (nskydith > 0)) ||
372 (cfg->contains_dither == 0)) {
373 sinfo_free_image(&im_sky);
378 if (cfg->contains_dither == 1 && nskydith > 0) {
379 cknull(im_dither_sub=cpl_image_subtract_create(im_dither, im_dither_sky),
380 "could not sinfo_sub_image");
381 sinfo_free_image(&im_dither);
382 sinfo_free_image(&im_dither_sky);
383 im_dither = im_dither_sub;
384 }
else if (cfg->contains_dither == 1 &&
386 cfg->contains_sky == 1) {
387 cknull(im_dither_sub = cpl_image_subtract_create(im_dither, im_sky),
388 "could not sinfo_sub_image");
389 sinfo_free_image(&im_dither);
390 sinfo_free_image(&im_sky);
391 im_dither = im_dither_sub;
401 sinfo_msg(
"Generating a static bad pixel mask");
402 n_im_med = cfg->iterations+1;
404 imMed=(cpl_image**) cpl_calloc(n_im_med,
sizeof(cpl_image*));
406 if (cfg->badInd == 1) {
407 sinfo_msg(
"removes the intensity tilt from every column and");
408 sinfo_msg(
"computes the standard deviation on a rectangular zone");
411 cknull(colImage = sinfo_new_col_tilt( im_obj, cfg->sigmaFactor ),
412 "sinfo_colTilt failed" );
414 cknull(stats = sinfo_new_image_stats_on_rectangle(colImage,
421 "sinfo_get_image_stats_on_vig failed\n");
423 local_clean_mean = stats->cleanmean;
424 clean_stdev = stats->cleanstdev;
428 if (cfg->threshInd == 1) {
429 cknull(threshIm = sinfo_new_thresh_image(colImage,
430 local_clean_mean-mean_factor*clean_stdev,
431 local_clean_mean+mean_factor*clean_stdev),
432 " sinfo_threshImage failed\n" );
434 if (cfg->threshInd == 0) {
444 cknull(imMed[0]= sinfo_new_median_image(threshIm,-cfg->factor*clean_stdev),
445 " sinfo_medianImage failed" );
450 for (i=1; i< cfg->iterations+1; i++) {
451 cknull(imMed[i]=sinfo_new_median_image(imMed[i-1],
452 -cfg->factor*clean_stdev),
453 "sinfo_medianImage failed" );
457 cknull(compImage=sinfo_new_compare_images(threshIm,
458 imMed[cfg->iterations],
460 "sinfo_compareImages failed" );
463 n = (
int*)cpl_calloc(1,
sizeof(
int));
464 cknull(maskImage = sinfo_new_promote_image_to_mask( compImage, n ),
465 "error in sinfo_promoteImageToMask" );
469 sinfo_msg(
"No of bad pixels: %d", n_badpixels);
471 cknull_nomsg(qclog_tbl = sinfo_qclog_init());
472 ck0_nomsg(sinfo_qclog_add_int(qclog_tbl,
"QC BP-MAP NBADPIX",n_badpixels,
473 "No of bad pixels",
"%d"));
475 ck0(sinfo_pro_save_ima(maskImage,ref_set,sof,cfg->maskname,
476 PRO_BP_MAP,qclog_tbl,plugin_id,config),
477 "cannot save ima %s", cfg->maskname);
481 sinfo_free_table(&qclog_tbl);
483 sinfo_new_del_Stats(stats);
485 sinfo_free_image(&threshIm);
486 if (cfg->threshInd == 1) {
487 sinfo_free_image(&colImage);
489 sinfo_free_image(&compImage);
490 sinfo_free_image(&maskImage);
492 for (i=0; i< cfg->iterations+1; i++) {
493 sinfo_free_image(&imMed[i]);
507 sinfo_msg(
"Creates a Master flat field");
508 if (cfg->interpolInd == 1) {
509 cknull(mask_im = cpl_image_load(cfg->mask,CPL_TYPE_FLOAT,0,0),
510 "could not load static bad pixel mask" );
515 slit_edges = (
float **) cpl_calloc( 32,
sizeof (
float*) ) ;
516 for ( i = 0 ; i < 32 ; i++ )
518 slit_edges[i] = (
float *) cpl_calloc( 2,
sizeof (
float)) ;
521 if(sinfo_is_fits_file(cfg->slitposList) !=1 ) {
525 strcpy(tbl_slitpos_name,cfg->slitposList);
526 check(tbl_slitpos = cpl_table_load(tbl_slitpos_name,1,0),
527 "error loading tbl %s",tbl_slitpos_name);
529 for (i =0 ; i< 32; i++){
530 val_x=cpl_table_get_double(tbl_slitpos,
"pos1",i,status);
531 val_y=cpl_table_get_double(tbl_slitpos,
"pos2",i,status);
532 slit_edges[i][0]=val_x;
533 slit_edges[i][1]=val_y;
535 sinfo_free_table(&tbl_slitpos);
537 cknull(int_im = sinfo_interpol_source_image (im_obj, mask_im,
538 cfg->maxRad, slit_edges),
539 "could not carry out sinfo_interpolSourceImage" );
541 sinfo_free_image(&im_obj);
542 cknull(norm = sinfo_new_normalize_to_central_pixel(int_im),
543 "could not normalize flatfield" );
544 sinfo_free_image(&int_im);
547 if (cfg->contains_dither == 1) {
548 cknull(int_im_dith = sinfo_interpol_source_image(im_dither,
552 "could not carry out sinfo_interpolSourceImage" );
554 cpl_image_delete(im_dither);
555 cknull(norm_dith = sinfo_new_normalize_to_central_pixel(int_im_dith),
556 "could not normalize flatfield" );
557 sinfo_free_image(&int_im_dith);
558 im_dither = norm_dith;
561 for ( i = 0 ; i < 32 ; i++ )
563 cpl_free( slit_edges[i] );
565 cpl_free( slit_edges ) ;
566 sinfo_free_image(&mask_im);
570 if (cfg->interpolInd != 1) {
571 cknull(norm = sinfo_new_normalize_to_central_pixel(im_obj),
572 "could not normalize flatfield" );
573 sinfo_free_image(&im_obj);
576 if (cfg->contains_dither == 1) {
577 cknull(norm_dith = sinfo_new_normalize_to_central_pixel(im_dither),
578 "could not normalize flatfield" );
579 sinfo_free_image(&im_dither);
580 im_dither = norm_dith;
584 naxis1=cpl_image_get_size_x(im_obj);
585 naxis2=cpl_image_get_size_y(im_obj);
588 if(cfg->qc_fpn_xmin1 < 1) {
593 if(cfg->qc_fpn_xmax1 > naxis1) {
598 if(cfg->qc_fpn_ymin1 < 1) {
603 if(cfg->qc_fpn_ymax1 > naxis2) {
607 fpn_stdev1 = cpl_image_get_stdev_window(im_obj,
614 if(cfg->qc_fpn_xmin2 < 1) {
620 if(cfg->qc_fpn_xmax2 > naxis1) {
625 if(cfg->qc_fpn_ymin2 < 1) {
630 if(cfg->qc_fpn_ymax2 > naxis2) {
634 fpn_stdev2 = cpl_image_get_stdev_window(im_obj,
642 ck0(new_lamp_flats_det_ncounts(raw,cfg),
"error computing number of counts");
643 cknull_nomsg(qclog_tbl = sinfo_qclog_init());
644 ck0_nomsg(sinfo_qclog_add_double(qclog_tbl,
"QC SPECFLAT NCNTSAVG",
645 qc_lampflat.avg_di,
"Average counts",
"%g"));
646 ck0_nomsg(sinfo_qclog_add_double(qclog_tbl,
"QC SPECFLAT NCNTSSTD",
647 qc_lampflat.std_di,
"Stdev counts",
"%g"));
648 ck0_nomsg(sinfo_qclog_add_double(qclog_tbl,
"QC SPECFLAT OFFFLUX",
650 "Average flux off frames",
"%g"));
652 ck0_nomsg(sinfo_qclog_add_double(qclog_tbl,
655 "Fixed Pattern Noise of combined frames",
658 ck0_nomsg(sinfo_qclog_add_double(qclog_tbl,
661 "Fixed Pattern Noise of combined frames",
664 ck0(sinfo_pro_save_ima(im_obj,ref_set,sof,cfg->outName,
665 PRO_MASTER_FLAT_LAMP,qclog_tbl,plugin_id,config),
666 "cannot save ima %s", cfg->outName);
668 sinfo_free_table(&qclog_tbl);
669 sinfo_free_image(&im_obj);
672 if (cfg->contains_dither == 1) {
674 if (strstr(cfg->outName,
".fits" ) != NULL ) {
676 snprintf(name_list, MAX_NAME_SIZE-1,
"%s%s",
677 sinfo_new_get_rootname(cfg->outName),
679 strcpy(outNameDither,name_list);
680 strcat(outNameDither,strstr(cfg->outName,
".fits"));
683 strcpy(outNameDither,cfg->outName);
684 strcat(outNameDither,
"_dither");
688 naxis1=cpl_image_get_size_x(im_dither);
689 naxis2=cpl_image_get_size_y(im_dither);
692 if(cfg->qc_fpn_xmin1 < 1) {
697 if(cfg->qc_fpn_xmax1 > naxis1) {
702 if(cfg->qc_fpn_ymin1 < 1) {
707 if(cfg->qc_fpn_ymax1 > naxis2) {
713 fpn_stdev1 = cpl_image_get_stdev_window(im_dither,
719 if(cfg->qc_fpn_xmin2 < 1) {
724 if(cfg->qc_fpn_xmax2 > naxis1) {
729 if(cfg->qc_fpn_ymin2 < 1) {
734 if(cfg->qc_fpn_ymax2 > naxis2) {
739 fpn_stdev2 = cpl_image_get_stdev_window(im_dither,
746 ck0(new_lamp_flats_det_ncounts(raw,cfg),
"error computing ncounts");
747 cknull_nomsg(qclog_tbl = sinfo_qclog_init());
748 ck0_nomsg(sinfo_qclog_add_double(qclog_tbl,
"QC SPECFLAT NCNTSAVG",
749 qc_lampflat.avg_di,
"Average counts",
"%g"));
751 ck0_nomsg(sinfo_qclog_add_double(qclog_tbl,
"QC SPECFLAT NCNTSSTD",
752 qc_lampflat.std_di,
"Stdev counts",
"%g"));
754 ck0_nomsg(sinfo_qclog_add_double(qclog_tbl,
"QC SPECFLAT OFFFLUX",
755 qc_lampflat.avg_of,
"Average flux off frames",
"%g"));
757 ck0_nomsg(sinfo_qclog_add_double(qclog_tbl,
"QC LFLAT FPN1",fpn_stdev1,
758 "Fixed Pattern Noise of combined frames",
"%f"));
760 ck0_nomsg(sinfo_qclog_add_double(qclog_tbl,
"QC LFLAT FPN2",fpn_stdev2,
761 "Fixed Pattern Noise of combined frames",
"%f"));
764 ck0(sinfo_pro_save_ima(im_dither,ref_set,sof,outNameDither,
765 PRO_MASTER_FLAT_LAMP,qclog_tbl,plugin_id,config),
766 "cannot save ima %s", outNameDither);
768 sinfo_free_table(&qclog_tbl);
769 sinfo_free_image(&im_dither);
775 sinfo_free_image_array(&im,cfg->nframes);
776 sinfo_free_frameset(&raw);
777 sinfo_flat_free(&cfg);
784 if(slit_edges != NULL) {
785 for ( i = 0 ; i < 32 ; i++ )
787 if(slit_edges[i] != NULL) {
788 cpl_free( slit_edges[i] );
792 cpl_free( slit_edges ) ;
794 sinfo_free_image(&mask_im);
795 sinfo_free_table(&qclog_tbl);
797 sinfo_new_del_Stats(stats);
800 sinfo_free_image(&threshIm);
801 sinfo_free_image(&maskImage);
802 if(imMed != NULL) sinfo_free_image_array(&imMed,cfg->iterations);
804 sinfo_new_del_Stats(stats);
807 sinfo_free_image(&compImage);
808 sinfo_free_image(&colImage);
809 sinfo_free_imagelist(&list_dither_object);
810 sinfo_free_imagelist(&list_dither_sky);
811 if(list_sky != NULL) {
812 sinfo_free_imagelist(&list_sky);
814 sinfo_free_imagelist(&list_object);
815 sinfo_free_image(&im_dither);
816 sinfo_free_image(&im_dither_sky);
817 sinfo_free_image(&im_obj);
818 sinfo_free_image(&im_sky);
819 if(im != NULL) sinfo_free_image_array(&im,cfg->nframes);
820 sinfo_free_frameset(&raw);
822 sinfo_flat_free(&cfg);
829 new_lamp_flats_det_ncounts(cpl_frameset* raw, flat_config* cfg)
842 char filename[MAX_NAME_SIZE];
845 cpl_frame* frm_dup=NULL;
846 cpl_frame* on_frm=NULL;
847 cpl_frame* of_frm=NULL;
848 cpl_frame* tmp_of_frm=NULL;
851 cpl_frameset* on_set=NULL;
852 cpl_frameset* of_set=NULL;
853 cpl_frameset* wrk_set=NULL;
855 on_set=cpl_frameset_new();
856 of_set=cpl_frameset_new();
858 nraw = cpl_frameset_get_size(raw);
860 for (i=0; i< nraw; i++) {
861 frm = cpl_frameset_get_frame(raw,i);
862 frm_dup = cpl_frame_duplicate(frm);
863 if(sinfo_frame_is_on(frm) == 1) {
864 cpl_frameset_insert(on_set,frm_dup);
867 cpl_frameset_insert(of_set,frm_dup);
874 new_qc_get_cnt(on_set,of_set,cfg);
876 }
else if (non == 0) {
877 sinfo_msg(
"non == 0");
880 }
else if ( noff == 0 ) {
881 sinfo_msg(
"noff == 0");
888 for (i=0;i<non;i++) {
889 wrk_set=cpl_frameset_new();
890 on_frm=cpl_frameset_get_frame(on_set,i);
891 mjd_on=sinfo_get_mjd_obs(on_frm);
892 of_frm=cpl_frameset_get_frame(of_set,0);
893 mjd_of=sinfo_get_mjd_obs(of_frm);
894 strcpy(filename,cpl_frame_get_filename(of_frm));
895 for (j=1;j<noff;j++) {
896 tmp_of_frm = cpl_frameset_get_frame(of_set,j);
897 mjd_of_frm = sinfo_get_mjd_obs(tmp_of_frm);
899 if(1000.*(mjd_of_frm-mjd_on)*(mjd_of_frm-mjd_on) <
900 1000.*(mjd_of- mjd_on)*(mjd_of- mjd_on) ) {
902 of_frm=cpl_frame_duplicate(tmp_of_frm);
905 strcpy(filename,cpl_frame_get_filename(of_frm));
906 frm_dup=cpl_frame_duplicate(of_frm);
907 cpl_frameset_insert(wrk_set,frm_dup);
908 strcpy(filename,cpl_frame_get_filename(of_frm));
911 new_qc_get_cnt(on_set,wrk_set,cfg);
915 cpl_frameset_delete(wrk_set);
916 cpl_frameset_delete(on_set);
917 cpl_frameset_delete(of_set);
924 new_qc_get_cnt(cpl_frameset* on_set, cpl_frameset* of_set, flat_config* cfg)
933 char name[MAX_NAME_SIZE];
934 cpl_vector* vec_on=NULL;
935 cpl_vector* vec_of=NULL;
936 cpl_vector* vec_di=NULL;
937 cpl_vector* vec_nsat=NULL;
938 cpl_frame* on_frm=NULL;
939 cpl_frame* of_frm=NULL;
941 cpl_image* dif_ima=NULL;
942 cpl_image* on_ima=NULL;
943 cpl_image* of_ima=NULL;
944 cpl_image* tmp_ima=NULL;
947 non = cpl_frameset_get_size(on_set);
948 nof = cpl_frameset_get_size(of_set);
949 nfr = (non <= nof) ? non : nof;
950 vec_on = cpl_vector_new(nfr);
951 vec_of = cpl_vector_new(nfr);
952 vec_di = cpl_vector_new(nfr);
953 vec_nsat = cpl_vector_new(nfr);
956 for (i=0; i< nfr; i++) {
957 on_frm = cpl_frameset_get_frame(on_set,i);
958 strcpy(name,cpl_frame_get_filename(on_frm));
959 on_ima = cpl_image_load(name,CPL_TYPE_FLOAT,0,0);
960 med= cpl_image_get_median(on_ima);
961 cpl_vector_set(vec_on,i,med);
963 tmp_ima = cpl_image_duplicate(on_ima);
964 cpl_image_threshold(tmp_ima,SINFO_DBL_MIN,
965 cfg->qc_thresh_max,0,1);
966 nsat=cpl_image_get_flux(tmp_ima);
967 cpl_vector_set(vec_nsat,i,nsat);
970 of_frm = cpl_frameset_get_frame(of_set,i);
971 strcpy(name,cpl_frame_get_filename(of_frm));
972 of_ima = cpl_image_load(name,CPL_TYPE_FLOAT,0,0);
973 med= cpl_image_get_median(of_ima);
974 cpl_vector_set(vec_of,i,med);
975 dif_ima = cpl_image_subtract_create(on_ima,of_ima);
976 med= cpl_image_get_median(dif_ima);
977 cpl_vector_set(vec_di,i,med);
979 cpl_image_delete(on_ima);
980 cpl_image_delete(of_ima);
981 cpl_image_delete(dif_ima);
982 cpl_image_delete(tmp_ima);
984 qc_lampflat.avg_on=cpl_vector_get_mean(vec_on);
985 qc_lampflat.avg_of=cpl_vector_get_mean(vec_of);
986 qc_lampflat.avg_di=cpl_vector_get_mean(vec_di);
988 qc_lampflat.std_on=cpl_vector_get_stdev(vec_on);
989 qc_lampflat.std_of=cpl_vector_get_stdev(vec_of);
990 qc_lampflat.std_di=cpl_vector_get_stdev(vec_di);
992 qc_lampflat.nsat=cpl_vector_get_mean(vec_nsat);
993 cpl_vector_delete(vec_on);
994 cpl_vector_delete(vec_of);
995 cpl_vector_delete(vec_di);
996 cpl_vector_delete(vec_nsat);