35 #include "vircam_mods.h"
36 #include "vircam_utils.h"
37 #include "vircam_fits.h"
38 #include "vircam_stats.h"
55 static short int nextc;
56 static short int lastc;
58 static void twodfilt(
float *data,
unsigned char *bpm,
int nx,
int ny,
59 int medfilt,
int linfilt,
int niter,
int axis,
60 int twod,
int takeout_sky,
int inorm,
int wantback,
61 float signeg,
float sigpos,
float **backmap);
62 static void bfilt_1d(
float *data,
unsigned char *bpm,
int nx,
int ny,
63 int filt,
int stat,
int axis);
64 static void bfilt_2d(
float *data,
unsigned char *bpmcopy,
int nx,
int ny,
66 static void docols_2(
float *data,
unsigned char *bpm,
float *dbuf,
67 unsigned char *bbuf,
int nx,
int ny,
int filter,
69 static void dorows_2(
float *data,
unsigned char *bpm,
float *dbuf,
70 unsigned char *bbuf,
int nx,
int ny,
int filter,
72 extern void dostat(
float *data,
unsigned char *bpm,
unsigned char *goodval,
73 int npts,
int nfilt,
int whichstat);
74 static void wraparound(
float *data,
unsigned char *bpm,
int npts,
int nfilt,
75 int whichstat,
float **ybuf,
unsigned char **ybbuf,
77 static void medavg(
float *array,
unsigned char *bpm,
int *ipoint,
int npix,
78 int whichstat,
int newl,
float *outval,
79 unsigned char *outbp);
80 static void quickie(
float *array,
unsigned char *iarray,
int *iarray2,
82 static void sortm(
float *a1,
unsigned char *a2,
int *a3,
int n);
83 static void plugholes(
float *data,
unsigned char *bpm,
int nx);
146 int linfilt,
int niter,
int axis,
int twod,
147 int takeout_sky,
int norm,
int wantback,
148 float signeg,
float sigpos, vir_fits **backmap,
152 float *data,*backdata,*bdata;
155 const char *fctid =
"vircam_nebuliser";
160 if (*status != VIR_OK)
166 nx = cpl_image_get_size_x(im);
167 ny = cpl_image_get_size_y(im);
168 data = cpl_image_get_data_float(im);
174 bpm = cpl_calloc(npts,
sizeof(
unsigned char));
175 if (inconf != NULL) {
177 if (cpl_image_get_size_x(im) != nx || cpl_image_get_size_y(im) != ny) {
178 cpl_msg_error(fctid,
"Image and conf map dimensions don't match");
181 cdata = cpl_image_get_data(im);
182 for (i = 0; i < npts; i++)
183 bpm[i] = (cdata[i] == 0);
188 twodfilt(data,bpm,nx,ny,medfilt,linfilt,niter,axis,twod,takeout_sky,norm,
189 wantback,signeg,sigpos,&backdata);
195 "ESO DRS NEBULISED",1);
198 "Nebuliser has been used on this image");
206 bdata = cpl_image_get_data_float(im);
207 memmove(bdata,backdata,npts*
sizeof(
float));
217 static void twodfilt(
float *data,
unsigned char *bpm,
int nx,
int ny,
218 int medfilt,
int linfilt,
int niter,
int axis,
219 int twod,
int takeout_sky,
int inorm,
int wantback,
220 float signeg,
float sigpos,
float **backmap) {
221 int i,iter,nter,nmask;
223 float *buffer,*orig,*orig_sm,*work,medsky,sigsky,rescale,lthr,hthr;
225 unsigned char *bpmcopy;
231 buffer = cpl_malloc(3*nn*
sizeof(*buffer));
235 memmove((
char *)orig,(
char *)data,nn*
sizeof(*data));
236 memmove((
char *)orig_sm,(
char *)data,nn*
sizeof(*data));
237 memmove((
char *)work,(
char *)data,nn*
sizeof(*data));
242 bpmcopy = cpl_calloc(nn,
sizeof(*bpmcopy));
243 for (i = 0; i < nn; i++)
244 bpmcopy[i] = (bpm[i] ? 1 : 0);
248 if (niter > 1 && medfilt > 10) {
249 bfilt_1d(orig_sm,bpmcopy,nx,ny,5,MEDIANCALC,axis);
250 bfilt_1d(orig_sm,bpmcopy,nx,ny,3,MEANCALC,axis);
255 for (iter = 1; iter <= niter; iter++) {
257 memmove((
char *)data,(
char *)orig,nn*
sizeof(*data));
263 bfilt_1d(data,bpmcopy,nx,ny,medfilt,MEDIANCALC,axis);
265 bfilt_2d(data,bpmcopy,nx,ny,medfilt,MEDIANCALC);
272 for (i = 0; i < nn; i++)
273 work[i] = orig_sm[i] - data[i];
278 vircam_qmedsig(work,bpmcopy,nn,3.0,3,-1000.0,65535.0,&medsky,&sigsky);
281 while (sigsky < 2.5 && nter < 16) {
283 for (i = 0; i < nn; i++)
289 rescale = (float)pow(2.0,(
double)nter);
290 for (i = 0; i < nn; i++)
295 lthr = -signeg*sigsky;
296 hthr = sigpos*sigsky;
301 for (i = 0; i < nn; i++) {
304 diff = work[i] - medsky;
305 if (diff > hthr || diff < lthr) {
317 bfilt_1d(data,bpm,nx,ny,linfilt,MEANCALC,axis);
319 bfilt_2d(data,bpm,nx,ny,linfilt,MEANCALC);
324 vircam_qmedsig(orig,bpmcopy,nn,3.0,3,-1000.0,65535.0,&medsky,&sigsky);
331 *backmap = cpl_malloc(nn*
sizeof(**backmap));
332 for (i = 0; i < nn; i++)
333 (*backmap)[i] = data[i];
341 for (i = 0; i < nn; i++)
342 data[i] = orig[i] - data[i] + medsky;
344 for (i = 0; i < nn; i++)
345 data[i] = orig[i]/max(1.0,data[i]);
354 static void bfilt_1d(
float *data,
unsigned char *bpm,
int nx,
int ny,
355 int filt,
int stat,
int axis) {
364 dbuf = cpl_malloc(nbuf*
sizeof(*dbuf));
365 bbuf = cpl_malloc(nbuf*
sizeof(*bbuf));
371 dorows_2(data,bpm,dbuf,bbuf,nx,ny,filt,stat);
372 docols_2(data,bpm,dbuf,bbuf,nx,ny,filt,stat);
374 docols_2(data,bpm,dbuf,bbuf,nx,ny,filt,stat);
375 dorows_2(data,bpm,dbuf,bbuf,nx,ny,filt,stat);
384 static void bfilt_2d(
float *data,
unsigned char *bpmcopy,
int nx,
int ny,
385 int filt,
int stat) {
386 float *dbuf,*outmap,value,*om;
387 unsigned char *outbpm,*ob;
388 int nbuf,j,i,nf2,nalloc,jj,ii,ind,ind1,j1old,j2old,i1old,i2old;
396 nalloc = (2*filt+1)*(2*filt+1);
397 dbuf = cpl_malloc(nalloc*
sizeof(*dbuf));
398 outmap = cpl_malloc(nx*ny*
sizeof(*outmap));
399 outbpm = cpl_malloc(nx*ny*
sizeof(*outbpm));
403 for (j = 0; j < ny; j++) {
404 for (i = 0; i < nx; i++) {
406 for (jj = j - nf2; jj <= j + nf2; jj++) {
407 if (jj < 0 || jj >= ny)
410 for (ii = i - nf2; ii <= i + nf2; ii++) {
411 if (ii < 0 || ii >= nx)
416 dbuf[nbuf++] = data[ind];
428 for (jj = j - filt; jj <= j + filt; jj++) {
429 if (jj < 0 || jj >= ny || (jj >= j1old && jj <= j2old))
432 for (ii = i - filt; ii <= i + filt; ii++) {
433 if (ii < 0 || ii >= nx || (ii >= i1old && ii <= i2old))
438 dbuf[nbuf++] = data[ind];
447 if (stat == MEDIANCALC)
454 outmap[ind] = -1000.0;
463 for (j = 0; j < ny; j++) {
467 for (i = 0; i < nx; i++)
468 data[j*nx+i] = om[i];
479 static void docols_2(
float *data,
unsigned char *bpm,
float *dbuf,
480 unsigned char *bbuf,
int nx,
int ny,
int filter,
484 unsigned char *goodval,*b;
490 goodval = cpl_malloc(ny*
sizeof(*goodval));
491 t = cpl_malloc(ny*
sizeof(*t));
492 b = cpl_malloc(ny*
sizeof(*b));
493 for (k = 0; k < nx; k++) {
494 memset((
char *)goodval,0,ny);
496 for (j = 0; j < ny; j++) {
498 if (bpm[indx] == 0) {
499 dbuf[nn] = data[indx];
503 dostat(dbuf,bbuf,goodval,nn,filter,stat);
505 for (j = 0; j < ny; j++) {
507 if (bpm[indx] == 0) {
517 for (j = 0; j < ny; j++) {
527 static void dorows_2(
float *data,
unsigned char *bpm,
float *dbuf,
528 unsigned char *bbuf,
int nx,
int ny,
int filter,
532 unsigned char *goodval,*b;
538 goodval = cpl_malloc(nx*
sizeof(*goodval));
539 t = cpl_malloc(nx*
sizeof(*t));
540 b = cpl_malloc(nx*
sizeof(*b));
541 for (k = 0; k < ny; k++) {
542 memset((
char *)goodval,0,nx);
544 for (j = 0; j < nx; j++) {
548 dbuf[nn] = data[indx];
551 dostat(dbuf,bbuf,goodval,nn,filter,stat);
553 for (j = 0; j < nx; j++) {
555 if (bpm[indx] == 0) {
564 for (j = 0; j < nx; j++) {
574 extern void dostat(
float *data,
unsigned char *bpm,
unsigned char *goodval,
575 int npts,
int nfilt,
int whichstat) {
576 int nbuf,jl,jh,j,*ipoint,ifree,i;
577 unsigned char *ybbuf,*barray,bval;
578 float *ybuf,*darray,val;
582 if (npts < nfilt || npts < 10)
587 if ((nfilt/2)*2 == nfilt)
592 wraparound(data,bpm,npts,nfilt,whichstat,&ybuf,&ybbuf,&nbuf);
596 darray = cpl_malloc(nfilt*
sizeof(*darray));
597 barray = cpl_malloc(nfilt*
sizeof(*barray));
598 ipoint = cpl_malloc(nfilt*
sizeof(*ipoint));
599 memmove((
char *)darray,(
char *)ybuf,nfilt*
sizeof(*ybuf));
600 memmove((
char *)barray,(
char *)ybbuf,nfilt*
sizeof(*ybbuf));
601 for (j = 0; j < nfilt; j++)
604 medavg(darray,barray,ipoint,nfilt,whichstat,-1,&val,&bval);
609 jh = nfilt + npts - 2;
610 for (j = jl; j <= jh; j++) {
611 for (i = 0; i < nfilt; i++) {
612 if (ipoint[i] == 0) {
614 ipoint[i] = nfilt - 1;
615 lastval = darray[ifree];
618 if (barray[ifree] == 0) {
622 darray[ifree] = ybuf[j];
623 barray[ifree] = ybbuf[j];
624 nextval = darray[ifree];
627 if (barray[ifree] == 0) {
634 medavg(darray,barray,ipoint,nfilt,whichstat,ifree,&val,&bval);
637 goodval[j-jl+1] = bval;
649 static void wraparound(
float *data,
unsigned char *bpm,
int npts,
int nfilt,
650 int whichstat,
float **ybuf,
unsigned char **ybbuf,
653 float *darray,xmns,xmnf;
654 int i1,ilow,i,*ipoint;
655 unsigned char *barray,bxmns,bxmnf;
660 ilow = max(3,nfilt/4);
661 ilow = (ilow/2)*2 + 1;
665 darray = cpl_malloc(nfilt*
sizeof(*darray));
666 barray = cpl_malloc(nfilt*
sizeof(*barray));
667 ipoint = cpl_calloc(nfilt,
sizeof(*ipoint));
669 *ybuf = cpl_malloc(*nbuf*
sizeof(
float));
670 *ybbuf = cpl_malloc(*nbuf*
sizeof(
unsigned char));
674 memmove((
char *)darray,(
char *)data,ilow*
sizeof(*data));
675 memmove((
char *)barray,(
char *)bpm,ilow*
sizeof(*bpm));
676 medavg(darray,barray,ipoint,ilow,whichstat,-1,&xmns,&bxmns);
677 memmove((
char *)darray,(
char *)(data+npts-ilow),ilow*
sizeof(*data));
678 memmove((
char *)barray,(
char *)(bpm+npts-ilow),ilow*
sizeof(*bpm));
679 medavg(darray,barray,ipoint,ilow,whichstat,-1,&xmnf,&bxmnf);
680 for (i=0; i < i1; i++) {
682 (*ybuf)[i] = 2.0*xmns - data[i1+ilow-i-1];
683 (*ybbuf)[i] = bpm[i1+ilow-i-1];
685 (*ybuf)[i] = data[i1+ilow-i-1];
689 (*ybuf)[npts+i1+i] = 2.0*xmnf - data[npts-i-ilow-1];
690 (*ybbuf)[npts+i1+i] = bpm[npts-i-ilow-1];
692 (*ybuf)[npts+i1+i] = data[npts-i-ilow-1];
693 (*ybbuf)[npts+i1+i] = 1;
699 memmove((
char *)(*ybuf+i1),data,npts*
sizeof(*data));
700 memmove((
char *)(*ybbuf+i1),bpm,npts*
sizeof(*bpm));
709 static void medavg(
float *array,
unsigned char *bpm,
int *ipoint,
int npix,
710 int whichstat,
int newl,
float *outval,
711 unsigned char *outbp) {
721 if (whichstat == MEDIANCALC) {
723 sortm(array,bpm,ipoint,npix);
725 quickie(array,bpm,ipoint,newl,npix);
729 buf = cpl_malloc(npix*
sizeof(*buf));
734 for (i = 0; i < npix; i++) {
740 }
else if (whichstat == MEANCALC) {
745 for (i = 0; i < npix; i++) {
754 sum += (nextw*nextval - lastw*lastval);
755 sumw += (nextw - lastw);
756 naver += (nextc - lastc);
766 if (whichstat == MEDIANCALC)
772 if (whichstat == MEDIANCALC) {
775 }
else if (whichstat == MEANCALC)
781 static void quickie(
float *array,
unsigned char *iarray,
int *iarray2,
782 int lll,
int narray) {
792 for (i = 0; i < narray; i++) {
793 if (i != lll && test <= array[i]) {
805 for (i = 0; i < npt; i++) {
806 array[lll-i] = array[lll-i-1];
807 iarray[lll-i] = iarray[lll-i-1];
808 iarray2[lll-i] = iarray2[lll-i-1];
817 for (i = 0; i < npt; i++) {
818 array[lll+i] = array[lll+i+1];
819 iarray[lll+i] = iarray[lll+i+1];
820 iarray2[lll+i] = iarray2[lll+i+1];
829 static void sortm(
float *a1,
unsigned char *a2,
int *a3,
int n) {
830 int iii,ii,i,ifin,j,b3;
837 iii = min(n,(3*iii)/4 - 1);
842 for (ii = 0; ii < ifin; ii++) {
855 if (i < 0 || a1[i] <= b1)
866 static void plugholes(
float *data,
unsigned char *bpm,
int nx) {
867 int i,ifirst,ilast,i1,i2,j;
868 float nc,d1,d2,t1,t2,slope;
873 while (i < nx && bpm[i] != 0)
885 while (i >= 0 && bpm[i] != 0)
902 nc = (float)(i2 - i1 + 1);
905 for (j = i1+1; j <= i2-1; j++) {
906 t1 = 1.0 - (float)(j - i1)/nc;
908 data[j] = t1*d1 + t2*d2;
915 slope = data[ifirst+1] - data[ifirst];
916 for (j = 0; j < ifirst; j++)
917 data[j] = slope*(
float)(j - ifirst) + data[ifirst];
922 if (ilast < nx - 1) {
923 slope = data[ilast] - data[ilast-1];
924 for (j = ilast; j < nx; j++)
925 data[j] = slope*(
float)(j - ilast) + data[ilast];
void vircam_qmedsig(float *data, unsigned char *bpm, long npts, float thresh, int niter, float lowv, float highv, float *median, float *sigma)
float vircam_mean(float *data, unsigned char *bpm, long npts)
int vircam_nebuliser(vir_fits *infile, vir_fits *inconf, int medfilt, int linfilt, int niter, int axis, int twod, int takeout_sky, int norm, int wantback, float signeg, float sigpos, vir_fits **backmap, int *status)
Remove small scale background variations.
cpl_image * vircam_fits_get_image(vir_fits *p)
vir_fits * vircam_fits_duplicate(vir_fits *in)
float vircam_med(float *data, unsigned char *bpm, long npts)
cpl_propertylist * vircam_fits_get_ehu(vir_fits *p)