Source code for bsb.connectivity.connectome.purkinje_dcn

import numpy as np
from ..strategy import ConnectionStrategy


[docs]class ConnectomePurkinjeDCN(ConnectionStrategy): """ Legacy implementation for the connection between purkinje cells and DCN cells. Also rotates the dendritic trees of the DCN. """ casts = {"divergence": int} required = ["divergence"]
[docs] def validate(self): pass
def connect(self): # Gather information for the legacy code block below. from_type = self.from_cell_types[0] to_type = self.to_cell_types[0] purkinjes = self.from_cells[from_type.name] dcn_cells = self.to_cells[to_type.name] dend_tree_coeff = np.zeros((dcn_cells.shape[0], 4)) for i in range(len(dcn_cells)): # Make the planar coefficients a, b and c. dend_tree_coeff[i] = np.random.rand(4) * 2.0 - 1.0 # Calculate the last planar coefficient d from ax + by + cz - d = 0 # => d = - (ax + by + cz) dend_tree_coeff[i, 3] = -np.sum(dend_tree_coeff[i, 0:2] * dcn_cells[i, 2:4]) if len(dcn_cells) == 0: return first_dcn = int(dcn_cells[0, 0]) divergence = self.divergence def connectome_pc_dcn(first_dcn, purkinjes, dcn_cells, div_pc, dend_tree_coeff): pc_dcn = np.zeros((0, 2)) # For all Purkinje cells: calculate the distance with the area around glutamatergic DCN cells soma, then choose 4-5 of them for i in purkinjes: distance = ( np.absolute( (dend_tree_coeff[:, 0] * i[2]) + (dend_tree_coeff[:, 1] * i[3]) + (dend_tree_coeff[:, 2] * i[4]) + dend_tree_coeff[:, 3] ) ) / ( np.sqrt( (dend_tree_coeff[:, 0] ** 2) + (dend_tree_coeff[:, 1] ** 2) + (dend_tree_coeff[:, 2] ** 2) ) ) dist_matrix = np.zeros((dcn_cells.shape[0], 2)) dist_matrix[:, 1] = dcn_cells[:, 0] dist_matrix[:, 0] = distance dcn_dist = np.random.permutation(dist_matrix) # If the number of DCN cells are less than the divergence value, all neurons are connected to the corresponding PC if dcn_cells.shape[0] < div_pc: matrix = np.zeros((dcn_cells.shape[0], 2)) matrix[:, 0] = i[0] matrix[:, 1] = dcn_cells[:, 0] pc_dcn = np.vstack((pc_dcn, matrix)) else: if np.random.rand() > 0.5: connected_f = dcn_dist[0:div_pc, 1] connected_dist = dcn_dist[0:div_pc, 0] connected_provv = connected_f.astype(int) connected_dcn = connected_provv # construction of the output matrix: the first column has the PC index, while the second column has the connected DCN cell index matrix = np.zeros((div_pc, 2)) matrix[:, 0] = i[0] matrix[:, 1] = connected_dcn pc_dcn = np.vstack((pc_dcn, matrix)) else: connected_f = dcn_dist[0 : (div_pc - 1), 1] connected_dist = dcn_dist[0 : (div_pc - 1), 0] connected_provv = connected_f.astype(int) connected_dcn = connected_provv matrix = np.zeros(((div_pc - 1), 2)) matrix[:, 0] = i[0] matrix[:, 1] = connected_dcn pc_dcn = np.vstack((pc_dcn, matrix)) return pc_dcn results = connectome_pc_dcn( first_dcn, purkinjes, dcn_cells, divergence, dend_tree_coeff ) self.scaffold.connect_cells(self, results)