40#include "catalogue/casu_fits.h"
42#include "catalogue/casu_utils.h"
43#include "casu_stats.h"
44#include "catalogue/casu_wcsutils.h"
46#define DATAMIN -1000.0
47#define DATAMAX 65535.0
49static void masksky_zeros(
float **datas,
unsigned char **masks,
int nfiles,
50 int npts,
float **zeros);
51static void combine(
int nfiles,
int stat,
int npts,
float **datas,
float **vars,
52 unsigned char **masks,
float **skyout,
float **skyv,
53 unsigned char **skyout_bpm);
54static void combine_mult(
int nfiles,
int stat,
int npts,
float **datas,
55 float **vars,
unsigned char **masks,
float *skyout,
57static void domed(
float *buf,
int n,
float *val);
113 casu_fits *conf, casu_fits *objmaskfits,
114 int nfiles, casu_fits **skyout, casu_fits **skyvar,
116 cpl_wcs *wcsmask,*wcsimg;
117 unsigned char **masks,*sky_bpm;
118 cpl_image *im,*skyim,*skyimv;
119 double *xin = NULL, *yin = NULL, *xout = NULL, *yout = NULL, *dx = NULL, *dy = NULL, ddx, ddy;
120 int nx,ny,npts,ind,i,j,kind,ix,iy,jx,jy,*opm = NULL;
122 int nfiles2, *confdata = NULL;
123 float **datas,*sky,*skyv,*zeros,val,sig,**vars;
124 cpl_propertylist *plist;
125 casu_fits **infiles2,**invar2;
126 const char *fctid =
"casu_pawsky_minus";
132 if (*status != CASU_OK)
138 cpl_msg_error(fctid,
"Sky correction impossible. No science frames");
144 infiles2 = cpl_malloc(nfiles*
sizeof(casu_fits *));
146 invar2 = cpl_malloc(nfiles*
sizeof(casu_fits *));
150 for (i = 0; i < nfiles; i++) {
152 infiles2[nfiles2] = infiles[i];
154 invar2[nfiles2] = invar[i];
172 cpl_msg_warning(fctid,
"No good images in input list");
180 datas = cpl_malloc(nfiles2*
sizeof(
float *));
182 vars = cpl_malloc(nfiles2*
sizeof(
float *));
185 masks = cpl_malloc(nfiles2*
sizeof(
unsigned char *));
187 nx = cpl_image_get_size_x(im);
188 ny = cpl_image_get_size_y(im);
193 if (objmaskfits != NULL) {
201 xin = cpl_malloc(npts*
sizeof(
double));
202 yin = cpl_malloc(npts*
sizeof(
double));
203 xout = cpl_malloc(npts*
sizeof(
double));
204 yout = cpl_malloc(npts*
sizeof(
double));
205 dx = cpl_malloc(nfiles2*
sizeof(
double));
206 dy = cpl_malloc(nfiles2*
sizeof(
double));
211 for (j = 0; j < ny; j++) {
212 for (i = 0; i < nx; i++) {
213 xin[ind] = (double)(i+1);
214 yin[ind++] = (double)(j+1);
223 for (i = 0; i < nfiles2; i++) {
230 cpl_wcs_delete(wcsimg);
232 cpl_wcs_delete(wcsmask);
239 for (i = 0; i < nfiles2; i++) {
241 datas[i] = cpl_image_get_data_float(im);
242 masks[i] = cpl_calloc(npts,
sizeof(
unsigned char));
254 for (jy = 0; jy < ny; jy++) {
255 for (jx = 0; jx < nx; jx++) {
257 if (confdata != NULL && confdata[ind] == 0) {
259 }
else if (objmaskfits != NULL) {
260 kind = (int)(yout[ind] + dy[i] - 0.5)*nx_mask +
261 (int)(xout[ind] + dx[i] - 0.5);
263 masks[i][ind] = opm[kind];
272 if (objmaskfits != NULL) {
283 masksky_zeros(datas,masks,nfiles2,npts,&zeros);
287 combine(nfiles2,0,npts,datas,vars,masks,&sky,&skyv,&sky_bpm);
291 skyim = cpl_image_wrap_float(nx,ny,sky);
292 for (i = 0; i < npts; i++) {
294 ix = npts - (iy-1)*nx;
296 cpl_image_reject(skyim,(cpl_size)ix,(cpl_size)iy);
301 if (objmaskfits != NULL) {
302 cpl_propertylist_update_string(plist,
"ESO DRS MASKUSED",
304 cpl_propertylist_set_comment(plist,
"ESO DRS MASKUSED",
305 "Object masked used to make sky");
307 cpl_propertylist_update_string(plist,
"ESO DRS SKYALGO",
"pawsky_minus");
308 cpl_propertylist_set_comment(plist,
"ESO DRS SKYALGO",
309 "Sky estimation algorithm");
312 skyimv = cpl_image_wrap_float(nx,ny,skyv);
324 combine_mult(nfiles2,0,npts,datas,vars,masks,sky,skyv);
328 for (i = 0; i < nfiles2; i++) {
329 casu_qmedsig(datas[i],masks[i],(
long)npts,3.0,1,DATAMIN,DATAMAX,&val,
331 val = zeros[i] - val;
332 for (j = 0; j < npts; j++)
339 for (i = 0; i < nfiles2; i++) {
341 cpl_propertylist_update_string(plist,
"ESO DRS SKYSUB",
342 "Done with pawsky_minus");
381static void masksky_zeros(
float **datas,
unsigned char **masks,
int nfiles,
382 int npts,
float **zeros) {
384 float sig,off,medval;
388 *zeros = cpl_malloc(nfiles*
sizeof(
float));
392 for (i = 0; i < nfiles; i++)
393 casu_qmedsig(datas[i],masks[i],(
long)npts,3.0,1,DATAMIN,
394 DATAMAX,*zeros+i,&sig);
398 medval =
casu_med(*zeros,NULL,nfiles);
402 for (i = 0; i < nfiles; i++) {
403 off = medval - (*zeros)[i];
404 for (j = 0; j < npts; j++)
446static void combine(
int nfiles,
int stat,
int npts,
float **datas,
float **vars,
447 unsigned char **masks,
float **skyout,
float **skyv,
448 unsigned char **skyout_bpm) {
454 *skyout = cpl_malloc(npts*
sizeof(
float));
456 *skyv = cpl_malloc(npts*
sizeof(
float));
459 *skyout_bpm = cpl_malloc(npts*
sizeof(
unsigned char));
460 buf = cpl_malloc(nfiles*
sizeof(
float));
464 for (j = 0; j < npts; j++) {
467 for (i = 0; i < nfiles; i++) {
468 if (masks[i][j] == 0) {
469 buf[n] = datas[i][j];
479 (*skyout_bpm)[j] = 1;
482 sum /= powf((
float)n,2.0);
484 domed(buf,n,(*skyout)+j);
486 (*skyv)[j] = sum*CPL_MATH_PI_2;
492 (*skyout_bpm)[j] = 0;
538static void combine_mult(
int nfiles,
int stat,
int npts,
float **datas,
539 float **vars,
unsigned char **masks,
float *skyout,
542 float *buf,*bufv = NULL,*val,*valv = NULL;
546 buf = cpl_malloc(nfiles*
sizeof(
float));
547 val = cpl_malloc(nfiles*
sizeof(
float));
549 bufv = cpl_malloc(nfiles*
sizeof(
float));
550 valv = cpl_malloc(nfiles*
sizeof(
float));
555 for (j = 0; j < npts; j++) {
562 for (i = 0; i < nfiles; i++) {
563 if (masks[i][j] != 0) {
569 for (k = 0; k < nfiles; k++) {
570 if (k == i || masks[k][j] != 0)
572 buf[n] = datas[k][j];
573 if (vars != NULL && vars[i] != NULL)
574 bufv[n++] = vars[k][j];
584 valv[i] = CPL_MATH_PI_2*
casu_mean(bufv,NULL,n);
596 for (i = 0; i < nfiles; i++) {
597 datas[i][j] -= val[i];
599 vars[i][j] += valv[i];
638static void domed(
float *buf,
int n,
float *val) {
645 *val = 0.5*(buf[n2-1] + buf[n2]);
650 *val = 0.5*buf[n2] + 0.25*(buf[n2-1] + buf[n2+1]);
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)
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)
int casu_inpaint(casu_fits *in, int nbsize, int *status)
Inpaint pixels or patches in a map.
int casu_pawsky_minus(casu_fits **infiles, casu_fits **invar, casu_fits *conf, casu_fits *objmaskfits, int nfiles, casu_fits **skyout, casu_fits **skyvar, int *status)
Background correct images using pawsky_minus algorithm.
float casu_med(float *data, unsigned char *bpm, long npts)
void casu_qmedsig(float *data, unsigned char *bpm, long npts, float thresh, int niter, float lowv, float highv, float *median, float *sigma)
float casu_mean(float *data, unsigned char *bpm, long npts)
void casu_prov(cpl_propertylist *p, casu_fits **inlist, int n, int isextn)
Write provenance keywords.
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.
void casu_sort(float **a, int n, int m)
Sort a 2d array by the first column and co-sort the rest.
void casu_xytoxy_list(cpl_wcs *wcs1, cpl_wcs *wcs2, int nc, double *x_1, double *y_1, double *x_2, double *y_2)