37#include "catalogue/casu_utils.h"
38#include "catalogue/casu_fits.h"
39#include "casu_stats.h"
67 unsigned char clipped;
71#define MINDATA -1000.0
72#define MAXDATA 65535.0
74static void average(dstrct *fileptrs, keeptabs *c,
float *outdata,
75 float *outconf,
float cliplow,
float cliphigh,
float lthr,
76 float hthr,
float extra,
float sumweight);
77static keeptabs *clip_open(
int nimages,
int nxo);
78static void clip_close(keeptabs **c,
int nxo);
79static void skyest(
float *data,
int *cdata,
long npts,
float thresh,
80 float dmin,
float dmax,
float *skymed,
float *skynoise);
81static void tidy(
int nxo, dstrct *fileptrs, keeptabs *clipmon,
float *owdata);
152 int nconfs,
float lthr,
float hthr,
153 cpl_propertylist **p,
const char *expkey,
154 cpl_image **out, cpl_image **outc,
int *status) {
156 int i,itx,iy,ccur,clast,ix,n,iline,icol,jy,jx,j,nxo,nyo,*ocdata;
157 long npts,ielm,iloc,index_y,index;
158 dstrct *fileptrs=NULL,*dd;
159 keeptabs *clipmon=NULL,*c;
160 float minxoff,minyoff,expref,sky,skynoise,clip1,clip2,outdata;
161 float outconf,avlev,avvar,renorm,exposure,sumweight,*odata,*owdata=NULL;
162 double crpix1,crpix2;
163 cpl_propertylist *ehu,*p2,*phu;
164 const char *fctid =
"casu_imdither";
172 if (*status != CASU_OK)
178 cpl_msg_error(fctid,
"No input files to combine");
179 tidy(0,fileptrs,clipmon,owdata);
185 fileptrs = cpl_malloc(nimages*
sizeof(dstrct));
192 expref = max(0.5,exposure);
195 for (i = 0; i < nimages; i++) {
201 }
else if (nconfs == 1) {
202 dd->conf = inconf[0];
205 dd->conf = inconf[i];
210 dd->xoff = cpl_propertylist_get_float(ehu,
"ESO DRS XOFFDITHER");
211 dd->yoff = cpl_propertylist_get_float(ehu,
"ESO DRS YOFFDITHER");
212 minxoff = min(dd->xoff,minxoff);
213 minyoff = min(dd->yoff,minyoff);
214 if (cpl_propertylist_has(phu,expkey)) {
215 exposure = (float)cpl_propertylist_get_double(phu,expkey);
216 exposure = max(0.5,exposure);
220 dd->expscale = exposure/expref;
226 npts = dd->nx*dd->ny;
227 skyest(dd->data,dd->cdata,npts,3.0,MINDATA,MAXDATA,&sky,&skynoise);
229 dd->noise = skynoise;
236 cpl_msg_error(fctid,
"Image %s and Confidence map %s don't match",
239 tidy(0,fileptrs,clipmon,owdata);
246 for (i = 0; i < nimages; i++) {
250 dd->ixoff = (int)(dd->xoff + 0.5);
251 dd->iyoff = (int)(dd->yoff + 0.5);
258 fileptrs->sky /= fileptrs->expscale;
259 fileptrs->skydiff = 0.0;
260 fileptrs->weight = 1.0;
262 for (i = 1; i < nimages; i++) {
264 dd->sky /= dd->expscale;
265 dd->skydiff = fileptrs->sky - dd->sky;
266 dd->noise /= (float)sqrt((
double)dd->expscale);
267 dd->weight = (float)(pow((
double)fileptrs->noise,2.0)/pow((
double)dd->noise,2.0));
268 sumweight += dd->weight;
273 for (i = 1; i < nimages; i++) {
275 npts = dd->nx*dd->ny;
276 for (j = 0; j < npts; j++)
277 dd->data[j] = dd->data[j]/dd->expscale + dd->skydiff;
282 clip1 = fileptrs->sky - lthr*fileptrs->noise;
283 clip2 = fileptrs->sky + hthr*fileptrs->noise;
290 for (i = 0; i < nimages; i++) {
292 itx = dd->nx + dd->ixoff;
294 itx = dd->ny + dd->iyoff;
300 *out = cpl_image_new((cpl_size)nxo,(cpl_size)nyo,CPL_TYPE_FLOAT);
305 *outc = cpl_image_new((cpl_size)nxo,(cpl_size)nyo,CPL_TYPE_INT);
312 odata = cpl_image_get_data_float(*out);
314 owdata = cpl_malloc(npts*
sizeof(
float));
315 clipmon = clip_open(nimages,nxo);
320 for (iy = 0; iy < nyo; iy++) {
323 for (ix = 0; ix < nxo; ix++) {
324 c = clipmon + ccur + ix;
328 for (i = 0; i < nimages; i++) {
330 iline = iy - dd->iyoff;
331 if (iline < 0 || iline >= dd->ny)
333 icol = ix - dd->ixoff;
334 if (icol < 0 || icol >= dd->nx)
340 ielm = dd->nx*iline + icol;
341 c->values[n] = dd->data[ielm];
342 c->confs[n] = (float)dd->cdata[ielm];
343 c->weights[n] = dd->weight;
344 c->iff[n] = (
short int)i;
347 c->outindex = nxo*iy + ix;
349 average(fileptrs,c,&outdata,&outconf,clip1,clip2,lthr,hthr,0.0,
351 odata[c->outindex] = outdata;
353 owdata[c->outindex] = outconf;
362 for (ix = 1; ix < nxo-1; ix++) {
363 c = clipmon + clast + ix;
372 for (jy = -1; jy <= 1; jy++) {
373 index_y = iloc + jy*nxo;
374 for (jx = -1; jx <= 1; jx++) {
375 index = index_y + jx;
376 avlev += odata[index];
381 for (jy = -1; jy <= 1; jy++) {
382 index_y = iloc + jy*nxo;
383 for (jx = -1; jx <= 1; jx++) {
384 index = index_y + jx;
385 avvar += fabs(odata[index] - avlev);
394 if (avlev < clip2 || avvar <= 2.0*fileptrs->noise)
399 average(fileptrs,c,&outdata,&outconf,clip1,clip2,lthr,hthr,
400 3.0*avvar,sumweight);
401 odata[c->outindex] = outdata;
403 owdata[c->outindex] = outconf;
409 if (owdata != NULL) {
410 skyest(owdata,NULL,npts,3.0,1.0,MAXDATA,&sky,&skynoise);
412 ocdata = cpl_image_get_data_int(*outc);
413 for (i = 0; i < npts; i++)
414 ocdata[i] = max(0,min(1000,(
int)(owdata[i]*renorm + 0.5)));
426 cpl_propertylist_update_string(p2,
"ESO CASU_TIME",timestamp);
427 cpl_propertylist_set_comment(p2,
"ESO CASU_TIME",
428 "Timestamp for matching to conf map");
432 if (cpl_propertylist_has(*p,
"CRPIX1") &&
433 cpl_propertylist_has(*p,
"CRPIX2")) {
434 crpix1 = cpl_propertylist_get_double(*p,
"CRPIX1");
435 crpix2 = cpl_propertylist_get_double(*p,
"CRPIX2");
436 crpix1 += fileptrs->xoff;
437 crpix2 += fileptrs->yoff;
438 cpl_propertylist_update_double(*p,
"CRPIX1",crpix1);
439 cpl_propertylist_update_double(*p,
"CRPIX2",crpix2);
444 tidy(nxo,fileptrs,clipmon,owdata);
494static void average(dstrct *fileptrs, keeptabs *c,
float *outdata,
495 float *outconf,
float cliplow,
float cliphigh,
float lsig,
496 float hsig,
float extra,
float sumweight) {
498 float valuemax,valuemin,cwmin,cwmax,sum,cnumb,numb,cw,cv,reflev,noise;
506 *outdata = fileptrs->sky;
527 for (i = 0; i < c->n; i++) {
528 cw = c->weights[i]*c->confs[i];
545 *outdata = sum/cnumb;
547 *outdata = fileptrs->sky;
551 if (valuemax > cliphigh && numb > 150.0 && cnumb > 150.0) {
552 reflev = (sum - valuemax*cwmax)/(cnumb - cwmax);
553 noise = (fileptrs+c->iff[imax])->noise;
554 sky = (fileptrs+c->iff[imax])->sky;
555 clipval = reflev + hsig*noise*max(1.0,reflev)/max(1.0,sky) + extra;
556 if (valuemax > clipval) {
557 sum -= valuemax*cwmax;
566 if (valuemin < cliplow && numb > 150.0 && cnumb > 150.0) {
567 reflev = (sum - valuemin*cwmin)/(cnumb - cwmin);
568 noise = (fileptrs+c->iff[imin])->noise;
569 clipval = reflev - lsig*noise;
570 if (valuemin < clipval) {
578 *outconf = cnumb/sumweight;
605static keeptabs *clip_open(
int nimages,
int nxo) {
611 c = cpl_malloc(2*nxo*
sizeof(keeptabs));
612 for (i = 0; i < 2*nxo; i++) {
613 dptr = cpl_malloc(3*nimages*
sizeof(*dptr));
614 iff = cpl_malloc(nimages*
sizeof(*iff));
615 (c+i)->values = dptr;
616 (c+i)->confs = dptr + nimages;
617 (c+i)->weights = dptr + 2*nimages;
620 (c+i)->outindex = -1;
645static void clip_close(keeptabs **c,
int nxo) {
648 for (i = 0; i < 2*nxo; i++) {
649 freespace((*c+i)->values);
650 freespace((*c+i)->iff);
687static void skyest(
float *data,
int *cdata,
long npts,
float thresh,
688 float dmin,
float dmax,
float *skymed,
float *skynoise) {
694 bpm = cpl_calloc(npts,
sizeof(*bpm));
696 for (i = 0; i < npts; i++)
697 bpm[i] = (cdata[i] == 0);
702 casu_qmedsig(data,bpm,npts,thresh,2,dmin,dmax,skymed,skynoise);
715static void tidy(
int nxo, dstrct *fileptrs, keeptabs *clipmon,
float *owdata) {
717 if(owdata != NULL) {cpl_free(owdata);}
719 clip_close(&clipmon,nxo);
720 if(fileptrs != NULL) {cpl_free(fileptrs);}
cpl_image * casu_fits_get_image(casu_fits *p)
char * casu_fits_get_fullname(casu_fits *p)
cpl_propertylist * casu_fits_get_phu(casu_fits *p)
cpl_propertylist * casu_fits_get_ehu(casu_fits *p)
int casu_imdither(casu_fits **inf, casu_fits **inconf, int nimages, int nconfs, float lthr, float hthr, cpl_propertylist **p, const char *expkey, cpl_image **out, cpl_image **outc, int *status)
Dither a set of jittered observations.
void casu_qmedsig(float *data, unsigned char *bpm, long npts, float thresh, int niter, float lowv, float highv, float *median, float *sigma)
void casu_prov(cpl_propertylist *p, casu_fits **inlist, int n, int isextn)
Write provenance keywords.
void casu_timestamp(char *out, int n)
Create a timestamp string.