Skip to content

Commit 5612147

Browse files
committed
Separate neuroml load
1 parent dabca06 commit 5612147

4 files changed

Lines changed: 101 additions & 79 deletions

File tree

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
__pycache__

load.py

Lines changed: 10 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -2,81 +2,6 @@
22

33
import sys
44

5-
from pyneuroml import pynml
6-
from pyneuroml.utils import extract_position_info
7-
from neuroml import Cell
8-
9-
10-
pl = pv.Plotter()
11-
12-
filename = sys.argv[1] if len(sys.argv) == 2 else "c302_D_Full.net.nml"
13-
14-
nml_doc = pynml.read_neuroml2_file(filename, include_includes=True)
15-
16-
print("Loaded NeuroML file: %s" % filename)
17-
18-
19-
(
20-
cell_id_vs_cell,
21-
pop_id_vs_cell,
22-
positions,
23-
pop_id_vs_color,
24-
pop_id_vs_radii,
25-
) = extract_position_info(nml_doc, False)
26-
27-
factor = 0.2
28-
29-
while pop_id_vs_cell:
30-
pop_id, cell = pop_id_vs_cell.popitem()
31-
pos_pop = positions[pop_id] # type: typing.Dict[typing.Any, typing.List[float]]
32-
33-
print("Pop: %s has %i of component %s" % (pop_id, len(pos_pop), cell.id))
34-
35-
radius = pop_id_vs_radii[pop_id] if pop_id in pop_id_vs_radii else 10
36-
color = pop_id_vs_color[pop_id] if pop_id in pop_id_vs_color else "r"
37-
38-
if type(cell) is Cell:
39-
print("Loading a cell with %i segments" % len(cell.morphology.segments))
40-
41-
cell_meshes = pv.MultiBlock()
42-
43-
for seg in cell.morphology.segments:
44-
p = cell.get_actual_proximal(seg.id)
45-
d = seg.distal
46-
width = (p.diameter + d.diameter) / 4
47-
# print("Creating %s" % (seg))
48-
49-
if cell.get_segment_length(seg.id) == 0:
50-
seg_mesh = pv.Sphere(
51-
center=(p.x * factor, p.z * factor, -1 * p.y * factor),
52-
radius=p.diameter * factor / 2,
53-
)
54-
55-
pl.add_mesh(seg_mesh, color=color)
56-
else:
57-
seg_mesh = pv.Tube(
58-
pointa=(p.x * factor, p.z * factor, -1 * p.y * factor),
59-
pointb=(d.x * factor, d.z * factor, -1 * d.y * factor),
60-
resolution=1,
61-
radius=width * factor,
62-
n_sides=15,
63-
)
64-
65-
cell_meshes.append(seg_mesh)
66-
67-
while pos_pop:
68-
cell_index, pos = pos_pop.popitem()
69-
pp = [pos[0] * factor, pos[2] * factor, -1 * pos[1] * factor]
70-
print("Plotting %s(%i) at %s, %s" % (cell.id, cell_index, pos, pp))
71-
cell_mesh = cell_meshes.copy()
72-
for i in range(len(cell_mesh)):
73-
cell_mesh[i].translate(pp, inplace=True)
74-
pl.add_mesh(cell_mesh, color=color, smooth_shading=True)
75-
76-
else:
77-
sphere = pv.Sphere(center=(pos[0], pos[1], pos[2]), radius=radius)
78-
79-
pl.add_mesh(sphere, color=color)
805

816
'''
827
@@ -237,8 +162,15 @@ def create_mesh(step):
237162
238163
'''
239164

240-
pl.set_background("white")
241-
pl.add_axes()
242165

166+
if __name__ == "__main__":
167+
pl = pv.Plotter()
168+
169+
from neuromlmodel import add_neuroml_model
170+
171+
add_neuroml_model(pl)
172+
pl.set_background("white")
173+
pl.add_axes()
243174

244-
pl.show()
175+
if "-nogui" not in sys.argv:
176+
pl.show()

neuromlmodel.py

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
import pyvista as pv
2+
3+
import sys
4+
5+
from pyneuroml import pynml
6+
from pyneuroml.utils import extract_position_info
7+
from neuroml import Cell
8+
9+
10+
def add_neuroml_model(pl):
11+
filename = "c302_D_Full.net.nml"
12+
13+
nml_doc = pynml.read_neuroml2_file(filename, include_includes=True)
14+
15+
print("Loaded NeuroML file: %s" % filename)
16+
17+
(
18+
cell_id_vs_cell,
19+
pop_id_vs_cell,
20+
positions,
21+
pop_id_vs_color,
22+
pop_id_vs_radii,
23+
) = extract_position_info(nml_doc, False)
24+
25+
factor = 0.2
26+
27+
while pop_id_vs_cell:
28+
pop_id, cell = pop_id_vs_cell.popitem()
29+
pos_pop = positions[pop_id] # type: typing.Dict[typing.Any, typing.List[float]]
30+
31+
print("Pop: %s has %i of component %s" % (pop_id, len(pos_pop), cell.id))
32+
33+
radius = pop_id_vs_radii[pop_id] if pop_id in pop_id_vs_radii else 10
34+
color = pop_id_vs_color[pop_id] if pop_id in pop_id_vs_color else "r"
35+
36+
if type(cell) is Cell:
37+
print("Loading a cell with %i segments" % len(cell.morphology.segments))
38+
39+
cell_meshes = pv.MultiBlock()
40+
41+
for seg in cell.morphology.segments:
42+
p = cell.get_actual_proximal(seg.id)
43+
d = seg.distal
44+
width = (p.diameter + d.diameter) / 4
45+
# print("Creating %s" % (seg))
46+
47+
if cell.get_segment_length(seg.id) == 0:
48+
seg_mesh = pv.Sphere(
49+
center=(p.x * factor, p.z * factor, -1 * p.y * factor),
50+
radius=p.diameter * factor / 2,
51+
)
52+
53+
pl.add_mesh(seg_mesh, color=color)
54+
else:
55+
seg_mesh = pv.Tube(
56+
pointa=(p.x * factor, p.z * factor, -1 * p.y * factor),
57+
pointb=(d.x * factor, d.z * factor, -1 * d.y * factor),
58+
resolution=1,
59+
radius=width * factor,
60+
n_sides=15,
61+
)
62+
63+
cell_meshes.append(seg_mesh)
64+
65+
while pos_pop:
66+
cell_index, pos = pos_pop.popitem()
67+
pp = [pos[0] * factor, pos[2] * factor, -1 * pos[1] * factor]
68+
print("Plotting %s(%i) at %s, %s" % (cell.id, cell_index, pos, pp))
69+
cell_mesh = cell_meshes.copy()
70+
for i in range(len(cell_mesh)):
71+
cell_mesh[i].translate(pp, inplace=True)
72+
pl.add_mesh(cell_mesh, color=color, smooth_shading=True)
73+
74+
else:
75+
sphere = pv.Sphere(center=(pos[0], pos[1], pos[2]), radius=radius)
76+
77+
pl.add_mesh(sphere, color=color)
78+
79+
80+
if __name__ == "__main__":
81+
pl = pv.Plotter()
82+
83+
add_neuroml_model(pl)
84+
pl.set_background("white")
85+
pl.add_axes()
86+
87+
if "-nogui" not in sys.argv:
88+
pl.show()

test.sh

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,5 @@ set -ex
33
ruff format *.py
44
ruff check *.py
55

6-
python load.py
6+
python neuromlmodel.py -nogui
7+
python load.py -nogui

0 commit comments

Comments
 (0)