wip
[hkl.git] / hkl.h
blob2ef88ef9136e78283c3fb04fdbb1e0ba6a4bd7a0
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-2019, 2023 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_TINY 1e-7
49 #define HKL_EPSILON 1e-6
50 #define HKL_DEGTORAD (M_PI/180.)
51 #define HKL_RADTODEG (180./M_PI)
53 /* tau = 2pi or 1 */
54 #define HKL_TAU (2. * M_PI)
55 /* #define HKL_TAU 1 */
57 #ifdef HKLAPI
58 # undef HKLAPI
59 #endif
61 #ifdef __GNUC__
62 # if __GNUC__ >= 4
63 # define HKLAPI __attribute__ ((visibility("default")))
64 # else
65 # define HKLAPI
66 # endif
67 #else
68 /**
69 * @def HKLAPI
70 * @brief Used to export functions(by changing visibility).
72 # define HKLAPI
73 #endif
75 #if (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3))
76 # define HKL_ARG_NONNULL(...) __attribute__ ((__nonnull__(__VA_ARGS__)))
77 #else
78 # define HKL_ARG_NONNULL(...)
79 #endif
81 # if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)
82 # define HKL_WARN_UNUSED_RESULT __attribute__ ((__warn_unused_result__))
83 # else
84 # define HKL_WARN_UNUSED_RESULT
85 # endif
88 #define _darray(type) type *item; size_t size; size_t alloc
90 G_BEGIN_DECLS
92 /**********/
93 /* Vector */
94 /**********/
96 typedef struct _HklVector HklVector;
98 struct _HklVector
100 double data[3];
103 #define HKL_VECTOR_X {{1, 0, 0}}
104 #define HKL_VECTOR_Y {{0, 1, 0}}
105 #define HKL_VECTOR_Z {{0, 0, 1}}
107 HKLAPI void hkl_vector_init(HklVector *self, double x, double y, double z);
109 /**************/
110 /* Quaternion */
111 /**************/
113 typedef struct _HklQuaternion HklQuaternion;
114 typedef struct _HklMatrix HklMatrix; /* forwarded declaration */
116 struct _HklQuaternion
118 double data[4];
121 typedef darray(const char *) darray_string;
123 HKLAPI void hkl_quaternion_to_matrix(const HklQuaternion *self, HklMatrix *m) HKL_ARG_NONNULL(1, 2);
125 /**********/
126 /* Matrix */
127 /**********/
129 HKLAPI HklMatrix *hkl_matrix_new(void) HKL_WARN_UNUSED_RESULT;
131 HKLAPI HklMatrix *hkl_matrix_new_full(double m11, double m12, double m13,
132 double m21, double m22, double m23,
133 double m31, double m32, double m33) HKL_WARN_UNUSED_RESULT;
135 HKLAPI HklMatrix *hkl_matrix_new_euler(double euler_x, double euler_y, double euler_z) HKL_WARN_UNUSED_RESULT;
137 HKLAPI double hkl_matrix_get(const HklMatrix *self, unsigned int i, unsigned int j) HKL_ARG_NONNULL(1);
139 HKLAPI void hkl_matrix_free(HklMatrix *self) HKL_ARG_NONNULL(1);
141 HKLAPI void hkl_matrix_init(HklMatrix *self,
142 double m11, double m12, double m13,
143 double m21, double m22, double m23,
144 double m31, double m32, double m33) HKL_ARG_NONNULL(1);
146 HKLAPI int hkl_matrix_cmp(const HklMatrix *self, const HklMatrix *m) HKL_ARG_NONNULL(1, 2);
148 HKLAPI void hkl_matrix_times_matrix(HklMatrix *self, const HklMatrix *m) HKL_ARG_NONNULL(1, 2);
150 /********/
151 /* Unit */
152 /********/
154 typedef struct _HklUnitDimension HklUnitDimension;
156 struct _HklUnitDimension
158 int l; /* Length */
159 int m; /* Mass */
160 int t; /* Time */
161 int i; /* Electric current */
162 int th; /* Thermodynamic temperature */
163 int n; /* Amount of substance */
164 int j; /* Luminous intensity */
167 #define HklDPlaneAngle {0, 0, 0, 0, 0, 0, 0}
168 #define HklDLength {1, 0, 0, 0, 0, 0, 0}
170 typedef enum _HklUnitEnum
172 HKL_UNIT_DEFAULT,
173 HKL_UNIT_USER
174 } HklUnitEnum;
176 typedef struct _HklUnit HklUnit;
178 struct _HklUnit
180 HklUnitDimension dimension;
181 double factor;
182 char const *name;
183 char const *repr;
186 extern const HklUnit hkl_unit_angle_deg;
187 extern const HklUnit hkl_unit_angle_rad;
188 extern const HklUnit hkl_unit_length_nm;
189 extern const HklUnit hkl_unit_angle_mrad;
190 extern const HklUnit hkl_unit_length_mm;
191 extern const HklUnit hkl_unit_length_meter;
193 /*************/
194 /* Parameter */
195 /*************/
197 typedef struct _HklParameter HklParameter;
199 /* HklParameter */
201 HKLAPI HklParameter *hkl_parameter_new_copy(const HklParameter *self) HKL_ARG_NONNULL(1) HKL_WARN_UNUSED_RESULT;
203 HKLAPI void hkl_parameter_free(HklParameter *self) HKL_ARG_NONNULL(1);
205 HKLAPI const char *hkl_parameter_name_get(const HklParameter *self) HKL_ARG_NONNULL(1) HKL_WARN_UNUSED_RESULT;
207 HKLAPI const char *hkl_parameter_default_unit_get(const HklParameter *self) HKL_ARG_NONNULL(1) HKL_WARN_UNUSED_RESULT;
209 HKLAPI const char *hkl_parameter_user_unit_get(const HklParameter *self) HKL_ARG_NONNULL(1) HKL_WARN_UNUSED_RESULT;
211 HKLAPI double hkl_parameter_value_get(const HklParameter *self,
212 HklUnitEnum unit_type) HKL_ARG_NONNULL(1);
214 HKLAPI int hkl_parameter_value_set(HklParameter *self, double value,
215 HklUnitEnum unit_type, GError **error) HKL_ARG_NONNULL(1) HKL_WARN_UNUSED_RESULT;
217 HKLAPI void hkl_parameter_min_max_get(const HklParameter *self, double *min, double *max,
218 HklUnitEnum unit_type) HKL_ARG_NONNULL(1, 2, 3);
220 HKLAPI int hkl_parameter_min_max_set(HklParameter *self, double min, double max,
221 HklUnitEnum unit_type, GError **error) HKL_ARG_NONNULL(1) HKL_WARN_UNUSED_RESULT;
223 HKLAPI int hkl_parameter_fit_get(const HklParameter *self) HKL_ARG_NONNULL(1);
225 HKLAPI void hkl_parameter_fit_set(HklParameter *self, int fit) HKL_ARG_NONNULL(1);
227 HKLAPI void hkl_parameter_randomize(HklParameter *self) HKL_ARG_NONNULL(1);
229 /* getter and setter specific to certain type of HklParameter */
231 HKLAPI const HklVector *hkl_parameter_axis_v_get(const HklParameter *self) HKL_ARG_NONNULL(1)HKL_WARN_UNUSED_RESULT;
233 HKLAPI const HklQuaternion *hkl_parameter_quaternion_get(const HklParameter *self) HKL_ARG_NONNULL(1) HKL_WARN_UNUSED_RESULT;
235 HKLAPI const char *hkl_parameter_description_get(const HklParameter *self) HKL_ARG_NONNULL(1) HKL_WARN_UNUSED_RESULT;
237 HKLAPI void hkl_parameter_fprintf(FILE *f, const HklParameter *self) HKL_ARG_NONNULL(1, 2);
239 /************/
240 /* Detector */
241 /************/
243 typedef struct _HklDetector HklDetector;
244 typedef enum _HklDetectorType
246 HKL_DETECTOR_TYPE_0D
247 } HklDetectorType;
249 HKLAPI HklDetector *hkl_detector_factory_new(HklDetectorType type) HKL_WARN_UNUSED_RESULT;
251 HKLAPI HklDetector *hkl_detector_new_copy(const HklDetector *src) HKL_ARG_NONNULL(1) HKL_WARN_UNUSED_RESULT;
253 HKLAPI void hkl_detector_free(HklDetector *self) HKL_ARG_NONNULL(1);
255 HKLAPI void hkl_detector_fprintf(FILE *f, const HklDetector *self) HKL_ARG_NONNULL(1, 2);
257 /************/
258 /* Geometry */
259 /************/
261 typedef struct _HklGeometry HklGeometry;
262 typedef struct _HklGeometryList HklGeometryList;
263 typedef struct _HklGeometryListItem HklGeometryListItem;
264 typedef struct _HklSample HklSample; /* forwarded declaration */
266 /* HklGeometry */
268 HKLAPI HklGeometry *hkl_geometry_new_copy(const HklGeometry *self) HKL_ARG_NONNULL(1) HKL_WARN_UNUSED_RESULT;
270 HKLAPI void hkl_geometry_free(HklGeometry *self) HKL_ARG_NONNULL(1);
272 HKLAPI int hkl_geometry_set(HklGeometry *self, const HklGeometry *src) HKL_ARG_NONNULL(1, 2);
274 HKLAPI const darray_string *hkl_geometry_axis_names_get(const HklGeometry *self) HKL_ARG_NONNULL(1) HKL_WARN_UNUSED_RESULT;
276 HKLAPI const HklParameter *hkl_geometry_axis_get(const HklGeometry *self, const char *name,
277 GError **error) HKL_ARG_NONNULL(1, 2) HKL_WARN_UNUSED_RESULT;
279 HKLAPI int hkl_geometry_axis_set(HklGeometry *self, const char *name,
280 const HklParameter *axis,
281 GError **error) HKL_ARG_NONNULL(1, 2, 3) HKL_WARN_UNUSED_RESULT;
283 HKLAPI void hkl_geometry_axis_values_get(const HklGeometry *self,
284 double values[], size_t n_values,
285 HklUnitEnum unit_type) HKL_ARG_NONNULL(1, 2);
287 HKLAPI int hkl_geometry_axis_values_set(HklGeometry *self,
288 double values[], size_t n_values,
289 HklUnitEnum unit_type,
290 GError **error) HKL_ARG_NONNULL(1, 2) HKL_WARN_UNUSED_RESULT;
292 HKLAPI const char *hkl_geometry_name_get(const HklGeometry *self) HKL_ARG_NONNULL(1) HKL_WARN_UNUSED_RESULT;
294 HKLAPI double hkl_geometry_wavelength_get(const HklGeometry *self,
295 HklUnitEnum unit_type) HKL_ARG_NONNULL(1);
297 HKLAPI int hkl_geometry_wavelength_set(HklGeometry *self, double wavelength,
298 HklUnitEnum unit_type, GError **error) HKL_ARG_NONNULL(1) HKL_WARN_UNUSED_RESULT;
300 HKLAPI void hkl_geometry_randomize(HklGeometry *self) HKL_ARG_NONNULL(1);
302 /* TODO after bissecting it seems that this method is slow (to replace) */
303 HKLAPI int hkl_geometry_set_values_v(HklGeometry *self, HklUnitEnum unit_type,
304 GError **error, ...) HKL_ARG_NONNULL(1) HKL_WARN_UNUSED_RESULT;
306 HKLAPI HklQuaternion hkl_geometry_sample_rotation_get(const HklGeometry *self,
307 const HklSample *sample) HKL_ARG_NONNULL(1, 2);
309 HKLAPI HklQuaternion hkl_geometry_detector_rotation_get(const HklGeometry *self,
310 const HklDetector *detector) HKL_ARG_NONNULL(1, 2);
312 HKLAPI HklVector hkl_geometry_ki_get(const HklGeometry *self) HKL_ARG_NONNULL(1);
314 HKLAPI HklVector hkl_geometry_ki_abc_get(const HklGeometry *self,
315 const HklSample *sample) HKL_ARG_NONNULL(1, 2);
318 HKLAPI HklVector hkl_geometry_kf_get(const HklGeometry *self,
319 const HklDetector *detector) HKL_ARG_NONNULL(1, 2);
321 HKLAPI HklVector hkl_geometry_kf_abc_get(const HklGeometry *self,
322 const HklDetector *detector,
323 const HklSample *sample) HKL_ARG_NONNULL(1, 2, 3);
325 HKLAPI void hkl_geometry_fprintf(FILE *file, const HklGeometry *self) HKL_ARG_NONNULL(1, 2);
327 /* HklGeometryList */
329 #define HKL_GEOMETRY_LIST_FOREACH(item, list) for((item)=hkl_geometry_list_items_first_get((list)); \
330 (item); \
331 (item)=hkl_geometry_list_items_next_get((list), (item)))
333 HKLAPI void hkl_geometry_list_free(HklGeometryList *self) HKL_ARG_NONNULL(1);
335 HKLAPI size_t hkl_geometry_list_n_items_get(const HklGeometryList *self) HKL_ARG_NONNULL(1);
337 HKLAPI const HklGeometryListItem *hkl_geometry_list_items_first_get(const HklGeometryList *self) HKL_ARG_NONNULL(1) HKL_WARN_UNUSED_RESULT;
339 HKLAPI const HklGeometryListItem *hkl_geometry_list_items_next_get(const HklGeometryList *self,
340 const HklGeometryListItem *item) HKL_ARG_NONNULL(1, 2) HKL_WARN_UNUSED_RESULT;
342 /* HklGeometryListItem */
344 HKLAPI const HklGeometry *hkl_geometry_list_item_geometry_get(const HklGeometryListItem *self) HKL_ARG_NONNULL(1) HKL_WARN_UNUSED_RESULT;
346 /**********/
347 /* Sample */
348 /**********/
350 typedef struct _HklLattice HklLattice;
351 typedef struct _HklSampleReflection HklSampleReflection;
353 /* Lattice */
355 HKLAPI HklLattice *hkl_lattice_new(double a, double b, double c,
356 double alpha, double beta, double gamma,
357 GError **error) HKL_WARN_UNUSED_RESULT;
359 HKLAPI HklLattice *hkl_lattice_new_copy(const HklLattice *self) HKL_ARG_NONNULL(1) HKL_WARN_UNUSED_RESULT;
361 HKLAPI HklLattice *hkl_lattice_new_default(void) HKL_WARN_UNUSED_RESULT;
363 HKLAPI void hkl_lattice_free(HklLattice *self) HKL_ARG_NONNULL(1);
365 HKLAPI const HklParameter *hkl_lattice_a_get(const HklLattice *self) HKL_ARG_NONNULL(1) HKL_WARN_UNUSED_RESULT;
367 HKLAPI int hkl_lattice_a_set(HklLattice *self, const HklParameter *parameter,
368 GError **error) HKL_ARG_NONNULL(1, 2) HKL_WARN_UNUSED_RESULT;
370 HKLAPI const HklParameter *hkl_lattice_b_get(const HklLattice *self) HKL_ARG_NONNULL(1) HKL_WARN_UNUSED_RESULT;
372 HKLAPI int hkl_lattice_b_set(HklLattice *self, const HklParameter *parameter,
373 GError **error) HKL_ARG_NONNULL(1, 2) HKL_WARN_UNUSED_RESULT;
375 HKLAPI const HklParameter *hkl_lattice_c_get(const HklLattice *self) HKL_ARG_NONNULL(1) HKL_WARN_UNUSED_RESULT;
377 HKLAPI int hkl_lattice_c_set(HklLattice *self, const HklParameter *parameter,
378 GError **error) HKL_ARG_NONNULL(1, 2) HKL_WARN_UNUSED_RESULT;
380 HKLAPI const HklParameter *hkl_lattice_alpha_get(const HklLattice *self) HKL_ARG_NONNULL(1) HKL_WARN_UNUSED_RESULT;
382 HKLAPI int hkl_lattice_alpha_set(HklLattice *self, const HklParameter *parameter,
383 GError **error) HKL_ARG_NONNULL(1, 2) HKL_WARN_UNUSED_RESULT;
385 HKLAPI const HklParameter *hkl_lattice_beta_get(const HklLattice *self) HKL_ARG_NONNULL(1) HKL_WARN_UNUSED_RESULT;
387 HKLAPI int hkl_lattice_beta_set(HklLattice *self, const HklParameter *parameter,
388 GError **error) HKL_ARG_NONNULL(1, 2) HKL_WARN_UNUSED_RESULT;
390 HKLAPI const HklParameter *hkl_lattice_gamma_get(const HklLattice *self) HKL_ARG_NONNULL(1) HKL_WARN_UNUSED_RESULT;
392 HKLAPI int hkl_lattice_gamma_set(HklLattice *self, const HklParameter *parameter,
393 GError **error) HKL_ARG_NONNULL(1, 2) HKL_WARN_UNUSED_RESULT;
395 HKLAPI const HklParameter *hkl_lattice_volume_get(const HklLattice *self) HKL_ARG_NONNULL(1) HKL_WARN_UNUSED_RESULT;
397 HKLAPI int hkl_lattice_set(HklLattice *self,
398 double a, double b, double c,
399 double alpha, double beta, double gamma,
400 HklUnitEnum unit_type, GError **error) HKL_ARG_NONNULL(1) HKL_WARN_UNUSED_RESULT;
402 HKLAPI void hkl_lattice_get(const HklLattice *self,
403 double *a, double *b, double *c,
404 double *alpha, double *beta, double *gamma,
405 HklUnitEnum unit_type) HKL_ARG_NONNULL(1, 2, 3, 4, 5, 6, 7);
407 HKLAPI int hkl_lattice_get_B(const HklLattice *self, HklMatrix *B) HKL_ARG_NONNULL(1, 2);
409 HKLAPI int hkl_lattice_get_1_B(const HklLattice *self, HklMatrix *B) HKL_ARG_NONNULL(1, 2);
411 HKLAPI int hkl_lattice_reciprocal(const HklLattice *self, HklLattice *reciprocal) HKL_ARG_NONNULL(1, 2);
413 /* HklSample */
415 HKLAPI HklSample *hkl_sample_new(const char *name) HKL_ARG_NONNULL(1) HKL_WARN_UNUSED_RESULT;
417 HKLAPI HklSample *hkl_sample_new_copy(const HklSample *self) HKL_ARG_NONNULL(1) HKL_WARN_UNUSED_RESULT;
419 HKLAPI void hkl_sample_free(HklSample *self) HKL_ARG_NONNULL(1);
421 HKLAPI const char *hkl_sample_name_get(const HklSample *self) HKL_ARG_NONNULL(1) HKL_WARN_UNUSED_RESULT;
423 HKLAPI void hkl_sample_name_set(HklSample *self, const char *name) HKL_ARG_NONNULL(1, 2);
425 HKLAPI const HklLattice *hkl_sample_lattice_get(HklSample *self) HKL_ARG_NONNULL(1) HKL_WARN_UNUSED_RESULT;
427 HKLAPI void hkl_sample_lattice_set(HklSample *self, const HklLattice *lattice) HKL_ARG_NONNULL(1, 2);
429 HKLAPI const HklParameter *hkl_sample_ux_get(const HklSample *self) HKL_ARG_NONNULL(1) HKL_WARN_UNUSED_RESULT;
431 HKLAPI int hkl_sample_ux_set(HklSample *self, const HklParameter *ux,
432 GError **error) HKL_ARG_NONNULL(1, 2) HKL_WARN_UNUSED_RESULT;
434 HKLAPI const HklParameter *hkl_sample_uy_get(const HklSample *self) HKL_ARG_NONNULL(1) HKL_WARN_UNUSED_RESULT;
436 HKLAPI int hkl_sample_uy_set(HklSample *self, const HklParameter *uy,
437 GError **error) HKL_ARG_NONNULL(1, 2) HKL_WARN_UNUSED_RESULT;
439 HKLAPI const HklParameter *hkl_sample_uz_get(const HklSample *self) HKL_ARG_NONNULL(1) HKL_WARN_UNUSED_RESULT;
441 HKLAPI int hkl_sample_uz_set(HklSample *self, const HklParameter *uz,
442 GError **error) HKL_ARG_NONNULL(1, 2) HKL_WARN_UNUSED_RESULT;
444 HKLAPI const HklMatrix *hkl_sample_U_get(const HklSample *self) HKL_ARG_NONNULL(1) HKL_WARN_UNUSED_RESULT;
446 HKLAPI void hkl_sample_U_set(HklSample *self, const HklMatrix *U, GError **error) HKL_ARG_NONNULL(1);
448 HKLAPI const HklMatrix *hkl_sample_UB_get(const HklSample *self) HKL_ARG_NONNULL(1) HKL_WARN_UNUSED_RESULT;
450 HKLAPI int hkl_sample_UB_set(HklSample *self, const HklMatrix *UB,
451 GError **error) HKL_ARG_NONNULL(1, 2) HKL_WARN_UNUSED_RESULT;
453 HKLAPI size_t hkl_sample_n_reflections_get(const HklSample *self) HKL_ARG_NONNULL(1);
455 #define HKL_SAMPLE_REFLECTIONS_FOREACH(_item, _list) for((_item)=hkl_sample_reflections_first_get((_list)); \
456 (_item); \
457 (_item)=hkl_sample_reflections_next_get((_list), (_item)))
459 HKLAPI HklSampleReflection *hkl_sample_reflections_first_get(HklSample *self) HKL_ARG_NONNULL(1) HKL_WARN_UNUSED_RESULT;
461 HKLAPI HklSampleReflection *hkl_sample_reflections_next_get(HklSample *self,
462 HklSampleReflection *reflection) HKL_ARG_NONNULL(1, 2) HKL_WARN_UNUSED_RESULT;
464 HKLAPI void hkl_sample_del_reflection(HklSample *self,
465 HklSampleReflection *reflection) HKL_ARG_NONNULL(1, 2);
467 HKLAPI void hkl_sample_add_reflection(HklSample *self,
468 HklSampleReflection *reflection) HKL_ARG_NONNULL(1, 2);
470 HKLAPI int hkl_sample_compute_UB_busing_levy(HklSample *self,
471 const HklSampleReflection *r1,
472 const HklSampleReflection *r2,
473 GError **error) HKL_ARG_NONNULL(1, 2, 3) HKL_WARN_UNUSED_RESULT;
475 HKLAPI double hkl_sample_get_reflection_measured_angle(const HklSample *self,
476 const HklSampleReflection *r1,
477 const HklSampleReflection *r2) HKL_ARG_NONNULL(1, 2, 3);
479 HKLAPI double hkl_sample_get_reflection_theoretical_angle(const HklSample *self,
480 const HklSampleReflection *r1,
481 const HklSampleReflection *r2) HKL_ARG_NONNULL(1, 2, 3);
483 HKLAPI int hkl_sample_affine(HklSample *self, GError **error) HKL_ARG_NONNULL(1) HKL_WARN_UNUSED_RESULT;
485 /* HklSampleReflection */
487 HKLAPI HklSampleReflection *hkl_sample_reflection_new(const HklGeometry *geometry,
488 const HklDetector *detector,
489 double h, double k, double l,
490 GError **error) HKL_ARG_NONNULL(1, 2) HKL_WARN_UNUSED_RESULT;
492 HKLAPI void hkl_sample_reflection_hkl_get(const HklSampleReflection *self,
493 double *h, double *k, double *l) HKL_ARG_NONNULL(1, 2, 3, 4);
495 HKLAPI int hkl_sample_reflection_hkl_set(HklSampleReflection *self,
496 double h, double k, double l,
497 GError **error) HKL_ARG_NONNULL(1) HKL_WARN_UNUSED_RESULT;
499 HKLAPI int hkl_sample_reflection_flag_get(const HklSampleReflection *self) HKL_ARG_NONNULL(1);
501 HKLAPI void hkl_sample_reflection_flag_set(HklSampleReflection *self, int flag) HKL_ARG_NONNULL(1);
503 HKLAPI const HklGeometry *hkl_sample_reflection_geometry_get(HklSampleReflection *self) HKL_ARG_NONNULL(1) HKL_WARN_UNUSED_RESULT;
505 HKLAPI void hkl_sample_reflection_geometry_set(HklSampleReflection *self,
506 const HklGeometry *geometry) HKL_ARG_NONNULL(1, 2);
508 /**************/
509 /* PseudoAxis */
510 /**************/
512 typedef struct _HklEngine HklEngine;
513 typedef struct _HklEngineList HklEngineList;
515 typedef darray(HklEngine *) darray_engine;
517 /* HklEngine */
519 HKLAPI const char *hkl_engine_name_get(const HklEngine *self) HKL_ARG_NONNULL(1) HKL_WARN_UNUSED_RESULT;
521 HKLAPI unsigned int hkl_engine_len(const HklEngine *self) HKL_ARG_NONNULL(1);
523 HKLAPI const darray_string *hkl_engine_pseudo_axis_names_get(HklEngine *self) HKL_ARG_NONNULL(1) HKL_WARN_UNUSED_RESULT;
525 HKLAPI int hkl_engine_pseudo_axis_values_get(HklEngine *self,
526 double values[], size_t n_values,
527 HklUnitEnum unit_type, GError **error) HKL_ARG_NONNULL(1, 2) HKL_WARN_UNUSED_RESULT;
529 HKLAPI HklGeometryList *hkl_engine_pseudo_axis_values_set(HklEngine *self,
530 double values[], size_t n_values,
531 HklUnitEnum unit_type, GError **error) HKL_ARG_NONNULL(1, 2) HKL_WARN_UNUSED_RESULT;
533 HKLAPI const HklParameter *hkl_engine_pseudo_axis_get(const HklEngine *self,
534 const char *name,
535 GError **error) HKL_ARG_NONNULL(1, 2) HKL_WARN_UNUSED_RESULT;
537 typedef enum _HklEngineCapabilities
539 HKL_ENGINE_CAPABILITIES_READABLE = 1u << 0,
540 HKL_ENGINE_CAPABILITIES_WRITABLE = 1u << 1,
541 HKL_ENGINE_CAPABILITIES_INITIALIZABLE = 1u << 2,
542 } HklEngineCapabilities;
544 HKLAPI unsigned int hkl_engine_capabilities_get(const HklEngine *self) HKL_ARG_NONNULL(1);
546 HKLAPI int hkl_engine_initialized_get(const HklEngine *self) HKL_ARG_NONNULL(1);
548 HKLAPI int hkl_engine_initialized_set(HklEngine *self, int initialized,
549 GError **error) HKL_ARG_NONNULL(1) HKL_WARN_UNUSED_RESULT;
551 HKLAPI void hkl_engine_fprintf(FILE *f, const HklEngine *self) HKL_ARG_NONNULL(1, 2);
553 /* mode */
555 HKLAPI const darray_string *hkl_engine_modes_names_get(const HklEngine *self) HKL_ARG_NONNULL(1) HKL_WARN_UNUSED_RESULT;
557 HKLAPI const char *hkl_engine_current_mode_get(const HklEngine *self) HKL_ARG_NONNULL(1) HKL_WARN_UNUSED_RESULT;
559 HKLAPI int hkl_engine_current_mode_set(HklEngine *self, const char *name, GError **error) HKL_ARG_NONNULL(1, 2) HKL_WARN_UNUSED_RESULT;
561 typedef enum _HklEngineAxisNamesGet
563 HKL_ENGINE_AXIS_NAMES_GET_READ,
564 HKL_ENGINE_AXIS_NAMES_GET_WRITE,
565 } HklEngineAxisNamesGet;
567 HKLAPI const darray_string *hkl_engine_axis_names_get(const HklEngine *self,
568 HklEngineAxisNamesGet mode) HKL_ARG_NONNULL(1) HKL_WARN_UNUSED_RESULT;
570 HKLAPI const darray_string *hkl_engine_parameters_names_get(const HklEngine *self) HKL_ARG_NONNULL(1) HKL_WARN_UNUSED_RESULT;
572 HKLAPI const HklParameter *hkl_engine_parameter_get(const HklEngine *self, const char *name,
573 GError **error) HKL_ARG_NONNULL(1, 2) HKL_WARN_UNUSED_RESULT;
575 HKLAPI int hkl_engine_parameter_set(HklEngine *self,
576 const char *name, const HklParameter *parameter,
577 GError **error) HKL_ARG_NONNULL(1, 2, 3) HKL_WARN_UNUSED_RESULT;
579 HKLAPI void hkl_engine_parameters_values_get(const HklEngine *self,
580 double values[], size_t n_values,
581 HklUnitEnum unit_type) HKL_ARG_NONNULL(1, 2);
583 HKLAPI int hkl_engine_parameters_values_set(HklEngine *self,
584 double values[], size_t n_values,
585 HklUnitEnum unit_type, GError **error) HKL_ARG_NONNULL(1, 2) HKL_WARN_UNUSED_RESULT;
587 typedef enum _HklEngineDependencies
589 HKL_ENGINE_DEPENDENCIES_AXES = 1u << 0,
590 HKL_ENGINE_DEPENDENCIES_ENERGY = 1u << 1,
591 HKL_ENGINE_DEPENDENCIES_SAMPLE = 1u << 2,
592 } HklEngineDependencies;
594 HKLAPI unsigned int hkl_engine_dependencies_get(const HklEngine *self) HKL_ARG_NONNULL(1);
597 /* HklEngineList */
599 HKLAPI void hkl_engine_list_free(HklEngineList *self) HKL_ARG_NONNULL(1);
601 HKLAPI darray_engine *hkl_engine_list_engines_get(HklEngineList *self) HKL_ARG_NONNULL(1) HKL_WARN_UNUSED_RESULT;
603 HKLAPI HklGeometry *hkl_engine_list_geometry_get(HklEngineList *self) HKL_ARG_NONNULL(1) HKL_WARN_UNUSED_RESULT;
605 HKLAPI int hkl_engine_list_geometry_set(HklEngineList *self, const HklGeometry *geometry) HKL_ARG_NONNULL(1, 2);
607 HKLAPI int hkl_engine_list_select_solution(HklEngineList *self,
608 const HklGeometryListItem *item) HKL_ARG_NONNULL(1);
610 HKLAPI HklEngine *hkl_engine_list_engine_get_by_name(HklEngineList *self,
611 const char *name,
612 GError **error) HKL_ARG_NONNULL(1, 2) HKL_WARN_UNUSED_RESULT;
614 HKLAPI void hkl_engine_list_init(HklEngineList *self,
615 HklGeometry *geometry,
616 HklDetector *detector,
617 HklSample *sample) HKL_ARG_NONNULL(1, 2, 3, 4);
619 HKLAPI int hkl_engine_list_get(HklEngineList *self) HKL_ARG_NONNULL(1);
621 HKLAPI const darray_string *hkl_engine_list_parameters_names_get(const HklEngineList *self) HKL_ARG_NONNULL(1) HKL_WARN_UNUSED_RESULT;
623 HKLAPI const HklParameter *hkl_engine_list_parameter_get(const HklEngineList *self, const char *name,
624 GError **error) HKL_ARG_NONNULL(1, 2) HKL_WARN_UNUSED_RESULT;
626 HKLAPI int hkl_engine_list_parameter_set(HklEngineList *self,
627 const char *name, const HklParameter *parameter,
628 GError **error) HKL_ARG_NONNULL(1, 2, 3) HKL_WARN_UNUSED_RESULT;
630 HKLAPI void hkl_engine_list_parameters_values_get(const HklEngineList *self,
631 double values[], size_t n_values,
632 HklUnitEnum unit_type) HKL_ARG_NONNULL(1, 2);
634 HKLAPI int hkl_engine_list_parameters_values_set(HklEngineList *self,
635 double values[], size_t n_values,
636 HklUnitEnum unit_type, GError **error) HKL_ARG_NONNULL(1, 2) HKL_WARN_UNUSED_RESULT;
638 HKLAPI void hkl_engine_list_fprintf(FILE *f,
639 const HklEngineList *self) HKL_ARG_NONNULL(1, 2);
641 /***********/
642 /* Factory */
643 /***********/
645 typedef struct _HklFactory HklFactory;
647 HKLAPI HklFactory **hkl_factory_get_all(size_t *n) HKL_ARG_NONNULL(1) HKL_WARN_UNUSED_RESULT;
649 HKLAPI HklFactory *hkl_factory_get_by_name(const char *name,
650 GError **error) HKL_ARG_NONNULL(1) HKL_WARN_UNUSED_RESULT;
652 HKLAPI const char *hkl_factory_name_get(const HklFactory *self) HKL_ARG_NONNULL(1) HKL_WARN_UNUSED_RESULT;
654 HKLAPI HklGeometry *hkl_factory_create_new_geometry(const HklFactory *self) HKL_ARG_NONNULL(1) HKL_WARN_UNUSED_RESULT;
656 HKLAPI HklEngineList *hkl_factory_create_new_engine_list(const HklFactory *self) HKL_ARG_NONNULL(1) HKL_WARN_UNUSED_RESULT;
658 G_END_DECLS
660 #endif