36 #include "vircam_mods.h"
37 #include "vircam_utils.h"
38 #include "vircam_fits.h"
39 #include "vircam_stats.h"
47 static int vircam_defringe_1(vir_fits **infiles,
int nimages, vir_fits *fringe,
48 vir_mask *mask,
int nbsize,
float *scaleout,
108 int nfringes, vir_mask *mask,
int nbsize,
110 float *sig_before,*scale,*idata,med,mad,ratio;
113 char pname1[64],comment1[64],pname2[64],comment2[64];
114 cpl_propertylist *ehu;
118 if (*status != VIR_OK)
123 sig_before = cpl_malloc(nimages*
sizeof(
float));
124 scale = cpl_malloc(nimages*
sizeof(
float));
131 for (i = 0; i < nimages; i++) {
134 sig_before[i] = 1.48*mad;
139 for (i = 0; i < nfringes; i++) {
140 (void)vircam_defringe_1(infiles,nimages,fringes[i],mask,nbsize,scale,
145 (void)sprintf(pname1,
"ESO DRS FRINGE%d",i);
146 (void)sprintf(comment1,
"Fringe frame # %d",i);
147 (void)sprintf(pname2,
"ESO DRS FRNGSC%d",i);
148 (void)sprintf(comment2,
"Fringe scale # %d",i);
152 for (j = 0; j < nimages; j++) {
154 cpl_propertylist_update_string(ehu,pname1,
156 cpl_propertylist_set_comment(ehu,pname1,comment1);
157 cpl_propertylist_update_float(ehu,pname2,scale[i]);
158 cpl_propertylist_set_comment(ehu,pname2,comment2);
165 for (i = 0; i < nimages; i++) {
169 ratio = sig_before[i]/(1.48*mad);
170 cpl_propertylist_update_float(ehu,
"ESO QC FRINGE_RATIO",ratio);
171 cpl_propertylist_set_comment(ehu,
"ESO QC FRINGE_RATIO",
172 "Ratio RMS before to after defringing");
174 freespace(sig_before);
212 static int vircam_defringe_1(vir_fits **infiles,
int nimages, vir_fits *fringe,
213 vir_mask *mask,
int nbsize,
float *scaleout,
215 cpl_image *frback,*imback,*fringefit,*imfit;
216 float frmed,immed,*frdata,*frorig,*wptr,*imdata,*data,scaleth,scalemin;
217 float scaleprev,spreadmin,spreadfbest,gap,offset,clipmax,clip,spreadf;
218 float scalefound,scale,scalelist[3],diff,spreadlist[3],a,b,c;
226 if (*status != VIR_OK)
238 cpl_image_subtract_scalar(fringefit,frmed);
239 frdata = cpl_image_get_data_float(fringefit);
240 npts = (long)cpl_image_get_size_x(fringefit)*(long)cpl_image_get_size_y(fringefit);
245 wptr = cpl_malloc(npts*
sizeof(
float));
253 for (i = 0; i < nimages; i++) {
261 cpl_image_subtract_scalar(imfit,immed);
262 data = cpl_image_get_data_float(imfit);
267 scaleth = immed/frmed;
283 while (nter < NTERMAX && iter < ITERMAX && (fabs(offset)*gap > OGAP ||
290 clip = min(clipmax,CLIPLEV*1.48*spreadmin);
295 if (fabs(scalemin - scaleprev) < 0.5*gap)
297 scaleprev = scalemin;
298 if (fabs(offset) > 0.9)
300 gap = scaleth*pow(2.0,(
double)(1-iter));
310 for (k = 0; k < 3; k++) {
311 scale = scalemin + gap*(float)(k-1);
312 scalelist[k] = scale;
317 for (j = 0; j < npts; j++) {
319 diff = fabs(data[j] - scale*frdata[j]);
328 if (spreadlist[k] < spreadf) {
329 spreadf = spreadlist[k];
337 if (spreadf > spreadfbest) {
344 b = 0.5*(spreadlist[2] - spreadlist[0]);
345 c = 0.5*(spreadlist[2] + spreadlist[0] - 2.0*spreadlist[1]);
346 offset = max(min((-0.5*b/c),1.0),-1.0);
347 spreadmin = a + b*offset + c*offset*offset;
348 scalemin = scalelist[1] + offset*gap;
353 if (spreadmin > spreadf) {
355 scalemin = scalefound;
361 spreadfbest = min(spreadfbest,spreadf);
372 for (j = 0; j < npts; j++)
373 imdata[j] -= scalemin*(frorig[j] - frmed);
374 scaleout[i] = scalemin;
384 freeimage(fringefit);