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-2009 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>
25 #include <hkl/hkl-parameter.h>
27 HklParameter
*hkl_parameter_new(char const *name
,
28 double min
, double value
, double max
,
29 int not_to_fit
, int changed
,
30 HklUnit
const *unit
, HklUnit
const *punit
)
32 HklParameter
*parameter
;
34 parameter
= malloc(sizeof(*parameter
));
36 die("Cannot allocate memory for an HklParameter");
38 if (hkl_parameter_init(parameter
,
39 name
, min
, value
, max
,
49 HklParameter
*hkl_parameter_new_copy(HklParameter
const *self
)
51 HklParameter
*parameter
= NULL
;
53 parameter
= malloc(sizeof(*parameter
));
55 die("Cannot allocate memory for an HklParameter");
62 int hkl_parameter_init(HklParameter
*self
, char const *name
,
63 double min
, double value
, double max
,
64 int not_to_fit
, int changed
,
65 HklUnit
const *unit
, HklUnit
const *punit
)
70 && hkl_unit_compatible(unit
, punit
)) {
72 self
->range
.min
= min
;
73 self
->range
.max
= max
;
77 self
->not_to_fit
= not_to_fit
;
78 self
->changed
= changed
;
85 void hkl_parameter_free(HklParameter
*self
)
90 void hkl_parameter_set_value(HklParameter
*self
, double value
)
93 self
->changed
= HKL_TRUE
;
97 double hkl_parameter_get_value_unit(HklParameter
const *self
)
99 double factor
= hkl_unit_factor(self
->unit
, self
->punit
);
101 return self
->value
* factor
;
105 int hkl_parameter_set_value_unit(HklParameter
*self
, double value
)
107 double factor
= hkl_unit_factor(self
->unit
, self
->punit
);
109 self
->value
= value
/ factor
;
110 self
->changed
= HKL_TRUE
;
116 void hkl_parameter_get_range_unit(HklParameter
const *self
, double *min
, double *max
)
118 double factor
= hkl_unit_factor(self
->unit
, self
->punit
);
120 *min
= factor
* self
->range
.min
;
121 *max
= factor
* self
->range
.max
;
125 void hkl_parameter_set_range(HklParameter
*self
, double min
, double max
)
127 self
->range
.min
= min
;
128 self
->range
.max
= max
;
132 void hkl_parameter_set_range_unit(HklParameter
*self
, double min
, double max
)
134 double factor
= hkl_unit_factor(self
->unit
, self
->punit
);
135 self
->range
.min
= min
/ factor
;
136 self
->range
.max
= max
/ factor
;
139 void hkl_parameter_randomize(HklParameter
*self
)
141 if (!self
->not_to_fit
) {
142 double alea
= (double)rand() / (RAND_MAX
+ 1.);
143 self
->value
= self
->range
.min
144 + (self
->range
.max
- self
->range
.min
) * alea
;
145 self
->changed
= HKL_TRUE
;
149 void hkl_parameter_fprintf(FILE *f
, HklParameter
*self
)
151 double factor
= hkl_unit_factor(self
->unit
, self
->punit
);
153 fprintf(f
, "\"%s\" : %f %s [%f : %f]",
155 self
->value
* factor
,
157 self
->range
.min
* factor
,
158 self
->range
.max
* factor
);
160 fprintf(f
, "\"%s\" : %f [%f : %f]",
162 self
->value
* factor
,
163 self
->range
.min
* factor
,
164 self
->range
.max
* factor
);