Beispiel #1
0
def make_ggn_kc_conn(ggn, kc, ggn_kc_syn_params):
    """Create a network with single KC receiving inhibition from an
    isolated GGN.

    """
    ggn_graph = nu.nrngraph(ggn)
    ca_sec_pos = nu.select_random_terminal_segments_by_sid(
        ggn_graph, ng.custom_types['LCA'], 1)
    ca_sec, ca_pos = list(zip(*ca_sec_pos))
    ggn_kc_syn_info = nu.make_gradedsyn_one_one(ca_sec, ca_pos, [kc.soma],
                                                [0.5], ggn_kc_syn_params)
    return {
        'ggn_kc_syn_info': ggn_kc_syn_info,
        'ggn_pre': ca_sec_pos,
    }
Beispiel #2
0
def setup_recording(kcs, ggn, n_kc_vm=100, n_ggn_vm=100, t=None):
    """Create vectors for recording data from KCs and GGN sections"""
    global model_dict
    ret = {}
    kc_st = {}
    for kc in kcs:
        nc, stvec = nu.record_spiketimes(kc.soma)
        kc_st[kc.soma.name()] = (nc, stvec)
    ret['kc_spikes'] = kc_st
    if t is None:
        tvec = h.Vector()
        tvec.record(h._ref_t)
    elif isinstance(t, float):
        tvec = h.Vector()
        tvec.record(h._ref_t, t)
    elif isinstance(t, np.ndarray):  # Assume h.Vector
        tvec = h.Vector(t)
    else:
        tvec = t
    ret['time'] = tvec
    if n_kc_vm > kcs:
        n_kc_vm = len(kcs)
    vm_kcs = np.random.choice(kcs, size=n_kc_vm, replace=False)
    if 'test_kc' in model_dict:
        vm_kcs = np.append(vm_kcs, [model_dict['test_kc']])
    ret['kc_vm'] = {kc.soma.name(): nu.setup_recording(kc.soma, 0.5, 'v', t) \
                     for kc in vm_kcs}    
    g = nu.nrngraph(ggn)
    ggn_out_nodes = nu.select_good_nodes_by_sid(g, [ng.name_sid['LCA'], ng.name_sid['MCA']],
                                          [n_ggn_vm, n_ggn_vm])
    ggn_out = [g.node[n]['orig'] for n in ggn_out_nodes]
    ret['ggn_output_vm'] = {sec.name(): nu.setup_recording(sec, 0.5, 'v', t) \
                             for sec in ggn_out}
    ggn_alphaL_input_nodes = nu.select_good_nodes_by_sid(g, [ng.name_sid['alphaL']], [n_ggn_vm])
    ggn_alphaL_input = [g.node[n]['orig'] for n in ggn_alphaL_input_nodes]
    ret['ggn_alphaL_input_vm'] = {sec.name(): nu.setup_recording(sec, 0.5, 'v', t) \
                                   for sec in ggn_alphaL_input}
    ggn_basal_nodes = nu.select_good_nodes_by_sid(g, [ng.name_sid['dend_b']], [n_ggn_vm])
    ggn_basal = [g.node[n]['orig'] for n in ggn_basal_nodes]
    ret['ggn_basal_vm'] = {sec.name(): nu.setup_recording(sec, 0.5, 'v', t) \
                            for sec in ggn_basal}
    if 'ig' in model_dict:
        ret['ig_vm'] = h.Vector()
        ret['ig_vm'].record(model_dict['ig'].izhi._ref_V, t)
    model_dict.update(ret)
    return ret
Beispiel #3
0
def make_kc_ggn_alpha_loop(ggn,
                           kc,
                           ggn_kc_syn_params,
                           kc_ggn_syn_params,
                           jitter=None):
    """Create a network with single KC connected via a single strong
    synapse (equivalent to many synapses from many synchronous KCs)

    jitter, if specified, should be (time_range, nsyn) where nsyn is
    the number of KC->GGN synapses to be created and each will have a
    delay increased by a uniform random time between 0 and time_range
    (the base delay is specified in kc_ggn_syn_params).

    """
    ggn_graph = nu.nrngraph(ggn)
    if jitter is not None:
        print('Jitter:', jitter, type(jitter[0]), type(jitter[1]))
        trange = float(jitter[0])
        nsyn = int(jitter[1])
    else:
        nsyn = 1
        trange = 0.0
    alpha_sec_pos = nu.select_random_terminal_segments_by_sid(
        ggn_graph, ng.custom_types['alphaL'], nsyn)
    alpha_sec, alpha_pos = list(zip(*alpha_sec_pos))
    kc_ggn_syn_info = nu.make_exp2syn_one_one([kc.soma] * nsyn, [0.5] * nsyn,
                                              alpha_sec, alpha_pos,
                                              kc_ggn_syn_params)
    if nsyn > 1:
        delays = np.random.uniform(low=0.0, high=trange, size=nsyn)
        for netcon, delay in zip(kc_ggn_syn_info['netcons'], delays):
            netcon.delay += delay

    ca_sec_pos = nu.select_random_terminal_segments_by_sid(
        ggn_graph, ng.custom_types['LCA'], 1)
    ca_sec, ca_pos = list(zip(*ca_sec_pos))
    ggn_kc_syn_info = nu.make_gradedsyn_one_one(ca_sec, ca_pos, [kc.soma],
                                                [0.5], ggn_kc_syn_params)
    return {
        'kc_ggn_syn_info': kc_ggn_syn_info,
        'ggn_kc_syn_info': ggn_kc_syn_info,
        'ggn_pre': ca_sec_pos,
        'ggn_post': alpha_sec_pos,
    }
Beispiel #4
0
        cellname = [line for line in ggn_model.split('\n')
                    if 'begintemplate' in line]
        rest = cellname[0].partition('begintemplate')[-1]
        cellname = rest.split()[0]
        if not hasattr(h, cellname):
            h(ggn_model)
        return eval('h.{}()'.format(cellname))

outfilename = '../simulated/Fig_2ef/Vm_inhpoisson_stim_series_20180907_171406.h5'
colormap = '15cb'
plots_per_region = 1

if __name__ == '__main__':
    ggn = get_ggn(outfilename)
    with h5.File(outfilename, 'r') as fd:
        graph = nu.nrngraph(ggn)
        leaves = [graph.node[n]['p'] for n in graph.nodes if graph.nodes[n]['orig'] is None]
        sid_leaf_map = defaultdict(list)
        for leaf in leaves:
            sid_leaf_map[graph.node[leaf]['s']].append(leaf)
        fig = plt.figure()
        gs = gridspec.GridSpec(2, 1, height_ratios=[3,1])
        ax_vm = fig.add_subplot(gs[0])   # Plot the Vm
        syninfo = [s for s in fd['syninfo']]
        sid_data_dict = defaultdict(list)
        for nodename in fd:
            if nodename.startswith('v_'):
                sid = fd[nodename].attrs['sid']
                # Take only leaf nodes
                if fd[nodename].attrs['section'] in sid_leaf_map[sid]:
                    sid_data_dict[sid].append(nodename)
Beispiel #5
0
     count = 0
     ggn.soma.push()
     ordered_tree = h.SectionList()
     ordered_tree.wholetree()
     h.pop_section()
     for sec in ordered_tree:
         sec.push()
         for ii, seg in enumerate(sec):
             if seg.diam < dialim:
                 seg.diam = seg.diam * diascale
                 # print('Changed diameter of segment', ii, seg.x, 'of section', sec.name(), 'to', seg.diam)
                 count += 1
         h.pop_section()
     print('Scaled diameters of', count, 'sections whose diameters were <',
           dialim, 'by', diascale)
 g0 = nu.nrngraph(ggn)
 g, nmap = ng.renumber_nodes(g0, ggn.soma.name())
 type_node_map = defaultdict(list)
 # Reverse lookup table for node by stype
 for n, d in g.nodes_iter(data=True):
     stype = d['s']
     if g.node[n]['orig'] is not None:  # Skip the dummy nodes at terminal
         type_node_map[stype].append(n)
 synnodes = []
 if args.synfile is None:
     for branch_id in inputs:
         nodes = type_node_map[branch_id]
         size = syncount
         if len(nodes) < syncount:
             size = len(nodes)
         for n in np.random.choice(nodes, size=size, replace=False):
        action='store_true',
        dest='stick',
        help=
        'Ball and stick model. If false, the 3D locations using pt3d are used')
    parser.add_argument(
        '-o',
        '--origlabel',
        action='store_true',
        dest='origlabel',
        help='If the original neuron section names should be used.')
    args = parser.parse_args()
    h.xopen(args.filename)
    cellclass = getattr(h, args.cellname)
    cell = cellclass()
    if args.stick:
        graph = nu.nrngraph(cell)
        for n in graph.nodes:
            print(n)
        root = '{}.soma'.format(list(graph.nodes)[0].partition('.')[0])
    else:
        graph, root = cell_to_morph3d(cell)
    numeric, nmap = ng.renumber_nodes(graph, start=root)
    print(len(graph.nodes))
    print(max(numeric.nodes))
    print(len(numeric.nodes))
    if args.origlabel:
        reverse = {node: name.split('.')[-1] for name, node in nmap.items()}
        label_nodes = reverse.keys()
        labels = reverse.values()

    else:
Beispiel #7
0
def setup_model(args):
    """Setup the model with synapses and recording tables."""
    cell_template = args['celltemplate']
    input_regions = args['inputs']
    syn_counts = args['syncounts']
    onset = args['onset']
    tau = args['tau']
    gsyn = args['gsyn']
    mechs = {
        'pas': {
            'g': Q_(args['gpas'], 'S/cm**2'),
            'e': Q_(args['Em'], 'mV')
        }
    }
    if args['gk'] > 0:
        mechs['ka'] = {'gbar': Q_(args['gk'], 'S/cm**2')}
    if args['gca'] > 0:
        mechs['cam'] = {'gbar': Q_(args['gca'], 'S/cm**2')}
    h.xopen(cell_template)
    ggn = nu.create_cell(args['cellname'],
                         filename=args['celltemplate'],
                         mechparams=mechs)
    for sec in ggn.allsec():
        sec.Ra = args['RA']
    g0 = nu.nrngraph(ggn)
    g, nmap = ng.renumber_nodes(g0, ggn.soma.name())
    # Pick out nodes with sections associated with them (not terminal dummy nodes)
    sec_nodes = [n for n in g.nodes() if g.node[n]['orig'] is not None]
    # Select the nodes for synapse insertion
    if args['synfile'] is not None:  # This option is to allow replication
        syn_nodes = []
        sec_node_map = get_section_node_map(g)
        with open(args['synfile']) as fd:
            for line in fd:
                try:
                    secname = line.strip()
                    syn_nodes.append(sec_node_map[secname])
                except KeyError:
                    print('Could not fidn section "{}"'.format(secname))
                    raise
    else:
        syn_nodes_by_sid = ng.select_random_nodes_by_sid(
            g.subgraph(sec_nodes), args['inputs'], args['syncounts'])
        syn_nodes = list(
            np.concatenate(
                [v for v in syn_nodes_by_sid.values() if len(v) > 0]))
        # If np.concatenate arg contains empty list, the result gets converted to float
    syn_secs = []
    synapses = []
    for syn_node in syn_nodes:
        sec = g.node[syn_node]['orig']
        syn_secs.append(sec)
        syn = insert_alphasynapse(sec(1.0),
                                  onset=args['onset'],
                                  gmax=args['gsyn'],
                                  tau=args['tau'])
        synapses.append(syn)
    if args['recfile'] is not None:
        rec_nodes = []
        sec_node_map = get_section_node_map(g)
        with open(args['recfile']) as fd:
            for line in fd:
                try:
                    secname = line.strip()
                    rec_nodes.append(sec_node_map[secname])
                except KeyError:
                    print('Could not fidn section "{}"'.format(secname))
                    raise
    else:
        if args['recbyreg']:
            rec_regions = [1, 3, 4, 5, 6, 7, 8]
            rec_nodes_by_sid = ng.select_random_nodes_by_sid(
                g.subgraph(sec_nodes), rec_regions,
                [args['reccount']] * len(rec_regions))
            rec_nodes = np.concatenate(
                [v for v in rec_nodes_by_sid.values() if len(v) > 0])
            rec_nodes = list(rec_nodes)
        else:
            rec_nodes = list(
                np.random.choice(sec_nodes,
                                 size=args['reccount'],
                                 replace=False))
    rec_nodes = list(set(rec_nodes + syn_nodes))
    rec_secs = [g.node[n]['orig'] for n in rec_nodes]
    t_vec = h.Vector()
    t_vec.record(h._ref_t)
    v_vecs = setup_recording(rec_secs)
    syn_vecs = []
    for syn in synapses:
        vec = h.Vector()
        vec.record(syn._ref_i)
        syn_vecs.append(vec)
    return {
        'cell': ggn,
        'cellgraph': g,
        'synapses': synapses,
        'synsecs': syn_secs,
        'synnodes': syn_nodes,
        'recsecs': rec_secs,
        'recnodes': rec_nodes,
        'tvec': t_vec,
        'vvecs': v_vecs,
        'synvecs': syn_vecs
    }
Beispiel #8
0
def show_peak_vm_ggn(fname,
                     rot=None,
                     drot=None,
                     pos=None,
                     frames=0,
                     framerate=24,
                     moviefile=None,
                     bg=(0, 0, 0),
                     radius=10,
                     lw=10,
                     width=320,
                     height=240):
    """Display the GGN morphology with color coded Vm"""
    sec_delv = {}
    with h5.File(fname, 'r') as fd:
        for node in fd:
            if node.startswith('v_'):
                v = fd[node].value
                delv = max(v) - v[0]
                sec = str(fd[node].attrs['section'])
                sec_delv[sec] = delv
    print('Computed delV')
    ggn = get_ggn(fname)
    graph = nu.nrngraph(ggn)
    soma = [graph.node[node] for node in graph if node.endswith('soma')]
    soma = soma[0]
    name_sec_map = {}
    for secname in sec_delv:
        name_sec_map[secname] = graph.nodes[secname]['orig']
    secpos = get_sec_pos(sec_delv.keys(), name_sec_map)
    if pos is None:
        pos = [(secpos[:, 0].min() + secpos[:, 0].max()) / 2.0,
               (secpos[:, 1].min() + secpos[:, 1].max()) / 2.0,
               (secpos[:, 2].min() + secpos[:, 2].max()) / 2.0]

    # This helps to prevent the neuron from rotating outside camera view
    soma = {'x': pos[0], 'y': pos[1], 'z': pos[2]}
    print('Origin moved to', pos)
    nodecolor = {ii: [(255 - bc) for bc in bg] for ii in range(10)}
    polydata = morph3d.nrngraph2polydata(
        graph,
        nodecolor=nodecolor,  #ng.nodecolor_7q,
        lines=1.0)
    ggn3d = polydata  # morph3d.get_cylinder_view(polydata) <- with get_cylinder_view SetLineWidth does not have any effect
    # Rotation is always with soma as origin
    transfilter, transform = morph3d.get_transformed(ggn3d,
                                                     soma,
                                                     pos,
                                                     rot,
                                                     relative=True)
    mapper = vtk.vtkPolyDataMapper()
    mapper.SetInputConnection(transfilter.GetOutputPort())
    mapper.ScalarVisibilityOn()
    mapper.SetScalarModeToUseCellFieldData()
    mapper.SelectColorArray('Colors')
    # This helps to prevent the neuron from rotating outside camera view
    actor = vtk.vtkActor()
    actor.SetMapper(mapper)
    actor.GetProperty().SetOpacity(0.2)
    actor.GetProperty().SetLineWidth(lw)
    actor.SetOrigin(pos)
    vm_deflection = sec_delv.values()
    print(min(vm_deflection), max(vm_deflection))
    # vm_ctf = make_viridis_ctf(10.0, 30.0)
    vm_ctf = make_ctf_from_linear_segmented_cm(
        int(min(vm_deflection)), int(0.5 + max(vm_deflection)),
        cc.m_isolum)  # min and max give not-so-round numbers
    vm_disp = make_vm_spheres(secpos, vm_deflection, vm_ctf, radius=radius)
    vmxfilt, vmx = morph3d.get_transformed(vm_disp['glyph'],
                                           soma,
                                           pos,
                                           rot,
                                           relative=True)
    vmxfilt.Update()
    vm_mapper = vtk.vtkPolyDataMapper()
    vm_mapper.SelectColorArray('VmColors')
    vm_mapper.SetScalarModeToUsePointFieldData()
    vm_mapper.SetInputConnection(vmxfilt.GetOutputPort())
    # vm_mapper.ScalarVisibilityOn()
    vm_mapper.SetLookupTable(vm_ctf)
    vm_actor = vtk.vtkActor()
    vm_actor.SetMapper(vm_mapper)
    # This helps to prevent the neuron from rotating outside camera view
    vm_actor.SetOrigin(pos)

    colorbar = vtk.vtkScalarBarActor()
    colorbar.SetLookupTable(vm_ctf)
    colorbar.SetTitle('dVm (mV)')
    colorbar.SetNumberOfLabels(5)
    colorbar.SetWidth(0.1)
    colorbar.SetHeight(0.7)
    colorbar.SetPosition(0.9, 0.1)
    colorbar.SetAnnotationTextScaling(True)
    textcolor = [1 - bg[0], 1 - bg[1], 1 - bg[2]]
    colorbar.GetTitleTextProperty().SetFontFamilyToArial()
    colorbar.GetTitleTextProperty().SetFontSize(12)
    colorbar.GetTitleTextProperty().SetColor(*textcolor)
    colorbar.GetTitleTextProperty().SetShadow(False)
    colorbar.GetTitleTextProperty().ItalicOff()
    colorbar.GetLabelTextProperty().SetFontFamilyToArial()
    colorbar.GetLabelTextProperty().SetFontSize(10)
    colorbar.GetLabelTextProperty().SetJustificationToCentered()
    colorbar.GetLabelTextProperty().SetColor(*textcolor)
    colorbar.GetLabelTextProperty().SetShadow(False)
    colorbar.GetLabelTextProperty().ItalicOff()

    renderer = vtk.vtkRenderer()
    renderer.AddActor(actor)
    renderer.AddActor(vm_actor)
    renderer.AddActor2D(colorbar)
    renderer.SetBackground(*bg)
    # camera = vtk.vtkCamera()
    # # This was found experimentally
    # camera.SetPosition((-323.62152099609375, +398.5799446105957, 1000.250453948881))
    # camera.SetFocalPoint(pos)
    # renderer.SetActiveCamera(camera)
    # renderer.GetActiveCamera().SetViewAngle(30)
    win = vtk.vtkRenderWindow()
    win.AddRenderer(renderer)
    win.SetSize(width, height)
    win.Render()
    # Strangely, increasing view angle makes the object distance. What is this view angle?
    renderer.GetActiveCamera().SetViewAngle(23)
    # print(renderer.GetActiveCamera().GetPosition())
    # print(renderer.GetActiveCamera().GetFocalPoint())
    interactor = vtk.vtkRenderWindowInteractor()
    interactor.SetRenderWindow(win)
    interactor.Initialize()
    if moviefile is not None:
        dump_movie([vm_actor, actor], win, drot[0], drot[1], drot[2], frames,
                   framerate, moviefile)
    interactor.Start()