201 #include <uves_mdark_impl.h>
203 #include <uves_parameters.h>
204 #include <uves_utils.h>
206 #include <uves_dfs.h>
207 #include <uves_pfits.h>
208 #include <uves_qclog.h>
209 #include <uves_recipe.h>
210 #include <uves_utils_wrappers.h>
211 #include <uves_error.h>
212 #include <uves_globals.h>
226 uves_mdark_define_parameters(cpl_parameterlist *parameters);
228 static void uves_mdark_region_qc(cpl_image* img,
229 const cpl_parameterlist* p,
230 const cpl_imagelist* raw_images,
231 const char* recipe_id,
234 uves_mdark_process_chip(
const cpl_imagelist *raw_images,
236 const cpl_image *master_bias,
238 const cpl_parameterlist *parameters,
239 const char* recipe_id,
240 cpl_table* qclog,
const int do_qc);
246 #define cpl_plugin_get_info uves_mdark_get_info
248 UVES_MDARK_ID, UVES_MDARK_DOM,
251 uves_mdark_define_parameters,
252 "Jonas M. Larsen",
"cpl@eso.org",
253 "Creates the master dark frame",
254 "This recipe creates a master dark frame by taking the median of all\n"
255 "input frames which should have identical exposure times. Symbolically,\n"
256 " masterdark = median( dark_i ) - masterbias\n"
258 "The input dark frames must have same tag and size and must be either\n"
259 "(P)DARK_BLUE or (P)DARK_RED. Also, a master bias (MASTER_BIAS_xxxx) must\n"
260 "be provided for each chip (xxxx = BLUE, REDL, REDU).\n"
262 "On blue input the recipe computes one master dark frame; on red input the\n"
263 "recipe produces a master dark frame for each chip (MASTER_(P)DARK_xxxx).\n");
279 static cpl_error_code
280 uves_extract_basic_parameters_for_qc(
const cpl_parameterlist* p,
281 const char* recipe_id,
288 char name[MAX_NAME_SIZE];
289 char pname[MAX_NAME_SIZE];
291 sprintf(name,
"reg.num_x");
292 sprintf(pname,
"%s.%s", UVES_QCDARK_ID, name);
294 check(uves_get_parameter(p,NULL,recipe_id,pname,CPL_TYPE_INT,pr_num_x),
295 "Could not read parameter");
297 sprintf(name,
"reg.num_y");
298 sprintf(pname,
"%s.%s", UVES_QCDARK_ID, name);
299 check(uves_get_parameter(p,NULL,recipe_id,pname,CPL_TYPE_INT,pr_num_y),
300 "Could not read parameter");
302 sprintf(name,
"reg.box_sx");
303 sprintf(pname,
"%s.%s", UVES_QCDARK_ID, name);
304 check(uves_get_parameter(p,NULL,recipe_id,pname,CPL_TYPE_INT,pr_box_sx),
305 "Could not read parameter");
307 sprintf(name,
"reg.box_sy");
308 sprintf(pname,
"%s.%s", UVES_QCDARK_ID, name);
309 check(uves_get_parameter(p,NULL,recipe_id,pname,CPL_TYPE_INT,pr_box_sy),
310 "Could not read parameter");
313 return cpl_error_get_code();
330 uves_mdark_define_parameters(cpl_parameterlist *parameters)
332 if (uves_master_stack_define_parameters(parameters,
333 make_str(UVES_MDARK_ID))
339 return uves_qcdark_define_parameters_body(parameters,
340 make_str(UVES_MDARK_ID));
352 uves_qcdark_define_parameters_body(cpl_parameterlist *parameters,
353 const char *recipe_id)
358 if (uves_define_global_parameters(parameters) != CPL_ERROR_NONE)
363 if (uves_master_stack_define_parameters(parameters,recipe_id)
374 if (uves_propagate_parameters_step(UVES_QCDARK_ID, parameters,
375 recipe_id, NULL) != 0)
380 return (cpl_error_get_code() != CPL_ERROR_NONE);
396 uves_mdark_define_qc_parameters(cpl_parameterlist* parameters)
399 const char *name =
"";
400 char *full_name = NULL;
401 cpl_parameter *p = NULL;
406 full_name = uves_sprintf(
"%s.%s", UVES_QCDARK_ID, name);
407 uves_parameter_new_range(p, full_name,
409 "Number of regions along the X axis "
410 "(where mean/med/rms are computed). ",
414 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI, name );
415 cpl_parameterlist_append(parameters, p);
421 full_name = uves_sprintf(
"%s.%s", UVES_QCDARK_ID,name);
422 uves_parameter_new_range(p, full_name,
424 "Number of regions along the Y axis"
425 "(where mean/med/rms are computed). ",
429 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI, name);
430 cpl_parameterlist_append(parameters, p);
436 full_name = uves_sprintf(
"%s.%s", UVES_QCDARK_ID,name);
437 uves_parameter_new_range(p, full_name,
439 "Region X size [pix]",
442 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI, name);
443 cpl_parameterlist_append(parameters, p);
448 full_name = uves_sprintf(
"%s.%s", UVES_QCDARK_ID,name);
449 uves_parameter_new_range(p, full_name,
451 "Region Y size [pix]",
454 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI, name);
455 cpl_parameterlist_append(parameters, p);
458 name =
"reg.border_x";
459 full_name = uves_sprintf(
"%s.%s", UVES_QCDARK_ID,name);
460 uves_parameter_new_range(p, full_name,
462 "X distance between the left hand side "
463 "of the detector and the left hand side "
464 "of the region [pix]",
467 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI, name);
468 cpl_parameterlist_append(parameters, p);
472 name =
"reg.border_y";
473 full_name = uves_sprintf(
"%s.%s", UVES_QCDARK_ID,name);
474 uves_parameter_new_range(p, full_name,
476 "X distance between the left hand side "
477 "of the detector and the left hand side "
478 "of the region [pix]",
481 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI, name);
482 cpl_parameterlist_append(parameters, p);
488 full_name = uves_sprintf(
"%s.%s", UVES_QCDARK_ID,name);
489 uves_parameter_new_enum(p, full_name,
491 "When QC analysis is performed. "
492 "0: on each raw frame or "
493 "1: on the master frame",
496 cpl_parameter_set_alias(p, CPL_PARAMETER_MODE_CLI, name);
497 cpl_parameterlist_append(parameters, p);
503 if (cpl_error_get_code() != CPL_ERROR_NONE)
505 cpl_msg_error(__func__,
"Creation of mdark parameters failed: '%s'",
506 cpl_error_get_where());
507 cpl_parameterlist_delete(parameters);
509 return cpl_error_get_code();
523 uves_qcdark_define_parameters(
void)
526 cpl_parameterlist *parameters = NULL;
528 parameters = cpl_parameterlist_new();
530 check(uves_mdark_define_qc_parameters(parameters),
531 "Error defining mdark qc parameters");
535 if (cpl_error_get_code() != CPL_ERROR_NONE)
537 cpl_msg_error(__func__,
"Creation of mdark parameters failed: '%s'",
538 cpl_error_get_where());
539 cpl_parameterlist_delete(parameters);
572 uves_mdark_process_chip(
const cpl_imagelist *raw_images,
574 const cpl_image *master_bias,
576 const cpl_parameterlist *parameters,
577 const char* recipe_id,
578 cpl_table* qclog,
const int do_qc)
580 cpl_image *master_dark = NULL;
581 cpl_image *current_dark = NULL;
582 cpl_imagelist *preproc_images = NULL;
583 double min_exptime = 0;
584 double max_exptime = 0;
593 const char* STACK_METHOD=NULL;
595 double STACK_KHIGH=0;
600 check_nomsg(uves_extract_basic_parameters_for_qc(parameters,recipe_id,
602 &pr_box_sx,&pr_box_sy));
605 check( uves_get_parameter(parameters, NULL, recipe_id,
"stack_method", CPL_TYPE_STRING, &STACK_METHOD),
606 "Could not read parameter");
610 check( uves_get_parameter(parameters, NULL, recipe_id,
"klow", CPL_TYPE_DOUBLE, &STACK_KLOW),
611 "Could not read parameter");
612 check( uves_get_parameter(parameters, NULL, recipe_id,
"khigh", CPL_TYPE_DOUBLE, &STACK_KHIGH),
613 "Could not read parameter");
614 check( uves_get_parameter(parameters, NULL, recipe_id,
"niter", CPL_TYPE_INT, &STACK_NITER),
615 "Could not read parameter");
622 preproc_images = cpl_imagelist_new();
623 for (i = 0; i < cpl_imagelist_get_size(raw_images); i++)
625 double exposure_time = 0.0;
628 current_dark = cpl_image_duplicate(cpl_imagelist_get_const(raw_images, i));
629 current_header = raw_headers[i];
632 if (master_bias != NULL)
634 uves_msg(
"Subtracting master bias");
636 "Error subtracting master bias");
640 check( cpl_image_threshold(current_dark,
643 "Error thresholding image");
648 uves_msg(
"Skipping bias subtraction");
652 "Error reading exposure time");
654 if(pr_num_x != 0 && pr_num_y != 0 && pr_box_sx != 0 && pr_box_sy !=0 ) {
656 uves_msg(
"Calculating QC parameters on raw dark frame %d",i);
657 uves_mdark_region_qc(current_dark,parameters,raw_images,recipe_id,qclog);
662 if (i == 0 || exposure_time < min_exptime)
664 min_exptime = exposure_time;
666 if (i == 0 || exposure_time > max_exptime)
668 max_exptime = exposure_time;
679 check( cpl_imagelist_set(preproc_images,
682 "Could not insert image into image list");
690 uves_msg(
"Exposure times range from %e s to %e s (%e %% variation)",
693 100 * (max_exptime - min_exptime) / min_exptime);
695 if ((max_exptime - min_exptime) / min_exptime > .001)
698 100 * (max_exptime - min_exptime) / min_exptime);
702 if(strcmp(STACK_METHOD,
"MEDIAN")==0) {
703 uves_msg(
"Calculating stack median");
704 check( master_dark = cpl_imagelist_collapse_median_create(preproc_images),
705 "Error computing median");
709 STACK_KHIGH,STACK_NITER),
710 "Error computing master dark");
714 "Error setting master dark exposure time");
717 uves_free_image(¤t_dark);
718 uves_free_imagelist(&preproc_images);
719 if (cpl_error_get_code() != CPL_ERROR_NONE)
721 uves_free_image(&master_dark);
737 UVES_CONCAT2X(UVES_MDARK_ID,exe)(cpl_frameset *frames,
738 const cpl_parameterlist *parameters,
739 const char *starttime)
741 uves_mdark_exe_body(frames, parameters, starttime, make_str(UVES_MDARK_ID));
759 uves_mdark_exe_body(cpl_frameset *frames,
760 const cpl_parameterlist *parameters,
761 const char *starttime,
762 const char *recipe_id)
772 cpl_imagelist *raw_images[2] = {NULL, NULL};
776 cpl_image *master_bias = NULL;
780 cpl_table* qclog[2] = {NULL, NULL};
781 cpl_image *master_dark = NULL;
785 char *product_filename = NULL;
786 const char *product_tag[2] = {NULL, NULL};
790 const char* pname=NULL;
794 const char* PROCESS_CHIP=NULL;
803 if (cpl_frameset_find(frames, UVES_DARK(
true )) != NULL ||
804 cpl_frameset_find(frames, UVES_DARK(
false)) != NULL)
806 check( uves_load_raw_imagelist(frames,
808 UVES_DARK(
true), UVES_DARK(
false),
810 raw_images, raw_headers, product_header,
811 &blue),
"Error loading raw dark frames");
814 chip != UVES_CHIP_INVALID;
820 else if (cpl_frameset_find(frames, UVES_PDARK(
true )) != NULL ||
821 cpl_frameset_find(frames, UVES_PDARK(
false)) != NULL)
823 check( uves_load_raw_imagelist(frames,
825 UVES_PDARK(
true), UVES_PDARK(
false),
827 raw_images, raw_headers, product_header,
828 &blue),
"Error loading raw dark frames");
831 chip != UVES_CHIP_INVALID;
839 assure(
false, CPL_ERROR_DATA_NOT_FOUND,
840 "Missing input dark frame: %s, %s, %s or %s expected",
841 UVES_DARK(
true) , UVES_DARK(
false),
842 UVES_PDARK(
true), UVES_PDARK(
false));
847 check_nomsg(uves_extract_basic_parameters_for_qc(parameters,recipe_id,
849 &pr_box_sx,&pr_box_sy));
851 if(pr_num_x <=0 || pr_num_y <= 0 || pr_box_sx <=0 || pr_box_sy <= 0) {
854 pname = uves_sprintf(
"%s.%s", UVES_QCDARK_ID,
"reg.when");
855 check(uves_get_parameter(parameters,NULL,recipe_id,pname,CPL_TYPE_INT,&pr_when),
856 "Could not read parameter");
858 check( uves_get_parameter(parameters, NULL,
"uves",
"process_chip", CPL_TYPE_STRING, &PROCESS_CHIP),
859 "Could not read parameter");
865 chip != UVES_CHIP_INVALID;
869 if(strcmp(PROCESS_CHIP,
"REDU") == 0) {
873 const char *master_bias_filename =
"";
874 const char *chip_name =
"";
885 uves_free_image(&master_bias);
886 uves_free_propertylist(&master_bias_header);
887 if (cpl_frameset_find(frames, UVES_MASTER_BIAS(chip)) != NULL)
889 check( uves_load_mbias(frames, chip_name,
890 &master_bias_filename, &master_bias,
891 &master_bias_header, chip),
892 "Error loading master bias");
894 uves_msg_low(
"Using master bias in '%s'", master_bias_filename);
898 uves_msg_low(
"No master bias in SOF. Bias subtraction not done");
905 uves_free_image(&master_dark);
908 check( master_dark = uves_mdark_process_chip(raw_images[raw_index],
909 raw_headers[raw_index],
911 product_header[raw_index],
912 parameters,recipe_id,
914 "Error processing chip");
920 uves_msg(
"Calculating QC parameters on master dark frame");
921 uves_mdark_region_qc(master_dark,parameters,
922 raw_images[raw_index],recipe_id,qclog[0]);
929 cpl_free(product_filename);
930 check( product_filename = uves_masterdark_filename(chip),
"Error getting filename");
933 check( uves_frameset_insert(frames,
935 CPL_FRAME_GROUP_PRODUCT,
936 CPL_FRAME_TYPE_IMAGE,
937 CPL_FRAME_LEVEL_INTERMEDIATE,
939 product_tag[raw_index],
940 raw_headers[raw_index][0],
941 product_header[raw_index],
945 PACKAGE
"/" PACKAGE_VERSION,qclog,
948 "Could not add master dark %s to frameset", product_filename);
949 uves_msg(
"Master dark %s added to frameset", product_filename);
952 if(strcmp(PROCESS_CHIP,
"REDL") == 0) {
961 if (raw_images[0] != NULL)
964 for (i = 0; i < cpl_imagelist_get_size(raw_images[0]); i++)
966 if (raw_headers[0] != NULL) uves_free_propertylist(&raw_headers[0][i]);
967 if (raw_headers[1] != NULL) uves_free_propertylist(&raw_headers[1][i]);
970 cpl_free(raw_headers[0]); raw_headers[0] = NULL;
971 cpl_free(raw_headers[1]); raw_headers[1] = NULL;
974 uves_free_imagelist(&raw_images[0]);
975 uves_free_imagelist(&raw_images[1]);
978 uves_free_image(&master_bias);
979 uves_free_propertylist(&master_bias_header);
983 uves_free_image(&master_dark);
984 uves_free_propertylist(&product_header[0]);
985 uves_free_propertylist(&product_header[1]);
986 cpl_free(product_filename);
993 uves_mdark_region_qc(cpl_image* img,
994 const cpl_parameterlist* p,
995 const cpl_imagelist* raw_images,
996 const char* recipe_id,
1004 int pr_border_x=100;
1005 int pr_border_y=100;
1020 char name[MAX_NAME_SIZE];
1021 char pname[MAX_NAME_SIZE];
1022 char qc_key[MAX_NAME_SIZE];
1023 char qc_com[MAX_NAME_SIZE];
1029 cpl_table* qc_sto=NULL;
1031 check_nomsg(uves_extract_basic_parameters_for_qc(p,recipe_id,
1032 &pr_num_x,&pr_num_y,
1033 &pr_box_sx,&pr_box_sy));
1035 uves_msg(
"pr_num_x=%d pr_num_y=%d pr_box_sx=%d pr_box_sy=%d",
1036 pr_num_x,pr_num_y,pr_box_sx,pr_box_sy);
1038 if(pr_num_x <= 0 || pr_num_y <= 0 || pr_box_sx <= 0 || pr_box_sy <= 0) {
1042 sprintf(name,
"reg.border_x");
1043 sprintf(pname,
"%s.%s", UVES_QCDARK_ID, name);
1044 check(uves_get_parameter(p,NULL,recipe_id,pname,CPL_TYPE_INT,&pr_border_x),
1045 "Could not read parameter");
1047 sprintf(name,
"reg.border_y");
1048 sprintf(pname,
"%s.%s", UVES_QCDARK_ID, name);
1049 check(uves_get_parameter(p,NULL,recipe_id,pname,CPL_TYPE_INT,&pr_border_y),
1050 "Could not read parameter");
1053 check_nomsg(nraw=cpl_imagelist_get_size(raw_images));
1057 "Number of frames combined",
1060 sx=cpl_image_get_size_x(img);
1061 sy=cpl_image_get_size_y(img);
1062 space_x=(int)((sx-2*pr_border_x)/pr_num_x);
1063 space_y=(int)((sy-2*pr_border_y)/pr_num_y);
1064 qc_sto=cpl_table_new(pr_num_x*pr_num_y);
1065 cpl_table_new_column(qc_sto,
"MIN",CPL_TYPE_DOUBLE);
1066 cpl_table_new_column(qc_sto,
"MAX",CPL_TYPE_DOUBLE);
1067 cpl_table_new_column(qc_sto,
"AVG",CPL_TYPE_DOUBLE);
1068 cpl_table_new_column(qc_sto,
"MED",CPL_TYPE_DOUBLE);
1069 cpl_table_new_column(qc_sto,
"RMS",CPL_TYPE_DOUBLE);
1071 for(i=0;i<pr_num_x;i++) {
1072 llx=pr_border_x+i*space_x;
1075 llx=(llx>0) ? llx:1;
1076 urx=(urx<=sx) ? urx:sx;
1078 for(j=0;j<pr_num_y;j++) {
1079 lly=pr_border_y+j*space_y;
1082 lly=(lly>0) ? lly:1;
1083 ury=(ury<=sy) ? ury:sy;
1086 check_nomsg(qc_min=cpl_image_get_min_window(img,llx,lly,urx,ury));
1087 qc_max=cpl_image_get_min_window(img,llx,lly,urx,ury);
1088 qc_avg=cpl_image_get_mean_window(img,llx,lly,urx,ury);
1089 qc_med=cpl_image_get_median_window(img,llx,lly,urx,ury);
1090 qc_rms=cpl_image_get_stdev_window(img,llx,lly,urx,ury);
1091 uves_msg_debug(
"QC on area [%d,%d:%d,%d]. Min %g Max %g Avg %g Med %g Rms %g",
1092 llx,lly,urx,ury,qc_min,qc_max,qc_avg,qc_med,qc_rms);
1094 sprintf(qc_key,
"%s%d%d%s",
"QC REG",i,j,
" MIN");
1095 sprintf(qc_com,
"%s%d%d",
"Min of region [%d,%d]",i,j);
1097 check_nomsg(cpl_table_set_double(qc_sto,
"MIN",raw,qc_min));
1099 sprintf(qc_key,
"%s%d%d%s",
"QC REG",i,j,
" MAX");
1100 sprintf(qc_com,
"%s%d%d",
"Max of region [%d,%d]",i,j);
1102 check_nomsg(cpl_table_set_double(qc_sto,
"MAX",raw,qc_max));
1104 sprintf(qc_key,
"%s%d%d%s",
"QC REG",i,j,
" AVG");
1105 sprintf(qc_com,
"%s%d%d",
"Mean of region [%d,%d]",i,j);
1107 check_nomsg(cpl_table_set_double(qc_sto,
"AVG",raw,qc_avg));
1109 sprintf(qc_key,
"%s%d%d%s",
"QC REG",i,j,
" MED");
1110 sprintf(qc_com,
"%s%d%d",
"Median of region [%d,%d]",i,j);
1112 check_nomsg(cpl_table_set_double(qc_sto,
"MED",raw,qc_med));
1114 sprintf(qc_key,
"%s%d%d%s",
"QC REG",i,j,
" RMS");
1115 sprintf(qc_com,
"%s%d%d",
"Rms of region [%d,%d]",i,j);
1117 check_nomsg(cpl_table_set_double(qc_sto,
"RMS",raw,qc_rms));
1124 check_nomsg(qc_min=cpl_table_get_column_min(qc_sto,
"MIN"));
1125 check_nomsg(qc_max=cpl_table_get_column_max(qc_sto,
"MIN"));
1126 check_nomsg(qc_avg=cpl_table_get_column_mean(qc_sto,
"MIN"));
1127 check_nomsg(qc_med=cpl_table_get_column_median(qc_sto,
"MIN"));
1128 check_nomsg(qc_rms=cpl_table_get_column_stdev(qc_sto,
"MIN"));
1130 sprintf(qc_key,
"%s",
"QC REG MIN MIN");
1131 sprintf(qc_com,
"%s",
"Min of all Mins");
1134 sprintf(qc_key,
"%s",
"QC REG MIN MAX");
1135 sprintf(qc_com,
"%s",
"Max of all Mins");
1138 sprintf(qc_key,
"%s",
"QC REG MIN AVG");
1139 sprintf(qc_com,
"%s",
"Mean of all Mins");
1142 sprintf(qc_key,
"%s",
"QC REG MIN MED");
1143 sprintf(qc_com,
"%s",
"Median of all Mins");
1146 sprintf(qc_key,
"%s",
"QC REG MIN RMS");
1147 sprintf(qc_com,
"%s",
"Rms of all Mins");
1152 check_nomsg(qc_min=cpl_table_get_column_min(qc_sto,
"MAX"));
1153 check_nomsg(qc_max=cpl_table_get_column_max(qc_sto,
"MAX"));
1154 check_nomsg(qc_avg=cpl_table_get_column_mean(qc_sto,
"MAX"));
1155 check_nomsg(qc_med=cpl_table_get_column_median(qc_sto,
"MAX"));
1156 check_nomsg(qc_rms=cpl_table_get_column_stdev(qc_sto,
"MAX"));
1158 sprintf(qc_key,
"%s",
"QC REG MAX MIN");
1159 sprintf(qc_com,
"%s",
"Min of all Maxs");
1162 sprintf(qc_key,
"%s",
"QC REG MAX MAX");
1163 sprintf(qc_com,
"%s",
"Max of all Maxs");
1166 sprintf(qc_key,
"%s",
"QC REG MAX AVG");
1167 sprintf(qc_com,
"%s",
"Mean of all Maxs");
1170 sprintf(qc_key,
"%s",
"QC REG MAX MED");
1171 sprintf(qc_com,
"%s",
"Median of all Maxs");
1174 sprintf(qc_key,
"%s",
"QC REG MAX RMS");
1175 sprintf(qc_com,
"%s",
"Rms of all Maxs");
1179 check_nomsg(qc_min=cpl_table_get_column_min(qc_sto,
"AVG"));
1180 check_nomsg(qc_max=cpl_table_get_column_max(qc_sto,
"AVG"));
1181 check_nomsg(qc_avg=cpl_table_get_column_mean(qc_sto,
"AVG"));
1182 check_nomsg(qc_med=cpl_table_get_column_median(qc_sto,
"AVG"));
1183 check_nomsg(qc_rms=cpl_table_get_column_stdev(qc_sto,
"AVG"));
1185 sprintf(qc_key,
"%s",
"QC REG AVG MIN");
1186 sprintf(qc_com,
"%s",
"Min of all Means");
1189 sprintf(qc_key,
"%s",
"QC REG AVG MAX");
1190 sprintf(qc_com,
"%s",
"Max of all Means");
1193 sprintf(qc_key,
"%s",
"QC REG AVG AVG");
1194 sprintf(qc_com,
"%s",
"Mean of all Means");
1197 sprintf(qc_key,
"%s",
"QC REG AVG MED");
1198 sprintf(qc_com,
"%s",
"Median of all Means");
1201 sprintf(qc_key,
"%s",
"QC REG AVG RMS");
1202 sprintf(qc_com,
"%s",
"Rms of all Means");
1206 check_nomsg(qc_min=cpl_table_get_column_min(qc_sto,
"MED"));
1207 check_nomsg(qc_max=cpl_table_get_column_max(qc_sto,
"MED"));
1208 check_nomsg(qc_avg=cpl_table_get_column_mean(qc_sto,
"MED"));
1209 check_nomsg(qc_med=cpl_table_get_column_median(qc_sto,
"MED"));
1210 check_nomsg(qc_rms=cpl_table_get_column_stdev(qc_sto,
"MED"));
1212 sprintf(qc_key,
"%s",
"QC REG MED MIN");
1213 sprintf(qc_com,
"%s",
"Min of all Medians");
1216 sprintf(qc_key,
"%s",
"QC REG MED MAX");
1217 sprintf(qc_com,
"%s",
"Max of all Medians");
1220 sprintf(qc_key,
"%s",
"QC REG MED AVG");
1221 sprintf(qc_com,
"%s",
"Mean of all Medians");
1224 sprintf(qc_key,
"%s",
"QC REG MED MED");
1225 sprintf(qc_com,
"%s",
"Median of all Medians");
1228 sprintf(qc_key,
"%s",
"QC REG MED RMS");
1229 sprintf(qc_com,
"%s",
"Rms of all Medians");
1233 check_nomsg(qc_min=cpl_table_get_column_min(qc_sto,
"RMS"));
1234 check_nomsg(qc_max=cpl_table_get_column_max(qc_sto,
"RMS"));
1235 check_nomsg(qc_avg=cpl_table_get_column_mean(qc_sto,
"RMS"));
1236 check_nomsg(qc_med=cpl_table_get_column_median(qc_sto,
"RMS"));
1237 check_nomsg(qc_rms=cpl_table_get_column_stdev(qc_sto,
"RMS"));
1240 sprintf(qc_key,
"%s",
"QC REG RMS MIN");
1241 sprintf(qc_com,
"%s",
"Min of all Rms");
1244 sprintf(qc_key,
"%s",
"QC REG RMS MAX");
1245 sprintf(qc_com,
"%s",
"Max of all Rms");
1248 sprintf(qc_key,
"%s",
"QC REG RMS AVG");
1249 sprintf(qc_com,
"%s",
"Mean of all Rms");
1252 sprintf(qc_key,
"%s",
"QC REG RMS MED");
1253 sprintf(qc_com,
"%s",
"Median of all Rms");
1256 sprintf(qc_key,
"%s",
"QC REG RMS RMS");
1257 sprintf(qc_com,
"%s",
"Rms of all Rms");
1264 uves_free_table(&qc_sto);