Source code for genepy3d.io.swc

import os
import glob
import fnmatch
import numpy as np
import pandas as pd

from genepy3d.obj import trees

[docs] class SWC: """Support reading neuron data from swc files [1]. References: .. [1] http://www.neuronland.org/NLMorphologyConverter/MorphologyFormats/SWC/Spec.html """ def __init__(self,filepath,recursive=False): filelst = [] # file with full path neuronnamelst = [] # file name # check input if os.path.isdir(filepath): # if directory if recursive==False: filepattern = os.path.join(filepath,"*.swc") for file in glob.glob(filepattern): neuronnamelst.append(os.path.basename(file).split(".swc")[0]) filelst.append(file) else: # searching recursively from the parent directory for root, dirnames, filenames in os.walk(filepath): for file in fnmatch.filter(filenames, '*.swc'): neuronnamelst.append(os.path.basename(file).split(".swc")[0]) filelst.append(os.path.join(root,file)) elif os.path.isfile(filepath): # if a file neuronnamelst.append(os.path.basename(filepath).split(".swc")[0]) filelst.append(filepath) else: raise ValueError("do not support special files (socket, FIFO, device file).") self.filelst = filelst self.neuronidlst = range(len(filelst)) self.neuronnamelst = neuronnamelst
[docs] def get_neuron_id(self): """Return neuron IDs. Returns: A pandas serie of (name,id). """ return pd.Series(self.neuronidlst,index=self.neuronnamelst)
[docs] def get_neurons(self,neuron_id=None): """Return list of neurons (Tree object) identified by IDs. Returns: A dictionary where key is the neuron ID and value is the Tree object. """ # check neuron_id if neuron_id is None: neuronlst = range(len(self.filelst)) else: if isinstance(neuron_id,(int,np.integer)): # only one item. neuronlst = [neuron_id] elif isinstance(neuron_id, (list, np.ndarray)): # array-like neuronlst = neuron_id else: raise Exception('neuron_id must be int or array-like.') dic = {} for i in neuronlst: file = self.filelst[i] # filename = self.neuronnamelst[i] fileid = self.neuronidlst[i] dic[fileid] = trees.Tree.from_swc(file) if len(neuronlst)==1: # only 1 item return list(dic.values())[0] else: return dic