36#include "visir_recipe.h"
45#define RECIPE_STRING "visir_util_convert_weight"
47#define VISIR_FRAME_WEIGHT 0
48#define VISIR_FRAME_ERROR 1
49#define VISIR_FRAME_VARIANCE 2
56static cpl_error_code visir_util_convert_weight_one(cpl_frameset *,
58 const cpl_frame *,
int,
59 const cpl_parameterlist *);
61cpl_recipe_define(visir_util_convert_weight, VISIR_BINARY_VERSION,
62 "Lars Lundin", PACKAGE_BUGREPORT,
"2011",
63 "Conversion between different weight maps",
64 "The files listed in the Set Of Frames (sof-file) "
66 "VISIR-weight-map.fits " VISIR_UTIL_WEIGHT_MAP
" or\n"
67 "VISIR-error-map.fits " VISIR_UTIL_ERROR_MAP
" or\n"
68 "VISIR-variance-map.fits " VISIR_UTIL_VARIANCE_MAP
"\n"
69 "VISIR-bpm-file.fits " VISIR_CALIB_BPM
" (optional)\n"
70 "\nThe relation between an error e, a weight w and a "
72 "e = sqrt(v) = 1/sqrt(w).\n"
74 "Depending on the setting of the boolean recipe parameters "
75 "each input file will cause the following product(s) to be "
76 "created (each with a FITS card 'HIERARCH " CPL_DFS_PRO_CATG
77 "' with the specified value)\n"
78 VISIR_UTIL_ERROR_MAP_PROCATG
79 ": An error map, requires input v >= 0, w > 0\n"
80 VISIR_UTIL_WEIGHT_MAP_PROCATG
81 ": A weight map, requires input e > 0, v > 0\n"
82 VISIR_UTIL_VARIANCE_MAP_PROCATG
83 ": A variance map, requires input e >= 0, w > 0\n"
84 "If for a given input the identical output is specified, "
85 "the data unit(s) may still change according to the provided "
87 "In a weight map product any bad pixel is set to 0.\n"
88 "In a variance or error map product any bad pixel is set to "
89 "the value specified by the relevant recipe option.");
112visir_util_convert_weight_fill_parameterlist(cpl_parameterlist * self)
114 const char * context = PACKAGE
"." RECIPE_STRING;
117 cpl_ensure_code(self, CPL_ERROR_NULL_INPUT);
122 err = irplib_parameterlist_set_bool(self, PACKAGE, RECIPE_STRING,
"error",
123 CPL_TRUE, NULL, context,
"Convert to "
125 cpl_ensure_code(!err, err);
129 err = irplib_parameterlist_set_bool(self, PACKAGE, RECIPE_STRING,
"weight",
130 CPL_FALSE, NULL, context,
"Convert to "
131 "weight. Bad pixels are seto to 0");
132 cpl_ensure_code(!err, err);
136 err = irplib_parameterlist_set_bool(self, PACKAGE, RECIPE_STRING,
"variance",
137 CPL_FALSE, NULL, context,
"Convert to "
138 "variance. Bad pixels are seto to 0");
139 cpl_ensure_code(!err, err);
143 err = irplib_parameterlist_set_double(self, PACKAGE, RECIPE_STRING,
144 "bad_value", FLT_MAX, NULL, context,
145 "The value to use for any bad pixel "
146 "in an error or variance map");
147 cpl_ensure_code(!err, err);
150 err = irplib_parameterlist_set_bool(self, PACKAGE, RECIPE_STRING,
151 "bad_flag", CPL_TRUE, NULL, context,
152 "The value used to flag a bad pixel "
153 "in an input bad pixel map. True: 1. "
155 cpl_ensure_code(!err, err);
157 return CPL_ERROR_NONE;
170static int visir_util_convert_weight(cpl_frameset * framelist,
171 const cpl_parameterlist * parlist)
173 cpl_error_code didfail = CPL_ERROR_NONE;
174 irplib_framelist * allframes = NULL;
175 irplib_framelist * rawframes = NULL;
176 const cpl_frame * bpmframe = NULL;
182 cpl_fits_set_mode(CPL_FITS_START_CACHING);
185 allframes = irplib_framelist_cast(framelist);
186 skip_if(allframes == NULL);
187 rawframes = irplib_framelist_extract_regexp(allframes,
"^("
188 VISIR_UTIL_WEIGHT_MAP
"|"
189 VISIR_UTIL_VARIANCE_MAP
"|"
190 VISIR_UTIL_ERROR_MAP
")$",
192 skip_if (rawframes == NULL);
193 bpmframe = cpl_frameset_find_const(framelist, VISIR_CALIB_BPM);
195 any_if(
"Propagating error");
197 n = irplib_framelist_get_size(rawframes);
198 for (i = 0; i < n; i++) {
200 skip_if (visir_util_convert_weight_one(framelist, rawframes, bpmframe,
202 cpl_fits_set_mode(CPL_FITS_RESTART_CACHING);
205 error_if(didfail, didfail,
"Failed to convert data in %d frame(s)", n);
209 irplib_framelist_delete(allframes);
210 irplib_framelist_delete(rawframes);
212 return cpl_error_get_code();
228cpl_error_code visir_util_convert_weight_one(cpl_frameset * framelist,
229 irplib_framelist * rawframes,
230 const cpl_frame * bpmframe,
int i,
231 const cpl_parameterlist * parlist)
234 const int n = irplib_framelist_get_size(rawframes);
235 const cpl_boolean do_w = irplib_parameterlist_get_bool(parlist, PACKAGE,
238 const cpl_boolean do_e = irplib_parameterlist_get_bool(parlist, PACKAGE,
241 const cpl_boolean do_v = irplib_parameterlist_get_bool(parlist, PACKAGE,
244 const double bad_val = irplib_parameterlist_get_double(parlist, PACKAGE,
248 const cpl_boolean bad_flag = irplib_parameterlist_get_bool(parlist, PACKAGE,
252 cpl_errorstate prestate = cpl_errorstate_get();
253 cpl_frameset * products = cpl_frameset_new();
254 cpl_frameset * usedframes = cpl_frameset_new();
255 const cpl_frame * frame = irplib_framelist_get_const(rawframes, i);
256 const char * tag = cpl_frame_get_tag(frame);
257 const int frametype =
258 tag != NULL && !strcmp(tag, VISIR_UTIL_WEIGHT_MAP)
259 ? VISIR_FRAME_WEIGHT : (tag != NULL && !strcmp(tag, VISIR_UTIL_ERROR_MAP)
260 ? VISIR_FRAME_ERROR : VISIR_FRAME_VARIANCE);
261 const char * filename = cpl_frame_get_filename(frame);
262 const int next = cpl_fits_count_extensions(filename);
263 cpl_imagelist * map = NULL;
264 cpl_imagelist * emap = NULL;
265 cpl_imagelist * wmap = NULL;
266 cpl_imagelist * vmap = NULL;
267 const char * bpmname = bpmframe ? cpl_frame_get_filename(bpmframe)
269 const int mext = bpmname ? cpl_fits_count_extensions(bpmname)
271 cpl_image * ibpm = NULL;
272 cpl_image * isqr = NULL;
273 cpl_image * ione = NULL;
274 cpl_image * idiv = NULL;
275 cpl_mask * bpm = NULL;
276 cpl_mask * bpmi = NULL;
277 cpl_propertylist * plist = NULL;
279 char * eproname = do_e == CPL_FALSE ? NULL
280 : cpl_sprintf(RECIPE_STRING
"_%03d_error" CPL_DFS_FITS, 1+i);
281 char * wproname = do_w == CPL_FALSE ? NULL
282 : cpl_sprintf(RECIPE_STRING
"_%03d_weight" CPL_DFS_FITS, 1+i);
283 char * vproname = do_v == CPL_FALSE ? NULL
284 : cpl_sprintf(RECIPE_STRING
"_%03d_variance" CPL_DFS_FITS, 1+i);
287 cpl_msg_info(cpl_func,
"Converting %d Data unit(s) in frame %d/%d",
290 any_if(
"Propagating error");
292 if (bpmname != NULL) {
293 error_if(mext != 1 && mext != next, CPL_ERROR_INCOMPATIBLE_INPUT,
294 "Raw file %s has %d extension(s) <=> %d extension(s) of bpm-"
295 "file %s", filename, next, mext, bpmname);
298 for (iext = 0; iext <= next; iext++) {
301 cpl_propertylist_delete(plist);
302 plist = cpl_propertylist_load_regexp(filename, iext, CPL_DFS_PRO_CATG,
305 visir_dfs_update_header(plist);
307 skip_if(plist == NULL);
309 if (emap != map) cpl_imagelist_delete(emap);
311 if (wmap != map) cpl_imagelist_delete(wmap);
313 if (vmap != map) cpl_imagelist_delete(vmap);
316 cpl_imagelist_delete(map);
317 map = cpl_imagelist_load(filename, CPL_TYPE_FLOAT, iext);
318 if (!cpl_errorstate_is_equal(prestate)) {
319 cpl_errorstate_set(prestate);
324 const int m = cpl_imagelist_get_size(map);
328 cpl_image_delete(ibpm);
329 ibpm = cpl_image_load(bpmname, CPL_TYPE_UNSPECIFIED, 0, iext);
330 cpl_mask_delete(bpm);
331 bpm = cpl_mask_threshold_image_create(ibpm, 0.5, DBL_MAX);
332 if (!bad_flag) cpl_mask_not(bpm);
333 skip_if(bpm == NULL);
336 for (j = 0; j < m; j++) {
337 cpl_image * imap = cpl_imagelist_get(map, j);
340 cpl_mask_delete(bpmi);
341 bpmi = cpl_mask_threshold_image_create(imap, 0.0, DBL_MAX);
342 bug_if(cpl_mask_not(bpmi));
346 skip_if(cpl_mask_or(bpmi, bpm));
348 bug_if(cpl_image_reject_from_mask(imap, bpmi));
351 bug_if(cpl_image_fill_rejected(imap, 1.0));
353 if (frametype == VISIR_FRAME_WEIGHT) {
356 if (wmap == NULL) wmap = map;
363 ione = cpl_image_new(cpl_image_get_size_x(imap),
364 cpl_image_get_size_y(imap),
366 cpl_image_add_scalar(ione, 1.0);
370 idiv = cpl_image_divide_create(ione, imap);
374 if (cpl_image_get_bpm_const(idiv))
375 bug_if(cpl_mask_or(bpmi,
376 cpl_image_get_bpm_const(idiv)));
378 bug_if(cpl_image_reject_from_mask(idiv, bpmi));
383 vmap = do_w ? cpl_imagelist_new() : map;
386 bug_if(cpl_imagelist_set(vmap, idiv, j));
392 emap = do_w || do_v ? cpl_imagelist_new() : map;
395 idiv = cpl_image_power_create(cpl_imagelist_get_const
398 bug_if(cpl_image_power(idiv, 0.5));
402 bug_if(cpl_imagelist_set(emap, idiv, j));
405 }
else if (frametype == VISIR_FRAME_ERROR) {
408 if (emap == NULL) emap = map;
413 vmap = do_e ? cpl_imagelist_new() : map;
416 isqr = cpl_image_power_create(imap, 2.0);
419 bug_if(cpl_imagelist_set(vmap, isqr, j));
422 bug_if(cpl_image_power(imap, 2.0));
428 wmap = do_e || do_v ? cpl_imagelist_new() : map;
431 ione = cpl_image_new(cpl_image_get_size_x(imap),
432 cpl_image_get_size_y(imap),
434 cpl_image_add_scalar(ione, 1.0);
439 idiv = cpl_image_divide_create
440 (ione, cpl_imagelist_get(vmap, j));
442 isqr = cpl_image_power_create(imap, 2.0);
443 idiv = cpl_image_divide_create(ione, isqr);
445 bug_if(cpl_image_power(imap, 2.0));
446 idiv = cpl_image_divide_create(ione, imap);
448 cpl_image_delete(isqr);
452 bug_if(cpl_imagelist_set(wmap, idiv, j));
456 }
else if (frametype == VISIR_FRAME_VARIANCE) {
458 if (vmap == NULL) vmap = map;
463 wmap = do_v ? cpl_imagelist_new() : map;
466 ione = cpl_image_new(cpl_image_get_size_x(imap),
467 cpl_image_get_size_y(imap),
469 cpl_image_add_scalar(ione, 1.0);
473 idiv = cpl_image_divide_create(ione, imap);
477 if (cpl_image_get_bpm_const(idiv))
478 bug_if(cpl_mask_or(bpmi,
479 cpl_image_get_bpm_const(idiv)));
481 bug_if(cpl_image_reject_from_mask(idiv, bpmi));
484 bug_if(cpl_imagelist_set(wmap, idiv, j));
490 emap = do_v || do_w ? cpl_imagelist_new() : map;
493 isqr = cpl_image_power_create(imap, 0.5);
495 bug_if(cpl_imagelist_set(emap, isqr, j));
499 bug_if(cpl_image_power(imap, 0.5));
508 bug_if(cpl_image_fill_rejected(cpl_imagelist_get
512 bug_if(cpl_image_fill_rejected(cpl_imagelist_get
513 (emap, j), bad_val));
517 bug_if(cpl_image_fill_rejected(cpl_imagelist_get
518 (vmap, j), bad_val));
526 bug_if(cpl_frameset_insert(usedframes, cpl_frame_duplicate
528 if (bpmframe != NULL)
529 bug_if(cpl_frameset_insert(usedframes, cpl_frame_duplicate
534 skip_if(irplib_dfs_save_propertylist(products, parlist,
537 VISIR_UTIL_WEIGHT_MAP_PROCATG,
542 skip_if(irplib_dfs_save_imagelist(products, parlist,
546 VISIR_UTIL_WEIGHT_MAP_PROCATG,
548 visir_pipe_id, wproname));
553 skip_if(irplib_dfs_save_propertylist(products, parlist,
556 VISIR_UTIL_ERROR_MAP_PROCATG,
561 skip_if(irplib_dfs_save_imagelist(products, parlist,
565 VISIR_UTIL_ERROR_MAP_PROCATG,
567 visir_pipe_id, eproname));
572 skip_if(irplib_dfs_save_propertylist(products, parlist,
575 VISIR_UTIL_VARIANCE_MAP_PROCATG,
580 skip_if(irplib_dfs_save_imagelist(products, parlist,
584 VISIR_UTIL_VARIANCE_MAP_PROCATG,
586 visir_pipe_id, vproname));
592 skip_if(cpl_propertylist_save(plist, wproname,
595 skip_if(cpl_imagelist_save(wmap, wproname,
596 CPL_BPP_IEEE_FLOAT, plist,
602 skip_if(cpl_propertylist_save(plist, eproname,
605 skip_if(cpl_imagelist_save(emap, eproname,
606 CPL_BPP_IEEE_FLOAT, plist,
612 skip_if(cpl_propertylist_save(plist, vproname,
615 skip_if(cpl_imagelist_save(vmap, vproname,
616 CPL_BPP_IEEE_FLOAT, plist,
623 FOR_EACH_FRAMESET_C(frm, products) {
624 cpl_frame * copy = cpl_frame_duplicate(frm);
625 cpl_error_code error = cpl_frameset_insert(framelist, copy);
629 bug_if(frame != NULL);
633 if (emap != map) cpl_imagelist_delete(emap);
634 if (wmap != map) cpl_imagelist_delete(wmap);
635 if (vmap != map) cpl_imagelist_delete(vmap);
636 cpl_imagelist_delete(map);
640 cpl_image_delete(ione);
641 cpl_image_delete(idiv);
642 cpl_image_delete(isqr);
643 cpl_image_delete(ibpm);
644 cpl_mask_delete(bpm);
645 cpl_mask_delete(bpmi);
646 cpl_propertylist_delete(plist);
647 cpl_frameset_delete(usedframes);
648 cpl_frameset_delete(products);
650 return cpl_error_get_code();
int visir_dfs_set_groups(cpl_frameset *set)
Set the group as RAW or CALIB in a frameset.