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
58 eris_ifu_vector *ev = NULL;
60 cpl_ensure(n >= 1, CPL_ERROR_ILLEGAL_INPUT, NULL);
65 ev = (eris_ifu_vector*)cpl_malloc(
sizeof(eris_ifu_vector)));
68 ev->data = cpl_vector_new(n));
71 cpl_vector_fill(ev->data, 0));
74 ev->mask = cpl_vector_new(n));
77 cpl_vector_fill(ev->mask, 1));
82 cpl_vector_delete(ev->data); ev->data = NULL;
83 cpl_vector_delete(ev->mask); ev->mask = NULL;
85 cpl_free(ev); ev = NULL;
110 eris_ifu_vector *ev = NULL;
111 cpl_vector *tmp = NULL;
112 double *pdata = NULL,
115 cpl_ensure(n >= 1, CPL_ERROR_ILLEGAL_INPUT, NULL);
120 ev = (eris_ifu_vector*)cpl_malloc(
sizeof(eris_ifu_vector)));
123 tmp = cpl_vector_wrap(n, (
double*) data));
125 ev->data = cpl_vector_duplicate(tmp));
126 cpl_vector_unwrap(tmp);
129 ev->mask = cpl_vector_new(n));
132 cpl_vector_fill(ev->mask, 1));
135 pdata = cpl_vector_get_data(ev->data));
137 pmask = cpl_vector_get_data(ev->mask));
138 for (
int i = 0; i < n; i++) {
148 cpl_vector_delete(ev->data); ev->data = NULL;
149 cpl_vector_delete(ev->mask); ev->mask = NULL;
151 cpl_free(ev); ev = NULL;
177 eris_ifu_vector *ev = NULL;
178 double *pdata = NULL,
182 cpl_ensure(data, CPL_ERROR_NULL_INPUT, NULL);
187 ev = (eris_ifu_vector*)cpl_malloc(
sizeof(eris_ifu_vector)));
190 ev->data = cpl_vector_duplicate(data));
192 n = cpl_vector_get_size(data);
195 ev->mask = cpl_vector_new(n));
198 cpl_vector_fill(ev->mask, 1));
201 pdata = cpl_vector_get_data(ev->data));
203 pmask = cpl_vector_get_data(ev->mask));
204 for (
int i = 0; i < cpl_vector_get_size(data); i++)
215 cpl_vector_delete(ev->data); ev->data = NULL;
216 cpl_vector_delete(ev->mask); ev->mask = NULL;
218 cpl_free(ev); ev = NULL;
246 const cpl_vector *mask)
248 eris_ifu_vector *ev = NULL;
249 double *pdata = NULL,
252 cpl_ensure(data, CPL_ERROR_NULL_INPUT, NULL);
253 cpl_ensure(mask, CPL_ERROR_NULL_INPUT, NULL);
254 cpl_ensure(cpl_vector_get_size(data) == cpl_vector_get_size(mask),
255 CPL_ERROR_ILLEGAL_INPUT, NULL);
260 ev = (eris_ifu_vector*)cpl_malloc(
sizeof(eris_ifu_vector)));
263 ev->data = cpl_vector_duplicate(data));
265 ev->mask = cpl_vector_duplicate(mask));
268 pdata = cpl_vector_get_data(ev->data));
270 pmask = cpl_vector_get_data(ev->mask));
272 for (
int i = 0; i < cpl_vector_get_size(data); i++)
277 }
else if (pmask[i] >= 0.5) {
293 cpl_vector_delete(ev->data); ev->data = NULL;
294 cpl_vector_delete(ev->mask); ev->mask = NULL;
296 cpl_free(ev); ev = NULL;
315 cpl_vector_delete(ev->data); ev->data = NULL;
316 cpl_vector_delete(ev->mask); ev->mask = NULL;
341 eris_ifu_vector *ev_dup = NULL;
343 cpl_ensure(ev, CPL_ERROR_NULL_INPUT, NULL);
348 ev_dup = (eris_ifu_vector*)cpl_malloc(
sizeof(eris_ifu_vector)));
350 ev_dup->data = cpl_vector_duplicate(ev->data);
353 ev_dup->mask = cpl_vector_duplicate(ev->mask);
358 if (ev_dup != NULL) {
359 cpl_vector_delete(ev_dup->data); ev_dup->data = NULL;
360 cpl_vector_delete(ev_dup->mask); ev_dup->mask = NULL;
362 cpl_free(ev_dup); ev_dup = NULL;
388 cpl_error_code err = CPL_ERROR_NONE;
390 cpl_ensure_code(ev, CPL_ERROR_NULL_INPUT);
391 cpl_ensure_code((pos >= 0) && (pos < cpl_vector_get_size(ev->data)),
392 CPL_ERROR_ACCESS_OUT_OF_RANGE);
396 cpl_vector_set(ev->data, pos, val);
398 cpl_vector_set(ev->mask, pos, 0.);
400 cpl_vector_set(ev->mask, pos, 1.);
405 err = cpl_error_get_code();
433 cpl_ensure_code(ev, CPL_ERROR_NULL_INPUT);
434 cpl_ensure_code((pos >= 0) && (pos < cpl_vector_get_size(ev->data)),
435 CPL_ERROR_ACCESS_OUT_OF_RANGE);
439 ret = cpl_vector_get(ev->data, pos);
441 if (cpl_vector_get(ev->mask, pos) > 0.5) {
503 cpl_vector *mask = NULL;
505 cpl_ensure(ev, CPL_ERROR_NULL_INPUT, NULL);
510 mask = cpl_vector_duplicate(ev->mask));
514 cpl_vector_delete(mask); mask = NULL;
537 cpl_ensure(ev, CPL_ERROR_NULL_INPUT, NULL);
539 cpl_vector *data = NULL;
544 data = cpl_vector_duplicate(ev->data));
548 cpl_vector_set(data, i, NAN));
554 cpl_vector_delete(data); data = NULL;
577 cpl_vector *mask = NULL;
579 cpl_ensure(ev, CPL_ERROR_NULL_INPUT, NULL);
610 const cpl_vector *mask,
613 int ret = CPL_ERROR_NONE,
615 double *pkvmask = NULL;
616 const double *pmask = NULL;
618 cpl_ensure_code(ev, CPL_ERROR_NULL_INPUT);
619 cpl_ensure_code(mask, CPL_ERROR_NULL_INPUT);
621 size = cpl_vector_get_size(ev->data);
623 cpl_ensure_code(size == cpl_vector_get_size(mask), CPL_ERROR_ILLEGAL_INPUT);
624 cpl_ensure_code((keep == 0) || (keep == 1), CPL_ERROR_ILLEGAL_INPUT);
629 pkvmask = cpl_vector_get_data(ev->mask));
631 pmask = cpl_vector_get_data_const(mask));
633 for (
int i = 0; i < size; i++) {
635 ((keep) && (pkvmask[i] > 0.5)))
637 pkvmask[i] = pmask[i];
644 ret = cpl_error_get_code();
665 double *pmask = NULL;
667 cpl_ensure_code(ev, CPL_ERROR_NULL_INPUT);
672 pmask = cpl_vector_get_data(ev->mask));
673 for (
int i = 0; i < cpl_vector_get_size(ev->mask); i++) {
703 double *pmask = NULL;
705 cpl_ensure_code(ev, CPL_ERROR_NULL_INPUT);
709 size = cpl_vector_get_size(ev->data);
712 pmask = cpl_vector_get_data(ev->mask));
713 for (
int i = 0; i < size; i++) {
748 cpl_ensure_code(ev, CPL_ERROR_NULL_INPUT);
749 cpl_ensure_code((n >= 0) && (n < cpl_vector_get_size(ev->data)),
750 CPL_ERROR_ACCESS_OUT_OF_RANGE);
754 if (cpl_vector_get(ev->mask, n) > 0.5) {
785 int ret = CPL_ERROR_NONE;
787 cpl_ensure_code(ev, CPL_ERROR_NULL_INPUT);
788 cpl_ensure_code((n >= 0) && (n < cpl_vector_get_size(ev->data)),
789 CPL_ERROR_ILLEGAL_INPUT);
794 cpl_vector_set(ev->mask, n, 0);
799 ret = cpl_error_get_code();
826 eris_ifu_vector *ev_out = NULL;
828 cpl_ensure(ev, CPL_ERROR_NULL_INPUT, NULL);
829 cpl_ensure(istop > istart, CPL_ERROR_ILLEGAL_INPUT, NULL);
834 ev_out = (eris_ifu_vector*)cpl_malloc(
sizeof(eris_ifu_vector)));
837 ev_out->data = cpl_vector_extract(ev->data, istart, istop, 1));
840 ev_out->mask = cpl_vector_extract(ev->mask, istart, istop, 1));
844 if (ev_out != NULL) {
845 cpl_vector_delete(ev_out->data); ev_out->data = NULL;
846 cpl_vector_delete(ev_out->mask); ev_out->mask = NULL;
848 cpl_free(ev_out); ev_out = NULL;
875 const double *pkvmask = NULL,
878 cpl_vector *ret = NULL;
880 cpl_ensure(ev, CPL_ERROR_NULL_INPUT, NULL);
884 n = cpl_vector_get_size(ev->data);
890 ret = cpl_vector_new(n-cnt));
892 pret = cpl_vector_get_data(ret));
894 pkvdata = cpl_vector_get_data_const(ev->data));
896 pkvmask = cpl_vector_get_data_const(ev->mask));
897 for (
int i = 0; i < n; i++) {
898 if (pkvmask[i] > 0.5) {
899 pret[j++] = pkvdata[i];
906 cpl_vector_delete(ret); ret = NULL;
930 eris_ifu_vector *kv2)
932 cpl_error_code err = CPL_ERROR_NONE;
934 double *pkv1mask = NULL,
937 cpl_ensure_code(kv1, CPL_ERROR_NULL_INPUT);
938 cpl_ensure_code(kv2, CPL_ERROR_NULL_INPUT);
940 size = cpl_vector_get_size(kv1->data);
942 cpl_ensure_code(size == cpl_vector_get_size(kv2->data),
943 CPL_ERROR_ILLEGAL_INPUT);
948 pkv1mask = cpl_vector_get_data(kv1->mask));
950 pkv2mask = cpl_vector_get_data(kv2->mask));
952 for (
int i = 0; i < size; i++) {
953 if (pkv1mask[i] < 0.5) {
955 }
else if (pkv2mask[i] < 0.5) {
962 err = cpl_error_get_code();
989 double *pkv1data = NULL,
993 cpl_error_code err = CPL_ERROR_NONE;
995 cpl_ensure_code(kv1, CPL_ERROR_NULL_INPUT);
996 cpl_ensure_code(kv2, CPL_ERROR_NULL_INPUT);
998 size = cpl_vector_get_size(kv1->data);
1000 cpl_ensure_code(size == cpl_vector_get_size(kv2->data),
1001 CPL_ERROR_ILLEGAL_INPUT);
1006 pkv1data = cpl_vector_get_data(kv1->data));
1008 pkv1mask = cpl_vector_get_data(kv1->mask));
1010 pkv2data = cpl_vector_get_data(kv2->data));
1012 pkv2mask = cpl_vector_get_data(kv2->mask));
1014 for (
int i = 0; i < size; i++) {
1015 if ((pkv1mask[i] > 0.5) && (pkv2mask[i] > 0.5)) {
1018 pkv1data[i] += pkv2data[i];
1032 err = cpl_error_get_code();
1058 const eris_ifu_vector *kv2)
1061 double *pkv1data = NULL,
1065 cpl_error_code err = CPL_ERROR_NONE;
1067 cpl_ensure_code(kv1, CPL_ERROR_NULL_INPUT);
1068 cpl_ensure_code(kv2, CPL_ERROR_NULL_INPUT);
1070 size = cpl_vector_get_size(kv1->data);
1072 cpl_ensure_code(size == cpl_vector_get_size(kv2->data),
1073 CPL_ERROR_ILLEGAL_INPUT);
1078 pkv1data = cpl_vector_get_data(kv1->data));
1080 pkv1mask = cpl_vector_get_data(kv1->mask));
1082 pkv2data = cpl_vector_get_data(kv2->data));
1084 pkv2mask = cpl_vector_get_data(kv2->mask));
1086 for (
int i = 0; i < size; i++) {
1087 if ((pkv1mask[i] > 0.5) && (pkv2mask[i] > 0.5)) {
1090 pkv1data[i] -= pkv2data[i];
1104 err = cpl_error_get_code();
1131 double *pkv1data = NULL,
1135 cpl_error_code err = CPL_ERROR_NONE;
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);
1149 pkv1data = cpl_vector_get_data(kv1->data));
1151 pkv1mask = cpl_vector_get_data(kv1->mask));
1153 pkv2data = cpl_vector_get_data(kv2->data));
1155 pkv2mask = cpl_vector_get_data(kv2->mask));
1157 for (
int i = 0; i < size; i++) {
1158 if ((pkv1mask[i] > 0.5) && (pkv2mask[i] > 0.5)) {
1161 pkv1data[i] *= pkv2data[i];
1175 err = cpl_error_get_code();
1204 double *pkv1data = NULL,
1208 cpl_error_code err = CPL_ERROR_NONE;
1210 cpl_ensure_code(kv1, CPL_ERROR_NULL_INPUT);
1211 cpl_ensure_code(kv2, CPL_ERROR_NULL_INPUT);
1213 size = cpl_vector_get_size(kv1->data);
1215 cpl_ensure_code(size == cpl_vector_get_size(kv2->data),
1216 CPL_ERROR_ILLEGAL_INPUT);
1221 pkv1data = cpl_vector_get_data(kv1->data));
1223 pkv1mask = cpl_vector_get_data(kv1->mask));
1225 pkv2data = cpl_vector_get_data(kv2->data));
1227 pkv2mask = cpl_vector_get_data(kv2->mask));
1229 for (
int i = 0; i < size; i++) {
1230 if ((pkv1mask[i] > 0.5) && (pkv2mask[i] > 0.5)) {
1233 pkv1data[i] /= pkv2data[i];
1247 err = cpl_error_get_code();
1271 double *pkvmask = NULL,
1273 cpl_error_code err = CPL_ERROR_NONE;
1275 cpl_ensure_code(ev, CPL_ERROR_NULL_INPUT);
1279 n = cpl_vector_get_size(ev->data);
1283 pkvdata = cpl_vector_get_data(ev->data));
1285 pkvmask = cpl_vector_get_data(ev->mask));
1286 for (
int i = 0; i < n; i++) {
1287 if (pkvmask[i] > 0.5) {
1288 pkvdata[i] += addend;
1298 err = cpl_error_get_code();
1323 double *pkvmask = NULL,
1325 cpl_error_code err = CPL_ERROR_NONE;
1327 cpl_ensure_code(ev, CPL_ERROR_NULL_INPUT);
1331 n = cpl_vector_get_size(ev->data);
1335 pkvdata = cpl_vector_get_data(ev->data));
1337 pkvmask = cpl_vector_get_data(ev->mask));
1338 for (
int i = 0; i < n; i++) {
1339 if (pkvmask[i] > 0.5) {
1340 pkvdata[i] -= subtrahend;
1350 err = cpl_error_get_code();
1374 double *pkvmask = NULL,
1376 cpl_error_code err = CPL_ERROR_NONE;
1378 cpl_ensure_code(ev, CPL_ERROR_NULL_INPUT);
1382 n = cpl_vector_get_size(ev->data);
1386 pkvdata = cpl_vector_get_data(ev->data));
1388 pkvmask = cpl_vector_get_data(ev->mask));
1389 for (
int i = 0; i < n; i++) {
1390 if (pkvmask[i] > 0.5) {
1391 pkvdata[i] *= factor;
1401 err = cpl_error_get_code();
1425 double *pkvmask = NULL,
1427 cpl_error_code err = CPL_ERROR_NONE;
1429 cpl_ensure_code(ev, CPL_ERROR_NULL_INPUT);
1433 n = cpl_vector_get_size(ev->data);
1437 pkvdata = cpl_vector_get_data(ev->data));
1439 pkvmask = cpl_vector_get_data(ev->mask));
1440 for (
int i = 0; i < n; i++) {
1441 if (pkvmask[i] > 0.5) {
1442 pkvdata[i] /= dividend;
1452 err = cpl_error_get_code();
1477 cpl_error_code ret_error = CPL_ERROR_NONE;
1478 double *pkvdata = NULL,
1481 cpl_ensure_code(ev, CPL_ERROR_NULL_INPUT);
1486 pkvdata = cpl_vector_get_data(ev->data));
1488 pkvmask = cpl_vector_get_data(ev->mask));
1490 for (
int i = 0; i < cpl_vector_get_size(ev->data);i++) {
1491 if ((pkvmask[i] > 0.5) && (pkvdata[i] < 0.0)) {
1492 pkvdata[i] = -pkvdata[i];
1498 ret_error = cpl_error_get_code();
1520 cpl_ensure_code(ev, CPL_ERROR_NULL_INPUT);
1524 ret_val = cpl_vector_get_size(ev->data);
1550 cpl_vector *vec = NULL;
1553 cpl_ensure_code(ev, CPL_ERROR_NULL_INPUT);
1559 val = cpl_vector_get_mean(vec);
1567 cpl_vector_delete(vec); vec = NULL;
1596 cpl_vector *vec = NULL;
1600 cpl_ensure_code(ev, CPL_ERROR_NULL_INPUT);
1607 size = cpl_vector_get_size(vec);
1608 if ((type == ERIS_IFU_STATISTICAL) && ((size % 2) == 0)) {
1610 cpl_vector_sort(vec, CPL_SORT_ASCENDING);
1612 val = cpl_vector_get(vec, size/2 - 1);
1615 val = cpl_vector_get_median(vec);
1623 cpl_vector_delete(vec); vec = NULL;
1643 eris_ifu_vector *ret_vec = NULL;
1644 cpl_vector *vec = NULL,
1648 cpl_ensure(ev, CPL_ERROR_NULL_INPUT, NULL);
1649 cpl_ensure((percentage >= 0.0) && (percentage < 1.0),
1650 CPL_ERROR_ILLEGAL_INPUT, NULL);
1658 cpl_vector_sort(vec, CPL_SORT_ASCENDING);
1662 size = cpl_vector_get_size(vec);
1663 cpl_size tmp = (cpl_size)rint((1.-percentage)*(double)size-1.);
1665 cut_vec = cpl_vector_extract(vec, 0, tmp, 1));
1668 cpl_vector_delete(cut_vec);
1675 cpl_vector_delete(vec); vec = NULL;
1700 cpl_ensure_code(ev, CPL_ERROR_NULL_INPUT);
1704 n = cpl_vector_get_size(ev->data);
1708 pkvdata = cpl_vector_get_data(ev->data));
1710 pkvmask = cpl_vector_get_data(ev->mask));
1711 for (
int i = 0; i < n; i++) {
1712 if (pkvmask[i] > 0.5) {
1745 cpl_vector *vec = NULL;
1748 cpl_ensure_code(ev, CPL_ERROR_NULL_INPUT);
1754 val = cpl_vector_get_stdev(vec);
1762 cpl_vector_delete(vec); vec = NULL;
1793 cpl_ensure_code(ev, CPL_ERROR_NULL_INPUT);
1808 pkvdata = cpl_vector_get_data(ev->data));
1810 pkvmask = cpl_vector_get_data(ev->mask));
1811 for (
int i = 0; i < cpl_vector_get_size(ev->data); i++) {
1812 if (pkvmask[i] > 0.5) {
1813 stdev += pow(pkvdata[i]-median, 2);
1818 stdev = sqrt(stdev);
1844 double val = -DBL_MAX;
1845 const double *pkvdata = NULL,
1849 cpl_ensure_code(ev, CPL_ERROR_NULL_INPUT);
1854 pkvdata = cpl_vector_get_data_const(ev->data));
1856 pkvmask = cpl_vector_get_data_const(ev->mask));
1858 n = cpl_vector_get_size(ev->data);
1865 for (
int i = 0; i < n; i++) {
1866 if ((pkvmask[i] > 0.5) && (val < pkvdata[i])) {
1903 double val = DBL_MAX;
1904 const double *pkvdata = NULL,
1908 cpl_ensure_code(ev, CPL_ERROR_NULL_INPUT);
1913 pkvdata = cpl_vector_get_data_const(ev->data));
1915 pkvmask = cpl_vector_get_data_const(ev->mask));
1917 n = cpl_vector_get_size(ev->data);
1924 for (
int i = 0; i < n; i++) {
1925 if ((pkvmask[i] > 0.5) && (val > pkvdata[i])) {
1966 double *pkvmask = NULL,
1968 cpl_error_code err = CPL_ERROR_NONE;
1970 cpl_ensure_code(ev, CPL_ERROR_NULL_INPUT);
1974 if (exponent == 0.0) {
1982 n = cpl_vector_get_size(ev->data);
1986 pkvdata = cpl_vector_get_data(ev->data));
1988 pkvmask = cpl_vector_get_data(ev->mask));
1989 for (
int i = 0; i < n; i++) {
1990 if (pkvmask[i] > 0.5) {
1991 pkvdata[i] = pow(pkvdata[i], exponent);
2002 err = cpl_error_get_code();
2027 cpl_error_code err = CPL_ERROR_NONE;
2029 cpl_ensure_code(ev, CPL_ERROR_NULL_INPUT);
2039 err = cpl_error_get_code();
2063 cpl_error_code ret_error = CPL_ERROR_NONE;
2064 double *pkvdata = NULL,
2070 cpl_ensure_code(ev, CPL_ERROR_NULL_INPUT);
2075 pkvdata = cpl_vector_get_data(ev->data));
2077 pkvmask = cpl_vector_get_data(ev->mask));
2079 size = cpl_vector_get_size(ev->data);
2080 half_size = floor(size / 2);
2082 for (
int i = 0; i < half_size;i++) {
2083 tmp_dbl = pkvdata[i];
2084 pkvdata[i] = pkvdata[size-1-i];
2085 pkvdata[size-1-i] = tmp_dbl;
2087 tmp_dbl = pkvmask[i];
2088 pkvmask[i] = pkvmask[size-1-i];
2089 pkvmask[size-1-i] = tmp_dbl;
2094 ret_error = cpl_error_get_code();
2123 const double *pkvdata = NULL,
2125 double *phdata = NULL,
2129 eris_ifu_vector *h = NULL;
2131 cpl_ensure(ev, CPL_ERROR_NULL_INPUT, NULL);
2132 cpl_ensure(nbins > 0, CPL_ERROR_NULL_INPUT, NULL);
2140 binwidth = (hmax - hmin) / (nbins - 1);
2143 pkvdata = cpl_vector_get_data_const(ev->data));
2145 pkvmask = cpl_vector_get_data_const(ev->mask));
2150 phdata = cpl_vector_get_data(h->data));
2152 for (
int i = 0; i < cpl_vector_get_size(ev->data); i++) {
2153 if (pkvmask[i] > 0.5) {
2154 pos = floor((pkvdata[i] - hmin) / binwidth);
2183 cpl_vector *vec = NULL;
2184 eris_ifu_vector *ev = NULL;
2188 vec = cpl_vector_load(filename, position);
2189 if (cpl_error_get_code() != CPL_ERROR_NONE) {
2190 if (cpl_error_get_code() == CPL_ERROR_FILE_IO) {
2191 cpl_msg_error(
"",
"File not found: %s", filename);
2193 cpl_msg_error(
"",
"Problem loading file '%s' (%s --> Code %d)",
2194 filename, cpl_error_get_message(),
2195 cpl_error_get_code());
2202 cpl_vector_delete(vec);
2232 const char *filename,
2234 const cpl_propertylist *pl,
2238 cpl_error_code err = CPL_ERROR_NONE;
2239 eris_ifu_vector *ev_dup = NULL;
2240 double *pkvdata = NULL,
2244 cpl_ensure_code(ev, CPL_ERROR_NULL_INPUT);
2253 pkvdata = cpl_vector_get_data(ev_dup->data));
2255 pkvmask = cpl_vector_get_data(ev_dup->mask));
2256 n = cpl_vector_get_size(ev_dup->data);
2257 for (
int i = 0; i < n; i++) {
2258 if (pkvmask[i] < 0.5) {
2259 pkvdata[i] = rej_val;
2263 err = cpl_vector_save(ev_dup->data, filename, bpp, pl, mode);
2266 err = cpl_vector_save(ev->data, filename, bpp, pl, mode);
2273 err = cpl_error_get_code();
2292 cpl_error_code err = CPL_ERROR_NONE;
2293 const double *pkvdata = NULL,
2299 cpl_msg_debug(
"",
" ====== START KMCLIPM_VECTOR ======");
2300 cpl_msg_debug(
"",
" empty vector");
2301 cpl_msg_debug(
"",
" ====== END KMCLIPM_VECTOR ========");
2303 n = cpl_vector_get_size(ev->data);
2305 if (n != cpl_vector_get_size(ev->mask)) {
2307 "data and mask not of same size!");
2311 pkvdata = cpl_vector_get_data_const(ev->data));
2313 pkvmask = cpl_vector_get_data_const(ev->mask));
2315 cpl_msg_debug(
"",
" ====== START KMCLIPM_VECTOR ======");
2316 cpl_msg_debug(
"",
" #\tdata:\tmask:");
2317 cpl_msg_debug(
"",
" ---------------------");
2318 for (
int i = 0; i < n; i++) {
2319 cpl_msg_debug(
"",
" %d\t%g\t%g", i, pkvdata[i], pkvmask[i]);
2321 cpl_msg_debug(
"",
" ====== END KMCLIPM_VECTOR ========");
2327 err = cpl_error_get_code();
2343 return (isnan(A) || (isinf(A)==1) || (isinf(A)==-1));
2357 double *pkvmask = NULL,
2359 cpl_error_code err = CPL_ERROR_NONE;
2361 cpl_ensure_code(ev, CPL_ERROR_NULL_INPUT);
2365 n = cpl_vector_get_size(ev->data);
2369 pkvdata = cpl_vector_get_data(ev->data));
2371 pkvmask = cpl_vector_get_data(ev->mask));
2374 for (
int i = 0; i < n; i++) {
2375 if (pkvmask[i] > 0.5) {
2379 cpl_ensure_code(pkvdata[i] >= 0, CPL_ERROR_ILLEGAL_INPUT);
2381 pkvdata[i] = sqrt(pkvdata[i]);
2392 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_flip(eris_ifu_vector *ev)
Flip the values of a vector.
int eris_ifu_vector_get_size(const eris_ifu_vector *ev)
Get the size of the eris_ifu_vector.
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_max(const eris_ifu_vector *ev, int *pos)
Get the maximum of the eris_ifu_vector and its position.
double eris_ifu_vector_get_stdev_median(const eris_ifu_vector *ev)
Compute the bias-corrected standard deviation of a vectors elements using median.
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_sum(const eris_ifu_vector *ev)
Compute the sum of non-rejected eris_ifu_vector elements.
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_vector * eris_ifu_vector_get_data(const eris_ifu_vector *ev)
Get a copy of the data, rejected values are set to NaN.
cpl_error_code eris_ifu_vector_divide_scalar(eris_ifu_vector *ev, double dividend)
Elementwise division of a eris_ifu_vector and a scalar.
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_abs(eris_ifu_vector *ev)
Calculates the absolute of an vector inplace.
cpl_error_code eris_ifu_vector_multiply(eris_ifu_vector *kv1, const eris_ifu_vector *kv2)
Multiply two eris_ifu_vectors.
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().
double eris_ifu_vector_get_stdev(const eris_ifu_vector *ev)
Compute the bias-corrected standard deviation of a vectors elements.
eris_ifu_vector * eris_ifu_vector_cut_percentian(const eris_ifu_vector *ev, double percentage)
Remove a certain percentage of brightest pixels.
int eris_ifu_vector_is_rejected(const eris_ifu_vector *ev, int n)
Test if a value is good or bad.
eris_ifu_vector * eris_ifu_vector_new_wrap(int n, const double *data)
Create a new eris_ifu_vector from a vector (duplicated).
cpl_error_code eris_ifu_vector_subtract_scalar(eris_ifu_vector *ev, double subtrahend)
Elementwise subtraction of a scalar from a eris_ifu_vector.
double eris_ifu_vector_get_mean(const eris_ifu_vector *ev)
Compute the mean value of non-rejected eris_ifu_vector elements.
cpl_error_code eris_ifu_vector_sqrt(eris_ifu_vector *ev)
eris_ifu_vector_sqrt
cpl_vector * eris_ifu_vector_get_mask(const eris_ifu_vector *ev)
Get a copy of the mask of eris_ifu_vector.
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_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.
cpl_error_code eris_ifu_vector_fill(eris_ifu_vector *ev, double val)
Fill a 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.
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.
medianType
The type of median behavior: For an odd number of samples the behaviour is the same for both methods....
cpl_vector * eris_ifu_vector_get_bpm(eris_ifu_vector *ev)
Get the pointer to the mask of the 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.
cpl_error_code eris_ifu_vector_set(eris_ifu_vector *ev, int pos, double val)
Set an element of the eris_ifu_vector.
double eris_ifu_vector_get(const eris_ifu_vector *ev, int pos)
Get an element of the 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.
cpl_error_code eris_ifu_vector_add(eris_ifu_vector *kv1, const eris_ifu_vector *kv2)
Add a eris_ifu_vector to another.
void eris_ifu_vector_delete(eris_ifu_vector *ev)
Delete a eris_ifu_vector.
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_power(eris_ifu_vector *ev, double exponent)
Compute the elementwise power of the 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_load(const char *filename, int position)
Override for cpl_vector_load().
cpl_error_code eris_ifu_vector_dump(const eris_ifu_vector *ev)
All values contained in vec are printed for debugging purposes.
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_add_scalar(eris_ifu_vector *ev, double addend)
Elementwise addition of a scalar to a eris_ifu_vector.
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.
cpl_error_code eris_ifu_vector_reject(eris_ifu_vector *ev, int n)
Set a value as rejected in a eris_ifu_vector.
double eris_ifu_vector_get_median(const eris_ifu_vector *ev, const enum medianType type)
Compute the median of the elements of a vector.