rename HKL_BEGIN/END_DECLS -> G_BEGIN/END_DECLS
[hkl.git] / hkl.h
blob236db8adf1225f984381a23eef95939972b0fb72
1 /* This file is part of the hkl library.
3 * The hkl library is free software: you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License as published by
5 * the Free Software Foundation, either version 3 of the License, or
6 * (at your option) any later version.
8 * The hkl library is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
13 * You should have received a copy of the GNU General Public License
14 * along with the hkl library. If not, see <http://www.gnu.org/licenses/>.
16 * Copyright (C) 2003-2014 Synchrotron SOLEIL
17 * L'Orme des Merisiers Saint-Aubin
18 * BP 48 91192 GIF-sur-YVETTE CEDEX
20 * Authors: Picca Frédéric-Emmanuel <picca@synchrotron-soleil.fr>
22 #ifndef __HKL_H__
23 #define __HKL_H__
25 #include <math.h> // for M_PI
26 #include <stddef.h> // for size_t
27 #include <stdio.h> // for FILE
28 #include <glib.h> // for g_set_error, GError etc
29 #include <hkl/ccan/darray/darray.h> // for darray
31 /* deprecated */
32 #if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 1)
33 # define HKL_DEPRECATED __attribute__((__deprecated__))
34 #elif defined(_MSC_VER) && (_MSC_VER >= 1300)
35 # define HKL_DEPRECATED __declspec(deprecated)
36 #else
37 # define HKL_DEPRECATED
38 #endif
40 #if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5)
41 # define HKL_DEPRECATED_FOR(f) __attribute__((__deprecated__("Use '" #f "' instead")))
42 #elif defined(_MSC_FULL_VER) && (_MSC_FULL_VER > 140050320)
43 # define HKL_DEPRECATED_FOR(f) __declspec(deprecated("is deprecated. Use '" #f "' instead"))
44 #else
45 # define HKL_DEPRECATED_FOR(f) HKL_DEPRECATED
46 #endif
48 #define HKL_TRUE 1
49 #define HKL_FALSE 0
51 #define HKL_TINY 1e-7
52 #define HKL_EPSILON 1e-6
53 #define HKL_DEGTORAD (M_PI/180.)
54 #define HKL_RADTODEG (180./M_PI)
56 /* tau = 2pi or 1 */
57 #define HKL_TAU (2. * M_PI)
58 /* #define HKL_TAU 1 */
60 #ifdef HKLAPI
61 # undef HKLEAPI
62 #endif
64 #ifdef __GNUC__
65 # if __GNUC__ >= 4
66 # define HKLAPI __attribute__ ((visibility("default")))
67 # else
68 # define HKLAPI
69 # endif
70 #else
71 /**
72 * @def HKLAPI
73 * @brief Used to export functions(by changing visibility).
75 # define HKLAPI
76 #endif
78 #if (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3))
79 # define HKL_ARG_NONNULL(...) __attribute__ ((__nonnull__(__VA_ARGS__)))
80 #else
81 # define HKL_ARG_NONNULL(...)
82 #endif
84 #define _darray(type) type *item; size_t size; size_t alloc
86 G_BEGIN_DECLS
88 /**********/
89 /* Matrix */
90 /**********/
92 typedef struct _HklMatrix HklMatrix;
94 HKLAPI HklMatrix *hkl_matrix_new(void);
96 HKLAPI HklMatrix *hkl_matrix_new_full(double m11, double m12, double m13,
97 double m21, double m22, double m23,
98 double m31, double m32, double m33);
100 HKLAPI HklMatrix *hkl_matrix_new_euler(double euler_x, double euler_y, double euler_z);
102 HKLAPI double hkl_matrix_get(const HklMatrix *self, unsigned int i, unsigned int j) HKL_ARG_NONNULL(1);
104 HKLAPI void hkl_matrix_free(HklMatrix *self) HKL_ARG_NONNULL(1);
106 HKLAPI void hkl_matrix_init(HklMatrix *self,
107 double m11, double m12, double m13,
108 double m21, double m22, double m23,
109 double m31, double m32, double m33) HKL_ARG_NONNULL(1);
111 HKLAPI int hkl_matrix_cmp(const HklMatrix *self, const HklMatrix *m) HKL_ARG_NONNULL(1, 2);
113 HKLAPI void hkl_matrix_times_matrix(HklMatrix *self, const HklMatrix *m) HKL_ARG_NONNULL(1, 2);
115 /*************/
116 /* Parameter */
117 /*************/
119 typedef struct _HklParameter HklParameter;
121 /* HklParameter */
123 HKLAPI HklParameter *hkl_parameter_new_copy(const HklParameter *self) HKL_ARG_NONNULL(1);
125 HKLAPI void hkl_parameter_free(HklParameter *self) HKL_ARG_NONNULL(1);
127 HKLAPI const char *hkl_parameter_name_get(const HklParameter *self) HKL_ARG_NONNULL(1);
129 HKLAPI double hkl_parameter_value_get(const HklParameter *self) HKL_ARG_NONNULL(1);
131 HKLAPI int hkl_parameter_value_set(HklParameter *self, double value,
132 GError **error) HKL_ARG_NONNULL(1);
134 HKLAPI double hkl_parameter_value_unit_get(const HklParameter *self) HKL_ARG_NONNULL(1);
136 HKLAPI int hkl_parameter_value_unit_set(HklParameter *self, double value,
137 GError **error) HKL_ARG_NONNULL(1);
139 HKLAPI void hkl_parameter_min_max_get(const HklParameter *self, double *min, double *max) HKL_ARG_NONNULL(1, 2, 3);
141 HKLAPI void hkl_parameter_min_max_set(HklParameter *self, double min, double max) HKL_ARG_NONNULL(1);
143 HKLAPI void hkl_parameter_min_max_unit_get(const HklParameter *self, double *min, double *max) HKL_ARG_NONNULL(1, 2, 3);
145 HKLAPI void hkl_parameter_min_max_unit_set(HklParameter *self, double min, double max) HKL_ARG_NONNULL(1);
147 HKLAPI int hkl_parameter_fit_get(const HklParameter *self) HKL_ARG_NONNULL(1);
149 HKLAPI void hkl_parameter_fit_set(HklParameter *self, int fit) HKL_ARG_NONNULL(1);
151 HKLAPI void hkl_parameter_randomize(HklParameter *self) HKL_ARG_NONNULL(1);
153 /************/
154 /* Detector */
155 /************/
157 typedef struct _HklDetector HklDetector;
158 typedef enum _HklDetectorType
160 HKL_DETECTOR_TYPE_0D
161 } HklDetectorType;
163 HKLAPI void hkl_detector_free(HklDetector *self) HKL_ARG_NONNULL(1);
165 HKLAPI void hkl_detector_idx_set(HklDetector *self, int idx) HKL_ARG_NONNULL(1);
167 HKLAPI void hkl_detector_fprintf(FILE *f, const HklDetector *self) HKL_ARG_NONNULL(1, 2);
169 HKLAPI HklDetector *hkl_detector_factory_new(HklDetectorType type);
171 /************/
172 /* Geometry */
173 /************/
175 typedef struct _HklGeometry HklGeometry;
176 typedef struct _HklGeometryList HklGeometryList;
177 typedef struct _HklGeometryListItem HklGeometryListItem;
179 /* HklGeometry */
181 HKLAPI void hkl_geometry_free(HklGeometry *self) HKL_ARG_NONNULL(1);
183 HKLAPI void hkl_geometry_set(HklGeometry *self, const HklGeometry *src) HKL_ARG_NONNULL(1, 2);
185 HKLAPI const HklParameter *hkl_geometry_axis_get(const HklGeometry *self, const char *name) HKL_ARG_NONNULL(1, 2);
187 HKLAPI void hkl_geometry_axis_set(HklGeometry *self, const HklParameter *axis) HKL_ARG_NONNULL(1, 2);
189 HKLAPI const char *hkl_geometry_name_get(const HklGeometry *self) HKL_ARG_NONNULL(1);
191 HKLAPI double hkl_geometry_wavelength_get(const HklGeometry *self) HKL_ARG_NONNULL(1);
193 HKLAPI void hkl_geometry_wavelength_set(HklGeometry *self, double wavelength) HKL_ARG_NONNULL(1);
195 HKLAPI void hkl_geometry_randomize(HklGeometry *self) HKL_ARG_NONNULL(1);
197 /* TODO after bissecting it seems that this method is slow (to replace) */
198 HKLAPI int hkl_geometry_set_values_unit_v(HklGeometry *self, ...) HKL_ARG_NONNULL(1);
200 HKLAPI void hkl_geometry_fprintf(FILE *file, const HklGeometry *self) HKL_ARG_NONNULL(1, 2);
202 /* HklGeometryList */
204 #define HKL_GEOMETRY_LIST_FOREACH(item, list) for((item)=hkl_geometry_list_items_first_get((list)); \
205 (item); \
206 (item)=hkl_geometry_list_items_next_get((list), (item)))
208 HKLAPI size_t hkl_geometry_list_n_items_get(const HklGeometryList *self) HKL_ARG_NONNULL(1);
210 HKLAPI const HklGeometryListItem *hkl_geometry_list_items_first_get(const HklGeometryList *self) HKL_ARG_NONNULL(1);
212 HKLAPI const HklGeometryListItem *hkl_geometry_list_items_next_get(const HklGeometryList *self,
213 const HklGeometryListItem *item) HKL_ARG_NONNULL(1, 2);
215 /* HklGeometryListItem */
217 HKLAPI const HklGeometry *hkl_geometry_list_item_geometry_get(const HklGeometryListItem *self) HKL_ARG_NONNULL(1);
219 /**********/
220 /* Sample */
221 /**********/
223 typedef struct _HklLattice HklLattice;
224 typedef struct _HklSample HklSample;
225 typedef struct _HklSampleReflection HklSampleReflection;
227 /* Lattice */
229 HKLAPI HklLattice *hkl_lattice_new(double a, double b, double c,
230 double alpha, double beta, double gamma);
232 HKLAPI HklLattice *hkl_lattice_new_copy(const HklLattice *self) HKL_ARG_NONNULL(1);
234 HKLAPI HklLattice *hkl_lattice_new_default(void);
236 HKLAPI void hkl_lattice_free(HklLattice *self) HKL_ARG_NONNULL(1);
238 HKLAPI const HklParameter *hkl_lattice_a_get(const HklLattice *self) HKL_ARG_NONNULL(1);
240 HKLAPI void hkl_lattice_a_set(HklLattice *self, const HklParameter *parameter) HKL_ARG_NONNULL(1, 2);
242 HKLAPI const HklParameter *hkl_lattice_b_get(const HklLattice *self) HKL_ARG_NONNULL(1);
244 HKLAPI void hkl_lattice_b_set(HklLattice *self, const HklParameter *parameter) HKL_ARG_NONNULL(1, 2);
246 HKLAPI const HklParameter *hkl_lattice_c_get(const HklLattice *self) HKL_ARG_NONNULL(1);
248 HKLAPI void hkl_lattice_c_set(HklLattice *self, const HklParameter *parameter) HKL_ARG_NONNULL(1, 2);
250 HKLAPI const HklParameter *hkl_lattice_alpha_get(const HklLattice *self) HKL_ARG_NONNULL(1);
252 HKLAPI void hkl_lattice_alpha_set(HklLattice *self, const HklParameter *parameter) HKL_ARG_NONNULL(1, 2);
254 HKLAPI const HklParameter *hkl_lattice_beta_get(const HklLattice *self) HKL_ARG_NONNULL(1);
256 HKLAPI void hkl_lattice_beta_set(HklLattice *self, const HklParameter *parameter) HKL_ARG_NONNULL(1, 2);
258 HKLAPI const HklParameter *hkl_lattice_gamma_get(const HklLattice *self) HKL_ARG_NONNULL(1);
260 HKLAPI void hkl_lattice_gamma_set(HklLattice *self, const HklParameter *parameter) HKL_ARG_NONNULL(1, 2);
262 HKLAPI int hkl_lattice_set(HklLattice *self,
263 double a, double b, double c,
264 double alpha, double beta, double gamma) HKL_ARG_NONNULL(1);
266 HKLAPI void hkl_lattice_get(const HklLattice *self,
267 double *a, double *b, double *c,
268 double *alpha, double *beta, double *gamma) HKL_ARG_NONNULL(1, 2, 3, 4, 5, 6, 7);
270 HKLAPI int hkl_lattice_get_B(const HklLattice *self, HklMatrix *B) HKL_ARG_NONNULL(1, 2);
272 HKLAPI int hkl_lattice_get_1_B(const HklLattice *self, HklMatrix *B) HKL_ARG_NONNULL(1, 2);
274 HKLAPI int hkl_lattice_reciprocal(const HklLattice *self, HklLattice *reciprocal) HKL_ARG_NONNULL(1, 2);
276 /* HklSample */
278 HKLAPI HklSample *hkl_sample_new(const char *name) HKL_ARG_NONNULL(1);
280 HKLAPI HklSample *hkl_sample_new_copy(const HklSample *self) HKL_ARG_NONNULL(1);
282 HKLAPI void hkl_sample_free(HklSample *self) HKL_ARG_NONNULL(1);
284 HKLAPI const char *hkl_sample_name_get(const HklSample *self) HKL_ARG_NONNULL(1);
286 HKLAPI void hkl_sample_name_set(HklSample *self, const char *name) HKL_ARG_NONNULL(1, 2);
288 HKLAPI const HklLattice *hkl_sample_lattice_get(HklSample *self) HKL_ARG_NONNULL(1);
290 HKLAPI void hkl_sample_lattice_set(HklSample *self, const HklLattice *lattice) HKL_ARG_NONNULL(1, 2);
292 HKLAPI const HklParameter *hkl_sample_ux_get(const HklSample *self) HKL_ARG_NONNULL(1);
294 HKLAPI void hkl_sample_ux_set(HklSample *self, const HklParameter *ux) HKL_ARG_NONNULL(1, 2);
296 HKLAPI const HklParameter *hkl_sample_uy_get(const HklSample *self) HKL_ARG_NONNULL(1);
298 HKLAPI void hkl_sample_uy_set(HklSample *self, const HklParameter *uy) HKL_ARG_NONNULL(1, 2);
300 HKLAPI const HklParameter *hkl_sample_uz_get(const HklSample *self) HKL_ARG_NONNULL(1);
302 HKLAPI void hkl_sample_uz_set(HklSample *self, const HklParameter *uz) HKL_ARG_NONNULL(1, 2);
304 HKLAPI const HklMatrix *hkl_sample_U_get(const HklSample *self) HKL_ARG_NONNULL(1);
306 HKLAPI void hkl_sample_U_set(HklSample *self, const HklMatrix *U) HKL_ARG_NONNULL(1);
308 HKLAPI const HklMatrix *hkl_sample_UB_get(const HklSample *self) HKL_ARG_NONNULL(1);
310 HKLAPI double hkl_sample_UB_set(HklSample *self, const HklMatrix *UB) HKL_ARG_NONNULL(1, 2);
312 HKLAPI HklSampleReflection *hkl_sample_first_reflection_get(HklSample *self) HKL_ARG_NONNULL(1);
314 HKLAPI HklSampleReflection *hkl_sample_next_reflection_get(HklSample *self,
315 HklSampleReflection *reflection) HKL_ARG_NONNULL(1, 2);
317 HKLAPI void hkl_sample_del_reflection(HklSample *self,
318 HklSampleReflection *reflection) HKL_ARG_NONNULL(1, 2);
320 HKLAPI void hkl_sample_add_reflection(HklSample *self,
321 HklSampleReflection *reflection) HKL_ARG_NONNULL(1, 2);
323 HKLAPI int hkl_sample_compute_UB_busing_levy(HklSample *self,
324 const HklSampleReflection *r1,
325 const HklSampleReflection *r2) HKL_ARG_NONNULL(1, 2, 3);
327 HKLAPI double hkl_sample_get_reflection_mesured_angle(const HklSample *self,
328 const HklSampleReflection *r1,
329 const HklSampleReflection *r2) HKL_ARG_NONNULL(1, 2, 3);
331 HKLAPI double hkl_sample_get_reflection_theoretical_angle(const HklSample *self,
332 const HklSampleReflection *r1,
333 const HklSampleReflection *r2) HKL_ARG_NONNULL(1, 2, 3);
335 HKLAPI double hkl_sample_affine(HklSample *self) HKL_ARG_NONNULL(1);
337 /* hklSampleReflection */
339 HKLAPI HklSampleReflection *hkl_sample_reflection_new(const HklGeometry *geometry,
340 const HklDetector *detector,
341 double h, double k, double l) HKL_ARG_NONNULL(1, 2);
343 HKLAPI void hkl_sample_reflection_hkl_get(const HklSampleReflection *self,
344 double *h, double *k, double *l) HKL_ARG_NONNULL(1, 2, 3, 4);
346 HKLAPI void hkl_sample_reflection_hkl_set(HklSampleReflection *self,
347 double h, double k, double l) HKL_ARG_NONNULL(1);
349 HKLAPI int hkl_sample_reflection_flag_get(const HklSampleReflection *self) HKL_ARG_NONNULL(1);
351 HKLAPI void hkl_sample_reflection_flag_set(HklSampleReflection *self, int flag) HKL_ARG_NONNULL(1);
353 HKLAPI const HklGeometry *hkl_sample_reflection_geometry_get(HklSampleReflection *self) HKL_ARG_NONNULL(1);
355 HKLAPI void hkl_sample_reflection_geometry_set(HklSampleReflection *self,
356 const HklGeometry *geometry) HKL_ARG_NONNULL(1, 2);
358 /**************/
359 /* PseudoAxis */
360 /**************/
362 typedef struct _HklPseudoAxis HklPseudoAxis;
363 typedef struct _HklEngine HklEngine;
364 typedef struct _HklEngineList HklEngineList;
366 typedef darray(const char *) darray_string;
367 typedef darray(HklEngine *) darray_engine;
369 /* HklEngine */
371 HKLAPI const char *hkl_engine_name_get(const HklEngine *self) HKL_ARG_NONNULL(1);
373 HKLAPI unsigned int hkl_engine_len(const HklEngine *self) HKL_ARG_NONNULL(1);
375 HKLAPI const darray_string *hkl_engine_pseudo_axes_names_get(HklEngine *self) HKL_ARG_NONNULL(1);
377 HKLAPI void hkl_engine_pseudo_axes_values_get(HklEngine *self,
378 double values[], size_t n_values) HKL_ARG_NONNULL(1, 2);
380 HKLAPI unsigned int hkl_engine_pseudo_axes_values_set(HklEngine *self,
381 double values[], size_t n_values,
382 GError **error) HKL_ARG_NONNULL(1, 2);
384 HKLAPI void hkl_engine_pseudo_axes_randomize(HklEngine *self) HKL_ARG_NONNULL(1);
386 HKLAPI const HklParameter *hkl_engine_pseudo_axis_get(const HklEngine *self,
387 const char *name) HKL_ARG_NONNULL(1, 2);
389 HKLAPI unsigned int hkl_engine_pseudo_axis_set(HklEngine *self,
390 const HklParameter *parameter,
391 GError **error) HKL_ARG_NONNULL(1, 2);
393 HKLAPI const darray_string *hkl_engine_modes_names_get(const HklEngine *self) HKL_ARG_NONNULL(1);
395 HKLAPI void hkl_engine_select_mode(HklEngine *self,
396 const char *name) HKL_ARG_NONNULL(1, 2);
398 HKLAPI const darray_string *hkl_engine_parameters_names_get(const HklEngine *self) HKL_ARG_NONNULL(1);
400 HKLAPI unsigned int hkl_engine_parameters_values_set(HklEngine *self,
401 double values[], size_t n_values,
402 GError **error) HKL_ARG_NONNULL(1, 2);
404 HKLAPI void hkl_engine_parameters_randomize(HklEngine *self) HKL_ARG_NONNULL(1);
406 HKLAPI const HklParameter *hkl_engine_parameter_get(const HklEngine *self,
407 const char *name) HKL_ARG_NONNULL(1, 2);
409 HKLAPI void hkl_engine_parameter_set(HklEngine *self,
410 const HklParameter *parameter) HKL_ARG_NONNULL(1, 2);
412 HKLAPI HklEngineList *hkl_engine_engines_get(HklEngine *self) HKL_ARG_NONNULL(1);
414 HKLAPI int hkl_engine_initialize(HklEngine *self, GError **error) HKL_ARG_NONNULL(1);
416 HKLAPI int hkl_engine_set(HklEngine *self, GError **error) HKL_ARG_NONNULL(1);
418 HKLAPI int hkl_engine_get(HklEngine *self, GError **error) HKL_ARG_NONNULL(1);
420 HKLAPI void hkl_engine_fprintf(FILE *f, const HklEngine *self) HKL_ARG_NONNULL(1, 2);
422 /* HklEngineList */
424 HKLAPI void hkl_engine_list_free(HklEngineList *self) HKL_ARG_NONNULL(1);
426 HKLAPI darray_engine *hkl_engine_list_engines_get(HklEngineList *self) HKL_ARG_NONNULL(1);
428 HKLAPI HklGeometry *hkl_engine_list_geometry_get(HklEngineList *self) HKL_ARG_NONNULL(1);
430 HKLAPI void hkl_engine_list_geometry_set(HklEngineList *self, const HklGeometry *geometry) HKL_ARG_NONNULL(1, 2);
432 HKLAPI const HklGeometryList *hkl_engine_list_geometries_get(const HklEngineList *self) HKL_ARG_NONNULL(1);
434 HKLAPI void hkl_engine_list_select_solution(HklEngineList *self,
435 const HklGeometryListItem *item) HKL_ARG_NONNULL(1);
437 HKLAPI HklEngine *hkl_engine_list_engine_get_by_name(HklEngineList *self,
438 const char *name) HKL_ARG_NONNULL(1, 2);
440 HKLAPI HklParameter *hkl_engine_list_pseudo_axis_get_by_name(const HklEngineList *self,
441 const char *name) HKL_ARG_NONNULL(1, 2);
443 HKLAPI void hkl_engine_list_init(HklEngineList *self,
444 HklGeometry *geometry,
445 HklDetector *detector,
446 HklSample *sample) HKL_ARG_NONNULL(1, 2, 3, 4);
448 HKLAPI int hkl_engine_list_get(HklEngineList *self) HKL_ARG_NONNULL(1);
450 HKLAPI void hkl_engine_list_fprintf(FILE *f,
451 const HklEngineList *self) HKL_ARG_NONNULL(1, 2);
453 /***********/
454 /* Factory */
455 /***********/
457 typedef struct _HklFactory HklFactory;
459 HKLAPI HklFactory **hkl_factory_get_all(unsigned int *n) HKL_ARG_NONNULL(1);
461 HKLAPI HklFactory *hkl_factory_get_by_name(const char *name) HKL_ARG_NONNULL(1);
463 HKLAPI const char *hkl_factory_name(const HklFactory *self) HKL_ARG_NONNULL(1);
465 HKLAPI const char **hkl_factory_axes_get(const HklFactory *self,
466 size_t *length) HKL_ARG_NONNULL(1, 2);
468 HKLAPI HklGeometry *hkl_factory_create_new_geometry(const HklFactory *self) HKL_ARG_NONNULL(1);
470 HKLAPI HklEngineList *hkl_factory_create_new_engine_list(const HklFactory *self) HKL_ARG_NONNULL(1);
472 G_END_DECLS
474 #endif