39 #include "casu_stats.h"
40 #include "catalogue/casu_utils.h"
44 static float kselect(
float *a,
long n,
long k);
45 static double dkselect(
double *a,
long n,
long k);
46 static float histexam(
int *histo,
int nhist,
int level);
89 extern float casu_med(
float *data,
unsigned char *bpm,
long npts) {
90 long i,j,is_even,ilevel;
100 buf = cpl_malloc(npts*
sizeof(*buf));
102 is_even = !(npts & 1);
103 memmove((
char *)buf,(
char *)data,npts*
sizeof(
float));
106 value = kselect(buf,npts,ilevel);
108 value = 0.5*(value + kselect(buf,npts,ilevel));
111 value = kselect(buf,npts,ilevel);
118 for (i = 0; i < npts; i++) {
130 value = kselect(buf,j,ilevel);
132 value = 0.5*(value + kselect(buf,j,ilevel));
135 value = kselect(buf,j,ilevel);
170 extern double casu_dmed(
double *data,
unsigned char *bpm,
long npts) {
171 long i,j,is_even,ilevel;
176 buf = cpl_malloc(npts*
sizeof(*buf));
178 is_even = !(npts & 1);
179 memmove((
char *)buf,(
char *)data,npts*
sizeof(
double));
182 value = dkselect(buf,npts,ilevel);
184 value = 0.5*(value + dkselect(buf,npts,ilevel));
187 value = dkselect(buf,npts,ilevel);
194 for (i = 0; i < npts; i++) {
200 value = CX_MAXDOUBLE;
206 value = dkselect(buf,j,ilevel);
208 value = 0.5*(value + dkselect(buf,j,ilevel));
211 value = dkselect(buf,j,ilevel);
259 float thresh,
int niter,
float lowv,
float highv,
260 float *median,
float *sigma) {
261 int *histo,nbins,nhist,ilev,iclip,nhist2,halflev,quartlev;
271 b = cpl_calloc(npts,
sizeof(
unsigned char));
274 nbins = casu_nint(highv - lowv + 1.0);
275 histo = cpl_calloc(nbins,
sizeof(*histo));
277 for (i = 0; i < npts; i++) {
278 if (b[i] || data[i] < lowv || data[i] > highv)
280 ilev = casu_nint(data[i] - lowv);
281 ilev = max(0,min(nbins-1,ilev));
288 *median = CX_MAXFLOAT;
289 *sigma = CX_MAXFLOAT;
298 for (i = 0; i <= niter; i++) {
299 halflev = (nhist2 + 1)/2;
300 quartlev = (nhist2 + 3)/4;
301 mlev = histexam(histo,nbins,halflev);
302 *median = mlev + lowv;
303 qlev = histexam(histo,nbins,quartlev);
304 *sigma = (mlev - qlev)*1.48;
308 jst = casu_nint(mlev + thresh*(*sigma));
309 for (j = jst; j <= iclip; j++)
347 extern void casu_medmad(
float *data,
unsigned char *bpm,
long np,
float *med,
359 work = cpl_malloc(np*
sizeof(*work));
360 for (i = 0; i < np; i++)
361 work[i] = (
float)fabs((
double)(data[i] - *med));
407 float hcut,
float *med,
float *mad) {
414 bad = cpl_calloc(np,
sizeof(*bad));
416 for (i = 0; i < np; i++)
417 if (bpm[i] != 0 || data[i] < lcut || data[i] > hcut)
420 for (i = 0; i < np; i++)
421 if (data[i] < lcut || data[i] > hcut)
428 if (*med == CX_MAXFLOAT) {
437 work = cpl_malloc(np*
sizeof(*work));
438 for (i = 0; i < np; i++)
439 work[i] = (
float)fabs((
double)(data[i] - *med));
479 extern float casu_mean(
float *data,
unsigned char *bpm,
long npts) {
488 for (i = 0; i < npts; i++)
492 for (i = 0; i < npts; i++) {
500 value = sum/(float)n;
534 extern double casu_dmean(
double *data,
unsigned char *bpm,
long npts) {
543 for (i = 0; i < npts; i++)
547 for (i = 0; i < npts; i++) {
555 value = sum/(float)n;
557 value = CX_MAXDOUBLE;
596 float *mean,
float *sig) {
599 const char *fctid =
"casu_meansig";
607 for (i = 0; i < npts; i++) {
608 d = (double)(data[i]);
614 for (i = 0; i < npts; i++) {
616 d = (double)(data[i]);
630 cpl_msg_warning(fctid,
"All values flagged as bad");
639 sum2 = sum2/(double)n - sum*sum;
640 *sig = (float)sqrt(max(1.0e-12,sum2));
672 extern void casu_medsig(
float *data,
unsigned char *bpm,
long np,
float *med,
680 if (*med == CX_MAXFLOAT) {
689 for (i = 0; i < np; i++) {
690 resid = data[i] - *med;
693 *sig = sqrt(sum/(
float)np);
700 for (i = 0; i < np; i++) {
703 resid = data[i] - *med;
708 *sig = sqrt(sum/(
float)n);
738 extern int casu_sumbpm(
unsigned char *bpm,
long npts,
int *sumb) {
742 for (j = 0; j < npts; j++)
749 static float histexam(
int *histo,
int nhist,
int level) {
755 while (ii < level && ilev < nhist-1)
757 value = (float)ilev - (
float)(ii - level)/(
float)histo[ilev] + 0.5;
771 static float kselect(
float *a,
long n,
long k) {
773 long i = 0, j = n - 1;
777 while (a[i] < x) i++;
778 while (a[j] > x) j--;
780 w = a[i]; a[i] = a[j]; a[j] = w;
785 }
while (++i <= --j);
790 a += i; n -= i; k -= i;
797 static double dkselect(
double *a,
long n,
long k) {
799 long i = 0, j = n - 1;
800 double x = a[j/2], w;
803 while (a[i] < x) i++;
804 while (a[j] > x) j--;
806 w = a[i]; a[i] = a[j]; a[j] = w;
811 }
while (++i <= --j);
816 a += i; n -= i; k -= i;
double casu_dmean(double *data, unsigned char *bpm, long npts)
void casu_medmad(float *data, unsigned char *bpm, long np, float *med, float *mad)
float casu_med(float *data, unsigned char *bpm, long npts)
void casu_qmedsig(float *data, unsigned char *bpm, long npts, float thresh, int niter, float lowv, float highv, float *median, float *sigma)
void casu_medsig(float *data, unsigned char *bpm, long np, float *med, float *sig)
float casu_mean(float *data, unsigned char *bpm, long npts)
double casu_dmed(double *data, unsigned char *bpm, long npts)
int casu_sumbpm(unsigned char *bpm, long npts, int *sumb)
void casu_medmadcut(float *data, unsigned char *bpm, long np, float lcut, float hcut, float *med, float *mad)
int casu_meansig(float *data, unsigned char *bpm, long npts, float *mean, float *sig)