36#include "visir_recipe.h"
37#include "visir_spectro.h"
38#include "visir_spc_distortion.h"
45#define RECIPE_STRING "visir_old_spc_wcal"
50static cpl_error_code visir_spc_wcal_save(cpl_frameset *,
51 const cpl_parameterlist *,
52 const cpl_propertylist *,
53 const cpl_propertylist *,
56VISIR_RECIPE_DEFINE(visir_old_spc_wcal,
58 VISIR_PARAM_PLOT | VISIR_PARAM_SLITSKEW |
59 VISIR_PARAM_SPECSKEW | VISIR_PARAM_VERTARC |
60 VISIR_PARAM_REJLEFT | VISIR_PARAM_REJRIGHT |
62 "Old DRS detector: Spectroscopic wavelength calibration recipe",
63 "This recipe estimates the dispersion relation using the "
64 "atmospheric spectrum\n"
65 "in a long-slit spectroscopy half-cycle frame.\n"
66 "The files listed in the Set Of Frames (sof-file) "
68 "VISIR-Long-Slit-Spectroscopy-file.fits "
69 VISIR_SPC_WCAL_RAW
"\n"
70 "VISIR-Quantum-Efficiency-Calibration-file.fits "
71 VISIR_CALIB_QEFF_SPC
"\n"
72 "VISIR-Atmospheric-Emission-Lines-Calibration-file.fits "
75 MAN_VISIR_CALIB_BPM_SPC);
95static int visir_old_spc_wcal(cpl_frameset * framelist,
96 const cpl_parameterlist * parlist)
98 irplib_framelist * allframes = NULL;
99 irplib_framelist * rawframes = NULL;
100 cpl_propertylist * qclist = cpl_propertylist_new();
101 cpl_propertylist * paflist = cpl_propertylist_new();
102 const char * spc_cal_qeff;
103 const char * spc_cal_lines;
104 cpl_imagelist * hcycle = NULL;
105 cpl_image * imhcycle = NULL;
106 cpl_image * flipped = NULL;
107 cpl_image * imhcyclenarrow = NULL;
108 cpl_table * spc_table = NULL;
109 double wlen, slitw, temp, fwhm;
110 visir_spc_resol resol;
113 visir_spc_config cfg;
117 parlist, RECIPE_STRING, VISIR_PARAM_AUTOBPM);
119 parlist, RECIPE_STRING, VISIR_PARAM_PLOT);
121 parlist, RECIPE_STRING, VISIR_PARAM_SLITSKEW);
123 parlist, RECIPE_STRING, VISIR_PARAM_SPECSKEW);
125 parlist, RECIPE_STRING, VISIR_PARAM_VERTARC);
127 parlist, RECIPE_STRING, VISIR_PARAM_HORIARC);
130 VISIR_PARAM_REJLEFT);
132 VISIR_PARAM_REJRIGHT);
140 allframes = irplib_framelist_cast(framelist);
141 skip_if(allframes == NULL);
142 rawframes = irplib_framelist_extract(allframes, VISIR_SPC_WCAL_RAW);
143 skip_if (rawframes == NULL);
145 irplib_framelist_empty(allframes);
147 skip_if(irplib_framelist_load_propertylist_all(rawframes, 0,
".*", CPL_FALSE));
152 spc_cal_qeff = irplib_frameset_find_file(framelist, VISIR_CALIB_QEFF_SPC);
155 spc_cal_lines = irplib_frameset_find_file(framelist, VISIR_CALIB_LINES_SPC);
158 resol = visir_spc_get_res_wl(rawframes, &wlen, &slitw, &temp, &fwhm, 0);
162 if (resol == VISIR_SPC_R_GHR) {
163 cpl_msg_error(cpl_func,
"This recipe cannot reduce HR Grism data");
164 visir_error_set(CPL_ERROR_TYPE_MISMATCH);
168 skip_if(visir_qc_append_background(qclist, rawframes, 0, 0));
174 imhcycle = cpl_imagelist_unset(hcycle, 0);
177 flipped = visir_spc_flip(imhcycle, wlen, resol, VISIR_DATA_CUBE2, NULL);
179 cpl_image_delete(imhcycle);
183 skip_if (visir_spc_det_fix(&imhcycle, 1, CPL_FALSE, wlen, resol, cfg.phi,
184 cfg.ksi, cfg.eps, cfg.delta, cfg.plot));
187 icol2 = cpl_image_get_size_x(imhcycle);
190 cpl_msg_info(cpl_func,
"Ignoring %d leftmost columns", jcol1);
194 cpl_msg_info(cpl_func,
"Ignoring %d rightmost columns", jcol2);
198 if (jcol1 != 0 || jcol2 != 0) {
199 imhcyclenarrow = visir_spc_column_extract(imhcycle, icol1, icol2,
204 imhcyclenarrow = imhcycle;
207 skip_if (visir_spc_wavecal(imhcyclenarrow, qclist, wlen, slitw, temp, fwhm,
208 resol, &cfg, spc_cal_lines, spc_cal_qeff,
212 skip_if (cpl_table_erase_column(spc_table,
"SPC_EMISSIVITY"));
214 bug_if (visir_spectro_qc(qclist, paflist, CPL_FALSE, rawframes, NULL,
215 "^(" VISIR_PFITS_REGEXP_SPC_WCAL_PAF
")$"));
216 irplib_framelist_empty(rawframes);
219 cpl_msg_info(cpl_func,
"Saving the produced spectrum");
222 bug_if (cpl_propertylist_append_string(paflist, CPL_DFS_PRO_CATG,
223 VISIR_SPC_WCAL_TAB_PROCATG));
225 skip_if (visir_spc_wcal_save(framelist, parlist, qclist, paflist, spc_table));
229 cpl_propertylist_delete(qclist);
230 cpl_propertylist_delete(paflist);
231 irplib_framelist_delete(allframes);
232 irplib_framelist_delete(rawframes);
233 cpl_table_delete(spc_table);
234 cpl_imagelist_delete(hcycle);
235 if (imhcyclenarrow != imhcycle) cpl_image_delete(imhcyclenarrow);
236 cpl_image_delete(imhcycle);
237 cpl_image_delete(flipped);
239 return cpl_error_get_code();
253static cpl_error_code visir_spc_wcal_save(cpl_frameset * set,
254 const cpl_parameterlist * parlist,
255 const cpl_propertylist * qclist,
256 const cpl_propertylist * paflist,
257 const cpl_table * table)
262 skip_if (irplib_dfs_save_table(set, parlist, set, table, NULL, RECIPE_STRING,
263 VISIR_SPC_WCAL_TAB_PROCATG,
264 qclist, NULL, visir_pipe_id,
265 RECIPE_STRING
"_spectrum_tab" CPL_DFS_FITS));
269 skip_if (cpl_dfs_save_paf(
"VISIR", RECIPE_STRING, paflist,
270 RECIPE_STRING CPL_DFS_PAF));
272 bug_if(paflist == NULL);
277 return cpl_error_get_code();
cpl_error_code visir_dfs_check_framelist_tag(const irplib_framelist *self)
Check the tags in a frameset (group raw only)
int visir_dfs_set_groups(cpl_frameset *set)
Set the group as RAW or CALIB in a frameset.
int visir_parameterlist_get_int(const cpl_parameterlist *self, const char *recipe, visir_parameter bitmask)
Retrieve the value of a VISIR integer parameter.
double visir_parameterlist_get_double(const cpl_parameterlist *self, const char *recipe, visir_parameter bitmask)
Retrieve the value of a VISIR parameter of type double.
cpl_boolean visir_parameterlist_get_bool(const cpl_parameterlist *self, const char *recipe, visir_parameter bitmask)
Retrieve the value of a VISIR boolean parameter.