28#include "hdrl_sigclip.h"
29#include "hdrl_utils.h"
36#define ARRAY_LEN(a) sizeof((a))/sizeof((a)[0])
40#define SQR(a) ((a) * (a))
49static cpl_error_code hdrl_clip_kappa_sigma_test(
void)
51 double omean, omean_err, rej_low, rej_high;
55 double * dpixels = cpl_calloc(9,
sizeof(
double));
57 cpl_vector * data = cpl_vector_wrap(9, dpixels);
58 cpl_vector * errors = cpl_vector_new(9);
59 cpl_vector_fill(errors, 1);
62 hdrl_kappa_sigma_clip(data, errors, 3, 3, 3, CPL_FALSE,
63 &omean, NULL, NULL, NULL, NULL);
64 cpl_test_error(CPL_ERROR_NONE);
66 cpl_test_eq(omean, 0.);
69 hdrl_kappa_sigma_clip(data, errors, 3, 3, 3, CPL_FALSE,
70 NULL, NULL, NULL, NULL, NULL);
71 cpl_test_error(CPL_ERROR_NULL_INPUT);
74 hdrl_kappa_sigma_clip(NULL, errors, 3, 3, 3, CPL_FALSE,
75 &omean, NULL, NULL, NULL, NULL);
76 cpl_test_error(CPL_ERROR_NULL_INPUT);
79 hdrl_kappa_sigma_clip(data, errors, 3, 3, 0, CPL_TRUE,
80 &omean, NULL, NULL, NULL, NULL);
81 cpl_test_error(CPL_ERROR_ILLEGAL_INPUT);
83 cpl_vector_delete(data);
84 cpl_vector_delete(errors);
88 double * dpixels = cpl_calloc(9,
sizeof(
double));
90 cpl_vector * data = cpl_vector_wrap(9, dpixels);
91 cpl_vector * errors = cpl_vector_new(9);
92 cpl_vector_fill(errors, 1);
94 hdrl_kappa_sigma_clip(data, errors, 3, 3, 3, CPL_FALSE,
95 &omean, &omean_err, &naccepted,
97 cpl_test_error(CPL_ERROR_NONE);
99 cpl_test_eq(omean, 0.);
100 cpl_test_rel(omean_err, 1 / sqrt(9), 0.001);
101 cpl_test_eq(naccepted, 9);
103 cpl_vector_delete(data);
104 cpl_vector_delete(errors);
110 double values[] = {1.5, 6., 4., 6., 4., 6., 4., 6., 10.5};
111 const int n = ARRAY_LEN(values);
113 cpl_vector * data = cpl_vector_wrap(n, values);
114 cpl_vector * errors = cpl_vector_new(n);
115 cpl_vector_fill(errors, 1);
117 hdrl_kappa_sigma_clip(data, errors, 1.5, 1.5, 1, CPL_FALSE,
118 &omean, &omean_err, &naccepted,
119 &rej_low, &rej_high);
120 cpl_test_error(CPL_ERROR_NONE);
122 cpl_test_rel(omean, (4. * 3 + 6 * 4.) / 7., 0.001);
123 cpl_test_rel(omean_err, 1 / sqrt(n - 2), 0.001);
124 cpl_test_rel(rej_low, 1.55, 0.02);
125 cpl_test_rel(rej_high, 10.44, 0.02);
126 cpl_test_eq(naccepted, n - 2);
128 cpl_vector_unwrap(data);
129 cpl_vector_delete(errors);
134 double values[] = {10.};
135 const int n = ARRAY_LEN(values);
137 cpl_vector * data = cpl_vector_wrap(n, values);
138 cpl_vector * errors = cpl_vector_new(n);
139 cpl_vector_fill(errors, 1);
141 hdrl_kappa_sigma_clip(data, errors, 2., 2., 1, CPL_FALSE,
142 &omean, &omean_err, &naccepted,
143 &rej_low, &rej_high);
144 cpl_test_error(CPL_ERROR_NONE);
146 cpl_test_rel(omean, values[0], 0.001);
147 cpl_test_rel(omean_err, 1, 0.001);
148 cpl_test_rel(rej_low, values[0], 0.02);
149 cpl_test_rel(rej_high, values[0], 0.02);
150 cpl_test_eq(naccepted, n);
152 cpl_vector_unwrap(data);
153 cpl_vector_delete(errors);
158 double values[] = {92, 93, 94, 94, 95, 95, 96, 96, 96, 97,
159 97, 97, 97, 98, 98, 98, 98, 99, 99, 99,
160 99, 100, 100, 100, 100, 100, 101, 101, 101, 101,
161 102, 102, 102, 102, 103, 103, 103, 103, 104, 104,
162 104, 105, 105, 106, 106, 107, 108 };
163 const int n = ARRAY_LEN(values);
165 cpl_vector * data = cpl_vector_wrap(n, values);
166 cpl_vector * errors = cpl_vector_new(n);
167 cpl_vector_fill(errors, 1);
170 hdrl_kappa_sigma_clip(data, errors, 2., 2., 3, CPL_FALSE,
171 &omean, &omean_err, &naccepted,
172 &rej_low, &rej_high);
173 cpl_test_error(CPL_ERROR_NONE);
175 cpl_test_rel(omean, 100., 0.001);
176 cpl_test_rel(omean_err, 1 / sqrt(n), 0.001);
178 cpl_test_rel(rej_low, 91., 0.005);
179 cpl_test_rel(rej_high, 109, 0.005);
180 cpl_test_eq(naccepted, n);
182 cpl_vector_unwrap(data);
183 cpl_vector_delete(errors);
188 double values[] = {1, 150, 94, 94, 95, 95, 96, 96, 96, 97,
189 97, 97, 97, 98, 98, 98, 98, 99, 99, 99,
190 99, 100, 100, 100, 100, 100, 101, 101, 101, 101,
191 102, 102, 102, 102, 103, 103, 103, 103, 104, 104,
192 104, 105, 105, 106, 106, 107, 108 };
193 const int n = ARRAY_LEN(values);
195 cpl_vector * data = cpl_vector_wrap(n, values);
196 cpl_vector * errors = cpl_vector_new(n);
197 cpl_vector_fill(errors, 1);
199 hdrl_kappa_sigma_clip(data, errors, 3, 3, 3, CPL_FALSE,
200 &omean, &omean_err, &naccepted,
202 cpl_test_error(CPL_ERROR_NONE);
204 cpl_test_rel(omean, 100., 0.005);
205 cpl_test_rel(omean_err, 1 / sqrt(n - 2), 0.001);
206 cpl_test_eq(naccepted, n - 2);
208 cpl_vector_unwrap(data);
209 cpl_vector_delete(errors);
214 double values[] = {54, 234. ,5,2, 343, 23 , 2, 0.21, 0.1232 , 1.2e3};
215 const int n = ARRAY_LEN(values);
217 cpl_vector * data = cpl_vector_wrap(n, values);
218 cpl_vector * errors = cpl_vector_duplicate(data);
219 cpl_vector * odata = cpl_vector_duplicate(data);
220 cpl_vector * oerrors = cpl_vector_duplicate(errors);
222 hdrl_kappa_sigma_clip(data, errors, 3, 3, 3, CPL_FALSE,
223 &omean, &omean_err, &naccepted,
225 cpl_test_error(CPL_ERROR_NONE);
227 cpl_test_vector_abs(data, odata, FLT_EPSILON);
228 cpl_test_vector_abs(errors, oerrors, FLT_EPSILON);
230 cpl_vector_unwrap(data);
231 cpl_vector_delete(errors);
232 cpl_vector_delete(odata);
233 cpl_vector_delete(oerrors);
240 double values[] = {1, 150, 94, 94, 95, 95, 96, 96, 96, 97,
241 97, 97, 97, 98, 98, 98, 98, 99, 99, 99,
242 99, 100, 100, 100, 100, 100, 101, 101, 101, 101,
243 102, 102, 102, 102, 103, 103, 103, 103, 104, 104,
244 104, 105, 105, 106, 106, 107, 108, 100, 100};
245 const int n = ARRAY_LEN(values);
247 cpl_image * data = cpl_image_wrap(sqrt(n), sqrt(n), CPL_TYPE_DOUBLE,
249 cpl_image * errors = cpl_image_new(sqrt(n), sqrt(n), CPL_TYPE_DOUBLE);
250 cpl_image_add_scalar(errors, 1);
252 hdrl_kappa_sigma_clip_image(data, errors, 3, 3, 3,
253 &omean, &omean_err, &naccepted,
255 cpl_test_error(CPL_ERROR_NONE);
257 cpl_test_rel(omean, 100., 0.005);
258 cpl_test_rel(omean_err, 1 / sqrt(n - 2), 0.001);
259 cpl_test_eq(naccepted, n - 2);
261 cpl_image_unwrap(data);
262 cpl_image_delete(errors);
268 float values[] = {1, 150, 94, 94, 95, 95, 96, 96, 96, 97,
269 97, 97, 97, 98, 98, 98, 98, 99, 99, 99,
270 99, 100, 100, 100, 100, 100, 101, 101, 101, 101,
271 102, 102, 102, 102, 103, 103, 103, 103, 104, 104,
272 104, 105, 105, 106, 106, 107, 108, 100, 100};
273 const int n = sqrt(ARRAY_LEN(values));
275 cpl_image * data = cpl_image_wrap(n, n, CPL_TYPE_FLOAT, values);
276 cpl_image * errors = cpl_image_new(n, n, CPL_TYPE_FLOAT);
277 cpl_image_add_scalar(errors, 1);
279 cpl_image_reject(data, n, n);
280 cpl_image_reject(data, n, n - 1);
281 cpl_image_set(errors, n, n, 2343.e30);
282 cpl_image_set(errors, n, n - 1, 2343.e30);
283 cpl_image_reject_from_mask(errors, cpl_image_get_bpm(data));
285 hdrl_kappa_sigma_clip_image(data, errors, 3, 3, 3,
286 &omean, &omean_err, &naccepted,
288 cpl_test_error(CPL_ERROR_NONE);
290 cpl_test_rel(omean, 100., 0.005);
291 cpl_test_rel(omean_err, 1 / sqrt(n * n - 4), 0.001);
292 cpl_test_eq(naccepted, (n * n) - 4);
294 cpl_image_unwrap(data);
295 cpl_image_delete(errors);
301 cpl_image * data = cpl_image_new(n, n, CPL_TYPE_FLOAT);
302 cpl_image * errors = cpl_image_new(n, n, CPL_TYPE_FLOAT);
303 cpl_image_reject(data, n, n);
304 cpl_image_reject(data, n, n - 1);
306 hdrl_kappa_sigma_clip_image(data, errors, 3, 3, 3,
307 &omean, &omean_err, &naccepted,
309 cpl_test_error(CPL_ERROR_NONE);
310 cpl_image_delete(data);
311 cpl_image_delete(errors);
314 return cpl_error_get_code();
323static cpl_error_code hdrl_clip_minmax_test(
void)
325 double omean, omean_err, nlow, nhigh, rej_low, rej_high;
330 double * dpixels = cpl_calloc(9,
sizeof(
double));
332 cpl_vector * data = cpl_vector_wrap(9, dpixels);
333 cpl_vector * errors = cpl_vector_new(9);
334 cpl_vector_fill(errors, 1);
337 hdrl_minmax_clip(data, errors, 3, 3, CPL_FALSE,
338 &omean, NULL, NULL, NULL, NULL);
339 cpl_test_error(CPL_ERROR_NONE);
341 cpl_test_eq(omean, 0.);
344 hdrl_minmax_clip(data, errors, 3, 3, CPL_FALSE,
345 NULL, NULL, NULL, NULL, NULL);
346 cpl_test_error(CPL_ERROR_NULL_INPUT);
349 hdrl_minmax_clip(NULL, errors, 3, 3, CPL_TRUE,
350 &omean, NULL, NULL, NULL, &rej_high);
351 cpl_test_error(CPL_ERROR_NULL_INPUT);
354 cpl_vector_delete(data);
355 cpl_vector_delete(errors);
359 double * dpixels = cpl_calloc(9,
sizeof(
double));
360 cpl_vector * data = cpl_vector_wrap(9, dpixels);
361 cpl_vector * errors = cpl_vector_new(9);
362 cpl_vector_fill(errors, 1);
365 hdrl_minmax_clip(data, errors, nlow, nhigh, CPL_FALSE,
366 &omean, &omean_err, &naccepted,
367 &rej_low, &rej_high);
368 cpl_test_error(CPL_ERROR_NONE);
370 cpl_test_eq(omean, 0.);
371 cpl_test_rel(omean_err, 1 / sqrt(9 - (nlow + nhigh)), 0.001);
372 cpl_test_eq(naccepted, 9 - (nlow + nhigh));
373 cpl_test_eq(rej_low, 0.);
374 cpl_test_eq(rej_high, 0.);
376 cpl_vector_delete(data);
377 cpl_vector_delete(errors);
383 double values[] = {10.};
384 const int n = ARRAY_LEN(values);
386 cpl_vector * data = cpl_vector_wrap(n, values);
387 cpl_vector * errors = cpl_vector_new(n);
388 cpl_vector_fill(errors, 1);
391 hdrl_minmax_clip(data, errors, nlow, nhigh, CPL_FALSE,
392 &omean, &omean_err, &naccepted,
394 cpl_test_error(CPL_ERROR_NONE);
396 cpl_test(isnan(omean));
397 cpl_test(isnan(omean_err));
398 cpl_test_eq(naccepted, 0);
399 cpl_test_eq(rej_low, 0);
401 cpl_vector_unwrap(data);
402 cpl_vector_delete(errors);
407 double values[] = {92, 93, 94, 94, 95, 95, 96, 96, 96, 97,
408 97, 97, 97, 98, 98, 98, 98, 99, 99, 99,
409 99, 100, 100, 100, 100, 100, 101, 101, 101, 101,
410 102, 102, 102, 102, 103, 103, 103, 103, 104, 104,
411 104, 105, 105, 106, 106, 107, 108 };
412 const int n = ARRAY_LEN(values);
414 cpl_vector * data = cpl_vector_wrap(n, values);
415 cpl_vector * errors = cpl_vector_new(n);
416 cpl_vector_fill(errors, 1);
420 hdrl_minmax_clip(data, errors, nlow, nhigh, CPL_FALSE,
421 &omean, &omean_err, &naccepted,
422 &rej_low, &rej_high);
423 cpl_test_error(CPL_ERROR_NONE);
425 cpl_test_rel(omean, 100., n * HDRL_EPS_DATA);
426 cpl_test_rel(omean_err, 1 / sqrt(n -(nlow + nhigh)), 0.001);
427 cpl_test_eq(rej_low, 92.);
428 cpl_test_eq(rej_high, 108);
429 cpl_test_eq(naccepted, n - (nlow + nhigh));
431 cpl_vector_unwrap(data);
432 cpl_vector_delete(errors);
437 double values[] = {92, 93, 94, 94, 95, 95, 96, 96, 96, 97,
438 97, 97, 97, 98, 98, 98, 98, 99, 99, 99,
439 99, 100, 100, 100, 100, 100, 101, 101, 101, 101,
440 102, 102, 102, 102, 103, 103, 103, 103, 104, 104,
441 104, 105, 105, 106, 106, 107, 108 };
442 const int n = ARRAY_LEN(values);
444 cpl_vector * data = cpl_vector_wrap(n, values);
445 cpl_vector * errors = cpl_vector_new(n);
446 cpl_vector_fill(errors, 1);
450 hdrl_minmax_clip(data, errors, nlow, nhigh, CPL_FALSE,
451 &omean, &omean_err, &naccepted,
452 &rej_low, &rej_high);
453 cpl_test_error(CPL_ERROR_NONE);
455 cpl_test_rel(omean, 100., 0.001);
456 cpl_test_rel(omean_err, 1 / sqrt(n -(nlow + nhigh)), 0.001);
458 cpl_test_eq(rej_low, 94.);
459 cpl_test_eq(rej_high, 106);
460 cpl_test_eq(naccepted, n - (nlow + nhigh));
462 cpl_vector_unwrap(data);
463 cpl_vector_delete(errors);
468 double values[] = {1, 150, 94, 94, 95, 95, 96, 96, 96, 97,
469 97, 97, 97, 98, 98, 98, 98, 99, 99, 99,
470 99, 100, 100, 100, 100, 100, 101, 101, 101, 101,
471 102, 102, 102, 102, 103, 103, 103, 103, 104, 104,
472 104, 105, 105, 106, 106, 107, 108 };
473 const int n = ARRAY_LEN(values);
475 cpl_vector * data = cpl_vector_wrap(n, values);
476 cpl_vector * errors = cpl_vector_new(n);
477 cpl_vector_fill(errors, 1);
480 hdrl_minmax_clip(data, errors, nlow, nhigh, CPL_FALSE,
481 &omean, &omean_err, &naccepted,
483 cpl_test_error(CPL_ERROR_NONE);
485 cpl_test_rel(omean, 100., 0.005);
486 cpl_test_rel(omean_err, 1 / sqrt(n - (nlow + nhigh)), 0.001);
487 cpl_test_eq(naccepted, n - (nlow + nhigh));
489 cpl_vector_unwrap(data);
490 cpl_vector_delete(errors);
495 double values[] = {54, 234. ,5,2, 343, 23 , 2, 0.21, 0.1232 , 1.2e3};
496 const int n = ARRAY_LEN(values);
498 cpl_vector * data = cpl_vector_wrap(n, values);
499 cpl_vector * errors = cpl_vector_duplicate(data);
500 cpl_vector * odata = cpl_vector_duplicate(data);
501 cpl_vector * oerrors = cpl_vector_duplicate(errors);
505 hdrl_minmax_clip(data, errors, nlow, nhigh, CPL_FALSE,
506 &omean, &omean_err, &naccepted,
507 &rej_low, &rej_high);
508 cpl_test_error(CPL_ERROR_NONE);
509 cpl_test_eq(rej_low, 2.);
510 cpl_test_eq(rej_high, 54.);
512 cpl_test_vector_abs(data, odata, 0.);
513 cpl_test_vector_abs(errors, oerrors, 0.);
515 cpl_vector_unwrap(data);
516 cpl_vector_delete(errors);
517 cpl_vector_delete(odata);
518 cpl_vector_delete(oerrors);
525 double values[] = {1, 150, 94, 94, 95, 95, 96, 96, 96, 97,
526 97, 97, 97, 98, 98, 98, 98, 99, 99, 99,
527 99, 100, 100, 100, 100, 100, 101, 101, 101, 101,
528 102, 102, 102, 102, 103, 103, 103, 103, 104, 104,
529 104, 105, 105, 106, 106, 107, 108, 100, -1000};
530 const int n = ARRAY_LEN(values);
532 cpl_image * data = cpl_image_wrap(sqrt(n), sqrt(n), CPL_TYPE_DOUBLE,
534 cpl_image * errors = cpl_image_new(sqrt(n), sqrt(n), CPL_TYPE_DOUBLE);
535 cpl_image_add_scalar(errors, 1);
539 hdrl_minmax_clip_image(data, errors, nlow, nhigh,
540 &omean, &omean_err, &naccepted,
542 cpl_test_error(CPL_ERROR_NONE);
544 cpl_test_rel(omean, 100., 0.005);
545 cpl_test_rel(omean_err, 1 / sqrt(n - (nlow + nhigh)), 0.001);
546 cpl_test_eq(naccepted, n - (nlow + nhigh));
548 cpl_image_unwrap(data);
549 cpl_image_delete(errors);
555 float values[] = {1, 150, 94, 94, 95, 95, 96, 96, 96, 97,
556 97, 97, 97, 98, 98, 98, 98, 99, 99, 99,
557 99, 100, 100, 100, 100, 100, 101, 101, 101, 101,
558 102, 102, 102, 102, 103, 103, 103, 103, 104, 104,
559 104, 105, 105, 106, 106, 107, 108, 100, 100};
560 const int n = sqrt(ARRAY_LEN(values));
562 cpl_image * data = cpl_image_wrap(n, n, CPL_TYPE_FLOAT, values);
563 cpl_image * errors = cpl_image_new(n, n, CPL_TYPE_FLOAT);
564 cpl_image_add_scalar(errors, 1);
569 cpl_image_reject(data, n, n);
570 cpl_image_reject(data, n, n - 1);
571 cpl_image_set(errors, n, n, 2343.e30);
572 cpl_image_set(errors, n, n - 1, 2343.e30);
573 cpl_image_reject_from_mask(errors, cpl_image_get_bpm(data));
575 hdrl_minmax_clip_image(data, errors, nlow, nhigh,
576 &omean, &omean_err, &naccepted,
578 cpl_test_error(CPL_ERROR_NONE);
581 cpl_test_rel(omean, 100., 0.005);
582 cpl_test_rel(omean_err, 1 / sqrt(n * n - (nlow + nhigh + 2)), 0.001);
583 cpl_test_eq(naccepted, (n * n) - (nlow + nhigh + 2));
585 cpl_image_unwrap(data);
586 cpl_image_delete(errors);
592 cpl_image * data = cpl_image_new(n, n, CPL_TYPE_FLOAT);
593 cpl_image * errors = cpl_image_new(n, n, CPL_TYPE_FLOAT);
594 cpl_image_reject(data, n, n);
595 cpl_image_reject(data, n, n - 1);
599 hdrl_minmax_clip_image(data, errors, nlow, nhigh,
600 &omean, &omean_err, &naccepted,
602 cpl_test_error(CPL_ERROR_NONE);
603 cpl_image_delete(data);
604 cpl_image_delete(errors);
608 float values[] = {-5., -5., -5., 1., 5., 1., 5., 1., 5., 5.};
609 float errors[] = {50., 500., 100., 1., 5., 1., 500., 1., 200.};
610 const int n = sqrt(ARRAY_LEN(values));
612 cpl_image * data = cpl_image_wrap(n, n, CPL_TYPE_FLOAT, values);
613 cpl_image * errs = cpl_image_wrap(n, n, CPL_TYPE_FLOAT, errors);
614 cpl_image * odata = cpl_image_duplicate(data);
615 cpl_image * oerrs = cpl_image_duplicate(errs);
617 hdrl_minmax_clip_image(data, errs, 2, 2,
618 &omean, &omean_err, &naccepted,
620 cpl_test_error(CPL_ERROR_NONE);
623 cpl_test_rel(omean, 0.6, 10 * HDRL_EPS_DATA);
624 cpl_test_rel(omean_err, sqrt((SQR(50.) + 1. * 3. + SQR(5.)) /
626 20 * HDRL_EPS_ERROR);
627 cpl_test_eq(naccepted, (n * n) - (4));
630 hdrl_minmax_clip_image(data, errs, 1, 2,
631 &omean, &omean_err, &naccepted,
633 cpl_test_error(CPL_ERROR_NONE);
636 hdrl_minmax_clip_image(data, errs, 2, 1,
637 &omean, &omean_err, &naccepted,
639 cpl_test_error(CPL_ERROR_NONE);
641 cpl_test_rel(omean, 8. / 6., 10 * HDRL_EPS_DATA);
642 cpl_test_rel(omean_err,
643 sqrt((SQR(50.) + SQR(200.) + 1. * 3. + SQR(5.)) /
645 20 * HDRL_EPS_ERROR);
646 cpl_test_eq(naccepted, (n * n) - (3));
649 hdrl_minmax_clip_image(data, errs, 1, 1,
650 &omean, &omean_err, &naccepted,
652 cpl_test_error(CPL_ERROR_NONE);
654 cpl_test_rel(omean, 3. / 7., 10 * HDRL_EPS_DATA);
655 cpl_test_rel(omean_err,
656 sqrt((SQR(50.) + SQR(100.) + SQR(200.) + 3. + SQR(5.)) /
658 20 * HDRL_EPS_ERROR);
659 cpl_test_eq(naccepted, (n * n) - (2));
663 cpl_image_set(odata, 1, 1, values[0]);
664 hdrl_minmax_clip_image(data, errs, 2, 2,
665 &omean, &omean_err, &naccepted,
667 cpl_test_error(CPL_ERROR_NONE);
669 cpl_test_rel(omean, 0.6, 10 * HDRL_EPS_DATA);
670 cpl_test_rel(omean_err, sqrt((SQR(100.) + 1. * 3. + SQR(5.)) /
672 20 * HDRL_EPS_ERROR);
673 cpl_test_eq(naccepted, (n * n) - (4));
676 cpl_test_image_abs(data, odata, 0);
677 cpl_test_image_abs(errs, oerrs, 0);
679 cpl_image_delete(odata);
680 cpl_image_delete(oerrs);
681 cpl_image_unwrap(data);
682 cpl_image_unwrap(errs);
685 return cpl_error_get_code();
699 cpl_test_init(PACKAGE_BUGREPORT, CPL_MSG_WARNING);
701 hdrl_clip_kappa_sigma_test();
702 hdrl_clip_minmax_test();
704 return cpl_test_end(0);