// HNinput.g
// This file contains the code to load the spiketime files for all presynaptic HN cells
// as well as the 'modulation waveform' representing the presynaptic membrane voltage.
// Originally created while preparing multi-compartmental model for use with evolutionary algorithms.
//
// Oct 2010
// Damon Lamb
// loads HN spike tables from rootdir into
// /HNinput/{input_id}_{mode}_spikes and modulation waveforms to /HNinput/HN{curID}_{curMode}_mod
// NOTE: table goes from 0 to length, resulting in one additional time step to account for the last entry.
// input must be similarly structured. This is mathematically consistent with an end time
function loadHNinput(coord_modes, input_ids, rootdir, length, samplefreq)
str coord_modes // peri or sync
str input_ids // 3, 4, 6, 7, or X for the source of the input
str rootdir //root directory for the spike and presynaptic Vm waveform files, WITHOUT trailing /
float length, samplefreq // length in seconds and sample frequency of presynaptic voltage file(s)
int nsamples = length * samplefreq
float Vm
if ({verbose} == 1)
echo "Loading HN spike times and presynaptic voltage tables from " {rootdir}
end
str curMode, curID
pushe /
create neutral HNinput
// loop over modes and input IDs
foreach curMode({arglist {coord_modes}})
foreach curID ({arglist {input_ids}})
if ({verbose} == 1)
echo " " HN{curID}_{curMode} into HNinput/{curID}_{curMode}_spikes
end
// create a timetable for each mode-input ID pair
create timetable HNinput/HN{curID}_{curMode}_spikes
// initialize timetable
setfield HNinput/HN{curID}_{curMode}_spikes maxtime 2000 method 4 act_val 1.0 fname {rootdir}/HN{curID}_{curMode}
// load data into timetable
call HNinput/HN{curID}_{curMode}_spikes TABFILL
// create a spikegen to translate spiketimes into SPIKE messages to the synchans
create spikegen HNinput/HN{curID}_{curMode}_spikes/spike
setfield HNinput/HN{curID}_{curMode}_spikes/spike output_amp 1 thresh 0.5 abs_refract 0.005
addmsg HNinput/HN{curID}_{curMode}_spikes HNinput/HN{curID}_{curMode}_spikes/spike INPUT activation
if ({verbose} == 1)
echo " " HN{curID}_{curMode}_mod into HNinput/HN{curID}_{curMode}_mod
end
// create a voltage table for the presynaptic (modulation) waveform
create table HNinput/HN{curID}_{curMode}_mod
setfield HNinput/HN{curID}_{curMode}_mod step_mode 2 stepsize 0
call HNinput/HN{curID}_{curMode}_mod TABCREATE {nsamples} 0 {length - 1/samplefreq}
file2tab {rootdir}/HN{curID}_{curMode}_mod HNinput/HN{curID}_{curMode}_mod table -xy {nsamples}
// debug //
//tab2file ./Debug/testsyn{curID}table_{curMode}_new HNinput/HN{curID}_{curMode}_mod table -mode xy -overwrite
end
end
pope
end
// creates generic SynS (synchan + synS-mod chan) objects
function createHNsyn(input_ids)
str input_ids // 3, 4, 6, 7, or X for the source of the input
str HE_ids // ganglia # of HE cells in which to create the SynS objects
//echo "Creating SynS (mod and synchan) objects for HN: " {input_ids}
str curID
// loop over modes and input IDs
foreach curID ({arglist {input_ids}})
/* mod object not used anymore - mod waveform directly created and passed to synchan
*/
str chanpath = "SynS" @ {curID}
create synchan {chanpath}
if ({strcmp {curID} "X"} == 0)
echo {curID} ":X"
setfield ^ \
Ek -0.0625 \
tau1 1.0e-2 \ // sec
tau2 4.0e-3 \ // sec
gmax 0 // Siemens
else // synchan from 2 4 6 7
setfield ^ \
Ek -0.0625 \
tau1 1.25e-2 \ // sec // adjusted for testing the result of faster dynamics, formerly 5e-2s
tau2 4.0e-3 \ // sec
gmax 0 // Siemens
end
end
end
// NOTE: you cannot change the time step after setting the delay table nsteps (by calling this function)
// todo: add a 'reset' of nsteps function to be called after changing the simulation dt
function make_syn_connections( coord_modes, input_ids, HE_ganglia, delayPerGanglion, dt, defaultmod)
str input_ids //= eg "3 4 6 7 X" //for the source of the input
str coord_modes //= eg "peri sync"
str HE_ganglia // = "8 9 10 11 12 13 14"
float delayPerGanglion, dt, defaultmod
int nsteps
float delaytime
str curHN, curMode, curHE
foreach curHE({arglist {HE_ganglia}})
// setup gapjunction Vm, I_Injected messages
addmsg HE{curHE}_peri/synaptic HE{curHE}_sync/synaptic/SynE VOLTAGE Vm
addmsg HE{curHE}_sync/synaptic HE{curHE}_sync/synaptic/SynE POSTVOLTAGE Vm
addmsg HE{curHE}_sync/synaptic/SynE HE{curHE}_sync/synaptic INJECT Ik
addmsg HE{curHE}_sync/synaptic HE{curHE}_peri/synaptic/SynE VOLTAGE Vm
addmsg HE{curHE}_peri/synaptic HE{curHE}_peri/synaptic/SynE POSTVOLTAGE Vm
addmsg HE{curHE}_peri/synaptic/SynE HE{curHE}_peri/synaptic INJECT Ik
// setup messages (and delay table for mod function)
foreach curMode({arglist {coord_modes}})
foreach curHN ({arglist {input_ids}})
// create buffer table in each HE's synaptic compartment
//echo " making: " /HE{curHE}_{curMode}/synaptic/HN{curHN}_ModDelay
create table HE{curHE}_{curMode}/synaptic/HN{curHN}_ModDelay
setfield HE{curHE}_{curMode}/synaptic/HN{curHN}_ModDelay step_mode 6
if ({strcmp {curHN} "X"} == 0)
echo "WARNING: Delay from HNX per mode not implemented"
delaytime = {({curHE}-3)*delayPerGanglion}
else
delaytime = {({curHE}-{curHN})*{delayPerGanglion}}
// nsteps = {round {(({curHE}-{curHN})*{delayPerGanglion})/{dt}}}
end
nsteps = {round {delaytime/dt}}
// echo {curHE} "-" {curHN} " " {nsteps}
call /HE{curHE}_{curMode}/synaptic/HN{curHN}_ModDelay TABCREATE {nsteps-1} 0 {nsteps-1}
// echo "bump"
setfield /HE{curHE}_{curMode}/synaptic/HN{curHN}_ModDelay table ==={defaultmod}
// link mod table to buffer
addmsg /HNinput/HN{curHN}_{curMode}_mod /HE{curHE}_{curMode}/synaptic/HN{curHN}_ModDelay INPUT output
// link buffer to synchan
addmsg /HE{curHE}_{curMode}/synaptic/HN{curHN}_ModDelay /HE{curHE}_{curMode}/synaptic/SynS{curHN} MOD output
// link spikes to synchan
addmsg /HNinput/HN{curHN}_{curMode}_spikes/spike /HE{curHE}_{curMode}/synaptic/SynS{curHN} SPIKE
setfield /HE{curHE}_{curMode}/synaptic/SynS{curHN} synapse[0].delay {delaytime}
end
end
end
end