32#include "eris_ifu_efficiency_response.h"
33#include "eris_ifu_dfs.h"
34#define LICENCE_INFO "This file is part of the ERIS Instrument Pipeline \n\
35 Copyright (C) 2017 European Southern Observatory \n\
37 This program is free software; you can redistribute it and/or modify \n\
38 it under the terms of the GNU General Public License as published by \n\
39 the Free Software Foundation; either version 2 of the License, or\n\
40 (at your option) any later version.\n\
42 This program is distributed in the hope that it will be useful,\n\
43 but WITHOUT ANY WARRANTY; without even the implied warranty of\n\
44 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n\
45 GNU General Public License for more details.\n\
47 You should have received a copy of the GNU General Public License\n\
48 along with this program; if not, write to the Free Software\n\
49 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, \n\
55#define KEY_NAME_FILT_NAME "ESO INS3 SPGW ID"
70#define RECIPE_NAME "eris_ifu_response"
71static const char eris_ifu_response_description[] =
72 "This recipe computes the response.\n"
73 "The input files are 1D extracted spectrum and static files\n"
74 "their associated tags are: \n"
75 "SPECTRUM1D, 1D spectrum of a flux STD star (not flatfielded)\n"
76 "FLUX_STD_CATALOG, the catalog of flux std stars \n"
77 "EXTCOEFF_TABLE, The Atmospheric Extinction correction table\n"
78 "EFFICIENCY_WINDOWS, the regions used to compute QC on response\n"
79 "The output is the response spectrum, PRO.CATG: EFFICIENCY\n"
81cpl_recipe_define( eris_ifu_response,
87 eris_ifu_response_description);
100static cpl_error_code eris_ifu_response_fill_parameterlist(
101 cpl_parameterlist * self) {
103 cpl_parameter * par ;
106 par = cpl_parameter_new_value(RECIPE_NAME
".der-snr-half-window", CPL_TYPE_INT,
107 "Half window used for noise calculation following the DER-SNR approach."
108 "\nA good value is 2.5 x the resolving power of a spectral line.",
110 cpl_parameter_set_alias(par, CPL_PARAMETER_MODE_CLI,
"der-snr-half-window");
111 cpl_parameter_disable(par, CPL_PARAMETER_MODE_ENV);
112 cpl_parameterlist_append(self, par);
115 par = cpl_parameter_new_value(RECIPE_NAME
".sampling-period", CPL_TYPE_DOUBLE,
116 "Conversion factor to put the wavelength in [nm]", RECIPE_NAME, 1.0);
117 cpl_parameter_set_alias(par, CPL_PARAMETER_MODE_CLI,
"sampling-period");
118 cpl_parameter_disable(par, CPL_PARAMETER_MODE_ENV);
119 cpl_parameterlist_append(self, par);
123 par = cpl_parameter_new_value(RECIPE_NAME
".telluric-xcorr-step",
124 CPL_TYPE_DOUBLE,
"Cross correlation step", RECIPE_NAME,
126 cpl_parameter_set_alias(par, CPL_PARAMETER_MODE_CLI,
"telluric-xcorr-step");
127 cpl_parameter_disable(par, CPL_PARAMETER_MODE_ENV);
128 cpl_parameterlist_append(self, par);
130 par = cpl_parameter_new_value(RECIPE_NAME
".telluric-xcorr-half-window",
131 CPL_TYPE_INT,
"Search window for telluric-xcorr", RECIPE_NAME,
133 cpl_parameter_set_alias(par, CPL_PARAMETER_MODE_CLI,
"telluric-xcorr-half-window");
134 cpl_parameter_disable(par, CPL_PARAMETER_MODE_ENV);
135 cpl_parameterlist_append(self, par);
138 par = cpl_parameter_new_value(RECIPE_NAME
".telluric-xcorr-normalize",
139 CPL_TYPE_BOOL,
"Normalize telluric-xcorr", RECIPE_NAME,
141 cpl_parameter_set_alias(par, CPL_PARAMETER_MODE_CLI,
"telluric-xcorr-normalize");
142 cpl_parameter_disable(par, CPL_PARAMETER_MODE_ENV);
143 cpl_parameterlist_append(self, par);
146 par = cpl_parameter_new_value(RECIPE_NAME
".telluric-xcorr-l-min",
147 CPL_TYPE_DOUBLE,
"Cross correlation lmin", RECIPE_NAME,
149 cpl_parameter_set_alias(par, CPL_PARAMETER_MODE_CLI,
"telluric-xcorr-l-min");
150 cpl_parameter_disable(par, CPL_PARAMETER_MODE_ENV);
151 cpl_parameterlist_append(self, par);
153 par = cpl_parameter_new_value(RECIPE_NAME
".telluric-xcorr-l-max",
154 CPL_TYPE_DOUBLE,
"Cross correlation lmax", RECIPE_NAME,
156 cpl_parameter_set_alias(par, CPL_PARAMETER_MODE_CLI,
"telluric-xcorr-l-max");
157 cpl_parameter_disable(par, CPL_PARAMETER_MODE_ENV);
158 cpl_parameterlist_append(self, par);
161 par = cpl_parameter_new_value(RECIPE_NAME
".velocity-wguess",
163 "Velocity Calculation: reference line wavelength position",
165 cpl_parameter_set_alias(par, CPL_PARAMETER_MODE_CLI,
"velocity-wguess");
166 cpl_parameter_disable(par, CPL_PARAMETER_MODE_ENV);
167 cpl_parameterlist_append(self, par);
169 par = cpl_parameter_new_value(RECIPE_NAME
".velocity-enable",
171 "Velocity Calculation: enable",
172 RECIPE_NAME, CPL_FALSE);
173 cpl_parameter_set_alias(par, CPL_PARAMETER_MODE_CLI,
"velocity-enable");
174 cpl_parameter_disable(par, CPL_PARAMETER_MODE_ENV);
175 cpl_parameterlist_append(self, par);
177 par = cpl_parameter_new_value(RECIPE_NAME
".velocity-range-wmin",
179 "Velocity Calculation: minimum of wavelength box for line fit ",
181 cpl_parameter_set_alias(par, CPL_PARAMETER_MODE_CLI,
"velocity-range-wmin");
182 cpl_parameter_disable(par, CPL_PARAMETER_MODE_ENV);
183 cpl_parameterlist_append(self, par);
185 par = cpl_parameter_new_value(RECIPE_NAME
".velocity-range-wmax",
187 "Velocity Calculation: maximum of wavelength box for line fit ",
189 cpl_parameter_set_alias(par, CPL_PARAMETER_MODE_CLI,
"velocity-range-wmax");
190 cpl_parameter_disable(par, CPL_PARAMETER_MODE_ENV);
191 cpl_parameterlist_append(self, par);
193 par = cpl_parameter_new_value(RECIPE_NAME
".velocity-fit-wmin",
195 "Velocity Calculation: minimum wavelength value used to fit line slope",
197 cpl_parameter_set_alias(par, CPL_PARAMETER_MODE_CLI,
"velocity-fit-wmin");
198 cpl_parameter_disable(par, CPL_PARAMETER_MODE_ENV);
199 cpl_parameterlist_append(self, par);
201 par = cpl_parameter_new_value(RECIPE_NAME
".velocity-fit-wmax",
203 "Velocity Calculation: maximum wavelength value used to fit line slope",
205 cpl_parameter_set_alias(par, CPL_PARAMETER_MODE_CLI,
"velocity-fit-wmax");
206 cpl_parameter_disable(par, CPL_PARAMETER_MODE_ENV);
207 cpl_parameterlist_append(self, par);
209 par = cpl_parameter_new_value(RECIPE_NAME
".velocity-fit-half-win",
211 "Velocity Calculation: half box where polynomial fit is performed",
213 cpl_parameter_set_alias(par, CPL_PARAMETER_MODE_CLI,
"velocity-fit-half-win");
214 cpl_parameter_disable(par, CPL_PARAMETER_MODE_ENV);
215 cpl_parameterlist_append(self, par);
217 par = cpl_parameter_new_value(RECIPE_NAME
".response-wrange-median-final-interpolation",
219 "Response calculation: wavelength range to be taken around an interpolation point",
221 cpl_parameter_set_alias(par, CPL_PARAMETER_MODE_CLI,
"response-wrange-median-final-interpolation");
222 cpl_parameter_disable(par, CPL_PARAMETER_MODE_ENV);
223 cpl_parameterlist_append(self, par);
226 par = cpl_parameter_new_value(RECIPE_NAME
".response-exposure-time", CPL_TYPE_DOUBLE,
227 "Exposure time in [s]", RECIPE_NAME, 0.0);
228 cpl_parameter_set_alias(par, CPL_PARAMETER_MODE_CLI,
"response-exposure-time");
229 cpl_parameter_disable(par, CPL_PARAMETER_MODE_ENV);
230 cpl_parameterlist_append(self, par);
232 par = cpl_parameter_new_value(RECIPE_NAME
".response-exposure-time-error",
233 CPL_TYPE_DOUBLE,
"Exposure time error in [s]", RECIPE_NAME, 0.0);
234 cpl_parameter_set_alias(par, CPL_PARAMETER_MODE_CLI,
"response-exposure-time-error");
235 cpl_parameter_disable(par, CPL_PARAMETER_MODE_ENV);
236 cpl_parameterlist_append(self, par);
240 par = cpl_parameter_new_value(RECIPE_NAME
".response-airmass", CPL_TYPE_DOUBLE,
241 "Airmass at which the standard star was observed", RECIPE_NAME, 1.0);
242 cpl_parameter_set_alias(par, CPL_PARAMETER_MODE_CLI,
"response-airmass");
243 cpl_parameter_disable(par, CPL_PARAMETER_MODE_ENV);
244 cpl_parameterlist_append(self, par);
246 par = cpl_parameter_new_value(RECIPE_NAME
".response-airmass-error", CPL_TYPE_DOUBLE,
247 "Error on the airmass at which the standard star was observed",
249 cpl_parameter_set_alias(par, CPL_PARAMETER_MODE_CLI,
"response-airmass-error");
250 cpl_parameter_disable(par, CPL_PARAMETER_MODE_ENV);
251 cpl_parameterlist_append(self, par);
255 par = cpl_parameter_new_value(RECIPE_NAME
".response-airmass-correction",
256 CPL_TYPE_DOUBLE,
"Parameter to indicate if the response is "
257 "computed at arimass=0, or at a given non-zero value",
259 cpl_parameter_set_alias(par, CPL_PARAMETER_MODE_CLI,
"response-airmass-correction");
260 cpl_parameter_disable(par, CPL_PARAMETER_MODE_ENV);
261 cpl_parameterlist_append(self, par);
263 par = cpl_parameter_new_value(RECIPE_NAME
".response-airmass-correction-error",
264 CPL_TYPE_DOUBLE,
"Error on the airmass-correction parameter",
266 cpl_parameter_set_alias(par, CPL_PARAMETER_MODE_CLI,
267 "response-airmass-correction-error");
268 cpl_parameter_disable(par, CPL_PARAMETER_MODE_ENV);
269 cpl_parameterlist_append(self, par);
273 par = cpl_parameter_new_value(RECIPE_NAME
".response-gain", CPL_TYPE_DOUBLE,
274 "Detector gain in [e/ADU]", RECIPE_NAME, 1.0);
275 cpl_parameter_set_alias(par, CPL_PARAMETER_MODE_CLI,
"response-gain");
276 cpl_parameter_disable(par, CPL_PARAMETER_MODE_ENV);
277 cpl_parameterlist_append(self, par);
279 par = cpl_parameter_new_value(RECIPE_NAME
".response-gain-error",
280 CPL_TYPE_DOUBLE,
"Error on the detector gain in [e/ADU]",
282 cpl_parameter_set_alias(par, CPL_PARAMETER_MODE_CLI,
"response-gain-error");
283 cpl_parameter_disable(par, CPL_PARAMETER_MODE_ENV);
284 cpl_parameterlist_append(self, par);
289 par = cpl_parameter_new_value(RECIPE_NAME
".flux-scaling-factor",
290 CPL_TYPE_DOUBLE,
"Factor to convert the observed flux from "
291 "actual bin size to Angstrom units", RECIPE_NAME, 1.0);
292 cpl_parameter_set_alias(par, CPL_PARAMETER_MODE_CLI,
"flux-scaling-factor");
293 cpl_parameter_disable(par, CPL_PARAMETER_MODE_ENV);
294 cpl_parameterlist_append(self, par);
297 return CPL_ERROR_NONE;
300#define ERIS_STD_STAR_SPECTRUM "STD_STAR_SPECTRUM"
301#define ERIS_EXTCOEFF_TABLE "EXTCOEFF_TABLE"
302#define ERIS_FLUX_STD_CATALOG "FLUX_STD_CATALOG"
311static int eris_ifu_response(
312 cpl_frameset * frameset,
313 const cpl_parameterlist * parlist)
316 cpl_ensure(frameset != NULL, CPL_ERROR_NULL_INPUT, -1);
317 cpl_ensure(parlist != NULL, CPL_ERROR_NULL_INPUT, -1);
319 cpl_size fsize = cpl_frameset_get_size(frameset);
320 cpl_frame* frm_sci = NULL;
321 cpl_frame* extcoeff_frame = NULL;
322 cpl_frame * spectrum_frame = NULL;
323 cpl_frame * fluxstdcat_frame = NULL;
324 cpl_propertylist* plist = NULL;
325 for(cpl_size i = 0; i < fsize; ++i){
326 cpl_frame * cur_frame = cpl_frameset_get_position(frameset, i);
328 if (!strcmp(cpl_frame_get_tag(cur_frame), ERIS_STD_STAR_SPECTRUM)) {
329 spectrum_frame = cpl_frame_duplicate(cur_frame);
330 cpl_msg_info(cpl_func,
"Observed spectrum found in the SOF");
331 }
else if (!strcmp(cpl_frame_get_tag(cur_frame), ERIS_EXTCOEFF_TABLE)) {
332 extcoeff_frame = cpl_frame_duplicate(cur_frame);
333 cpl_msg_info(cpl_func,
"Atm Extinction found in SOF");
334 }
else if (!strcmp(cpl_frame_get_tag(cur_frame), ERIS_FLUX_STD_CATALOG)) {
335 fluxstdcat_frame = cpl_frame_duplicate(cur_frame);
336 cpl_msg_info(cpl_func,
"Std star catalog found in SOF");
341 const char* fname = cpl_frame_get_filename(spectrum_frame);
342 plist = cpl_propertylist_load(fname, 0);
343 cpl_vector* v = cpl_vector_load(fname, 0);
345 cpl_size sz = cpl_vector_get_size(v);
346 cpl_table* t = cpl_table_new(sz);
347 double crpix1 = cpl_propertylist_get_double(plist,
"CRPIX1");
348 double crval1 = cpl_propertylist_get_double(plist,
"CRVAL1");
349 double cdelt1 = cpl_propertylist_get_double(plist,
"CDELT1");
350 double* wave = cpl_calloc(sz,
sizeof(
double));
351 for(cpl_size i = 0; i < sz; i++) {
352 wave[i] = crval1 + i * cdelt1;
354 cpl_table_wrap_double(t, wave,
"WAVE");
355 cpl_table_wrap_double(t, cpl_vector_get_data(v),
"FLUX");
356 cpl_table_save(t, plist, NULL,
"sci_tab.fits", CPL_IO_CREATE);
357 cpl_vector_delete(v);
358 cpl_frameset_erase(frameset, ERIS_STD_STAR_SPECTRUM);
360 frm_sci = cpl_frame_duplicate(spectrum_frame);
361 cpl_frame_set_filename(frm_sci,
"sci_tab.fits");
362 cpl_frameset_insert(frameset, frm_sci);
365 const char* plugin_id = RECIPE_NAME;
367 eris_response_compute(plugin_id, parlist, frameset, frameset);
369 cpl_propertylist_delete(plist);
373 return cpl_error_get_code() ? (int)cpl_error_set_where(cpl_func) : 0;
cpl_error_code eris_ifu_dfs_set_groups(cpl_frameset *self)
Set the frame group (RAW, CALIB, or PRODUCT) for all frames in a frameset.