1 #ifndef __HKL_GEOMETRY_FACTORY_H__
2 #define __HKL_GEOMETRY_FACTORY_H__
5 #include <hkl/hkl-geometry.h>
9 typedef enum _HklGeometryType HklGeometryType
;
13 HKL_GEOMETRY_TWOC_VERTICAL
,
14 HKL_GEOMETRY_EULERIAN4C_VERTICAL
,
15 HKL_GEOMETRY_KAPPA4C_VERTICAL
,
16 HKL_GEOMETRY_EULERIAN6C
,
20 static void hkl_geometry_init_twoC_vertical(HklGeometry
*self
)
24 h
= hkl_geometry_add_holder(self
);
25 hkl_holder_add_rotation_axis(h
, "omega", 0, -1, 0);
27 h
= hkl_geometry_add_holder(self
);
28 hkl_holder_add_rotation_axis(h
, "tth", 0, -1, 0);
31 static void hkl_geometry_init_eulerian4C_vertical(HklGeometry
*self
)
35 h
= hkl_geometry_add_holder(self
);
36 hkl_holder_add_rotation_axis(h
, "omega", 0, -1, 0);
37 hkl_holder_add_rotation_axis(h
, "chi", 1, 0, 0);
38 hkl_holder_add_rotation_axis(h
, "phi", 0, -1, 0);
40 h
= hkl_geometry_add_holder(self
);
41 hkl_holder_add_rotation_axis(h
, "tth", 0, -1, 0);
44 static void hkl_geometry_init_kappa4C_vertical(HklGeometry
*self
, double alpha
)
48 h
= hkl_geometry_add_holder(self
);
49 hkl_holder_add_rotation_axis(h
, "komega", 0, -1, 0);
50 hkl_holder_add_rotation_axis(h
, "kappa", 0, -cos(alpha
), -sin(alpha
));
51 hkl_holder_add_rotation_axis(h
, "kphi", 0, -1, 0);
53 h
= hkl_geometry_add_holder(self
);
54 hkl_holder_add_rotation_axis(h
, "tth", 0, -1, 0);
57 static void hkl_geometry_init_eulerian6C(HklGeometry
*self
)
61 h
= hkl_geometry_add_holder(self
);
62 hkl_holder_add_rotation_axis(h
, "mu", 0, 0, 1);
63 hkl_holder_add_rotation_axis(h
, "omega", 0, -1, 0);
64 hkl_holder_add_rotation_axis(h
, "chi", 1, 0, 0);
65 hkl_holder_add_rotation_axis(h
, "phi", 0, -1, 0);
67 h
= hkl_geometry_add_holder(self
);
68 hkl_holder_add_rotation_axis(h
, "gamma", 0, 0, 1);
69 hkl_holder_add_rotation_axis(h
, "delta", 0, -1, 0);
72 static void hkl_geometry_init_kappa6C(HklGeometry
*self
, double alpha
)
76 h
= hkl_geometry_add_holder(self
);
77 hkl_holder_add_rotation_axis(h
, "mu", 0, 0, 1);
78 hkl_holder_add_rotation_axis(h
, "komega", 0, -1, 0);
79 hkl_holder_add_rotation_axis(h
, "kappa", 0, -cos(alpha
), -sin(alpha
));
80 hkl_holder_add_rotation_axis(h
, "kphi", 0, -1, 0);
82 h
= hkl_geometry_add_holder(self
);
83 hkl_holder_add_rotation_axis(h
, "gamma", 0, 0, 1);
84 hkl_holder_add_rotation_axis(h
, "delta", 0, -1, 0);
88 static HklGeometry
*hkl_geometry_factory_new(HklGeometryType type
, ...)
94 geom
= hkl_geometry_new();
96 case HKL_GEOMETRY_TWOC_VERTICAL
:
97 hkl_geometry_init_twoC_vertical(geom
);
99 case HKL_GEOMETRY_EULERIAN4C_VERTICAL
:
100 hkl_geometry_init_eulerian4C_vertical(geom
);
102 case HKL_GEOMETRY_KAPPA4C_VERTICAL
:
104 alpha
= va_arg(ap
, double);
106 hkl_geometry_init_kappa4C_vertical(geom
, alpha
);
108 case HKL_GEOMETRY_EULERIAN6C
:
109 hkl_geometry_init_eulerian6C(geom
);
111 case HKL_GEOMETRY_KAPPA6C
:
113 alpha
= va_arg(ap
, double);
115 hkl_geometry_init_kappa6C(geom
, alpha
);
124 #endif /* __HKL_GEOMETRY_FACTORY_H__ */