phasorpy 0.4__cp311-cp311-win_amd64.whl → 0.6__cp311-cp311-win_amd64.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/__init__.py +2 -3
- phasorpy/_phasorpy.cp311-win_amd64.pyd +0 -0
- phasorpy/_phasorpy.pyx +237 -51
- phasorpy/_utils.py +201 -7
- phasorpy/cli.py +58 -3
- phasorpy/cluster.py +206 -0
- phasorpy/color.py +16 -11
- phasorpy/components.py +240 -69
- phasorpy/conftest.py +2 -0
- phasorpy/cursors.py +9 -9
- phasorpy/datasets.py +129 -51
- phasorpy/experimental.py +312 -0
- phasorpy/io/__init__.py +137 -0
- phasorpy/io/_flimlabs.py +350 -0
- phasorpy/io/_leica.py +329 -0
- phasorpy/io/_ometiff.py +445 -0
- phasorpy/io/_other.py +782 -0
- phasorpy/io/_simfcs.py +627 -0
- phasorpy/phasor.py +572 -97
- phasorpy/plot/__init__.py +27 -0
- phasorpy/plot/_functions.py +717 -0
- phasorpy/plot/_lifetime_plots.py +553 -0
- phasorpy/plot/_phasorplot.py +1119 -0
- phasorpy/plot/_phasorplot_fret.py +559 -0
- phasorpy/utils.py +90 -297
- {phasorpy-0.4.dist-info → phasorpy-0.6.dist-info}/METADATA +11 -16
- phasorpy-0.6.dist-info/RECORD +34 -0
- {phasorpy-0.4.dist-info → phasorpy-0.6.dist-info}/WHEEL +1 -1
- phasorpy/_io.py +0 -2431
- phasorpy/io.py +0 -5
- phasorpy/plot.py +0 -2094
- phasorpy/version.py +0 -72
- phasorpy-0.4.dist-info/RECORD +0 -25
- {phasorpy-0.4.dist-info → phasorpy-0.6.dist-info}/entry_points.txt +0 -0
- {phasorpy-0.4.dist-info → phasorpy-0.6.dist-info/licenses}/LICENSE.txt +0 -0
- {phasorpy-0.4.dist-info → phasorpy-0.6.dist-info}/top_level.txt +0 -0
phasorpy/utils.py
CHANGED
@@ -8,308 +8,18 @@ that do not naturally fit into other modules.
|
|
8
8
|
from __future__ import annotations
|
9
9
|
|
10
10
|
__all__ = [
|
11
|
-
'
|
12
|
-
'anscombe_transformation_inverse',
|
11
|
+
'logger',
|
13
12
|
'number_threads',
|
14
|
-
'
|
13
|
+
'versions',
|
15
14
|
]
|
16
15
|
|
17
|
-
import
|
16
|
+
import logging
|
18
17
|
import os
|
19
|
-
from typing import TYPE_CHECKING
|
20
18
|
|
21
|
-
if TYPE_CHECKING:
|
22
|
-
from ._typing import Any, NDArray, ArrayLike, DTypeLike, Literal, Sequence
|
23
19
|
|
24
|
-
|
25
|
-
|
26
|
-
|
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]
|
20
|
+
def logger() -> logging.Logger:
|
21
|
+
"""Return ``logging.getLogger('phasorpy')``."""
|
22
|
+
return logging.getLogger('phasorpy')
|
313
23
|
|
314
24
|
|
315
25
|
def number_threads(
|
@@ -317,7 +27,7 @@ def number_threads(
|
|
317
27
|
max_threads: int | None = None,
|
318
28
|
/,
|
319
29
|
) -> int:
|
320
|
-
"""Return number of threads for parallel computations
|
30
|
+
"""Return number of threads for parallel computations across CPU cores.
|
321
31
|
|
322
32
|
This function is used to parse ``num_threads`` parameters.
|
323
33
|
|
@@ -332,6 +42,11 @@ def number_threads(
|
|
332
42
|
max_threads : int, optional
|
333
43
|
Maximum number of threads to return.
|
334
44
|
|
45
|
+
Returns
|
46
|
+
-------
|
47
|
+
int
|
48
|
+
Number of threads for parallel computations.
|
49
|
+
|
335
50
|
Examples
|
336
51
|
--------
|
337
52
|
>>> number_threads()
|
@@ -366,3 +81,81 @@ def number_threads(
|
|
366
81
|
if max_threads is None:
|
367
82
|
return num_threads
|
368
83
|
return min(num_threads, max(max_threads, 1))
|
84
|
+
|
85
|
+
|
86
|
+
def versions(
|
87
|
+
*, sep: str = '\n', dash: str = '-', verbose: bool = False
|
88
|
+
) -> str:
|
89
|
+
"""Return version information for PhasorPy and its dependencies.
|
90
|
+
|
91
|
+
Parameters
|
92
|
+
----------
|
93
|
+
sep : str, optional
|
94
|
+
Separator between version items. Defaults to newline.
|
95
|
+
dash : str, optional
|
96
|
+
Separator between module name and version. Defaults to dash.
|
97
|
+
verbose : bool, optional
|
98
|
+
Include paths to Python interpreter and modules.
|
99
|
+
|
100
|
+
Returns
|
101
|
+
-------
|
102
|
+
str
|
103
|
+
Formatted string containing version information.
|
104
|
+
Format: "<package><dash><version>[<space>(<path>)]<sep>"
|
105
|
+
|
106
|
+
Example
|
107
|
+
-------
|
108
|
+
>>> print(versions())
|
109
|
+
Python-3...
|
110
|
+
phasorpy-0...
|
111
|
+
numpy-...
|
112
|
+
...
|
113
|
+
|
114
|
+
"""
|
115
|
+
import importlib.metadata
|
116
|
+
import os
|
117
|
+
import sys
|
118
|
+
|
119
|
+
if verbose:
|
120
|
+
version_strings = [f'Python{dash}{sys.version} ({sys.executable})']
|
121
|
+
else:
|
122
|
+
version_strings = [f'Python{dash}{sys.version.split()[0]}']
|
123
|
+
|
124
|
+
for module in (
|
125
|
+
'phasorpy',
|
126
|
+
'numpy',
|
127
|
+
'tifffile',
|
128
|
+
'imagecodecs',
|
129
|
+
'lfdfiles',
|
130
|
+
'sdtfile',
|
131
|
+
'ptufile',
|
132
|
+
'liffile',
|
133
|
+
'matplotlib',
|
134
|
+
'scipy',
|
135
|
+
'skimage',
|
136
|
+
'sklearn',
|
137
|
+
'pandas',
|
138
|
+
'xarray',
|
139
|
+
'click',
|
140
|
+
'pooch',
|
141
|
+
):
|
142
|
+
try:
|
143
|
+
__import__(module)
|
144
|
+
except ModuleNotFoundError:
|
145
|
+
version_strings.append(f'{module.lower()}{dash}n/a')
|
146
|
+
continue
|
147
|
+
lib = sys.modules[module]
|
148
|
+
try:
|
149
|
+
ver = importlib.metadata.version(module)
|
150
|
+
except importlib.metadata.PackageNotFoundError:
|
151
|
+
ver = getattr(lib, '__version__', 'unknown')
|
152
|
+
ver = f'{module.lower()}{dash}{ver}'
|
153
|
+
if verbose:
|
154
|
+
try:
|
155
|
+
path = getattr(lib, '__file__')
|
156
|
+
except NameError:
|
157
|
+
pass
|
158
|
+
else:
|
159
|
+
ver += f' ({os.path.dirname(path)})'
|
160
|
+
version_strings.append(ver)
|
161
|
+
return sep.join(version_strings)
|
@@ -1,9 +1,9 @@
|
|
1
|
-
Metadata-Version: 2.
|
1
|
+
Metadata-Version: 2.4
|
2
2
|
Name: phasorpy
|
3
|
-
Version: 0.
|
3
|
+
Version: 0.6
|
4
4
|
Summary: Analysis of fluorescence lifetime and hyperspectral images using the phasor approach
|
5
5
|
Author: PhasorPy Contributors
|
6
|
-
License: MIT
|
6
|
+
License-Expression: MIT
|
7
7
|
Project-URL: Homepage, https://www.phasorpy.org
|
8
8
|
Project-URL: Documentation, https://www.phasorpy.org/docs/stable/
|
9
9
|
Project-URL: Download, https://pypi.org/project/phasorpy/#files
|
@@ -13,25 +13,24 @@ Project-URL: Release notes, https://www.phasorpy.org/docs/stable/release
|
|
13
13
|
Classifier: Development Status :: 3 - Alpha
|
14
14
|
Classifier: Intended Audience :: Developers
|
15
15
|
Classifier: Intended Audience :: Science/Research
|
16
|
-
Classifier: License :: OSI Approved :: MIT License
|
17
16
|
Classifier: Programming Language :: Python
|
18
17
|
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
19
18
|
Classifier: Operating System :: OS Independent
|
20
19
|
Classifier: Programming Language :: Python :: 3
|
21
20
|
Classifier: Programming Language :: Python :: 3 :: Only
|
22
|
-
Classifier: Programming Language :: Python :: 3.10
|
23
21
|
Classifier: Programming Language :: Python :: 3.11
|
24
22
|
Classifier: Programming Language :: Python :: 3.12
|
25
23
|
Classifier: Programming Language :: Python :: 3.13
|
26
|
-
Requires-Python: >=3.
|
24
|
+
Requires-Python: >=3.11
|
27
25
|
Description-Content-Type: text/markdown
|
28
26
|
License-File: LICENSE.txt
|
29
|
-
Requires-Dist: numpy>=1.
|
30
|
-
Requires-Dist: matplotlib>=3.
|
27
|
+
Requires-Dist: numpy>=1.25.0
|
28
|
+
Requires-Dist: matplotlib>=3.8.0
|
31
29
|
Requires-Dist: scipy>=1.11.0
|
32
30
|
Requires-Dist: click
|
33
31
|
Requires-Dist: pooch
|
34
32
|
Requires-Dist: tqdm
|
33
|
+
Requires-Dist: scikit-learn>=1.5.0
|
35
34
|
Requires-Dist: xarray>=2023.4.0
|
36
35
|
Requires-Dist: tifffile>=2024.8.30
|
37
36
|
Provides-Extra: docs
|
@@ -42,17 +41,13 @@ Requires-Dist: sphinx-copybutton; extra == "docs"
|
|
42
41
|
Requires-Dist: sphinx_click; extra == "docs"
|
43
42
|
Requires-Dist: pydata-sphinx-theme>=0.16.0; extra == "docs"
|
44
43
|
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
44
|
Provides-Extra: all
|
52
45
|
Requires-Dist: lfdfiles>=2024.5.24; extra == "all"
|
53
46
|
Requires-Dist: sdtfile>=2024.5.24; extra == "all"
|
54
47
|
Requires-Dist: ptufile>=2024.9.14; extra == "all"
|
55
|
-
Requires-Dist: liffile>=2025.
|
48
|
+
Requires-Dist: liffile>=2025.2.10; extra == "all"
|
49
|
+
Requires-Dist: pawflim; extra == "all"
|
50
|
+
Dynamic: license-file
|
56
51
|
|
57
52
|
# PhasorPy
|
58
53
|
|
@@ -71,7 +66,7 @@ PhasorPy is a community-maintained project.
|
|
71
66
|
in the form of bug reports, bug fixes, feature implementations, documentation,
|
72
67
|
datasets, and enhancement proposals are welcome.
|
73
68
|
|
74
|
-
This software project
|
69
|
+
This software project was supported in part by the
|
75
70
|
[Essential Open Source Software for Science (EOSS)](https://chanzuckerberg.com/eoss/)
|
76
71
|
program at
|
77
72
|
[Chan Zuckerberg Initiative](https://chanzuckerberg.com/).
|
@@ -0,0 +1,34 @@
|
|
1
|
+
phasorpy/__init__.py,sha256=ojBobmhDI2NwrlfKLxINCSF7dMnsJQdjvrTOJoD9Bd8,149
|
2
|
+
phasorpy/__main__.py,sha256=0u6C98HYfajV1RoUww8kAc0CxdsON0ijgEyTYExCSLM,149
|
3
|
+
phasorpy/_phasorpy.cp311-win_amd64.pyd,sha256=7p1uW0jbO8fWuBMEihKKYSsmPwD73QU4FGifJ1vBFl0,972288
|
4
|
+
phasorpy/_phasorpy.pyx,sha256=DHSi_R5TWht2DFev51oULSI2uMRW6xCato_CMUE_eMI,69128
|
5
|
+
phasorpy/_typing.py,sha256=ii-5-8KTs2BZq0Ytu3yJl8ejSQj1V06c1_Jcwa_2Snk,1324
|
6
|
+
phasorpy/_utils.py,sha256=Zr33fJMBpLZg9wpWbSC-X8ci39PuVdjbqO62Aelfi7E,20763
|
7
|
+
phasorpy/cli.py,sha256=MDLAdXZvsKlNP5l7KnlTfp9OKQ4_7y4x_LEQqrbaj78,3082
|
8
|
+
phasorpy/cluster.py,sha256=_H9pzz_-8BeIgZlN0mv1tNEAtr-Z0xe6Mt-tKOSzS3M,6294
|
9
|
+
phasorpy/color.py,sha256=Y0XINGWDI5DxTUO9FnwYbf3oZq9IB2XagoJOdXhEsvQ,17378
|
10
|
+
phasorpy/components.py,sha256=jPC52Vs79drDp7GwSmSZemhz0RSz_OYkFn_Qg9JnT7A,17255
|
11
|
+
phasorpy/conftest.py,sha256=0dCO8UZtEnhZv-JW1_vGvPZOmaihRLOo_Wc857socWI,976
|
12
|
+
phasorpy/cursors.py,sha256=1KzsfZBD-kKLdjiMUC3ZIKjSnVtnUwggVlt883EmcRo,15571
|
13
|
+
phasorpy/datasets.py,sha256=EggCWJnpHIHuobRV7aEBNM44B79hMzInNA_lEnMZum8,20870
|
14
|
+
phasorpy/experimental.py,sha256=bXp1bWpzO2p2JpJw-SiQX6XFSdGyqRu2qq_XXZz1P7Y,9821
|
15
|
+
phasorpy/phasor.py,sha256=hY8pW6KgMZV-ik0kxEpdQR8M5u7d0LJ45t8U6vdPsko,130260
|
16
|
+
phasorpy/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
17
|
+
phasorpy/utils.py,sha256=RipcdjEeu8UnZE-iJZR7zaQQQ_5QxiU3223VT4VGupw,4470
|
18
|
+
phasorpy/io/__init__.py,sha256=JmMpGnJERf0CjkcB2SmxAKZ9Z2W-3BhOefj8ADbkLQc,4870
|
19
|
+
phasorpy/io/_flimlabs.py,sha256=2tNOHZfziATIBZaPE1_D8r1dDGn_e5h3hRZQzuhk9DU,10694
|
20
|
+
phasorpy/io/_leica.py,sha256=66Z9dAP1P9Y7hwqOKC80iNT-xm-yW-uGTxStPi543FQ,10922
|
21
|
+
phasorpy/io/_ometiff.py,sha256=ii5rf0bFV2EWD50Rt2Tm6MQ1Knwu1_AgyxA3s_or_Z4,15855
|
22
|
+
phasorpy/io/_other.py,sha256=nE40crsf7qbswoswr2pLBcHJoYzWjRRz2VAlr018C8k,24695
|
23
|
+
phasorpy/io/_simfcs.py,sha256=3kwEgeGfMrwF7IcVoa0Z1J7V0RWaEg-vbI5e6KVxHBo,18970
|
24
|
+
phasorpy/plot/__init__.py,sha256=fUMe18wCkopcvWiNXSwd49bqt8EltfsxcnrBpBauK8M,793
|
25
|
+
phasorpy/plot/_functions.py,sha256=iIlbnu4DB97sO8zT2v0rO-GqVED99XeCXC24y_Tk43c,21918
|
26
|
+
phasorpy/plot/_lifetime_plots.py,sha256=v0ZuSkwNlE6zSFPqjxPwHv_0woGllSG-ZJ45DX2SkDU,19125
|
27
|
+
phasorpy/plot/_phasorplot.py,sha256=aAWKOjrGahWcu0t3-B3uTbGSp6vKek3uq5yn5m4etRg,38004
|
28
|
+
phasorpy/plot/_phasorplot_fret.py,sha256=CFJNvFyZYxS9vPTe22F_l0Wigd3WGeN_gmDLP3TGWRU,19691
|
29
|
+
phasorpy-0.6.dist-info/licenses/LICENSE.txt,sha256=KVzeDa0MBRSUYPFFNuo7Atn6v62TiJTgGzHigltEX0o,1104
|
30
|
+
phasorpy-0.6.dist-info/METADATA,sha256=LRZ4kDprfLlHaZgtL6jyu3dBSKlJpLrM4jX_P-hkcF0,3323
|
31
|
+
phasorpy-0.6.dist-info/WHEEL,sha256=JLOMsP7F5qtkAkINx5UnzbFguf8CqZeraV8o04b0I8I,101
|
32
|
+
phasorpy-0.6.dist-info/entry_points.txt,sha256=VRhsl3qGiIKwtMraKapmduchTMbdReUi1AoVTe9f3ss,47
|
33
|
+
phasorpy-0.6.dist-info/top_level.txt,sha256=4Y0uYzya5R2loleAxZ6s2n53_FysUbgFTfFaU0i9rbo,9
|
34
|
+
phasorpy-0.6.dist-info/RECORD,,
|