Mirror Neuron (Antunes et al 2017)

 Download zip file 
Help downloading and running models
Accession:229276
Modeling Mirror Neurons Through Spike-Timing Dependent Plasticity. This script reproduces Figure 3B.
Reference:
1 . Antunes G, Faria da Silva SF, Simoes de Souza FM (2018) Mirror Neurons Modeled Through Spike-Timing-Dependent Plasticity are Affected by Channelopathies Associated with Autism Spectrum Disorder. Int J Neural Syst 28:1750058 [PubMed]
Model Information (Click on a link to find other models with that property)
Model Type: Neuron or other electrically excitable cell;
Brain Region(s)/Organism: Neocortex;
Cell Type(s):
Channel(s): I Calcium; I M; I h; I Potassium; I Sodium;
Gap Junctions:
Receptor(s): AMPA; NMDA;
Gene(s): Cav1.2 CACNA1C; Cav1.3 CACNA1D;
Transmitter(s): Glutamate;
Simulation Environment: NEURON;
Model Concept(s): Detailed Neuronal Models; STDP;
Implementer(s): Simoes-de-Souza, Fabio [fabio.souza at ufabc.edu.br];
Search NeuronDB for information about:  AMPA; NMDA; I M; I h; I Sodium; I Calcium; I Potassium; Glutamate;
/
Final
mechanisms
Ca_HVA.mod *
Ca_LVAst.mod *
CaDynamics_E2.mod *
Ih.mod *
Im.mod *
K_Pst.mod *
K_Tst.mod *
Nap_Et2.mod *
NaTa_t.mod *
NaTs2_t.mod *
ProbAMPANMDA_EMS.mod *
ProbGABAAB_EMS.mod *
SK_E2.mod *
SKv3_1.mod *
STDP_triplet.mod
Ca_HVA.c
Ca_HVA.o
Ca_LVAst.c
Ca_LVAst.o
CaDynamics_E2.c
CaDynamics_E2.o
Ih.c
Ih.o
Im.c
Im.o
K_Pst.c
K_Pst.o
K_Tst.c
K_Tst.o
mod_func.c
mod_func.o
Nap_Et2.c
Nap_Et2.o
NaTa_t.c
NaTa_t.o
NaTs2_t.c
NaTs2_t.o
nrnmech.dll
ProbAMPANMDA_EMS.c
ProbAMPANMDA_EMS.o
ProbGABAAB_EMS.c
ProbGABAAB_EMS.o
SK_E2.c
SK_E2.o
SKv3_1.c
SKv3_1.o
STDP_triplet.c
STDP_triplet.o
                            
TITLE Stream-Specific Spike Timing Dependent Plasticity

COMMENT
This is a Alpha Function Synapse with synaptic weight controled by a STDP algorithm based on the Triplet Model of Pfisfel and Gerstner (2006).

Implementer: Prof. Fabio M Simoes de Souza, UFABC, Brazil, 2016
ENDCOMMENT

NEURON {
	POINT_PROCESS ExpSynSTDP_triplet
	RANGE tau, e, i, factor, gw
	RANGE R1, R2, O1, O2
	RANGE A2mais, A2menos, A3mais, A3menos
	RANGE Taumais, Taumenos, Tauy, Taux
	RANGE t_last_pre, t_last_post 
	RANGE flag_pre, flag_post 
	RANGE flag1_pre, flag1_post 
	RANGE peso
	NONSPECIFIC_CURRENT i
}

UNITS {
	(nA) = (nanoamp)
	(mV) = (millivolt)
	(uS) = (microsiemens)
}

PARAMETER {
	e = 0	(mV)
	tau= 10 (ms)
	factor = 1
	gw=0.01
	latency=0
	A2mais=4.6e-3 
	A2menos=3e-3
	A3mais=9.1e-3
	A3menos=7.5e-9
	Taumais=16.8
	Taumenos=33.7
	Tauy=47
	Taux=575

	}

ASSIGNED {
	v (mV)
	i (nA)
	tpost (ms)
	t_last_pre (ms)
	t_last_post (ms)
	flag_pre
	flag_post
	flag1_pre
	flag1_post
:	peso
}

STATE {
	g (uS)
	R1
	R2
	O1
	O2
	peso
}

INITIAL {
	g=0
	peso=0
	tpost = -1e9
	net_send(0, 1)
	O1=0
	O2=0
	R1=0
	R2=0	
	t_last_pre=0
	t_last_post=0
	flag_pre=0
	flag_post=0
	flag1_pre=0
	flag1_post=0
}

BREAKPOINT {
	SOLVE state METHOD cnexp

	if (g<0) {g=0} :hard bound

:	if (g>(gw+gw/2)) {g=(gw+gw/2)} :hard bound
	
if (flag1_pre==1)  {
	peso= peso -factor*O1*(A2menos+A3menos*R2)
:	peso= peso -factor*O1*(A2menos+A3menos*R2)*(peso/(gw/2)) soft bounds
}

if (flag1_post==1)  {
:	peso= peso + factor*R1*(A2mais+A3mais*O2)
	peso= peso + factor*R1*(A2mais*(1-peso/(1e3*gw))+A3mais*(1-peso/(1e3*gw))*O2) :soft bounds
}

	i = g*(v - e)
}

DERIVATIVE state {

:A2mais = 0.005  * (1-peso/(10*gw)) :soft bounds
:A2menos = 0.0051 * (peso/(10*gw)) :soft bounds

if (flag1_pre==0) {
	R1'= -R1/Taumais/1
	R2'= -R2/Taux/1
} 
if (flag1_pre==1)  {
	R1'= (-R1 + 1)/Taumais/1
	R2'= (-R2 + 1)/Taux/1
	flag1_pre=0 
:	printf("t_last_pre=%g \n", t_last_pre)
}

if (flag1_post==0) {
	O1'= -O1/Taumenos/1
	O2'= -O2/Tauy/1
}
if(flag1_post==1)  {
	O1'= (-O1 + 1)/Taumenos/1
	O2'= (-O2 + 1)/Tauy/1
	flag1_post=0 
:	printf("t_last_post=%g \n", t_last_post)
	}	

	g'= -g/tau


}

NET_RECEIVE(w (uS), A, tpre (ms)) {
	INITIAL { A = 0  tpre = 0 }


	if (flag == 0) { : presynaptic spike  

g = g + w + peso

if (g<0) {g=0} :hard bound

		tpre = t
		A = A 
		flag_pre=1 


	}else if (flag == 2) { : postsynaptic spike
		tpost = t

		FOR_NETCONS(w1, A1, tp) { : also can hide NET_RECEIVE args
			A1 = A1
		flag_post=1 
		flag_pre=0 
		}

if (flag_post ==1) { :display post
:	printf("flag_post=%g \n", flag_post)
	flag1_post=1 
	t_last_post=t
	}


	} else { : flag == 1 from INITIAL block
		WATCH (v > -20) 2
	}

if (flag_pre ==1) { :display pre
	t_last_pre=t
	flag1_pre=1 
:	printf("flag_pre=%g \n", flag_pre)
	}

}

Loading data, please wait...