nettracer3d 1.2.7__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.
@@ -7,7 +7,11 @@ from concurrent.futures import ThreadPoolExecutor, as_completed, ProcessPoolExec
7
7
  from skimage.segmentation import watershed
8
8
  import cv2
9
9
  import os
10
- import edt
10
+ try:
11
+ import edt
12
+ print("Parallel search functions enabled")
13
+ except:
14
+ print("Some parallel search functions disabled (requires edt package), will fall back to single-threaded")
11
15
  import math
12
16
  import re
13
17
  from . import nettracer
@@ -293,9 +297,13 @@ def process_chunk(start_idx, end_idx, nodes, ring_mask, nearest_label_indices):
293
297
  def smart_dilate(nodes, dilate_xy = 0, dilate_z = 0, directory = None, GPU = True, fast_dil = True, predownsample = None, use_dt_dil_amount = None, xy_scale = 1, z_scale = 1):
294
298
 
295
299
  if fast_dil:
296
- dilated = nettracer.dilate_3D_dt(nodes, use_dt_dil_amount, xy_scale, z_scale, fast_dil = True)
297
- return smart_label_watershed(dilated, nodes, directory = None, remove_template = False)
298
-
300
+ try:
301
+ import edt
302
+ dilated = nettracer.dilate_3D_dt(nodes, use_dt_dil_amount, xy_scale, z_scale, fast_dil = True)
303
+ return smart_label_watershed(dilated, nodes, directory = None, remove_template = False)
304
+ except:
305
+ print("edt package not found. Please use 'pip install edt' if you would like to enable parallel searching.")
306
+ return smart_dilate_short(nodes, use_dt_dil_amount, directory, xy_scale, z_scale)
299
307
  else:
300
308
  return smart_dilate_short(nodes, use_dt_dil_amount, directory, xy_scale, z_scale)
301
309
 
@@ -699,7 +707,7 @@ def compute_distance_transform_distance(nodes, sampling=[1, 1, 1], fast_dil=Fals
699
707
  str(nodes.dtype),
700
708
  tuple(sampling)
701
709
  )
702
- result_shape, result_dtype = future.result(timeout=300) # Add timeout
710
+ result_shape, result_dtype = future.result()
703
711
 
704
712
  distance = np.ndarray(result_shape, dtype=result_dtype, buffer=output_shm.buf).copy()
705
713
 
@@ -711,8 +719,12 @@ def compute_distance_transform_distance(nodes, sampling=[1, 1, 1], fast_dil=Fals
711
719
 
712
720
  except Exception as e:
713
721
  print(f"Parallel distance transform failed ({e}), falling back to scipy")
714
- import traceback
715
- traceback.print_exc() # See the full error
722
+ try:
723
+ import edt
724
+ import traceback
725
+ traceback.print_exc() # See the full error
726
+ except:
727
+ print("edt package not found. Please use 'pip install edt' if you would like to enable parallel searching.")
716
728
  distance = distance_transform_edt(nodes, sampling=sampling)
717
729
  else:
718
730
  distance = distance_transform_edt(nodes, sampling=sampling)
nettracer3d/tutorial.py CHANGED
@@ -1627,12 +1627,44 @@ def setup_connectivity_tutorial(window):
1627
1627
  action=MenuHelper.create_widget_interaction(tutorial, 'con_dialog', 'remove_trunk', 'setText("")')
1628
1628
  )
1629
1629
 
1630
+ tutorial.add_step(
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.",
1633
+ highlight_type=None,
1634
+ message_position="beside",
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
+ )
1638
+
1639
+ tutorial.add_step(
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.",
1642
+ highlight_type=None,
1643
+ message_position="beside",
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()')
1646
+ )
1647
+
1648
+ tutorial.add_step(
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.",
1651
+ highlight_type=None,
1652
+ message_position="beside",
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()')
1655
+ )
1656
+
1657
+
1658
+
1659
+ """
1660
+
1630
1661
  tutorial.add_step(
1631
1662
  MenuHelper.create_widget_getter(tutorial, 'con_dialog', 'inners'),
1632
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.",
1633
1664
  highlight_type=None,
1634
1665
  message_position="beside",
1635
1666
  pre_action=MenuHelper.create_widget_interaction(tutorial, 'con_dialog', 'inners', 'click()'))
1667
+ """
1636
1668
 
1637
1669
  tutorial.add_step(
1638
1670
  MenuHelper.create_widget_getter(tutorial, 'con_dialog', 'down_factor'),
@@ -1745,15 +1777,16 @@ def setup_branch_tutorial(window):
1745
1777
 
1746
1778
  tutorial.add_step(
1747
1779
  MenuHelper.create_widget_getter(tutorial, 'branch_dialog', 'fix2'),
1748
- "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.",
1749
1781
  highlight_type=None,
1750
1782
  message_position="beside",
1751
- 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()')
1752
1785
  )
1753
1786
 
1754
1787
  tutorial.add_step(
1755
1788
  MenuHelper.create_widget_getter(tutorial, 'branch_dialog', 'fix3'),
1756
- "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.",
1757
1790
  highlight_type=None,
1758
1791
  message_position="beside",
1759
1792
  pre_action=MenuHelper.create_widget_interaction(tutorial, 'branch_dialog', 'fix3', 'click()')
@@ -1847,6 +1880,7 @@ def setup_branch_tutorial(window):
1847
1880
  action=MenuHelper.create_widget_interaction(tutorial, 'gen_dialog', 'branch_removal', 'setText("")')
1848
1881
  )
1849
1882
 
1883
+ """
1850
1884
  tutorial.add_step(
1851
1885
  MenuHelper.create_widget_getter(tutorial, 'gen_dialog', 'auto'),
1852
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.",
@@ -1855,6 +1889,7 @@ def setup_branch_tutorial(window):
1855
1889
  pre_action=MenuHelper.create_widget_interaction(tutorial, 'gen_dialog', 'auto', 'click()'),
1856
1890
  action=MenuHelper.create_widget_interaction(tutorial, 'gen_dialog', 'auto', 'toggle()')
1857
1891
  )
1892
+ """
1858
1893
 
1859
1894
  tutorial.add_step(
1860
1895
  MenuHelper.create_widget_getter(tutorial, 'gen_dialog', 'comp_dil'),
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: nettracer3d
3
- Version: 1.2.7
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/
@@ -24,10 +24,10 @@ Requires-Dist: pandas
24
24
  Requires-Dist: tifffile
25
25
  Requires-Dist: qtrangeslider
26
26
  Requires-Dist: PyQt6
27
+ Requires-Dist: pyqtgraph
27
28
  Requires-Dist: scikit-learn
28
29
  Requires-Dist: setuptools
29
30
  Requires-Dist: umap-learn
30
- Requires-Dist: edt
31
31
  Provides-Extra: cuda11
32
32
  Requires-Dist: cupy-cuda11x; extra == "cuda11"
33
33
  Provides-Extra: cuda12
@@ -38,9 +38,15 @@ Provides-Extra: cellpose
38
38
  Requires-Dist: cellpose[GUI]; extra == "cellpose"
39
39
  Provides-Extra: viz
40
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"
41
46
  Provides-Extra: all
42
47
  Requires-Dist: cellpose[GUI]; extra == "all"
43
48
  Requires-Dist: napari; extra == "all"
49
+ Requires-Dist: edt; extra == "all"
44
50
  Dynamic: license-file
45
51
 
46
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:
@@ -56,23 +62,54 @@ Please see: https://nettracer3d.readthedocs.io/en/latest/
56
62
  Please see: https://www.youtube.com/watch?v=_4uDy0mzG94&list=PLsrhxiimzKJMZ3_gTWkfrcAdJQQobUhj7
57
63
 
58
64
 
59
- --- Installation ---
65
+ --- Installing as a Python package ---
60
66
 
61
- 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:
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/
62
68
 
63
- pip install nettracer3d
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:
81
+
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---
64
97
 
65
98
  I recommend installing the program as an Anaconda package to ensure its modules are work together on your specific system:
66
99
  (Install anaconda at the link below, set up a new python env for nettracer3d, then use the same pip command).
67
100
 
68
101
  https://www.anaconda.com/download?utm_source=anacondadocs&utm_medium=documentation&utm_campaign=download&utm_content=installwindows
69
102
 
103
+
104
+ --- Using the downloadable version ---
105
+
70
106
  Alternatively, you can download a compiled .exe of version 1.2.7 here: https://doi.org/10.5281/zenodo.17873800
71
107
 
72
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.
73
109
 
74
- Optional Packages
75
- ~~~~~~~~~~~~~~~~~~
110
+
111
+ --- Optional Packages ---
112
+
76
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.
77
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:
78
115
 
@@ -85,13 +122,13 @@ To include Cellpose3 in the install, use this command:
85
122
 
86
123
  pip install nettracer3d[cellpose]
87
124
 
88
- 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)
89
126
 
90
127
 
91
128
  pip install nettracer3d[all]
92
129
 
93
- GPU
94
- ~~~~~~~~~~~~~~~~~~
130
+
131
+ --- GPU ---
95
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
96
133
 
97
134
  With a CUDA toolkit installed, use:
@@ -118,12 +155,9 @@ NetTracer3D is freely available for academic and nonprofit use and can obtained
118
155
 
119
156
  NetTracer3D was developed by Liam McLaughlin while working under Dr. Sanjay Jain at Washington University School of Medicine.
120
157
 
121
- -- Version 1.2.7 Updates --
158
+ -- Version 1.3.1 Updates --
122
159
 
123
- * Added a faster parallelized option for all distance transform calculations.
124
- * Similarly, added flooding as a faster but slightly rougher option for propagating labels. This and the above can be combined to do much faster calculations for bigger images.
125
- * Now depends on the 'edt' package (which does the above).
126
- * Removed dependency on nibabel (which was just being used to open .nii files). .nii files can still be opened if nibabel is installed manually.
127
- * Added option to not show numerical labels when displaying network graph.
128
-
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
129
163
 
@@ -1,5 +1,5 @@
1
1
  nettracer3d/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
- nettracer3d/branch_stitcher.py,sha256=nF-5xtYowMcd55kSGv1CDLk31E-FMagy_wHC3hEq8mg,16667
2
+ nettracer3d/branch_stitcher.py,sha256=rCTeh-28o7yN6ghYwxVSfrn2oc-TiPOm1xB3xJ5RWbw,21216
3
3
  nettracer3d/cellpose_manager.py,sha256=NfRqW6Zl7yRU4qHCS_KjmR0R6QANSSgCO0_dr-eivxg,6694
4
4
  nettracer3d/community_extractor.py,sha256=rPXXWwMX05mfD_ogULEouLy8CST-aOaoSw45NhloKVg,31754
5
5
  nettracer3d/excelotron.py,sha256=aNof6k-DgMxVyFgsl3ltSCxG4vZW49cuvCBzfzhYhUY,75072
@@ -7,23 +7,24 @@ nettracer3d/filaments.py,sha256=liuhikdRoANUmYA_hiPUPtDV-lYtR8wKbgnUVk55Hgs,4395
7
7
  nettracer3d/modularity.py,sha256=HgaVQSVjgAX3LAfJeUL1ZZ3P3xGuALJpQHqtYrhgw5c,22762
8
8
  nettracer3d/morphology.py,sha256=eusirbmDFQD__tlhkwZbctd8N4AARXVU0IGowr7M8cA,23297
9
9
  nettracer3d/neighborhoods.py,sha256=Bje77gWzXRIYyXkDlnFQnbUALnIt8dheLXHVFQsAKuc,53156
10
- nettracer3d/nettracer.py,sha256=g8yHaZW265dplYIobeurNPb07lv8MNecbEsyo7syI34,290233
11
- nettracer3d/nettracer_gui.py,sha256=Zos0sCHs0S6vjxrk-lvSPpBXQQA_QiLGkis8S5KYd3k,745331
12
- nettracer3d/network_analysis.py,sha256=YKRlhSpQbtztCdAIWbt3cFAQKgZWz36h3aLgD8nQAuk,45797
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
13
  nettracer3d/network_draw.py,sha256=1Dj6VSMtMZbMxmrA7bWGxaLChqvM17xnZo85EUgG2PM,14291
14
+ nettracer3d/network_graph_widget.py,sha256=dVuTRGEdjVOOJ4-DBCtOwQe-QpO3FwXvVYhC-oT3Xpo,80989
14
15
  nettracer3d/node_draw.py,sha256=Md12OiBtEyQmF2W_enO4qrSPFTRfoV4sOCMeEEdTNz4,10488
15
- nettracer3d/painting.py,sha256=K_dwngivw80r-Yyg4btKMsWGn566ZE9PnrQl986uxJE,23497
16
+ nettracer3d/painting.py,sha256=10XBjDqfOb1nTbGgIicOpoeIKRZZ4al2uFtrv-8MIBE,16760
16
17
  nettracer3d/proximity.py,sha256=xvJLt61nTsKMdpJ0aiwJsB5vPriO34KG0LQwDjyfhC8,41410
17
18
  nettracer3d/run.py,sha256=xYeaAc8FCx8MuzTGyL3NR3mK7WZzffAYAH23bNRZYO4,127
18
19
  nettracer3d/segmenter.py,sha256=20ch_uLqedV9srwT1eL5eFs88ojkb2gELWJKgtYk2qk,72791
19
20
  nettracer3d/segmenter_GPU.py,sha256=FwzevixleTUoRmwVa8jPPzW82RZoC6nL2eEeZ4-2ZR8,80015
20
- nettracer3d/simple_network.py,sha256=7iSO7NYf0Ezeix-9ruRB5b2xXtgeOAoN7tM9SR4GtKw,10480
21
- nettracer3d/smart_dilate.py,sha256=nxWxG8sHL0FHPOJIZGKFVKxPHwysvf6F-yhoGgajbQI,31377
21
+ nettracer3d/simple_network.py,sha256=1InpqSXfae_L-6lmf8lXgV7n_rk7Porg1hc_in9vkHg,10499
22
+ nettracer3d/smart_dilate.py,sha256=1UzLnX5LCj6OuFIy7_gHcZe9OIHkVJdIkZJDuJNqyYc,32009
22
23
  nettracer3d/stats.py,sha256=0YwrVLeEvll3PlbL5-0_9dstldr48PvxJrQm-PiC8jY,36607
23
- nettracer3d/tutorial.py,sha256=XzQ5IRQKTDLwjWdFG7rj6qmO_NGemcqYwRmH1GPhz3g,151509
24
- nettracer3d-1.2.7.dist-info/licenses/LICENSE,sha256=_Wg4zyCtT18lXBCXRov17IEop_-7z1OFo6o3JTzQj3g,568
25
- nettracer3d-1.2.7.dist-info/METADATA,sha256=OA35aSlV93IMQv5dB-wq8FludCZeFKYyhlHs16ucmXA,7925
26
- nettracer3d-1.2.7.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
27
- nettracer3d-1.2.7.dist-info/entry_points.txt,sha256=Nx1rr_0QhJXDBHAQg2vcqCzLMKBzSHfwy3xwGkueVyc,53
28
- nettracer3d-1.2.7.dist-info/top_level.txt,sha256=zsYy9rZwirfCEOubolhee4TyzqBAL5gSUeFMzhFTX8c,12
29
- nettracer3d-1.2.7.dist-info/RECORD,,
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,,