DETMON Pipeline Reference Manual  1.3.0
detmon_utils.c
1 /* $Id: detmon_utils.c,v 1.8 2013-07-15 12:03:32 amodigli Exp $
2  *
3  * This file is part of the IIINSTRUMENT Pipeline
4  * Copyright (C) 2002,2003 European Southern Observatory
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02111-1307 USA
19  */
20 
21 /*
22  * $Author: amodigli $
23  * $Date: 2013-07-15 12:03:32 $
24  * $Revision: 1.8 $
25  * $Name: not supported by cvs2svn $
26  */
27 
28 #ifdef HAVE_CONFIG_H
29 #include <config.h>
30 #endif
31 
32 /*-----------------------------------------------------------------------------
33  Includes
34  -----------------------------------------------------------------------------*/
35 
36 #include "detmon_utils.h"
37 #include "irplib_utils.h"
38 
39 #include <cpl.h>
40 #include <assert.h>
41 
43 /*----------------------------------------------------------------------------*/
47 /*----------------------------------------------------------------------------*/
48 
49 
50 /*----------------------------------------------------------------------------*/
58 /*----------------------------------------------------------------------------*/
59 const char * detmon_get_license(void)
60 {
61  const char * detmon_license =
62  "This file is part of the DETMON Instrument Pipeline\n"
63  "Copyright (C) 2002,2003 European Southern Observatory\n"
64  "\n"
65  "This program is free software; you can redistribute it and/or modify\n"
66  "it under the terms of the GNU General Public License as published by\n"
67  "the Free Software Foundation; either version 2 of the License, or\n"
68  "(at your option) any later version.\n"
69  "\n"
70  "This program is distributed in the hope that it will be useful,\n"
71  "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
72  "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
73  "GNU General Public License for more details.\n"
74  "\n"
75  "You should have received a copy of the GNU General Public License\n"
76  "along with this program; if not, write to the Free Software\n"
77  "Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, \n"
78  "MA 02111-1307 USA" ;
79  return detmon_license ;
80 }
81 
82 
83 /* ---------------------------------------------------------------------------*/
94 /* ---------------------------------------------------------------------------*/
95 static void expand_region(const cpl_image * ref,
96  cpl_size * llx,
97  cpl_size * lly,
98  cpl_size * urx,
99  cpl_size * ury)
100 {
101  if (*llx < 1)
102  *llx = 1;
103  if (*lly < 1)
104  *lly = 1;
105  if (*urx < 1)
106  *urx = cpl_image_get_size_x(ref);
107  if (*ury < 1)
108  *ury = cpl_image_get_size_y(ref);
109 }
110 
111 
112 /* ---------------------------------------------------------------------------*/
132 /* ---------------------------------------------------------------------------*/
133 cpl_imagelist *
134 detmon_load_frameset_window(const cpl_frameset * fset, cpl_type type,
135  cpl_size pnum, cpl_size xtnum,
136  cpl_size llx, cpl_size lly,
137  cpl_size urx, cpl_size ury,
138  cpl_size nx, cpl_size ny)
139 {
140  cpl_imagelist * list = cpl_imagelist_new();
141  const size_t n = cpl_frameset_get_size(fset);
142  skip_if(pnum < 0);
143  if (nx >= 0 && ny >= 0) {
144  error_if(urx - llx + 1 > nx || ury - lly + 1 > ny ,
145  CPL_ERROR_ILLEGAL_INPUT,
146  "window size [%d:%d,%d:%d] larger than output size [%d, %d]",
147  (int)llx, (int)urx, (int)lly, (int)ury, (int)nx, (int)ny);
148  }
149 
150  for (size_t i = 0; i < n; i++) {
151  const cpl_frame * frm = cpl_frameset_get_position_const(fset, i);
152  const char * fn = cpl_frame_get_filename(frm);
153  if (xtnum < 0) {
154  cpl_size next = cpl_frame_get_nextensions(frm);
155  for (size_t e = 0; e < next; e++) {
156  cpl_image * image = cpl_image_load_window(fn, type, pnum, e,
157  llx, lly, urx, ury);
158  skip_if(image == NULL);
159  if(nx < 0 || ny < 0 ) {
160  cpl_imagelist_set(list, image, cpl_imagelist_get_size(list));
161  } else {
162  cpl_image * full = cpl_image_new(nx, ny, type);
163  cpl_image_copy(full, image, llx, lly);
164  cpl_image_delete(image);
165  cpl_imagelist_set(list, full, cpl_imagelist_get_size(list));
166  }
167 
168  }
169  }
170  else {
171  cpl_image * image = cpl_image_load_window(fn, type, pnum, xtnum,
172  llx, lly, urx, ury);
173  skip_if(image == NULL);
174  if(nx < 0 || ny < 0 ) {
175  cpl_imagelist_set(list, image, cpl_imagelist_get_size(list));
176  } else {
177  cpl_image * full = cpl_image_new(nx, ny, type);
178  cpl_image_copy(full, image, llx, lly);
179  cpl_image_delete(image);
180  cpl_imagelist_set(list, full, cpl_imagelist_get_size(list));
181  }
182  }
183  }
184 
185  end_skip;
186 
187  if (cpl_error_get_code()) {
188  cpl_imagelist_delete(list);
189  return NULL;
190  }
191 
192  return list;
193 }
194 
195 
196 /* ---------------------------------------------------------------------------*/
209 /* ---------------------------------------------------------------------------*/
210 cpl_image * detmon_subtract_create_window(const cpl_image * a,
211  const cpl_image * b,
212  cpl_size llx,
213  cpl_size lly,
214  cpl_size urx,
215  cpl_size ury)
216 {
217  cpl_image * na = cpl_image_extract(a, llx, lly, urx, ury);
218  cpl_image * nb = cpl_image_extract(b, llx, lly, urx, ury);
219  cpl_image_subtract(na, nb);
220  cpl_image_delete(nb);
221 
222  return na;
223 }
224 
225 
226 /* ---------------------------------------------------------------------------*/
242 /* ---------------------------------------------------------------------------*/
243 cpl_image * detmon_subtracted_avg(const cpl_image * on1,
244  const cpl_image * off1,
245  const cpl_image * on2,
246  const cpl_image * off2,
247  cpl_size llx, cpl_size lly,
248  cpl_size urx, cpl_size ury)
249 {
250  expand_region(on1, &llx, &lly, &urx, &ury);
251  cpl_image * dif1 = cpl_image_extract(on1, llx, lly, urx, ury);
252  cpl_image * dif2 = cpl_image_extract(on2, llx, lly, urx, ury);
253  cpl_image * b = cpl_image_extract(off1, llx, lly, urx, ury);
254  cpl_image * dif_avg;
255 
256  cpl_image_subtract(dif1, b);
257  if (off1 != off2) {
258  cpl_image_delete(b);
259  b = cpl_image_extract(off2, llx, lly, urx, ury);
260  cpl_image_subtract(dif1, b);
261  }
262  else {
263  cpl_image_subtract(dif2, b);
264  }
265  cpl_image_delete(b);
266 
267  dif_avg = cpl_image_average_create(dif1, dif2);
268  cpl_image_abs(dif_avg);
269 
270  cpl_image_delete(dif1);
271  cpl_image_delete(dif2);
272 
273  return dif_avg;
274 }
275