36 #include "floatmath.h"
89 extern int extend(ap_t *ap,
float xniso,
float xbar,
float ybar,
float sxx,
90 float sxy,
float syy,
float areal0,
float tmax,
92 float srr,ecc,xx,ctheta,stheta,a,b,stretch,rad,sfac,climsq,clim;
93 float pt1,pt2,pt3,c,pa,pb,pc,arg1,xliml,xlimu,y,t,x,xnew,ynew,ellrad;
94 float xmax,xlim1,xlim2,xcord[NACC],xdat[NACC],polycf[NCOEF],rt1,rt2,t1;
95 float xlimit,theta,accum[NACC],*map,skysig,thresh;
96 int jmin,jmax,imax,imin,jj,kk,ii,iupd,j,i,ir,nx,ny;
110 srr = MAX(0.5,sxx+syy);
111 ecc = sqrtf((syy-sxx)*(syy-sxx) + 4.0*sxy*sxy)/srr;
113 xx = 0.5*(1.0 + ecc)*srr - sxx;
118 theta = CPL_MATH_PI_2;
120 theta = atanf(sxy/xx);
126 ecc = sqrtf(MAX((syy-sxx)*(syy-sxx)
127 - 16.0*CPL_MATH_PI*skysig*srr*srr*srr/(xniso*xniso)
128 + 4.0*sxy*sxy,0.0))/srr;
133 a = sqrtf(srr*(1.0 + ecc));
134 b = sqrtf(srr*(1.0 - ecc));
135 stretch = sqrt(areal0/(CPL_MATH_PI*a*b));
139 rad = MAX(1.1,(tmax - skysig)/thresh);
140 sfac = MIN(5.0,MAX(2.0,3.0/sqrtf(logf(rad))));
146 memset(accum,0,NACC*
sizeof(
float));
150 climsq = (a*ctheta)*(a*ctheta) + (b*stheta)*(b*stheta);
151 climsq = MAX(1.0,climsq);
152 clim = sqrtf(climsq);
153 pt1 = sinf(2.0*theta)*(b*b-a*a);
154 pt2 = (b*ctheta)*(b*ctheta) + (a*stheta)*(a*stheta);
156 jmin = MAX(1,(
int)(ybar - clim));
157 jmax = MIN(ny,(
int)(ybar + clim + 1.0));
158 for (jj = jmin; jj <= jmax; jj++) {
163 c = (float)jj - ybar;
167 arg1 = pb*pb - 4.0*pa*pc;
168 arg1 = sqrtf(MAX(arg1,0.0));
169 xliml = (-pb - arg1)/(2.0*pa);
170 xlimu = (-pb + arg1)/(2.0*pa);
171 imin = MAX(1,(
int)(xbar + xliml));
172 imax = MIN(nx,(
int)(xbar + xlimu + 1.0));
174 for(ii = imin; ii <= imax; ii++) {
175 if (mflag[kk+ii-1] == MF_CLEANPIX || mflag[kk+ii-1] == MF_OBJPIX ||
176 mflag[kk+ii-1] == MF_SATURATED) {
178 x = (float)ii - xbar;
182 xnew = x*ctheta - y*stheta;
183 ynew = x*stheta + y*ctheta;
184 ellrad = 2.0*sqrtf((ynew/a)*(ynew/a) + (xnew/b)*(xnew/b));
185 iupd = ((int)((2.0-ellrad)*(float)NACC)) + 1;
187 iupd = MIN(NACC,iupd);
188 for(j = 1; j <= iupd; j++)
197 for(i = 0; i < NACC; i++)
198 accum[i] = -accum[i];
199 median(accum,NACC,3);
203 for(i = 0; i < NACC; i++) {
205 xmax = MAX(xmax,accum[i]);
208 polynm(xdat,xcord,NACC,polycf,NCOEF,0);
212 arg1 = sqrtf(MAX(0.0,pb*pb - 4.0*pa*pc));
214 rt1 = (-pb + arg1)/(2.0*pc);
215 rt2 = (-pb - arg1)/(2.0*pc);
216 if(rt1 < (
float)NACC && rt1 > 1.0) {
218 t1 = rt1 - (float)ir;
219 xlim1 = (1.0 - t1)*accum[ir-1] + t1*accum[ir];
221 if(rt2 < (
float)NACC && rt2 > 1.0) {
224 xlim2 = (1.0 - t1)*accum[ir-1] + t1*accum[ir];
227 xlimit = MAX(xlim1,xlim2);
int extend(ap_t *ap, float xniso, float xbar, float ybar, float sxx, float sxy, float syy, float areal0, float tmax, float *ttotal)
Do aperture integration.