ewoksid02 0.1.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. ewoksid02/__init__.py +0 -0
  2. ewoksid02/ocl/__init__.py +0 -0
  3. ewoksid02/resources/__init__.py +8 -0
  4. ewoksid02/resources/saxs_loop.json +96 -0
  5. ewoksid02/resources/template_saxs.yaml +37 -0
  6. ewoksid02/scripts/__init__.py +0 -0
  7. ewoksid02/scripts/__main__.py +70 -0
  8. ewoksid02/scripts/parsers.py +224 -0
  9. ewoksid02/scripts/saxs/__init__.py +0 -0
  10. ewoksid02/scripts/saxs/main.py +255 -0
  11. ewoksid02/scripts/saxs/slurm_python_post_script.py +3 -0
  12. ewoksid02/scripts/saxs/slurm_python_pre_script.py +5 -0
  13. ewoksid02/scripts/utils.py +21 -0
  14. ewoksid02/scripts/xpcs/__init__.py +0 -0
  15. ewoksid02/scripts/xpcs/__main__.py +3 -0
  16. ewoksid02/tasks/__init__.py +7 -0
  17. ewoksid02/tasks/averagetask.py +179 -0
  18. ewoksid02/tasks/azimuthaltask.py +272 -0
  19. ewoksid02/tasks/cavingtask.py +170 -0
  20. ewoksid02/tasks/dahuprocessingtask.py +71 -0
  21. ewoksid02/tasks/end.py +35 -0
  22. ewoksid02/tasks/id02processingtask.py +2582 -0
  23. ewoksid02/tasks/looptask.py +672 -0
  24. ewoksid02/tasks/metadatatask.py +879 -0
  25. ewoksid02/tasks/normalizationtask.py +204 -0
  26. ewoksid02/tasks/scalerstask.py +46 -0
  27. ewoksid02/tasks/secondaryscatteringtask.py +159 -0
  28. ewoksid02/tasks/sumtask.py +45 -0
  29. ewoksid02/tests/__init__.py +3 -0
  30. ewoksid02/tests/conftest.py +639 -0
  31. ewoksid02/tests/debug.py +64 -0
  32. ewoksid02/tests/test_2scat_node.py +119 -0
  33. ewoksid02/tests/test_ave_node.py +106 -0
  34. ewoksid02/tests/test_azim_node.py +89 -0
  35. ewoksid02/tests/test_cave_node.py +118 -0
  36. ewoksid02/tests/test_norm_node.py +190 -0
  37. ewoksid02/tests/test_saxs.py +69 -0
  38. ewoksid02/tests/test_sumtask.py +10 -0
  39. ewoksid02/tests/utils.py +514 -0
  40. ewoksid02/utils/__init__.py +22 -0
  41. ewoksid02/utils/average.py +158 -0
  42. ewoksid02/utils/blissdata.py +1157 -0
  43. ewoksid02/utils/caving.py +851 -0
  44. ewoksid02/utils/cupyutils.py +42 -0
  45. ewoksid02/utils/io.py +722 -0
  46. ewoksid02/utils/normalization.py +804 -0
  47. ewoksid02/utils/pyfai.py +424 -0
  48. ewoksid02/utils/secondaryscattering.py +597 -0
  49. ewoksid02-0.1.0.dist-info/METADATA +76 -0
  50. ewoksid02-0.1.0.dist-info/RECORD +54 -0
  51. ewoksid02-0.1.0.dist-info/WHEEL +5 -0
  52. ewoksid02-0.1.0.dist-info/entry_points.txt +5 -0
  53. ewoksid02-0.1.0.dist-info/licenses/LICENSE.md +20 -0
  54. ewoksid02-0.1.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,158 @@
1
+ import logging
2
+ from typing import List, Optional, Tuple
3
+
4
+ import numexpr
5
+ import numpy
6
+
7
+ logger = logging.getLogger(__name__)
8
+
9
+
10
+ def get_centrosymmetric_limits(azimuth_range: List[float]) -> Tuple[List[float], ...]:
11
+ """
12
+ Calculate the centrosymmetric limits for a given azimuth range.
13
+
14
+ Inputs:
15
+ azimuth_range (List[float]): The azimuth range as a list of two values.
16
+ Outputs:
17
+ Tuple[List[float], ...]: A tuple containing one or two lists of centrosymmetric limits.
18
+ """
19
+ if azimuth_range[0] == azimuth_range[1]:
20
+ return ([-180, 180],)
21
+
22
+ lim = numpy.array(azimuth_range)
23
+ if lim.prod() <= 0:
24
+ lim = max(abs(lim))
25
+ return ([max(-lim, -180), min(lim, 180)],)
26
+ else:
27
+ a = min(max(abs(lim)), 180)
28
+ b = max(min(abs(lim)), -180)
29
+ return ([-a, -b], [b, a])
30
+
31
+
32
+ def get_array_limit(
33
+ azimuth_range: List[float], azimuth_array: numpy.ndarray
34
+ ) -> Tuple[int, int]:
35
+ """
36
+ Get the array indices corresponding to the azimuth range.
37
+
38
+ Inputs:
39
+ azimuth_range (List[float]): The azimuth range as a list of two values.
40
+ azimuth_array (numpy.ndarray): The array of azimuth values.
41
+ Outputs:
42
+ Tuple[int, int]: The indices corresponding to the azimuth range.
43
+ """
44
+ arg_min = numpy.argmin(abs(azimuth_array - azimuth_range[0]))
45
+ arg_max = numpy.argmin(abs(azimuth_array - azimuth_range[1]))
46
+ return (arg_min, arg_max)
47
+
48
+
49
+ def calculate_average(
50
+ dataset_intensity: Optional[numpy.ndarray],
51
+ dataset_sum_signal: Optional[numpy.ndarray] = None,
52
+ dataset_sum_norm: Optional[numpy.ndarray] = None,
53
+ dataset_sum_variance: Optional[numpy.ndarray] = None,
54
+ array_ranges: Optional[List[Tuple[int, int]]] = None,
55
+ Dummy: int = -10,
56
+ calculate_variance: bool = False,
57
+ **kwargs,
58
+ ) -> Tuple[
59
+ Optional[numpy.ndarray],
60
+ Optional[numpy.ndarray],
61
+ Optional[numpy.ndarray],
62
+ Optional[numpy.ndarray],
63
+ ]:
64
+ """
65
+ Calculate the average intensity, signal normalization, variance, and sigma for a dataset.
66
+
67
+ Inputs:
68
+ dataset_intensity (Optional[numpy.ndarray]): The intensity dataset.
69
+ dataset_sum_signal (Optional[numpy.ndarray], optional): The sum signal dataset. Defaults to None.
70
+ dataset_sum_norm (Optional[numpy.ndarray], optional): The sum normalization dataset. Defaults to None.
71
+ dataset_sum_variance (Optional[numpy.ndarray], optional): The sum variance dataset. Defaults to None.
72
+ array_ranges (Optional[List[Tuple[int, int]]], optional): The ranges for averaging. Defaults to None.
73
+ Dummy (int, optional): The dummy value to replace invalid data. Defaults to -10.
74
+ Outputs:
75
+ Tuple[Optional[numpy.ndarray], Optional[numpy.ndarray], Optional[numpy.ndarray], Optional[numpy.ndarray]]:
76
+ The average intensity, signal normalization, variance, and sigma datasets.
77
+ """
78
+ sum_signal = None
79
+ sum_norm = None
80
+ sum_variance = None
81
+ dataset_average_intensity = numpy.zeros(
82
+ (dataset_intensity.shape[0], dataset_intensity.shape[-1])
83
+ )
84
+ dataset_average_signal_norm = numpy.zeros_like(dataset_average_intensity)
85
+ dataset_average_variance = numpy.zeros_like(dataset_average_intensity)
86
+ dataset_average_sigma = numpy.zeros_like(dataset_average_intensity)
87
+
88
+ if dataset_sum_signal is not None:
89
+ sum_signal = numpy.zeros(
90
+ (dataset_sum_signal.shape[0], dataset_sum_signal.shape[-1])
91
+ )
92
+ if dataset_sum_norm is not None:
93
+ sum_norm = numpy.zeros((dataset_sum_norm.shape[0], dataset_sum_norm.shape[-1]))
94
+ if dataset_sum_variance is not None:
95
+ sum_variance = numpy.zeros(
96
+ (dataset_sum_variance.shape[0], dataset_sum_variance.shape[-1])
97
+ )
98
+ array_ranges = array_ranges or [(0, -1)]
99
+
100
+ mask_slice = numpy.zeros_like(dataset_intensity)
101
+ for array_range in array_ranges:
102
+ if not isinstance(array_range, (list, tuple)):
103
+ logger.error(f"Array range {array_range} is not a list or tuple.")
104
+ continue
105
+
106
+ if len(array_range) != 2:
107
+ logger.error(
108
+ f"Array range {array_range} is not valid. It should contain two elements."
109
+ )
110
+ continue
111
+
112
+ lim_0 = int(array_range[0])
113
+ lim_1 = int(array_range[1])
114
+
115
+ mask_slice[:, lim_0:lim_1, :] = 1
116
+
117
+ dataset_average_intensity = numexpr.evaluate(
118
+ "where(mask_slice == 0, Dummy, dataset_intensity)"
119
+ )
120
+ dataset_average_intensity[dataset_average_intensity == Dummy] = numpy.nan
121
+ dataset_average_intensity = numpy.nanmean(dataset_average_intensity, axis=1)
122
+
123
+ if dataset_sum_signal is not None:
124
+ sum_signal = numexpr.evaluate(
125
+ "where(mask_slice == 0, Dummy, dataset_sum_signal)"
126
+ )
127
+ sum_signal[sum_signal == Dummy] = numpy.nan
128
+ sum_signal = numpy.nansum(sum_signal, axis=1)
129
+ if dataset_sum_norm is not None:
130
+ sum_norm = numexpr.evaluate("where(mask_slice == 0, Dummy, dataset_sum_norm)")
131
+ sum_norm[sum_norm == Dummy] = numpy.nan
132
+ sum_norm = numpy.nansum(sum_norm, axis=1)
133
+ if dataset_sum_variance is not None:
134
+ sum_variance = numexpr.evaluate(
135
+ "where(mask_slice == 0, Dummy, dataset_sum_variance)"
136
+ )
137
+ sum_variance[sum_variance == Dummy] = numpy.nan
138
+ sum_variance = numpy.nansum(sum_variance, axis=1)
139
+
140
+ if sum_signal is not None and sum_norm is not None:
141
+ dataset_average_signal_norm = numexpr.evaluate(
142
+ "where(sum_norm <= 0.0, sum_norm, sum_signal / sum_norm)"
143
+ )
144
+
145
+ if sum_variance is not None and sum_norm is not None:
146
+ dataset_average_variance = numexpr.evaluate(
147
+ "where(sum_norm <= 0.0, sum_norm, sum_variance / (sum_norm * sum_norm))"
148
+ )
149
+ dataset_average_sigma = numexpr.evaluate(
150
+ "where(sum_norm <= 0.0, sum_norm, sqrt(sum_variance) / sum_norm)"
151
+ )
152
+
153
+ return (
154
+ dataset_average_intensity,
155
+ dataset_average_signal_norm,
156
+ dataset_average_variance,
157
+ dataset_average_sigma,
158
+ )