29#include "irplib_utils.h"
31#include "irplib_plugin.h"
33#include "visir_spectro.h"
34#include "visir_cpl_compat.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#ifndef VISIR_ATTR_UNUSED
161 #if defined(__GNUC__) || defined(__ICC) || defined(__clang__)
162 #define VISIR_ATTR_UNUSED __attribute__ ((__unused__))
164 #define VISIR_ATTR_UNUSED
169static inline cpl_boolean visir_str_par_is_empty(
const char * str)
171 return (str == NULL || strlen(str) == 0 ||
172 strcmp(str, VISIR_STR_PAR_EMPTY) == 0);
175static inline int visir_round_to_int(
const double x)
177 return x >= 0 ? (int)(x + 0.5) : (int)(x - 0.5);
184size_t visir_get_num_threads(cpl_boolean force);
185int visir_cmp_frm_fn(
const cpl_frame * a,
const cpl_frame * b);
186cpl_error_code visir_image_multiply_fast(cpl_image *,
const cpl_image *);
187double visir_image_get_mean_fast(
const cpl_image * im);
188cpl_error_code visir_move_products(cpl_frameset *frames,
189 const char * dest_,
const char * src);
190double visir_utils_get_exptime(
const int,
const cpl_propertylist *);
191double * visir_utils_get_wls(
const irplib_framelist *);
192cpl_image * visir_create_disk_intimage(
int,
int,
int,
int,
int);
193cpl_image * visir_create_ring_intimage(
int,
int,
int,
int,
int,
int);
194double visir_image_sigma_clip(
const cpl_image *,
double *);
195double visir_img_phot_sigma_clip(
const cpl_image *);
196cpl_error_code visir_get_subpixel_maxpos(
const cpl_image *,
200typedef struct _visir_fftx_cache visir_fftx_cache;
201visir_fftx_cache * visir_new_fftx_cache(
void);
202void visir_delete_fftx_cache(visir_fftx_cache *);
203cpl_error_code visir_fftxcorrelate(
const cpl_image *,
const cpl_image *,
204 cpl_boolean,
double *,
double *,
205 double *, visir_fftx_cache *);
207visir_interpolate_rejected(cpl_image * img,
size_t ** ppoints,
size_t * n);
210visir_parallel_median_collapse(
const cpl_imagelist * l);
214 cpl_propertylist * mplist;
219 cpl_imagelist * imgs;
221 cpl_propertylist ** plists;
227typedef void(*visir_free)(
void *);
230visir_imglist_new(
const cpl_size capacity, cpl_propertylist * mplist);
233visir_imglist_delete(visir_imglist * l, visir_free aux_destructor);
236visir_imglist_unwrap(visir_imglist * l, visir_free aux_destructor);
239visir_imglist_append(visir_imglist * l, cpl_image * img,
243visir_imglist_append_imglist(visir_imglist * l, cpl_imagelist * imgs,
247visir_imglist_get_size(
const visir_imglist * imgs);
250visir_imglist_get_img(
const visir_imglist * imgs,
const cpl_size index);
253visir_imglist_get_data(
const visir_imglist * imgs,
const cpl_size index);
256visir_imglist_get(
const visir_imglist * imgs,
const cpl_size index,
257 cpl_image ** img,
void ** auxdata);
260visir_imglist_set_data(visir_imglist * imgs,
261 const cpl_size index,
void * auxdata);
264visir_imglist_set_mplist(visir_imglist * imgs, cpl_propertylist * mplist);
267visir_imglist_get_mplist(
const visir_imglist * imgs);
270visir_imglist_get_imglist(
const visir_imglist * imgs);
273int visir_star_find(
const cpl_vector *,
const cpl_vector *,
double,
double,
276cpl_error_code visir_star_convert(
const char *,
int,
int,
double,
char,
int,
277 int,
double,
const double *,
int,
double *,
280double visir_star_dist_min(
const double *,
const double *,
int,
int *,
int *);
282cpl_table * visir_table_new_xypos(
const cpl_imagelist * images,
const char *);
284int visir_vector_minpos(
const cpl_vector *);
287char * visir_frameset_serialize(
const cpl_frameset * frames,
size_t * size);
288cpl_frameset * visir_frameset_deserialize(
char * block,
size_t * size);
289cpl_error_code visir_send_frameset(FILE * ,
const cpl_frameset * );
291void visir_drop_cache(
const char * filename, off_t offset, off_t length);
292void visir_readahead(
const char * filename, off_t offset, off_t length);
294size_t visir_get_nbytes(
const cpl_image * img);
295size_t visir_get_nbytes_plist(
const cpl_propertylist * plist);
298cpl_boolean visir_get_tempdir(
char * tmpdir_);
299char * visir_get_cwd(
void);
301cpl_parameter * visir_parameter_duplicate(
const cpl_parameter * p);
303cpl_error_code visir_copy_parameters(cpl_parameterlist *,
304 const cpl_parameterlist *);
307visir_init_recipe(
const char * name,
int (*get_info)(cpl_pluginlist *),
308 cpl_pluginlist * plugins);
311visir_run_recipe(cpl_recipe * recipe,
312 cpl_frameset * framelist,
const cpl_parameterlist * parlist,
313 cpl_error_code (*set_parlist)(cpl_parameterlist *,
314 const cpl_parameterlist *));
317visir_tmpdir_exec(
const char * recipename, cpl_plugin * plugin,
318 int (*function)(cpl_frameset *,
const cpl_parameterlist *));
320visir_forking_exec(
const char * recipename, cpl_plugin * plugin,
321 int (*function)(cpl_frameset *,
const cpl_parameterlist *));
324visir_prepare_frameset(
const cpl_frameset * frameset,
325 const char ** tagmap,
size_t ntags,
326 cpl_boolean reverse);
327cpl_frameset * visir_remove_modified_calib(cpl_frameset * set);
329cpl_error_code visir_bivector_load(cpl_bivector *, FILE *);
331const char ** visir_framelist_set_tag(irplib_framelist *,
332 char * (*)(
const cpl_frame *,
333 const cpl_propertylist *,
int),
336int visir_get_ncombine(
const irplib_framelist *);
338cpl_error_code visir_qc_append_background(cpl_propertylist *,
339 const irplib_framelist *,
int,
int);
341cpl_error_code visir_qc_append_capa(cpl_propertylist *,
342 const irplib_framelist *);
344cpl_error_code visir_qc_append_filter(cpl_propertylist *,
345 const irplib_framelist *);
346cpl_error_code visir_qc_append_exptime(cpl_propertylist *,
347 const irplib_framelist *);
351typedef struct visir_queue visir_queue;
352visir_queue * visir_queue_init(
const int max_size);
353void visir_queue_set_error(visir_queue * q, cpl_error_code error);
354void visir_queue_delete(visir_queue * q);
355cpl_error_code visir_queue_put(visir_queue * q,
void * data);
356void * visir_queue_pop(visir_queue * q);
359size_t visir_upper_bound(
const cpl_vector * vec,
double val);
360size_t visir_lower_bound(
const cpl_vector * vec,
double val);
361cpl_image * visir_linintp_values(
const cpl_image * inp,
const cpl_bivector * ref);
363fit_2d_gauss(
const cpl_image * img_,
const cpl_image * weights, cpl_size x, cpl_size y,
364 double est_fwhmx,
double est_fwhmy,
365 double * peak,
double * peak_err,
366 double * major,
double * major_err,
367 double * minor,
double * minor_err,
368 double * angle,
double * angle_err);
370fit_1d_gauss(
const cpl_vector * xv,
const cpl_vector * y, cpl_vector * dyv,
371 double * x0,
double * x0_err,
372 double * peak,
double * peak_err,
373 double * sigma,
double * sigma_err);