39 #include "omega_flats.h"
40 #include "omega_fftw.h"
41 #include "omega_dfs.h"
42 #include "omega_pfits.h"
43 #include "omega_utils.h"
44 #include "omega_stats.h"
74 cpl_mask *bpmmap, cpl_parameterlist *pars)
80 double gausfilt = 9.0;
83 cpl_image *dome_low_image;
87 if((dome == NULL) || (twil == NULL) || (pars == NULL))
92 par = cpl_parameterlist_find(pars,
"omega.omega_mflat.GaussianFiltSize") ;
93 gausfilt = cpl_parameter_get_double(par) ;
95 par = cpl_parameterlist_find(pars,
"omega.omega_mflat.MirrorXpix") ;
96 dx = cpl_parameter_get_int(par) ;
98 par = cpl_parameterlist_find(pars,
"omega.omega_mflat.MirrorYpix") ;
99 dy = cpl_parameter_get_int(par) ;
102 cpl_msg_info (cpl_func,
"Working on low spatial frequency component of flat.");
106 if (twil_comp == NULL) {
107 cpl_msg_error (cpl_func,
"Error in low spatial frequency calculation");
112 cpl_msg_info (cpl_func,
"Working on high spatial frequency component of flat");
114 if (dome_low_image == NULL) {
115 cpl_msg_error (cpl_func,
"Error in high spatial frequency calculation");
116 freeimage(twil_comp);
120 dome_comp = cpl_image_divide_create(dome, dome_low_image);
121 if (dome_comp == NULL) {
122 cpl_msg_error(cpl_func,
"Error in division. <%s>",cpl_error_get_message());
123 freeimage(twil_comp);
124 freeimage(dome_low_image);
127 freeimage(dome_low_image);
130 cpl_image_multiply(twil_comp, dome_comp);
131 freeimage(dome_comp);
134 cpl_image_reject_from_mask(twil_comp, bpmmap);
138 if (cpl_image_normalise(twil_comp, CPL_NORM_MEAN) != CPL_ERROR_NONE){
139 cpl_msg_error (cpl_func,
"Image is NULL in normalization step. <%s>",cpl_error_get_message());
140 freeimage(twil_comp);
162 const cpl_parameterlist *fpars)
178 const char *text = NULL;
180 const cpl_parameter *par;
187 cpl_mask *map, *bpmap;
192 if((sci == NULL) || (fringe == NULL) || (bpm == NULL) || (fpars == NULL))
196 par = cpl_parameterlist_get_first_const(fpars);
198 for(i=0; i<npars; i++) {
199 text = cpl_parameter_get_alias(par,CPL_PARAMETER_MODE_CLI);
200 if(strcmp(
"sigma-fringes", text) == 0) {
201 scale = cpl_parameter_get_double(par) ;
203 else if(strcmp(
"lfringes", text) == 0) {
204 lthre = cpl_parameter_get_double(par) ;
206 else if(strcmp(
"hfringes", text) == 0) {
207 hthre = cpl_parameter_get_double(par) ;
210 par = cpl_parameterlist_get_next_const(fpars);
215 stats = cpl_stats_new_from_image(sci, CPL_STATS_ALL);
219 median = cpl_stats_get_median(stats);
220 stdev = cpl_stats_get_stdev(stats);
223 bpmap = cpl_mask_threshold_image_create(bpm, 0.5, 1.5);
224 map = cpl_mask_threshold_image_create(sci,median-(scale*stdev),median+(scale*stdev));
225 cpl_mask_and(bpmap, map);
226 cpl_mask_delete(map);
231 ff = cpl_image_duplicate(fringe);
232 stats = cpl_stats_new_from_image(ff, CPL_STATS_ALL);
236 median = cpl_stats_get_median(stats);
237 stdev = cpl_stats_get_stdev(stats);
240 bin1 = cpl_mask_threshold_image_create(ff, median-(hthre*stdev), median-(lthre*stdev));
241 bin2 = cpl_mask_threshold_image_create(ff, median+(lthre*stdev), median+(hthre*stdev));
243 code = cpl_mask_or(bin1, bin2);
244 if(code != CPL_ERROR_NONE) {
245 cpl_msg_debug(cpl_func,
"Error in bit-wise OR operation");
253 code = cpl_mask_and(bpmap, bin1);
254 if(code != CPL_ERROR_NONE) {
255 cpl_msg_debug(cpl_func,
"Error in bit-wise AND operation");
271 code = cpl_image_reject_from_mask(ff, bpmap);
272 if(code != CPL_ERROR_NONE)
273 cpl_msg_warning(cpl_func,
"Cannot set BP in fringe image");
275 stats_F = cpl_stats_new_from_image(ff, CPL_STATS_ALL);
276 mean_F = cpl_stats_get_mean(stats_F);
279 code = cpl_image_reject_from_mask(sci, bpmap);
280 if(code != CPL_ERROR_NONE)
281 cpl_msg_warning(cpl_func,
"Cannot set BP in image");
283 stats_R = cpl_stats_new_from_image(sci, CPL_STATS_ALL);
284 mean_R = cpl_stats_get_mean(stats_R);
286 N = cpl_stats_get_npix(stats_F);
288 image = cpl_image_multiply_create(sci, ff);
289 stats = cpl_stats_new_from_image(image, CPL_STATS_ALL);
290 RF = cpl_stats_get_flux(stats);
295 image = cpl_image_multiply_create(ff, ff);
296 stats = cpl_stats_new_from_image(image, CPL_STATS_ALL);
297 FF = cpl_stats_get_flux(stats);
299 a = (RF - N*mean_R*mean_F) / (FF - N*mean_F*mean_F);
302 cpl_image_multiply_scalar(ff, a);
304 cpl_image_subtract(sci, ff);
326 int omega_flatcor(cpl_image *image,
const cpl_image *flat,
const cpl_image *nsky)
330 if((image == NULL) || (flat == NULL))
335 mflat = cpl_image_multiply_create(flat, nsky);
336 cpl_image_divide(image, mflat);
340 cpl_image_divide(image, flat);
367 for(i = 0; i < n; i++){
368 cpl_image *img = cpl_imagelist_get(ilist, i);
370 cpl_mask *mask = cpl_mask_threshold_image_create(img, 0.5, 1.5);
371 cpl_image_reject_from_mask(img, mask);
374 double median = cpl_image_get_median(img);
375 cpl_image_divide_scalar(img, median);
379 nsky = cpl_imagelist_collapse_median_create(ilist);
382 cpl_image_normalise(nsky,CPL_NORM_MEAN);
385 cpl_image_multiply(nsky, bpm);
410 cpl_image_subtract_scalar(fringes, 1.0);