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_wavecal_z.h"
00036
00037
00038
00039
00040
00041
00051
00052 static muse_image *
00053 muse_wavecal_sum_and_save(muse_imagelist *aImages, muse_processing *aProcessing,
00054 int aIFU)
00055 {
00056 cpl_ensure(aImages && aProcessing, CPL_ERROR_NULL_INPUT, NULL);
00057
00058
00059 char *pname = cpl_sprintf("muse.%s.combine", aProcessing->name);
00060 cpl_parameter *param = cpl_parameterlist_find(aProcessing->parameters, pname);
00061 char *porig = cpl_strdup(cpl_parameter_get_string(param));
00062 cpl_parameter_set_string(param, "sum");
00063 cpl_free(pname);
00064 muse_combinepar *cpars = muse_combinepar_new(aProcessing->parameters,
00065 "muse.muse_wavecal");
00066 cpl_parameter_set_string(param, porig);
00067 cpl_free(porig);
00068 muse_image *image = muse_combine_images(cpars, aImages);
00069 muse_combinepar_delete(cpars);
00070 if (!image) {
00071 cpl_error_set_message(__func__, CPL_ERROR_ILLEGAL_OUTPUT,
00072 "summing per-lamp images did not work");
00073 return NULL;
00074 }
00075
00076
00077
00078 unsigned int k;
00079 for (k = 0; k < muse_imagelist_get_size(aImages); k++) {
00080 cpl_errorstate state = cpl_errorstate_get();
00081 unsigned int i = 1;
00082 while (cpl_errorstate_is_equal(state)) {
00083 char *kwget = cpl_sprintf(QC_WAVECAL_PREFIXi" "QC_BASIC_NSATURATED, i),
00084 *kwout = cpl_sprintf(QC_WAVECAL_PREFIXli" "QC_BASIC_NSATURATED, k+1, i);
00085
00086 int nsaturated = cpl_propertylist_get_int(muse_imagelist_get(aImages, k)->header,
00087 kwget);
00088 if (cpl_errorstate_is_equal(state)) {
00089 cpl_propertylist_update_int(image->header, kwout, nsaturated);
00090 }
00091 cpl_free(kwget);
00092 cpl_free(kwout);
00093 i++;
00094 }
00095
00096
00097 cpl_errorstate_set(state);
00098 }
00099
00100 muse_basicproc_qc_saturated(image, QC_WAVECAL_PREFIX);
00101
00102
00103
00104
00105 muse_processing_save_image(aProcessing, aIFU, image,
00106 MUSE_TAG_ARC_RED);
00107
00108 return image;
00109 }
00110
00111
00118
00119 int
00120 muse_wavecal_compute(muse_processing *aProcessing,
00121 muse_wavecal_params_t *aParams)
00122 {
00123 muse_wave_weighting_type fweight = MUSE_WAVE_WEIGHTING_UNIFORM;
00124 if (aParams->fitweighting == MUSE_WAVECAL_PARAM_FITWEIGHTING_CERR) {
00125 fweight = MUSE_WAVE_WEIGHTING_CERR;
00126 } else if (aParams->fitweighting == MUSE_WAVECAL_PARAM_FITWEIGHTING_SCATTER) {
00127 fweight = MUSE_WAVE_WEIGHTING_SCATTER;
00128 } else if (aParams->fitweighting == MUSE_WAVECAL_PARAM_FITWEIGHTING_CERRSCATTER) {
00129 fweight = MUSE_WAVE_WEIGHTING_CERRSCATTER;
00130 } else if (aParams->fitweighting != MUSE_WAVECAL_PARAM_FITWEIGHTING_UNIFORM) {
00131 cpl_msg_error(__func__, "unknown fitweighting method \"%s\"",
00132 aParams->fitweighting_s);
00133 return -1;
00134 }
00135
00136 muse_basicproc_params *bpars = muse_basicproc_params_new(aProcessing->parameters,
00137 "muse.muse_wavecal");
00138 cpl_frameset **labeledframes = NULL;
00139 muse_imagelist *images = muse_basicproc_combine_images_lampwise(aProcessing,
00140 aParams->nifu,
00141 bpars,
00142 &labeledframes);
00143 muse_basicproc_params_delete(bpars);
00144 cpl_ensure(images, cpl_error_get_code(), -1);
00145
00146
00147 cpl_frameset *used = aProcessing->usedframes;
00148 unsigned int k, kimages = muse_imagelist_get_size(images);
00149 cpl_boolean needsum = !aParams->lampwise || aParams->resample;
00150 for (k = 0; k < kimages; k++) {
00151
00152 if (!(kimages == 1 && needsum)) {
00153 muse_image *image = muse_imagelist_get(images, k);
00154 if (labeledframes) {
00155 aProcessing->usedframes = labeledframes[k];
00156 }
00157 muse_basicproc_qc_saturated(image, QC_WAVECAL_PREFIX);
00158 cpl_propertylist_erase_regexp(image->header, MUSE_WCS_KEYS, 0);
00159 muse_processing_save_image(aProcessing, aParams->nifu, image,
00160 MUSE_TAG_ARC_RED_LAMP);
00161 }
00162
00163 if (labeledframes) {
00164 cpl_frameset_delete(labeledframes[k]);
00165 }
00166 }
00167 cpl_free(labeledframes);
00168 aProcessing->usedframes = used;
00169 muse_image *masterimage = NULL;
00170 if (needsum) {
00171 masterimage = muse_wavecal_sum_and_save(images, aProcessing, aParams->nifu);
00172 }
00173
00174
00175 cpl_table *linelist = muse_table_load(aProcessing, MUSE_TAG_LINE_CATALOG, 0);
00176 cpl_propertylist *linehead = muse_propertylist_load(aProcessing,
00177 MUSE_TAG_LINE_CATALOG);
00178 int rc = muse_wave_lines_check(linelist, linehead) ? 0 : -1;
00179 cpl_propertylist_delete(linehead);
00180 if (rc) {
00181 cpl_table_delete(linelist);
00182 muse_image_delete(masterimage);
00183 muse_imagelist_delete(images);
00184 return rc;
00185 }
00186
00187 cpl_table *tracetable = muse_table_load(aProcessing, MUSE_TAG_TRACE_TABLE,
00188 aParams->nifu);
00189
00190
00191
00192
00193
00194 cpl_table *wavecaltable = NULL;
00195 cpl_propertylist *header = NULL;
00196 muse_wave_params *p = muse_wave_params_new();
00197 p->xorder = aParams->xorder;
00198 p->yorder = aParams->yorder;
00199 p->detsigma = aParams->sigma;
00200 p->ddisp = aParams->dres;
00201 p->tolerance = aParams->tolerance;
00202 p->linesigma = aParams->linesigma;
00203 p->rflag = aParams->residuals;
00204 p->fitsigma = aParams->fitsigma;
00205 p->fitweighting = fweight;
00206 if (aParams->lampwise) {
00207 wavecaltable = muse_wave_calib_lampwise(images, tracetable, linelist, p);
00208 header = cpl_propertylist_duplicate(muse_imagelist_get(images, 0)->header);
00209 } else {
00210 wavecaltable = muse_wave_calib(masterimage, tracetable, linelist, p);
00211 header = cpl_propertylist_duplicate(masterimage->header);
00212 }
00213 if (!wavecaltable) {
00214 muse_image_delete(masterimage);
00215 muse_imagelist_delete(images);
00216 cpl_table_delete(tracetable);
00217 cpl_table_delete(linelist);
00218 cpl_propertylist_delete(header);
00219 muse_wave_params_delete(p);
00220 return -1;
00221 }
00222
00223
00224
00225 cpl_propertylist_erase_regexp(header,
00226 "^SIMPLE$|^BITPIX$|^NAXIS|^EXTEND$|^XTENSION$|"
00227 "^DATASUM$|^DATAMIN$|^DATAMAX$|^DATAMD5$|"
00228 "^PCOUNT$|^GCOUNT$|^HDUVERS$|^BLANK$|"
00229 "^BZERO$|^BSCALE$|^BUNIT$|^CHECKSUM$|^INHERIT$|"
00230 "^PIPEFILE$|^ESO PRO ", 0);
00231 muse_processing_save_table(aProcessing, aParams->nifu, wavecaltable, header,
00232 MUSE_TAG_WAVECAL_TABLE, MUSE_TABLE_TYPE_CPL);
00233 if (p->residuals) {
00234
00235 cpl_propertylist_erase_regexp(header, QC_WAVECAL_PREFIX, 0);
00236 muse_processing_save_table(aProcessing, aParams->nifu, p->residuals, header,
00237 MUSE_TAG_WAVECAL_DEBUG, MUSE_TABLE_TYPE_CPL);
00238 }
00239 muse_wave_params_delete(p);
00240 cpl_propertylist_delete(header);
00241
00242
00243 if (aParams->resample) {
00244
00245
00246 muse_pixtable *pixtable = muse_pixtable_create(masterimage, tracetable,
00247 wavecaltable, NULL);
00248 muse_image *resampled = muse_resampling_image(pixtable,
00249 MUSE_RESAMPLE_WEIGHTED_RENKA,
00250 1.0, 1.25);
00251 muse_pixtable_delete(pixtable);
00252 if (resampled) {
00253
00254 cpl_propertylist_erase_regexp(resampled->header, QC_WAVECAL_PREFIX, 0);
00255 muse_processing_save_cimage(aProcessing, aParams->nifu, resampled->data,
00256 resampled->header, MUSE_TAG_ARC_RESAMP);
00257 muse_image_delete(resampled);
00258 }
00259 }
00260
00261 if (aParams->wavemap) {
00262 muse_image *image = masterimage ? masterimage
00263 : muse_imagelist_get(images, 0);
00264 cpl_image *map = muse_wave_map(image, wavecaltable, tracetable);
00265
00266 muse_processing_save_cimage(aProcessing, aParams->nifu, map, image->header,
00267 MUSE_TAG_WAVE_MAP);
00268 cpl_image_delete(map);
00269 }
00270
00271
00272 cpl_table_delete(wavecaltable);
00273 muse_image_delete(masterimage);
00274 muse_imagelist_delete(images);
00275 cpl_table_delete(tracetable);
00276 cpl_table_delete(linelist);
00277
00278 return rc;
00279 }