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-2017 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>
23 #include <tap/basic.h>
24 #include <tap/hkl-tap.h>
26 static void getter(void)
29 HklEngineList
*engines
;
31 HklGeometry
*geometry
;
32 HklDetector
*detector
;
34 struct Geometry gconf
= E4cv(1.54, 30., 0., 0., 60.);
36 geometry
= newGeometry(gconf
);
37 engines
= newEngines(gconf
);
38 sample
= newSample(cu
);
40 detector
= hkl_detector_factory_new(HKL_DETECTOR_TYPE_0D
);
42 hkl_engine_list_init(engines
, geometry
, detector
, sample
);
44 engine
= hkl_engine_list_engine_get_by_name(engines
, "hkl", NULL
);
46 /* geometry -> pseudo */
47 res
&= DIAG(hkl_geometry_set_values_v(geometry
, HKL_UNIT_USER
, NULL
, 30., 0., 0., 60.));
48 res
&= DIAG(check_pseudoaxes_v(engine
, 0., 0., 1.));
50 res
&= DIAG(hkl_geometry_set_values_v(geometry
, HKL_UNIT_USER
, NULL
, 30., 0., 90., 60.));
51 res
&= DIAG(check_pseudoaxes_v(engine
, 1., 0., 0.));
53 res
&= DIAG(hkl_geometry_set_values_v(geometry
, HKL_UNIT_USER
, NULL
, 30., 0., -90., 60.));
54 res
&= DIAG(check_pseudoaxes_v(engine
, -1., 0., 0.));
56 res
&= DIAG(hkl_geometry_set_values_v(geometry
, HKL_UNIT_USER
, NULL
, 30., 0., 180., 60.));
57 res
&= DIAG(check_pseudoaxes_v(engine
, 0., 0., -1.));
59 res
&= DIAG(hkl_geometry_set_values_v(geometry
, HKL_UNIT_USER
, NULL
, 45., 0., 135., 90.));
60 res
&= DIAG(check_pseudoaxes_v(engine
, 1., 0., -1.));
62 ok(res
== TRUE
, "getter");
64 hkl_engine_list_free(engines
);
65 hkl_detector_free(detector
);
66 hkl_sample_free(sample
);
67 hkl_geometry_free(geometry
);
70 static void degenerated(void)
73 HklEngineList
*engines
;
76 const darray_string
*modes
;
77 HklGeometry
*geometry
;
78 HklDetector
*detector
;
80 struct Geometry gconf
= E4cv(1.54, 30., 0., 0., 60.);
82 geometry
= newGeometry(gconf
);
83 engines
= newEngines(gconf
);
84 sample
= newSample(cu
);
86 detector
= hkl_detector_factory_new(HKL_DETECTOR_TYPE_0D
);
88 hkl_engine_list_init(engines
, geometry
, detector
, sample
);
90 engine
= hkl_engine_list_engine_get_by_name(engines
, "hkl", NULL
);
91 modes
= hkl_engine_modes_names_get(engine
);
93 darray_foreach(mode
, *modes
){
94 static double values
[] = {0, 0, 1};
95 HklGeometryList
*geometries
;
98 res
&= DIAG(hkl_engine_current_mode_set(engine
, *mode
, NULL
));
99 const darray_string
*parameters
= hkl_engine_parameters_names_get(engine
);
100 n_params
= darray_size(*parameters
);
102 double params
[n_params
];
104 hkl_engine_parameters_values_get(engine
, params
, n_params
, HKL_UNIT_DEFAULT
);
106 res
&= DIAG(hkl_engine_parameters_values_set(engine
, params
, n_params
, HKL_UNIT_DEFAULT
, NULL
));
109 /* studdy this degenerated case */
110 geometries
= hkl_engine_pseudo_axis_values_set(engine
, values
, 3, HKL_UNIT_DEFAULT
, NULL
);
112 const HklGeometryListItem
*item
;
114 HKL_GEOMETRY_LIST_FOREACH(item
, geometries
){
115 hkl_geometry_set(geometry
,
116 hkl_geometry_list_item_geometry_get(item
));
117 res
&= DIAG(check_pseudoaxes(engine
, values
, ARRAY_SIZE(values
)));
119 hkl_geometry_list_free(geometries
);
123 ok(res
== TRUE
, "degenerated");
125 hkl_engine_list_free(engines
);
126 hkl_detector_free(detector
);
127 hkl_sample_free(sample
);
128 hkl_geometry_free(geometry
);
131 static void psi_getter(void)
134 HklEngineList
*engines
;
136 HklGeometry
*geometry
;
137 HklDetector
*detector
;
140 struct Geometry gconf
= E4cv(1.54, 30., 0., 0., 60.);
142 geometry
= newGeometry(gconf
);
143 engines
= newEngines(gconf
);
144 sample
= newSample(cu
);
146 detector
= hkl_detector_factory_new(HKL_DETECTOR_TYPE_0D
);
148 hkl_engine_list_init(engines
, geometry
, detector
, sample
);
150 engine
= hkl_engine_list_engine_get_by_name(engines
, "psi", NULL
);
152 /* the getter part */
153 res
&= DIAG(hkl_engine_initialized_set(engine
, TRUE
, NULL
));
156 hkl
[0] = 1, hkl
[1] = 0, hkl
[2] = 0;
157 res
&= DIAG(hkl_engine_parameters_values_set(engine
, hkl
, ARRAY_SIZE(hkl
), HKL_UNIT_DEFAULT
, NULL
));
158 res
&= DIAG(check_pseudoaxes_v(engine
, 0.));
161 hkl
[0] = 0, hkl
[1] = 1, hkl
[2] = 0;
162 res
&= DIAG(hkl_engine_parameters_values_set(engine
, hkl
, ARRAY_SIZE(hkl
), HKL_UNIT_DEFAULT
, NULL
));
163 res
&= DIAG(check_pseudoaxes_v(engine
, 90. * HKL_DEGTORAD
));
165 /* here Q and <h, k, l>_ref are colinear must FAIL */
166 hkl
[0] = 0, hkl
[1] = 0, hkl
[2] = 1;
167 res
&= DIAG(hkl_engine_parameters_values_set(engine
, hkl
, ARRAY_SIZE(hkl
), HKL_UNIT_DEFAULT
, NULL
));
168 res
&= DIAG(!check_pseudoaxes_v(engine
, 0. * HKL_DEGTORAD
));
171 hkl
[0] = -1, hkl
[1] = 0, hkl
[2] = 0;
172 res
&= DIAG(hkl_engine_parameters_values_set(engine
, hkl
, ARRAY_SIZE(hkl
), HKL_UNIT_DEFAULT
, NULL
));
173 res
&= DIAG(check_pseudoaxes_v(engine
, 180. * HKL_DEGTORAD
));
176 hkl
[0] = 0, hkl
[1] = -1, hkl
[2] = 0;
177 res
&= DIAG(hkl_engine_parameters_values_set(engine
, hkl
, ARRAY_SIZE(hkl
), HKL_UNIT_DEFAULT
, NULL
));
178 res
&= DIAG(check_pseudoaxes_v(engine
, -90. * HKL_DEGTORAD
));
180 /* Q and <h, k, l>_ref are colinear so must FAIL */
181 hkl
[0] = 0, hkl
[1] = 0, hkl
[2] = -1;
182 res
&= DIAG(hkl_engine_parameters_values_set(engine
, hkl
, ARRAY_SIZE(hkl
), HKL_UNIT_DEFAULT
, NULL
));
183 res
&= DIAG(!check_pseudoaxes_v(engine
, 0. * HKL_DEGTORAD
));
185 ok(res
== TRUE
, "psi getter");
187 hkl_engine_list_free(engines
);
188 hkl_detector_free(detector
);
189 hkl_sample_free(sample
);
190 hkl_geometry_free(geometry
);
193 static void psi_setter(void)
196 HklEngineList
*engines
;
198 const darray_string
*modes
;
200 HklGeometry
*geometry
;
201 HklDetector
*detector
;
203 static double hkl
[] = {1, 0, 0};
204 struct Geometry gconf
= E4cv(1.54, 30., 0., 0., 60.);
206 geometry
= newGeometry(gconf
);
207 engines
= newEngines(gconf
);
208 sample
= newSample(cu
);
210 detector
= hkl_detector_factory_new(HKL_DETECTOR_TYPE_0D
);
212 hkl_engine_list_init(engines
, geometry
, detector
, sample
);
214 engine
= hkl_engine_list_engine_get_by_name(engines
, "psi", NULL
);
215 modes
= hkl_engine_modes_names_get(engine
);
218 res
&= DIAG(hkl_engine_parameters_values_set(engine
, hkl
, ARRAY_SIZE(hkl
), HKL_UNIT_DEFAULT
, NULL
));
219 res
&= DIAG(hkl_engine_initialized_set(engine
, TRUE
, NULL
));
221 darray_foreach(mode
, *modes
){
224 res
&= DIAG(hkl_engine_current_mode_set(engine
, *mode
, NULL
));
225 for(psi
=-180 * HKL_DEGTORAD
;psi
<180 * HKL_DEGTORAD
;psi
+= HKL_DEGTORAD
){
226 HklGeometryList
*geometries
;
228 geometries
= hkl_engine_pseudo_axis_values_set(engine
, &psi
, 1,
229 HKL_UNIT_DEFAULT
, NULL
);
231 const HklGeometryListItem
*item
;
233 HKL_GEOMETRY_LIST_FOREACH(item
, geometries
){
234 hkl_geometry_set(geometry
,
235 hkl_geometry_list_item_geometry_get(item
));
236 res
&= DIAG(check_pseudoaxes_v(engine
, psi
));
238 hkl_geometry_list_free(geometries
);
243 ok(res
== TRUE
, "psi setter");
245 hkl_engine_list_free(engines
);
246 hkl_detector_free(detector
);
247 hkl_sample_free(sample
);
248 hkl_geometry_free(geometry
);
254 HklEngineList
*engines
;
256 const darray_string
*modes
;
258 HklGeometry
*geometry
;
259 HklDetector
*detector
;
261 struct Geometry gconf
= E4cv(1.54, 30., 0., 0., 60.);
263 geometry
= newGeometry(gconf
);
264 engines
= newEngines(gconf
);
265 sample
= newSample(cu
);
267 detector
= hkl_detector_factory_new(HKL_DETECTOR_TYPE_0D
);
269 hkl_engine_list_init(engines
, geometry
, detector
, sample
);
271 engine
= hkl_engine_list_engine_get_by_name(engines
, "q", NULL
);
272 modes
= hkl_engine_modes_names_get(engine
);
275 res
&= DIAG(hkl_engine_initialized_set(engine
, TRUE
, NULL
));
277 darray_foreach(mode
, *modes
){
280 res
&= DIAG(hkl_engine_current_mode_set(engine
, *mode
, NULL
));
281 for(q
=-1.; q
<1.; q
+= 0.1){
282 HklGeometryList
*geometries
;
284 geometries
= hkl_engine_pseudo_axis_values_set(engine
, &q
, 1,
285 HKL_UNIT_DEFAULT
, NULL
);
287 const HklGeometryListItem
*item
;
289 HKL_GEOMETRY_LIST_FOREACH(item
, geometries
){
290 hkl_geometry_set(geometry
,
291 hkl_geometry_list_item_geometry_get(item
));
292 res
&= DIAG(check_pseudoaxes(engine
, &q
, 1));
294 hkl_geometry_list_free(geometries
);
299 ok(res
== TRUE
, "q");
301 hkl_engine_list_free(engines
);
302 hkl_detector_free(detector
);
303 hkl_sample_free(sample
);
304 hkl_geometry_free(geometry
);
307 static void hkl_psi_constant_vertical(void)
310 HklEngineList
*engines
;
312 HklGeometry
*geometry
;
313 HklGeometryList
*geometries
;
314 HklDetector
*detector
;
316 static double hkl
[] = {1, 0, 1};
317 static double hkl2
[] = {1, 1, 0};
318 struct Geometry gconf
= E4cv(1.54, 30., 0., 0., 60.);
320 geometry
= newGeometry(gconf
);
321 engines
= newEngines(gconf
);
322 sample
= newSample(cu
);
324 detector
= hkl_detector_factory_new(HKL_DETECTOR_TYPE_0D
);
326 hkl_engine_list_init(engines
, geometry
, detector
, sample
);
328 engine
= hkl_engine_list_engine_get_by_name(engines
, "hkl", NULL
);
330 res
&= DIAG(hkl_engine_current_mode_set(engine
, "psi_constant", NULL
));
333 res
&= DIAG(hkl_engine_parameters_values_set(engine
, hkl2
, ARRAY_SIZE(hkl2
), HKL_UNIT_DEFAULT
, NULL
));
334 res
&= DIAG(hkl_engine_initialized_set(engine
, TRUE
, NULL
));
336 geometries
= hkl_engine_pseudo_axis_values_set(engine
, hkl
, ARRAY_SIZE(hkl
),
337 HKL_UNIT_DEFAULT
, NULL
);
339 const HklGeometryListItem
*item
;
341 HKL_GEOMETRY_LIST_FOREACH(item
, geometries
){
342 hkl_geometry_set(geometry
,
343 hkl_geometry_list_item_geometry_get(item
));
344 res
&= DIAG(check_pseudoaxes(engine
, hkl
, ARRAY_SIZE(hkl
)));
346 hkl_geometry_list_free(geometries
);
349 ok(res
== TRUE
, "psi constant vertical");
351 hkl_engine_list_free(engines
);
352 hkl_detector_free(detector
);
353 hkl_sample_free(sample
);
354 hkl_geometry_free(geometry
);
366 hkl_psi_constant_vertical();