Computational analysis of NN activity and spatial reach of sharp wave-ripples (Canakci et al 2017)

 Download zip file 
Help downloading and running models
Accession:230861
Network oscillations of different frequencies, durations and amplitudes are hypothesized to coordinate information processing and transfer across brain areas. Among these oscillations, hippocampal sharp wave-ripple complexes (SPW-Rs) are one of the most prominent. SPW-Rs occurring in the hippocampus are suggested to play essential roles in memory consolidation as well as information transfer to the neocortex. To-date, most of the knowledge about SPW-Rs comes from experimental studies averaging responses from neuronal populations monitored by conventional microelectrodes. In this work, we investigate spatiotemporal characteristics of SPW-Rs and how microelectrode size and distance influence SPW-R recordings using a biophysical model of hippocampus. We also explore contributions from neuronal spikes and synaptic potentials to SPW-Rs based on two different types of network activity. Our study suggests that neuronal spikes from pyramidal cells contribute significantly to ripples while high amplitude sharp waves mainly arise from synaptic activity. Our simulations on spatial reach of SPW-Rs show that the amplitudes of sharp waves and ripples exhibit a steep decrease with distance from the network and this effect is more prominent for smaller area electrodes. Furthermore, the amplitude of the signal decreases strongly with increasing electrode surface area as a result of averaging. The relative decrease is more pronounced when the recording electrode is closer to the source of the activity. Through simulations of field potentials across a high-density microelectrode array, we demonstrate the importance of finding the ideal spatial resolution for capturing SPW-Rs with great sensitivity. Our work provides insights on contributions from spikes and synaptic potentials to SPW-Rs and describes the effect of measurement configuration on LFPs to guide experimental studies towards improved SPW-R recordings.
Reference:
1 . Canakci S, Toy MF, Inci AF, Liu X, Kuzum D (2017) Computational analysis of network activity and spatial reach of sharp wave-ripples. PLoS One 12:e0184542 [PubMed]
Model Information (Click on a link to find other models with that property)
Model Type: Realistic Network;
Brain Region(s)/Organism: Hippocampus;
Cell Type(s): Hippocampus CA1 pyramidal GLU cell; Hippocampus CA1 basket cell;
Channel(s): I Na,t; I A; I K; I h;
Gap Junctions: Gap junctions;
Receptor(s): NMDA; GabaA; Glutamate;
Gene(s):
Transmitter(s):
Simulation Environment: NEURON;
Model Concept(s): Oscillations; Spatio-temporal Activity Patterns;
Implementer(s): Canakci, Sadullah [scanakci at bu.edu]; Inci, Ahmet F [afinci at sabanciuniv,edu]; Toy, Faruk [faruk.toy at metu.edu.tr]; Liu, Xin [xil432 at end.ucsd.edu]; Kuzum, Duygu [dkuzum at eng.ucsd.edu];
Search NeuronDB for information about:  Hippocampus CA1 pyramidal GLU cell; GabaA; NMDA; Glutamate; I Na,t; I A; I K; I h;
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
//
// NOTICE OF COPYRIGHT AND OWNERSHIP OF SOFTWARE
//
// Copyright 2007, The University Of Pennsylvania
// 	School of Engineering & Applied Science.
//   All rights reserved.
//   For research use only; commercial use prohibited.
//   Distribution without permission of Maciej T. Lazarewicz not permitted.
//   mlazarew@seas.upenn.edu
//
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%



begintemplate SynObj

public addSyn, addNoisySyn, printSyn, printLoc, connect2syn, printCon, getSyn, addNetCon, addSynStim, removeConnections, conList, synList, noisySynList

objref  synList, noisySynList, conList, loc, stimList, this
 
strdef cmd
 
 
// =================================================================================================
//
// init()
//
// =================================================================================================
proc init() {
    synList  = new List()
	noisySynList = new List()
    conList  = new List()
    stimList = new List()

    loc = new SectionRef()
}




// =================================================================================================
//
// connect2syn
//
// =================================================================================================
proc connect2syn() {
    if (numarg()==5) {
        
        conList.prepend( new NetCon($o1,  synList.object($2), $3, $4, $5 ) )
    
    } else {
        
        print "USAGE: connect2syn(src obj, syn nr, threshold, delay, weight)"
        
    }
}




// =================================================================================================
//
// removeConnections
//
// =================================================================================================
proc removeConnections() {
	conList.remove_all()
}




// =================================================================================================
//
// addNetCon(nc, threshold, delay, weight) - for MPI
//
// =================================================================================================
proc addNetCon() {
    if (numarg()==1 || numarg()==4 ) {
    
        conList.prepend($o1)
    
        if (numarg()==4) {
  
                $o1.threshold = $2
                $o1.delay     = $3
                $o1.weight    = $4
        
        }
        
    } else {
        
        print "USAGE: connect(nc, [threshold, delay, weight])"
        
    }
}




// =================================================================================================
//
// addSyn( tau1 (ms), tau2 (ms), Erev (mV), mode, synLoc )
//
// mode: 2 - NMDA
// =================================================================================================
func addSyn() {
    last = synList.count()
    
    if (numarg()==5) {
        show_errmess_always(1)
        sprint(cmd, "loc.sec synList.append(new %s(%g))", $s4, $5)
        execute1(cmd, this)
    	//if ($4==0) loc.sec synList.append(new Exp2Syn($5))
        //if ($4==1) loc.sec synList.append(new Exp2SynAMPA($5))
        //if ($4==2) loc.sec synList.append(new Exp2SynNMDA($5))
        //if ($4==3) loc.sec synList.append(new Exp2SynNMDAperm($5))
            
        synList.o(last).tau1 = $1
        synList.o(last).tau2 = $2
        synList.o(last).e    = $3
        //loc.sec printf("%s %s(%g) %g %g %g\n", secname(), $s4, $5, synList.o(last).tau1, synList.o(last).tau2, synList.o(last).e)
        return (last)

    } else {
        
        print "USAGE: addSyn(tau1 (ms), tau2 (ms), eRev (mV), modFileName, synLoc)"
        return -1
    }
}


//adds a noisy synapse (noisesyn.mod); this function is modeled after the above function  'addSyn'
func addNoisySyn() {
	last = noisySynList.count()
	if(numarg()==12) {
		show_errmess_always(1)
		sprint(cmd,"loc.sec noisySynList.append(new %s(%g))",$s1,$6)
		execute1(cmd, this)
		
		noisySynList.o(last).start = $2
		noisySynList.o(last).tau1 = $3
		noisySynList.o(last).tau2 = $4
		noisySynList.o(last).e = $5
		noisySynList.o(last).spikedur = $7
		noisySynList.o(last).spikefreq = $8
		noisySynList.o(last).normalmean = $9
		noisySynList.o(last).normalstd = $10
		noisySynList.o(last).weight = $11
		noisySynList.o(last).poisson_mean = $12
		
		return last
	} else {
		print "USAGE: addNoiseSyn(modFileName, start, tau1, tau2, eRev, synLoc, spikedur, spikefreq, normalmean, normalstd, weight, poisson_mean \n"
		return -1
	}
}



// =================================================================================================
//
// addSynStim
//
// =================================================================================================
func addSynStim() {
    if (numarg()==9 || numarg()==10) {

            tau1  = $1
            tau2  = $2
            eRev  = $3
            f     = $4
            nr_sp = $5
            start = $6
            noise = $7
            g     = $8
            gid   = $9

            if (numarg()==9){
    
                stim_syn_nr = addSyn(tau1, tau2, eRev)
            
            }else{
                
                syn_mode = $10
                stim_syn_nr = addSyn(tau1, tau2, eRev, syn_mode)

            }

            loc.sec stimList.append(new NetStim())
            last  = stimList.count()
            
            if (f>0) {

                stimList.o(last-1).interval = 1000/f
                stimList.o(last-1).number   = nr_sp

            }else{

                stimList.o(last-1).interval = 1
                stimList.o(last-1).number   = 0

            }

            stimList.o(last-1).start    = start
            stimList.o(last-1).noise    = noise
            stimList.o(last-1).seed((startsw()*gid)%10000)

            connect2syn(stimList.o(last-1), stim_syn_nr, 0, 0, g)
        
            return stim_syn_nr

    } else {
        
        print "USAGE: addSynStim(tau1 (ms), tau2 (ms), eRev (mV), f (Hz), number spikes, start time (ms), noise <0-1>, g (nS), gid )"
        return -1
    }

}




// =================================================================================================
//
// printLoc
//
// =================================================================================================
proc printLoc() {
    
    loc.sec print secname() 
}




// =================================================================================================
//
// getSyn(nr) - return reference to the synapse #nr
//
// =================================================================================================
obfunc getSyn() {
    
    return synList.object($1)
}




// =================================================================================================
//
// printSyn
//
// =================================================================================================
proc printSyn() {
    for i=0, synList.count()-1 {
        loc.sec printf("%d, %s, tau1= %g ms, tau2= %g ms, e= %g mV loc= %s\n", i, synList.object(i), synList.object(i).tau1, synList.object(i).tau2, synList.object(i).e, secname() )
    }
}




strdef xs, ys
objref c, c1

// =================================================================================================
//
// printCon
//
// =================================================================================================
proc printCon() {

    
    for i=0, conList.count()-1 {
        c  = conList.object(i)
        x  = c.preloc
        xs = secname()
        pop_section()
        y  = c.postloc()
        ys = secname()
        pop_section()
        c1 = c.syn()
        
        loc.sec printf("%d, %s(%g) -> %s(%g) %s, tau1= %g (ms), tau2= %g (ms), eRev= %g (mV), loc= %s\n", i, xs, x, ys, y, c1, c1.tau1, c1.tau2, c1.e,  secname() )
        
    }
}




endtemplate SynObj

Loading data, please wait...