28#include "../hdrl_efficiency.h"
39void test_efficiency(
void){
42 cpl_image * flux = cpl_image_new(sz,1, CPL_TYPE_DOUBLE);
43 cpl_image * flux_e = cpl_image_new(sz,1, CPL_TYPE_DOUBLE);
44 cpl_array * waves = cpl_array_new(sz, CPL_TYPE_DOUBLE);
46 for(cpl_size i = 0; i < sz; ++i){
47 cpl_image_set(flux, i + 1, 1, (i + 1) * 2.5);
48 cpl_image_set(flux_e, i + 1, 1, (i + 1) * .02);
49 cpl_array_set(waves, i, (i + 1) * 3.0);
52 hdrl_spectrum1D * sp_obs =
55 for(cpl_size i = 0; i < sz; ++i){
56 cpl_image_set(flux, i + 1, 1, (i + 1) * 0.5);
57 cpl_image_set(flux_e, i + 1, 1, 0.0);
58 cpl_array_set(waves, i, (i + 1) * 3.0);
61 hdrl_spectrum1D * sp_std =
64 for(cpl_size i = 0; i < sz; ++i){
65 cpl_image_set(flux, i + 1, 1, (i + 1) * 1.5);
66 cpl_image_set(flux_e, i + 1, 1, 0.0);
67 cpl_array_set(waves, i, (i + 1) * 3.0);
70 hdrl_spectrum1D * sp_ext =
75 (hdrl_value){1.2, 0.0},
76 (hdrl_value){0.4, 0.0},
77 (hdrl_value){11.*12., 0.0},
78 (hdrl_value){1.1, 0.0},
79 (hdrl_value){2.2, 0.0});
81 hdrl_spectrum1D * sp_eff =
87 cpl_test_abs(v.data, 3.75528e-06, 1e-5);
88 cpl_test_abs(v.error, 3.00422e-08, 1e-5);
90 cpl_array_delete(waves);
91 cpl_image_delete(flux);
92 cpl_image_delete(flux_e);
102hdrl_value get_error(
const hdrl_value s,
const hdrl_value x,
const hdrl_data_t l){
103 hdrl_error_t err = (hdrl_error_t)(exp(-1.84207 * x.data));
104 err *= (hdrl_error_t)(0.848304 * pow(x.error, 2.0) * pow(s.data, 2.0) +
107 hdrl_data_t ephot = (hdrl_data_t)fabs(
E_ph(l).data);
108 hdrl_data_t data = (hdrl_data_t)(s.data * pow(10.0, -0.4 * x.data));
110 const hdrl_value to_ret = {data * ephot, sqrt(err) * (hdrl_error_t)ephot};
118void test_efficiency_error_propagation(
void){
120 const cpl_size len = 20;
122 cpl_image * std_obs_flux = cpl_image_new(len, 1, CPL_TYPE_DOUBLE);
123 cpl_image * std_obs_flux_e = cpl_image_new(len, 1, CPL_TYPE_DOUBLE);
125 cpl_image * std_model_flux = cpl_image_new(len, 1, CPL_TYPE_DOUBLE);
126 cpl_image * std_model_flux_e = cpl_image_new(len, 1, CPL_TYPE_DOUBLE);
128 cpl_image * ext_flux = cpl_image_new(len, 1, CPL_TYPE_DOUBLE);
129 cpl_image * ext_flux_e = cpl_image_new(len, 1, CPL_TYPE_DOUBLE);
131 cpl_array * wave = cpl_array_new(len, CPL_TYPE_DOUBLE);
133 hdrl_value Ap = {3.0, 0.0};
134 hdrl_value Am = {2.0, 0.0};
135 hdrl_value G = {1.0, 0.0};
136 hdrl_value Tex = {1.0, 0.0};
137 hdrl_value Atel = {1.0, 0.0};
140 for(cpl_size i = 0; i < len; ++i){
142 const double l = (i * .3 + 1.0) * 1e-4;
143 cpl_array_set(wave, i, l);
145 cpl_image_set(std_obs_flux, i + 1, 1, sin(l * CPL_MATH_PI));
146 cpl_image_set(std_obs_flux_e, i + 1, 1, 0.2 * sin(l * CPL_MATH_PI));
148 cpl_image_set(ext_flux, i + 1, 1, 1.7 * sin(l * CPL_MATH_PI));
149 cpl_image_set(ext_flux_e, i + 1, 1, 0.02 * sin(l * CPL_MATH_PI));
152 cpl_image_set(std_model_flux, i + 1, 1, 1.0);
153 cpl_image_set(std_model_flux_e, i + 1, 1, 0.0);
157 wave, hdrl_spectrum1D_wave_scale_linear);
160 std_model_flux_e, wave, hdrl_spectrum1D_wave_scale_linear);
163 wave, hdrl_spectrum1D_wave_scale_linear);
165 cpl_image_delete(std_obs_flux);
166 cpl_image_delete(std_obs_flux_e);
168 cpl_image_delete(std_model_flux);
169 cpl_image_delete(std_model_flux_e);
171 cpl_image_delete(ext_flux);
172 cpl_image_delete(ext_flux_e);
175 hdrl_parameter * pars =
179 I_ref_std, ext, pars);
181 for(cpl_size i = 0; i < len; ++i){
188 const hdrl_data_t w = cpl_array_get(wave, i, &rej);
190 const hdrl_value eff_i2 = get_error(I_std_i, ext_i, w);
192 cpl_test_rel(eff_i1.data, eff_i2.data, 1e-5);
193 cpl_test_rel(eff_i1.error, eff_i2.error, 1e-5);
196 cpl_array_delete(wave);
207void test_efficiency_spectrum_external_to_models(
void){
210 cpl_image * flux = cpl_image_new(sz,1, CPL_TYPE_DOUBLE);
211 cpl_image * flux_e = cpl_image_new(sz,1, CPL_TYPE_DOUBLE);
212 cpl_array * waves = cpl_array_new(sz, CPL_TYPE_DOUBLE);
214 for(cpl_size i = 0; i < sz; ++i){
215 cpl_image_set(flux, i + 1, 1, (i + 1) * 2.5);
216 cpl_image_set(flux_e, i + 1, 1, (i + 1) * .02);
219 cpl_array_set(waves, i, 3.0 * (sz + 5));
221 cpl_array_set(waves, i, (i - 1) * 3.0);
224 cpl_array * waves_obs = cpl_array_duplicate(waves);
226 hdrl_spectrum1D * sp_obs =
229 for(cpl_size i = 0; i < sz; ++i){
230 cpl_image_set(flux, i + 1, 1, (i + 1) * 0.5);
231 cpl_image_set(flux_e, i + 1, 1, 0.0);
232 cpl_array_set(waves, i, (i + 1) * 3.0);
235 hdrl_spectrum1D * sp_std =
238 for(cpl_size i = 0; i < sz; ++i){
239 cpl_image_set(flux, i + 1, 1, (i + 1) * 1.5);
240 cpl_image_set(flux_e, i + 1, 1, 0.0);
241 cpl_array_set(waves, i, (i + 2) * 3.0);
244 hdrl_spectrum1D * sp_ext =
249 (hdrl_value){1.2, 0.0},
250 (hdrl_value){0.4, 0.0},
251 (hdrl_value){11. * 12., 0.0},
252 (hdrl_value){1.1, 0.0},
253 (hdrl_value){2.2, 0.0});
255 hdrl_spectrum1D * sp_eff =
262 const cpl_array * wavs_eff =
265 for(cpl_size i = 3; i < sz - 1; ++i){
267 double w_f = cpl_array_get(wavs_eff, i - 3, NULL);
268 double w_obs = cpl_array_get(waves_obs, i, NULL);
270 cpl_test_rel(w_f, w_obs, 1e-16);
273 cpl_array_delete(waves);
274 cpl_array_delete(waves_obs);
275 cpl_image_delete(flux);
276 cpl_image_delete(flux_e);
291 cpl_test_init(PACKAGE_BUGREPORT, CPL_MSG_WARNING);
294 test_efficiency_error_propagation();
295 test_efficiency_spectrum_external_to_models();
297 cpl_test_error(CPL_ERROR_NONE);
299 return cpl_test_end(0);
hdrl_parameter * hdrl_efficiency_parameter_create(const hdrl_value Ap, const hdrl_value Am, const hdrl_value G, const hdrl_value Tex, const hdrl_value Atel)
ctor for the hdrl_parameter for efficiency
hdrl_value E_ph(hdrl_data_t lambda)
energy of the photon calculation
hdrl_spectrum1D * hdrl_efficiency_compute(const hdrl_spectrum1D *I_std_arg, const hdrl_spectrum1D *I_std_ref, const hdrl_spectrum1D *E_x, const hdrl_parameter *pars)
efficiency calculation
void hdrl_parameter_delete(hdrl_parameter *obj)
shallow delete of a parameter
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
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_value hdrl_spectrum1D_get_flux_value(const hdrl_spectrum1D *self, int idx, int *rej)
hdrl_spectrum1D getter for a flux value