Source code for neuron_morphology.swc_io

import pandas as pd
from neuron_morphology.morphology import Morphology


SWC_COLUMNS = ('id', 'type', 'x', 'y', 'z', 'radius', 'parent',)
COLUMN_CASTS = {
    'id': int,
    'parent': int,
    'type': int
}


[docs]def read_swc(path, columns=SWC_COLUMNS, sep=' ', casts=COLUMN_CASTS): """ Read an swc file into a pandas dataframe """ df = pd.read_csv(path, names=columns, comment='#', sep=sep) apply_casts(df, casts) return df
[docs]def write_swc(data, path, comments=None, sep=' ', columns=SWC_COLUMNS, casts=COLUMN_CASTS): """ Write an swc file from a pandas dataframe """ if comments is None: comments = [] comments = ['# ' + comment + '\n' for comment in comments] apply_casts(data, casts) data = data[[col for col in columns]] with open(path, 'w') as swc_file: swc_file.writelines(comments) data.to_csv(path, sep=sep, index=False, header=None, mode='a')
[docs]def apply_casts(df, casts): for key, typ in casts.items(): df[key] = df[key].astype(typ)
[docs]def morphology_from_swc(swc_path): swc_data = read_swc(swc_path, sep=' ') nodes = swc_data.to_dict('record') for node in nodes: # unfortunately, pandas automatically promotes numeric types to float in to_dict node['parent'] = int(node['parent']) node['id'] = int(node['id']) node['type'] = int(node['type']) return Morphology( nodes, node_id_cb=lambda node: node['id'], parent_id_cb=lambda node: node['parent'] )
[docs]def morphology_to_swc(morphology, swc_path, comments=None): """ Write an swc file from a morphology object """ df = pd.DataFrame(morphology.nodes()) write_swc(df, swc_path, comments=comments)