27#include "eris_ifu_error.h"
28#include "eris_ifu_vector.h"
29#include "eris_ifu_utils.h"
33#ifndef CPL_SORT_ASCENDING
34 #define CPL_SORT_ASCENDING 1
186 eris_ifu_vector *ev = NULL;
188 cpl_ensure(n >= 1, CPL_ERROR_ILLEGAL_INPUT, NULL);
193 ev = (eris_ifu_vector*)cpl_malloc(
sizeof(eris_ifu_vector)));
196 ev->data = cpl_vector_new(n));
199 cpl_vector_fill(ev->data, 0));
202 ev->mask = cpl_vector_new(n));
205 cpl_vector_fill(ev->mask, 1));
210 cpl_vector_delete(ev->data); ev->data = NULL;
211 cpl_vector_delete(ev->mask); ev->mask = NULL;
213 cpl_free(ev); ev = NULL;
242 eris_ifu_vector *ev = NULL;
243 cpl_vector *tmp = NULL;
244 double *pdata = NULL,
247 cpl_ensure(n >= 1, CPL_ERROR_ILLEGAL_INPUT, NULL);
252 ev = (eris_ifu_vector*)cpl_malloc(
sizeof(eris_ifu_vector)));
255 tmp = cpl_vector_wrap(n, (
double*) data));
257 ev->data = cpl_vector_duplicate(tmp));
258 cpl_vector_unwrap(tmp);
261 ev->mask = cpl_vector_new(n));
264 cpl_vector_fill(ev->mask, 1));
267 pdata = cpl_vector_get_data(ev->data));
269 pmask = cpl_vector_get_data(ev->mask));
270 for (
int i = 0; i < n; i++) {
280 cpl_vector_delete(ev->data); ev->data = NULL;
281 cpl_vector_delete(ev->mask); ev->mask = NULL;
283 cpl_free(ev); ev = NULL;
312 eris_ifu_vector *ev = NULL;
313 double *pdata = NULL,
317 cpl_ensure(data, CPL_ERROR_NULL_INPUT, NULL);
322 ev = (eris_ifu_vector*)cpl_malloc(
sizeof(eris_ifu_vector)));
325 ev->data = cpl_vector_duplicate(data));
327 n = cpl_vector_get_size(data);
330 ev->mask = cpl_vector_new(n));
333 cpl_vector_fill(ev->mask, 1));
336 pdata = cpl_vector_get_data(ev->data));
338 pmask = cpl_vector_get_data(ev->mask));
339 for (
int i = 0; i < cpl_vector_get_size(data); i++)
350 cpl_vector_delete(ev->data); ev->data = NULL;
351 cpl_vector_delete(ev->mask); ev->mask = NULL;
353 cpl_free(ev); ev = NULL;
391 const cpl_vector *mask)
393 eris_ifu_vector *ev = NULL;
394 double *pdata = NULL,
397 cpl_ensure(data, CPL_ERROR_NULL_INPUT, NULL);
398 cpl_ensure(mask, CPL_ERROR_NULL_INPUT, NULL);
399 cpl_ensure(cpl_vector_get_size(data) == cpl_vector_get_size(mask),
400 CPL_ERROR_ILLEGAL_INPUT, NULL);
405 ev = (eris_ifu_vector*)cpl_malloc(
sizeof(eris_ifu_vector)));
408 ev->data = cpl_vector_duplicate(data));
410 ev->mask = cpl_vector_duplicate(mask));
413 pdata = cpl_vector_get_data(ev->data));
415 pmask = cpl_vector_get_data(ev->mask));
417 for (
int i = 0; i < cpl_vector_get_size(data); i++)
422 }
else if (pmask[i] >= 0.5) {
438 cpl_vector_delete(ev->data); ev->data = NULL;
439 cpl_vector_delete(ev->mask); ev->mask = NULL;
441 cpl_free(ev); ev = NULL;
462 cpl_vector_delete(ev->data); ev->data = NULL;
463 cpl_vector_delete(ev->mask); ev->mask = NULL;
491 eris_ifu_vector *ev_dup = NULL;
493 cpl_ensure(ev, CPL_ERROR_NULL_INPUT, NULL);
498 ev_dup = (eris_ifu_vector*)cpl_malloc(
sizeof(eris_ifu_vector)));
500 ev_dup->data = cpl_vector_duplicate(ev->data);
503 ev_dup->mask = cpl_vector_duplicate(ev->mask);
508 if (ev_dup != NULL) {
509 cpl_vector_delete(ev_dup->data); ev_dup->data = NULL;
510 cpl_vector_delete(ev_dup->mask); ev_dup->mask = NULL;
512 cpl_free(ev_dup); ev_dup = NULL;
542 cpl_error_code err = CPL_ERROR_NONE;
544 cpl_ensure_code(ev, CPL_ERROR_NULL_INPUT);
545 cpl_ensure_code((pos >= 0) && (pos < cpl_vector_get_size(ev->data)),
546 CPL_ERROR_ACCESS_OUT_OF_RANGE);
550 cpl_vector_set(ev->data, pos, val);
552 cpl_vector_set(ev->mask, pos, 0.);
554 cpl_vector_set(ev->mask, pos, 1.);
559 err = cpl_error_get_code();
591 cpl_ensure_code(ev, CPL_ERROR_NULL_INPUT);
592 cpl_ensure_code((pos >= 0) && (pos < cpl_vector_get_size(ev->data)),
593 CPL_ERROR_ACCESS_OUT_OF_RANGE);
597 ret = cpl_vector_get(ev->data, pos);
599 if (cpl_vector_get(ev->mask, pos) > 0.5) {
665 cpl_vector *mask = NULL;
667 cpl_ensure(ev, CPL_ERROR_NULL_INPUT, NULL);
672 mask = cpl_vector_duplicate(ev->mask));
676 cpl_vector_delete(mask); mask = NULL;
702 cpl_ensure(ev, CPL_ERROR_NULL_INPUT, NULL);
704 cpl_vector *data = NULL;
709 data = cpl_vector_duplicate(ev->data));
713 cpl_vector_set(data, i, NAN));
719 cpl_vector_delete(data); data = NULL;
744 cpl_vector *mask = NULL;
746 cpl_ensure(ev, CPL_ERROR_NULL_INPUT, NULL);
784 const cpl_vector *mask,
787 int ret = CPL_ERROR_NONE,
789 double *pkvmask = NULL;
790 const double *pmask = NULL;
792 cpl_ensure_code(ev, CPL_ERROR_NULL_INPUT);
793 cpl_ensure_code(mask, CPL_ERROR_NULL_INPUT);
795 size = cpl_vector_get_size(ev->data);
797 cpl_ensure_code(size == cpl_vector_get_size(mask), CPL_ERROR_ILLEGAL_INPUT);
798 cpl_ensure_code((keep == 0) || (keep == 1), CPL_ERROR_ILLEGAL_INPUT);
803 pkvmask = cpl_vector_get_data(ev->mask));
805 pmask = cpl_vector_get_data_const(mask));
807 for (
int i = 0; i < size; i++) {
809 ((keep) && (pkvmask[i] > 0.5)))
811 pkvmask[i] = pmask[i];
818 ret = cpl_error_get_code();
841 double *pmask = NULL;
843 cpl_ensure_code(ev, CPL_ERROR_NULL_INPUT);
848 pmask = cpl_vector_get_data(ev->mask));
849 for (
int i = 0; i < cpl_vector_get_size(ev->mask); i++) {
882 double *pmask = NULL;
884 cpl_ensure_code(ev, CPL_ERROR_NULL_INPUT);
888 size = cpl_vector_get_size(ev->data);
891 pmask = cpl_vector_get_data(ev->mask));
892 for (
int i = 0; i < size; i++) {
929 cpl_ensure_code(ev, CPL_ERROR_NULL_INPUT);
930 cpl_ensure_code((n >= 0) && (n < cpl_vector_get_size(ev->data)),
931 CPL_ERROR_ACCESS_OUT_OF_RANGE);
935 if (cpl_vector_get(ev->mask, n) > 0.5) {
972 int ret = CPL_ERROR_NONE;
974 cpl_ensure_code(ev, CPL_ERROR_NULL_INPUT);
975 cpl_ensure_code((n >= 0) && (n < cpl_vector_get_size(ev->data)),
976 CPL_ERROR_ILLEGAL_INPUT);
981 cpl_vector_set(ev->mask, n, 0);
986 ret = cpl_error_get_code();
1017 eris_ifu_vector *ev_out = NULL;
1019 cpl_ensure(ev, CPL_ERROR_NULL_INPUT, NULL);
1020 cpl_ensure(istop > istart, CPL_ERROR_ILLEGAL_INPUT, NULL);
1025 ev_out = (eris_ifu_vector*)cpl_malloc(
sizeof(eris_ifu_vector)));
1028 ev_out->data = cpl_vector_extract(ev->data, istart, istop, 1));
1031 ev_out->mask = cpl_vector_extract(ev->mask, istart, istop, 1));
1035 if (ev_out != NULL) {
1036 cpl_vector_delete(ev_out->data); ev_out->data = NULL;
1037 cpl_vector_delete(ev_out->mask); ev_out->mask = NULL;
1039 cpl_free(ev_out); ev_out = NULL;
1071 const double *pkvmask = NULL,
1073 double *pret = NULL;
1074 cpl_vector *ret = NULL;
1076 cpl_ensure(ev, CPL_ERROR_NULL_INPUT, NULL);
1080 n = cpl_vector_get_size(ev->data);
1086 ret = cpl_vector_new(n-cnt));
1088 pret = cpl_vector_get_data(ret));
1090 pkvdata = cpl_vector_get_data_const(ev->data));
1092 pkvmask = cpl_vector_get_data_const(ev->mask));
1093 for (
int i = 0; i < n; i++) {
1094 if (pkvmask[i] > 0.5) {
1095 pret[j++] = pkvdata[i];
1102 cpl_vector_delete(ret); ret = NULL;
1130 eris_ifu_vector *kv2)
1132 cpl_error_code err = CPL_ERROR_NONE;
1134 double *pkv1mask = NULL,
1137 cpl_ensure_code(kv1, CPL_ERROR_NULL_INPUT);
1138 cpl_ensure_code(kv2, CPL_ERROR_NULL_INPUT);
1140 size = cpl_vector_get_size(kv1->data);
1142 cpl_ensure_code(size == cpl_vector_get_size(kv2->data),
1143 CPL_ERROR_ILLEGAL_INPUT);
1148 pkv1mask = cpl_vector_get_data(kv1->mask));
1150 pkv2mask = cpl_vector_get_data(kv2->mask));
1152 for (
int i = 0; i < size; i++) {
1153 if (pkv1mask[i] < 0.5) {
1155 }
else if (pkv2mask[i] < 0.5) {
1162 err = cpl_error_get_code();
1198 double *pkv1data = NULL,
1202 cpl_error_code err = CPL_ERROR_NONE;
1204 cpl_ensure_code(kv1, CPL_ERROR_NULL_INPUT);
1205 cpl_ensure_code(kv2, CPL_ERROR_NULL_INPUT);
1207 size = cpl_vector_get_size(kv1->data);
1209 cpl_ensure_code(size == cpl_vector_get_size(kv2->data),
1210 CPL_ERROR_ILLEGAL_INPUT);
1215 pkv1data = cpl_vector_get_data(kv1->data));
1217 pkv1mask = cpl_vector_get_data(kv1->mask));
1219 pkv2data = cpl_vector_get_data(kv2->data));
1221 pkv2mask = cpl_vector_get_data(kv2->mask));
1223 for (
int i = 0; i < size; i++) {
1224 if ((pkv1mask[i] > 0.5) && (pkv2mask[i] > 0.5)) {
1227 pkv1data[i] += pkv2data[i];
1241 err = cpl_error_get_code();
1275 const eris_ifu_vector *kv2)
1278 double *pkv1data = NULL,
1282 cpl_error_code err = CPL_ERROR_NONE;
1284 cpl_ensure_code(kv1, CPL_ERROR_NULL_INPUT);
1285 cpl_ensure_code(kv2, CPL_ERROR_NULL_INPUT);
1287 size = cpl_vector_get_size(kv1->data);
1289 cpl_ensure_code(size == cpl_vector_get_size(kv2->data),
1290 CPL_ERROR_ILLEGAL_INPUT);
1295 pkv1data = cpl_vector_get_data(kv1->data));
1297 pkv1mask = cpl_vector_get_data(kv1->mask));
1299 pkv2data = cpl_vector_get_data(kv2->data));
1301 pkv2mask = cpl_vector_get_data(kv2->mask));
1303 for (
int i = 0; i < size; i++) {
1304 if ((pkv1mask[i] > 0.5) && (pkv2mask[i] > 0.5)) {
1307 pkv1data[i] -= pkv2data[i];
1321 err = cpl_error_get_code();
1357 double *pkv1data = NULL,
1361 cpl_error_code err = CPL_ERROR_NONE;
1363 cpl_ensure_code(kv1, CPL_ERROR_NULL_INPUT);
1364 cpl_ensure_code(kv2, CPL_ERROR_NULL_INPUT);
1366 size = cpl_vector_get_size(kv1->data);
1368 cpl_ensure_code(size == cpl_vector_get_size(kv2->data),
1369 CPL_ERROR_ILLEGAL_INPUT);
1375 pkv1data = cpl_vector_get_data(kv1->data));
1377 pkv1mask = cpl_vector_get_data(kv1->mask));
1379 pkv2data = cpl_vector_get_data(kv2->data));
1381 pkv2mask = cpl_vector_get_data(kv2->mask));
1383 for (
int i = 0; i < size; i++) {
1384 if ((pkv1mask[i] > 0.5) && (pkv2mask[i] > 0.5)) {
1387 pkv1data[i] *= pkv2data[i];
1401 err = cpl_error_get_code();
1440 double *pkv1data = NULL,
1444 cpl_error_code err = CPL_ERROR_NONE;
1446 cpl_ensure_code(kv1, CPL_ERROR_NULL_INPUT);
1447 cpl_ensure_code(kv2, CPL_ERROR_NULL_INPUT);
1449 size = cpl_vector_get_size(kv1->data);
1451 cpl_ensure_code(size == cpl_vector_get_size(kv2->data),
1452 CPL_ERROR_ILLEGAL_INPUT);
1457 pkv1data = cpl_vector_get_data(kv1->data));
1459 pkv1mask = cpl_vector_get_data(kv1->mask));
1461 pkv2data = cpl_vector_get_data(kv2->data));
1463 pkv2mask = cpl_vector_get_data(kv2->mask));
1465 for (
int i = 0; i < size; i++) {
1466 if ((pkv1mask[i] > 0.5) && (pkv2mask[i] > 0.5)) {
1469 pkv1data[i] /= pkv2data[i];
1483 err = cpl_error_get_code();
1511 double *pkvmask = NULL,
1513 cpl_error_code err = CPL_ERROR_NONE;
1515 cpl_ensure_code(ev, CPL_ERROR_NULL_INPUT);
1519 n = cpl_vector_get_size(ev->data);
1523 pkvdata = cpl_vector_get_data(ev->data));
1525 pkvmask = cpl_vector_get_data(ev->mask));
1526 for (
int i = 0; i < n; i++) {
1527 if (pkvmask[i] > 0.5) {
1528 pkvdata[i] += addend;
1538 err = cpl_error_get_code();
1567 double *pkvmask = NULL,
1569 cpl_error_code err = CPL_ERROR_NONE;
1571 cpl_ensure_code(ev, CPL_ERROR_NULL_INPUT);
1575 n = cpl_vector_get_size(ev->data);
1579 pkvdata = cpl_vector_get_data(ev->data));
1581 pkvmask = cpl_vector_get_data(ev->mask));
1582 for (
int i = 0; i < n; i++) {
1583 if (pkvmask[i] > 0.5) {
1584 pkvdata[i] -= subtrahend;
1594 err = cpl_error_get_code();
1622 double *pkvmask = NULL,
1624 cpl_error_code err = CPL_ERROR_NONE;
1626 cpl_ensure_code(ev, CPL_ERROR_NULL_INPUT);
1630 n = cpl_vector_get_size(ev->data);
1634 pkvdata = cpl_vector_get_data(ev->data));
1636 pkvmask = cpl_vector_get_data(ev->mask));
1637 for (
int i = 0; i < n; i++) {
1638 if (pkvmask[i] > 0.5) {
1639 pkvdata[i] *= factor;
1649 err = cpl_error_get_code();
1677 double *pkvmask = NULL,
1679 cpl_error_code err = CPL_ERROR_NONE;
1681 cpl_ensure_code(ev, CPL_ERROR_NULL_INPUT);
1685 n = cpl_vector_get_size(ev->data);
1689 pkvdata = cpl_vector_get_data(ev->data));
1691 pkvmask = cpl_vector_get_data(ev->mask));
1692 for (
int i = 0; i < n; i++) {
1693 if (pkvmask[i] > 0.5) {
1694 pkvdata[i] /= dividend;
1704 err = cpl_error_get_code();
1732 cpl_error_code ret_error = CPL_ERROR_NONE;
1733 double *pkvdata = NULL,
1736 cpl_ensure_code(ev, CPL_ERROR_NULL_INPUT);
1741 pkvdata = cpl_vector_get_data(ev->data));
1743 pkvmask = cpl_vector_get_data(ev->mask));
1745 for (
int i = 0; i < cpl_vector_get_size(ev->data);i++) {
1746 if ((pkvmask[i] > 0.5) && (pkvdata[i] < 0.0)) {
1747 pkvdata[i] = -pkvdata[i];
1753 ret_error = cpl_error_get_code();
1780 cpl_ensure_code(ev, CPL_ERROR_NULL_INPUT);
1784 ret_val = cpl_vector_get_size(ev->data);
1815 cpl_vector *vec = NULL;
1818 cpl_ensure_code(ev, CPL_ERROR_NULL_INPUT);
1824 val = cpl_vector_get_mean(vec);
1832 cpl_vector_delete(vec); vec = NULL;
1867 cpl_vector *vec = NULL;
1871 cpl_ensure_code(ev, CPL_ERROR_NULL_INPUT);
1878 size = cpl_vector_get_size(vec);
1879 if ((type == ERIS_IFU_STATISTICAL) && ((size % 2) == 0)) {
1881 cpl_vector_sort(vec, CPL_SORT_ASCENDING);
1883 val = cpl_vector_get(vec, size/2 - 1);
1886 val = cpl_vector_get_median(vec);
1894 cpl_vector_delete(vec); vec = NULL;
1924 eris_ifu_vector *ret_vec = NULL;
1925 cpl_vector *vec = NULL,
1929 cpl_ensure(ev, CPL_ERROR_NULL_INPUT, NULL);
1930 cpl_ensure((percentage >= 0.0) && (percentage < 1.0),
1931 CPL_ERROR_ILLEGAL_INPUT, NULL);
1939 cpl_vector_sort(vec, CPL_SORT_ASCENDING);
1943 size = cpl_vector_get_size(vec);
1944 cpl_size tmp = (cpl_size)rint((1.-percentage)*(double)size-1.);
1946 cut_vec = cpl_vector_extract(vec, 0, tmp, 1));
1949 cpl_vector_delete(cut_vec);
1956 cpl_vector_delete(vec); vec = NULL;
1986 cpl_ensure_code(ev, CPL_ERROR_NULL_INPUT);
1990 n = cpl_vector_get_size(ev->data);
1994 pkvdata = cpl_vector_get_data(ev->data));
1996 pkvmask = cpl_vector_get_data(ev->mask));
1997 for (
int i = 0; i < n; i++) {
1998 if (pkvmask[i] > 0.5) {
2036 cpl_vector *vec = NULL;
2039 cpl_ensure_code(ev, CPL_ERROR_NULL_INPUT);
2045 val = cpl_vector_get_stdev(vec);
2053 cpl_vector_delete(vec); vec = NULL;
2091 cpl_ensure_code(ev, CPL_ERROR_NULL_INPUT);
2106 pkvdata = cpl_vector_get_data(ev->data));
2108 pkvmask = cpl_vector_get_data(ev->mask));
2109 for (
int i = 0; i < cpl_vector_get_size(ev->data); i++) {
2110 if (pkvmask[i] > 0.5) {
2111 stdev += pow(pkvdata[i]-median, 2);
2116 stdev = sqrt(stdev);
2147 double val = -DBL_MAX;
2148 const double *pkvdata = NULL,
2152 cpl_ensure_code(ev, CPL_ERROR_NULL_INPUT);
2157 pkvdata = cpl_vector_get_data_const(ev->data));
2159 pkvmask = cpl_vector_get_data_const(ev->mask));
2161 n = cpl_vector_get_size(ev->data);
2168 for (
int i = 0; i < n; i++) {
2169 if ((pkvmask[i] > 0.5) && (val < pkvdata[i])) {
2211 double val = DBL_MAX;
2212 const double *pkvdata = NULL,
2216 cpl_ensure_code(ev, CPL_ERROR_NULL_INPUT);
2221 pkvdata = cpl_vector_get_data_const(ev->data));
2223 pkvmask = cpl_vector_get_data_const(ev->mask));
2225 n = cpl_vector_get_size(ev->data);
2232 for (
int i = 0; i < n; i++) {
2233 if ((pkvmask[i] > 0.5) && (val > pkvdata[i])) {
2282 double *pkvmask = NULL,
2284 cpl_error_code err = CPL_ERROR_NONE;
2286 cpl_ensure_code(ev, CPL_ERROR_NULL_INPUT);
2290 if (exponent == 0.0) {
2298 n = cpl_vector_get_size(ev->data);
2302 pkvdata = cpl_vector_get_data(ev->data));
2304 pkvmask = cpl_vector_get_data(ev->mask));
2305 for (
int i = 0; i < n; i++) {
2306 if (pkvmask[i] > 0.5) {
2307 pkvdata[i] = pow(pkvdata[i], exponent);
2318 err = cpl_error_get_code();
2348 cpl_error_code err = CPL_ERROR_NONE;
2350 cpl_ensure_code(ev, CPL_ERROR_NULL_INPUT);
2360 err = cpl_error_get_code();
2388 cpl_error_code ret_error = CPL_ERROR_NONE;
2389 double *pkvdata = NULL,
2395 cpl_ensure_code(ev, CPL_ERROR_NULL_INPUT);
2400 pkvdata = cpl_vector_get_data(ev->data));
2402 pkvmask = cpl_vector_get_data(ev->mask));
2404 size = cpl_vector_get_size(ev->data);
2405 half_size = floor(size / 2);
2407 for (
int i = 0; i < half_size;i++) {
2408 tmp_dbl = pkvdata[i];
2409 pkvdata[i] = pkvdata[size-1-i];
2410 pkvdata[size-1-i] = tmp_dbl;
2412 tmp_dbl = pkvmask[i];
2413 pkvmask[i] = pkvmask[size-1-i];
2414 pkvmask[size-1-i] = tmp_dbl;
2419 ret_error = cpl_error_get_code();
2453 const double *pkvdata = NULL,
2455 double *phdata = NULL,
2459 eris_ifu_vector *h = NULL;
2461 cpl_ensure(ev, CPL_ERROR_NULL_INPUT, NULL);
2462 cpl_ensure(nbins > 0, CPL_ERROR_NULL_INPUT, NULL);
2470 binwidth = (hmax - hmin) / (nbins - 1);
2473 pkvdata = cpl_vector_get_data_const(ev->data));
2475 pkvmask = cpl_vector_get_data_const(ev->mask));
2480 phdata = cpl_vector_get_data(h->data));
2482 for (
int i = 0; i < cpl_vector_get_size(ev->data); i++) {
2483 if (pkvmask[i] > 0.5) {
2484 pos = floor((pkvdata[i] - hmin) / binwidth);
2513 cpl_vector *vec = NULL;
2514 eris_ifu_vector *ev = NULL;
2518 vec = cpl_vector_load(filename, position);
2519 if (cpl_error_get_code() != CPL_ERROR_NONE) {
2520 if (cpl_error_get_code() == CPL_ERROR_FILE_IO) {
2521 cpl_msg_error(
"",
"File not found: %s", filename);
2523 cpl_msg_error(
"",
"Problem loading file '%s' (%s --> Code %d)",
2524 filename, cpl_error_get_message(),
2525 cpl_error_get_code());
2532 cpl_vector_delete(vec);
2562 const char *filename,
2564 const cpl_propertylist *pl,
2568 cpl_error_code err = CPL_ERROR_NONE;
2569 eris_ifu_vector *ev_dup = NULL;
2570 double *pkvdata = NULL,
2574 cpl_ensure_code(ev, CPL_ERROR_NULL_INPUT);
2583 pkvdata = cpl_vector_get_data(ev_dup->data));
2585 pkvmask = cpl_vector_get_data(ev_dup->mask));
2586 n = cpl_vector_get_size(ev_dup->data);
2587 for (
int i = 0; i < n; i++) {
2588 if (pkvmask[i] < 0.5) {
2589 pkvdata[i] = rej_val;
2593 err = cpl_vector_save(ev_dup->data, filename, bpp, pl, mode);
2596 err = cpl_vector_save(ev->data, filename, bpp, pl, mode);
2603 err = cpl_error_get_code();
2622 cpl_error_code err = CPL_ERROR_NONE;
2623 const double *pkvdata = NULL,
2629 cpl_msg_debug(
"",
" ====== START KMCLIPM_VECTOR ======");
2630 cpl_msg_debug(
"",
" empty vector");
2631 cpl_msg_debug(
"",
" ====== END KMCLIPM_VECTOR ========");
2633 n = cpl_vector_get_size(ev->data);
2635 if (n != cpl_vector_get_size(ev->mask)) {
2637 "data and mask not of same size!");
2641 pkvdata = cpl_vector_get_data_const(ev->data));
2643 pkvmask = cpl_vector_get_data_const(ev->mask));
2645 cpl_msg_debug(
"",
" ====== START KMCLIPM_VECTOR ======");
2646 cpl_msg_debug(
"",
" #\tdata:\tmask:");
2647 cpl_msg_debug(
"",
" ---------------------");
2648 for (
int i = 0; i < n; i++) {
2649 cpl_msg_debug(
"",
" %d\t%g\t%g", i, pkvdata[i], pkvmask[i]);
2651 cpl_msg_debug(
"",
" ====== END KMCLIPM_VECTOR ========");
2657 err = cpl_error_get_code();
2673 return (isnan(A) || (isinf(A)==1) || (isinf(A)==-1));
2687 double *pkvmask = NULL,
2689 cpl_error_code err = CPL_ERROR_NONE;
2691 cpl_ensure_code(ev, CPL_ERROR_NULL_INPUT);
2695 n = cpl_vector_get_size(ev->data);
2699 pkvdata = cpl_vector_get_data(ev->data));
2701 pkvmask = cpl_vector_get_data(ev->mask));
2704 for (
int i = 0; i < n; i++) {
2705 if (pkvmask[i] > 0.5) {
2709 cpl_ensure_code(pkvdata[i] >= 0, CPL_ERROR_ILLEGAL_INPUT);
2711 pkvdata[i] = sqrt(pkvdata[i]);
2722 err = cpl_error_get_code();
#define BRK_WITH_ERROR(code)
Set a new CPL error, and exit the try-block.
#define BRK_IF_ERROR(function)
If function is or returns an error != CPL_ERROR_NONE, then the try-block is exited.
#define CHECK_ERROR_STATE(void)
Check the CPL error state, and exit the try-block if not CPL_ERROR_NONE.
#define BRK_WITH_ERROR_MSG(code,...)
Set a new CPL error, and exit the try-block.
#define TRY
Beginning of a TRY-block.
#define CATCH
End of a TRY-block, beginning of a CATCH-block.
#define BRK_IF_NULL(function)
If function is or returns a NULL pointer, then the try-block is exited.
cpl_error_code eris_ifu_vector_reject_from_mask(eris_ifu_vector *ev, const cpl_vector *mask, int keep)
Set the rejected elements in an eris_ifu_vector as defined in a mask.
eris_ifu_vector * eris_ifu_vector_cut_percentian(const eris_ifu_vector *ev, double percentage)
Remove a certain percentage of brightest pixels.
eris_ifu_vector * eris_ifu_vector_create2(const cpl_vector *data, const cpl_vector *mask)
Create a new eris_ifu_vector out of a data and mask cpl_vector.
eris_ifu_vector * eris_ifu_vector_histogram(const eris_ifu_vector *ev, int nbins)
Calculates the histogram of a vector.
double eris_ifu_vector_get_stdev_median(const eris_ifu_vector *ev)
Compute the bias-corrected standard deviation using median instead of mean.
cpl_error_code eris_ifu_vector_save(const eris_ifu_vector *ev, const char *filename, cpl_type_bpp bpp, const cpl_propertylist *pl, unsigned mode, double rej_val)
Override for cpl_vector_save().
int eris_ifu_is_nan_or_inf(double A)
Checks if a value is nan, inf or -inf.
eris_ifu_vector * eris_ifu_vector_new(int n)
Create a new eris_ifu_vector.
double eris_ifu_vector_get_rej(const eris_ifu_vector *ev, int pos, int *rej)
Get an element of the eris_ifu_vector.
int eris_ifu_vector_get_size(const eris_ifu_vector *ev)
Get the size of the eris_ifu_vector.
cpl_error_code eris_ifu_vector_multiply_scalar(eris_ifu_vector *ev, double factor)
Elementwise multiplication of a scalar to a eris_ifu_vector.
int eris_ifu_vector_count_non_rejected(const eris_ifu_vector *ev)
Count the number of non-rejected elements in a eris_ifu_vector.
int eris_ifu_vector_is_rejected(const eris_ifu_vector *ev, int n)
Test if a value is good or bad.
cpl_error_code eris_ifu_vector_flip(eris_ifu_vector *ev)
Flip the values of a vector.
cpl_error_code eris_ifu_vector_subtract(eris_ifu_vector *kv1, const eris_ifu_vector *kv2)
Subtract two eris_ifu_vectors.
cpl_error_code eris_ifu_vector_dump(const eris_ifu_vector *ev)
All values contained in vec are printed for debugging purposes.
cpl_error_code eris_ifu_vector_multiply(eris_ifu_vector *kv1, const eris_ifu_vector *kv2)
Multiply two eris_ifu_vectors.
cpl_vector * eris_ifu_vector_get_mask(const eris_ifu_vector *ev)
Get a copy of the mask of eris_ifu_vector.
cpl_error_code eris_ifu_vector_set(eris_ifu_vector *ev, int pos, double val)
Set an element of the eris_ifu_vector.
cpl_error_code eris_ifu_vector_abs(eris_ifu_vector *ev)
Calculates the absolute value of a vector in-place.
eris_ifu_vector * eris_ifu_vector_duplicate(const eris_ifu_vector *ev)
This function duplicates an existing eris_ifu_vector and allocates memory.
cpl_error_code eris_ifu_vector_fill(eris_ifu_vector *ev, double val)
Fill a eris_ifu_vector.
double eris_ifu_vector_get_min(const eris_ifu_vector *ev, int *pos)
Get the minimum of the eris_ifu_vector and its position.
eris_ifu_vector * eris_ifu_vector_new_wrap(int n, const double *data)
Create a new eris_ifu_vector from a C array (duplicated).
eris_ifu_vector * eris_ifu_vector_extract(const eris_ifu_vector *ev, int istart, int istop)
Extract a sub-vector from a eris_ifu_vector.
cpl_error_code eris_ifu_vector_sqrt(eris_ifu_vector *ev)
eris_ifu_vector_sqrt
cpl_error_code eris_ifu_vector_power(eris_ifu_vector *ev, double exponent)
Compute the elementwise power of the vector.
double eris_ifu_vector_get_max(const eris_ifu_vector *ev, int *pos)
Get the maximum of the eris_ifu_vector and its position.
cpl_vector * eris_ifu_vector_get_bpm(eris_ifu_vector *ev)
Get the pointer to the mask of the eris_ifu_vector.
double eris_ifu_vector_get_stdev(const eris_ifu_vector *ev)
Compute the bias-corrected standard deviation of a vector's elements.
cpl_error_code eris_ifu_vector_subtract_scalar(eris_ifu_vector *ev, double subtrahend)
Elementwise subtraction of a scalar from a eris_ifu_vector.
cpl_error_code eris_ifu_vector_adapt_rejected(eris_ifu_vector *kv1, eris_ifu_vector *kv2)
Assert that rejected values on both vectors are the same.
double eris_ifu_vector_get(const eris_ifu_vector *ev, int pos)
Get an element of the eris_ifu_vector.
cpl_error_code eris_ifu_vector_add_scalar(eris_ifu_vector *ev, double addend)
Elementwise addition of a scalar to a eris_ifu_vector.
medianType
The type of median behavior: For an odd number of samples the behaviour is the same for both methods....
int eris_ifu_vector_count_rejected(const eris_ifu_vector *ev)
Count the number of rejected elements in a eris_ifu_vector.
cpl_error_code eris_ifu_vector_reject(eris_ifu_vector *ev, int n)
Set a value as rejected in a eris_ifu_vector.
cpl_vector * eris_ifu_vector_get_data(const eris_ifu_vector *ev)
Get a copy of the data, rejected values are set to NaN.
double eris_ifu_vector_get_sum(const eris_ifu_vector *ev)
Compute the sum of non-rejected eris_ifu_vector elements.
double eris_ifu_vector_get_median(const eris_ifu_vector *ev, const enum medianType type)
Compute the median of the elements of a vector.
cpl_error_code eris_ifu_vector_add(eris_ifu_vector *kv1, const eris_ifu_vector *kv2)
Add a eris_ifu_vector to another.
cpl_vector * eris_ifu_vector_create_non_rejected(const eris_ifu_vector *ev)
Creates a cpl_vector out of a eris_ifu_vector with non-rejected values.
cpl_error_code eris_ifu_vector_divide_scalar(eris_ifu_vector *ev, double dividend)
Elementwise division of a eris_ifu_vector by a scalar.
void eris_ifu_vector_delete(eris_ifu_vector *ev)
Delete a eris_ifu_vector.
eris_ifu_vector * eris_ifu_vector_load(const char *filename, int position)
Override for cpl_vector_load().
eris_ifu_vector * eris_ifu_vector_create(const cpl_vector *data)
Create a new eris_ifu_vector out of a data cpl_vector.
cpl_error_code eris_ifu_vector_divide(eris_ifu_vector *kv1, const eris_ifu_vector *kv2)
Divide two eris_ifu_vectors element-wise.
double eris_ifu_vector_get_mean(const eris_ifu_vector *ev)
Compute the mean value of non-rejected eris_ifu_vector elements.