00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #ifdef HAVE_CONFIG_H
00029 #include <config.h>
00030 #endif
00031
00032
00033
00034
00035
00036 #include "crires_recipe.h"
00037
00038 #include "crires_photom.h"
00039
00040
00041
00042
00043
00044 #define RECIPE_STRING "crires_util_sensitivity"
00045
00046
00047
00048
00049
00050 static int crires_util_sensitivity_save(const cpl_table **,
00051 const cpl_parameterlist *, cpl_frameset *) ;
00052
00053 static char crires_util_sensitivity_description[] =
00054 "This recipe accepts 1 parameter:\n"
00055 "First parameter: the table with the conversion factor.\n"
00056 " (PRO TYPE = "CRIRES_PROTYPE_CONVERS")\n"
00057 "\n"
00058 "This recipe produces 1 file:\n"
00059 "First product: the table with the sensitivity signal.\n"
00060 " (PRO TYPE = "CRIRES_PROTYPE_SENSIT")\n" ;
00061
00062 CRIRES_RECIPE_DEFINE(crires_util_sensitivity,
00063 CRIRES_PARAM_DISPLAY |
00064 CRIRES_PARAM_EXPTIME,
00065 "Compute the sensitivity",
00066 crires_util_sensitivity_description) ;
00067
00068
00069
00070
00071
00072 static struct {
00073
00074 int display ;
00075 double exptime ;
00076
00077 int win_mode ;
00078 double sens_med[CRIRES_NB_DETECTORS] ;
00079 } crires_util_sensitivity_config ;
00080
00081
00082
00083
00084
00085
00092
00093 static int crires_util_sensitivity(
00094 cpl_frameset * frameset,
00095 const cpl_parameterlist * parlist)
00096 {
00097 const char * sval ;
00098 cpl_propertylist * plist ;
00099 cpl_frame * fr ;
00100 cpl_table * conv_tab[CRIRES_NB_DETECTORS] ;
00101 double exptime_comp ;
00102 int i ;
00103
00104
00105 for (i=0 ; i<CRIRES_NB_DETECTORS ; i++) {
00106 crires_util_sensitivity_config.sens_med[i] = -1.0 ;
00107 conv_tab[i] = NULL ;
00108 }
00109
00110
00111 crires_util_sensitivity_config.display = crires_parameterlist_get_int(
00112 parlist, RECIPE_STRING, CRIRES_PARAM_DISPLAY) ;
00113 crires_util_sensitivity_config.exptime = crires_parameterlist_get_double(
00114 parlist, RECIPE_STRING, CRIRES_PARAM_EXPTIME) ;
00115
00116
00117 if (crires_dfs_set_groups(frameset, NULL)) {
00118 cpl_msg_error(__func__, "Cannot identify RAW and CALIB frames") ;
00119 return -1 ;
00120 }
00121
00122
00123 fr = cpl_frameset_get_frame(frameset, 0);
00124 if ((plist=cpl_propertylist_load(cpl_frame_get_filename(fr), 0)) == NULL)
00125 return -1 ;
00126 sval = crires_pfits_get_ncorrs(plist) ;
00127 if (!strcmp(sval, "FowlerNsampGRstWin")) {
00128 crires_util_sensitivity_config.win_mode = 1 ;
00129 } else {
00130 crires_util_sensitivity_config.win_mode = 0 ;
00131 }
00132 cpl_propertylist_delete(plist) ;
00133
00134
00135 for (i=0 ; i<CRIRES_NB_DETECTORS ; i++) {
00136
00137 if ((i==0 || i==CRIRES_NB_DETECTORS-1) &&
00138 (crires_util_sensitivity_config.win_mode == 1)) {
00139 continue ;
00140 }
00141
00142 cpl_msg_info(__func__, "Sensitivity computation for chip %d", i+1) ;
00143
00144
00145 cpl_msg_info(__func__, "Load the extracted table") ;
00146 cpl_msg_indent_more() ;
00147 fr = cpl_frameset_get_frame(frameset, 0);
00148 if ((conv_tab[i] = crires_load_table_check(cpl_frame_get_filename(fr),
00149 i+1, CRIRES_PROTYPE_CONVERS, -1, -1, 0)) == NULL) {
00150 cpl_msg_indent_less() ;
00151 continue ;
00152 }
00153 cpl_msg_indent_less() ;
00154
00155
00156 cpl_msg_info(__func__, "Sensitivity computation") ;
00157 cpl_msg_indent_more() ;
00158 if ((exptime_comp = crires_photom_sens_engine(conv_tab[i],
00159 cpl_frame_get_filename(fr),
00160 crires_util_sensitivity_config.exptime,
00161 crires_util_sensitivity_config.display==i+1)) < 0.0 ) {
00162 cpl_msg_error(__func__, "Cannot compute sensitivity") ;
00163 cpl_msg_indent_less() ;
00164 cpl_table_delete(conv_tab[i]) ;
00165 conv_tab[i] = NULL ;
00166 continue ;
00167 }
00168 cpl_msg_indent_less() ;
00169 crires_util_sensitivity_config.exptime = exptime_comp ;
00170
00171
00172 crires_util_sensitivity_config.sens_med[i] =
00173 cpl_table_get_column_median(conv_tab[i], CRIRES_COL_SENSITIVITY) ;
00174 }
00175
00176
00177 if (crires_util_sensitivity_config.win_mode == 1) {
00178 if (conv_tab[1] != NULL) {
00179 conv_tab[0] = cpl_table_duplicate(conv_tab[1]) ;
00180 cpl_table_set_size(conv_tab[0], 0) ;
00181 conv_tab[CRIRES_NB_DETECTORS-1] = cpl_table_duplicate(conv_tab[0]) ;
00182 }
00183 }
00184
00185
00186 cpl_msg_info(__func__, "Save the product") ;
00187 cpl_msg_indent_more() ;
00188 if (crires_util_sensitivity_save((const cpl_table **)conv_tab, parlist,
00189 frameset)) {
00190 cpl_msg_error(__func__, "Cannot save the product") ;
00191 for (i=0 ; i<CRIRES_NB_DETECTORS ; i++) {
00192 if (conv_tab[i] != NULL) cpl_table_delete(conv_tab[i]) ;
00193 }
00194 cpl_msg_indent_less() ;
00195 return -1 ;
00196 }
00197 for (i=0 ; i<CRIRES_NB_DETECTORS ; i++) {
00198 if (conv_tab[i] != NULL) cpl_table_delete(conv_tab[i]) ;
00199 }
00200 cpl_msg_indent_less() ;
00201
00202
00203 if (cpl_error_get_code()) return -1 ;
00204 else return 0 ;
00205 }
00206
00207
00215
00216 static int crires_util_sensitivity_save(
00217 const cpl_table ** out,
00218 const cpl_parameterlist * parlist,
00219 cpl_frameset * set)
00220 {
00221 cpl_propertylist ** qclists ;
00222 const cpl_frame * ref_frame ;
00223 cpl_propertylist * inputlist ;
00224 const char * recipe_name = "crires_util_sensitivity" ;
00225 int i ;
00226
00227
00228 ref_frame = irplib_frameset_get_first_from_group(set, CPL_FRAME_GROUP_RAW) ;
00229
00230
00231 qclists = cpl_malloc(CRIRES_NB_DETECTORS * sizeof(cpl_propertylist*)) ;
00232 for (i=0 ; i<CRIRES_NB_DETECTORS ; i++) {
00233 qclists[i] = cpl_propertylist_new() ;
00234 cpl_propertylist_append_double(qclists[i], "ESO QC SENSMED",
00235 crires_util_sensitivity_config.sens_med[i]) ;
00236 cpl_propertylist_append_double(qclists[i], "ESO QC EXPTIME",
00237 crires_util_sensitivity_config.exptime) ;
00238
00239
00240 inputlist = cpl_propertylist_load_regexp(
00241 cpl_frame_get_filename(ref_frame), i+1,
00242 CRIRES_HEADER_EXT_FORWARD, 0) ;
00243 cpl_propertylist_copy_property_regexp(qclists[i], inputlist,
00244 CRIRES_HEADER_EXT_FORWARD, 0) ;
00245 cpl_propertylist_delete(inputlist) ;
00246 }
00247
00248
00249 crires_table_save(set,
00250 parlist,
00251 set,
00252 out,
00253 recipe_name,
00254 CRIRES_EXTRACT_SENS_TAB,
00255 CRIRES_PROTYPE_SENSIT,
00256 NULL,
00257 (const cpl_propertylist **)qclists,
00258 PACKAGE "/" PACKAGE_VERSION,
00259 "crires_util_sensitivity.fits") ;
00260
00261
00262 for (i=0 ; i<CRIRES_NB_DETECTORS ; i++) {
00263 cpl_propertylist_delete(qclists[i]) ;
00264 }
00265 cpl_free(qclists) ;
00266 return 0;
00267 }
00268