phasorpy 0.2__cp312-cp312-macosx_10_13_x86_64.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.
phasorpy/py.typed ADDED
File without changes
phasorpy/utils.py ADDED
@@ -0,0 +1,368 @@
1
+ """Utility functions.
2
+
3
+ The ``phasorpy.utils`` module provides auxiliary and convenience functions
4
+ that do not naturally fit into other modules.
5
+
6
+ """
7
+
8
+ from __future__ import annotations
9
+
10
+ __all__ = [
11
+ 'anscombe_transformation',
12
+ 'anscombe_transformation_inverse',
13
+ 'number_threads',
14
+ 'spectral_vector_denoise',
15
+ ]
16
+
17
+ import math
18
+ import os
19
+ from typing import TYPE_CHECKING
20
+
21
+ if TYPE_CHECKING:
22
+ from ._typing import Any, NDArray, ArrayLike, DTypeLike, Literal, Sequence
23
+
24
+ import numpy
25
+
26
+ from ._phasorpy import (
27
+ _anscombe,
28
+ _anscombe_inverse,
29
+ _anscombe_inverse_approx,
30
+ _phasor_from_signal_vector,
31
+ _signal_denoise_vector,
32
+ )
33
+ from ._utils import parse_harmonic
34
+
35
+
36
+ def spectral_vector_denoise(
37
+ signal: ArrayLike,
38
+ /,
39
+ spectral_vector: ArrayLike | None = None,
40
+ *,
41
+ axis: int = -1,
42
+ harmonic: int | Sequence[int] | Literal['all'] | str | None = None,
43
+ sigma: float = 0.05,
44
+ vmin: float | None = None,
45
+ dtype: DTypeLike | None = None,
46
+ num_threads: int | None = None,
47
+ ) -> NDArray[Any]:
48
+ """Return spectral-vector-denoised signal.
49
+
50
+ The spectral vector denoising algorithm is based on a Gaussian weighted
51
+ average calculation, with weights obtained in n-dimensional Chebyshev or
52
+ Fourier space [4]_.
53
+
54
+ Parameters
55
+ ----------
56
+ signal : array_like
57
+ Hyperspectral data to be denoised.
58
+ A minimum of three samples are required along `axis`.
59
+ The samples must be uniformly spaced.
60
+ spectral_vector : array_like, optional
61
+ Spectral vector.
62
+ For example, phasor coordinates, PCA projected phasor coordinates,
63
+ or Chebyshev coefficients.
64
+ Must be of same shape as `signal` with `axis` removed and axis
65
+ containing spectral space appended.
66
+ If None (default), phasor coordinates are calculated at specified
67
+ `harmonic`.
68
+ axis : int, optional, default: -1
69
+ Axis over which `spectral_vector` is computed if not provided.
70
+ The default is the last axis (-1).
71
+ harmonic : int, sequence of int, or 'all', optional
72
+ Harmonics to include in calculating `spectral_vector`.
73
+ If `'all'`, include all harmonics for `signal` samples along `axis`.
74
+ Else, harmonics must be at least one and no larger than half the
75
+ number of `signal` samples along `axis`.
76
+ The default is the first harmonic (fundamental frequency).
77
+ A minimum of `harmonic * 2 + 1` samples are required along `axis`
78
+ to calculate correct phasor coordinates at `harmonic`.
79
+ sigma : float, default: 0.05
80
+ Width of Gaussian filter in spectral vector space.
81
+ Weighted averages are calculated using the spectra of signal items
82
+ within an spectral vector Euclidean distance of `3 * sigma` and
83
+ intensity above `vmin`.
84
+ vmin : float, optional
85
+ Signal intensity along `axis` below which not to include in denoising.
86
+ dtype : dtype_like, optional
87
+ Data type of output arrays. Either float32 or float64.
88
+ The default is float64 unless the `signal` is float32.
89
+ num_threads : int, optional
90
+ Number of OpenMP threads to use for parallelization.
91
+ By default, multi-threading is disabled.
92
+ If zero, up to half of logical CPUs are used.
93
+ OpenMP may not be available on all platforms.
94
+
95
+ Returns
96
+ -------
97
+ ndarray
98
+ Denoised signal of `dtype`.
99
+ Spectra with integrated intensity below `vmin` are unchanged.
100
+
101
+ References
102
+ ----------
103
+
104
+ .. [4] Harman RC, Lang RT, Kercher EM, Leven P, and Spring BQ.
105
+ `Denoising multiplexed microscopy images in n-dimensional spectral space
106
+ <https://doi.org/10.1364/BOE.463979>`_.
107
+ *Biomedical Optics Express*, 13(8): 4298-4309 (2022)
108
+
109
+ Examples
110
+ --------
111
+ Denoise a hyperspectral image with a Gaussian filter width of 0.1 in
112
+ spectral vector space using first and second harmonic:
113
+
114
+ >>> signal = numpy.random.randint(0, 255, (8, 16, 16))
115
+ >>> spectral_vector_denoise(signal, axis=0, sigma=0.1, harmonic=[1, 2])
116
+ array([[[...]]])
117
+
118
+ """
119
+ num_threads = number_threads(num_threads)
120
+
121
+ signal = numpy.asarray(signal)
122
+ if axis == -1 or axis == signal.ndim - 1:
123
+ axis = -1
124
+ else:
125
+ signal = numpy.moveaxis(signal, axis, -1)
126
+ shape = signal.shape
127
+ samples = shape[-1]
128
+
129
+ if harmonic is None:
130
+ harmonic = 1
131
+ harmonic, _ = parse_harmonic(harmonic, samples // 2)
132
+ num_harmonics = len(harmonic)
133
+
134
+ if vmin is None or vmin < 0.0:
135
+ vmin = 0.0
136
+
137
+ sincos = numpy.empty((num_harmonics, samples, 2))
138
+ for i, h in enumerate(harmonic):
139
+ phase = numpy.linspace(
140
+ 0,
141
+ h * math.pi * 2.0,
142
+ samples,
143
+ endpoint=False,
144
+ dtype=numpy.float64,
145
+ )
146
+ sincos[i, :, 0] = numpy.cos(phase)
147
+ sincos[i, :, 1] = numpy.sin(phase)
148
+
149
+ signal = numpy.ascontiguousarray(signal).reshape(-1, samples)
150
+ size = signal.shape[0]
151
+
152
+ if dtype is None:
153
+ if signal.dtype.char == 'f':
154
+ dtype = signal.dtype
155
+ else:
156
+ dtype = numpy.float64
157
+ dtype = numpy.dtype(dtype)
158
+ if dtype.char not in {'d', 'f'}:
159
+ raise ValueError('dtype is not floating point')
160
+
161
+ if spectral_vector is None:
162
+ spectral_vector = numpy.zeros((size, num_harmonics * 2), dtype=dtype)
163
+ _phasor_from_signal_vector(
164
+ spectral_vector, signal, sincos, num_threads
165
+ )
166
+ else:
167
+ spectral_vector = numpy.ascontiguousarray(spectral_vector, dtype=dtype)
168
+ if spectral_vector.shape[:-1] != shape[:-1]:
169
+ raise ValueError('signal and spectral_vector shape mismatch')
170
+ spectral_vector = spectral_vector.reshape(
171
+ -1, spectral_vector.shape[-1]
172
+ )
173
+
174
+ if dtype == signal.dtype:
175
+ denoised = signal.copy()
176
+ else:
177
+ denoised = numpy.zeros(signal.shape, dtype=dtype)
178
+ denoised[:] = signal
179
+ integrated = numpy.zeros(size, dtype=dtype)
180
+ _signal_denoise_vector(
181
+ denoised, integrated, signal, spectral_vector, sigma, vmin, num_threads
182
+ )
183
+
184
+ denoised = denoised.reshape(shape)
185
+ if axis != -1:
186
+ denoised = numpy.moveaxis(denoised, -1, axis)
187
+ return denoised
188
+
189
+
190
+ def anscombe_transformation(
191
+ data: ArrayLike,
192
+ /,
193
+ **kwargs: Any,
194
+ ) -> NDArray[Any]:
195
+ r"""Return Anscombe variance-stabilizing transformation.
196
+
197
+ The Anscombe transformation normalizes the standard deviation of noisy,
198
+ Poisson-distributed data.
199
+ It can be used to transform un-normalized phasor coordinates to
200
+ approximate standard Gaussian distributions.
201
+
202
+ Parameters
203
+ ----------
204
+ data: array_like
205
+ Noisy Poisson-distributed data to be transformed.
206
+ **kwargs
207
+ Optional `arguments passed to numpy universal functions
208
+ <https://numpy.org/doc/stable/reference/ufuncs.html#ufuncs-kwargs>`_.
209
+
210
+ Returns
211
+ -------
212
+ ndarray
213
+ Anscombe-transformed data with variance of approximately 1.
214
+
215
+ Notes
216
+ -----
217
+ The Anscombe transformation according to [1]_:
218
+
219
+ .. math::
220
+
221
+ z = 2 \cdot \sqrt{x + 3 / 8}
222
+
223
+ References
224
+ ----------
225
+
226
+ .. [1] Anscombe FJ.
227
+ `The transformation of Poisson, binomial and negative-binomial data
228
+ <https://doi.org/10.2307/2332343>`_.
229
+ *Biometrika*, 35(3-4): 246-254 (1948)
230
+
231
+ Examples
232
+ --------
233
+
234
+ >>> z = anscombe_transformation(numpy.random.poisson(10, 10000))
235
+ >>> numpy.allclose(numpy.std(z), 1.0, atol=0.1)
236
+ True
237
+
238
+ """
239
+ return _anscombe(data, **kwargs) # type: ignore[no-any-return]
240
+
241
+
242
+ def anscombe_transformation_inverse(
243
+ data: ArrayLike,
244
+ /,
245
+ *,
246
+ approx: bool = False,
247
+ **kwargs: Any,
248
+ ) -> NDArray[Any]:
249
+ r"""Return inverse Anscombe transformation.
250
+
251
+ Parameters
252
+ ----------
253
+ data: array_like
254
+ Anscombe-transformed data.
255
+ approx: bool, default: False
256
+ If true, return approximation of exact unbiased inverse.
257
+ **kwargs
258
+ Optional `arguments passed to numpy universal functions
259
+ <https://numpy.org/doc/stable/reference/ufuncs.html#ufuncs-kwargs>`_.
260
+
261
+ Returns
262
+ -------
263
+ ndarray
264
+ Inverse Anscombe-transformed data.
265
+
266
+ Notes
267
+ -----
268
+ The inverse Anscombe transformation according to [1]_:
269
+
270
+ .. math::
271
+
272
+ x = (z / 2.0)^2 - 3 / 8
273
+
274
+ The approximate inverse Anscombe transformation according to [2]_ and [3]_:
275
+
276
+ .. math::
277
+
278
+ x = 1/4 \cdot z^2{2}
279
+ + 1/4 \cdot \sqrt{3/2} \cdot z^{-1}
280
+ - 11/8 \cdot z^{-2}
281
+ + 5/8 \cdot \sqrt(3/2) \cdot z^{-3}
282
+ - 1/8
283
+
284
+ References
285
+ ----------
286
+
287
+ .. [2] Makitalo M, and Foi A.
288
+ `A closed-form approximation of the exact unbiased inverse of the
289
+ Anscombe variance-stabilizing transformation
290
+ <https://doi.org/10.1109/TIP.2011.2121085>`_.
291
+ IEEE Trans Image Process, 20(9): 2697-8 (2011).
292
+
293
+ .. [3] Makitalo M, and Foi A
294
+ `Optimal inversion of the generalized Anscombe transformation for
295
+ Poisson-Gaussian noise
296
+ <https://doi.org/10.1109/TIP.2012.2202675>`_,
297
+ IEEE Trans Image Process, 22(1): 91-103 (2013)
298
+
299
+ Examples
300
+ --------
301
+
302
+ >>> x = numpy.random.poisson(10, 100)
303
+ >>> x2 = anscombe_transformation_inverse(anscombe_transformation(x))
304
+ >>> numpy.allclose(x, x2, atol=1e-3)
305
+ True
306
+
307
+ """
308
+ if approx:
309
+ return _anscombe_inverse_approx( # type: ignore[no-any-return]
310
+ data, **kwargs
311
+ )
312
+ return _anscombe_inverse(data, **kwargs) # type: ignore[no-any-return]
313
+
314
+
315
+ def number_threads(
316
+ num_threads: int | None = None,
317
+ max_threads: int | None = None,
318
+ /,
319
+ ) -> int:
320
+ """Return number of threads for parallel computations on CPU cores.
321
+
322
+ This function is used to parse ``num_threads`` parameters.
323
+
324
+ Parameters
325
+ ----------
326
+ num_threads : int, optional
327
+ Number of threads to use for parallel computations on CPU cores.
328
+ If None (default), return 1, disabling multi-threading.
329
+ If greater than zero, return value up to `max_threads` if set.
330
+ If zero, return the value of the ``PHASORPY_NUM_THREADS`` environment
331
+ variable if set, else half the CPU cores up to `max_threads` or 32.
332
+ max_threads : int, optional
333
+ Maximum number of threads to return.
334
+
335
+ Examples
336
+ --------
337
+ >>> number_threads()
338
+ 1
339
+ >>> number_threads(0) # doctest: +SKIP
340
+ 8
341
+
342
+ """
343
+ if num_threads is None or num_threads < 0:
344
+ # disable multi-threading by default
345
+ return 1
346
+ if num_threads == 0:
347
+ # return default number of threads
348
+ if max_threads is None:
349
+ max_threads = 32
350
+ else:
351
+ max_threads = max(max_threads, 1)
352
+ if 'PHASORPY_NUM_THREADS' in os.environ:
353
+ return min(
354
+ max_threads, max(1, int(os.environ['PHASORPY_NUM_THREADS']))
355
+ )
356
+ cpu_count: int | None
357
+ if hasattr(os, 'sched_getaffinity'):
358
+ cpu_count = len(os.sched_getaffinity(0))
359
+ else:
360
+ # sched_getaffinity not available on Windows
361
+ cpu_count = os.cpu_count()
362
+ if cpu_count is None:
363
+ return 1
364
+ return min(max_threads, max(1, cpu_count // 2))
365
+ # return num_threads up to max_threads
366
+ if max_threads is None:
367
+ return num_threads
368
+ return min(num_threads, max(max_threads, 1))
phasorpy/version.py ADDED
@@ -0,0 +1,71 @@
1
+ """Version information."""
2
+
3
+ from __future__ import annotations
4
+
5
+ __version__ = '0.2'
6
+
7
+
8
+ def versions(
9
+ *, sep: str = '\n', dash: str = '-', verbose: bool = False
10
+ ) -> str:
11
+ """Return versions of installed packages that phasorpy depends on.
12
+
13
+ Parameters
14
+ ----------
15
+ sep : str, optional
16
+ Separator between version items. The default is a newline character.
17
+ dash : str, optional
18
+ Separator between module name and version.
19
+ verbose : bool, optional
20
+ Include paths to Python interpreter and modules.
21
+
22
+ Example
23
+ -------
24
+ >>> print(versions())
25
+ Python-3...
26
+ phasorpy-0...
27
+ numpy-...
28
+ ...
29
+
30
+ """
31
+ import os
32
+ import sys
33
+
34
+ if verbose:
35
+ version_strings = [f'Python{dash}{sys.version} ({sys.executable})']
36
+ else:
37
+ version_strings = [f'Python{dash}{sys.version.split()[0]}']
38
+
39
+ for module in (
40
+ 'phasorpy',
41
+ 'numpy',
42
+ 'tifffile',
43
+ 'imagecodecs',
44
+ 'lfdfiles',
45
+ 'sdtfile',
46
+ 'ptufile',
47
+ 'matplotlib',
48
+ 'scipy',
49
+ 'skimage',
50
+ 'sklearn',
51
+ 'pandas',
52
+ 'xarray',
53
+ 'click',
54
+ 'pooch',
55
+ ):
56
+ try:
57
+ __import__(module)
58
+ except ModuleNotFoundError:
59
+ version_strings.append(f'{module.lower()}{dash}n/a')
60
+ continue
61
+ lib = sys.modules[module]
62
+ ver = f"{module.lower()}{dash}{getattr(lib, '__version__', 'unknown')}"
63
+ if verbose:
64
+ try:
65
+ path = getattr(lib, '__file__')
66
+ except NameError:
67
+ pass
68
+ else:
69
+ ver += f' ({os.path.dirname(path)})'
70
+ version_strings.append(ver)
71
+ return sep.join(version_strings)
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2022-2024 PhasorPy Contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,78 @@
1
+ Metadata-Version: 2.1
2
+ Name: phasorpy
3
+ Version: 0.2
4
+ Summary: Analysis of fluorescence lifetime and hyperspectral images using the phasor approach
5
+ Author: PhasorPy Contributors
6
+ License: MIT
7
+ Project-URL: Homepage, https://www.phasorpy.org
8
+ Project-URL: Documentation, https://www.phasorpy.org/docs/stable/
9
+ Project-URL: Download, https://pypi.org/project/phasorpy/#files
10
+ Project-URL: Source code, https://github.com/phasorpy/phasorpy
11
+ Project-URL: Issue tracker, https://github.com/phasorpy/phasorpy/issues
12
+ Project-URL: Release notes, https://www.phasorpy.org/docs/stable/release
13
+ Classifier: Development Status :: 3 - Alpha
14
+ Classifier: Intended Audience :: Developers
15
+ Classifier: Intended Audience :: Science/Research
16
+ Classifier: License :: OSI Approved :: MIT License
17
+ Classifier: Programming Language :: Python
18
+ Classifier: Topic :: Software Development :: Libraries :: Python Modules
19
+ Classifier: Operating System :: OS Independent
20
+ Classifier: Programming Language :: Python :: 3
21
+ Classifier: Programming Language :: Python :: 3 :: Only
22
+ Classifier: Programming Language :: Python :: 3.10
23
+ Classifier: Programming Language :: Python :: 3.11
24
+ Classifier: Programming Language :: Python :: 3.12
25
+ Classifier: Programming Language :: Python :: 3.13
26
+ Requires-Python: >=3.10
27
+ Description-Content-Type: text/markdown
28
+ License-File: LICENSE.txt
29
+ Requires-Dist: numpy>=1.24.0
30
+ Requires-Dist: matplotlib>=3.7.0
31
+ Requires-Dist: scipy>=1.11.0
32
+ Requires-Dist: click
33
+ Requires-Dist: pooch
34
+ Requires-Dist: tqdm
35
+ Requires-Dist: xarray>=2023.4.0
36
+ Requires-Dist: tifffile>=2024.8.30
37
+ Provides-Extra: docs
38
+ Requires-Dist: sphinx; extra == "docs"
39
+ Requires-Dist: sphinx-issues; extra == "docs"
40
+ Requires-Dist: sphinx_gallery; extra == "docs"
41
+ Requires-Dist: sphinx-copybutton; extra == "docs"
42
+ Requires-Dist: sphinx_click; extra == "docs"
43
+ Requires-Dist: pydata-sphinx-theme>=0.16.0; extra == "docs"
44
+ Requires-Dist: numpydoc; extra == "docs"
45
+ Provides-Extra: test
46
+ Requires-Dist: pytest; extra == "test"
47
+ Requires-Dist: pytest-cov; extra == "test"
48
+ Requires-Dist: pytest-runner; extra == "test"
49
+ Requires-Dist: pytest-doctestplus; extra == "test"
50
+ Requires-Dist: coverage; extra == "test"
51
+ Provides-Extra: all
52
+ Requires-Dist: lfdfiles>=2024.5.24; extra == "all"
53
+ Requires-Dist: sdtfile>=2024.5.24; extra == "all"
54
+ Requires-Dist: ptufile>=2024.9.14; extra == "all"
55
+
56
+ # PhasorPy
57
+
58
+ PhasorPy is an open-source Python library for the analysis of fluorescence
59
+ lifetime and hyperspectral images using the phasor approach.
60
+
61
+ - [Homepage](https://www.phasorpy.org)
62
+ - [Documentation](https://www.phasorpy.org/docs/stable/)
63
+ - [Source code](https://github.com/phasorpy/phasorpy)
64
+ - [Download releases](https://pypi.org/project/phasorpy/#files)
65
+ - [Data files](https://zenodo.org/communities/phasorpy/)
66
+ - [Issues and questions](https://github.com/phasorpy/phasorpy/issues)
67
+
68
+ PhasorPy is a community-maintained project.
69
+ [Contributions](https://www.phasorpy.org/docs/stable/contributing/)
70
+ in the form of bug reports, bug fixes, feature implementations, documentation,
71
+ datasets, and enhancement proposals are welcome.
72
+
73
+ This software project is supported in part by the
74
+ [Essential Open Source Software for Science (EOSS)](https://chanzuckerberg.com/eoss/)
75
+ program at
76
+ [Chan Zuckerberg Initiative](https://chanzuckerberg.com/).
77
+
78
+ [![CZI's Essential Open Source Software for Science](https://chanzuckerberg.github.io/open-science/badges/CZI-EOSS.svg)](https://czi.co/EOSS)
@@ -0,0 +1,24 @@
1
+ phasorpy-0.2.dist-info/RECORD,,
2
+ phasorpy-0.2.dist-info/WHEEL,sha256=kD-LhIT6lUKGukNhSkqq4OnwDJg6bUoeCVUytlUwUF8,111
3
+ phasorpy-0.2.dist-info/entry_points.txt,sha256=VRhsl3qGiIKwtMraKapmduchTMbdReUi1AoVTe9f3ss,47
4
+ phasorpy-0.2.dist-info/top_level.txt,sha256=4Y0uYzya5R2loleAxZ6s2n53_FysUbgFTfFaU0i9rbo,9
5
+ phasorpy-0.2.dist-info/LICENSE.txt,sha256=t94yqgj_PhdZMknTjvDb8jQK3_Yg_GE8Pzg5VOikVRE,1083
6
+ phasorpy-0.2.dist-info/METADATA,sha256=fCqMHQRbJdBawcjzzX1Lcu2GOdxLLykzv0KBiDp2AyA,3386
7
+ phasorpy/conftest.py,sha256=2oXUB0Al5GG3N4I4EB7O1Ymfy61Kv7hkDYf12rcH2Ic,913
8
+ phasorpy/plot.py,sha256=JgbzBVHF9rOiDqMvtuaL8EWpf30_8MUc0UmkmBXU-sQ,67736
9
+ phasorpy/color.py,sha256=PAcxkRExdI_Ohnfg3WhxV4wZ22MnusqY6VzH4XXvJFM,16732
10
+ phasorpy/version.py,sha256=ytQEwrHPQotpI_eSlVqUtQytkgx_12H14a00YSHA-UI,1729
11
+ phasorpy/_typing.py,sha256=bEh59izC7V94Zo5Dua0_LKGhJwet_at7PFTVWlV4HpY,1247
12
+ phasorpy/_phasorpy.pyx,sha256=NKfPNu2uSoRPwYw0lWu7ZwyEjIyCspNhcgAjo0SYrmk,59218
13
+ phasorpy/cursors.py,sha256=v-lJ_cTD8NtEdvs_BJgXnI7Ewb0xuBPFcJArmNQGWwQ,15044
14
+ phasorpy/io.py,sha256=tVzWe2-MOUaU9fmHGZfIoUOLpetteAifubYcUhfD82M,52434
15
+ phasorpy/datasets.py,sha256=bGy5hRPhzwYeGBr_QFcbn8wY0WYbZPL8q4_iSW5GQvs,15070
16
+ phasorpy/phasor.py,sha256=o9lWg3ilXDKbcnXG6hToxXf5MCUSVcbxo_h6zuF7Ez8,105360
17
+ phasorpy/__init__.py,sha256=EIhsWWFnJdAnohtH60ZWyaSQowdCh_N_6ZWJ4wnzjxY,244
18
+ phasorpy/cli.py,sha256=L1UmH2QR3L4F_ZknGc4xOZrDpqc0ofbYM8VHj0YDqzE,1890
19
+ phasorpy/utils.py,sha256=sYLL2VLMxIat6afyUPe24K82hn5P_3YRbVzOlvdulpg,11307
20
+ phasorpy/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
21
+ phasorpy/_phasorpy.cpython-312-darwin.so,sha256=fpEDvZOfsVlfQjTG24TOPRUXkoX8W6zJH_WWdkV1Ofw,861712
22
+ phasorpy/components.py,sha256=hrin5zoWJUKtEms4vgAlAjbYU1Yj8mZmmJwCsQkmcOg,10102
23
+ phasorpy/__main__.py,sha256=vkjfLooAnV7rSJwF_PEIM329cJI1Oh-Y5SYjFpqmuF4,142
24
+ phasorpy/_utils.py,sha256=iFTLRvbIlbRy6nVx52hD7KtKgRQuFIzNEM2DrJCiTmU,12801
@@ -0,0 +1,5 @@
1
+ Wheel-Version: 1.0
2
+ Generator: setuptools (75.6.0)
3
+ Root-Is-Purelib: false
4
+ Tag: cp312-cp312-macosx_10_13_x86_64
5
+
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ phasorpy = phasorpy.cli:main
@@ -0,0 +1 @@
1
+ phasorpy