29 #include "irplib_utils.h"
31 #include "irplib_plugin.h"
33 #include "visir_spectro.h"
34 #include "visir_cpl_compat.h"
37 #include <sys/types.h>
43 #ifndef VISIR_STAR_MAX_RADIUS
45 # define VISIR_STAR_MAX_RADIUS (2.0/60.0)
48 #define VISIR_STR_PAR_EMPTY "NONE"
51 #define visir_vector_plot(ARG1, ARG2, ARG3, ARG4) \
53 cpl_errorstate prestate = cpl_errorstate_get(); \
54 if (cpl_plot_vector(ARG1, ARG2, ARG3, ARG4)) \
55 irplib_error_recover(prestate, "Could not plot vector"); \
58 #define visir_bivector_plot(ARG1, ARG2, ARG3, ARG4) \
60 cpl_errorstate prestate = cpl_errorstate_get(); \
61 if (cpl_plot_bivector(ARG1, ARG2, ARG3, ARG4)) \
62 irplib_error_recover(prestate, "Could not plot bivector"); \
65 #define visir_table_plot(ARG1, ARG2, ARG3, ARG4, ARG5, ARG6) \
67 cpl_errorstate prestate = cpl_errorstate_get(); \
68 if (cpl_plot_column(ARG1, ARG2, ARG3, ARG4, ARG5, ARG6)) \
69 irplib_error_recover(prestate, "Could not plot table"); \
72 #define visir_image_plot(ARG1, ARG2, ARG3, ARG4) \
74 cpl_errorstate prestate = cpl_errorstate_get(); \
75 if (cpl_plot_image(ARG1, ARG2, ARG3, ARG4)) \
76 irplib_error_recover(prestate, "Could not plot image"); \
79 #define visir_image_col_plot(ARG1, ARG2, ARG3, ARG4, ARG5, ARG6, ARG7) \
81 cpl_errorstate prestate = cpl_errorstate_get(); \
82 if (cpl_plot_image_col(ARG1, ARG2, ARG3, ARG4, ARG5, ARG6, ARG7)) \
83 irplib_error_recover(prestate, "Could not plot image columns"); \
86 #define visir_image_row_plot(ARG1, ARG2, ARG3, ARG4, ARG5, ARG6, ARG7) \
88 cpl_errorstate prestate = cpl_errorstate_get(); \
89 if (cpl_plot_image_row(ARG1, ARG2, ARG3, ARG4, ARG5, ARG6, ARG7)) \
90 irplib_error_recover(prestate, "Could not plot image raws"); \
94 #define visir_error_set(ERRCODE) cpl_error_set(cpl_func, ERRCODE)
97 #define visir_error_reset(...) \
98 irplib_error_recover(cleanstate, __VA_ARGS__)
100 #define FOR_EACH(name, l) \
101 for(cx_list_iterator name = cx_list_begin(l); \
102 name != cx_list_end(l); name = cx_list_next(l, name))
107 #define FOR_EACH_T(var, list) \
108 for (cx_list_iterator __it = cx_list_begin(list), __cond = NULL, \
109 __end = cx_list_end(list); \
110 __it != __end; __it = cx_list_next(list, __it)) \
111 if ((__cond = NULL) != NULL) {} else \
112 for (var = cx_list_get(list, __it); __cond == NULL; \
113 __cond = (cx_list_iterator)1)
127 #define FOR_EACH_FRAMESET(name, fs) \
128 for (int __ind = 0, __cond = 0; __ind < cpl_frameset_get_size(fs); \
130 if ((__cond = 0) != 0) {} else \
131 for (cpl_frame * name = cpl_frameset_get_position(fs, __ind); \
132 __cond == 0; __cond = 1)
134 #define FOR_EACH_FRAMESET_C(name, fs) \
135 for (int __ind = 0, __cond = 0; __ind < cpl_frameset_get_size(fs); \
137 if ((__cond = 0) != 0) {} else \
138 for (const cpl_frame * name = cpl_frameset_get_position_const(fs, __ind); \
139 __cond == 0; __cond = 1)
141 #define ARRAY_LEN(x) (sizeof(x)/sizeof(x[0]))
145 #if _OPENMP >= 200805
146 #define OMP_PRAGMA(x) _Pragma (#x)
147 #define OMP3_PRAGMA(x) _Pragma (#x)
151 #define OMP_PRAGMA(x) _Pragma (#x)
152 #define OMP3_PRAGMA(x)
156 #define OMP_PRAGMA(x)
157 #define OMP3_PRAGMA(x)
160 static inline cpl_boolean visir_str_par_is_empty(
const char * str)
162 return (str == NULL || strlen(str) == 0 ||
163 strcmp(str, VISIR_STR_PAR_EMPTY) == 0);
166 static inline int visir_round_to_int(
const double x)
168 return x >= 0 ? (int)(x + 0.5) : (int)(x - 0.5);
175 size_t visir_get_num_threads(cpl_boolean force);
176 int visir_cmp_frm_fn(
const cpl_frame * a,
const cpl_frame * b);
177 cpl_error_code visir_image_multiply_fast(cpl_image *,
const cpl_image *);
178 double visir_image_get_mean_fast(
const cpl_image * im);
179 cpl_error_code visir_move_products(cpl_frameset *frames,
180 const char * dest_,
const char * src);
181 double visir_utils_get_exptime(
const int,
const cpl_propertylist *);
182 double * visir_utils_get_wls(
const irplib_framelist *);
183 cpl_image * visir_create_disk_intimage(
int,
int,
int,
int,
int);
184 cpl_image * visir_create_ring_intimage(
int,
int,
int,
int,
int,
int);
185 double visir_image_sigma_clip(
const cpl_image *,
double *);
186 double visir_img_phot_sigma_clip(
const cpl_image *);
187 cpl_error_code visir_get_subpixel_maxpos(
const cpl_image *,
194 cpl_error_code visir_fftxcorrelate(
const cpl_image *,
const cpl_image *,
195 cpl_boolean,
double *,
double *,
198 visir_interpolate_rejected(cpl_image * img,
size_t ** ppoints,
size_t * n);
201 visir_parallel_median_collapse(
const cpl_imagelist * l);
205 cpl_propertylist * mplist;
210 cpl_imagelist * imgs;
212 cpl_propertylist ** plists;
218 typedef void(*visir_free)(
void *);
221 visir_imglist_new(
const cpl_size capacity, cpl_propertylist * mplist);
224 visir_imglist_delete(
visir_imglist * l, visir_free aux_destructor);
227 visir_imglist_unwrap(
visir_imglist * l, visir_free aux_destructor);
234 visir_imglist_append_imglist(
visir_imglist * l, cpl_imagelist * imgs,
241 visir_imglist_get_img(
const visir_imglist * imgs,
const cpl_size index);
244 visir_imglist_get_data(
const visir_imglist * imgs,
const cpl_size index);
247 visir_imglist_get(
const visir_imglist * imgs,
const cpl_size index,
248 cpl_image ** img,
void ** auxdata);
252 const cpl_size index,
void * auxdata);
255 visir_imglist_set_mplist(
visir_imglist * imgs, cpl_propertylist * mplist);
264 int visir_star_find(
const cpl_vector *,
const cpl_vector *,
double,
double,
267 cpl_error_code visir_star_convert(
const char *,
int,
int,
double,
char,
int,
268 int,
double,
const double *,
int,
double *,
271 double visir_star_dist_min(
const double *,
const double *,
int,
int *,
int *);
273 cpl_table * visir_table_new_xypos(
const cpl_imagelist * images,
const char *);
275 int visir_vector_minpos(
const cpl_vector *);
278 char * visir_frameset_serialize(
const cpl_frameset * frames,
size_t * size);
279 cpl_frameset * visir_frameset_deserialize(
char * block,
size_t * size);
280 cpl_error_code visir_send_frameset(FILE * ,
const cpl_frameset * );
282 void visir_drop_cache(
const char * filename, off_t offset, off_t length);
283 void visir_readahead(
const char * filename, off_t offset, off_t length);
285 size_t visir_get_nbytes(
const cpl_image * img);
286 size_t visir_get_nbytes_plist(
const cpl_propertylist * plist);
289 cpl_boolean visir_get_tempdir(
char * tmpdir_);
291 cpl_parameter * visir_parameter_duplicate(
const cpl_parameter * p);
293 cpl_error_code visir_copy_parameters(cpl_parameterlist *,
294 const cpl_parameterlist *);
297 visir_init_recipe(
const char * name,
int (*get_info)(cpl_pluginlist *),
298 cpl_pluginlist * plugins);
301 visir_run_recipe(cpl_recipe * recipe,
302 cpl_frameset * framelist,
const cpl_parameterlist * parlist,
303 cpl_error_code (*set_parlist)(cpl_parameterlist *,
304 const cpl_parameterlist *));
307 visir_tmpdir_exec(
const char * recipename, cpl_plugin * plugin,
308 int (*
function)(cpl_frameset *,
const cpl_parameterlist *));
310 visir_forking_exec(
const char * recipename, cpl_plugin * plugin,
311 int (*
function)(cpl_frameset *,
const cpl_parameterlist *));
314 visir_prepare_frameset(
const cpl_frameset * frameset,
315 const char ** tagmap,
size_t ntags,
316 cpl_boolean reverse);
317 cpl_frameset * visir_remove_modified_calib(cpl_frameset * set);
319 cpl_error_code visir_bivector_load(cpl_bivector *, FILE *);
321 const char ** visir_framelist_set_tag(irplib_framelist *,
322 char * (*)(
const cpl_frame *,
323 const cpl_propertylist *,
int),
326 cpl_error_code visir_qc_append_background(cpl_propertylist *,
327 const irplib_framelist *,
int,
int);
329 cpl_error_code visir_qc_append_capa(cpl_propertylist *,
330 const irplib_framelist *);
332 cpl_error_code visir_qc_append_filter(cpl_propertylist *,
333 const irplib_framelist *);
334 cpl_error_code visir_qc_append_exptime(cpl_propertylist *,
335 const irplib_framelist *);
339 typedef struct visir_queue visir_queue;
340 visir_queue * visir_queue_init(
const int max_size);
341 void visir_queue_set_error(visir_queue * q, cpl_error_code error);
342 void visir_queue_delete(visir_queue * q);
343 cpl_error_code visir_queue_put(visir_queue * q,
void * data);
344 void * visir_queue_pop(visir_queue * q);
347 size_t visir_upper_bound(
const cpl_vector * vec,
double val);
348 size_t visir_lower_bound(
const cpl_vector * vec,
double val);
349 cpl_image * visir_linintp_values(
const cpl_image * inp,
const cpl_bivector * ref);
351 fit_2d_gauss(
const cpl_image * img_,
const cpl_image * weights, cpl_size x, cpl_size y,
352 double est_fwhmx,
double est_fwhmy,
353 double * peak,
double * peak_err,
354 double * major,
double * major_err,
355 double * minor,
double * minor_err,
356 double * angle,
double * angle_err);
358 fit_1d_gauss(
const cpl_vector * xv,
const cpl_vector * y, cpl_vector * dyv,
359 double * x0,
double * x0_err,
360 double * peak,
double * peak_err,
361 double * sigma,
double * sigma_err);