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
00037 #include "visir_recipe.h"
00038 #include "visir_spectro.h"
00039 #include "visir_spc_distortion.h"
00040 #include "visir_spc_photom.h"
00041
00042
00043
00044
00045
00046 #define RECIPE_STRING "visir_old_spc_phot_ech"
00047
00048
00049 #define RECIPE_KEYS_REGEXP_ALL \
00050 VISIR_PFITS_REGEXP_IMG_RECOMBINE \
00051 "|" VISIR_PFITS_REGEXP_SPC_GET_RES_WL \
00052 "|" VISIR_PFITS_REGEXP_SPC_SENSIT
00053
00054
00055 #define RECIPE_KEYS_REGEXP \
00056 RECIPE_KEYS_REGEXP_ALL \
00057 "|" VISIR_PFITS_SPC_PHOT_COPY \
00058 "|" VISIR_PFITS_REGEXP_CAPA \
00059 "|" VISIR_PFITS_REGEXP_SPC_PHOT_PAF
00060
00061
00062 #define RECIPE_KEYS_REGEXP_WCS \
00063 RECIPE_KEYS_REGEXP \
00064 "|" IRPLIB_PFITS_WCS_REGEXP
00065
00066
00067
00068
00069
00070 static cpl_error_code visir_spc_phot_ech_save(cpl_frameset *,
00071 const cpl_parameterlist *,
00072 const cpl_propertylist *,
00073 const cpl_propertylist *,
00074 const cpl_image *,
00075 const cpl_image *,
00076 const cpl_table *);
00077
00078 VISIR_RECIPE_DEFINE(visir_old_spc_phot_ech,
00079 VISIR_PARAM_EMIS_TOL |
00080 VISIR_PARAM_ZERODIST | VISIR_PARAM_ORDEROFF |
00081 VISIR_PARAM_REFINE | VISIR_PARAM_XCORR |
00082 VISIR_PARAM_OFFSETS | VISIR_PARAM_OBJECTS |
00083 VISIR_PARAM_NODPOS | VISIR_PARAM_AUTOBPM |
00084 VISIR_PARAM_GLITCH | VISIR_PARAM_PURGE |
00085 VISIR_PARAM_UNION | VISIR_PARAM_REJECT |
00086 VISIR_PARAM_STRIPITE | VISIR_PARAM_STRIPMOR |
00087 VISIR_PARAM_PLOT | VISIR_PARAM_SLITSKEW |
00088 VISIR_PARAM_SPECSKEW | VISIR_PARAM_VERTARC |
00089 VISIR_PARAM_REJLEFT | VISIR_PARAM_REJRIGHT |
00090 VISIR_PARAM_HORIARC | VISIR_PARAM_FIXCOMBI,
00091 "Old DRS detector: Sensitivity computation in echelle spectroscopy",
00092 "This recipe estimates the dispersion relation using the "
00093 "atmospheric spectrum\n"
00094 "in a echelle spectroscopy half-cycle frame.\n"
00095 "It also extracts the spectrum of an observed object "
00096 "using a combined frame.\n"
00097 "Lastly, it computes the spectral photometry of an "
00098 "observed standard star.\n"
00099 "The files listed in the Set Of Frames (sof-file) "
00100 "must be tagged:\n"
00101 "VISIR-Echelle-Spectroscopy-file.fits "
00102 VISIR_SPC_PHOT_ECH_RAW "\n"
00103 "VISIR-Quantum-Efficiency-Calibration-file.fits "
00104 VISIR_CALIB_QEFF_SPC "\n"
00105 "VISIR-Atmospheric-Emission-Lines-Calibration-file.fits "
00106 VISIR_CALIB_LINES_SPC
00107 "\n"
00108 "VISIR-Spectroscopic-Standard-Star-Catalog.fits "
00109 VISIR_CALIB_STDSTAR_SPC "\n"
00110 MAN_VISIR_CALIB_BPM_SPC);
00111
00112
00116
00117
00118
00119
00120
00121
00122
00129
00130 static int visir_old_spc_phot_ech(cpl_frameset * framelist,
00131 const cpl_parameterlist * parlist)
00132 {
00133 irplib_framelist * allframes = NULL;
00134 irplib_framelist * rawframes = NULL;
00135 cpl_propertylist * qclist = cpl_propertylist_new();
00136 cpl_propertylist * paflist = cpl_propertylist_new();
00137 const char * badpix;
00138 const char * star_cat;
00139 const char * spc_cal_qeff;
00140 const char * spc_cal_lines;
00141 const char * flat;
00142 cpl_image ** combinedpair = NULL;
00143 cpl_image * combined = NULL;
00144 cpl_table * tab = NULL;
00145 cpl_image * weight2d = NULL;
00146 double wlen, slitw, temp, fwhm;
00147 visir_spc_resol resol;
00148 visir_spc_config config;
00149 cpl_boolean drop_wcs;
00150 const char * keys_regexp = "^(" RECIPE_KEYS_REGEXP_WCS
00151 "|" VISIR_PFITS_REGEXP_DIT
00152 ")$";
00153 const char * dit_key = VISIR_PFITS_DOUBLE_DIT;
00154
00155 config.recipename = RECIPE_STRING;
00156 config.parlist = parlist;
00157
00158
00159 config.do_fixcombi =
00160 visir_parameterlist_get_bool(parlist, RECIPE_STRING, VISIR_PARAM_FIXCOMBI);
00161
00162 config.plot =
00163 visir_parameterlist_get_int(parlist, RECIPE_STRING, VISIR_PARAM_PLOT);
00164
00165 config.phi =
00166 visir_parameterlist_get_double(parlist, RECIPE_STRING, VISIR_PARAM_SLITSKEW);
00167 config.ksi =
00168 visir_parameterlist_get_double(parlist, RECIPE_STRING, VISIR_PARAM_SPECSKEW);
00169 config.eps =
00170 visir_parameterlist_get_double(parlist, RECIPE_STRING, VISIR_PARAM_VERTARC);
00171 config.delta =
00172 visir_parameterlist_get_double(parlist, RECIPE_STRING, VISIR_PARAM_HORIARC);
00173
00174 config.orderoffset =
00175 visir_parameterlist_get_int(parlist, RECIPE_STRING, VISIR_PARAM_ORDEROFF);
00176
00177 config.phot_emis_tol =
00178 visir_parameterlist_get_double(parlist, RECIPE_STRING, VISIR_PARAM_EMIS_TOL);
00179
00180 skip_if (0);
00181
00182
00183 skip_if (visir_dfs_set_groups(framelist));
00184
00185
00186 allframes = irplib_framelist_cast(framelist);
00187 skip_if(allframes == NULL);
00188 rawframes = irplib_framelist_extract(allframes, VISIR_SPC_PHOT_ECH_RAW);
00189 skip_if (rawframes == NULL);
00190
00191 irplib_framelist_empty(allframes);
00192
00193 skip_if(irplib_framelist_load_propertylist(rawframes, 0, 0, keys_regexp,
00194 CPL_FALSE));
00195
00196 skip_if(irplib_framelist_load_propertylist_all(rawframes, 0, ".*", CPL_FALSE));
00197
00198 skip_if(visir_dfs_check_framelist_tag(rawframes));
00199
00200 if (cpl_propertylist_has(irplib_framelist_get_propertylist(rawframes, 0),
00201 VISIR_PFITS_DOUBLE_SEQ1_DIT))
00202 dit_key = VISIR_PFITS_DOUBLE_SEQ1_DIT;
00203 skip_if(0);
00204
00205
00206 star_cat = irplib_frameset_find_file(framelist, VISIR_CALIB_STDSTAR_SPC);
00207 if (star_cat == NULL) {
00208 cpl_msg_error(cpl_func, "The file with the star catalog is missing");
00209 skip_if(1);
00210 }
00211
00212
00213 spc_cal_qeff = irplib_frameset_find_file(framelist, VISIR_CALIB_QEFF_SPC);
00214
00215
00216 spc_cal_lines = irplib_frameset_find_file(framelist, VISIR_CALIB_LINES_SPC);
00217
00218
00219 badpix = irplib_frameset_find_file(framelist, VISIR_CALIB_BPM);
00220
00221
00222 flat = irplib_frameset_find_file(framelist, VISIR_CALIB_FLAT);
00223
00224
00225 resol = visir_spc_get_res_wl(rawframes, &wlen, &slitw, &temp, &fwhm, 0);
00226
00227 skip_if (0);
00228
00229 if (resol != VISIR_SPC_R_GHR) {
00230 if (config.orderoffset == 0) {
00231 cpl_msg_warning(cpl_func,"Reducing non-HR Grism data as main order");
00232 } else {
00233 cpl_msg_error(cpl_func, "This recipe cannot reduce non-HR Grism "
00234 "data with an order-offset of %d",
00235 config.orderoffset);
00236 visir_error_set(CPL_ERROR_TYPE_MISMATCH);
00237 skip_if(1);
00238 }
00239 }
00240
00241
00242 combinedpair = visir_img_recombine(RECIPE_STRING, parlist, rawframes, badpix,
00243 flat, CPL_GEOM_FIRST, &drop_wcs,
00244 !config.do_fixcombi, wlen, resol);
00245
00246 if (combinedpair == NULL) {
00247 cpl_msg_error(cpl_func, "Could not combine the input frames");
00248 skip_if (1);
00249 }
00250
00251 cpl_image_delete(combinedpair[1]);
00252 combined = cpl_image_cast(combinedpair[0], CPL_TYPE_DOUBLE);
00253 cpl_image_delete(combinedpair[0]);
00254
00255 skip_if (0);
00256
00257
00258 cpl_msg_info(cpl_func, "Compute the sensitivity");
00259 tab = visir_spc_phot_sensit_from_image(&combined, rawframes, &config,
00260 star_cat, spc_cal_lines,
00261 spc_cal_qeff, &weight2d, qclist,
00262 CPL_TRUE, wlen, slitw, temp, fwhm,
00263 resol, dit_key);
00264
00265 if (tab == NULL) {
00266 cpl_msg_error(cpl_func, "Cannot compute sensitivity: '%s' in %s",
00267 cpl_error_get_message(), cpl_error_get_where());
00268 skip_if(1);
00269 }
00270
00271 bug_if (visir_spectro_qc(qclist, paflist, drop_wcs, rawframes,
00272 "^(" VISIR_PFITS_SPC_PHOT_COPY ")$",
00273 "^(" VISIR_PFITS_REGEXP_SPC_PHOT_PAF ")$"));
00274 irplib_framelist_empty(rawframes);
00275
00276
00277 cpl_msg_info(cpl_func, "Save the results");
00278
00279
00280 bug_if (cpl_propertylist_append_string(paflist, CPL_DFS_PRO_CATG,
00281 VISIR_SPC_PHOT_ECH_COMBINED_PROCATG));
00282
00283 skip_if (visir_spc_phot_ech_save(framelist, parlist, qclist, paflist,
00284 combined, weight2d, tab));
00285
00286 end_skip;
00287
00288 cpl_propertylist_delete(qclist);
00289 cpl_propertylist_delete(paflist);
00290 irplib_framelist_delete(allframes);
00291 irplib_framelist_delete(rawframes);
00292 cpl_image_delete(combined);
00293 cpl_table_delete(tab);
00294 cpl_image_delete(weight2d);
00295
00296 cpl_free(combinedpair);
00297
00298 return cpl_error_get_code();
00299 }
00300
00301
00313
00314 static cpl_error_code visir_spc_phot_ech_save(cpl_frameset * set,
00315 const cpl_parameterlist * parlist,
00316 const cpl_propertylist * qclist,
00317 const cpl_propertylist * paflist,
00318 const cpl_image *combined,
00319 const cpl_image *weight2d,
00320 const cpl_table * table)
00321 {
00322 bug_if (0);
00323
00324
00325 skip_if (irplib_dfs_save_table(set, parlist, set, table, NULL, RECIPE_STRING,
00326 VISIR_SPC_PHOT_ECH_TAB_PROCATG,
00327 qclist, NULL, visir_pipe_id,
00328 RECIPE_STRING "_tab" CPL_DFS_FITS));
00329
00330
00331 skip_if (irplib_dfs_save_image(set, parlist, set, combined, CPL_BPP_IEEE_FLOAT,
00332 RECIPE_STRING, VISIR_SPC_PHOT_ECH_COMBINED_PROCATG,
00333 qclist, NULL, visir_pipe_id,
00334 RECIPE_STRING CPL_DFS_FITS));
00335
00336
00337 skip_if (irplib_dfs_save_image(set, parlist, set, weight2d, CPL_BPP_IEEE_FLOAT,
00338 RECIPE_STRING, VISIR_SPC_PHOT_ECH_WEIGHT_PROCATG,
00339 qclist, NULL, visir_pipe_id,
00340 RECIPE_STRING "_weight" CPL_DFS_FITS));
00341
00342 #ifdef VISIR_SAVE_PAF
00343
00344 skip_if (cpl_dfs_save_paf("VISIR", RECIPE_STRING, paflist,
00345 RECIPE_STRING CPL_DFS_PAF));
00346 #else
00347 bug_if(paflist == NULL);
00348 #endif
00349
00350 end_skip;
00351
00352 return cpl_error_get_code();
00353
00354 }