31#include "moo_compute_resp.h"
34#include "moo_badpix.h"
51_moo_response_fit1d(cpl_table *fit_table,
59 cpl_table_get_column_min(fit_table, MOO_COMPUTE_RESP_FIT_WAVE);
61 cpl_table_get_column_max(fit_table, MOO_COMPUTE_RESP_FIT_WAVE);
63 cpl_size fit_table_size =
64 cpl_table_and_selected_int(fit_table, MOO_COMPUTE_RESP_FIT_IS_USED,
66 if (fit_table_size > degree) {
67 int total_rejected = 0;
68 moo_tcheby_polynomial *poly = NULL;
70 cpl_array *seltab = cpl_table_where_selected(fit_table);
73 cpl_table_get_data_double(fit_table, MOO_COMPUTE_RESP_FIT_FLUX);
75 cpl_table_get_data_double(fit_table, MOO_COMPUTE_RESP_FIT_WAVE);
77 cpl_table_get_data_int(fit_table, MOO_COMPUTE_RESP_FIT_IS_USED);
79 cpl_bivector *data = cpl_bivector_new(fit_table_size);
80 cpl_vector *vx = cpl_bivector_get_x(data);
81 cpl_vector *vy = cpl_bivector_get_y(data);
82 for (
int i = 0; i < fit_table_size; i++) {
83 int idx = cpl_array_get_cplsize(seltab, i, NULL);
84 double f = fluxes[idx];
86 cpl_vector_set(vx, i, w);
87 cpl_vector_set(vy, i, f);
91 cpl_size size = fit_table_size;
93 for (
int i = 1; i <= niter; i++) {
94 cpl_msg_info(__func__,
95 "iter %d / %d with %" CPL_SIZE_FORMAT
96 " data (total rejected %d)",
97 i, niter, size, total_rejected);
98 cpl_vector *vdiff = cpl_vector_new(size);
100 for (
int j = 0; j < size; j++) {
101 double x = cpl_vector_get(vx, j);
102 double y = cpl_vector_get(vy, j);
103 double t = moo_tcheby_polynomial_eval(poly, x);
105 cpl_vector_set(vdiff, j, diff);
108 double stdev = cpl_vector_get_stdev(vdiff);
111 for (
int j = 0; j < size; j++) {
112 double diff = cpl_vector_get(vdiff, j);
113 if ((diff >= kappa_lo * stdev) || (diff <= -kappa_up * stdev)) {
114 int idx = cpl_array_get_cplsize(seltab, j, NULL);
119 cpl_vector_delete(vdiff);
121 if (nb_rejected == size || nb_rejected == 0) {
125 (double)(nb_rejected + total_rejected) / (double)fit_table_size;
126 if (frac > max_frac) {
130 total_rejected += nb_rejected;
131 moo_tcheby_polynomial_delete(poly);
132 cpl_array_delete(seltab);
134 cpl_table_select_all(fit_table);
135 size = cpl_table_and_selected_int(fit_table,
136 MOO_COMPUTE_RESP_FIT_IS_USED,
138 seltab = cpl_table_where_selected(fit_table);
139 for (
int j = 0; j < size; j++) {
140 int idx = cpl_array_get_cplsize(seltab, j, NULL);
143 cpl_array_delete(seltab);
144 cpl_table_select_all(fit_table);
145 size = cpl_table_and_selected_int(fit_table,
146 MOO_COMPUTE_RESP_FIT_IS_USED,
148 seltab = cpl_table_where_selected(fit_table);
150 cpl_bivector_delete(data);
151 data = cpl_bivector_new(size);
152 vx = cpl_bivector_get_x(data);
153 vy = cpl_bivector_get_y(data);
154 for (
int j = 0; j < size; j++) {
155 int idx = cpl_array_get_cplsize(seltab, j, NULL);
156 cpl_vector_set(vx, j, wave[idx]);
157 cpl_vector_set(vy, j, fluxes[idx]);
162 cpl_array_delete(seltab);
163 cpl_table_select_all(fit_table);
166 cpl_table_and_selected_int(fit_table, MOO_COMPUTE_RESP_FIT_IS_USED,
168 seltab = cpl_table_where_selected(fit_table);
169 for (
int j = 0; j < size; j++) {
170 int idx = cpl_array_get_cplsize(seltab, j, NULL);
174 int nrow = cpl_table_get_nrow(fit_table);
176 for (
int i = 0; i < nrow; i++) {
177 double w = cpl_table_get_double(fit_table,
178 MOO_COMPUTE_RESP_FIT_WAVE, i, NULL);
179 double fit = moo_tcheby_polynomial_eval(poly, w);
180 cpl_table_set_double(fit_table, MOO_COMPUTE_RESP_FIT_FIT, i, fit);
183 moo_tcheby_polynomial_delete(poly);
184 cpl_bivector_delete(data);
185 cpl_array_delete(seltab);
187 return cpl_error_get_code();
191_get_atm_spline(moo_atm *atm,
double airm)
193 moo_spline *res = NULL;
196 int nrow = cpl_table_get_nrow(atm_flux);
197 double *x = cpl_table_get_data_double(atm_flux, MOO_ATM_WAVE);
198 double *y = cpl_table_get_data_double(atm_flux, MOO_ATM_FLUX);
200 cpl_vector *vx = cpl_vector_wrap(nrow, x);
201 cpl_vector *vy = cpl_vector_wrap(nrow, y);
202 cpl_bivector *bv = cpl_bivector_wrap_vectors(vx, vy);
204 res = moo_spline_create(bv);
206 cpl_bivector_unwrap_vectors(bv);
207 cpl_vector_unwrap(vx);
208 cpl_vector_unwrap(vy);
209 cpl_table_delete(atm_flux);
214_get_flx_spline(
moo_flx *flx,
const char *targname)
216 moo_spline *flx_spline = NULL;
218 int nrow = cpl_table_get_nrow(std_spec);
220 double *x = cpl_table_get_data_double(std_spec, MOO_FLX_SPECTRUM_WAVE);
221 double *y = cpl_table_get_data_double(std_spec, MOO_FLX_SPECTRUM_FLUX);
223 cpl_vector *vx = cpl_vector_wrap(nrow, x);
224 cpl_vector *vy = cpl_vector_wrap(nrow, y);
225 cpl_bivector *bv = cpl_bivector_wrap_vectors(vx, vy);
227 flx_spline = moo_spline_create(bv);
229 cpl_bivector_unwrap_vectors(bv);
230 cpl_vector_unwrap(vx);
231 cpl_vector_unwrap(vy);
233 cpl_table_delete(std_spec);
260 moo_compute_resp_params *params)
262 moo_resp *resp = NULL;
264 cpl_ensure(scilist != NULL, CPL_ERROR_NULL_INPUT, NULL);
265 cpl_ensure(atm != NULL, CPL_ERROR_NULL_INPUT, NULL);
266 cpl_ensure(flx != NULL, CPL_ERROR_NULL_INPUT, NULL);
267 cpl_ensure(params != NULL, CPL_ERROR_NULL_INPUT, NULL);
276 cpl_msg_info(__func__,
"Compute response using %d frames", size);
278 for (
int il = 0; il < size; il++) {
279 const char *response_colname =
280 cpl_table_get_string(resp->response_table, MOO_RESP_TABLE_RESPONSE,
285 if (target_table->table != NULL) {
286 const char *targname = moo_target_table_get_std_name(target_table);
287 moo_spline *flx_spline = _get_flx_spline(flx, targname);
291 double airm = (airm_start + airm_end) / 2.;
293 moo_spline *atm_spline = _get_atm_spline(atm, airm);
295 const char *colnames[] = { MOO_TARGET_TABLE_EXPTIMERI,
296 MOO_TARGET_TABLE_EXPTIMEYJ,
297 MOO_TARGET_TABLE_EXPTIMEH };
299 for (
int i = 0; i < 3; i++) {
300 int degree = params->degree[i];
301 double frac = params->frac;
302 double kappa_lo = params->kappa_lo;
303 double kappa_up = params->kappa_up;
304 int niter = params->niter;
306 if (sci_single != NULL) {
307 int win_hsize = params->filter_winhsize[i];
309 cpl_propertylist *header =
313 cpl_table_get_double(target_table->table, colnames[i],
315 double entranceLoss = 1;
316 double div = cd1_1 * exptime * entranceLoss;
320 int nrow = cpl_table_get_nrow(response);
322 cpl_table_get_data_double(response, response_colname);
324 cpl_table_get_data_double(response, MOO_RESP_WAVE);
326 cpl_vector *init_data = cpl_vector_wrap(nrow, data);
327 cpl_vector *filter_data =
330 cpl_vector_unwrap(init_data);
331 for (
int j = 0; j < nrow; j++) {
333 double flxval = moo_spline_eval(flx_spline, w);
334 double atmval = moo_spline_eval(atm_spline, w);
335 double fval = cpl_vector_get(filter_data, j);
340 cpl_sprintf(
"%s_%s", response_colname,
343 cpl_sprintf(
"%s_%s", response_colname,
345 char *fluxfilter_colname =
346 cpl_sprintf(
"%s_%s", response_colname,
347 MOO_RESP_SPECFLUXFILTER);
348 cpl_table_set_double(response, fluxfilter_colname,
350 cpl_table_set_double(response, atm_colname, j,
352 cpl_table_set_double(response, flx_colname, j,
354 cpl_free(flx_colname);
355 cpl_free(atm_colname);
356 cpl_free(fluxfilter_colname);
361 data[j] = flxval / (fval / div / atmval);
364 cpl_table_set_column_invalid(response,
369 cpl_table *fit_table = cpl_table_new(nrow);
370 cpl_table_duplicate_column(fit_table,
371 MOO_COMPUTE_RESP_FIT_WAVE,
372 response, MOO_RESP_WAVE);
373 cpl_table_duplicate_column(fit_table,
374 MOO_COMPUTE_RESP_FIT_FLUX,
375 response, response_colname);
376 cpl_table_new_column(fit_table,
377 MOO_COMPUTE_RESP_FIT_IS_USED,
379 cpl_table_new_column(fit_table, MOO_COMPUTE_RESP_FIT_FIT,
381 for (
int k = 0; k < nrow; k++) {
383 if (cpl_table_is_valid(fit_table,
384 MOO_COMPUTE_RESP_FIT_FLUX, k)) {
387 cpl_table_set_int(fit_table,
388 MOO_COMPUTE_RESP_FIT_IS_USED, k, val);
390 _moo_response_fit1d(fit_table, degree, niter, frac,
393#if MOO_DEBUG_RESPONSE_FIT
396 cpl_sprintf(
"COMPUTE_RESP_TABLE_%s_%d.fits",
397 sci_single->extname, il);
398 cpl_table_save(fit_table, NULL, NULL, resname,
403 for (
int j = 0; j < nrow; j++) {
405 cpl_table_get_double(fit_table,
406 MOO_COMPUTE_RESP_FIT_FIT, j,
408 cpl_table_set(response, response_colname, j, 1 / fit);
410 cpl_table_delete(fit_table);
411 cpl_vector_delete(filter_data);
414 moo_spline_delete(flx_spline);
415 moo_spline_delete(atm_spline);
419 cpl_table_erase_invalid_rows(resp->response_table);
cpl_table * moo_atm_convert_mag_to_flux(moo_atm *self, double airm)
Get the extinction table with additonal column FLUX.
#define MOO_BADPIX_LOW_QE
#define MOO_BADPIX_OUTSIDE_DATA_RANGE
#define MOO_BADPIX_CALIB_DEFECT
#define MOO_BADPIX_COSMETIC
cpl_table * moo_flx_get_obj(moo_flx *self, const char *objname)
Find the TABLE for a given object name.
cpl_table * moo_resp_get_table(moo_resp *self, moo_detector_type type)
Get a reponse table from RESP.
moo_resp * moo_resp_create(moo_scilist *scilist, int badpix_level)
Prepare RESP for SCI frame.
cpl_propertylist * moo_sci_single_get_header(moo_sci_single *self)
Get header of sci single.
moo_sci_single * moo_sci_get_single(moo_sci *self, moo_detector_type type)
Get the type part in SCI and return it.
moo_target_table * moo_sci_get_target_table(moo_sci *self)
Get the target table of SCI file.
moo_sci * moo_scilist_get(moo_scilist *self, int i)
Get the SCI at the position i in the list.
cpl_size moo_scilist_get_size(const moo_scilist *self)
Get the number of SCI in the scilist.
int moo_target_table_find_index(moo_target_table *self, const char *targname)
find target indexspec in TARGET_TABLE
moo_resp * moo_compute_resp(moo_scilist *scilist, moo_atm *atm, moo_flx *flx, moo_compute_resp_params *params)
Compute instrumental response.
double moo_pfits_get_tel_airm_end(const cpl_propertylist *plist)
find out the TEL.AIRM.END value
double moo_pfits_get_cd1_1(const cpl_propertylist *plist)
find out the CD1_1 value
double moo_pfits_get_tel_airm_start(const cpl_propertylist *plist)
find out the TEL.AIRM.START value
moo_tcheby_polynomial * moo_tcheby_polynomial_fit(cpl_bivector *data, int degree, double xmin, double xmax)
Computes Tchebitchev transformation of data.
cpl_vector * moo_median_filter(cpl_vector *v, int winhsize)
Apply a median filter to a vector.
the different type of detectors