40 #include "omega_coadd.h"
41 #include "omega_fits.h"
42 #include "omega_dfs.h"
43 #include "omega_utils.h"
44 #include "omega_pfits.h"
75 cpl_image **
omega_jitter_stack(cpl_frameset *jset, cpl_frameset *jset_mask, cpl_bivector *offsets,
int refine,
76 cpl_parameterlist *pars,
int ext)
83 double psigmas[] = {10.0, 5.0, 2.0};
84 const int nsigmas = (int)(
sizeof(psigmas)/
sizeof(double));
85 int shx, shy, mhx, mhy, minrej, maxrej;
87 cpl_geom_combine comb_meth;
89 cpl_imagelist *ilist_mask;
92 cpl_image **combined = NULL;
93 cpl_vector * offset_x = NULL;
94 cpl_vector * offset_y = NULL;
96 if((jset == NULL) || (pars == NULL))
100 par = cpl_parameterlist_find(pars,
"omega.omega_science.xcorr") ;
101 sval = cpl_parameter_get_string(par);
103 if (sscanf(sval,
"%d,%d,%d,%d",&shx,­,&mhx,&mhy)!=4)
106 par = cpl_parameterlist_find(pars,
"omega.omega_science.CombMode");
107 sval = cpl_parameter_get_string(par);
108 if (!strcmp(sval,
"union"))
109 comb_meth = CPL_GEOM_UNION;
110 else if (!strcmp(sval,
"intersect"))
111 comb_meth = CPL_GEOM_INTERSECT;
112 else if (!strcmp(sval,
"first"))
113 comb_meth = CPL_GEOM_FIRST;
119 offset_x=cpl_bivector_get_x(offsets);
120 offset_y=cpl_bivector_get_y(offsets);
122 if (cpl_vector_get_max(offset_x)-cpl_vector_get_min(offset_x) > 3000 ||
123 cpl_vector_get_max(offset_y)-cpl_vector_get_min(offset_y) > 6000)
125 cpl_msg_warning(cpl_func,
"Dithering offsets are very large. "
126 "Combination method changed to \"first\" ");
127 comb_meth = CPL_GEOM_FIRST;
130 par = cpl_parameterlist_find(pars,
"omega.omega_science.StackRej");
131 sval = cpl_parameter_get_string(par);
132 if(sscanf(sval,
"%d,%d",&minrej,&maxrej) !=2)
135 n = cpl_frameset_get_size(jset);
136 n_mask = cpl_frameset_get_size(jset_mask);
139 cpl_vector_unwrap(sigmas);
140 cpl_msg_warning(cpl_func,
"Number of images and masks differ!");
146 sigmas = cpl_vector_wrap(nsigmas, psigmas);
149 ilist = cpl_imagelist_load_frameset(jset, CPL_TYPE_FLOAT, 1, ext);
151 cpl_vector_unwrap(sigmas);
155 ilist_mask = cpl_imagelist_load_frameset(jset_mask, CPL_TYPE_INT, 1, ext);
156 if(ilist_mask == NULL){
157 cpl_vector_unwrap(sigmas);
164 mask = cpl_mask_threshold_image_create(cpl_imagelist_get(ilist_mask,i), 0.5, 1.5);
165 cpl_image_reject_from_mask(cpl_imagelist_get(ilist,i), mask);
169 freeilist(ilist_mask);
173 combined = cpl_geom_img_offset_combine(ilist,offsets,refine,NULL,sigmas,NULL,
174 shx,shy,mhx,mhy,minrej,maxrej,comb_meth);
176 if(combined == NULL){
177 cpl_msg_debug(cpl_func,
"Error in combination function. %s",cpl_error_get_message());
178 cpl_vector_unwrap(sigmas);
184 cpl_vector_unwrap(sigmas);
205 double *offsets_x, *offsets_y;
208 cpl_propertylist *plist;
209 cpl_bivector *offsets;
211 if((
set == NULL) || (mode <= 0) || (mode > 4))
215 frame = cpl_frameset_get_first(
set);
216 plist = cpl_propertylist_load(cpl_frame_get_filename(frame), 1);
226 offsets = cpl_bivector_new(cpl_frameset_get_size(
set));
227 offsets_x = cpl_bivector_get_x_data(offsets);
228 offsets_y = cpl_bivector_get_y_data(offsets);
236 frame = cpl_frameset_get_next(
set);
240 for(i=1; i<cpl_frameset_get_size(
set); i++){
241 plist = cpl_propertylist_load(cpl_frame_get_filename(frame), 0);
244 offsets_x[i] = offsets_y[i] = 0.0;
249 offsets_y[i] = offsets_x[i];
261 frame = cpl_frameset_get_next(
set);
263 cpl_msg_debug(cpl_func,
"im=%d offset_x=%g offset_y=%g",i,offsets_x[i],offsets_y[i]);
290 const cpl_frameset * frameset,
291 const cpl_frame * ref_frame,
294 cpl_bivector * offsets;
297 const cpl_frame * this_frame;
300 cpl_propertylist *plist;
304 if (frameset == NULL){
305 cpl_error_set(cpl_func, CPL_ERROR_NULL_INPUT);
310 nfiles = cpl_frameset_get_size(frameset);
311 offsets = cpl_bivector_new(nfiles);
312 offsets_x = cpl_bivector_get_x_data(offsets);
313 offsets_y = cpl_bivector_get_y_data(offsets);
318 plist = cpl_propertylist_load_regexp(
319 cpl_frame_get_filename(ref_frame),
321 ref_wcs = cpl_wcs_new_from_propertylist(plist);
323 if(cpl_error_get_code() == CPL_ERROR_NO_WCS)
325 cpl_msg_error(__func__,
"Not compiled with WCS support.");
326 cpl_propertylist_delete(plist);
331 cpl_propertylist_delete(plist);
334 if (ref_wcs == NULL){
335 cpl_msg_error(cpl_func,
"Could not read WCS from %s",
336 cpl_frame_get_filename(ref_frame));
337 cpl_bivector_delete(offsets);
341 for (i = 0; i < nfiles; i++){
342 cpl_matrix * exp_pixel;
343 cpl_matrix * exp_equat;
344 cpl_matrix * ref_pixel;
345 cpl_array * status =NULL;
347 cpl_error_code error = CPL_ERROR_NONE;
350 exp_pixel = cpl_matrix_new(1, 2);
351 cpl_matrix_set(exp_pixel, 0, 0, 1.);
352 cpl_matrix_set(exp_pixel, 0, 1, 1.);
355 this_frame = cpl_frameset_get_frame_const(frameset, i);
356 plist = cpl_propertylist_load_regexp(
357 cpl_frame_get_filename(this_frame),
359 exp_wcs = cpl_wcs_new_from_propertylist(plist);
360 cpl_propertylist_delete(plist);
363 if (exp_wcs == NULL){
364 cpl_msg_error(cpl_func,
"Could not read WCS from %s",
365 cpl_frame_get_filename(this_frame));
366 cpl_matrix_delete(exp_pixel);
367 cpl_bivector_delete(offsets);
374 if ((error = cpl_wcs_convert(exp_wcs, exp_pixel, &exp_equat, &status,
377 cpl_msg_error(cpl_func, cpl_error_get_message_default(error));
378 cpl_matrix_delete(exp_pixel);
379 cpl_wcs_delete(exp_wcs);
380 cpl_bivector_delete(offsets);
381 cpl_array_delete(status);
384 cpl_matrix_delete(exp_pixel);
385 cpl_array_delete(status);
388 if ((error = cpl_wcs_convert(ref_wcs, exp_equat, &ref_pixel, &status,
391 cpl_msg_error(cpl_func, cpl_error_get_message_default(error));
392 cpl_matrix_delete(exp_equat);
393 cpl_wcs_delete(exp_wcs);
394 cpl_bivector_delete(offsets);
395 cpl_array_delete(status);
398 cpl_matrix_delete(exp_equat);
399 cpl_wcs_delete(exp_wcs);
400 cpl_array_delete(status);
403 offsets_x[i] = cpl_matrix_get(ref_pixel, 0, 0);
404 offsets_y[i] = cpl_matrix_get(ref_pixel, 0, 1);
406 cpl_matrix_delete(ref_pixel);
410 cpl_wcs_delete(ref_wcs);