Source code for bsb.connectivity.connectome.golgi_granule

import numpy as np
from ..strategy import ConnectionStrategy


[docs]class ConnectomeGolgiGranule(ConnectionStrategy): """ Legacy implementation for the connections between Golgi cells and granule cells. """ casts = {"detailed": bool} defaults = {"detailed": False}
[docs] def validate(self): if self.detailed: morphologies = self.from_cell_types[0].list_all_morphologies() if not morphologies: raise ConfigurationError( "Can't create detailed golgi to granule connections without any morphologies for the golgi cell." ) elif len(morphologies) > 1: raise NotImplementedError( "Detailed golgi to granule connections can only be made for a single golgi morphology." + " (Requires the selection of morphologies to be moved from the connection module to the placement module)" ) mr = self.scaffold.morphology_repository morphology = mr.get_morphology(morphologies[0]) axonic_compartments = morphology.get_compartments(["axon"]) self.axon = np.array([c.id for c in axonic_compartments]) self.morphology = morphology
def connect(self): # Gather information for the legacy code block below. glom_grc = self.scaffold.cell_connections_by_tag["glomerulus_to_granule"] glom_ids = self.scaffold.get_placement_set("glomerulus").identifiers goc_glom = self.scaffold.cell_connections_by_tag["golgi_to_glomerulus"] golgi_type = self.from_cell_types[0] golgis = self.scaffold.cells_by_type[golgi_type.name] if self.detailed: # Fetch the connection compartments of glomerulus to granule connections. try: glom_grc_compartments = self.scaffold.connection_compartments[ "glomerulus_to_granule" ] except KeyError: raise RuntimeError( "Missing the glomerulus to granule connection compartments." ) # Index the glom to granule dense matrix to an adjacency list glom_target_map = {gid: [] for gid in glom_ids} for glom, grc in glom_grc: glom_target_map[glom].append(grc) if self.detailed: # Lookup the grc compartments associated with each glom-grc conn glom_comp_map = {gid: [] for gid in glom_ids} for i, glom in enumerate(glom_grc[:, 0]): glom_comp_map[glom].append(glom_grc_compartments[i, 1]) # Lookup the grc targets of each golgi-glom in the order they appear. grc_via_glom = np.vectorize(glom_target_map.get, otypes=[np.ndarray])( goc_glom[:, 1] ) if self.detailed: comp_via_glom = np.vectorize(glom_comp_map.get, otypes=[np.ndarray])( goc_glom[:, 1] ) # Sum the targets to preallocate total size malloc = sum(map(len, grc_via_glom)) connections = np.empty((malloc, 2)) ptr = 0 # Iterate over the golgis and their grc targets (as lookup up in order # via the gloms) and fill them into the connections array for goc, grcs in zip(goc_glom[:, 0], grc_via_glom): s = len(grcs) if not s: # Skip any weird slicing of empty target sets continue connections[ptr : (ptr + s), 0] = goc connections[ptr : (ptr + s), 1] = grcs ptr += s if self.detailed: compartments = np.empty((malloc, 2)) # Assign random axonal segments compartments[:, 0] = np.random.choice(self.axon, malloc) ptr = 0 # Assign the glom associated dendrites for comps in comp_via_glom: s = len(comps) if not s: # Skip any weird slicing of empty target sets continue compartments[ptr : (ptr + s), 1] = comps ptr += s # Make a bad map ignoring all but the first (only) morphologies # of each type. Sorry future me <3 morpho_map = [ self.from_cell_types[0].list_all_morphologies()[0], self.to_cell_types[0].list_all_morphologies()[0], ] morphologies = np.zeros((len(compartments), 2)) morphologies[:, 1] = 1 self.scaffold.connect_cells( self, connections, morphologies=morphologies, compartments=compartments, morpho_map=morpho_map, ) else: self.scaffold.connect_cells(self, connections)