39#include "irplib_utils.h"
41#include "sofi_utils.h"
42#include "sofi_pfits.h"
49static int sofi_img_dark_create(cpl_plugin *);
50static int sofi_img_dark_exec(cpl_plugin *);
51static int sofi_img_dark_destroy(cpl_plugin *);
52static int sofi_img_dark(cpl_parameterlist *, cpl_frameset *);
54static int sofi_img_dark_avg_reduce(cpl_frameset *, cpl_image **);
55static cpl_matrix * sofi_img_dark_ron_reduce(cpl_frameset *);
56static int sofi_img_dark_compare(
const cpl_frame *,
const cpl_frame *);
57static int sofi_img_dark_save(cpl_image *, cpl_matrix *,
int, cpl_frameset *,
58 cpl_parameterlist *, cpl_frameset *);
71} sofi_img_dark_config;
73static char sofi_img_dark_description[] =
74"sofi_img_dark -- SOFI imaging dark recipe.\n"
75"The files listed in the Set Of Frames (sof-file) must be tagged:\n"
76"raw-file.fits "SOFI_IMG_DARK_RAW
"\n";
91int cpl_plugin_get_info(cpl_pluginlist * list)
93 cpl_recipe * recipe = cpl_calloc(1,
sizeof(*recipe));
94 cpl_plugin * plugin = &recipe->interface;
96 cpl_plugin_init(plugin,
99 CPL_PLUGIN_TYPE_RECIPE,
102 sofi_img_dark_description,
106 sofi_img_dark_create,
108 sofi_img_dark_destroy);
110 cpl_pluginlist_append(list, plugin);
125static int sofi_img_dark_create(cpl_plugin * plugin)
131 if (cpl_plugin_get_type(plugin) == CPL_PLUGIN_TYPE_RECIPE)
132 recipe = (cpl_recipe *)plugin;
133 else return CPL_ERROR_UNSPECIFIED;
136 recipe->parameters = cpl_parameterlist_new();
140 p = cpl_parameter_new_value(
"sofi.sofi_img_dark.nsamples",
141 CPL_TYPE_INT,
"number of samples for RON computation",
142 "sofi.sofi_img_dark", 100);
143 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"nsamples");
144 cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
145 cpl_parameterlist_append(recipe->parameters, p);
147 p = cpl_parameter_new_value(
"sofi.sofi_img_dark.hsize",
148 CPL_TYPE_INT,
"half size of the window for RON computation",
149 "sofi.sofi_img_dark", 6);
150 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"hsize");
151 cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
152 cpl_parameterlist_append(recipe->parameters, p);
165static int sofi_img_dark_exec(cpl_plugin * plugin)
170 if (cpl_plugin_get_type(plugin) == CPL_PLUGIN_TYPE_RECIPE)
171 recipe = (cpl_recipe *)plugin;
172 else return CPL_ERROR_UNSPECIFIED;
174 return sofi_img_dark(recipe->parameters, recipe->frames);
184static int sofi_img_dark_destroy(cpl_plugin * plugin)
189 if (cpl_plugin_get_type(plugin) == CPL_PLUGIN_TYPE_RECIPE)
190 recipe = (cpl_recipe *)plugin;
191 else return CPL_ERROR_UNSPECIFIED;
193 cpl_parameterlist_delete(recipe->parameters);
205static int sofi_img_dark(
206 cpl_parameterlist * parlist,
207 cpl_frameset * framelist)
211 cpl_size * selection;
212 cpl_frameset * f_one;
218 par = cpl_parameterlist_find(parlist,
"sofi.sofi_img_dark.hsize");
219 sofi_img_dark_config.hsize = cpl_parameter_get_int(par);
220 par = cpl_parameterlist_find(parlist,
"sofi.sofi_img_dark.nsamples");
221 sofi_img_dark_config.nsamples = cpl_parameter_get_int(par);
225 cpl_msg_error(cpl_func,
"Cannot identify RAW and CALIB frames");
226 return CPL_ERROR_UNSPECIFIED;
230 cpl_msg_info(cpl_func,
"Identify the different settings");
231 selection=cpl_frameset_labelise(framelist, sofi_img_dark_compare, &nsets);
232 if (selection == NULL) {
233 cpl_msg_error(cpl_func,
"Cannot labelise input frames");
234 return CPL_ERROR_UNSPECIFIED;
238 for (i=0; i<nsets; i++) {
240 sofi_img_dark_config.dark_med = -1.0;
241 sofi_img_dark_config.dark_stdev = -1.0;
245 cpl_msg_info(cpl_func,
"Reduce data set no %d out of %d", i+1,
247 cpl_msg_indent_more();
248 f_one = cpl_frameset_extract(framelist, selection, i);
251 if (cpl_frameset_get_size(f_one) < 2) {
252 cpl_msg_warning(cpl_func,
"Setting %d skipped (not enough frames)",
254 cpl_frameset_delete(f_one);
256 return CPL_ERROR_UNSPECIFIED;
259 cpl_msg_info(cpl_func,
"Compute the master dark");
260 cpl_msg_indent_more();
261 if (sofi_img_dark_avg_reduce(f_one, &avg)) {
262 cpl_msg_warning(cpl_func,
"Cannot reduce set number %d", i+1);
264 cpl_msg_indent_less();
266 cpl_msg_info(cpl_func,
"Compute the read-out noise");
267 cpl_msg_indent_more();
268 if ((rons = sofi_img_dark_ron_reduce(f_one)) == NULL) {
269 cpl_msg_warning(cpl_func,
"Cannot reduce set number %d", i+1);
271 cpl_msg_indent_less();
273 if (sofi_img_dark_save(avg, rons, i+1, f_one, parlist,
275 cpl_msg_error(cpl_func,
"Cannot save the products");
276 if (avg) cpl_image_delete(avg);
277 if (rons) cpl_matrix_delete(rons);
278 cpl_frameset_delete(f_one);
280 return CPL_ERROR_UNSPECIFIED;
282 if (rons) cpl_matrix_delete(rons);
284 if (avg) cpl_image_delete(avg);
285 cpl_frameset_delete(f_one);
286 cpl_msg_indent_less();
302static int sofi_img_dark_avg_reduce(
303 cpl_frameset * framelist,
306 cpl_imagelist * iset;
307 cpl_vector * medians;
312 if (framelist == NULL)
return CPL_ERROR_UNSPECIFIED;
315 if ((iset = cpl_imagelist_load_frameset(framelist, CPL_TYPE_FLOAT, 1,
317 cpl_msg_error(cpl_func,
"Cannot load the data");
318 return CPL_ERROR_UNSPECIFIED;
322 if ((*avg = cpl_imagelist_collapse_create(iset)) == NULL) {
323 cpl_msg_error(cpl_func,
"Cannot average the data set");
324 cpl_imagelist_delete(iset);
325 return CPL_ERROR_UNSPECIFIED;
329 medians = cpl_vector_new(cpl_imagelist_get_size(iset));
330 for (i=0; i<cpl_imagelist_get_size(iset); i++) {
331 image = cpl_imagelist_get(iset, i);
332 cpl_vector_set(medians, i, cpl_image_get_median(image));
334 cpl_imagelist_delete(iset);
335 sofi_img_dark_config.dark_med = cpl_vector_get_mean(medians);
336 sofi_img_dark_config.dark_stdev = cpl_vector_get_stdev(medians);
339 cpl_vector_delete(medians);
355static cpl_matrix * sofi_img_dark_ron_reduce(cpl_frameset * framelist)
357 cpl_frame * cur_frame;
358 cpl_propertylist * plist;
359 cpl_imagelist * iset;
365 cpl_size zone_def[4];
369 if (framelist == NULL)
return NULL;
372 if ((iset = cpl_imagelist_load_frameset(framelist, CPL_TYPE_FLOAT, 1,
374 cpl_msg_error(cpl_func,
"Cannot load the data");
379 rons = cpl_matrix_new(cpl_imagelist_get_size(iset)-1, 4);
382 for (i=0; i<cpl_imagelist_get_size(iset)-1; i++) {
383 cpl_msg_info(cpl_func,
"Pair number %d", i+1);
385 if (cpl_error_get_code()) {
386 cpl_matrix_delete(rons);
387 cpl_imagelist_delete(iset);
390 cur_frame = cpl_frameset_get_position(framelist, i);
391 plist = cpl_propertylist_load(cpl_frame_get_filename(cur_frame),
394 cpl_propertylist_delete(plist);
395 if (cpl_error_get_code()) {
396 cpl_msg_error(cpl_func,
"Cannot get the NDIT");
397 cpl_matrix_delete(rons);
398 cpl_imagelist_delete(iset);
405 if ((tmp_im = cpl_image_subtract_create(
406 cpl_imagelist_get(iset, i),
407 cpl_imagelist_get(iset, i+1))) == NULL) {
408 cpl_msg_error(cpl_func,
"Cannot subtract the images");
409 cpl_imagelist_delete(iset);
410 cpl_matrix_delete(rons);
416 zone_def[1] = cpl_image_get_size_x(tmp_im)/2;
418 zone_def[3] = cpl_image_get_size_y(tmp_im)/2;
419 cpl_flux_get_noise_window(tmp_im, zone_def,
420 sofi_img_dark_config.hsize,
421 sofi_img_dark_config.nsamples, &rms, NULL);
422 cpl_matrix_set(rons, i, 0, rms * norm);
423 cpl_msg_info(cpl_func,
"RON in LL quadrant: %g", rms * norm);
426 zone_def[0] = cpl_image_get_size_x(tmp_im)/2 + 1;
427 zone_def[1] = cpl_image_get_size_x(tmp_im);
429 zone_def[3] = cpl_image_get_size_y(tmp_im)/2;
430 cpl_flux_get_noise_window(tmp_im, zone_def,
431 sofi_img_dark_config.hsize,
432 sofi_img_dark_config.nsamples, &rms, NULL);
433 cpl_matrix_set(rons, i, 1, rms * norm);
434 cpl_msg_info(cpl_func,
"RON in LR quadrant: %g", rms * norm);
438 zone_def[1] = cpl_image_get_size_x(tmp_im)/2;
439 zone_def[2] = cpl_image_get_size_y(tmp_im)/2 + 1;
440 zone_def[3] = cpl_image_get_size_y(tmp_im);
441 cpl_flux_get_noise_window(tmp_im, zone_def,
442 sofi_img_dark_config.hsize,
443 sofi_img_dark_config.nsamples, &rms, NULL);
444 cpl_matrix_set(rons, i, 2, rms * norm);
445 cpl_msg_info(cpl_func,
"RON in UL quadrant: %g", rms * norm);
448 zone_def[0] = cpl_image_get_size_x(tmp_im)/2 + 1;
449 zone_def[1] = cpl_image_get_size_x(tmp_im);
450 zone_def[2] = cpl_image_get_size_y(tmp_im)/2 + 1;
451 zone_def[3] = cpl_image_get_size_y(tmp_im);
452 cpl_flux_get_noise_window(tmp_im, zone_def,
453 sofi_img_dark_config.hsize,
454 sofi_img_dark_config.nsamples, &rms, NULL);
455 cpl_matrix_set(rons, i, 3, rms * norm);
456 cpl_msg_info(cpl_func,
"RON in UR quadrant: %g", rms * norm);
457 cpl_image_delete(tmp_im);
461 cpl_imagelist_delete(iset);
477static int sofi_img_dark_save(
482 cpl_parameterlist * parlist,
483 cpl_frameset * set_tot)
485 cpl_propertylist * plist;
486 cpl_propertylist * qclist;
487 cpl_propertylist * paflist;
488 const cpl_frame * ref_frame;
494 qclist = cpl_propertylist_new();
495 cpl_propertylist_append_double(qclist,
"ESO QC DARKMED",
496 sofi_img_dark_config.dark_med);
497 cpl_propertylist_append_double(qclist,
"ESO QC DARKSTDEV",
498 sofi_img_dark_config.dark_stdev);
500 for (i=0; i<cpl_matrix_get_nrow(rons); i++) {
501 sprintf(qc_str,
"ESO QC LL RON%d", i+1);
502 cpl_propertylist_append_double(qclist, qc_str,
503 cpl_matrix_get(rons, i, 0));
504 sprintf(qc_str,
"ESO QC LR RON%d", i+1);
505 cpl_propertylist_append_double(qclist, qc_str,
506 cpl_matrix_get(rons, i, 1));
507 sprintf(qc_str,
"ESO QC UL RON%d", i+1);
508 cpl_propertylist_append_double(qclist, qc_str,
509 cpl_matrix_get(rons, i, 2));
510 sprintf(qc_str,
"ESO QC UR RON%d", i+1);
511 cpl_propertylist_append_double(qclist, qc_str,
512 cpl_matrix_get(rons, i, 3));
517 filename = cpl_sprintf(
"sofi_img_dark_set%02d_avg.fits", set_nb);
518 irplib_dfs_save_image(set_tot,
527 PACKAGE
"/" PACKAGE_VERSION,
532 ref_frame = irplib_frameset_get_first_from_group(set, CPL_FRAME_GROUP_RAW);
535 if ((plist=cpl_propertylist_load(cpl_frame_get_filename(ref_frame),
537 cpl_msg_error(cpl_func,
"getting header from reference frame");
538 cpl_propertylist_delete(qclist);
539 return CPL_ERROR_UNSPECIFIED;
543 paflist = cpl_propertylist_new();
544 cpl_propertylist_copy_property_regexp(paflist, plist,
545 "^(ARCFILE|MJD-OBS|ESO TPL ID|ESO DPR TECH|DATE-OBS|ESO DET DIT|"
546 "ESO DET NDIT|ESO DET NCORRS|ESO DET NDSAMPLES|ESO DET MODE NAME)$", 0);
547 cpl_propertylist_delete(plist);
550 cpl_propertylist_copy_property_regexp(paflist, qclist,
".", 0);
551 cpl_propertylist_delete(qclist);
554 filename = cpl_sprintf(
"sofi_img_dark_set%02d.paf", set_nb);
555 cpl_dfs_save_paf(
"SOFI",
560 cpl_propertylist_delete(paflist);
572static int sofi_img_dark_compare(
573 const cpl_frame * frame1,
574 const cpl_frame * frame2)
577 cpl_propertylist * plist1;
578 cpl_propertylist * plist2;
583 if (frame1==NULL || frame2==NULL)
return CPL_ERROR_UNSPECIFIED;
586 if ((plist1=cpl_propertylist_load(cpl_frame_get_filename(frame1),
588 cpl_msg_error(cpl_func,
"getting header from reference frame");
589 return CPL_ERROR_UNSPECIFIED;
591 if ((plist2=cpl_propertylist_load(cpl_frame_get_filename(frame2),
593 cpl_msg_error(cpl_func,
"getting header from reference frame");
594 cpl_propertylist_delete(plist1);
595 return CPL_ERROR_UNSPECIFIED;
599 if (cpl_error_get_code()) {
600 cpl_propertylist_delete(plist1);
601 cpl_propertylist_delete(plist2);
602 return CPL_ERROR_UNSPECIFIED;
609 if (cpl_error_get_code()) {
610 cpl_msg_error(cpl_func,
"cannot get exposure time");
611 cpl_propertylist_delete(plist1);
612 cpl_propertylist_delete(plist2);
613 return CPL_ERROR_UNSPECIFIED;
615 if (fabs(dval1-dval2) > 1e-5) comparison = 0;
620 if (cpl_error_get_code()) {
621 cpl_msg_error(cpl_func,
"cannot get NDIT");
622 cpl_propertylist_delete(plist1);
623 cpl_propertylist_delete(plist2);
624 return CPL_ERROR_UNSPECIFIED;
626 if (ival1 != ival2) comparison = 0;
631 if (cpl_error_get_code()) {
632 cpl_msg_error(cpl_func,
"cannot get read-out mode");
633 cpl_propertylist_delete(plist1);
634 cpl_propertylist_delete(plist2);
635 return CPL_ERROR_UNSPECIFIED;
637 if (ival1 != ival2) comparison = 0;
640 cpl_propertylist_delete(plist1);
641 cpl_propertylist_delete(plist2);
int sofi_dfs_set_groups(cpl_frameset *set)
Set the group as RAW or CALIB in a frameset.
double sofi_pfits_get_dit(const cpl_propertylist *plist)
find out the DIT value
int sofi_pfits_get_rom(const cpl_propertylist *plist)
find out the read out mode
int sofi_pfits_get_ndit(const cpl_propertylist *plist)
find out the NDIT keyword
const char * sofi_get_license(void)
Get the pipeline copyright and license.