36 #include "crires_recipe.h"
38 #include "crires_photom.h"
39 #include "irplib_utils.h"
45 #define RECIPE_STRING "crires_util_conversion"
51 static int crires_util_conversion_save(
const cpl_table **,
52 const cpl_parameterlist *, cpl_frameset *) ;
54 static char crires_util_conversion_description[] =
55 "This recipe accepts 2 parameters:\n"
56 "First parameter: the table of the extracted spectrum in wavelength.\n"
57 " (PRO TYPE = "CRIRES_PROTYPE_SPEC_WL
")\n"
58 "Second parameter: the table with the standard star photospheric flux.\n"
59 " (PRO TYPE = "CRIRES_PROTYPE_PHO_FLUX
")\n"
61 "This recipe produces 1 file:\n"
62 "First product: the table with the conversion signal.\n"
63 " (PRO TYPE = "CRIRES_PROTYPE_CONVERS
")\n" ;
65 CRIRES_RECIPE_DEFINE(crires_util_conversion,
67 "Compute the conversion factor",
68 crires_util_conversion_description) ;
79 double conv_med[CRIRES_NB_DETECTORS] ;
80 double thro_med[CRIRES_NB_DETECTORS] ;
81 } crires_util_conversion_config ;
95 static int crires_util_conversion(
96 cpl_frameset * frameset,
97 const cpl_parameterlist * parlist)
101 cpl_propertylist * plist ;
102 cpl_table * ext_tab[CRIRES_NB_DETECTORS] ;
103 cpl_table * std_flux ;
104 cpl_bivector * std_biv ;
108 for (i=0 ; i<CRIRES_NB_DETECTORS ; i++) {
109 crires_util_conversion_config.conv_med[i] = -1.0 ;
110 crires_util_conversion_config.thro_med[i] = -1.0 ;
115 crires_util_conversion_config.display = crires_parameterlist_get_int(
116 parlist, RECIPE_STRING, CRIRES_PARAM_DISPLAY) ;
119 if (crires_dfs_set_groups(frameset, NULL)) {
120 cpl_msg_error(__func__,
"Cannot identify RAW and CALIB frames") ;
125 cpl_msg_info(__func__,
"Second frame validity check") ;
126 cpl_msg_indent_more() ;
127 fr = cpl_frameset_get_position(frameset, 1);
128 if ((std_flux = crires_load_table_check(cpl_frame_get_filename(fr), 1,
129 CRIRES_PROTYPE_PHO_FLUX, -1, -1, 0)) == NULL) {
130 cpl_msg_error(__func__,
"Second frame PRO TYPE must be %s",
131 CRIRES_PROTYPE_PHO_FLUX) ;
132 cpl_msg_indent_less() ;
135 cpl_msg_indent_less() ;
138 cpl_msg_info(__func__,
"Standard star photospheric flux retrieval") ;
139 cpl_msg_indent_more() ;
140 if ((std_biv = crires_photom_conv_get_star(std_flux,
141 cpl_frame_get_filename(cpl_frameset_get_position(frameset, 0))))==NULL){
142 cpl_msg_error(__func__,
"Cannot find the star") ;
143 cpl_msg_indent_less() ;
144 cpl_table_delete(std_flux) ;
147 cpl_table_delete(std_flux) ;
148 cpl_msg_indent_less() ;
151 fr = cpl_frameset_get_position(frameset, 0);
152 if ((plist=cpl_propertylist_load(cpl_frame_get_filename(fr), 0)) == NULL)
154 sval = crires_pfits_get_ncorrs(plist) ;
155 if (!strcmp(sval,
"FowlerNsampGRstWin")) {
156 crires_util_conversion_config.win_mode = 1 ;
158 crires_util_conversion_config.win_mode = 0 ;
160 cpl_propertylist_delete(plist) ;
163 for (i=0 ; i<CRIRES_NB_DETECTORS ; i++) {
165 if ((i==0 || i==CRIRES_NB_DETECTORS-1) &&
166 (crires_util_conversion_config.win_mode == 1)) {
170 cpl_msg_info(__func__,
"Conversion factor for chip %d", i+1) ;
173 cpl_msg_info(__func__,
"Load the extracted spectrum") ;
174 cpl_msg_indent_more() ;
175 fr = cpl_frameset_get_position(frameset, 0);
176 if ((ext_tab[i] = crires_load_table_check(cpl_frame_get_filename(fr),
177 i+1, CRIRES_PROTYPE_SPEC_WL, -1, -1, 0)) == NULL) {
178 cpl_msg_indent_less() ;
181 cpl_msg_indent_less() ;
184 cpl_msg_info(__func__,
"Conversion factor computation") ;
185 cpl_msg_indent_more() ;
186 if (crires_photom_conv_engine(ext_tab[i], std_biv, i+1,
187 crires_util_conversion_config.display==i+1) == -1) {
188 cpl_msg_error(__func__,
"Cannot compute conversion factor") ;
189 cpl_msg_indent_less() ;
190 cpl_bivector_delete(std_biv) ;
191 for (j=0 ; j<i ; j++) {
192 if (ext_tab[j] != NULL) cpl_table_delete(ext_tab[j]) ;
196 cpl_msg_indent_less() ;
199 crires_util_conversion_config.conv_med[i] =
200 cpl_table_get_column_median(ext_tab[i], CRIRES_COL_CONVERSION_RECT);
201 crires_util_conversion_config.thro_med[i] =
202 cpl_table_get_column_median(ext_tab[i], CRIRES_COL_THROUGHPUT) ;
204 cpl_bivector_delete(std_biv) ;
207 if (crires_util_conversion_config.win_mode == 1) {
208 if (ext_tab[1] != NULL) {
209 ext_tab[0] = cpl_table_duplicate(ext_tab[1]) ;
210 cpl_table_set_size(ext_tab[0], 0) ;
211 ext_tab[CRIRES_NB_DETECTORS-1] = cpl_table_duplicate(ext_tab[0]) ;
216 cpl_msg_info(__func__,
"Save the product") ;
217 cpl_msg_indent_more() ;
218 if (crires_util_conversion_save((
const cpl_table **)ext_tab, parlist,
220 cpl_msg_error(__func__,
"Cannot save the product") ;
221 for (i=0 ; i<CRIRES_NB_DETECTORS ; i++) {
222 if (ext_tab[i] != NULL) cpl_table_delete(ext_tab[i]) ;
224 cpl_msg_indent_less() ;
227 for (i=0 ; i<CRIRES_NB_DETECTORS ; i++) {
228 if (ext_tab[i] != NULL) cpl_table_delete(ext_tab[i]) ;
230 cpl_msg_indent_less() ;
233 if (cpl_error_get_code())
return -1 ;
246 static int crires_util_conversion_save(
247 const cpl_table ** out,
248 const cpl_parameterlist * parlist,
251 cpl_propertylist ** qclists ;
252 const cpl_frame * ref_frame ;
253 cpl_propertylist * inputlist ;
254 const char * recipe_name =
"crires_util_conversion" ;
258 ref_frame = irplib_frameset_get_first_from_group(set, CPL_FRAME_GROUP_RAW) ;
261 qclists = cpl_malloc(CRIRES_NB_DETECTORS *
sizeof(cpl_propertylist*)) ;
262 for (i=0 ; i<CRIRES_NB_DETECTORS ; i++) {
263 qclists[i] = cpl_propertylist_new() ;
264 cpl_propertylist_append_double(qclists[i],
"ESO QC CONVMED",
265 crires_util_conversion_config.conv_med[i]) ;
266 cpl_propertylist_append_double(qclists[i],
"ESO QC THROMED",
267 crires_util_conversion_config.thro_med[i]) ;
270 inputlist = cpl_propertylist_load_regexp(
271 cpl_frame_get_filename(ref_frame), i+1,
272 CRIRES_HEADER_EXT_FORWARD, 0) ;
273 cpl_propertylist_copy_property_regexp(qclists[i], inputlist,
274 CRIRES_HEADER_EXT_FORWARD, 0) ;
275 cpl_propertylist_delete(inputlist) ;
279 crires_table_save(set,
284 CRIRES_EXTRACT_CONV_TAB,
285 CRIRES_PROTYPE_CONVERS,
287 (
const cpl_propertylist **)qclists,
288 PACKAGE
"/" PACKAGE_VERSION,
289 "crires_util_conversion.fits") ;
292 for (i=0 ; i<CRIRES_NB_DETECTORS ; i++) {
293 cpl_propertylist_delete(qclists[i]) ;