38#include <casu_utils.h>
41#include <casu_stats.h>
42#include <casu_wcsutils.h>
44#include "vircam_sky.h"
45#include "vircam_mods.h"
46#include "vircam_dfs.h"
47#include "vircam_pfits.h"
54 unsigned char **masks;
56 unsigned char *master_xsky_bpm;
58 unsigned char **xsky_variant_bpm;
63static void combine_master(
int nfiles,
int stat,
int npts,
float **datas,
64 unsigned char **masks,
float **skyout,
65 unsigned char **skyout_bpm);
66static void combine_variant(
int stat,
int npts, jpos *jp,
int skipme);
67static void combine_final(
int nxskys,
int stat,
int npts,
float **xskys,
68 unsigned char **xsky_masks,
float *data,
69 float *master_sky,
unsigned char *master_bpm);
70static void masksky_zeros(jpos *jp,
int njit,
int npts);
71static void domed(
float *buf,
int n,
float *val);
72static jpos *jpos_init(
int njit);
73static void jpos_alloc(casu_fits **infiles,
int nfiles,
int pawpos, jpos *jp);
74static void jpos_free(jpos *jp,
int njit);
76extern int vircam_tilesky_minus(casu_fits **infiles, casu_fits *conf,
77 casu_fits *objmaskfits,
int nfiles,
78 casu_fits **skyout,
int *status) {
79 int i, nx_mask = 0,ind,j,nx,ny,kind,njit,*confdata = NULL,jx,jy,ix,iy,k;
82 cpl_wcs *wcsmask,*wcsimg;
84 cpl_propertylist *plist;
85 unsigned char **xsky_masks,*master_sky_lev2_bpm;
86 double *xin = NULL,*yin = NULL,*xout = NULL,*yout = NULL,*dx = NULL,*dy = NULL,ddx,ddy;
87 float **xskys,*master_sky_lev2,val,sig;
88 const char *fctid =
"vircam_tilesky_minus";
93 if (*status != CASU_OK)
99 cpl_msg_error(fctid,
"Sky correction impossible. No science frames");
110 jp = jpos_init(njit);
111 for (i = 1; i <= njit; i++)
112 jpos_alloc(infiles,nfiles,i,jp+i-1);
119 if (objmaskfits != NULL) {
127 xin = cpl_malloc(npts*
sizeof(
double));
128 yin = cpl_malloc(npts*
sizeof(
double));
129 xout = cpl_malloc(npts*
sizeof(
double));
130 yout = cpl_malloc(npts*
sizeof(
double));
131 dx = cpl_malloc(nfiles*
sizeof(
double));
132 dy = cpl_malloc(nfiles*
sizeof(
double));
137 for (j = 0; j < ny; j++) {
138 for (i = 0; i < nx; i++) {
139 xin[ind] = (double)(i+1);
140 yin[ind++] = (double)(j+1);
149 for (i = 0; i < nfiles; i++) {
156 cpl_wcs_delete(wcsimg);
158 cpl_wcs_delete(wcsmask);
165 for (j = 0; j < njit; j++) {
166 for (i = 0; i < jp[j].nimages; i++) {
168 jp[j].datas[i] = cpl_image_get_data_float(im);
169 jp[j].masks[i] = cpl_calloc(npts,
sizeof(
unsigned char));
170 if (i == 0 && j == 0)
179 for (jy = 0; jy < ny; jy++) {
180 for (jx = 0; jx < nx; jx++) {
182 if (confdata[ind] == 0) {
183 jp[j].masks[i][ind] = 1;
184 }
else if (objmaskfits != NULL) {
185 kind = (int)(yout[ind] + dy[i] - 0.5)*nx_mask +
186 (int)(xout[ind] + dx[i] - 0.5);
187 jp[j].masks[i][ind] = opm[kind];
196 if (objmaskfits != NULL) {
207 masksky_zeros(jp,njit,npts);
214 for (i = 0; i < njit; i++) {
218 combine_master(jp[i].nimages,0,npts,jp[i].datas,jp[i].masks,
219 &(jp[i].master_xsky),&(jp[i].master_xsky_bpm));
223 for (j = 0; j < jp[i].nimages; j++)
224 combine_variant(0,npts,jp+i,j);
229 xskys = cpl_malloc(njit*
sizeof(
float *));
230 xsky_masks = cpl_malloc(njit*
sizeof(
unsigned char *));
231 for (i = 0; i < njit; i++) {
232 xskys[i] = jp[i].master_xsky;
233 xsky_masks[i] = jp[i].master_xsky_bpm;
235 combine_master(njit,0,npts,xskys,xsky_masks,&master_sky_lev2,
236 &master_sky_lev2_bpm);
240 skyim = cpl_image_wrap_float(nx,ny,master_sky_lev2);
241 for (i = 0; i < npts; i++) {
243 ix = i - (iy-1)*nx + 1;
244 if (master_sky_lev2_bpm[i])
245 cpl_image_reject(skyim,(cpl_size)ix,(cpl_size)iy);
249 if (objmaskfits != NULL) {
250 cpl_propertylist_update_string(plist,
"ESO DRS MASKUSED",
252 cpl_propertylist_set_comment(plist,
"ESO DRS MASKUSED",
253 "Object masked used to make sky");
255 cpl_propertylist_update_string(plist,
"ESO DRS SKYALGO",
"tilesky_minus");
256 cpl_propertylist_set_comment(plist,
"ESO DRS SKYALGO",
257 "Sky estimation algorithm");
267 for (j = 0; j < njit; j++) {
268 for (i = 0; i < njit; i++) {
269 xskys[i] = jp[i].master_xsky;
270 xsky_masks[i] = jp[i].master_xsky_bpm;
272 for (i = 0; i < jp[j].nimages; i++) {
273 xskys[j] = jp[j].xsky_variant[i];
274 xsky_masks[j] = jp[j].xsky_variant_bpm[i];
275 combine_final(njit,0,npts,xskys,xsky_masks,jp[j].datas[i],
276 master_sky_lev2,master_sky_lev2_bpm);
280 casu_qmedsig(jp[j].datas[i],jp[j].masks[i],(
long)npts,3.0,1,
281 -1000.0,65535.0,&val,&sig);
282 val = jp[j].zeros[i] - val;
283 for (k = 0; k < npts; k++)
284 jp[j].datas[i][k] += val;
291 freespace(xsky_masks);
292 freespace(master_sky_lev2_bpm);
297static void combine_master(
int nfiles,
int stat,
int npts,
float **datas,
298 unsigned char **masks,
float **skyout,
299 unsigned char **skyout_bpm) {
305 *skyout = cpl_malloc(npts*
sizeof(
float));
306 *skyout_bpm = cpl_malloc(npts*
sizeof(
unsigned char));
307 buf = cpl_malloc(nfiles*
sizeof(
float));
311 for (j = 0; j < npts; j++) {
313 for (i = 0; i < nfiles; i++) {
314 if (masks[i][j] == 0)
315 buf[n++] = datas[i][j];
319 (*skyout_bpm)[j] = 1;
322 domed(buf,n,(*skyout)+j);
325 (*skyout_bpm)[j] = 0;
335static void combine_variant(
int stat,
int npts, jpos *jp,
int skipme) {
337 float *buf,**datas,*skyout,*master_sky;
338 unsigned char **masks,*skyout_bpm,*master_sky_bpm;
344 master_sky = jp->master_xsky;
345 master_sky_bpm = jp->master_xsky_bpm;
346 nfiles = jp->nimages;
350 skyout = cpl_malloc(npts*
sizeof(
float));
351 jp->xsky_variant[skipme] = skyout;
352 skyout_bpm = cpl_malloc(npts*
sizeof(
unsigned char));
353 jp->xsky_variant_bpm[skipme] = skyout_bpm;
354 buf = cpl_malloc(nfiles*
sizeof(
float));
360 memmove(skyout,jp->master_xsky,npts*
sizeof(
float));
361 memmove(skyout_bpm,jp->master_xsky_bpm,npts*
sizeof(
unsigned char));
368 for (j = 0; j < npts; j++) {
374 if (masks[skipme][j]) {
375 skyout[j] = master_sky[j];
376 skyout_bpm[j] = master_sky_bpm[j];
382 for (i = 0; i < nfiles; i++) {
383 if (masks[i][j] == 0 && i != skipme)
384 buf[n++] = datas[i][j];
391 domed(buf,n,skyout+j);
404static void combine_final(
int nxskys,
int stat,
int npts,
float **xskys,
405 unsigned char **xsky_masks,
float *data,
406 float *master_sky,
unsigned char *master_bpm) {
412 buf = cpl_malloc(nxskys*
sizeof(
float));
416 for (j = 0; j < npts; j++) {
431 for (i = 0; i < nxskys; i++) {
432 if (xsky_masks[i][j] != 0)
434 buf[n++] = xskys[i][j];
458static jpos *jpos_init(
int njit) {
462 jp = cpl_malloc(njit*
sizeof(jpos));
463 for (i = 0; i < njit; i++) {
464 jp[i].pawposition = i + 1;
466 jp[i].infiles = NULL;
469 jp[i].master_xsky = NULL;
470 jp[i].master_xsky_bpm = NULL;
471 jp[i].xsky_variant = NULL;
472 jp[i].xsky_variant_bpm = NULL;
480static void jpos_alloc(casu_fits **infiles,
int nfiles,
int pawpos, jpos *jp) {
485 jp->pawposition = pawpos;
490 jp->infiles = cpl_malloc(6*
sizeof(casu_fits *));
491 for (i = 0; i < nfiles; i++) {
495 jp->infiles[jp->nimages] = infiles[i];
498 jp->infiles = cpl_realloc(jp->infiles,jp->nimages*
sizeof(casu_fits *));
502 jp->datas = cpl_calloc(jp->nimages,
sizeof(
float *));
503 jp->masks = cpl_calloc(jp->nimages,
sizeof(
unsigned char *));
504 jp->master_xsky = NULL;
505 jp->master_xsky_bpm = NULL;
506 jp->xsky_variant = cpl_calloc(jp->nimages,
sizeof(
float *));
507 jp->xsky_variant_bpm = cpl_calloc(jp->nimages,
sizeof(
unsigned char *));
508 jp->zeros = cpl_calloc(jp->nimages,
sizeof(
float));
509 jp->dx = cpl_calloc(jp->nimages,
sizeof(
float));
510 jp->dy = cpl_calloc(jp->nimages,
sizeof(
float));
513static void jpos_free(jpos *jp,
int njit) {
516 for (i = 0; i < njit; i++) {
517 freespace(jp[i].infiles);
518 freespace(jp[i].master_xsky);
519 freespace(jp[i].master_xsky_bpm);
520 freespace(jp[i].zeros);
521 for (j = 0; j < jp[i].nimages; j++) {
522 freespace(jp[i].masks[j]);
523 freespace(jp[i].xsky_variant[j]);
524 freespace(jp[i].xsky_variant_bpm[j]);
526 freespace(jp[i].datas);
527 freespace(jp[i].masks);
528 freespace(jp[i].xsky_variant);
529 freespace(jp[i].xsky_variant_bpm);
536static void masksky_zeros(jpos *jp,
int njit,
int npts) {
538 float sig,medval,off,*zeros;
543 for (j = 0; j < njit; j++)
548 zeros = cpl_malloc(nf*
sizeof(
float));
553 for (j = 0; j < njit; j++) {
554 for (i = 0; i < jp[j].nimages; i++) {
555 casu_qmedsig(jp[j].datas[i],jp[j].masks[i],(
long)npts,3.0,1,
556 -1000.0,65535.0,zeros+nf,&sig);
557 jp[j].zeros[i] = zeros[nf];
568 for (j = 0; j < njit; j++) {
569 for (i = 0; i < jp[j].nimages; i++) {
570 off = medval - jp[j].zeros[i];
571 for (k = 0; k < npts; k++)
572 jp[j].datas[i][k] += off;
578static void domed(
float *buf,
int n,
float *val) {
585 *val = 0.5*(buf[n2-1] + buf[n2]);
590 *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)
cpl_image * casu_fits_get_image(casu_fits *p)
cpl_propertylist * casu_fits_get_phu(casu_fits *p)
char * casu_fits_get_filename(casu_fits *p)
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.
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_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)
int vircam_pfits_get_jitteri(const cpl_propertylist *plist, int *jitteri)
Get the position number of an observations in a jitter sequence.
int vircam_pfits_get_njsteps(const cpl_propertylist *plist, int *njsteps)
Get the value of the number of observations in a jitter sequence.