* add the MED2+2 geometry for the SOLEIL SIXS beamline
[hkl.git] / test / hkl-test-pseudoaxis.c
blob6a2ed0b6c56ff17a5d5e071d53f52178b049bf6b
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-2010 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 <alloca.h>
23 #include <hkl.h>
25 #include "hkl-test.h"
27 #ifdef HKL_TEST_SUITE_NAME
28 # undef HKL_TEST_SUITE_NAME
29 #endif
30 #define HKL_TEST_SUITE_NAME pseudoaxis
32 #define with_log 0
33 #define N 2
35 static int test_engine(struct hkl_test *test,
36 HklPseudoAxisEngine *engine, HklGeometry *geometry,
37 HklDetector *detector, HklSample *sample)
39 size_t i, j, k, f_idx;
40 double *values = alloca(HKL_LIST_LEN(engine->pseudoAxes) * sizeof(*values));
41 int miss = 0;
43 /* randomize the geometry */
44 hkl_geometry_randomize(geometry);
46 for(f_idx=0; f_idx<HKL_LIST_LEN(engine->modes); ++f_idx) {
47 hkl_pseudo_axis_engine_select_mode(engine, f_idx);
48 /* for now unactive the eulerians check */
49 if(!strcmp(engine->mode->name, "eulerians"))
50 continue;
51 miss = 0;
52 for(i=0;i<N;++i) {
53 int res;
54 size_t len = HKL_LIST_LEN(engine->pseudoAxes);
56 /* randomize the pseudoAxes values */
57 for(j=0; j<len; ++j) {
58 HklParameter *parameter = (HklParameter *)(engine->pseudoAxes[j]);
59 hkl_parameter_randomize(parameter);
61 values[j] = parameter->value;
64 /* randomize the parameters */
65 for(j=0; j<HKL_LIST_LEN(engine->mode->parameters); ++j)
66 hkl_parameter_randomize(&engine->mode->parameters[j]);
68 /* pseudo -> geometry */
69 hkl_pseudo_axis_engine_initialize(engine, NULL);
70 /* hkl_pseudo_axis_engine_fprintf(stderr, engine); */
71 res = hkl_pseudo_axis_engine_set(engine, NULL);
73 /* geometry -> pseudo */
74 if (res == HKL_SUCCESS) {
75 size_t g_len = hkl_geometry_list_len(engine->engines->geometries);
76 /* check all finded geometries */
77 /* hkl_pseudo_axis_engine_fprintf(stderr, engine); */
79 for(j=0; j<g_len; ++j) {
80 /* first modify the pseudoAxes values */
81 /* to be sure that the result is the */
82 /* computed result. */
83 for(k=0; k<len; ++k)
84 ((HklParameter *)engine->pseudoAxes[k])->value = 0.;
86 hkl_geometry_init_geometry(geometry,
87 engine->engines->geometries->items[j]->geometry);
88 hkl_pseudo_axis_engine_get(engine, NULL);
90 for(k=0; k<len; ++k) {
91 HKL_ASSERT_DOUBLES_EQUAL(values[k],
92 ((HklParameter *)engine->pseudoAxes[k])->value,
93 HKL_EPSILON);
96 } else
97 miss++;
100 #if with_log
101 fprintf(stderr, "\n\"%s\" \"%s\" missed : %d",
102 engine->geometry->name,
103 engine->mode->name, miss);
104 #endif
108 #if with_log
109 fprintf(stderr, "\n");
110 #endif
112 return HKL_TEST_PASS;
115 #define test_engines(test, engines) do{ \
116 size_t i; \
117 for(i=0; i<HKL_LIST_LEN(engines->engines); ++i){ \
118 if (!test_engine(test, engines->engines[i], \
119 engines->geometry, \
120 engines->detector, \
121 engines->sample)) \
122 return HKL_TEST_FAIL; \
124 }while(0)
126 HKL_TEST_SUITE_FUNC(set)
128 const HklGeometryConfig *config;
129 HklGeometry *geometry = NULL;
130 HklDetector *detector = hkl_detector_factory_new(HKL_DETECTOR_TYPE_0D);
131 HklSample *sample = hkl_sample_new("test", HKL_SAMPLE_TYPE_MONOCRYSTAL);
132 HklPseudoAxisEngineList *engines;
134 /* attach to the second holder */
135 detector->idx = 1;
137 /* test all E4CV engines */
138 config = hkl_geometry_factory_get_config_from_type(HKL_GEOMETRY_TYPE_EULERIAN4C_VERTICAL);
139 geometry = hkl_geometry_factory_new(config);
140 engines = hkl_pseudo_axis_engine_list_factory(config);
141 hkl_pseudo_axis_engine_list_init(engines, geometry, detector, sample);
142 test_engines(test, engines);
143 hkl_geometry_free(geometry);
144 hkl_pseudo_axis_engine_list_free(engines);
146 /* test all E6C HKL engines */
147 config = hkl_geometry_factory_get_config_from_type(HKL_GEOMETRY_TYPE_EULERIAN6C);
148 geometry = hkl_geometry_factory_new(config);
149 engines = hkl_pseudo_axis_engine_list_factory(config);
150 hkl_pseudo_axis_engine_list_init(engines, geometry, detector, sample);
151 test_engines(test, engines);
152 hkl_geometry_free(geometry);
153 hkl_pseudo_axis_engine_list_free(engines);
155 /* test all K4CV HKL engines */
156 config = hkl_geometry_factory_get_config_from_type(HKL_GEOMETRY_TYPE_KAPPA4C_VERTICAL);
157 geometry = hkl_geometry_factory_new(config, 50 * HKL_DEGTORAD);
158 engines = hkl_pseudo_axis_engine_list_factory(config);
159 hkl_pseudo_axis_engine_list_init(engines, geometry, detector, sample);
160 test_engines(test, engines);
161 hkl_geometry_free(geometry);
162 hkl_pseudo_axis_engine_list_free(engines);
164 /* test all K6C engines */
165 config = hkl_geometry_factory_get_config_from_type(HKL_GEOMETRY_TYPE_KAPPA6C);
166 geometry = hkl_geometry_factory_new(config, 50 * HKL_DEGTORAD);
167 engines = hkl_pseudo_axis_engine_list_factory(config);
168 hkl_pseudo_axis_engine_list_init(engines, geometry, detector, sample);
169 test_engines(test, engines);
170 hkl_geometry_free(geometry);
171 hkl_pseudo_axis_engine_list_free(engines);
173 /* test all ZAXIS engines */
174 config = hkl_geometry_factory_get_config_from_type(HKL_GEOMETRY_TYPE_ZAXIS);
175 geometry = hkl_geometry_factory_new(config);
176 engines = hkl_pseudo_axis_engine_list_factory(config);
177 hkl_pseudo_axis_engine_list_init(engines, geometry, detector, sample);
178 test_engines(test, engines);
179 hkl_geometry_free(geometry);
180 hkl_pseudo_axis_engine_list_free(engines);
182 /* test all SOLEIL SIXS MED engines */
183 config = hkl_geometry_factory_get_config_from_type(HKL_GEOMETRY_TYPE_SOLEIL_SIXS_MED_2_2);
184 geometry = hkl_geometry_factory_new(config);
185 engines = hkl_pseudo_axis_engine_list_factory(config);
186 hkl_pseudo_axis_engine_list_init(engines, geometry, detector, sample);
187 test_engines(test, engines);
188 hkl_geometry_free(geometry);
189 hkl_pseudo_axis_engine_list_free(engines);
191 hkl_detector_free(detector);
192 hkl_sample_free(sample);
194 return HKL_TEST_PASS;
197 HKL_TEST_SUITE_BEGIN
199 HKL_TEST( set );
201 HKL_TEST_SUITE_END