36 #include "crires_recipe.h"
37 #include "crires_wlcalib.h"
43 #define RECIPE_STRING "crires_util_wlassign"
49 static int crires_util_wlassign_save(
const cpl_table **,
50 const cpl_parameterlist *, cpl_frameset *) ;
52 static char crires_util_wlassign_description[] =
53 "This recipe accepts 2 parameters:\n"
54 "First parameter: the table of the extracted spectrum in pixels\n"
55 " (PRO TYPE = "CRIRES_PROTYPE_SPEC_PIX
")\n"
56 "Second parameter: the table with the wavelength solution(s)\n"
57 " (PRO TYPE = "CRIRES_PROTYPE_WL_POLY
")\n"
59 "This recipe produces 1 file:\n"
60 "First product: the table with the extracted spectrum in wavelength.\n"
61 " (PRO TYPE = "CRIRES_PROTYPE_SPEC_WL
")\n" ;
63 CRIRES_RECIPE_DEFINE(crires_util_wlassign,
65 "Put the wavelength in the extracted table",
66 crires_util_wlassign_description) ;
77 } crires_util_wlassign_config ;
91 static int crires_util_wlassign(
92 cpl_frameset * frameset,
93 const cpl_parameterlist * parlist)
96 cpl_propertylist * plist ;
100 cpl_table * ext_tab[CRIRES_NB_DETECTORS] ;
101 int nbrows, pix, spec_pos ;
106 for (i=0 ; i<CRIRES_NB_DETECTORS ; i++) {
111 crires_util_wlassign_config.display = crires_parameterlist_get_int(parlist,
112 RECIPE_STRING, CRIRES_PARAM_DISPLAY) ;
115 if (crires_dfs_set_groups(frameset, NULL)) {
116 cpl_msg_error(__func__,
"Cannot identify RAW and CALIB frames") ;
121 fr = cpl_frameset_get_position(frameset, 0);
122 if ((plist=cpl_propertylist_load(cpl_frame_get_filename(fr), 0)) == NULL)
124 sval = crires_pfits_get_ncorrs(plist) ;
125 if (!strcmp(sval,
"FowlerNsampGRstWin")) {
126 crires_util_wlassign_config.win_mode = 1 ;
128 crires_util_wlassign_config.win_mode = 0 ;
130 cpl_propertylist_delete(plist) ;
133 for (i=0 ; i<CRIRES_NB_DETECTORS ; i++) {
135 if ((i==0 || i==CRIRES_NB_DETECTORS-1) &&
136 (crires_util_wlassign_config.win_mode == 1)) {
139 cpl_msg_info(__func__,
"Wavelength assignment for chip %d", i+1) ;
142 cpl_msg_info(__func__,
"Wavelength retrieval") ;
143 fr = cpl_frameset_get_position(frameset, 1);
144 if ((wl_tab=crires_load_table_check(cpl_frame_get_filename(fr), i+1,
145 CRIRES_PROTYPE_WL_POLY, -1, -1, 0)) == NULL) {
146 cpl_msg_error(__func__,
"Cannot load Wavelength from chip %d",i+1) ;
151 if ((wl_map = crires_wlcalib_gen_wlmap_one_chip(
152 (
const cpl_table *)wl_tab)) == NULL) {
153 cpl_msg_error(__func__,
"Cannot compute the Wavelength Map") ;
154 cpl_table_delete(wl_tab);
157 cpl_table_delete(wl_tab);
160 fr = cpl_frameset_get_position(frameset, 0);
161 if ((ext_tab[i] = crires_load_table_check(cpl_frame_get_filename(fr),
162 i+1, CRIRES_PROTYPE_SPEC_PIX, -1, -1, 0)) == NULL) {
163 cpl_msg_warning(__func__,
"Empty extension") ;
168 cpl_msg_info(__func__,
"Wavelength column computation") ;
169 cpl_table_new_column(ext_tab[i], CRIRES_COL_WAVELENGTH,CPL_TYPE_DOUBLE);
170 cpl_table_new_column(ext_tab[i], CRIRES_COL_WAVELENGTH_MODEL,
172 nbrows = cpl_table_get_nrow(ext_tab[i]) ;
173 spec_pos = crires_get_y_spec_position(cpl_frame_get_filename(fr), i+1);
174 for (j=0 ; j<nbrows ; j++) {
175 wl = cpl_image_get(wl_map, j+1, spec_pos, &pix) ;
176 cpl_table_set_double(ext_tab[i], CRIRES_COL_WAVELENGTH, j, wl);
177 cpl_table_set_double(ext_tab[i], CRIRES_COL_WAVELENGTH_MODEL, j,
180 cpl_image_delete(wl_map) ;
183 if(crires_util_wlassign_config.display == i+1) {
185 "set grid;set xlabel 'Wavelength (nm)';set ylabel 'Intensity OPT (ADU/sec)';",
186 "t 'Extracted spectrum OPT' w lines",
"", ext_tab[i],
187 CRIRES_COL_WAVELENGTH, CRIRES_COL_EXTRACT_INT_OPT) ;
189 "set grid;set xlabel 'Wavelength (nm)';set ylabel 'Intensity RECT (ADU/sec)';",
190 "t 'Extracted spectrum RECT' w lines",
"", ext_tab[i],
191 CRIRES_COL_WAVELENGTH, CRIRES_COL_EXTRACT_INT_RECT) ;
196 if (crires_util_wlassign_config.win_mode == 1) {
197 if (ext_tab[1] != NULL) {
198 ext_tab[0] = cpl_table_duplicate(ext_tab[1]) ;
199 cpl_table_set_size(ext_tab[0], 0) ;
200 ext_tab[CRIRES_NB_DETECTORS-1] = cpl_table_duplicate(ext_tab[0]) ;
205 cpl_msg_info(__func__,
"Save the product") ;
206 cpl_msg_indent_more() ;
207 if (crires_util_wlassign_save((
const cpl_table **)ext_tab, parlist,
209 cpl_msg_error(__func__,
"Cannot save the product") ;
210 for (i=0 ; i<CRIRES_NB_DETECTORS ; i++) {
211 if (ext_tab[i] != NULL) cpl_table_delete(ext_tab[i]) ;
213 cpl_msg_indent_less() ;
216 for (i=0 ; i<CRIRES_NB_DETECTORS ; i++) {
217 if (ext_tab[i] != NULL) cpl_table_delete(ext_tab[i]) ;
219 cpl_msg_indent_less() ;
222 if (cpl_error_get_code())
return -1 ;
235 static int crires_util_wlassign_save(
236 const cpl_table ** out,
237 const cpl_parameterlist * parlist,
240 const char * recipe_name =
"crires_util_wlassign" ;
243 crires_table_save(set,
248 CRIRES_OBS_EXTRACT_WL_TAB,
249 CRIRES_PROTYPE_SPEC_WL,
252 PACKAGE
"/" PACKAGE_VERSION,
253 "crires_util_wlassign.fits") ;