//genesis
function write_lambda(cellpath)
str cellpath
str name
float nlambda, rm, ri
openfile lambdafile w
openfile lambdaf w
if ((user_symcomps))
foreach name ({el {cellpath}/#[][TYPE=symcompartment]})
rm = ({getfield {name} Rm})
ri = ({getfield {name} Ra})
nlambda = {sqrt {ri/rm}}
echo {name} nlambda = {nlambda}
writefile lambdafile {name} nlambda = {nlambda}
writefile lambdaf {nlambda}
end
else
foreach name ({el {cellpath}/#[][TYPE=compartment]})
rm = ({getfield {name} Rm})
ri = ({getfield {name} Ra})
nlambda = {sqrt {ri/rm}}
echo {name} nlambda = {nlambda}
writefile lambdafile {name} nlambda = {nlambda}
writefile lambdaf {nlambda}
end
end
closefile lambdafile
closefile lambdaf
end
function chop_compt(compt, destname, dest_index, prevd, max_nlambda)
str compt
str destname
int dest_index
str prevd
float max_nlambda
float rm, ri, cm, nlambda
int i, nchops
str si
int nmsgs
int index
int nkids
float next_dia
float this_dia
float this_len
float dlen
float ddia, cdia
float sub_len
float fchops
float gbar
str child
str chan
float px, py, pz, dx, dy, dz
str parent
si = dest_index
nmsgs = {getmsg {compt} -incoming -count}
for (i = 0; i < nmsgs; i = i + 1)
if ( \
{strcmp {getmsg {compt} -incoming -type {i}} RAXIAL} == 0 \
)
child = {getmsg {compt} -incoming -source {i}}
nkids = nkids + 1
end
end
parent = {find_parent {compt}}
px = {getfield {parent} x}
py = {getfield {parent} y}
pz = {getfield {parent} z}
dx = {getfield {compt} x}
dy = {getfield {compt} y}
dz = {getfield {compt} z}
dx = dx - px
dy = dy - py
dz = dz - pz
this_dia = {calc_dia {compt}}
if (nkids > 0)
next_dia = {calc_dia {child}}
end
this_len = {calc_len {compt}}
rm = ({getfield {compt} Rm})
cm = ({getfield {compt} Cm})
ri = ({getfield {compt} Ra})
nlambda = {sqrt {ri/rm}}
// echo nlambda = {nlambda}
if (nlambda > max_nlambda)
nlambda = nlambda/max_nlambda
nchops = nlambda + 1
fchops = nchops
dlen = this_len/fchops
if (nkids == 1) /* we can do sensible tapering*/
ddia = (next_dia - this_dia)/fchops
else
ddia = 0.0
end
cdia = this_dia
dx = dx/fchops
dy = dy/fchops
dz = dz/fchops
for (i = dest_index; i < (nchops + dest_index); \
i = i + 1)
si = i
px = px + dx
py = py + dy
pz = pz + dz
copy {compt} {destname}[{i}]
addmsg {prevd} {destname}[{i}] AXIAL Vm
addmsg {destname}[{i}] {prevd} RAXIAL Ra Vm
prevd = (destname) @ "[" @ (si) @ "]"
setfield {destname}[{i}] \
Rm {rm*this_len*this_dia/dlen/cdia} \
Ra {ri/this_len*this_dia*this_dia*dlen/cdia/cdia} \
Cm {cm/this_len/this_dia*dlen*cdia} x {px} \
y {py} z {pz}
/* also set all channels */
foreach chan ( \
{el {destname}[{i}]/#[TYPE=channelC2]})
gbar = {getfield {chan} gmax}
setfield {chan} \
gmax {gbar/this_len/this_dia*dlen*cdia}
end
foreach chan ( \
{el {destname}[{i}]/#[TYPE=hh_channel]})
gbar = {getfield {chan} Gbar}
setfield {chan} \
Gbar {gbar/this_len/this_dia*dlen*cdia}
end
foreach chan ( \
{el {destname}[{i}]/#[TYPE=vdep_channel]})
gbar = {getfield {chan} Gbar}
setfield {chan} \
Gbar {gbar/this_len/this_dia*dlen*cdia}
end
cdia = cdia + ddia
end
else
i = dest_index
si = i
copy {compt} {destname}[{i}]
addmsg {prevd} {destname}[{i}] AXIAL Vm
addmsg {destname}[{i}] {prevd} RAXIAL Ra Vm
prevd = (destname) @ "[" @ (si) @ "]"
end
return (prevd)
end
/*
** This function needs to start at the soma of the source cell
** The destpath is the name of the neutral element on which the
** new cell will be built. Newname is ignored. Index should
** initially be '0' (zero). Max_nlambda is the max electrical
** length in lambdas, that you wish for each compartment
*/
function chop_lambda(cellpath, destpath, newname, index, prevd, \
max_nlambda)
str cellpath
str destpath
str newname
int index
str prevd
float max_nlambda
str name
float nlambda, rm, ri
int nmsgs, i, nkids = 0
str child
int kidno = 1
str skidno
str lastd
int ndest
str kidname
// echo {cellpath},{newname},{index}
nmsgs = {getmsg {cellpath} -incoming -count}
for (i = 0; i < nmsgs; i = i + 1)
if ( \
{strcmp {getmsg {cellpath} -incoming -type {i}} RAXIAL} == 0 \
)
nkids = nkids + 1
end
end
for (i = 0; i < nmsgs; i = i + 1)
if ( \
{strcmp {getmsg {cellpath} -incoming -type {i}} RAXIAL} == 0 \
)
child = {getmsg {cellpath} -incoming -source {i}}
if (nkids > 1)
/*
skidno = kidno
kidname = {new_name} + {skidno}
kidno = kidno + 1
*/
kidname = {getfield {child} name}
/*
function chop_compt(compt,last_dest,dest_index,max_nlambda)
*/
ce {destpath}
lastd = {chop_compt {child} {kidname} 0 {prevd} {max_nlambda}}
ndest = {getfield {lastd} index}
ndest = ndest + 1
chop_lambda {child} {destpath} {kidname} \
{ndest} {lastd} {max_nlambda}
else /* only one kid */
/*
kidname = new_name
*/
kidname = {getfield {child} name}
ce {destpath}
lastd = {chop_compt {child} {kidname} {index} {prevd} {max_nlambda}}
ndest = {getfield {lastd} index}
ndest = ndest + 1
chop_lambda {child} {destpath} {kidname} \
{ndest} {lastd} {max_nlambda}
end
end
end
end
/*
** Just needs source soma path, place to put dest (need not
** be assigned yet) and max_nlambda.
*/
function subdivide_cell(source, dest, max_nlambda)
str source
str dest
float max_nlambda
int ndest
if ({strcmp {getfield {source} object->name} "compartment"} != 0 \
)
echo subdivide_cell must start at a compartment
return
end
if (!({exists {dest}}))
create neutral {dest}
end
if (!({exists {dest}/soma}))
copy {source} {dest}
end
ce {dest}
/*
ndest = chop_compt({source},soma,0,{max_nlambda})
*/
echo starting subdivision
chop_lambda {source} {dest} soma 0 soma {max_nlambda}
echo subdivision completed
end