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-2017 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 "hkl-macros-private.h"
24 #include "hkl-trajectory-private.h"
26 HklTrajectoryResult
* hkl_trajectory_result_new(void)
28 HklTrajectoryResult
*self
= HKL_MALLOC(HklTrajectoryResult
);
30 darray_init(self
->geometries
);
35 void hkl_trajectory_result_free(HklTrajectoryResult
*self
)
37 HklGeometry
**geometry
;
39 darray_foreach(geometry
, self
->geometries
){
40 hkl_geometry_free(*geometry
);
42 darray_free(self
->geometries
);
45 void hkl_trajectory_add_geometry(HklTrajectoryResult
*self
, const HklGeometry
*geometry
)
47 darray_append(self
->geometries
, hkl_geometry_new_copy(geometry
));
50 /* HklTrajectoryStats */
52 HklTrajectoryStats
*hkl_trajectory_stats_new(int n
)
54 HklTrajectoryStats
*self
= HKL_MALLOC(HklTrajectoryStats
);
57 darray_init(self
->nb_solutions
);
58 darray_init(self
->axes_min
);
59 darray_init(self
->axes_max
);
60 darray_init(self
->axes_range
);
61 darray_resize0(self
->axes_range
, n
);
66 void hkl_trajectory_stats_free(HklTrajectoryStats
*self
)
68 darray_free(self
->axes_range
);
69 darray_free(self
->axes_max
);
70 darray_free(self
->axes_min
);
71 darray_free(self
->nb_solutions
);
75 void hkl_trajectory_stats_add(HklTrajectoryStats
*self
, const HklGeometryList
*geometries
)
79 const HklGeometryListItem
*item
= hkl_geometry_list_items_first_get(geometries
);
80 const HklGeometry
*geometry
= hkl_geometry_list_item_geometry_get(item
);
81 size_t n
= darray_size(*hkl_geometry_axis_names_get(geometry
));
83 darray_append(self
->nb_solutions
, hkl_geometry_list_n_items_get(geometries
));
86 darray_resize(self
->axes_min
, n
);
87 darray_resize(self
->axes_max
, n
);
88 darray_resize(self
->axes_range
, n
);
90 hkl_geometry_axis_values_get(geometry
,
91 &darray_item(self
->axes_min
, 0), n
,
93 hkl_geometry_axis_values_get(geometry
,
94 &darray_item(self
->axes_max
, 0), n
,
99 hkl_geometry_axis_values_get(geometry
, values
, n
, HKL_UNIT_USER
);
101 if (values
[i
] < darray_item(self
->axes_min
, i
))
102 darray_item(self
->axes_min
, i
) = values
[i
];
103 else if (values
[i
] > darray_item(self
->axes_max
, i
))
104 darray_item(self
->axes_max
, i
) = values
[i
];
108 darray_item(self
->axes_range
, i
) = darray_item(self
->axes_max
, i
) - darray_item(self
->axes_min
, i
);
113 void hkl_trajectory_stats_fprintf(FILE *f
, const HklTrajectoryStats
*self
)
118 fprintf(f
, "Number of points of the trajectory: %d\n", self
->n
);
119 fprintf(f
, "Solutions per points:");
120 darray_foreach(p
, self
->nb_solutions
){
121 fprintf(f
, " %d", *p
);
124 fprintf(f
, "Axes minium:");
125 darray_foreach(v
, self
->axes_min
){
126 fprintf(f
, " %f", *v
);
129 fprintf(f
, "Axes max:");
130 darray_foreach(v
, self
->axes_max
){
131 fprintf(f
, " %f", *v
);
134 fprintf(f
, "Axes range:");
135 darray_foreach(v
, self
->axes_range
){
136 fprintf(f
, " %f", *v
);