36 #include "crires_recipe.h"
38 #include "crires_photom.h"
39 #include "irplib_utils.h"
45 #define RECIPE_STRING "crires_util_sensitivity"
51 static int crires_util_sensitivity_save(
const cpl_table **,
52 const cpl_parameterlist *, cpl_frameset *) ;
54 static char crires_util_sensitivity_description[] =
55 "This recipe accepts 1 parameter:\n"
56 "First parameter: the table with the conversion factor.\n"
57 " (PRO TYPE = "CRIRES_PROTYPE_CONVERS
")\n"
59 "This recipe produces 1 file:\n"
60 "First product: the table with the sensitivity signal.\n"
61 " (PRO TYPE = "CRIRES_PROTYPE_SENSIT
")\n" ;
63 CRIRES_RECIPE_DEFINE(crires_util_sensitivity,
64 CRIRES_PARAM_DISPLAY |
66 "Compute the sensitivity",
67 crires_util_sensitivity_description) ;
79 double sens_med[CRIRES_NB_DETECTORS] ;
80 } crires_util_sensitivity_config ;
94 static int crires_util_sensitivity(
95 cpl_frameset * frameset,
96 const cpl_parameterlist * parlist)
99 cpl_propertylist * plist ;
101 cpl_table * conv_tab[CRIRES_NB_DETECTORS] ;
102 double exptime_comp ;
106 for (i=0 ; i<CRIRES_NB_DETECTORS ; i++) {
107 crires_util_sensitivity_config.sens_med[i] = -1.0 ;
112 crires_util_sensitivity_config.display = crires_parameterlist_get_int(
113 parlist, RECIPE_STRING, CRIRES_PARAM_DISPLAY) ;
114 crires_util_sensitivity_config.exptime = crires_parameterlist_get_double(
115 parlist, RECIPE_STRING, CRIRES_PARAM_EXPTIME) ;
118 if (crires_dfs_set_groups(frameset, NULL)) {
119 cpl_msg_error(__func__,
"Cannot identify RAW and CALIB frames") ;
124 fr = cpl_frameset_get_position(frameset, 0);
125 if ((plist=cpl_propertylist_load(cpl_frame_get_filename(fr), 0)) == NULL)
127 sval = crires_pfits_get_ncorrs(plist) ;
128 if (!strcmp(sval,
"FowlerNsampGRstWin")) {
129 crires_util_sensitivity_config.win_mode = 1 ;
131 crires_util_sensitivity_config.win_mode = 0 ;
133 cpl_propertylist_delete(plist) ;
136 for (i=0 ; i<CRIRES_NB_DETECTORS ; i++) {
138 if ((i==0 || i==CRIRES_NB_DETECTORS-1) &&
139 (crires_util_sensitivity_config.win_mode == 1)) {
143 cpl_msg_info(__func__,
"Sensitivity computation for chip %d", i+1) ;
146 cpl_msg_info(__func__,
"Load the extracted table") ;
147 cpl_msg_indent_more() ;
148 fr = cpl_frameset_get_position(frameset, 0);
149 if ((conv_tab[i] = crires_load_table_check(cpl_frame_get_filename(fr),
150 i+1, CRIRES_PROTYPE_CONVERS, -1, -1, 0)) == NULL) {
151 cpl_msg_indent_less() ;
154 cpl_msg_indent_less() ;
157 cpl_msg_info(__func__,
"Sensitivity computation") ;
158 cpl_msg_indent_more() ;
159 if ((exptime_comp = crires_photom_sens_engine(conv_tab[i],
160 cpl_frame_get_filename(fr),
161 crires_util_sensitivity_config.exptime,
162 crires_util_sensitivity_config.display==i+1)) < 0.0 ) {
163 cpl_msg_error(__func__,
"Cannot compute sensitivity") ;
164 cpl_msg_indent_less() ;
165 cpl_table_delete(conv_tab[i]) ;
169 cpl_msg_indent_less() ;
170 crires_util_sensitivity_config.exptime = exptime_comp ;
173 crires_util_sensitivity_config.sens_med[i] =
174 cpl_table_get_column_median(conv_tab[i], CRIRES_COL_SENSITIVITY) ;
178 if (crires_util_sensitivity_config.win_mode == 1) {
179 if (conv_tab[1] != NULL) {
180 conv_tab[0] = cpl_table_duplicate(conv_tab[1]) ;
181 cpl_table_set_size(conv_tab[0], 0) ;
182 conv_tab[CRIRES_NB_DETECTORS-1] = cpl_table_duplicate(conv_tab[0]) ;
187 cpl_msg_info(__func__,
"Save the product") ;
188 cpl_msg_indent_more() ;
189 if (crires_util_sensitivity_save((
const cpl_table **)conv_tab, parlist,
191 cpl_msg_error(__func__,
"Cannot save the product") ;
192 for (i=0 ; i<CRIRES_NB_DETECTORS ; i++) {
193 if (conv_tab[i] != NULL) cpl_table_delete(conv_tab[i]) ;
195 cpl_msg_indent_less() ;
198 for (i=0 ; i<CRIRES_NB_DETECTORS ; i++) {
199 if (conv_tab[i] != NULL) cpl_table_delete(conv_tab[i]) ;
201 cpl_msg_indent_less() ;
204 if (cpl_error_get_code())
return -1 ;
217 static int crires_util_sensitivity_save(
218 const cpl_table ** out,
219 const cpl_parameterlist * parlist,
222 cpl_propertylist ** qclists ;
223 const cpl_frame * ref_frame ;
224 cpl_propertylist * inputlist ;
225 const char * recipe_name =
"crires_util_sensitivity" ;
229 ref_frame = irplib_frameset_get_first_from_group(set, CPL_FRAME_GROUP_RAW) ;
232 qclists = cpl_malloc(CRIRES_NB_DETECTORS *
sizeof(cpl_propertylist*)) ;
233 for (i=0 ; i<CRIRES_NB_DETECTORS ; i++) {
234 qclists[i] = cpl_propertylist_new() ;
235 cpl_propertylist_append_double(qclists[i],
"ESO QC SENSMED",
236 crires_util_sensitivity_config.sens_med[i]) ;
237 cpl_propertylist_append_double(qclists[i],
"ESO QC EXPTIME",
238 crires_util_sensitivity_config.exptime) ;
241 inputlist = cpl_propertylist_load_regexp(
242 cpl_frame_get_filename(ref_frame), i+1,
243 CRIRES_HEADER_EXT_FORWARD, 0) ;
244 cpl_propertylist_copy_property_regexp(qclists[i], inputlist,
245 CRIRES_HEADER_EXT_FORWARD, 0) ;
246 cpl_propertylist_delete(inputlist) ;
250 crires_table_save(set,
255 CRIRES_EXTRACT_SENS_TAB,
256 CRIRES_PROTYPE_SENSIT,
258 (
const cpl_propertylist **)qclists,
259 PACKAGE
"/" PACKAGE_VERSION,
260 "crires_util_sensitivity.fits") ;
263 for (i=0 ; i<CRIRES_NB_DETECTORS ; i++) {
264 cpl_propertylist_delete(qclists[i]) ;