37#include "catalogue/casu_utils.h"
38#include "catalogue/casu_fits.h"
40#include "casu_stats.h"
45#define MINHISTVAL -1000
46#define MAXHISTVAL 65535
48static void medsig(
int *hist,
int ist,
int itarg,
float *med,
float *sig);
109 int nbsize,
float *avback,
float **skymap,
111 float fracx,fracy,skymed,sigma,skymedc,sigmac,fnbsize,dely,delx;
113 int ifracx,ifracy,nbsizx,nbsizy,nbx,nby,npixstripe,l,i,ll;
114 int isquare,ilev,j,iclip,mcpix,iloop,irej,nbsizo2,kk,k,iby,ibyp1,ibx,ibxp1;
115 int *shist,**hist,*nnp,jj1,jj2,jj3,jj4,npts,ind;
116 unsigned char *badmask;
122 if (*status != CASU_OK)
124 if (map == NULL || bpm == NULL)
129 for (j = 0; j < npts; j++)
139 fracx = ((float)nx)/((float)nbsize);
140 fracy = ((float)ny)/((float)nbsize);
141 ifracx = (int)(fracx + 0.1);
142 ifracy = (int)(fracy + 0.1);
145 nbsize = max(casu_nint(0.9*nbsize),min(nbsize,min(nbsizx,nbsizy)));
146 nbsize = min(nx,min(ny,nbsize));
152 npixstripe = nbsize*nx;
156 hist = cpl_malloc(nbx*
sizeof(
int *));
157 for (l = 0; l < nbx; l++)
158 hist[l] = cpl_malloc(MAXHIST*
sizeof(
int));
162 bvals = cpl_malloc(nbx*nby*
sizeof(
float *));
163 badmask = cpl_calloc(nbx*nby,
sizeof(
unsigned char *));
167 nnp = cpl_malloc(nbx*
sizeof(
int));
172 for (l = 0; l < nby; l++) {
173 memset((
char *)nnp,0,nbx*
sizeof(*nnp));
174 for (i = 0; i < nbx; i++)
175 memset((
char *)hist[i],0,MAXHIST*
sizeof(
int));
181 for (i = 0; i < npixstripe; i++) {
186 isquare = (int)((
float)(i % nx)/(
float)nbsize);
187 isquare = min(nbx-1,max(0,isquare));
188 ilev = min(MAXHISTVAL,max(MINHISTVAL,casu_nint(map[ind])));
189 hist[isquare][ilev-MINHISTVAL] += 1;
196 for (j = 0; j < nbx; j++) {
198 if (nnp[j] > 0.25*nbsize*nbsize) {
200 medsig(shist,MINHISTVAL-1,nnp[j],&skymed,&sigma);
209 for (iloop = 0; iloop < 3; iloop++) {
211 for (i = casu_nint(skymedc+3.0*sigmac); i <= iclip; i++)
212 irej += shist[i-MINHISTVAL];
215 iclip = casu_nint(skymedc+3.0*sigmac) - 1;
216 mcpix = mcpix - irej;
217 medsig(shist,MINHISTVAL-1,mcpix,&skymedc,
220 bvals[jj1] = skymedc;
223 bvals[jj1] = -1000.0;
232 casu_bfilt(bvals,badmask,nbx,nby,3,MEDIANCALC,1);
236 *avback =
casu_med(bvals,badmask,(
long)(nbx*nby));
241 *skymap = cpl_malloc(nx*ny*
sizeof(
float));
243 fnbsize = 1.0/((float)nbsize);
244 for (k = 0; k < ny; k++) {
249 iby = (k + 1 + nbsizo2)/nbsize;
251 iby = min(nby,max(1,iby));
252 ibyp1 = min(nby,ibyp1);
253 dely = (k + 1 - nbsize*iby + nbsizo2)*fnbsize;
255 for (j = 0; j < nx; j++) {
259 ibx = (j + 1 + nbsizo2)/nbsize;
261 ibx = min(nbx,max(1,ibx));
262 ibxp1 = min(nbx,ibxp1);
263 delx = (j + 1 - nbsize*ibx + nbsizo2)*fnbsize;
264 jj1 = (iby-1)*nbx + ibx - 1;
265 jj2 = (ibyp1-1)*nbx + ibx - 1;
266 jj3 = (iby-1)*nbx + ibxp1 - 1;
267 jj4 = (ibyp1-1)*nbx + ibxp1 - 1;
271 t1 = (1.0 - dely)*bvals[jj1] + dely*bvals[jj2];
272 t2 = (1.0 - dely)*bvals[jj3] + dely*bvals[jj4];
273 (*skymap)[kk+j] = (1.0 - delx)*t1 + delx*t2;
279 for (l = 0; l < nbx; l++)
318static void medsig(
int *hist,
int ist,
int itarg,
float *med,
float *sig) {
319 int isum, medata,indx;
328 indx = medata - MINHISTVAL;
329 while (isum <= (itarg+1)/2 && indx < MAXHIST - 1) {
331 indx = medata - MINHISTVAL;
334 ffrac = (float)(isum - (itarg+1)/2)/(
float)hist[medata-MINHISTVAL];
335 *med = (float)medata - ffrac + 0.5;
345 indx = medata - MINHISTVAL;
346 while (isum <= (itarg+3)/4 && indx < MAXHIST - 1) {
348 indx = medata - MINHISTVAL;
351 ffrac = (float)(isum - (itarg+3)/4)/(
float)hist[medata-MINHISTVAL];
352 sigmed = (float)medata - ffrac + 0.5;
353 *sig = 1.48*(*med - sigmed);
354 *sig = max(2.5,*sig);
int casu_backmap(float *map, cpl_binary *bpm, int nx, int ny, int nbsize, float *avback, float **skymap, int *status)
Model background of an image.
float casu_med(float *data, unsigned char *bpm, long npts)