3 #include <hkl/hkl-geometry-factory.h>
4 #include <hkl/hkl-pseudoaxis-E4CV.h>
8 #ifdef HKL_TEST_SUITE_NAME
9 # undef HKL_TEST_SUITE_NAME
11 #define HKL_TEST_SUITE_NAME pseudoaxis_E4CV
13 #define SET_AXES(geometry, a, b, c, d) do{\
14 HklAxisConfig *Omega = &geometry->axes[0]->config;\
15 HklAxisConfig *Chi = &geometry->axes[1]->config;\
16 HklAxisConfig *Phi = &geometry->axes[2]->config;\
17 HklAxisConfig *Tth = &geometry->axes[3]->config;\
19 Omega->value = a * HKL_DEGTORAD;\
22 Chi->value = b * HKL_DEGTORAD;\
25 Phi->value = c * HKL_DEGTORAD;\
28 Tth->value = d * HKL_DEGTORAD;\
32 #define CHECK_PSEUDOAXES(engine, a, b, c) do{\
33 HklPseudoAxis *H = &engine->pseudoAxes[0];\
34 HklPseudoAxis *K = &engine->pseudoAxes[1];\
35 HklPseudoAxis *L = &engine->pseudoAxes[2];\
37 HKL_ASSERT_DOUBLES_EQUAL(a, H->config.value, HKL_EPSILON);\
38 HKL_ASSERT_DOUBLES_EQUAL(b, K->config.value, HKL_EPSILON);\
39 HKL_ASSERT_DOUBLES_EQUAL(c, L->config.value, HKL_EPSILON);\
42 HKL_TEST_SUITE_FUNC(new)
44 HklPseudoAxisEngine
*engine
= hkl_pseudoAxisEngine_new_E4CV_HKL();
45 hkl_pseudoAxisEngine_free(engine
);
50 HKL_TEST_SUITE_FUNC(update
)
52 HklPseudoAxisEngine
*engine
;
54 HklDetector det
= {1};
57 geom
= hkl_geometry_factory_new(HKL_GEOMETRY_EULERIAN4C_VERTICAL
);
58 sample
= hkl_sample_new("test", HKL_SAMPLE_MONOCRYSTAL
);
60 engine
= hkl_pseudoAxisEngine_new_E4CV_HKL();
61 hkl_pseudoAxisEngine_set(engine
, 0, geom
, &det
, sample
);
64 SET_AXES(engine
->geometry
, 30., 0., 0., 60.);
65 hkl_pseudoAxisEngine_to_pseudoAxes(engine
);
66 CHECK_PSEUDOAXES(engine
, 0., 0., 1.);
68 SET_AXES(engine
->geometry
, 30., 0., 90., 60.);
69 hkl_pseudoAxisEngine_to_pseudoAxes(engine
);
70 CHECK_PSEUDOAXES(engine
, 1., 0., 0.);
72 SET_AXES(engine
->geometry
, 30, 0., -90., 60.);
73 hkl_pseudoAxisEngine_to_pseudoAxes(engine
);
74 CHECK_PSEUDOAXES(engine
, -1., 0., 0.);
76 SET_AXES(engine
->geometry
, 30., 0., 180., 60.);
77 hkl_pseudoAxisEngine_to_pseudoAxes(engine
);
78 CHECK_PSEUDOAXES(engine
, 0., 0., -1.);
80 SET_AXES(engine
->geometry
, 45., 0., 135., 90.);
81 hkl_pseudoAxisEngine_to_pseudoAxes(engine
);
82 CHECK_PSEUDOAXES(engine
, 1., 0., -1.);
84 hkl_pseudoAxisEngine_free(engine
);
85 hkl_sample_free(sample
);
86 hkl_geometry_free(geom
);
91 HKL_TEST_SUITE_FUNC(set
)
93 HklPseudoAxisEngine
*engine
= NULL
;
95 HklDetector det
= {1};
101 geom
= hkl_geometry_factory_new(HKL_GEOMETRY_EULERIAN4C_VERTICAL
);
102 sample
= hkl_sample_new("test", HKL_SAMPLE_MONOCRYSTAL
);
104 engine
= hkl_pseudoAxisEngine_new_E4CV_HKL();
106 H
= &engine
->pseudoAxes
[0].config
.value
;
107 K
= &engine
->pseudoAxes
[1].config
.value
;
108 L
= &engine
->pseudoAxes
[2].config
.value
;
110 for(f_idx
=0; f_idx
<engine
->config
.functions_len
; ++f_idx
) {
111 hkl_pseudoAxisEngine_set(engine
, f_idx
, geom
, &det
, sample
);
113 engine
->function
->parameters
[0].value
= 1.;
114 for(i
=0;i
<1000;++i
) {
118 *H
= h
= (double)rand() / RAND_MAX
* 2 - 1.;
119 *K
= k
= (double)rand() / RAND_MAX
* 2 - 1.;
120 *L
= l
= (double)rand() / RAND_MAX
* 2 - 1.;
122 // pseudo -> geometry
123 res
= hkl_pseudoAxisEngine_to_geometry(engine
);
124 //hkl_pseudoAxisEngine_fprintf(engine, stdout);
126 // geometry -> pseudo
128 for(j
=0; j
<engine
->geometries_len
; ++j
) {
131 hkl_geometry_init_geometry(engine
->geometry
, engine
->geometries
[j
]);
132 hkl_pseudoAxisEngine_to_pseudoAxes(engine
);
134 HKL_ASSERT_DOUBLES_EQUAL(h
, *H
, HKL_EPSILON
);
135 HKL_ASSERT_DOUBLES_EQUAL(k
, *K
, HKL_EPSILON
);
136 HKL_ASSERT_DOUBLES_EQUAL(l
, *L
, HKL_EPSILON
);
142 fprintf(stderr
, "\nE4CV missed : %d", miss
);
144 hkl_pseudoAxisEngine_free(engine
);
145 hkl_sample_free(sample
);
146 hkl_geometry_free(geom
);
148 return HKL_TEST_PASS
;