37#include "catalogue/casu_utils.h"
38#include "catalogue/casu_fits.h"
39#include "casu_stats.h"
51static int casu_defringe_1(casu_fits **infiles,
int nimages, casu_fits *fringe,
52 casu_mask *mask,
int nbsize,
float *scaleout,
55static void kernel_init(
int *nkernel,
float **skernel);
56static float *convolve(
float *data,
int nx,
int ny,
int nkernel,
115extern int casu_defringe(casu_fits **infiles,
int nimages, casu_fits **fringes,
116 int nfringes, casu_mask *mask,
int nbsize,
118 float *sig_before,*scale,*idata,med,mad,ratio;
121 char pname1[64],comment1[64],pname2[64],comment2[64];
122 cpl_propertylist *ehu;
126 if (*status != CASU_OK)
131 sig_before = cpl_malloc(nimages*
sizeof(
float));
132 scale = cpl_malloc(nimages*
sizeof(
float));
139 for (i = 0; i < nimages; i++) {
142 sig_before[i] = 1.48*mad;
147 for (i = 0; i < nfringes; i++) {
148 (void)casu_defringe_1(infiles,nimages,fringes[i],mask,nbsize,scale,
153 (void)sprintf(pname1,
"ESO DRS FRINGE%d",i+1);
154 (void)sprintf(comment1,
"Fringe frame # %d",i+1);
155 (void)sprintf(pname2,
"ESO DRS FRNGSC%d",i+1);
156 (void)sprintf(comment2,
"Fringe scale # %d",i+1);
160 for (j = 0; j < nimages; j++) {
162 cpl_propertylist_update_string(ehu,pname1,
164 cpl_propertylist_set_comment(ehu,pname1,comment1);
165 cpl_propertylist_update_float(ehu,pname2,scale[i]);
166 cpl_propertylist_set_comment(ehu,pname2,comment2);
173 for (i = 0; i < nimages; i++) {
177 ratio = sig_before[i]/(1.48*mad);
178 cpl_propertylist_update_float(ehu,
"ESO QC FRINGE_RATIO",ratio);
179 cpl_propertylist_set_comment(ehu,
"ESO QC FRINGE_RATIO",
180 "Ratio RMS before to after defringing");
182 freespace(sig_before);
220static int casu_defringe_1(casu_fits **infiles,
int nimages, casu_fits *fringe,
221 casu_mask *mask,
int nbsize,
float *scaleout,
223 float frmed,immed,*frdata,*frorig,*wptr,*imdata,*data,scaleth,scalemin;
224 float scaleprev,spreadmin,spreadfbest,gap,offset,clipmax,clip,spreadf;
225 float scalefound,scale,scalelist[3],diff,spreadlist[3],a,b,c;
226 float *frback,*imback,*skernel,*frdatasm,*datasm;
228 int i,iter,nter,k,j,nx,ny,nkernel;
235 if (*status != CASU_OK)
242 npts = (long)(nx*ny);
244 bpmcpl = cpl_malloc(npts*
sizeof(cpl_binary));
245 for (i = 0; i < npts; i++)
251 (void)
casu_backmap(frorig,bpmcpl,nx,ny,nbsize,&frmed,&frback,status);
256 frdata = cpl_malloc(npts*
sizeof(
float));
257 for (i = 0; i < npts; i++)
258 frdata[i] = frorig[i] - frback[i];
263 kernel_init(&nkernel,&skernel);
264 frdatasm = convolve(frdata,nx,ny,nkernel,skernel);
268 wptr = cpl_malloc(npts*
sizeof(
float));
272 for (i = 0; i < nimages; i++) {
278 (void)
casu_backmap(imdata,bpmcpl,nx,ny,nbsize,&immed,&imback,status);
279 data = cpl_malloc(npts*
sizeof(
float));
280 for (j = 0; j < npts; j++)
281 data[j] = imdata[j] - imback[j];
285 datasm = convolve(data,nx,ny,nkernel,skernel);
290 scaleth = immed/frmed;
306 while (nter < NTERMAX && iter < ITERMAX && (fabs(offset)*gap > OGAP ||
313 clip = min(clipmax,CLIPLEV*1.48*spreadmin);
318 if (fabs(scalemin - scaleprev) < 0.5*gap)
320 scaleprev = scalemin;
321 if (fabs(offset) > 0.9)
323 gap = scaleth*pow(2.0,(
double)(1-iter));
333 for (k = 0; k < 3; k++) {
334 scale = scalemin + gap*(float)(k-1);
335 scalelist[k] = scale;
340 for (j = 0; j < npts; j++) {
342 diff = fabs(datasm[j] - scale*frdatasm[j]);
350 spreadlist[k] =
casu_med(wptr,NULL,ntot);
351 if (spreadlist[k] < spreadf) {
352 spreadf = spreadlist[k];
360 if (spreadf > spreadfbest) {
367 b = 0.5*(spreadlist[2] - spreadlist[0]);
368 c = 0.5*(spreadlist[2] + spreadlist[0] - 2.0*spreadlist[1]);
369 offset = max(min((-0.5*b/c),1.0),-1.0);
370 spreadmin = a + b*offset + c*offset*offset;
371 scalemin = scalelist[1] + offset*gap;
376 if (spreadmin > spreadf) {
378 scalemin = scalefound;
384 spreadfbest = min(spreadfbest,spreadf);
395 for (j = 0; j < npts; j++)
396 imdata[j] -= scalemin*(frorig[j] - frmed);
397 scaleout[i] = scalemin;
417static void kernel_init(
int *nkernel,
float **skernel) {
424 *nkernel = (int)(KFWHM*NFWHM + 0.5);
425 if (! (*nkernel & 1))
427 *skernel = cpl_malloc((*nkernel)*(*nkernel)*
sizeof(
float));
432 gsigsq = 1.0/(2.0*pow((
double)KFWHM/2.35,2.0));
438 for (i = -nk2; i <= nk2; i++) {
441 for (j = -nk2; j <= nk2; j++) {
445 (*skernel)[n] = (float)exp(-(di+dj));
446 renorm += (*skernel)[n];
453 for (i = -nk2; i <= nk2; i++) {
454 for (j = -nk2; j <= nk2; j++) {
456 (*skernel)[n] /= renorm;
461static float *convolve(
float *data,
int nx,
int ny,
int nkernel,
464 int nk2,ix,iy,jx,jy,n;
468 work = cpl_calloc(nx*ny,
sizeof(
float));
473 for (iy = nk2; iy < ny-nk2; iy++) {
474 for (ix = nk2; ix < nx-nk2; ix++) {
476 for (jy = iy-nk2; jy <= iy+nk2; jy++) {
478 for (jx = ix-nk2; jx <= ix+nk2; jx++) {
480 work[iy*nx+ix] += skernel[n]*d[jx];
cpl_image * casu_fits_get_image(casu_fits *p)
char * casu_fits_get_fullname(casu_fits *p)
cpl_propertylist * casu_fits_get_ehu(casu_fits *p)
unsigned char * casu_mask_get_data(casu_mask *m)
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.
int casu_defringe(casu_fits **infiles, int nimages, casu_fits **fringes, int nfringes, casu_mask *mask, int nbsize, int *status)
Correct input data to remove fringes.
void casu_medmad(float *data, unsigned char *bpm, long np, float *med, float *mad)
float casu_med(float *data, unsigned char *bpm, long npts)