SINFONI Pipeline Reference Manual  2.6.0
sinfo_new_bezier.c
1 /*
2  * This file is part of the ESO SINFONI Pipeline
3  * Copyright (C) 2004,2005 European Southern Observatory
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation; either version 2 of the License, or
8  * (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program; if not, write to the Free Software
17  * Foundation, 51 Franklin St, Fifth Floor, Boston, MA 02111-1307 USA
18  */
19 /*****************************************************************************
20  * M.P.E. - SPIFFI project
21  *
22  *
23  *
24  * who when what
25 
26  * -------- -------- ----------------------------------------------
27  * rabuter 2004-11-04 Fixed error on Find Cosmic when no valid neighboors
28  where found in the subcube
29  * rabuter 10/07/03 created
30  */
31 
32 /************************************************************************
33  * NAME
34  * sinfo_new_bezier.c -
35  * procedures to correct for bad pixels using bezier splines
36  *
37  * SYNOPSIS
38  *
39  * DESCRIPTION
40  *
41  * FILES
42  *
43  * ENVIRONMENT
44  *
45  * RETURN VALUES
46  *
47  * CAUTIONS
48  *
49  * EXAMPLES
50  *
51  * SEE ALSO
52  *
53  * BUGS
54  *
55  *------------------------------------------------------------------------
56  */
57 
58 #ifdef HAVE_CONFIG_H
59 # include <config.h>
60 #endif
61 #define POSIX_SOURCE 1
62 #include "sinfo_vltPort.h"
63 
64 /*
65  * System Headers
66  */
67 
68 /*
69  * Local Headers
70  */
71 
72 #include "sinfo_new_bezier.h"
73 #include "sinfo_msg.h"
81 /*----------------------------------------------------------------------------
82  * Function codes
83  *--------------------------------------------------------------------------*/
84 
93 int
94 sinfo_im_xy(cpl_image* im, int X, int Y)
95 {
96  int res = 0;
97 
98  res = X + Y * cpl_image_get_size_x(im);
99  return res;
100 }
109 int
110 sinfo_im_xyz(cpl_image* im, int X, int Y, int Z)
111 {
112  int res = 0;
113  res = X + Y * cpl_image_get_size_x(im)
114  + Z * cpl_image_get_size_x(im) * cpl_image_get_size_y(im);
115  return res;
116 }
117 
126 int
127 sinfo_cu_xy(cpl_imagelist* cu, int X, int Y)
128 {
129  int res = 0;
130 
131  res = X + Y * cpl_image_get_size_x(cpl_imagelist_get(cu, 0));
132  return res;
133 }
144 int
145 sinfo_cu_xyz(cpl_imagelist* cu, int X, int Y, int Z)
146 {
147  int res = 0;
148  res = X + Y * cpl_image_get_size_x(cpl_imagelist_get(cu, 0))
149  + Z * cpl_image_get_size_x(cpl_imagelist_get(cu, 0))
150  * cpl_image_get_size_y(
151  cpl_imagelist_get(cu, 0));
152  return res;
153 }
154 
169 cpl_image *
170 sinfo_new_c_bezier_interpolate_image(cpl_image *im, cpl_image *mask,
171  new_Lookup *look, short rx, short ry,
172  short rz, int max_rad, float ** slit_edges)
173 {
174 
175  int i, j, count;
176  cpl_imagelist * sc_im, *drs_sc_mask;
177  cpl_image *auxImage;
178  cpl_image *tempMask;
179  short szx, szy, szz;
180  short rx_loop, ry_loop, rz_loop;
181  /*float ant,new,dif;*/
182 
183  int ilx = 0;
184  int ily = 0;
185  int mlx = 0;
186  int mly = 0;
187 
188  float* pidata = NULL;
189  float* pmdata = NULL;
190  float* ptdata = NULL;
191  float* padata = NULL;
192 
193 
194  mlx = cpl_image_get_size_x(mask);
195  mly = cpl_image_get_size_y(mask);
196  ilx = cpl_image_get_size_x(im);
197  ily = cpl_image_get_size_y(im);
198 
199  pmdata = cpl_image_get_data_float(mask);
200  pidata = cpl_image_get_data_float(im);
201 
202  if (mlx != ilx || mly != ily) {
203  sinfo_msg_error(" data & mask images not compatible in size\n");
204  return NULL ;
205  }
206 
207  /* allocate memory for sub cubes*/
208  szx = (rx * 2) + 1;
209  szy = (ry * 2) + 1;
210  szz = (rz * 2) + 1;
211 
212  if (NULL == (sc_im = cpl_imagelist_new())) {
213  sinfo_msg_error(" could not allocate memory for data subcube\n");
214  return NULL ;
215  }
216 
217  for (i = 0; i < szz; i++) {
218  cpl_image* sc_img = cpl_image_new(szx, szy, CPL_TYPE_FLOAT);
219  cpl_imagelist_set(sc_im, sc_img, i);
220  }
221 
222  if (NULL == (drs_sc_mask = cpl_imagelist_new())) {
223  sinfo_msg_error(" could not allocate memory for mask subcube\n");
224  return NULL ;
225  }
226  for (i = 0; i < szz; i++) {
227  cpl_image* drs_img = cpl_image_new(szx, szy, CPL_TYPE_FLOAT);
228  cpl_imagelist_set(drs_sc_mask, drs_img, i);
229  }
230 
231  if (NULL == (tempMask = cpl_image_new(mlx, mly, CPL_TYPE_FLOAT))) {
232  sinfo_msg_error("could not allocate memory for temporary "
233  "dead pixel mask\n");
234  return NULL ;
235  }
236  ptdata = cpl_image_get_data_float(tempMask);
237 
238  count = 0;
239  for (i = 0; i < mlx; i++) {
240  for (j = 0; j < mly; j++) {
241  if (pmdata[sinfo_im_xy(im, i, j)] == cubePT_BADPIXEL) {
242  rx_loop = 1;
243  ry_loop = 1;
244  rz_loop = 1;
245  pidata[sinfo_im_xy(im, i, j)] =
246  sinfo_new_c_bezier_correct_pixel(i, j, im, mask,
247  sc_im, drs_sc_mask, look,
248  rx_loop, ry_loop, rz_loop);
249  /* if not enough neighbors found, increase size of sub
250  cube until max radius is reached */
251  while (pidata[sinfo_im_xy(im, i, j)] == cubeNONEIGHBOR
252  && rx_loop < rx && ry_loop < ry && rz_loop < rz) {
253  rx_loop++;
254  ry_loop++;
255  rz_loop++;
256  /* sinfo_msg_warning("Increasing radius to %d, in %d %d",
257  rx_loop, i, j) ; */
258 
259  pidata[sinfo_im_xy(im, i, j)] =
260  sinfo_new_c_bezier_correct_pixel(i, j, im,
261  mask, sc_im, drs_sc_mask,
262  look, rx_loop, ry_loop,
263  rz_loop);
264  }
265  /* If still not enough neighbors, make result NaN = ZERO
266  in spred convention */
267  if (pidata[sinfo_im_xy(im, i, j)] == cubeNONEIGHBOR) {
268  pidata[sinfo_im_xy(im, i, j)] = ZERO;
269  }
270  count++;
271  }
272  if (pidata[sinfo_im_xy(im, i, j)] == ZERO) {
273  ptdata[sinfo_im_xy(tempMask, i, j)] = 0;
274  }
275  else {
276  ptdata[sinfo_im_xy(tempMask, i, j)] = 1;
277  }
278  }
279  }
280 
281  sinfo_msg("Replacing NaN\n");
282  auxImage = sinfo_interpol_source_image(im, tempMask, max_rad, slit_edges);
283  padata = cpl_image_get_data_float(auxImage);
284  for (i = 0; i < mlx; i++) {
285  for (j = 0; j < mly; j++) {
286 
287  if (isnan(pidata[sinfo_im_xy(im,i,j)])) /*<= -2e10ZERO )*/
288  {
289  /* sinfo_msg_warning("Replacing NaN -> %d %d %f\n",
290  i,j, padata[sinfo_im_xy(im,i,j)] ); */
291  pidata[sinfo_im_xy(im, i, j)] = padata[sinfo_im_xy(im, i, j)];
292  }
293  }
294  }
295  cpl_image_delete(auxImage);
296  cpl_imagelist_delete(sc_im);
297  cpl_imagelist_delete(drs_sc_mask);
298 
299  sinfo_msg("bad pixels count: %d\n", count);
300 
301  return im;
302 }
303 
304 cpl_image *
305 sinfo_new_c_bezier_find_bad(cpl_image *im, cpl_image *mask,
306 /* Lookup *look,*/
307 short rx,
308  short ry, short rz, short lowerI, short highI,
309  short lowerJ, short highJ, float factor)
310 {
311 
312  int i, j, count;
313  cpl_imagelist * sc_im, *drs_sc_mask;
314  short szx, szy, szz;
315  float /*ant,*/newValue, old/*,dif,porcentage,distance*/;
316  double med, stdev;
317  /*cpl_image *out;*/
318  short rx_loop, ry_loop, rz_loop;
319 
320  int ilx = 0;
321  int ily = 0;
322  int mlx = 0;
323  int mly = 0;
324 
325  float* pidata = NULL;
326  //float* pmdata=NULL;
327 
328 
329  mlx = cpl_image_get_size_x(mask);
330  mly = cpl_image_get_size_y(mask);
331  ilx = cpl_image_get_size_x(im);
332  ily = cpl_image_get_size_y(im);
333 
334  //pmdata=cpl_image_get_data_float(mask);
335  pidata = cpl_image_get_data_float(im);
336 
337  if (mlx != ilx || mly != ily) {
338  sinfo_msg_error(" data & mask images not compatible in size\n");
339  return NULL ;
340  }
341 
342  /* allocate memory for sub cubes*/
343  szx = (rx * 2) + 1;
344  szy = (ry * 2) + 1;
345  szz = (rz * 2) + 1;
346 
347  if (NULL == (sc_im = cpl_imagelist_new())) {
348  sinfo_msg_error(" could not allocate memory for data subcube\n");
349  return NULL ;
350  }
351  for (i = 0; i < szz; i++) {
352  cpl_image* sc_img = cpl_image_new(szx, szy, CPL_TYPE_FLOAT);
353  cpl_imagelist_set(sc_im, sc_img, i);
354  }
355 
356  if (NULL == (drs_sc_mask = cpl_imagelist_new())) {
357  sinfo_msg_error(" could not allocate memory for mask subcube\n");
358  return NULL ;
359  }
360  for (i = 0; i < szz; i++) {
361  cpl_image* drs_img = cpl_image_new(szx, szy, CPL_TYPE_FLOAT);
362  cpl_imagelist_set(drs_sc_mask, drs_img, i);
363  }
364 
365  count = 0;
366  for (i = 0; i < mlx; i++) {
367  for (j = 0; j < mly; j++) {
368  if (i >= lowerI && i < highI && j >= lowerJ && j < highJ) {
369 
370  rx_loop = 1;
371  ry_loop = 1;
372  rz_loop = 1;
373  newValue = sinfo_new_c_bezier_correct_pixel_2D(i, j, im, mask,
374  sc_im, drs_sc_mask,
375  /* look,*/
376  rx_loop, ry_loop, rz_loop, &med, &stdev,
377  factor);
378  /* if NaN returned, increase size of sub cube
379  until max radius is reached */
380  while (newValue == ZERO && rx_loop < rx && ry_loop < ry
381  && rz_loop < rz) {
382  rx_loop++;
383  ry_loop++;
384  rz_loop++;
385  /*sinfo_msg_warning("Increasing radius to %d,
386  in %d %d", rx_loop, i, j) ; */
387  newValue = sinfo_new_c_bezier_correct_pixel_2D(i, j, im,
388  mask, sc_im, drs_sc_mask,
389  /*, look*/
390  rx_loop, ry_loop, rz_loop, &med, &stdev,
391  factor);
392  }
393  if (isnan(newValue)) /*<= -3.e10 ZERO )*/
394  continue;
395 
396  old = pidata[sinfo_im_xy(im, i, j)];
397  if (newValue != old) {
398  pidata[sinfo_im_xy(im, i, j)] = newValue;
399  /*sinfo_msg_warning("[%d,%d]=%f -> %f, med= %f,
400  stdev=%f\n",i,j, old, newValue, med, stdev );*/
401  count++;
402  }
403  }
404  }
405  }
406 
407  sinfo_msg("bad pixels count: %d\n", count);
408 
409  cpl_imagelist_delete(sc_im);
410  cpl_imagelist_delete(drs_sc_mask);
411  return im;
412 }
413 
414 float
415 sinfo_new_c_bezier_correct_pixel(int ipos, int jpos, cpl_image * im,
416  cpl_image * mask, cpl_imagelist * sc_im,
417  cpl_imagelist * drs_sc_mask, new_Lookup * look,
418  short rx, short ry, short rz)
419 {
420  short ic, jc, kc, ii, jj, kk/*, sjj, skk*/, is, js, ks;
421  short i, j, k, indexJ, indexI, lx, ly, lz, szx, szy, szz;
422  /*float indexIf,indexJf,sp;*/
423  cpl_image * X, *Y, *Z, *hX;
424  cpl_imagelist * id, *jd;
425 
426  int idlx = 0;
427  int idly = 0;
428  int idnp = 0;
429 
430  int drslx = 0;
431  int drsly = 0;
432  int drsnp = 0;
433 
434  float* pXdata = NULL;
435  float* pYdata = NULL;
436  float* pZdata = NULL;
437  float* phXdata = NULL;
438  float* pidata = NULL;
439  float* pmdata = NULL;
440  float* piddata = NULL;
441  float* pjddata = NULL;
442  float* pscdata = NULL;
443  float* pdrsdata = NULL;
444 
445  cpl_image* id_img = NULL;
446  cpl_image* jd_img = NULL;
447  cpl_image* sc_img = NULL;
448  cpl_image* drs_img = NULL;
449 
450  X = look->X;
451  Y = look->Y;
452  Z = look->Z;
453  hX = look->hX;
454  id = look->id;
455  jd = look->jd;
456 
457  /*
458  phXdata=cpl_image_get_data_float(hX);
459  if ( phXdata[sinfo_im_xy( hX, ipos, jpos)] > 1 )
460  {
461  sinfo_msg_error(" double hit in position [%d,%d]=%f, "
462  "can not correct\n",
463  ipos,jpos,phXdata[sinfo_im_xy(hX,ipos,jpos)]) ;
464  return ( -2e10 );
465  }*/
466 
467  pidata = cpl_image_get_data_float(im);
468  pmdata = cpl_image_get_data_float(mask);
469 
470  phXdata = cpl_image_get_data_float(hX);
471  if (phXdata[sinfo_im_xy(hX, ipos, jpos)] < 1) {
472  /*sinfo_msg_error("no lookup in position [%d,%d]=%f, can not correct",
473  ipos,jpos,phXdata[sinfo_im_xy(hX,ipos,jpos)]) ;*/
474  return ( ZERO);
475  }
476  pXdata = cpl_image_get_data_float(X);
477  pYdata = cpl_image_get_data_float(Y);
478  pZdata = cpl_image_get_data_float(Z);
479 
480  ic = pXdata[sinfo_im_xy(X, ipos, jpos)];
481  jc = pYdata[sinfo_im_xy(Y, ipos, jpos)];
482  kc = pZdata[sinfo_im_xy(Z, ipos, jpos)];
483  /*if ( !(ipos % 16 ) )*/
484 #ifdef DEBUG
485  sinfo_msg_debug("Correcting bad pixel : ipos=%d,jpos=%d, "
486  "in Cube -> ic=%d, jc=%d, kc=%d\n",
487  ipos,jpos, ic, jc, kc );
488 #endif
489  /*limit to start not before the beginning of the cube*/
490  ii = ic - rx;
491  if (ii < 0)
492  ii = 0;
493  jj = jc - ry;
494  if (jj < 0)
495  jj = 0;
496  kk = kc - rz;
497  if (kk < 0)
498  kk = 0;
499 
500 #ifdef DEBUG
501  sinfo_msg_debug("Start Point in Cube -> ii=%d,jj=%d,kk=%d\n", ii, jj, kk );
502 #endif
503 
504  /*limit to end not outside of the cube */
505  szx = (rx * 2) + 1;
506  szy = (ry * 2) + 1;
507  szz = (rz * 2) + 1;
508 
509  idlx = cpl_image_get_size_x(cpl_imagelist_get(id, 0));
510  idly = cpl_image_get_size_y(cpl_imagelist_get(id, 0));
511  idnp = cpl_imagelist_get_size(id);
512 
513  lx = idlx;
514  ly = idly;
515  lz = idnp;
516 
517  if ((ic + rx) >= idlx)
518  szx = szx - ((ic + rx) - (lx - 1));
519 
520  if ((jc + ry) >= idly)
521  szy = szy - ((jc + ry) - (ly - 1));
522 
523  if ((kc + rz) >= idnp)
524  szz = szz - ((kc + rz) - (lz - 1));
525 
526  drslx = cpl_image_get_size_x(cpl_imagelist_get(drs_sc_mask, 0));
527  drsly = cpl_image_get_size_y(cpl_imagelist_get(drs_sc_mask, 0));
528  drsnp = cpl_imagelist_get_size(drs_sc_mask);
529 #ifdef DEBUG
530 
531  sinfo_msg_error("Size of subcube: szx=%d,szy=%d,szz=%d\n", szx, szy, szz );
532  /*fill whole mask with not available*/
533  sinfo_msg_error("Fill Mask subcube of size: %d,%d,%d, with NOINFO\n",
534  drslx, drsly, drsnp);
535 #endif
536  for (i = 0; i < drslx; i++) {
537  for (j = 0; j < drsly; j++) {
538  for (k = 0; k < drsnp; k++) {
539  drs_img = cpl_imagelist_get(drs_sc_mask, k);
540  pdrsdata = cpl_image_get_data_float(drs_img);
541  pdrsdata[sinfo_cu_xy(drs_sc_mask, i, j)] = cubePT_NOINFO;
542  }
543  }
544  }
545 
546  for (i = ii, is = 0; i < ii + szx; i++, is++) {
547  for (j = jj, js = 0; j < jj + szy; j++, js++) {
548  for (k = kk, ks = 0; k < kk + szz; k++, ks++) {
549 #ifdef DEBUG
550  sinfo_msg_debug("i=%d j=%d k=%d is=%d ij=%d ik=%d",
551  i,j,k,is,js,ks);
552 #endif
553  id_img = cpl_imagelist_get(id, k);
554  jd_img = cpl_imagelist_get(jd, k);
555  piddata = cpl_image_get_data_float(id_img);
556  pjddata = cpl_image_get_data_float(jd_img);
557 
558  drs_img = cpl_imagelist_get(drs_sc_mask, ks);
559  pdrsdata = cpl_image_get_data_float(drs_img);
560  sc_img = cpl_imagelist_get(sc_im, ks);
561  pscdata = cpl_image_get_data_float(sc_img);
562 
563  indexI = sinfo_new_nint(piddata[sinfo_cu_xy(id, i, j)]);
564  indexJ = sinfo_new_nint(pjddata[sinfo_cu_xy(jd, i, j)]);
565  if (indexJ <= -1 || indexJ >= 2048 || indexI == -1) {
566  pdrsdata[sinfo_cu_xy(drs_sc_mask, is, js)] = cubePT_NOINFO;
567  continue;
568  }
569  pscdata[sinfo_cu_xy(sc_im, is, js)] = pidata[sinfo_im_xy(im,
570  indexI, indexJ)];
571  pdrsdata[sinfo_cu_xy(drs_sc_mask, is, js)] = pmdata[sinfo_im_xy(
572  mask, indexI, indexJ)];
573  /*
574  #ifdef DEBUG
575  sinfo_msg_debug("Cube i=%d, j=%d, k=%d ;"
576  " Sub is=%d, js=%d, ks=%d ;"
577  " Plane I=%d,J=%d ; mask %f ; im %f",
578  i, j, k, is, js, ks, indexI, indexJ,
579  pmdata[sinfo_im_xy(mask,indexI,indexJ)],
580  pidata[sinfo_im_xy(im,indexI,indexJ)]);
581  #endif
582  */
583  }
584  }
585  }
586 
587  /*signal to correct this pixel*/
588  drs_img = cpl_imagelist_get(drs_sc_mask, rz);
589  pdrsdata = cpl_image_get_data_float(drs_img);
590  pdrsdata[sinfo_cu_xy(drs_sc_mask, rx, ry)] = cubePT_FIND;
591  return (sinfo_new_c_bezier_interpol(sc_im, drs_sc_mask));
592 }
593 
594 float
595 sinfo_new_c_bezier_correct_pixel_2D(int ipos, int jpos, cpl_image * im,
596  cpl_image * mask, cpl_imagelist * sc_im,
597  cpl_imagelist * drs_sc_mask,
598  /* Lookup * look,*/
599  short rx,
600  short ry, short rz, double *med,
601  double *stdev, float factor)
602 {
603  short ic, jc, kc, ii, jj, kk/*, sjj, skk*/, is, js, ks;
604  short i, j, k, indexJ, indexI, lx, ly, lz, szx, szy, szz;
605  double sum;
606  int counter;
607  float sumarr[100];
608 
609  int ilx = 0;
610  int ily = 0;
611 
612  int drslx = 0;
613  int drsly = 0;
614  int drsnp = 0;
615 
616  float* pidata = 0;
617  float* pmdata = 0;
618  float* pscdata = 0;
619  float* pdrsdata = 0;
620 
621  cpl_image* drs_img = NULL;
622  cpl_image* sc_img = NULL;
623 
624  jc = 0;
625  ic = ipos;
626  kc = jpos;
627  sinfo_msg_debug("Correcting bad pixel : ipos=%d,jpos=%d, "
628  "in Cube -> ic=%d, jc=%d, kc=%d", ipos, jpos, ic, jc, kc);
629  /*limit to start not before the beginning of the cube*/
630  ii = ic - rx;
631  if (ii < 0)
632  ii = 0;
633  jj = jc - ry;
634  if (jj < 0)
635  jj = 0;
636  kk = kc - rz;
637  if (kk < 0)
638  kk = 0;
639 
640  sinfo_msg_debug("Start Point in Cube -> ii=%d,jj=%d,kk=%d", ii, jj, kk);
641 
642  ilx = cpl_image_get_size_x(im);
643  ily = cpl_image_get_size_y(im);
644 
645  /*limit to end not outside of the cube */
646  szx = (rx * 2) + 1;
647  szy = (ry * 2) + 1;
648  szz = (rz * 2) + 1;
649  lx = ilx;
650  ly = ily;
651  lz = ily;
652  if ((ic + rx) >= ilx)
653  szx = szx - ((ic + rx) - (lx - 1));
654 
655  if ((jc + ry) >= ily)
656  szy = szy - ((jc + ry) - (ly - 1));
657 
658  if ((kc + rz) >= ily)
659  szz = szz - ((kc + rz) - (lz - 1));
660 
661 #ifdef DEBUG
662  drslx=cpl_image_get_size_x(cpl_imagelist_get(drs_sc_mask,0));
663  drsly=cpl_image_get_size_y(cpl_imagelist_get(drs_sc_mask,0));
664  drsnp=cpl_imagelist_get_size(drs_sc_mask);
665  sinfo_msg_debug("Size of subcube : szx=%d,szy=%d,szz=%d", szx, szy, szz );
666  /*fill whole mask with not available*/
667  sinfo_msg_debug("Fill Mask subcube of size:%d,%d,%d, with NOINFO",
668  drslx, drsly, drsnp);
669 #endif
670  for (i = 0; i < drslx; i++) {
671  for (j = 0; j < drsly; j++) {
672  for (k = 0; k < drsnp; k++) {
673  drs_img = cpl_imagelist_get(drs_sc_mask, k);
674  pdrsdata = cpl_image_get_data_float(drs_img);
675  pdrsdata[sinfo_cu_xy(drs_sc_mask, i, j)] = cubePT_NOINFO;
676  }
677  }
678  }
679  counter = 0;
680  sum = 0;
681  memset(sumarr, 0x00, sizeof(sumarr));
682  pidata = cpl_image_get_data(im);
683  pmdata = cpl_image_get_data(mask);
684 
685  for (i = ii, is = 0; i < ii + szx; i++, is++) {
686  for (j = jj, js = 0; j < jj + szy; j++, js++) {
687  for (k = kk, ks = 0; k < kk + szz; k++, ks++) {
688 #ifdef DEBUG
689  sinfo_msg_debug("i=%d j=%d k=%d is=%d ij=%d ik=%d",
690  i,j,k,is,js,ks);
691 #endif
692  indexI = i;
693  indexJ = k;
694  if (isnan(pidata[sinfo_im_xy(mask,indexI,indexJ)]))
695  pmdata[sinfo_im_xy(mask, indexI, indexJ)] = 0;
696 
697  if (pmdata[sinfo_im_xy(mask, indexI, indexJ)] == 1
698  && (indexI != ipos || indexJ != jpos)) {
699  /*sumarr[counter] = pidata[sinfo_im_xy(im,indexI,indexJ)];*/
700  sum = sum + pidata[sinfo_im_xy(im, indexI, indexJ)];
701  counter++;
702  }
703  sc_img = cpl_imagelist_get(sc_im, ks);
704  pscdata = cpl_image_get_data_float(sc_img);
705  pscdata[sinfo_cu_xy(sc_im, is, js)] = pidata[sinfo_im_xy(im,
706  indexI, indexJ)];
707  drs_img = cpl_imagelist_get(drs_sc_mask, ks);
708  pdrsdata = cpl_image_get_data_float(drs_img);
709  pdrsdata[sinfo_cu_xy(drs_sc_mask, is, js)] = pmdata[sinfo_im_xy(
710  mask, indexI, indexJ)];
711 #ifdef DEBUG
712  sinfo_msg_debug("Cube i=%d, j=%d, k=%d ; "
713  "Sub is=%d, js=%d, ks=%d ; "
714  " Plane I=%d,J=%d ; mask %f ; im %f",
715  i, j, k, is, js, ks, indexI, indexJ,
716  pmdata[sinfo_im_xy(mask,indexI,indexJ)],
717  pidata[sinfo_im_xy(im,indexI,indexJ)]);
718 #endif
719 
720  }
721  }
722  }
723 
724  /*signal to correct this pixel*/
725  drs_img = cpl_imagelist_get(drs_sc_mask, rz);
726  pdrsdata = cpl_image_get_data_float(drs_img);
727  pdrsdata[sinfo_cu_xy(drs_sc_mask, rx, ry)] = cubePT_FIND;
728  if (counter)
730  *med = sum / counter;
731  else
732  return (pidata[sinfo_im_xy(im, ipos, jpos)]);
733 
734  /*sinfo_msg_debug("%f %f %d\n",
735  sum ,pidata[sinfo_im_xy(im,ipos,jpos)], counter);*/
736 
737  sum = 0;
738  counter = 0;
739  for (i = ii, is = 0; i < ii + szx; i++, is++) {
740  for (j = jj, js = 0; j < jj + szy; j++, js++) {
741  for (k = kk, ks = 0; k < kk + szz; k++, ks++) {
742  drs_img = cpl_imagelist_get(drs_sc_mask, ks);
743  pdrsdata = cpl_image_get_data_float(drs_img);
744  indexI = i;
745  indexJ = k;
746  if (pdrsdata[sinfo_cu_xy(drs_sc_mask, is, js)] == 1
747  && (indexI != ipos || indexJ != jpos)) {
748  sc_img = cpl_imagelist_get(sc_im, ks);
749  pscdata = cpl_image_get_data_float(sc_img);
750 
751  sum =
752  sum
753  + ((pscdata[sinfo_cu_xy(
754  drs_sc_mask,
755  is, js)]
756  - *med)
757  * (pscdata[sinfo_cu_xy(
758  drs_sc_mask,
759  is,
760  js)]
761  - *med));
762  counter++;
763  }
764  }
765  }
766  }
767  /*
768  double aux;
769  aux = sum;
770  */
771  sum = sum / (counter - 1);
772  *stdev = sqrt(sum);
773 
774  if ((fabs(pidata[sinfo_im_xy(im, ipos, jpos)] - *med) > factor * *stdev)
775  || isnan(pidata[sinfo_im_xy(im,ipos,jpos)])) {
776  /*sinfo_msg_debug("[%d,%d]: distance to mean = %f,"
777  " thres =%f sum=%f, stdev=%f, counter=%d, aux= %f",
778  ipos,jpos, fabs( pidata[sinfo_im_xy(im,ipos,jpos)] - *med),
779  factor * *stdev, sum,*stdev, counter,aux );
780  pmdata[sinfo_im_xy(mask,ipos,jpos)] = 0;*/
781  return (sinfo_new_c_bezier_interpol(sc_im, drs_sc_mask));
782  }
783  return (pidata[sinfo_im_xy(im, ipos, jpos)]);
784 }
785 
786 float
787 sinfo_new_c_bezier_interpol(cpl_imagelist * im, cpl_imagelist * action)
788 {
789  short pos;
790  unsigned short i, j, k;
791  new_XYZW indata[1000];
792  new_XYZW res;
793  new_XYZW selected;
794  float step, cumstep, selected_distance;
795  new_Dim *point;
796  double munk;
797  int ilx = 0;
798  int ily = 0;
799  int inp = 0;
800  float* padata = NULL;
801  float* pidata = NULL;
802  cpl_image* i_img = NULL;
803  cpl_image* a_img = NULL;
804 
805  selected.w = 0;
806  memset(indata, 0x00, 1000 * sizeof(new_XYZW));
807  ilx = cpl_image_get_size_x(cpl_imagelist_get(im, 0));
808  ily = cpl_image_get_size_y(cpl_imagelist_get(im, 0));
809  inp = cpl_imagelist_get_size(im);
810 
811  pos = 0;
812  for (i = 0; i < ilx; i++) {
813  for (j = 0; j < ily; j++) {
814 #ifdef DEBUG
815  int pix=0;
816  pix=i+j*ilx;
817 #endif
818  for (k = 0; k < inp; k++) {
819  a_img = cpl_imagelist_get(action, k);
820  padata = cpl_image_get_data_float(a_img);
821  i_img = cpl_imagelist_get(action, k);
822  pidata = cpl_image_get_data_float(i_img);
823  if (padata[sinfo_cu_xy(action, i, j)] == cubePT_USE) {
824 #ifdef DEBUG
825  sinfo_msg_debug("Used im[%d,%d,%d]=%lf\n",
826  i,j,k,pidata[pix]);
827 #endif
828  indata[pos].x = i;
829  indata[pos].y = j;
830  indata[pos].z = k;
831  indata[pos].w = pidata[sinfo_cu_xy(im, i, j)];
832  pos++;
833  }
834  else {
835  if (padata[sinfo_cu_xy(action, i, j)] == cubePT_FIND) {
836  (*point).x = i;
837  (*point).y = j;
838  (*point).z = k;
839 #ifdef DEBUG
840  sinfo_msg_debug("Find for im[%d,%d,%d]=%lf reason:%f",
841  i,j,k,pidata[pix],
842  padata[sinfo_cu_xy(action,i,j)]);
843 #endif
844  }
845  else {
846 #ifdef DEBUG
847  sinfo_msg_debug("Ignored im[%d,%d,%d]=%lf reason:%f",
848  i,j,k,pidata[sinfo_im_xy(im,i,j)],
849  padata[pix]);
850 #endif
851  }
852  }
853  }
854  }
855  }
856 
857 
858  if (pos < 2) {
859 #ifdef DEBUG
860  sinfo_msg_debug("subcube contains no valid pixels "
861  "to use in iterpolation");
862 #endif
863  /*i_img=cpl_imagelist_get((*point).z);
864  pidata=cpl_image_get_data_float(i_img);
865  return( pidata[sinfo_im_xy(im,(*point).x,(*point).y)] );*/
866  return (cubeNONEIGHBOR);
867 
868  }
869 
870  step = 0.01;
871  cumstep = 0.0;
872  selected_distance = 1000;
873  munk = pow(1.0 - cumstep, (double) pos - 1);
874  for (i = 0; (i < 100) && (munk != 0.0); i++) {
875  memset(&res, 0x00, sizeof(new_XYZW));
876  sinfo_new_bezier(indata, pos - 1, cumstep, munk, &res);
877  float distance = sqrt(
878  pow(((*point).x - res.x), 2)
879  + pow(((*point).y - res.y), 2)
880  + pow(((*point).z - res.z), 2));
881  /*sinfo_msg_debug("%lf %lf %lf %lf %lf\n",
882  res.x,res.y,res.z,res.w,distance);*/
883  if (distance < selected_distance) {
884  selected_distance = distance;
885  selected.x = res.x;
886  selected.y = res.y;
887  selected.z = res.z;
888  selected.w = res.w;
889  }
890  cumstep = cumstep + step;
891  munk = pow(1.0 - cumstep, (double) pos - 1);
892 
893  }
894 
895 #ifdef DEBUG
896  sinfo_msg_debug("Selected %lf %lf %lf %lf, distance=%lf",
897  selected.x,selected.y,selected.z,
898  selected.w,selected_distance);
899 #endif
900  i_img = cpl_imagelist_get(im, (*point).z);
901  pidata = cpl_image_get_data_float(i_img);
902  pidata[sinfo_cu_xy(im, (*point).x, (*point).y)] = selected.w;
903 
904  return selected.w;
905 }
906 
907 int
908 sinfo_new_bezier(new_XYZW *p, int n, double mu, double munk, new_XYZW *res)
909 {
910 
911  double muk = 1;
912  for (int k = 0; k <= n; k++) {
913  int nn = n;
914  int kn = k;
915  int nkn = n - k;
916  double blend = muk * munk;
917  muk *= mu;
918  munk /= (1.0 - mu);
919  while (nn >= 1) {
920  blend *= (double) nn;
921  nn--;
922  if (kn > 1) {
923  blend /= (double) kn;
924  kn--;
925  }
926  if (nkn > 1) {
927  blend /= (double) nkn;
928  nkn--;
929  }
930  }
931  res->x += p[k].x * blend;
932  res->y += p[k].y * blend;
933  res->z += p[k].z * blend;
934  res->w += p[k].w * blend;
935  }
936  return (0);
937 }
938 
939 int
940 sinfo_new_c_create_XYZ(new_Lookup *l)
941 {
942  cpl_image *imX, *imY, *imZ, *imcX;
943  short i, j, k, indexI, indexJ, x, y, z;
944  int size;
945  int idlx = 0;
946  int idly = 0;
947  int idnp = 0;
948  float* piddata = NULL;
949  float* pjddata = NULL;
950  float* pXdata = NULL;
951  float* pYdata = NULL;
952  float* pZdata = NULL;
953  float* phXdata = NULL;
954 
955  cpl_image* i_img = NULL;
956  cpl_image* j_img = NULL;
957 
958  idlx = cpl_image_get_size_x(cpl_imagelist_get(l->id, 0));
959  idly = cpl_image_get_size_y(cpl_imagelist_get(l->id, 0));
960  idnp = cpl_imagelist_get_size(l->id);
961 
962  size = idlx * idly;
963  /* allocate memory */
964  if (NULL == (imX = cpl_image_new(size, size, CPL_TYPE_FLOAT))) {
965  sinfo_msg_error(" could not allocate memory for X !\n");
966  return -1;
967  }
968  if (NULL == (imY = cpl_image_new(size, size, CPL_TYPE_FLOAT))) {
969  sinfo_msg_error(" could not allocate memory for Y !\n");
970  cpl_image_delete(imX);
971  return -1;
972  }
973  if (NULL == (imZ = cpl_image_new(size, size, CPL_TYPE_FLOAT))) {
974  sinfo_msg_error(" could not allocate memory for Z !\n");
975  cpl_image_delete(imX);
976  cpl_image_delete(imY);
977  return -1;
978  }
979  if (NULL == (imcX = cpl_image_new(size, size, CPL_TYPE_FLOAT))) {
980  sinfo_msg_error(" could not allocate memory for cX !\n");
981  cpl_image_delete(imX);
982  cpl_image_delete(imY);
983  cpl_image_delete(imZ);
984  return -1;
985  }
986 
987  l->X = imX;
988  l->Y = imY;
989  l->Z = imZ;
990  l->hX = imcX;
991 
992  /*Round id*/
993  for (i = 0; i < idlx; i++) {
994  for (j = 0; j < idly; j++) {
995  for (k = 0; k < idnp; k++) {
996  i_img = cpl_imagelist_get(l->id, k);
997  piddata = cpl_image_get_data_float(i_img);
998  piddata[sinfo_cu_xy(l->id, i, j)] = (float) sinfo_new_nint(
999  piddata[sinfo_cu_xy(l->id, i, j)]);
1000  }
1001  }
1002  }
1003 
1004  /*Round jd*/
1005  for (i = 0; i < idlx; i++) {
1006  for (j = 0; j < idly; j++) {
1007  for (k = 0; k < idnp; k++) {
1008  j_img = cpl_imagelist_get(l->jd, k);
1009  pjddata = cpl_image_get_data_float(j_img);
1010  pjddata[sinfo_cu_xy(l->jd, i, j)] = (float) sinfo_new_nint(
1011  pjddata[sinfo_cu_xy(l->jd, i, j)]);
1012  }
1013  }
1014  }
1015 
1016  /*Fill with -1 X Y Z*/
1017  for (i = 0; i < cpl_image_get_size_x(l->X); i++) {
1018  for (j = 0; j < cpl_image_get_size_y(l->X); j++) {
1019  pXdata = cpl_image_get_data_float(l->X);
1020  pYdata = cpl_image_get_data_float(l->Y);
1021  pZdata = cpl_image_get_data_float(l->Z);
1022 
1023  pXdata[sinfo_im_xy(l->X, i, j)] = ZERO;
1024  pYdata[sinfo_im_xy(l->Y, i, j)] = ZERO;
1025  pZdata[sinfo_im_xy(l->Z, i, j)] = ZERO;
1026  }
1027  }
1028 #define FORW
1029 #ifdef BACK
1030  for( x = idlx - 1;x>=0;x--) {
1031  for( y = idly - 1;y>=0;y--) {
1032  for( z = idnp - 1;z>=0;z--)
1033 #endif
1034 #ifdef FORW
1035  for (x = 0; x < idlx; x++) {
1036  for (y = 0; y < idly; y++) {
1037  for (z = 0; z < idnp; z++)
1038 #endif
1039  {
1040  i_img = cpl_imagelist_get(l->id, z);
1041  piddata = cpl_image_get_data_float(i_img);
1042  j_img = cpl_imagelist_get(l->jd, z);
1043  pjddata = cpl_image_get_data_float(j_img);
1044  indexI = piddata[sinfo_cu_xy(l->id, x, y)];
1045  indexJ = pjddata[sinfo_cu_xy(l->jd, x, y)];
1046  if (indexI > 0.0 && indexI < size && indexJ > 0.0
1047  && indexJ < size) {
1048  /*sinfo_msg_debug("%d %d %d = %f, %f\n",
1049  x,y,z,(float)ICube(x,y,z),(float)JCube(x,y,z));*/
1050  pXdata = cpl_image_get_data_float(l->X);
1051  pYdata = cpl_image_get_data_float(l->Y);
1052  pZdata = cpl_image_get_data_float(l->Z);
1053  phXdata = cpl_image_get_data_float(l->hX);
1054 
1055  pXdata[sinfo_im_xy(l->X, indexI, indexJ)] = x;
1056  phXdata[sinfo_im_xy(l->hX, indexI, indexJ)] =
1057  phXdata[sinfo_im_xy(l->hX, indexI, indexJ)]
1058  + 1;
1059 
1060  pYdata[sinfo_im_xy(l->Y, indexI, indexJ)] = y;
1061  /*phXdata[sinfo_im_xy(l->hX,indexI,indexJ)] =
1062  phXdata[sinfo_im_xy(l->hX,indexI,indexJ)] + 1;*/
1063 
1064  pZdata[sinfo_im_xy(l->Z, indexI, indexJ)] = z;
1065  /*phXdata[sinfo_im_xy(l->hX,indexI,indexJ)] =
1066  phXdata[sinfo_im_xy(l->hX,indexI,indexJ)] + 1;*/
1067  }
1068  }
1069  }
1070  }
1071 
1072  sinfo_msg("Filled X Y Z , cX cY cZ 2D frames\n");
1073  return (0);
1074 }
1075 
1081 new_Lookup *
1082 sinfo_new_lookup(void)
1083 {
1084  new_Lookup *l;
1085  l = (new_Lookup*) cpl_calloc(1, sizeof(new_Lookup));
1086  return (l);
1087 }
1094 void
1095 sinfo_new_destroy_lookup(new_Lookup *l)
1096 {
1097  if (l)
1098  cpl_free(l);
1099 }
1107 int
1108 sinfo_new_change_mask(cpl_image * mask, cpl_image * im)
1109 {
1110  int i;
1111  //int mlx=0;
1112  //int mly=0;
1113  int ilx = 0;
1114  int ily = 0;
1115  float* pidata = NULL;
1116  float* pmdata = NULL;
1117 
1118  if (mask == NULL || im == NULL )
1119  return -1;
1120  ilx = cpl_image_get_size_x(im);
1121  ily = cpl_image_get_size_y(im);
1122  pidata = cpl_image_get_data_float(im);
1123 
1124  //mlx=cpl_image_get_size_x(mask);
1125  //mly=cpl_image_get_size_y(mask);
1126  pmdata = cpl_image_get_data_float(mask);
1127 
1128  for (i = 0; i < (int) ilx * ily; i++) {
1129  if (isnan(pidata[i])) {
1130  pmdata[i] = 0.;
1131  }
1132  }
1133  return 0;
1134 }
1135 
1152 cpl_image *
1153 sinfo_new_c_bezier_find_cosmic(cpl_image *im, cpl_image *mask, new_Lookup *look,
1154  short rx, short ry, short rz, short lowerI,
1155  short highI, short lowerJ, short highJ,
1156  float factor)
1157 {
1158 
1159  int i, j, count;
1160  cpl_imagelist * sc_im, *drs_sc_mask;
1161  short szx, szy, szz;
1162  float /*ant,*/newValue, old/*,dif,porcentage,distance*/;
1163  double med, stdev;
1164  /*cpl_image *out;*/
1165  short rx_loop, ry_loop, rz_loop;
1166 
1167  cpl_image* o_img = NULL;
1168  //float* pmdata=NULL;
1169  float* pidata = NULL;
1170 
1171  int ilx = 0;
1172  int ily = 0;
1173 
1174  int mlx = 0;
1175  int mly = 0;
1176 
1177  mlx = cpl_image_get_size_x(mask);
1178  mly = cpl_image_get_size_y(mask);
1179  //pmdata=cpl_image_get_data_float(mask);
1180 
1181  ilx = cpl_image_get_size_x(im);
1182  ily = cpl_image_get_size_y(im);
1183  pidata = cpl_image_get_data_float(im);
1184 
1185  if (mlx != ilx || mly != ily) {
1186  sinfo_msg_error(" data & mask images not compatible in size\n");
1187  return NULL ;
1188  }
1189 
1190  /* allocate memory for sub cubes*/
1191  szx = (rx * 2) + 1;
1192  szy = (ry * 2) + 1;
1193  szz = (rz * 2) + 1;
1194 
1195  if (NULL == (sc_im = cpl_imagelist_new())) {
1196  sinfo_msg_error(" could not allocate memory for data subcube\n");
1197  return NULL ;
1198  }
1199  for (i = 0; i < szz; i++) {
1200  o_img = cpl_image_new(szx, szy, CPL_TYPE_FLOAT);
1201  cpl_imagelist_set(sc_im, o_img, i);
1202  }
1203 
1204  if (NULL == (drs_sc_mask = cpl_imagelist_new())) {
1205  sinfo_msg_error(" could not allocate memory for mask subcube\n");
1206  return NULL ;
1207  }
1208 
1209  for (i = 0; i < szz; i++) {
1210  o_img = cpl_image_new(szx, szy, CPL_TYPE_FLOAT);
1211  cpl_imagelist_set(drs_sc_mask, o_img, i);
1212  }
1213 
1214  count = 0;
1215  for (i = 0; i < mlx; i++) {
1216  for (j = 0; j < mly; j++) {
1217  if (i >= lowerI && i < highI && j >= lowerJ && j < highJ) {
1218 
1219  rx_loop = 1;
1220  ry_loop = 1;
1221  rz_loop = 1;
1222  newValue = sinfo_new_c_bezier_correct_cosmic(i, j, im, mask,
1223  sc_im, drs_sc_mask, look, rx_loop, ry_loop,
1224  rz_loop, &med, &stdev, factor);
1225  /* if no valid neighboors are found, increase size of
1226  sub cube until max radius is reached */
1227  while (newValue == cubeNONEIGHBOR && rx_loop < rx
1228  && ry_loop < ry && rz_loop < rz) {
1229  rx_loop++;
1230  ry_loop++;
1231  rz_loop++;
1232  /*sinfo_msg_debug("Increasing radius to %d, in %d %d",
1233  rx_loop, i, j) ; */
1234  newValue = sinfo_new_c_bezier_correct_cosmic(i, j, im, mask,
1235  sc_im, drs_sc_mask, look, rx_loop, ry_loop,
1236  rz_loop, &med, &stdev, factor);
1237  }
1238  /*give up on increasing the size*/
1239  if (isnan(newValue) || newValue == cubeNONEIGHBOR)
1240  /*<= -3.e10 ZERO )*/
1241  continue;
1242 
1243  old = pidata[sinfo_im_xy(im, i, j)];
1244  if (newValue != old) {
1245  pidata[sinfo_im_xy(im, i, j)] = newValue;
1246  /*sinfo_msg_debug("[%d,%d]=%f -> %f, med= %f, stdev=%f",
1247  i,j, old, newValue, med, stdev ); */
1248  count++;
1249  }
1250  }
1251  }
1252  }
1253 
1254  sinfo_msg_debug("bad pixels count: %d", count);
1255 
1256  cpl_imagelist_delete(sc_im);
1257  cpl_imagelist_delete(drs_sc_mask);
1258  return im;
1259 }
1260 
1278 float
1279 sinfo_new_c_bezier_correct_cosmic(int ipos, int jpos, cpl_image * im,
1280  cpl_image * mask, cpl_imagelist * sc_im,
1281  cpl_imagelist * drs_sc_mask,
1282  new_Lookup * look, short rx, short ry,
1283  short rz, double *med, double *stdev,
1284  float factor)
1285 {
1286  short ic, jc, kc, ii, jj, kk/*, sjj, skk*/, is, js, ks;
1287  short i, j, k, indexJ, indexI, lx, ly, lz, szx, szy, szz;
1288  /*float indexIf,indexJf,sp;*/
1289  cpl_image * X, *Y, *Z, *hX;
1290  cpl_imagelist * id, *jd;
1291  short counter;
1292  double sum;
1293  float* phXdata = NULL;
1294  float* pXdata = NULL;
1295  float* pYdata = NULL;
1296  float* pZdata = NULL;
1297 
1298  float* pimdata = NULL;
1299  float* pscdata = NULL;
1300  float* pdrsdata = NULL;
1301  float* piddata = NULL;
1302  float* pjddata = NULL;
1303  float* pmaskdata = NULL;
1304 
1305  int idlx = 0;
1306  int idly = 0;
1307  int idnp = 0;
1308 
1309  int drslx = 0;
1310  int drsly = 0;
1311  int drsnp = 0;
1312 
1313  X = look->X;
1314  Y = look->Y;
1315  Z = look->Z;
1316  hX = look->hX;
1317  id = look->id;
1318  jd = look->jd;
1319 
1320  phXdata = cpl_image_get_data_float(hX);
1321  /*if ( phXdata[sinfo_im_xy( hX, ipos, jpos)] > 1 )
1322  {
1323  sinfo_msg_error("double hit in position [%d,%d]=%f, can not correct",
1324  ipos,jpos,phXdata[sinfo_im_xy(hX,ipos,jpos)]) ;
1325  return ( -2e10 );
1326  }*/
1327  if (phXdata[sinfo_im_xy(hX, ipos, jpos)] < 1) {
1328  /*sinfo_msg_error("no lookup in position [%d,%d]=%f, can not correct",
1329  ipos,jpos,phXdata[sinfo_im_xy(hX,ipos,jpos)]) ;*/
1330  return ( ZERO);
1331  }
1332 
1333  pXdata = cpl_image_get_data_float(X);
1334  pYdata = cpl_image_get_data_float(Y);
1335  pZdata = cpl_image_get_data_float(Z);
1336 
1337  ic = pXdata[sinfo_im_xy(X, ipos, jpos)];
1338  jc = pYdata[sinfo_im_xy(Y, ipos, jpos)];
1339  kc = pZdata[sinfo_im_xy(Z, ipos, jpos)];
1340  /*if ( !(ipos % 16 ) )*/
1341 #ifdef DEBUG
1342  sinfo_msg_debug("Correcting bad pixel : ipos=%d,jpos=%d, "
1343  "in Cube -> ic=%d, jc=%d, kc=%d", ipos,jpos, ic, jc, kc );
1344 #endif
1345  /*limit to start not before the beginning of the cube*/
1346  ii = ic - rx;
1347  if (ii < 0)
1348  ii = 0;
1349  jj = jc - ry;
1350  if (jj < 0)
1351  jj = 0;
1352  kk = kc - rz;
1353  if (kk < 0)
1354  kk = 0;
1355 
1356 #ifdef DEBUG
1357  sinfo_msg_debug("Start Point in Cube -> ii=%d,jj=%d,kk=%d", ii, jj, kk );
1358 #endif
1359 
1360  /*limit to end not outside of the cube */
1361  szx = (rx * 2) + 1;
1362  szy = (ry * 2) + 1;
1363  szz = (rz * 2) + 1;
1364 
1365  idlx = cpl_image_get_size_x(cpl_imagelist_get(id, 0));
1366  idly = cpl_image_get_size_y(cpl_imagelist_get(id, 0));
1367  idnp = cpl_imagelist_get_size(id);
1368 
1369  lx = idlx;
1370  ly = idly;
1371  lz = idnp;
1372  if ((ic + rx) >= idlx)
1373  szx = szx - ((ic + rx) - (lx - 1));
1374 
1375  if ((jc + ry) >= idly)
1376  szy = szy - ((jc + ry) - (ly - 1));
1377 
1378  if ((kc + rz) >= idnp)
1379  szz = szz - ((kc + rz) - (lz - 1));
1380 
1381 #ifdef DEBUG
1382  sinfo_msg_error("Size of subcube : szx=%d,szy=%d,szz=%d\n", szx, szy, szz );
1383  /*fill whole mask with not available*/
1384  drsnp=cpl_imagelist_get_size(drs_sc_mask);
1385  drslx=cpl_image_get_size_x(cpl_imagelist_get(drs_sc_mask,0));
1386  drsly=cpl_image_get_size_y(cpl_imagelist_get(drs_sc_mask,0));
1387 
1388  sinfo_msg_error("Fill Mask subcube of size: %d,%d,%d, with NOINFO",
1389  drslx, drsly, drsnp);
1390 #endif
1391  for (i = 0; i < drslx; i++) {
1392  for (j = 0; j < drsly; j++) {
1393  for (k = 0; k < drsnp; k++) {
1394  pdrsdata = cpl_image_get_data_float(
1395  cpl_imagelist_get(drs_sc_mask, k));
1396  pdrsdata[sinfo_cu_xy(drs_sc_mask, i, j)] = cubePT_NOINFO;
1397  }
1398  }
1399  }
1400  pimdata = cpl_image_get_data_float(im);
1401  pmaskdata = cpl_image_get_data_float(mask);
1402  for (i = ii, is = 0; i < ii + szx; i++, is++) {
1403  for (j = jj, js = 0; j < jj + szy; j++, js++) {
1404  for (k = kk, ks = 0; k < kk + szz; k++, ks++) {
1405 #ifdef DEBUG
1406  sinfo_msg_debug("i=%d j=%d k=%d is=%d ij=%d ik=%d",
1407  i,j,k,is,js,ks);
1408 #endif
1409  piddata = cpl_image_get_data_float(cpl_imagelist_get(id, k));
1410  pjddata = cpl_image_get_data_float(cpl_imagelist_get(id, k));
1411  pdrsdata = cpl_image_get_data_float(
1412  cpl_imagelist_get(drs_sc_mask, ks));
1413  pscdata = cpl_image_get_data_float(
1414  cpl_imagelist_get(sc_im, ks));
1415 
1416  indexI = sinfo_new_nint(piddata[sinfo_cu_xy(id, i, j)]);
1417  indexJ = sinfo_new_nint(pjddata[sinfo_cu_xy(jd, i, j)]);
1418  if (indexJ <= -1 || indexJ >= 2048 || indexI == -1) {
1419  pdrsdata[sinfo_cu_xy(drs_sc_mask, is, js)] = cubePT_NOINFO;
1420  continue;
1421  }
1422  pscdata[sinfo_cu_xy(sc_im, is, js)] = pimdata[sinfo_im_xy(im,
1423  indexI, indexJ)];
1424  pdrsdata[sinfo_cu_xy(drs_sc_mask, is, js)] =
1425  pmaskdata[sinfo_im_xy(mask, indexI, indexJ)];
1426 #ifdef DEBUG
1427  sinfo_msg_debug("Cube i=%d, j=%d, k=%d ; "
1428  " Sub is=%d, js=%d, ks=%d ; "
1429  " Plane I=%d,J=%d ; mask %f ; im %f\n",
1430  i, j, k, is, js, ks, indexI, indexJ,
1431  pmaskdata[sinfo_im_xy(mask,indexI,indexJ)],
1432  pimdata[sinfo_im_xy(im,indexI,indexJ)]);
1433 #endif
1434 
1435  }
1436  }
1437  }
1438 
1439  /* ignoring the elements in the slitlet of the tested pixel */
1440 
1441  for (i = 0; i < szx; i++) {
1442  for (k = 0; k < szz; k++) {
1443  pdrsdata = cpl_image_get_data_float(
1444  cpl_imagelist_get(drs_sc_mask, k));
1445  pdrsdata[sinfo_cu_xy(drs_sc_mask, i, ry)] = cubePT_NOINFO;
1446  }
1447  }
1448  /* now calculate mean and stdev in subcube */
1449 
1450  counter = 0;
1451  sum = 0;
1452  for (i = 0; i < szx; i++) {
1453  for (j = 0; j < szy; j++) {
1454  for (k = 0; k < szz; k++) {
1455  pdrsdata = cpl_image_get_data_float(
1456  cpl_imagelist_get(drs_sc_mask, k));
1457  pscdata = cpl_image_get_data_float(cpl_imagelist_get(sc_im, k));
1458  if (pscdata[sinfo_cu_xy(sc_im, i, j)] != ZERO
1459  && pdrsdata[sinfo_cu_xy(drs_sc_mask, i, j)]
1460  != cubePT_NOINFO) {
1461  sum = sum + pscdata[sinfo_cu_xy(sc_im, i, j)];
1462  counter++;
1463  }
1464  }
1465  }
1466  }
1467 
1468  *med = sum / counter;
1469 
1470  counter = 0;
1471  sum = 0;
1472  for (i = 0; i < szx; i++) {
1473  for (j = 0; j < szy; j++) {
1474  for (k = 0; k < szz; k++) {
1475  pscdata = cpl_image_get_data_float(cpl_imagelist_get(sc_im, k));
1476  pdrsdata = cpl_image_get_data_float(
1477  cpl_imagelist_get(drs_sc_mask, k));
1478  if (pscdata[sinfo_cu_xy(sc_im, i, j)] != ZERO
1479  && pdrsdata[sinfo_cu_xy(drs_sc_mask, i, j)]
1480  != cubePT_NOINFO) {
1481  sum = sum + (pscdata[sinfo_cu_xy(
1482  sc_im, i, j)]
1483  - *med)
1484  * (pscdata[sinfo_cu_xy(
1485  sc_im,
1486  i,
1487  j)]
1488  - *med);
1489  counter++;
1490  }
1491  }
1492  }
1493  }
1494 
1495  *stdev = sqrt(sum / (counter - 1));
1496 
1497  if ((fabs(pimdata[sinfo_im_xy(im, ipos, jpos)] - *med) > factor * *stdev)
1498  || isnan(pimdata[sinfo_im_xy(im,ipos,jpos)])) {
1499  pdrsdata = cpl_image_get_data_float(cpl_imagelist_get(drs_sc_mask, rz));
1500  pdrsdata[sinfo_cu_xy(drs_sc_mask, rx, ry)] = cubePT_FIND;
1501  return (sinfo_new_c_bezier_interpol(sc_im, drs_sc_mask));
1502  }
1503  else
1504  return (pimdata[sinfo_im_xy(im, ipos, jpos)]);
1505 
1506 }
1507 
#define sinfo_msg_debug(...)
Print a debug message.
Definition: sinfo_msg.h:103
#define sinfo_msg_error(...)
Print an error message.
Definition: sinfo_msg.h:69