Source code for allensdk.internal.morphology.node

# Copyright 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 json
import math

[docs]def euclidean_distance(node1, node2): dx = node1.x - node2.x dy = node1.y - node2.y dz = node1.z - node2.z return math.sqrt(dx*dx + dy*dy + dz*dz)
[docs]def midpoint(node1, node2): px = (node1.x + node2.x) * 0.5 py = (node1.y + node2.y) * 0.5 pz = (node1.z + node2.z) * 0.5 return [px, py, pz]
[docs]class Node(object): """ Represents node in SWC morphology file """ def __init__(self, n, t, x, y, z, r, pn, **kwargs): """ Parameters ---------- n: integer node ID t: integer node type (SOMA, AXON, BASAL_DENDRITE or APICAL_DENDRITE) x: float x position of node y: float y position of node z: float z position of node r: float radius of node pn: integer ID of parent node (-1 if no parent) """ # these values correspond to columns in an SWC file self.n = n self.t = t self.x = x self.y = y self.z = z self.radius = r self.parent = pn # self.children = [] # IDs of child nodes self.tree_id = -1 # which unconnected graph this node belongs to # number of compartment that has this node as its endpoint # all nodes except root nodes have a compartment self.compartment_id = -1
[docs] def to_dict(self): """ Convert the node into a serializable dictionary """ return { "id": self.n, "type": self.t, "x": self.x, "y": self.y, "z": self.z, "radius": self.radius, "parent": self.parent, "children": self.children, "tree_id": self.tree_id, "compartment_id": self.compartment_id }
[docs] @classmethod def from_dict(cls, d): return cls( n = d["id"], t = d["type"], x = d["x"], y = d["y"], z = d["z"], r = d["radius"], pn = d["parent"], )
def __getitem__(self, item): return self.to_dict()[item] def __str__(self): return self.short_string() return json.dumps(self.to_dict())
[docs] def short_string(self): """ create string with node information in succinct, single-line form """ return "%d %d %.4f %.4f %.4f %.4f %d %s %d" % (self.n, self.t, self.x, self.y, self.z, self.radius, self.parent, str(self.children), self.tree_id);
# Morphology nodes have the following fields. These allow dictionary access # to node fields (this is for backward compatibility) NODE_ID = 'id' NODE_TYPE = 'type' NODE_X = 'x' NODE_Y = 'y' NODE_Z = 'z' NODE_R = 'radius' NODE_PN = 'parent' NODE_TREE_ID = 'tree_id' NODE_CHILDREN = 'children'