00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifdef HAVE_CONFIG_H
00023 #include <config.h>
00024 #endif
00025
00026
00027
00028
00029 #include <stdio.h>
00030 #include <float.h>
00031 #include <math.h>
00032 #include <string.h>
00033 #include <cpl.h>
00034 #include <muse.h>
00035 #include "muse_bias_z.h"
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046 #define RON_HALFSIZE 9
00047 #define RON_NSAMPLES 100
00048
00049
00059
00060 static cpl_error_code
00061 muse_bias_qc_header(muse_image *aImage, cpl_bivector *aRON,
00062 muse_imagelist *aList)
00063 {
00064 cpl_ensure_code(aImage && aRON && aList, CPL_ERROR_NULL_INPUT);
00065 cpl_msg_debug(__func__, "Adding QC parameters");
00066
00067
00068 unsigned int k;
00069 for (k = 0; k < muse_imagelist_get_size(aList); k++) {
00070 char *keyword = cpl_sprintf(QC_BIAS_PREFIXi" "QC_BASIC_NSATURATED, k+1);
00071 int nsaturated = cpl_propertylist_get_int(muse_imagelist_get(aList, k)->header,
00072 MUSE_HDR_TMP_NSAT);
00073 cpl_propertylist_update_int(aImage->header, keyword, nsaturated);
00074 cpl_free(keyword);
00075 }
00076
00077
00078 cpl_vector *vmedians = cpl_vector_new(aList->size);
00079 const double *ron = cpl_bivector_get_x_data_const(aRON),
00080 *ronerr = cpl_bivector_get_y_data_const(aRON);
00081 unsigned char n;
00082 for (n = 1; n <= 4; n++) {
00083
00084 cpl_size *window = muse_quadrants_get_window(aImage, n);
00085
00086
00087 char keyword[KEYWORD_LENGTH];
00088 snprintf(keyword, KEYWORD_LENGTH, QC_BIAS_MASTER_RON, n);
00089 cpl_propertylist_append_float(aImage->header, keyword, ron[n-1]);
00090
00091 snprintf(keyword, KEYWORD_LENGTH, QC_BIAS_MASTER_RONERR, n);
00092 cpl_propertylist_append_float(aImage->header, keyword, ronerr[n-1]);
00093
00094 snprintf(keyword, KEYWORD_LENGTH, QC_BIAS_MASTERn_PREFIX, n);
00095 unsigned stats = CPL_STATS_MEDIAN | CPL_STATS_MEAN | CPL_STATS_STDEV
00096 | CPL_STATS_MIN | CPL_STATS_MAX;
00097 muse_basicproc_stats_append_header_window(aImage->data, aImage->header,
00098 keyword, stats, window[0],
00099 window[2], window[1], window[3]);
00100
00101
00102 cpl_vector *slopes = muse_cplimage_slope_window(aImage->data, window);
00103 snprintf(keyword, KEYWORD_LENGTH, QC_BIAS_MASTER_SLOPEX, n);
00104 cpl_propertylist_append_float(aImage->header, keyword,
00105 cpl_vector_get(slopes, 0));
00106 snprintf(keyword, KEYWORD_LENGTH, QC_BIAS_MASTER_SLOPEY, n);
00107 cpl_propertylist_append_float(aImage->header, keyword,
00108 cpl_vector_get(slopes, 1));
00109 cpl_vector_delete(slopes);
00110
00111 cpl_free(window);
00112
00113
00114 for (k = 0; k < aList->size; k++) {
00115 snprintf(keyword, KEYWORD_LENGTH, MUSE_HDR_TMP_QUADnMED, n);
00116 double val = cpl_propertylist_get_float(muse_imagelist_get(aList, k)->header,
00117 keyword);
00118 cpl_vector_set(vmedians, k, val);
00119 }
00120 snprintf(keyword, KEYWORD_LENGTH, QC_BIAS_LEVELi_MEAN, n);
00121 cpl_propertylist_update_float(aImage->header, keyword,
00122 cpl_vector_get_mean(vmedians));
00123 snprintf(keyword, KEYWORD_LENGTH, QC_BIAS_LEVELi_STDEV, n);
00124 cpl_propertylist_update_float(aImage->header, keyword,
00125 cpl_vector_get_stdev(vmedians));
00126 snprintf(keyword, KEYWORD_LENGTH, QC_BIAS_LEVELi_MEDIAN, n);
00127 cpl_propertylist_update_float(aImage->header, keyword,
00128 cpl_vector_get_median(vmedians));
00129 }
00130 cpl_vector_delete(vmedians);
00131 return CPL_ERROR_NONE;
00132 }
00133
00134
00144
00145 int
00146 muse_bias_compute(muse_processing *aProcessing, muse_bias_params_t *aParams)
00147 {
00148 muse_basicproc_params *bpars = muse_basicproc_params_new(aProcessing->parameters,
00149 "muse.muse_bias");
00150 muse_imagelist *images = muse_basicproc_load(aProcessing, aParams->nifu, bpars);
00151 muse_basicproc_params_delete(bpars);
00152 cpl_ensure(images, cpl_error_get_code(), -1);
00153
00154 cpl_bivector *bron = muse_imagelist_compute_ron(images,
00155 RON_HALFSIZE,
00156 RON_NSAMPLES);
00157
00158 muse_combinepar *cpars = muse_combinepar_new(aProcessing->parameters,
00159 "muse.muse_bias");
00160 muse_image *masterimage = muse_combine_images(cpars, images);
00161 muse_combinepar_delete(cpars);
00162 if (!masterimage) {
00163 cpl_msg_error(__func__, "Combining input frames failed!");
00164 muse_imagelist_delete(images);
00165 cpl_bivector_delete(bron);
00166 return -1;
00167 }
00168 cpl_propertylist_erase_regexp(masterimage->header, MUSE_WCS_KEYS, 0);
00169
00170 muse_bias_qc_header(masterimage, bron, images);
00171 muse_imagelist_delete(images);
00172 cpl_bivector_delete(bron);
00173
00174 int nbad = muse_quality_bad_columns(masterimage, aParams->losigmabadpix,
00175 aParams->hisigmabadpix);
00176 cpl_propertylist_append_int(masterimage->header, QC_BIAS_MASTER_NBADPIX,
00177 nbad);
00178
00179 muse_basicproc_qc_saturated(masterimage, QC_BIAS_MASTER_PREFIX);
00180 int rc = muse_processing_save_image(aProcessing, aParams->nifu,
00181 masterimage, MUSE_TAG_MASTER_BIAS);
00182 muse_image_delete(masterimage);
00183 return rc == CPL_ERROR_NONE ? 0 : -1;
00184 }