add the SOLEIL SIRIUS KAPPA diffractometer
[hkl.git] / hkl / hkl-pseudoaxis-factory.c
blob8fadc9ca4673aef20d7e87cf3acbcb253ea77a5d
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-2011 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>
23 #include <gsl/gsl_sf.h>
25 #include <hkl/hkl-pseudoaxis-factory.h>
26 #include <hkl/hkl-pseudoaxis-common-eulerians.h>
27 #include <hkl/hkl-pseudoaxis-common-q.h>
28 #include <hkl/hkl-pseudoaxis-e4cv.h>
29 #include <hkl/hkl-pseudoaxis-k4cv.h>
30 #include <hkl/hkl-pseudoaxis-e6c.h>
31 #include <hkl/hkl-pseudoaxis-k6c.h>
32 #include <hkl/hkl-pseudoaxis-zaxis.h>
33 #include <hkl/hkl-pseudoaxis-soleil-sixs-med.h>
34 #include <hkl/hkl-pseudoaxis-petra3.h>
35 #include <hkl/hkl-pseudoaxis-soleil-sirius-turret.h>
37 static void kappa_2_kappap(double komega, double kappa, double kphi, double alpha,
38 double *komegap, double *kappap, double *kphip)
40 double p;
41 double omega;
42 double phi;
44 p = atan(tan(kappa/2.) * cos(alpha));
45 omega = komega + p - M_PI_2;
46 phi = kphi + p + M_PI_2;
48 *komegap = gsl_sf_angle_restrict_symm(2*omega - komega);
49 *kappap = -kappa;
50 *kphip = gsl_sf_angle_restrict_symm(2*phi - kphi);
54 static void hkl_geometry_list_multiply_k4c_real(HklGeometryList *self, size_t idx)
56 HklGeometry *geometry;
57 HklGeometry *copy;
58 double komega, komegap;
59 double kappa, kappap;
60 double kphi, kphip;
62 geometry = self->items[idx]->geometry;
63 komega = hkl_axis_get_value(&geometry->axes[0]);
64 kappa = hkl_axis_get_value(&geometry->axes[1]);
65 kphi = hkl_axis_get_value(&geometry->axes[2]);
67 kappa_2_kappap(komega, kappa, kphi, 50 * HKL_DEGTORAD, &komegap, &kappap, &kphip);
69 copy = hkl_geometry_new_copy(geometry);
70 hkl_axis_set_value(&copy->axes[0], komegap);
71 hkl_axis_set_value(&copy->axes[1], kappap);
72 hkl_axis_set_value(&copy->axes[2], kphip);
74 hkl_geometry_update(copy);
75 hkl_geometry_list_add(self, copy);
76 hkl_geometry_free(copy);
79 static void hkl_geometry_list_multiply_k6c_real(HklGeometryList *self, size_t idx)
81 HklGeometry *geometry;
82 HklGeometry *copy;
83 double komega, komegap;
84 double kappa, kappap;
85 double kphi, kphip;
87 geometry = self->items[idx]->geometry;
88 komega = hkl_axis_get_value(&geometry->axes[1]);
89 kappa = hkl_axis_get_value(&geometry->axes[2]);
90 kphi = hkl_axis_get_value(&geometry->axes[3]);
92 kappa_2_kappap(komega, kappa, kphi, 50 * HKL_DEGTORAD, &komegap, &kappap, &kphip);
94 copy = hkl_geometry_new_copy(geometry);
95 hkl_axis_set_value(&copy->axes[1], komegap);
96 hkl_axis_set_value(&copy->axes[2], kappap);
97 hkl_axis_set_value(&copy->axes[3], kphip);
99 hkl_geometry_update(copy);
100 hkl_geometry_list_add(self, copy);
101 hkl_geometry_free(copy);
104 HklPseudoAxisEngineList *hkl_pseudo_axis_engine_list_factory(const HklGeometryConfig *config)
106 HklPseudoAxisEngineList *self = NULL;
108 self = hkl_pseudo_axis_engine_list_new();
110 switch(config->type){
111 case HKL_GEOMETRY_TYPE_TWOC_VERTICAL:
112 break;
113 case HKL_GEOMETRY_TYPE_EULERIAN4C_VERTICAL:
114 case HKL_GEOMETRY_TYPE_SOLEIL_MARS:
115 hkl_pseudo_axis_engine_list_add(self, hkl_pseudo_axis_engine_e4cv_hkl_new());
116 hkl_pseudo_axis_engine_list_add(self, hkl_pseudo_axis_engine_e4cv_psi_new());
117 hkl_pseudo_axis_engine_list_add(self, hkl_pseudo_axis_engine_q_new());
118 break;
119 case HKL_GEOMETRY_TYPE_KAPPA4C_VERTICAL:
120 self->geometries->multiply = hkl_geometry_list_multiply_k4c_real;
121 hkl_pseudo_axis_engine_list_add(self, hkl_pseudo_axis_engine_k4cv_hkl_new());
122 hkl_pseudo_axis_engine_list_add(self, hkl_pseudo_axis_engine_eulerians_new());
123 hkl_pseudo_axis_engine_list_add(self, hkl_pseudo_axis_engine_k4cv_psi_new());
124 hkl_pseudo_axis_engine_list_add(self, hkl_pseudo_axis_engine_q_new());
125 break;
126 case HKL_GEOMETRY_TYPE_EULERIAN6C:
127 hkl_pseudo_axis_engine_list_add(self, hkl_pseudo_axis_engine_e6c_hkl_new());
128 hkl_pseudo_axis_engine_list_add(self, hkl_pseudo_axis_engine_e6c_psi_new());
129 hkl_pseudo_axis_engine_list_add(self, hkl_pseudo_axis_engine_q2_new());
130 hkl_pseudo_axis_engine_list_add(self, hkl_pseudo_axis_engine_qper_qpar_new());
131 break;
132 case HKL_GEOMETRY_TYPE_KAPPA6C:
133 case HKL_GEOMETRY_TYPE_SOLEIL_SIRIUS_KAPPA:
134 self->geometries->multiply = hkl_geometry_list_multiply_k6c_real;
135 hkl_pseudo_axis_engine_list_add(self, hkl_pseudo_axis_engine_k6c_hkl_new());
136 hkl_pseudo_axis_engine_list_add(self, hkl_pseudo_axis_engine_eulerians_new());
137 hkl_pseudo_axis_engine_list_add(self, hkl_pseudo_axis_engine_k6c_psi_new());
138 hkl_pseudo_axis_engine_list_add(self, hkl_pseudo_axis_engine_q2_new());
139 hkl_pseudo_axis_engine_list_add(self, hkl_pseudo_axis_engine_qper_qpar_new());
140 break;
141 case HKL_GEOMETRY_TYPE_ZAXIS:
142 hkl_pseudo_axis_engine_list_add(self, hkl_pseudo_axis_engine_zaxis_hkl_new());
143 hkl_pseudo_axis_engine_list_add(self, hkl_pseudo_axis_engine_q2_new());
144 hkl_pseudo_axis_engine_list_add(self, hkl_pseudo_axis_engine_qper_qpar_new());
145 break;
146 case HKL_GEOMETRY_TYPE_SOLEIL_SIXS_MED_2_2:
147 hkl_pseudo_axis_engine_list_add(self, hkl_pseudo_axis_engine_soleil_sixs_med_2_2_hkl_new());
148 hkl_pseudo_axis_engine_list_add(self, hkl_pseudo_axis_engine_q2_new());
149 hkl_pseudo_axis_engine_list_add(self, hkl_pseudo_axis_engine_qper_qpar_new());
150 break;
151 case HKL_GEOMETRY_TYPE_SOLEIL_SIXS_MED_1_2:
152 hkl_pseudo_axis_engine_list_add(self, hkl_pseudo_axis_engine_soleil_sixs_med_1_2_hkl_new());
153 hkl_pseudo_axis_engine_list_add(self, hkl_pseudo_axis_engine_q2_new());
154 hkl_pseudo_axis_engine_list_add(self, hkl_pseudo_axis_engine_qper_qpar_new());
155 break;
156 case HKL_GEOMETRY_TYPE_PETRA3_P09_EH2:
157 hkl_pseudo_axis_engine_list_add(self, hkl_pseudo_axis_engine_petra3_p09_eh2_hkl_new());
158 break;
159 case HKL_GEOMETRY_TYPE_SOLEIL_SIXS_MED_2_3:
160 self->geometries->multiply = hkl_geometry_list_multiply_soleil_sixs_med_2_3;
161 hkl_pseudo_axis_engine_list_add(self, hkl_pseudo_axis_engine_soleil_sixs_med_2_3_hkl_new());
162 hkl_pseudo_axis_engine_list_add(self, hkl_pseudo_axis_engine_q2_new());
163 hkl_pseudo_axis_engine_list_add(self, hkl_pseudo_axis_engine_qper_qpar_new());
164 break;
165 case HKL_GEOMETRY_TYPE_SOLEIL_SIRIUS_TURRET:
166 hkl_pseudo_axis_engine_list_add(self, hkl_pseudo_axis_engine_soleil_sirius_turret_hkl_new());
167 hkl_pseudo_axis_engine_list_add(self, hkl_pseudo_axis_engine_q2_new());
168 hkl_pseudo_axis_engine_list_add(self, hkl_pseudo_axis_engine_qper_qpar_new());
169 break;
171 return self;