def test_single_point_root_section(): m = Morphology() points = [] diameters = [] # Too hide the warning: appending empty section with captured_output(): with ostream_redirect(stdout=True, stderr=True): m.append_root_section(PointLevel(points, diameters), SectionType(2)) with setup_tempdir('test_single_point_root_section', no_cleanup=True) as tmp_folder: assert_raises( SectionBuilderError, m.write, os.path.join(tmp_folder, "h5/empty_vasculature.h5")) m = Morphology() points = [[1., 1., 1.]] diameters = [2.] m.append_root_section(PointLevel(points, diameters), SectionType(2)) with setup_tempdir('test_single_point_root_section', no_cleanup=True) as tmp_folder: assert_raises(SectionBuilderError, m.write, os.path.join(tmp_folder, "h5/empty_vasculature.h5"))
def test_fix_from_downstream(): neuron = Morphology(DATA_PATH / 'zero-diameter-middle-of-neurite.asc') root = neuron.root_sections[0] point = Point(root, 0) fix_from_downstream(point) assert_array_equal( neuron.section(0).diameters, np.array([2., 2., 1.e-6, 1.e-6, 1.e-6, 3.], dtype=np.float32), "The diameters should not have been modified") neuron = Morphology(DATA_PATH / 'zero-diameter-beginning-of-neurite.swc') root = neuron.root_sections[0] point = Point(root, 0) assert_array_equal(root.diameters, [0., 0.]) fix_from_downstream(point) assert_array_equal( root.diameters, [0., 0.], 'Diameters should not have been changed ' 'since the whole neurite has a null diameter') neuron = Morphology(DATA_PATH / 'zero-diameter-beginning-of-neurite.swc') root = neuron.root_sections[1] point = Point(root, 0) assert_array_equal(root.diameters, [0, 0, 4]) fix_from_downstream(point) assert_array_equal(root.diameters, [4, 4, 4])
def test_endoplasmic_reticulum(): neuron = Morphology(Path(_path, "simple.asc")) reticulum = neuron.endoplasmic_reticulum assert_equal(reticulum.section_indices, []) assert_equal(reticulum.volumes, []) assert_equal(reticulum.surface_areas, []) assert_equal(reticulum.filament_counts, []) reticulum.section_indices = [1, 1] reticulum.volumes = [2, 2] reticulum.surface_areas = [3, 3] reticulum.filament_counts = [4, 4] assert_equal(reticulum.section_indices, [1, 1]) assert_equal(reticulum.volumes, [2, 2]) assert_equal(reticulum.surface_areas, [3, 3]) assert_equal(reticulum.filament_counts, [4, 4]) with setup_tempdir('test-endoplasmic-reticulum') as folder: path = Path(folder, 'with-reticulum.h5') neuron.write(path) neuron = Morphology(path) reticulum = neuron.endoplasmic_reticulum assert_equal(reticulum.section_indices, [1, 1]) assert_equal(reticulum.volumes, [2, 2]) assert_equal(reticulum.surface_areas, [3, 3]) assert_equal(reticulum.filament_counts, [4, 4])
def test_write_no_soma(): morpho = Morphology() dendrite = morpho.append_root_section( PointLevel([[0, 0, 0], [0, 5, 0]], [2, 2]), SectionType.basal_dendrite) dendrite = morpho.append_root_section( PointLevel([[0, 1, 0], [0, 7, 0]], [2, 2]), SectionType.basal_dendrite) with setup_tempdir('test_write_no_soma') as tmp_folder: for ext in ['asc', 'h5', 'swc']: with captured_output() as (_, err): with ostream_redirect(stdout=True, stderr=True): outfile = os.path.join(tmp_folder, 'tmp.' + ext) morpho.write(outfile) assert_equal(err.getvalue().strip(), 'Warning: writing file without a soma') read = Morphology(outfile) assert_equal(len(read.soma.points), 0) assert_equal(len(read.root_sections), 2) assert_array_equal(read.root_sections[0].points, [[0, 0, 0], [0, 5, 0]]) assert_array_equal(read.root_sections[1].points, [[0, 1, 0], [0, 7, 0]])
def test_sanitize(): m = Morphology() section = m.append_root_section( PointLevel([[1, 0, 0], [2, 0, 0]], [2, 2], [20, 20]), SectionType.axon) section.append_section(PointLevel([[2, 0, 0], [3, 0, 0]], [2, 2], [20, 20])) with captured_output() as (_, err): with ostream_redirect(stdout=True, stderr=True): m.sanitize() assert_equal(len(list(m.iter())), 1) assert_equal( err.getvalue().strip(), 'Warning: section 1 is the only child of section: 0\nIt will be merged ' 'with the parent section') # Checking that sanitize() issues a warning on missing duplicate m = Morphology() section = m.append_root_section( PointLevel([[1, 0, 0], [2, 0, 0]], [2, 2], [20, 20]), SectionType.axon) section.append_section(PointLevel([[2, 0, 0], [3, 0, 0]], [2, 2], [20, 20])) with captured_output() as (_, err): with ostream_redirect(): section.append_section( PointLevel([[2, 1, 0], [2, 0, 0]], [2, 2], [20, 20])) with captured_output() as (_, err): with ostream_redirect(): m.sanitize() assert_equal( err.getvalue().strip(), 'Warning: while appending section: 2 to parent: 0\nThe section first point should be parent section last point: \n : X Y Z Diameter\nparent last point :[2.000000, 0.000000, 0.000000, 2.000000]\nchild first point :[2.000000, 1.000000, 0.000000, 2.000000]' )
def test_write_merge_only_child_asc_h5(): '''The root section has only one child When writing, children should *not* be merged with their parent section. Note: See `test_write_merge_only_child_swc` for the SWC case. ''' morpho = Morphology() morpho.soma.points = [[0, 0, 0]] morpho.soma.diameters = [2] root = morpho.append_root_section( PointLevel([[0, 0, 0], [0, 5, 0]], [2, 2]), SectionType.basal_dendrite) child = root.append_section(PointLevel([[0, 5, 0], [0, 6, 0]], [2, 3])) with setup_tempdir('test_write_merge_only_child') as tmp_folder: for extension in ['asc', 'h5']: with captured_output() as (_, err): with ostream_redirect(stdout=True, stderr=True): filename = Path(tmp_folder, 'test.{}'.format(extension)) morpho.write(filename) read = Morphology(filename) root = read.root_sections[0] assert_array_equal(root.points, [[0, 0, 0], [0, 5, 0]]) assert len(root.children) == 1
def test_duplicate_different_diameter(): '''Test that starting a child section with a different diamete work as expected''' morpho = Morphology() morpho.soma.points = [[0, 0, 0], [1, 1, 1]] morpho.soma.diameters = [1, 1] section = morpho.append_root_section( PointLevel([[2, 2, 2], [3, 3, 3]], [4, 4]), SectionType.axon, ) section.append_section(PointLevel([[3, 3, 3], [4, 4, 4]], [10, 12])) section.append_section(PointLevel([[3, 3, 3], [5, 5, 5]], [11, 12])) with setup_tempdir('test_write_duplicate_different_diameter', no_cleanup=True) as tmp_folder: for ext in ['asc', 'h5', 'swc']: with captured_output() as (_, err): with ostream_redirect(stdout=True, stderr=True): outfile = os.path.join(tmp_folder, 'tmp.' + ext) morpho.write(outfile) read = Morphology(outfile) assert_equal(len(read.root_sections[0].children), 2) child1, child2 = read.root_sections[0].children assert_array_equal(child1.points, [[3, 3, 3], [4, 4, 4]]) assert_array_equal(child2.points, [[3, 3, 3], [5, 5, 5]]) assert_array_equal(child1.diameters, [10, 12]) assert_array_equal(child2.diameters, [11, 12])
def test_connectivity(): cells = OrderedDict({ 'asc': Morphology(os.path.join(_path, "simple.asc")), 'swc': Morphology(os.path.join(_path, "simple.swc")), 'h5': Morphology(os.path.join(_path, "h5/v1/simple.h5")), }) for cell in cells: assert_dict_equal(cells[cell].connectivity, {-1: [0, 3], 0: [1, 2], 3: [4, 5]})
def test_connectivity(): cells = OrderedDict({ 'asc': Morphology(Path(DATA_DIR, "simple.asc")), 'swc': Morphology(Path(DATA_DIR, "simple.swc")), 'h5': Morphology(Path(DATA_DIR, "h5/v1/simple.h5")), }) for cell in cells: assert cells[cell].connectivity == {-1: [0, 3], 0: [1, 2], 3: [4, 5]}
def test_self_graft(): '''Grafting a neuron with its own neuron''' filename = DATA / 'neuron.asc' new_axon = graft.find_axon(ImmutMorphology(filename)) neuron = Morphology(filename) graft.graft_axon(neuron, new_axon) expected = Morphology(filename) assert not diff(expected, neuron)
def test_self_graft(): '''Grafting a neuron with its own neuron''' filename = os.path.join(_path, 'neuron.asc') new_axon = graft.find_axon(ImmutMorphology(filename)) neuron = Morphology(filename) graft.graft_axon(neuron, new_axon) expected = Morphology(filename) ok_(not diff(expected, neuron))
def test_dendrites_mean_direction(): donor_neuron = Morphology(os.path.join(_path, 'simple3.asc')) assert_array_equal(graft._dendrites_mean_direction(donor_neuron), np.array([0.6666667, 4.6666665, 3.], dtype=np.float32)) no_dendrite = Morphology() no_dendrite.append_root_section(PointLevel([[0, 0, 0], [1, 1, 1]], [1, 1]), SectionType.axon) with assert_raises(MorphToolException) as obj: graft._dendrites_mean_direction(no_dendrite)
def test_mut_copy_ctor(): simple = Morphology(os.path.join(_path, "simple.swc")) assert_equal([sec.id for sec in simple.iter()], [0, 1, 2, 3, 4, 5]) copy = Morphology(simple) copy.append_root_section( PointLevel([[1, 2, 3], [4, 5, 6]], [2, 2], [20, 20]), SectionType.axon) # test that first object has not been mutated assert_equal([sec.id for sec in simple.iter()], [0, 1, 2, 3, 4, 5]) assert_equal([sec.id for sec in copy.iter()], [0, 1, 2, 3, 4, 5, 6])
def test_mitochondria(): morpho = Morphology() morpho.soma.points = [[0, 0, 0], [1, 1, 1]] morpho.soma.diameters = [1, 1] neuronal_section_ids = [0, 0] relative_pathlengths = np.array([0.5, 0.6], dtype=np.float32) diameters = [10, 20] mito_id = morpho.mitochondria.append_root_section( MitochondriaPointLevel(neuronal_section_ids, relative_pathlengths, diameters)) mito_id.append_section( MitochondriaPointLevel([0, 0, 0, 0], [0.6, 0.7, 0.8, 0.9], [20, 30, 40, 50])) with setup_tempdir('test_mitochondria') as tmp_folder: morpho.write(os.path.join(tmp_folder, "test.h5")) with captured_output() as (_, err): with ostream_redirect(stdout=True, stderr=True): morpho.write(os.path.join(tmp_folder, "test.swc")) assert_string_equal( err.getvalue(), "Warning: this cell has mitochondria, they cannot be saved in " " ASC or SWC format. Please use H5 if you want to save them." ) with captured_output() as (_, err): with ostream_redirect(stdout=True, stderr=True): morpho.write(os.path.join(tmp_folder, "test.asc")) assert_string_equal( err.getvalue(), "Warning: this cell has mitochondria, they cannot be saved in " " ASC or SWC format. Please use H5 if you want to save them." ) mito = ImmutMorphology(os.path.join(tmp_folder, 'test.h5')).mitochondria assert_array_equal(mito.root_sections[0].diameters, diameters) assert_array_equal(mito.root_sections[0].neurite_section_ids, neuronal_section_ids) assert_array_equal(mito.root_sections[0].relative_path_lengths, relative_pathlengths) assert_equal(len(mito.root_sections), 1) mito = Morphology(os.path.join(tmp_folder, 'test.h5')).mitochondria assert_equal(len(mito.root_sections), 1) assert_equal(mito.root_sections[0].neurite_section_ids, neuronal_section_ids) assert_array_equal(mito.section(0).diameters, diameters) assert_array_equal( mito.section(0).neurite_section_ids, neuronal_section_ids)
def test_graft_axon_on_synthesized_cell(): np.random.seed(0) # donor neuron is empty assert_raises(NoAxonException, graft.graft_axon, SIMPLE, Morphology()) donor_neuron = Morphology(os.path.join(_path, 'simple3.asc')) synthesized_cell = Morphology(os.path.join(_path, 'synthesized_cell.asc')) graft.graft_axon(synthesized_cell, donor_neuron) axon = graft.find_axon(synthesized_cell) assert_array_almost_equal( axon.points, [[5.110419, 5.486378, 4.9647303], [5.110419, 1.486378, 4.9647303]])
def test_graft_axon_on_synthesized_cell(): np.random.seed(0) # donor neuron is empty with pytest.raises(NoAxonException): graft.graft_axon(SIMPLE, Morphology()) donor_neuron = Morphology(DATA / 'simple3.asc') synthesized_cell = Morphology(DATA / 'synthesized_cell.asc') graft.graft_axon(synthesized_cell, donor_neuron) axon = graft.find_axon(synthesized_cell) assert_array_almost_equal( axon.points, [[5.1272364, 5.4825425, 4.9689593], [5.1272364, 1.4825425, 4.9689593]])
def test_write_merge_only_child(): '''The root section has only one child The child should be merged with its parent section Special care must be given for the potential duplicate point o / / son 1 root child / o--------o----------o< \ \ son 2 \ o ''' morpho = Morphology() morpho.soma.points = [[0, 0, 0]] morpho.soma.diameters = [2] root = morpho.append_root_section( PointLevel([[0, 0, 0], [0, 5, 0]], [2, 2]), SectionType.basal_dendrite) child = root.append_section(PointLevel([[0, 5, 0], [0, 6, 0]], [2, 3])) son1 = child.append_section(PointLevel([[0, 6, 0], [0, 7, 0]], [2, 3])) son2 = child.append_section(PointLevel([[0, 6, 0], [4, 5, 6]], [3, 3])) with setup_tempdir('test_write_merge_only_child') as tmp_folder: for extension in ['swc', 'asc', 'h5']: with captured_output() as (_, err): with ostream_redirect(stdout=True, stderr=True): filename = os.path.join(tmp_folder, 'test.{}'.format(extension)) morpho.write(filename) assert_equal(err.getvalue().strip(), 'Warning: section 1 is the only child of section: 0\nIt will be merged with the parent section') read = Morphology(filename) root = read.root_sections[0] assert_array_equal(root.points, [[0, 0, 0], [0, 5, 0], [0, 6, 0]]) assert_equal(len(root.children), 2) assert_array_equal(root.children[0].points, [[0, 6, 0], [0, 7, 0]]) assert_array_equal(root.children[1].points, [[0, 6, 0], [4, 5, 6]])
def test_for_morphio(): Neuron(Morphology()) neuron = Morphology() neuron.soma.points = [[0, 0, 0], [1, 1, 1], [2, 2, 2]] neuron.soma.diameters = [1, 1, 1] NeuroM_neuron = Neuron(neuron) assert_array_equal( NeuroM_neuron.soma.points, [[0., 0., 0., 0.5], [1., 1., 1., 0.5], [2., 2., 2., 0.5]]) NeuroM_neuron.soma.points = [[1, 1, 1, 1], [2, 2, 2, 2]] assert_array_equal(NeuroM_neuron.soma.points, [[1, 1, 1, 1], [2, 2, 2, 2]])
def test_graft(): m = Morphology(os.path.join(_path, 'simple2.swc')) new_axon = graft.find_axon(m) neuron = Morphology(os.path.join(_path, 'simple.swc')) graft.graft_axon(neuron, new_axon) grafted_axon = graft.find_axon(neuron) points = np.vstack([section.points for section in grafted_axon.iter()]) assert_array_equal( points, np.array([[0., 0., 0.], [1., 2., 0.], [1., 2., 0.], [3., 4.5, 0.], [1., 2., 0.], [-5., -4., 0.], [-5., -4., 1.]], dtype=np.float32))
def test_mitochondria_read(): '''Read a H5 file with a mitochondria''' morpho = Morphology(os.path.join(_path, "h5/v1/mitochondria.h5")) mito = morpho.mitochondria assert_equal(len(mito.root_sections), 2) mitochondria = mito.root_sections assert_array_equal(mitochondria[0].diameters, [10, 20]) assert_array_equal(mitochondria[0].relative_path_lengths, np.array([0.5, 0.6], dtype=np.float32)) assert_array_equal(mitochondria[0].neurite_section_ids, np.array([0., 0.], dtype=np.float32)) assert_equal(len(mito.children(mito.root_sections[0])), 1) assert_equal(mito.parent(mito.children(mitochondria[0])[0]), mitochondria[0]) assert_array_equal(mitochondria[1].diameters, [5, 6, 7, 8]) assert_array_equal(mitochondria[1].relative_path_lengths, np.array([0.6, 0.7, 0.8, 0.9], dtype=np.float32)) assert_array_equal(mitochondria[1].neurite_section_ids, np.array([0, 1, 1, 2], dtype=np.float32)) assert_equal(len(mito.children(mito.root_sections[1])), 0)
def fix_non_zero_segments(neuron, zero_length=_ZERO_LENGTH): '''Return a neuron with zero length segments removed Sections composed of a single zero length segment are deleted, where zero is parametrized by zero_length Args: neuron (str|pathlib.Path|morphio.Morphology|morphio.mut.Morphology): input neuron zero_length (float): smallest length of a segment Returns: a fixed morphio.mut.Morphology ''' neuron = Morphology(neuron) to_be_deleted = list() for section in neuron.iter(): points = section.points distances = np.linalg.norm(np.diff(points, axis=0), axis=1) distances[distances < zero_length] = 0 indices = np.append(0, np.nonzero(distances)[0] + 1) if len(indices) != len(points): section.points = section.points[indices] section.diameters = section.diameters[indices] if len(indices) < 2: to_be_deleted.append(section) for section in to_be_deleted: neuron.delete_section(section) return neuron
def test_child_section(): m = Morphology() section = m.append_root_section(PointLevel([[1, 2, 3]], [2], [20]), SectionType.axon) ok_(section.is_root) section.append_section(PointLevel([[1, 2, 3], [4, 5, 6]], [2, 3], [20, 30])) children = m.root_sections[0].children assert_equal(len(children), 1) assert_array_equal(children[0].points, [[1, 2, 3], [4, 5, 6]]) assert_array_equal(children[0].diameters, [2, 3]) assert_array_equal(children[0].perimeters, [20, 30]) children[0].points = [[7, 8, 9], [10, 11, 12]] assert_array_equal(children[0].points, [[7, 8, 9], [10, 11, 12]])
def test_single_neurite(): m = Morphology() m.append_root_section(PointLevel([[1, 2, 3]], [2], [20]), SectionType.axon) assert_array_equal(m.root_sections[0].points, [[1, 2, 3]]) assert_equal(m.root_sections[0].diameters, [2]) assert_equal(m.root_sections[0].perimeters, [20]) m.root_sections[0].points = [[10, 20, 30]] assert_array_equal(m.root_sections[0].points, [[10, 20, 30]], 'Points array should have been mutated') m.root_sections[0].diameters = [7] assert_equal(m.root_sections[0].diameters, [7], 'Diameter array should have been mutated') m.root_sections[0].perimeters = [27] assert_equal(m.root_sections[0].perimeters, [27], 'Perimeter array should have been mutated')
def test_iterators(): assert_array_equal( [sec.id for sec in SIMPLE.section(5).iter(IterType.upstream)], [5, 3]) assert_array_equal( [sec.id for sec in SIMPLE.section(0).iter(IterType.depth_first)], [0, 1, 2]) assert_array_equal( [sec.id for sec in SIMPLE.section(0).iter(IterType.breadth_first)], [0, 1, 2]) assert_array_equal([sec.id for sec in SIMPLE.iter()], [0, 1, 2, 3, 4, 5]) assert_array_equal([sec.id for sec in SIMPLE.iter(IterType.depth_first)], [0, 1, 2, 3, 4, 5]) assert_array_equal([sec.id for sec in SIMPLE.iter(IterType.breadth_first)], [0, 3, 1, 2, 4, 5]) neuron = Morphology(os.path.join(_path, "iterators.asc")) root = neuron.root_sections[0] assert_array_equal( [section.id for section in root.iter(IterType.depth_first)], [0, 1, 2, 3, 4, 5, 6]) assert_array_equal( [section.id for section in root.iter(IterType.breadth_first)], [0, 1, 4, 2, 3, 5, 6]) assert_array_equal( [section.id for section in neuron.iter(IterType.breadth_first)], [0, 7, 1, 4, 8, 9, 2, 3, 5, 6])
def test_mitochondria(): morpho = Morphology() morpho.soma.points = [[0, 0, 0], [1, 1, 1]] morpho.soma.diameters = [1, 1] morpho.append_root_section( PointLevel([[2, 2, 2], [3, 3, 3]], [4, 4], [5, 5]), SectionType.axon) mito = morpho.mitochondria first_mito_id = mito.append_root_section( MitochondriaPointLevel([0, 0], [0.5, 0.6], [10, 20])) first_child = first_mito_id.append_section( MitochondriaPointLevel([3, 4, 4, 5], [0.6, 0.7, 0.8, 0.9], [20, 30, 40, 50])) second_mito_id = mito.append_root_section( MitochondriaPointLevel([0, 1, 1, 2], [0.6, 0.7, 0.8, 0.9], [5, 6, 7, 8])) assert_equal(mito.is_root(first_mito_id), True) assert_equal(mito.children(first_mito_id), [first_child]) assert_equal(mito.parent(first_child), first_mito_id) assert_equal(mito.root_sections, [first_mito_id, second_mito_id]) assert_array_equal(first_child.diameters, [20, 30, 40, 50]) assert_array_equal(first_child.neurite_section_ids, [3, 4, 4, 5]) assert_array_equal( np.array(first_child.relative_path_lengths, dtype=np.float32), np.array([0.6, 0.7, 0.8, 0.9], dtype=np.float32))
def test_write_perimeter(): morpho = Morphology() morpho.soma.points = [[0, 0, 0]] morpho.soma.diameters = [2] dendrite = morpho.append_root_section( PointLevel([[0, 0, 0], [0, 5, 0]], [2, 2], [5, 6]), SectionType.basal_dendrite) dendrite.append_section(PointLevel([[0, 5, 0], [-5, 5, 0]], [2, 3], [6, 7])) dendrite.append_section(PointLevel([[0, 5, 0], [6, 5, 0]], [2, 3], [6, 8])) with setup_tempdir('test_write_perimeter') as tmp_folder: h5_out = os.path.join(tmp_folder, "test_write.h5") morpho.write(h5_out) assert_array_equal( ImmutMorphology(h5_out).perimeters, [5., 6., 6., 7., 6., 8.]) # Cannot right a morph with perimeter data to ASC and SWC for ext in ['swc', 'asc']: out_path = os.path.join(tmp_folder, "test_write_perimeter." + ext) assert_raises(WriterError, morpho.write, out_path)
def test_mitochondria_read(): """Read a H5 file with a mitochondria""" morpho = Morphology(DATA_DIR / "h5/v1/mitochondria.h5") mito = morpho.mitochondria assert len(mito.root_sections) == 2 mitochondria = mito.root_sections assert_array_equal(mitochondria[0].diameters, [10, 20]) assert_array_equal(mitochondria[0].relative_path_lengths, np.array([0.5, 0.6], dtype=np.float32)) assert_array_equal(mitochondria[0].neurite_section_ids, np.array([0., 0.], dtype=np.float32)) assert len(mito.children(mito.root_sections[0])) == 1 assert (mito.parent(mito.children(mitochondria[0])[0]) == mitochondria[0]) assert_array_equal(mitochondria[1].diameters, [5, 6, 7, 8]) assert_array_equal(mitochondria[1].relative_path_lengths, np.array([0.6, 0.7, 0.8, 0.9], dtype=np.float32)) assert_array_equal(mitochondria[1].neurite_section_ids, np.array([0, 1, 1, 2], dtype=np.float32)) assert len(mito.children(mito.root_sections[1])) == 0
def fix_non_zero_segments(neuron): '''Return a neuron with zero length segments removed Sections composed of a single zero length segment are deleted Args: neuron (str|pathlib.Path|morphio.Morphology|morphio.mut.Morphology): input neuron Returns: a fixed morphio.mut.Morphology ''' neuron = Morphology(neuron) to_be_deleted = list() for section in neuron.iter(): points = section.points distances = np.linalg.norm(np.diff(points, axis=0), axis=1) indices = np.append(0, np.nonzero(distances)[0] + 1) if len(indices) != len(points): section.points = section.points[indices] section.diameters = section.diameters[indices] if len(indices) < 2: to_be_deleted.append(section) for section in to_be_deleted: neuron.delete_section(section) return neuron
def convert(input_file, outputfile, recenter=False, nrn_order=False, single_point_soma=False): '''Run the appropriate converter Args: input_file(str): path to input file outputfile(str): path to output file recenter(bool): whether to recenter the morphology based on the center of gravity of the soma nrn_order(bool): whether to traverse the neuron in the NEURON fashion single_point_soma(bool):For SWC only ''' kwargs = {} if nrn_order: kwargs['options'] = Option.nrn_order neuron = Morphology(input_file, **kwargs) output_ext = Path(outputfile).suffix if single_point_soma and output_ext.lower() != '.swc': raise Exception('Single point soma is only applicable for swc output') if output_ext.lower() not in ('.swc', '.asc', '.h5', ): raise Exception('Output file format should be one swc, asc or h5') output_ext = output_ext[1:] # Remove the dot try: converter = {MorphologyVersion.MORPHOLOGY_VERSION_SWC_1: from_swc, MorphologyVersion.MORPHOLOGY_VERSION_ASC_1: from_h5_or_asc, MorphologyVersion.MORPHOLOGY_VERSION_H5_1: from_h5_or_asc, MorphologyVersion.MORPHOLOGY_VERSION_H5_1_1: from_h5_or_asc, MorphologyVersion.MORPHOLOGY_VERSION_H5_2: from_h5_or_asc }[neuron.version] except KeyError as e: raise Exception( 'No converter for morphology type: {}'.format(neuron.version)) from e logger.info('Original soma type: %s', neuron.soma_type) new = converter(neuron, output_ext) if single_point_soma: soma_to_single_point(new.soma) if recenter: transform.translate(new, -1 * new.soma.center) new.write(outputfile) try: # pylint: disable=import-outside-toplevel from morph_tool.neuron_surface import get_NEURON_surface logger.info('Soma surface as computed by NEURON:\n' 'before conversion: %s\n' 'after conversion: %s', get_NEURON_surface(input_file), get_NEURON_surface(outputfile)) except: # noqa pylint: disable=bare-except logger.info('Final NEURON soma surface check was skipped probably because BluePyOpt' ' or NEURON is not installed')
def test_remove_rootsection_in_loop(): morpho = Morphology(DATA_DIR / 'single_point_root.asc') assert len(morpho.root_sections) == 1 for root in morpho.root_sections: if len(root.points) == 1: morpho.delete_section(root, False) assert len(morpho.root_sections) == 2