44 #include <uves_mdark_impl.h>
46 #include <uves_parameters.h>
47 #include <uves_utils.h>
50 #include <uves_pfits.h>
51 #include <uves_qclog.h>
52 #include <uves_recipe.h>
53 #include <uves_utils_wrappers.h>
54 #include <uves_error.h>
55 #include <uves_globals.h>
69 uves_mdark_define_parameters(cpl_parameterlist *parameters);
71 static void uves_mdark_region_qc(cpl_image* img,
72 const cpl_parameterlist* p,
73 const cpl_imagelist* raw_images,
74 const char* recipe_id,
77 uves_mdark_process_chip(
const cpl_imagelist *raw_images,
79 const cpl_image *master_bias,
81 const cpl_parameterlist *parameters,
82 const char* recipe_id,
83 cpl_table* qclog,
const int do_qc);
89 #define cpl_plugin_get_info uves_mdark_get_info
91 UVES_MDARK_ID, UVES_MDARK_DOM,
94 uves_mdark_define_parameters,
95 "Jonas M. Larsen",
"cpl@eso.org",
96 "Creates the master dark frame",
97 "This recipe creates a master dark frame by taking the median of all\n"
98 "input frames which should have identical exposure times. Symbolically,\n"
99 " masterdark = median( dark_i ) - masterbias\n"
101 "The input dark frames must have same tag and size and must be either\n"
102 "(P)DARK_BLUE or (P)DARK_RED. Also, a master bias (MASTER_BIAS_xxxx) must\n"
103 "be provided for each chip (xxxx = BLUE, REDL, REDU).\n"
105 "On blue input the recipe computes one master dark frame; on red input the\n"
106 "recipe produces a master dark frame for each chip (MASTER_(P)DARK_xxxx).\n");
122 static cpl_error_code
123 uves_extract_basic_parameters_for_qc(
const cpl_parameterlist* p,
124 const char* recipe_id,
131 char name[MAX_NAME_SIZE];
132 char pname[MAX_NAME_SIZE];
134 sprintf(name,
"reg.num_x");
135 sprintf(pname,
"%s.%s", UVES_QCDARK_ID, name);
137 check(uves_get_parameter(p,NULL,recipe_id,pname,CPL_TYPE_INT,pr_num_x),
138 "Could not read parameter");
140 sprintf(name,
"reg.num_y");
141 sprintf(pname,
"%s.%s", UVES_QCDARK_ID, name);
142 check(uves_get_parameter(p,NULL,recipe_id,pname,CPL_TYPE_INT,pr_num_y),
143 "Could not read parameter");
145 sprintf(name,
"reg.box_sx");
146 sprintf(pname,
"%s.%s", UVES_QCDARK_ID, name);
147 check(uves_get_parameter(p,NULL,recipe_id,pname,CPL_TYPE_INT,pr_box_sx),
148 "Could not read parameter");
150 sprintf(name,
"reg.box_sy");
151 sprintf(pname,
"%s.%s", UVES_QCDARK_ID, name);
152 check(uves_get_parameter(p,NULL,recipe_id,pname,CPL_TYPE_INT,pr_box_sy),
153 "Could not read parameter");
156 return cpl_error_get_code();
173 uves_mdark_define_parameters(cpl_parameterlist *parameters)
175 if (uves_master_stack_define_parameters(parameters,
176 make_str(UVES_MDARK_ID))
182 return uves_qcdark_define_parameters_body(parameters,
183 make_str(UVES_MDARK_ID));
195 uves_qcdark_define_parameters_body(cpl_parameterlist *parameters,
196 const char *recipe_id)
201 if (uves_define_global_parameters(parameters) != CPL_ERROR_NONE)
206 if (uves_master_stack_define_parameters(parameters,recipe_id)
217 if (uves_propagate_parameters_step(UVES_QCDARK_ID, parameters,
218 recipe_id, NULL) != 0)
223 return (cpl_error_get_code() != CPL_ERROR_NONE);
239 uves_mdark_define_qc_parameters(cpl_parameterlist* parameters)
248 const char* name =
"reg.num_x";
249 char* full_name = uves_sprintf(
"%s.%s", UVES_QCDARK_ID, name);
250 cpl_parameter *p = NULL;
251 uves_parameter_new_range(p, full_name,
253 "Number of regions along the X axis "
254 "(where mean/med/rms are computed). ",
258 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI, name );
259 cpl_parameterlist_append(parameters, p);
265 full_name = uves_sprintf(
"%s.%s", UVES_QCDARK_ID,name);
266 uves_parameter_new_range(p, full_name,
268 "Number of regions along the Y axis"
269 "(where mean/med/rms are computed). ",
273 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI, name);
274 cpl_parameterlist_append(parameters, p);
280 full_name = uves_sprintf(
"%s.%s", UVES_QCDARK_ID,name);
281 uves_parameter_new_range(p, full_name,
283 "Region X size [pix]",
286 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI, name);
287 cpl_parameterlist_append(parameters, p);
292 full_name = uves_sprintf(
"%s.%s", UVES_QCDARK_ID,name);
293 uves_parameter_new_range(p, full_name,
295 "Region Y size [pix]",
298 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI, name);
299 cpl_parameterlist_append(parameters, p);
302 name =
"reg.border_x";
303 full_name = uves_sprintf(
"%s.%s", UVES_QCDARK_ID,name);
304 uves_parameter_new_range(p, full_name,
306 "X distance between the left hand side "
307 "of the detector and the left hand side "
308 "of the region [pix]",
311 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI, name);
312 cpl_parameterlist_append(parameters, p);
316 name =
"reg.border_y";
317 full_name = uves_sprintf(
"%s.%s", UVES_QCDARK_ID,name);
318 uves_parameter_new_range(p, full_name,
320 "X distance between the left hand side "
321 "of the detector and the left hand side "
322 "of the region [pix]",
325 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI, name);
326 cpl_parameterlist_append(parameters, p);
332 full_name = uves_sprintf(
"%s.%s", UVES_QCDARK_ID,name);
333 uves_parameter_new_enum(p, full_name,
335 "When QC analysis is performed. "
336 "0: on each raw frame or "
337 "1: on the master frame",
340 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI, name);
341 cpl_parameterlist_append(parameters, p);
347 if (cpl_error_get_code() != CPL_ERROR_NONE)
349 cpl_msg_error(__func__,
"Creation of mdark parameters failed: '%s'",
350 cpl_error_get_where());
351 cpl_parameterlist_delete(parameters);
353 return cpl_error_get_code();
367 uves_qcdark_define_parameters(
void)
370 cpl_parameterlist *parameters = NULL;
372 parameters = cpl_parameterlist_new();
374 check(uves_mdark_define_qc_parameters(parameters),
375 "Error defining mdark qc parameters");
379 if (cpl_error_get_code() != CPL_ERROR_NONE)
381 cpl_msg_error(__func__,
"Creation of mdark parameters failed: '%s'",
382 cpl_error_get_where());
383 cpl_parameterlist_delete(parameters);
416 uves_mdark_process_chip(
const cpl_imagelist *raw_images,
418 const cpl_image *master_bias,
420 const cpl_parameterlist *parameters,
421 const char* recipe_id,
422 cpl_table* qclog,
const int do_qc)
424 cpl_image *master_dark = NULL;
425 cpl_image *current_dark = NULL;
426 cpl_imagelist *preproc_images = NULL;
427 double min_exptime = 0;
428 double max_exptime = 0;
437 const char* STACK_METHOD=NULL;
439 double STACK_KHIGH=0;
444 check_nomsg(uves_extract_basic_parameters_for_qc(parameters,recipe_id,
446 &pr_box_sx,&pr_box_sy));
449 check( uves_get_parameter(parameters, NULL, recipe_id,
"stack_method", CPL_TYPE_STRING, &STACK_METHOD),
450 "Could not read parameter");
454 check( uves_get_parameter(parameters, NULL, recipe_id,
"klow", CPL_TYPE_DOUBLE, &STACK_KLOW),
455 "Could not read parameter");
456 check( uves_get_parameter(parameters, NULL, recipe_id,
"khigh", CPL_TYPE_DOUBLE, &STACK_KHIGH),
457 "Could not read parameter");
458 check( uves_get_parameter(parameters, NULL, recipe_id,
"niter", CPL_TYPE_INT, &STACK_NITER),
459 "Could not read parameter");
466 preproc_images = cpl_imagelist_new();
467 for (i = 0; i < cpl_imagelist_get_size(raw_images); i++)
469 double exposure_time = 0.0;
472 current_dark = cpl_image_duplicate(cpl_imagelist_get_const(raw_images, i));
473 current_header = raw_headers[i];
476 if (master_bias != NULL)
478 uves_msg(
"Subtracting master bias");
480 "Error subtracting master bias");
484 check( cpl_image_threshold(current_dark,
487 "Error thresholding image");
492 uves_msg(
"Skipping bias subtraction");
496 "Error reading exposure time");
498 if(pr_num_x != 0 && pr_num_y != 0 && pr_box_sx != 0 && pr_box_sy !=0 ) {
500 uves_msg(
"Calculating QC parameters on raw dark frame %d",i);
501 uves_mdark_region_qc(current_dark,parameters,raw_images,recipe_id,qclog);
506 if (i == 0 || exposure_time < min_exptime)
508 min_exptime = exposure_time;
510 if (i == 0 || exposure_time > max_exptime)
512 max_exptime = exposure_time;
523 check( cpl_imagelist_set(preproc_images,
526 "Could not insert image into image list");
534 uves_msg(
"Exposure times range from %e s to %e s (%e %% variation)",
537 100 * (max_exptime - min_exptime) / min_exptime);
539 if ((max_exptime - min_exptime) / min_exptime > .001)
542 100 * (max_exptime - min_exptime) / min_exptime);
546 if(strcmp(STACK_METHOD,
"MEDIAN")==0) {
547 uves_msg(
"Calculating stack median");
548 check( master_dark = cpl_imagelist_collapse_median_create(preproc_images),
549 "Error computing median");
553 STACK_KHIGH,STACK_NITER),
554 "Error computing master dark");
558 "Error setting master dark exposure time");
562 uves_free_image(¤t_dark);
563 uves_free_imagelist(&preproc_images);
564 if (cpl_error_get_code() != CPL_ERROR_NONE)
566 uves_free_image(&master_dark);
582 UVES_CONCAT2X(UVES_MDARK_ID,exe)(cpl_frameset *frames,
583 const cpl_parameterlist *parameters,
584 const char *starttime)
586 uves_mdark_exe_body(frames, parameters, starttime, make_str(UVES_MDARK_ID));
604 uves_mdark_exe_body(cpl_frameset *frames,
605 const cpl_parameterlist *parameters,
606 const char *starttime,
607 const char *recipe_id)
617 cpl_imagelist *raw_images[2] = {NULL, NULL};
621 cpl_image *master_bias = NULL;
625 cpl_table* qclog[2] = {NULL, NULL};
626 cpl_image *master_dark = NULL;
630 char *product_filename = NULL;
631 const char *product_tag[2] = {NULL, NULL};
635 const char* pname=NULL;
639 const char* PROCESS_CHIP=NULL;
648 if (cpl_frameset_find(frames, UVES_DARK(
true )) != NULL ||
649 cpl_frameset_find(frames, UVES_DARK(
false)) != NULL)
651 check( uves_load_raw_imagelist(frames,
653 UVES_DARK(
true), UVES_DARK(
false),
655 raw_images, raw_headers, product_header,
656 &blue),
"Error loading raw dark frames");
659 chip != UVES_CHIP_INVALID;
665 else if (cpl_frameset_find(frames, UVES_PDARK(
true )) != NULL ||
666 cpl_frameset_find(frames, UVES_PDARK(
false)) != NULL)
668 check( uves_load_raw_imagelist(frames,
670 UVES_PDARK(
true), UVES_PDARK(
false),
672 raw_images, raw_headers, product_header,
673 &blue),
"Error loading raw dark frames");
676 chip != UVES_CHIP_INVALID;
684 assure(
false, CPL_ERROR_DATA_NOT_FOUND,
685 "Missing input dark frame: %s, %s, %s or %s expected",
686 UVES_DARK(
true) , UVES_DARK(
false),
687 UVES_PDARK(
true), UVES_PDARK(
false));
692 check_nomsg(uves_extract_basic_parameters_for_qc(parameters,recipe_id,
694 &pr_box_sx,&pr_box_sy));
696 if(pr_num_x <=0 || pr_num_y <= 0 || pr_box_sx <=0 || pr_box_sy <= 0) {
699 pname = uves_sprintf(
"%s.%s", UVES_QCDARK_ID,
"reg.when");
700 check(uves_get_parameter(parameters,NULL,recipe_id,pname,CPL_TYPE_INT,&pr_when),
701 "Could not read parameter");
703 check( uves_get_parameter(parameters, NULL,
"uves",
"process_chip", CPL_TYPE_STRING, &PROCESS_CHIP),
704 "Could not read parameter");
710 chip != UVES_CHIP_INVALID;
714 if(strcmp(PROCESS_CHIP,
"REDU") == 0) {
718 const char *master_bias_filename =
"";
719 const char *chip_name =
"";
730 uves_free_image(&master_bias);
731 uves_free_propertylist(&master_bias_header);
732 if (cpl_frameset_find(frames, UVES_MASTER_BIAS(chip)) != NULL)
734 check( uves_load_mbias(frames, chip_name,
735 &master_bias_filename, &master_bias,
736 &master_bias_header, chip),
737 "Error loading master bias");
739 uves_msg_low(
"Using master bias in '%s'", master_bias_filename);
743 uves_msg_low(
"No master bias in SOF. Bias subtraction not done");
750 uves_free_image(&master_dark);
753 check( master_dark = uves_mdark_process_chip(raw_images[raw_index],
754 raw_headers[raw_index],
756 product_header[raw_index],
757 parameters,recipe_id,
759 "Error processing chip");
765 uves_msg(
"Calculating QC parameters on master dark frame");
766 uves_mdark_region_qc(master_dark,parameters,
767 raw_images[raw_index],recipe_id,qclog[0]);
774 cpl_free(product_filename);
775 check( product_filename = uves_masterdark_filename(chip),
"Error getting filename");
778 check( uves_frameset_insert(frames,
780 CPL_FRAME_GROUP_PRODUCT,
781 CPL_FRAME_TYPE_IMAGE,
782 CPL_FRAME_LEVEL_INTERMEDIATE,
784 product_tag[raw_index],
785 raw_headers[raw_index][0],
786 product_header[raw_index],
790 PACKAGE
"/" PACKAGE_VERSION,qclog,
793 "Could not add master dark %s to frameset", product_filename);
794 uves_msg(
"Master dark %s added to frameset", product_filename);
797 if(strcmp(PROCESS_CHIP,
"REDL") == 0) {
806 if (raw_images[0] != NULL)
809 for (i = 0; i < cpl_imagelist_get_size(raw_images[0]); i++)
811 if (raw_headers[0] != NULL) uves_free_propertylist(&raw_headers[0][i]);
812 if (raw_headers[1] != NULL) uves_free_propertylist(&raw_headers[1][i]);
815 cpl_free(raw_headers[0]); raw_headers[0] = NULL;
816 cpl_free(raw_headers[1]); raw_headers[1] = NULL;
819 uves_free_imagelist(&raw_images[0]);
820 uves_free_imagelist(&raw_images[1]);
823 uves_free_image(&master_bias);
824 uves_free_propertylist(&master_bias_header);
828 uves_free_image(&master_dark);
829 uves_free_propertylist(&product_header[0]);
830 uves_free_propertylist(&product_header[1]);
831 cpl_free(product_filename);
838 uves_mdark_region_qc(cpl_image* img,
839 const cpl_parameterlist* p,
840 const cpl_imagelist* raw_images,
841 const char* recipe_id,
865 char name[MAX_NAME_SIZE];
866 char pname[MAX_NAME_SIZE];
867 char qc_key[MAX_NAME_SIZE];
868 char qc_com[MAX_NAME_SIZE];
874 cpl_table* qc_sto=NULL;
876 check_nomsg(uves_extract_basic_parameters_for_qc(p,recipe_id,
878 &pr_box_sx,&pr_box_sy));
880 uves_msg(
"pr_num_x=%d pr_num_y=%d pr_box_sx=%d pr_box_sy=%d",
881 pr_num_x,pr_num_y,pr_box_sx,pr_box_sy);
883 if(pr_num_x <= 0 || pr_num_y <= 0 || pr_box_sx <= 0 || pr_box_sy <= 0) {
887 sprintf(name,
"reg.border_x");
888 sprintf(pname,
"%s.%s", UVES_QCDARK_ID, name);
889 check(uves_get_parameter(p,NULL,recipe_id,pname,CPL_TYPE_INT,&pr_border_x),
890 "Could not read parameter");
892 sprintf(name,
"reg.border_y");
893 sprintf(pname,
"%s.%s", UVES_QCDARK_ID, name);
894 check(uves_get_parameter(p,NULL,recipe_id,pname,CPL_TYPE_INT,&pr_border_y),
895 "Could not read parameter");
898 check_nomsg(nraw=cpl_imagelist_get_size(raw_images));
902 "Number of frames combined",
905 sx=cpl_image_get_size_x(img);
906 sy=cpl_image_get_size_y(img);
907 space_x=(int)((sx-2*pr_border_x)/pr_num_x);
908 space_y=(int)((sy-2*pr_border_y)/pr_num_y);
909 qc_sto=cpl_table_new(pr_num_x*pr_num_y);
910 cpl_table_new_column(qc_sto,
"MIN",CPL_TYPE_DOUBLE);
911 cpl_table_new_column(qc_sto,
"MAX",CPL_TYPE_DOUBLE);
912 cpl_table_new_column(qc_sto,
"AVG",CPL_TYPE_DOUBLE);
913 cpl_table_new_column(qc_sto,
"MED",CPL_TYPE_DOUBLE);
914 cpl_table_new_column(qc_sto,
"RMS",CPL_TYPE_DOUBLE);
916 for(i=0;i<pr_num_x;i++) {
917 llx=pr_border_x+i*space_x;
921 urx=(urx<=sx) ? urx:sx;
923 for(j=0;j<pr_num_y;j++) {
924 lly=pr_border_y+j*space_y;
928 ury=(ury<=sy) ? ury:sy;
931 check_nomsg(qc_min=cpl_image_get_min_window(img,llx,lly,urx,ury));
932 qc_max=cpl_image_get_min_window(img,llx,lly,urx,ury);
933 qc_avg=cpl_image_get_mean_window(img,llx,lly,urx,ury);
934 qc_med=cpl_image_get_median_window(img,llx,lly,urx,ury);
935 qc_rms=cpl_image_get_stdev_window(img,llx,lly,urx,ury);
936 uves_msg_debug(
"QC on area [%d,%d:%d,%d]. Min %g Max %g Avg %g Med %g Rms %g",
937 llx,lly,urx,ury,qc_min,qc_max,qc_avg,qc_med,qc_rms);
939 sprintf(qc_key,
"%s%d%d%s",
"QC REG",i,j,
" MIN");
940 sprintf(qc_com,
"%s%d%d",
"Min of region [%d,%d]",i,j);
942 check_nomsg(cpl_table_set_double(qc_sto,
"MIN",raw,qc_min));
944 sprintf(qc_key,
"%s%d%d%s",
"QC REG",i,j,
" MAX");
945 sprintf(qc_com,
"%s%d%d",
"Max of region [%d,%d]",i,j);
947 check_nomsg(cpl_table_set_double(qc_sto,
"MAX",raw,qc_max));
949 sprintf(qc_key,
"%s%d%d%s",
"QC REG",i,j,
" AVG");
950 sprintf(qc_com,
"%s%d%d",
"Mean of region [%d,%d]",i,j);
952 check_nomsg(cpl_table_set_double(qc_sto,
"AVG",raw,qc_avg));
954 sprintf(qc_key,
"%s%d%d%s",
"QC REG",i,j,
" MED");
955 sprintf(qc_com,
"%s%d%d",
"Median of region [%d,%d]",i,j);
957 check_nomsg(cpl_table_set_double(qc_sto,
"MED",raw,qc_med));
959 sprintf(qc_key,
"%s%d%d%s",
"QC REG",i,j,
" RMS");
960 sprintf(qc_com,
"%s%d%d",
"Rms of region [%d,%d]",i,j);
962 check_nomsg(cpl_table_set_double(qc_sto,
"RMS",raw,qc_rms));
969 check_nomsg(qc_min=cpl_table_get_column_min(qc_sto,
"MIN"));
970 check_nomsg(qc_max=cpl_table_get_column_max(qc_sto,
"MIN"));
971 check_nomsg(qc_avg=cpl_table_get_column_mean(qc_sto,
"MIN"));
972 check_nomsg(qc_med=cpl_table_get_column_median(qc_sto,
"MIN"));
973 check_nomsg(qc_rms=cpl_table_get_column_stdev(qc_sto,
"MIN"));
975 sprintf(qc_key,
"%s",
"QC REG MIN MIN");
976 sprintf(qc_com,
"%s",
"Min of all Mins");
979 sprintf(qc_key,
"%s",
"QC REG MIN MAX");
980 sprintf(qc_com,
"%s",
"Max of all Mins");
983 sprintf(qc_key,
"%s",
"QC REG MIN AVG");
984 sprintf(qc_com,
"%s",
"Mean of all Mins");
987 sprintf(qc_key,
"%s",
"QC REG MIN MED");
988 sprintf(qc_com,
"%s",
"Median of all Mins");
991 sprintf(qc_key,
"%s",
"QC REG MIN RMS");
992 sprintf(qc_com,
"%s",
"Rms of all Mins");
997 check_nomsg(qc_min=cpl_table_get_column_min(qc_sto,
"MAX"));
998 check_nomsg(qc_max=cpl_table_get_column_max(qc_sto,
"MAX"));
999 check_nomsg(qc_avg=cpl_table_get_column_mean(qc_sto,
"MAX"));
1000 check_nomsg(qc_med=cpl_table_get_column_median(qc_sto,
"MAX"));
1001 check_nomsg(qc_rms=cpl_table_get_column_stdev(qc_sto,
"MAX"));
1003 sprintf(qc_key,
"%s",
"QC REG MAX MIN");
1004 sprintf(qc_com,
"%s",
"Min of all Maxs");
1007 sprintf(qc_key,
"%s",
"QC REG MAX MAX");
1008 sprintf(qc_com,
"%s",
"Max of all Maxs");
1011 sprintf(qc_key,
"%s",
"QC REG MAX AVG");
1012 sprintf(qc_com,
"%s",
"Mean of all Maxs");
1015 sprintf(qc_key,
"%s",
"QC REG MAX MED");
1016 sprintf(qc_com,
"%s",
"Median of all Maxs");
1019 sprintf(qc_key,
"%s",
"QC REG MAX RMS");
1020 sprintf(qc_com,
"%s",
"Rms of all Maxs");
1024 check_nomsg(qc_min=cpl_table_get_column_min(qc_sto,
"AVG"));
1025 check_nomsg(qc_max=cpl_table_get_column_max(qc_sto,
"AVG"));
1026 check_nomsg(qc_avg=cpl_table_get_column_mean(qc_sto,
"AVG"));
1027 check_nomsg(qc_med=cpl_table_get_column_median(qc_sto,
"AVG"));
1028 check_nomsg(qc_rms=cpl_table_get_column_stdev(qc_sto,
"AVG"));
1030 sprintf(qc_key,
"%s",
"QC REG AVG MIN");
1031 sprintf(qc_com,
"%s",
"Min of all Means");
1034 sprintf(qc_key,
"%s",
"QC REG AVG MAX");
1035 sprintf(qc_com,
"%s",
"Max of all Means");
1038 sprintf(qc_key,
"%s",
"QC REG AVG AVG");
1039 sprintf(qc_com,
"%s",
"Mean of all Means");
1042 sprintf(qc_key,
"%s",
"QC REG AVG MED");
1043 sprintf(qc_com,
"%s",
"Median of all Means");
1046 sprintf(qc_key,
"%s",
"QC REG AVG RMS");
1047 sprintf(qc_com,
"%s",
"Rms of all Means");
1051 check_nomsg(qc_min=cpl_table_get_column_min(qc_sto,
"MED"));
1052 check_nomsg(qc_max=cpl_table_get_column_max(qc_sto,
"MED"));
1053 check_nomsg(qc_avg=cpl_table_get_column_mean(qc_sto,
"MED"));
1054 check_nomsg(qc_med=cpl_table_get_column_median(qc_sto,
"MED"));
1055 check_nomsg(qc_rms=cpl_table_get_column_stdev(qc_sto,
"MED"));
1057 sprintf(qc_key,
"%s",
"QC REG MED MIN");
1058 sprintf(qc_com,
"%s",
"Min of all Medians");
1061 sprintf(qc_key,
"%s",
"QC REG MED MAX");
1062 sprintf(qc_com,
"%s",
"Max of all Medians");
1065 sprintf(qc_key,
"%s",
"QC REG MED AVG");
1066 sprintf(qc_com,
"%s",
"Mean of all Medians");
1069 sprintf(qc_key,
"%s",
"QC REG MED MED");
1070 sprintf(qc_com,
"%s",
"Median of all Medians");
1073 sprintf(qc_key,
"%s",
"QC REG MED RMS");
1074 sprintf(qc_com,
"%s",
"Rms of all Medians");
1078 check_nomsg(qc_min=cpl_table_get_column_min(qc_sto,
"RMS"));
1079 check_nomsg(qc_max=cpl_table_get_column_max(qc_sto,
"RMS"));
1080 check_nomsg(qc_avg=cpl_table_get_column_mean(qc_sto,
"RMS"));
1081 check_nomsg(qc_med=cpl_table_get_column_median(qc_sto,
"RMS"));
1082 check_nomsg(qc_rms=cpl_table_get_column_stdev(qc_sto,
"RMS"));
1085 sprintf(qc_key,
"%s",
"QC REG RMS MIN");
1086 sprintf(qc_com,
"%s",
"Min of all Rms");
1089 sprintf(qc_key,
"%s",
"QC REG RMS MAX");
1090 sprintf(qc_com,
"%s",
"Max of all Rms");
1093 sprintf(qc_key,
"%s",
"QC REG RMS AVG");
1094 sprintf(qc_com,
"%s",
"Mean of all Rms");
1097 sprintf(qc_key,
"%s",
"QC REG RMS MED");
1098 sprintf(qc_com,
"%s",
"Median of all Rms");
1101 sprintf(qc_key,
"%s",
"QC REG RMS RMS");
1102 sprintf(qc_com,
"%s",
"Rms of all Rms");
1109 uves_free_table(&qc_sto);
#define uves_msg_warning(...)
Print an warning message.
cpl_error_code uves_subtract_bias(cpl_image *image, const cpl_image *master_bias)
Subtract bias.
int uves_qclog_delete(cpl_table **table)
delete QC-LOG table
int uves_qclog_add_double(cpl_table *table, const char *key_name, const double value, const char *key_help, const char *format)
Add double key to QC-LOG table.
int uves_qclog_add_int(cpl_table *table, const char *key_name, const int value, const char *key_help, const char *format)
Add integer key to QC-LOG table.
#define uves_msg(...)
Print a message on 'info' or 'debug' level.
double uves_pfits_get_exptime(const uves_propertylist *plist)
Find out the exposure time in seconds.
int uves_chip_get_index(enum uves_chip chip)
Convert to integer.
enum uves_chip uves_chip_get_first(bool blue)
Get first chip for blue or red arm.
cpl_error_code uves_pfits_set_extname(uves_propertylist *plist, const char *extname)
Write the EXTNAME keyword.
cpl_error_code uves_pfits_set_exptime(uves_propertylist *plist, double exptime)
Write the exposure time.
cpl_image * uves_ksigma_stack(const cpl_imagelist *imlist, double klow, double khigh, int kiter)
Stack images using k-sigma clipping.
#define uves_msg_low(...)
Print a message on a lower message level.
enum uves_chip uves_chip_get_next(enum uves_chip chip)
Get next chip.
#define uves_msg_debug(...)
Print a debug message.
const char * uves_chip_tostring_upper(enum uves_chip chip)
Convert to string.
const char * uves_string_toupper(char *s)
Convert all lowercase characters in a string into uppercase characters.
cpl_table * uves_qclog_init(const uves_propertylist *raw_header, enum uves_chip chip)
Init QC-LOG table.
const char * uves_pfits_get_chipid(const uves_propertylist *plist, enum uves_chip chip)
Find out the chip ID.