34 #include "floatmath.h"
41 static void dchole (
double a[IMNUM+1][IMNUM+1],
double b[IMNUM+1],
int n);
42 static float fraction (
float x,
float y,
float r_out);
91 extern void phopt(ap_t *ap,
float parm[IMNUM][NPAR],
int nbit,
int naper,
92 float apertures[],
float cflux[],
float badpix[],
94 double aa[IMNUM+1][IMNUM+1],bb[IMNUM+1];
95 float d,arg,*map,rcirc;
96 float cn,parrad,xmin,xmax,xi,yi,ymin,ymax;
97 float t,xj,yj,cnsq,tj,xk,yk,tk;
98 int i,ii,j,kk,ix1,ix2,iy1,iy2,nx,ny,k,iaper;
99 unsigned char *mflag,mf;
110 for (iaper = 0; iaper < naper; iaper++) {
111 rcirc = apertures[iaper];
112 parrad = rcirc + 0.5;
113 cn = 1.0/(CPL_MATH_PI*rcirc*rcirc);
118 for(i = 0; i < nbit; i++) {
123 for(j = i+1; j < nbit; j++) {
124 d = sqrtf((xi-parm[j][1])*(xi-parm[j][1])
125 + (yi-parm[j][2])*(yi-parm[j][2]));
131 aa[j][i] = cnsq*2.0*rcirc*rcirc*
132 (acosf(arg)-arg*(sqrtf(1.0-arg*arg)));
141 for(i = 0; i < nbit; i++)
150 for(i = 0; i < nbit; i++) {
153 xmin = MIN(xmin, xi);
154 xmax = MAX(xmax, xi);
155 ymin = MIN(ymin, yi);
156 ymax = MAX(ymax, yi);
158 ix1 = MAX(0,(
int)(xmin-parrad)-1);
159 ix2 = MIN(nx-1,(
int)(xmax+parrad));
160 iy1 = MAX(0,(
int)(ymin-parrad)-1);
161 iy2 = MIN(ny-1,(
int)(ymax+parrad));
165 for(ii = iy1; ii <= iy2; ii++) {
167 for(i = ix1; i <= ix2; i++) {
169 if (mf == MF_ZEROCONF || mf == MF_STUPID_VALUE) {
170 for (j = 0; j < nbit; j++) {
171 xj = i - parm[j][1] + 1.0;
172 yj = ii - parm[j][2] + 1.0;
173 tj = fraction(xj,yj,rcirc);
174 aa[j][j] -= tj*tj*cnsq;
175 for (k = j + 1; k < nbit; k++) {
176 xk = i - parm[k][1] + 1.0;
177 yk = ii - parm[k][2] + 1.0;
178 tk = fraction(xk,yk,rcirc);
179 aa[k][j] -= tk*tj*cnsq;
185 }
else if (mf == MF_CLEANPIX || mf == MF_OBJPIX ||
186 mf == MF_SATURATED) {
188 for(j = 0; j < nbit; j++) {
189 xj = i - parm[j][1] + 1.0;
190 yj = ii - parm[j][2] + 1.0;
191 bb[j] += fraction(xj,yj,rcirc)*t;
200 cflux[iaper] = bb[0];
205 for (i = 0; i < nbit; i++)
206 aa[i][i] = MAX(aa[i][i],cnsq);
208 for(i = 0; i < nbit; i++)
209 cflux[i*naper+iaper] = cn*bb[i];
218 static void dchole (
double a[IMNUM+1][IMNUM+1],
double b[IMNUM+1],
int n) {
219 double sum, l[IMNUM+1][IMNUM+1], y[IMNUM+1];
220 double aveigv, offset;
224 l[0][0] = sqrt(a[0][0]);
226 for(k = 1; k < n; k++) {
227 for(j = 0; j <= k-1; j++) {
230 for(i = 0; i <= j-1; i++)
231 sum -= l[i][k]*l[i][j];
232 l[j][k] = sum/l[j][j];
235 for(i = 0; i <= k-1; i++)
236 sum -= l[i][k]*l[i][k];
240 for(i = 1; i < n; i++)
243 offset = 0.1*aveigv/((double) n);
244 for(i = 0; i < n; i++)
255 for(i = 1; i < n; i++) {
257 for(k = 0; k <= i-1; k++)
264 b[n-1] = y[n-1]/l[n-1][n-1];
265 for(i = n-2; i >= 0; i--) {
267 for(k = i+1; k < n; k++)
277 static float fraction (
float x,
float y,
float r_out) {
278 float r,t,x_a,x_b,frac,tanao2,cosa,tanp2a,sqrt2o2;
280 r = sqrtf(x*x + y*y);
281 sqrt2o2 = 0.5*CPL_MATH_SQRT2;
285 if(r > r_out+sqrt2o2)
290 if(r < r_out-sqrt2o2)
306 if (x > 0.0 && y > 0.0) {
309 cosa = x/sqrt(x*x + y*y);
318 x_a = x - tanao2 + (r_out - r)/cosa;
323 x_b = x + tanao2 + (r_out - r)/cosa;
328 frac = 0.5*MAX(0.0,x_b-(x-0.5))*MAX(0.0,x_b-(x-0.5))*tanp2a;
331 frac = 1.0 - 0.5*(x+0.5-x_a)*(x+0.5-x_a)*tanp2a;
333 frac = 0.5-(x-x_a)+0.5*(x_b-x_a);