// ***************************************************************************
// FUNCTION scale_chandens_exp(str compt_fname, str scale_fname, str cellpath, str channame, float scalemax, float scalemin, float scaletau)
/*
Read compartment names from file {compt_fname}, read x-axis data from file
{scale_fname}, generate scaling factors with as exponential decay function
of x-axis: y = {scalemin} + [{scalemax} * exp(-{x} / {scaletau})].
Multiply channel density by the scaling factor for each compartment.
*/
function scale_chandens_exp(compt_fname, scale_fname, cellpath, channame, scalemax, scalemin, scaletau)
str compt_fname, scale_fname, cellpath, channame
float scalemax, scalemin, scaletau
str thiscompt
float thisX, thisweight, prevG, newG, GtotPrev, GtotNew
openfile {compt_fname} r
openfile {scale_fname} r
thiscompt = {readfile {compt_fname} -linemode}
thisX = {readfile {scale_fname} -linemode}
thisweight = {scalemin} + ({scalemax} * {exp {-{thisX}/{scaletau}} })
GtotNew = 0
GtotPrev = 0
while (! {eof {compt_fname}})
if ({eof {scale_fname}})
echo "Error in scale_chan_density: not enough scale factors."
quit
end
prevG = {getfield {cellpath}/{thiscompt}/{channame} Gbar}
echo {cellpath}"/"{thiscompt}"/"{channame}" previous: " {prevG}
echo {cellpath}"/"{thiscompt}"/"{channame}" scale factor: " {thisweight}
GtotPrev = {GtotPrev} + {prevG}
setfield {cellpath}/{thiscompt}/{channame} Gbar {{thisweight} * {prevG}}
newG = {getfield {cellpath}/{thiscompt}/{channame} Gbar}
echo {cellpath}"/"{thiscompt}"/"{channame}" new: " {newG}
GtotNew = {GtotNew} + {newG}
thiscompt = {readfile {compt_fname} -linemode}
thisX = {readfile {scale_fname} -linemode}
thisweight = {scalemin} + ({scalemax} * {exp {-{thisX}/{scaletau}} })
end
echo "Previous Gtot: " {GtotPrev}
echo "New Gtot: " {GtotNew}
closefile {compt_fname}
closefile {scale_fname}
end
// ***************************************************************************
// FUNCTION scale_chandens_lin(str compt_fname, str scale_fname, str cellpath, str channame, float y0, float y_at_xmax)
/*
Read compartment names from file {compt_fname}, read x-axis data from file
{scale_fname}, generate scaling factors with as linear function
of x-axis: y = {y0} + [ {slope} * {x} ]
Multiply channel density by the scaling factor for each compartment.
--> Use slope is calculated from y0 & y_at_xmax:
--> y0 is the scaling factor at x == 0 (x-intercept)
--> y_at_xmax is y at the largest value of x in the scale_fname file.
Slope is calculated as (y_at_xmax - y0) / xmax.
--> calculating slope helps avoid negative scaling factors.
*/
function scale_chandens_lin(compt_fname, scale_fname, cellpath, channame, y0, y_at_xmax)
str compt_fname, scale_fname, cellpath, channame
float y0, y_at_xmax
str thiscompt
float thisX, thisweight, prevG, newG
float fileMax = 0
openfile {scale_fname} r
thisX = {readfile {scale_fname} -linemode}
while (! {eof {scale_fname}})
if ({thisX} > {fileMax})
fileMax = {thisX}
end
thisX = {readfile {scale_fname} -linemode}
end
closefile {scale_fname}
echo "Max Xvalue in file: " {fileMax}
float slope = ({y_at_xmax} - {y0}) / {fileMax}
echo "Linear Decay Slope: " {slope} " per x-axis unit."
openfile {compt_fname} r
openfile {scale_fname} r
thiscompt = {readfile {compt_fname} -linemode}
thisX = {readfile {scale_fname} -linemode}
thisweight = {y0} + ({slope} * {thisX})
while (! {eof {compt_fname}})
if ({eof {scale_fname}})
echo "Error in scale_chan_density: not enough scale factors."
quit
end
prevG = {getfield {cellpath}/{thiscompt}/{channame} Gbar}
echo {cellpath}"/"{thiscompt}"/"{channame}" previous: " {prevG}
echo {cellpath}"/"{thiscompt}"/"{channame}" scale factor: " {thisweight}
setfield {cellpath}/{thiscompt}/{channame} Gbar {{thisweight} * {prevG}}
newG = {getfield {cellpath}/{thiscompt}/{channame} Gbar}
echo {cellpath}"/"{thiscompt}"/"{channame}" new: " {newG}
thiscompt = {readfile {compt_fname} -linemode}
thisX = {readfile {scale_fname} -linemode}
thisweight = {y0} + ({slope} * {thisX})
end
closefile {compt_fname}
closefile {scale_fname}
end
// ***************************************************************************
// FUNCTION save_compt_spiketimes(str compt_fname, str cellpath, float threshold, float refract, str outfilebase)
/*
Read compartment names from file {compt_fname}, create and connect spikegen and
eventHistory elements to record voltage spike times.
ARGS:
str compt_fname: name of file listing compartment names
str cellpath: path to cell root
float threshold: voltage (in volts) that triggers a spike event
float refract: minimum time (seconds) after one spike event is registered
before another can be registered (make sure refract > max spike width
at threshold).
str outfilebase: file name to which event times are written will be
{outfilebase}{thiscompt}_spkhist.asc
*/
function save_compt_spiketimes(compt_fname, cellpath, threshold, refract, outfilebase)
str compt_fname, cellpath
float thresh, refract
str outfilebase
str thiscompt
if (! {exists /events})
create neutral /events
end
openfile {compt_fname} r
thiscompt = {readfile {compt_fname} -linemode}
while (! {eof {compt_fname}})
if (! {exists /events/{thiscompt}})
create neutral /events/{thiscompt}
end
create spikegen /events/{thiscompt}/spkdetect
setfield /events/{thiscompt}/spkdetect output_amp 1 \
thresh {threshold} abs_refract {refract}
addmsg {cellpath}/{thiscompt} /events/{thiscompt}/spkdetect INPUT Vm
create spikehistory /events/{thiscompt}/spkevents
str fname = {{outfilebase} @ {thiscompt} @ "_spkhist.asc"}
setfield /events/{thiscompt}/spkevents filename {fname} initialize 1 \
leave_open 1 flush 1 ident_toggle 1
addmsg /events/{thiscompt}/spkdetect /events/{thiscompt}/spkevents \
SPIKESAVE
thiscompt = {readfile {compt_fname} -linemode}
end
closefile {compt_fname}
end
// **************************************************************************
// FUNCTION randseed_fromfile(str fname, int line_num)
// Open file fname, get value from line_num, use it to reseed urandom.
function randseed_fromfile(fname, line_num)
str fname
int line_num
openfile {fname} r
int thisline = {readfile {fname} -linemode}
int currpos = 1
while (currpos < line_num)
if ({eof {fname}})
echo "Error in randseed_fromfile(): end of file reached."
currpos = line_num
else
thisline = {readfile {fname} -linemode}
currpos = {currpos} + 1
end
end
closefile {fname}
echo "Reseeding random number generator with " {thisline}
randseed {thisline}
end
// ***************************************************************************
// FUNCTION add_cip_uniform(str compt_fname, str cellpath, float idens, float istart, float idur)
/*
Read compartment names from file {compt_fname}, insert a current pulse generator
into each compartment within compt_fname with the amplitude scaled by the
compartment surface area to achieve the specified current density
--> current density = idens (pA/um2)
--> start time = istart (s)
--> duration = idur (s)
*/
function add_cip_uniform(compt_fname, cellpath, idens, istart, idur)
str compt_fname, cellpath
float idens, istart, idur
str thiscompt
float d, l, surf, icompt, itot
// Create neutral structure to hold pulsegen objects.
if ({exists /cip})
echo "Error in add_cip_uniform. Structure /cip already exists."
quit
else
create neutral /cip
end
openfile {compt_fname} r
thiscompt = {readfile {compt_fname} -linemode}
while (! {eof {compt_fname}})
d = {getfield {cellpath}/{comptname} dia}
if ({strcmp {comptname} "soma"} == 0)
l = d;
else
l = {getfield {cellpath}/{comptname} len}
end
surf = 1e12 * {PI}*{l}*{d} // surface area in square microns
echo "Compartment " {thiscompt} " has surface area " {surf} " um2."
icompt = {idens}*{surf} // pA to be injected
echo "Compartment " {thiscompt} " will receive " {icompt} " pA."
create pulsegen /cip/{thiscompt}
setfield /cip/{thiscompt} \
level1 {1e-12*{icompt}} \
width1 {idur} \
delay1 {istart} \
baselevel 0 \
trig_mode 0
addmsg /cip/{thiscompt} {cellpath}/{thiscompt} INJECT output
thiscompt = {readfile {compt_fname} -linemode}
end
closefile {compt_fname}
end