* just a refactoring of the geometry factory
[hkl.git] / include / hkl / hkl-geometry-factory.h
blob1f3be49212886e9110c59b53994c119c1642276e
1 #ifndef __HKL_GEOMETRY_FACTORY_H__
2 #define __HKL_GEOMETRY_FACTORY_H__
4 #include <stdarg.h>
5 #include <hkl/hkl-geometry.h>
7 HKL_BEGIN_DECLS
9 typedef enum _HklGeometryType HklGeometryType;
11 enum _HklGeometryType
13 HKL_GEOMETRY_TWOC_VERTICAL,
14 HKL_GEOMETRY_EULERIAN4C_VERTICAL,
15 HKL_GEOMETRY_KAPPA4C_VERTICAL,
16 HKL_GEOMETRY_EULERIAN6C,
17 HKL_GEOMETRY_KAPPA6C,
20 static void hkl_geometry_init_twoC_vertical(HklGeometry *self)
22 HklHolder *h;
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)
33 HklHolder *h;
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)
46 HklHolder *h;
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)
59 HklHolder *h;
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)
74 HklHolder *h;
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, ...)
90 HklGeometry *geom;
91 double alpha;
92 va_list ap;
94 geom = hkl_geometry_new();
95 switch(type) {
96 case HKL_GEOMETRY_TWOC_VERTICAL:
97 hkl_geometry_init_twoC_vertical(geom);
98 break;
99 case HKL_GEOMETRY_EULERIAN4C_VERTICAL:
100 hkl_geometry_init_eulerian4C_vertical(geom);
101 break;
102 case HKL_GEOMETRY_KAPPA4C_VERTICAL:
103 va_start(ap, type);
104 alpha = va_arg(ap, double);
105 va_end(ap);
106 hkl_geometry_init_kappa4C_vertical(geom, alpha);
107 break;
108 case HKL_GEOMETRY_EULERIAN6C:
109 hkl_geometry_init_eulerian6C(geom);
110 break;
111 case HKL_GEOMETRY_KAPPA6C:
112 va_start(ap, type);
113 alpha = va_arg(ap, double);
114 va_end(ap);
115 hkl_geometry_init_kappa6C(geom, alpha);
116 break;
119 return geom;
122 HKL_END_DECLS
124 #endif /* __HKL_GEOMETRY_FACTORY_H__ */