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
)
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
);
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
;
58 double komega
, komegap
;
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(©
->axes
[0], komegap
);
71 hkl_axis_set_value(©
->axes
[1], kappap
);
72 hkl_axis_set_value(©
->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
;
83 double komega
, komegap
;
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(©
->axes
[1], komegap
);
96 hkl_axis_set_value(©
->axes
[2], kappap
);
97 hkl_axis_set_value(©
->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
:
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());
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());
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());
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());
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());
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());
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());
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());
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());
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());