33#include "cr2res_utils.h"
34#include "cr2res_pfits.h"
35#include "cr2res_dfs.h"
37#include "cr2res_bpm.h"
39#include "cr2res_calib.h"
45#define RECIPE_STRING "cr2res_cal_dark"
51int cpl_plugin_get_info(cpl_pluginlist * list);
57static int cr2res_cal_dark_compare(
58 const cpl_frame * frame1,
59 const cpl_frame * frame2) ;
61static int cr2res_cal_dark_create(cpl_plugin *);
62static int cr2res_cal_dark_exec(cpl_plugin *);
63static int cr2res_cal_dark_destroy(cpl_plugin *);
64static int cr2res_cal_dark(cpl_frameset *,
const cpl_parameterlist *);
70static char cr2res_cal_dark_description[] =
"\
72 Compute the master dark \n\
75 raw.fits " CR2RES_DARK_RAW
" [3 to n] \n\
78 cr2res_cal_dark_[setting]_DITxNDIT_master.fits "
79 CR2RES_CAL_DARK_MASTER_PROCATG
"\n\
80 cr2res_cal_dark_[setting]_DITxNDIT_bpm.fits "
81 CR2RES_CAL_DARK_BPM_PROCATG
"\n\
84 group the input frames by different values of DET SEQ1 DIT \n\
85 or/and DET NDIT or/and WLEN ID \n\
87 loop on detectors d: \n\
88 Load the images and create the associate error for each of \n\
89 them using cr2res_detector_shotnoise_model(--gain) \n\
90 Collapse the images with hdrl_imagelist_collapse(--collapse.*) \n\
91 Compute BPM from the collapsed master dark using \n\
92 cr2res_bpm_compute(--bpm_kappa, --bpm_lines_ratio) \n\
93 Set the BPM in the master dark \n\
94 Compute the QCs with statistics and \n\
95 cr2res_dark_qc_ron(--ron_hsize, --ron_nsamples) \n\
96 save master dark(g) \n\
99 Library Functions used \n\
100 cr2res_detector_shotnoise_model() \n\
101 cr2res_bpm_compute() \n\
102 cr2res_bpm_from_mask() \n\
103 cr2res_dark_qc_ron() \n\
104 cr2res_bpm_count() \n\
105 cr2res_io_save_MASTER_DARK() \n\
106 cr2res_io_save_BPM() \n\
124int cpl_plugin_get_info(cpl_pluginlist * list)
126 cpl_recipe * recipe = cpl_calloc(1,
sizeof *recipe );
127 cpl_plugin * plugin = &recipe->interface;
129 if (cpl_plugin_init(plugin,
131 CR2RES_BINARY_VERSION,
132 CPL_PLUGIN_TYPE_RECIPE,
135 cr2res_cal_dark_description,
136 CR2RES_PIPELINE_AUTHORS,
139 cr2res_cal_dark_create,
140 cr2res_cal_dark_exec,
141 cr2res_cal_dark_destroy)) {
142 cpl_msg_error(cpl_func,
"Plugin initialization failed");
143 (void)cpl_error_set_where(cpl_func);
147 if (cpl_pluginlist_append(list, plugin)) {
148 cpl_msg_error(cpl_func,
"Error adding plugin to list");
149 (void)cpl_error_set_where(cpl_func);
165static int cr2res_cal_dark_create(cpl_plugin * plugin)
167 cpl_recipe * recipe ;
169 cpl_parameterlist * collapse_par ;
170 hdrl_parameter * sigclip_def ;
171 hdrl_parameter * minmax_def ;
172 hdrl_parameter * mode_def ;
175 if (cpl_plugin_get_type(plugin) == CPL_PLUGIN_TYPE_RECIPE)
176 recipe = (cpl_recipe *)plugin;
181 recipe->parameters = cpl_parameterlist_new();
186 p = cpl_parameter_new_value(
"cr2res.cr2res_cal_dark.detector",
187 CPL_TYPE_INT,
"Only reduce the specified detector",
188 "cr2res.cr2res_cal_dark", 0);
189 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"detector");
190 cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
191 cpl_parameterlist_append(recipe->parameters, p);
194 p = cpl_parameter_new_value(
"cr2res.cr2res_cal_dark.bpm_method",
195 CPL_TYPE_STRING,
"Method (DEFAULT, GLOBAL, LOCAL or RUNNING)",
196 "cr2res.cr2res_cal_dark",
"DEFAULT");
197 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"bpm_method");
198 cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
199 cpl_parameterlist_append(recipe->parameters, p);
202 p = cpl_parameter_new_value(
"cr2res_cal_dark.bpm_kappa", CPL_TYPE_DOUBLE,
203 "Kappa Threshold for the BPM",
"cr2res_cal_dark", -1.0);
204 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"bpm_kappa");
205 cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
206 cpl_parameterlist_append(recipe->parameters, p);
209 p = cpl_parameter_new_value(
"cr2res_cal_dark.bpm_lines_ratio",
210 CPL_TYPE_DOUBLE,
"Maximum ratio of bad pixels per line",
211 "cr2res_cal_dark", 0.5);
212 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"bpm_lines_ratio");
213 cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
214 cpl_parameterlist_append(recipe->parameters, p);
217 p = cpl_parameter_new_value(
"cr2res_cal_dark.ron_hsize",
218 CPL_TYPE_INT,
"Half size of the window for RON computation",
219 "cr2res_cal_dark", 6);
220 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"ron_hsize");
221 cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
222 cpl_parameterlist_append(recipe->parameters, p);
225 p = cpl_parameter_new_value(
"cr2res_cal_dark.ron_nsamples",
226 CPL_TYPE_INT,
"Number of samples for RON computation",
227 "cr2res_cal_dark", 100);
228 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"ron_nsamples");
229 cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
230 cpl_parameterlist_append(recipe->parameters, p);
233 p = cpl_parameter_new_value(
"cr2res_cal_dark.gain", CPL_TYPE_DOUBLE,
234 "Gain in [e- / ADU]",
"cr2res_cal_dark", 2.1);
235 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI,
"gain");
236 cpl_parameter_disable(p, CPL_PARAMETER_MODE_ENV);
237 cpl_parameterlist_append(recipe->parameters, p);
243 HDRL_MODE_MEDIAN, 0);
245 "collapse",
"MEAN", sigclip_def, minmax_def, mode_def) ;
249 for (p = cpl_parameterlist_get_first(collapse_par) ;
250 p != NULL; p = cpl_parameterlist_get_next(collapse_par))
251 cpl_parameterlist_append(recipe->parameters,cpl_parameter_duplicate(p));
252 cpl_parameterlist_delete(collapse_par);
264static int cr2res_cal_dark_exec(cpl_plugin * plugin)
269 if (cpl_plugin_get_type(plugin) == CPL_PLUGIN_TYPE_RECIPE)
270 recipe = (cpl_recipe *)plugin;
273 return cr2res_cal_dark(recipe->frames, recipe->parameters);
283static int cr2res_cal_dark_destroy(cpl_plugin * plugin)
288 if (cpl_plugin_get_type(plugin) == CPL_PLUGIN_TYPE_RECIPE)
289 recipe = (cpl_recipe *)plugin;
292 cpl_parameterlist_delete(recipe->parameters);
304static int cr2res_cal_dark(
305 cpl_frameset * frameset,
306 const cpl_parameterlist * parlist)
308 const cpl_parameter * par ;
309 int reduce_det, ron_hsize, ron_nsamples, ndit ;
310 double gain, dit, bpm_kappa, bpm_lines_ratio ;
311 cr2res_bpm_method bpm_method, my_bpm_method ;
313 hdrl_parameter * collapse_params ;
314 cpl_frameset * rawframes ;
315 cpl_frameset * raw_one ;
316 cpl_frameset * raw_one_calib ;
319 cpl_propertylist * plist ;
320 cpl_propertylist * qc_main ;
322 double bpm_kappa_global_default, bpm_kappa_local_default,
323 bpm_kappa_running_default, my_bpm_kappa ;
325 hdrl_image * master_darks[CR2RES_NB_DETECTORS] ;
326 cpl_image * bpms[CR2RES_NB_DETECTORS] ;
327 cpl_propertylist * ext_plist[CR2RES_NB_DETECTORS] ;
329 hdrl_imagelist * dark_cube ;
332 hdrl_image * ima_data ;
333 hdrl_image * ima_data_err ;
334 cpl_image * ima_err ;
336 double ron1, ron2, med, mean, sigma ;
337 cpl_image * contrib_map;
341 int i, l, det_nr, nb_bad ;
342 int single_dit_ndit_setting ;
344 double original_dit ;
345 char * original_setting ;
348 bpm_kappa_global_default = 0.5 ;
349 bpm_kappa_local_default = 6.0 ;
350 bpm_kappa_running_default = 5.0 ;
354 par = cpl_parameterlist_find_const(parlist,
355 "cr2res.cr2res_cal_dark.detector");
356 reduce_det = cpl_parameter_get_int(par);
359 par = cpl_parameterlist_find_const(parlist,
360 "cr2res.cr2res_cal_dark.bpm_method");
361 sval = cpl_parameter_get_string(par);
362 if (!strcmp(sval,
"GLOBAL")) bpm_method = CR2RES_BPM_GLOBAL_STATS ;
363 else if (!strcmp(sval,
"LOCAL")) bpm_method = CR2RES_BPM_LOCAL_STATS ;
364 else if (!strcmp(sval,
"RUNNING")) bpm_method = CR2RES_BPM_RUNNING_FILTER ;
365 else if (!strcmp(sval,
"DEFAULT")) bpm_method = CR2RES_BPM_UNSPECIFIED ;
367 cpl_msg_error(__func__,
"Unsupported bpm method") ;
368 cpl_error_set(__func__, CPL_ERROR_ILLEGAL_INPUT) ;
373 par = cpl_parameterlist_find_const(parlist,
"cr2res_cal_dark.ron_hsize");
374 ron_hsize = cpl_parameter_get_int(par);
377 par = cpl_parameterlist_find_const(parlist,
"cr2res_cal_dark.ron_nsamples");
378 ron_nsamples = cpl_parameter_get_int(par);
381 par = cpl_parameterlist_find_const(parlist,
"cr2res_cal_dark.bpm_kappa");
382 bpm_kappa = cpl_parameter_get_double(par);
384 if (bpm_kappa < 0.0) {
385 if (bpm_method == CR2RES_BPM_GLOBAL_STATS)
386 bpm_kappa = bpm_kappa_global_default ;
387 if (bpm_method == CR2RES_BPM_LOCAL_STATS)
388 bpm_kappa = bpm_kappa_local_default ;
389 if (bpm_method == CR2RES_BPM_RUNNING_FILTER)
390 bpm_kappa = bpm_kappa_running_default ;
394 par = cpl_parameterlist_find_const(parlist,
395 "cr2res_cal_dark.bpm_lines_ratio");
396 bpm_lines_ratio = cpl_parameter_get_double(par);
399 par = cpl_parameterlist_find_const(parlist,
"cr2res_cal_dark.gain");
400 gain = cpl_parameter_get_double(par);
404 "cr2res_cal_dark.collapse") ;
409 cpl_msg_error(__func__,
"Cannot identify RAW and CALIB frames") ;
410 cpl_error_set(__func__, CPL_ERROR_ILLEGAL_INPUT) ;
418 if (rawframes==NULL || cpl_frameset_get_size(rawframes) <= 0) {
420 cpl_msg_error(__func__,
"Cannot find any RAW file") ;
421 cpl_error_set(__func__, CPL_ERROR_DATA_NOT_FOUND) ;
426 if ((labels = cpl_frameset_labelise(rawframes, cr2res_cal_dark_compare,
427 &nlabels)) == NULL) {
428 cpl_msg_error(__func__,
"Cannot labelise input frames") ;
429 cpl_frameset_delete(rawframes) ;
431 cpl_error_set(__func__, CPL_ERROR_ILLEGAL_INPUT) ;
436 single_dit_ndit_setting = -1 ;
437 original_setting = NULL ;
438 for (l=0 ; l<(int)nlabels ; l++) {
440 raw_one = cpl_frameset_extract(rawframes, labels, (cpl_size)l) ;
443 plist = cpl_propertylist_load(cpl_frame_get_filename(
444 cpl_frameset_get_position(raw_one, 0)), 0) ;
449 cpl_propertylist_delete(plist) ;
452 if (single_dit_ndit_setting < 0) {
453 single_dit_ndit_setting = 1;
455 original_ndit = ndit ;
456 original_setting = cpl_strdup(setting_id) ;
458 if (fabs(original_dit-dit)>1e-3 || original_ndit != ndit ||
459 strcmp(original_setting, setting_id)) {
460 single_dit_ndit_setting = 0 ;
463 cpl_free(setting_id);
464 cpl_frameset_delete(raw_one) ;
466 cpl_free(original_setting);
469 for (l = 0; l < (int)nlabels; l++) {
470 cpl_vector *qc_ron1, *qc_ron2, *qc_nb_bad, *qc_mean, *qc_med, *qc_sigma;
471 const char *first_fname;
474 raw_one = cpl_frameset_extract(rawframes, labels, (cpl_size)l) ;
475 nb_frames = cpl_frameset_get_size(raw_one) ;
477 cpl_frame_get_filename(cpl_frameset_get_position(raw_one, 0)) ;
480 plist = cpl_propertylist_load(first_fname, 0) ;
485 cpl_propertylist_delete(plist) ;
487 cpl_msg_info(__func__,
"Process SETTING %s / DIT %g / %d",
488 setting_id, dit, ndit) ;
489 cpl_msg_indent_more() ;
492 qc_ron1 = cpl_vector_new(CR2RES_NB_DETECTORS);
493 qc_ron2 = cpl_vector_new(CR2RES_NB_DETECTORS);
494 qc_nb_bad = cpl_vector_new(CR2RES_NB_DETECTORS);
495 qc_mean = cpl_vector_new(CR2RES_NB_DETECTORS);
496 qc_med = cpl_vector_new(CR2RES_NB_DETECTORS);
497 qc_sigma = cpl_vector_new(CR2RES_NB_DETECTORS);
500 for (det_nr=1 ; det_nr<=CR2RES_NB_DETECTORS ; det_nr++) {
502 master_darks[det_nr-1] = NULL ;
503 bpms[det_nr-1] = NULL ;
504 cpl_vector_set(qc_ron1, det_nr-1, -1.0) ;
505 cpl_vector_set(qc_ron2, det_nr-1, -1.0) ;
506 cpl_vector_set(qc_nb_bad, det_nr-1, -1.0) ;
507 cpl_vector_set(qc_mean, det_nr-1, -1.0) ;
508 cpl_vector_set(qc_med, det_nr-1, -1.0) ;
509 cpl_vector_set(qc_sigma, det_nr-1, -1.0) ;
512 ext_plist[det_nr-1] = cpl_propertylist_load(first_fname,
516 if (reduce_det != 0 && det_nr != reduce_det) continue ;
518 cpl_msg_info(__func__,
"Process Detector nb %i", det_nr) ;
519 cpl_msg_indent_more() ;
523 for (i=0; i<nb_frames ; i++) {
525 fname=cpl_frame_get_filename(
526 cpl_frameset_get_position(raw_one, i)) ;
527 cpl_msg_info(__func__,
"Load Image from File %s / Detector %i",
532 cpl_msg_error(__func__,
533 "Cannot load image from File %s / Detector %d",
535 cpl_error_set(__func__, CPL_ERROR_DATA_NOT_FOUND) ;
536 cpl_msg_indent_less() ;
537 cpl_msg_indent_less() ;
538 cpl_frameset_delete(rawframes) ;
541 cpl_free(setting_id) ;
542 cpl_frameset_delete(raw_one) ;
544 cpl_vector_delete(qc_ron1) ;
545 cpl_vector_delete(qc_ron2) ;
546 cpl_vector_delete(qc_nb_bad) ;
547 cpl_vector_delete(qc_mean) ;
548 cpl_vector_delete(qc_med) ;
549 cpl_vector_delete(qc_sigma) ;
554 cpl_msg_info(__func__,
"Create the associated Noise image");
557 &ima_err) != CPL_ERROR_NONE) {
559 cpl_msg_error(__func__,
"Cannot create the Noise image") ;
560 cpl_error_set(__func__, CPL_ERROR_DATA_NOT_FOUND) ;
561 cpl_msg_indent_less() ;
562 cpl_msg_indent_less() ;
563 cpl_frameset_delete(rawframes) ;
565 cpl_free(setting_id) ;
567 cpl_frameset_delete(raw_one) ;
570 cpl_vector_delete(qc_ron1) ;
571 cpl_vector_delete(qc_ron2) ;
572 cpl_vector_delete(qc_nb_bad) ;
573 cpl_vector_delete(qc_mean) ;
574 cpl_vector_delete(qc_med) ;
575 cpl_vector_delete(qc_sigma) ;
582 cpl_image_delete(ima_err) ;
591 &(master_darks[det_nr-1]), &contrib_map) != CPL_ERROR_NONE){
592 cpl_msg_warning(__func__,
"Cannot collapse Detector %d",det_nr);
593 master_darks[det_nr-1] = NULL ;
596 cpl_image_delete(contrib_map);
599 if (master_darks[det_nr-1] != NULL) {
602 if (bpm_method == CR2RES_BPM_UNSPECIFIED) {
604 my_bpm_method = CR2RES_BPM_GLOBAL_STATS ;
606 my_bpm_kappa = bpm_kappa_global_default ;
608 my_bpm_kappa = bpm_kappa ;
610 my_bpm_method = CR2RES_BPM_LOCAL_STATS ;
612 my_bpm_kappa = bpm_kappa_local_default ;
614 my_bpm_kappa = bpm_kappa ;
617 my_bpm_method = bpm_method ;
618 my_bpm_kappa = bpm_kappa ;
622 my_bpm_method, my_bpm_kappa, bpm_lines_ratio,
624 cpl_msg_warning(__func__,
"Cannot create BPM") ;
629 cpl_mask_delete(my_bpm) ;
634 if (bpms[det_nr-1] != NULL) {
636 bpm = cpl_mask_threshold_image_create(bpms[det_nr-1],-0.5,0.5) ;
648 cpl_mask_delete(bpm) ;
658 ron_hsize, ron_nsamples, ndit) ;
662 ron_hsize, ron_nsamples, ndit) ;
663 if (cpl_error_get_code()) {
666 cpl_propertylist_append_double(ext_plist[det_nr-1],
667 CR2RES_HEADER_QC_DARK_RON1, ron1) ;
668 cpl_propertylist_append_double(ext_plist[det_nr-1],
669 CR2RES_HEADER_QC_DARK_RON2, ron2) ;
670 cpl_vector_set(qc_ron1, det_nr-1, ron1) ;
671 cpl_vector_set(qc_ron2, det_nr-1, ron2) ;
678 if (master_darks[det_nr-1] != NULL) {
680 med = cpl_image_get_median_dev(
682 mean = cpl_image_get_mean(
685 cpl_propertylist_append_double(ext_plist[det_nr-1],
686 CR2RES_HEADER_QC_DARK_MEAN, mean) ;
687 cpl_propertylist_append_double(ext_plist[det_nr-1],
688 CR2RES_HEADER_QC_DARK_MEDIAN, med) ;
689 cpl_propertylist_append_double(ext_plist[det_nr-1],
690 CR2RES_HEADER_QC_DARK_STDEV, sigma) ;
691 cpl_vector_set(qc_mean, det_nr-1, mean) ;
692 cpl_vector_set(qc_med, det_nr-1, med) ;
693 cpl_vector_set(qc_sigma, det_nr-1, sigma) ;
696 if (bpms[det_nr-1] != NULL) {
698 cpl_propertylist_append_int(ext_plist[det_nr-1],
699 CR2RES_HEADER_QC_DARK_NBAD, nb_bad) ;
700 cpl_vector_set(qc_nb_bad, det_nr-1, (
double)nb_bad) ;
702 cpl_msg_indent_less() ;
707 if (reduce_det == 0) {
708 qc_main = cpl_propertylist_new() ;
709 cpl_propertylist_append_double(qc_main,
710 CR2RES_HEADER_QC_DARK_RON1_AVG,
711 cpl_vector_get_mean(qc_ron1)) ;
712 cpl_propertylist_append_double(qc_main,
713 CR2RES_HEADER_QC_DARK_RON1_RMS,
714 cpl_vector_get_stdev(qc_ron1)) ;
716 cpl_propertylist_append_double(qc_main,
717 CR2RES_HEADER_QC_DARK_RON2_AVG,
718 cpl_vector_get_mean(qc_ron2)) ;
719 cpl_propertylist_append_double(qc_main,
720 CR2RES_HEADER_QC_DARK_RON2_RMS,
721 cpl_vector_get_stdev(qc_ron2)) ;
723 cpl_propertylist_append_double(qc_main,
724 CR2RES_HEADER_QC_DARK_NBAD_AVG,
725 cpl_vector_get_mean(qc_nb_bad)) ;
726 cpl_propertylist_append_double(qc_main,
727 CR2RES_HEADER_QC_DARK_NBAD_RMS,
728 cpl_vector_get_stdev(qc_nb_bad)) ;
730 cpl_propertylist_append_double(qc_main,
731 CR2RES_HEADER_QC_DARK_MEAN_AVG,
732 cpl_vector_get_mean(qc_mean)) ;
733 cpl_propertylist_append_double(qc_main,
734 CR2RES_HEADER_QC_DARK_MEAN_RMS,
735 cpl_vector_get_stdev(qc_mean)) ;
737 cpl_propertylist_append_double(qc_main,
738 CR2RES_HEADER_QC_DARK_MEDIAN_AVG,
739 cpl_vector_get_mean(qc_med)) ;
740 cpl_propertylist_append_double(qc_main,
741 CR2RES_HEADER_QC_DARK_MEDIAN_RMS,
742 cpl_vector_get_stdev(qc_med)) ;
744 cpl_propertylist_append_double(qc_main,
745 CR2RES_HEADER_QC_DARK_STDEV_AVG,
746 cpl_vector_get_mean(qc_sigma)) ;
747 cpl_propertylist_append_double(qc_main,
748 CR2RES_HEADER_QC_DARK_STDEV_RMS,
749 cpl_vector_get_stdev(qc_sigma)) ;
752 cpl_vector_delete(qc_ron1) ;
753 cpl_vector_delete(qc_ron2) ;
754 cpl_vector_delete(qc_nb_bad) ;
755 cpl_vector_delete(qc_mean) ;
756 cpl_vector_delete(qc_med) ;
757 cpl_vector_delete(qc_sigma) ;
762 raw_one_calib = cpl_frameset_duplicate(raw_one) ;
763 cpl_frameset_delete(raw_one) ;
764 for (i=0 ; i<cpl_frameset_get_size(frameset) ; i++) {
765 frame = cpl_frameset_get_position(frameset, i);
766 if (cpl_frame_get_group(frame) == CPL_FRAME_GROUP_CALIB) {
767 cpl_frameset_insert(raw_one_calib,
768 cpl_frame_duplicate(frame)) ;
773 if (single_dit_ndit_setting) {
774 filename = cpl_sprintf(
"%s_master.fits", RECIPE_STRING);
776 filename = cpl_sprintf(
"%s_%s_%gx%d_master.fits",
777 RECIPE_STRING, setting_id, dit, ndit);
781 parlist, master_darks, qc_main, ext_plist,
782 CR2RES_CAL_DARK_MASTER_PROCATG, RECIPE_STRING) != 0) {
783 if (qc_main != NULL) cpl_propertylist_delete(qc_main) ;
784 cpl_frameset_delete(rawframes) ;
785 cpl_frameset_delete(raw_one_calib) ;
786 for (det_nr=1 ; det_nr<=CR2RES_NB_DETECTORS ; det_nr++) {
787 if (bpms[det_nr-1] != NULL)
788 cpl_image_delete(bpms[det_nr-1]);
789 if (master_darks[det_nr-1] != NULL)
791 if (ext_plist[det_nr-1] != NULL)
792 cpl_propertylist_delete(ext_plist[det_nr-1]);
795 cpl_free(setting_id);
798 cpl_msg_error(__func__,
"Cannot save the MASTER DARK") ;
799 cpl_error_set(__func__, CPL_ERROR_ILLEGAL_INPUT) ;
800 cpl_msg_indent_less() ;
804 if (qc_main != NULL) cpl_propertylist_delete(qc_main) ;
808 if (single_dit_ndit_setting) {
809 filename = cpl_sprintf(
"%s_bpm.fits", RECIPE_STRING);
811 filename = cpl_sprintf(
"%s_%s_%gx%d_bpm.fits",
812 RECIPE_STRING, setting_id, dit, ndit);
816 parlist, bpms, NULL, ext_plist,
817 CR2RES_CAL_DARK_BPM_PROCATG, RECIPE_STRING) != 0) {
818 cpl_frameset_delete(rawframes) ;
819 cpl_frameset_delete(raw_one_calib) ;
820 for (det_nr=1 ; det_nr<=CR2RES_NB_DETECTORS ; det_nr++) {
821 if (bpms[det_nr-1] != NULL)
822 cpl_image_delete(bpms[det_nr-1]);
823 if (master_darks[det_nr-1] != NULL)
825 if (ext_plist[det_nr-1] != NULL)
826 cpl_propertylist_delete(ext_plist[det_nr-1]);
829 cpl_free(setting_id);
832 cpl_msg_error(__func__,
"Cannot save the BPM") ;
833 cpl_error_set(__func__, CPL_ERROR_ILLEGAL_INPUT) ;
834 cpl_msg_indent_less() ;
841 cpl_free(setting_id);
842 cpl_frameset_delete(raw_one_calib) ;
843 for (det_nr=1 ; det_nr<=CR2RES_NB_DETECTORS ; det_nr++) {
844 if (bpms[det_nr-1] != NULL)
845 cpl_image_delete(bpms[det_nr-1]);
846 if (master_darks[det_nr-1] != NULL)
848 if (ext_plist[det_nr-1] != NULL)
849 cpl_propertylist_delete(ext_plist[det_nr-1]);
851 cpl_msg_indent_less() ;
855 cpl_frameset_delete(rawframes) ;
857 return (
int)cpl_error_get_code();
868static int cr2res_cal_dark_compare(
869 const cpl_frame * frame1,
870 const cpl_frame * frame2)
873 cpl_propertylist * plist1 ;
874 cpl_propertylist * plist2 ;
875 double dval1, dval2 ;
881 if (frame1==NULL || frame2==NULL)
return -1 ;
884 if ((plist1=cpl_propertylist_load(cpl_frame_get_filename(frame1),0))==NULL){
885 cpl_msg_error(__func__,
"getting header from reference frame");
888 if ((plist2=cpl_propertylist_load(cpl_frame_get_filename(frame2),0))==NULL){
889 cpl_msg_error(__func__,
"getting header from reference frame");
890 cpl_propertylist_delete(plist1) ;
895 if (cpl_error_get_code()) {
896 cpl_propertylist_delete(plist1) ;
897 cpl_propertylist_delete(plist2) ;
906 if (cpl_error_get_code()) {
907 cpl_msg_error(__func__,
"Cannot get the reference wavelength");
908 cpl_propertylist_delete(plist1) ;
909 cpl_propertylist_delete(plist2) ;
912 if (strcmp(sval1, sval2)) comparison = 0 ;
917 if (cpl_error_get_code()) {
918 cpl_msg_error(__func__,
"Cannot get the DIT");
919 cpl_propertylist_delete(plist1) ;
920 cpl_propertylist_delete(plist2) ;
923 if (fabs(dval1-dval2) > 1e-3) comparison = 0 ;
928 if (cpl_error_get_code()) {
929 cpl_msg_error(__func__,
"Cannot get the NDIT");
930 cpl_propertylist_delete(plist1) ;
931 cpl_propertylist_delete(plist2) ;
934 if (ival1 != ival2) comparison = 0 ;
936 cpl_propertylist_delete(plist1) ;
937 cpl_propertylist_delete(plist2) ;
cpl_image * cr2res_bpm_from_mask(cpl_mask *mask, cr2res_bpm_type type)
Create a BPM from a mask.
cpl_mask * cr2res_bpm_compute(cpl_image *in, cr2res_bpm_method method, double kappa, double lines_ratio, int clean_flag)
The BPM computation with min/max threshold.
int cr2res_bpm_count(cpl_image *bpm, cr2res_bpm_type type)
Count BPM of a given type.
cpl_error_code cr2res_dfs_set_groups(cpl_frameset *set)
Set the group as RAW or CALIB in a frameset.
int cr2res_io_save_MASTER_DARK(const char *filename, cpl_frameset *allframes, cpl_frameset *inframes, const cpl_parameterlist *parlist, hdrl_image **master_darks, const cpl_propertylist *qc_list, cpl_propertylist **ext_plist, const char *procatg, const char *recipe)
Save a MASTER_DARK.
int cr2res_io_get_ext_idx(const char *filename, int detector, int data)
Get the wished extension number for a detector.
hdrl_image * cr2res_io_load_image(const char *in, int detector)
Load an hdrl image from a image file.
int cr2res_io_save_BPM(const char *filename, cpl_frameset *allframes, cpl_frameset *inframes, const cpl_parameterlist *parlist, cpl_image **bpms, const cpl_propertylist *qc_list, cpl_propertylist **ext_plist, const char *procatg, const char *recipe)
Save a BPM.
const char * cr2res_pfits_get_wlen_id(const cpl_propertylist *plist)
find out the Setting
double cr2res_pfits_get_dit(const cpl_propertylist *plist)
find out the DIT value
int cr2res_pfits_get_ndit(const cpl_propertylist *plist)
find out the NDIT value
double cr2res_dark_qc_ron(const cpl_image *ima1, const cpl_image *ima2, int hsize, int nsamples, int ndit)
The Read Out Noise computation.
int cr2res_format_setting(char *setting_id)
Format the setting.
cpl_error_code cr2res_detector_shotnoise_model(const cpl_image *ima_data, const double gain, const double ron, cpl_image **ima_errs)
compute photon count error in [ADU]
int cr2res_is_short_wavelength(const char *setting_id)
Identify Short Wavelength.
cpl_frameset * cr2res_extract_frameset(const cpl_frameset *in, const char *tag)
Extract the frames with the given tag from a frameset.
char * cr2res_get_base_name(const char *filename)
Find out the base name of a file (i.e. without prefix path)
const char * cr2res_get_license(void)
Get the pipeline copyright and license.
hdrl_parameter * hdrl_collapse_sigclip_parameter_create(double kappa_low, double kappa_high, int niter)
create a parameter object for sigclipped mean
hdrl_parameter * hdrl_collapse_mode_parameter_create(double histo_min, double histo_max, double bin_size, hdrl_mode_type mode_method, cpl_size error_niter)
create a parameter object for the mode
cpl_parameterlist * hdrl_collapse_parameter_create_parlist(const char *base_context, const char *prefix, const char *method_def, hdrl_parameter *sigclip_def, hdrl_parameter *minmax_def, hdrl_parameter *mode_def)
Create parameters for the collapse.
hdrl_parameter * hdrl_collapse_minmax_parameter_create(double nlow, double nhigh)
create a parameter object for min-max rejected mean
hdrl_parameter * hdrl_collapse_parameter_parse_parlist(const cpl_parameterlist *parlist, const char *prefix)
parse parameterlist for imagelist reduction method
cpl_error_code hdrl_image_reject_from_mask(hdrl_image *self, const cpl_mask *map)
set bpm of hdrl_image
hdrl_image * hdrl_image_create(const cpl_image *image, const cpl_image *error)
create a new hdrl_image from to existing images by copying them
cpl_image * hdrl_image_get_image(hdrl_image *himg)
get data as cpl image
void hdrl_image_delete(hdrl_image *himg)
delete hdrl_image
cpl_error_code hdrl_imagelist_set(hdrl_imagelist *himlist, hdrl_image *himg, cpl_size pos)
Insert an image into an imagelist.
void hdrl_imagelist_delete(hdrl_imagelist *himlist)
Free all memory used by a hdrl_imagelist object including the images.
cpl_size hdrl_imagelist_get_size(const hdrl_imagelist *himlist)
Get the number of images in the imagelist.
cpl_error_code hdrl_imagelist_collapse(const hdrl_imagelist *himlist, const hdrl_parameter *param, hdrl_image **out, cpl_image **contrib)
collapsing of image list
hdrl_imagelist * hdrl_imagelist_new(void)
Create an empty imagelist.
hdrl_image * hdrl_imagelist_get(const hdrl_imagelist *himlist, cpl_size inum)
Get an image from a list of images.
void hdrl_parameter_destroy(hdrl_parameter *obj)
deep delete of a parameter
void hdrl_parameter_delete(hdrl_parameter *obj)
shallow delete of a parameter