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