37 #include "crires_recipe.h"
39 #include "crires_wlcalib.h"
40 #include "crires_wlestimate.h"
41 #include "irplib_utils.h"
47 #define RECIPE_STRING "crires_util_wlinit"
53 static int crires_util_wlinit_save(
const cpl_imagelist *,
const cpl_table **,
54 const cpl_parameterlist *, cpl_frameset *) ;
56 static char crires_util_wlinit_description[] =
57 "This recipe accepts 1 parameters:\n"
58 "First parameter: Any FITS file containing the WLEN settings in its header.\n"
60 "This recipe produces 2 files:\n"
61 "First product: the image with the wavelength values.\n"
62 " (PRO TYPE = "CRIRES_PROTYPE_WL_MAP
")\n"
63 "Second product: the table with the wavelength polynomial coefficients.\n"
64 " (PRO TYPE = "CRIRES_PROTYPE_WL_POLY
")\n" ;
66 CRIRES_RECIPE_DEFINE(crires_util_wlinit,
68 "Wavelength calibration from the initial guess",
69 crires_util_wlinit_description) ;
77 double wmin[CRIRES_NB_DETECTORS] ;
78 double wmax[CRIRES_NB_DETECTORS] ;
80 crires_illum_period period ;
81 double qc_wlcent[CRIRES_NB_DETECTORS] ;
82 double qc_wldisp[CRIRES_NB_DETECTORS] ;
83 } crires_util_wlinit_config ;
97 static int crires_util_wlinit(
98 cpl_frameset * frameset,
99 const cpl_parameterlist * parlist)
102 cpl_imagelist * wl_map ;
103 cpl_table * wl_tab[CRIRES_NB_DETECTORS] ;
104 cpl_polynomial * pol[CRIRES_NB_DETECTORS] ;
109 setlocale(LC_NUMERIC,
"C");
112 sval = crires_parameterlist_get_string(parlist, RECIPE_STRING,
113 CRIRES_PARAM_WAVES) ;
114 if (sscanf(sval,
"%lg,%lg,%lg,%lg,%lg,%lg,%lg,%lg",
115 &crires_util_wlinit_config.wmin[0],
116 &crires_util_wlinit_config.wmax[0],
117 &crires_util_wlinit_config.wmin[1],
118 &crires_util_wlinit_config.wmax[1],
119 &crires_util_wlinit_config.wmin[2],
120 &crires_util_wlinit_config.wmax[2],
121 &crires_util_wlinit_config.wmin[3],
122 &crires_util_wlinit_config.wmax[3])!=2*CRIRES_NB_DETECTORS){
127 if (crires_dfs_set_groups(frameset, NULL)) {
128 cpl_msg_error(__func__,
"Cannot identify RAW and CALIB frames") ;
133 crires_util_wlinit_config.period =
134 crires_get_detector_illum_period(
135 cpl_frame_get_filename(cpl_frameset_get_position(frameset, 0)));
136 if (crires_util_wlinit_config.period == CRIRES_ILLUM_UNKNOWN) {
137 cpl_msg_error(__func__,
138 "Cannot determine the detector illumination period") ;
141 crires_display_detector_illum(crires_util_wlinit_config.period) ;
145 for (i=0 ; i<CRIRES_NB_DETECTORS ; i++) {
146 cpl_msg_info(__func__,
"Wavelength calibration for chip %d", i+1) ;
149 crires_util_wlinit_config.qc_wlcent[i] = -1.0 ;
150 crires_util_wlinit_config.qc_wldisp[i] = -1.0 ;
153 if ((pol[i] = crires_wlestimate_compute(
154 crires_util_wlinit_config.wmin[i],
155 crires_util_wlinit_config.wmax[i])) == NULL) {
156 if ((pol[i] = crires_wlestimate_get(cpl_frame_get_filename(
157 cpl_frameset_get_position(frameset,0)), i+1)) == NULL) {
158 cpl_msg_error(__func__,
"Cannot get the calibration") ;
159 cpl_msg_indent_less() ;
160 for (j=0 ; j<i ; j++) cpl_polynomial_delete(pol[j]) ;
166 wl_tab[i] = crires_wlcalib_gen_wltab_one(
167 (
const cpl_polynomial *)pol[i], -1, -1.0) ;
168 if (pol[i] != NULL) cpl_polynomial_delete(pol[i]) ;
170 cpl_msg_indent_less() ;
173 wl_map = crires_wlcalib_gen_wlmap((
const cpl_table **)wl_tab) ;
176 for (i=0 ; i<CRIRES_NB_DETECTORS ; i++) {
177 crires_util_wlinit_config.qc_wlcent[i] =
178 cpl_image_get(cpl_imagelist_get(wl_map, i),
180 crires_util_wlinit_config.qc_wldisp[i] =
181 ((cpl_image_get(cpl_imagelist_get(wl_map, i), 1024, 256, &pix)) -
182 (cpl_image_get(cpl_imagelist_get(wl_map, i), 1, 256, &pix)))
187 cpl_msg_info(__func__,
"Save the products") ;
188 cpl_msg_indent_more() ;
189 if (crires_util_wlinit_save(wl_map, (
const cpl_table **)wl_tab, parlist,
191 cpl_msg_error(__func__,
"Cannot save the products") ;
192 cpl_msg_indent_less() ;
193 cpl_imagelist_delete(wl_map) ;
194 for (i=0 ; i<CRIRES_NB_DETECTORS ; i++) {
195 if (wl_tab[i] != NULL) cpl_table_delete(wl_tab[i]) ;
199 cpl_msg_indent_less() ;
200 cpl_imagelist_delete(wl_map) ;
201 for (i=0 ; i<CRIRES_NB_DETECTORS ; i++) {
202 if (wl_tab[i] != NULL) cpl_table_delete(wl_tab[i]) ;
206 if (cpl_error_get_code())
return -1 ;
220 static int crires_util_wlinit_save(
221 const cpl_imagelist * ilist,
222 const cpl_table ** tab,
223 const cpl_parameterlist * parlist,
226 cpl_propertylist ** qclists ;
227 const cpl_frame * ref_frame ;
228 cpl_propertylist * inputlist ;
229 const char * recipe_name =
"crires_util_wlinit" ;
233 ref_frame = irplib_frameset_get_first_from_group(set, CPL_FRAME_GROUP_RAW) ;
236 qclists = cpl_malloc(CRIRES_NB_DETECTORS *
sizeof(cpl_propertylist*)) ;
237 for (i=0 ; i<CRIRES_NB_DETECTORS ; i++) {
238 qclists[i] = cpl_propertylist_new() ;
239 cpl_propertylist_append_double(qclists[i],
"ESO QC CENTWL",
240 crires_util_wlinit_config.qc_wlcent[i]) ;
241 cpl_propertylist_append_double(qclists[i],
"ESO QC DISPWL",
242 crires_util_wlinit_config.qc_wldisp[i]) ;
245 inputlist = cpl_propertylist_load_regexp(
246 cpl_frame_get_filename(ref_frame), i+1,
247 CRIRES_HEADER_EXT_FORWARD, 0) ;
248 cpl_propertylist_copy_property_regexp(qclists[i], inputlist,
249 CRIRES_HEADER_EXT_FORWARD, 0) ;
250 cpl_propertylist_delete(inputlist) ;
254 crires_image_save(set,
260 CRIRES_PROTYPE_WL_MAP,
261 crires_util_wlinit_config.period,
263 (
const cpl_propertylist **)qclists,
264 PACKAGE
"/" PACKAGE_VERSION,
265 "crires_util_wlinit_ima.fits") ;
268 crires_table_save(set,
274 CRIRES_PROTYPE_WL_POLY,
276 (
const cpl_propertylist **)qclists,
277 PACKAGE
"/" PACKAGE_VERSION,
278 "crires_util_wlinit_tab.fits") ;
281 for (i=0 ; i<CRIRES_NB_DETECTORS ; i++) {
282 cpl_propertylist_delete(qclists[i]) ;