35 #include "vircam_utils.h"
36 #include "vircam_wcsutils.h"
37 #include "vircam_fits.h"
38 #include "vircam_mods.h"
40 static float *odata = NULL;
41 static int *ocdata = NULL;
42 static cpl_propertylist *pp = NULL;
44 static float *xoff = NULL;
45 static float *yoff = NULL;
46 static float *backmeds = NULL;
48 static void tidy(
void);
118 vir_fits **inconfs,
int nconfs,
int nsteps,
119 cpl_propertylist **p, cpl_image **outimage,
120 cpl_image **outconf,
int *status) {
121 const char *fctid =
"vircam_interleave";
123 int i,j,k,nxo,nyo,itx,nx,ny,jindex,joindex;
124 int iindex,outindex,*icdata,ival;
125 float minoff,minzero,*idata,fval;
127 cpl_image *inimg,*icimg;
128 cpl_propertylist *ehu,*p2;
135 if (*status != VIR_OK)
141 cpl_msg_error(fctid,
"No input files to interleave");
151 if (inconfs == NULL) {
154 if (nconfs != ninputs)
166 xoff = cpl_malloc(ninputs*
sizeof(
float));
167 yoff = cpl_malloc(ninputs*
sizeof(
float));
168 backmeds = cpl_malloc(ninputs*
sizeof(
float));
169 fnm = (double)nsteps;
170 for (i = 0; i < ninputs; i++) {
172 xoff[i] = (float)cpl_propertylist_get_double(ehu,
"ESO DRS XOFFMICRO");
173 fval = xoff[i] - (int)xoff[i];
174 ival = vircam_nint(fval*fnm);
175 xoff[i] = (int)xoff[i] + (
float)ival/fnm;
176 yoff[i] = (float)cpl_propertylist_get_double(ehu,
"ESO DRS YOFFMICRO");
177 fval = yoff[i] - (int)yoff[i];
178 ival = vircam_nint(fval*fnm);
179 yoff[i] = (int)yoff[i] + (
float)ival/fnm;
180 backmeds[i] = cpl_propertylist_get_float(ehu,
"ESO DRS BACKMED");
186 for (i = 1; i < ninputs; i++)
187 minoff = min(minoff,xoff[i]);
188 for (i = 0; i < ninputs; i++)
190 offs[0] = (double)minoff;
192 for (i = 1; i < ninputs; i++)
193 minoff = min(minoff,yoff[i]);
194 for (i = 0; i < ninputs; i++)
196 offs[1] = (double)minoff;
200 minzero = backmeds[0];
201 for (i = 1; i < ninputs; i++)
202 minzero = min(minzero,backmeds[i]);
203 for (i = 0; i < ninputs; i++)
204 backmeds[i] -= minzero;
210 for (i = 0; i < ninputs; i++) {
211 itx = (int)((
float)nsteps*((float)cpl_image_get_size_x(
vircam_fits_get_image(infiles[i])) + xoff[i]) + 0.5) - 1;
213 itx = (int)((
float)nsteps*((float)cpl_image_get_size_y(
vircam_fits_get_image(infiles[i])) + yoff[i]) + 0.5) - 1;
219 odata = cpl_calloc(nxo*nyo,
sizeof(*odata));
221 ocdata = cpl_calloc(nxo*nyo,
sizeof(*ocdata));
227 for (i = 0; i < ninputs; i++) {
233 idata = cpl_image_get_data_float(inimg);
236 "Unable to map data for image %" CPL_SIZE_FORMAT,
244 icdata = cpl_image_get_data_int(icimg);
245 if (icdata == NULL) {
247 "Unable to map data for confidence map %" CPL_SIZE_FORMAT,
256 nx = (int)cpl_image_get_size_x(inimg);
257 ny = (int)cpl_image_get_size_y(inimg);
258 for (j = 0; j < ny; j++) {
260 joindex = nxo*((int)(((
float)j + yoff[i])*fnm + 0.5));
261 for (k = 0; k < nx; k++) {
263 outindex = joindex + (int)(((
float)k + xoff[i])*fnm + 0.5);
264 if (outindex < 0 || outindex >= nxo*nyo) {
266 "Programming error -- output index out of bounds %" CPL_SIZE_FORMAT,
271 odata[outindex] = idata[iindex] - backmeds[i];
273 ocdata[outindex] = icdata[iindex];
299 *outimage = cpl_image_wrap_float((cpl_size)nxo,(cpl_size)nyo,odata);
300 *outconf = cpl_image_wrap_int((cpl_size)nxo,(cpl_size)nyo,ocdata);
306 cpl_propertylist_update_string(p2,
"VIR_TIME",timestamp);
307 cpl_propertylist_set_comment(p2,
"VIR_TIME",
308 "Timestamp for matching to conf map");
318 static void tidy(
void) {