40 #include "sinfo_new_prepare_stacked_frames.h"
41 #include "sinfo_stack_ini_by_cpl.h"
42 #include "sinfo_coltilt.h"
43 #include "sinfo_image_ops.h"
44 #include "sinfo_merge.h"
45 #include "sinfo_utilities.h"
46 #include "sinfo_wave_calibration.h"
47 #include "sinfo_new_bezier.h"
48 #include "sinfo_shift_images.h"
49 #include "sinfo_product_config.h"
51 #include "sinfo_pro_save.h"
52 #include "sinfo_globals.h"
53 #include "sinfo_utilities.h"
54 #include "sinfo_dfs.h"
55 #include "sinfo_raw_types.h"
56 #include "sinfo_wcal_functions.h"
57 #include "sinfo_new_bezier.h"
59 #include "sinfo_hidden.h"
60 #include "sinfo_pro_types.h"
61 #include "sinfo_functions.h"
62 #include "sinfo_utils_wrappers.h"
63 #include "sinfo_error.h"
94 new_get_names(
const char* pcatg,
const int ind, stack_config_n ** cfg);
97 new_get_names(
const char* pcatg,
const int ind, stack_config_n ** cfg){
99 if (strcmp(pcatg,PRO_FIBRE_NS_STACKED_OFF) == 0) {
100 strcpy((*cfg)->outName,DISTORTION_STACK_OFF_OUT_FILENAME);
102 if (strcmp(pcatg,PRO_FIBRE_NS_STACKED_ON) == 0) {
103 strcpy((*cfg)->outName,
"out_ns_stack_on.fits");
105 if (strcmp(pcatg,PRO_FIBRE_NS_STACKED) == 0) {
106 strcpy((*cfg)->outName,
"out_ns_stack.fits");
108 if (strcmp(pcatg,PRO_WAVE_LAMP_STACKED) == 0) {
109 strcpy((*cfg)->outName,
"out_wcal_stack.fits");
111 if (strcmp(pcatg,PRO_FIBRE_NS_STACKED_DIST)== 0) {
112 strcpy((*cfg)->outName,
"out_ns_stack_warp.fits");
114 if (strcmp(pcatg,PRO_WAVE_SLITPOS_STACKED) == 0) {
115 strcpy((*cfg)->outName,
"out_slit_pos_stack.fits");
118 if (strcmp(pcatg,PRO_PSF_CALIBRATOR_STACKED)== 0) {
119 snprintf((*cfg)->outName,MAX_NAME_SIZE-1,
"%s%d%s",
"out_stack",ind,
".fits");
121 if (strcmp(pcatg,PRO_SKY_PSF_CALIBRATOR_STACKED)== 0) {
122 strcpy((*cfg)->outName,STACKED_OUT_FILENAME);
124 if (strcmp(pcatg,PRO_STD_NODDING_STACKED) == 0) {
125 snprintf((*cfg)->outName,MAX_NAME_SIZE-1,
"%s%d%s",
"out_stack",ind,
".fits");
133 if (strcmp(pcatg,PRO_SKY_NODDING_STACKED) == 0) {
134 strcpy((*cfg)->outName,STACKED_OUT_FILENAME);
136 if (strcmp(pcatg,PRO_OBJECT_NODDING_STACKED) == 0) {
137 snprintf((*cfg)->outName,MAX_NAME_SIZE-1,
"%s%d%s",
"out_stack",ind,
".fits");
139 if (strcmp(pcatg,PRO_PUPIL_LAMP_STACKED) == 0) {
140 snprintf((*cfg)->outName,MAX_NAME_SIZE-1,
"%s%d%s",
"out_stack",ind,
".fits");
142 if (strcmp(pcatg,PRO_STACKED) == 0) {
143 snprintf((*cfg)->outName,MAX_NAME_SIZE-1,
"%s%d%s",
"out_stack",ind,
".fits");
146 snprintf((*cfg)->sky_name,MAX_NAME_SIZE-1,
"%s%d%s",
"out_sky",ind,
".fits");
153 int sinfo_new_prepare_stacked_frames (
const char* plugin_id,
154 cpl_parameterlist* config,
156 cpl_frameset* ref_set,
157 const char* frm_pro_ctg,
163 stack_config_n * cfg =NULL;
164 cpl_imagelist * list_object=NULL ;
165 cpl_imagelist * list_dither_object=NULL;
166 cpl_imagelist * list_dither_sky=NULL;
167 cpl_imagelist * list_sky=NULL;
168 cpl_imagelist * list_dark=NULL;
169 new_Lookup* lookup=NULL;
170 cpl_image * im3=NULL ;
171 cpl_image * im4=NULL ;
172 cpl_image * im5=NULL ;
173 cpl_image * im6=NULL ;
174 cpl_image * im7=NULL ;
175 cpl_image * im8=NULL ;
176 cpl_image * im9=NULL ;
178 cpl_image * ref_im1=NULL ;
179 cpl_image * ref_im2=NULL ;
180 cpl_image ** im=NULL ;
181 cpl_image * im_obj=NULL ;
182 cpl_image* simg=NULL;
184 cpl_image * im_dark=NULL ;
185 cpl_image * im_sky=NULL ;
186 cpl_image * im_dither=NULL ;
187 cpl_image * im_dither_sky=NULL ;
188 cpl_image * im_obj_sub=NULL ;
189 cpl_image * im_obj_flat=NULL ;
190 cpl_image * im_dither_sub=NULL ;
191 cpl_image * im_dither_flat=NULL ;
192 cpl_image * int_im_shifted=NULL ;
193 cpl_image * int_im_dith_shifted=NULL ;
194 cpl_image * im_conv=NULL ;
197 cpl_image * mask_im=NULL ;
198 cpl_image * flat_smooth=NULL ;
199 cpl_image * flat1=NULL ;
200 cpl_image * flat2=NULL ;
201 cpl_image * int_im=NULL ;
202 cpl_image * int_im_dith=NULL ;
203 cpl_image * sky_img_flat=NULL;
204 cpl_image * sky_dist=NULL;
207 cpl_imagelist * iCube=NULL ;
208 cpl_imagelist * jCube=NULL ;
210 cpl_image * hX=NULL ;
213 cpl_table * qclog_tbl=NULL;
214 cpl_image* sky_img=NULL;
215 cpl_image* mdark=NULL;
227 float** slit_edges=NULL;
235 char name_list[MAX_NAME_SIZE];
236 char fake_sky_name[MAX_NAME_SIZE];
241 cpl_imagelist* list_object_tmp=NULL;
242 cpl_imagelist* list_dither_object_tmp=NULL;
243 cpl_imagelist* list_sky_tmp=NULL;
244 cpl_imagelist* list_dither_sky_tmp=NULL;
246 cpl_image* flat1_dist=NULL;
247 cpl_image* flat2_dist=NULL;
249 cpl_frameset* raw=NULL;
251 char file_name[MAX_NAME_SIZE];
252 cpl_table* tbl_index = NULL;
253 cpl_table* tbl_slitpos=NULL;
256 cpl_frame* sky_frame = NULL;
257 char* sky_name = NULL;
259 qc_wcal* qc=sinfo_qc_wcal_new();
261 cpl_parameter* p=NULL;
263 int mflat_norm_smooth=FALSE;
276 check_nomsg(p=cpl_parameterlist_find(config,
"sinfoni.product.density"));
277 check_nomsg(pdensity=cpl_parameter_get_int(p));
281 check_nomsg(p=cpl_parameterlist_find(config,
282 "sinfoni.stacked.mflat_norm_smooth"));
283 check_nomsg(mflat_norm_smooth=cpl_parameter_get_int(p));
287 check_nomsg(p=cpl_parameterlist_find(config,
288 "sinfoni.stacked.mflat_smooth_rad"));
289 check_nomsg(smooth_rad=cpl_parameter_get_int(p));
291 check_nomsg(p=cpl_parameterlist_find(config,
"sinfoni.stacked.sub_raw_sky"));
292 check_nomsg(sub_raw_sky=cpl_parameter_get_bool(p));
295 check_nomsg(raw=cpl_frameset_new());
296 cknull(cfg = sinfo_parse_cpl_input_stack(config,sof,&raw, fk),
297 "could not parse cpl input file!") ;
299 ck0(sinfo_det_ncounts(raw, cfg->qc_thresh_max,qc),
"computing det ncounts");
302 if(ref_set != NULL) {
303 sinfo_free_frameset(&raw);
304 raw=cpl_frameset_duplicate(ref_set);
307 ck0_nomsg(new_get_names(frm_pro_ctg, frm_ind, &cfg));
309 if (cfg->flatInd == 1){
310 if(sinfo_is_fits_file(cfg->flatfield1) != 1) {
316 if (cfg->maskInd == 1) {
317 if(sinfo_is_fits_file(cfg->mask) != 1) {
321 if(cfg -> indind == 0) {
322 if(sinfo_is_fits_file(cfg->slitposList) != 1) {
336 if (cfg->sfInd == 1){
337 if (cfg->contains_dark == 0) {
340 if (cfg->contains_ref == 0) {
347 check(list_object=cpl_imagelist_new(),
348 "could not allocate memory for object frame");
350 if (cfg->contains_dither == 1) {
351 check(list_dither_object=cpl_imagelist_new(),
352 "could not allocate memory for dither object frame");
355 if (cfg->contains_sky == 1) {
356 check(list_sky = cpl_imagelist_new(),
357 "could not allocate memory for off frame list");
360 if (cfg->contains_dither == 1 && cfg->nditheroff > 0) {
361 check(list_dither_sky = cpl_imagelist_new(),
362 "could not allocate memory for dither frame list");
365 if (cfg->contains_dark == 1 && cfg->sfInd == 1) {
366 check(list_dark = cpl_imagelist_new(),
367 "could not allocate memory for sinfo_dark frame");
370 if (cfg->contains_dither == 0 && cfg->nditheroff > 0) {
376 cknull_nomsg(im=(cpl_image**)cpl_calloc(cfg -> nframes,
sizeof(cpl_image*)));
378 for (i=0; i< cfg->nframes; i++) {
379 name = cfg->framelist[i];
380 if(sinfo_is_fits_file(name) != 1) {
384 check_nomsg(im[i] = cpl_image_load( name,CPL_TYPE_FLOAT,0,0));
389 for (i=0; i< cfg->nframes; i++) {
390 typ = sinfo_new_intarray_get_value( cfg->frametype, i );
391 pos = sinfo_new_intarray_get_value( cfg->frameposition, i );
392 cknull(im[i],
"could not load image");
396 check_nomsg(cpl_imagelist_set(list_object,
397 cpl_image_duplicate(im[i]),nob));
400 else if ( typ == 0 ) {
401 check_nomsg(cpl_imagelist_set(list_sky,
402 cpl_image_duplicate(im[i]),nsky));
405 if(fk->is_fake_sky==1) {
406 snprintf(fake_sky_name,MAX_NAME_SIZE-1,
"%s%d%s",
"out_fake_sky",
408 check_nomsg(sky_img=cpl_image_load(fake_sky_name,CPL_TYPE_FLOAT,0,0));
409 ck0(sinfo_pro_save_ima(sky_img,raw,sof,fake_sky_name,
412 "cannot save sky ima %s", fake_sky_name);
414 sinfo_free_image(&sky_img);
419 if((pdensity == 3) || (pdensity == 1) ||
420 (pdensity == 2 && frm_ind == 0)) {
421 check_nomsg(sky_frame = cpl_frameset_get_frame(raw,i));
422 check_nomsg(sky_name = (
char*) cpl_frame_get_filename(sky_frame));
425 if ( (strstr(frm_pro_ctg,
"OBJECT") != NULL) ||
426 (strstr(frm_pro_ctg,
"PSF") != NULL) ||
427 (strstr(frm_pro_ctg,
"STD") != NULL) ) {
428 check_nomsg(sky_img = cpl_image_load(sky_name,CPL_TYPE_FLOAT,0,0));
429 snprintf(sky_name,MAX_NAME_SIZE-1,
"%s%2.2d%s",
"out_sky",
431 ck0(sinfo_pro_save_ima(sky_img,raw,sof,sky_name,
432 PRO_SKY_STACKED_DUMMY,NULL,
434 "cannot save sky ima %s", sky_name);
436 sinfo_free_image(&sky_img);
437 if (cfg->flatInd == 1) {
438 sinfo_msg(
"Sky Flatfielding");
439 check(flat1=cpl_image_load(cfg->flatfield1,CPL_TYPE_FLOAT,0,0 ),
440 "could not load flatfield image" );
442 if(mflat_norm_smooth != 0) {
444 if(mflat_norm_smooth == 1) {
446 sy=cpl_image_get_size_y(flat1);
448 cknull(flat_smooth=sinfo_image_smooth_fft(flat1,sy/smooth_rad),
449 "could not smooth flatfield" );
450 }
else if(mflat_norm_smooth == 2) {
451 cknull(flat_smooth = sinfo_image_smooth_median_y(flat1,
453 "could not smooth flatfield" );
456 check_nomsg(cpl_image_divide(flat1,flat_smooth));
457 sinfo_free_image(&flat_smooth);
461 check_nomsg(simg = cpl_image_load(sky_name,CPL_TYPE_FLOAT,0,0 ));
463 cknull(sky_img_flat=sinfo_new_div_images_robust(simg,flat1),
464 "could not carry out flatfield division" );
465 sinfo_free_image(&simg);
466 sinfo_free_image(&flat1);
469 if (cfg->warpfixInd == 1){
470 sinfo_msg(
"Correct sky for distortions");
471 snprintf(file_name,MAX_NAME_SIZE-1,
"%s%d%s",
472 STACK_SKY_DIST_OUT_FILENAME,frm_ind,
".fits");
473 sky_dist = sinfo_new_image_warp_fits(sky_img_flat,
477 ck0(sinfo_pro_save_ima(sky_dist,raw,sof,
479 PRO_STACK_SKY_DIST,NULL,plugin_id,
480 config),
"cannot save ima %s",
481 STACK_SKY_DIST_OUT_FILENAME);
483 sinfo_free_image(&sky_dist);
486 sinfo_free_image(&sky_img_flat);
490 }
else if ( typ == 5 ) {
491 if (cfg->sfInd == 1) {
492 check_nomsg(cpl_imagelist_set(list_dark,
493 cpl_image_duplicate(im[i]),nda));
496 sinfo_free_image(&(im[i]));
498 }
else if ( typ == 4 ) {
499 if ( cfg->sfInd == 1) {
502 sinfo_free_image(&(im[i]));
507 check_nomsg(cpl_imagelist_set(list_dither_object,
508 cpl_image_duplicate(im[i]),nobjdith));
509 nobjdith = nobjdith + 1;
510 }
else if (typ == 0) {
511 check_nomsg(cpl_imagelist_set(list_dither_object,
512 cpl_image_duplicate(im[i]),nskydith));
513 nskydith = nskydith + 1;
514 }
else if (typ == 4) {
515 if (cfg->sfInd == 1) {
516 ref_im2 = cpl_image_duplicate(im[i]);
518 sinfo_free_image(&(im[i]));
524 if (nob != cfg->nobj ||
526 nobjdith != cfg->nditherobj ||
527 nskydith != cfg->nditheroff) {
535 if (cfg->sfInd == 1 && nda != cfg->ndark) {
536 sinfo_msg_error(
"something is wrong with the number of sinfo_dark frames");
539 sinfo_msg(
"Create and fill cubes with the different images");
542 cknull(list_object,
"could not create object data cube!");
547 if (cfg->sfInd == 1) {
553 sinfo_msg(
"Shift cube images in spectral direction with "
554 "respect to reference");
556 if (cfg->contains_dark == 1) {
557 sinfo_msg(
"cfg->contains_dark == 1");
558 if (cfg->loReject*cfg->ndark < 1. && cfg->hiReject * cfg->ndark < 1.) {
562 check(im_dark = cpl_imagelist_collapse_create( list_dark ),
563 "sinfo_averageCubeToImage failed" );
567 check_nomsg(no=cpl_imagelist_get_size(list_dark));
568 lo_cut=(floor)( cfg->loReject*no+0.5);
569 hi_cut=(floor)( cfg->hiReject*no+0.5);
570 check(im_dark=cpl_imagelist_collapse_minmax_create(list_dark,lo_cut,
572 "sinfo_average_with_rejection failed" );
575 sinfo_free_imagelist(&list_dark);
576 check_nomsg(list_object_tmp = cpl_imagelist_duplicate (list_object));
577 check(cpl_imagelist_subtract_image (list_object_tmp, im_dark),
578 "cpl_imagelist_subtract_image failed" );
583 sinfo_msg(
"cfg->contains_dark == 0");
584 check_nomsg(list_object_tmp = cpl_imagelist_duplicate(list_object));
586 sinfo_free_imagelist(&list_object);
588 cknull(list_object = sinfo_align_cube_to_reference (list_object_tmp,
592 "sinfo_align_cube_to_reference failed" );
594 sinfo_free_imagelist(&list_object_tmp);
595 if (cfg->contains_dither == 1) {
596 if (cfg->contains_dark == 1) {
597 check_nomsg(list_dither_object_tmp =
598 cpl_imagelist_duplicate(list_dither_object));
599 check(cpl_imagelist_subtract_image(list_dither_object_tmp,im_dark),
600 "sinfo_average_with_rejection failed" );
609 check_nomsg(list_dither_object_tmp=
610 cpl_imagelist_duplicate(list_dither_object));
612 sinfo_free_imagelist(&list_dither_object);
614 cknull(list_dither_object=
615 sinfo_align_cube_to_reference (list_dither_object_tmp,
619 "sinfo_align_cube_to_reference failed" );
621 sinfo_free_imagelist(&list_dither_object_tmp);
623 if (cfg->contains_sky == 1) {
624 if (cfg->contains_dark == 1) {
625 check_nomsg(list_sky_tmp = cpl_imagelist_duplicate(list_sky));
626 check(cpl_imagelist_subtract_image (list_sky_tmp, im_dark),
627 "sinfo_average_with_rejection failed" );
633 check_nomsg(list_sky_tmp = cpl_imagelist_duplicate(list_sky));
635 check_nomsg(list_sky_tmp=cpl_imagelist_duplicate(list_sky));
637 check(list_sky = sinfo_align_cube_to_reference (list_sky_tmp,
641 "sinfo_alignCubeToReference failed" );
643 check_nomsg(cpl_imagelist_delete(list_sky_tmp));
645 if (cfg->contains_dither == 1 && cfg->contains_sky == 1) {
646 if (cfg->contains_dark == 1) {
647 check_nomsg(list_dither_sky_tmp=cpl_imagelist_duplicate(list_dither_sky));
648 check(cpl_imagelist_subtract_image(list_dither_sky_tmp,im_dark),
649 "sinfo_average_with_rejection failed" );
655 check_nomsg(list_dither_sky_tmp=cpl_imagelist_duplicate(list_dither_sky));
657 sinfo_free_imagelist(&list_dither_sky);
659 check(list_dither_sky=sinfo_align_cube_to_reference(list_dither_sky_tmp,
663 "sinfo_alignCubeToReference failed" );
665 sinfo_free_imagelist(&list_dither_sky_tmp);
667 sinfo_free_image(&ref_im1);
668 if (cfg->contains_dither == 1) {
669 sinfo_free_image(&ref_im2);
671 if (cfg->contains_dark == 1) {
672 sinfo_free_image(&im_dark);
678 if(cfg->mdark_ind==1){
679 sinfo_msg(
"Subtract master dark %s ",cfg->mdark);
681 check_nomsg(mdark=cpl_image_load(cfg->mdark,CPL_TYPE_FLOAT,0,0));
682 if (list_object !=NULL) {
683 cpl_imagelist_subtract_image (list_object, mdark);
685 if (list_sky !=NULL) {
686 cpl_imagelist_subtract_image (list_sky, mdark);
688 sinfo_free_image(&mdark);
691 sinfo_msg(
"Take the average of the different cubes");
693 if (cfg->loReject*cfg->nobj < 1. && cfg->hiReject * cfg->nobj < 1.) {
694 check(im_obj = cpl_imagelist_collapse_create(list_object),
695 "Average with rejection failed" );
698 check_nomsg(no=cpl_imagelist_get_size(list_object));
699 lo_cut=(floor)( cfg->loReject*no+0.5);
700 hi_cut=(floor)( cfg->hiReject*no+0.5);
701 check(im_obj=cpl_imagelist_collapse_minmax_create(list_object,
702 lo_cut,hi_cut),
"Average with rejection failed" );
705 sinfo_free_imagelist(&list_object);
707 if (cfg->contains_sky == 1) {
708 if (cfg->loReject*nsky < 1. && cfg->hiReject*nsky < 1.) {
710 cknull(im_sky = cpl_imagelist_collapse_create( list_sky ),
711 "Average with rejection failed");
714 check_nomsg(no=cpl_imagelist_get_size(list_sky));
715 lo_cut=(floor)( cfg->loReject*no+0.5);
716 hi_cut=(floor)( cfg->hiReject*no+0.5);
717 check(im_sky=cpl_imagelist_collapse_minmax_create(list_sky,lo_cut,hi_cut),
718 "Average with rejection failed");
720 sinfo_free_imagelist(&list_sky);
723 if (cfg->contains_dither == 1) {
724 if (cfg->loReject*nobjdith < 1. && cfg->hiReject*nobjdith < 1.) {
725 check(im_dither = cpl_imagelist_collapse_create( list_dither_object ),
726 "Average with rejection failed");
729 check_nomsg(no=cpl_imagelist_get_size(list_dither_object));
730 lo_cut=(floor)( cfg->loReject*no+0.5);
731 hi_cut=(floor)( cfg->hiReject*no+0.5);
732 check(im_dither=cpl_imagelist_collapse_minmax_create(list_dither_object,
734 "Average with rejection failed");
737 sinfo_free_imagelist(&list_dither_object);
740 if (cfg->contains_dither == 1 && nskydith > 0) {
741 if (cfg->loReject*nskydith < 1. && cfg->hiReject*nskydith < 1.) {
742 check(im_dither_sky = cpl_imagelist_collapse_create( list_dither_sky ),
743 "Average with rejection failed");
746 check_nomsg(no=cpl_imagelist_get_size(list_dither_sky));
747 lo_cut=(floor)( cfg->loReject*no+0.5);
748 hi_cut=(floor)( cfg->hiReject*no+0.5);
749 check(im_dither_sky=cpl_imagelist_collapse_minmax_create(list_dither_sky,
751 "Average with rejection failed");
753 sinfo_free_imagelist(&list_dither_sky);
764 if(sub_raw_sky == 1 ) {
765 if (cfg->contains_sky == 1) {
766 sinfo_msg(
"Subtract the off-frame (sky) from the on-frame");
767 check_nomsg(im_obj_sub = cpl_image_duplicate(im_obj));
768 check(cpl_image_subtract(im_obj_sub, im_sky),
769 "could not sinfo_sub_image");
771 sinfo_free_image(&im_obj);
772 if (((cfg->contains_dither == 1) && (nskydith > 0)) ||
773 cfg->contains_dither == 0) {
774 sinfo_free_image(&im_sky);
775 im_obj = cpl_image_duplicate(im_obj_sub);
779 if (cfg->contains_dither == 1 && nskydith > 0) {
780 check_nomsg(im_dither_sub = cpl_image_duplicate(im_dither));
781 check(cpl_image_subtract(im_dither_sub, im_dither_sky),
782 "could not sinfo_sub_image");
784 sinfo_free_image(&im_dither);
785 sinfo_free_image(&im_dither_sky);
786 im_dither = cpl_image_duplicate(im_dither_sub);
788 }
else if (cfg->contains_dither == 1 &&
790 cfg->contains_sky == 1) {
791 check_nomsg(im_dither_sub = cpl_image_duplicate(im_dither));
792 check(cpl_image_subtract(im_dither_sub, im_sky),
793 "could not sinfo_sub_image");
795 sinfo_free_image(&im_dither);
796 sinfo_free_image(&im_sky);
797 im_dither = cpl_image_duplicate(im_dither_sub);
807 if (cfg->flatInd == 1) {
808 sinfo_msg(
"Flatfielding");
809 check(flat1 = cpl_image_load (cfg->flatfield1,CPL_TYPE_FLOAT,0,0),
810 "could not load flatfield image" );
812 if(mflat_norm_smooth) {
815 cknull(flat_smooth = sinfo_image_smooth_median_y(flat1,smooth_rad),
816 "could not smooth flatfield" );
817 check_nomsg(cpl_image_divide(flat1,flat_smooth));
818 sinfo_free_image(&flat_smooth);
821 cknull(im_obj_flat = sinfo_new_div_images_robust( im_obj, flat1),
822 "could not carry out flatfield division" );
827 if (cfg->warpfixInd == 1){
828 sinfo_msg(
"Correct FF for distortions");
830 cknull_nomsg(flat1_dist=sinfo_new_image_warp_fits(flat1,cfg->kernel,
833 ck0(sinfo_pro_save_ima(flat1_dist,raw,sof,
834 STACK_MFLAT_DIST_OUT_FILENAME,
835 PRO_STACK_MFLAT_DIST,NULL,plugin_id,config),
836 "cannot save ima %s", STACK_MFLAT_DIST_OUT_FILENAME);
837 sinfo_free_image(&flat1_dist);
841 sinfo_free_image(&flat1);
842 sinfo_free_image(&im_obj);
843 im_obj = cpl_image_duplicate(im_obj_flat);
846 if (cfg->contains_dither == 1) {
847 check(flat2 = cpl_image_load (cfg->flatfield2,CPL_TYPE_FLOAT,0,0),
848 "could not load flatfield image" );
850 if(mflat_norm_smooth) {
853 cknull(flat_smooth = sinfo_image_smooth_median_y(flat2,smooth_rad),
854 "could not smooth flatfield" );
855 check_nomsg(cpl_image_divide(flat2,flat_smooth));
856 sinfo_free_image(&flat_smooth);
861 cknull(im_dither_flat = sinfo_new_div_images_robust( im_dither, flat2),
862 "could not carry out flatfield division" );
865 if (cfg->warpfixInd == 1) {
866 sinfo_msg(
"Correct FF for distortions");
867 flat2_dist = sinfo_new_image_warp_fits(flat2,
868 cfg->kernel, cfg->polyFile);
870 ck0(sinfo_pro_save_ima(flat2_dist,raw,sof,
871 STACK_MFLAT_DITHER_DIST_OUT_FILENAME,
872 PRO_STACK_MFLAT_DITHER_DIST,
873 NULL,plugin_id,config),
874 "cannot save ima %s", STACK_MFLAT_DITHER_DIST_OUT_FILENAME);
875 sinfo_free_image(&flat2_dist);
878 sinfo_free_image(&flat2);
879 sinfo_free_image(&im_dither);
880 im_dither = cpl_image_duplicate(im_dither_flat);
891 if (cfg->maskInd == 1) {
892 sinfo_msg(
"Static bad pixel correction");
893 check(mask_im = cpl_image_load(cfg->mask,CPL_TYPE_FLOAT,0,0),
894 "could not load static bad pixel mask" );
896 ck0(sinfo_new_change_mask(mask_im, im_obj),
897 "sinfo_changeMask failed" );
899 if (cfg->indind == 0) {
902 strcpy(file_name,cfg->slitposList);
903 check(tbl_slitpos = cpl_table_load(file_name,1,0),
904 "error loading slitpos tbl %s ",file_name);
905 if(cpl_table_has_column(tbl_slitpos,
"pos1") != 1) {
907 PRO_SLIT_POS,file_name);
910 if(cpl_table_has_column(tbl_slitpos,
"pos2") != 1) {
912 PRO_SLIT_POS,file_name);
916 check_nomsg(n = cpl_table_get_nrow(tbl_slitpos));
917 cknull_nomsg(slit_edges = sinfo_new_2Dfloatarray(n, 2));
918 for (i =0 ; i< n; i++){
919 check_nomsg(val_x=cpl_table_get_double(tbl_slitpos,
"pos1",i,&status));
920 check_nomsg(val_y=cpl_table_get_double(tbl_slitpos,
"pos2",i,&status));
921 check_nomsg(sinfo_new_array2D_set_value(slit_edges,val_x,i,0));
922 check_nomsg(sinfo_new_array2D_set_value(slit_edges,val_y,i,1));
925 sinfo_free_table(&tbl_slitpos);
926 cknull(int_im = sinfo_interpol_source_image (im_obj,
930 "could not carry out sinfo_interpolSourceImage" );
932 sinfo_free_image(&im_obj);
933 im_obj = cpl_image_duplicate(int_im);
935 if (cfg->contains_dither == 1) {
936 cknull(int_im_dith = sinfo_interpol_source_image (im_dither,
940 "could not carry out sinfo_interpolSourceImage" );
942 sinfo_free_image(&im_dither);
943 im_dither = cpl_image_duplicate(int_im_dith);
945 sinfo_new_destroy_2Dfloatarray(&slit_edges, 32);
947 cknull(int_im = sinfo_new_mult_image_by_mask(im_obj, mask_im),
948 "could not carry out sinfo_multImageByMask" );
950 sinfo_free_image(&im_obj);
951 im_obj = cpl_image_duplicate(int_im);
952 if (cfg->contains_dither == 1) {
953 cknull(int_im_dith=sinfo_new_mult_image_by_mask(im_dither, mask_im),
954 "could not carry out sinfo_multImageByMask" );
956 sinfo_free_image(&im_dither);
957 im_dither = cpl_image_duplicate(int_im_dith);
960 sinfo_free_image(&mask_im);
969 if (cfg->maskInd == 2){
970 sinfo_msg(
"Static bad pixel correction BEZIER");
971 check(mask_im = cpl_image_load(cfg->mask,CPL_TYPE_FLOAT,0,0),
972 "could not load static bad pixel mask" );
974 ck0(sinfo_new_change_mask(mask_im, im_obj),
975 "sinfo_changeMask failed" );
978 strcpy(file_name,cfg->slitposList);
979 check_nomsg(tbl_slitpos = cpl_table_load(file_name,1,0));
981 check_nomsg(n = cpl_table_get_nrow(tbl_slitpos));
982 slit_edges = sinfo_new_2Dfloatarray(n, 2);
984 for (i =0 ; i< n; i++){
985 val_x=cpl_table_get_double(tbl_slitpos,
"pos1",i,&status);
986 val_y=cpl_table_get_double(tbl_slitpos,
"pos2",i,&status);
987 sinfo_new_array2D_set_value(slit_edges,val_x,i,0);
988 sinfo_new_array2D_set_value(slit_edges,val_y,i,1);
990 sinfo_free_table(&tbl_slitpos);
992 strcpy(file_name,cfg->indexlist);
994 check_nomsg(tbl_index = cpl_table_load(file_name,1,0));
996 check_nomsg(n = cpl_table_get_nrow(tbl_index));
998 cknull_nomsg(in_nam = (
char**) cpl_calloc(n,
sizeof(
char*)));
1000 for (i =0 ; i< n; i++){
1001 strcpy(in_nam[i],cpl_table_get_string(tbl_index,
"name",i));
1003 sinfo_free_table(&tbl_index);
1005 for (i=0;i<cnt;i++) {
1006 if (strcmp(
"ICube.fits", name) != 0){
1007 check_nomsg(iCube=cpl_imagelist_load (
"ICube.fits",CPL_TYPE_FLOAT,0));
1009 else if (strcmp(
"JCube.fits", name) != 0) {
1010 check_nomsg(jCube = cpl_imagelist_load (
"JCube.fits",CPL_TYPE_FLOAT,0));
1012 else if (strcmp(
"X.fits", name) != 0) {
1013 check_nomsg(X=cpl_image_load(
"X.fits",CPL_TYPE_FLOAT,0,0));
1015 else if (strcmp(
"Y.fits", name) != 0) {
1016 check_nomsg(Y=cpl_image_load(
"Y.fits",CPL_TYPE_FLOAT,0,0));
1018 else if (strcmp(
"Z.fits", name) != 0) {
1019 check_nomsg(Z=cpl_image_load(
"Z.fits",CPL_TYPE_FLOAT,0,0));
1021 else if (strcmp(
"cX.fits", name) != 0) {
1022 check_nomsg(hX=cpl_image_load(
"cX.fits",CPL_TYPE_FLOAT,0,0));
1025 sinfo_msg_error(
"wrong name in index list or needed file not there!");
1029 lookup = sinfo_new_lookup();
1039 cknull(im_obj=sinfo_new_c_bezier_interpolate_image(im_obj,
1047 "could not carry out sinfo_new_c_bezier_interpolate_image" );
1050 cknull(im_obj=sinfo_new_c_bezier_find_bad( im_obj,
1056 cpl_image_get_size_x(im_obj),
1058 cpl_image_get_size_y(im_obj),
1060 "could not carry out sinfo_new_c_bezier_find_bad" );
1063 if (cfg->contains_dither == 1) {
1064 cknull(im_dither=sinfo_new_c_bezier_interpolate_image(im_dither,
1072 "could not carry out new_c_bezier_Interpolate_Image on dithered frame" );
1074 cknull(im_dither=sinfo_new_c_bezier_find_bad(im_dither,
1080 cpl_image_get_size_x(im_obj),
1082 cpl_image_get_size_y(im_obj),
1084 "could not carry out new_c_bezier_find_bad on dithered frame");
1087 sinfo_new_destroy_2Dfloatarray(&slit_edges, 32);
1088 sinfo_free_image(&mask_im);
1089 sinfo_free_imagelist(&iCube);
1090 sinfo_free_imagelist(&jCube);
1091 sinfo_free_image(&lookup->X);
1092 sinfo_free_image(&lookup->X);
1093 sinfo_free_image(&lookup->Y);
1094 sinfo_free_image(&lookup->hX);
1095 sinfo_new_destroy_lookup(lookup);
1098 if (cfg->maskInd == 3) {
1099 cknull(mask_im = cpl_image_load(cfg->mask,CPL_TYPE_FLOAT,0,0),
1100 "could not load static bad pixel mask" );
1103 strcpy(file_name,cfg->slitposList);
1104 check_nomsg(tbl_slitpos = cpl_table_load(file_name,1,0));
1105 if(cpl_table_has_column(tbl_slitpos,
"pos1") != 1) {
1107 PRO_SLIT_POS,file_name);
1111 if(cpl_table_has_column(tbl_slitpos,
"pos2") != 1) {
1113 PRO_SLIT_POS,file_name);
1117 check_nomsg(n = cpl_table_get_nrow(tbl_slitpos));
1118 slit_edges = sinfo_new_2Dfloatarray(n, 2);
1120 for (i =0 ; i< n; i++) {
1121 val_x=cpl_table_get_double(tbl_slitpos,
"pos1",i,&status);
1122 val_y=cpl_table_get_double(tbl_slitpos,
"pos2",i,&status);
1123 sinfo_new_array2D_set_value(slit_edges,val_x,i,0);
1124 sinfo_new_array2D_set_value(slit_edges,val_y,i,1);
1126 sinfo_free_table(&tbl_slitpos);
1128 strcpy(file_name,cfg->indexlist);
1129 check_nomsg(tbl_index = cpl_table_load(file_name,1,0));
1130 check_nomsg(n = cpl_table_get_nrow(tbl_index));
1131 cknull_nomsg(in_nam = (
char**) cpl_calloc(n,
sizeof(
char*)));
1133 for (i =0 ; i< n; i++){
1134 strcpy(in_nam[i],cpl_table_get_string(tbl_index,
"name",i));
1136 sinfo_free_table(&tbl_index);
1138 for (i=0;i<cnt;i++){
1139 if (strcmp(
"ICube.fits", in_nam[i]) != 0){
1140 check_nomsg(iCube=cpl_imagelist_load(
"ICube.fits",CPL_TYPE_FLOAT,0));
1142 else if (strcmp(
"JCube.fits", in_nam[i]) != 0){
1143 check_nomsg(jCube=cpl_imagelist_load(
"JCube.fits",CPL_TYPE_FLOAT,0));
1145 else if (strcmp(
"X.fits", in_nam[i]) != 0){
1146 check_nomsg(X=cpl_image_load(
"X.fits",CPL_TYPE_FLOAT,0,0));
1148 else if (strcmp(
"Y.fits", in_nam[i]) != 0){
1149 check_nomsg(Y=cpl_image_load(
"Y.fits",CPL_TYPE_FLOAT,0,0));
1151 else if (strcmp(
"Z.fits", in_nam[i]) != 0){
1152 check_nomsg(Z=cpl_image_load(
"Z.fits",CPL_TYPE_FLOAT,0,0));
1154 else if (strcmp(
"cX.fits", in_nam[i]) != 0) {
1155 check_nomsg(hX=cpl_image_load(
"cX.fits",CPL_TYPE_FLOAT,0,0));
1157 sinfo_msg_error(
"wrong name in index list or needed file not there!");
1161 lookup = sinfo_new_lookup();
1169 cknull(im_obj = sinfo_new_c_bezier_interpolate_image(im_obj,
1177 "could not carry out sinfo_new_c_bezier_interpolate_image" );
1179 if (cfg->contains_dither == 1) {
1180 cknull(im_dither=sinfo_new_c_bezier_interpolate_image( im_dither,
1188 "could not carry out sinfo_new_c_bezier_interpolate_image"
1189 " on dithered frame" );
1192 sinfo_new_destroy_2Dfloatarray(&slit_edges, 32);
1193 sinfo_free_image(&mask_im);
1194 sinfo_free_imagelist(&iCube);
1195 sinfo_free_imagelist(&jCube);
1196 sinfo_free_image(&lookup->X);
1197 sinfo_free_image(&lookup->Y);
1198 sinfo_free_image(&lookup->Z);
1199 sinfo_free_image(&lookup->hX);
1200 sinfo_new_destroy_lookup(lookup);
1212 if (cfg->warpfixInd == 1){
1214 sinfo_msg(
"Correct object for distortions");
1215 cknull(int_im_shifted=sinfo_new_image_warp_fits(im_obj,
1218 "could not carry out sinfo_image_warp_fits" );
1220 sinfo_free_image(&im_obj);
1221 im_obj = cpl_image_duplicate(int_im_shifted);
1222 if (cfg->contains_dither == 1){
1223 cknull(int_im_dith_shifted=sinfo_new_image_warp_fits(im_dither,
1226 "could not carry out sinfo_image_warp_fits" );
1227 sinfo_free_image(&im_dither);
1228 im_dither = cpl_image_duplicate(int_im_dith_shifted);
1237 if (cfg->interInd == 1 && cfg->contains_dither == 1){
1239 sinfo_msg(
"Merge (interleave) frames");
1240 cknull(im3 = cpl_image_new(cpl_image_get_size_x(im_obj),
1241 cpl_image_get_size_y(im_obj),CPL_TYPE_FLOAT),
1242 "could not allocate an image" );
1243 cknull(im4=sinfo_new_remove_general_offset( im_obj, im_dither,
1245 "sinfo_removeGeneralOffset failed" );
1247 cknull(im5 = sinfo_new_remove_regional_tilt ( im_obj, im4, im3 ),
1248 "sinfo_removeRegionalTilt failed" );
1250 cknull(im6 = sinfo_new_remove_column_offset ( im_obj, im5, im3 ),
1251 "sinfo_removeColumnOffset failed" );
1253 cknull(im7 = sinfo_new_remove_residual_tilt ( im6, im3 ),
1254 "sinfo_removeResidualTilt failed" );
1256 cknull(im8 = sinfo_new_remove_residual_offset ( im7, im3 ),
1257 "sinfo_removeResidualOffset failed");
1258 cknull(im9 = sinfo_sinfo_merge_images(im_obj, im8, im3),
1259 "sinfo_mergeImages failed" );
1261 ck0(sinfo_pro_save_ima(im9,raw,sof,cfg->outName,
1262 frm_pro_ctg,NULL,plugin_id,config),
1263 "cannot save ima %s", cfg->outName);
1265 sinfo_free_image(&im3);
1266 sinfo_free_image(&im4);
1267 sinfo_free_image(&im5);
1268 sinfo_free_image(&im6);
1269 sinfo_free_image(&im7);
1270 sinfo_free_image(&im8);
1271 sinfo_free_image(&im9);
1272 sinfo_free_image(&im_obj);
1273 sinfo_free_image(&im_dither);
1280 }
else if (cfg->gaussInd == 1 && cfg->interInd == 0) {
1281 sinfo_msg(
"Convolve spectra with Gaussian");
1283 cknull(im_conv = sinfo_new_convolve_image_by_gauss ( im_obj, cfg->hw ),
1284 "sinfo_convolveImageByGauss failed" );
1286 ck0(sinfo_pro_save_ima(im_conv,raw,sof,cfg->outName,
1287 frm_pro_ctg,NULL,plugin_id,config),
1288 "cannot save ima %s", cfg->outName);
1290 sinfo_free_image(&im_obj);
1291 sinfo_free_image(&im_conv);
1292 if (cfg->contains_dither == 1){
1293 sinfo_free_image(&im_dither);
1298 sinfo_msg(
"Add QC LOG");
1301 cknull_nomsg(qclog_tbl = sinfo_qclog_init());
1303 ck0_nomsg(sinfo_qclog_add_double(qclog_tbl,
"QC FRMON MEANFLUX",
1304 qc->avg_on,
"Average of flux",
"%g"));
1307 ck0_nomsg(sinfo_qclog_add_double(qclog_tbl,
"QC FRMOFF MEANFLUX",
1308 qc->avg_of,
"Average of flux",
"%g"));
1309 ck0_nomsg(sinfo_qclog_add_double(qclog_tbl,
"QC FRMDIF MEANFLUX",
1310 qc->avg_di,
"Average of flux",
"%g"));
1311 ck0_nomsg(sinfo_qclog_add_double(qclog_tbl,
"QC FRMON MAXFLUX",
1312 qc->max_on,
"Max of flux",
"%g"));
1313 ck0_nomsg(sinfo_qclog_add_double(qclog_tbl,
"QC FRMOFF MAXFLUX",
1314 qc->max_of,
"Max of flux",
"%g"));
1315 ck0_nomsg(sinfo_qclog_add_double(qclog_tbl,
"QC FRMDIF MAXFLUX",
1316 qc->max_di,
"Max of flux",
"%g"));
1317 ck0_nomsg(sinfo_qclog_add_int(qclog_tbl,
"QC FRMON NPIXSAT",
1319 "Number of saturated pixels",
"%d"));
1320 update_bad_pixel_map(im_obj);
1321 ck0_nomsg(sinfo_qclog_add_double(qclog_tbl,
"QC FRMDIF MEANSTD",
1322 cpl_image_get_mean(im_obj),
"mean of the image",
"%13.6f"));
1324 ck0_nomsg(sinfo_qclog_add_double(qclog_tbl,
1326 cpl_image_get_stdev(im_obj),
1327 "standard deviation of the image",
1330 ck0(sinfo_pro_save_ima(im_obj,raw,sof,cfg->outName,
1331 frm_pro_ctg,qclog_tbl,plugin_id,config),
1332 "cannot dump ima %s", cfg->outName);
1334 sinfo_free_image(&im_obj);
1335 sinfo_free_table(&qclog_tbl);
1337 if (cfg->contains_dither == 1 && cfg->interInd == 0) {
1338 if (strstr(cfg->outName,
".fits" ) != NULL ) {
1339 snprintf(name_list, MAX_NAME_SIZE-1,
"%s%s",
1340 sinfo_new_get_rootname(cfg->outName),
"_dith.fits");
1341 strcpy(cfg->outName,name_list);
1343 strcat(cfg->outName,
"_dith");
1345 cpl_free(name_list);
1349 ck0(sinfo_pro_save_ima(im_dither,raw,sof,cfg->outName,
1350 frm_pro_ctg,NULL,plugin_id,config),
1351 "cannot save ima %s", cfg->outName);
1353 if (cfg->contains_dither == 1) {
1354 sinfo_free_image(&im_dither);
1362 sinfo_free_image_array(&im,cfg->nframes);
1365 sinfo_free_image(&int_im_shifted);
1366 sinfo_free_image(&int_im);
1367 sinfo_free_image(&im_obj_flat);
1368 sinfo_free_image(&im_obj_sub);
1370 sinfo_stack_free(&cfg);
1371 sinfo_free_frameset(&raw);
1372 sinfo_qc_wcal_delete(&qc);
1377 sinfo_free_table(&qclog_tbl);
1378 sinfo_free_table(&tbl_slitpos);
1379 sinfo_free_table(&tbl_index);
1380 if(slit_edges!=NULL) sinfo_new_destroy_2Dfloatarray(&slit_edges, 32);
1381 sinfo_free_image(&flat1_dist);
1382 sinfo_free_image(&flat1);
1383 sinfo_free_image(&flat_smooth);
1384 sinfo_free_image(&flat2_dist);
1385 sinfo_free_image(&int_im);
1386 sinfo_free_image(&int_im_dith);
1387 sinfo_free_image(&int_im_shifted);
1388 sinfo_free_image(&im_dither);
1389 sinfo_free_image(&flat2);
1390 sinfo_free_image(&im_obj_flat);
1391 sinfo_free_image(&im_obj_sub);
1392 sinfo_free_image(&im_obj);
1393 sinfo_free_image(&mask_im);
1394 sinfo_free_image(&im_sky);
1395 sinfo_free_imagelist(&list_object_tmp);
1396 sinfo_free_image(&sky_img_flat);
1397 sinfo_free_image(&sky_dist);
1398 sinfo_free_image(&sky_img);
1399 sinfo_free_imagelist(&list_object);
1400 sinfo_free_imagelist(&list_sky);
1401 if(im != NULL) sinfo_free_image_array(&im,cfg->nframes);
1402 sinfo_stack_free(&cfg);
1403 sinfo_free_frameset(&raw);
1404 sinfo_qc_wcal_delete(&qc);
#define sinfo_msg_error(...)
Print an error message.
#define sinfo_msg_warning(...)
Print an warning message.