Skip to content

Commit 733dd3a

Browse files
authored
Merge pull request #26 from berenslab/fix_ntype
Fix: ntype after remapping
2 parents 939f22f + 0d63d68 commit 733dd3a

File tree

3 files changed

+38
-1
lines changed

3 files changed

+38
-1
lines changed

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
44

55
[project]
66
name = "skeliner"
7-
version = "0.2.3"
7+
version = "0.2.4"
88
description = "A lightweight neuromorphological mesh skeletonizer."
99
authors = []
1010
requires-python = ">=3.10.0"

skeliner/post.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,11 @@ def _remap_ntype(
100100
mapped[new_idx] = ntype[old_idx]
101101
if new_len:
102102
mapped[0] = 1
103+
# keep soma label unique (some remaps move old node 0 away from index 0)
104+
dupes = (mapped == 1)
105+
dupes[0] = False
106+
if np.any(dupes):
107+
mapped[dupes] = 3
103108
return mapped
104109

105110

@@ -708,6 +713,10 @@ def reroot(
708713

709714
if set_soma_ntype and ntype is not None:
710715
ntype[0] = 1
716+
if len(ntype) > 1:
717+
dupes = (ntype == 1)
718+
dupes[0] = False
719+
ntype[dupes] = 3
711720

712721
new_skel = Skeleton(
713722
soma=new_soma,

tests/test_post.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,7 @@ def test_reroot_updates_soma_and_ntype():
101101
s.soma.axes[0], s.radii["median"][0]
102102
) # radius equals selected column
103103
assert s.ntype[0] == 1
104+
assert int(np.sum(s.ntype == 1)) == 1
104105

105106

106107
def test_reroot_node2verts_vert2node_consistency():
@@ -125,3 +126,30 @@ def test_reroot_node2verts_vert2node_consistency():
125126
assert s.vert2node[v] == i
126127
# Soma verts now come from the new node 0's membership
127128
assert set(s.soma.verts.tolist()) == set(s.node2verts[0].tolist())
129+
130+
131+
def test_detect_soma_remaps_ntype_once():
132+
nodes = np.array([[0, 0, 0], [0, 0, 5], [0, 5, 0]], float)
133+
edges = np.array([[0, 1], [1, 2]], np.int64)
134+
radii = {"median": np.array([1.0, 4.0, 1.5])}
135+
skel = Skeleton(
136+
soma=Soma.from_sphere(nodes[0], radii["median"][0], verts=None),
137+
nodes=nodes,
138+
radii=radii,
139+
edges=edges,
140+
ntype=np.array([1, 3, 3], np.int8),
141+
)
142+
143+
s = post.detect_soma(
144+
skel,
145+
radius_key="median",
146+
soma_radius_percentile_threshold=90.0,
147+
soma_radius_distance_factor=4.0,
148+
soma_min_nodes=1,
149+
verbose=False,
150+
mesh_vertices=None,
151+
)
152+
153+
assert np.allclose(s.nodes[0], nodes[1]) # new soma promoted
154+
assert s.ntype[0] == 1
155+
assert int(np.sum(s.ntype == 1)) == 1

0 commit comments

Comments
 (0)