39 #include "irplib_utils.h"
41 #include "isaac_utils.h"
42 #include "isaac_pfits.h"
43 #include "isaac_dfs.h"
49 #define ISAAC_DARK_HSIZE_SW_DEF 6
50 #define ISAAC_DARK_HSIZE_LW_DEF 2
56 static int isaac_img_dark_create(cpl_plugin *);
57 static int isaac_img_dark_exec(cpl_plugin *);
58 static int isaac_img_dark_destroy(cpl_plugin *);
59 static int isaac_img_dark(cpl_parameterlist *, cpl_frameset *);
61 static int isaac_img_dark_avg_reduce(cpl_frameset *, cpl_image **);
62 static cpl_matrix * isaac_img_dark_ron_reduce(cpl_frameset *);
63 static int isaac_img_dark_compare(
const cpl_frame *,
const cpl_frame *);
64 static int isaac_img_dark_save(cpl_image *, cpl_matrix *,
int, cpl_frameset *,
65 cpl_parameterlist *, cpl_frameset *);
78 } isaac_img_dark_config;
80 static char isaac_img_dark_description[] =
81 "isaac_img_dark -- ISAAC imaging dark recipe.\n"
82 "The files listed in the Set Of Frames (sof-file) must be tagged:\n"
83 "raw-file.fits "ISAAC_IMG_DARK_RAW
"\n";
98 int cpl_plugin_get_info(cpl_pluginlist * list)
100 cpl_recipe * recipe = cpl_calloc(1,
sizeof(*recipe));
101 cpl_plugin * plugin = &recipe->interface;
103 cpl_plugin_init(plugin,
105 ISAAC_BINARY_VERSION,
106 CPL_PLUGIN_TYPE_RECIPE,
109 isaac_img_dark_description,
113 isaac_img_dark_create,
115 isaac_img_dark_destroy);
117 cpl_pluginlist_append(list, plugin);
132 static int isaac_img_dark_create(cpl_plugin * plugin)
138 if (cpl_plugin_get_type(plugin) == CPL_PLUGIN_TYPE_RECIPE)
139 recipe = (cpl_recipe *)plugin;
140 else return CPL_ERROR_UNSPECIFIED;
143 recipe->parameters = cpl_parameterlist_new();
147 p = cpl_parameter_new_value(
"isaac.isaac_img_dark.nsamples",
148 CPL_TYPE_INT,
"number of samples for RON computation",
149 "isaac.isaac_img_dark", 100);
150 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"nsamples");
151 cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
152 cpl_parameterlist_append(recipe->parameters, p);
154 p = cpl_parameter_new_value(
"isaac.isaac_img_dark.hsize",
155 CPL_TYPE_INT,
"half size of the window for RON computation",
156 "isaac.isaac_img_dark", -1);
157 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"hsize");
158 cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
159 cpl_parameterlist_append(recipe->parameters, p);
172 static int isaac_img_dark_exec(cpl_plugin * plugin)
177 if (cpl_plugin_get_type(plugin) == CPL_PLUGIN_TYPE_RECIPE)
178 recipe = (cpl_recipe *)plugin;
179 else return CPL_ERROR_UNSPECIFIED;
181 return isaac_img_dark(recipe->parameters, recipe->frames);
191 static int isaac_img_dark_destroy(cpl_plugin * plugin)
196 if (cpl_plugin_get_type(plugin) == CPL_PLUGIN_TYPE_RECIPE)
197 recipe = (cpl_recipe *)plugin;
198 else return CPL_ERROR_UNSPECIFIED;
200 cpl_parameterlist_delete(recipe->parameters);
212 static int isaac_img_dark(
213 cpl_parameterlist * parlist,
214 cpl_frameset * framelist)
218 cpl_size * selection;
219 cpl_frameset * f_one;
222 cpl_boolean did_reduce = CPL_FALSE;
226 par = cpl_parameterlist_find(parlist,
"isaac.isaac_img_dark.hsize");
227 isaac_img_dark_config.hsize = cpl_parameter_get_int(par);
228 par = cpl_parameterlist_find(parlist,
"isaac.isaac_img_dark.nsamples");
229 isaac_img_dark_config.nsamples = cpl_parameter_get_int(par);
233 cpl_msg_error(cpl_func,
"Cannot identify RAW and CALIB frames");
234 return CPL_ERROR_UNSPECIFIED;
238 cpl_msg_info(cpl_func,
"Identify the different settings");
239 selection=cpl_frameset_labelise(framelist, isaac_img_dark_compare, &nsets);
240 if (selection == NULL) {
241 cpl_msg_error(cpl_func,
"Cannot labelise input frames");
242 return CPL_ERROR_UNSPECIFIED;
246 for (i=0; i<nsets; i++) {
248 isaac_img_dark_config.dark_med = -1.0;
249 isaac_img_dark_config.dark_stdev = -1.0;
253 cpl_msg_info(cpl_func,
"Reduce data set no %d out of %d", i+1,
255 cpl_msg_indent_more();
256 f_one = cpl_frameset_extract(framelist, selection, i);
259 if (cpl_frameset_get_size(f_one) < 2) {
260 cpl_msg_warning(cpl_func,
"Setting %d skipped (not enough frames)",
264 cpl_msg_info(cpl_func,
"Compute the master dark");
265 cpl_msg_indent_more();
266 if (isaac_img_dark_avg_reduce(f_one, &avg)) {
267 cpl_msg_warning(cpl_func,
"Cannot reduce set number %d", i+1);
269 cpl_msg_indent_less();
271 cpl_msg_info(cpl_func,
"Compute the read-out noise");
272 cpl_msg_indent_more();
273 if ((rons = isaac_img_dark_ron_reduce(f_one)) == NULL) {
274 cpl_msg_warning(cpl_func,
"Cannot reduce set number %d", i+1);
276 cpl_msg_indent_less();
278 if (isaac_img_dark_save(avg, rons, i+1, f_one, parlist,
280 cpl_msg_error(cpl_func,
"Cannot save the products");
281 if (avg) cpl_image_delete(avg);
282 if (rons) cpl_matrix_delete(rons);
283 return CPL_ERROR_UNSPECIFIED;
285 if (rons) cpl_matrix_delete(rons);
286 if (!cpl_error_get_code()) did_reduce = CPL_TRUE;
288 if (avg) cpl_image_delete(avg);
289 cpl_frameset_delete(f_one);
290 cpl_msg_indent_less();
296 cpl_ensure_code(did_reduce, CPL_ERROR_ILLEGAL_INPUT);
298 return cpl_error_set_where(cpl_func);
309 static int isaac_img_dark_avg_reduce(
310 cpl_frameset * framelist,
313 cpl_imagelist * iset;
314 cpl_vector * medians;
319 if (framelist == NULL)
return CPL_ERROR_UNSPECIFIED;
322 if ((iset = cpl_imagelist_load_frameset(framelist, CPL_TYPE_FLOAT, 1,
324 cpl_msg_error(cpl_func,
"Cannot load the data");
325 return CPL_ERROR_UNSPECIFIED;
329 if ((*avg = cpl_imagelist_collapse_create(iset)) == NULL) {
330 cpl_msg_error(cpl_func,
"Cannot average the data set");
331 cpl_imagelist_delete(iset);
332 return CPL_ERROR_UNSPECIFIED;
336 medians = cpl_vector_new(cpl_imagelist_get_size(iset));
337 for (i=0; i<cpl_imagelist_get_size(iset); i++) {
338 image = cpl_imagelist_get(iset, i);
339 cpl_vector_set(medians, i, cpl_image_get_median(image));
341 cpl_imagelist_delete(iset);
342 isaac_img_dark_config.dark_med = cpl_vector_get_mean(medians);
343 isaac_img_dark_config.dark_stdev = cpl_vector_get_stdev(medians);
346 cpl_vector_delete(medians);
362 static cpl_matrix * isaac_img_dark_ron_reduce(cpl_frameset * framelist)
364 cpl_frame * cur_frame;
365 cpl_propertylist * plist;
368 cpl_imagelist * iset;
374 cpl_size zone_def[4];
378 if (framelist == NULL)
return NULL;
384 if (cpl_error_get_code())
return NULL;
385 cur_frame = cpl_frameset_get_position(framelist, 0);
386 plist = cpl_propertylist_load(cpl_frame_get_filename(cur_frame), 0);
388 if (cpl_error_get_code()) {
389 cpl_msg_error(cpl_func,
"Cannot get the used arm");
390 cpl_propertylist_delete(plist);
393 arm = (int)(sval[0]);
394 cpl_propertylist_delete(plist);
397 if ((iset = cpl_imagelist_load_frameset(framelist, CPL_TYPE_FLOAT, 1,
399 cpl_msg_error(cpl_func,
"Cannot load the data");
407 rons = cpl_matrix_new(cpl_imagelist_get_size(iset)-1, 4);
408 if (isaac_img_dark_config.hsize < 0)
409 isaac_img_dark_config.hsize = ISAAC_DARK_HSIZE_SW_DEF;
412 for (i=0; i<cpl_imagelist_get_size(iset)-1; i++) {
413 cpl_msg_info(cpl_func,
"Pair number %d", i+1);
415 if (cpl_error_get_code()) {
416 cpl_matrix_delete(rons);
417 cpl_imagelist_delete(iset);
420 cur_frame = cpl_frameset_get_position(framelist, i);
421 plist = cpl_propertylist_load(cpl_frame_get_filename(cur_frame),
424 cpl_propertylist_delete(plist);
425 if (cpl_error_get_code()) {
426 cpl_msg_error(cpl_func,
"Cannot get the NDIT");
427 cpl_matrix_delete(rons);
428 cpl_imagelist_delete(iset);
435 if ((tmp_im = cpl_image_subtract_create(
436 cpl_imagelist_get(iset, i),
437 cpl_imagelist_get(iset, i+1))) == NULL) {
438 cpl_msg_error(cpl_func,
"Cannot subtract the images");
439 cpl_imagelist_delete(iset);
440 cpl_matrix_delete(rons);
446 zone_def[1] = cpl_image_get_size_x(tmp_im)/2;
448 zone_def[3] = cpl_image_get_size_y(tmp_im)/2;
449 cpl_flux_get_noise_window(tmp_im, zone_def,
450 isaac_img_dark_config.hsize,
451 isaac_img_dark_config.nsamples, &rms, NULL);
452 cpl_matrix_set(rons, i, 0, rms * norm);
453 cpl_msg_info(cpl_func,
"RON in LL quadrant: %g", rms * norm);
456 zone_def[0] = cpl_image_get_size_x(tmp_im)/2 + 1;
457 zone_def[1] = cpl_image_get_size_x(tmp_im);
459 zone_def[3] = cpl_image_get_size_y(tmp_im)/2;
460 cpl_flux_get_noise_window(tmp_im, zone_def,
461 isaac_img_dark_config.hsize,
462 isaac_img_dark_config.nsamples, &rms, NULL);
463 cpl_matrix_set(rons, i, 1, rms * norm);
464 cpl_msg_info(cpl_func,
"RON in LR quadrant: %g", rms * norm);
468 zone_def[1] = cpl_image_get_size_x(tmp_im)/2;
469 zone_def[2] = cpl_image_get_size_y(tmp_im)/2 + 1;
470 zone_def[3] = cpl_image_get_size_y(tmp_im);
471 cpl_flux_get_noise_window(tmp_im, zone_def,
472 isaac_img_dark_config.hsize,
473 isaac_img_dark_config.nsamples, &rms, NULL);
474 cpl_matrix_set(rons, i, 2, rms * norm);
475 cpl_msg_info(cpl_func,
"RON in UL quadrant: %g", rms * norm);
478 zone_def[0] = cpl_image_get_size_x(tmp_im)/2 + 1;
479 zone_def[1] = cpl_image_get_size_x(tmp_im);
480 zone_def[2] = cpl_image_get_size_y(tmp_im)/2 + 1;
481 zone_def[3] = cpl_image_get_size_y(tmp_im);
482 cpl_flux_get_noise_window(tmp_im, zone_def,
483 isaac_img_dark_config.hsize,
484 isaac_img_dark_config.nsamples, &rms, NULL);
485 cpl_matrix_set(rons, i, 3, rms * norm);
486 cpl_msg_info(cpl_func,
"RON in UR quadrant: %g", rms * norm);
487 cpl_image_delete(tmp_im);
492 rons = cpl_matrix_new(cpl_imagelist_get_size(iset)-1, 1);
493 if (isaac_img_dark_config.hsize < 0)
494 isaac_img_dark_config.hsize = ISAAC_DARK_HSIZE_LW_DEF;
497 for (i=0; i<cpl_imagelist_get_size(iset)-1; i++) {
498 cpl_msg_info(cpl_func,
"Pair number %d", i+1);
500 if (cpl_error_get_code()) {
501 cpl_matrix_delete(rons);
502 cpl_imagelist_delete(iset);
505 cur_frame = cpl_frameset_get_position(framelist, i);
506 plist = cpl_propertylist_load(cpl_frame_get_filename(cur_frame),
509 cpl_propertylist_delete(plist);
510 if (cpl_error_get_code()) {
511 cpl_msg_error(cpl_func,
"Cannot get the NDIT");
512 cpl_matrix_delete(rons);
513 cpl_imagelist_delete(iset);
520 if ((tmp_im = cpl_image_subtract_create(
521 cpl_imagelist_get(iset, i),
522 cpl_imagelist_get(iset, i+1))) == NULL) {
523 cpl_msg_error(cpl_func,
"Cannot subtract the images");
524 cpl_imagelist_delete(iset);
525 cpl_matrix_delete(rons);
530 cpl_flux_get_noise_window(tmp_im, NULL,
531 isaac_img_dark_config.hsize,
532 isaac_img_dark_config.nsamples, &rms, NULL);
533 cpl_matrix_set(rons, i, 0, rms * norm);
534 cpl_msg_info(cpl_func,
"RON: %g", rms * norm);
535 cpl_image_delete(tmp_im);
539 cpl_msg_error(cpl_func,
"Unsupported arm");
540 cpl_matrix_delete(rons);
546 cpl_imagelist_delete(iset);
562 static int isaac_img_dark_save(
567 cpl_parameterlist * parlist,
568 cpl_frameset * set_tot)
570 cpl_propertylist * plist;
571 cpl_propertylist * qclist;
572 cpl_propertylist * paflist;
573 const cpl_frame * ref_frame;
579 qclist = cpl_propertylist_new();
580 cpl_propertylist_append_double(qclist,
"ESO QC DARKMED",
581 isaac_img_dark_config.dark_med);
582 cpl_propertylist_append_double(qclist,
"ESO QC DARKSTDEV",
583 isaac_img_dark_config.dark_stdev);
585 switch (cpl_matrix_get_ncol(rons)) {
587 for (i=0; i<cpl_matrix_get_nrow(rons); i++) {
588 sprintf(qc_str,
"ESO QC RON%d", i+1);
589 cpl_propertylist_append_double(qclist, qc_str,
590 cpl_matrix_get(rons, i, 0));
594 for (i=0; i<cpl_matrix_get_nrow(rons); i++) {
595 sprintf(qc_str,
"ESO QC LL RON%d", i+1);
596 cpl_propertylist_append_double(qclist, qc_str,
597 cpl_matrix_get(rons, i, 0));
598 sprintf(qc_str,
"ESO QC LR RON%d", i+1);
599 cpl_propertylist_append_double(qclist, qc_str,
600 cpl_matrix_get(rons, i, 1));
601 sprintf(qc_str,
"ESO QC UL RON%d", i+1);
602 cpl_propertylist_append_double(qclist, qc_str,
603 cpl_matrix_get(rons, i, 2));
604 sprintf(qc_str,
"ESO QC UR RON%d", i+1);
605 cpl_propertylist_append_double(qclist, qc_str,
606 cpl_matrix_get(rons, i, 3));
610 cpl_msg_error(cpl_func,
"Invalid RONs matrix format");
616 filename = cpl_sprintf(
"isaac_img_dark_set%02d_avg.fits", set_nb);
617 irplib_dfs_save_image(set_tot,
626 PACKAGE
"/" PACKAGE_VERSION,
631 ref_frame = irplib_frameset_get_first_from_group(set, CPL_FRAME_GROUP_RAW);
634 if ((plist=cpl_propertylist_load(cpl_frame_get_filename(ref_frame),
636 cpl_msg_error(cpl_func,
"getting header from reference frame");
637 cpl_propertylist_delete(qclist);
638 return CPL_ERROR_UNSPECIFIED;
642 paflist = cpl_propertylist_new();
643 cpl_propertylist_copy_property_regexp(paflist, plist,
644 "^(ARCFILE|MJD-OBS|ESO TPL ID|ESO DPR TECH|DATE-OBS|ESO DET DIT|"
645 "ESO DET NDIT|ESO DET NCORRS|ESO DET NDSAMPLES|ESO DET MODE NAME)$", 0);
646 cpl_propertylist_delete(plist);
649 cpl_propertylist_copy_property_regexp(paflist, qclist,
".", 0);
650 cpl_propertylist_delete(qclist);
653 cpl_propertylist_update_string(paflist, CPL_DFS_PRO_CATG,
657 filename = cpl_sprintf(
"isaac_img_dark_set%02d.paf", set_nb);
658 cpl_dfs_save_paf(
"ISAAC",
663 cpl_propertylist_delete(paflist);
675 static int isaac_img_dark_compare(
676 const cpl_frame * frame1,
677 const cpl_frame * frame2)
680 cpl_propertylist * plist1;
681 cpl_propertylist * plist2;
686 if (frame1==NULL || frame2==NULL)
return CPL_ERROR_UNSPECIFIED;
689 if ((plist1=cpl_propertylist_load(cpl_frame_get_filename(frame1),
691 cpl_msg_error(cpl_func,
"getting header from reference frame");
692 return CPL_ERROR_UNSPECIFIED;
694 if ((plist2=cpl_propertylist_load(cpl_frame_get_filename(frame2),
696 cpl_msg_error(cpl_func,
"getting header from reference frame");
697 cpl_propertylist_delete(plist1);
698 return CPL_ERROR_UNSPECIFIED;
702 if (cpl_error_get_code()) {
703 cpl_propertylist_delete(plist1);
704 cpl_propertylist_delete(plist2);
705 return CPL_ERROR_UNSPECIFIED;
712 if (cpl_error_get_code()) {
713 cpl_msg_error(cpl_func,
"cannot get exposure time");
714 cpl_propertylist_delete(plist1);
715 cpl_propertylist_delete(plist2);
716 return CPL_ERROR_UNSPECIFIED;
718 if (fabs(dval1-dval2) > 1e-5) comparison = 0;
723 if (cpl_error_get_code()) {
724 cpl_msg_error(cpl_func,
"cannot get NDIT");
725 cpl_propertylist_delete(plist1);
726 cpl_propertylist_delete(plist2);
727 return CPL_ERROR_UNSPECIFIED;
729 if (ival1 != ival2) comparison = 0;
734 if (cpl_error_get_code()) {
735 cpl_msg_error(cpl_func,
"cannot get read-out mode");
736 cpl_propertylist_delete(plist1);
737 cpl_propertylist_delete(plist2);
738 return CPL_ERROR_UNSPECIFIED;
740 if (ival1 != ival2) comparison = 0;
743 cpl_propertylist_delete(plist1);
744 cpl_propertylist_delete(plist2);
int isaac_dfs_set_groups(cpl_frameset *set)
Set the group as RAW or CALIB in a frameset.
double isaac_pfits_get_dit(const cpl_propertylist *plist)
find out the DIT value
int isaac_pfits_get_rom(const cpl_propertylist *plist)
find out the read out mode
int isaac_pfits_get_ndit(const cpl_propertylist *plist)
find out the NDIT keyword
const char * isaac_pfits_get_arm(const cpl_propertylist *plist)
find out the arm which is active
const char * isaac_get_license(void)
Get the pipeline copyright and license.