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_spc_obs_ech"
00045
00046
00047 #define RECIPE_KEYS_REGEXP_ALL \
00048 VISIR_PFITS_REGEXP_IMG_RECOMBINE \
00049 "|" VISIR_PFITS_REGEXP_SPC_GET_RES_WL
00050
00051
00052 #define RECIPE_KEYS_REGEXP \
00053 RECIPE_KEYS_REGEXP_ALL \
00054 "|" VISIR_PFITS_REGEXP_CAPA \
00055 "|" VISIR_PFITS_REGEXP_SPC_WCAL_PAF
00056
00057
00058 #define RECIPE_KEYS_REGEXP_WCS \
00059 RECIPE_KEYS_REGEXP \
00060 "|" IRPLIB_PFITS_WCS_REGEXP
00061
00062
00063
00064
00065
00066 static cpl_error_code visir_spc_obs_ech_save(cpl_frameset *,
00067 const cpl_parameterlist *,
00068 const cpl_propertylist *,
00069 const cpl_propertylist *,
00070 const cpl_image *,
00071 const cpl_image *,
00072 const cpl_table *);
00073
00074 VISIR_RECIPE_DEFINE(visir_spc_obs_ech,
00075 VISIR_PARAM_ZERODIST | VISIR_PARAM_ORDEROFF |
00076 VISIR_PARAM_REFINE | VISIR_PARAM_XCORR |
00077 VISIR_PARAM_OFFSETS | VISIR_PARAM_OBJECTS |
00078 VISIR_PARAM_NODPOS | VISIR_PARAM_AUTOBPM |
00079 VISIR_PARAM_GLITCH | VISIR_PARAM_PURGE |
00080 VISIR_PARAM_UNION | VISIR_PARAM_REJECT |
00081 VISIR_PARAM_STRIPITE | VISIR_PARAM_STRIPMOR |
00082 VISIR_PARAM_PLOT | VISIR_PARAM_SLITSKEW |
00083 VISIR_PARAM_SPECSKEW | VISIR_PARAM_VERTARC |
00084 VISIR_PARAM_REJLEFT | VISIR_PARAM_REJRIGHT |
00085 VISIR_PARAM_HORIARC | VISIR_PARAM_FIXCOMBI,
00086 "Spectroscopic observation recipe in Echelle mode",
00087 "This recipe estimates the dispersion relation using the "
00088 "atmospheric spectrum\n"
00089 "in a grism spectroscopy half-cycle frame.\n"
00090 "It also extracts the spectrum of an observed object using "
00091 "a combined frame.\n"
00092 "The files listed in the Set Of Frames (sof-file) "
00093 "must be tagged:\n"
00094 "VISIR-Echelle-Spectroscopy-file.fits "
00095 VISIR_SPC_OBS_ECH_RAW "\n"
00096 "VISIR-Quantum-Efficiency-Calibration-file.fits "
00097 VISIR_CALIB_QEFF_SPC "\n"
00098 "VISIR-Atmospheric-Emission-Lines-Calibration-file.fits "
00099 VISIR_CALIB_LINES_SPC
00100 "\n"
00101 MAN_VISIR_CALIB_BPM_SPC);
00102
00103
00104
00105
00106
00107 static struct {
00108
00109 int plot;
00110 int orderoffset;
00111 double phi;
00112 double ksi;
00113 double eps;
00114 double delta;
00115
00116 } visir_spc_obs_ech_config;
00117
00118
00122
00123
00124
00125
00126
00127
00128
00135
00136 static int visir_spc_obs_ech(cpl_frameset * framelist,
00137 const cpl_parameterlist * parlist)
00138 {
00139 irplib_framelist * allframes = NULL;
00140 irplib_framelist * rawframes = NULL;
00141 cpl_propertylist * qclist = cpl_propertylist_new();
00142 cpl_propertylist * paflist = cpl_propertylist_new();
00143 const char * badpix;
00144 const char * spc_cal_qeff;
00145 const char * spc_cal_lines;
00146 const char * flat;
00147 cpl_image * combined = NULL;
00148 cpl_image * comorder = NULL;
00149 cpl_imagelist * hcycle = NULL;
00150 cpl_image * order = NULL;
00151 cpl_table * spc_table = NULL;
00152 cpl_image * weight2d = NULL;
00153 cpl_image * imhcycle = NULL;
00154 cpl_image ** combinedpair;
00155 int icol1, icol2;
00156 int jcol1, jcol2;
00157 double wlen, slitw, temp, fwhm;
00158 visir_spc_resol resol;
00159 cpl_boolean do_fixcombi;
00160 cpl_boolean drop_wcs;
00161 const char * keys_regexp = "^(" RECIPE_KEYS_REGEXP_WCS ")$";
00162
00163
00164
00165 visir_spc_obs_ech_config.plot =
00166 visir_parameterlist_get_int(parlist, RECIPE_STRING, VISIR_PARAM_PLOT);
00167
00168 visir_spc_obs_ech_config.phi =
00169 visir_parameterlist_get_double(parlist,RECIPE_STRING,VISIR_PARAM_SLITSKEW);
00170 visir_spc_obs_ech_config.ksi =
00171 visir_parameterlist_get_double(parlist,RECIPE_STRING,VISIR_PARAM_SPECSKEW);
00172 visir_spc_obs_ech_config.eps =
00173 visir_parameterlist_get_double(parlist, RECIPE_STRING,VISIR_PARAM_VERTARC);
00174 visir_spc_obs_ech_config.delta =
00175 visir_parameterlist_get_double(parlist, RECIPE_STRING,VISIR_PARAM_HORIARC);
00176
00177 visir_spc_obs_ech_config.orderoffset =
00178 visir_parameterlist_get_int(parlist, RECIPE_STRING, VISIR_PARAM_ORDEROFF);
00179
00180 do_fixcombi = visir_parameterlist_get_bool(parlist, RECIPE_STRING,
00181 VISIR_PARAM_FIXCOMBI);
00182
00183 jcol1 = visir_parameterlist_get_int(parlist, RECIPE_STRING,
00184 VISIR_PARAM_REJLEFT);
00185 jcol2 = visir_parameterlist_get_int(parlist, RECIPE_STRING,
00186 VISIR_PARAM_REJRIGHT);
00187
00188 skip_if (0);
00189
00190
00191 skip_if (visir_dfs_set_groups(framelist));
00192
00193
00194 allframes = irplib_framelist_cast(framelist);
00195 skip_if(allframes == NULL);
00196 rawframes = irplib_framelist_extract(allframes, VISIR_SPC_OBS_ECH_RAW);
00197 skip_if (rawframes == NULL);
00198
00199 irplib_framelist_empty(allframes);
00200
00201 skip_if(irplib_framelist_load_propertylist(rawframes, 0, 0, keys_regexp,
00202 CPL_FALSE));
00203
00204 skip_if(irplib_framelist_load_propertylist_all(rawframes, 0, "^("
00205 RECIPE_KEYS_REGEXP_ALL
00206 ")$", CPL_FALSE));
00207
00208 skip_if(visir_dfs_check_framelist_tag(rawframes));
00209
00210
00211 spc_cal_qeff = irplib_frameset_find_file(framelist, VISIR_CALIB_QEFF_SPC);
00212
00213
00214 spc_cal_lines = irplib_frameset_find_file(framelist, VISIR_CALIB_LINES_SPC);
00215
00216
00217 badpix = irplib_frameset_find_file(framelist, VISIR_CALIB_BPM);
00218
00219
00220 flat = irplib_frameset_find_file(framelist, VISIR_CALIB_FLAT);
00221
00222
00223 resol = visir_spc_get_res_wl(rawframes, &wlen, &slitw, &temp, &fwhm);
00224
00225 skip_if (0);
00226
00227 if (resol != VISIR_SPC_R_GHR) {
00228 if (visir_spc_obs_ech_config.orderoffset == 0) {
00229 cpl_msg_warning(cpl_func,"Reducing non-HR Grism data as main order");
00230 } else {
00231 cpl_msg_error(cpl_func, "This recipe cannot reduce non-HR Grism "
00232 "data with an order-offset of %d",
00233 visir_spc_obs_ech_config.orderoffset);
00234 visir_error_set(CPL_ERROR_TYPE_MISMATCH);
00235 skip_if(1);
00236 }
00237 }
00238
00239
00240 combinedpair = visir_img_recombine(RECIPE_STRING, parlist, rawframes, badpix,
00241 flat, CPL_GEOM_FIRST, &drop_wcs,
00242 !do_fixcombi, wlen, resol);
00243
00244 if (combinedpair == NULL) {
00245 cpl_msg_error(cpl_func, "Could not combine the input frames");
00246 skip_if (1);
00247 }
00248
00249 cpl_image_delete(combinedpair[1]);
00250 combined = cpl_image_cast(combinedpair[0], CPL_TYPE_DOUBLE);
00251 cpl_image_delete(combinedpair[0]);
00252 cpl_free(combinedpair);
00253
00254 skip_if (0);
00255
00256 skip_if (do_fixcombi && visir_spc_det_fix(&combined, 1, CPL_TRUE,
00257 wlen, resol,
00258 visir_spc_obs_ech_config.phi,
00259 visir_spc_obs_ech_config.ksi,
00260 visir_spc_obs_ech_config.eps,
00261 visir_spc_obs_ech_config.delta,
00262 visir_spc_obs_ech_config.plot));
00263
00264
00265 hcycle = visir_load_hcycle(rawframes, 0);
00266 skip_if (0);
00267
00268 imhcycle = cpl_imagelist_get(hcycle, 0);
00269
00270 skip_if (visir_spc_det_fix(&imhcycle, 1, CPL_FALSE,
00271 wlen, resol,
00272 visir_spc_obs_ech_config.phi,
00273 visir_spc_obs_ech_config.ksi,
00274 visir_spc_obs_ech_config.eps,
00275 visir_spc_obs_ech_config.delta,
00276 visir_spc_obs_ech_config.plot));
00277
00278 skip_if (visir_spc_echelle_limit(&icol1, &icol2, wlen,
00279 visir_spc_obs_ech_config.orderoffset,
00280 1, cpl_image_get_size_y(combined)));
00281
00282 skip_if (visir_qc_append_background(qclist, rawframes, icol1, icol2));
00283
00284 if (jcol1 != 0) {
00285 cpl_msg_info(cpl_func, "Ignoring %d leftmost columns from %d to %d",
00286 jcol1, icol1, icol1 + jcol1);
00287 icol1 += jcol1;
00288 }
00289 if (jcol2 != 0) {
00290 cpl_msg_info(cpl_func, "Ignoring %d rightmost columns from %d to %d",
00291 jcol2, icol2 - jcol2, icol2);
00292 icol2 -= jcol2;
00293 }
00294
00295 if (icol1 != 1 || icol2 != cpl_image_get_size_x(imhcycle)) {
00296
00297 order = visir_spc_column_extract(imhcycle, icol1, icol2,
00298 visir_spc_obs_ech_config.plot);
00299 skip_if (0);
00300
00301 comorder = visir_spc_column_extract(combined, icol1, icol2,
00302 visir_spc_obs_ech_config.plot);
00303 skip_if (0);
00304
00305 } else {
00306
00307 order = imhcycle;
00308 comorder = combined;
00309 }
00310
00311 skip_if (visir_spc_extract_wcal(comorder, order, wlen, slitw, temp, fwhm,
00312 resol, visir_spc_obs_ech_config.orderoffset,
00313 spc_cal_lines, spc_cal_qeff,
00314 &spc_table, &weight2d, qclist,
00315 visir_spc_obs_ech_config.plot));
00316
00317
00318 skip_if (cpl_table_erase_column(spc_table, "SPC_EMISSIVITY"));
00319
00320 bug_if (visir_spectro_qc(qclist, paflist, drop_wcs, rawframes, NULL,
00321 "^(" VISIR_PFITS_REGEXP_SPC_WCAL_PAF ")$"));
00322 irplib_framelist_empty(rawframes);
00323
00324
00325 cpl_msg_info(cpl_func, "Saving the produced spectrum");
00326
00327
00328 bug_if (cpl_propertylist_append_string(paflist, CPL_DFS_PRO_CATG,
00329 VISIR_SPC_OBS_ECH_COMBINED_PROCATG));
00330
00331 skip_if (visir_spc_obs_ech_save(framelist, parlist, qclist, paflist,
00332 combined, weight2d, spc_table));
00333
00334 end_skip;
00335
00336 cpl_propertylist_delete(qclist);
00337 cpl_propertylist_delete(paflist);
00338 irplib_framelist_delete(allframes);
00339 irplib_framelist_delete(rawframes);
00340 cpl_image_delete(combined);
00341 if (comorder != combined) cpl_image_delete(comorder);
00342 cpl_table_delete(spc_table);
00343 cpl_image_delete(weight2d);
00344 cpl_imagelist_delete(hcycle);
00345 if (order != imhcycle) cpl_image_delete(order);
00346
00347 return cpl_error_get_code();
00348 }
00349
00350
00362
00363 static cpl_error_code visir_spc_obs_ech_save(cpl_frameset * set,
00364 const cpl_parameterlist * parlist,
00365 const cpl_propertylist * qclist,
00366 const cpl_propertylist * paflist,
00367 const cpl_image * combined,
00368 const cpl_image * weight2d,
00369 const cpl_table * table)
00370 {
00371
00372 bug_if (0);
00373
00374
00375 skip_if (irplib_dfs_save_table(set, parlist, set, table, NULL, RECIPE_STRING,
00376 VISIR_SPC_OBS_ECH_TAB_PROCATG,
00377 qclist, NULL, visir_pipe_id,
00378 RECIPE_STRING "_spectrum_tab" CPL_DFS_FITS));
00379
00380
00381 skip_if (irplib_dfs_save_image(set, parlist, set, combined, CPL_BPP_IEEE_FLOAT,
00382 RECIPE_STRING, VISIR_SPC_OBS_ECH_COMBINED_PROCATG,
00383 qclist, NULL, visir_pipe_id,
00384 RECIPE_STRING CPL_DFS_FITS));
00385
00386
00387 skip_if (irplib_dfs_save_image(set, parlist, set, weight2d, CPL_BPP_IEEE_FLOAT,
00388 RECIPE_STRING, VISIR_SPC_OBS_ECH_WEIGHT_PROCATG,
00389 qclist, NULL, visir_pipe_id,
00390 RECIPE_STRING "_weight" CPL_DFS_FITS));
00391
00392 #ifdef VISIR_SAVE_PAF
00393
00394 skip_if (cpl_dfs_save_paf("VISIR", RECIPE_STRING, paflist,
00395 RECIPE_STRING CPL_DFS_PAF));
00396 #else
00397 bug_if(paflist == NULL);
00398 #endif
00399
00400 end_skip;
00401
00402 return cpl_error_get_code();
00403
00404 }