nettracer3d 1.2.5__py3-none-any.whl → 1.3.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of nettracer3d might be problematic. Click here for more details.

nettracer3d/tutorial.py CHANGED
@@ -1098,8 +1098,6 @@ def setup_start_tutorial(window):
1098
1098
  )
1099
1099
 
1100
1100
 
1101
-
1102
-
1103
1101
 
1104
1102
  # Step 9: Close dialog and finish
1105
1103
  def close_dialog():
@@ -1111,7 +1109,6 @@ def setup_start_tutorial(window):
1111
1109
  None,
1112
1110
  "That's it for the Intro tutorial! Select the Basic Interface Tour next to see how to use the main GUI elements.",
1113
1111
  message_position="bottom",
1114
- pre_action=MenuHelper.create_widget_interaction(tutorial, 'properties_dialog', 'xy_scale', 'close()'),
1115
1112
  action=close_dialog
1116
1113
  )
1117
1114
 
@@ -1631,48 +1628,60 @@ def setup_connectivity_tutorial(window):
1631
1628
  )
1632
1629
 
1633
1630
  tutorial.add_step(
1634
- MenuHelper.create_widget_getter(tutorial, 'con_dialog', 'inners'),
1635
- "Deselecting this button will have the system not consider 'inner edges'. Inner edges are portions of your edge image that exist solely within nodes (as well as their expanded search regions). You can deselect this to ignore inner connections between within node clusters, for example if you only wanted to consider more distal connections to get a simpler network. However, I would recommend keeping this enabled unless you had a good reason to not.",
1631
+ MenuHelper.create_widget_getter(tutorial, 'con_dialog', 'voronoi_safe'),
1632
+ "The next few options present alternate ways to handle the trunk/edges if desired. Selecting this 'Auto-Trunk' method will make edge elements that exist as plexuses between nodes simplify themselves to make local connections but avoid more distant connections that have more local connectivity available. This is done by first computing the normal network, then computing a second network where the search regions are fully maxed out (and therefore naturally split trunks up; note, this step will not use parallel dilation), then pruning the second network to drop connections that don't exist in the first region. As such, it will be somewhat slower if enabled.",
1636
1633
  highlight_type=None,
1637
1634
  message_position="beside",
1638
- pre_action=MenuHelper.create_widget_interaction(tutorial, 'con_dialog', 'inners', 'click()'))
1635
+ pre_action=MenuHelper.create_widget_interaction(tutorial, 'con_dialog', 'voronoi_safe', 'click()'),
1636
+ action = MenuHelper.create_widget_interaction(tutorial, 'con_dialog', 'voronoi_safe', 'toggle()')
1637
+ )
1639
1638
 
1640
1639
  tutorial.add_step(
1641
- MenuHelper.create_widget_getter(tutorial, 'con_dialog', 'down_factor'),
1642
- "Enter an int here to downsample your nodes prior to finding their centroids. The resultant centroids will be scaled back up to their proper values. This can speed up the centroid calculation and is recommended for large images. Note that small nodes may be completely erased if the downsample is too large. A larger int equates to a greater downsample. Downsampling here will also enlarge any overlays generated in this window.",
1640
+ MenuHelper.create_widget_getter(tutorial, 'con_dialog', 'labeled_branches'),
1641
+ "The 'Convert Edges to Nodes' option will make your edges become nodes. This can be a good way to visualize direct connectivity paths, and is a robust way to mitigate bias in what is or isn't a trunk. However, the network dynamics will be altered by edge inclusion, resulting in much less node clusters in favor of edge-derived hubs.",
1643
1642
  highlight_type=None,
1644
1643
  message_position="beside",
1645
- pre_action=MenuHelper.create_widget_interaction(tutorial, 'con_dialog', 'down_factor', 'setText("INTEGER!")'),
1646
- action=MenuHelper.create_widget_interaction(tutorial, 'con_dialog', 'down_factor', 'setText("")')
1644
+ pre_action=MenuHelper.create_widget_interaction(tutorial, 'con_dialog', 'labeled_branches', 'click()'),
1645
+ action = MenuHelper.create_widget_interaction(tutorial, 'con_dialog', 'labeled_branches', 'toggle()')
1647
1646
  )
1648
1647
 
1649
- """ # <-- so I am trying out removing these because their use cases are confusing
1650
-
1651
1648
  tutorial.add_step(
1652
- MenuHelper.create_widget_getter(tutorial, 'con_dialog', 'GPU_downsample'),
1653
- "If you want to try and use the GPU, you can likewise enter an arbitrary integer downsample factor here to speed it up. Note the GPU calculation can be greedy with VRAM and will automatically try to downsample itself in a lot of cases."
1649
+ MenuHelper.create_widget_getter(tutorial, 'con_dialog', 'edge_node'),
1650
+ "The 'Pre-labeled edges' option will allow you to use pre-made edge labels, such as if you had previously labeled the branches of your edges. Instead of just joining nodes together, all edge labels will participate as nodes as well. This can be a way to visualize how branch-like structures in your edges interact with your main node objects. You can also do this from the modify network after the calculation has been done.",
1654
1651
  highlight_type=None,
1655
1652
  message_position="beside",
1656
- pre_action=MenuHelper.create_widget_interaction(tutorial, 'con_dialog', 'GPU_downsample', 'setText("INTEGER!")'),
1657
- action=MenuHelper.create_widget_interaction(tutorial, 'con_dialog', 'GPU_downsample', 'setText("")')
1653
+ pre_action=MenuHelper.create_widget_interaction(tutorial, 'con_dialog', 'edge_node', 'click()'),
1654
+ action = MenuHelper.create_widget_interaction(tutorial, 'con_dialog', 'edge_node', 'toggle()')
1658
1655
  )
1659
1656
 
1657
+
1658
+
1659
+ """
1660
+
1660
1661
  tutorial.add_step(
1661
- MenuHelper.create_widget_getter(tutorial, 'con_dialog', 'GPU'),
1662
- "Enable this to have your system attempt to use the GPU. You will need a CUDA toolkit and a corresponding cupy package installed. Note that I consider this function somewhat experimental. In short, the cupy implementation uses a distance transform calculation that can be very greedy with VRAM. If it overflows, it will attempt to iteratively downsample itself until the calculation works (specifically containing to calculating the 'node search' volume). Note this risks kicking out small nodes from your image. Furthermore, it is only really applicable of 'fast dilation' is enabled. Therefore, generally skip using this option. However, it can be a way to rapidly assess the general network structure of a large image.",
1662
+ MenuHelper.create_widget_getter(tutorial, 'con_dialog', 'inners'),
1663
+ "Deselecting this button will have the system not consider 'inner edges'. Inner edges are portions of your edge image that exist solely within nodes (as well as their expanded search regions). You can deselect this to ignore inner connections between within node clusters, for example if you only wanted to consider more distal connections to get a simpler network. However, I would recommend keeping this enabled unless you had a good reason to not.",
1663
1664
  highlight_type=None,
1664
1665
  message_position="beside",
1665
- pre_action=MenuHelper.create_widget_interaction(tutorial, 'con_dialog', 'GPU', 'click()'),
1666
- action = MenuHelper.create_widget_interaction(tutorial, 'con_dialog', 'GPU', 'toggle()'))
1666
+ pre_action=MenuHelper.create_widget_interaction(tutorial, 'con_dialog', 'inners', 'click()'))
1667
+ """
1667
1668
 
1668
1669
  tutorial.add_step(
1669
- MenuHelper.create_widget_getter(tutorial, 'con_dialog', 'fastdil'),
1670
- "Enable this to have the algorithm use fast dilation. Fast dilation "
1670
+ MenuHelper.create_widget_getter(tutorial, 'con_dialog', 'down_factor'),
1671
+ "Enter an int here to downsample your nodes prior to finding their centroids. The resultant centroids will be scaled back up to their proper values. This can speed up the centroid calculation and is recommended for large images. Note that small nodes may be completely erased if the downsample is too large. A larger int equates to a greater downsample. Downsampling here will also enlarge any overlays generated in this window.",
1671
1672
  highlight_type=None,
1672
1673
  message_position="beside",
1674
+ pre_action=MenuHelper.create_widget_interaction(tutorial, 'con_dialog', 'down_factor', 'setText("INTEGER!")'),
1675
+ action=MenuHelper.create_widget_interaction(tutorial, 'con_dialog', 'down_factor', 'setText("")')
1676
+ )
1677
+
1678
+ tutorial.add_step(
1679
+ MenuHelper.create_widget_getter(tutorial, 'con_dialog', 'fastdil'),
1680
+ "Enable the fast search button to use a slightly alternate algorithm for the node search step that is faster. This algorithm uses a parallelized distance transform to create a binary search region which is a lot faster if you have a lot of CPU cores. It then uses flooding to label the binary search region, which leads to slightly rough labeling where two search regions meet. When disabled, a non-parallel distance transform is used, which can be slower but always has exact labels where two search regions meet. I recommend enabling this for larger images and disabling it for smaller ones.", highlight_type=None,
1681
+ message_position="beside",
1673
1682
  pre_action=MenuHelper.create_widget_interaction(tutorial, 'con_dialog', 'fastdil', 'click()'),
1674
- action = MenuHelper.create_widget_interaction(tutorial, 'con_dialog', 'fastdil', 'toggle()'))
1675
- """
1683
+ action=MenuHelper.create_widget_interaction(tutorial, 'con_dialog', 'fastdil', 'toggle()')
1684
+ )
1676
1685
 
1677
1686
  tutorial.add_step(
1678
1687
  MenuHelper.create_widget_getter(tutorial, 'con_dialog', 'overlays'),
@@ -1765,47 +1774,19 @@ def setup_branch_tutorial(window):
1765
1774
  pre_action=open_dialog
1766
1775
  )
1767
1776
 
1768
- """
1769
- tutorial.add_step(
1770
- MenuHelper.create_widget_getter(tutorial, 'branch_dialog', 'fix'),
1771
- "This first auto-correction option is designed if you feel like the branch labels are generally too busy. Selecting this will have the program attempt to collapse overly-dense regions of branches into a single label. Note that this behavior is somewhat tricky to predict so I generally don't use it but feel free to give it a shot and see how it looks.",
1772
- highlight_type=None,
1773
- message_position="beside",
1774
- pre_action=MenuHelper.create_widget_interaction(tutorial, 'branch_dialog', 'fix', 'click()'),
1775
- action=MenuHelper.create_widget_interaction(tutorial, 'branch_dialog', 'fix', 'toggle()')
1776
- )
1777
-
1778
- tutorial.add_step(
1779
- MenuHelper.create_widget_getter(tutorial, 'branch_dialog', 'fix_val'),
1780
- "This integer value tells the above parameter (if enabled) what degree of branch-busyness should get merged. In short, a lower value is more aggressive with merging while a higher value only merges very busy regions. By default it is set to 4.",
1781
- highlight_type=None,
1782
- message_position="beside",
1783
- pre_action=MenuHelper.create_widget_interaction(tutorial, 'branch_dialog', 'fix_val', 'selectAll()'),
1784
- action=MenuHelper.create_widget_interaction(tutorial, 'branch_dialog', 'fix_val', 'deselect()')
1785
- )
1786
-
1787
- tutorial.add_step(
1788
- MenuHelper.create_widget_getter(tutorial, 'branch_dialog', 'seed'),
1789
- "The random seed for grouping branches above can be changed here with an integer value, if the behavior of the above option is desired to be tweaked somewhat. It will use 42 by default.",
1790
- highlight_type=None,
1791
- message_position="beside",
1792
- pre_action=MenuHelper.create_widget_interaction(tutorial, 'branch_dialog', 'seed', 'setText("INTEGER!")'),
1793
- action=MenuHelper.create_widget_interaction(tutorial, 'branch_dialog', 'seed', 'setText("")')
1794
- )
1795
-
1796
- """
1797
1777
 
1798
1778
  tutorial.add_step(
1799
1779
  MenuHelper.create_widget_getter(tutorial, 'branch_dialog', 'fix2'),
1800
- "The second auto-correction option will automatically merge any internal labels that arise with their outer-neighbors. This is something that can occasionally happen with fat, trunk-like branches that are tricky to algorithmically decipher. I have found that this merge handles these issues quite well, so this option is enabled by default.",
1780
+ "The first auto-correction option will automatically merge any internal labels that arise with their outer-neighbors. This is something that can occasionally happen with fat, trunk-like branches that are tricky to algorithmically decipher. I have found that this merge handles these issues quite well, so this option is enabled by default. An alternate option will make the internal labels only merge with external structures that are not 'branch-like'. This is a good thing to enable if you are also enabling the 'reunify main branches' correction, as it will stop long branches from merging with core-like elements.",
1801
1781
  highlight_type=None,
1802
1782
  message_position="beside",
1803
- pre_action=MenuHelper.create_widget_interaction(tutorial, 'branch_dialog', 'fix2', 'click()')
1783
+ pre_action=MenuHelper.create_widget_interaction(tutorial, 'branch_dialog', 'fix2', 'showPopup()'),
1784
+ action=MenuHelper.create_widget_interaction(tutorial, 'branch_dialog', 'fix2', 'hidePopup()')
1804
1785
  )
1805
1786
 
1806
1787
  tutorial.add_step(
1807
1788
  MenuHelper.create_widget_getter(tutorial, 'branch_dialog', 'fix3'),
1808
- "This auto-correction step will automatically correct any branches that aren't contiguous in space. Rarely (Depending on the segmentation, really) a branch can initially be labeled non-contiguously, which is usually not correct. This is because the 'meat' of any branch is at first labeled based on which internal filament it's closest to. So if you have a very wide branch it may rarely aquire labels of nearby smaller branches across gaps. Enabling this will split those labels into seperate regions as to not confound the connectivity graph. The largest component is considered the 'correct one' and keeps its label, while smaller components inherit the label of the largest shared border of a 'real' branch they are bordering. It is enabled here by default to mitigate any potential errors, although note this does not apply to the branchpoint networks since they don't actually utilize the branches themselves.",
1789
+ "The second auto-correction step will automatically correct any branches that aren't contiguous in space. Rarely (Depending on the segmentation, really) a branch can initially be labeled non-contiguously, which is usually not correct. This is because the 'meat' of any branch is at first labeled based on which internal filament it's closest to. So if you have a very wide branch it may rarely aquire labels of nearby smaller branches across gaps. Enabling this will split those labels into seperate regions as to not confound the connectivity graph. The largest component is considered the 'correct one' and keeps its label, while smaller components inherit the label of the largest shared border of a 'real' branch they are bordering. It is enabled here by default to mitigate any potential errors, although note this does not apply to the branchpoint networks since they don't actually utilize the branches themselves.",
1809
1790
  highlight_type=None,
1810
1791
  message_position="beside",
1811
1792
  pre_action=MenuHelper.create_widget_interaction(tutorial, 'branch_dialog', 'fix3', 'click()')
@@ -1838,6 +1819,15 @@ def setup_branch_tutorial(window):
1838
1819
  action=MenuHelper.create_widget_interaction(tutorial, 'branch_dialog', 'down_factor', 'deselect()')
1839
1820
  )
1840
1821
 
1822
+ tutorial.add_step(
1823
+ MenuHelper.create_widget_getter(tutorial, 'branch_dialog', 'mode'),
1824
+ "The Algorithm Dropdown lets you choose between the standard algorithm, which provides more exact labels along branch borders, and the faster labeling algorithm, which uses flooding to label the binary branches, leading to slightly rough labeling where two branches meet. I recommend using the standard for smaller images and the fast for larger images where computation time becomes an issue.",
1825
+ highlight_type=None,
1826
+ message_position="beside",
1827
+ pre_action=MenuHelper.create_widget_interaction(tutorial, 'branch_dialog', 'mode', 'showPopup()'),
1828
+ action=MenuHelper.create_widget_interaction(tutorial, 'branch_dialog', 'mode', 'hidePopup()')
1829
+ )
1830
+
1841
1831
 
1842
1832
  tutorial.add_step(
1843
1833
  MenuHelper.create_widget_getter(tutorial, 'branch_dialog', 'compute'),
@@ -1881,16 +1871,6 @@ def setup_branch_tutorial(window):
1881
1871
  pre_action=open_dialog
1882
1872
  )
1883
1873
 
1884
- tutorial.add_step(
1885
- MenuHelper.create_widget_getter(tutorial, 'gen_dialog', 'down_factor'),
1886
- "This integer value can be used to temporarily downsample the image while creating branchpoints. Aside from speeding up the process, this may alter branch detection, possibly performing a cleaner branch appraisal of very thick branches but losing network identification of smaller branches (Much like in the prior menu - note that any value entered in the prior menu will be applied by default here for consistency, and you won't see this option). It is disabled by default. Larger values will downsample more aggressively.",
1887
- highlight_type=None,
1888
- message_position="beside",
1889
- pre_action=MenuHelper.create_widget_interaction(tutorial, 'gen_dialog', 'down_factor', 'selectAll()'),
1890
- action=MenuHelper.create_widget_interaction(tutorial, 'gen_dialog', 'down_factor', 'deselect()')
1891
- )
1892
-
1893
-
1894
1874
  tutorial.add_step(
1895
1875
  MenuHelper.create_widget_getter(tutorial, 'gen_dialog', 'branch_removal'),
1896
1876
  "IMPORTANT - This branch removal parameter (Skeleton voxel branch to remove...) is something I would consider entering a value for. This is the length of terminal branches that will be removed prior to any vertex/branch labeling. Any branch shorter than the value here will be removed, but only if it is a terminal branch. For more jagged segmentations, this may be a necessity to prevent branchpoints from arising from spine-like artifacts. More internal branches will not be removed, so as a test it is generally safe to enter a large value here, which will preserve the majority of the branch schema and just risk losing occasional terminal branches.",
@@ -1900,6 +1880,7 @@ def setup_branch_tutorial(window):
1900
1880
  action=MenuHelper.create_widget_interaction(tutorial, 'gen_dialog', 'branch_removal', 'setText("")')
1901
1881
  )
1902
1882
 
1883
+ """
1903
1884
  tutorial.add_step(
1904
1885
  MenuHelper.create_widget_getter(tutorial, 'gen_dialog', 'auto'),
1905
1886
  "This 'attempt to auto correct skeleton looping' option should generally be enabled for 3D data. In short it applies an extra algorithmic step to improve the branch detection algorithm. However, this does not really apply to 2D data. It will be enabled by default for 3D data and disabled by default for 2D data.",
@@ -1908,6 +1889,7 @@ def setup_branch_tutorial(window):
1908
1889
  pre_action=MenuHelper.create_widget_interaction(tutorial, 'gen_dialog', 'auto', 'click()'),
1909
1890
  action=MenuHelper.create_widget_interaction(tutorial, 'gen_dialog', 'auto', 'toggle()')
1910
1891
  )
1892
+ """
1911
1893
 
1912
1894
  tutorial.add_step(
1913
1895
  MenuHelper.create_widget_getter(tutorial, 'gen_dialog', 'comp_dil'),
@@ -1918,6 +1900,26 @@ def setup_branch_tutorial(window):
1918
1900
  action=MenuHelper.create_widget_interaction(tutorial, 'gen_dialog', 'comp_dil', 'setText("")')
1919
1901
  )
1920
1902
 
1903
+ tutorial.add_step(
1904
+ MenuHelper.create_widget_getter(tutorial, 'gen_dialog', 'fast_dil'),
1905
+ "Enable fast dilation to use a parallelized distance transform to do 3D dilation which is a lot faster if you have a lot of CPU cores. Note that this only applies if you have chosen to merge your nodes.",
1906
+ highlight_type=None,
1907
+ message_position="beside",
1908
+ pre_action=MenuHelper.create_widget_interaction(tutorial, 'gen_dialog', 'fast_dil', 'click()'),
1909
+ action=MenuHelper.create_widget_interaction(tutorial, 'gen_dialog', 'fast_dil', 'toggle()')
1910
+ )
1911
+
1912
+ tutorial.add_step(
1913
+ MenuHelper.create_widget_getter(tutorial, 'gen_dialog', 'down_factor'),
1914
+ "This integer value can be used to temporarily downsample the image while creating branchpoints. Aside from speeding up the process, this may alter branch detection, possibly performing a cleaner branch appraisal of very thick branches but losing network identification of smaller branches (Much like in the prior menu - note that any value entered in the prior menu will be applied by default here for consistency, and you won't see this option). It is disabled by default. Larger values will downsample more aggressively.",
1915
+ highlight_type=None,
1916
+ message_position="beside",
1917
+ pre_action=MenuHelper.create_widget_interaction(tutorial, 'gen_dialog', 'down_factor', 'selectAll()'),
1918
+ action=MenuHelper.create_widget_interaction(tutorial, 'gen_dialog', 'down_factor', 'deselect()')
1919
+ )
1920
+
1921
+
1922
+
1921
1923
  def close_dialog():
1922
1924
  if hasattr(tutorial, 'gen_dialog') and tutorial.gen_dialog:
1923
1925
  tutorial.gen_dialog.close()
@@ -1,10 +1,11 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: nettracer3d
3
- Version: 1.2.5
3
+ Version: 1.3.1
4
4
  Summary: Scripts for intializing and analyzing networks from segmentations of three dimensional images.
5
5
  Author-email: Liam McLaughlin <liamm@wustl.edu>
6
6
  Project-URL: Documentation, https://nettracer3d.readthedocs.io/en/latest/
7
- Project-URL: Reference_Citation_For_Use, https://doi.org/10.1101/2024.07.29.605633
7
+ Project-URL: Youtube_Tutorial, https://www.youtube.com/watch?v=_4uDy0mzG94&list=PLsrhxiimzKJMZ3_gTWkfrcAdJQQobUhj7
8
+ Project-URL: Downloadable_Version, https://doi.org/10.5281/zenodo.17873800
8
9
  Classifier: Programming Language :: Python :: 3
9
10
  Classifier: License :: Other/Proprietary License
10
11
  Classifier: Operating System :: OS Independent
@@ -23,8 +24,8 @@ Requires-Dist: pandas
23
24
  Requires-Dist: tifffile
24
25
  Requires-Dist: qtrangeslider
25
26
  Requires-Dist: PyQt6
27
+ Requires-Dist: pyqtgraph
26
28
  Requires-Dist: scikit-learn
27
- Requires-Dist: nibabel
28
29
  Requires-Dist: setuptools
29
30
  Requires-Dist: umap-learn
30
31
  Provides-Extra: cuda11
@@ -37,34 +38,78 @@ Provides-Extra: cellpose
37
38
  Requires-Dist: cellpose[GUI]; extra == "cellpose"
38
39
  Provides-Extra: viz
39
40
  Requires-Dist: napari; extra == "viz"
41
+ Provides-Extra: rec
42
+ Requires-Dist: napari; extra == "rec"
43
+ Requires-Dist: edt; extra == "rec"
44
+ Provides-Extra: edt
45
+ Requires-Dist: edt; extra == "edt"
40
46
  Provides-Extra: all
41
47
  Requires-Dist: cellpose[GUI]; extra == "all"
42
48
  Requires-Dist: napari; extra == "all"
49
+ Requires-Dist: edt; extra == "all"
43
50
  Dynamic: license-file
44
51
 
45
52
  NetTracer3D is a python package developed for both 2D and 3D analysis of microscopic images in the .tif file format. It supports generation of 3D networks showing the relationships between objects (or nodes) in three dimensional space, either based on their own proximity or connectivity via connecting objects such as nerves or blood vessels. In addition to these functionalities are several advanced 3D data processing algorithms, such as labeling of branched structures or abstraction of branched structures into networks. Note that nettracer3d uses segmented data, which can be segmented from other softwares such as ImageJ and imported into NetTracer3D, although it does offer its own segmentation via intensity and volumetric thresholding, or random forest machine learning segmentation. NetTracer3D currently has a fully functional GUI. To use the GUI, after installing the nettracer3d package via pip, enter the command 'nettracer3d' in your command prompt:
46
53
 
54
+
47
55
  --- Documentation ---
48
56
 
49
57
  Please see: https://nettracer3d.readthedocs.io/en/latest/
50
58
 
51
- --- Installation ---
52
59
 
53
- To install nettracer3d, simply install Python. Make sure the Python installation installs pip, and that both Python and pip are available on your PATH. Next, use this command in your command terminal:
60
+ --- Video Tutorial ---
61
+
62
+ Please see: https://www.youtube.com/watch?v=_4uDy0mzG94&list=PLsrhxiimzKJMZ3_gTWkfrcAdJQQobUhj7
63
+
64
+
65
+ --- Installing as a Python package ---
66
+
67
+ 1. **Get Python and Pip on your path**: To install nettracer3d, first install Python version 3.12. Make sure the Python installation installs pip, and that both Python and pip are available on your PATH. I recommend installing Python using the installer which is available here. Make sure to check the option to 'add Python to PATH' when it appears: https://www.python.org/downloads/
68
+
69
+
70
+ 2. **Base Package**: Next, use this command in your command terminal
71
+
72
+ * pip install nettracer3d
73
+
74
+
75
+ 3. **For 3D Displays**: Or if you also want Napari for 3D displays:
76
+
77
+ * pip install nettracer3d[viz]
78
+
79
+
80
+ 4. **Optional Performance Boost**: If you are trying to process large images, you may also want to include the 'edt' module in your package. This will allow parallelized CPU calculations for several of the search functions which can increase their speed by an order of magnitude or more depending on how many cores your CPU has. This can be a major benefit if you have a strong CPU and sufficient RAM. It requires an extra pre-installation step, thus is not included by default. You will also have to install the C++ build tools from windows. Please head to this link, then download and run the installer: https://visualstudio.microsoft.com/visual-cpp-build-tools/. In the menu of the installer, select the 'Desktop Development with C++' option, then proceed to download/install it using the installation menu. You will likely want to be using the Python distributed from the actual Python website and not the windows store (or elsewhere) or the edt module may not work properly. To bundle with edt use:
54
81
 
55
- pip install nettracer3d
82
+ * pip install nettracer3d[edt]
83
+
84
+
85
+ 5. **Recommended full package**: Or if you want to just get both edt and napari at once:
86
+
87
+ * pip install nettracer3d[rec]
88
+
89
+
90
+ 6. Likewise, if you already installed the default version, you can add napari and/or edt with just:
91
+
92
+ * pip install edt
93
+ * pip install napari
94
+
95
+
96
+ --- Installing as a Python package in Anaconda---
56
97
 
57
98
  I recommend installing the program as an Anaconda package to ensure its modules are work together on your specific system:
58
99
  (Install anaconda at the link below, set up a new python env for nettracer3d, then use the same pip command).
59
100
 
60
101
  https://www.anaconda.com/download?utm_source=anacondadocs&utm_medium=documentation&utm_campaign=download&utm_content=installwindows
61
102
 
62
- Alternatively, you can download a compiled .exe of version 1.2.4 here: https://doi.org/10.5281/zenodo.17873800
63
103
 
64
- Unzip the folder, then double click the NetTracer3D executable to run the program. Note that this version will be missing a few features compared to the Python package, namely the 3D display and the ability to print updates to the command window. It will also not be updated as often.
104
+ --- Using the downloadable version ---
105
+
106
+ Alternatively, you can download a compiled .exe of version 1.2.7 here: https://doi.org/10.5281/zenodo.17873800
107
+
108
+ Unzip the folder, then double click the NetTracer3D executable to run the program. Note that this version will be missing a few features compared to the Python package, namely GPU segmentation support and the ability to print updates to the command window. It will also not be updated as often.
109
+
110
+
111
+ --- Optional Packages ---
65
112
 
66
- Optional Packages
67
- ~~~~~~~~~~~~~~~~~~
68
113
  I recommend including Napari (Chi-Li Chiu, Nathan Clack, the napari community, napari: a Python Multi-Dimensional Image Viewer Platform for the Research Community, Microscopy and Microanalysis, Volume 28, Issue S1, 1 August 2022, Pages 1576–1577, https://doi.org/10.1017/S1431927622006328) in the download as well, which allows NetTracer3D to use 3D displays. The standard package only comes with its native 2D slice display window.
69
114
  If Napari is present, all 3D images and overlays from NetTracer3D can be easily displayed in 3D with a click of a button. To package with Napari, use this install command instead:
70
115
 
@@ -77,13 +122,13 @@ To include Cellpose3 in the install, use this command:
77
122
 
78
123
  pip install nettracer3d[cellpose]
79
124
 
80
- Alternatively, both Napari and Cellpose can be included in the package with this command: (Or they can be independently installed with pip from the base package env)
125
+ Alternatively, Napari, Cellpose, and edt can be included in the package with this command: (Or they can be independently installed with pip from the base package env)
81
126
 
82
127
 
83
128
  pip install nettracer3d[all]
84
129
 
85
- GPU
86
- ~~~~~~~~~~~~~~~~~~
130
+
131
+ --- GPU ---
87
132
  NetTracer3D is mostly CPU-bound, but a few functions can optionally use the GPU. To install optional GPU functionalities, first set up a CUDA toolkit that runs with the GPU on your machine. This requires an NVIDIA GPU. Then, find your GPUs compatible CUDA toolkit and install it with the auto-installer from the NVIDIA website: https://developer.nvidia.com/cuda-toolkit
88
133
 
89
134
  With a CUDA toolkit installed, use:
@@ -110,8 +155,9 @@ NetTracer3D is freely available for academic and nonprofit use and can obtained
110
155
 
111
156
  NetTracer3D was developed by Liam McLaughlin while working under Dr. Sanjay Jain at Washington University School of Medicine.
112
157
 
113
- -- Version 1.2.5 Updates --
158
+ -- Version 1.3.1 Updates --
114
159
 
115
- * Updated readme, license
116
-
160
+ * Updated GUI to use pyqtgraph for image display rather than matplotlib
161
+ * Upgraded the network graph visualization to also use pyqtgraph rather than matplotlib - now renders much faster, is embedded in the main window, and interacts with the main image view display.
162
+ * Other minor tweaks and bug fixes
117
163
 
@@ -0,0 +1,30 @@
1
+ nettracer3d/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
+ nettracer3d/branch_stitcher.py,sha256=rCTeh-28o7yN6ghYwxVSfrn2oc-TiPOm1xB3xJ5RWbw,21216
3
+ nettracer3d/cellpose_manager.py,sha256=NfRqW6Zl7yRU4qHCS_KjmR0R6QANSSgCO0_dr-eivxg,6694
4
+ nettracer3d/community_extractor.py,sha256=rPXXWwMX05mfD_ogULEouLy8CST-aOaoSw45NhloKVg,31754
5
+ nettracer3d/excelotron.py,sha256=aNof6k-DgMxVyFgsl3ltSCxG4vZW49cuvCBzfzhYhUY,75072
6
+ nettracer3d/filaments.py,sha256=liuhikdRoANUmYA_hiPUPtDV-lYtR8wKbgnUVk55Hgs,43952
7
+ nettracer3d/modularity.py,sha256=HgaVQSVjgAX3LAfJeUL1ZZ3P3xGuALJpQHqtYrhgw5c,22762
8
+ nettracer3d/morphology.py,sha256=eusirbmDFQD__tlhkwZbctd8N4AARXVU0IGowr7M8cA,23297
9
+ nettracer3d/neighborhoods.py,sha256=Bje77gWzXRIYyXkDlnFQnbUALnIt8dheLXHVFQsAKuc,53156
10
+ nettracer3d/nettracer.py,sha256=kvatS_orNSLUQXuDZ5zBluP-Yau8nyoIYYWEcZyMzrs,298024
11
+ nettracer3d/nettracer_gui.py,sha256=SIGGetHwyRv8xJShVjwvabhEIgPWtHAOvcKZMleyPVM,732175
12
+ nettracer3d/network_analysis.py,sha256=QYZrzZ0T6Ubifw4hctvpw-V2lATN5jV5QtIF_UpcSpU,46363
13
+ nettracer3d/network_draw.py,sha256=1Dj6VSMtMZbMxmrA7bWGxaLChqvM17xnZo85EUgG2PM,14291
14
+ nettracer3d/network_graph_widget.py,sha256=dVuTRGEdjVOOJ4-DBCtOwQe-QpO3FwXvVYhC-oT3Xpo,80989
15
+ nettracer3d/node_draw.py,sha256=Md12OiBtEyQmF2W_enO4qrSPFTRfoV4sOCMeEEdTNz4,10488
16
+ nettracer3d/painting.py,sha256=10XBjDqfOb1nTbGgIicOpoeIKRZZ4al2uFtrv-8MIBE,16760
17
+ nettracer3d/proximity.py,sha256=xvJLt61nTsKMdpJ0aiwJsB5vPriO34KG0LQwDjyfhC8,41410
18
+ nettracer3d/run.py,sha256=xYeaAc8FCx8MuzTGyL3NR3mK7WZzffAYAH23bNRZYO4,127
19
+ nettracer3d/segmenter.py,sha256=20ch_uLqedV9srwT1eL5eFs88ojkb2gELWJKgtYk2qk,72791
20
+ nettracer3d/segmenter_GPU.py,sha256=FwzevixleTUoRmwVa8jPPzW82RZoC6nL2eEeZ4-2ZR8,80015
21
+ nettracer3d/simple_network.py,sha256=1InpqSXfae_L-6lmf8lXgV7n_rk7Porg1hc_in9vkHg,10499
22
+ nettracer3d/smart_dilate.py,sha256=1UzLnX5LCj6OuFIy7_gHcZe9OIHkVJdIkZJDuJNqyYc,32009
23
+ nettracer3d/stats.py,sha256=0YwrVLeEvll3PlbL5-0_9dstldr48PvxJrQm-PiC8jY,36607
24
+ nettracer3d/tutorial.py,sha256=48__h2pWuERJLxC08_khFRW4XVf5vSXZtWnNUAFyWDY,154591
25
+ nettracer3d-1.3.1.dist-info/licenses/LICENSE,sha256=_Wg4zyCtT18lXBCXRov17IEop_-7z1OFo6o3JTzQj3g,568
26
+ nettracer3d-1.3.1.dist-info/METADATA,sha256=SVbWu_ycx1tghOiGVAA8w3EwlvVsnCKTGae6R9Io-RM,9676
27
+ nettracer3d-1.3.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
28
+ nettracer3d-1.3.1.dist-info/entry_points.txt,sha256=Nx1rr_0QhJXDBHAQg2vcqCzLMKBzSHfwy3xwGkueVyc,53
29
+ nettracer3d-1.3.1.dist-info/top_level.txt,sha256=zsYy9rZwirfCEOubolhee4TyzqBAL5gSUeFMzhFTX8c,12
30
+ nettracer3d-1.3.1.dist-info/RECORD,,
@@ -1,29 +0,0 @@
1
- nettracer3d/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
- nettracer3d/branch_stitcher.py,sha256=gyDVPUnApS2jmlIglJoRVEVY8WXLqwpr0_8rNdvy9u0,16402
3
- nettracer3d/cellpose_manager.py,sha256=NfRqW6Zl7yRU4qHCS_KjmR0R6QANSSgCO0_dr-eivxg,6694
4
- nettracer3d/community_extractor.py,sha256=rPXXWwMX05mfD_ogULEouLy8CST-aOaoSw45NhloKVg,31754
5
- nettracer3d/excelotron.py,sha256=aNof6k-DgMxVyFgsl3ltSCxG4vZW49cuvCBzfzhYhUY,75072
6
- nettracer3d/filaments.py,sha256=ks3-ThdHRKu5hPk04R_YHAmVpwCqXraR0LWW0VRlAts,43693
7
- nettracer3d/modularity.py,sha256=pborVcDBvICB2-g8lNoSVZbIReIBlfeBmjFbPYmtq7Y,22443
8
- nettracer3d/morphology.py,sha256=QlBPsJAswBoinjZuouNwEfGEGwclvenlZ1Vmo288QLo,23287
9
- nettracer3d/neighborhoods.py,sha256=Bje77gWzXRIYyXkDlnFQnbUALnIt8dheLXHVFQsAKuc,53156
10
- nettracer3d/nettracer.py,sha256=9iQ51fvYUNsHA90lZd4cEVz_4AZZToTy22SjJoZNPHY,294254
11
- nettracer3d/nettracer_gui.py,sha256=oStQZCqzi_nDFq8NKjMA1n0cuMv77gKekOd6XQFO5H4,742021
12
- nettracer3d/network_analysis.py,sha256=kBzsVaq4dZkMe0k-VGvQIUvM-tK0ZZ8bvb-wtsugZRQ,46150
13
- nettracer3d/network_draw.py,sha256=Uw0w1MoFiYMirkdM_XDAfy_m5_MoVaZkkGpoYzN9_-c,14259
14
- nettracer3d/node_draw.py,sha256=LeSftKJiNGkC7cpBJuf8Y9JeTUaUjcD6I2byclmZCb4,10484
15
- nettracer3d/painting.py,sha256=K_dwngivw80r-Yyg4btKMsWGn566ZE9PnrQl986uxJE,23497
16
- nettracer3d/proximity.py,sha256=Q3FxRpihV4ck7SUKrmceBRK1P32xZiLNzbUcr4PpnBM,46717
17
- nettracer3d/run.py,sha256=xYeaAc8FCx8MuzTGyL3NR3mK7WZzffAYAH23bNRZYO4,127
18
- nettracer3d/segmenter.py,sha256=20ch_uLqedV9srwT1eL5eFs88ojkb2gELWJKgtYk2qk,72791
19
- nettracer3d/segmenter_GPU.py,sha256=FwzevixleTUoRmwVa8jPPzW82RZoC6nL2eEeZ4-2ZR8,80015
20
- nettracer3d/simple_network.py,sha256=dkG4jpc4zzdeuoaQobgGfL3PNo6N8dGKQ5hEEubFIvA,9947
21
- nettracer3d/smart_dilate.py,sha256=gtL7hxzae93PJQsGLnUrwQ6Wb0evnHHREh0rHyUh_48,28644
22
- nettracer3d/stats.py,sha256=0YwrVLeEvll3PlbL5-0_9dstldr48PvxJrQm-PiC8jY,36607
23
- nettracer3d/tutorial.py,sha256=cUxiBf5RaBTtr9uJ2qoxZjRkcAY8mrvS9_LEqiwoxLc,153564
24
- nettracer3d-1.2.5.dist-info/licenses/LICENSE,sha256=_Wg4zyCtT18lXBCXRov17IEop_-7z1OFo6o3JTzQj3g,568
25
- nettracer3d-1.2.5.dist-info/METADATA,sha256=KGky4Y1X3pHgoykGd-SaJkp6x4faTeH6K-uh2r7wvL0,7164
26
- nettracer3d-1.2.5.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
27
- nettracer3d-1.2.5.dist-info/entry_points.txt,sha256=Nx1rr_0QhJXDBHAQg2vcqCzLMKBzSHfwy3xwGkueVyc,53
28
- nettracer3d-1.2.5.dist-info/top_level.txt,sha256=zsYy9rZwirfCEOubolhee4TyzqBAL5gSUeFMzhFTX8c,12
29
- nettracer3d-1.2.5.dist-info/RECORD,,