phasorpy 0.4__tar.gz → 0.6__tar.gz

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 (114) hide show
  1. {phasorpy-0.4 → phasorpy-0.6}/MANIFEST.in +1 -0
  2. {phasorpy-0.4/src/phasorpy.egg-info → phasorpy-0.6}/PKG-INFO +11 -16
  3. {phasorpy-0.4 → phasorpy-0.6}/README.md +1 -1
  4. {phasorpy-0.4 → phasorpy-0.6}/docs/_static/switcher.json +9 -9
  5. phasorpy-0.6/docs/acknowledgments.rst +42 -0
  6. phasorpy-0.6/docs/api/cluster.rst +5 -0
  7. phasorpy-0.6/docs/api/experimental.rst +5 -0
  8. {phasorpy-0.4 → phasorpy-0.6}/docs/api/index.rst +4 -3
  9. {phasorpy-0.4 → phasorpy-0.6}/docs/code_of_conduct.rst +4 -3
  10. {phasorpy-0.4 → phasorpy-0.6}/docs/conf.py +37 -3
  11. {phasorpy-0.4 → phasorpy-0.6}/docs/contributing.rst +6 -4
  12. {phasorpy-0.4 → phasorpy-0.6}/docs/index.rst +1 -7
  13. {phasorpy-0.4 → phasorpy-0.6}/docs/phasor_approach.rst +2 -2
  14. {phasorpy-0.4 → phasorpy-0.6}/docs/release.rst +120 -5
  15. {phasorpy-0.4 → phasorpy-0.6}/pyproject.toml +18 -27
  16. phasorpy-0.6/src/phasorpy/__init__.py +9 -0
  17. {phasorpy-0.4 → phasorpy-0.6}/src/phasorpy/_phasorpy.pyx +237 -51
  18. {phasorpy-0.4 → phasorpy-0.6}/src/phasorpy/_utils.py +201 -7
  19. {phasorpy-0.4 → phasorpy-0.6}/src/phasorpy/cli.py +58 -3
  20. phasorpy-0.6/src/phasorpy/cluster.py +206 -0
  21. {phasorpy-0.4 → phasorpy-0.6}/src/phasorpy/color.py +16 -11
  22. phasorpy-0.6/src/phasorpy/components.py +484 -0
  23. {phasorpy-0.4 → phasorpy-0.6}/src/phasorpy/conftest.py +2 -0
  24. {phasorpy-0.4 → phasorpy-0.6}/src/phasorpy/cursors.py +9 -9
  25. {phasorpy-0.4 → phasorpy-0.6}/src/phasorpy/datasets.py +129 -51
  26. phasorpy-0.4/src/phasorpy/utils.py → phasorpy-0.6/src/phasorpy/experimental.py +133 -189
  27. phasorpy-0.6/src/phasorpy/io/__init__.py +137 -0
  28. phasorpy-0.6/src/phasorpy/io/_flimlabs.py +350 -0
  29. phasorpy-0.6/src/phasorpy/io/_leica.py +329 -0
  30. phasorpy-0.6/src/phasorpy/io/_ometiff.py +445 -0
  31. phasorpy-0.6/src/phasorpy/io/_other.py +782 -0
  32. phasorpy-0.6/src/phasorpy/io/_simfcs.py +627 -0
  33. {phasorpy-0.4 → phasorpy-0.6}/src/phasorpy/phasor.py +572 -97
  34. phasorpy-0.6/src/phasorpy/plot/__init__.py +27 -0
  35. phasorpy-0.6/src/phasorpy/plot/_functions.py +717 -0
  36. phasorpy-0.6/src/phasorpy/plot/_lifetime_plots.py +553 -0
  37. phasorpy-0.4/src/phasorpy/plot.py → phasorpy-0.6/src/phasorpy/plot/_phasorplot.py +62 -1037
  38. phasorpy-0.6/src/phasorpy/plot/_phasorplot_fret.py +559 -0
  39. phasorpy-0.6/src/phasorpy/utils.py +161 -0
  40. {phasorpy-0.4 → phasorpy-0.6/src/phasorpy.egg-info}/PKG-INFO +11 -16
  41. {phasorpy-0.4 → phasorpy-0.6}/src/phasorpy.egg-info/SOURCES.txt +22 -6
  42. {phasorpy-0.4 → phasorpy-0.6}/src/phasorpy.egg-info/requires.txt +5 -10
  43. {phasorpy-0.4 → phasorpy-0.6}/tests/conftest.py +1 -2
  44. {phasorpy-0.4 → phasorpy-0.6}/tests/test__phasorpy.py +78 -18
  45. {phasorpy-0.4 → phasorpy-0.6}/tests/test__utils.py +28 -0
  46. {phasorpy-0.4 → phasorpy-0.6}/tests/test_cli.py +15 -1
  47. phasorpy-0.6/tests/test_cluster.py +98 -0
  48. {phasorpy-0.4 → phasorpy-0.6}/tests/test_components.py +153 -32
  49. phasorpy-0.4/tests/test_utils.py → phasorpy-0.6/tests/test_experimental.py +11 -34
  50. {phasorpy-0.4 → phasorpy-0.6}/tests/test_nan.py +17 -8
  51. {phasorpy-0.4 → phasorpy-0.6}/tests/test_phasor.py +1047 -109
  52. phasorpy-0.6/tests/test_phasorpy.py +12 -0
  53. phasorpy-0.6/tests/test_utils.py +52 -0
  54. phasorpy-0.6/tutorials/api/phasorpy_components.py +287 -0
  55. {phasorpy-0.4 → phasorpy-0.6}/tutorials/api/phasorpy_cursors.py +11 -16
  56. phasorpy-0.6/tutorials/api/phasorpy_filtering.py +214 -0
  57. {phasorpy-0.4 → phasorpy-0.6}/tutorials/api/phasorpy_fret.py +14 -15
  58. phasorpy-0.6/tutorials/api/phasorpy_io.py +754 -0
  59. {phasorpy-0.4 → phasorpy-0.6}/tutorials/api/phasorpy_multi-harmonic.py +2 -2
  60. {phasorpy-0.4 → phasorpy-0.6}/tutorials/api/phasorpy_phasorplot.py +11 -10
  61. phasorpy-0.6/tutorials/applications/phasorpy_component_fit.py +191 -0
  62. phasorpy-0.6/tutorials/applications/phasorpy_fret_efficiency.py +150 -0
  63. {phasorpy-0.4 → phasorpy-0.6}/tutorials/benchmarks/phasorpy_phasor_from_signal.py +31 -30
  64. {phasorpy-0.4 → phasorpy-0.6}/tutorials/phasorpy_introduction.py +73 -48
  65. {phasorpy-0.4 → phasorpy-0.6}/tutorials/phasorpy_lfd_workshop.py +11 -11
  66. phasorpy-0.6/tutorials/phasorpy_lifetime_geometry.py +306 -0
  67. phasorpy-0.4/docs/acknowledgments.rst +0 -35
  68. phasorpy-0.4/src/phasorpy/__init__.py +0 -10
  69. phasorpy-0.4/src/phasorpy/_io.py +0 -2431
  70. phasorpy-0.4/src/phasorpy/components.py +0 -313
  71. phasorpy-0.4/src/phasorpy/io.py +0 -5
  72. phasorpy-0.4/src/phasorpy/version.py +0 -72
  73. phasorpy-0.4/tests/test_io.py +0 -1172
  74. phasorpy-0.4/tests/test_phasorpy.py +0 -18
  75. phasorpy-0.4/tests/test_plot.py +0 -534
  76. phasorpy-0.4/tutorials/api/phasorpy_components.py +0 -261
  77. {phasorpy-0.4 → phasorpy-0.6}/LICENSE.txt +0 -0
  78. {phasorpy-0.4 → phasorpy-0.6}/docs/_static/categorical.png +0 -0
  79. {phasorpy-0.4 → phasorpy-0.6}/docs/_static/custom-icons.js +0 -0
  80. {phasorpy-0.4 → phasorpy-0.6}/docs/_static/logo.png +0 -0
  81. {phasorpy-0.4 → phasorpy-0.6}/docs/_static/srgb_spectrum.png +0 -0
  82. {phasorpy-0.4 → phasorpy-0.6}/docs/api/_phasorpy.rst +0 -0
  83. {phasorpy-0.4 → phasorpy-0.6}/docs/api/_utils.rst +0 -0
  84. {phasorpy-0.4 → phasorpy-0.6}/docs/api/cli.rst +0 -0
  85. {phasorpy-0.4 → phasorpy-0.6}/docs/api/color.rst +0 -0
  86. {phasorpy-0.4 → phasorpy-0.6}/docs/api/components.rst +0 -0
  87. {phasorpy-0.4 → phasorpy-0.6}/docs/api/cursors.rst +0 -0
  88. {phasorpy-0.4 → phasorpy-0.6}/docs/api/datasets.rst +0 -0
  89. {phasorpy-0.4 → phasorpy-0.6}/docs/api/io.rst +0 -0
  90. {phasorpy-0.4 → phasorpy-0.6}/docs/api/phasor.rst +0 -0
  91. {phasorpy-0.4 → phasorpy-0.6}/docs/api/phasorpy.rst +0 -0
  92. {phasorpy-0.4 → phasorpy-0.6}/docs/api/plot.rst +0 -0
  93. {phasorpy-0.4 → phasorpy-0.6}/docs/api/utils.rst +0 -0
  94. {phasorpy-0.4 → phasorpy-0.6}/docs/license.rst +0 -0
  95. {phasorpy-0.4 → phasorpy-0.6}/setup.cfg +0 -0
  96. {phasorpy-0.4 → phasorpy-0.6}/setup.py +0 -0
  97. {phasorpy-0.4 → phasorpy-0.6}/src/phasorpy/__main__.py +0 -0
  98. {phasorpy-0.4 → phasorpy-0.6}/src/phasorpy/_typing.py +0 -0
  99. {phasorpy-0.4 → phasorpy-0.6}/src/phasorpy/py.typed +0 -0
  100. {phasorpy-0.4 → phasorpy-0.6}/src/phasorpy.egg-info/dependency_links.txt +0 -0
  101. {phasorpy-0.4 → phasorpy-0.6}/src/phasorpy.egg-info/entry_points.txt +0 -0
  102. {phasorpy-0.4 → phasorpy-0.6}/src/phasorpy.egg-info/not-zip-safe +0 -0
  103. {phasorpy-0.4 → phasorpy-0.6}/src/phasorpy.egg-info/top_level.txt +0 -0
  104. {phasorpy-0.4 → phasorpy-0.6}/tests/test__typing.py +0 -0
  105. {phasorpy-0.4 → phasorpy-0.6}/tests/test_color.py +0 -0
  106. {phasorpy-0.4 → phasorpy-0.6}/tests/test_cursors.py +0 -0
  107. {phasorpy-0.4 → phasorpy-0.6}/tests/test_datasets.py +0 -0
  108. {phasorpy-0.4 → phasorpy-0.6}/tutorials/README.rst +0 -0
  109. {phasorpy-0.4 → phasorpy-0.6}/tutorials/api/README.rst +0 -0
  110. {phasorpy-0.4 → phasorpy-0.6}/tutorials/api/phasorpy_lifetime_to_signal.py +0 -0
  111. {phasorpy-0.4 → phasorpy-0.6}/tutorials/api/phasorpy_pca.py +0 -0
  112. {phasorpy-0.4 → phasorpy-0.6}/tutorials/api/phasorpy_phasor_from_lifetime.py +0 -0
  113. {phasorpy-0.4 → phasorpy-0.6}/tutorials/applications/README.rst +0 -0
  114. {phasorpy-0.4 → phasorpy-0.6}/tutorials/benchmarks/README.rst +0 -0
@@ -12,6 +12,7 @@ recursive-include tutorials *.py
12
12
  recursive-include tutorials *.rst
13
13
 
14
14
  exclude *.cmd
15
+ exclude docs/sg_execution_times.rst
15
16
 
16
17
  recursive-exclude * __pycache__
17
18
  recursive-exclude * *.py[co]
@@ -1,9 +1,9 @@
1
- Metadata-Version: 2.2
1
+ Metadata-Version: 2.4
2
2
  Name: phasorpy
3
- Version: 0.4
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.10
24
+ Requires-Python: >=3.11
27
25
  Description-Content-Type: text/markdown
28
26
  License-File: LICENSE.txt
29
- Requires-Dist: numpy>=1.24.0
30
- Requires-Dist: matplotlib>=3.7.0
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.1.30; extra == "all"
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 is supported in part by the
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/).
@@ -15,7 +15,7 @@ PhasorPy is a community-maintained project.
15
15
  in the form of bug reports, bug fixes, feature implementations, documentation,
16
16
  datasets, and enhancement proposals are welcome.
17
17
 
18
- This software project is supported in part by the
18
+ This software project was supported in part by the
19
19
  [Essential Open Source Software for Science (EOSS)](https://chanzuckerberg.com/eoss/)
20
20
  program at
21
21
  [Chan Zuckerberg Initiative](https://chanzuckerberg.com/).
@@ -1,23 +1,23 @@
1
1
  [
2
2
  {
3
3
  "name": "dev",
4
- "version": "0.5",
4
+ "version": "0.7",
5
5
  "url": "https://www.phasorpy.org/docs/dev/"
6
6
  },
7
7
  {
8
- "name": "0.4 (stable)",
9
- "version": "0.4",
8
+ "name": "0.6 (stable)",
9
+ "version": "0.6",
10
10
  "url": "https://www.phasorpy.org/docs/stable/",
11
11
  "preferred": true
12
12
  },
13
13
  {
14
- "name": "0.3",
15
- "version": "0.3",
16
- "url": "https://www.phasorpy.org/docs/v0.3/"
14
+ "name": "0.5",
15
+ "version": "0.5",
16
+ "url": "https://www.phasorpy.org/docs/v0.5/"
17
17
  },
18
18
  {
19
- "name": "0.2",
20
- "version": "0.2",
21
- "url": "https://www.phasorpy.org/docs/v0.2/"
19
+ "name": "0.4",
20
+ "version": "0.4",
21
+ "url": "https://www.phasorpy.org/docs/v0.4/"
22
22
  }
23
23
  ]
@@ -0,0 +1,42 @@
1
+ Acknowledgments
2
+ ===============
3
+
4
+ The PhasorPy project was established by the
5
+ `Advanced Bioimaging Unit <https://pasteur.uy/en/units/advanced-bioimaging>`_
6
+ at the University of the Republic and Institut Pasteur de Montevideo and the
7
+ `Laboratory for Fluorescence Dynamics <https://www.lfd.uci.edu>`_
8
+ at the University of California, Irvine.
9
+
10
+ PhasorPy was inspired by the
11
+ `Globals for Images · SimFCS <https://www.lfd.uci.edu/globals/>`_ software by
12
+ Enrico Gratton.
13
+
14
+ This software project was supported in part by the
15
+ `Essential Open Source Software for Science (EOSS)
16
+ <https://chanzuckerberg.com/eoss/>`_ program at
17
+ `Chan Zuckerberg Initiative <https://chanzuckerberg.com/>`_
18
+ (grant number 2022-252604, 2022-2024).
19
+
20
+ .. _contributors:
21
+
22
+ Contributors
23
+ ------------
24
+
25
+ PhasorPy is developed by `contributors to the PhasorPy repository
26
+ <https://github.com/phasorpy/phasorpy/graphs/contributors>`_
27
+ and
28
+ `members of the PhasorPy organization
29
+ <https://github.com/orgs/phasorpy/people>`_.
30
+
31
+ User Community
32
+ --------------
33
+
34
+ Many thanks to the PhasorPy user community for their feedback, bug reports,
35
+ feature suggestions, and data files that have helped improve the library.
36
+
37
+ Citation
38
+ --------
39
+
40
+ If PhasorPy contributes to a project that leads to a publication,
41
+ please cite
42
+ `doi: 10.5281/zenodo.13862586 <https://doi.org/10.5281/zenodo.13862586>`_.
@@ -0,0 +1,5 @@
1
+ phasorpy.cluster
2
+ ----------------
3
+
4
+ .. automodule:: phasorpy.cluster
5
+ :members:
@@ -0,0 +1,5 @@
1
+ phasorpy.experimental
2
+ ---------------------
3
+
4
+ .. automodule:: phasorpy.experimental
5
+ :members:
@@ -5,9 +5,8 @@ This documents the application programming and command line interfaces of the
5
5
  PhasorPy library version |version|.
6
6
 
7
7
  .. note::
8
- The PhasorPy library is in its early stages of development.
9
- It is not nearly feature complete.
10
- Large, backwards-incompatible changes may occur between revisions.
8
+ The PhasorPy library is still under construction. Backwards-incompatible
9
+ changes may occur between revisions.
11
10
 
12
11
  .. toctree::
13
12
  :maxdepth: 3
@@ -16,9 +15,11 @@ PhasorPy library version |version|.
16
15
  phasor
17
16
  cursors
18
17
  components
18
+ cluster
19
19
  plot
20
20
  io
21
21
  color
22
+ experimental
22
23
  datasets
23
24
  utils
24
25
  _utils
@@ -1,3 +1,5 @@
1
+ :orphan:
2
+
1
3
  Code of conduct
2
4
  ===============
3
5
 
@@ -68,9 +70,8 @@ Enforcement
68
70
  -----------
69
71
 
70
72
  Instances of abusive, harassing, or otherwise unacceptable behavior may be
71
- reported to the community leader responsible for enforcement:
72
-
73
- - `Leonel Malacrida <conduct@phasorpy.org>`_
73
+ reported to `<conduct@phasorpy.org>`_ and `PhasorPy organization members
74
+ <https://github.com/orgs/phasorpy/people>`_.
74
75
 
75
76
  All complaints will be reviewed and investigated promptly and fairly.
76
77
 
@@ -2,9 +2,10 @@
2
2
  # https://www.sphinx-doc.org/en/master/usage/configuration.html
3
3
  # pylint: skip-file
4
4
 
5
- # import os
6
- # import sys
7
- # sys.path.insert(0, os.path.abspath('../src/'))
5
+ import os
6
+ import sys
7
+
8
+ sys.path.insert(0, os.path.dirname(__file__))
8
9
 
9
10
  # remove the examples header from HTML tutorials
10
11
  import sphinx_gallery.gen_rst
@@ -123,8 +124,41 @@ sphinx_gallery_conf = {
123
124
  'gallery_dirs': 'tutorials',
124
125
  'reference_url': {'phasorpy': None},
125
126
  'matplotlib_animations': True,
127
+ 'within_subsection_order': 'conf.TutorialOrder',
126
128
  }
127
129
 
130
+
131
+ class TutorialOrder:
132
+ """Order tutorials in gallery subsections."""
133
+
134
+ tutorials = [
135
+ 'introduction',
136
+ 'lifetime_geometry',
137
+ 'lfd_workshop',
138
+ # api
139
+ 'io',
140
+ 'phasor_from_lifetime',
141
+ 'multi-harmonic',
142
+ 'filtering',
143
+ 'phasorplot',
144
+ 'cursors',
145
+ 'components',
146
+ 'fret',
147
+ 'lifetime_to_signal',
148
+ 'pca',
149
+ # applications
150
+ 'component_fit',
151
+ 'fret_efficiency',
152
+ # benchmarks
153
+ 'phasor_from_signal',
154
+ ]
155
+
156
+ def __init__(self, srcdir: str): ...
157
+
158
+ def __call__(self, filename: str) -> int:
159
+ return self.tutorials.index(filename[9:-3])
160
+
161
+
128
162
  copybutton_prompt_text = (
129
163
  r'>>> |\.\.\. |\$ |In \[\d*\]: | {2,5}\.\.\.: | {5,8}: '
130
164
  )
@@ -61,9 +61,9 @@ and include the following items in the bug report:
61
61
  of::
62
62
 
63
63
  $ python -m phasorpy versions
64
- Python 3.11.4 ...
65
- phasorpy 0.1.dev ...
66
- numpy 1.25.2
64
+ Python-3.13.3
65
+ phasorpy-0.5
66
+ numpy-2.2.6
67
67
  ...
68
68
 
69
69
  Contribute code or documentation
@@ -289,4 +289,6 @@ and must pass before code or documentation can be accepted.
289
289
  Other PhasorPy developers will review the pull request to check and help
290
290
  to improve its implementation, documentation, and style.
291
291
 
292
- Pull requests must be approved by a core team member before merging.
292
+ Pull requests must be approved by a
293
+ `PhasorPy organization member <https://github.com/orgs/phasorpy/people>`_
294
+ before merging.
@@ -7,15 +7,10 @@ Welcome to the documentation of PhasorPy version |version|.
7
7
  PhasorPy is an open-source Python library for the analysis of fluorescence
8
8
  lifetime and hyperspectral images using the :doc:`phasor_approach`.
9
9
 
10
- .. note::
11
- The PhasorPy library is in its early stages of development.
12
- It is not nearly feature complete.
13
- Large, backwards-incompatible changes may occur between revisions.
14
-
15
10
  Quickstart
16
11
  ==========
17
12
 
18
- The :doc:`tutorials/index` demonstrate the use the library, from simple
13
+ The :doc:`tutorials/index` demonstrate the use of the library, from simple
19
14
  examples to advanced applications.
20
15
 
21
16
  The :doc:`api/index` contains detailed information about all functions and
@@ -67,7 +62,6 @@ Contents
67
62
  api/index
68
63
  release
69
64
  contributing
70
- code_of_conduct
71
65
  acknowledgments
72
66
  license
73
67
 
@@ -200,8 +200,8 @@ approach to analyze fluorescence time-resolved or spectral images:
200
200
  microscopy written in MATLAB by Alexander Vallmitjana, released under
201
201
  the CC BY 4.0 license.
202
202
 
203
- - `AlliGator <https://alligator-distribution.readthedocs.io>`_
204
- is a free, closed-source software for fluorescence lifetime image data
203
+ - `AlliGator <https://github.com/smXplorer/AlliGator>`_
204
+ is an open-source software for fluorescence lifetime image data
205
205
  analysis using the phasor approach and standard nonlinear fitting.
206
206
  The software is written in LabVIEW for Windows by Xavier Michalet.
207
207
 
@@ -6,15 +6,131 @@ a release. It includes descriptions of bug fixes, feature enhancements,
6
6
  documentation and maintenance changes.
7
7
 
8
8
  .. note::
9
- The PhasorPy library is in its early stages of development.
10
- It is not nearly feature complete.
11
- Large, backwards-incompatible changes may occur between revisions.
9
+ The PhasorPy library is still under construction. Backwards-incompatible
10
+ changes may occur between revisions.
11
+
12
+ 0.6 (2025.6.22)
13
+ ---------------
14
+
15
+ This is the sixth alpha release of the PhasorPy library.
16
+ It contains several bug fixes, improvements, and breaking changes.
17
+
18
+ The new ``phasor_component_fit`` function fits fractions of multiple
19
+ components to phasor coordinates.
20
+ The ``phasor_nearest_neighbor`` function returns nearest neighbors in phasor
21
+ coordinates.
22
+ The ``phasor_to_normal_lifetime`` function returns single lifetimes closest
23
+ to phasor coordinates.
24
+ The ``phasor_semicircle_intersect`` function returns intersections of lines
25
+ with the universal semicircle.
26
+
27
+ The ``LifetimePlots`` class interactively plots lifetimes in the time domain,
28
+ frequency domain, and phasor plot. It can be invoked from the command line
29
+ with ``python -m phasorpy lifetime``.
30
+
31
+ The ``two_fractions_from_phasor`` and ``graphical_component_analysis``
32
+ functions are renamed to ``phasor_component_fraction`` and
33
+ ``phasor_component_graphical``, respectively.
34
+ The ``versions`` function has moved to the ``phasorpy.utils`` namespace.
35
+ The ``spectral_vector_denoise``, ``anscombe_transform``, and
36
+ ``anscombe_transform_inverse`` functions have moved to the
37
+ ``phasorpy.experimental`` namespace.
38
+
39
+ Functions in the ``io`` module now return only the first channel by default.
40
+
41
+ Three new tutorials are added: "Geometrical interpretation of lifetimes",
42
+ "Multi-component fit", and "FRET efficiency image".
43
+ This release supports Python 3.11 to 3.13.
44
+
45
+ What's Changed
46
+ ..............
47
+
48
+ * Bump version by @cgohlke in https://github.com/phasorpy/phasorpy/pull/221
49
+ * Bump pypa/cibuildwheel from 2.23.2 to 2.23.3 in the github-actions group by @dependabot in https://github.com/phasorpy/phasorpy/pull/223
50
+ * Update description of AlliGator software by @cgohlke in https://github.com/phasorpy/phasorpy/pull/225
51
+ * Cython 3.1.0 is released by @cgohlke in https://github.com/phasorpy/phasorpy/pull/226
52
+ * Add phasor_to_normal_lifetime function by @cgohlke in https://github.com/phasorpy/phasorpy/pull/228
53
+ * Read first channel from files by default by @cgohlke in https://github.com/phasorpy/phasorpy/pull/229
54
+ * Update acknowledgments by @cgohlke in https://github.com/phasorpy/phasorpy/pull/230
55
+ * Use importlib to get package versions by @cgohlke in https://github.com/phasorpy/phasorpy/pull/231
56
+ * Use Windows Server 2022 in GitHub Actions by @cgohlke in https://github.com/phasorpy/phasorpy/pull/232
57
+ * Add tutorial about geometrical interpretation of lifetimes by @cgohlke in https://github.com/phasorpy/phasorpy/pull/233
58
+ * Update reference phasor_from_signal benchmark results by @cgohlke in https://github.com/phasorpy/phasorpy/pull/234
59
+ * Sort clusters returned by phasor_cluster_gmm by @cgohlke in https://github.com/phasorpy/phasorpy/pull/236
60
+ * Reorganize io module by @cgohlke in https://github.com/phasorpy/phasorpy/pull/235
61
+ * Update pre-commit configuration by @cgohlke in https://github.com/phasorpy/phasorpy/pull/237
62
+ * Fix test failing with numpy 2.3.0 by @cgohlke in https://github.com/phasorpy/phasorpy/pull/239
63
+ * Add phasor_component_fit function by @cgohlke in https://github.com/phasorpy/phasorpy/pull/238
64
+ * Rename functions in components module by @cgohlke in https://github.com/phasorpy/phasorpy/pull/240
65
+ * Add phasor_semicircle_intersect function by @cgohlke in https://github.com/phasorpy/phasorpy/pull/241
66
+ * Add private helper functions to mask universal semicircle by @cgohlke in https://github.com/phasorpy/phasorpy/pull/242
67
+ * Add private _distance_from_semicircle function by @cgohlke in https://github.com/phasorpy/phasorpy/pull/244
68
+ * Reorganize plot module by @cgohlke in https://github.com/phasorpy/phasorpy/pull/245
69
+ * Add interactive LifetimePlots class by @cgohlke in https://github.com/phasorpy/phasorpy/pull/247
70
+ * Reorganize version, utils, and experimental modules by @cgohlke in https://github.com/phasorpy/phasorpy/pull/248
71
+ * Add phasor_nearest_neighbor function by @bruno-pannunzio in https://github.com/phasorpy/phasorpy/pull/243
72
+ * Release v0.6 by @cgohlke in https://github.com/phasorpy/phasorpy/pull/244
73
+
74
+ **Full Changelog**: https://github.com/phasorpy/phasorpy/compare/v0.5...v0.6
75
+
76
+ 0.5 (2025.4.11)
77
+ ---------------
78
+
79
+ This is the fifth alpha release of the PhasorPy library.
80
+ It contains several bug fixes and improvements.
81
+ The new ``phasor_cluster_gmm`` function finds clusters in phasor coordinates
82
+ using a Gaussian mixture model.
83
+ The ``phasor_filter_pawflim`` function applies a wavelet filter using the
84
+ pawFLIM library.
85
+ This release supports Python 3.11 to 3.13. Python 3.10 is no longer supported.
86
+
87
+ What's Changed
88
+ ..............
89
+
90
+ * Bump version by @cgohlke in https://github.com/phasorpy/phasorpy/pull/183
91
+ * Bug Fix for phasor_calibrate when skipping axes with harmonic axis by @bruno-pannunzio in https://github.com/phasorpy/phasorpy/pull/185
92
+ * Fixes for liffile 2025.2.6 by @cgohlke in https://github.com/phasorpy/phasorpy/pull/184
93
+ * Fix phasor_normalize with numpy 1.24 by @cgohlke in https://github.com/phasorpy/phasorpy/pull/186
94
+ * Add pawFLIM wavelet filter for phasor coordinates by @bruno-pannunzio in https://github.com/phasorpy/phasorpy/pull/167
95
+ * Add dataset from zenodo.org/records/14860228 by @cgohlke in https://github.com/phasorpy/phasorpy/pull/187
96
+ * Improve support for Leica image files by @cgohlke in https://github.com/phasorpy/phasorpy/pull/188
97
+ * Remove notes about early stage of development by @cgohlke in https://github.com/phasorpy/phasorpy/pull/189
98
+ * Add plot_histograms function by @cgohlke in https://github.com/phasorpy/phasorpy/pull/191
99
+ * Fix NaN padding in phasor_to_simfcs_referenced by @cgohlke in https://github.com/phasorpy/phasorpy/pull/192
100
+ * Return more metadata from IFLI and FBD readers by @cgohlke in https://github.com/phasorpy/phasorpy/pull/193
101
+ * Add more formats to file I/O tutorial by @cgohlke in https://github.com/phasorpy/phasorpy/pull/194
102
+ * Fix module attribute of functions in phasorpy.io by @cgohlke in https://github.com/phasorpy/phasorpy/pull/195
103
+ * Add plot_image helper function by @cgohlke in https://github.com/phasorpy/phasorpy/pull/196
104
+ * Add section on other means to IO tutorial by @cgohlke in https://github.com/phasorpy/phasorpy/pull/197
105
+ * Bump pypa/cibuildwheel from 2.22.0 to 2.23.0 in the github-actions group by @dependabot in https://github.com/phasorpy/phasorpy/pull/198
106
+ * Improve IO tutorial by @cgohlke in https://github.com/phasorpy/phasorpy/pull/199
107
+ * Fix minor issues found by GitHub Copilot by @cgohlke in https://github.com/phasorpy/phasorpy/pull/202
108
+ * Move parse_skip_axis function to _utils module by @cgohlke in https://github.com/phasorpy/phasorpy/pull/203
109
+ * Fix new mypy errors with numpy 2.2.4 by @cgohlke in https://github.com/phasorpy/phasorpy/pull/204
110
+ * Raise minimum requirements by @cgohlke in https://github.com/phasorpy/phasorpy/pull/208
111
+ * Add phasor_cluster_gmm function by @R-Blanco802 in https://github.com/phasorpy/phasorpy/pull/201
112
+ * Require scikit-learn>=1.5.0 by @cgohlke in https://github.com/phasorpy/phasorpy/pull/209
113
+ * Support routing channels in signal_from_sdt by @cgohlke in https://github.com/phasorpy/phasorpy/pull/210
114
+ * Improve tests and documentation of phasor_cluster_gmm by @cgohlke in https://github.com/phasorpy/phasorpy/pull/211
115
+ * Ignore PhasorPlot.contour cmap if colors is set by @cgohlke in https://github.com/phasorpy/phasorpy/pull/213
116
+ * Bump pypa/cibuildwheel from 2.23.1 to 2.23.2 in the github-actions group by @dependabot in https://github.com/phasorpy/phasorpy/pull/214
117
+ * Update Ubuntu version by @cgohlke in https://github.com/phasorpy/phasorpy/pull/219
118
+ * Require Cython>=3.1.0b1 by @cgohlke in https://github.com/phasorpy/phasorpy/pull/216
119
+ * Add PTU file exported from FLIM_testdata.lif with photon filter by @cgohlke in https://github.com/phasorpy/phasorpy/pull/217
120
+ * Fix multi-channel FLIM LABS files containing single-channel phasors by @cgohlke in https://github.com/phasorpy/phasorpy/pull/218
121
+ * Release v0.5 by @cgohlke in https://github.com/phasorpy/phasorpy/pull/220
122
+
123
+ ## New Contributors
124
+ * @R-Blanco802 made their first contribution in https://github.com/phasorpy/phasorpy/pull/201
125
+
126
+ **Full Changelog**: https://github.com/phasorpy/phasorpy/compare/v0.4...v0.5
12
127
 
13
128
  0.4 (2025.1.30)
14
129
  ---------------
15
130
 
16
131
  This is the fourth alpha release of the PhasorPy library.
17
- It contains several bug fixes and many improvements, mostly to the ``phasorpy.io`` module.
132
+ It contains several bug fixes and many improvements, mostly to the
133
+ ``phasorpy.io`` module.
18
134
  File reader functions are now named ``signal_from_*`` or ``phasor_from_*``
19
135
  and have a more consistent API.
20
136
  Point mode PTU files, LIF files containing phasor coordinates or hyperspectral
@@ -42,7 +158,6 @@ What's Changed
42
158
 
43
159
  **Full Changelog**: https://github.com/phasorpy/phasorpy/compare/v0.3...v0.4
44
160
 
45
-
46
161
  0.3 (2024.12.16)
47
162
  ----------------
48
163
 
@@ -2,7 +2,7 @@
2
2
  requires = [
3
3
  "setuptools>=68",
4
4
  "numpy",
5
- "Cython>=3.0.11",
5
+ "cython>=3.1.0",
6
6
  ]
7
7
  build-backend = "setuptools.build_meta"
8
8
 
@@ -14,36 +14,35 @@ dynamic = ["version"]
14
14
  dependencies = [
15
15
  # sync with requirements_min.txt
16
16
  # https://scientific-python.org/specs/spec-0000/
17
- "numpy>=1.24.0",
18
- "matplotlib>=3.7.0",
17
+ "numpy>=1.25.0",
18
+ "matplotlib>=3.8.0",
19
19
  "scipy>=1.11.0",
20
20
  "click",
21
21
  "pooch",
22
22
  "tqdm",
23
- # "scikit-image>=0.20.0",
24
- # "scikit-learn>=1.2.2",
25
- # "pandas>=2.0.0",
23
+ "scikit-learn>=1.5.0",
24
+ # "scikit-image>=0.21.0",
25
+ # "pandas>=2.1.0",
26
26
  "xarray>=2023.4.0",
27
27
  "tifffile>=2024.8.30",
28
28
  ]
29
- requires-python = ">=3.10"
29
+ requires-python = ">=3.11"
30
30
  classifiers = [
31
31
  "Development Status :: 3 - Alpha",
32
32
  "Intended Audience :: Developers",
33
33
  "Intended Audience :: Science/Research",
34
- "License :: OSI Approved :: MIT License",
35
34
  "Programming Language :: Python",
36
35
  "Topic :: Software Development :: Libraries :: Python Modules",
37
36
  "Operating System :: OS Independent",
38
37
  "Programming Language :: Python :: 3",
39
38
  "Programming Language :: Python :: 3 :: Only",
40
- "Programming Language :: Python :: 3.10",
41
39
  "Programming Language :: Python :: 3.11",
42
40
  "Programming Language :: Python :: 3.12",
43
41
  "Programming Language :: Python :: 3.13",
44
42
  ]
45
43
  authors = [{ name = "PhasorPy Contributors" }]
46
- license = { text = "MIT" }
44
+ license = "MIT"
45
+ license-files = ["LICENSE.txt"]
47
46
 
48
47
  [project.urls]
49
48
  Homepage = "https://www.phasorpy.org"
@@ -66,28 +65,19 @@ docs = [
66
65
  "pydata-sphinx-theme>=0.16.0",
67
66
  "numpydoc",
68
67
  ]
69
- test = [
70
- "pytest",
71
- "pytest-cov",
72
- "pytest-runner",
73
- "pytest-doctestplus",
74
- "coverage",
75
- ]
76
68
  all = [
77
69
  "lfdfiles>=2024.5.24",
78
70
  "sdtfile>=2024.5.24",
79
71
  "ptufile>=2024.9.14",
80
- "liffile>=2025.1.30",
72
+ "liffile>=2025.2.10",
73
+ "pawflim",
81
74
  ]
82
75
 
83
76
  [tool.setuptools]
84
- package-dir = { "" = "src" }
85
- packages = ["phasorpy"]
86
- license-files = ["LICENSE.txt"]
87
77
  zip-safe = false
88
78
 
89
79
  [tool.setuptools.dynamic]
90
- version = { attr = "phasorpy.version.__version__" }
80
+ version = { attr = "phasorpy.__version__" }
91
81
 
92
82
  [tool.setuptools.package-data]
93
83
  phasorpy = ["py.typed"]
@@ -123,7 +113,7 @@ disable = [
123
113
 
124
114
  [tool.black]
125
115
  line-length = 79
126
- target-version = ["py310"]
116
+ target-version = ["py311"]
127
117
  skip-string-normalization = true
128
118
 
129
119
  [tool.isort]
@@ -143,14 +133,15 @@ strict = true
143
133
  warn_unreachable = true
144
134
 
145
135
  [[tool.mypy.overrides]]
146
- module = ["phasorpy._phasorpy", "pooch.*", "scipy.*", "mkl_fft.*"]
136
+ module = ["phasorpy._phasorpy", "pooch.*", "scipy.*", "mkl_fft.*", "sklearn.*"]
147
137
  ignore_missing_imports = true
148
138
 
149
139
  [tool.coverage.run]
150
140
  plugins = ["Cython.Coverage"]
141
+ omit = ["conftest.py", "__main__.py"]
151
142
 
152
143
  [tool.coverage.report]
153
- exclude_lines = ["pragma: no cover", "pragma: ${PY_MAJOR_VERSION} no cover"]
144
+ exclude_lines = ["if TYPE_CHECKING:", "plot.show()", "pragma: no cover", "pragma: ${PY_MAJOR_VERSION} no cover"]
154
145
 
155
146
  [tool.coverage.html]
156
147
  directory = "_htmlcov"
@@ -187,6 +178,6 @@ norecursedirs = [
187
178
  ]
188
179
 
189
180
  [tool.cibuildwheel]
190
- skip = "pp* cp37* cp38* cp39* *musllinux* *i686 *ppc64le *s390x cp39*win*arm64 cp310*win*arm64"
191
- test-requires = ["lfdfiles", "sdtfile", "ptufile", "liffile", "pytest", "pytest-cov", "pytest-runner", "pytest-doctestplus", "coverage"]
181
+ skip = "pp* cp37* cp38* cp39* cp310* *musllinux* *i686 *ppc64le *s390x cp39*win*arm64"
182
+ test-requires = ["scikit-learn", "lfdfiles", "sdtfile", "ptufile", "liffile", "pawflim", "pytest", "pytest-cov", "pytest-runner", "pytest-doctestplus", "coverage"]
192
183
  test-command = "pytest {project}/tests"
@@ -0,0 +1,9 @@
1
+ """PhasorPy package."""
2
+
3
+ from __future__ import annotations
4
+
5
+ __all__ = ['__version__']
6
+
7
+
8
+ __version__ = '0.6'
9
+ """PhasorPy version string."""