[hkl] add hkl_geometry_[sample/detector]_rotation_get
[hkl.git] / tests / hkl-pseudoaxis-k4cv-t.c
blobd658f349d9f18944a5eb65c0ea71140af4c2230d
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-2016 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 #include "hkl.h"
23 #include <tap/basic.h>
24 #include <tap/hkl-tap.h>
26 static void degenerated(void)
28 int res = TRUE;
29 HklEngineList *engines;
30 HklEngine *engine;
31 const darray_string *modes;
32 const char **mode;
33 const HklFactory *factory;
34 HklGeometry *geometry;
35 HklDetector *detector;
36 HklSample *sample;
37 static double hkl[] = {0, 1, 0};
39 factory = hkl_factory_get_by_name("K4CV", NULL);
40 geometry = hkl_factory_create_new_geometry(factory);
41 sample = hkl_sample_new("test");
43 detector = hkl_detector_factory_new(HKL_DETECTOR_TYPE_0D);
45 engines = hkl_factory_create_new_engine_list(factory);
46 hkl_engine_list_init(engines, geometry, detector, sample);
48 engine = hkl_engine_list_engine_get_by_name(engines, "hkl", NULL);
49 modes = hkl_engine_modes_names_get(engine);
51 darray_foreach(mode, *modes) {
52 const darray_string *parameters;
53 HklGeometryList *geometries;
54 size_t n_params;
56 res &= DIAG(hkl_engine_current_mode_set(engine, *mode, NULL));
57 parameters = hkl_engine_parameters_names_get(engine);
58 n_params = darray_size(*parameters);
59 if(n_params){
60 double params[n_params];
62 hkl_engine_parameters_values_get(engine, params, n_params, HKL_UNIT_DEFAULT);
63 params[0] = 1;
64 res &= DIAG(hkl_engine_parameters_values_set(engine, params, n_params, HKL_UNIT_DEFAULT, NULL));
67 /* studdy this degenerated case */
68 geometries = hkl_engine_pseudo_axis_values_set(engine,
69 hkl, ARRAY_SIZE(hkl),
70 HKL_UNIT_DEFAULT, NULL);
71 if (geometries){
72 const HklGeometryListItem *item;
74 HKL_GEOMETRY_LIST_FOREACH(item, geometries){
75 hkl_geometry_set(geometry,
76 hkl_geometry_list_item_geometry_get(item));
77 res &= DIAG(check_pseudoaxes(engine, hkl, 3));
79 hkl_geometry_list_free(geometries);
83 ok(res == TRUE, "degenerated");
85 hkl_engine_list_free(engines);
86 hkl_detector_free(detector);
87 hkl_sample_free(sample);
88 hkl_geometry_free(geometry);
91 static void eulerians(void)
93 int res = TRUE;
94 HklEngineList *engines;
95 HklEngine *engine;
96 const darray_string *modes;
97 const char **mode;
98 const HklFactory *factory;
99 HklGeometry *geometry;
100 HklDetector *detector;
101 HklSample *sample;
102 static double eulerians[] = {0., 90 * HKL_DEGTORAD, 0.};
104 factory = hkl_factory_get_by_name("K4CV", NULL);
105 geometry = hkl_factory_create_new_geometry(factory);
106 sample = hkl_sample_new("test");
108 detector = hkl_detector_factory_new(HKL_DETECTOR_TYPE_0D);
110 engines = hkl_factory_create_new_engine_list(factory);
111 hkl_engine_list_init(engines, geometry, detector, sample);
113 engine = hkl_engine_list_engine_get_by_name(engines, "eulerians", NULL);
114 modes = hkl_engine_modes_names_get(engine);
116 darray_foreach(mode, *modes){
117 const darray_string *parameters;
118 HklGeometryList *geometries;
119 size_t n_params;
121 res &= DIAG(hkl_engine_current_mode_set(engine, *mode, NULL));
122 parameters = hkl_engine_parameters_names_get(engine);
123 n_params = darray_size(*parameters);
124 if(n_params){
125 double params[n_params];
127 hkl_engine_parameters_values_get(engine, params, n_params, HKL_UNIT_DEFAULT);
128 params[0] = 1;
129 res &= DIAG(hkl_engine_parameters_values_set(engine, params, n_params, HKL_UNIT_DEFAULT, NULL));
132 /* studdy this degenerated case */
133 geometries = hkl_engine_pseudo_axis_values_set(engine,
134 eulerians, ARRAY_SIZE(eulerians),
135 HKL_UNIT_DEFAULT, NULL);
136 if (geometries) {
137 const HklGeometryListItem *item;
139 /* first solution = -180, -90, 180 */
140 item = hkl_geometry_list_items_first_get(geometries);
141 hkl_geometry_set(geometry,
142 hkl_geometry_list_item_geometry_get(item));
143 res &= DIAG(check_pseudoaxes_v(engine, -180. * HKL_DEGTORAD, -90 * HKL_DEGTORAD, 180. * HKL_DEGTORAD));
145 /* second solution = 0, 90, 0 */
146 item = hkl_geometry_list_items_next_get(geometries,item);
147 hkl_geometry_set(geometry,
148 hkl_geometry_list_item_geometry_get(item));
149 res &= DIAG(check_pseudoaxes_v(engine, 0., 90 * HKL_DEGTORAD, 0.));
151 /* no more solution */
152 res &= DIAG(hkl_geometry_list_items_next_get(geometries, item) == NULL);
154 hkl_geometry_list_free(geometries);
158 ok(res == TRUE, "eulerians");
160 hkl_engine_list_free(engines);
161 hkl_detector_free(detector);
162 hkl_sample_free(sample);
163 hkl_geometry_free(geometry);
166 static void q(void)
168 int res = TRUE;
169 HklEngineList *engines;
170 HklEngine *engine;
171 const darray_string *modes;
172 const char **mode;
173 const HklFactory *factory;
174 HklGeometry *geometry;
175 HklDetector *detector;
176 HklSample *sample;
178 factory = hkl_factory_get_by_name("K4CV", NULL);
179 geometry = hkl_factory_create_new_geometry(factory);
180 sample = hkl_sample_new("test");
182 detector = hkl_detector_factory_new(HKL_DETECTOR_TYPE_0D);
184 engines = hkl_factory_create_new_engine_list(factory);
185 hkl_engine_list_init(engines, geometry, detector, sample);
187 engine = hkl_engine_list_engine_get_by_name(engines, "q", NULL);
188 modes = hkl_engine_modes_names_get(engine);
190 /* the init part */
191 res &= DIAG(hkl_geometry_set_values_v(geometry, HKL_UNIT_USER, NULL, 30., 0., 0., 60.));
192 res &= DIAG(hkl_engine_initialized_set(engine, TRUE, NULL));
194 darray_foreach(mode, *modes){
195 double q;
197 res &= DIAG(hkl_engine_current_mode_set(engine, *mode, NULL));
198 for(q=-1.; q<1.; q += 0.1){
199 HklGeometryList *geometries;
201 geometries = hkl_engine_set_values_v(engine, q, NULL);
202 if(geometries){
203 const HklGeometryListItem *item;
205 HKL_GEOMETRY_LIST_FOREACH(item, geometries){
206 hkl_engine_set_values_v(engine, 0.);
207 hkl_geometry_set(geometry,
208 hkl_geometry_list_item_geometry_get(item));
209 res &= DIAG(check_pseudoaxes_v(engine, q));
211 hkl_geometry_list_free(geometries);
216 ok(res == TRUE, "q");
218 hkl_engine_list_free(engines);
219 hkl_detector_free(detector);
220 hkl_sample_free(sample);
221 hkl_geometry_free(geometry);
224 int main(void)
226 plan(3);
228 degenerated();
229 eulerians();
230 q();
232 return 0;