Source code for allensdk.internal.core.swc
# Copyright 2015-2016 Allen Institute for Brain Science
# This file is part of Allen SDK.
#
# Allen SDK is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, version 3 of the License.
#
# Allen SDK is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with Allen SDK. If not, see <http://www.gnu.org/licenses/>.
import csv
import copy
import math
from allensdk.internal.morphology.morphology import *
from allensdk.internal.morphology.node import Node
########################################################################
[docs]def read_swc(file_name):
"""
Read in an SWC file and return a Morphology object.
Parameters
----------
file_name: string
SWC file name.
Returns
-------
Morphology
A Morphology instance.
"""
nodes = []
line_num = 1
try:
with open(file_name, "r") as f:
for line in f:
# remove comments
if line.lstrip().startswith('#'):
continue
# read values. expected SWC format is:
# ID, type, x, y, z, rad, parent
# x, y, z and rad are floats. the others are ints
toks = line.split()
vals = Node(
n = int(toks[0]),
t = int(toks[1]),
x = float(toks[2]),
y = float(toks[3]),
z = float(toks[4]),
r = float(toks[5]),
pn = int(toks[6].rstrip())
)
# store this node
nodes.append(vals)
# increment line number (used for error reporting only)
line_num += 1
except ValueError:
err = "File not recognized as valid SWC file.\n"
err += "Problem parsing line %d\n" % line_num
if line is not None:
err += "Content: '%s'\n" % line
raise IOError(err)
return Morphology(node_list=nodes)
########################################################################
[docs]class Marker( dict ):
""" Simple dictionary class for handling reconstruction marker objects. """
SPACING = [ .1144, .1144, .28 ]
CUT_DENDRITE = 10
NO_RECONSTRUCTION = 20
def __init__(self, *args, **kwargs):
super(Marker, self).__init__(*args, **kwargs)
# marker file x,y,z coordinates are offset by a single image-space pixel
self['x'] -= self.SPACING[0]
self['y'] -= self.SPACING[1]
self['z'] -= self.SPACING[2]
[docs]def read_marker_file(file_name):
""" read in a marker file and return a list of dictionaries """
with open(file_name, 'r') as f:
rows = csv.DictReader((r for r in f if not r.startswith('#')),
fieldnames=['x','y','z','radius','shape','name','comment',
'color_r','color_g','color_b'])
return [ Marker({ 'x': float(r['x']),
'y': float(r['y']),
'z': float(r['z']),
'name': int(r['name']) }) for r in rows ]