* add the reflectivity mode to the MED2+2
[hkl.git] / hkl / hkl-pseudoaxis-soleil-sixs-med.c
bloba16479dede6045794f4723c6c546f9845c411405
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) 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>
22 #include <hkl/hkl-pseudoaxis-soleil-sixs-med.h>
23 #include <hkl/hkl-pseudoaxis-common-hkl.h>
25 /**************************/
26 /* MED2+2 PseudoAxeEngine */
27 /**************************/
29 static int reflectivity(const gsl_vector *x, void *params, gsl_vector *f)
31 double mu, gamma;
32 double const *x_data = gsl_vector_const_ptr(x, 0);
33 double *f_data = gsl_vector_ptr(f, 0);
35 RUBh_minus_Q(x_data, params, f_data);
37 mu = x_data[0];
38 gamma = x_data[2];
40 f_data[3] = gamma - 2 * mu;
42 return GSL_SUCCESS;
45 HklPseudoAxisEngine *hkl_pseudo_axis_engine_soleil_sixs_med_2_2_hkl_new(void)
47 HklPseudoAxisEngine *self;
48 HklPseudoAxisEngineMode *mode;
50 self = hkl_pseudo_axis_engine_hkl_new();
52 /* mu_fixed" */
53 mode = hkl_pseudo_axis_engine_mode_new(
54 "mu_fixed",
55 NULL,
56 hkl_pseudo_axis_engine_mode_get_hkl_real,
57 hkl_pseudo_axis_engine_mode_set_hkl_real,
58 1, RUBh_minus_Q_func,
59 (size_t)0,
60 (size_t)3, "omega", "gamma", "delta");
61 hkl_pseudo_axis_engine_add_mode(self, mode);
63 /* reflectivity */
64 mode = hkl_pseudo_axis_engine_mode_new(
65 "reflectivity",
66 NULL,
67 hkl_pseudo_axis_engine_mode_get_hkl_real,
68 hkl_pseudo_axis_engine_mode_set_hkl_real,
69 1, reflectivity,
70 (size_t)0,
71 (size_t)4, "mu", "omega", "gamma", "delta");
72 hkl_pseudo_axis_engine_add_mode(self, mode);
75 hkl_pseudo_axis_engine_select_mode(self, 0);
77 return self;
80 /**************************/
81 /* MED1+2 PseudoAxeEngine */
82 /**************************/
84 HklPseudoAxisEngine *hkl_pseudo_axis_engine_soleil_sixs_med_1_2_hkl_new(void)
86 HklPseudoAxisEngine *self;
87 HklPseudoAxisEngineMode *mode;
89 self = hkl_pseudo_axis_engine_hkl_new();
91 /* pitch_fixed" */
92 mode = hkl_pseudo_axis_engine_mode_new(
93 "pitch_fixed",
94 NULL,
95 hkl_pseudo_axis_engine_mode_get_hkl_real,
96 hkl_pseudo_axis_engine_mode_set_hkl_real,
97 1, RUBh_minus_Q_func,
98 (size_t)0,
99 (size_t)3, "mu", "gamma", "delta");
100 hkl_pseudo_axis_engine_add_mode(self, mode);
102 hkl_pseudo_axis_engine_select_mode(self, 0);
104 return self;