//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
//
// NOTICE OF COPYRIGHT AND OWNERSHIP OF SOFTWARE
//
// Copyright 2010, The University Of Michigan
//
// All rights reserved.
// For research use only; commercial use prohibited.
// No Distribution without permission of William Stacey
// wstacey@umich.edu
//
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
begintemplate SynObj
public addSyn, printSyn, printLoc, connect2syn, printCon, getSyn, addNetCon, addSynStim, removeConnections, conList, synList
objref synList, conList, loc, stimList, this
strdef cmd
// =================================================================================================
//
// init()
//
// =================================================================================================
proc init() {
synList = 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
}
}
// =================================================================================================
//
// 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