40#include "catalogue/casu_fits.h"
42#include "catalogue/casu_utils.h"
43#include "casu_stats.h"
44#include "catalogue/casu_wcsutils.h"
46static void casu_sky_mask_grow(cpl_image *dith,
float rad);
47static float casu_sky_med(casu_fits *sky);
48static void casu_sky_joffs(casu_fits **inlist,
int nfiles,
float **xoffs,
50static void casu_sky_xytoxy(cpl_wcs *inwcs, cpl_wcs *outwcs,
51 cpl_matrix *inxy, cpl_matrix **outxy);
111 casu_fits *conf, casu_mask *mask,
112 casu_fits **skyout, casu_fits **skyvar,
int niter,
113 int ipix,
float thresh,
int nbsize,
float smkern,
115 int i,nx,ny,nbad0,lastone,iter,npts,nbad_init,nbad,dbad;
116 int xx1,xx2,yy1,yy2,nfiles2,*confdata;
117 const char *fctid =
"casu_pawsky_mask";
118 cpl_image *dith,*dithc,*skyim,*im,*newim,*outim,*outimv;
119 cpl_mask *cplmask,*dithmask,*newmask,*curmask;
120 casu_fits **list_ss,*dithf,*dithcf,**inlist2,**invar2;
121 unsigned char *inbpm,*rejmask,*rejplus;
122 float medsky,*xoffs,*yoffs,mindx,mindy,fbad;
123 cpl_propertylist *p,*drs;
129 if (*status != CASU_OK)
135 cpl_msg_error(fctid,
"Sky correction impossible. No science frames");
141 inlist2 = cpl_malloc(nfiles*
sizeof(casu_fits *));
143 invar2 = cpl_malloc(nfiles*
sizeof(casu_fits *));
147 for (i = 0; i < nfiles; i++) {
149 inlist2[nfiles2] = inlist[i];
151 invar2[nfiles2] = invar[i];
170 cpl_msg_warning(fctid,
"No good images in input list");
183 cplmask = cpl_mask_wrap((cpl_size)nx,(cpl_size)ny,(cpl_binary *)inbpm);
184 for (i = 0; i < nfiles2; i++)
186 cpl_mask_unwrap(cplmask);
190 casu_imcombine(inlist2,invar2,nfiles2,1,1,0,2.0,
"EXPTIME",&outim,&outimv,
191 &rejmask,&rejplus,&drs,status);
197 freepropertylist(drs);
210 medsky = casu_sky_med(*skyout);
214 casu_sky_joffs(inlist2,nfiles2,&xoffs,&yoffs);
217 for (i = 1; i < nfiles2; i++) {
218 mindx = min(mindx,xoffs[i]);
219 mindy = min(mindy,yoffs[i]);
224 list_ss = cpl_malloc(nfiles2*
sizeof(casu_fits *));
226 for (i = 0; i < nfiles2; i++) {
228 newim = cpl_image_subtract_create(im,skyim);
229 cpl_image_add_scalar(newim,(
double)medsky);
240 for (iter = 1; iter <= niter; iter++) {
243 lastone = (iter == niter);
247 (void)
casu_imdither(list_ss,&conf,nfiles2,1,5.0,5.0,&p,
"EXPTIME",&dith,
249 cpl_propertylist_delete(p);
253 confdata = cpl_image_get_data_int(dithc);
254 npts = (int)cpl_image_get_size_x(dithc)*(int)cpl_image_get_size_y(dithc);
256 for (i = 0; i < npts; i++)
257 if (confdata[i] == 0)
262 for (i = 0; i < nfiles2; i++)
272 (void)
casu_opm(dithf,dithcf,ipix,thresh,nbsize,smkern,2,status);
277 nbad = (int)cpl_image_count_rejected((
const cpl_image *)dith) -
280 fbad = (iter > 1 ? (float)abs(dbad)/(float)nbad0 : 10000.0);
282 "Iteration: %" CPL_SIZE_FORMAT
", Nreject: %" CPL_SIZE_FORMAT
" %" CPL_SIZE_FORMAT,
283 (cpl_size)iter,(cpl_size)nbad,(cpl_size)nbad0);
284 if (fbad < 0.025 || dbad < 0) {
292 casu_sky_mask_grow(dith,2);
297 dithmask = cpl_image_get_bpm(dith);
298 for (i = 0; i < nfiles2; i++) {
299 xx1 = (int)(-mindx + xoffs[i] + 1.5);
301 yy1 = (int)(-mindy + yoffs[i] + 1.5);
303 newmask = cpl_mask_extract(dithmask,(cpl_size)xx1,(cpl_size)yy1,
304 (cpl_size)xx2,(cpl_size)yy2);
306 cpl_mask_or(curmask,newmask);
307 cpl_mask_delete(newmask);
318 &outimv,&rejmask,&rejplus,&drs,status);
324 freepropertylist(drs);
326 cpl_propertylist_update_string(p,
"ESO DRS SKYALGO",
"pawsky_mask");
327 cpl_propertylist_set_comment(p,
"ESO DRS SKYALGO",
328 "Sky estimation algorithm");
339 for (i = 0; i < nfiles2; i++) {
341 newim = cpl_image_subtract_create(im,skyim);
342 cpl_image_add_scalar(newim,(
double)medsky);
413 int nfiles, casu_mask *mask,
414 casu_fits *objmask,
int nbsize,
415 casu_fits **skyout, casu_fits **skyvar,
417 const char *fctid =
"casu_pawsky_mask_pre";
418 unsigned char *inbpm,*rejplus,*rejmask;
419 int nx,ny,npts,ncoor,i,j,nx_objmask,ny_objmask,k,kk,ix,iy,ind,*opm;
422 cpl_wcs *wcs_objmask,*wcs;
423 cpl_matrix *in_xy,*out_xy,*ddx,*ddx_out;
424 cpl_image *im,*outim,*outimv;
425 cpl_propertylist *drs,*p;
426 double *inxy_data,xx,yy,*ddx_data,shiftx,shifty;
427 casu_fits **inlist2,**invar2;
433 if (*status != CASU_OK)
439 cpl_msg_error(fctid,
"Sky correction impossible. No science frames");
445 inlist2 = cpl_malloc(nfiles*
sizeof(casu_fits *));
447 invar2 = cpl_malloc(nfiles*
sizeof(casu_fits *));
451 for (i = 0; i < nfiles; i++) {
453 inlist2[nfiles2] = inlist[i];
455 invar2[nfiles2] = invar[i];
474 cpl_msg_warning(fctid,
"No good images in input list");
486 cplmask = cpl_mask_wrap((cpl_size)nx,(cpl_size)ny,(cpl_binary *)inbpm);
487 for (i = 0; i < nfiles2; i++)
489 cpl_mask_unwrap(cplmask);
503 in_xy = cpl_matrix_new((cpl_size)npts,(cpl_size)ncoor);
507 inxy_data = cpl_matrix_get_data(in_xy);
509 for (j = 0; j < ny; j++) {
510 for (i = 0; i < nx; i++) {
511 inxy_data[k++] = (double)(i+1);
512 inxy_data[k++] = (double)(j+1);
518 ddx = cpl_matrix_new(1,2);
519 ddx_data = cpl_matrix_get_data(ddx);
528 for (k = 0; k < nfiles2; k++) {
532 casu_sky_xytoxy(wcs,wcs_objmask,in_xy,&out_xy);
533 casu_sky_xytoxy(wcs,wcs_objmask,ddx,&ddx_out);
535 shiftx = cpl_matrix_get(out_xy,0,0) - cpl_matrix_get(ddx_out,0,0);
536 shifty = cpl_matrix_get(out_xy,0,1) - cpl_matrix_get(ddx_out,0,1);
538 for (j = 0; j < ny; j++) {
539 for (i = 0; i < nx; i++) {
540 xx = cpl_matrix_get(out_xy,kk,0) - shiftx;
541 yy = cpl_matrix_get(out_xy,kk,1) - shifty;
545 if (ix < 1 || ix > nx_objmask || iy < 1 || iy > ny_objmask)
547 ind = (iy-1)*nx_objmask + ix - 1;
549 cpl_image_reject(im,i+1,j+1);
552 cpl_matrix_delete(ddx_out);
554 cpl_matrix_delete(in_xy);
555 cpl_matrix_delete(out_xy);
556 cpl_wcs_delete(wcs_objmask);
560 casu_imcombine(inlist2,invar2,nfiles2,1,1,0,2.0,
"EXPTIME",&outim,&outimv,
561 &rejmask,&rejplus,&drs,status);
567 freepropertylist(drs);
570 cpl_propertylist_update_string(p,
"ESO DRS SKYALGO",
"pawsky_mask_pre");
571 cpl_propertylist_set_comment(p,
"ESO DRS SKYALGO",
572 "Sky estimation algorithm");
573 cpl_propertylist_update_string(p,
"ESO DRS MASKUSED",
575 cpl_propertylist_set_comment(p,
"ESO DRS MASKUSED",
576 "Object masked used to make sky");
644 int nfiles, casu_fits *conf, casu_mask *mask,
645 casu_fits **skyout, casu_fits **skyvar,
646 int niter,
int ipix,
float thresh,
int nbsize,
647 float smkern,
int *status) {
648 const char *fctid =
"casu_simplesky_mask";
649 unsigned char *inbpm,*rejmask,*rejplus;
650 int nx,ny,i,ninit,nbad0,iter,nbad,nb,dbad,lastone,nfiles2;
651 cpl_mask *cplmask,*newmask,*oldmask;
652 cpl_image *outim,*skyim,*im,*outimv;
653 cpl_propertylist *drs,*p;
654 casu_fits *skysub_im,**inlist2,**invar2;
661 if (*status != CASU_OK)
667 cpl_msg_error(fctid,
"Sky correction impossible. No science frames");
673 inlist2 = cpl_malloc(nfiles*
sizeof(casu_fits *));
675 invar2 = cpl_malloc(nfiles*
sizeof(casu_fits*));
679 for (i = 0; i < nfiles; i++) {
681 inlist2[nfiles2] = inlist[i];
683 invar2[nfiles2] = invar[i];
702 cpl_msg_warning(fctid,
"No good images in input list");
714 cplmask = cpl_mask_wrap((cpl_size)nx,(cpl_size)ny,(cpl_binary *)inbpm);
715 for (i = 0; i < nfiles2; i++)
717 cpl_mask_unwrap(cplmask);
722 casu_imcombine(inlist2,invar2,nfiles2,1,1,0,2.0,
"EXPTIME",&outim,&outimv,
723 &rejmask,&rejplus,&drs,status);
729 freepropertylist(drs);
743 for (iter = 1; iter <= niter; iter++) {
750 medsky = casu_sky_med(*skyout);
752 for (i = 0; i < nfiles2; i++) {
754 outim = cpl_image_subtract_create(im,skyim);
755 cpl_image_add_scalar(outim,(
double)medsky);
758 (void)
casu_opm(skysub_im,conf,ipix,thresh,nbsize,smkern,2,
760 nb = (int)cpl_image_count_rejected((
const cpl_image *)outim) -
763 newmask = cpl_image_get_bpm(outim);
764 oldmask = cpl_image_get_bpm(im);
765 cpl_mask_or(oldmask,newmask);
772 fbad = (iter > 1 ? (float)abs(dbad)/(float)nbad0 : 10000.0);
774 "Iteration: %" CPL_SIZE_FORMAT
", Nreject: %" CPL_SIZE_FORMAT
" %" CPL_SIZE_FORMAT,
775 (cpl_size)iter,(cpl_size)nbad,(cpl_size)nbad0);
777 if (fbad < 0.025 || dbad < 0) {
787 if (lastone || iter == niter) {
795 &outimv,&rejmask,&rejplus,&drs,status);
802 freepropertylist(drs);
804 cpl_propertylist_update_string(p,
"ESO DRS SKYALGO",
806 cpl_propertylist_set_comment(p,
"ESO DRS SKYALGO",
807 "Sky estimation algorithm");
835static void casu_sky_mask_grow(cpl_image *dith,
float rad) {
836 cpl_binary *inmap,*outmap;
837 int nx,ny,ir,i,j,indx,ixmin,ixmax,iymin,iymax,ii,jj,indx2;
842 inmap = cpl_mask_get_data(cpl_image_get_bpm(dith));
843 nx = (int)cpl_image_get_size_x(dith);
844 ny = (int)cpl_image_get_size_y(dith);
848 outmap = cpl_malloc(nx*ny*
sizeof(*outmap));
849 memmove(outmap,inmap,nx*ny*
sizeof(*inmap));
861 for (j = 0; j < ny; j++) {
862 for (i = 0; i < nx; i++) {
864 if (inmap[indx] != 2)
867 ixmax = min(nx-1,i+ir);
869 iymax = min(ny-1,j+ir);
870 for (jj = iymin; jj <= iymax; jj++) {
871 dy = (float)(jj - j);
872 for (ii = ixmin; ii <= ixmax; ii++) {
873 dx = (float)(ii - i);
874 radius = (float)sqrt(pow(dx,2.0) + pow(dy,2.0));
887 memmove(inmap,outmap,nx*ny*
sizeof(*inmap));
911static float casu_sky_med(casu_fits *sky) {
920 npts = (int)cpl_image_get_size_x(skyim)*(int)cpl_image_get_size_y(skyim);
924 data = cpl_image_get_data_float(skyim);
925 bpm = (
unsigned char *)cpl_mask_get_data(cpl_image_get_bpm(skyim));
929 med =
casu_med(data,bpm,(
long)npts);
957static void casu_sky_joffs(casu_fits **inlist,
int nfiles,
float **xoffs,
960 cpl_wcs *wcsref,*wcs;
962 const double maxoffset = 12000;
964 const char *fctid =
"casu_sky_joffs";
968 *xoffs = cpl_malloc(nfiles*
sizeof(
float));
969 *yoffs = cpl_malloc(nfiles*
sizeof(
float));
975 for (i = 0; i < nfiles; i++) {
983 cpl_msg_warning(fctid,
"Unable to get WCS for %s",
1008 if (status != CASU_OK) {
1011 cpl_msg_warning(fctid,
"Unable to WCS difference for %s",
1013 }
else if (fabs((
double)xoff) > maxoffset ||
1014 fabs((
double)yoff) > maxoffset) {
1016 cpl_msg_error(fctid,
"WCS offsets for %s are >%g: %g %g -- ignoring",
1022 cpl_wcs_delete(wcs);
1025 cpl_wcs_delete(wcsref);
1029 for (i = 0; i < nfiles; i++) {
1032 "ESO DRS XOFFDITHER",
1033 (
double)(*xoffs)[i]);
1035 "ESO DRS YOFFDITHER",
1036 (
double)(*yoffs)[i]);
1064static void casu_sky_xytoxy(cpl_wcs *inwcs, cpl_wcs *outwcs,
1065 cpl_matrix *inxy, cpl_matrix **outxy) {
1071 cpl_wcs_convert(inwcs,inxy,&radec,&wstatus,CPL_WCS_PHYS2WORLD);
1072 cpl_array_delete(wstatus);
1076 cpl_wcs_convert(outwcs,radec,outxy,&wstatus,CPL_WCS_WORLD2PHYS);
1077 cpl_array_delete(wstatus);
1078 cpl_matrix_delete(radec);
casu_fits * casu_fits_wrap(cpl_image *im, casu_fits *model, cpl_propertylist *phu, cpl_propertylist *ehu)
int casu_fits_get_status(casu_fits *p)
cpl_image * casu_fits_get_image(casu_fits *p)
void casu_fits_delete(casu_fits *p)
int casu_fits_set_error(casu_fits *p, int status)
char * casu_fits_get_filename(casu_fits *p)
void casu_fits_set_status(casu_fits *p, int status)
cpl_propertylist * casu_fits_get_ehu(casu_fits *p)
unsigned char * casu_mask_get_data(casu_mask *m)
int casu_mask_get_size_y(casu_mask *m)
int casu_mask_get_size_x(casu_mask *m)
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.
int casu_simplesky_mask(casu_fits **inlist, casu_fits **invar, int nfiles, casu_fits *conf, casu_mask *mask, casu_fits **skyout, casu_fits **skyvar, int niter, int ipix, float thresh, int nbsize, float smkern, int *status)
Work out a masked sky estimate from a jitter series with large offsets.
int casu_imcombine(casu_fits **fset, casu_fits **fsetv, int nfits, int combtype, int scaletype, int xrej, float thresh, const char *expkey, cpl_image **outimage, cpl_image **outvimage, unsigned char **rejmask, unsigned char **rejplus, cpl_propertylist **drs, int *status)
Stack images into a mean or median image with rejection.
int casu_pawsky_mask_pre(casu_fits **inlist, casu_fits **invar, int nfiles, casu_mask *mask, casu_fits *objmask, int nbsize, casu_fits **skyout, casu_fits **skyvar, int *status)
Work out a sky estimate from an input jitter series and a pre-existing object mask.
int casu_opm(casu_fits *infile, casu_fits *conf, int ipix, float threshold, int nbsize, float filtfwhm, int niter, int *status)
Generate an object mask from an input image.
int casu_inpaint(casu_fits *in, int nbsize, int *status)
Inpaint pixels or patches in a map.
int casu_pawsky_mask(casu_fits **inlist, casu_fits **invar, int nfiles, casu_fits *conf, casu_mask *mask, casu_fits **skyout, casu_fits **skyvar, int niter, int ipix, float thresh, int nbsize, float smkern, int *status)
Work out a masked sky estimate from an input jitter series.
float casu_med(float *data, unsigned char *bpm, long npts)
void casu_dummy_property(cpl_propertylist *p)
Set dummy property keyword.
cpl_image * casu_dummy_image(casu_fits *model)
Create a dummy image of zeros based on a model.
int casu_diffxywcs(cpl_wcs *wcs, cpl_wcs *wcsref, float *xoff, float *yoff, int *status)