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>
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
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)
37 # define HKL_DEPRECATED
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"))
45 # define HKL_DEPRECATED_FOR(f) HKL_DEPRECATED
49 #define HKL_EPSILON 1e-6
50 #define HKL_DEGTORAD (M_PI/180.)
51 #define HKL_RADTODEG (180./M_PI)
54 #define HKL_TAU (2. * M_PI)
55 /* #define HKL_TAU 1 */
63 # define HKLAPI __attribute__ ((visibility("default")))
70 * @brief Used to export functions(by changing visibility).
75 #if (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3))
76 # define HKL_ARG_NONNULL(...) __attribute__ ((__nonnull__(__VA_ARGS__)))
78 # define HKL_ARG_NONNULL(...)
81 # if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)
82 # define HKL_WARN_UNUSED_RESULT __attribute__ ((__warn_unused_result__))
84 # define HKL_WARN_UNUSED_RESULT
88 #define _darray(type) type *item; size_t size; size_t alloc
96 typedef struct _HklVector HklVector
;
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
);
113 typedef struct _HklQuaternion HklQuaternion
;
114 typedef struct _HklMatrix HklMatrix
; /* forwarded declaration */
116 struct _HklQuaternion
121 typedef darray(const char *) darray_string
;
123 HKLAPI
void hkl_quaternion_to_matrix(const HklQuaternion
*self
, HklMatrix
*m
) HKL_ARG_NONNULL(1, 2);
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);
154 typedef struct _HklUnitDimension HklUnitDimension
;
156 struct _HklUnitDimension
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
176 typedef struct _HklUnit HklUnit
;
180 HklUnitDimension dimension
;
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
;
197 typedef struct _HklParameter 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);
243 typedef struct _HklDetector HklDetector
;
244 typedef enum _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);
261 typedef struct _HklGeometry HklGeometry
;
262 typedef struct _HklGeometryList HklGeometryList
;
263 typedef struct _HklGeometryListItem HklGeometryListItem
;
264 typedef struct _HklSample HklSample
; /* forwarded declaration */
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)); \
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
;
350 typedef struct _HklLattice HklLattice
;
351 typedef struct _HklSampleReflection HklSampleReflection
;
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);
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)); \
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);
512 typedef struct _HklEngine HklEngine
;
513 typedef struct _HklEngineList HklEngineList
;
515 typedef darray(HklEngine
*) darray_engine
;
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
,
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);
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);
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
,
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);
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
;