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_dark_z.h"
00036
00037
00038
00039
00040
00041
00048
00049 #define DARK_HALFSIZE 9
00050 #define DARK_NSAMPLES 300
00051 static void
00052 muse_dark_qc_header(muse_image *aImage, int aBad, double aNorm,
00053 muse_imagelist *aList)
00054 {
00055 cpl_msg_debug(__func__, "Adding QC keywords");
00056
00057
00058 unsigned int k;
00059 for (k = 0; k < muse_imagelist_get_size(aList); k++) {
00060 char *keyword = cpl_sprintf(QC_DARK_PREFIXi" "QC_BASIC_NSATURATED, k+1);
00061 int nsaturated = cpl_propertylist_get_int(muse_imagelist_get(aList, k)->header,
00062 MUSE_HDR_TMP_NSAT);
00063 cpl_propertylist_update_int(aImage->header, keyword, nsaturated);
00064 cpl_free(keyword);
00065 }
00066
00067
00068 cpl_propertylist_append_int(aImage->header, QC_DARK_MASTER_NBADPIX, aBad);
00069
00070 unsigned stats = CPL_STATS_MEDIAN | CPL_STATS_MEAN | CPL_STATS_STDEV
00071 | CPL_STATS_MIN | CPL_STATS_MAX;
00072 muse_basicproc_stats_append_header(aImage->data, aImage->header,
00073 QC_DARK_MASTER_PREFIX, stats);
00074
00075
00076 double dval = 0., derr = 0.;
00077 cpl_flux_get_bias_window(aImage->data, NULL, DARK_HALFSIZE, DARK_NSAMPLES,
00078 &dval, &derr);
00079
00080 double exptime = muse_pfits_get_exptime(aImage->header);
00081 dval *= 3600. / exptime;
00082 derr *= 3600. / exptime;
00083 cpl_propertylist_append_float(aImage->header, QC_DARK_MASTER_DARKVALUE, dval);
00084 cpl_propertylist_append_float(aImage->header, QC_DARK_MASTER_DARKERROR, derr);
00085
00086
00087 if (dval < 0. || dval > 10.) {
00088 cpl_msg_warning(__func__, "Could not determine reliable dark current "
00089 "(found %.3f+/-%.3f count/pix/h)", dval, derr);
00090 if (aNorm < 1000.) {
00091 cpl_msg_warning(__func__, "May be due to low dark time (%.2f s)",
00092 aNorm);
00093 }
00094 return;
00095 }
00096
00097
00098 cpl_msg_info(__func__, "Dark current is %.3f+/-%.3f count/pix/h",
00099 dval, derr);
00100 }
00101
00102
00109
00110 int
00111 muse_dark_compute(muse_processing *aProcessing, muse_dark_params_t *aParams)
00112 {
00113 muse_basicproc_params *bpars = muse_basicproc_params_new(aProcessing->parameters,
00114 "muse.muse_dark");
00115 muse_imagelist *images = muse_basicproc_load(aProcessing, aParams->nifu, bpars);
00116 muse_basicproc_params_delete(bpars);
00117 cpl_ensure(images, cpl_error_get_code(), -1);
00118
00119
00120 double exptime0 =
00121 muse_pfits_get_exptime(muse_imagelist_get(images, 0)->header);
00122
00123 muse_combinepar *cpars = muse_combinepar_new(aProcessing->parameters,
00124 "muse.muse_dark");
00125 muse_image *masterimage = muse_combine_images(cpars, images);
00126 muse_combinepar_delete(cpars);
00127 if (!masterimage) {
00128 cpl_msg_error(__func__, "Combining input frames failed!");
00129 muse_imagelist_delete(images);
00130 return -1;
00131 }
00132 cpl_propertylist_erase_regexp(masterimage->header, MUSE_WCS_KEYS, 0);
00133 int nbad = muse_quality_dark_badpix(masterimage, 0, aParams->hotsigma);
00134
00135 if (aParams->normalize > 0) {
00136
00137
00138 cpl_msg_info(__func__, "Normalize master dark image to %.3fs",
00139 aParams->normalize);
00140 double f = exptime0 / aParams->normalize;
00141 muse_image_scale(masterimage, 1. / f);
00142 cpl_propertylist_update_double(masterimage->header, "EXPTIME",
00143 aParams->normalize);
00144 char *comment = cpl_sprintf("[s] Master dark normalized to %.3fs exposure "
00145 "time", aParams->normalize);
00146 cpl_propertylist_set_comment(masterimage->header, "EXPTIME", comment);
00147 cpl_free(comment);
00148 }
00149
00150 muse_dark_qc_header(masterimage, nbad, exptime0, images);
00151 muse_imagelist_delete(images);
00152 muse_basicproc_qc_saturated(masterimage, QC_DARK_MASTER_PREFIX);
00153 int rc = muse_processing_save_image(aProcessing, aParams->nifu, masterimage,
00154 MUSE_TAG_MASTER_DARK);
00155 muse_image_delete(masterimage);
00156
00157 return rc == CPL_ERROR_NONE ? 0 : -1;
00158 }