phasorpy 0.6__tar.gz → 0.8__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.6 → phasorpy-0.8}/MANIFEST.in +5 -2
  2. {phasorpy-0.6/src/phasorpy.egg-info → phasorpy-0.8}/PKG-INFO +8 -7
  3. phasorpy-0.8/docs/_static/favicon.ico +0 -0
  4. phasorpy-0.8/docs/_static/phasorpy_logo.png +0 -0
  5. phasorpy-0.8/docs/_static/phasorpy_logo.svg +238 -0
  6. {phasorpy-0.6 → phasorpy-0.8}/docs/_static/switcher.json +9 -9
  7. phasorpy-0.8/docs/api/_phasorpy.rst +8 -0
  8. phasorpy-0.8/docs/api/_utils.rst +5 -0
  9. phasorpy-0.8/docs/api/component.rst +5 -0
  10. phasorpy-0.8/docs/api/cursor.rst +5 -0
  11. phasorpy-0.8/docs/api/filter.rst +5 -0
  12. {phasorpy-0.6 → phasorpy-0.8}/docs/api/index.rst +4 -2
  13. phasorpy-0.8/docs/api/lifetime.rst +5 -0
  14. {phasorpy-0.6 → phasorpy-0.8}/docs/conf.py +81 -10
  15. {phasorpy-0.6 → phasorpy-0.8}/docs/phasor_approach.rst +15 -0
  16. {phasorpy-0.6 → phasorpy-0.8}/docs/release.rst +118 -11
  17. {phasorpy-0.6 → phasorpy-0.8}/pyproject.toml +15 -13
  18. {phasorpy-0.6 → phasorpy-0.8}/src/phasorpy/__init__.py +1 -1
  19. {phasorpy-0.6 → phasorpy-0.8}/src/phasorpy/_phasorpy.pyx +320 -10
  20. {phasorpy-0.6 → phasorpy-0.8}/src/phasorpy/_utils.py +114 -33
  21. {phasorpy-0.6 → phasorpy-0.8}/src/phasorpy/cli.py +19 -1
  22. {phasorpy-0.6 → phasorpy-0.8}/src/phasorpy/cluster.py +12 -18
  23. {phasorpy-0.6 → phasorpy-0.8}/src/phasorpy/color.py +11 -7
  24. phasorpy-0.6/src/phasorpy/components.py → phasorpy-0.8/src/phasorpy/component.py +263 -36
  25. phasorpy-0.6/src/phasorpy/cursors.py → phasorpy-0.8/src/phasorpy/cursor.py +31 -33
  26. {phasorpy-0.6 → phasorpy-0.8}/src/phasorpy/datasets.py +118 -8
  27. phasorpy-0.8/src/phasorpy/experimental.py +148 -0
  28. phasorpy-0.8/src/phasorpy/filter.py +966 -0
  29. {phasorpy-0.6 → phasorpy-0.8}/src/phasorpy/io/__init__.py +3 -1
  30. {phasorpy-0.6 → phasorpy-0.8}/src/phasorpy/io/_flimlabs.py +26 -16
  31. {phasorpy-0.6 → phasorpy-0.8}/src/phasorpy/io/_leica.py +38 -34
  32. {phasorpy-0.6 → phasorpy-0.8}/src/phasorpy/io/_ometiff.py +10 -9
  33. {phasorpy-0.6 → phasorpy-0.8}/src/phasorpy/io/_other.py +116 -8
  34. {phasorpy-0.6 → phasorpy-0.8}/src/phasorpy/io/_simfcs.py +52 -24
  35. phasorpy-0.8/src/phasorpy/lifetime.py +2058 -0
  36. phasorpy-0.8/src/phasorpy/phasor.py +1498 -0
  37. {phasorpy-0.6 → phasorpy-0.8}/src/phasorpy/plot/_functions.py +13 -7
  38. {phasorpy-0.6 → phasorpy-0.8}/src/phasorpy/plot/_lifetime_plots.py +34 -24
  39. {phasorpy-0.6 → phasorpy-0.8}/src/phasorpy/plot/_phasorplot.py +561 -176
  40. {phasorpy-0.6 → phasorpy-0.8}/src/phasorpy/plot/_phasorplot_fret.py +12 -10
  41. {phasorpy-0.6 → phasorpy-0.8}/src/phasorpy/utils.py +22 -10
  42. {phasorpy-0.6 → phasorpy-0.8/src/phasorpy.egg-info}/PKG-INFO +8 -7
  43. {phasorpy-0.6 → phasorpy-0.8}/src/phasorpy.egg-info/SOURCES.txt +36 -13
  44. {phasorpy-0.6 → phasorpy-0.8}/src/phasorpy.egg-info/requires.txt +5 -4
  45. phasorpy-0.8/tests/io/_conftest.py +67 -0
  46. phasorpy-0.8/tests/io/test_flimlabs.py +239 -0
  47. phasorpy-0.8/tests/io/test_leica.py +137 -0
  48. phasorpy-0.8/tests/io/test_ometiff.py +305 -0
  49. phasorpy-0.8/tests/io/test_other.py +333 -0
  50. phasorpy-0.8/tests/io/test_simfcs.py +421 -0
  51. phasorpy-0.8/tests/plot/test_functions.py +304 -0
  52. phasorpy-0.8/tests/plot/test_lifetime_plots.py +105 -0
  53. phasorpy-0.8/tests/plot/test_phasorplot.py +494 -0
  54. phasorpy-0.8/tests/plot/test_phasorplot_fret.py +53 -0
  55. {phasorpy-0.6 → phasorpy-0.8}/tests/test__phasorpy.py +5 -5
  56. {phasorpy-0.6 → phasorpy-0.8}/tests/test__utils.py +9 -4
  57. {phasorpy-0.6 → phasorpy-0.8}/tests/test_cli.py +8 -0
  58. {phasorpy-0.6 → phasorpy-0.8}/tests/test_cluster.py +11 -11
  59. phasorpy-0.6/tests/test_components.py → phasorpy-0.8/tests/test_component.py +228 -18
  60. phasorpy-0.6/tests/test_cursors.py → phasorpy-0.8/tests/test_cursor.py +35 -20
  61. {phasorpy-0.6 → phasorpy-0.8}/tests/test_datasets.py +3 -0
  62. phasorpy-0.8/tests/test_experimental.py +37 -0
  63. phasorpy-0.8/tests/test_filter.py +1333 -0
  64. phasorpy-0.8/tests/test_lifetime.py +1781 -0
  65. {phasorpy-0.6 → phasorpy-0.8}/tests/test_nan.py +46 -45
  66. phasorpy-0.8/tests/test_phasor.py +1283 -0
  67. phasorpy-0.8/tools/build_manylinux.cmd +13 -0
  68. phasorpy-0.8/tools/build_manylinux.sh +10 -0
  69. phasorpy-0.8/tools/sha256.py +36 -0
  70. phasorpy-0.6/tutorials/api/phasorpy_components.py → phasorpy-0.8/tutorials/api/phasorpy_component.py +11 -11
  71. phasorpy-0.6/tutorials/api/phasorpy_cursors.py → phasorpy-0.8/tutorials/api/phasorpy_cursor.py +31 -33
  72. phasorpy-0.6/tutorials/api/phasorpy_filtering.py → phasorpy-0.8/tutorials/api/phasorpy_filter.py +6 -6
  73. {phasorpy-0.6 → phasorpy-0.8}/tutorials/api/phasorpy_fret.py +4 -4
  74. {phasorpy-0.6 → phasorpy-0.8}/tutorials/api/phasorpy_io.py +52 -53
  75. {phasorpy-0.6 → phasorpy-0.8}/tutorials/api/phasorpy_lifetime_to_signal.py +3 -3
  76. phasorpy-0.6/tutorials/api/phasorpy_multi-harmonic.py → phasorpy-0.8/tutorials/api/phasorpy_multi_harmonic.py +3 -6
  77. {phasorpy-0.6 → phasorpy-0.8}/tutorials/api/phasorpy_pca.py +4 -4
  78. {phasorpy-0.6 → phasorpy-0.8}/tutorials/api/phasorpy_phasor_from_lifetime.py +8 -7
  79. {phasorpy-0.6 → phasorpy-0.8}/tutorials/api/phasorpy_phasorplot.py +139 -37
  80. {phasorpy-0.6 → phasorpy-0.8}/tutorials/applications/phasorpy_component_fit.py +37 -26
  81. {phasorpy-0.6 → phasorpy-0.8}/tutorials/applications/phasorpy_fret_efficiency.py +18 -16
  82. phasorpy-0.8/tutorials/applications/phasorpy_multidimensional.py +312 -0
  83. phasorpy-0.8/tutorials/misc/README.rst +4 -0
  84. phasorpy-0.8/tutorials/misc/phasorpy_logo.py +141 -0
  85. {phasorpy-0.6/tutorials/benchmarks → phasorpy-0.8/tutorials/misc}/phasorpy_phasor_from_signal.py +2 -2
  86. {phasorpy-0.6 → phasorpy-0.8}/tutorials/phasorpy_introduction.py +45 -40
  87. {phasorpy-0.6 → phasorpy-0.8}/tutorials/phasorpy_lfd_workshop.py +14 -15
  88. {phasorpy-0.6 → phasorpy-0.8}/tutorials/phasorpy_lifetime_geometry.py +94 -80
  89. phasorpy-0.6/docs/_static/logo.png +0 -0
  90. phasorpy-0.6/docs/api/_phasorpy.rst +0 -12
  91. phasorpy-0.6/docs/api/_utils.rst +0 -9
  92. phasorpy-0.6/docs/api/components.rst +0 -5
  93. phasorpy-0.6/docs/api/cursors.rst +0 -5
  94. phasorpy-0.6/src/phasorpy/experimental.py +0 -312
  95. phasorpy-0.6/src/phasorpy/phasor.py +0 -3894
  96. phasorpy-0.6/tests/test_experimental.py +0 -117
  97. phasorpy-0.6/tests/test_phasor.py +0 -3916
  98. phasorpy-0.6/tutorials/benchmarks/README.rst +0 -4
  99. {phasorpy-0.6 → phasorpy-0.8}/LICENSE.txt +0 -0
  100. {phasorpy-0.6 → phasorpy-0.8}/README.md +0 -0
  101. {phasorpy-0.6 → phasorpy-0.8}/docs/_static/categorical.png +0 -0
  102. {phasorpy-0.6 → phasorpy-0.8}/docs/_static/custom-icons.js +0 -0
  103. {phasorpy-0.6 → phasorpy-0.8}/docs/_static/srgb_spectrum.png +0 -0
  104. {phasorpy-0.6 → phasorpy-0.8}/docs/acknowledgments.rst +0 -0
  105. {phasorpy-0.6 → phasorpy-0.8}/docs/api/cli.rst +0 -0
  106. {phasorpy-0.6 → phasorpy-0.8}/docs/api/cluster.rst +0 -0
  107. {phasorpy-0.6 → phasorpy-0.8}/docs/api/color.rst +0 -0
  108. {phasorpy-0.6 → phasorpy-0.8}/docs/api/datasets.rst +0 -0
  109. {phasorpy-0.6 → phasorpy-0.8}/docs/api/experimental.rst +0 -0
  110. {phasorpy-0.6 → phasorpy-0.8}/docs/api/io.rst +0 -0
  111. {phasorpy-0.6 → phasorpy-0.8}/docs/api/phasor.rst +0 -0
  112. {phasorpy-0.6 → phasorpy-0.8}/docs/api/phasorpy.rst +0 -0
  113. {phasorpy-0.6 → phasorpy-0.8}/docs/api/plot.rst +0 -0
  114. {phasorpy-0.6 → phasorpy-0.8}/docs/api/utils.rst +0 -0
  115. {phasorpy-0.6 → phasorpy-0.8}/docs/code_of_conduct.rst +0 -0
  116. {phasorpy-0.6 → phasorpy-0.8}/docs/contributing.rst +0 -0
  117. {phasorpy-0.6 → phasorpy-0.8}/docs/index.rst +0 -0
  118. {phasorpy-0.6 → phasorpy-0.8}/docs/license.rst +0 -0
  119. {phasorpy-0.6 → phasorpy-0.8}/setup.cfg +0 -0
  120. {phasorpy-0.6 → phasorpy-0.8}/setup.py +0 -0
  121. {phasorpy-0.6 → phasorpy-0.8}/src/phasorpy/__main__.py +0 -0
  122. {phasorpy-0.6 → phasorpy-0.8}/src/phasorpy/_typing.py +0 -0
  123. {phasorpy-0.6 → phasorpy-0.8}/src/phasorpy/conftest.py +0 -0
  124. {phasorpy-0.6 → phasorpy-0.8}/src/phasorpy/plot/__init__.py +0 -0
  125. {phasorpy-0.6 → phasorpy-0.8}/src/phasorpy/py.typed +0 -0
  126. {phasorpy-0.6 → phasorpy-0.8}/src/phasorpy.egg-info/dependency_links.txt +0 -0
  127. {phasorpy-0.6 → phasorpy-0.8}/src/phasorpy.egg-info/entry_points.txt +0 -0
  128. {phasorpy-0.6 → phasorpy-0.8}/src/phasorpy.egg-info/not-zip-safe +0 -0
  129. {phasorpy-0.6 → phasorpy-0.8}/src/phasorpy.egg-info/top_level.txt +0 -0
  130. {phasorpy-0.6 → phasorpy-0.8}/tests/conftest.py +0 -0
  131. {phasorpy-0.6 → phasorpy-0.8}/tests/test__typing.py +0 -0
  132. {phasorpy-0.6 → phasorpy-0.8}/tests/test_color.py +0 -0
  133. {phasorpy-0.6 → phasorpy-0.8}/tests/test_phasorpy.py +0 -0
  134. {phasorpy-0.6 → phasorpy-0.8}/tests/test_utils.py +0 -0
  135. {phasorpy-0.6 → phasorpy-0.8}/tutorials/README.rst +0 -0
  136. {phasorpy-0.6 → phasorpy-0.8}/tutorials/api/README.rst +0 -0
  137. {phasorpy-0.6 → phasorpy-0.8}/tutorials/applications/README.rst +0 -0
@@ -1,19 +1,22 @@
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
 
14
13
  exclude *.cmd
15
14
  exclude docs/sg_execution_times.rst
16
15
 
16
+ include tools/*.py
17
+ include tools/*.sh
18
+ include tools/*.cmd
19
+
17
20
  recursive-exclude * __pycache__
18
21
  recursive-exclude * *.py[co]
19
22
  recursive-exclude * *Copy*
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: phasorpy
3
- Version: 0.6
3
+ Version: 0.8
4
4
  Summary: Analysis of fluorescence lifetime and hyperspectral images using the phasor approach
5
5
  Author: PhasorPy Contributors
6
6
  License-Expression: MIT
@@ -18,20 +18,20 @@ 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.25.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: scipy>=1.13.0
30
30
  Requires-Dist: click
31
31
  Requires-Dist: pooch
32
32
  Requires-Dist: tqdm
33
33
  Requires-Dist: scikit-learn>=1.5.0
34
- Requires-Dist: xarray>=2023.4.0
34
+ Requires-Dist: xarray>=2024.6.0
35
35
  Requires-Dist: tifffile>=2024.8.30
36
36
  Provides-Extra: docs
37
37
  Requires-Dist: sphinx; extra == "docs"
@@ -46,6 +46,7 @@ Requires-Dist: lfdfiles>=2024.5.24; extra == "all"
46
46
  Requires-Dist: sdtfile>=2024.5.24; extra == "all"
47
47
  Requires-Dist: ptufile>=2024.9.14; extra == "all"
48
48
  Requires-Dist: liffile>=2025.2.10; extra == "all"
49
+ Requires-Dist: fbdfile>=2025.9.18; extra == "all"
49
50
  Requires-Dist: pawflim; extra == "all"
50
51
  Dynamic: license-file
51
52
 
Binary file
@@ -0,0 +1,238 @@
1
+ <?xml version="1.0" encoding="utf-8" standalone="no"?>
2
+ <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
3
+ "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
4
+ <svg xmlns:xlink="http://www.w3.org/1999/xlink" width="466.821818pt" height="475.2pt" viewBox="0 0 466.821818 475.2" xmlns="http://www.w3.org/2000/svg" version="1.1">
5
+ <metadata>
6
+ <rdf:RDF xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
7
+ <cc:Work>
8
+ <dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
9
+ <dc:date>2025-08-16T13:06:26.207012</dc:date>
10
+ <dc:format>image/svg+xml</dc:format>
11
+ <dc:creator>
12
+ <cc:Agent>
13
+ <dc:title>Matplotlib v3.10.3, https://matplotlib.org/</dc:title>
14
+ </cc:Agent>
15
+ </dc:creator>
16
+ </cc:Work>
17
+ </rdf:RDF>
18
+ </metadata>
19
+ <defs>
20
+ <style type="text/css">*{stroke-linejoin: round; stroke-linecap: butt}</style>
21
+ </defs>
22
+ <g id="figure_1">
23
+ <g id="patch_1">
24
+ <path d="M 0 475.2
25
+ L 466.821818 475.2
26
+ L 466.821818 0
27
+ L 0 0
28
+ L 0 475.2
29
+ z
30
+ " style="fill: none"/>
31
+ </g>
32
+ <g id="axes_1">
33
+ <g id="patch_2">
34
+ <path d="M 442.865455 237.6
35
+ C 442.865455 182.070506 420.782921 128.758553 381.517639 89.493271
36
+ C 342.252357 50.227989 288.940403 28.145455 233.410909 28.145455
37
+ C 177.881415 28.145455 124.569462 50.227989 85.30418 89.493271
38
+ C 46.038898 128.758553 23.956364 182.070506 23.956364 237.6
39
+ " clip-path="url(#peaa5e65bc5)" style="fill: none; stroke: #808080; stroke-linejoin: miter"/>
40
+ </g>
41
+ <g id="patch_3">
42
+ <path d="M 442.865455 237.6
43
+ C 442.865455 182.070506 420.782921 128.758553 381.517639 89.493271
44
+ C 342.252357 50.227989 288.940403 28.145455 233.410909 28.145455
45
+ C 177.881415 28.145455 124.569462 50.227989 85.30418 89.493271
46
+ C 46.038898 128.758553 23.956364 182.070506 23.956364 237.6
47
+ " clip-path="url(#peaa5e65bc5)" style="fill: none; stroke: #1f77b4; stroke-width: 25; stroke-linejoin: miter; stroke-linecap: round"/>
48
+ </g>
49
+ <g id="line2d_1"/>
50
+ <g id="patch_4">
51
+ <path d="M 298.117675 163.206254
52
+ C 307.005354 163.206254 315.530214 159.675142 321.814752 153.390604
53
+ C 328.09929 147.106065 331.630402 138.581206 331.630402 129.693527
54
+ C 331.630402 120.805848 328.09929 112.280988 321.814752 105.99645
55
+ C 315.530214 99.711912 307.005354 96.1808 298.117675 96.1808
56
+ C 289.229996 96.1808 280.705137 99.711912 274.420598 105.99645
57
+ C 268.13606 112.280988 264.604948 120.805848 264.604948 129.693527
58
+ C 264.604948 138.581206 268.13606 147.106065 274.420598 153.390604
59
+ C 280.705137 159.675142 289.229996 163.206254 298.117675 163.206254
60
+ L 298.117675 163.206254
61
+ z
62
+ " clip-path="url(#peaa5e65bc5)" style="fill: none; stroke: #1f77b4; stroke-width: 25; stroke-linejoin: miter"/>
63
+ </g>
64
+ <g id="axes_2">
65
+ <g id="line2d_2">
66
+ <path d="M 33.934017 302.312103
67
+ L 52.708312 303.145145
68
+ L 60.530936 303.285992
69
+ L 65.224509 303.115831
70
+ L 68.353559 302.767921
71
+ L 71.482608 302.104113
72
+ L 73.047133 301.605824
73
+ L 74.611657 300.964941
74
+ L 76.176182 300.153793
75
+ L 77.740707 299.141708
76
+ L 79.305231 297.895328
77
+ L 80.869756 296.379095
78
+ L 82.434281 294.55597
79
+ L 83.998805 292.388356
80
+ L 85.56333 289.839242
81
+ L 87.127855 286.873547
82
+ L 88.692379 283.459621
83
+ L 90.256904 279.570861
84
+ L 91.821428 275.187373
85
+ L 93.385953 270.2976
86
+ L 94.950478 264.899823
87
+ L 96.515002 259.003446
88
+ L 99.644052 245.813598
89
+ L 102.773101 231.05248
90
+ L 107.466675 207.143939
91
+ L 112.160249 183.246069
92
+ L 115.289298 168.602365
93
+ L 116.853823 161.934547
94
+ L 118.418347 155.802157
95
+ L 119.982872 150.265116
96
+ L 121.547397 145.369973
97
+ L 123.111921 141.149153
98
+ L 124.676446 137.620767
99
+ L 126.240971 134.788968
100
+ L 127.805495 132.644787
101
+ L 129.37002 131.167393
102
+ L 130.934545 130.325665
103
+ L 132.499069 130.08
104
+ L 134.063594 130.384228
105
+ L 135.628119 131.187554
106
+ L 137.192643 132.436435
107
+ L 138.757168 134.076305
108
+ L 140.321693 136.053113
109
+ L 141.886217 138.314617
110
+ L 145.015267 143.497746
111
+ L 148.144316 149.276877
112
+ L 154.402414 161.575759
113
+ L 160.660513 173.769381
114
+ L 165.354087 182.443472
115
+ L 170.047661 190.601851
116
+ L 174.741235 198.227271
117
+ L 179.434809 205.335712
118
+ L 184.128383 211.955743
119
+ L 188.821957 218.119189
120
+ L 193.515531 223.85745
121
+ L 198.209105 229.200278
122
+ L 202.902678 234.175488
123
+ L 207.596252 238.808971
124
+ L 212.289826 243.1248
125
+ L 216.9834 247.145351
126
+ L 221.676974 250.891419
127
+ L 226.370548 254.382332
128
+ L 231.064122 257.636052
129
+ L 235.757696 260.669275
130
+ L 240.45127 263.497516
131
+ L 246.709369 266.97442
132
+ L 252.967467 270.14383
133
+ L 259.225566 273.034227
134
+ L 265.483664 275.671441
135
+ L 271.741763 278.0789
136
+ L 277.999862 280.277854
137
+ L 285.822485 282.762525
138
+ L 293.645108 284.985144
139
+ L 301.467731 286.975585
140
+ L 309.290354 288.760295
141
+ L 318.677502 290.663147
142
+ L 328.06465 292.338714
143
+ L 339.016323 294.046839
144
+ L 349.967995 295.528544
145
+ L 362.484193 296.989279
146
+ L 376.564914 298.387397
147
+ L 392.210161 299.694814
148
+ L 409.419932 300.896578
149
+ L 429.758752 302.071605
150
+ L 432.887802 302.233093
151
+ L 432.887802 302.233093
152
+ " clip-path="url(#p717529631e)" style="fill: none; stroke: #ff7f0e; stroke-width: 25; stroke-linecap: round"/>
153
+ </g>
154
+ </g>
155
+ <g id="axes_3">
156
+ <g id="line2d_3">
157
+ <path d="M 79.176198 378.045938
158
+ L 85.224618 372.974192
159
+ L 92.482722 366.605631
160
+ L 108.208614 352.38659
161
+ L 116.676403 344.890774
162
+ L 123.934507 338.774217
163
+ L 129.982927 333.996198
164
+ L 134.821663 330.434753
165
+ L 139.660399 327.142595
166
+ L 144.499135 324.151431
167
+ L 149.337871 321.490065
168
+ L 152.966923 319.726017
169
+ L 156.595975 318.171527
170
+ L 160.225027 316.835021
171
+ L 163.854079 315.72374
172
+ L 167.483131 314.843707
173
+ L 171.112183 314.19969
174
+ L 174.741235 313.79518
175
+ L 178.370287 313.632369
176
+ L 181.999339 313.712139
177
+ L 185.628391 314.034058
178
+ L 189.257443 314.596381
179
+ L 192.886495 315.396061
180
+ L 196.515547 316.428764
181
+ L 200.144599 317.688894
182
+ L 203.773651 319.169623
183
+ L 207.402703 320.862926
184
+ L 211.031755 322.759627
185
+ L 215.870491 325.587041
186
+ L 220.709227 328.73043
187
+ L 225.547963 332.159519
188
+ L 230.386699 335.841285
189
+ L 236.435119 340.744598
190
+ L 243.693223 346.972253
191
+ L 253.370695 355.636354
192
+ L 270.306271 370.850811
193
+ L 277.564375 377.025496
194
+ L 283.612795 381.868451
195
+ L 288.451531 385.491953
196
+ L 293.290267 388.854511
197
+ L 298.129003 391.923743
198
+ L 302.967739 394.67009
199
+ L 306.596791 396.501922
200
+ L 310.225843 398.127257
201
+ L 313.854895 399.537289
202
+ L 317.483947 400.724375
203
+ L 321.113 401.682083
204
+ L 324.742052 402.405223
205
+ L 328.371104 402.889876
206
+ L 332.000156 403.133417
207
+ L 335.629208 403.134524
208
+ L 339.25826 402.893192
209
+ L 342.887312 402.41073
210
+ L 346.516364 401.68975
211
+ L 350.145416 400.734162
212
+ L 353.774468 399.549142
213
+ L 357.40352 398.141112
214
+ L 361.032572 396.517704
215
+ L 364.661624 394.687713
216
+ L 368.290676 392.661058
217
+ L 373.129412 389.672056
218
+ L 377.968148 386.381855
219
+ L 382.806884 382.822139
220
+ L 387.64562 379.027192
221
+ L 387.64562 379.027192
222
+ " clip-path="url(#p1db590b24e)" style="fill: none; stroke: #2ca02c; stroke-width: 25; stroke-linecap: round"/>
223
+ </g>
224
+ </g>
225
+ </g>
226
+ </g>
227
+ <defs>
228
+ <clipPath id="peaa5e65bc5">
229
+ <rect x="7.2" y="7.2" width="452.421818" height="460.8"/>
230
+ </clipPath>
231
+ <clipPath id="p717529631e">
232
+ <rect x="13.986327" y="110.88" width="438.849164" height="207.36"/>
233
+ </clipPath>
234
+ <clipPath id="p1db590b24e">
235
+ <rect x="63.752727" y="300.7296" width="339.316364" height="115.2"/>
236
+ </clipPath>
237
+ </defs>
238
+ </svg>
@@ -1,23 +1,23 @@
1
1
  [
2
2
  {
3
3
  "name": "dev",
4
- "version": "0.7",
4
+ "version": "0.9",
5
5
  "url": "https://www.phasorpy.org/docs/dev/"
6
6
  },
7
7
  {
8
- "name": "0.6 (stable)",
9
- "version": "0.6",
8
+ "name": "0.8 (stable)",
9
+ "version": "0.8",
10
10
  "url": "https://www.phasorpy.org/docs/stable/",
11
11
  "preferred": true
12
12
  },
13
13
  {
14
- "name": "0.5",
15
- "version": "0.5",
16
- "url": "https://www.phasorpy.org/docs/v0.5/"
14
+ "name": "0.7",
15
+ "version": "0.7",
16
+ "url": "https://www.phasorpy.org/docs/v0.7/"
17
17
  },
18
18
  {
19
- "name": "0.4",
20
- "version": "0.4",
21
- "url": "https://www.phasorpy.org/docs/v0.4/"
19
+ "name": "0.6",
20
+ "version": "0.6",
21
+ "url": "https://www.phasorpy.org/docs/v0.6/"
22
22
  }
23
23
  ]
@@ -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:
@@ -0,0 +1,5 @@
1
+ phasorpy.component
2
+ ------------------
3
+
4
+ .. automodule:: phasorpy.component
5
+ :members:
@@ -0,0 +1,5 @@
1
+ phasorpy.cursor
2
+ ---------------
3
+
4
+ .. automodule:: phasorpy.cursor
5
+ :members:
@@ -0,0 +1,5 @@
1
+ phasorpy.filter
2
+ ---------------
3
+
4
+ .. automodule:: phasorpy.filter
5
+ :members:
@@ -13,9 +13,11 @@ PhasorPy library version |version|.
13
13
 
14
14
  phasorpy
15
15
  phasor
16
- cursors
17
- components
16
+ lifetime
17
+ filter
18
+ component
18
19
  cluster
20
+ cursor
19
21
  plot
20
22
  io
21
23
  color
@@ -0,0 +1,5 @@
1
+ phasorpy.lifetime
2
+ -----------------
3
+
4
+ .. automodule:: phasorpy.lifetime
5
+ :members:
@@ -26,7 +26,7 @@ import phasorpy
26
26
 
27
27
  version = phasorpy.__version__
28
28
  release = phasorpy.__version__
29
- version_match = version.replace('.dev', '').replace('.rc', '')
29
+ version_match = version.split('.dev')[0].split('.rc')[0]
30
30
 
31
31
  # general configuration
32
32
 
@@ -35,7 +35,8 @@ extensions = [
35
35
  'sphinx.ext.autodoc',
36
36
  'sphinx.ext.autosummary',
37
37
  'sphinx.ext.doctest',
38
- 'sphinx.ext.viewcode',
38
+ # 'sphinx.ext.viewcode', # include source code in documentation
39
+ 'sphinx.ext.linkcode', # link to source code on GitHub
39
40
  'sphinx.ext.todo',
40
41
  # don't enable intersphinx since tutorials are getting littered with links
41
42
  # 'sphinx.ext.intersphinx',
@@ -60,8 +61,9 @@ html_static_path = ['_static']
60
61
  html_js_files = ['custom-icons.js']
61
62
  html_show_sourcelink = False
62
63
 
63
- html_logo = '_static/logo.png'
64
- # html_favicon = ''
64
+ html_title = f'PhasorPy {version} documentation'
65
+ html_logo = '_static/phasorpy_logo.svg'
66
+ html_favicon = '_static/favicon.ico'
65
67
 
66
68
  pygments_style = 'sphinx'
67
69
 
@@ -125,6 +127,11 @@ sphinx_gallery_conf = {
125
127
  'reference_url': {'phasorpy': None},
126
128
  'matplotlib_animations': True,
127
129
  'within_subsection_order': 'conf.TutorialOrder',
130
+ 'show_memory': False,
131
+ 'show_api_usage': False,
132
+ 'remove_config_comments': True,
133
+ # 'min_reported_time': 0.5,
134
+ # 'backreferences_dir': None,
128
135
  }
129
136
 
130
137
 
@@ -138,19 +145,21 @@ class TutorialOrder:
138
145
  # api
139
146
  'io',
140
147
  'phasor_from_lifetime',
141
- 'multi-harmonic',
142
- 'filtering',
148
+ 'multi_harmonic',
149
+ 'filter',
143
150
  'phasorplot',
144
- 'cursors',
145
- 'components',
151
+ 'cursor',
152
+ 'component',
146
153
  'fret',
147
154
  'lifetime_to_signal',
148
155
  'pca',
149
156
  # applications
150
157
  'component_fit',
151
158
  'fret_efficiency',
152
- # benchmarks
159
+ 'multidimensional',
160
+ # misc
153
161
  'phasor_from_signal',
162
+ 'logo',
154
163
  ]
155
164
 
156
165
  def __init__(self, srcdir: str): ...
@@ -174,7 +183,69 @@ intersphinx_mapping = {
174
183
  'skimage': ('https://scikit-image.org/docs/stable/', None),
175
184
  }
176
185
 
177
- intersphinx_disabled_reftypes = ['*']
186
+ # limit intersphinx linking to avoid "littering" tutorials
187
+ # disable doc links but allow function links
188
+ # intersphinx_disabled_reftypes = ['std:doc']
178
189
 
179
190
  # do not show typehints
180
191
  autodoc_typehints = 'none'
192
+
193
+
194
+ def linkcode_resolve(domain: str, info: dict[str, str]) -> str | None:
195
+ """Return GitHub URL for Python object."""
196
+ # adapted from
197
+ # https://github.com/matplotlib/matplotlib/blob/main/doc/conf.py
198
+ import inspect
199
+ from pathlib import Path
200
+
201
+ if domain != 'py':
202
+ return None
203
+
204
+ modname = info['module']
205
+ fullname = info['fullname']
206
+
207
+ submod = sys.modules.get(modname)
208
+ if submod is None:
209
+ return None
210
+
211
+ obj = submod
212
+ for part in fullname.split('.'):
213
+ try:
214
+ obj = getattr(obj, part)
215
+ except AttributeError:
216
+ return None
217
+
218
+ if inspect.isfunction(obj):
219
+ obj = inspect.unwrap(obj)
220
+ try:
221
+ fn = inspect.getsourcefile(obj)
222
+ except TypeError:
223
+ fn = None
224
+ if not fn or fn.endswith('__init__.py'):
225
+ try:
226
+ fn = inspect.getsourcefile(sys.modules[obj.__module__])
227
+ except (TypeError, AttributeError, KeyError):
228
+ fn = None
229
+ if not fn:
230
+ return None
231
+
232
+ try:
233
+ source, lineno = inspect.getsourcelines(obj)
234
+ except (OSError, TypeError):
235
+ lineno = None
236
+
237
+ linespec = f"#L{lineno:d}-L{lineno + len(source) - 1:d}" if lineno else ''
238
+
239
+ startdir = Path(phasorpy.__file__).parent.parent
240
+ try:
241
+ fn = os.path.relpath(fn, start=startdir).replace(os.path.sep, '/')
242
+ except ValueError:
243
+ return None
244
+
245
+ if '.dev' in version or '.rc' in version:
246
+ tag = 'main'
247
+ else:
248
+ tag = f'v{version}'
249
+ return (
250
+ f'https://github.com/phasorpy/phasorpy/blob/{tag}/src/{fn}{linespec}'
251
+ )
@@ -166,12 +166,20 @@ approach to analyze fluorescence time-resolved or spectral images:
166
166
  images using the phasor approach. The software is distributed under an
167
167
  unknown license and was last updated in 2013.
168
168
 
169
+ -
170
+ .. _napari_phasors:
171
+
172
+ `Napari-phasors <https://github.com/napari-phasors/napari-phasors>`_
173
+ is a napari plugin for phasor analysis based on PhasorPy.
174
+ The plugin is distributed under the BSD-3-Clause license.
175
+
169
176
  -
170
177
  .. _napari_flim_phasor_plotter:
171
178
 
172
179
  `Napari-flim-phasor-plotter <https://github.com/zoccoler/napari-flim-phasor-plotter>`_
173
180
  is a napari plugin to interactively load and show raw FLIM single images
174
181
  and series and generate phasor plots.
182
+ The plugin is distributed under the BSD-3-Clause license.
175
183
 
176
184
  -
177
185
  .. _napari_live_flim:
@@ -263,6 +271,13 @@ approach to analyze fluorescence time-resolved or spectral images:
263
271
  "instant FLIM" system. It supports image segmentation based on phasor plot
264
272
  regions of interest and K-means clustering.
265
273
 
274
+ .. _cell_analysis_tools:
275
+
276
+ - `Cell-analysis-tools <https://github.com/skalalab/cell-analysis-tools>`_
277
+ is an open-source Python library for the analysis of single cell imaging
278
+ data, including phasor analysis of FLIM data.
279
+ The library is distributed under the GPL v3.
280
+
266
281
  -
267
282
  .. _flim_studio:
268
283