38 #include "vircam_sky.h"
39 #include "vircam_mask.h"
40 #include "vircam_fits.h"
41 #include "vircam_mods.h"
42 #include "vircam_utils.h"
43 #include "vircam_stats.h"
44 #include "vircam_wcsutils.h"
45 #include "vircam_dfs.h"
46 #include "vircam_pfits.h"
53 unsigned char **masks;
55 unsigned char *master_xsky_bpm;
57 unsigned char **xsky_variant_bpm;
62 static void combine_master(
int nfiles,
int stat,
int npts,
float **datas,
63 unsigned char **masks,
float **skyout,
64 unsigned char **skyout_bpm);
65 static void combine_variant(
int stat,
int npts, jpos *jp,
int skipme);
66 static void combine_final(
int nxskys,
int stat,
int npts,
float **xskys,
67 unsigned char **xsky_masks,
float *data,
68 float *master_sky,
unsigned char *master_bpm);
69 static void masksky_zeros(jpos *jp,
int njit,
int npts);
70 static void domed(
float *buf,
int n,
float *val);
71 static jpos *jpos_init(
int njit);
72 static void jpos_alloc(vir_fits **infiles,
int nfiles,
int pawpos, jpos *jp);
73 static void jpos_free(jpos *jp,
int njit);
196 extern int vircam_tilesky_minus(vir_fits **infiles, vir_fits *conf,
197 vir_fits *objmaskfits,
int nfiles,
int nconfs,
198 vir_fits **skyout,
int *status) {
199 int i,nx_mask,ny_mask,ind,j,nx,ny,kind,njit,*confdata,jx,jy,ix,iy,k;
202 cpl_wcs *wcsmask,*wcsimg;
203 cpl_image *im,*skyim;
204 cpl_propertylist *plist;
205 unsigned char **xsky_masks,*master_sky_lev2_bpm;
206 double *xin,*yin,*xout,*yout,*dx,*dy,ddx,ddy;
207 float **xskys,*master_sky_lev2,val,sig;
208 const char *fctid =
"vircam_tilesky_minus";
213 if (*status != VIR_OK)
219 cpl_msg_error(fctid,
"Sky correction impossible. No science frames");
230 jp = jpos_init(njit);
231 for (i = 1; i <= njit; i++)
232 jpos_alloc(infiles,nfiles,i,jp+i-1);
239 if (objmaskfits != NULL) {
248 xin = cpl_malloc(npts*
sizeof(
double));
249 yin = cpl_malloc(npts*
sizeof(
double));
250 xout = cpl_malloc(npts*
sizeof(
double));
251 yout = cpl_malloc(npts*
sizeof(
double));
252 dx = cpl_malloc(nfiles*
sizeof(
double));
253 dy = cpl_malloc(nfiles*
sizeof(
double));
258 for (j = 0; j < ny; j++) {
259 for (i = 0; i < nx; i++) {
260 xin[ind] = (double)(i+1);
261 yin[ind++] = (double)(j+1);
270 for (i = 0; i < nfiles; i++) {
277 cpl_wcs_delete(wcsimg);
279 cpl_wcs_delete(wcsmask);
286 for (j = 0; j < njit; j++) {
287 for (i = 0; i < jp[j].nimages; i++) {
289 jp[j].datas[i] = cpl_image_get_data_float(im);
290 jp[j].masks[i] = cpl_calloc(npts,
sizeof(
unsigned char));
291 if (i == 0 && j == 0)
300 for (jy = 0; jy < ny; jy++) {
301 for (jx = 0; jx < nx; jx++) {
303 if (confdata[ind] == 0) {
304 jp[j].masks[i][ind] = 1;
305 }
else if (objmaskfits != NULL) {
306 kind = (int)(yout[ind] + dy[i] - 0.5)*nx_mask +
307 (int)(xout[ind] + dx[i] - 0.5);
308 jp[j].masks[i][ind] = opm[kind];
317 if (objmaskfits != NULL) {
328 masksky_zeros(jp,njit,npts);
335 for (i = 0; i < njit; i++) {
339 combine_master(jp[i].nimages,0,npts,jp[i].datas,jp[i].masks,
340 &(jp[i].master_xsky),&(jp[i].master_xsky_bpm));
344 for (j = 0; j < jp[i].nimages; j++)
345 combine_variant(0,npts,jp+i,j);
350 xskys = cpl_malloc(njit*
sizeof(
float *));
351 xsky_masks = cpl_malloc(njit*
sizeof(
unsigned char *));
352 for (i = 0; i < njit; i++) {
353 xskys[i] = jp[i].master_xsky;
354 xsky_masks[i] = jp[i].master_xsky_bpm;
356 combine_master(njit,0,npts,xskys,xsky_masks,&master_sky_lev2,
357 &master_sky_lev2_bpm);
361 skyim = cpl_image_wrap_float(nx,ny,master_sky_lev2);
362 for (i = 0; i < npts; i++) {
364 ix = i - (iy-1)*nx + 1;
365 if (master_sky_lev2_bpm[i])
366 cpl_image_reject(skyim,(cpl_size)ix,(cpl_size)iy);
370 if (objmaskfits != NULL) {
371 cpl_propertylist_update_string(plist,
"ESO DRS MASKUSED",
373 cpl_propertylist_set_comment(plist,
"ESO DRS MASKUSED",
374 "Object masked used to make sky");
376 cpl_propertylist_update_string(plist,
"ESO DRS SKYALGO",
"tilesky_minus");
377 cpl_propertylist_set_comment(plist,
"ESO DRS SKYALGO",
378 "Sky estimation algorithm");
388 for (j = 0; j < njit; j++) {
389 for (i = 0; i < njit; i++) {
390 xskys[i] = jp[i].master_xsky;
391 xsky_masks[i] = jp[i].master_xsky_bpm;
393 for (i = 0; i < jp[j].nimages; i++) {
394 xskys[j] = jp[j].xsky_variant[i];
395 xsky_masks[j] = jp[j].xsky_variant_bpm[i];
396 combine_final(njit,0,npts,xskys,xsky_masks,jp[j].datas[i],
397 master_sky_lev2,master_sky_lev2_bpm);
402 -1000.0,65535.0,&val,&sig);
403 val = jp[j].zeros[i] - val;
404 for (k = 0; k < npts; k++)
405 jp[j].datas[i][k] += val;
412 freespace(xsky_masks);
413 freespace(master_sky_lev2_bpm);
418 static void combine_master(
int nfiles,
int stat,
int npts,
float **datas,
419 unsigned char **masks,
float **skyout,
420 unsigned char **skyout_bpm) {
426 *skyout = cpl_malloc(npts*
sizeof(
float));
427 *skyout_bpm = cpl_malloc(npts*
sizeof(
unsigned char));
428 buf = cpl_malloc(nfiles*
sizeof(
float));
432 for (j = 0; j < npts; j++) {
434 for (i = 0; i < nfiles; i++) {
435 if (masks[i][j] == 0)
436 buf[n++] = datas[i][j];
440 (*skyout_bpm)[j] = 1;
443 domed(buf,n,(*skyout)+j);
446 (*skyout_bpm)[j] = 0;
456 static void combine_variant(
int stat,
int npts, jpos *jp,
int skipme) {
458 float *buf,**datas,*skyout,*master_sky;
459 unsigned char **masks,*skyout_bpm,*master_sky_bpm;
465 master_sky = jp->master_xsky;
466 master_sky_bpm = jp->master_xsky_bpm;
467 nfiles = jp->nimages;
471 skyout = cpl_malloc(npts*
sizeof(
float));
472 jp->xsky_variant[skipme] = skyout;
473 skyout_bpm = cpl_malloc(npts*
sizeof(
unsigned char));
474 jp->xsky_variant_bpm[skipme] = skyout_bpm;
475 buf = cpl_malloc(nfiles*
sizeof(
float));
481 memmove(skyout,jp->master_xsky,npts*
sizeof(
float));
482 memmove(skyout_bpm,jp->master_xsky_bpm,npts*
sizeof(
unsigned char));
489 for (j = 0; j < npts; j++) {
495 if (masks[skipme][j]) {
496 skyout[j] = master_sky[j];
497 skyout_bpm[j] = master_sky_bpm[j];
503 for (i = 0; i < nfiles; i++) {
504 if (masks[i][j] == 0 && i != skipme)
505 buf[n++] = datas[i][j];
512 domed(buf,n,skyout+j);
525 static void combine_final(
int nxskys,
int stat,
int npts,
float **xskys,
526 unsigned char **xsky_masks,
float *data,
527 float *master_sky,
unsigned char *master_bpm) {
533 buf = cpl_malloc(nxskys*
sizeof(
float));
537 for (j = 0; j < npts; j++) {
552 for (i = 0; i < nxskys; i++) {
553 if (xsky_masks[i][j] != 0)
555 buf[n++] = xskys[i][j];
579 static jpos *jpos_init(
int njit) {
583 jp = cpl_malloc(njit*
sizeof(jpos));
584 for (i = 0; i < njit; i++) {
585 jp[i].pawposition = i + 1;
587 jp[i].infiles = NULL;
590 jp[i].master_xsky = NULL;
591 jp[i].master_xsky_bpm = NULL;
592 jp[i].xsky_variant = NULL;
593 jp[i].xsky_variant_bpm = NULL;
601 static void jpos_alloc(vir_fits **infiles,
int nfiles,
int pawpos, jpos *jp) {
606 jp->pawposition = pawpos;
611 jp->infiles = cpl_malloc(6*
sizeof(vir_fits *));
612 for (i = 0; i < nfiles; i++) {
616 jp->infiles[jp->nimages] = infiles[i];
619 jp->infiles = cpl_realloc(jp->infiles,jp->nimages*
sizeof(vir_fits *));
623 jp->datas = cpl_calloc(jp->nimages,
sizeof(
float *));
624 jp->masks = cpl_calloc(jp->nimages,
sizeof(
unsigned char *));
625 jp->master_xsky = NULL;
626 jp->master_xsky_bpm = NULL;
627 jp->xsky_variant = cpl_calloc(jp->nimages,
sizeof(
float *));
628 jp->xsky_variant_bpm = cpl_calloc(jp->nimages,
sizeof(
unsigned char *));
629 jp->zeros = cpl_calloc(jp->nimages,
sizeof(
float));
630 jp->dx = cpl_calloc(jp->nimages,
sizeof(
float));
631 jp->dy = cpl_calloc(jp->nimages,
sizeof(
float));
634 static void jpos_free(jpos *jp,
int njit) {
637 for (i = 0; i < njit; i++) {
638 freespace(jp[i].infiles);
639 freespace(jp[i].master_xsky);
640 freespace(jp[i].master_xsky_bpm);
641 freespace(jp[i].zeros);
642 for (j = 0; j < jp[i].nimages; j++) {
643 freespace(jp[i].masks[j]);
644 freespace(jp[i].xsky_variant[j]);
645 freespace(jp[i].xsky_variant_bpm[j]);
647 freespace(jp[i].datas);
648 freespace(jp[i].masks);
649 freespace(jp[i].xsky_variant);
650 freespace(jp[i].xsky_variant_bpm);
657 static void masksky_zeros(jpos *jp,
int njit,
int npts) {
659 float sig,medval,off,*zeros;
664 for (j = 0; j < njit; j++)
669 zeros = cpl_malloc(nf*
sizeof(
float));
674 for (j = 0; j < njit; j++) {
675 for (i = 0; i < jp[j].nimages; i++) {
677 -1000.0,65535.0,zeros+nf,&sig);
678 jp[j].zeros[i] = zeros[nf];
689 for (j = 0; j < njit; j++) {
690 for (i = 0; i < jp[j].nimages; i++) {
691 off = medval - jp[j].zeros[i];
692 for (k = 0; k < npts; k++)
693 jp[j].datas[i][k] += off;
699 static void domed(
float *buf,
int n,
float *val) {
706 *val = 0.5*(buf[n2-1] + buf[n2]);
711 *val = 0.5*buf[n2] + 0.25*(buf[n2-1] + buf[n2+1]);