40 #include "sofi_utils.h"
41 #include "sofi_pfits.h"
62 const char * sofi_license =
63 "This file is part of the SOFI Instrument Pipeline\n"
64 "Copyright (C) 2002,2003 European Southern Observatory\n"
66 "This program is free software; you can redistribute it and/or modify\n"
67 "it under the terms of the GNU General Public License as published by\n"
68 "the Free Software Foundation; either version 2 of the License, or\n"
69 "(at your option) any later version.\n"
71 "This program is distributed in the hope that it will be useful,\n"
72 "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
73 "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
74 "GNU General Public License for more details.\n"
76 "You should have received a copy of the GNU General Public License\n"
77 "along with this program; if not, write to the Free Software\n"
78 "Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, \n"
98 if (ilist == NULL)
return -1 ;
99 ima = cpl_imagelist_get(ilist, 0) ;
100 if (cpl_image_get_type(ima) != CPL_TYPE_FLOAT)
return -1 ;
103 nima = cpl_imagelist_get_size(ilist) ;
106 for (i=0 ; i<nima ; i++) {
107 ima = cpl_imagelist_get(ilist, i) ;
109 cpl_msg_error(cpl_func,
"Cannot correct crosstalk in image %d", i+1) ;
127 cpl_image * collapsed ;
136 if (ima == NULL)
return -1 ;
137 if (cpl_image_get_type(ima) != CPL_TYPE_FLOAT)
return -1 ;
140 nx = cpl_image_get_size_x(ima) ;
141 ny = cpl_image_get_size_y(ima) ;
144 collapsed = cpl_image_new(1, ny, CPL_TYPE_FLOAT) ;
145 pcollapsed = cpl_image_get_data_float(collapsed) ;
146 pima = cpl_image_get_data_float(ima) ;
147 for (j=0 ; j<ny ; j++) {
149 for (i=0 ; i<nx ; i++) val += pima[i+j*nx] ;
150 pcollapsed[j] = val * 1.4e-5 ;
154 corr = cpl_image_new(1, ny, CPL_TYPE_FLOAT) ;
155 pcorr = cpl_image_get_data_float(corr) ;
156 for (j=0 ; j<ny ; j++) {
157 if (j < ny/2) k = j + ny/2 ;
159 pcorr[j] = pcollapsed[j] + pcollapsed[k] ;
161 cpl_image_delete(collapsed) ;
164 pima = cpl_image_get_data_float(ima) ;
165 for (j=0 ; j<ny ; j++) {
166 for (i=0 ; i<nx ; i++) {
167 pima[i+j*nx] -= pcorr[j] ;
170 cpl_image_delete(corr) ;
183 cpl_bivector * offsets ;
187 cpl_propertylist * plist ;
192 if (fset == NULL)
return NULL ;
195 nfiles = cpl_frameset_get_size(fset) ;
196 offsets = cpl_bivector_new(nfiles) ;
197 offsets_x = cpl_bivector_get_x_data(offsets) ;
198 offsets_y = cpl_bivector_get_y_data(offsets) ;
199 for (i=0 ; i<nfiles ; i++) {
200 if (cpl_error_get_code()) {
201 cpl_bivector_delete(offsets) ;
205 frame = cpl_frameset_get_position(fset, i) ;
206 plist=cpl_propertylist_load(cpl_frame_get_filename(frame),0);
209 cpl_propertylist_delete(plist) ;
210 if (cpl_error_get_code()) {
211 cpl_msg_error(cpl_func,
"Cannot get offsets from header") ;
212 cpl_bivector_delete(offsets) ;
217 for (i=1 ; i<nfiles ; i++) {
218 offsets_x[i] -= offsets_x[0] ;
219 offsets_y[i] -= offsets_y[0] ;
221 offsets_x[0] = offsets_y[0] = 0.00 ;
235 if (!strcmp(f,
"NB_2.195"))
return SOFI_BAND_KS ;
236 if (!strcmp(f,
"NB_2.09"))
return SOFI_BAND_KS ;
237 if (!strcmp(f,
"NB_1.187"))
return SOFI_BAND_J ;
238 if (!strcmp(f,
"NB_1.061"))
return SOFI_BAND_J ;
239 if (!strcmp(f,
"Z"))
return SOFI_BAND_J ;
240 if (!strcmp(f,
"Js"))
return SOFI_BAND_J ;
241 if (!strcmp(f,
"J"))
return SOFI_BAND_J ;
242 if (!strcmp(f,
"H"))
return SOFI_BAND_H ;
243 if (!strcmp(f,
"Ks"))
return SOFI_BAND_KS ;
244 if (!strcmp(f,
"NB_2.28"))
return SOFI_BAND_KS ;
245 if (!strcmp(f,
"NB_2.248"))
return SOFI_BAND_KS ;
246 if (!strcmp(f,
"NB_HeI_J"))
return SOFI_BAND_J ;
247 if (!strcmp(f,
"NB_1.215"))
return SOFI_BAND_J ;
248 if (!strcmp(f,
"NB_FeII_J"))
return SOFI_BAND_J ;
249 if (!strcmp(f,
"NB_Pbeta"))
return SOFI_BAND_J ;
250 if (!strcmp(f,
"NB_FeII_H"))
return SOFI_BAND_H ;
251 if (!strcmp(f,
"NB_1.71"))
return SOFI_BAND_H ;
252 if (!strcmp(f,
"NB_HeI_K"))
return SOFI_BAND_KS ;
253 if (!strcmp(f,
"NB_H2_S1"))
return SOFI_BAND_KS ;
254 if (!strcmp(f,
"NB_Brgamma"))
return SOFI_BAND_KS ;
255 if (!strcmp(f,
"NB_CO"))
return SOFI_BAND_KS ;
256 return SOFI_BAND_UNKNOWN ;
269 case SOFI_BAND_J:
return "J" ;
270 case SOFI_BAND_JS:
return "Js" ;
271 case SOFI_BAND_JBLOCK:
return "J+Block" ;
272 case SOFI_BAND_H:
return "H" ;
273 case SOFI_BAND_K:
return "K" ;
274 case SOFI_BAND_KS:
return "Ks" ;
275 case SOFI_BAND_L:
return "L" ;
276 case SOFI_BAND_M:
return "M" ;
277 case SOFI_BAND_LP:
return "Lp" ;
278 case SOFI_BAND_MP:
return "Mp" ;
279 case SOFI_BAND_Z:
return "Z" ;
280 case SOFI_BAND_SZ:
return "SZ" ;
281 case SOFI_BAND_SH:
return "SH" ;
282 case SOFI_BAND_SK:
return "SK" ;
283 case SOFI_BAND_SL:
return "SL" ;
284 default:
return "Unknown" ;
299 const cpl_frameset * in,
303 const cpl_frame * cur_frame ;
304 cpl_frame * loc_frame ;
305 int nbframes, nbext ;
309 if (in == NULL)
return NULL ;
310 if (tag == NULL)
return NULL ;
313 nbframes = cpl_frameset_get_size(in) ;
316 if ((nbext = cpl_frameset_count_tags(in, tag)) == 0)
return NULL ;
319 out = cpl_frameset_new() ;
323 for (i=0 ; i<nbframes ; i++) {
324 cur_frame = cpl_frameset_get_position_const(in, i) ;
325 if (!strcmp(cpl_frame_get_tag(cur_frame), tag)) {
326 loc_frame = cpl_frame_duplicate(cur_frame) ;
327 cpl_frameset_insert(out, loc_frame) ;
343 const cpl_frameset * in,
346 const cpl_frame * cur_frame ;
349 if ((cur_frame = cpl_frameset_find_const(in, tag)) == NULL)
return NULL ;
350 return cpl_frame_get_filename(cur_frame) ;
364 cpl_imagelist * ilist,
365 const char * detlin_a,
366 const char * detlin_b,
367 const char * detlin_c)
377 float val, val2, val3 ;
381 if (!ilist || !detlin_a || !detlin_b || !detlin_c)
return -1 ;
384 ima = cpl_image_load(detlin_a, CPL_TYPE_FLOAT, 0, 0) ;
385 imb = cpl_image_load(detlin_b, CPL_TYPE_FLOAT, 0, 0) ;
386 imc = cpl_image_load(detlin_c, CPL_TYPE_FLOAT, 0, 0) ;
387 if (!ima || !imb || !imc) {
388 cpl_msg_error(cpl_func,
"Cannot load the detlin images") ;
389 if (ima) cpl_image_delete(ima) ;
390 if (imb) cpl_image_delete(imb) ;
391 if (imc) cpl_image_delete(imc) ;
394 pima = cpl_image_get_data_float(ima) ;
395 pimb = cpl_image_get_data_float(imb) ;
396 pimc = cpl_image_get_data_float(imc) ;
399 nx = cpl_image_get_size_x(cpl_imagelist_get(ilist, 0)) ;
400 ny = cpl_image_get_size_y(cpl_imagelist_get(ilist, 0)) ;
401 ni = cpl_imagelist_get_size(ilist) ;
402 if ((cpl_image_get_size_x(ima) != nx) ||
403 (cpl_image_get_size_x(imb) != nx) ||
404 (cpl_image_get_size_x(imc) != nx) ||
405 (cpl_image_get_size_y(ima) != ny) ||
406 (cpl_image_get_size_y(imb) != ny) ||
407 (cpl_image_get_size_y(imc) != ny)) {
408 cpl_msg_error(cpl_func,
"Incompatible sizes") ;
409 cpl_image_delete(ima) ;
410 cpl_image_delete(imb) ;
411 cpl_image_delete(imc) ;
416 for (i=0 ; i<nx*ny ; i++) {
417 if (fabs(pimc[i]) < 1e-5) {
419 for (j=0 ; j<ni ; j++) {
420 pdata = cpl_image_get_data_float(cpl_imagelist_get(ilist, j)) ;
422 pdata[i] = val-pima[i] ;
424 }
else if (fabs(pimb[i]) < 1e-3) {
425 for (j=0 ; j<ni ; j++) {
426 pdata = cpl_image_get_data_float(cpl_imagelist_get(ilist, j)) ;
430 val2 = 2 * pimc[i] / (pimb[i] * pimb[i]) ;
432 for (j=0 ; j<ni ; j++) {
433 pdata = cpl_image_get_data_float(cpl_imagelist_get(ilist, j)) ;
435 val3 = 1-2*val2*(pima[i]-val) ;
437 pdata[i] = val-pima[i] ;
439 pdata[i]=((float)sqrt(val3)-1) / val2 ;
445 cpl_image_delete(ima) ;
446 cpl_image_delete(imb) ;
447 cpl_image_delete(imc) ;