38#define HDRL_DELTA_COMPARE_VALUE HDRL_EPS_DATA * 1.
41const hdrl_spectrum1D_wave_scale scale = hdrl_spectrum1D_wave_scale_linear;
43hdrl_spectrum1D * create_spectrum(
double * wavs,
44 double * flux,
double * flux_e,
const cpl_size sz){
45 cpl_image * flx = cpl_image_wrap_double(sz, 1, flux);
46 cpl_image * flx_e = cpl_image_wrap_double(sz, 1, flux_e);
47 cpl_array * wav = cpl_array_wrap_double(wavs, sz);
51 cpl_image_unwrap(flx);
52 cpl_image_unwrap(flx_e);
53 cpl_array_unwrap(wav);
58cpl_bivector * create_windows(
const double * w1,
const double * w2,
61 cpl_bivector * ret = cpl_bivector_new(sz);
62 cpl_vector * v1 = cpl_bivector_get_x(ret);
63 cpl_vector * v2 = cpl_bivector_get_y(ret);
65 for(cpl_size i = 0; i < sz; ++i){
66 cpl_vector_set(v1, i, w1[i]);
67 cpl_vector_set(v2, i, w2[i]);
73cpl_array * create_array(
const double * els,
const cpl_size sz){
74 cpl_array * to_ret = cpl_array_new(sz, HDRL_TYPE_DATA);
75 for(cpl_size i = 0; i < sz; ++i){
76 cpl_array_set(to_ret, i, els[i]);
81static cpl_error_code get_error_and_reset(
void){
82 cpl_error_code r = cpl_error_get_code();
87#define cpl_ensure_no_error cpl_test_eq(get_error_and_reset(), CPL_ERROR_NONE);
89#define cpl_ensure_error cpl_test_noneq(get_error_and_reset(), CPL_ERROR_NONE);
96void test_response_basic(
void)
98 double flx[] = {1,2,3,4,5};
99 double flx_e[] = {.1, .2, .1, .1, .05};
100 double wlen[] = {3,5,7,9,11};
101 hdrl_spectrum1D * s = create_spectrum(wlen, flx, flx_e, 5);
103 hdrl_response_result * r =
116 hdrl_parameter * calc_par =
122 double aPoints[5] = {3.1, 3.2, 3.3, 6.9, 7.0};
123 cpl_array * fit_points = create_array(aPoints, 5);
125 hdrl_parameter * fit_par =
158 cpl_test_eq(val.data, 5);
159 cpl_test_eq(val.error, 4);
167 cpl_test_eq(val.data, 2);
168 cpl_test_eq(val.error, 1);
176 cpl_test_eq(val.data, 2);
177 cpl_test_eq(val.error, 1);
184 cpl_array_delete(fit_points);
189void test_truncation(
void){
191 hdrl_spectrum1D * obs_s = NULL;
192 hdrl_spectrum1D * ref_s = NULL;
193 hdrl_spectrum1D * E_x = NULL;
196 double flx[] = {1,2,3,4,5};
197 double flx_e[] = {.1, .2, .1, .1, .05};
198 double wlen[] = {3,5,7,9,11};
199 obs_s = create_spectrum(wlen, flx, flx_e, 5);
203 double flx[] = {1,2,3,4,5};
204 double flx_e[] = {.1, .2, .1, .1, .05};
205 double wlen[] = {3.5,5,7,9,11};
206 ref_s = create_spectrum(wlen, flx, flx_e, 5);
210 double flx[] = {1,2,3,4,5};
211 double flx_e[] = {.1, .2, .1, .1, .05};
212 double wlen[] = {3,5,7,9,10.5};
213 E_x = create_spectrum(wlen, flx, flx_e, 5);
216 hdrl_parameter * calc_par =
222 cpl_array * fit_points = create_array((
double[]){3.1, 6.8, 6.9, 7.0, 7.5, 9.0, 11.0}, 7);
223 cpl_bivector * high_abs_regions = NULL;
225 hdrl_parameter * fit_par =
229 ref_s, E_x, NULL, NULL, calc_par, fit_par);
233 const hdrl_spectrum1D * sel_resp =
239 const double wmin = cpl_array_get_min(wlens_dest);
240 const double wmax = cpl_array_get_max(wlens_dest);
242 cpl_test_rel(wmin, 5, 1e-10);
243 cpl_test_rel(wmax, 9, 1e-10);
249 cpl_test_rel(cpl_array_get(wlens_sel, 0, NULL), 6.8, HDRL_DELTA_COMPARE_VALUE);
250 cpl_test_rel(cpl_array_get(wlens_sel, 1, NULL), 6.9, HDRL_DELTA_COMPARE_VALUE);
251 cpl_test_rel(cpl_array_get(wlens_sel, 2, NULL), 7.0, HDRL_DELTA_COMPARE_VALUE);
252 cpl_test_rel(cpl_array_get(wlens_sel, 3, NULL), 7.5, HDRL_DELTA_COMPARE_VALUE);
253 cpl_test_rel(cpl_array_get(wlens_sel, 4, NULL), 9.0, HDRL_DELTA_COMPARE_VALUE);
261 cpl_array_delete(fit_points);
262 cpl_bivector_delete(high_abs_regions);
266void test_edges_of_response_outside_fit_points(
void){
268 hdrl_spectrum1D * obs_s = NULL;
269 hdrl_spectrum1D * ref_s = NULL;
270 hdrl_spectrum1D * E_x = NULL;
273 double flx[] = {1,2,3,4,5};
274 double flx_e[] = {.1, .2, .1, .1, .05};
275 double wlen[] = {3,5,7,9,11};
276 obs_s = create_spectrum(wlen, flx, flx_e, 5);
280 double flx[] = {1,2,3,4,5};
281 double flx_e[] = {.1, .2, .1, .1, .05};
282 double wlen[] = {3,5,7,9,11};
283 ref_s = create_spectrum(wlen, flx, flx_e, 5);
287 double flx[] = {1,2,3,4,5};
288 double flx_e[] = {.1, .2, .1, .1, .05};
289 double wlen[] = {3,5,7,9,11};
290 E_x = create_spectrum(wlen, flx, flx_e, 5);
293 hdrl_parameter * calc_par =
299 cpl_array * fit_points = create_array((
double[]){3.1, 6.8, 6.9, 7.0, 7.5, 9.0, 11.0}, 7);
300 cpl_bivector * high_abs_regions = NULL;
302 hdrl_parameter * fit_par =
306 ref_s, E_x, NULL, NULL, calc_par, fit_par);
310 const hdrl_spectrum1D * sel_resp =
315 cpl_test_eq(cpl_array_get_size(wlens_selected), 7);
317 cpl_test_rel(cpl_array_get(wlens_selected, 0, NULL), 3.1, HDRL_DELTA_COMPARE_VALUE);
318 cpl_test_rel(cpl_array_get(wlens_selected, 1, NULL), 6.8, HDRL_DELTA_COMPARE_VALUE);
319 cpl_test_rel(cpl_array_get(wlens_selected, 2, NULL), 6.9, HDRL_DELTA_COMPARE_VALUE);
320 cpl_test_rel(cpl_array_get(wlens_selected, 3, NULL), 7.0, HDRL_DELTA_COMPARE_VALUE);
321 cpl_test_rel(cpl_array_get(wlens_selected, 4, NULL), 7.5, HDRL_DELTA_COMPARE_VALUE);
322 cpl_test_rel(cpl_array_get(wlens_selected, 5, NULL), 9.0, HDRL_DELTA_COMPARE_VALUE);
323 cpl_test_rel(cpl_array_get(wlens_selected, 6, NULL), 11.0, HDRL_DELTA_COMPARE_VALUE);
330 cpl_test_eq(cpl_array_get_size(wlens_dest), cpl_array_get_size(wlens_obs));
332 for(cpl_size i = 0; i < cpl_array_get_size(wlens_dest); ++i){
333 const double w_d = cpl_array_get(wlens_dest, i, NULL);
334 const double w_o = cpl_array_get(wlens_obs, i, NULL);
335 cpl_test_rel(w_d, w_o, 1e-10);
353 cpl_array_delete(fit_points);
354 cpl_bivector_delete(high_abs_regions);
358void test_telluric(
void){
360 hdrl_spectrum1D * t1 = NULL;
361 hdrl_spectrum1D * t2 = NULL;
364 double flx[] = {1, 2, 3, 4, 0, 1};
365 double flx_e[] = {.1, .2, .1, .1, .05, .3, .83};
366 double wlen[] = {3.1,5,7,9,10.9, 10.95};
367 t1 = create_spectrum(wlen, flx, flx_e, 6);
371 double flx[] = {2, 4, 6, 8, 0, 1};
372 double flx_e[] = {.1, .2, .1, .1, .05, 3.3};
373 double wlen[] = {3.1, 5, 7, 9, 10.9, 10.95};
374 t2 = create_spectrum(wlen, flx, flx_e, 6);
382 cpl_bivector * areas = cpl_bivector_new(3);
384 cpl_vector_set(cpl_bivector_get_x(areas), 0, 3);
385 cpl_vector_set(cpl_bivector_get_y(areas), 0, 5.1);
387 cpl_vector_set(cpl_bivector_get_x(areas), 1, 6.9);
388 cpl_vector_set(cpl_bivector_get_y(areas), 1, 7.1);
390 cpl_vector_set(cpl_bivector_get_x(areas), 2, 10.0);
391 cpl_vector_set(cpl_bivector_get_y(areas), 2, 11.0);
393 hdrl_parameter * tell_par =
395 CPL_FALSE, areas , areas, 3, 11);
397 hdrl_parameter * calc_par =
403 cpl_array * fit_points = create_array((
double[]){3.1, 6.8, 6.9, 7.0, 7.5, 9.0, 11.0}, 7);
404 cpl_bivector * high_abs_regions = create_windows((
double[]){8.9}, (
double[]){9.1}, 1);
406 hdrl_parameter * fit_par =
410 t1, t1, tell_par, NULL, calc_par, fit_par);
420 cpl_test_rel(mean, 0.0041, 1e-2);
421 cpl_test_rel(stddev, 0.707, 1e-2);
422 cpl_test((fabs(shift) < 1e-10));
423 cpl_test(doppler >= 0.);
425 const hdrl_spectrum1D * obs_corr =
431 cpl_test_rel(v.data, 1, 1e-5);
435 cpl_bivector_delete(areas);
441 cpl_array_delete(fit_points);
442 cpl_bivector_delete(high_abs_regions);
445void test_ignore_abs_regions(
void){
447 hdrl_spectrum1D * obs_s = NULL;
448 hdrl_spectrum1D * ref_s = NULL;
449 hdrl_spectrum1D * E_x = NULL;
452 double flx[] = {1,2,3,4,5};
453 double flx_e[] = {.1, .2, .1, .1, .05};
454 double wlen[] = {3,5,7,9,11};
455 obs_s = create_spectrum(wlen, flx, flx_e, 5);
459 double flx[] = {1,2,3,4,5};
460 double flx_e[] = {.1, .2, .1, .1, .05};
461 double wlen[] = {3,5,7,9,11};
462 ref_s = create_spectrum(wlen, flx, flx_e, 5);
466 double flx[] = {1,2,3,4,5};
467 double flx_e[] = {.1, .2, .1, .1, .05};
468 double wlen[] = {3,5,7,9,11};
469 E_x = create_spectrum(wlen, flx, flx_e, 5);
472 hdrl_parameter * calc_par =
478 cpl_array * fit_points = create_array((
double[]){3.1, 6.8, 6.9, 7.0, 7.5, 9.0, 11.0}, 7);
479 cpl_bivector * high_abs_regions = create_windows((
double[]){8.9}, (
double[]){9.1}, 1);
482 hdrl_parameter * fit_par_no_abs =
485 hdrl_parameter * fit_par_abs =
489 ref_s, E_x, NULL, NULL, calc_par, fit_par_no_abs);
491 cpl_test_nonnull(r_no_abs);
494 ref_s, E_x, NULL, NULL, calc_par, fit_par_abs);
496 cpl_test_nonnull(r_abs);
525 cpl_array_delete(fit_points);
526 cpl_bivector_delete(high_abs_regions);
536 cpl_test_init(PACKAGE_BUGREPORT, CPL_MSG_WARNING);
538 test_response_basic();
542 test_edges_of_response_outside_fit_points();
544 test_ignore_abs_regions();
548 cpl_test_error(CPL_ERROR_NONE);
550 return cpl_test_end(0);
hdrl_parameter * hdrl_response_parameter_create(const hdrl_value Ap, const hdrl_value Am, const hdrl_value G, const hdrl_value Tex)
ctor for the hdrl_parameter for response
void hdrl_parameter_delete(hdrl_parameter *obj)
shallow delete of a parameter
hdrl_data_t hdrl_response_result_get_stddev(const hdrl_response_result *res)
Getter of the standard deviation of the ratio between the corrected observed spectrum and its smoothe...
const hdrl_spectrum1D * hdrl_response_result_get_final_response(const hdrl_response_result *res)
Getter for the final response contained inside the hdrl_response_result.
const hdrl_spectrum1D * hdrl_response_result_get_selected_response(const hdrl_response_result *res)
Getter for the selected response contained inside the hdrl_response_result.
hdrl_parameter * hdrl_response_fit_parameter_create(const cpl_size radius, const cpl_array *fit_points, const hdrl_data_t wrange, const cpl_bivector *high_abs_regions)
ctor for the hdrl_parameter for the final interpolation of the response
cpl_size hdrl_response_result_get_best_telluric_model_idx(const hdrl_response_result *res)
Getter of the index of the telluric model used for telluric correction contained in hdrl_response_res...
hdrl_data_t hdrl_response_result_get_doppler_shift(const hdrl_response_result *res)
Getter of the doppler shift used to correct the model.
void hdrl_response_result_delete(hdrl_response_result *res)
Destructor for hdrl_response_result.
hdrl_response_result * hdrl_response_compute(const hdrl_spectrum1D *obs_s, const hdrl_spectrum1D *ref_s, const hdrl_spectrum1D *E_x, const hdrl_parameter *telluric_par, const hdrl_parameter *velocity_par, const hdrl_parameter *calc_par, const hdrl_parameter *fit_par)
Computation of the response.
hdrl_parameter * hdrl_response_telluric_evaluation_parameter_create(const hdrl_spectrum1Dlist *telluric_models, hdrl_data_t w_step, cpl_size half_win, cpl_boolean normalize, cpl_boolean shift_in_log_scale, const cpl_bivector *quality_areas, const cpl_bivector *fit_areas, hdrl_data_t lmin, hdrl_data_t lmax)
ctor for the hdrl_parameter for the telluric evaluation
const hdrl_spectrum1D * hdrl_response_result_get_raw_response(const hdrl_response_result *res)
Getter for the raw response contained inside the hdrl_response_result.
hdrl_data_t hdrl_response_result_get_avg_diff_from_1(const hdrl_response_result *res)
Getter of the value |mean - 1|, where mean is the average of the ratio between the corrected observed...
hdrl_data_t hdrl_response_result_get_telluric_shift(const hdrl_response_result *res)
Getter of the shift applied to the telluric model.
const hdrl_spectrum1D * hdrl_response_result_get_corrected_obs_spectrum(const hdrl_response_result *res)
Getter for the corrected observed spectrum contained in hdrl_response_result.
hdrl_spectrum1Dlist * hdrl_spectrum1Dlist_new(void)
hdrl_spectrum1Dlist default constructor
cpl_size hdrl_spectrum1D_get_size(const hdrl_spectrum1D *self)
hdrl_spectrum1D getter for size
void hdrl_spectrum1D_delete(hdrl_spectrum1D **p_self)
hdrl_spectrum1D destructor
cpl_error_code hdrl_spectrum1Dlist_set(hdrl_spectrum1Dlist *self, hdrl_spectrum1D *s, const cpl_size idx)
hdrl_spectrum1Dlist setter of the i-th element
void hdrl_spectrum1Dlist_delete(hdrl_spectrum1Dlist *l)
hdrl_spectrum1Dlist destructor
hdrl_spectrum1D * hdrl_spectrum1D_create(const cpl_image *arg_flux, const cpl_image *arg_flux_e, const cpl_array *wavelength, hdrl_spectrum1D_wave_scale wave_scale)
hdrl_spectrum1D default constructor
hdrl_spectrum1D_wavelength hdrl_spectrum1D_get_wavelength(const hdrl_spectrum1D *self)
hdrl_spectrum1D getter for wavelengths
hdrl_data_t hdrl_spectrum1D_get_wavelength_value(const hdrl_spectrum1D *self, int idx, int *rej)
hdrl_spectrum1D getter for a wavelength value
hdrl_value hdrl_spectrum1D_get_flux_value(const hdrl_spectrum1D *self, int idx, int *rej)
hdrl_spectrum1D getter for a flux value