File: irplib_ksigma_clip_body.h

package info (click to toggle)
cpl-plugin-naco 4.4.11%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 9,524 kB
  • sloc: ansic: 70,386; sh: 5,198; makefile: 732; python: 295
file content (107 lines) | stat: -rw-r--r-- 3,407 bytes parent folder | download | duplicates (28)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
/* $Id: irplib_ksigma_clip_body.h,v 1.1 2011-11-02 13:18:28 amodigli Exp $
 *
 * This file is part of the irplib package 
 * Copyright (C) 2002,2003 European Southern Observatory
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02111-1307  USA
 */

/*
 * $Author: amodigli $
 * $Date: 2011-11-02 13:18:28 $
 * $Revision: 1.1 $
 * $Name: not supported by cvs2svn $
 */

#define TYPE_ADD(a) CONCAT2X(a, CPL_TYPE)

static cpl_error_code
TYPE_ADD(irplib_ksigma_clip)(const CPL_TYPE  * pi,
			     int               llx,
			     int               lly,
			     int               urx,
			     int               ury,
			     int               nx,
			     double            var_sum,
			     int               npixs,
			     double            kappa,
			     int               nclip,
			     double            tolerance,
			     double          * mean,
			     double          * stdev)
{
    int    pos0 = (llx - 1) + (lly - 1) * nx; /* 1st pixel to process */
    double nb   = (double) npixs;             /* Non-bad pixels in window */

    double lo_cut    = *mean - kappa * (*stdev);
    double hi_cut    = *mean + kappa * (*stdev);
    
    double lo_cut_p  = lo_cut;
    double hi_cut_p  = hi_cut;

    double c_mean = 0;  /* Set to zero in case loop body not executed. */
    double c_stdev = 0; /* Set to zero in case loop body not executed. */

    int    iclip;

    for (iclip = 0; iclip < nclip; iclip++) {
        int pos = pos0;
        int i, j;
        double c_var_sum;

	c_var_sum = var_sum;
	c_mean    = *mean;
	c_stdev   = *stdev;
	nb        = npixs;
	
        for (j = lly - 1; j < ury; j++, pos += (nx - urx + llx - 1)) {
            for (i = llx - 1; i < urx; i++, pos++) {
                if (pi[pos] > hi_cut || pi[pos] < lo_cut) {
                    const double delta = (double)pi[pos] - c_mean;

                    c_var_sum  -= nb * delta * delta / (nb - 1.0);
                    c_mean     -= delta / (nb - 1.0);
                    nb          = nb - 1.0;
                }
            }
        }

	if (nb == 1.0 || c_var_sum < 0.0) {
	    cpl_msg_error(cpl_func, "Iteration %d: Too many pixels were "
			  "removed. This may cause unexpected behaviour. "
			  "Please set a lower number of iterations "
                          "or increase the value of kappa\n", iclip);
	    cpl_error_set(cpl_func, CPL_ERROR_DIVISION_BY_ZERO);
	} else {
	    c_stdev = sqrt(c_var_sum / (nb - 1.0));
	}

	lo_cut = c_mean - kappa * c_stdev;
	hi_cut = c_mean + kappa * c_stdev;
	
        if(fabs(lo_cut - lo_cut_p) < tolerance &&
           fabs(hi_cut - hi_cut_p) < tolerance) {
            break;
	} else {
	    lo_cut_p = lo_cut;
	    hi_cut_p = hi_cut;
	}
    }

    *mean  = c_mean;
    *stdev = c_stdev;

    return cpl_error_get_code();
}