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_extract.h"
00039
00040
00041
00042
00043
00044 #define RECIPE_STRING "crires_util_profile"
00045
00046
00047
00048
00049
00050 static int crires_util_profile_save(const cpl_table **,
00051 const cpl_parameterlist *, cpl_frameset *) ;
00052
00053 static char crires_util_profile_description[] =
00054 "This recipe accepts 1 parameter:\n"
00055 "First parameter: the profile produced by the spectrum extraction.\n"
00056 " (PRO TYPE = "CRIRES_PROTYPE_PROFILE")\n"
00057 "\n"
00058 "This recipe produces 1 file:\n"
00059 "First product: the table with the FWHMs values of the profile.\n"
00060 " (PRO TYPE = "CRIRES_PROTYPE_FWHM")\n" ;
00061
00062 CRIRES_RECIPE_DEFINE(crires_util_profile,
00063 CRIRES_PARAM_DISPLAY,
00064 "Compute the FWHM of the spectrum along lambda",
00065 crires_util_profile_description) ;
00066
00067
00068
00069
00070
00071 static struct {
00072
00073 int display ;
00074
00075 int win_mode ;
00076 crires_illum_period period ;
00077 } crires_util_profile_config ;
00078
00079
00080
00081
00082
00083
00090
00091 static int crires_util_profile(
00092 cpl_frameset * frameset,
00093 const cpl_parameterlist * parlist)
00094 {
00095 cpl_frame * fr ;
00096 const char * fname ;
00097 cpl_imagelist * profile ;
00098 cpl_propertylist * plist ;
00099 const char * sval ;
00100 cpl_table * tab[CRIRES_NB_DETECTORS] ;
00101 cpl_bivector * centers_fwhms ;
00102 int nbrows, ly ;
00103 int i, j ;
00104
00105
00106 for (i=0 ; i<CRIRES_NB_DETECTORS ; i++) {
00107 tab[i] = NULL ;
00108 }
00109 ly = -1 ;
00110
00111
00112 crires_util_profile_config.display = crires_parameterlist_get_int(parlist,
00113 RECIPE_STRING, CRIRES_PARAM_DISPLAY) ;
00114
00115
00116 if (crires_dfs_set_groups(frameset, NULL)) {
00117 cpl_msg_error(__func__, "Cannot identify RAW and CALIB frames") ;
00118 return -1 ;
00119 }
00120
00121
00122 fr = cpl_frameset_get_frame(frameset, 0);
00123 crires_util_profile_config.period =
00124 crires_get_detector_illum_period(cpl_frame_get_filename(fr)) ;
00125 if (crires_util_profile_config.period == CRIRES_ILLUM_UNKNOWN) {
00126 cpl_msg_error(__func__,
00127 "Cannot determine the detector illumination period") ;
00128 return -1 ;
00129 }
00130
00131
00132 if ((plist=cpl_propertylist_load(cpl_frame_get_filename(fr), 0)) == NULL)
00133 return -1 ;
00134 sval = crires_pfits_get_ncorrs(plist) ;
00135 if (!strcmp(sval, "FowlerNsampGRstWin")) {
00136 crires_util_profile_config.period = CRIRES_ILLUM_FULL_DETECTOR ;
00137 crires_util_profile_config.win_mode = 1 ;
00138 } else {
00139 crires_util_profile_config.win_mode = 0 ;
00140 }
00141 cpl_propertylist_delete(plist) ;
00142
00143
00144 crires_display_detector_illum(crires_util_profile_config.period) ;
00145
00146
00147 cpl_msg_info(__func__, "Input image loading") ;
00148 fname = cpl_frame_get_filename(fr) ;
00149 profile = crires_load_file(fname, crires_util_profile_config.period,
00150 CPL_TYPE_FLOAT) ;
00151
00152
00153 cpl_msg_info(__func__, "FWHM computation") ;
00154 cpl_msg_indent_more() ;
00155 for (i=0 ; i<CRIRES_NB_DETECTORS ; i++) {
00156
00157 if ((i==0 || i==CRIRES_NB_DETECTORS-1) &&
00158 (crires_util_profile_config.win_mode == 1)) {
00159 continue ;
00160 }
00161 cpl_msg_info(__func__, "Chip number %d", i+1) ;
00162 cpl_msg_indent_more() ;
00163 if ((centers_fwhms = crires_extract_spatial_fwhm(
00164 cpl_imagelist_get(profile, i))) == NULL) {
00165 cpl_msg_error(__func__,
00166 "Cannot get the FWHM for chip number %d", i+1) ;
00167 continue ;
00168 }
00169 cpl_msg_indent_less() ;
00170
00171
00172 if (i+1 == 1)
00173 ly = crires_get_detector_ly1(crires_util_profile_config.period) ;
00174 if (i+1 == 2)
00175 ly = crires_get_detector_ly2(crires_util_profile_config.period) ;
00176 if (i+1 == 3)
00177 ly = crires_get_detector_ly3(crires_util_profile_config.period) ;
00178 if (i+1 == 4)
00179 ly = crires_get_detector_ly4(crires_util_profile_config.period) ;
00180
00181 if (ly < 0) ly = 1 ;
00182 cpl_vector_add_scalar(cpl_bivector_get_x(centers_fwhms),(double)(ly-1));
00183
00184
00185 if(crires_util_profile_config.display == i+1) {
00186 cpl_plot_vector(
00187 "set grid;set xlabel 'Position (pixels)';set ylabel 'Y positions (pixels)';",
00188 "t 'Y positions' w lines", "", cpl_bivector_get_x(centers_fwhms));
00189 cpl_plot_vector(
00190 "set grid;set xlabel 'Position (pixels)';set ylabel 'FWHM (pixels)';",
00191 "t 'FWHMs' w lines", "", cpl_bivector_get_y(centers_fwhms));
00192 }
00193
00194
00195 nbrows = cpl_image_get_size_x(cpl_imagelist_get(profile, i)) ;
00196 tab[i] = cpl_table_new(nbrows) ;
00197 cpl_table_new_column(tab[i], CRIRES_COL_WL_DETPOSX, CPL_TYPE_INT) ;
00198 cpl_table_new_column(tab[i], CRIRES_COL_DETPOSY, CPL_TYPE_DOUBLE) ;
00199 cpl_table_new_column(tab[i], CRIRES_COL_FWHM, CPL_TYPE_DOUBLE) ;
00200 for (j=0 ; j<nbrows ; j++) {
00201 cpl_table_set_int(tab[i], CRIRES_COL_WL_DETPOSX, j, j+1) ;
00202 cpl_table_set_double(tab[i], CRIRES_COL_DETPOSY, j,
00203 cpl_vector_get(cpl_bivector_get_x(centers_fwhms), j));
00204 cpl_table_set_double(tab[i], CRIRES_COL_FWHM, j,
00205 cpl_vector_get(cpl_bivector_get_y(centers_fwhms), j));
00206 }
00207 cpl_bivector_delete(centers_fwhms) ;
00208 }
00209 cpl_msg_indent_less() ;
00210 cpl_imagelist_delete(profile) ;
00211
00212
00213 if (crires_util_profile_config.win_mode == 1) {
00214 if (tab[1] != NULL) {
00215 tab[0] = cpl_table_duplicate(tab[1]) ;
00216 cpl_table_set_size(tab[0], 0) ;
00217 tab[CRIRES_NB_DETECTORS-1] = cpl_table_duplicate(tab[0]) ;
00218 }
00219 }
00220
00221
00222 cpl_msg_info(__func__, "Save the product") ;
00223 cpl_msg_indent_more() ;
00224 if (crires_util_profile_save((const cpl_table **)tab, parlist, frameset)) {
00225 cpl_msg_error(__func__, "Cannot save the product") ;
00226 cpl_msg_indent_less() ;
00227 for (i=0 ; i<CRIRES_NB_DETECTORS ; i++) cpl_table_delete(tab[i]) ;
00228 return -1 ;
00229 }
00230 for (i=0 ; i<CRIRES_NB_DETECTORS ; i++) cpl_table_delete(tab[i]) ;
00231 cpl_msg_indent_less() ;
00232
00233
00234 if (cpl_error_get_code()) return -1 ;
00235 else return 0 ;
00236 }
00237
00238
00246
00247 static int crires_util_profile_save(
00248 const cpl_table ** out,
00249 const cpl_parameterlist * parlist,
00250 cpl_frameset * set)
00251 {
00252 const char * recipe_name = "crires_util_profile" ;
00253
00254
00255 crires_table_save(set,
00256 parlist,
00257 set,
00258 out,
00259 recipe_name,
00260 CRIRES_FWHM_TAB,
00261 CRIRES_PROTYPE_FWHM,
00262 NULL,
00263 NULL,
00264 PACKAGE "/" PACKAGE_VERSION,
00265 "crires_util_profile.fits") ;
00266
00267 return 0;
00268 }