36 #include "visir_recipe.h"
37 #include "visir_spectro.h"
38 #include "visir_spc_distortion.h"
44 #define RECIPE_STRING "visir_old_spc_wcal_ech"
49 static cpl_error_code visir_spc_wcal_ech_save(cpl_frameset *,
50 const cpl_parameterlist *,
51 const cpl_propertylist *,
52 const cpl_propertylist *,
55 VISIR_RECIPE_DEFINE(visir_old_spc_wcal_ech,
56 VISIR_PARAM_ZERODIST | VISIR_PARAM_ORDEROFF |
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 in Echelle",
63 "This recipe estimates the dispersion relation using the "
64 "atmospheric spectrum\n"
65 "in a grism spectroscopy half-cycle frame.\n"
66 "The files listed in the Set Of Frames (sof-file) "
68 "VISIR-Echelle-Spectroscopy-file.fits "
69 VISIR_SPC_WCAL_ECH_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);
91 } visir_spc_wcal_ech_config;
112 static int visir_old_spc_wcal_ech(cpl_frameset * framelist,
113 const cpl_parameterlist * parlist)
115 irplib_framelist * allframes = NULL;
116 irplib_framelist * rawframes = NULL;
117 cpl_propertylist * qclist = cpl_propertylist_new();
118 cpl_propertylist * paflist = cpl_propertylist_new();
119 const char * spc_cal_qeff;
120 const char * spc_cal_lines;
121 cpl_imagelist * hcycle = NULL;
122 cpl_image * imhcycle = NULL;
123 cpl_image * flipped = NULL;
124 cpl_table * spc_table = NULL;
125 cpl_image * order = NULL;
126 double wlen, slitw, temp, fwhm;
129 visir_spc_resol resol;
132 visir_spc_wcal_ech_config.auto_bpm =
134 visir_spc_wcal_ech_config.plot =
137 visir_spc_wcal_ech_config.phi =
139 visir_spc_wcal_ech_config.ksi =
141 visir_spc_wcal_ech_config.eps =
143 visir_spc_wcal_ech_config.delta =
146 visir_spc_wcal_ech_config.orderoffset =
150 VISIR_PARAM_REJLEFT);
152 VISIR_PARAM_REJRIGHT);
161 skip_if(allframes == NULL);
163 skip_if (rawframes == NULL);
178 resol = visir_spc_get_res_wl(rawframes, &wlen, &slitw, &temp, &fwhm, 0);
182 if (resol != VISIR_SPC_R_GHR) {
183 if (visir_spc_wcal_ech_config.orderoffset == 0) {
184 cpl_msg_warning(cpl_func,
"Reducing non-HR Grism data as main order");
186 cpl_msg_error(cpl_func,
"This recipe cannot reduce non-HR Grism "
187 "data with an order-offset of %d",
188 visir_spc_wcal_ech_config.orderoffset);
189 visir_error_set(CPL_ERROR_TYPE_MISMATCH);
198 imhcycle = cpl_imagelist_unset(hcycle, 0);
202 flipped = visir_spc_flip(imhcycle, wlen, resol, VISIR_DATA_CUBE2);
204 cpl_image_delete(imhcycle);
208 skip_if (visir_spc_det_fix(&imhcycle, 1, CPL_FALSE,
210 visir_spc_wcal_ech_config.phi,
211 visir_spc_wcal_ech_config.ksi,
212 visir_spc_wcal_ech_config.eps,
213 visir_spc_wcal_ech_config.delta,
214 visir_spc_wcal_ech_config.plot));
216 skip_if (visir_spc_echelle_limit(&icol1, &icol2, wlen,
217 visir_spc_wcal_ech_config.orderoffset, 1,
218 cpl_image_get_size_y(imhcycle), 0));
220 skip_if(visir_qc_append_background(qclist, rawframes, icol1, icol2));
223 cpl_msg_info(cpl_func,
"Ignoring %d leftmost columns from %d to %d",
224 jcol1, icol1, icol1 + jcol1);
228 cpl_msg_info(cpl_func,
"Ignoring %d rightmost columns from %d to %d",
229 jcol2, icol2 - jcol2, icol2);
233 if (icol1 != 1 || icol2 != cpl_image_get_size_x(imhcycle)) {
235 order = visir_spc_column_extract(imhcycle, icol1, icol2,
236 visir_spc_wcal_ech_config.plot);
243 skip_if (visir_spc_wavecal(order, qclist, wlen, slitw, temp, fwhm, resol,
244 visir_spc_wcal_ech_config.orderoffset,
245 spc_cal_lines, spc_cal_qeff,
246 &spc_table, visir_spc_wcal_ech_config.plot, 0));
249 skip_if (cpl_table_erase_column(spc_table,
"SPC_EMISSIVITY"));
251 bug_if (visir_spectro_qc(qclist, paflist, CPL_FALSE, rawframes, NULL,
252 "^(" VISIR_PFITS_REGEXP_SPC_WCAL_PAF
")$"));
256 cpl_msg_info(cpl_func,
"Saving the produced spectrum");
259 bug_if (cpl_propertylist_append_string(paflist, CPL_DFS_PRO_CATG,
260 VISIR_SPC_WCAL_ECH_TAB_PROCATG));
262 skip_if (visir_spc_wcal_ech_save(framelist, parlist, qclist, paflist,
267 cpl_propertylist_delete(qclist);
268 cpl_propertylist_delete(paflist);
271 cpl_table_delete(spc_table);
272 if (order != imhcycle) cpl_image_delete(order);
273 cpl_imagelist_delete(hcycle);
274 cpl_image_delete(imhcycle);
275 cpl_image_delete(flipped);
277 return cpl_error_get_code();
291 static cpl_error_code visir_spc_wcal_ech_save(cpl_frameset * set,
292 const cpl_parameterlist * parlist,
293 const cpl_propertylist * qclist,
294 const cpl_propertylist * paflist,
295 const cpl_table * table)
301 VISIR_SPC_WCAL_ECH_TAB_PROCATG,
302 qclist, NULL, visir_pipe_id,
303 RECIPE_STRING
"_spectrum_tab" CPL_DFS_FITS));
305 #ifdef VISIR_SAVE_PAF
307 skip_if (cpl_dfs_save_paf(
"VISIR", RECIPE_STRING, paflist,
308 RECIPE_STRING CPL_DFS_PAF));
310 bug_if(paflist == NULL);
315 return cpl_error_get_code();
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_error_code visir_dfs_check_framelist_tag(const irplib_framelist *self)
Check the tags in a frameset (group raw only)
cpl_error_code irplib_dfs_save_table(cpl_frameset *allframes, const cpl_parameterlist *parlist, const cpl_frameset *usedframes, const cpl_table *table, const cpl_propertylist *tablelist, const char *recipe, const char *procat, const cpl_propertylist *applist, const char *remregexp, const char *pipe_id, const char *filename)
Save a table as a DFS-compliant pipeline product.
int visir_parameterlist_get_int(const cpl_parameterlist *self, const char *recipe, visir_parameter bitmask)
Retrieve the value of a VISIR integer parameter.
cpl_boolean visir_parameterlist_get_bool(const cpl_parameterlist *self, const char *recipe, visir_parameter bitmask)
Retrieve the value of a VISIR boolean parameter.
void irplib_framelist_empty(irplib_framelist *self)
Erase all frames from a framelist.
cpl_error_code irplib_framelist_load_propertylist_all(irplib_framelist *self, int ind, const char *regexp, cpl_boolean invert)
Load the propertylists of all frames in the framelist.
irplib_framelist * irplib_framelist_extract(const irplib_framelist *self, const char *tag)
Extract the frames with the given tag from a framelist.
int visir_dfs_set_groups(cpl_frameset *set)
Set the group as RAW or CALIB in a frameset.
void irplib_framelist_delete(irplib_framelist *self)
Deallocate an irplib_framelist with its frames and properties.
const char * irplib_frameset_find_file(const cpl_frameset *self, const char *tag)
Find the filename with the given tag in a frame set.
irplib_framelist * irplib_framelist_cast(const cpl_frameset *frameset)
Create an irplib_framelist from a cpl_framelist.