phasorpy 0.7__tar.gz → 0.9__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 (137) hide show
  1. {phasorpy-0.7 → phasorpy-0.9}/LICENSE.txt +3 -3
  2. {phasorpy-0.7 → phasorpy-0.9}/MANIFEST.in +1 -2
  3. {phasorpy-0.7/src/phasorpy.egg-info → phasorpy-0.9}/PKG-INFO +20 -23
  4. {phasorpy-0.7 → phasorpy-0.9}/README.md +5 -2
  5. {phasorpy-0.7 → phasorpy-0.9}/docs/_static/switcher.json +9 -9
  6. {phasorpy-0.7 → phasorpy-0.9}/docs/acknowledgments.rst +4 -4
  7. phasorpy-0.9/docs/api/_phasorpy.rst +8 -0
  8. phasorpy-0.9/docs/api/_utils.rst +5 -0
  9. {phasorpy-0.7 → phasorpy-0.9}/docs/api/cli.rst +1 -1
  10. phasorpy-0.9/docs/api/filter.rst +5 -0
  11. {phasorpy-0.7 → phasorpy-0.9}/docs/api/index.rst +3 -2
  12. {phasorpy-0.7 → phasorpy-0.9}/docs/conf.py +82 -7
  13. {phasorpy-0.7 → phasorpy-0.9}/docs/contributing.rst +35 -32
  14. {phasorpy-0.7 → phasorpy-0.9}/docs/index.rst +9 -9
  15. phasorpy-0.9/docs/license.rst +5 -0
  16. {phasorpy-0.7 → phasorpy-0.9}/docs/phasor_approach.rst +184 -57
  17. phasorpy-0.9/pyproject.toml +427 -0
  18. {phasorpy-0.7 → phasorpy-0.9}/setup.py +17 -6
  19. {phasorpy-0.7 → phasorpy-0.9}/src/phasorpy/__init__.py +1 -1
  20. {phasorpy-0.7 → phasorpy-0.9}/src/phasorpy/__main__.py +1 -1
  21. {phasorpy-0.7 → phasorpy-0.9}/src/phasorpy/_phasorpy.pyx +76 -42
  22. {phasorpy-0.7 → phasorpy-0.9}/src/phasorpy/_typing.py +1 -5
  23. {phasorpy-0.7 → phasorpy-0.9}/src/phasorpy/_utils.py +119 -86
  24. {phasorpy-0.7 → phasorpy-0.9}/src/phasorpy/cli.py +16 -17
  25. {phasorpy-0.7 → phasorpy-0.9}/src/phasorpy/cluster.py +48 -38
  26. {phasorpy-0.7 → phasorpy-0.9}/src/phasorpy/color.py +21 -17
  27. {phasorpy-0.7 → phasorpy-0.9}/src/phasorpy/component.py +127 -101
  28. {phasorpy-0.7 → phasorpy-0.9}/src/phasorpy/cursor.py +62 -51
  29. {phasorpy-0.7 → phasorpy-0.9}/src/phasorpy/datasets.py +15 -9
  30. phasorpy-0.9/src/phasorpy/experimental.py +146 -0
  31. phasorpy-0.9/src/phasorpy/filter.py +972 -0
  32. {phasorpy-0.7 → phasorpy-0.9}/src/phasorpy/io/__init__.py +22 -23
  33. {phasorpy-0.7 → phasorpy-0.9}/src/phasorpy/io/_flimlabs.py +53 -37
  34. {phasorpy-0.7 → phasorpy-0.9}/src/phasorpy/io/_leica.py +62 -60
  35. {phasorpy-0.7 → phasorpy-0.9}/src/phasorpy/io/_ometiff.py +54 -49
  36. {phasorpy-0.7 → phasorpy-0.9}/src/phasorpy/io/_other.py +102 -101
  37. {phasorpy-0.7 → phasorpy-0.9}/src/phasorpy/io/_simfcs.py +80 -72
  38. {phasorpy-0.7 → phasorpy-0.9}/src/phasorpy/lifetime.py +255 -228
  39. {phasorpy-0.7 → phasorpy-0.9}/src/phasorpy/phasor.py +285 -783
  40. {phasorpy-0.7 → phasorpy-0.9}/src/phasorpy/plot/__init__.py +0 -2
  41. {phasorpy-0.7 → phasorpy-0.9}/src/phasorpy/plot/_functions.py +83 -72
  42. {phasorpy-0.7 → phasorpy-0.9}/src/phasorpy/plot/_lifetime_plots.py +47 -29
  43. {phasorpy-0.7 → phasorpy-0.9}/src/phasorpy/plot/_phasorplot.py +115 -105
  44. {phasorpy-0.7 → phasorpy-0.9}/src/phasorpy/plot/_phasorplot_fret.py +41 -39
  45. {phasorpy-0.7 → phasorpy-0.9}/src/phasorpy/utils.py +30 -24
  46. {phasorpy-0.7 → phasorpy-0.9/src/phasorpy.egg-info}/PKG-INFO +20 -23
  47. {phasorpy-0.7 → phasorpy-0.9}/src/phasorpy.egg-info/SOURCES.txt +14 -1
  48. phasorpy-0.9/src/phasorpy.egg-info/requires.txt +18 -0
  49. phasorpy-0.9/tests/io/_conftest.py +73 -0
  50. phasorpy-0.9/tests/io/test_flimlabs.py +239 -0
  51. phasorpy-0.9/tests/io/test_leica.py +137 -0
  52. phasorpy-0.9/tests/io/test_ometiff.py +307 -0
  53. phasorpy-0.9/tests/io/test_other.py +333 -0
  54. phasorpy-0.9/tests/io/test_simfcs.py +425 -0
  55. phasorpy-0.9/tests/plot/test_functions.py +306 -0
  56. phasorpy-0.9/tests/plot/test_lifetime_plots.py +105 -0
  57. phasorpy-0.9/tests/plot/test_phasorplot.py +496 -0
  58. phasorpy-0.9/tests/plot/test_phasorplot_fret.py +53 -0
  59. {phasorpy-0.7 → phasorpy-0.9}/tests/test__phasorpy.py +9 -9
  60. {phasorpy-0.7 → phasorpy-0.9}/tests/test__typing.py +1 -1
  61. {phasorpy-0.7 → phasorpy-0.9}/tests/test__utils.py +5 -3
  62. {phasorpy-0.7 → phasorpy-0.9}/tests/test_cli.py +2 -2
  63. {phasorpy-0.7 → phasorpy-0.9}/tests/test_cluster.py +14 -15
  64. {phasorpy-0.7 → phasorpy-0.9}/tests/test_color.py +6 -6
  65. {phasorpy-0.7 → phasorpy-0.9}/tests/test_component.py +31 -25
  66. {phasorpy-0.7 → phasorpy-0.9}/tests/test_cursor.py +24 -13
  67. {phasorpy-0.7 → phasorpy-0.9}/tests/test_datasets.py +3 -3
  68. phasorpy-0.9/tests/test_experimental.py +37 -0
  69. phasorpy-0.9/tests/test_filter.py +1308 -0
  70. {phasorpy-0.7 → phasorpy-0.9}/tests/test_lifetime.py +71 -62
  71. {phasorpy-0.7 → phasorpy-0.9}/tests/test_nan.py +36 -37
  72. phasorpy-0.9/tests/test_phasor.py +1276 -0
  73. {phasorpy-0.7 → phasorpy-0.9}/tests/test_phasorpy.py +1 -1
  74. {phasorpy-0.7 → phasorpy-0.9}/tests/test_utils.py +1 -5
  75. {phasorpy-0.7 → phasorpy-0.9}/tools/build_manylinux.cmd +3 -3
  76. phasorpy-0.9/tools/build_manylinux.sh +10 -0
  77. {phasorpy-0.7 → phasorpy-0.9}/tools/sha256.py +4 -2
  78. {phasorpy-0.7 → phasorpy-0.9}/tutorials/README.rst +2 -2
  79. {phasorpy-0.7 → phasorpy-0.9}/tutorials/api/phasorpy_component.py +26 -26
  80. {phasorpy-0.7 → phasorpy-0.9}/tutorials/api/phasorpy_cursor.py +28 -17
  81. {phasorpy-0.7 → phasorpy-0.9}/tutorials/api/phasorpy_filter.py +18 -15
  82. {phasorpy-0.7 → phasorpy-0.9}/tutorials/api/phasorpy_fret.py +32 -59
  83. {phasorpy-0.7 → phasorpy-0.9}/tutorials/api/phasorpy_io.py +67 -66
  84. {phasorpy-0.7 → phasorpy-0.9}/tutorials/api/phasorpy_lifetime_to_signal.py +24 -18
  85. {phasorpy-0.7 → phasorpy-0.9}/tutorials/api/phasorpy_multi_harmonic.py +36 -34
  86. {phasorpy-0.7 → phasorpy-0.9}/tutorials/api/phasorpy_pca.py +19 -15
  87. {phasorpy-0.7 → phasorpy-0.9}/tutorials/api/phasorpy_phasor_from_lifetime.py +21 -18
  88. {phasorpy-0.7 → phasorpy-0.9}/tutorials/api/phasorpy_phasorplot.py +12 -11
  89. {phasorpy-0.7 → phasorpy-0.9}/tutorials/applications/phasorpy_component_fit.py +24 -23
  90. {phasorpy-0.7 → phasorpy-0.9}/tutorials/applications/phasorpy_fret_efficiency.py +31 -16
  91. {phasorpy-0.7 → phasorpy-0.9}/tutorials/applications/phasorpy_multidimensional.py +21 -22
  92. phasorpy-0.9/tutorials/misc/phasorpy_apps.py +77 -0
  93. {phasorpy-0.7 → phasorpy-0.9}/tutorials/misc/phasorpy_logo.py +16 -14
  94. {phasorpy-0.7 → phasorpy-0.9}/tutorials/misc/phasorpy_phasor_from_signal.py +49 -45
  95. {phasorpy-0.7 → phasorpy-0.9}/tutorials/phasorpy_introduction.py +41 -30
  96. {phasorpy-0.7 → phasorpy-0.9}/tutorials/phasorpy_lfd_workshop.py +47 -36
  97. {phasorpy-0.7 → phasorpy-0.9}/tutorials/phasorpy_lifetime_geometry.py +19 -18
  98. phasorpy-0.7/docs/api/_phasorpy.rst +0 -12
  99. phasorpy-0.7/docs/api/_utils.rst +0 -9
  100. phasorpy-0.7/docs/license.rst +0 -22
  101. phasorpy-0.7/docs/release.rst +0 -417
  102. phasorpy-0.7/pyproject.toml +0 -184
  103. phasorpy-0.7/src/phasorpy/experimental.py +0 -310
  104. phasorpy-0.7/src/phasorpy.egg-info/requires.txt +0 -25
  105. phasorpy-0.7/tests/test_experimental.py +0 -117
  106. phasorpy-0.7/tests/test_phasor.py +0 -2391
  107. phasorpy-0.7/tools/build_manylinux.sh +0 -10
  108. {phasorpy-0.7 → phasorpy-0.9}/docs/_static/categorical.png +0 -0
  109. {phasorpy-0.7 → phasorpy-0.9}/docs/_static/custom-icons.js +0 -0
  110. {phasorpy-0.7 → phasorpy-0.9}/docs/_static/favicon.ico +0 -0
  111. {phasorpy-0.7 → phasorpy-0.9}/docs/_static/phasorpy_logo.png +0 -0
  112. {phasorpy-0.7 → phasorpy-0.9}/docs/_static/phasorpy_logo.svg +0 -0
  113. {phasorpy-0.7 → phasorpy-0.9}/docs/_static/srgb_spectrum.png +0 -0
  114. {phasorpy-0.7 → phasorpy-0.9}/docs/api/cluster.rst +0 -0
  115. {phasorpy-0.7 → phasorpy-0.9}/docs/api/color.rst +0 -0
  116. {phasorpy-0.7 → phasorpy-0.9}/docs/api/component.rst +0 -0
  117. {phasorpy-0.7 → phasorpy-0.9}/docs/api/cursor.rst +0 -0
  118. {phasorpy-0.7 → phasorpy-0.9}/docs/api/datasets.rst +0 -0
  119. {phasorpy-0.7 → phasorpy-0.9}/docs/api/experimental.rst +0 -0
  120. {phasorpy-0.7 → phasorpy-0.9}/docs/api/io.rst +0 -0
  121. {phasorpy-0.7 → phasorpy-0.9}/docs/api/lifetime.rst +0 -0
  122. {phasorpy-0.7 → phasorpy-0.9}/docs/api/phasor.rst +0 -0
  123. {phasorpy-0.7 → phasorpy-0.9}/docs/api/phasorpy.rst +0 -0
  124. {phasorpy-0.7 → phasorpy-0.9}/docs/api/plot.rst +0 -0
  125. {phasorpy-0.7 → phasorpy-0.9}/docs/api/utils.rst +0 -0
  126. {phasorpy-0.7 → phasorpy-0.9}/docs/code_of_conduct.rst +0 -0
  127. {phasorpy-0.7 → phasorpy-0.9}/setup.cfg +0 -0
  128. {phasorpy-0.7 → phasorpy-0.9}/src/phasorpy/conftest.py +0 -0
  129. {phasorpy-0.7 → phasorpy-0.9}/src/phasorpy/py.typed +0 -0
  130. {phasorpy-0.7 → phasorpy-0.9}/src/phasorpy.egg-info/dependency_links.txt +0 -0
  131. {phasorpy-0.7 → phasorpy-0.9}/src/phasorpy.egg-info/entry_points.txt +0 -0
  132. {phasorpy-0.7 → phasorpy-0.9}/src/phasorpy.egg-info/not-zip-safe +0 -0
  133. {phasorpy-0.7 → phasorpy-0.9}/src/phasorpy.egg-info/top_level.txt +0 -0
  134. {phasorpy-0.7 → phasorpy-0.9}/tests/conftest.py +0 -0
  135. {phasorpy-0.7 → phasorpy-0.9}/tutorials/api/README.rst +0 -0
  136. {phasorpy-0.7 → phasorpy-0.9}/tutorials/applications/README.rst +0 -0
  137. {phasorpy-0.7 → phasorpy-0.9}/tutorials/misc/README.rst +0 -0
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2022-2025 PhasorPy Contributors
3
+ Copyright (c) 2022-2026 PhasorPy Contributors
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
@@ -9,8 +9,8 @@ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
9
  copies of the Software, and to permit persons to whom the Software is
10
10
  furnished to do so, subject to the following conditions:
11
11
 
12
- The above copyright notice and this permission notice shall be included in all
13
- copies or substantial portions of the Software.
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
14
 
15
15
  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
16
  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
@@ -1,13 +1,12 @@
1
1
  include LICENSE.txt
2
2
  include README.md
3
3
 
4
- include tests/*.py
5
-
6
4
  include docs/*.py
7
5
  include docs/*.rst
8
6
  include docs/api/*.rst
9
7
  include docs/_static/*.*
10
8
 
9
+ recursive-include tests *.py
11
10
  recursive-include tutorials *.py
12
11
  recursive-include tutorials *.rst
13
12
 
@@ -1,7 +1,7 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: phasorpy
3
- Version: 0.7
4
- Summary: Analysis of fluorescence lifetime and hyperspectral images using the phasor approach
3
+ Version: 0.9
4
+ Summary: Analysis of luminescence lifetime and hyperspectral images using the phasor approach
5
5
  Author: PhasorPy Contributors
6
6
  License-Expression: MIT
7
7
  Project-URL: Homepage, https://www.phasorpy.org
@@ -18,40 +18,34 @@ Classifier: Topic :: Software Development :: Libraries :: Python Modules
18
18
  Classifier: Operating System :: OS Independent
19
19
  Classifier: Programming Language :: Python :: 3
20
20
  Classifier: Programming Language :: Python :: 3 :: Only
21
- Classifier: Programming Language :: Python :: 3.11
22
21
  Classifier: Programming Language :: Python :: 3.12
23
22
  Classifier: Programming Language :: Python :: 3.13
24
- Requires-Python: >=3.11
23
+ Classifier: Programming Language :: Python :: 3.14
24
+ Requires-Python: >=3.12
25
25
  Description-Content-Type: text/markdown
26
26
  License-File: LICENSE.txt
27
- Requires-Dist: numpy>=1.26.0
28
- Requires-Dist: matplotlib>=3.8.0
29
- Requires-Dist: scipy>=1.11.0
27
+ Requires-Dist: numpy>=2.0.0
28
+ Requires-Dist: matplotlib>=3.9.0
29
+ Requires-Dist: pandas>=2.2.0
30
+ Requires-Dist: scikit-learn>=1.5.0
31
+ Requires-Dist: scipy>=1.13.0
32
+ Requires-Dist: tifffile>=2024.8.30
33
+ Requires-Dist: xarray>=2024.6.0
30
34
  Requires-Dist: click
31
35
  Requires-Dist: pooch
32
36
  Requires-Dist: tqdm
33
- Requires-Dist: scikit-learn>=1.5.0
34
- Requires-Dist: xarray>=2023.4.0
35
- Requires-Dist: tifffile>=2024.8.30
36
- Provides-Extra: docs
37
- Requires-Dist: sphinx; extra == "docs"
38
- Requires-Dist: sphinx-issues; extra == "docs"
39
- Requires-Dist: sphinx_gallery; extra == "docs"
40
- Requires-Dist: sphinx-copybutton; extra == "docs"
41
- Requires-Dist: sphinx_click; extra == "docs"
42
- Requires-Dist: pydata-sphinx-theme>=0.16.0; extra == "docs"
43
- Requires-Dist: numpydoc; extra == "docs"
44
37
  Provides-Extra: all
38
+ Requires-Dist: fbdfile>=2025.9.18; extra == "all"
45
39
  Requires-Dist: lfdfiles>=2024.5.24; extra == "all"
46
- Requires-Dist: sdtfile>=2024.5.24; extra == "all"
47
- Requires-Dist: ptufile>=2024.9.14; extra == "all"
48
40
  Requires-Dist: liffile>=2025.2.10; extra == "all"
49
- Requires-Dist: pawflim; extra == "all"
41
+ Requires-Dist: ptufile>=2024.9.14; extra == "all"
42
+ Requires-Dist: sdtfile>=2024.5.24; extra == "all"
43
+ Requires-Dist: pawflim>=1.0.4; extra == "all"
50
44
  Dynamic: license-file
51
45
 
52
- # PhasorPy
46
+ # <img src="docs/_static/phasorpy_logo.svg" alt="PhasorPy" width="48" height="48" align="left"> PhasorPy
53
47
 
54
- PhasorPy is an open-source Python library for the analysis of fluorescence
48
+ PhasorPy is an open-source Python library for the analysis of luminescence
55
49
  lifetime and hyperspectral images using the phasor approach.
56
50
 
57
51
  - [Homepage](https://www.phasorpy.org)
@@ -61,6 +55,9 @@ lifetime and hyperspectral images using the phasor approach.
61
55
  - [Data files](https://zenodo.org/communities/phasorpy/)
62
56
  - [Issues and questions](https://github.com/phasorpy/phasorpy/issues)
63
57
 
58
+ Please cite [doi: 10.5281/zenodo.13862586](https://doi.org/10.5281/zenodo.13862586)
59
+ if PhasorPy contributes to research that leads to a publication.
60
+
64
61
  PhasorPy is a community-maintained project.
65
62
  [Contributions](https://www.phasorpy.org/docs/stable/contributing/)
66
63
  in the form of bug reports, bug fixes, feature implementations, documentation,
@@ -1,6 +1,6 @@
1
- # PhasorPy
1
+ # <img src="docs/_static/phasorpy_logo.svg" alt="PhasorPy" width="48" height="48" align="left"> PhasorPy
2
2
 
3
- PhasorPy is an open-source Python library for the analysis of fluorescence
3
+ PhasorPy is an open-source Python library for the analysis of luminescence
4
4
  lifetime and hyperspectral images using the phasor approach.
5
5
 
6
6
  - [Homepage](https://www.phasorpy.org)
@@ -10,6 +10,9 @@ lifetime and hyperspectral images using the phasor approach.
10
10
  - [Data files](https://zenodo.org/communities/phasorpy/)
11
11
  - [Issues and questions](https://github.com/phasorpy/phasorpy/issues)
12
12
 
13
+ Please cite [doi: 10.5281/zenodo.13862586](https://doi.org/10.5281/zenodo.13862586)
14
+ if PhasorPy contributes to research that leads to a publication.
15
+
13
16
  PhasorPy is a community-maintained project.
14
17
  [Contributions](https://www.phasorpy.org/docs/stable/contributing/)
15
18
  in the form of bug reports, bug fixes, feature implementations, documentation,
@@ -1,23 +1,23 @@
1
1
  [
2
2
  {
3
3
  "name": "dev",
4
- "version": "0.8",
4
+ "version": "0.10",
5
5
  "url": "https://www.phasorpy.org/docs/dev/"
6
6
  },
7
7
  {
8
- "name": "0.7 (stable)",
9
- "version": "0.7",
8
+ "name": "0.9 (stable)",
9
+ "version": "0.9",
10
10
  "url": "https://www.phasorpy.org/docs/stable/",
11
11
  "preferred": true
12
12
  },
13
13
  {
14
- "name": "0.6",
15
- "version": "0.6",
16
- "url": "https://www.phasorpy.org/docs/v0.6/"
14
+ "name": "0.8",
15
+ "version": "0.8",
16
+ "url": "https://www.phasorpy.org/docs/v0.8/"
17
17
  },
18
18
  {
19
- "name": "0.5",
20
- "version": "0.5",
21
- "url": "https://www.phasorpy.org/docs/v0.5/"
19
+ "name": "0.7",
20
+ "version": "0.7",
21
+ "url": "https://www.phasorpy.org/docs/v0.7/"
22
22
  }
23
23
  ]
@@ -3,7 +3,7 @@ Acknowledgments
3
3
 
4
4
  The PhasorPy project was established by the
5
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
6
+ at the University of the Republic and Institut Pasteur de Montevideo, and the
7
7
  `Laboratory for Fluorescence Dynamics <https://www.lfd.uci.edu>`_
8
8
  at the University of California, Irvine.
9
9
 
@@ -22,7 +22,8 @@ This software project was supported in part by the
22
22
  Contributors
23
23
  ------------
24
24
 
25
- PhasorPy is developed by `contributors to the PhasorPy repository
25
+ PhasorPy is developed by
26
+ `contributors to the PhasorPy repository
26
27
  <https://github.com/phasorpy/phasorpy/graphs/contributors>`_
27
28
  and
28
29
  `members of the PhasorPy organization
@@ -37,6 +38,5 @@ feature suggestions, and data files that have helped improve the library.
37
38
  Citation
38
39
  --------
39
40
 
40
- If PhasorPy contributes to a project that leads to a publication,
41
- please cite
41
+ If PhasorPy contributes to research that leads to a publication, please cite
42
42
  `doi: 10.5281/zenodo.13862586 <https://doi.org/10.5281/zenodo.13862586>`_.
@@ -0,0 +1,8 @@
1
+ phasorpy._phasorpy
2
+ ------------------
3
+
4
+ .. automodule:: phasorpy._phasorpy
5
+ :members:
6
+ :undoc-members:
7
+ :private-members:
8
+ :special-members:
@@ -0,0 +1,5 @@
1
+ phasorpy._utils
2
+ ---------------
3
+
4
+ .. automodule:: phasorpy._utils
5
+ :members:
@@ -1,4 +1,4 @@
1
- Command line interface
1
+ Command-line interface
2
2
  ----------------------
3
3
 
4
4
  .. click:: phasorpy.cli:main
@@ -0,0 +1,5 @@
1
+ phasorpy.filter
2
+ ---------------
3
+
4
+ .. automodule:: phasorpy.filter
5
+ :members:
@@ -1,8 +1,8 @@
1
1
  API reference
2
2
  =============
3
3
 
4
- This documents the application programming and command line interfaces of the
5
- PhasorPy library version |version|.
4
+ This documents the application programming and command-line interfaces of
5
+ the PhasorPy library version |version|.
6
6
 
7
7
  .. note::
8
8
  The PhasorPy library is still under construction. Backwards-incompatible
@@ -14,6 +14,7 @@ PhasorPy library version |version|.
14
14
  phasorpy
15
15
  phasor
16
16
  lifetime
17
+ filter
17
18
  component
18
19
  cluster
19
20
  cursor
@@ -1,5 +1,9 @@
1
- # Configuration file for the Sphinx documentation builder.
2
- # https://www.sphinx-doc.org/en/master/usage/configuration.html
1
+ """Sphinx build configuration file.
2
+
3
+ https://www.sphinx-doc.org/en/master/usage/configuration.html
4
+
5
+ """
6
+
3
7
  # pylint: skip-file
4
8
 
5
9
  import os
@@ -19,23 +23,25 @@ sphinx_gallery.gen_rst.EXAMPLE_HEADER = (
19
23
  # project information
20
24
 
21
25
  project = 'PhasorPy'
22
- copyright = '2022-2025 PhasorPy Contributors'
26
+ copyright = '2022-2026 PhasorPy Contributors'
23
27
  author = 'PhasorPy Contributors'
24
28
 
25
29
  import phasorpy
26
30
 
27
31
  version = phasorpy.__version__
28
32
  release = phasorpy.__version__
29
- version_match = version.replace('.dev', '').replace('.rc', '')
33
+ version_match = version.split('.dev')[0].split('.rc')[0]
30
34
 
31
35
  # general configuration
32
36
 
33
37
  extensions = [
38
+ 'sphinx.ext.mathjax',
34
39
  'sphinx.ext.napoleon',
35
40
  'sphinx.ext.autodoc',
36
41
  'sphinx.ext.autosummary',
37
42
  'sphinx.ext.doctest',
38
- 'sphinx.ext.viewcode',
43
+ # 'sphinx.ext.viewcode', # include source code in documentation
44
+ 'sphinx.ext.linkcode', # link to source code on GitHub
39
45
  'sphinx.ext.todo',
40
46
  # don't enable intersphinx since tutorials are getting littered with links
41
47
  # 'sphinx.ext.intersphinx',
@@ -60,6 +66,7 @@ html_static_path = ['_static']
60
66
  html_js_files = ['custom-icons.js']
61
67
  html_show_sourcelink = False
62
68
 
69
+ html_title = f'PhasorPy {version} documentation'
63
70
  html_logo = '_static/phasorpy_logo.svg'
64
71
  html_favicon = '_static/favicon.ico'
65
72
 
@@ -125,8 +132,16 @@ sphinx_gallery_conf = {
125
132
  'reference_url': {'phasorpy': None},
126
133
  'matplotlib_animations': True,
127
134
  'within_subsection_order': 'conf.TutorialOrder',
135
+ 'show_memory': False,
136
+ 'show_api_usage': False,
137
+ 'remove_config_comments': True,
138
+ # 'min_reported_time': 0.5,
139
+ # 'backreferences_dir': None,
128
140
  }
129
141
 
142
+ # TODO: remove MathJax 3 link once scroll bar issue is resolved
143
+ mathjax_path = 'https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-mml-chtml.js'
144
+
130
145
 
131
146
  class TutorialOrder:
132
147
  """Order tutorials in gallery subsections."""
@@ -151,8 +166,9 @@ class TutorialOrder:
151
166
  'fret_efficiency',
152
167
  'multidimensional',
153
168
  # misc
154
- 'phasor_from_signal',
155
169
  'logo',
170
+ 'apps',
171
+ 'phasor_from_signal',
156
172
  ]
157
173
 
158
174
  def __init__(self, srcdir: str): ...
@@ -176,7 +192,66 @@ intersphinx_mapping = {
176
192
  'skimage': ('https://scikit-image.org/docs/stable/', None),
177
193
  }
178
194
 
179
- intersphinx_disabled_reftypes = ['*']
195
+ # limit intersphinx linking to avoid "littering" tutorials
196
+ # disable doc links but allow function links
197
+ # intersphinx_disabled_reftypes = ['std:doc']
180
198
 
181
199
  # do not show typehints
182
200
  autodoc_typehints = 'none'
201
+
202
+
203
+ def linkcode_resolve(domain: str, info: dict[str, str]) -> str | None:
204
+ """Return GitHub URL for Python object."""
205
+ # adapted from
206
+ # https://github.com/matplotlib/matplotlib/blob/main/doc/conf.py
207
+ import inspect
208
+ from pathlib import Path
209
+
210
+ if domain != 'py':
211
+ return None
212
+
213
+ modname = info['module']
214
+ fullname = info['fullname']
215
+
216
+ submod = sys.modules.get(modname)
217
+ if submod is None:
218
+ return None
219
+
220
+ obj = submod
221
+ for part in fullname.split('.'):
222
+ try:
223
+ obj = getattr(obj, part)
224
+ except AttributeError:
225
+ return None
226
+
227
+ if inspect.isfunction(obj):
228
+ obj = inspect.unwrap(obj)
229
+ try:
230
+ fn = inspect.getsourcefile(obj)
231
+ except TypeError:
232
+ fn = None
233
+ if not fn or fn.endswith('__init__.py'):
234
+ try:
235
+ fn = inspect.getsourcefile(sys.modules[obj.__module__])
236
+ except (TypeError, AttributeError, KeyError):
237
+ fn = None
238
+ if not fn:
239
+ return None
240
+
241
+ try:
242
+ source, lineno = inspect.getsourcelines(obj)
243
+ except (OSError, TypeError):
244
+ lineno = None
245
+
246
+ linespec = f'#L{lineno:d}-L{lineno + len(source) - 1:d}' if lineno else ''
247
+
248
+ startdir = Path(phasorpy.__file__).parent.parent
249
+ try:
250
+ fn = os.path.relpath(fn, start=startdir).replace(os.path.sep, '/')
251
+ except ValueError:
252
+ return None
253
+
254
+ tag = 'main' if '.dev' in version or '.rc' in version else f'v{version}'
255
+ return (
256
+ f'https://github.com/phasorpy/phasorpy/blob/{tag}/src/{fn}{linespec}'
257
+ )
@@ -6,7 +6,7 @@ of bug reports, bug fixes, feature implementations, documentation, datasets,
6
6
  and enhancement proposals.
7
7
  This document provides information on how to contribute.
8
8
 
9
- The :doc:`code_of_conduct` should be honored by everyone participating in the
9
+ The :doc:`code_of_conduct` applies to everyone participating in the
10
10
  PhasorPy community.
11
11
 
12
12
  Ask for help
@@ -24,8 +24,8 @@ To suggest a new feature or other improvement to the PhasorPy library, open a
24
24
  Share data files
25
25
  ----------------
26
26
 
27
- The PhasorPy project strives to support reading image and metadata from many
28
- time-resolved and hyperspectral file formats used in bio-imaging.
27
+ The PhasorPy project strives to support reading images and metadata from many
28
+ time-resolved and hyperspectral file formats used in bioimaging.
29
29
  Consider sharing datasets for testing and use in tutorials, preferably with the
30
30
  `PhasorPy community on Zenodo <https://zenodo.org/communities/phasorpy/>`_.
31
31
 
@@ -36,8 +36,8 @@ To report a bug in the PhasorPy library, please open a
36
36
  `GitHub issue <https://github.com/phasorpy/phasorpy/issues>`_
37
37
  and include the following items in the bug report:
38
38
 
39
- - A minimal, self-contained Python code reproducing the problem.
40
- Format the code using markdown, for example::
39
+ - A minimal, self-contained Python script reproducing the problem.
40
+ Format the code as a Python code block, for example::
41
41
 
42
42
  ```Python
43
43
  import phasorpy
@@ -54,16 +54,16 @@ and include the following items in the bug report:
54
54
  or shared via cloud storage, preferably on
55
55
  `Zenodo.org <https://zenodo.org/communities/phasorpy/>`_.
56
56
 
57
- - An explanation why the current behavior is wrong and what is expected
57
+ - An explanation of why the current behavior is wrong and what is expected
58
58
  instead.
59
59
 
60
- - Information how PhasorPy was installed (pip, conda, or other) and the output
61
- of::
60
+ - Information on how PhasorPy was installed (pip, conda, or other) and the
61
+ output of::
62
62
 
63
63
  $ python -m phasorpy versions
64
- Python-3.13.3
65
- phasorpy-0.5
66
- numpy-2.2.6
64
+ Python-3.14.1
65
+ phasorpy-0.8
66
+ numpy-2.3.5
67
67
  ...
68
68
 
69
69
  Contribute code or documentation
@@ -75,7 +75,7 @@ a GitHub repository at
75
75
 
76
76
  The repository is based on `git <https://git-scm.com/>`_, a distributed
77
77
  version control software for tracking changes in the source code files and for
78
- coordinating work among programmers who are collaboratively developing.
78
+ coordinating work among programmers collaboratively developing the code.
79
79
 
80
80
  PhasorPy uses GitHub's `fork and pull collaborative development model
81
81
  <https://docs.github.com/en/pull-requests/collaborating-with-pull-requests>`_.
@@ -91,7 +91,7 @@ development guidelines.
91
91
  Fork the repository
92
92
  ...................
93
93
 
94
- To work on the PhasorPy source code, fork the repository by pressing the
94
+ To work with the PhasorPy source code, fork the repository by pressing the
95
95
  "Fork" button at
96
96
  `https://github.com/phasorpy/phasorpy <https://github.com/phasorpy/phasorpy>`_.
97
97
 
@@ -105,14 +105,15 @@ There are now two remote repositories:
105
105
  ``upstream``, which refers to the PhasorPy repository, and
106
106
  ``origin``, which refers to the personal fork.
107
107
 
108
- Instead of using the git command line application, you may find
108
+ Instead of using the git command-line application, you may find
109
109
  `GitHub Desktop <https://desktop.github.com>`_ easier to use.
110
110
 
111
111
  Create a development environment
112
112
  ................................
113
113
 
114
- A Python compatible C compiler is required for developing the PhasorPy
115
- library. For example, `Visual Studio <https://visualstudio.microsoft.com/>`_,
114
+ A C compiler compatible with the Python distribution is required for
115
+ developing the PhasorPy library. For example,
116
+ `Visual Studio <https://visualstudio.microsoft.com/>`_,
116
117
  `Xcode <https://developer.apple.com/xcode/>`_, or gcc.
117
118
 
118
119
  To work with the PhasorPy source code, it is recommended to set up a Python
@@ -124,7 +125,8 @@ following from within the local phasorpy repository::
124
125
  $ mkdir -p ~/pyenv/phasorpy-dev
125
126
  $ python -m venv ~/pyenv/phasorpy-dev
126
127
  $ source ~/pyenv/phasorpy-dev/bin/activate
127
- $ pip install -r requirements_dev.txt
128
+ $ pip install --upgrade pip
129
+ $ pip install --upgrade --group dev
128
130
  $ pip install -e .
129
131
 
130
132
  Verify that the development environment is working by running the tests::
@@ -152,7 +154,7 @@ For example::
152
154
  This changes the local repository to the "new-feature-branch" branch.
153
155
  Keep any changes in this branch specific to one bug or feature.
154
156
 
155
- To update this branch with latest code from the PhasorPy repository,
157
+ To update this branch with the latest code from the PhasorPy repository,
156
158
  retrieve the changes from the main branch, make a backup of the feature
157
159
  branch, and perform a rebase::
158
160
 
@@ -161,16 +163,16 @@ branch, and perform a rebase::
161
163
  $ git branch new-feature-branch-backup new-feature-branch
162
164
  $ git rebase upstream/main
163
165
 
164
- This replays local commits at the "new-feature-branch" branch on top
166
+ This replays local commits on the "new-feature-branch" branch on top
165
167
  of the latest PhasorPy upstream main branch.
166
- Merge-conflicts need to be resolved before submitting a pull request.
168
+ Merge conflicts need to be resolved before submitting a pull request.
167
169
 
168
170
  Tests
169
171
  .....
170
172
 
171
173
  PhasorPy includes a `pytest <https://docs.pytest.org/>`_ based suite of
172
- unit tests in the ``tests`` folder. All classes and functions must be tested
173
- thorougly.
174
+ unit tests in the ``tests`` folder. All user-facing classes and functions
175
+ should be covered by tests.
174
176
 
175
177
  Run the unit tests in the development environment::
176
178
 
@@ -188,7 +190,7 @@ Code standards
188
190
  ..............
189
191
 
190
192
  All the PhasorPy source code, including tutorials and docstring examples,
191
- must conform to certain styles, which can be and applied with
193
+ must conform to certain styles, which can be checked and applied with
192
194
  `pre-commit <https://pre-commit.com/>`_::
193
195
 
194
196
  $ python -m pre_commit run --all-files
@@ -221,7 +223,7 @@ Examples in docstrings must run and pass as
221
223
 
222
224
  $ python -m pytest -v src/phasorpy
223
225
 
224
- Examples in docstrings are meant to illustrate mere usage, not to
226
+ Examples in docstrings are meant to illustrate basic usage, not to
225
227
  provide a testing framework.
226
228
 
227
229
  PhasorPy uses `Sphinx <https://www.sphinx-doc.org>`_
@@ -235,13 +237,15 @@ markup language in the .rst files in the ``docs`` and ``tutorials`` folders.
235
237
  All user-facing classes and functions should be included in the
236
238
  ``docs/api/*.rst`` files.
237
239
 
238
- Any changes should be mentioned in the release notes (``docs/release.rst``).
240
+ Any changes should be mentioned in the release notes
241
+ (``docs/release/index.rst``).
239
242
 
240
243
  New features or important usage information should be covered in the
241
244
  tutorials. Tutorials are included in the documentation via the
242
245
  `Sphinx-Gallery <https://sphinx-gallery.github.io>`_
243
246
  extension, which builds an HTML gallery of examples from the set of Python
244
247
  scripts in the ``tutorials`` folder.
248
+ Avoid large external datasets or long-running computations.
245
249
 
246
250
  Examples in the .rst files must run and pass as doctests::
247
251
 
@@ -253,7 +257,8 @@ and tutorial files by running::
253
257
  $ cd docs
254
258
  $ make clean
255
259
  $ make html
256
- $ open _build/html/index.html
260
+
261
+ Then open ``_build/html/index.html`` in a web browser.
257
262
 
258
263
  Commit the changes
259
264
  ..................
@@ -274,11 +279,9 @@ on GitHub::
274
279
 
275
280
  $ git push origin new-feature-branch
276
281
 
277
- Open the personal fork on GitHub::
278
-
279
- $ open https://github.com/your-user-name/phasorpy.git
280
-
281
- Click the green "pull request" button on the "new-feature-branch" branch.
282
+ Then navigate to the personal fork on GitHub at
283
+ ``https://github.com/your-user-name/phasorpy`` and click the green
284
+ "pull request" button on the "new-feature-branch" branch.
282
285
 
283
286
  Review the pull request checklist for recommendations.
284
287
 
@@ -287,7 +290,7 @@ All tests are automatically run via
287
290
  and must pass before code or documentation can be accepted.
288
291
 
289
292
  Other PhasorPy developers will review the pull request to check and help
290
- to improve its implementation, documentation, and style.
293
+ improve its implementation, documentation, and style.
291
294
 
292
295
  Pull requests must be approved by a
293
296
  `PhasorPy organization member <https://github.com/orgs/phasorpy/people>`_
@@ -4,26 +4,26 @@ PhasorPy documentation
4
4
 
5
5
  Welcome to the documentation of PhasorPy version |version|.
6
6
 
7
- PhasorPy is an open-source Python library for the analysis of fluorescence
7
+ PhasorPy is an open-source Python library for the analysis of luminescence
8
8
  lifetime and hyperspectral images using the :doc:`phasor_approach`.
9
9
 
10
10
  Quickstart
11
11
  ==========
12
12
 
13
- The :doc:`tutorials/index` demonstrate the use of the library, from simple
13
+ The :doc:`tutorials/index` demonstrate how to use the library, from simple
14
14
  examples to advanced applications.
15
15
 
16
16
  The :doc:`api/index` contains detailed information about all functions and
17
17
  classes of the library.
18
18
 
19
- The :doc:`release` list recent bug fixes, feature enhancements, documentation
19
+ The :doc:`release/index` list recent bug fixes, feature enhancements, documentation,
20
20
  and maintenance changes.
21
21
 
22
22
  The :doc:`contributing` explains how to get support, report bugs,
23
- submit bug fixes, or improve documentation.
23
+ submit fixes, and improve the documentation.
24
24
 
25
- The :doc:`code_of_conduct` should be honored by everyone participating in
26
- the PhasorPy community.
25
+ The :doc:`code_of_conduct` applies to everyone participating in the
26
+ PhasorPy community.
27
27
 
28
28
  The :doc:`acknowledgments` list individuals and organizations that
29
29
  contributed to the development of PhasorPy.
@@ -48,8 +48,8 @@ Questions about the usage of the PhasorPy library are answered on the
48
48
  `issue tracker on GitHub <https://github.com/phasorpy/phasorpy/issues>`_.
49
49
 
50
50
  Please cite
51
- `doi: 10.5281/zenodo.13862587 <https://doi.org/10.5281/zenodo.13862587>`_
52
- if PhasorPy contributes to a project that leads to a publication.
51
+ `doi: 10.5281/zenodo.13862586 <https://doi.org/10.5281/zenodo.13862586>`_
52
+ if PhasorPy contributes to research that leads to a publication.
53
53
 
54
54
  Contents
55
55
  ========
@@ -60,7 +60,7 @@ Contents
60
60
  phasor_approach
61
61
  tutorials/index
62
62
  api/index
63
- release
63
+ release/index
64
64
  contributing
65
65
  acknowledgments
66
66
  license
@@ -0,0 +1,5 @@
1
+ MIT License
2
+ ===========
3
+
4
+ .. literalinclude:: ../LICENSE.txt
5
+ :language: text