// Code that implements Voltage clamp and current clamp
function makeVoltageClamp(baseLevel, delay1, \
amplitude1, duration1, \
delay2, amplitude2, duration2,\
trigMode, compartmentPath)
float delay1, duration1, amplitude1, delay2, duration2, amplitude2
float baseLevel, trigMode
str compartmentPath
if(!{exists /clamp})
create neutral /clamp
end
create pulsegen /clamp/vPulsegen
setfield ^ trig_mode {trigMode} baselevel {baseLevel} \
level1 {amplitude1} delay1 {delay1} width1 {duration1} \
level2 {amplitude2} delay2 {delay2} width2 {duration2}
create RC /clamp/lowpass
setfield ^ R 1 C 1e-5 //0.00001 charges too fast
// setfield ^ R 1.0 C 0.03 // Taken from Squid example, Jeanette uses 0.00001
// setfield ^ R 500 C 0.1e-6 // Taken from neurokit
// setfield ^ R 1 C 1e-5
// setfield ^ R 1.0 C 0.00001 // Taken from Squid example, Jeanette uses 0.00001
create diffamp /clamp/vClamp
setfield ^ saturation 999.0 gain 1
// setfield ^ saturation 999.0 gain 0.0
// setfield ^ saturation 999.0 gain 0.002 // Taken from neurokit
// setfield ^ saturation 999.0 gain 1
create PID /clamp/PID // Values taken from squid example
setfield ^ gain 1e-7 tau_i 1e-5 tau_d 1e-7 saturation 1e-6
// setfield ^ gain 1e-5 tau_i 1e-5 tau_d 1e-7 saturation 999.0
// setfield ^ gain 0.50 tau_i 0.02 tau_d 0.005 saturation 999.0
// setfield ^ gain 0.50 tau_i 0.02 tau_d 0.005 saturation 999 // 10e-3
// setfield ^ gain 1e-6 tau_i 20e-6 tau_d 5e-6 saturation 999 // from neurokit
// setfield ^ gain 1e-5 tau_i 1e-5 tau_d 0.25e-7 saturation 999
addmsg /clamp/vPulsegen /clamp/lowpass INJECT output
addmsg /clamp/lowpass /clamp/vClamp PLUS state
addmsg /clamp/vClamp /clamp/PID CMD output
addmsg {compartmentPath} /clamp/PID SNS Vm
addmsg /clamp/PID {compartmentPath} INJECT output
//if({trigMode}==1) // trigger mode
//echo we use trigger model now!
//float trigger_delay = 0.1 // we use 300 ms for free running
//create pulsegen /clamp/trig
//setfield ^ level1 2.0 width1 0.01 delay1 {trigger_delay} width2 30.0
//addmsg /clamp/trig /clamp/vPulsegen INPUT output
//end
end
function makeCurrentClamp(baseLevel, delay1, \
amplitude1, duration1, \
delay2, amplitude2, duration2,\
trigMode, compartmentPath)
float delay1, duration1, amplitude1
float delay2, duration2, amplitude2
float baseLevel, trigMode
str compartmentPath
echo "Baselevel: "{baseLevel}"A (width "{delay1}"s)"
echo "Amplitude 1: "{amplitude1}"A (width "{duration1}"s)"
echo "Amplitude 2: "{amplitude2}"A (width "{duration2}")"
echo "Trigger mode: "{trigMode}
echo "Connecting to "{compartmentPath}
if(!{exists clamp})
create neutral clamp
end
create pulsegen /clamp/iPulsegen
setfield ^ trig_mode {trigMode} baselevel {baseLevel} \
level1 {amplitude1} delay1 {delay1} width1 {duration1} \
level2 {amplitude2} delay2 {delay2} width2 {duration2}
create diffamp /clamp/iClamp
setfield ^ saturation 999.0 gain 1.0
addmsg /clamp/iPulsegen /clamp/iClamp PLUS output
addmsg /clamp/iClamp {compartmentPath} INJECT output
end
function makeVoltageClampPlayFile(clamp,voltageInfoFile, compartmentPath, timestep)
str voltageInfoFile, compartmentPath,clamp
float timestep, v0
echo {voltageInfoFile}
openfile {voltageInfoFile} r
str voltageFile = {readfile {voltageInfoFile}}
float xdivs = {readfile {voltageInfoFile}}
xdivs = xdivs -1
float xmin = {readfile {voltageInfoFile}}
float xmax = {readfile {voltageInfoFile}}
closefile {voltageInfoFile}
if(!{exists /{clamp}})
create neutral /{clamp}
create table /{clamp}/voltageTable
create RC /{clamp}/lowpass
setfield ^ R 1 C 1e-4
// setfield ^ R 1.0 C 0.03 // Taken from Squid example, Jeanette uses 0.00001
// setfield ^ R 500 C 0.1e-6 // Taken from neurokit
// setfield ^ R 1 C 1e-5
// setfield ^ R 1.0 C 0.00001 // Taken from Squid example, Jeanette uses 0.00001
create diffamp /{clamp}/vClamp
setfield ^ saturation 999.0 gain 1
// setfield ^ saturation 999.0 gain 0.0
// setfield ^ saturation 999.0 gain 0.002 // Taken from neurokit
// setfield ^ saturation 999.0 gain 1
create PID /{clamp}/PID // Values taken from squid example
setfield ^ gain 1e-9 tau_i 1e-5 tau_d 1.0e-6 saturation 1e-8 // for detailed model we need very "sensitive" feedback-controler
//setfield ^ gain 1e-5 tau_i 1e-5 tau_d 1e-7 saturation 999.0
//setfield ^ gain 0.50 tau_i 0.02 tau_d 0.005 saturation 999.0
// setfield ^ gain 0.50 tau_i 0.02 tau_d 0.005 saturation 999 // 10e-3
// setfield ^ gain 1e-6 tau_i 20e-6 tau_d 5e-6 saturation 999 // from neurokit
// setfield ^ gain 1e-5 tau_i 1e-5 tau_d 0.25e-7 saturation 999
addmsg /{clamp}/voltageTable /{clamp}/lowpass INJECT output
addmsg /{clamp}/lowpass /{clamp}/vClamp PLUS state
addmsg /{clamp}/vClamp /{clamp}/PID CMD output
addmsg {compartmentPath} /{clamp}/PID SNS Vm
addmsg /{clamp}/PID {compartmentPath} INJECT output
else
delete /{clamp}/voltageTable
reset
create table /{clamp}/voltageTable
addmsg /{clamp}/voltageTable /{clamp}/lowpass INJECT output
end
call /{clamp}/voltageTable TABCREATE {xdivs} {xmin} {xmax}
setfield /{clamp}/voltageTable step_mode 1 \ //
stepsize {timestep}
int i
openfile {voltageFile} r
for(i = 0; i <= {xdivs}; i = i + 1)
v0 = {readfile {voltageFile}}
setfield /{clamp}/voltageTable table->table[{i}] {v0}
end
echo "Reading voltage clamp data from "{voltageFile}
closefile {voltageFile}
end
function makeCurrentClampPlayFile(currentInfoFile, compartmentPath)
str currentInfoFile, compartmentPath
openfile {currentInfoFile} r
// note the order of reading file!!
float timestep = {readfile {currentInfoFile}}
float xdivs = {readfile {currentInfoFile}}
float xmin = {readfile {currentInfoFile}}
float xmax = {readfile {currentInfoFile}}
if(!{exists /clamp})
create neutral /clamp
end
echo "Reading current clamp data from "{currentInfoFile}
create table /clamp/currentTable
call /clamp/currentTable TABCREATE {xdivs} {xmin} {xmax}
setfield /clamp/currentTable step_mode 1 \ // TAB_LOOP
stepsize {timestep}
int i
for(i = 0; i <= {xdivs}; i = i + 1)
setfield /clamp/currentTable table->table[{i}] {readfile {currentInfoFile}}
end
closefile {currentInfoFile}
create diffamp /clamp/iClamp
setfield ^ saturation 999.0 gain 1.0
addmsg /clamp/currentTable /clamp/iClamp PLUS output
addmsg /clamp/iClamp {compartmentPath} INJECT output
end
// to make ramping voltage clamp mode
function makeRampVoltageClamp(compartmentPath, timestep, amp1,amp2, duration1,\
amp3,amp4,duration2,\
amp5,amp6,duration3)
str compartmentPath
float timestep,amp1,amp2,amp3,amp4,amp5,amp6,duration1,duration2,duration3,xmin,xmax,dv1,dv2,dv3,x1,x2,x3
int xdivs,xdivs1,xdivs2,xdivs3
if(!{exists /clamp})
create neutral /clamp
end
xmin= 0
xmax = duration1+duration2+duration3
xdivs=(xmax-xmin)/timestep
xdivs1=duration1/timestep
xdivs2=duration2/timestep
xdivs3=duration3/timestep
dv1=(amp2-amp1)/xdivs1
dv2=(amp4-amp3)/xdivs2
dv3=(amp6-amp5)/xdivs3
x1=amp1
x2=amp3
x3=amp5
create table /clamp/voltageTable
call /clamp/voltageTable TABCREATE {xdivs} {xmin} {xmax}
setfield /clamp/voltageTable step_mode 1 \ // TAB_LOOP
stepsize {timestep}
int i
for(i = 0; i <= {xdivs}; i = i + 1)
if (i<=xdivs1)
setfield /clamp/voltageTable table->table[{i}] {x1}
x1=x1+dv1
elif (i<={xdivs1+xdivs2})
setfield /clamp/voltageTable table->table[{i}] {x2}
x2=x2+dv2
else
setfield /clamp/voltageTable table->table[{i}] {x3}
x3=x3+dv3
end
end
create RC /clamp/lowpass
setfield ^ R 1 C 0.00001
// setfield ^ R 1.0 C 0.03 // Taken from Squid example, Jeanette uses 0.00001
// setfield ^ R 500 C 0.1e-6 // Taken from neurokit
// setfield ^ R 1 C 1e-5
// setfield ^ R 1.0 C 0.00001 // Taken from Squid example, Jeanette uses 0.00001
create diffamp /clamp/vClamp
setfield ^ saturation 999.0 gain 1
// setfield ^ saturation 999.0 gain 0.0
// setfield ^ saturation 999.0 gain 0.002 // Taken from neurokit
// setfield ^ saturation 999.0 gain 1
create PID /clamp/PID // Values taken from squid example
setfield ^ gain 1e-5 tau_i 1e-5 tau_d 1e-7 saturation 999.0
// setfield ^ gain 0.50 tau_i 0.02 tau_d 0.005 saturation 999.0
// setfield ^ gain 0.50 tau_i 0.02 tau_d 0.005 saturation 999 // 10e-3
// setfield ^ gain 1e-6 tau_i 20e-6 tau_d 5e-6 saturation 999 // from neurokit
// setfield ^ gain 1e-5 tau_i 1e-5 tau_d 0.25e-7 saturation 999
addmsg /clamp/voltageTable /clamp/lowpass INJECT output
addmsg /clamp/lowpass /clamp/vClamp PLUS state
addmsg /clamp/vClamp /clamp/PID CMD output
addmsg {compartmentPath} /clamp/PID SNS Vm
addmsg /clamp/PID {compartmentPath} INJECT output
end
function makeVoltageClampPlayFile_2(clamp,voltageFile, compartmentPath, timestep)
str voltageInfoFile, compartmentPath,clamp,voltageFile
float timestep, v0,xmin,xmax
int xdivs
//echo {voltageInfoFile}
//openfile {voltageInfoFile} r
//str voltageFile = {readfile {voltageInfoFile}}
//float xdivs = {readfile {voltageInfoFile}}
//xdivs = xdivs -1
//float xmin = {readfile {voltageInfoFile}}
//float xmax = {readfile {voltageInfoFile}}
// closefile {voltageInfoFile}
if(!{exists /{clamp}})
create neutral /{clamp}
create table /{clamp}/voltageTable
create RC /{clamp}/lowpass
setfield ^ R 1 C 1e-4
// setfield ^ R 1.0 C 0.03 // Taken from Squid example, Jeanette uses 0.00001
// setfield ^ R 500 C 0.1e-6 // Taken from neurokit
// setfield ^ R 1 C 1e-5
// setfield ^ R 1.0 C 0.00001 // Taken from Squid example, Jeanette uses 0.00001
create diffamp /{clamp}/vClamp
setfield ^ saturation 999.0 gain 1
// setfield ^ saturation 999.0 gain 0.0
// setfield ^ saturation 999.0 gain 0.002 // Taken from neurokit
// setfield ^ saturation 999.0 gain 1
create PID /{clamp}/PID // Values taken from squid example
setfield ^ gain 1e-9 tau_i 1e-5 tau_d 1.0e-6 saturation 1e-8 // for detailed model we need very "sensitive" feedback-controler
//setfield ^ gain 1e-5 tau_i 1e-5 tau_d 1e-7 saturation 999.0
//setfield ^ gain 0.50 tau_i 0.02 tau_d 0.005 saturation 999.0
// setfield ^ gain 0.50 tau_i 0.02 tau_d 0.005 saturation 999 // 10e-3
// setfield ^ gain 1e-6 tau_i 20e-6 tau_d 5e-6 saturation 999 // from neurokit
// setfield ^ gain 1e-5 tau_i 1e-5 tau_d 0.25e-7 saturation 999
addmsg /{clamp}/voltageTable /{clamp}/lowpass INJECT output
addmsg /{clamp}/lowpass /{clamp}/vClamp PLUS state
addmsg /{clamp}/vClamp /{clamp}/PID CMD output
addmsg {compartmentPath} /{clamp}/PID SNS Vm
addmsg /{clamp}/PID {compartmentPath} INJECT output
else
delete /{clamp}/voltageTable
reset
create table /{clamp}/voltageTable
addmsg /{clamp}/voltageTable /{clamp}/lowpass INJECT output
end
// we need to determine xmax and xmin from the datafile
xmin = 0
xmax = 1 // we create a table with a bigger size
xdivs = (xmax-xmin)/timestep // note! we think the "timestep" in the datafile is identical to simulation timestep
call /{clamp}/voltageTable TABCREATE {xdivs} {xmin} {xmax}
setfield /{clamp}/voltageTable step_mode 1 \ //
stepsize {timestep}
openfile {voltageFile} r
int i = 0
int n
str line = ""
while (!{eof {voltageFile}})
line = {readfile {voltageFile} -linemode}
n = {strlen {line}}
//echo n is {n}
if(n>0)
v0 = {getarg {arglist {line}} -arg 2}
setfield /{clamp}/voltageTable table->table[{i}] {v0}
//echo v0_0 is {v0}
i = i+1
end
end
echo "Reading voltage clamp data from "{voltageFile}
closefile {voltageFile}
end
function makeCurrentClampPlayFile_2(clamp,currentFile, compartmentPath, timestep)
str voltageInfoFile, compartmentPath,clamp,currentFile
float timestep, i0,xmin,xmax
int xdivs
//echo {voltageInfoFile}
//openfile {voltageInfoFile} r
//str currentFile = {readfile {voltageInfoFile}}
//float xdivs = {readfile {voltageInfoFile}}
//xdivs = xdivs -1
//float xmin = {readfile {voltageInfoFile}}
//float xmax = {readfile {voltageInfoFile}}
// closefile {voltageInfoFile}
if({exists /{clamp}})
delete /{clamp}
reset
end
create neutral /{clamp}
create table /{clamp}/currentTable
create diffamp /{clamp}/iClamp
setfield ^ saturation 999.0 gain 1.0
// we need to determine xmax and xmin from the datafile
xmin = 0
xmax = 1 // we create a table with a bigger size
xdivs = (xmax-xmin)/timestep // note! we think the "timestep" in the datafile is identical to simulation timestep
call /{clamp}/currentTable TABCREATE {xdivs} {xmin} {xmax}
setfield /{clamp}/currentTable step_mode 1 \ //
stepsize {timestep}
openfile {currentFile} r
int i = 0
int n
str line = ""
while (!{eof {currentFile}})
line = {readfile {currentFile} -linemode}
n = {strlen {line}}
//echo n is {n}
if(n>0)
i0 = {getarg {arglist {line}} -arg 2}
setfield /{clamp}/currentTable table->table[{i}] {i0}
//echo v0_0 is {v0}
i = i+1
end
end
echo "Reading voltage clamp data from "{currentFile}
closefile {currentFile}
addmsg /{clamp}/currentTable /{clamp}/iClamp PLUS output
addmsg /{clamp}/iClamp {compartmentPath} INJECT output
reset
end