100 float xbar,
float ybar,
float total,
int npix,
103 int npl,ipix,ipixo2,npl2,nbitprev,nobj,toomany,i,isnew,k,kk,j,ibitx[IMNUM];
104 int ibity[IMNUM],iwas,iupdate[IMNUM],npl3,iter,lastone,ic,jj;
105 int ii,conv,ipks[IMNUM][2];
106 float fconst,offset,tmul,smul,xintmn,itmaxlim,algthr,radmax,xb,yb,radius2;
107 float results[IMNUM][NPAR+1],distmax,dx,dy,parmnew[IMNUM][NPAR],sumint;
108 float xlevol,radold,slope,xx,xlevel,radius,xdat[NAREAL+1],xcor[NAREAL+1];
109 float dlbydr,wt,dist,xeff,polycf[3],ttt,radthr,delb,deli,ratio;
110 float bitx[IMNUM],bitl[IMNUM],sxx,syy;
120 offset = ap->areal_offset;
128 ipixo2 = MAX(2,(ipix + 1)/2);
129 xintmn = oldthr*ipixo2;
132 algthr = logf(oldthr);
133 radmax = sqrtf(((
float)npix)/CPL_MATH_PI);
142 curthr = smul*oldthr;
143 sort_on_zsm_rev(npl,pl);
146 while (pl[npl2].zsm > curthr && npl2 < npl-1)
168 ap2.areal_offset = offset;
170 ap2.mflag = cpl_calloc((ap2.lsiz)*(ap2.csiz),
sizeof(
unsigned char*));
178 nexthr = MAX(curthr+oldthr,curthr*tmul);
184 check_term(&ap2,&nobj,results,ipks,&toomany);
192 for (i = 0; i < nobj; i++) {
202 sxx = MAX(1.0,results[i][4]);
203 syy = MAX(1.0,results[i][6]);
204 for (k = 0; k < nbitprev; k++) {
205 dx = xb - parm[k][1];
206 dy = yb - parm[k][2];
207 radius2 = dx*dx/sxx + dy*dy/syy;
208 if ((ibitx[k] == ipks[i][0] && ibity[k] == ipks[i][1]) ||
211 for (kk = 0; kk < NPAR; kk++)
212 parmnew[k][kk] = results[i][kk];
223 if (isnew && results[i][0] > xintmn) {
224 if (*nbit >= IMNUM) {
229 ibitx[*nbit] = ipks[i][0];
230 ibity[*nbit] = ipks[i][1];
231 for (kk = 0; kk < NPAR; kk++)
232 parm[*nbit][kk] = results[i][kk];
243 if (*nbit > nbitprev && nbitprev > 0) {
244 for (i = 0; i < nbitprev; i++)
246 for (j = nbitprev; j < *nbit; j++) {
249 for (i = 0; i < nbitprev; i++) {
250 if (parmnew[i][0] > 0.0) {
251 dx = parmnew[i][1] - parm[i][1];
252 dy = parmnew[i][2] - parm[i][2];
253 radius2 = dx*dx + dy*dy;
254 if (radius2 > distmax) {
262 for (i = 0; i < nbitprev; i++)
263 if (iupdate[i] == 1 && parmnew[i][0] > 0.0)
264 for (j = 0; j < NPAR; j++)
265 parm[i][j] = parmnew[i][j];
270 for (i = 0; i <= *nbit; i++)
271 parmnew[i][0] = -1.0;
279 while (pl[npl3].zsm > nexthr && npl3 < npl2-1)
285 if (npl2 == 0 || toomany || nexthr >= itmaxlim)
306 for (k = 0; k < *nbit; k++) {
311 if (parm[k][0] > xintmn) {
314 for (i = 0; i < NPAR; i++)
315 parm[j][i] = parm[k][i];
319 for (j = 0; j < *nbit; j++) {
330 while (iter < NITER) {
335 for (k = 0; k < *nbit; k++) {
336 if (parm[k][0] < 0.0)
338 xlevol = logf(parm[k][7] + parm[k][3] - bitl[k]);
344 for (i = 1; i <= NAREAL; i++) {
347 xx = (float)ii + offset;
348 if (parm[k][jj] > 0.5) {
350 xlevel = logf(parm[k][3] - bitl[k] + 0.5);
352 xlevel = logf(powf(2.0,xx) - oldthr + parm[k][3] -
354 radius = sqrt(parm[k][jj]/CPL_MATH_PI);
357 dlbydr = (xlevol - xlevel)/MAX(0.01,radius-radold);
358 wt = MIN(1.0,MAX((radius-radold)*5.0,0.1));
359 slope = (1.0 - 0.5*wt)*slope + 0.5*wt*MIN(5.0,dlbydr);
369 for (i = 0; i < *nbit; i++) {
370 if (parm[i][0] >= 0.0 && i != k) {
371 dx = parm[k][1] - parm[i][1];
372 dy = parm[k][2] - parm[i][2];
373 dist = sqrtf(dx*dx + dy*dy);
374 xeff = xlevel - MAX(0.0,MIN(50.0,slope*(dist-radius)));
375 bitx[i] += expf(xeff);
384 imcore_polynm(xdat,xcor,ic,polycf,3,0);
385 ttt = polycf[1] + 2.0*polycf[2]*radius;
388 slope = MAX(0.1,MAX(-ttt,slope));
389 radthr = radius + (xlevel - algthr)/slope;
390 if (radthr > radmax) {
397 delb = parm[k][8]*(parm[k][3] - bitl[k]);
398 parm[k][8] = CPL_MATH_PI*radthr*radthr;
402 parm[k][7] += (parm[k][3] - bitl[k]);
406 deli = 2.0*CPL_MATH_PI*((parm[k][3] - bitl[k])*(1.0 + slope*radius) -
407 oldthr*(1.0 + slope*radthr))/(slope*slope);
408 parm[k][0] += delb + MAX(0.0,deli);
409 for (i = 0; i < 7; i++)
411 if (parm[k][0] > xintmn)
412 sumint += parm[k][0];
422 for (i = 0; i < *nbit; i++) {
423 if (parm[i][0] >= 0.0) {
424 if (fabs(bitx[i] - bitl[i]) > 3.0)
428 bitl[i] = MIN(bitl[i],NINT(parm[i][3]-oldthr));
431 lastone = (conv || (iter == NITER-1));
443 ratio = total/sumint;
444 for (i = 0; i < *nbit; i++)
445 parm[i][0] = ratio*parm[i][0];