Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

replace_axon now allows the axon length and numbr of sections to be set #496

Merged
merged 9 commits into from
Aug 23, 2024
25 changes: 18 additions & 7 deletions bluepyopt/ephys/morphologies.py
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,8 @@ def __init__(
do_set_nseg=True,
comment='',
replace_axon_hoc=None,
axon_stub_length=60,
axon_nseg_frequency=40,
nseg_frequency=40,
morph_modifiers=None,
morph_modifiers_hoc=None,
Expand All @@ -74,6 +76,8 @@ def __init__(
python, replace_axon is used instead. Must include
'proc replace_axon(){ ... }
If None,the default replace_axon is used
axon_stub_length (float): Length of replacement axon
axon_nseg_frequency (int): frequency of nseg, for axon
nseg_frequency (float): frequency of nseg
do_set_nseg (bool): if True, it will use nseg_frequency
morph_modifiers (list): list of functions to modify the icell
Expand All @@ -90,6 +94,8 @@ def __init__(
morphology_path = str(morphology_path)
self.morphology_path = morphology_path
self.do_replace_axon = do_replace_axon
self.axon_stub_length = axon_stub_length
self.axon_nseg_frequency = axon_nseg_frequency
self.do_set_nseg = do_set_nseg
self.nseg_frequency = nseg_frequency
self.morph_modifiers = morph_modifiers
Expand Down Expand Up @@ -155,7 +161,9 @@ def instantiate(self, sim=None, icell=None):
self.set_nseg(icell)

if self.do_replace_axon:
self.replace_axon(sim=sim, icell=icell)
self.replace_axon(sim=sim, icell=icell,
axon_stub_length=self.axon_stub_length,
axon_nseg_frequency=self.axon_nseg_frequency)

if self.morph_modifiers is not None:
for morph_modifier in self.morph_modifiers:
Expand All @@ -172,7 +180,8 @@ def set_nseg(self, icell):
section.nseg = 1 + 2 * int(section.L / self.nseg_frequency)

@staticmethod
def replace_axon(sim=None, icell=None):
def replace_axon(sim=None, icell=None,
axon_stub_length=60, axon_nseg_frequency=40):
"""Replace axon"""

nsec = len([sec for sec in icell.axonal])
Expand All @@ -187,8 +196,10 @@ def replace_axon(sim=None, icell=None):
sim.neuron.h.distance(0, 0.5, sec=icell.soma[0])

for section in icell.axonal:
# If distance to soma is larger than 60, store diameter
if sim.neuron.h.distance(1, 0.5, sec=section) > 60:
# If distance to soma is larger than
# axon_stub_length, store diameter
if sim.neuron.h.distance(1, 0.5, sec=section) \
> axon_stub_length:
ais_diams[1] = section.diam
break

Expand All @@ -199,16 +210,16 @@ def replace_axon(sim=None, icell=None):
sim.neuron.h.execute('create axon[2]', icell)

for index, section in enumerate(icell.axon):
section.nseg = 1
section.L = 30
section.L = axon_stub_length / 2
section.nseg = 1 + 2 * int(section.L / axon_nseg_frequency)
section.diam = ais_diams[index]
icell.axonal.append(sec=section)
icell.all.append(sec=section)

icell.axon[0].connect(icell.soma[0], 1.0, 0.0)
icell.axon[1].connect(icell.axon[0], 1.0, 0.0)

logger.debug('Replace axon with AIS')
logger.debug(f"Replace axon with AIS, {axon_stub_length=}")

default_replace_axon_hoc = \
'''
Expand Down
Loading