29#include "hdrl_spectrum_resample.h"
34hdrl_spectrum1D * create_spectrum(
double fx){
35 cpl_image * flx = cpl_image_new(1, 1, HDRL_TYPE_DATA);
36 cpl_array * wln = cpl_array_new(1, HDRL_TYPE_DATA);
37 cpl_image_set(flx, 1, 1 , fx);
38 cpl_array_set(wln, 0, 100);
40 hdrl_spectrum1D_wave_scale_linear);
42 cpl_array_delete(wln);
43 cpl_image_delete(flx);
48void check_equal(
const hdrl_spectrum1D * s1,
const hdrl_spectrum1D * s2){
53 for(cpl_size i = 0; i < sz; ++i){
54 int rej1 = 0, rej2 = 0;
58 cpl_test_eq(rej1, rej2);
59 cpl_test_rel(v1.data, v2.data, 1e-5);
60 cpl_test_rel(v1.error, v2.error, 1e-5);
64void check_list_sequential(
const hdrl_spectrum1Dlist * list,
65 cpl_size idx,
double mlx){
70 cpl_test_rel(v.data, idx * mlx, 1e-10);
76void test_spectrum1dlist_wrap(
void){
77 hdrl_spectrum1D ** sl = cpl_calloc(6,
sizeof(hdrl_spectrum1D*));
79 sl[0] = create_spectrum(1);
80 sl[1] = create_spectrum(2);
81 sl[2] = create_spectrum(3);
82 sl[3] = create_spectrum(4);
83 sl[4] = create_spectrum(5);
84 sl[5] = create_spectrum(6);
92 cpl_test_eq_ptr(s, sl[i]);
98void test_spectrum1dlist(
void){
104 hdrl_spectrum1D * s4 = create_spectrum(4);
107 hdrl_spectrum1D * s1 = create_spectrum(1);
108 hdrl_spectrum1D * s11 = create_spectrum(1);
109 hdrl_spectrum1D * s2 = create_spectrum(2);
110 hdrl_spectrum1D * s3 = create_spectrum(3);
111 hdrl_spectrum1D * s5 = create_spectrum(5);
112 hdrl_spectrum1D * s6 = create_spectrum(6);
139 cpl_test_noneq_ptr(s1, s2);
146 cpl_test_rel(v.data, (
double)i + 1.0 , 1e-5);
153 cpl_test_rel(v.data, ((
double)i + 1.0) * 5.0 , 1e-5);
158 cpl_test_eq_ptr(new_s4, s4);
162 const double flx_value[] = {1, 2, 3, 5, 6};
167 cpl_test_rel(v.data, flx_value[i], 1e-5);
173 check_list_sequential(list2, i + 1, 5.0);
175 cpl_test_rel(v.data, i * 5.0, 1e-5);
186create_spectrum_long(
const double * data,
const cpl_size length){
187 cpl_array * wlens = cpl_array_new(length, HDRL_TYPE_DATA);
188 cpl_image * flx = cpl_image_new(length, 1, HDRL_TYPE_DATA);
190 for(cpl_size i = 0; i < length; ++i){
191 cpl_array_set(wlens, i, fabs(data[i]));
194 cpl_image_set(flx, i + 1, 1, data[i]);
196 cpl_image_reject(flx, i + 1, 1);
200 hdrl_spectrum1D_wave_scale_linear);
202 cpl_image_delete(flx);
203 cpl_array_delete(wlens);
209void test_spectrum1dlist_collapse_badpix(
void){
213 double aValues1[4] = {1, 2, 3, 4};
216 double aValues2[3] = {-1, 2, 4};
219 double aValues3[3] = {1, 3, -4};
222 cpl_array * wlenghts = cpl_array_new(6, HDRL_TYPE_DATA);
223 for(cpl_size i = 0; i < cpl_array_get_size(wlenghts); ++i){
224 cpl_array_set(wlenghts, i, i);
228 hdrl_parameter * resampling_par =
231 hdrl_spectrum1D * res = NULL;
232 cpl_image * contrib = NULL;
233 hdrl_imagelist * aligned_fluxes = NULL;
236 &res, &contrib, &aligned_fluxes);
238 int contribs[] = {2, 3, 3, 2};
239 for(cpl_size i = 1; i < 5; ++i){
241 const double el = cpl_image_get(contrib, i + 1, 1, &rej);
243 cpl_test_eq(el, contribs[i - 1]);
247 double el = cpl_image_get(contrib, 6, 1, &reject);
248 cpl_test_eq(reject, 0);
252 el = cpl_image_get(contrib, 1, 1, &reject);
253 cpl_test_eq(reject, 0);
257 cpl_test_eq(cpl_array_get_size(wlenghts), sz);
259 for(cpl_size i = 0; i < sz; ++i){
262 if(i == 0 || i == (sz - 1)){
266 cpl_test_rel(v.data, i, 1e-5);
272 cpl_image_delete(contrib);
276 cpl_array_delete(wlenghts);
281void test_spectrum1dlist_collapse_mark_rej_in_interpolation(
void){
285 double aValues1[4] = {1, 2, 3, 4};
288 double aValues2[4] = {-1, 2, -3, 4};
291 double aValues3[4] = {1,-2, 3, -4};
294 cpl_array * wlenghts = cpl_array_new(6, HDRL_TYPE_DATA);
295 for(cpl_size i = 0; i < cpl_array_get_size(wlenghts); ++i){
296 cpl_array_set(wlenghts, i, i);
300 hdrl_parameter * resampling_par =
303 hdrl_spectrum1D * res = NULL;
304 cpl_image * contrib = NULL;
305 hdrl_imagelist * aligned_fluxes = NULL;
308 &res, &contrib, &aligned_fluxes);
310 int contribs[] = {2, 2, 2, 2};
311 for(cpl_size i = 1; i < 5; ++i){
313 const double el = cpl_image_get(contrib, i + 1, 1, &reject);
314 cpl_test_eq(reject, 0);
315 cpl_test_eq(el, contribs[i - 1]);
319 double el = cpl_image_get(contrib, 6, 1, &rej_contr);
320 cpl_test_eq(rej_contr, 0);
324 el = cpl_image_get(contrib, 1, 1, &rej_contr);
325 cpl_test_eq(rej_contr, 0);
329 cpl_test_eq(cpl_array_get_size(wlenghts), sz);
331 for(cpl_size i = 0; i < sz; ++i){
334 if(i == 0 || i == (sz - 1)){
338 cpl_test_rel(v.data, i, 1e-5);
344 cpl_image_delete(contrib);
348 cpl_array_delete(wlenghts);
352void test_spectrum1dlist_collapse_holes(
void){
356 double aValues1[4] = {1, 2, 3, 4};
359 double aValues2[2] = {2, 4};
362 double aValues3[2] = {1, 3};
365 cpl_array * wlenghts = cpl_array_new(6, HDRL_TYPE_DATA);
366 for(cpl_size i = 0; i < cpl_array_get_size(wlenghts); ++i){
367 cpl_array_set(wlenghts, i, i);
371 hdrl_parameter * resampling_par =
374 hdrl_spectrum1D * res = NULL;
375 cpl_image * contrib = NULL;
376 hdrl_imagelist * aligned_fluxes = NULL;
378 CPL_FALSE, &res, &contrib, &aligned_fluxes);
380 int contribs[] = {2, 3, 3, 2};
381 for(cpl_size i = 1; i < 5; ++i){
383 const double el = cpl_image_get(contrib, i + 1, 1, &rej_contr);
384 cpl_test_eq(rej_contr, 0);
385 cpl_test_eq(el, contribs[i - 1]);
389 double el = cpl_image_get(contrib, 6, 1, &rej_contrib);
390 cpl_test_eq(rej_contrib, 0);
394 el = cpl_image_get(contrib, 1, 1, &rej_contrib);
395 cpl_test_eq(rej_contrib, 0);
399 cpl_test_eq(cpl_array_get_size(wlenghts), sz);
401 for(cpl_size i = 0; i < sz; ++i){
404 if(i == 0 || i == (sz - 1)){
408 cpl_test_rel(v.data, i, 1e-5);
414 cpl_image_delete(contrib);
418 cpl_array_delete(wlenghts);
421void test_error_and_reset(cpl_error_code expected){
422 cpl_test_eq_error(expected, cpl_error_get_code());
426void test_spectrum1dlist_insert_duplication(
void){
432 hdrl_spectrum1D * s1 = create_spectrum(1);
433 hdrl_spectrum1D * s2 = create_spectrum(2);
434 hdrl_spectrum1D * s3 = create_spectrum(3);
435 hdrl_spectrum1D * s4 = create_spectrum(4);
436 hdrl_spectrum1D * s5 = create_spectrum(5);
437 hdrl_spectrum1D * s6 = create_spectrum(6);
447 test_error_and_reset(CPL_ERROR_ILLEGAL_INPUT);
450 test_error_and_reset(CPL_ERROR_ILLEGAL_INPUT);
453 test_error_and_reset(CPL_ERROR_ILLEGAL_INPUT);
456 test_error_and_reset(CPL_ERROR_ILLEGAL_INPUT);
459 test_error_and_reset(CPL_ERROR_ILLEGAL_INPUT);
462 test_error_and_reset(CPL_ERROR_ILLEGAL_INPUT);
474 cpl_test_init(PACKAGE_BUGREPORT, CPL_MSG_WARNING);
476 test_spectrum1dlist();
477 test_spectrum1dlist_wrap();
478 test_spectrum1dlist_collapse_holes();
479 test_spectrum1dlist_collapse_badpix();
480 test_spectrum1dlist_collapse_mark_rej_in_interpolation();
481 test_spectrum1dlist_insert_duplication();
483 cpl_test_error(CPL_ERROR_NONE);
485 return cpl_test_end(0);
hdrl_parameter * hdrl_collapse_mean_parameter_create(void)
create a parameter object for mean
void hdrl_imagelist_delete(hdrl_imagelist *himlist)
Free all memory used by a hdrl_imagelist object including the images.
void hdrl_parameter_delete(hdrl_parameter *obj)
shallow delete of a parameter
cpl_error_code hdrl_spectrum1D_mul_scalar(hdrl_spectrum1D *self, hdrl_value scalar_operator)
computes the elementwise multiplication of a spectrum by a scalar, the self parameter is modified
cpl_size hdrl_spectrum1Dlist_get_size(const hdrl_spectrum1Dlist *l)
hdrl_spectrum1Dlist getter for size
hdrl_spectrum1Dlist * hdrl_spectrum1Dlist_new(void)
hdrl_spectrum1Dlist default constructor
hdrl_parameter * hdrl_spectrum1D_resample_interpolate_parameter_create(const hdrl_spectrum1D_interpolation_method method)
constructor for the hdrl_parameter in the case of interpolation
cpl_size hdrl_spectrum1D_get_size(const hdrl_spectrum1D *self)
hdrl_spectrum1D getter for size
hdrl_spectrum1D * hdrl_spectrum1Dlist_unset(hdrl_spectrum1Dlist *self, const cpl_size idx)
hdrl_spectrum1Dlist remove of the i-th element
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_spectrum1Dlist_get(hdrl_spectrum1Dlist *self, const cpl_size idx)
hdrl_spectrum1Dlist getter of the i-th element
const hdrl_spectrum1D * hdrl_spectrum1Dlist_get_const(const hdrl_spectrum1Dlist *self, const cpl_size idx)
hdrl_spectrum1Dlist getter of the i-th element
hdrl_spectrum1D * hdrl_spectrum1D_create_error_free(const cpl_image *arg_flux, const cpl_array *wavelength, hdrl_spectrum1D_wave_scale scale)
hdrl_spectrum1D constructor in the case of error-free spectrum (i.e. the error on the flux is zero fo...
hdrl_spectrum1Dlist * hdrl_spectrum1Dlist_duplicate(const hdrl_spectrum1Dlist *l)
hdrl_spectrum1Dlist copy-constructor
hdrl_spectrum1Dlist * hdrl_spectrum1Dlist_wrap(hdrl_spectrum1D **self, const cpl_size sz)
hdrl_spectrum1Dlist wrapper
cpl_error_code hdrl_spectrum1Dlist_collapse(const hdrl_spectrum1Dlist *list, const hdrl_parameter *stacking_par, const cpl_array *wlengths, const hdrl_parameter *resample_par, const cpl_boolean mark_bpm_in_interpolation, hdrl_spectrum1D **result, cpl_image **contrib, hdrl_imagelist **resampled_and_aligned_fluxes)
collapsing a hdrl_spectrum1Dlist. The spectra in list are first resampled on the wavelengths wlengths...
hdrl_value hdrl_spectrum1D_get_flux_value(const hdrl_spectrum1D *self, int idx, int *rej)
hdrl_spectrum1D getter for a flux value