24#include "eris_nix_img_supersky.h"
25#include "eris_nix_utils.h"
26#include "eris_nix_dfs.h"
27#include "eris_pfits.h"
28#include "eris_utils.h"
32static hdrl_image * eris_create_sky_flat_first(
33 hdrl_imagelist * image_list,
38 const cpl_size plane_id);
40static hdrl_image * eris_create_sky_flat_first2(
41 located_imagelist * jitters,
42 located_imagelist ** sky_1st,
47 const cpl_size plane_id);
49static hdrl_image * eris_create_sky_flat_final(
50 hdrl_imagelist * image_list,
55 const cpl_size plane_id,
58static hdrl_image * eris_create_sky_flat_final2(
59 located_imagelist * jitters,
60 located_imagelist ** sky_2nd,
65 const cpl_size plane_id);
67static cpl_mask * eris_detect_sources_hdrl_catalogue(
68 const cpl_image * image,
71static cpl_mask * eris_dilate_mask(
72 const cpl_mask * input_mask,
76eris_image_stats(
const hdrl_image *in_image,
91eris_first_sky_sub(
const hdrl_imagelist* science_images,
const hdrl_image* sky_flat_0,
92 hdrl_imagelist** skysub_images);
95eris_locate_and_mask_sources(hdrl_imagelist* skysub_images,
const cpl_image* bpm_image,
96 const cpl_parameterlist* parlist,
const char* prefix, cpl_mask** source_masks);
100eris_locate_and_mask_sources2( located_imagelist * jitters,
const cpl_image* bpm_image,
101 const cpl_parameterlist* parlist,
const char* prefix, cpl_mask** source_masks);
104eris_load_data_and_crea_error(
const char* fname,
const cpl_size kk,
const cpl_mask* bad_pixel_map,
105 hdrl_imagelist** science_images);
108eris_load_data_and_error_simple(
const char* fname,
const cpl_size kk,
const cpl_mask* bad_pixel_map,
109 hdrl_imagelist** science_images);
112eris_load_and_error_cube(
const char* fname,
const cpl_mask* bad_pixel_map, cpl_size* kkk,
113 hdrl_imagelist** science_images);
116eris_load_and_error_cube2(
const char* fname,
const cpl_mask* bad_pixel_map,
117 const char* method,
const double kappa,
const int niter,
118 hdrl_imagelist** science_images);
121eris_create_final_skysub_products(
const hdrl_imagelist* science_iml,
const hdrl_image* sky_flat, cpl_frameset** products);
123static hdrl_imagelist*
124eris_crea_imagelist_all(cpl_frameset* raw_frames, cpl_mask* bad_pixel_map);
127eris_check_format_is_cube_of_same_size(
const cpl_frameset * raw_frames);
130eris_load_and_error_cube_slice(
const char* fname,
const cpl_mask* bad_pixel_map,
const cpl_size k,
131 const cpl_size kkk, hdrl_imagelist** science_images);
135eris_load_and_error_cube_robert(
const char* fname,
const cpl_mask* bad_pixel_map,
136 const char* method,
const double kappa,
const int niter,
const cpl_size kkk,
137 hdrl_imagelist** science_images);
140eris_save_sky_flat_final(
const cpl_frameset* raw_frames,
const hdrl_image* sky_flat_final, cpl_frameset** product_frames);
143eris_handle_simple_format_case(cpl_frameset * frameset,
144 const cpl_parameterlist * parlist,
145 cpl_frameset * raw_frames,
146 const char * recipe_name,
147 const char* combine_method,
148 const double sigma_clip,
150 const cpl_boolean debug_data,
151 cpl_mask * bad_pixel_map,
152 cpl_frameset ** product_frames);
156eris_handle_simple_format_case2(cpl_frameset * frameset,
157 const cpl_parameterlist * parlist,
158 const char * recipe_name,
159 const char* combine_method,
160 const double sigma_clip,
162 const cpl_boolean debug_data,
163 cpl_mask * bad_pixel_map,
164 cpl_frameset ** product_frames);
167eris_handle_cube_format_case(cpl_frameset * frameset,
168 const cpl_parameterlist * parlist,
169 cpl_frameset * raw_frames,
170 const char * recipe_name,
171 const char* combine_method,
172 const double sigma_clip,
174 const cpl_boolean debug_data,
175 cpl_mask * bad_pixel_map,
176 cpl_frameset ** product_frames);
180eris_handle_cube_format_robert(cpl_frameset * frameset,
181 const cpl_parameterlist * parlist,
182 cpl_frameset * raw_frames,
183 const char * recipe_name,
184 const char* combine_method,
185 const double sigma_clip,
187 const cpl_boolean debug_data,
188 cpl_mask * bad_pixel_map,
189 cpl_frameset ** product_frames);
191static located_imagelist *
192eris_create_final_skysub_products2(
const hdrl_imagelist* science_iml,
const cpl_frameset* raw_frames,
193 const hdrl_image* sky_flat, cpl_image* confidence, cpl_frameset** products);
196static located_imagelist *
197eris_create_final_skysub_products3(
const hdrl_imagelist* science_iml,
const cpl_frameset* frameset,
198 const cpl_frameset* raw_frames,
const hdrl_image* sky_flat, cpl_image* confidence,
199 cpl_frameset** products);
201static located_imagelist *
202eris_create_final_skysub_products_robert(
const cpl_frameset* frameset,
const cpl_frameset* raw_frames,
const hdrl_image* sky_flat,
203 cpl_image* confidence, cpl_frameset** products);
205static const int debug = 0;
227cpl_error_code eris_nix_img_supersky_run(
228 cpl_frameset * frameset,
229 const cpl_parameterlist * parlist,
230 const char* recipe_name,
231 cpl_frameset ** product_frames)
233 cpl_frameset * raw_frames = NULL;
234 const cpl_frame * bpm_frame = NULL;
235 cpl_mask * bad_pixel_map = NULL;
237 char * param_name = NULL;
238 const char* context =
"eris.eris_nix_img_supersky";
239 const cpl_parameter* par;
242 cpl_error_code error = CPL_ERROR_NONE;
244 cpl_ensure_code(frameset, CPL_ERROR_NULL_INPUT);
245 cpl_ensure_code(parlist, CPL_ERROR_NULL_INPUT);
246 cpl_ensure_code(product_frames, CPL_ERROR_NULL_INPUT);
249 param_name = cpl_sprintf(
"%s.combine_method", context);
250 par = cpl_parameterlist_find_const(parlist, param_name);
251 const char* combine_method = cpl_parameter_get_string(par);
252 cpl_free(param_name);
254 param_name = cpl_sprintf(
"%s.sigma_clip", context);
255 par = cpl_parameterlist_find_const(parlist, param_name);
256 const double sigma_clip = cpl_parameter_get_double(par);
257 cpl_free(param_name);
259 param_name = cpl_sprintf(
"%s.max_iter", context);
260 par = cpl_parameterlist_find_const(parlist, param_name);
261 const int max_iter = cpl_parameter_get_int(par);
262 cpl_free(param_name);
264 param_name = cpl_sprintf(
"%s.save_skysub", context);
265 par = cpl_parameterlist_find_const(parlist, param_name);
266 const cpl_boolean save_skysub = cpl_parameter_get_bool(par);
267 cpl_free(param_name);
269 param_name = cpl_sprintf(
"%s.debug_data", context);
270 par = cpl_parameterlist_find_const(parlist, param_name);
271 const cpl_boolean debug_data = cpl_parameter_get_bool(par);
272 cpl_free(param_name);
277 if (!raw_frames || cpl_frameset_get_size(raw_frames) == 0) {
280 if (!raw_frames || cpl_frameset_get_size(raw_frames) == 0) {
281 cpl_msg_error(cpl_func,
"No science frames found with tag %s or %s",
282 ERIS_NIX_CAL_DET_OBJECT_JITTER_PRO_CATG, ERIS_NIX_CAL_DET_STD_JITTER_PRO_CATG);
283 error = CPL_ERROR_DATA_NOT_FOUND;
286 num_frames = cpl_frameset_get_size(raw_frames);
287 cpl_msg_info(cpl_func,
"Processing %d science frames", num_frames);
290 bpm_frame = cpl_frameset_find_const(frameset, ERIS_NIX_IMG_SUPERSKY_BPM);
292 cpl_msg_warning(cpl_func,
"No bad pixel map found with tag %s", ERIS_NIX_IMG_SUPERSKY_BPM);
294 cpl_image * bpm_image = NULL;
297 bpm_image = cpl_image_load(cpl_frame_get_filename(bpm_frame), CPL_TYPE_INT, 0, 0);
300 bad_pixel_map = cpl_mask_threshold_image_create(bpm_image, 0.5, DBL_MAX);
302 cpl_mask_save(bad_pixel_map,
"bad_pixel_map.fits", NULL, CPL_IO_DEFAULT);
306 cpl_boolean format_is_cube_of_same_size = CPL_TRUE;
307 cpl_boolean test_cubes_slices = CPL_TRUE;
308 format_is_cube_of_same_size = eris_check_format_is_cube_of_same_size(raw_frames);
311 *product_frames = cpl_frameset_new();
312 if(!format_is_cube_of_same_size) {
313 num_frames = cpl_frameset_get_size(raw_frames);
314 cpl_msg_info(cpl_func,
"Processing1 %d science frames", num_frames);
316 eris_handle_simple_format_case(frameset, parlist, raw_frames, recipe_name, combine_method,
317 sigma_clip, max_iter, debug_data, bad_pixel_map, product_frames);
324 eris_handle_cube_format_robert(frameset, parlist, raw_frames, recipe_name, combine_method,
325 sigma_clip, max_iter, debug_data, bad_pixel_map, product_frames);
329 eris_print_rec_status(700);
331 eris_print_rec_status(800);
332 cpl_msg_info(cpl_func,
"Super-sky recipe completed successfully");
335 eris_print_rec_status(600);
336 if (raw_frames) cpl_frameset_delete(raw_frames);
337 if (bad_pixel_map) cpl_mask_delete(bad_pixel_map);
350eris_handle_simple_format_case(cpl_frameset * frameset,
351 const cpl_parameterlist * parlist,
352 cpl_frameset * raw_frames,
353 const char * recipe_name,
354 const char* combine_method,
355 const double sigma_clip,
357 const cpl_boolean debug_data,
358 cpl_mask * bad_pixel_map,
359 cpl_frameset ** product_frames){
361 hdrl_imagelist * science_images = NULL;
362 hdrl_image * sky_flat_0 = NULL;
363 hdrl_image * sky_flat_final = NULL;
364 cpl_mask ** source_masks = NULL;
365 hdrl_imagelist * skysub_images_0 = NULL;
367 science_images = eris_crea_imagelist_all(raw_frames, bad_pixel_map);
370 cpl_msg_info(cpl_func,
"Creating first-pass super-sky flat...");
371 eris_print_rec_status(100);
372 sky_flat_0 = eris_create_sky_flat_first(science_images, bad_pixel_map, combine_method, sigma_clip,
375 eris_print_rec_status(200);
378 eris_first_sky_sub(science_images, sky_flat_0, &skysub_images_0);
381 eris_print_rec_status(300);
384 cpl_msg_info(cpl_func,
"num_tot_images4: %lld",num_tot_images);
385 source_masks = cpl_calloc(num_tot_images,
sizeof(cpl_mask *));
386 cpl_image * bpm_image = NULL;
387 char* prefix = cpl_sprintf(
"%s.catalogue",recipe_name);
388 eris_locate_and_mask_sources(skysub_images_0, bpm_image, parlist, prefix, source_masks);
391 eris_print_rec_status(400);
392 cpl_msg_info(cpl_func,
"Creating final super-sky flat with source masking...");
393 cpl_image* contrib = NULL;
394 sky_flat_final = eris_create_sky_flat_final(science_images, source_masks,
395 combine_method, sigma_clip, max_iter, -1, &contrib);
397 if (!sky_flat_final) {
398 cpl_msg_error(cpl_func,
"Failed to create final sky flat");
399 return CPL_ERROR_ILLEGAL_OUTPUT;
404 eris_print_rec_status(500);
406 eris_save_sky_flat_final(raw_frames, sky_flat_final, product_frames);
412 located_imagelist * skysub = eris_create_final_skysub_products3(science_images, frameset, raw_frames, sky_flat_final, contrib, product_frames);
415 for (cpl_size i = 0; i < skysub->size; i++) {
419 cpl_propertylist * applist = cpl_propertylist_new();
420 cpl_propertylist_update_string(applist, CPL_DFS_PRO_CATG, ERIS_NIX_SKYSUB_OBJECT_JITTER_PRO_CATG);
421 cpl_propertylist_update_string(applist,
"PRODCATG",
423 cpl_propertylist_copy_property_regexp(applist,
424 skysub->limages[i]->plist,
430 cpl_wcs * wcs = cpl_wcs_new_from_propertylist(
431 skysub->limages[i]->plist);
436 cpl_propertylist_update_double(applist,
"RA", ra);
437 cpl_propertylist_update_double(applist,
"DEC", dec);
454 skysub->limages[i]->frame,
456 PACKAGE
"/" PACKAGE_VERSION,
460 cpl_propertylist_delete(applist);
475 if(contrib) cpl_image_delete(contrib);
479 if (source_masks != NULL) {
480 for (
int i = 0; i < num_tot_images; i++) {
481 if (source_masks[i]) cpl_mask_delete(source_masks[i]);
483 cpl_free(source_masks);
487 return cpl_error_get_code();
493eris_handle_simple_format_case2(cpl_frameset * frameset,
494 const cpl_parameterlist * parlist,
495 const char * recipe_name,
496 const char* combine_method,
497 const double sigma_clip,
499 const cpl_boolean debug_data,
500 cpl_mask * bad_pixel_map,
501 cpl_frameset ** product_frames){
503 hdrl_imagelist * science_images = NULL;
504 hdrl_image * sky_flat_0 = NULL;
505 hdrl_image * sky_flat_final = NULL;
506 located_imagelist * object_jitters = NULL;
507 located_imagelist * sky_1st = NULL;
508 cpl_mask ** source_masks = NULL;
509 hdrl_imagelist * skysub_images_0 = NULL;
510 cpl_frameset * raw_frames = cpl_frameset_new();
515 ERIS_NIX_CAL_DET_OBJECT_JITTER_PRO_CATG, raw_frames);
516 cpl_msg_info(cpl_func,
"Processing3 %lld science frames", cpl_frameset_get_size(raw_frames));
519 if (!object_jitters) {
521 ERIS_NIX_CAL_DET_STD_JITTER_PRO_CATG, raw_frames);
523 if (!raw_frames || cpl_frameset_get_size(raw_frames) == 0) {
524 cpl_msg_error(cpl_func,
"No science frames found with tag %s or %s",
525 ERIS_NIX_CAL_DET_OBJECT_JITTER_PRO_CATG, ERIS_NIX_CAL_DET_STD_JITTER_PRO_CATG);
527 return CPL_ERROR_DATA_NOT_FOUND;
529 cpl_msg_info(cpl_func,
"n0: %lld",cpl_frameset_get_size(raw_frames));
530 science_images = eris_crea_imagelist_all(raw_frames, bad_pixel_map);
533 cpl_msg_info(cpl_func,
"Creating first-pass super-sky flat...");
538 eris_print_rec_status(100);
549 sky_flat_0 = eris_create_sky_flat_first2(object_jitters, &sky_1st, bad_pixel_map, combine_method, sigma_clip,
551 eris_print_rec_status(150);
552 cpl_msg_info(cpl_func,
"n2: %lld",object_jitters->size);
556 char * preface = cpl_sprintf(
"%s_%s",
"jitters",
"sky_1st");
563 eris_print_rec_status(170);
566 eris_first_sky_sub(science_images, sky_flat_0, &skysub_images_0);
571 eris_print_rec_status(300);
574 cpl_msg_info(cpl_func,
"num_tot_images1: %lld",num_tot_images);
575 source_masks = cpl_calloc(num_tot_images,
sizeof(cpl_mask *));
576 cpl_image * bpm_image = NULL;
577 char* prefix = cpl_sprintf(
"%s.catalogue",recipe_name);
579 eris_locate_and_mask_sources2(sky_1st, bpm_image, parlist, prefix, source_masks);
581 eris_print_rec_status(400);
583 cpl_msg_info(cpl_func,
"Creating final super-sky flat with source masking...");
588 sky_flat_final = eris_create_sky_flat_final2(object_jitters, &sky_2nd, source_masks, combine_method, sigma_clip, max_iter, -1);
590 eris_print_rec_status(450);
592 eris_print_rec_status(460);
594 if (!sky_flat_final) {
595 cpl_msg_error(cpl_func,
"Failed to create final sky flat");
596 return CPL_ERROR_ILLEGAL_OUTPUT;
609 eris_print_rec_status(500);
611 eris_save_sky_flat_final(raw_frames, sky_flat_final, product_frames);
616 eris_create_final_skysub_products(science_images, sky_flat_final, product_frames);
624 if (source_masks != NULL) {
625 for (
int i = 0; i < num_tot_images; i++) {
626 if (source_masks[i]) cpl_mask_delete(source_masks[i]);
628 cpl_free(source_masks);
630 cpl_frameset_delete(raw_frames);
632 return cpl_error_get_code();
637eris_handle_cube_format_case(cpl_frameset * frameset,
638 const cpl_parameterlist * parlist,
639 cpl_frameset * raw_frames,
640 const char * recipe_name,
641 const char* combine_method,
642 const double sigma_clip,
644 const cpl_boolean debug_data,
645 cpl_mask * bad_pixel_map,
646 cpl_frameset ** product_frames)
649 hdrl_imagelist * science_images = NULL;
650 hdrl_image * sky_flat_0 = NULL;
651 hdrl_image * sky_flat_final = NULL;
652 cpl_mask ** source_masks = NULL;
653 hdrl_imagelist * skysub_images_0 = NULL;
654 cpl_msg_warning(cpl_func,
"cube format, process slice by slice");
656 const cpl_frame * frame = cpl_frameset_get_position_const(raw_frames, 0);
657 const char * filename = cpl_frame_get_filename(frame);
658 cpl_imagelist * data_iml = cpl_imagelist_load(filename, CPL_TYPE_DOUBLE, 1);
659 cpl_size nplanes = cpl_imagelist_get_size(data_iml);
660 cpl_size num_frames = cpl_frameset_get_size(raw_frames);
661 for(cpl_size k = 0; k < nplanes; k++) {
663 for(cpl_size kkk = 0; kkk < num_frames; kkk++) {
664 frame = cpl_frameset_get_position_const(raw_frames, kkk);
665 filename = cpl_frame_get_filename(frame);
666 eris_load_and_error_cube_slice(filename, bad_pixel_map, k, kkk, &science_images);
670 cpl_msg_info(cpl_func,
"Creating first-pass super-sky flat...");
671 sky_flat_0 = eris_create_sky_flat_first(science_images, bad_pixel_map, combine_method, sigma_clip, max_iter, k);
674 eris_first_sky_sub(science_images, sky_flat_0, &skysub_images_0);
676 eris_print_rec_status(300);
679 cpl_msg_info(cpl_func,
"num_tot_images2: %lld",num_tot_images);
680 source_masks = cpl_calloc(num_tot_images,
sizeof(cpl_mask *));
681 cpl_image * bpm_image = NULL;
682 char* prefix = cpl_sprintf(
"%s.catalogue",recipe_name);
683 eris_locate_and_mask_sources(skysub_images_0, bpm_image, parlist, prefix, source_masks);
685 eris_print_rec_status(400);
687 cpl_msg_info(cpl_func,
"Creating final super-sky flat with source masking...");
688 cpl_image* contrib = NULL;
689 sky_flat_final = eris_create_sky_flat_final(science_images, source_masks,
690 combine_method, sigma_clip, max_iter, k, &contrib);
693 eris_create_final_skysub_products(science_images, sky_flat_final, product_frames);
700 if (contrib) cpl_image_delete(contrib);
701 if (source_masks != NULL) {
702 for (
int i = 0; i < num_tot_images; i++) {
703 if (source_masks[i]) cpl_mask_delete(source_masks[i]);
705 cpl_free(source_masks);
708 cpl_imagelist_delete(data_iml);
711 return cpl_error_get_code();
716eris_handle_cube_format_robert(cpl_frameset * frameset,
717 const cpl_parameterlist * parlist,
718 cpl_frameset * raw_frames,
719 const char * recipe_name,
720 const char* combine_method,
721 const double sigma_clip,
723 const cpl_boolean debug_data,
724 cpl_mask * bad_pixel_map,
725 cpl_frameset ** product_frames)
728 hdrl_imagelist * science_images = NULL;
729 hdrl_image * sky_flat_0 = NULL;
730 hdrl_image * sky_flat_final = NULL;
731 cpl_mask ** source_masks = NULL;
732 hdrl_imagelist * skysub_images_0 = NULL;
733 cpl_msg_warning(cpl_func,
"cube format, collapse cubes and combine images");
735 const cpl_frame * frame = cpl_frameset_get_position_const(raw_frames, 0);
736 const char * filename = cpl_frame_get_filename(frame);
739 cpl_size num_frames = cpl_frameset_get_size(raw_frames);
743 for(cpl_size kkk = 0; kkk < num_frames; kkk++) {
744 frame = cpl_frameset_get_position_const(raw_frames, kkk);
745 filename = cpl_frame_get_filename(frame);
747 eris_load_and_error_cube_robert(filename, bad_pixel_map, combine_method, sigma_clip, max_iter, kkk,
753 cpl_msg_info(cpl_func,
"Creating first-pass super-sky flat...");
754 sky_flat_0 = eris_create_sky_flat_first(science_images, bad_pixel_map, combine_method, sigma_clip, max_iter, 0);
757 eris_first_sky_sub(science_images, sky_flat_0, &skysub_images_0);
760 eris_print_rec_status(300);
763 cpl_msg_info(cpl_func,
"num_tot_images2: %lld",num_tot_images);
764 source_masks = cpl_calloc(num_tot_images,
sizeof(cpl_mask *));
765 cpl_image * bpm_image = NULL;
766 char* prefix = cpl_sprintf(
"%s.catalogue",recipe_name);
767 eris_locate_and_mask_sources(skysub_images_0, bpm_image, parlist, prefix, source_masks);
771 eris_print_rec_status(400);
773 cpl_msg_info(cpl_func,
"Creating final super-sky flat with source masking...");
774 cpl_image* contrib = NULL;
775 sky_flat_final = eris_create_sky_flat_final(science_images, source_masks,
776 combine_method, sigma_clip, max_iter, 0, &contrib);
779 if (source_masks != NULL) {
780 for (
int i = 0; i < num_tot_images; i++) {
781 if (source_masks[i]) cpl_mask_delete(source_masks[i]);
783 cpl_free(source_masks);
786 eris_create_final_skysub_products_robert(frameset, raw_frames, sky_flat_final, contrib, product_frames);
791 if (contrib) cpl_image_delete(contrib);
794 return cpl_error_get_code();
799eris_handle_cube_format_case2(cpl_frameset * frameset,
800 const cpl_parameterlist * parlist,
801 cpl_frameset * raw_frames,
802 const char * recipe_name,
803 const char* combine_method,
804 const double sigma_clip,
806 const cpl_boolean debug_data,
807 cpl_mask * bad_pixel_map,
808 cpl_frameset ** product_frames)
811 hdrl_imagelist * science_images = NULL;
812 hdrl_image * sky_flat_0 = NULL;
813 hdrl_image * sky_flat_final = NULL;
814 cpl_mask ** source_masks = NULL;
815 hdrl_imagelist * skysub_images_0 = NULL;
816 cpl_msg_warning(cpl_func,
"cube format, process slice by slice");
818 const cpl_frame * frame = cpl_frameset_get_position_const(raw_frames, 0);
819 const char * filename = cpl_frame_get_filename(frame);
820 cpl_imagelist * data_iml = cpl_imagelist_load(filename, CPL_TYPE_DOUBLE, 1);
821 cpl_size nplanes = cpl_imagelist_get_size(data_iml);
822 cpl_size num_frames = cpl_frameset_get_size(raw_frames);
823 for(cpl_size k = 0; k < nplanes; k++) {
825 for(cpl_size kkk = 0; kkk < num_frames; kkk++) {
826 frame = cpl_frameset_get_position_const(raw_frames, kkk);
827 filename = cpl_frame_get_filename(frame);
828 eris_load_and_error_cube_slice(filename, bad_pixel_map, k, kkk, &science_images);
832 cpl_msg_info(cpl_func,
"Creating first-pass super-sky flat...");
833 sky_flat_0 = eris_create_sky_flat_first(science_images, bad_pixel_map, combine_method, sigma_clip, max_iter, k);
836 eris_first_sky_sub(science_images, sky_flat_0, &skysub_images_0);
838 eris_print_rec_status(300);
841 cpl_msg_info(cpl_func,
"num_tot_images2: %lld",num_tot_images);
842 source_masks = cpl_calloc(num_tot_images,
sizeof(cpl_mask *));
843 cpl_image * bpm_image = NULL;
844 char* prefix = cpl_sprintf(
"%s.catalogue",recipe_name);
845 eris_locate_and_mask_sources(skysub_images_0, bpm_image, parlist, prefix, source_masks);
847 eris_print_rec_status(400);
849 cpl_msg_info(cpl_func,
"Creating final super-sky flat with source masking...");
850 cpl_image* contrib = NULL;
851 sky_flat_final = eris_create_sky_flat_final(science_images, source_masks,
852 combine_method, sigma_clip, max_iter, k, &contrib);
855 eris_create_final_skysub_products(science_images, sky_flat_final, product_frames);
862 if (contrib) cpl_image_delete(contrib);
863 if (source_masks != NULL) {
864 for (
int i = 0; i < num_tot_images; i++) {
865 if (source_masks[i]) cpl_mask_delete(source_masks[i]);
867 cpl_free(source_masks);
870 cpl_imagelist_delete(data_iml);
873 return cpl_error_get_code();
880eris_save_sky_flat_final(
const cpl_frameset* raw_frames,
const hdrl_image* sky_flat_final, cpl_frameset** product_frames)
884 cpl_size num_frames = cpl_frameset_get_size(raw_frames);
885 cpl_msg_info(cpl_func,
"num_frames:%lld",num_frames);
886 eris_print_rec_status(500);
891 cpl_propertylist* plist = cpl_propertylist_load(cpl_frame_get_filename(
892 cpl_frameset_get_position_const(raw_frames, 0)), 0);
893 cpl_propertylist_update_string(plist, CPL_DFS_PRO_CATG, ERIS_NIX_IMG_SUPERSKY_SKYFLAT);
894 cpl_propertylist_update_double(plist,
"ESO QC SKY MEDIAN", med_sky_final.data);
895 cpl_propertylist_update_int(plist,
"ESO QC NFRAMES", num_frames);
896 eris_print_rec_status(600);
897 char* fname = cpl_sprintf(
"sky_flat_2nd.fits");
903 cpl_frame * product = cpl_frame_new();
904 cpl_frame_set_filename(product, fname);
905 cpl_frame_set_tag(product, ERIS_NIX_IMG_SUPERSKY_SKYFLAT);
906 cpl_frame_set_type(product, CPL_FRAME_TYPE_IMAGE);
907 cpl_frame_set_group(product, CPL_FRAME_GROUP_PRODUCT);
908 cpl_frameset_insert(*product_frames, product);
911 cpl_propertylist_delete(plist);
914 return cpl_error_get_code();
919eris_save_sky_flat_final2(
const cpl_frameset* raw_frames,
const hdrl_image* sky_flat_final, cpl_frameset** product_frames)
923 cpl_size num_frames = cpl_frameset_get_size(raw_frames);
924 eris_print_rec_status(500);
929 cpl_propertylist* plist = cpl_propertylist_load(cpl_frame_get_filename(
930 cpl_frameset_get_position_const(raw_frames, 0)), 0);
931 cpl_propertylist_update_string(plist, CPL_DFS_PRO_CATG, ERIS_NIX_IMG_SUPERSKY_SKYFLAT);
932 cpl_propertylist_update_double(plist,
"ESO QC SKY MEDIAN", med_sky_final.data);
933 cpl_propertylist_update_int(plist,
"ESO QC NFRAMES", num_frames);
934 eris_print_rec_status(600);
935 char* fname = cpl_sprintf(
"sky_flat_2nd.fits");
941 cpl_frame * product = cpl_frame_new();
942 cpl_frame_set_filename(product, fname);
943 cpl_frame_set_tag(product, ERIS_NIX_IMG_SUPERSKY_SKYFLAT);
944 cpl_frame_set_type(product, CPL_FRAME_TYPE_IMAGE);
945 cpl_frame_set_group(product, CPL_FRAME_GROUP_PRODUCT);
946 cpl_frameset_insert(*product_frames, product);
949 cpl_propertylist_delete(plist);
952 return cpl_error_get_code();
956static hdrl_imagelist*
957eris_crea_imagelist_all(cpl_frameset* raw_frames, cpl_mask* bad_pixel_map)
962 cpl_size num_frames = cpl_frameset_get_size(raw_frames);
964 const char* format = NULL;
965 cpl_propertylist* pheader = NULL;
966 eris_print_rec_status(100);
968 for (cpl_size kk = 0; kk < num_frames; kk++) {
969 const cpl_frame * frame = cpl_frameset_get_position_const(raw_frames, kk);
970 const char * filename = cpl_frame_get_filename(frame);
971 next = cpl_frame_get_nextensions(frame);
972 pheader = cpl_propertylist_load(filename,0);
976 eris_load_data_and_crea_error(filename, kk, bad_pixel_map, &science_images);
978 cpl_msg_info(cpl_func,
"sci data with extentions %s", filename);
979 if(!strcmp(format,
"single")) {
980 eris_load_data_and_error_simple(filename, kk, bad_pixel_map, &science_images);
982 eris_load_and_error_cube(filename, bad_pixel_map, &kkk, &science_images);
985 cpl_propertylist_delete(pheader);
990 cpl_msg_info(cpl_func,
"Image dimensions: %lld x %lld", nx, ny);
994 return science_images;
998eris_check_format_is_cube_of_same_size(
const cpl_frameset * raw_frames)
1001 cpl_boolean result = CPL_TRUE;
1002 cpl_size nplanes = 0;
1003 cpl_size nplanes_tmp = 0;
1005 cpl_size num_frames = cpl_frameset_get_size(raw_frames);
1007 for (
int kk = 0; kk < num_frames; kk++) {
1008 const cpl_frame * frame = cpl_frameset_get_position_const(raw_frames, kk);
1009 next = cpl_frame_get_nextensions(frame);
1012 const char * fname = cpl_frame_get_filename(frame);
1014 cpl_propertylist* xhead = cpl_propertylist_load(fname,1);
1015 if(cpl_propertylist_has(xhead,
"CD3_3")) {
1016 cpl_imagelist * data_iml = cpl_imagelist_load(fname, CPL_TYPE_DOUBLE, 1);
1018 nplanes_tmp = cpl_imagelist_get_size(data_iml);
1020 nplanes = nplanes_tmp;
1021 }
else if (nplanes_tmp != nplanes) {
1022 cpl_msg_info(cpl_func,
"cubes not of same size");
1025 cpl_imagelist_delete(data_iml);
1027 cpl_msg_info(cpl_func,
"Input Data are simple format (images)");
1028 cpl_propertylist_delete(xhead);
1031 cpl_propertylist_delete(xhead);
1033 cpl_msg_info(cpl_func,
"Data with less than 4 extensions");
1052static cpl_error_code
1053eris_create_final_skysub_products(
const hdrl_imagelist* science_iml,
const hdrl_image* sky_flat, cpl_frameset** products)
1056 cpl_msg_info(cpl_func,
"Saving sky-subtracted frames...");
1060 for (
int i = 0; i < num_tot_images; i++) {
1064 hdrl_value scale = {0, 0};
1065 scale.data = med_img.data / med_sky.data;
1074 snprintf(outfile, 256,
"sci_skysub_2nd_%03d.fits", i);
1077 cpl_msg_info(cpl_func,
"ESO QC SKY_MED: %g",med_img.data);
1078 cpl_msg_info(cpl_func,
"ESO QC SKYSUB_MED: %g", med_skyub.data);
1094 cpl_frame * product = cpl_frame_new();
1095 cpl_frame_set_filename(product, outfile);
1096 cpl_frame_set_tag(product, ERIS_NIX_IMG_SUPERSKY_SKYSUB);
1097 cpl_frame_set_type(product, CPL_FRAME_TYPE_IMAGE);
1098 cpl_frame_set_group(product, CPL_FRAME_GROUP_PRODUCT);
1099 cpl_frameset_insert(*products, product);
1106 return cpl_error_get_code();
1113static located_imagelist *
1114eris_create_final_skysub_products2(
const hdrl_imagelist* science_iml,
const cpl_frameset* raw_frames,
const hdrl_image* sky_flat,
1115 cpl_image* confidence, cpl_frameset** products)
1118 cpl_msg_info(cpl_func,
"Saving sky-subtracted frames...");
1122 for (
int i = 0; i < num_tot_images; i++) {
1126 hdrl_value scale = {0, 0};
1127 scale.data = med_img.data / med_sky.data;
1136 snprintf(outfile, 256,
"ERIS.2024.sci_skysub_2nd_%03d.fits", i);
1139 cpl_msg_info(cpl_func,
"ESO QC SKY_MED: %g",med_img.data);
1140 cpl_msg_info(cpl_func,
"ESO QC SKYSUB_MED: %g", med_skyub.data);
1151 cpl_frame * frame = cpl_frameset_get_position(raw_frames, i);
1152 cpl_propertylist* plist = cpl_propertylist_load(cpl_frame_get_filename(frame), 0);
1153 cpl_propertylist* dhead = cpl_propertylist_load(cpl_frame_get_filename(frame), 1);
1154 cpl_propertylist* ehead = cpl_propertylist_load(cpl_frame_get_filename(frame), 2);
1155 cpl_propertylist* qhead = cpl_propertylist_load(cpl_frame_get_filename(frame), 3);
1156 cpl_propertylist_save(plist, outfile, CPL_IO_CREATE);
1160 cpl_propertylist_delete(dhead);
1161 cpl_propertylist_delete(ehead);
1162 cpl_propertylist_delete(qhead);
1167 cpl_frame * product = cpl_frame_new();
1168 cpl_frame_set_filename(product, outfile);
1169 cpl_frame_set_tag(product, ERIS_NIX_IMG_SUPERSKY_SKYSUB);
1170 cpl_frame_set_type(product, CPL_FRAME_TYPE_IMAGE);
1171 cpl_frame_set_group(product, CPL_FRAME_GROUP_CALIB);
1172 cpl_frameset_insert(*products, product);
1175 limage->frame = product;
1180 cpl_propertylist_delete(plist);
1189static located_imagelist *
1190eris_create_final_skysub_products3(
const hdrl_imagelist* science_iml,
const cpl_frameset* frameset,
1191 const cpl_frameset* raw_frames,
const hdrl_image* sky_flat,
1192 cpl_image* confidence, cpl_frameset** products)
1195 cpl_msg_info(cpl_func,
"Saving sky-subtracted frames...");
1198 located_imagelist* object_jitters = NULL;
1202 if(cpl_frameset_count_tags(frameset, ERIS_NIX_CAL_DET_OBJECT_JITTER_PRO_CATG) > 0) {
1204 ERIS_NIX_CAL_DET_OBJECT_JITTER_PRO_CATG, raw_frames);
1205 }
else if(cpl_frameset_count_tags(frameset, ERIS_NIX_CAL_DET_STD_JITTER_PRO_CATG) > 0) {
1207 ERIS_NIX_CAL_DET_STD_JITTER_PRO_CATG, raw_frames);
1211 cpl_size edge_llx = 50;
1212 cpl_size edge_lly = 50;
1213 cpl_size edge_urx = 50;
1214 cpl_size edge_ury = 50;
1215 cpl_mask* omask = cpl_mask_new(sx, sy);
1216 cpl_binary* pmask = cpl_mask_get_data(omask);
1219 for(cpl_size j = 0; j < edge_lly; j++) {
1220 for(cpl_size i = 0; i < sx; i++) {
1221 pmask[i+j*sx] = CPL_BINARY_1;
1225 for(cpl_size j = sy - edge_ury; j < sy; j++) {
1226 for(cpl_size i = 0; i < sx; i++) {
1227 pmask[i+j*sx] = CPL_BINARY_1;
1232 for(cpl_size j = 0; j < sy; j++) {
1233 for(cpl_size i = 0; i < edge_llx; i++) {
1234 pmask[i+j*sx] = CPL_BINARY_1;
1238 for(cpl_size j = 0; j < sy; j++) {
1239 for(cpl_size i = sx - edge_urx; i < sx; i++) {
1240 pmask[i+j*sx] = CPL_BINARY_1;
1244 for (cpl_size k = 0; k < num_tot_images; k++) {
1248 hdrl_value scale = {0, 0};
1249 scale.data = med_img.data / med_sky.data;
1250 cpl_msg_warning(cpl_func,
"Final frame: %lld med_img.data: %g med_sky_0.data: %g scale.data: %g",
1251 k, med_img.data, med_sky.data, scale.data);
1259 snprintf(outfile, 256,
"sci_skysub_2nd_%03lld.fits", k);
1262 cpl_msg_info(cpl_func,
"ESO QC SKY_MED: %g",med_img.data);
1263 cpl_msg_info(cpl_func,
"ESO QC SKYSUB_MED: %g", med_skyub.data);
1281 if(object_jitters->limages[k]->himage) {
1286 if(object_jitters->limages[k]->bkg) {
1291 if(object_jitters->limages[k]->confidence) {
1292 cpl_image_delete(object_jitters->limages[k]->confidence);
1293 object_jitters->limages[k]->confidence=cpl_image_duplicate(confidence);
1295 int* pconf = cpl_image_get_data_int(object_jitters->limages[k]->confidence);
1296 object_jitters->limages[k]->object_mask = cpl_mask_duplicate(omask);
1299 for(cpl_size j = 0; j < edge_lly; j++) {
1300 for(cpl_size i = 0; i < sx; i++) {
1305 for(cpl_size j = sy - edge_ury; j < sy; j++) {
1306 for(cpl_size i = 0; i < sx; i++) {
1312 for(cpl_size j = 0; j < sy; j++) {
1313 for(cpl_size i = 0; i < edge_llx; i++) {
1318 for(cpl_size j = 0; j < sy; j++) {
1319 for(cpl_size i = sx - edge_urx; i < sx; i++) {
1327 cpl_mask_delete(omask);
1329 return object_jitters;
1334static located_imagelist *
1335eris_create_final_skysub_products_robert(
const cpl_frameset* frameset,
const cpl_frameset* raw_frames,
const hdrl_image* sky_flat,
1336 cpl_image* confidence, cpl_frameset** products)
1339 cpl_msg_info(cpl_func,
"Saving sky-subtracted frames...");
1340 cpl_size num_frames = cpl_frameset_get_size(raw_frames);
1343 located_imagelist* object_jitters = NULL;
1349 cpl_mask* omask = cpl_mask_new(sx, sy);
1350 cpl_binary* pmask = cpl_mask_get_data(omask);
1352 located_image * limage = NULL;
1353 cpl_image * copyconf = NULL;
1354 cpl_size collapse_cube = 0;
1355 cpl_frameset_iterator * frameset_iter = cpl_frameset_iterator_new(raw_frames);
1358 cpl_propertylist* plist = NULL;
1359 cpl_propertylist* hdata = NULL;
1360 cpl_propertylist* herrs = NULL;
1361 cpl_propertylist* hqual = NULL;
1362 cpl_size ext_prim = 0;
1363 cpl_size ext_data = 1;
1364 cpl_size ext_errs = 2;
1365 cpl_size ext_qual = 3;
1366 cpl_image* data = NULL;
1367 cpl_image* errs = NULL;
1368 cpl_image* qual = NULL;
1369 hdrl_image* hima = NULL;
1383 for (cpl_size iframe = 0; iframe < num_frames; iframe++) {
1384 cpl_frame * frame = cpl_frameset_iterator_get(frameset_iter);
1385 fname = cpl_frame_get_filename(frame);
1386 plist = cpl_propertylist_load(fname, ext_prim);
1387 hdata = cpl_propertylist_load(fname, ext_data);
1388 herrs = cpl_propertylist_load(fname, ext_errs);
1389 hqual = cpl_propertylist_load(fname, ext_qual);
1390 cpl_imagelist* data_iml = cpl_imagelist_load(fname, CPL_TYPE_DOUBLE, ext_data);
1391 cpl_imagelist* errs_iml = cpl_imagelist_load(fname, CPL_TYPE_DOUBLE, ext_errs);
1392 cpl_mask* qual_mask = cpl_mask_load(fname, 0, ext_qual);
1394 cpl_msg_info(cpl_func,
"processing %s", cpl_frame_get_filename(frame));
1396 cpl_imagelist* data_list = cpl_imagelist_new();
1397 cpl_imagelist* errs_list = cpl_imagelist_new();
1398 cpl_imagelist* qual_list = cpl_imagelist_new();
1399 cpl_size sz = cpl_imagelist_get_size(data_iml);
1400 cpl_msg_info(cpl_func,
"number of planes %lld", sz);
1401 char* outfile = NULL;
1402 for(k = 0; k < sz; k++) {
1403 data = cpl_imagelist_get(data_iml, k);
1404 errs = cpl_imagelist_get(errs_iml, k);
1405 cpl_image_reject_from_mask(data, qual_mask);
1406 cpl_image_reject_from_mask(errs, qual_mask);
1409 hdrl_value scale = {0, 0};
1410 scale.data = med_img.data / med_sky.data;
1411 cpl_msg_warning(cpl_func,
"Final frame: %lld plane %lld med_img.data: %g med_sky_0.data: %g scale.data: %g",
1412 iframe, k, med_img.data, med_sky.data, scale.data);
1444 cpl_msg_info(cpl_func,
"ESO QC SKY_MED: %g",med_img.data);
1445 cpl_msg_info(cpl_func,
"ESO QC SKYSUB_MED: %g", med_skyub.data);
1448 outfile = cpl_sprintf(
"sci_skysub_2nd_%03lld.fits", iframe);
1449 cpl_propertylist_save(plist, outfile, CPL_IO_CREATE);
1465 outfile = cpl_sprintf(
"sci_pro_skysub_2nd_%03lld.fits", iframe);
1467 for (cpl_size i = 0; i < sz; i++) {
1471 cpl_imagelist_set(qual_list, bpm, i);
1475 cpl_propertylist_save(plist, outfile, CPL_IO_CREATE);
1476 cpl_imagelist_save(data_list, outfile, CPL_TYPE_DOUBLE, hdata, CPL_IO_EXTEND);
1477 cpl_imagelist_save(errs_list, outfile, CPL_TYPE_DOUBLE, herrs, CPL_IO_EXTEND);
1478 cpl_imagelist_save(qual_list, outfile, CPL_TYPE_INT, herrs, CPL_IO_EXTEND);
1479 cpl_mask_save(qual_mask, outfile, hqual, CPL_IO_EXTEND);
1481 cpl_image_save(confidence, outfile, CPL_TYPE_DOUBLE, NULL, CPL_IO_EXTEND);
1483 cpl_frame * product = cpl_frame_new();
1484 cpl_frame_set_filename(product, outfile);
1485 cpl_frame_set_tag(product, ERIS_NIX_IMG_SUPERSKY_SKYFLAT);
1486 cpl_frame_set_type(product, CPL_FRAME_TYPE_IMAGE);
1487 cpl_frame_set_group(product, CPL_FRAME_GROUP_PRODUCT);
1488 cpl_frame_set_level(product, CPL_FRAME_LEVEL_FINAL);
1489 cpl_frameset_insert(*products, product);
1492 cpl_propertylist_delete(plist);
1493 cpl_propertylist_delete(hdata);
1494 cpl_propertylist_delete(herrs);
1495 cpl_propertylist_delete(hqual);
1497 cpl_imagelist_delete(data_iml);
1498 cpl_imagelist_delete(errs_iml);
1499 cpl_mask_delete(qual_mask);
1503 for (cpl_size i = sz-1; i >= 0; i--) {
1504 cpl_imagelist_unset(data_list, i);
1505 cpl_imagelist_unset(errs_list, i);
1509 cpl_imagelist_delete(data_list);
1510 cpl_imagelist_delete(errs_list);
1511 cpl_imagelist_delete(qual_list);
1520 cpl_frameset_iterator_delete(frameset_iter);
1521 cpl_mask_delete(omask);
1524 return object_jitters;
1540static cpl_error_code
1541eris_load_and_error_cube(
const char* fname,
const cpl_mask* bad_pixel_map, cpl_size* kkk,
1542 hdrl_imagelist** science_images){
1544 eris_print_rec_status(0);
1545 cpl_imagelist * data_iml = cpl_imagelist_load(fname, CPL_TYPE_DOUBLE, 1);
1546 cpl_imagelist * error_iml = cpl_imagelist_load(fname, CPL_TYPE_DOUBLE, 2);
1547 cpl_mask * dqual_msk = cpl_mask_load(fname, 0, 3);
1548 cpl_imagelist * confm_iml = cpl_imagelist_load(fname, CPL_TYPE_DOUBLE, 4);
1550 double* pconf_img = cpl_image_get_data_double(cpl_imagelist_get(confm_iml,0));
1552 cpl_binary* pbpm = cpl_mask_get_data(dqual_msk);
1553 cpl_size sx = cpl_mask_get_size_x(dqual_msk);
1554 cpl_size sy = cpl_mask_get_size_y(dqual_msk);
1555 cpl_size sz = cpl_imagelist_get_size(data_iml);
1557 cpl_mask* mask_tot = cpl_mask_duplicate(dqual_msk);
1559 cpl_mask_or(mask_tot, bad_pixel_map);
1561 double* pdata = NULL;
1562 cpl_image * data_img = NULL;
1563 cpl_image * error_img = NULL;
1566 for (cpl_size k = 0; k < sz; k++) {
1567 data_img = cpl_imagelist_get(data_iml,k);
1568 error_img = cpl_imagelist_get(error_iml,k);
1569 pdata = cpl_image_get_data(cpl_imagelist_get(data_iml,k));
1570 for (cpl_size j = 0; j < sy; j++) {
1573 for (cpl_size i = 0; i < sx; i++) {
1576 if((pconf_img[pixel] == 0) || !isfinite(pdata[pixel])) {
1577 pbpm[pixel] = CPL_BINARY_1;
1583 cpl_image_reject_from_mask(data_img, mask_tot);
1584 cpl_image_reject_from_mask(error_img, mask_tot);
1591 cpl_mask_delete(mask_tot);
1592 cpl_mask_delete(dqual_msk);
1593 cpl_imagelist_delete(data_iml);
1594 cpl_imagelist_delete(error_iml);
1595 cpl_imagelist_delete(confm_iml);
1598 return cpl_error_get_code();
1615static cpl_error_code
1616eris_load_and_error_cube_slice(
const char* fname,
const cpl_mask* bad_pixel_map,
const cpl_size k,
1617 const cpl_size kkk, hdrl_imagelist** science_images){
1620 cpl_imagelist * data_iml = cpl_imagelist_load(fname, CPL_TYPE_DOUBLE, 1);
1621 cpl_imagelist * error_iml = cpl_imagelist_load(fname, CPL_TYPE_DOUBLE, 2);
1622 cpl_mask * dqual_msk = cpl_mask_load(fname, 0, 3);
1623 cpl_imagelist * confm_iml = cpl_imagelist_load(fname, CPL_TYPE_DOUBLE, 4);
1625 double* pconf_img = cpl_image_get_data_double(cpl_imagelist_get(confm_iml,0));
1627 cpl_binary* pbpm = cpl_mask_get_data(dqual_msk);
1628 cpl_size sx = cpl_mask_get_size_x(dqual_msk);
1629 cpl_size sy = cpl_mask_get_size_y(dqual_msk);
1631 cpl_mask* mask_tot = cpl_mask_duplicate(dqual_msk);
1633 cpl_mask_or(mask_tot, bad_pixel_map);
1635 double* pdata = NULL;
1636 cpl_image * data_img = NULL;
1637 cpl_image * error_img = NULL;
1641 data_img = cpl_imagelist_get(data_iml,k);
1642 error_img = cpl_imagelist_get(error_iml,k);
1643 pdata = cpl_image_get_data(cpl_imagelist_get(data_iml,k));
1645 for (cpl_size j = 0; j < sy; j++) {
1648 for (cpl_size i = 0; i < sx; i++) {
1651 if((pconf_img[pixel] == 0) || !isfinite(pdata[pixel])) {
1652 pbpm[pixel] = CPL_BINARY_1;
1658 cpl_image_reject_from_mask(data_img, mask_tot);
1659 cpl_image_reject_from_mask(error_img, mask_tot);
1663 cpl_mask_delete(mask_tot);
1664 cpl_mask_delete(dqual_msk);
1665 cpl_imagelist_delete(data_iml);
1666 cpl_imagelist_delete(error_iml);
1667 cpl_imagelist_delete(confm_iml);
1670 return cpl_error_get_code();
1678static cpl_error_code
1679eris_load_and_error_cube_robert(
const char* fname,
const cpl_mask* bad_pixel_map,
1680 const char* method,
const double kappa,
const int niter,
const cpl_size kkk,
1681 hdrl_imagelist** science_images){
1684 cpl_imagelist * data_iml = cpl_imagelist_load(fname, CPL_TYPE_DOUBLE, 1);
1685 cpl_imagelist * error_iml = cpl_imagelist_load(fname, CPL_TYPE_DOUBLE, 2);
1686 cpl_mask * dqual_msk = cpl_mask_load(fname, 0, 3);
1687 cpl_imagelist * confm_iml = cpl_imagelist_load(fname, CPL_TYPE_DOUBLE, 4);
1689 double* pconf_img = cpl_image_get_data_double(cpl_imagelist_get(confm_iml,0));
1691 cpl_binary* pbpm = cpl_mask_get_data(dqual_msk);
1693 cpl_size sx = cpl_mask_get_size_x(dqual_msk);
1694 cpl_size sy = cpl_mask_get_size_y(dqual_msk);
1695 cpl_size sz = cpl_imagelist_get_size(data_iml);
1697 cpl_mask* mask_tot = cpl_mask_duplicate(dqual_msk);
1699 cpl_mask_or(mask_tot, bad_pixel_map);
1701 double* pdata = NULL;
1702 cpl_image * data_img = NULL;
1703 cpl_image * error_img = NULL;
1706 eris_print_rec_status(10);
1708 for (cpl_size k = 0; k < sz; k++) {
1710 eris_print_rec_status(11);
1711 data_img = cpl_imagelist_get(data_iml,k);
1712 eris_print_rec_status(12);
1713 error_img = cpl_imagelist_get(error_iml,k);
1714 eris_print_rec_status(13);
1715 pdata = cpl_image_get_data(cpl_imagelist_get(data_iml,k));
1716 eris_print_rec_status(14);
1718 for (cpl_size j = 0; j < sy; j++) {
1721 for (cpl_size i = 0; i < sx; i++) {
1724 if((pconf_img[pixel] == 0) || !isfinite(pdata[pixel])) {
1725 pbpm[pixel] = CPL_BINARY_1;
1731 cpl_image_reject_from_mask(data_img, mask_tot);
1732 cpl_image_reject_from_mask(error_img, mask_tot);
1737 cpl_mask_delete(mask_tot);
1738 cpl_mask_delete(dqual_msk);
1739 const hdrl_parameter * collapse_par;
1741 if (strcmp(method,
"median") == 0) {
1744 cpl_msg_info(cpl_func,
"kappa: %g niter: %d",kappa, niter);
1747 hdrl_image* image_mean;
1748 cpl_image* conf_map_mean;
1750 hdrl_image* collapsed = NULL;
1751 cpl_image* contribution_map;
1755 const char* filename = cpl_sprintf(
"sci_mean_%lld.fits", kkk);
1756 cpl_image_save(
hdrl_image_get_image(image_mean), filename, CPL_TYPE_DOUBLE, NULL, CPL_IO_DEFAULT);
1759 filename = cpl_sprintf(
"sci_mean_clip_%lld.fits", kkk);
1760 cpl_image_save(
hdrl_image_get_image(collapsed), filename, CPL_TYPE_DOUBLE, NULL, CPL_IO_DEFAULT);
1764 cpl_image_delete(conf_map_mean);
1765 cpl_image_delete(contribution_map);
1767 cpl_imagelist_delete(data_iml);
1768 cpl_imagelist_delete(error_iml);
1769 cpl_imagelist_delete(confm_iml);
1773 return cpl_error_get_code();
1788static cpl_error_code
1789eris_load_data_and_error_simple(
const char* fname,
const cpl_size kk,
const cpl_mask* bad_pixel_map,
1790 hdrl_imagelist** science_images)
1793 cpl_ensure_code(fname, CPL_ERROR_NULL_INPUT);
1794 cpl_image * data_img = cpl_image_load(fname, CPL_TYPE_DOUBLE, 0, 1);
1795 cpl_image * error_img = cpl_image_load(fname, CPL_TYPE_DOUBLE, 0, 2);
1796 cpl_mask* dqual_msk = cpl_mask_load(fname, 0, 3);
1797 cpl_image* confm_img = cpl_image_load(fname, CPL_TYPE_DOUBLE, 0, 4);
1798 double* pdata = cpl_image_get_data(data_img);
1799 double* pconf_img = cpl_image_get_data_double(confm_img);
1800 cpl_binary* pbpm = cpl_mask_get_data(dqual_msk);
1801 cpl_size sx = cpl_image_get_size_x(confm_img);
1802 cpl_size sy = cpl_image_get_size_y(confm_img);
1805 for (cpl_size j = 0; j < sy; j++) {
1808 for (cpl_size i = 0; i < sx; i++) {
1811 if((pconf_img[pixel] == 0) || !isfinite(pdata[pixel])) {
1812 pbpm[pixel] = CPL_BINARY_1;
1818 cpl_mask* mask_tot = cpl_mask_duplicate(dqual_msk);
1820 cpl_mask_or(mask_tot, bad_pixel_map);
1822 cpl_image_reject_from_mask(data_img, mask_tot);
1823 cpl_image_reject_from_mask(error_img, mask_tot);
1831 cpl_image_delete(data_img);
1832 cpl_image_delete(error_img);
1833 cpl_mask_delete(mask_tot);
1834 cpl_mask_delete(dqual_msk);
1835 cpl_image_delete(confm_img);
1839 double median=0, mean=0, stdev=0,tmean=0, tstd=0, mad=0, min_val=0, max_val=0;
1846 &median, &mean, &stdev, &tmean, &tstd, &mad, &min_val, &max_val
1849 cpl_msg_info(cpl_func,
"process file: %s", fname);
1850 cpl_msg_info(cpl_func,
"Median=%.3f, Mean=%.3f, StdDev=%.3f "
1851 "Trimmed: Mean=%.3f, StdDev=%.3f, MAD=%.3f "
1852 "Range: [%.3f, %.3f]", median, mean, stdev, tmean, tstd, mad, min_val, max_val);
1855 return cpl_error_get_code();
1869static cpl_error_code
1870eris_load_data_and_crea_error(
const char* fname,
const cpl_size kk,
const cpl_mask* bad_pixel_map,
1871 hdrl_imagelist** science_images)
1873 cpl_ensure_code(fname, CPL_ERROR_NULL_INPUT);
1874 cpl_image * data_img = NULL;
1875 cpl_image * error_img = NULL;
1876 cpl_msg_info(cpl_func,
"sci data with less than 4 extensions");
1877 data_img = cpl_image_load(fname, CPL_TYPE_DOUBLE, 0, 0);
1879 cpl_msg_error(cpl_func,
"Failed to load frame %s", fname);
1881 return cpl_error_get_code();
1883 double* pdata = NULL;
1884 cpl_mask * dqual_msk = NULL;
1885 pdata = cpl_image_get_data(data_img);
1886 dqual_msk = cpl_image_get_bpm(data_img);
1887 cpl_size sx = cpl_image_get_size_x(data_img);
1888 cpl_size sy = cpl_image_get_size_y(data_img);
1889 cpl_binary* pbpm = cpl_mask_get_data(dqual_msk);
1892 for (cpl_size j = 0; j < sy; j++) {
1894 for (cpl_size i = 0; i < sx; i++) {
1896 if(!isfinite(pdata[pixel])) {
1897 pbpm[pixel] = CPL_BINARY_1;
1902 cpl_mask* mask_tot = cpl_mask_duplicate(dqual_msk);
1904 cpl_mask_or(mask_tot, bad_pixel_map);
1907 cpl_image_reject_from_mask(data_img, mask_tot);
1910 error_img = cpl_image_duplicate(data_img);
1911 cpl_image_abs(error_img);
1912 cpl_image_add_scalar(error_img, 1.0);
1913 cpl_image_power(error_img, 0.5);
1919 cpl_image_delete(data_img);
1920 cpl_image_delete(error_img);
1921 cpl_mask_delete(mask_tot);
1924 return cpl_error_get_code();
1939static cpl_error_code
1940eris_locate_and_mask_sources(hdrl_imagelist* skysub_images,
const cpl_image* bpm_image,
1941 const cpl_parameterlist* parlist,
const char* prefix, cpl_mask** source_masks)
1943 cpl_msg_info(cpl_func,
"Detecting sources...");
1949 const hdrl_catalogue_options opt = HDRL_CATALOGUE_SEGMAP;
1954 for (
int i = 0; i < num_tot_images; i++) {
1958 cpl_mask *bpm = cpl_mask_threshold_image_create(bpm_image, 0, INT_MAX);
1959 cpl_image_reject_from_mask(data, bpm);
1960 cpl_mask_delete(bpm);
1962 source_masks[i] = eris_detect_sources_hdrl_catalogue(data, par_cat);
1969 cpl_mask* bad_pixel_map = cpl_mask_threshold_image_create(bpm_image, 0.5, DBL_MAX);
1971 int nsources = cpl_mask_count(source_masks[i]) - cpl_mask_count(bad_pixel_map);
1972 cpl_msg_info(cpl_func,
" Frame %d: detected %d source pixels", i+1, nsources);
1974 cpl_mask_delete(bad_pixel_map);
1977 for (
int i = 0; i < num_tot_images; i++) {
1981 cpl_mask *bpm = cpl_mask_threshold_image_create(bpm_image, 0, INT_MAX);
1982 cpl_image_reject_from_mask(data, bpm);
1983 cpl_mask_delete(bpm);
1985 source_masks[i] = eris_detect_sources_hdrl_catalogue(data, par_cat);
1988 cpl_mask* bad_pixel_map = cpl_mask_threshold_image_create(bpm_image, 0.5, DBL_MAX);
1990 int nsources = cpl_mask_count(source_masks[i]) - cpl_mask_count(bad_pixel_map);
1991 cpl_msg_info(cpl_func,
" Frame %d: detected %d source pixels", i+1, nsources);
1993 cpl_mask_delete(bad_pixel_map);
1998 for (
int i = 0; i < num_tot_images; i++) {
2001 char* fname = cpl_sprintf(
"check_data_%d.fits",i);
2002 cpl_image_save(data, fname, CPL_TYPE_DOUBLE, NULL, CPL_IO_DEFAULT);
2006 source_masks[i] = eris_detect_sources_hdrl_catalogue(data, par_cat);
2011 int nsources = cpl_mask_count(source_masks[i]);
2012 cpl_msg_info(cpl_func,
" Frame %d: detected %d source pixels", i+1, nsources);
2015 for (
int i = 0; i < num_tot_images; i++) {
2019 source_masks[i] = eris_detect_sources_hdrl_catalogue(data, par_cat);
2021 int nsources = cpl_mask_count(source_masks[i]);
2022 cpl_msg_info(cpl_func,
" Frame %d: detected %d source pixels", i+1, nsources);
2030 return cpl_error_get_code();
2049static cpl_error_code
2050eris_locate_and_mask_sources2( located_imagelist * jitters,
const cpl_image* bpm_image,
2051 const cpl_parameterlist* parlist,
const char* prefix, cpl_mask** source_masks)
2053 cpl_msg_info(cpl_func,
"Detecting sources...");
2054 cpl_size num_tot_images = jitters->size;
2055 cpl_msg_info(cpl_func,
"num_tot_images3: %lld",num_tot_images);
2059 const hdrl_catalogue_options opt = HDRL_CATALOGUE_SEGMAP;
2064 for (
int i = 0; i < num_tot_images; i++) {
2068 cpl_mask *bpm = cpl_mask_threshold_image_create(bpm_image, 0, INT_MAX);
2069 cpl_image_reject_from_mask(data, bpm);
2070 cpl_mask_delete(bpm);
2072 source_masks[i] = eris_detect_sources_hdrl_catalogue(data, par_cat);
2079 cpl_mask* bad_pixel_map = cpl_mask_threshold_image_create(bpm_image, 0.5, DBL_MAX);
2081 int nsources = cpl_mask_count(source_masks[i]) - cpl_mask_count(bad_pixel_map);
2082 cpl_msg_info(cpl_func,
" Frame %d: detected %d source pixels", i+1, nsources);
2084 cpl_mask_delete(bad_pixel_map);
2087 for (
int i = 0; i < num_tot_images; i++) {
2091 cpl_mask *bpm = cpl_mask_threshold_image_create(bpm_image, 0, INT_MAX);
2092 cpl_image_reject_from_mask(data, bpm);
2093 cpl_mask_delete(bpm);
2095 source_masks[i] = eris_detect_sources_hdrl_catalogue(data, par_cat);
2098 cpl_mask* bad_pixel_map = cpl_mask_threshold_image_create(bpm_image, 0.5, DBL_MAX);
2100 int nsources = cpl_mask_count(source_masks[i]) - cpl_mask_count(bad_pixel_map);
2101 cpl_msg_info(cpl_func,
" Frame %d: detected %d source pixels", i+1, nsources);
2103 cpl_mask_delete(bad_pixel_map);
2108 for (
int i = 0; i < num_tot_images; i++) {
2112 source_masks[i] = eris_detect_sources_hdrl_catalogue(data, par_cat);
2117 int nsources = cpl_mask_count(source_masks[i]);
2118 cpl_msg_info(cpl_func,
" Frame %d: detected %d source pixels", i+1, nsources);
2121 for (
int i = 0; i < num_tot_images; i++) {
2125 source_masks[i] = eris_detect_sources_hdrl_catalogue(data, par_cat);
2127 int nsources = cpl_mask_count(source_masks[i]);
2128 cpl_msg_info(cpl_func,
" Frame %d: detected %d source pixels", i+1, nsources);
2136 return cpl_error_get_code();
2149static cpl_error_code
2150eris_first_sky_sub(
const hdrl_imagelist* science_images,
const hdrl_image* sky_flat_0,
2151 hdrl_imagelist** skysub_images)
2154 cpl_msg_info(cpl_func,
"Subtracting first-pass sky flat...");
2158 hdrl_value scale = {0, 0};
2160 for (cpl_size i = 0; i < num_tot_images; i++) {
2169 scale.data = med_img.data / med_sky_0.data;
2170 cpl_msg_warning(cpl_func,
"1st frame: %lld med_img.data: %g med_sky_0.data: %g scale.data: %g",
2171 i, med_img.data, med_sky_0.data, scale.data);
2177 fname = cpl_sprintf(
"sci_%lld.fits",i);
2182 fname = cpl_sprintf(
"scaled_sky_0_%lld.fits",i);
2192 fname = cpl_sprintf(
"sci_skysub_1st_%03lld.fits",i);
2204 return cpl_error_get_code();
2207#define HDRL_USE_PRIVATE YES
2219static hdrl_image * eris_create_sky_flat_first(
2220 hdrl_imagelist * image_list,
2222 const char * method,
2225 const cpl_size plane_id)
2227 hdrl_image * result = NULL;
2229 hdrl_imagelist * masked_list = NULL;
2230 hdrl_parameter * collapse_par = NULL;
2231 cpl_image* contrib = NULL;
2233 cpl_ensure(image_list, CPL_ERROR_NULL_INPUT, NULL);
2234 cpl_ensure(method, CPL_ERROR_NULL_INPUT, NULL);
2237 cpl_ensure(num_images > 0, CPL_ERROR_ILLEGAL_INPUT, NULL);
2238 cpl_msg_warning(cpl_func,
"kappa: %g niter: %d", kappa, niter);
2243 for (
int i = 0; i < num_images; i++) {
2251 cpl_mask_or(mask,bpm);
2252 cpl_image_reject_from_mask(data, mask);
2258 masked_list = image_list;
2262 if (strcmp(method,
"median") == 0) {
2265 cpl_msg_info(cpl_func,
"kappa: %g niter: %d",kappa, niter);
2274 fname = cpl_sprintf(
"sky_flat_1st.fits");
2276 fname = cpl_sprintf(
"sky_flat_1st_plane_%3.3lld.fits",plane_id);
2285 cpl_image_delete(contrib);
2294static hdrl_image * eris_create_sky_flat_first2(
2295 located_imagelist * jitters,
2296 located_imagelist ** sky_1st,
2298 const char * method,
2301 const cpl_size plane_id)
2303 hdrl_image * result = NULL;
2306 hdrl_imagelist * masked_list = NULL;
2307 hdrl_parameter * collapse_par = NULL;
2309 cpl_ensure(jitters, CPL_ERROR_NULL_INPUT, NULL);
2310 cpl_ensure(method, CPL_ERROR_NULL_INPUT, NULL);
2311 eris_print_rec_status(0);
2312 int num_images = jitters->size;
2313 cpl_ensure(num_images > 0, CPL_ERROR_ILLEGAL_INPUT, NULL);
2314 cpl_msg_warning(cpl_func,
"kappa: %g niter: %d", kappa, niter);
2316 eris_print_rec_status(1);
2320 eris_print_rec_status(2);
2321 for (
int i = 0; i < num_images; i++) {
2326 cpl_mask_or(mask,bpm);
2327 cpl_image_reject_from_mask(data, mask);
2328 cpl_image_reject_from_mask(errs, mask);
2331 eris_print_rec_status(3);
2333 eris_print_rec_status(4);
2334 for (
int i = 0; i < num_images; i++) {
2343 eris_print_rec_status(5);
2347 if (strcmp(method,
"median") == 0) {
2350 cpl_msg_info(cpl_func,
"kappa: %g niter: %d",kappa, niter);
2353 eris_print_rec_status(6);
2356 for (
int i = 0; i < num_images; i++) {
2359 (*sky_1st)->limages[i]->confidence = cpl_image_duplicate(contrib);
2361 eris_print_rec_status(7);
2365 fname = cpl_sprintf(
"sky_flat_1st.fits");
2367 fname = cpl_sprintf(
"sky_flat_1st_plane_%3.3lld.fits",plane_id);
2374 eris_print_rec_status(8);
2376 cpl_image_delete(contrib);
2379 for (
int i = num_images-1; i >= 0; i--) {
2399static hdrl_image * eris_create_sky_flat_final(
2400 hdrl_imagelist * image_list,
2402 const char * method,
2405 const cpl_size plane_id,
2406 cpl_image** contrib)
2408 hdrl_image * result = NULL;
2409 hdrl_imagelist * masked_list = NULL;
2410 hdrl_parameter * collapse_par = NULL;
2413 cpl_ensure(image_list, CPL_ERROR_NULL_INPUT, NULL);
2414 cpl_ensure(method, CPL_ERROR_NULL_INPUT, NULL);
2417 cpl_ensure(num_images > 0, CPL_ERROR_ILLEGAL_INPUT, NULL);
2423 for (
int i = 0; i < num_images; i++) {
2436 cpl_mask_or(msk,masks[i]);
2437 cpl_image_reject_from_mask(data, msk);
2438 cpl_image_reject_from_mask(errs, msk);
2442 fname = cpl_sprintf(
"mask_%d.fits",i);
2444 fname = cpl_sprintf(
"mask_%d_%3.3lld.fits",i,plane_id);
2447 cpl_mask_save(masks[i], fname, NULL, CPL_IO_DEFAULT);
2455 masked_list = image_list;
2459 if (strcmp(method,
"median") == 0) {
2471 fname = cpl_sprintf(
"sky_flat_2nd.fits");
2473 fname = cpl_sprintf(
"sky_flat_2nd_plane_%3.3lld.fits",plane_id);
2484 if (masks && masked_list) {
2493static hdrl_image * eris_create_sky_flat_final2(
2494 located_imagelist * jitters,
2495 located_imagelist ** sky_2nd,
2497 const char * method,
2500 const cpl_size plane_id)
2502 hdrl_image * result = NULL;
2503 hdrl_imagelist * masked_list = NULL;
2504 hdrl_parameter * collapse_par = NULL;
2505 cpl_image* contrib = NULL;
2507 cpl_ensure(jitters, CPL_ERROR_NULL_INPUT, NULL);
2508 cpl_ensure(method, CPL_ERROR_NULL_INPUT, NULL);
2510 cpl_size num_images = jitters->size;
2511 cpl_ensure(num_images > 0, CPL_ERROR_ILLEGAL_INPUT, NULL);
2512 cpl_msg_info(cpl_func,
"num_images: %lld",num_images);
2514 cpl_msg_warning(cpl_func,
"step1");
2518 for (
int i = 0; i < num_images; i++) {
2523 cpl_image_reject_from_mask(data, masks[i]);
2527 fname = cpl_sprintf(
"mask_%d.fits",i);
2529 fname = cpl_sprintf(
"mask_%d_%3.3lld.fits",i,plane_id);
2532 cpl_mask_save(masks[i], fname, NULL, CPL_IO_DEFAULT);
2540 for (
int i = 0; i < num_images; i++) {
2544 cpl_msg_warning(cpl_func,
"step2");
2547 if (strcmp(method,
"median") == 0) {
2552 cpl_msg_warning(cpl_func,
"step3");
2559 fname = cpl_sprintf(
"sky_flat_2nd.fits");
2561 fname = cpl_sprintf(
"sky_flat_2nd_plane_%3.3lld.fits",plane_id);
2568 cpl_msg_warning(cpl_func,
"step4");
2570 for (
int i = 0; i < num_images; i++) {
2572 (*sky_2nd)->limages[i]->confidence = contrib;
2573 (*sky_2nd)->limages[i]->bkg = result;
2575 cpl_msg_warning(cpl_func,
"step5");
2578 if (contrib != NULL) {
2579 cpl_image_delete(contrib);
2584 if (masks && masked_list) {
2585 for (
int i = num_images-1; i >= 0; i--) {
2595static cpl_mask * eris_detect_sources_hdrl_catalogue(
2596 const cpl_image * image,
2600 cpl_mask * mask_res = NULL;
2616 double max = cpl_image_get_max(res->segmentation_map);
2617 mask_res = cpl_mask_threshold_image_create(res->segmentation_map, 0.9, max + 0.1);
2631static cpl_mask * eris_dilate_mask(
2632 const cpl_mask * input_mask,
2635 cpl_mask * result = NULL;
2636 cpl_mask * temp = NULL;
2639 cpl_ensure(input_mask, CPL_ERROR_NULL_INPUT, NULL);
2640 cpl_ensure(radius > 0, CPL_ERROR_ILLEGAL_INPUT, NULL);
2642 nx = cpl_mask_get_size_x(input_mask);
2643 ny = cpl_mask_get_size_y(input_mask);
2645 result = cpl_mask_duplicate(input_mask);
2648 for (
int iter = 0; iter < radius; iter++) {
2649 temp = cpl_mask_duplicate(result);
2651 for (cpl_size j = 2; j < ny - 1; j++) {
2652 for (cpl_size i = 2; i < nx - 1; i++) {
2653 if (cpl_mask_get(temp, i, j) ||
2654 cpl_mask_get(temp, i-1, j) ||
2655 cpl_mask_get(temp, i+1, j) ||
2656 cpl_mask_get(temp, i, j-1) ||
2657 cpl_mask_get(temp, i, j+1)) {
2658 cpl_mask_set(result, i, j, CPL_BINARY_1);
2662 cpl_mask_delete(temp);
2700eris_image_stats(
const hdrl_image *in_image,
2703 const cpl_mask *mask,
2704 double trim_fraction,
2714 cpl_ensure_code(in_image, CPL_ERROR_NULL_INPUT);
2715 cpl_ensure_code(median, CPL_ERROR_NULL_INPUT);
2716 cpl_ensure_code(mean, CPL_ERROR_NULL_INPUT);
2717 cpl_ensure_code(stdev, CPL_ERROR_NULL_INPUT);
2718 cpl_ensure_code(tmean, CPL_ERROR_NULL_INPUT);
2719 cpl_ensure_code(tstd, CPL_ERROR_NULL_INPUT);
2720 cpl_ensure_code(mad, CPL_ERROR_NULL_INPUT);
2721 cpl_ensure_code(min_val, CPL_ERROR_NULL_INPUT);
2722 cpl_ensure_code(max_val, CPL_ERROR_NULL_INPUT);
2725 cpl_image *work_img = NULL;
2726 cpl_vector *data_vec = NULL;
2729 work_img = cpl_image_duplicate(img);
2731 return cpl_error_set_message(cpl_func, CPL_ERROR_ILLEGAL_OUTPUT,
2732 "Failed to duplicate image");
2737 cpl_image_reject_from_mask(work_img, mask);
2745 *median = median0.data;
2750 cpl_size nx = cpl_image_get_size_x(work_img);
2751 cpl_size ny = cpl_image_get_size_y(work_img);
2752 cpl_size npix = nx * ny;
2755 const cpl_mask *rej_mask = cpl_image_get_bpm_const(work_img);
2756 cpl_size nvalid = npix;
2758 nvalid = npix - cpl_mask_count(rej_mask);
2762 cpl_image_delete(work_img);
2763 return cpl_error_set_message(cpl_func, CPL_ERROR_DATA_NOT_FOUND,
2764 "No valid pixels in image");
2768 data_vec = cpl_vector_new(nvalid);
2770 for (cpl_size j = 1; j <= ny; j++) {
2771 for (cpl_size i = 1; i <= nx; i++) {
2772 int is_rejected = 0;
2773 double val = cpl_image_get(work_img, i, j, &is_rejected);
2774 if (!is_rejected && isfinite(val)) {
2775 cpl_vector_set(data_vec, idx, val);
2783 cpl_vector *tmp = cpl_vector_extract(data_vec, 0, idx - 1, 1);
2784 cpl_vector_delete(data_vec);
2790 cpl_vector_sort(data_vec, CPL_SORT_ASCENDING);
2791 cpl_size trim_count = (cpl_size)(trim_fraction * nvalid);
2792 if (trim_count * 2 >= nvalid) {
2796 double tmean0_10 = 0.0;
2797 if (trim_count > 0) {
2799 cpl_vector *trimmed = cpl_vector_extract(data_vec, trim_count,
2800 nvalid - trim_count - 1, 1);
2801 tmean0_10 = cpl_vector_get_mean(trimmed);
2802 cpl_vector_delete(trimmed);
2804 tmean0_10 = cpl_vector_get_mean(data_vec);
2808 double rmin = tmean0_10 - l_sig * (*stdev);
2809 double rmax = tmean0_10 + u_sig * (*stdev);
2812 cpl_size nclipped = 0;
2813 double sum_clipped = 0.0;
2814 double sum_sq_clipped = 0.0;
2816 for (cpl_size i = 0; i < nvalid; i++) {
2817 double val = cpl_vector_get(data_vec, i);
2818 if (val >= rmin && val <= rmax) {
2820 sum_sq_clipped += val * val;
2826 *tmean = sum_clipped / nclipped;
2829 double variance = (sum_sq_clipped - sum_clipped * sum_clipped / nclipped)
2831 *tstd = (variance > 0.0) ? sqrt(variance) : 0.0;
2843 cpl_vector *abs_dev = cpl_vector_duplicate(data_vec);
2844 cpl_vector_subtract_scalar(abs_dev, *median);
2845 for (cpl_size i = 0; i < nvalid; i++) {
2846 double val = cpl_vector_get(abs_dev, i);
2847 cpl_vector_set(abs_dev, i, fabs(val));
2849 cpl_vector_sort(abs_dev, CPL_SORT_ASCENDING);
2860 *mad = cpl_vector_get_median(abs_dev);
2862 cpl_vector_delete(abs_dev);
2865 *min_val = cpl_vector_get_min(data_vec);
2866 *max_val = cpl_vector_get_max(data_vec);
2869 cpl_vector_delete(data_vec);
2870 cpl_image_delete(work_img);
2872 return CPL_ERROR_NONE;
cpl_error_code enu_dfs_save_limage(cpl_frameset *allframes, const cpl_parameterlist *parlist, const cpl_frameset *provenance, const cpl_boolean prov_raw, const located_image *limage, const char *recipe, const cpl_frame *inherit, cpl_propertylist *applist, const char *pipe_id, const char *filename)
Save a located image structure to a MEF.
void enu_located_imagelist_delete(located_imagelist *limlist)
Delete a located_imagelist and its contents.
cpl_error_code enu_located_imagelist_insert(located_imagelist *limlist, located_image *limage, cpl_size position)
Insert a located_image at a specified point in a located_imagelist.
located_image * enu_load_limage_from_frame(const cpl_frame *frame, cpl_image **pcopyconf, const cpl_boolean collapse_cube)
Load components of a located_image from a frame.
located_imagelist * enu_located_imagelist_duplicate(const located_imagelist *limlist)
Make a deep copy of a located_imagelist and its contents.
cpl_error_code enu_get_ra_dec(const cpl_wcs *wcs, double *ra, double *dec)
Get RA and Dec at centre of image with given wcs.
cpl_error_code enu_debug_limlist_save(const int debug, const located_imagelist *limlist, const char *nameroot, const char *recipename, cpl_frameset *frameset, const cpl_parameterlist *parlist, const cpl_frameset *used)
Save a list of intermediate image results for use in debugging.
located_imagelist * enu_limlist_load_from_frameset(cpl_frameset *frameset, const char *tag, cpl_frameset *used)
Load tagged data from a frameset into a located_imagelist.
char * enu_repreface(const char *filename, const char *preface)
Preface a raw filename with a string.
located_imagelist * enu_located_imagelist_new(cpl_size size)
Return a pointer to a new located_imagelist.
const char * eris_pfits_get_frame_format(const cpl_propertylist *plist)
find out the frame format (DET FRAM FORMAT) value
cpl_error_code eris_check_error_code(const char *func_id)
handle CPL errors
cpl_frameset * eris_dfs_extract_frames_with_tag(cpl_frameset *input, const char *rtag)
Extract frames of user given tag.
hdrl_catalogue_result * hdrl_catalogue_compute(const cpl_image *image_, const cpl_image *confidence_map, const cpl_wcs *wcs, hdrl_parameter *param_)
build object catalog
void hdrl_catalogue_result_delete(hdrl_catalogue_result *result)
delete hdrl parameter result object
hdrl_parameter * hdrl_catalogue_parameter_parse_parlist(const cpl_parameterlist *parlist, const char *prefix)
Parse parameter list to create input parameters for the catalogue.
cpl_error_code hdrl_catalogue_parameter_set_option(hdrl_parameter *par, hdrl_catalogue_options opt)
set result option of catalogue parameter
hdrl_parameter * hdrl_collapse_sigclip_parameter_create(double kappa_low, double kappa_high, int niter)
create a parameter object for sigclipped mean
hdrl_parameter * hdrl_collapse_median_parameter_create(void)
create a parameter object for median
cpl_error_code hdrl_image_sub_image(hdrl_image *self, const hdrl_image *other)
Subtract two images, store the result in the first image.
hdrl_value hdrl_image_get_median(const hdrl_image *self)
computes the median and associated error of an image.
cpl_error_code hdrl_image_mul_scalar(hdrl_image *self, hdrl_value value)
Elementwise multiplication of an image with a scalar.
hdrl_image * hdrl_image_duplicate(const hdrl_image *himg)
copy hdrl_image
double hdrl_image_get_stdev(const hdrl_image *self)
computes the standard deviation of the data of an image
cpl_mask * hdrl_image_get_mask(hdrl_image *himg)
get cpl bad pixel mask from image
cpl_image * hdrl_image_get_error(hdrl_image *himg)
get error as cpl image
hdrl_value hdrl_image_get_mean(const hdrl_image *self)
computes mean pixel value and associated error of an image.
cpl_size hdrl_image_get_size_y(const hdrl_image *self)
return size of Y dimension of image
const cpl_mask * hdrl_image_get_mask_const(const hdrl_image *himg)
get cpl bad pixel mask from image
cpl_size hdrl_image_get_size_x(const hdrl_image *self)
return size of X dimension of image
const cpl_image * hdrl_image_get_error_const(const hdrl_image *himg)
get error as cpl image
hdrl_image * hdrl_image_create(const cpl_image *image, const cpl_image *error)
create a new hdrl_image from to existing images by copying them
cpl_image * hdrl_image_get_image(hdrl_image *himg)
get data as cpl image
const cpl_image * hdrl_image_get_image_const(const hdrl_image *himg)
get data as cpl image
void hdrl_image_delete(hdrl_image *himg)
delete hdrl_image
cpl_error_code hdrl_imagelist_collapse_mean(const hdrl_imagelist *himlist, hdrl_image **out, cpl_image **contrib)
Mean collapsing of image list.
hdrl_image * hdrl_imagelist_unset(hdrl_imagelist *himlist, cpl_size pos)
Remove an image from an imagelist.
cpl_error_code hdrl_imagelist_set(hdrl_imagelist *himlist, hdrl_image *himg, cpl_size pos)
Insert an image into an imagelist.
void hdrl_imagelist_delete(hdrl_imagelist *himlist)
Free all memory used by a hdrl_imagelist object including the images.
const hdrl_image * hdrl_imagelist_get_const(const hdrl_imagelist *himlist, cpl_size inum)
Get an image from a list of images.
cpl_size hdrl_imagelist_get_size(const hdrl_imagelist *himlist)
Get the number of images in the imagelist.
cpl_error_code hdrl_imagelist_collapse(const hdrl_imagelist *himlist, const hdrl_parameter *param, hdrl_image **out, cpl_image **contrib)
collapsing of image list
hdrl_imagelist * hdrl_imagelist_new(void)
Create an empty imagelist.
hdrl_image * hdrl_imagelist_get(const hdrl_imagelist *himlist, cpl_size inum)
Get an image from a list of images.
void hdrl_parameter_delete(hdrl_parameter *obj)
shallow delete of a parameter