//
// fsConnect.g - Functions to connect two fs-neurons through gap-junctions
//
// Johannes Hjorth, July 2005
// hjorth@nada.kth.se
//
// Updated by Lennart Hedlund (hedlund@kth.se), July 2006
// Added reciprocalGABAinhib
//
//////////////////////////////////////////////////////////////////////////////
//
// Connects two compartments by gapjunction
//
//////////////////////////////////////////////////////////////////////////////
function connectGap(compA, compB, resistance)
str compA
str compB
float resistance
// Gap junctions go both ways...
addmsg {compA} {compB} RAXIAL {resistance} Vm
addmsg {compB} {compA} RAXIAL {resistance} Vm
end
//////////////////////////////////////////////////////////////////////////////
//
// Connects two somas by GABA
//
//////////////////////////////////////////////////////////////////////////////
function reciprocalGABAinhib(cellA, cellB, delay, weight)
str cellA
str cellB
float delay
// create spike train
if(!{exists {cellB}/spikes})
create spikegen {cellB}/spikes
setfield {cellB}/spikes output_amp 1 thresh 0.0 abs_refract 0.001
end
addmsg {cellA} {cellB}/spikes INPUT Vm
if({getmsg {cellB}/spikes -out -count} < 1)
addmsg {cellB}/spikes {cellB}/GABA_channel SPIKE
end
setfield {cellB}/GABA_channel synapse[0].weight {weight} synapse[0].delay {delay}
end
//////////////////////////////////////////////////////////////////////////////
//
// Connects two random compartments of typeA in cellA and
// typeB in cellB with a gapjunction.
//
//
// Ex. To connect a random primary dendrite in cell 0 with a
// random secondary dendrite in cell 1, resistance 3e7 ohm
//
// randomDendGap /fs[0] prim /fs[1] sec 3e7
//
// Valid types: soma, prim, sec, tert
//
//////////////////////////////////////////////////////////////////////////////
function randomDendGap(cellA, typeA, cellB, typeB, resistance)
str cellA, typeA
str cellB, typeB
float resistance
int numA = {getarg {el {cellA}/{typeA}#} \
{el {cellA}/{typeA}#/{typeA}#} \
-count}
int numB = {getarg {el {cellB}/{typeB}#} \
{el {cellB}/{typeB}#/{typeB}#} \
-count}
int idxA = {rand 1 {numA}}
int idxB = {rand 1 {numB}}
str pathA = {getarg {el {cellA}/{typeA}#} \
{el {cellA}/{typeA}#/{typeA}#} \
-arg {idxA}}
str pathB = {getarg {el {cellB}/{typeB}#} \
{el {cellB}/{typeB}#/{typeB}#} \
-arg {idxB}}
echo "Connecting "{pathA}" with "{pathB}" using gapjunction (res="{resistance}" ohm)"
// Gap junctions go both ways...
addmsg {pathA} {pathB} RAXIAL {resistance} Vm
addmsg {pathB} {pathA} RAXIAL {resistance} Vm
end
//////////////////////////////////////////////////////////////////////////////
function clearGap(compA, compB)
str compA, compB
int msgId
echo "Removing gapjuncton "{compA}" <-> "{compB}
msgId = {getmsg {compA} -in -find {compB} RAXIAL}
deletemsg {compA} {msgId} -in
msgId = {getmsg {compB} -in -find {compA} RAXIAL}
deletemsg {compB} {msgId} -in
end
//////////////////////////////////////////////////////////////////////////////
//
// makeSpiking adds a spikegen object to the cell if needed
//
//
//////////////////////////////////////////////////////////////////////////////
function makeSpiking(cellPath, asbRefract)
str cellPath
float absRefract
str somaPath = {cellPath}@"/soma"
str spikePath = {somaPath}@"/spike"
if(!{exists {somaPath}})
error "The object "@{somaPAth}@" does not exist!"
end
if(!{exists {spikePath}})
create spikegen {spikePath}
setfield {spikePath} thresh 0 abs_refract {absRefract} output_amp 1
addmsg {somaPath} {spikePath} INPUT Vm
else
echo "makeSpiking: Spike object already exists: "{spikePath}", ignoring"
end
end
//////////////////////////////////////////////////////////////////////////////
//
// connectGABA connects the sourceCell with destCompartment
// using weight and delay.
//
// A spikegen object must be created first in sourceCell using makeSpiking
//
//////////////////////////////////////////////////////////////////////////////
function connectGABA(sourceCell, destCompartment, weight, delay)
str sourceCell
str destCompartment
float weight
float delay
int i = 0
int inMsg = 0
int inSpikes = 0
str sourceSpike = {sourceCell}@"/soma/spike"
str destChannel = {destCompartment}@"/GABA_channel"
addmsg {sourceSpike} {destChannel} SPIKE
inMsg = {getmsg {destChannel} -in -count}
for(i = 0; i < inMsg; i = i + 1)
if({{strcmp SPIKE {getmsg {destChannel} -type {i}}} == 0})
inSpikes = {{inSpikes} + 1}
end
end
int msgIdx = {{inSpikes} - 1} //First element is zero
setfield {destChannel} synapse[{msgIdx}].weight {weight} \
synapse[{msgIdx}].delay {delay}
end
|