diff --git a/bluepyopt/ephys/morphologies.py b/bluepyopt/ephys/morphologies.py index 27cbc1ec..0ba6a6ac 100644 --- a/bluepyopt/ephys/morphologies.py +++ b/bluepyopt/ephys/morphologies.py @@ -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, @@ -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 @@ -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 @@ -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: @@ -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]) @@ -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 @@ -199,8 +210,8 @@ 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) @@ -208,7 +219,7 @@ def replace_axon(sim=None, icell=None): 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 = \ '''