3 #include <hkl/hkl-geometry-factory.h>
4 #include <hkl/hkl-pseudoaxis-K4CV.h>
8 #ifdef HKL_TEST_SUITE_NAME
9 # undef HKL_TEST_SUITE_NAME
11 #define HKL_TEST_SUITE_NAME pseudoaxis_K4CV
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_K4CV_HKL();
45 hkl_pseudoAxisEngine_free(engine
);
50 HKL_TEST_SUITE_FUNC(set
)
52 HklPseudoAxisEngine
*engine
= NULL
;
54 HklDetector det
= {1};
60 geom
= hkl_geometry_factory_new(HKL_GEOMETRY_KAPPA4C_VERTICAL
, 50 * HKL_DEGTORAD
);
61 sample
= hkl_sample_new("test", HKL_SAMPLE_MONOCRYSTAL
);
63 engine
= hkl_pseudoAxisEngine_new_K4CV_HKL();
65 H
= &engine
->pseudoAxes
[0].config
.value
;
66 K
= &engine
->pseudoAxes
[1].config
.value
;
67 L
= &engine
->pseudoAxes
[2].config
.value
;
69 for(f_idx
=0; f_idx
<engine
->getsets_len
; ++f_idx
) {
70 hkl_pseudoAxisEngine_select_get_set(engine
, f_idx
);
72 engine
->getset
->parameters
[0].value
= 1.;
77 *H
= h
= (double)rand() / RAND_MAX
* 2 - 1.;
78 *K
= k
= (double)rand() / RAND_MAX
* 2 - 1.;
79 *L
= l
= (double)rand() / RAND_MAX
* 2 - 1.;
82 res
= hkl_pseudoAxisEngine_setter(engine
, geom
, &det
, sample
);
83 //hkl_pseudoAxisEngine_fprintf(engine, stdout);
87 for(j
=0; j
<engine
->geometries_len
; ++j
) {
90 hkl_geometry_init_geometry(engine
->geometry
, engine
->geometries
[j
]);
91 hkl_pseudoAxisEngine_getter(engine
, engine
->geometry
, &det
, sample
);
93 HKL_ASSERT_DOUBLES_EQUAL(h
, *H
, HKL_EPSILON
);
94 HKL_ASSERT_DOUBLES_EQUAL(k
, *K
, HKL_EPSILON
);
95 HKL_ASSERT_DOUBLES_EQUAL(l
, *L
, HKL_EPSILON
);
101 fprintf(stderr
, "\nK4CV missed : %d", miss
);
103 hkl_pseudoAxisEngine_free(engine
);
104 hkl_sample_free(sample
);
105 hkl_geometry_free(geom
);
107 return HKL_TEST_PASS
;
110 HKL_TEST_SUITE_FUNC(degenerated
)
112 HklPseudoAxisEngine
*engine
= NULL
;
114 HklDetector det
= {1};
119 geom
= hkl_geometry_factory_new(HKL_GEOMETRY_KAPPA4C_VERTICAL
, 50 * HKL_DEGTORAD
);
120 sample
= hkl_sample_new("test", HKL_SAMPLE_MONOCRYSTAL
);
122 engine
= hkl_pseudoAxisEngine_new_K4CV_HKL();
124 H
= &engine
->pseudoAxes
[0].config
.value
;
125 K
= &engine
->pseudoAxes
[1].config
.value
;
126 L
= &engine
->pseudoAxes
[2].config
.value
;
128 for(f_idx
=0; f_idx
<engine
->getsets_len
; ++f_idx
) {
129 hkl_pseudoAxisEngine_select_get_set(engine
, f_idx
);
131 engine
->getset
->parameters
[0].value
= 1.;
136 /* studdy this degenerated case */
141 // pseudo -> geometry
142 res
= hkl_pseudoAxisEngine_setter(engine
, geom
, &det
, sample
);
143 //hkl_pseudoAxisEngine_fprintf(engine, stdout);
145 // geometry -> pseudo
147 for(i
=0; i
<engine
->geometries_len
; ++i
) {
150 hkl_geometry_init_geometry(engine
->geometry
, engine
->geometries
[i
]);
151 hkl_pseudoAxisEngine_getter(engine
, engine
->geometry
, &det
, sample
);
153 HKL_ASSERT_DOUBLES_EQUAL(h
, *H
, HKL_EPSILON
);
154 HKL_ASSERT_DOUBLES_EQUAL(k
, *K
, HKL_EPSILON
);
155 HKL_ASSERT_DOUBLES_EQUAL(l
, *L
, HKL_EPSILON
);
160 hkl_pseudoAxisEngine_free(engine
);
161 hkl_sample_free(sample
);
162 hkl_geometry_free(geom
);
164 return HKL_TEST_PASS
;
171 HKL_TEST( degenerated
);