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>
27 #ifdef HKL_TEST_SUITE_NAME
28 # undef HKL_TEST_SUITE_NAME
30 #define HKL_TEST_SUITE_NAME pseudoaxis
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
));
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"))
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. */
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
,
101 fprintf(stderr
, "\n\"%s\" \"%s\" missed : %d",
102 engine
->geometry
->name
,
103 engine
->mode
->name
, miss
);
109 fprintf(stderr
, "\n");
112 return HKL_TEST_PASS
;
115 #define test_engines(test, engines) do{ \
117 for(i=0; i<HKL_LIST_LEN(engines->engines); ++i){ \
118 if (!test_engine(test, engines->engines[i], \
122 return HKL_TEST_FAIL; \
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 */
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
;