sigima 0.0.1.dev0__py3-none-any.whl → 1.0.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 (264) hide show
  1. sigima/__init__.py +142 -2
  2. sigima/client/__init__.py +105 -0
  3. sigima/client/base.py +780 -0
  4. sigima/client/remote.py +469 -0
  5. sigima/client/stub.py +814 -0
  6. sigima/client/utils.py +90 -0
  7. sigima/config.py +444 -0
  8. sigima/data/logo/Sigima.svg +135 -0
  9. sigima/data/tests/annotations.json +798 -0
  10. sigima/data/tests/curve_fitting/exponential_fit.txt +511 -0
  11. sigima/data/tests/curve_fitting/gaussian_fit.txt +100 -0
  12. sigima/data/tests/curve_fitting/piecewiseexponential_fit.txt +1022 -0
  13. sigima/data/tests/curve_fitting/polynomial_fit.txt +100 -0
  14. sigima/data/tests/curve_fitting/twohalfgaussian_fit.txt +1000 -0
  15. sigima/data/tests/curve_formats/bandwidth.txt +201 -0
  16. sigima/data/tests/curve_formats/boxcar.npy +0 -0
  17. sigima/data/tests/curve_formats/datetime.txt +1001 -0
  18. sigima/data/tests/curve_formats/dynamic_parameters.txt +4000 -0
  19. sigima/data/tests/curve_formats/fw1e2.txt +301 -0
  20. sigima/data/tests/curve_formats/fwhm.txt +319 -0
  21. sigima/data/tests/curve_formats/multiple_curves.csv +29 -0
  22. sigima/data/tests/curve_formats/noised_saw.mat +0 -0
  23. sigima/data/tests/curve_formats/oscilloscope.csv +111 -0
  24. sigima/data/tests/curve_formats/other/other2/recursive2.txt +5 -0
  25. sigima/data/tests/curve_formats/other/recursive1.txt +5 -0
  26. sigima/data/tests/curve_formats/paracetamol.npy +0 -0
  27. sigima/data/tests/curve_formats/paracetamol.txt +1010 -0
  28. sigima/data/tests/curve_formats/paracetamol_dx_dy.csv +1000 -0
  29. sigima/data/tests/curve_formats/paracetamol_dy.csv +1001 -0
  30. sigima/data/tests/curve_formats/pulse1.npy +0 -0
  31. sigima/data/tests/curve_formats/pulse2.npy +0 -0
  32. sigima/data/tests/curve_formats/simple.txt +5 -0
  33. sigima/data/tests/curve_formats/spectrum.mca +2139 -0
  34. sigima/data/tests/curve_formats/square2.npy +0 -0
  35. sigima/data/tests/curve_formats/step.npy +0 -0
  36. sigima/data/tests/fabry-perot1.jpg +0 -0
  37. sigima/data/tests/fabry-perot2.jpg +0 -0
  38. sigima/data/tests/flower.npy +0 -0
  39. sigima/data/tests/image_formats/NF 180338201.scor-data +11003 -0
  40. sigima/data/tests/image_formats/binary_image.npy +0 -0
  41. sigima/data/tests/image_formats/binary_image.png +0 -0
  42. sigima/data/tests/image_formats/centroid_test.npy +0 -0
  43. sigima/data/tests/image_formats/coordinated_text/complex_image.txt +10011 -0
  44. sigima/data/tests/image_formats/coordinated_text/complex_ref_image.txt +10010 -0
  45. sigima/data/tests/image_formats/coordinated_text/image.txt +15 -0
  46. sigima/data/tests/image_formats/coordinated_text/image2.txt +14 -0
  47. sigima/data/tests/image_formats/coordinated_text/image_no_unit_no_label.txt +14 -0
  48. sigima/data/tests/image_formats/coordinated_text/image_with_nan.txt +15 -0
  49. sigima/data/tests/image_formats/coordinated_text/image_with_unit.txt +14 -0
  50. sigima/data/tests/image_formats/fiber.csv +480 -0
  51. sigima/data/tests/image_formats/fiber.jpg +0 -0
  52. sigima/data/tests/image_formats/fiber.png +0 -0
  53. sigima/data/tests/image_formats/fiber.txt +480 -0
  54. sigima/data/tests/image_formats/gaussian_spot_with_noise.npy +0 -0
  55. sigima/data/tests/image_formats/mr-brain.dcm +0 -0
  56. sigima/data/tests/image_formats/noised_gaussian.mat +0 -0
  57. sigima/data/tests/image_formats/sif_reader/nd_lum_image_no_glue.sif +0 -0
  58. sigima/data/tests/image_formats/sif_reader/raman1.sif +0 -0
  59. sigima/data/tests/image_formats/tiling.txt +10 -0
  60. sigima/data/tests/image_formats/uint16.tiff +0 -0
  61. sigima/data/tests/image_formats/uint8.tiff +0 -0
  62. sigima/data/tests/laser_beam/TEM00_z_13.jpg +0 -0
  63. sigima/data/tests/laser_beam/TEM00_z_18.jpg +0 -0
  64. sigima/data/tests/laser_beam/TEM00_z_23.jpg +0 -0
  65. sigima/data/tests/laser_beam/TEM00_z_30.jpg +0 -0
  66. sigima/data/tests/laser_beam/TEM00_z_35.jpg +0 -0
  67. sigima/data/tests/laser_beam/TEM00_z_40.jpg +0 -0
  68. sigima/data/tests/laser_beam/TEM00_z_45.jpg +0 -0
  69. sigima/data/tests/laser_beam/TEM00_z_50.jpg +0 -0
  70. sigima/data/tests/laser_beam/TEM00_z_55.jpg +0 -0
  71. sigima/data/tests/laser_beam/TEM00_z_60.jpg +0 -0
  72. sigima/data/tests/laser_beam/TEM00_z_65.jpg +0 -0
  73. sigima/data/tests/laser_beam/TEM00_z_70.jpg +0 -0
  74. sigima/data/tests/laser_beam/TEM00_z_75.jpg +0 -0
  75. sigima/data/tests/laser_beam/TEM00_z_80.jpg +0 -0
  76. sigima/enums.py +195 -0
  77. sigima/io/__init__.py +123 -0
  78. sigima/io/base.py +311 -0
  79. sigima/io/common/__init__.py +5 -0
  80. sigima/io/common/basename.py +164 -0
  81. sigima/io/common/converters.py +189 -0
  82. sigima/io/common/objmeta.py +181 -0
  83. sigima/io/common/textreader.py +58 -0
  84. sigima/io/convenience.py +157 -0
  85. sigima/io/enums.py +17 -0
  86. sigima/io/ftlab.py +395 -0
  87. sigima/io/image/__init__.py +9 -0
  88. sigima/io/image/base.py +177 -0
  89. sigima/io/image/formats.py +1016 -0
  90. sigima/io/image/funcs.py +414 -0
  91. sigima/io/signal/__init__.py +9 -0
  92. sigima/io/signal/base.py +129 -0
  93. sigima/io/signal/formats.py +290 -0
  94. sigima/io/signal/funcs.py +723 -0
  95. sigima/objects/__init__.py +260 -0
  96. sigima/objects/base.py +937 -0
  97. sigima/objects/image/__init__.py +88 -0
  98. sigima/objects/image/creation.py +556 -0
  99. sigima/objects/image/object.py +524 -0
  100. sigima/objects/image/roi.py +904 -0
  101. sigima/objects/scalar/__init__.py +57 -0
  102. sigima/objects/scalar/common.py +215 -0
  103. sigima/objects/scalar/geometry.py +502 -0
  104. sigima/objects/scalar/table.py +784 -0
  105. sigima/objects/shape.py +290 -0
  106. sigima/objects/signal/__init__.py +133 -0
  107. sigima/objects/signal/constants.py +27 -0
  108. sigima/objects/signal/creation.py +1428 -0
  109. sigima/objects/signal/object.py +444 -0
  110. sigima/objects/signal/roi.py +274 -0
  111. sigima/params.py +405 -0
  112. sigima/proc/__init__.py +96 -0
  113. sigima/proc/base.py +381 -0
  114. sigima/proc/decorator.py +330 -0
  115. sigima/proc/image/__init__.py +513 -0
  116. sigima/proc/image/arithmetic.py +335 -0
  117. sigima/proc/image/base.py +260 -0
  118. sigima/proc/image/detection.py +519 -0
  119. sigima/proc/image/edges.py +329 -0
  120. sigima/proc/image/exposure.py +406 -0
  121. sigima/proc/image/extraction.py +458 -0
  122. sigima/proc/image/filtering.py +219 -0
  123. sigima/proc/image/fourier.py +147 -0
  124. sigima/proc/image/geometry.py +661 -0
  125. sigima/proc/image/mathops.py +340 -0
  126. sigima/proc/image/measurement.py +195 -0
  127. sigima/proc/image/morphology.py +155 -0
  128. sigima/proc/image/noise.py +107 -0
  129. sigima/proc/image/preprocessing.py +182 -0
  130. sigima/proc/image/restoration.py +235 -0
  131. sigima/proc/image/threshold.py +217 -0
  132. sigima/proc/image/transformations.py +393 -0
  133. sigima/proc/signal/__init__.py +376 -0
  134. sigima/proc/signal/analysis.py +206 -0
  135. sigima/proc/signal/arithmetic.py +551 -0
  136. sigima/proc/signal/base.py +262 -0
  137. sigima/proc/signal/extraction.py +60 -0
  138. sigima/proc/signal/features.py +310 -0
  139. sigima/proc/signal/filtering.py +484 -0
  140. sigima/proc/signal/fitting.py +276 -0
  141. sigima/proc/signal/fourier.py +259 -0
  142. sigima/proc/signal/mathops.py +420 -0
  143. sigima/proc/signal/processing.py +580 -0
  144. sigima/proc/signal/stability.py +175 -0
  145. sigima/proc/title_formatting.py +227 -0
  146. sigima/proc/validation.py +272 -0
  147. sigima/tests/__init__.py +7 -0
  148. sigima/tests/common/__init__.py +0 -0
  149. sigima/tests/common/arithmeticparam_unit_test.py +26 -0
  150. sigima/tests/common/basename_unit_test.py +126 -0
  151. sigima/tests/common/client_unit_test.py +412 -0
  152. sigima/tests/common/converters_unit_test.py +77 -0
  153. sigima/tests/common/decorator_unit_test.py +176 -0
  154. sigima/tests/common/examples_unit_test.py +104 -0
  155. sigima/tests/common/kernel_normalization_unit_test.py +242 -0
  156. sigima/tests/common/roi_basic_unit_test.py +73 -0
  157. sigima/tests/common/roi_geometry_unit_test.py +171 -0
  158. sigima/tests/common/scalar_builder_unit_test.py +142 -0
  159. sigima/tests/common/scalar_unit_test.py +991 -0
  160. sigima/tests/common/shape_unit_test.py +183 -0
  161. sigima/tests/common/stat_unit_test.py +138 -0
  162. sigima/tests/common/title_formatting_unit_test.py +338 -0
  163. sigima/tests/common/tools_coordinates_unit_test.py +60 -0
  164. sigima/tests/common/transformations_unit_test.py +178 -0
  165. sigima/tests/common/validation_unit_test.py +205 -0
  166. sigima/tests/conftest.py +129 -0
  167. sigima/tests/data.py +998 -0
  168. sigima/tests/env.py +280 -0
  169. sigima/tests/guiutils.py +163 -0
  170. sigima/tests/helpers.py +532 -0
  171. sigima/tests/image/__init__.py +28 -0
  172. sigima/tests/image/binning_unit_test.py +128 -0
  173. sigima/tests/image/blob_detection_unit_test.py +312 -0
  174. sigima/tests/image/centroid_unit_test.py +170 -0
  175. sigima/tests/image/check_2d_array_unit_test.py +63 -0
  176. sigima/tests/image/contour_unit_test.py +172 -0
  177. sigima/tests/image/convolution_unit_test.py +178 -0
  178. sigima/tests/image/datatype_unit_test.py +67 -0
  179. sigima/tests/image/edges_unit_test.py +155 -0
  180. sigima/tests/image/enclosingcircle_unit_test.py +88 -0
  181. sigima/tests/image/exposure_unit_test.py +223 -0
  182. sigima/tests/image/fft2d_unit_test.py +189 -0
  183. sigima/tests/image/filtering_unit_test.py +166 -0
  184. sigima/tests/image/geometry_unit_test.py +654 -0
  185. sigima/tests/image/hough_circle_unit_test.py +147 -0
  186. sigima/tests/image/imageobj_unit_test.py +737 -0
  187. sigima/tests/image/morphology_unit_test.py +71 -0
  188. sigima/tests/image/noise_unit_test.py +57 -0
  189. sigima/tests/image/offset_correction_unit_test.py +72 -0
  190. sigima/tests/image/operation_unit_test.py +518 -0
  191. sigima/tests/image/peak2d_limits_unit_test.py +41 -0
  192. sigima/tests/image/peak2d_unit_test.py +133 -0
  193. sigima/tests/image/profile_unit_test.py +159 -0
  194. sigima/tests/image/projections_unit_test.py +121 -0
  195. sigima/tests/image/restoration_unit_test.py +141 -0
  196. sigima/tests/image/roi2dparam_unit_test.py +53 -0
  197. sigima/tests/image/roi_advanced_unit_test.py +588 -0
  198. sigima/tests/image/roi_grid_unit_test.py +279 -0
  199. sigima/tests/image/spectrum2d_unit_test.py +40 -0
  200. sigima/tests/image/threshold_unit_test.py +91 -0
  201. sigima/tests/io/__init__.py +0 -0
  202. sigima/tests/io/addnewformat_unit_test.py +125 -0
  203. sigima/tests/io/convenience_funcs_unit_test.py +470 -0
  204. sigima/tests/io/coordinated_text_format_unit_test.py +495 -0
  205. sigima/tests/io/datetime_csv_unit_test.py +198 -0
  206. sigima/tests/io/imageio_formats_test.py +41 -0
  207. sigima/tests/io/ioregistry_unit_test.py +69 -0
  208. sigima/tests/io/objmeta_unit_test.py +87 -0
  209. sigima/tests/io/readobj_unit_test.py +130 -0
  210. sigima/tests/io/readwriteobj_unit_test.py +67 -0
  211. sigima/tests/signal/__init__.py +0 -0
  212. sigima/tests/signal/analysis_unit_test.py +135 -0
  213. sigima/tests/signal/check_1d_arrays_unit_test.py +169 -0
  214. sigima/tests/signal/convolution_unit_test.py +404 -0
  215. sigima/tests/signal/datetime_unit_test.py +176 -0
  216. sigima/tests/signal/fft1d_unit_test.py +303 -0
  217. sigima/tests/signal/filters_unit_test.py +403 -0
  218. sigima/tests/signal/fitting_unit_test.py +929 -0
  219. sigima/tests/signal/fwhm_unit_test.py +111 -0
  220. sigima/tests/signal/noise_unit_test.py +128 -0
  221. sigima/tests/signal/offset_correction_unit_test.py +34 -0
  222. sigima/tests/signal/operation_unit_test.py +489 -0
  223. sigima/tests/signal/peakdetection_unit_test.py +145 -0
  224. sigima/tests/signal/processing_unit_test.py +657 -0
  225. sigima/tests/signal/pulse/__init__.py +112 -0
  226. sigima/tests/signal/pulse/crossing_times_unit_test.py +123 -0
  227. sigima/tests/signal/pulse/plateau_detection_unit_test.py +102 -0
  228. sigima/tests/signal/pulse/pulse_unit_test.py +1824 -0
  229. sigima/tests/signal/roi_advanced_unit_test.py +392 -0
  230. sigima/tests/signal/signalobj_unit_test.py +603 -0
  231. sigima/tests/signal/stability_unit_test.py +431 -0
  232. sigima/tests/signal/uncertainty_unit_test.py +611 -0
  233. sigima/tests/vistools.py +1030 -0
  234. sigima/tools/__init__.py +59 -0
  235. sigima/tools/checks.py +290 -0
  236. sigima/tools/coordinates.py +308 -0
  237. sigima/tools/datatypes.py +26 -0
  238. sigima/tools/image/__init__.py +97 -0
  239. sigima/tools/image/detection.py +451 -0
  240. sigima/tools/image/exposure.py +77 -0
  241. sigima/tools/image/extraction.py +48 -0
  242. sigima/tools/image/fourier.py +260 -0
  243. sigima/tools/image/geometry.py +190 -0
  244. sigima/tools/image/preprocessing.py +165 -0
  245. sigima/tools/signal/__init__.py +86 -0
  246. sigima/tools/signal/dynamic.py +254 -0
  247. sigima/tools/signal/features.py +135 -0
  248. sigima/tools/signal/filtering.py +171 -0
  249. sigima/tools/signal/fitting.py +1171 -0
  250. sigima/tools/signal/fourier.py +466 -0
  251. sigima/tools/signal/interpolation.py +70 -0
  252. sigima/tools/signal/peakdetection.py +126 -0
  253. sigima/tools/signal/pulse.py +1626 -0
  254. sigima/tools/signal/scaling.py +50 -0
  255. sigima/tools/signal/stability.py +258 -0
  256. sigima/tools/signal/windowing.py +90 -0
  257. sigima/worker.py +79 -0
  258. sigima-1.0.0.dist-info/METADATA +233 -0
  259. sigima-1.0.0.dist-info/RECORD +262 -0
  260. {sigima-0.0.1.dev0.dist-info → sigima-1.0.0.dist-info}/licenses/LICENSE +29 -29
  261. sigima-0.0.1.dev0.dist-info/METADATA +0 -60
  262. sigima-0.0.1.dev0.dist-info/RECORD +0 -6
  263. {sigima-0.0.1.dev0.dist-info → sigima-1.0.0.dist-info}/WHEEL +0 -0
  264. {sigima-0.0.1.dev0.dist-info → sigima-1.0.0.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,274 @@
1
+ # Copyright (c) DataLab Platform Developers, BSD 3-Clause license, see LICENSE file.
2
+
3
+ """
4
+ Signal ROI utilities
5
+ ====================
6
+
7
+ This module provides Region of Interest (ROI) classes and utilities for signal objects.
8
+
9
+ The module includes:
10
+
11
+ - `ROI1DParam`: Parameter class for 1D signal ROIs
12
+ - `SegmentROI`: Single ROI representing a segment of a signal
13
+ - `SignalROI`: Collection of signal ROIs with operations
14
+ - `create_signal_roi`: Factory function for creating signal ROI objects
15
+
16
+ These classes enable defining and working with regions of interest in 1D signal data,
17
+ supporting operations like data extraction, masking, and parameter conversion.
18
+ """
19
+
20
+ # pylint: disable=invalid-name # Allows short reference names like x, y, ...
21
+ # pylint: disable=duplicate-code
22
+
23
+ from __future__ import annotations
24
+
25
+ from typing import TYPE_CHECKING, Type
26
+
27
+ import guidata.dataset as gds
28
+ import numpy as np
29
+
30
+ from sigima.config import _
31
+ from sigima.objects import base
32
+
33
+ if TYPE_CHECKING:
34
+ from sigima.objects.signal.object import SignalObj
35
+
36
+
37
+ class ROI1DParam(base.BaseROIParam["SignalObj", "SegmentROI"]):
38
+ """Signal ROI parameters"""
39
+
40
+ # Note: in this class, the ROI parameters are stored as X coordinates
41
+
42
+ title = gds.StringItem(_("ROI title"), default="")
43
+ xmin = gds.FloatItem(_("First point coordinate"), default=0.0)
44
+ xmax = gds.FloatItem(_("Last point coordinate"), default=1.0)
45
+
46
+ def to_single_roi(self, obj: SignalObj) -> SegmentROI:
47
+ """Convert parameters to single ROI
48
+
49
+ Args:
50
+ obj: signal object
51
+
52
+ Returns:
53
+ Single ROI
54
+ """
55
+ assert isinstance(self.xmin, float) and isinstance(self.xmax, float)
56
+ return SegmentROI([self.xmin, self.xmax], False, title=self.title)
57
+
58
+ def get_data(self, obj: SignalObj) -> np.ndarray:
59
+ """Get signal data in ROI
60
+
61
+ Args:
62
+ obj: signal object
63
+
64
+ Returns:
65
+ Data in ROI
66
+ """
67
+ assert isinstance(self.xmin, float) and isinstance(self.xmax, float)
68
+ imin, imax = np.searchsorted(obj.x, [self.xmin, self.xmax])
69
+ return np.array([obj.x[imin:imax], obj.y[imin:imax]])
70
+
71
+
72
+ class SegmentROI(base.BaseSingleROI["SignalObj", ROI1DParam]):
73
+ """Segment ROI
74
+
75
+ Args:
76
+ coords: ROI coordinates (xmin, xmax)
77
+ title: ROI title
78
+ """
79
+
80
+ # Note: in this class, the ROI parameters are stored as X indices
81
+
82
+ def check_coords(self) -> None:
83
+ """Check if coords are valid
84
+
85
+ Raises:
86
+ ValueError: invalid coords
87
+ """
88
+ if len(self.coords) != 2:
89
+ raise ValueError("Invalid ROI segment coords (2 values expected)")
90
+ if self.coords[0] >= self.coords[1]:
91
+ raise ValueError("Invalid ROI segment coords (xmin >= xmax)")
92
+
93
+ def get_data(self, obj: SignalObj) -> tuple[np.ndarray, np.ndarray]:
94
+ """Get signal data in ROI
95
+
96
+ Args:
97
+ obj: signal object
98
+
99
+ Returns:
100
+ Data in ROI
101
+ """
102
+ imin, imax = self.get_indices_coords(obj)
103
+ return obj.x[imin:imax], obj.y[imin:imax]
104
+
105
+ def to_mask(self, obj: SignalObj) -> np.ndarray:
106
+ """Create mask from ROI
107
+
108
+ Args:
109
+ obj: signal object
110
+
111
+ Returns:
112
+ Mask (boolean array where True values are inside the ROI)
113
+ """
114
+ mask = np.ones_like(obj.xydata, dtype=bool)
115
+ imin, imax = self.get_indices_coords(obj)
116
+ mask[:, imin:imax] = False
117
+ return mask
118
+
119
+ # pylint: disable=unused-argument
120
+ def to_param(self, obj: SignalObj, index: int) -> ROI1DParam:
121
+ """Convert ROI to parameters
122
+
123
+ Args:
124
+ obj: object (signal), for physical-indices coordinates conversion
125
+ index: ROI index
126
+ """
127
+ gtitle = base.get_generic_roi_title(index)
128
+ param = ROI1DParam(gtitle)
129
+ param.title = self.title or gtitle
130
+ param.xmin, param.xmax = self.get_physical_coords(obj)
131
+ return param
132
+
133
+
134
+ class SignalROI(base.BaseROI["SignalObj", SegmentROI, ROI1DParam]):
135
+ """Signal Regions of Interest
136
+
137
+ Args:
138
+ inverse: if True, ROI is outside the region
139
+ """
140
+
141
+ PREFIX = "s"
142
+
143
+ def union(self) -> SignalROI:
144
+ """Return union of ROIs"""
145
+ if not self.single_rois:
146
+ return SignalROI()
147
+ coords = np.array([roi.coords for roi in self.single_rois])
148
+ # Merge overlapping segments:
149
+ sorted_coords = coords[coords[:, 0].argsort()]
150
+ merged_coords = [sorted_coords[0].tolist()]
151
+ for current in sorted_coords[1:]:
152
+ last = merged_coords[-1]
153
+ if current[0] <= last[1]: # Overlap
154
+ last[1] = max(last[1], current[1]) # Merge
155
+ else:
156
+ merged_coords.append(current.tolist())
157
+ # Create new SignalROI with merged segments:
158
+ roi = create_signal_roi(merged_coords)
159
+ return roi
160
+
161
+ def clipped(self, x_min: float, x_max: float) -> SignalROI:
162
+ """Remove parts of ROIs outside the signal range
163
+
164
+ Args:
165
+ x_min: signal minimum X value
166
+ x_max: signal maximum X value
167
+
168
+ Returns:
169
+ SignalROI object containing ROIs clipped to the specified signal range.
170
+ """
171
+ new_roi = SignalROI()
172
+ for roi in self.single_rois:
173
+ roi_min, roi_max = roi.coords
174
+ if roi_max < x_min or roi_min > x_max:
175
+ # ROI completely outside signal range: skip it
176
+ continue
177
+ # Clip ROI to signal range:
178
+ new_roi_min = max(roi_min, x_min)
179
+ new_roi_max = min(roi_max, x_max)
180
+ new_roi.add_roi(
181
+ SegmentROI(np.array([new_roi_min, new_roi_max], float), indices=False)
182
+ )
183
+ return new_roi
184
+
185
+ def inverted(self, x_min: float, x_max: float) -> SignalROI:
186
+ """Return inverted ROI (inside/outside).
187
+
188
+ Args:
189
+ x_min: signal minimum X value
190
+ x_max: signal maximum X value
191
+ Returns:
192
+ Inverted ROI
193
+ """
194
+ clipped_roi = self.clipped(x_min, x_max)
195
+ union_roi = clipped_roi.union()
196
+ roi_delimiter_list = np.array(
197
+ [roi.coords for roi in union_roi.single_rois]
198
+ ).reshape(-1)
199
+
200
+ if len(roi_delimiter_list) == 0:
201
+ # No ROIs: inverted ROI is the whole signal
202
+ raise ValueError("No ROIs defined, cannot invert")
203
+ if len(roi_delimiter_list) % 2 != 0:
204
+ # Odd number of delimiters: add signal limits
205
+ raise ValueError("Internal error: odd number of ROI delimiters")
206
+
207
+ if roi_delimiter_list[0] == x_min:
208
+ # First delimiter is signal min: remove it
209
+ roi_delimiter_list = roi_delimiter_list[1:]
210
+ else:
211
+ # Add signal min as first delimiter
212
+ roi_delimiter_list = np.insert(roi_delimiter_list, 0, x_min)
213
+
214
+ if roi_delimiter_list[-1] == x_max:
215
+ # Last delimiter is signal max: remove it
216
+ roi_delimiter_list = roi_delimiter_list[:-1]
217
+ else:
218
+ # Add signal max as last delimiter
219
+ roi_delimiter_list = np.append(roi_delimiter_list, x_max)
220
+
221
+ return create_signal_roi(np.array(roi_delimiter_list).reshape(-1, 2))
222
+
223
+ @staticmethod
224
+ def get_compatible_single_roi_classes() -> list[Type[SegmentROI]]:
225
+ """Return compatible single ROI classes"""
226
+ return [SegmentROI]
227
+
228
+ def to_mask(self, obj: SignalObj) -> np.ndarray:
229
+ """Create mask from ROI
230
+
231
+ Args:
232
+ obj: signal object
233
+
234
+ Returns:
235
+ Mask (boolean array where True values are inside the ROI)
236
+ """
237
+ mask = np.ones_like(obj.xydata, dtype=bool)
238
+ if self.single_rois:
239
+ for roi in self.single_rois:
240
+ mask &= roi.to_mask(obj)
241
+ else:
242
+ # If no single ROIs, the mask is empty (no ROI defined)
243
+ mask[:] = False
244
+ return mask
245
+
246
+
247
+ def create_signal_roi(
248
+ coords: np.ndarray | list[float] | list[list[float]],
249
+ indices: bool = False,
250
+ title: str = "",
251
+ ) -> SignalROI:
252
+ """Create Signal Regions of Interest (ROI) object.
253
+ More ROIs can be added to the object after creation, using the `add_roi` method.
254
+
255
+ Args:
256
+ coords: single ROI coordinates `[xmin, xmax]`, or multiple ROIs coordinates
257
+ `[[xmin1, xmax1], [xmin2, xmax2], ...]` (lists or NumPy arrays)
258
+ indices: if True, coordinates are indices, if False, they are physical values
259
+ (default to False for signals)
260
+ title: title
261
+
262
+ Returns:
263
+ Regions of Interest (ROI) object
264
+
265
+ Raises:
266
+ ValueError: if the number of coordinates is not even
267
+ """
268
+ coords = np.array(coords, float)
269
+ if coords.ndim == 1:
270
+ coords = coords.reshape(1, -1)
271
+ roi = SignalROI()
272
+ for row in coords:
273
+ roi.add_roi(SegmentROI(row, indices=indices, title=title))
274
+ return roi
sigima/params.py ADDED
@@ -0,0 +1,405 @@
1
+ # Copyright (c) DataLab Platform Developers, BSD 3-Clause license, see LICENSE file.
2
+
3
+ """
4
+ Parameters (:mod:`sigima.params`)
5
+ ---------------------------------
6
+
7
+ The :mod:`sigima.params` module aims at providing all the dataset parameters that are
8
+ used by the :mod:`sigima.proc` and DataLab's processors.
9
+
10
+ Those datasets are defined in other modules:
11
+
12
+ - :mod:`sigima.proc.base`
13
+ - :mod:`sigima.proc.image`
14
+ - :mod:`sigima.proc.signal`
15
+
16
+ The :mod:`sigima.params` module is thus a convenient way to import all the sets of
17
+ parameters at once.
18
+
19
+ As a matter of fact, the following import statement is equivalent to the previous one:
20
+
21
+ .. code-block:: python
22
+
23
+ # Original import statement
24
+ from sigima.proc.base import MovingAverageParam
25
+ from sigima.proc.signal import PolynomialFitParam
26
+ from sigima.proc.image.exposure import EqualizeHistParam
27
+
28
+ # Equivalent import statement
29
+ from sigima.params import MovingAverageParam, PolynomialFitParam, EqualizeHistParam
30
+
31
+ Introduction to `DataSet` parameters
32
+ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
33
+
34
+ The datasets listed in the following sections are used to define the parameters
35
+ necessary for the various computations and processing operations available in Sigima.
36
+
37
+ Each dataset is a subclass of :py:class:`guidata.dataset.datatypes.DataSet` and thus
38
+ needs to be instantiated before being used.
39
+
40
+ Here is a complete example of how to instantiate a dataset and access its parameters
41
+ with the :py:class:`sigima.params.BinningParam` dataset:
42
+
43
+ .. autodataset:: sigima.params.BinningParam
44
+ :no-index:
45
+ :shownote:
46
+
47
+ I/O parameters
48
+ ^^^^^^^^^^^^^^
49
+
50
+ .. autodataset:: sigima.io.convenience.SaveToDirectoryParam
51
+ :no-index:
52
+
53
+ Common parameters
54
+ ^^^^^^^^^^^^^^^^^
55
+
56
+ .. autodataset:: sigima.params.ArithmeticParam
57
+ :no-index:
58
+ .. autodataset:: sigima.params.ClipParam
59
+ :no-index:
60
+ .. autodataset:: sigima.params.ConstantParam
61
+ :no-index:
62
+ .. autodataset:: sigima.params.FFTParam
63
+ :no-index:
64
+ .. autodataset:: sigima.params.GaussianParam
65
+ :no-index:
66
+ .. autodataset:: sigima.params.HistogramParam
67
+ :no-index:
68
+ .. autodataset:: sigima.params.MovingAverageParam
69
+ :no-index:
70
+ .. autodataset:: sigima.params.MovingMedianParam
71
+ :no-index:
72
+ .. autodataset:: sigima.params.NormalizeParam
73
+ :no-index:
74
+ .. autodataset:: sigima.params.SpectrumParam
75
+ :no-index:
76
+
77
+ Signal parameters
78
+ ^^^^^^^^^^^^^^^^^
79
+
80
+ .. autodataset:: sigima.params.AllanVarianceParam
81
+ :no-index:
82
+ .. autodataset:: sigima.params.AngleUnitParam
83
+ :no-index:
84
+ .. autodataset:: sigima.params.BandPassFilterParam
85
+ :no-index:
86
+ .. autodataset:: sigima.params.BandStopFilterParam
87
+ :no-index:
88
+ .. autodataset:: sigima.params.DataTypeSParam
89
+ :no-index:
90
+ .. autodataset:: sigima.params.DetrendingParam
91
+ :no-index:
92
+ .. autodataset:: sigima.params.DynamicParam
93
+ :no-index:
94
+ .. autodataset:: sigima.params.AbscissaParam
95
+ :no-index:
96
+ .. autodataset:: sigima.params.OrdinateParam
97
+ :no-index:
98
+ .. autodataset:: sigima.params.FWHMParam
99
+ :no-index:
100
+ .. autodataset:: sigima.params.HighPassFilterParam
101
+ :no-index:
102
+ .. autodataset:: sigima.params.InterpolationParam
103
+ :no-index:
104
+ .. autodataset:: sigima.params.LowPassFilterParam
105
+ :no-index:
106
+ .. autodataset:: sigima.params.PeakDetectionParam
107
+ :no-index:
108
+ .. autodataset:: sigima.params.PolynomialFitParam
109
+ :no-index:
110
+ .. autodataset:: sigima.params.PowerParam
111
+ :no-index:
112
+ .. autodataset:: sigima.params.PulseFeaturesParam
113
+ :no-index:
114
+ .. autodataset:: sigima.params.Resampling1DParam
115
+ :no-index:
116
+ .. autodataset:: sigima.params.Resampling2DParam
117
+ :no-index:
118
+ .. autodataset:: sigima.params.WindowingParam
119
+ :no-index:
120
+ .. autodataset:: sigima.params.XYCalibrateParam
121
+ :no-index:
122
+ .. autodataset:: sigima.params.ZeroPadding1DParam
123
+ :no-index:
124
+
125
+ Image parameters
126
+ ^^^^^^^^^^^^^^^^
127
+
128
+ Base image parameters
129
+ ~~~~~~~~~~~~~~~~~~~~~
130
+
131
+ .. autodataset:: sigima.params.GridParam
132
+ :no-index:
133
+
134
+ Detection parameters
135
+ ~~~~~~~~~~~~~~~~~~~~
136
+
137
+ .. autodataset:: sigima.params.BlobDOGParam
138
+ :no-index:
139
+ .. autodataset:: sigima.params.BlobDOHParam
140
+ :no-index:
141
+ .. autodataset:: sigima.params.BlobLOGParam
142
+ :no-index:
143
+ .. autodataset:: sigima.params.BlobOpenCVParam
144
+ :no-index:
145
+ .. autodataset:: sigima.params.ContourShapeParam
146
+ :no-index:
147
+ .. autodataset:: sigima.params.Peak2DDetectionParam
148
+ :no-index:
149
+ .. autodataset:: sigima.params.HoughCircleParam
150
+ :no-index:
151
+
152
+ Edge detection parameters
153
+ ~~~~~~~~~~~~~~~~~~~~~~~~~
154
+
155
+ .. autodataset:: sigima.params.CannyParam
156
+ :no-index:
157
+
158
+ Exposure correction parameters
159
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
160
+
161
+ .. autodataset:: sigima.params.AdjustGammaParam
162
+ :no-index:
163
+ .. autodataset:: sigima.params.AdjustLogParam
164
+ :no-index:
165
+ .. autodataset:: sigima.params.AdjustSigmoidParam
166
+ :no-index:
167
+ .. autodataset:: sigima.params.EqualizeAdaptHistParam
168
+ :no-index:
169
+ .. autodataset:: sigima.params.EqualizeHistParam
170
+ :no-index:
171
+ .. autodataset:: sigima.params.RescaleIntensityParam
172
+ :no-index:
173
+ .. autodataset:: sigima.params.FlatFieldParam
174
+ :no-index:
175
+ .. autodataset:: sigima.params.XYZCalibrateParam
176
+ :no-index:
177
+
178
+ Extraction parameters
179
+ ~~~~~~~~~~~~~~~~~~~~~~
180
+
181
+ .. autodataset:: sigima.params.AverageProfileParam
182
+ :no-index:
183
+ .. autodataset:: sigima.params.LineProfileParam
184
+ :no-index:
185
+ .. autodataset:: sigima.params.RadialProfileParam
186
+ :no-index:
187
+ .. autodataset:: sigima.params.SegmentProfileParam
188
+ :no-index:
189
+ .. autoclass:: sigima.params.Direction
190
+ :no-index:
191
+ .. autodataset:: sigima.params.ROIGridParam
192
+ :no-index:
193
+
194
+ Filtering parameters
195
+ ~~~~~~~~~~~~~~~~~~~~
196
+
197
+ .. autodataset:: sigima.params.ButterworthParam
198
+ :no-index:
199
+ .. autofunction:: sigima.params.GaussianFreqFilterParam
200
+ :no-index:
201
+
202
+ Fourier analysis parameters
203
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~
204
+
205
+ .. autodataset:: sigima.params.ZeroPadding2DParam
206
+ :no-index:
207
+
208
+ Geometry parameters
209
+ ~~~~~~~~~~~~~~~~~~~
210
+
211
+ .. autodataset:: sigima.params.BinningParam
212
+ :no-index:
213
+ .. autodataset:: sigima.params.ResizeParam
214
+ :no-index:
215
+ .. autodataset:: sigima.params.RotateParam
216
+ :no-index:
217
+ .. autodataset:: sigima.params.TranslateParam
218
+ :no-index:
219
+
220
+ Mathematical operation parameters
221
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
222
+
223
+ .. autodataset:: sigima.params.DataTypeIParam
224
+ :no-index:
225
+ .. autodataset:: sigima.params.Log10ZPlusNParam
226
+ :no-index:
227
+
228
+ Morphological parameters
229
+ ~~~~~~~~~~~~~~~~~~~~~~~~
230
+
231
+ .. autodataset:: sigima.params.MorphologyParam
232
+ :no-index:
233
+
234
+ Restoration parameters
235
+ ~~~~~~~~~~~~~~~~~~~~~~
236
+
237
+ .. autodataset:: sigima.params.DenoiseBilateralParam
238
+ :no-index:
239
+ .. autodataset:: sigima.params.DenoiseTVParam
240
+ :no-index:
241
+ .. autodataset:: sigima.params.DenoiseWaveletParam
242
+ :no-index:
243
+
244
+ Threshold parameters
245
+ ~~~~~~~~~~~~~~~~~~~~
246
+
247
+ .. autodataset:: sigima.params.ThresholdParam
248
+ :no-index:
249
+ """
250
+
251
+ __all__ = [
252
+ "AbscissaParam",
253
+ "AdjustGammaParam",
254
+ "AdjustLogParam",
255
+ "AdjustSigmoidParam",
256
+ "AllanVarianceParam",
257
+ "AngleUnitParam",
258
+ "ArithmeticParam",
259
+ "AverageProfileParam",
260
+ "BandPassFilterParam",
261
+ "BandStopFilterParam",
262
+ "BinningParam",
263
+ "BlobDOGParam",
264
+ "BlobDOHParam",
265
+ "BlobLOGParam",
266
+ "BlobOpenCVParam",
267
+ "ButterworthParam",
268
+ "CannyParam",
269
+ "ClipParam",
270
+ "ConstantParam",
271
+ "ContourShapeParam",
272
+ "DataTypeIParam",
273
+ "DataTypeSParam",
274
+ "DenoiseBilateralParam",
275
+ "DenoiseTVParam",
276
+ "DenoiseWaveletParam",
277
+ "DetrendingParam",
278
+ "Direction",
279
+ "DynamicParam",
280
+ "EqualizeAdaptHistParam",
281
+ "EqualizeHistParam",
282
+ "FFTParam",
283
+ "FWHMParam",
284
+ "FlatFieldParam",
285
+ "GaussianFreqFilterParam",
286
+ "GaussianParam",
287
+ "GridParam",
288
+ "HighPassFilterParam",
289
+ "HistogramParam",
290
+ "HoughCircleParam",
291
+ "InterpolationParam",
292
+ "LineProfileParam",
293
+ "Log10ZPlusNParam",
294
+ "LowPassFilterParam",
295
+ "MorphologyParam",
296
+ "MovingAverageParam",
297
+ "MovingMedianParam",
298
+ "NormalizeParam",
299
+ "OrdinateParam",
300
+ "Peak2DDetectionParam",
301
+ "PeakDetectionParam",
302
+ "PhaseParam",
303
+ "PolynomialFitParam",
304
+ "PowerParam",
305
+ "PulseFeaturesParam",
306
+ "ROIGridParam",
307
+ "RadialProfileParam",
308
+ "Resampling1DParam",
309
+ "Resampling2DParam",
310
+ "RescaleIntensityParam",
311
+ "ResizeParam",
312
+ "RotateParam",
313
+ "SaveToDirectoryParam",
314
+ "SegmentProfileParam",
315
+ "SignalsToImageParam",
316
+ "SpectrumParam",
317
+ "ThresholdParam",
318
+ "TranslateParam",
319
+ "UniformCoordsParam",
320
+ "WindowingParam",
321
+ "XYCalibrateParam",
322
+ "XYZCalibrateParam",
323
+ "ZeroPadding1DParam",
324
+ "ZeroPadding2DParam",
325
+ ]
326
+
327
+ from sigima.io.convenience import SaveToDirectoryParam
328
+ from sigima.proc.base import (
329
+ AngleUnitParam,
330
+ ArithmeticParam,
331
+ ClipParam,
332
+ ConstantParam,
333
+ FFTParam,
334
+ GaussianParam,
335
+ HistogramParam,
336
+ MovingAverageParam,
337
+ MovingMedianParam,
338
+ NormalizeParam,
339
+ PhaseParam,
340
+ SignalsToImageParam,
341
+ SpectrumParam,
342
+ )
343
+ from sigima.proc.image import (
344
+ AdjustGammaParam,
345
+ AdjustLogParam,
346
+ AdjustSigmoidParam,
347
+ AverageProfileParam,
348
+ BinningParam,
349
+ BlobDOGParam,
350
+ BlobDOHParam,
351
+ BlobLOGParam,
352
+ BlobOpenCVParam,
353
+ ButterworthParam,
354
+ CannyParam,
355
+ ContourShapeParam,
356
+ DataTypeIParam,
357
+ DenoiseBilateralParam,
358
+ DenoiseTVParam,
359
+ DenoiseWaveletParam,
360
+ Direction,
361
+ EqualizeAdaptHistParam,
362
+ EqualizeHistParam,
363
+ FlatFieldParam,
364
+ GaussianFreqFilterParam,
365
+ GridParam,
366
+ HoughCircleParam,
367
+ LineProfileParam,
368
+ Log10ZPlusNParam,
369
+ MorphologyParam,
370
+ Peak2DDetectionParam,
371
+ RadialProfileParam,
372
+ Resampling2DParam,
373
+ RescaleIntensityParam,
374
+ ResizeParam,
375
+ ROIGridParam,
376
+ RotateParam,
377
+ SegmentProfileParam,
378
+ ThresholdParam,
379
+ TranslateParam,
380
+ UniformCoordsParam,
381
+ XYZCalibrateParam,
382
+ ZeroPadding2DParam,
383
+ )
384
+ from sigima.proc.signal import (
385
+ AbscissaParam,
386
+ AllanVarianceParam,
387
+ BandPassFilterParam,
388
+ BandStopFilterParam,
389
+ DataTypeSParam,
390
+ DetrendingParam,
391
+ DynamicParam,
392
+ FWHMParam,
393
+ HighPassFilterParam,
394
+ InterpolationParam,
395
+ LowPassFilterParam,
396
+ OrdinateParam,
397
+ PeakDetectionParam,
398
+ PolynomialFitParam,
399
+ PowerParam,
400
+ PulseFeaturesParam,
401
+ Resampling1DParam,
402
+ WindowingParam,
403
+ XYCalibrateParam,
404
+ ZeroPadding1DParam,
405
+ )