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 "visir_recipe.h"
00037 #include "visir_spectro.h"
00038 #include "visir_spc_distortion.h"
00039
00040
00041
00042
00043
00044 #define RECIPE_STRING "visir_old_spc_wcal_ech"
00045
00046
00047
00048
00049 static cpl_error_code visir_spc_wcal_ech_save(cpl_frameset *,
00050 const cpl_parameterlist *,
00051 const cpl_propertylist *,
00052 const cpl_propertylist *,
00053 const cpl_table *);
00054
00055 VISIR_RECIPE_DEFINE(visir_old_spc_wcal_ech,
00056 VISIR_PARAM_ZERODIST | VISIR_PARAM_ORDEROFF |
00057 VISIR_PARAM_AUTOBPM |
00058 VISIR_PARAM_PLOT | VISIR_PARAM_SLITSKEW |
00059 VISIR_PARAM_SPECSKEW | VISIR_PARAM_VERTARC |
00060 VISIR_PARAM_REJLEFT | VISIR_PARAM_REJRIGHT |
00061 VISIR_PARAM_HORIARC,
00062 "Old DRS detector: Spectroscopic wavelength calibration recipe in Echelle",
00063 "This recipe estimates the dispersion relation using the "
00064 "atmospheric spectrum\n"
00065 "in a grism spectroscopy half-cycle frame.\n"
00066 "The files listed in the Set Of Frames (sof-file) "
00067 "must be tagged:\n"
00068 "VISIR-Echelle-Spectroscopy-file.fits "
00069 VISIR_SPC_WCAL_ECH_RAW "\n"
00070 "VISIR-Quantum-Efficiency-Calibration-file.fits "
00071 VISIR_CALIB_QEFF_SPC "\n"
00072 "VISIR-Atmospheric-Emission-Lines-Calibration-file.fits "
00073 VISIR_CALIB_LINES_SPC
00074 "\n"
00075 MAN_VISIR_CALIB_BPM_SPC);
00076
00077
00078
00079
00080
00081 static struct {
00082
00083 int auto_bpm;
00084 int plot;
00085 int orderoffset;
00086 double phi;
00087 double ksi;
00088 double eps;
00089 double delta;
00090
00091 } visir_spc_wcal_ech_config;
00092
00093
00094
00098
00099
00100
00101
00102
00103
00104
00111
00112 static int visir_old_spc_wcal_ech(cpl_frameset * framelist,
00113 const cpl_parameterlist * parlist)
00114 {
00115 irplib_framelist * allframes = NULL;
00116 irplib_framelist * rawframes = NULL;
00117 cpl_propertylist * qclist = cpl_propertylist_new();
00118 cpl_propertylist * paflist = cpl_propertylist_new();
00119 const char * spc_cal_qeff;
00120 const char * spc_cal_lines;
00121 cpl_imagelist * hcycle = NULL;
00122 cpl_image * imhcycle = NULL;
00123 cpl_image * flipped = NULL;
00124 cpl_table * spc_table = NULL;
00125 cpl_image * order = NULL;
00126 double wlen, slitw, temp, fwhm;
00127 int icol1, icol2;
00128 int jcol1, jcol2;
00129 visir_spc_resol resol;
00130
00131
00132 visir_spc_wcal_ech_config.auto_bpm =
00133 visir_parameterlist_get_bool(parlist, RECIPE_STRING, VISIR_PARAM_AUTOBPM);
00134 visir_spc_wcal_ech_config.plot =
00135 visir_parameterlist_get_int(parlist, RECIPE_STRING, VISIR_PARAM_PLOT);
00136
00137 visir_spc_wcal_ech_config.phi =
00138 visir_parameterlist_get_double(parlist,RECIPE_STRING,VISIR_PARAM_SLITSKEW);
00139 visir_spc_wcal_ech_config.ksi =
00140 visir_parameterlist_get_double(parlist,RECIPE_STRING,VISIR_PARAM_SPECSKEW);
00141 visir_spc_wcal_ech_config.eps =
00142 visir_parameterlist_get_double(parlist,RECIPE_STRING, VISIR_PARAM_VERTARC);
00143 visir_spc_wcal_ech_config.delta =
00144 visir_parameterlist_get_double(parlist,RECIPE_STRING, VISIR_PARAM_HORIARC);
00145
00146 visir_spc_wcal_ech_config.orderoffset =
00147 visir_parameterlist_get_int(parlist, RECIPE_STRING, VISIR_PARAM_ORDEROFF);
00148
00149 jcol1 = visir_parameterlist_get_int(parlist, RECIPE_STRING,
00150 VISIR_PARAM_REJLEFT);
00151 jcol2 = visir_parameterlist_get_int(parlist, RECIPE_STRING,
00152 VISIR_PARAM_REJRIGHT);
00153
00154 skip_if (0);
00155
00156
00157 skip_if (visir_dfs_set_groups(framelist));
00158
00159
00160 allframes = irplib_framelist_cast(framelist);
00161 skip_if(allframes == NULL);
00162 rawframes = irplib_framelist_extract(allframes, VISIR_SPC_WCAL_ECH_RAW);
00163 skip_if (rawframes == NULL);
00164
00165 irplib_framelist_empty(allframes);
00166
00167 skip_if(irplib_framelist_load_propertylist_all(rawframes, 0, ".*", CPL_FALSE));
00168
00169 skip_if(visir_dfs_check_framelist_tag(rawframes));
00170
00171
00172 spc_cal_qeff = irplib_frameset_find_file(framelist, VISIR_CALIB_QEFF_SPC);
00173
00174
00175 spc_cal_lines = irplib_frameset_find_file(framelist, VISIR_CALIB_LINES_SPC);
00176
00177
00178 resol = visir_spc_get_res_wl(rawframes, &wlen, &slitw, &temp, &fwhm, 0);
00179
00180 skip_if (0);
00181
00182 if (resol != VISIR_SPC_R_GHR) {
00183 if (visir_spc_wcal_ech_config.orderoffset == 0) {
00184 cpl_msg_warning(cpl_func,"Reducing non-HR Grism data as main order");
00185 } else {
00186 cpl_msg_error(cpl_func, "This recipe cannot reduce non-HR Grism "
00187 "data with an order-offset of %d",
00188 visir_spc_wcal_ech_config.orderoffset);
00189 visir_error_set(CPL_ERROR_TYPE_MISMATCH);
00190 skip_if(1);
00191 }
00192 }
00193
00194
00195 hcycle = visir_load_hcycle(rawframes, 0);
00196 skip_if (0);
00197
00198 imhcycle = cpl_imagelist_unset(hcycle, 0);
00199
00200
00201
00202 flipped = visir_spc_flip(imhcycle, wlen, resol, VISIR_DATA_CUBE2);
00203 skip_if (0);
00204 cpl_image_delete(imhcycle);
00205 imhcycle = flipped;
00206 flipped = NULL;
00207
00208 skip_if (visir_spc_det_fix(&imhcycle, 1, CPL_FALSE,
00209 wlen, resol,
00210 visir_spc_wcal_ech_config.phi,
00211 visir_spc_wcal_ech_config.ksi,
00212 visir_spc_wcal_ech_config.eps,
00213 visir_spc_wcal_ech_config.delta,
00214 visir_spc_wcal_ech_config.plot));
00215
00216 skip_if (visir_spc_echelle_limit(&icol1, &icol2, wlen,
00217 visir_spc_wcal_ech_config.orderoffset, 1,
00218 cpl_image_get_size_y(imhcycle), 0));
00219
00220 skip_if(visir_qc_append_background(qclist, rawframes, icol1, icol2));
00221
00222 if (jcol1 != 0) {
00223 cpl_msg_info(cpl_func, "Ignoring %d leftmost columns from %d to %d",
00224 jcol1, icol1, icol1 + jcol1);
00225 icol1 += jcol1;
00226 }
00227 if (jcol2 != 0) {
00228 cpl_msg_info(cpl_func, "Ignoring %d rightmost columns from %d to %d",
00229 jcol2, icol2 - jcol2, icol2);
00230 icol2 -= jcol2;
00231 }
00232
00233 if (icol1 != 1 || icol2 != cpl_image_get_size_x(imhcycle)) {
00234
00235 order = visir_spc_column_extract(imhcycle, icol1, icol2,
00236 visir_spc_wcal_ech_config.plot);
00237 skip_if (0);
00238 } else {
00239
00240 order = imhcycle;
00241 }
00242
00243 skip_if (visir_spc_wavecal(order, qclist, wlen, slitw, temp, fwhm, resol,
00244 visir_spc_wcal_ech_config.orderoffset,
00245 spc_cal_lines, spc_cal_qeff,
00246 &spc_table, visir_spc_wcal_ech_config.plot, 0));
00247
00248
00249 skip_if (cpl_table_erase_column(spc_table, "SPC_EMISSIVITY"));
00250
00251 bug_if (visir_spectro_qc(qclist, paflist, CPL_FALSE, rawframes, NULL,
00252 "^(" VISIR_PFITS_REGEXP_SPC_WCAL_PAF ")$"));
00253 irplib_framelist_empty(rawframes);
00254
00255
00256 cpl_msg_info(cpl_func, "Saving the produced spectrum");
00257
00258
00259 bug_if (cpl_propertylist_append_string(paflist, CPL_DFS_PRO_CATG,
00260 VISIR_SPC_WCAL_ECH_TAB_PROCATG));
00261
00262 skip_if (visir_spc_wcal_ech_save(framelist, parlist, qclist, paflist,
00263 spc_table));
00264
00265 end_skip;
00266
00267 cpl_propertylist_delete(qclist);
00268 cpl_propertylist_delete(paflist);
00269 irplib_framelist_delete(allframes);
00270 irplib_framelist_delete(rawframes);
00271 cpl_table_delete(spc_table);
00272 if (order != imhcycle) cpl_image_delete(order);
00273 cpl_imagelist_delete(hcycle);
00274 cpl_image_delete(imhcycle);
00275 cpl_image_delete(flipped);
00276
00277 return cpl_error_get_code();
00278 }
00279
00280
00290
00291 static cpl_error_code visir_spc_wcal_ech_save(cpl_frameset * set,
00292 const cpl_parameterlist * parlist,
00293 const cpl_propertylist * qclist,
00294 const cpl_propertylist * paflist,
00295 const cpl_table * table)
00296 {
00297 bug_if (0);
00298
00299
00300 skip_if (irplib_dfs_save_table(set, parlist, set, table, NULL, RECIPE_STRING,
00301 VISIR_SPC_WCAL_ECH_TAB_PROCATG,
00302 qclist, NULL, visir_pipe_id,
00303 RECIPE_STRING "_spectrum_tab" CPL_DFS_FITS));
00304
00305 #ifdef VISIR_SAVE_PAF
00306
00307 skip_if (cpl_dfs_save_paf("VISIR", RECIPE_STRING, paflist,
00308 RECIPE_STRING CPL_DFS_PAF));
00309 #else
00310 bug_if(paflist == NULL);
00311 #endif
00312
00313 end_skip;
00314
00315 return cpl_error_get_code();
00316 }