Model of the hippocampus over the sleep-wake cycle using Hodgkin-Huxley neurons (Aussel et al 2018)

 Download zip file 
Help downloading and running models
Accession:243350
" ...we propose a computational model of the hippocampal formation based on a realistic topology and synaptic connectivity, and we analyze the effect of different changes on the network, namely the variation of synaptic conductances, the variations of the CAN channel conductance and the variation of inputs. By using a detailed simulation of intracerebral recordings, we show that this is able to reproduce both the theta-nested gamma oscillations that are seen in awake brains and the sharp-wave ripple complexes measured during slow-wave sleep. The results of our simulations support the idea that the functional connectivity of the hippocampus, modulated by the sleep-wake variations in Acetylcholine concentration, is a key factor in controlling its rhythms."
Reference:
1 . Aussel A, Buhry L, Tyvaert L, Ranta R (2018) A detailed anatomical and mathematical model of the hippocampal formation for the generation of sharp-wave ripples and theta-nested gamma oscillations. J Comput Neurosci 45:207-221 [PubMed]
Model Information (Click on a link to find other models with that property)
Model Type:
Brain Region(s)/Organism: Hippocampus;
Cell Type(s): Hodgkin-Huxley neuron;
Channel(s):
Gap Junctions:
Receptor(s): AMPA; GabaA;
Gene(s):
Transmitter(s): Acetylcholine;
Simulation Environment: Brian 2;
Model Concept(s): Sleep; Oscillations; Gamma oscillations; Theta oscillations;
Implementer(s): Aussel, Amélie [amelie.aussel at loria.fr]; Buhry, Laure ; Ranta, Radu ;
Search NeuronDB for information about:  GabaA; AMPA; Acetylcholine;
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

from brian2 import *
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
from matplotlib.pyplot import *
from mpl_toolkits.mplot3d import Axes3D
import datetime

def topology(N1,N2,N3,p_CAN):
    
    #Creation of the electrode
    elec_start_point=array([-21, 0, 50])
    elec_end_point=array([15, 0, 50])
    elec_dir=(elec_end_point-elec_start_point)/norm(elec_end_point-elec_start_point)
    elec=[]
    psi = arccos(dot(elec_dir,array([0,1,0])))
    radius = 400/150
    for t in linspace(0,1,33):
        centre=(1-t)*elec_start_point+t*elec_end_point
        for theta in arange(0,2*pi,pi/6):
            point=[centre[0]+radius*cos(theta)*cos(psi),centre[1]-radius*cos(theta)*sin(psi),centre[2]+radius*sin(theta)]
            elec.append(point)
    elec_array=array(elec[:144]+elec[252:]) #removing the inter contact points
    
    def topo_one_pop(init_segs,end_segs,N,i_soma): 
        seg=randint(0,len(init_segs))
        t=uniform(i_soma[0],i_soma[1])
        all_t=zeros(int(N))
        all_z=zeros(int(N))
        all_t[0]=seg
        z=100*random()
        all_z[0]=z
        topo=append((1-t)*init_segs[seg]  + t * end_segs[seg],z)
        topo_end=append(end_segs[seg],z)
        topo_inh=append(init_segs[seg],z)
        
        for i in range(int(N-1)):
            seg=randint(0,len(init_segs)-1)
            t=random()
            init=t*init_segs[seg]+(1-t)*init_segs[seg+1]
            all_t[i]=seg+t
            end=t*end_segs[seg]+(1-t)*end_segs[seg+1] 
            t2=uniform(i_soma[0],i_soma[1]) 
            z=100*random()
            all_z[i]=z
            coords=append((1 - t2)*init  + t2 * end,z)
            topo=vstack((topo,coords)) 
            topo_end=vstack((topo_end,append(end,z))) 
            topo_inh=vstack((topo_inh,append(0.9*init+0.1*end,z))) 
        sort_index=argsort(all_t)
        topo=topo[sort_index]
        topo_end=topo_end[sort_index]
        topo_inh=topo_inh[sort_index]
        all_z=all_z[sort_index]
        sort_index2=argsort(all_z)
        topo=topo[sort_index2]
        topo_end=topo_end[sort_index2]
        topo_inh=topo_inh[sort_index2]
        
        #Points inside the electrode are pushed away :
        for i in range(int(N)):
            x=topo[i,0]
            y=topo[i,1]
            z=topo[i,2]
            dist_elec=norm(cross((array([x,y,50])-elec_start_point),elec_dir))
            if dist_elec<radius/2:
                if z<50:
                    topo[i,2]-=radius*(1-(dist_elec/radius)**2)
                    topo_end[i,2]-=radius*(1-(dist_elec/radius)**2)
                    topo_inh[i,2]-=radius*(1-(dist_elec/radius)**2)
                else :
                    topo[i,2]+=radius*(1-(dist_elec/radius)**2) 
                    topo_end[i,2]+=radius*(1-(dist_elec/radius)**2) 
                    topo_inh[i,2]+=radius*(1-(dist_elec/radius)**2)
                #print(topo[i,2])    
        
        return topo,topo_end,topo_inh
    
    ###CA1
    init_CA1=[[0,16],[-3.5,16],[-8,15.5],[-12,14],[-15,12],[-19,9],[-21.5,4.6],[-22,-0.15],[-21,-4],[-19,-9],[-17,-12],[-13.8,-15],[-9,-17],[-6,-18]]
    end_CA1=[[0,9],[-2,8.5],[-4,7],[-5.8,5.6],[-7,4],[-7.9,2],[-8,0.25],[-8,-1],[-7.75,-2],[-7.5,-2.5],[-6,-4],[-4.5,-5.5],[-2,-7.25],[0,-8.5]]
    init_CA1=array(init_CA1)
    end_CA1=array(end_CA1)
    
    N_CA1_py=int(N1*(1-p_CAN))
    N_CA1_py_CAN=int(N1*p_CAN)
    if N_CA1_py>0:
        CA1_py,CA1_py_end,CA1_py_inh=topo_one_pop(init_CA1,end_CA1,N_CA1_py,(0.1,0.7))
    else :
        CA1_py,CA1_py_end,CA1_py_inh=0,0,0
    CA1_pyCAN,CA1_pyCAN_end,CA1_pyCAN_inh=topo_one_pop(init_CA1,end_CA1,N_CA1_py_CAN,(0.1,0.7))
    CA1_inh,CA1_inh_end,CA1_inh_inh=topo_one_pop(init_CA1,end_CA1,N2,(0,0.1))   #Ca1_inh_end is not used
    
    ###DG
    
    end_DG=[[4.5,3.6],[4.75,3],[5,2.5],[5.7,1.75],[6,1.4],[7.3,0.6],[9,0.5],[10,0.4],[10.9,0.6],[11.6,1.4],[12.5,2.25],[13,3],[12.75,3.5],[12.5,4]]
    init_DG=[[0.5,7],[-1.5,5.5],[-4,3],[-3.7,0],[-1.5,-4],[2,-6],[5.4,-7],[10,-7.2],[13.5,-6],[16,-2.8],[17,1],[18,4],[16.5,6.5],[13.5,7.5]]
    init_DG=array(init_DG)
    end_DG=array(end_DG)
    
    N_DG_py=int(N1)
    DG_py,DG_py_end,DG_py_inh=topo_one_pop(init_DG,end_DG,N_DG_py,(0.1,0.6))
    DG_inh,DG_inh_end,DG_inh_inh=topo_one_pop(init_DG,end_DG,N3,(0,0.1))
    
    ###CA3
    
    init_CA3=[[3,15.5],[5,14.75],[6.5,14],[8,12.8],[9.5,11],[10.5,7.5],[10.8,4.5],[10,2]]
    end_CA3=[[2,9],[3,8.9],[4,8.5],[4.75,8],[5.5,7.5],[6,6],[6.5,5.25],[7,4.5]]
    init_CA3=array(init_CA3)
    end_CA3=array(end_CA3)

    N_CA3_py=int(N2*(1-p_CAN))
    N_CA3_py_CAN=int(N2*p_CAN) 
    if N_CA3_py>0:
        CA3_py,CA3_py_end,CA3_py_inh=topo_one_pop(init_CA3,end_CA3,N_CA3_py,(0.1,0.6))
    else :
        CA3_py,CA3_py_end,CA3_py_inh=0,0,0
    CA3_pyCAN,CA3_pyCAN_end,CA3_pyCAN_inh=topo_one_pop(init_CA3,end_CA3,N_CA3_py_CAN,(0.1,0.6))
    CA3_inh,CA3_inh_end,CA3_inh_inh=topo_one_pop(init_CA3,end_CA3,N3,(0,0.1))
    
    ###EC
    
    init_EC=[[5,-21],[6.6,-21],[8.3,-21],[10,-21],[11,-21.8],[12,-22.8],[13,-25],[13.3,-27],[13.6,-29],[14,-32],[13.6,-35],[13.3,-37],[13,-40],[12,-42.5],[11,-44],[10,-45],[8,-45],[6,-45],[4,-45],[2,-45],[0,-45],[-2,-45],[-4,-45],[-6,-45],[-8,-45],[-10,-45]]
    end_EC=[[6,-10.5],[7.3,-10.5],[8.6,-10.5],[10,-10.5],[13.5,-11],[16.5,-13],[19,-16],[21.5,-20],[23,-25],[24,-32],[23.2,-38],[22.2,-44],[20.4,-49],[17,-52.5],[14,-54],[11,-55],[8,-55],[6,-55],[4,-55],[2,-55],[0,-55],[-2,-55],[-4,-55],[-6,-55],[-8,-55],[-10,-55]]
    init_EC=array(init_EC)
    end_EC=array(end_EC)

    N_EC_py=int(N1*(1-p_CAN))
    N_EC_py_CAN=int(N1*p_CAN) 
    if N_EC_py>0:
        EC_py,EC_py_end,EC_py_inh=topo_one_pop(init_EC,end_EC,N_EC_py,(0.1,0.6))
    else :
        EC_py,EC_py_end,EC_py_inh=0,0,0
    EC_pyCAN,EC_pyCAN_end,EC_pyCAN_inh=topo_one_pop(init_EC,end_EC,N_EC_py_CAN,(0.1,0.6))
    EC_inh,EC_inh_end,EC_inh_inh=topo_one_pop(init_EC,end_EC,N2,(0,0.1))      

    #3D figure of the network    
    figure(figsize=(10,8))
    subplot(111, projection='3d')
    if N_CA1_py>0:
        plot(CA1_py[:,0],CA1_py[:,1],CA1_py[:,2],'bo')
        plot(CA1_py_end[:,0],CA1_py_end[:,1],CA1_py_end[:,2],'bo')
    plot(CA1_pyCAN[:,0],CA1_pyCAN[:,1],CA1_pyCAN[:,2],'bo')
    plot(CA1_pyCAN_end[:,0],CA1_pyCAN_end[:,1],CA1_pyCAN_end[:,2],'bo')
    plot(CA1_inh[:,0],CA1_inh[:,1],CA1_inh[:,2],'co')
    
    if N_CA3_py>0:
        plot(CA3_py[:,0],CA3_py[:,1],CA3_py[:,2],'go')
        plot(CA3_py_end[:,0],CA3_py_end[:,1],CA3_py_end[:,2],'go')
    plot(CA3_pyCAN[:,0],CA3_pyCAN[:,1],CA3_pyCAN[:,2],'go')
    plot(CA3_pyCAN_end[:,0],CA3_pyCAN_end[:,1],CA3_pyCAN_end[:,2],'go')
    plot(CA3_inh[:,0],CA3_inh[:,1],CA3_inh[:,2],'yo')
    
    plot(DG_py[:,0],DG_py[:,1],DG_py[:,2],'ro')
    plot(DG_py_end[:,0],DG_py_end[:,1],DG_py_end[:,2],'ro')
    plot(DG_inh[:,0],DG_inh[:,1],DG_inh[:,2],'mo')

    if N_EC_py>0:    
        plot(EC_py[:,0],EC_py[:,1],EC_py[:,2],'ko')
        plot(EC_py_end[:,0],EC_py_end[:,1],EC_py_end[:,2],'ko')
    plot(EC_pyCAN[:,0],EC_pyCAN[:,1],EC_pyCAN[:,2],'ko')
    plot(EC_pyCAN_end[:,0],EC_pyCAN_end[:,1],EC_pyCAN_end[:,2],'ko')
    plot(EC_inh[:,0],EC_inh[:,1],EC_inh[:,2],'wo') 
    
    plot(elec_array[:144,0],elec_array[:144,1],elec_array[:144,2],'yo') 
    plot(elec_array[144:,0],elec_array[144:,1],elec_array[144:,2],'yo')

    uniq_filename = str(datetime.datetime.now().date()) + '_' + str(datetime.datetime.now().time()).replace(':', '.')
    savefig('3D_'+uniq_filename+'.png')

 
#Black and white 2D figure od the network
    C1=array([16.5,-45,82])
    C2=array([16.5,-45,50])
    C3=array([16.5,-45,16])
    figure(figsize=(10,8))
    if N_CA1_py>0:
        plot(CA1_py[:,0],CA1_py[:,1],'o', color='0.5')
    plot(CA1_pyCAN[:,0],CA1_pyCAN[:,1],'o', color='0.5')
    if N_CA1_py>0:
        plot(CA1_py_end[:,0],CA1_py_end[:,1],'o', color='0.8')
    plot(CA1_pyCAN_end[:,0],CA1_pyCAN_end[:,1],'o', color='0.8')
    plot(CA1_inh[:,0],CA1_inh[:,1],'o', color='0.3')
    
    if N_CA3_py>0:
        plot(CA3_py[:,0],CA3_py[:,1],'o', color='0.5')
    plot(CA3_pyCAN[:,0],CA3_pyCAN[:,1],'o', color='0.5')
    if N_CA3_py>0:
        plot(CA3_py_end[:,0],CA3_py_end[:,1],'o', color='0.8')
    plot(CA3_pyCAN_end[:,0],CA3_pyCAN_end[:,1],'o', color='0.8')
    plot(CA3_inh[:,0],CA3_inh[:,1],'o', color='0.3')
    
    plot(DG_py[:,0],DG_py[:,1],'o', color='0.5')
    plot(DG_py_end[:,0],DG_py_end[:,1],'o', color='0.8')
    plot(DG_inh[:,0],DG_inh[:,1],'o', color='0.3')
    
    if N_EC_py>0:
        plot(EC_py[:,0],EC_py[:,1],'o', color='0.5')
    plot(EC_pyCAN[:,0],EC_pyCAN[:,1],'o', color='0.5')
    if N_EC_py>0:
        plot(EC_py_end[:,0],EC_py_end[:,1],'o', color='0.8')
    plot(EC_pyCAN_end[:,0],EC_pyCAN_end[:,1],'o', color='0.8')
    plot(EC_inh[:,0],EC_inh[:,1],'o', color='0.3')  
    
    scalebar_len=1000/150
    plot(array([25,25+scalebar_len]),array([15,15]),'k',linewidth=3.5)
    
    xlim([-40,40])
    ylim([-60,20])
    uniq_filename = str(datetime.datetime.now().date()) + '_' + str(datetime.datetime.now().time()).replace(':', '.')
    savefig('BW2D_'+uniq_filename+'.png')
    
    return(CA1_py,CA1_py_end,CA1_py_inh,CA1_pyCAN,CA1_pyCAN_end,CA1_pyCAN_inh,CA1_inh,CA3_py,CA3_py_end,CA3_py_inh,CA3_pyCAN,CA3_pyCAN_end,CA3_pyCAN_inh,CA3_inh,DG_py,DG_py_end,DG_py_inh,DG_inh,EC_py,EC_py_end,EC_py_inh,EC_pyCAN,EC_pyCAN_end,EC_pyCAN_inh,EC_inh, elec) 
    
    
#temp1,temp2,temp3,temp4,temp5,temp6,temp7,temp8,temp9,temp10,temp11,temp12,temp13,temp14,temp15,temp16,temp17,temp18,temp19,temp20,temp21,temp22,temp23,temp24,temp25,elec_pos=topologie(10000,1000,100,1)

Loading data, please wait...