neurenv/iso.py
2026-07-11 18:20:01 -04:00

82 lines
1.7 KiB
Python

import numpy as np
from swc import read_swc, write_swc
from neuron import h
ptntls = np.loadtxt("neuron_ISO.fld")
neuron = read_swc("input.swc")
coords = neuron['coords'] * 1e-6
ptntl_coords = ptntls[:, :3]
from scipy.spatial import cKDTree
ptntl_tree = cKDTree(ptntl_coords)
# query nearest neighbor for each SWC node
ptntl_idx = ptntl_tree.query(coords, k=1)[1]
ptntls_ordered = ptntls[ptntl_idx] * 1e3
flags = [not np.isnan(p[3]) for p in ptntls_ordered]
non_nan = {
'id' : neuron['id'][flags],
'type' : neuron['type'][flags],
'coords' : neuron['coords'][flags],
'radius' : neuron['radius'][flags],
'parent' : neuron['parent'][flags]
}
write_swc("pruned.swc", non_nan)
ptntls_reduce = ptntls_ordered[flags]
# load preamble
h.load_file("import3d.hoc")
imp = h.Import3d_SWC_read()
imp.input("pruned.swc")
gui = h.Import3d_GUI(imp)
gui.instantiate(None)
h.load_file("parameters.hoc")
h.load_file("interpxyz.hoc")
h.load_file("setup.hoc")
# insert xtra at each section
for sec in h.allsec():
sec.insert("xtra")
h.load_file("setpointers.hoc")
h('setpointers()')
segs = []
seg_xyz = []
for sec in h.allsec():
for seg in sec:
segs.append(seg)
seg_xyz.append([seg.xtra.x, seg.xtra.y, seg.xtra.z])
seg_xyz = np.array(seg_xyz)
# KD-Tree again to match closest segments
tree = cKDTree(non_nan['coords'])
_, node_idx = tree.query(seg_xyz)
i = 0
for seg, idx in zip(segs, node_idx):
print(i)
i += 1
seg.xtra.es = ptntls_reduce[idx][3]
h.load_file("nrngui.hoc")
h.load_file("stdlib.hoc")
h.load_file("stim.hoc")
h.load_file("exportLocs_seg.hoc")
h.load_file("exportLocs_seg.hoc")
h.load_file("TMS_sim_simple.hoc")
h.load_file("detectFire.hoc")
h.load_file("run.hoc")