36#include "visir_recipe.h"
42#define RECIPE_STRING "visir_img_pfov"
48static cpl_error_code visir_img_pfov_save(cpl_frameset *,
49 const cpl_parameterlist *,
52VISIR_RECIPE_DEFINE(visir_img_pfov,
53 VISIR_PARAM_NODPOS | VISIR_PARAM_AUTOBPM |
54 VISIR_PARAM_STRIPITE | VISIR_PARAM_STRIPMOR |
55 VISIR_PARAM_STRIPNON |
56 VISIR_PARAM_GLITCH | VISIR_PARAM_PURGE,
57 "Pixel field of view recipe",
58 "This recipe determines the pixel field of view by finding "
60 "position of a bright object and comparing it to the "
61 "header information\n"
62 "giving the telescope pointing.\n"
63 "The files listed in the Set Of Frames (sof-file) "
65 "VISIR-field-of-view-file.fits " VISIR_IMG_PFOV_BIN
" or\n"
66 "VISIR-field-of-view-file.fits " VISIR_IMG_PFOV_TEL
"\n"
68 "The corresponding product will have a FITS card\n"
69 "'HIERARCH ESO PRO CATG' with a value of\n"
70 VISIR_IMG_PFOV_TAB_PROCATG_BIN
" or\n"
71 VISIR_IMG_PFOV_TAB_PROCATG_TEL
73 MAN_VISIR_CALIB_BPM_IMG);
79enum _visir_img_mode_ {
85typedef enum _visir_img_mode_ visir_img_mode;
89 visir_img_mode img_mode;
92} visir_img_pfov_config;
112static int visir_img_pfov(cpl_frameset * framelist,
113 const cpl_parameterlist * parlist)
115 cpl_errorstate cleanstate = cpl_errorstate_get();
116 irplib_framelist * allframes = NULL;
117 irplib_framelist * rawframes = NULL;
120 cpl_imagelist * nodded = NULL;
121 cpl_vector * ok = NULL;
122 cpl_table * tab = NULL;
136 allframes = irplib_framelist_cast(framelist);
137 skip_if(allframes == NULL);
138 rawframes = irplib_framelist_extract_regexp(allframes,
"^(" VISIR_IMG_PFOV_BIN
139 "|" VISIR_IMG_PFOV_TEL
")$",
141 skip_if (rawframes == NULL);
143 skip_if(irplib_framelist_load_propertylist_all(rawframes, 0,
144 visir_property_regexp,
150 visir_img_pfov_config.img_mode = visir_img_none;
151 if (cpl_frameset_find(framelist, VISIR_IMG_PFOV_BIN))
152 visir_img_pfov_config.img_mode = visir_img_bin;
153 if (cpl_frameset_find(framelist, VISIR_IMG_PFOV_TEL)) {
154 skip_if (visir_img_pfov_config.img_mode);
155 visir_img_pfov_config.img_mode = visir_img_tel;
158 bug_if(visir_img_pfov_config.img_mode == visir_img_none);
161 badpix = irplib_frameset_find_file(framelist, VISIR_CALIB_BPM);
164 flat = irplib_frameset_find_file(framelist, VISIR_CALIB_FLAT);
167 cpl_msg_info(cpl_func,
"Construct the nodded images");
170 NULL, CPL_FALSE, 0.0, 0);
171 if (nodded == NULL) {
172 cpl_msg_error(cpl_func,
"Cannot combine the input frames");
176 nrow = cpl_imagelist_get_size(nodded);
179 tab = visir_table_new_xypos(nodded,
"FLUX");
180 skip_if (tab == NULL);
182 skip_if (cpl_table_erase_column(tab,
"FLUX"));
184 skip_if (cpl_table_new_column(tab,
"A_POS", CPL_TYPE_DOUBLE));
185 skip_if (cpl_table_new_column(tab,
"D_POS", CPL_TYPE_DOUBLE));
186 skip_if (cpl_table_new_column(tab,
"PFOV", CPL_TYPE_DOUBLE));
188 skip_if (cpl_table_fill_column_window(tab,
"A_POS", 0, nrow, -1));
189 skip_if (cpl_table_fill_column_window(tab,
"D_POS", 0, nrow, -1));
190 skip_if (cpl_table_fill_column_window(tab,
"PFOV", 0, nrow, 0));
192 ok = cpl_vector_new(nrow);
194 skip_if (cpl_vector_fill(ok, 1));
197 for (i=0; i < nrow ; i++) {
198 const cpl_propertylist * plist =
199 irplib_framelist_get_propertylist_const(rawframes, 2*i);
205 if (cpl_error_get_code()) {
206 visir_error_reset(
"Could not get FITS key");
207 skip_if(cpl_vector_set(ok, i, 0));
211 if (cpl_table_get_double(tab,
"X_POS", i, NULL) <= 0 ||
212 cpl_table_get_double(tab,
"Y_POS", i, NULL) <= 0)
213 skip_if(cpl_vector_set(ok, i, 0));
215 skip_if (cpl_table_set_double(tab,
"A_POS", i, apos));
216 skip_if (cpl_table_set_double(tab,
"D_POS", i, dpos));
223 cpl_msg_error(cpl_func,
"None of the %d files contain a valid combination "
224 "of centroids and offsets", nrow);
225 visir_error_set(CPL_ERROR_DATA_NOT_FOUND);
231 for (i=0; i < nrow ; i++, okprev = oki) {
232 oki = cpl_vector_get(ok, i) != 0.0 ? 1 : 0;
234 const double x = cpl_table_get_double(tab,
"X_POS", i, NULL);
235 const double y = cpl_table_get_double(tab,
"Y_POS", i, NULL);
236 const double a = cpl_table_get_double(tab,
"A_POS", i, NULL);
237 const double d = cpl_table_get_double(tab,
"D_POS", i, NULL);
241 const double dx = x - xprev;
242 const double dy = y - yprev;
243 const double da = a - aprev;
244 const double dd = d - dprev;
246 const double dividend = sqrt(da * da + dd * dd);
247 const double divisor = sqrt(dx * dx + dy * dy);
249 if (dividend < FLT_MAX * divisor)
250 cpl_table_set_double(tab,
"PFOV", i, dividend / divisor);
262 cpl_msg_info(cpl_func,
"Save the results");
263 skip_if (visir_img_pfov_save(framelist, parlist, tab));
267 irplib_framelist_delete(allframes);
268 irplib_framelist_delete(rawframes);
269 cpl_vector_delete(ok);
270 cpl_imagelist_delete(nodded);
271 cpl_table_delete(tab);
273 return cpl_error_get_code();
285static cpl_error_code visir_img_pfov_save(cpl_frameset * set,
286 const cpl_parameterlist * parlist,
287 const cpl_table * tab)
290 skip_if(irplib_dfs_save_table(set, parlist, set, tab, NULL, RECIPE_STRING,
291 visir_img_pfov_config.img_mode == visir_img_bin
292 ? VISIR_IMG_PFOV_TAB_PROCATG_BIN
293 : VISIR_IMG_PFOV_TAB_PROCATG_TEL, NULL, NULL,
294 visir_pipe_id, RECIPE_STRING CPL_DFS_FITS));
298 return cpl_error_get_code();
cpl_error_code visir_dfs_check_framelist_tag(const irplib_framelist *self)
Check the tags in a frameset (group raw only)
int visir_dfs_set_groups(cpl_frameset *set)
Set the group as RAW or CALIB in a frameset.
double visir_pfits_get_delta(const cpl_propertylist *self)
The DELTA keyword in a VISIR header.
double visir_pfits_get_alpha(const cpl_propertylist *self)
The alpha angle.