//genesis
int kincolor = 15
function do_xchannel_funcs
create x1form /channel_params \
[480,440,{user_screenwidth - 480},450]
disable /channel_params
pushe /channel_params
create x1graph alpha [0,0,50%,42%] -range [-0.1,0,0.1,1]
setfield alpha ymin 0 overlay 0 XUnits Volts YUnits "1/sec"
create x1graph beta [50%,0,50%,42%] -range [-0.1,0,0.1,1]
setfield beta ymin 0 overlay 0 XUnits Volts YUnits "1/sec"
create x1graph taus [0,42%,50%,42%] -range [-0.1,0,0.1,1]
setfield taus ymin 0 overlay 0 XUnits Volts YUnits "sec"
create x1graph minf [50%,42%,50%,42%] -range [-0.1,0,0.1,1]
setfield minf ymin 0 overlay 0 XUnits Volts YUnits "minf"
create x1dialog gate [4,4:minf.bottom,19%,30] -value "X" -script \
"do_plot_kinetics "<widget>
create x1toggle overlay [20%,4:minf.bottom,19%,30]
setfield ^ label0 "overlay off" label1 "overlay on"
create x1label MODIFY [40%,4:minf.bottom,11%,30] -title "MODIFY:"
create x1button alphabutton [52%,4:minf.bottom,11%,30] -title \
alpha -script "scale_gate alpha"
create x1button betabutton [64%,4:minf.bottom,11%,30] -title beta \
-script "scale_gate beta"
create x1button taubutton [76%,4:minf.bottom,11%,30] -title tau \
-script "scale_gate tau"
create x1button minfbutton [88%,4:minf.bottom,11%,30] -title \
m_inf -script "scale_gate minf"
create x1button duplicate [0,4:overlay.bottom,14%,30] -title \
"Dup Gate" -script dup_gate
create x1button restore [14%,4:overlay.bottom,14%,30] -title \
"Restore" -script "echo Not yet implemented"
create x1dialog sx [28%,4:overlay.bottom,18%,30] -value 1.0
create x1dialog sy [46%,4:overlay.bottom,18%,30] -value 1.0
create x1dialog ox [64%,4:overlay.bottom,18%,30] -value 0.0
create x1dialog oy [82%,4:overlay.bottom,18%,30] -value 0.0
pope
end
function calc_cond(name)
str name
float len, dia, gmax
float area = {getfield {comptpath} Cm}
/*
len = calc_len({comptpath})
dia = calc_dia({comptpath})
*/
area = area/CM
if (({strcmp {getfield {channelpath} object->name} hh_channel} == 0) \
|| ({strcmp {getfield {channelpath} object->name} tabchannel} == 0) \
|| ({strcmp {getfield {channelpath} object->name} tab2Dchannel} == 0))
gmax = {getfield {name} Gbar}
else
if ( \
{strcmp {getfield {channelpath} object->name} vdep_channel} == 0 \
)
gmax = {getfield {name} gbar}
else
gmax = {getfield {name} gmax}
end
end
/*
return({gmax/(len * dia * PI)})
As a general rule, CM is less likely to be tweaked than RM and RA
*/
return ((gmax/area))
end
function calc_reversal(name)
str name
float rev
if ( \
{strcmp {getfield {channelpath} object->name} hh_channel} == 0 \
)
rev = {getfield {name} Ek}
else
rev = {getfield {name} Ek}
end
return ((rev))
end
function set_cond(widget)
str widget
/*
float len,dia
*/
float gmax = {getfield {widget} value}
float area
str name, chan
float temp
chan = {getfield /compt_display/draw/{getfield /compt_display/draw pixchoose} text}
if (({getfield /compt_select/scope state}) == 1) // global
if ( \
({strcmp {getfield {channelpath} object->name} hh_channel} == 0) || ({strcmp {getfield {channelpath} object->name} tabchannel} == 0) \
)
foreach name ( \
{el {cellpath}/#[][activation>0.99]})
area = {getfield {name} Cm}
area = area/CM
temp = gmax*area
setfield {name}/{chan} Gbar {temp}
end
else
if ( \
{strcmp {getfield {channelpath} object->name} vdep_channel} == 0 \
)
foreach name ( \
{el {cellpath}/#[][activation>0.99]} \
)
area = {getfield {name} Cm}
area = area/CM
temp = gmax*area
setfield {name}/{chan} \
gbar {temp}
end
else
foreach name ( \
{el {cellpath}/#[][activation>0.99]} \
)
area = {getfield {name} Cm}
area = area/CM
temp = gmax*area
setfield {name}/{chan} \
gmax {temp}
end
end
end
else // local
area = {getfield {comptpath} Cm}
area = area/CM
gmax = gmax*area
if ( \
({strcmp {getfield {channelpath} object->name} hh_channel} == 0) || ({strcmp {getfield {channelpath} object->name} tabchannel} == 0) \
)
setfield {channelpath} Gbar {gmax}
else
if ( \
{strcmp {getfield {channelpath} object->name} vdep_channel} == 0 \
)
setfield {channelpath} gbar {gmax}
else
setfield {channelpath} gmax {gmax}
end
end
end
end
function set_revpotl(widget)
str widget
float rev = {getfield {widget} value}
float area
str name, chan
float temp
chan = {getfield /compt_display/draw/{getfield /compt_display/draw pixchoose} text}
if (({getfield /compt_select/scope state}) == 1) // global
foreach name ({el {cellpath}/#[][activation>0.99]})
setfield {name}/{chan} Ek {rev}
end
else // local
setfield {channelpath} Ek {rev}
end
end
function update_channel_params
/*
echo updating channel parameters
*/
end
function hilight_channel
float x, y
str pix
pushe /compt_display/draw
pix = {getfield . pixchoose}
setfield hilight tx {getfield {pix} tx} ty {getfield {pix} ty}
xupdate .
pope
end
function deleteelms(path)
str elm
foreach elm ({el {path}})
delete {elm}
end
end
function do_plot_kinetics(widget)
str widget
str gate = {getfield {widget} value}
str channeltype
str gatepath
float x, y, a, b, tau
float xmin = -0.1, xmax = 0.07, dx = 0.002
float amax = -1.0, bmax = -1.0, mmax = -1.0, tmax = -1.0
str kinname
int i
ce /channel_params
dx = 0.005
if (!({exists {channelpath}}))
return
end
kinname = {getfield {channelpath} name} @ "->" @ (gate)
channeltype = {getfield {channelpath} object->name}
if (({getfield /channel_params/overlay state}) == 0)
//DHB call alpha RESET
//DHB call beta RESET
//DHB call taus RESET
//DHB call minf RESET
deleteelms alpha/##[ISA=xplot]
deleteelms beta/##[ISA=xplot]
deleteelms taus/##[ISA=xplot]
deleteelms minf/##[ISA=xplot]
setfield alpha ymax 1e6
setfield beta ymax 1e6
setfield taus ymax 1e6
setfield taus ymax 1e6
kincolor = 15
else
kincolor = kincolor + 15
if (kincolor > 63)
kincolor = kincolor - 60
end
amax = {getfield alpha ymax}
bmax = {getfield beta ymax}
mmax = {getfield minf ymax}
tmax = {getfield taus ymax}
end
if ({strcmp {channeltype} hh_channel} == 0)
if ( \
!(({strcmp {gate} "X"} == 0) || ({strcmp {gate} "Y"} == 0)) \
)
echo For hh channels, gate must be X or Y
return
end
end
if ({strcmp {channeltype} tabchannel} == 0)
if ( \
!(({strcmp {gate} "X"} == 0) || ({strcmp {gate} "Y"} == 0) || ({strcmp {gate} "Z"} == 0)) \
)
echo For vdep channels, gate must be X or Y or Z
return
end
if ({getfield {channelpath} {gate}_alloced} == 1)
xmin = {getfield {channelpath} {gate}_A->xmin}
xmax = {getfield {channelpath} {gate}_A->xmax}
dx = {getfield {channelpath} {gate}_A->dx}
if (dx < ((xmax - xmin)/100.0))
dx = (xmax - xmin)/100.0
end
else
echo gate {gate} not allocated
return
end
end
if ( \
({strcmp {channeltype} hh_channel} == 0) || ({strcmp {channeltype} tabchannel} == 0) \
)
if (!{exists alpha/{kinname}})
create xplot alpha/{kinname}
end
if (!{exists beta/{kinname}})
create xplot beta/{kinname}
end
if (!{exists taus/{kinname}})
create xplot taus/{kinname}
end
for (x = xmin; x <= xmax; x = x + dx)
a = {call {channelpath} CALC_ALPHA {gate} {x}}
if (amax < a)
amax = a
end
b = {call {channelpath} CALC_BETA {gate} {x}}
if (bmax < b)
bmax = b
end
tau = 1/(a + b)
if (tau > tmax)
tmax = tau
end
call alpha/{kinname} ADDPTS {x} {a}
setfield alpha/{kinname} fg {kincolor}
call beta/{kinname} ADDPTS {x} {b}
setfield beta/{kinname} fg {kincolor}
call taus/{kinname} ADDPTS {x} {tau}
setfield taus/{kinname} fg {kincolor}
end
if (!{exists minf/{kinname}})
create xplot minf/{kinname}
end
for (x = xmin; x <= xmax; x = x + dx)
y = {call {channelpath} CALC_MINF {gate} {x}}
if (y > mmax)
mmax = y
end
call minf/{kinname} ADDPTS {x} {y}
setfield minf/{kinname} fg {kincolor}
end
setfield alpha ymax {amax} xmin {xmin} xmax {xmax}
setfield beta ymax {bmax} xmin {xmin} xmax {xmax}
setfield taus ymax {tmax} xmin {xmin} xmax {xmax}
setfield minf ymax {mmax} xmin {xmin} xmax {xmax}
end
if ({strcmp {channeltype} vdep_channel} == 0)
gatepath = (channelpath) @ "/" @ (gate)
if (!({exists {gatepath}}))
echo Gate {gatepath} does not exist.
return
end
if ( \
{strcmp {getfield {gatepath} object->name} vdep_gate} != 0 \
)
xmin = {getfield {gatepath} alpha->xmin}
xmax = {getfield {gatepath} alpha->xmax}
dx = {getfield {gatepath} alpha->dx}
if (dx < ((xmax - xmin)/100.0))
dx = (xmax - xmin)/100.0
end
end
if (!{exists alpha/{kinname}})
create xplot alpha/{kinname}
end
if (!{exists beta/{kinname}})
create xplot beta/{kinname}
end
if (!{exists taus/{kinname}})
create xplot taus/{kinname}
end
for (x = xmin; x <= xmax; x = x + dx)
a = {call {gatepath} CALC_ALPHA {x}}
if (amax < a)
amax = a
end
b = {call {gatepath} CALC_BETA {x}}
if (bmax < b)
bmax = b
end
tau = 1/(a + b)
if (tau > tmax)
tmax = tau
end
call alpha/{kinname} ADDPTS {x} {a}
setfield alpha/{kinname} fg {kincolor}
call beta/{kinname} ADDPTS {x} {b}
setfield beta/{kinname} fg {kincolor}
call taus/{kinname} ADDPTS {x} {tau}
setfield taus/{kinname} fg {kincolor}
end
if (!{exists minf/{kinname}})
create xplot minf/{kinname}
end
for (x = xmin; x <= xmax; x = x + dx)
y = {call {gatepath} CALC_MINF {x}}
if (y > mmax)
mmax = y
end
call minf/{kinname} ADDPTS {x} {y}
setfield minf/{kinname} fg {kincolor}
end
setfield alpha ymax {amax} xmin {xmin} xmax {xmax}
setfield beta ymax {bmax} xmin {xmin} xmax {xmax}
setfield taus ymax {tmax} xmin {xmin} xmax {xmax}
setfield minf ymax {mmax} xmin {xmin} xmax {xmax}
end
if ({strcmp {channeltype} channelC2} == 0)
end
if ({strcmp {channeltype} table} == 0)
end
ce /
end// do_plot_kinetics
function scale_gate(mode)
str mode
str gate
float sx = {getfield /channel_params/sx value}
float sy = {getfield /channel_params/sy value}
float ox = {getfield /channel_params/ox value}
float oy = {getfield /channel_params/oy value}
str channeltype = {getfield {channelpath} object->name}
if ({strcmp {channeltype} tabchannel} == 0)
gate = {getfield /channel_params/gate value}
scaletabchan {channelpath} {gate} {mode} {sx} {sy} {ox} \
{oy}
do_plot_kinetics /channel_params/gate
return
end
if ({strcmp {channeltype} vdep_channel} == 0)
gate = (channelpath) @ "/" @ ({getfield /channel_params/gate value})
if (!{exists {gate}})
echo gate '{gate}' does not exist
return
end
if ({strcmp {getfield {gate} object->name} tabgate} != 0 \
)
echo gate '{gate}' is not a tabgate
return
end
// For tabgates, argv[1] is the tabgate path and argv[2] is ignored
scaletabchan {gate} {gate} {mode} {sx} {sy} {ox} {oy}
do_plot_kinetics /channel_params/gate
return
end
echo channel type {channeltype} cannot be manipulated this way
end
function dup_gate
str gate
str channeltype = {getfield {channelpath} object->name}
if ({strcmp {channeltype} tabchannel} == 0)
gate = {getfield /channel_params/gate value}
duplicatetable {channelpath} {gate}
return
end
if ({strcmp {channeltype} vdep_channel} == 0)
gate = (channelpath) @ "/" @ ({getfield /channel_params/gate value})
if (!{exists {gate}})
echo gate '{gate}' does not exist
return
end
if ({strcmp {getfield {gate} object->name} tabgate} != 0 \
)
echo gate '{gate}' is not a tabgate
return
end
// For tabgates, argv[1] is the tabgate path and argv[2] is ignored
duplicatetable {gate} {gate}
return
end
echo channel type {channeltype} cannot be manipulated this way
end