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,376 @@
1
+ # Copyright (c) DataLab Platform Developers, BSD 3-Clause license, see LICENSE file.
2
+
3
+ """
4
+ Basic signal processing
5
+ ~~~~~~~~~~~~~~~~~~~~~~~
6
+
7
+ .. automodule:: sigima.proc.signal.base
8
+ :members:
9
+ :no-index:
10
+
11
+ Arithmetic
12
+ ~~~~~~~~~~
13
+
14
+ .. automodule:: sigima.proc.signal.arithmetic
15
+ :members:
16
+ :no-index:
17
+
18
+ Mathematical Operations
19
+ ~~~~~~~~~~~~~~~~~~~~~~~
20
+
21
+ .. automodule:: sigima.proc.signal.mathops
22
+ :members:
23
+ :no-index:
24
+
25
+ Extraction
26
+ ~~~~~~~~~~
27
+
28
+ .. automodule:: sigima.proc.signal.extraction
29
+ :members:
30
+ :no-index:
31
+
32
+ Filtering
33
+ ~~~~~~~~~
34
+
35
+ .. automodule:: sigima.proc.signal.filtering
36
+ :members:
37
+ :no-index:
38
+
39
+ Processing
40
+ ~~~~~~~~~~
41
+
42
+ .. automodule:: sigima.proc.signal.processing
43
+ :members:
44
+ :no-index:
45
+
46
+ Fourier
47
+ ~~~~~~~
48
+
49
+ .. automodule:: sigima.proc.signal.fourier
50
+ :members:
51
+ :no-index:
52
+
53
+ Fitting
54
+ ~~~~~~~
55
+
56
+ .. automodule:: sigima.proc.signal.fitting
57
+ :members:
58
+ :no-index:
59
+
60
+ Features
61
+ ~~~~~~~~
62
+
63
+ .. automodule:: sigima.proc.signal.features
64
+ :members:
65
+ :no-index:
66
+
67
+ Stability
68
+ ~~~~~~~~~
69
+
70
+ .. automodule:: sigima.proc.signal.stability
71
+ :members:
72
+ :no-index:
73
+
74
+ Analysis
75
+ ~~~~~~~~
76
+
77
+ .. automodule:: sigima.proc.signal.analysis
78
+ :members:
79
+ :no-index:
80
+ """
81
+
82
+ # pylint: disable=invalid-name # Allows short reference names like x, y, ...
83
+
84
+ # MARK: Important notes
85
+ # ---------------------
86
+ # - All `guidata.dataset.DataSet` classes must also be imported
87
+ # in the `sigima.params` module.
88
+ # - All functions decorated by `computation_function` defined in the other modules
89
+ # of this package must be imported right here.
90
+
91
+ from __future__ import annotations
92
+
93
+ # Import parameter classes from the main base module
94
+ from sigima.proc.signal.analysis import (
95
+ PulseFeaturesParam,
96
+ contrast,
97
+ extract_pulse_features,
98
+ histogram,
99
+ sampling_rate_period,
100
+ x_at_minmax,
101
+ )
102
+ from sigima.proc.signal.arithmetic import (
103
+ addition,
104
+ addition_constant,
105
+ arithmetic,
106
+ average,
107
+ difference,
108
+ difference_constant,
109
+ division,
110
+ division_constant,
111
+ product,
112
+ product_constant,
113
+ quadratic_difference,
114
+ signals_to_array,
115
+ signals_to_image,
116
+ standard_deviation,
117
+ )
118
+ from sigima.proc.signal.base import (
119
+ Wrap1to1Func,
120
+ compute_geometry_from_obj,
121
+ is_uncertainty_data_available,
122
+ restore_data_outside_roi,
123
+ signals_dy_to_array,
124
+ signals_y_to_array,
125
+ )
126
+ from sigima.proc.signal.extraction import (
127
+ extract_roi,
128
+ extract_rois,
129
+ )
130
+ from sigima.proc.signal.features import (
131
+ AbscissaParam,
132
+ DynamicParam,
133
+ FWHMParam,
134
+ OrdinateParam,
135
+ PeakDetectionParam,
136
+ bandwidth_3db,
137
+ dynamic_parameters,
138
+ full_width_at_y,
139
+ fw1e2,
140
+ fwhm,
141
+ peak_detection,
142
+ stats,
143
+ x_at_y,
144
+ y_at_x,
145
+ )
146
+ from sigima.proc.signal.filtering import (
147
+ BandPassFilterParam,
148
+ BandStopFilterParam,
149
+ BaseHighLowBandParam,
150
+ FrequencyFilterMethod,
151
+ HighPassFilterParam,
152
+ LowPassFilterParam,
153
+ PadLocation1D,
154
+ add_gaussian_noise,
155
+ add_poisson_noise,
156
+ add_uniform_noise,
157
+ bandpass,
158
+ bandstop,
159
+ frequency_filter,
160
+ gaussian_filter,
161
+ highpass,
162
+ lowpass,
163
+ moving_average,
164
+ moving_median,
165
+ wiener,
166
+ )
167
+ from sigima.proc.signal.fitting import (
168
+ PolynomialFitParam,
169
+ cdf_fit,
170
+ evaluate_fit,
171
+ exponential_fit,
172
+ extract_fit_params,
173
+ gaussian_fit,
174
+ linear_fit,
175
+ lorentzian_fit,
176
+ piecewiseexponential_fit,
177
+ planckian_fit,
178
+ polynomial_fit,
179
+ sigmoid_fit,
180
+ sinusoidal_fit,
181
+ twohalfgaussian_fit,
182
+ voigt_fit,
183
+ )
184
+ from sigima.proc.signal.fourier import (
185
+ ZeroPadding1DParam,
186
+ fft,
187
+ ifft,
188
+ magnitude_spectrum,
189
+ phase_spectrum,
190
+ psd,
191
+ zero_padding,
192
+ )
193
+ from sigima.proc.signal.mathops import (
194
+ DataTypeSParam,
195
+ PowerParam,
196
+ absolute,
197
+ astype,
198
+ complex_from_magnitude_phase,
199
+ complex_from_real_imag,
200
+ exp,
201
+ imag,
202
+ inverse,
203
+ log10,
204
+ phase,
205
+ power,
206
+ real,
207
+ sqrt,
208
+ to_cartesian,
209
+ to_polar,
210
+ transpose,
211
+ )
212
+ from sigima.proc.signal.processing import (
213
+ DetrendingParam,
214
+ InterpolationParam,
215
+ Resampling1DParam,
216
+ WindowingParam,
217
+ XYCalibrateParam,
218
+ apply_window,
219
+ calibration,
220
+ check_same_sample_rate,
221
+ clip,
222
+ convolution,
223
+ deconvolution,
224
+ derivative,
225
+ detrending,
226
+ get_nyquist_frequency,
227
+ integral,
228
+ interpolate,
229
+ normalize,
230
+ offset_correction,
231
+ resampling,
232
+ reverse_x,
233
+ xy_mode,
234
+ )
235
+ from sigima.proc.signal.stability import (
236
+ AllanVarianceParam,
237
+ allan_deviation,
238
+ allan_variance,
239
+ hadamard_variance,
240
+ modified_allan_variance,
241
+ overlapping_allan_variance,
242
+ time_deviation,
243
+ total_variance,
244
+ )
245
+
246
+ __all__ = [
247
+ "AbscissaParam",
248
+ "AllanVarianceParam",
249
+ "BandPassFilterParam",
250
+ "BandStopFilterParam",
251
+ "BaseHighLowBandParam",
252
+ "DataTypeSParam",
253
+ "DetrendingParam",
254
+ "DynamicParam",
255
+ "FWHMParam",
256
+ "FrequencyFilterMethod",
257
+ "HighPassFilterParam",
258
+ "InterpolationParam",
259
+ "LowPassFilterParam",
260
+ "OrdinateParam",
261
+ "PadLocation1D",
262
+ "PeakDetectionParam",
263
+ "PolynomialFitParam",
264
+ "PowerParam",
265
+ "PulseFeaturesParam",
266
+ "Resampling1DParam",
267
+ "WindowingParam",
268
+ "Wrap1to1Func",
269
+ "XYCalibrateParam",
270
+ "ZeroPadding1DParam",
271
+ "absolute",
272
+ "add_gaussian_noise",
273
+ "add_poisson_noise",
274
+ "add_uniform_noise",
275
+ "addition",
276
+ "addition_constant",
277
+ "allan_deviation",
278
+ "allan_variance",
279
+ "apply_window",
280
+ "arithmetic",
281
+ "astype",
282
+ "average",
283
+ "bandpass",
284
+ "bandstop",
285
+ "bandwidth_3db",
286
+ "calibration",
287
+ "cdf_fit",
288
+ "check_same_sample_rate",
289
+ "clip",
290
+ "complex_from_magnitude_phase",
291
+ "complex_from_real_imag",
292
+ "compute_geometry_from_obj",
293
+ "contrast",
294
+ "convolution",
295
+ "deconvolution",
296
+ "derivative",
297
+ "detrending",
298
+ "difference",
299
+ "difference_constant",
300
+ "division",
301
+ "division_constant",
302
+ "dynamic_parameters",
303
+ "evaluate_fit",
304
+ "exp",
305
+ "exponential_fit",
306
+ "extract_fit_params",
307
+ "extract_pulse_features",
308
+ "extract_roi",
309
+ "extract_rois",
310
+ "fft",
311
+ "frequency_filter",
312
+ "full_width_at_y",
313
+ "fw1e2",
314
+ "fwhm",
315
+ "gaussian_filter",
316
+ "gaussian_fit",
317
+ "get_nyquist_frequency",
318
+ "hadamard_variance",
319
+ "highpass",
320
+ "histogram",
321
+ "ifft",
322
+ "imag",
323
+ "integral",
324
+ "interpolate",
325
+ "inverse",
326
+ "is_uncertainty_data_available",
327
+ "linear_fit",
328
+ "log10",
329
+ "lorentzian_fit",
330
+ "lowpass",
331
+ "magnitude_spectrum",
332
+ "modified_allan_variance",
333
+ "moving_average",
334
+ "moving_median",
335
+ "normalize",
336
+ "offset_correction",
337
+ "overlapping_allan_variance",
338
+ "peak_detection",
339
+ "phase",
340
+ "phase_spectrum",
341
+ "piecewiseexponential_fit",
342
+ "planckian_fit",
343
+ "polynomial_fit",
344
+ "power",
345
+ "product",
346
+ "product_constant",
347
+ "psd",
348
+ "quadratic_difference",
349
+ "real",
350
+ "resampling",
351
+ "restore_data_outside_roi",
352
+ "reverse_x",
353
+ "sampling_rate_period",
354
+ "sigmoid_fit",
355
+ "signals_dy_to_array",
356
+ "signals_to_array",
357
+ "signals_to_image",
358
+ "signals_y_to_array",
359
+ "sinusoidal_fit",
360
+ "sqrt",
361
+ "standard_deviation",
362
+ "stats",
363
+ "time_deviation",
364
+ "to_cartesian",
365
+ "to_polar",
366
+ "total_variance",
367
+ "transpose",
368
+ "twohalfgaussian_fit",
369
+ "voigt_fit",
370
+ "wiener",
371
+ "x_at_minmax",
372
+ "x_at_y",
373
+ "xy_mode",
374
+ "y_at_x",
375
+ "zero_padding",
376
+ ]
@@ -0,0 +1,206 @@
1
+ # -*- coding: utf-8 -*-
2
+ # Licensed under the terms of the BSD 3-Clause
3
+ # (see sigima/LICENSE for details)
4
+
5
+ """
6
+ General analysis functions
7
+ ==========================
8
+
9
+ This module provides general analysis functions for signal objects:
10
+
11
+ - Histogram computation
12
+ - Other analysis operations
13
+
14
+ .. note::
15
+
16
+ Most operations use standard NumPy/SciPy functions or custom analysis routines.
17
+ """
18
+
19
+ from __future__ import annotations
20
+
21
+ import guidata.dataset as gds
22
+ import numpy as np
23
+
24
+ from sigima.config import _
25
+ from sigima.objects import (
26
+ SignalObj,
27
+ TableKind,
28
+ TableResult,
29
+ TableResultBuilder,
30
+ )
31
+ from sigima.proc.base import HistogramParam, new_signal_result
32
+ from sigima.proc.decorator import computation_function
33
+ from sigima.tools.signal import dynamic, features, pulse
34
+
35
+
36
+ @computation_function()
37
+ def histogram(src: SignalObj, p: HistogramParam) -> SignalObj:
38
+ """Compute histogram with :py:func:`numpy.histogram`
39
+
40
+ Args:
41
+ src: source signal
42
+ p: parameters
43
+
44
+ Returns:
45
+ Result signal object
46
+ """
47
+ data = src.get_masked_view().compressed()
48
+ suffix = p.get_suffix(data) # Also updates p.lower and p.upper
49
+
50
+ # Compute histogram:
51
+ y, bin_edges = np.histogram(data, bins=p.bins, range=(p.lower, p.upper))
52
+ x = (bin_edges[:-1] + bin_edges[1:]) / 2
53
+
54
+ # Note: we use the `new_signal_result` function to create the result signal object
55
+ # because the `dst_1_to_1` would copy the source signal, which is not what we want
56
+ # here (we want a brand new signal object).
57
+ dst = new_signal_result(
58
+ src,
59
+ "histogram",
60
+ suffix=suffix,
61
+ units=(src.yunit, ""),
62
+ labels=(src.ylabel, _("Counts")),
63
+ )
64
+ dst.set_xydata(x, y)
65
+ dst.set_metadata_option("shade", 0.5)
66
+ dst.set_metadata_option("curvestyle", "Steps")
67
+ return dst
68
+
69
+
70
+ class PulseFeaturesParam(gds.DataSet, title=_("Pulse features")):
71
+ """Pulse features parameters."""
72
+
73
+ signal_shape = gds.ChoiceItem(
74
+ _("Signal shape"),
75
+ [
76
+ (None, _("Auto")),
77
+ ("step", _("Step")),
78
+ ("square", _("Square")),
79
+ ],
80
+ default=None,
81
+ help=_("Signal type: auto-detect, step, or square."),
82
+ )
83
+ xstartmin = gds.FloatItem(
84
+ _("Start baseline min"),
85
+ default=0.0,
86
+ help=_("Lower X boundary for the start baseline"),
87
+ )
88
+ xstartmax = gds.FloatItem(
89
+ _("Start baseline max"),
90
+ default=0.0,
91
+ help=_("Upper X boundary for the start baseline"),
92
+ )
93
+ xendmin = gds.FloatItem(
94
+ _("End baseline min"),
95
+ default=1.0,
96
+ help=_("Lower X boundary for the end baseline"),
97
+ )
98
+ xendmax = gds.FloatItem(
99
+ _("End baseline max"),
100
+ default=1.0,
101
+ help=_("Upper X boundary for the end baseline"),
102
+ )
103
+ reference_levels = gds.ChoiceItem(
104
+ _("Rise/Fall time"),
105
+ [
106
+ ((5, 95), _("5% - 95% (High precision)")),
107
+ ((10, 90), _("10% - 90% (IEEE standard)")),
108
+ ((20, 80), _("20% - 80% (Noisy signals)")),
109
+ ((25, 75), _("25% - 75% (Alternative)")),
110
+ ],
111
+ default=(10, 90),
112
+ help=_(
113
+ "Reference levels for rise/fall time measurement. "
114
+ "10%-90% is the IEEE standard for digital signal analysis."
115
+ ),
116
+ )
117
+
118
+ def update_from_obj(self, obj: SignalObj) -> None:
119
+ """Update parameters from a signal object."""
120
+ self.xstartmin, self.xstartmax = pulse.get_start_range(obj.x)
121
+ self.xendmin, self.xendmax = pulse.get_end_range(obj.x)
122
+
123
+
124
+ @computation_function()
125
+ def extract_pulse_features(obj: SignalObj, p: PulseFeaturesParam) -> TableResult:
126
+ """Extract pulse features.
127
+
128
+ Args:
129
+ obj: The signal object from which to extract features.
130
+ p: The pulse features parameters.
131
+
132
+ Returns:
133
+ An object containing the pulse features.
134
+ """
135
+ start_ratio, stop_ratio = p.reference_levels
136
+
137
+ def func_extract_pulse_features(xydata: tuple[np.ndarray, np.ndarray]):
138
+ """Extract pulse features (internal function).
139
+
140
+ Args:
141
+ xydata: Tuple of (x, y) data arrays
142
+
143
+ Returns:
144
+ Pulse features dataclass
145
+ """
146
+ return pulse.extract_pulse_features(
147
+ xydata[0],
148
+ xydata[1],
149
+ signal_shape=p.signal_shape,
150
+ start_range=[p.xstartmin, p.xstartmax],
151
+ end_range=[p.xendmin, p.xendmax],
152
+ start_ratio=start_ratio / 100.0,
153
+ stop_ratio=stop_ratio / 100.0,
154
+ )
155
+
156
+ builder = TableResultBuilder(_("Pulse features"), kind=TableKind.PULSE_FEATURES)
157
+ builder.set_global_function(func_extract_pulse_features)
158
+ builder.hide_columns(
159
+ ["xstartmin", "xstartmax", "xendmin", "xendmax", "xplateaumin", "xplateaumax"]
160
+ )
161
+ return builder.compute(obj)
162
+
163
+
164
+ @computation_function()
165
+ def sampling_rate_period(obj: SignalObj) -> TableResult:
166
+ """Compute sampling rate and period
167
+ using the following functions:
168
+
169
+ - fs: :py:func:`sigima.tools.signal.dynamic.sampling_rate`
170
+ - T: :py:func:`sigima.tools.signal.dynamic.sampling_period`
171
+
172
+ Args:
173
+ obj: source signal
174
+
175
+ Returns:
176
+ Result properties with sampling rate and period
177
+ """
178
+ table = TableResultBuilder(_("Sampling rate and period"))
179
+ table.add(lambda xy: dynamic.sampling_rate(xy[0]), "fs")
180
+ table.add(lambda xy: dynamic.sampling_period(xy[0]), "T")
181
+ return table.compute(obj)
182
+
183
+
184
+ @computation_function()
185
+ def contrast(obj: SignalObj) -> TableResult:
186
+ """Compute contrast with :py:func:`sigima.tools.signal.misc.contrast`"""
187
+ table = TableResultBuilder(_("Contrast"))
188
+ table.add(lambda xy: features.contrast(xy[1]), "contrast")
189
+ return table.compute(obj)
190
+
191
+
192
+ @computation_function()
193
+ def x_at_minmax(obj: SignalObj) -> TableResult:
194
+ """
195
+ Compute the smallest argument at the minima and the smallest argument at the maxima.
196
+
197
+ Args:
198
+ obj: The signal object.
199
+
200
+ Returns:
201
+ An object containing the x-values at the minima and the maxima.
202
+ """
203
+ table = TableResultBuilder(_("X at min/max"))
204
+ table.add(lambda xy: xy[0][np.argmin(xy[1])], "X@Ymin")
205
+ table.add(lambda xy: xy[0][np.argmax(xy[1])], "X@Ymax")
206
+ return table.compute(obj)