Source code for treem.commands.convert

"""Implementation of CLI convert command."""

import numpy as np

from treem import Node, SWC, Morph


[docs]def convert(args): """Converts input data to compliant SWC format.""" vprint = print if not args.quiet else lambda *a, **k: None nam = 'I', 'T', 'X', 'Y', 'Z', 'R', 'P' fmt = 'i', 'i', 'f', 'f', 'f', 'f', 'i' try: data = np.loadtxt(args.file, dtype={'names': nam, 'formats': fmt}) types = args.type if args.type else SWC.TYPES nodes = [Node(row) for row in data if row[SWC.T] in types or row[SWC.P] == -1] root = [node for node in nodes if node.v[SWC.P] == -1][0] root.v[SWC.T] = SWC.SOMA for i, node in enumerate(nodes, 1): parent_id = node.v[SWC.P] for parent in nodes: if parent.v[SWC.I] == parent_id: parent.add(node) break vprint(f'converted {int(i/len(nodes)*100):>3d}%', end='\r') vprint() idmap = {-1: -1} for ident, node in enumerate(root.walk(), 1): idmap[node.v[SWC.I]] = ident for row in data: if row[SWC.T] in types or row[SWC.P] == -1: row[SWC.I], row[SWC.P] = idmap[row[SWC.I]], idmap[row[SWC.P]] data = np.array([node.v for node in root.walk()]) Morph(data=data).save(args.out) return 0 except (KeyError, IndexError, ValueError): vprint(f'cannot convert {args.file}.') return 1