Source code for svcco.branch_addition.add_edge
import numpy as np
import numba as nb
##################################################
# Adding Edge to Tree
##################################################
[docs]@nb.jit(nopython=True,cache=True,nogil=True)
def add_edge(data,proximal,distal,parent,flow,proximal_idx=-1.0,distal_idx=-1.0,
left_child=-1.0,right_child=-1.0):
edge = np.zeros(data.shape[1])
# Set coordinates of new edge
edge[0:3] = proximal
edge[3:6] = distal
# Normalized direction of added edge
edge[12:15] = (distal - proximal) / np.linalg.norm(distal-proximal)
# Get a random normal vector to the edge
if edge[14] == -1.0:
edge[6:9] = np.array([-1.0,0.0,0.0])
edge[9:12] = np.array([0.0,-1.0,0.0])
else:
edge[6:9] = np.array([1.0-edge[12]**2/(1.0+edge[14]),
(-edge[12]*edge[13])/(1.0+edge[14]),
-edge[12]])
edge[9:12] = np.array([(-edge[12]*edge[13])/(1.0+edge[14]),
1.0 - edge[13]**2/(1.0+edge[14]),
-edge[13]])
# If this edge already had children then update them
if left_child != -1.0:
edge[15] = left_child.item()
else:
edge[15] = left_child
if right_child != -1.0:
edge[16] = right_child.item()
else:
edge[16] = right_child
#edge[17] = parent
# Determine node indicies for new edge
if proximal_idx == -1.0:
item1 = np.max(data[:,18])
item2 = np.max(data[:,19])
edge[18] = np.max(np.array([item1,item2])) + 1
else:
edge[18] = proximal_idx
if distal_idx == -1.0:
edge[19] = edge[18] + 1
else:
edge[19] = distal_idx
# Length of new edge
edge[20] = np.sqrt(np.sum(np.square(distal-proximal)))
# index 21: radius, not determined yet
edge[22] = flow
# index 23: left bifurcation, not determined yet
# index 24: right bifurcation, not determined yet
# index 25: reduced resistance, not determined yet
edge[26] = data[parent, 26].item() + 1
if left_child != -1 and right_child != -1:
edge[27] = data[parent, 27].item()
# Actual edge
edge[29] = -1
# Index of edge
edge[-1] = data.shape[0] - 1
# Add edge to tree
data[-1,:] = edge